/ Hex Artifact Content
Login

Artifact ae8713c846a51805130f3084146005cdd719573755593c148df6539129f8873c:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ******.** This f
0180: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 43 20 63  ile contains C c
0190: 6f 64 65 20 72 6f 75 74 69 6e 65 73 20 74 68 61  ode routines tha
01a0: 74 20 61 72 65 20 63 61 6c 6c 65 64 20 62 79 20  t are called by 
01b0: 74 68 65 20 70 61 72 73 65 72 0a 2a 2a 20 74 6f  the parser.** to
01c0: 20 68 61 6e 64 6c 65 20 53 45 4c 45 43 54 20 73   handle SELECT s
01d0: 74 61 74 65 6d 65 6e 74 73 20 69 6e 20 53 51 4c  tatements in SQL
01e0: 69 74 65 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65  ite..*/.#include
01f0: 20 22 73 71 6c 69 74 65 49 6e 74 2e 68 22 0a 0a   "sqliteInt.h"..
0200: 2f 2a 0a 2a 2a 20 54 72 61 63 65 20 6f 75 74 70  /*.** Trace outp
0210: 75 74 20 6d 61 63 72 6f 73 0a 2a 2f 0a 23 69 66  ut macros.*/.#if
0220: 20 53 45 4c 45 43 54 54 52 41 43 45 5f 45 4e 41   SELECTTRACE_ENA
0230: 42 4c 45 44 0a 2f 2a 2a 2a 2f 20 69 6e 74 20 73  BLED./***/ int s
0240: 71 6c 69 74 65 33 53 65 6c 65 63 74 54 72 61 63  qlite3SelectTrac
0250: 65 20 3d 20 30 3b 0a 23 20 64 65 66 69 6e 65 20  e = 0;.# define 
0260: 53 45 4c 45 43 54 54 52 41 43 45 28 4b 2c 50 2c  SELECTTRACE(K,P,
0270: 53 2c 58 29 20 20 5c 0a 20 20 69 66 28 73 71 6c  S,X)  \.  if(sql
0280: 69 74 65 33 53 65 6c 65 63 74 54 72 61 63 65 26  ite3SelectTrace&
0290: 28 4b 29 29 20 20 20 5c 0a 20 20 20 20 73 71 6c  (K))   \.    sql
02a0: 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
02b0: 22 25 75 2f 25 64 2f 25 70 3a 20 22 2c 28 53 29  "%u/%d/%p: ",(S)
02c0: 2d 3e 73 65 6c 49 64 2c 28 50 29 2d 3e 61 64 64  ->selId,(P)->add
02d0: 72 45 78 70 6c 61 69 6e 2c 28 53 29 29 2c 5c 0a  rExplain,(S)),\.
02e0: 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
02f0: 50 72 69 6e 74 66 20 58 0a 23 65 6c 73 65 0a 23  Printf X.#else.#
0300: 20 64 65 66 69 6e 65 20 53 45 4c 45 43 54 54 52   define SELECTTR
0310: 41 43 45 28 4b 2c 50 2c 53 2c 58 29 0a 23 65 6e  ACE(K,P,S,X).#en
0320: 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69  dif.../*.** An i
0330: 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66  nstance of the f
0340: 6f 6c 6c 6f 77 69 6e 67 20 6f 62 6a 65 63 74 20  ollowing object 
0350: 69 73 20 75 73 65 64 20 74 6f 20 72 65 63 6f 72  is used to recor
0360: 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62  d information ab
0370: 6f 75 74 0a 2a 2a 20 68 6f 77 20 74 6f 20 70 72  out.** how to pr
0380: 6f 63 65 73 73 20 74 68 65 20 44 49 53 54 49 4e  ocess the DISTIN
0390: 43 54 20 6b 65 79 77 6f 72 64 2c 20 74 6f 20 73  CT keyword, to s
03a0: 69 6d 70 6c 69 66 79 20 70 61 73 73 69 6e 67 20  implify passing 
03b0: 74 68 61 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  that information
03c0: 0a 2a 2a 20 69 6e 74 6f 20 74 68 65 20 73 65 6c  .** into the sel
03d0: 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 29 20 72  ectInnerLoop() r
03e0: 6f 75 74 69 6e 65 2e 0a 2a 2f 0a 74 79 70 65 64  outine..*/.typed
03f0: 65 66 20 73 74 72 75 63 74 20 44 69 73 74 69 6e  ef struct Distin
0400: 63 74 43 74 78 20 44 69 73 74 69 6e 63 74 43 74  ctCtx DistinctCt
0410: 78 3b 0a 73 74 72 75 63 74 20 44 69 73 74 69 6e  x;.struct Distin
0420: 63 74 43 74 78 20 7b 0a 20 20 75 38 20 69 73 54  ctCtx {.  u8 isT
0430: 6e 63 74 3b 20 20 20 20 20 20 2f 2a 20 54 72 75  nct;      /* Tru
0440: 65 20 69 66 20 74 68 65 20 44 49 53 54 49 4e 43  e if the DISTINC
0450: 54 20 6b 65 79 77 6f 72 64 20 69 73 20 70 72 65  T keyword is pre
0460: 73 65 6e 74 20 2a 2f 0a 20 20 75 38 20 65 54 6e  sent */.  u8 eTn
0470: 63 74 54 79 70 65 3b 20 20 20 2f 2a 20 4f 6e 65  ctType;   /* One
0480: 20 6f 66 20 74 68 65 20 57 48 45 52 45 5f 44 49   of the WHERE_DI
0490: 53 54 49 4e 43 54 5f 2a 20 6f 70 65 72 61 74 6f  STINCT_* operato
04a0: 72 73 20 2a 2f 0a 20 20 69 6e 74 20 74 61 62 54  rs */.  int tabT
04b0: 6e 63 74 3b 20 20 20 20 2f 2a 20 45 70 68 65 6d  nct;    /* Ephem
04c0: 65 72 61 6c 20 74 61 62 6c 65 20 75 73 65 64 20  eral table used 
04d0: 66 6f 72 20 44 49 53 54 49 4e 43 54 20 70 72 6f  for DISTINCT pro
04e0: 63 65 73 73 69 6e 67 20 2a 2f 0a 20 20 69 6e 74  cessing */.  int
04f0: 20 61 64 64 72 54 6e 63 74 3b 20 20 20 2f 2a 20   addrTnct;   /* 
0500: 41 64 64 72 65 73 73 20 6f 66 20 4f 50 5f 4f 70  Address of OP_Op
0510: 65 6e 45 70 68 65 6d 65 72 61 6c 20 6f 70 63 6f  enEphemeral opco
0520: 64 65 20 66 6f 72 20 74 61 62 54 6e 63 74 20 2a  de for tabTnct *
0530: 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69  /.};../*.** An i
0540: 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66  nstance of the f
0550: 6f 6c 6c 6f 77 69 6e 67 20 6f 62 6a 65 63 74 20  ollowing object 
0560: 69 73 20 75 73 65 64 20 74 6f 20 72 65 63 6f 72  is used to recor
0570: 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62  d information ab
0580: 6f 75 74 0a 2a 2a 20 74 68 65 20 4f 52 44 45 52  out.** the ORDER
0590: 20 42 59 20 28 6f 72 20 47 52 4f 55 50 20 42 59   BY (or GROUP BY
05a0: 29 20 63 6c 61 75 73 65 20 6f 66 20 71 75 65 72  ) clause of quer
05b0: 79 20 69 73 20 62 65 69 6e 67 20 63 6f 64 65 64  y is being coded
05c0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 44 65 66  ..**.** The aDef
05d0: 65 72 5b 5d 20 61 72 72 61 79 20 69 73 20 75 73  er[] array is us
05e0: 65 64 20 62 79 20 74 68 65 20 73 6f 72 74 65 72  ed by the sorter
05f0: 2d 72 65 66 65 72 65 6e 63 65 73 20 6f 70 74 69  -references opti
0600: 6d 69 7a 61 74 69 6f 6e 2e 20 46 6f 72 0a 2a 2a  mization. For.**
0610: 20 65 78 61 6d 70 6c 65 2c 20 61 73 73 75 6d 69   example, assumi
0620: 6e 67 20 74 68 65 72 65 20 69 73 20 6e 6f 20 69  ng there is no i
0630: 6e 64 65 78 20 74 68 61 74 20 63 61 6e 20 62 65  ndex that can be
0640: 20 75 73 65 64 20 66 6f 72 20 74 68 65 20 4f 52   used for the OR
0650: 44 45 52 20 42 59 2c 0a 2a 2a 20 66 6f 72 20 74  DER BY,.** for t
0660: 68 65 20 71 75 65 72 79 3a 0a 2a 2a 0a 2a 2a 20  he query:.**.** 
0670: 20 20 20 20 53 45 4c 45 43 54 20 61 2c 20 62 69      SELECT a, bi
0680: 67 62 6c 6f 62 20 46 52 4f 4d 20 74 31 20 4f 52  gblob FROM t1 OR
0690: 44 45 52 20 42 59 20 61 20 4c 49 4d 49 54 20 31  DER BY a LIMIT 1
06a0: 30 3b 0a 2a 2a 0a 2a 2a 20 69 74 20 6d 61 79 20  0;.**.** it may 
06b0: 62 65 20 6d 6f 72 65 20 65 66 66 69 63 69 65 6e  be more efficien
06c0: 74 20 74 6f 20 61 64 64 20 6a 75 73 74 20 74 68  t to add just th
06d0: 65 20 22 61 22 20 76 61 6c 75 65 73 20 74 6f 20  e "a" values to 
06e0: 74 68 65 20 73 6f 72 74 65 72 2c 20 61 6e 64 0a  the sorter, and.
06f0: 2a 2a 20 72 65 74 72 69 65 76 65 20 74 68 65 20  ** retrieve the 
0700: 61 73 73 6f 63 69 61 74 65 64 20 22 62 69 67 62  associated "bigb
0710: 6c 6f 62 22 20 76 61 6c 75 65 73 20 64 69 72 65  lob" values dire
0720: 63 74 6c 79 20 66 72 6f 6d 20 74 61 62 6c 65 20  ctly from table 
0730: 74 31 20 61 73 20 74 68 65 0a 2a 2a 20 31 30 20  t1 as the.** 10 
0740: 73 6d 61 6c 6c 65 73 74 20 22 61 22 20 76 61 6c  smallest "a" val
0750: 75 65 73 20 61 72 65 20 65 78 74 72 61 63 74 65  ues are extracte
0760: 64 20 66 72 6f 6d 20 74 68 65 20 73 6f 72 74 65  d from the sorte
0770: 72 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68  r..**.** When th
0780: 65 20 73 6f 72 74 65 72 2d 72 65 66 65 72 65 6e  e sorter-referen
0790: 63 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20  ce optimization 
07a0: 69 73 20 75 73 65 64 2c 20 74 68 65 72 65 20 69  is used, there i
07b0: 73 20 6f 6e 65 20 65 6e 74 72 79 20 69 6e 20 74  s one entry in t
07c0: 68 65 0a 2a 2a 20 61 44 65 66 65 72 5b 5d 20 61  he.** aDefer[] a
07d0: 72 72 61 79 20 66 6f 72 20 65 61 63 68 20 64 61  rray for each da
07e0: 74 61 62 61 73 65 20 74 61 62 6c 65 20 74 68 61  tabase table tha
07f0: 74 20 6d 61 79 20 62 65 20 72 65 61 64 20 61 73  t may be read as
0800: 20 76 61 6c 75 65 73 20 61 72 65 0a 2a 2a 20 65   values are.** e
0810: 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20 74 68  xtracted from th
0820: 65 20 73 6f 72 74 65 72 2e 0a 2a 2f 0a 74 79 70  e sorter..*/.typ
0830: 65 64 65 66 20 73 74 72 75 63 74 20 53 6f 72 74  edef struct Sort
0840: 43 74 78 20 53 6f 72 74 43 74 78 3b 0a 73 74 72  Ctx SortCtx;.str
0850: 75 63 74 20 53 6f 72 74 43 74 78 20 7b 0a 20 20  uct SortCtx {.  
0860: 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72  ExprList *pOrder
0870: 42 79 3b 20 20 20 2f 2a 20 54 68 65 20 4f 52 44  By;   /* The ORD
0880: 45 52 20 42 59 20 28 6f 72 20 47 52 4f 55 50 20  ER BY (or GROUP 
0890: 42 59 20 63 6c 61 75 73 65 29 20 2a 2f 0a 20 20  BY clause) */.  
08a0: 69 6e 74 20 6e 4f 42 53 61 74 3b 20 20 20 20 20  int nOBSat;     
08b0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
08c0: 6f 66 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d  of ORDER BY term
08d0: 73 20 73 61 74 69 73 66 69 65 64 20 62 79 20 69  s satisfied by i
08e0: 6e 64 69 63 65 73 20 2a 2f 0a 20 20 69 6e 74 20  ndices */.  int 
08f0: 69 45 43 75 72 73 6f 72 3b 20 20 20 20 20 20 20  iECursor;       
0900: 20 20 2f 2a 20 43 75 72 73 6f 72 20 6e 75 6d 62    /* Cursor numb
0910: 65 72 20 66 6f 72 20 74 68 65 20 73 6f 72 74 65  er for the sorte
0920: 72 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 52 65  r */.  int regRe
0930: 74 75 72 6e 3b 20 20 20 20 20 20 20 20 2f 2a 20  turn;        /* 
0940: 52 65 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67  Register holding
0950: 20 62 6c 6f 63 6b 2d 6f 75 74 70 75 74 20 72 65   block-output re
0960: 74 75 72 6e 20 61 64 64 72 65 73 73 20 2a 2f 0a  turn address */.
0970: 20 20 69 6e 74 20 6c 61 62 65 6c 42 6b 4f 75 74    int labelBkOut
0980: 3b 20 20 20 20 20 20 20 2f 2a 20 53 74 61 72 74  ;       /* Start
0990: 20 6c 61 62 65 6c 20 66 6f 72 20 74 68 65 20 62   label for the b
09a0: 6c 6f 63 6b 2d 6f 75 74 70 75 74 20 73 75 62 72  lock-output subr
09b0: 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20  outine */.  int 
09c0: 61 64 64 72 53 6f 72 74 49 6e 64 65 78 3b 20 20  addrSortIndex;  
09d0: 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20    /* Address of 
09e0: 74 68 65 20 4f 50 5f 53 6f 72 74 65 72 4f 70 65  the OP_SorterOpe
09f0: 6e 20 6f 72 20 4f 50 5f 4f 70 65 6e 45 70 68 65  n or OP_OpenEphe
0a00: 6d 65 72 61 6c 20 2a 2f 0a 20 20 69 6e 74 20 6c  meral */.  int l
0a10: 61 62 65 6c 44 6f 6e 65 3b 20 20 20 20 20 20 20  abelDone;       
0a20: 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 77 68   /* Jump here wh
0a30: 65 6e 20 64 6f 6e 65 2c 20 65 78 3a 20 4c 49 4d  en done, ex: LIM
0a40: 49 54 20 72 65 61 63 68 65 64 20 2a 2f 0a 20 20  IT reached */.  
0a50: 69 6e 74 20 6c 61 62 65 6c 4f 42 4c 6f 70 74 3b  int labelOBLopt;
0a60: 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65        /* Jump he
0a70: 72 65 20 77 68 65 6e 20 73 6f 72 74 65 72 20 69  re when sorter i
0a80: 73 20 66 75 6c 6c 20 2a 2f 0a 20 20 75 38 20 73  s full */.  u8 s
0a90: 6f 72 74 46 6c 61 67 73 3b 20 20 20 20 20 20 20  ortFlags;       
0aa0: 20 20 2f 2a 20 5a 65 72 6f 20 6f 72 20 6d 6f 72    /* Zero or mor
0ab0: 65 20 53 4f 52 54 46 4c 41 47 5f 2a 20 62 69 74  e SORTFLAG_* bit
0ac0: 73 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  s */.#ifdef SQLI
0ad0: 54 45 5f 45 4e 41 42 4c 45 5f 53 4f 52 54 45 52  TE_ENABLE_SORTER
0ae0: 5f 52 45 46 45 52 45 4e 43 45 53 0a 20 20 75 38  _REFERENCES.  u8
0af0: 20 6e 44 65 66 65 72 3b 20 20 20 20 20 20 20 20   nDefer;        
0b00: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
0b10: 20 76 61 6c 69 64 20 65 6e 74 72 69 65 73 20 69   valid entries i
0b20: 6e 20 61 44 65 66 65 72 5b 5d 20 2a 2f 0a 20 20  n aDefer[] */.  
0b30: 73 74 72 75 63 74 20 44 65 66 65 72 72 65 64 43  struct DeferredC
0b40: 73 72 20 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a  sr {.    Table *
0b50: 70 54 61 62 3b 20 20 20 20 20 20 20 20 2f 2a 20  pTab;        /* 
0b60: 54 61 62 6c 65 20 64 65 66 69 6e 69 74 69 6f 6e  Table definition
0b70: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 43 73 72   */.    int iCsr
0b80: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43  ;           /* C
0b90: 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 66 6f 72  ursor number for
0ba0: 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 69 6e   table */.    in
0bb0: 74 20 6e 4b 65 79 3b 20 20 20 20 20 20 20 20 20  t nKey;         
0bc0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 50    /* Number of P
0bd0: 4b 20 63 6f 6c 75 6d 6e 73 20 66 6f 72 20 74 61  K columns for ta
0be0: 62 6c 65 20 70 54 61 62 20 28 3e 3d 31 29 20 2a  ble pTab (>=1) *
0bf0: 2f 0a 20 20 7d 20 61 44 65 66 65 72 5b 34 5d 3b  /.  } aDefer[4];
0c00: 0a 23 65 6e 64 69 66 0a 20 20 73 74 72 75 63 74  .#endif.  struct
0c10: 20 52 6f 77 4c 6f 61 64 49 6e 66 6f 20 2a 70 44   RowLoadInfo *pD
0c20: 65 66 65 72 72 65 64 52 6f 77 4c 6f 61 64 3b 20  eferredRowLoad; 
0c30: 20 2f 2a 20 44 65 66 65 72 72 65 64 20 72 6f 77   /* Deferred row
0c40: 20 6c 6f 61 64 69 6e 67 20 69 6e 66 6f 20 6f 72   loading info or
0c50: 20 4e 55 4c 4c 20 2a 2f 0a 7d 3b 0a 23 64 65 66   NULL */.};.#def
0c60: 69 6e 65 20 53 4f 52 54 46 4c 41 47 5f 55 73 65  ine SORTFLAG_Use
0c70: 53 6f 72 74 65 72 20 20 30 78 30 31 20 20 20 2f  Sorter  0x01   /
0c80: 2a 20 55 73 65 20 53 6f 72 74 65 72 4f 70 65 6e  * Use SorterOpen
0c90: 20 69 6e 73 74 65 61 64 20 6f 66 20 4f 70 65 6e   instead of Open
0ca0: 45 70 68 65 6d 65 72 61 6c 20 2a 2f 0a 0a 2f 2a  Ephemeral */../*
0cb0: 0a 2a 2a 20 44 65 6c 65 74 65 20 61 6c 6c 20 74  .** Delete all t
0cc0: 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 20  he content of a 
0cd0: 53 65 6c 65 63 74 20 73 74 72 75 63 74 75 72 65  Select structure
0ce0: 2e 20 20 44 65 61 6c 6c 6f 63 61 74 65 20 74 68  .  Deallocate th
0cf0: 65 20 73 74 72 75 63 74 75 72 65 0a 2a 2a 20 69  e structure.** i
0d00: 74 73 65 6c 66 20 6f 6e 6c 79 20 69 66 20 62 46  tself only if bF
0d10: 72 65 65 20 69 73 20 74 72 75 65 2e 0a 2a 2f 0a  ree is true..*/.
0d20: 73 74 61 74 69 63 20 76 6f 69 64 20 63 6c 65 61  static void clea
0d30: 72 53 65 6c 65 63 74 28 73 71 6c 69 74 65 33 20  rSelect(sqlite3 
0d40: 2a 64 62 2c 20 53 65 6c 65 63 74 20 2a 70 2c 20  *db, Select *p, 
0d50: 69 6e 74 20 62 46 72 65 65 29 7b 0a 20 20 77 68  int bFree){.  wh
0d60: 69 6c 65 28 20 70 20 29 7b 0a 20 20 20 20 53 65  ile( p ){.    Se
0d70: 6c 65 63 74 20 2a 70 50 72 69 6f 72 20 3d 20 70  lect *pPrior = p
0d80: 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 73 71  ->pPrior;.    sq
0d90: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c  lite3ExprListDel
0da0: 65 74 65 28 64 62 2c 20 70 2d 3e 70 45 4c 69 73  ete(db, p->pELis
0db0: 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 53  t);.    sqlite3S
0dc0: 72 63 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c  rcListDelete(db,
0dd0: 20 70 2d 3e 70 53 72 63 29 3b 0a 20 20 20 20 73   p->pSrc);.    s
0de0: 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
0df0: 28 64 62 2c 20 70 2d 3e 70 57 68 65 72 65 29 3b  (db, p->pWhere);
0e00: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
0e10: 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70  ListDelete(db, p
0e20: 2d 3e 70 47 72 6f 75 70 42 79 29 3b 0a 20 20 20  ->pGroupBy);.   
0e30: 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
0e40: 74 65 28 64 62 2c 20 70 2d 3e 70 48 61 76 69 6e  te(db, p->pHavin
0e50: 67 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  g);.    sqlite3E
0e60: 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62  xprListDelete(db
0e70: 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79 29 3b 0a  , p->pOrderBy);.
0e80: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44      sqlite3ExprD
0e90: 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 4c 69  elete(db, p->pLi
0ea0: 6d 69 74 29 3b 0a 23 69 66 6e 64 65 66 20 53 51  mit);.#ifndef SQ
0eb0: 4c 49 54 45 5f 4f 4d 49 54 5f 57 49 4e 44 4f 57  LITE_OMIT_WINDOW
0ec0: 46 55 4e 43 0a 20 20 20 20 69 66 28 20 4f 4b 5f  FUNC.    if( OK_
0ed0: 49 46 5f 41 4c 57 41 59 53 5f 54 52 55 45 28 70  IF_ALWAYS_TRUE(p
0ee0: 2d 3e 70 57 69 6e 44 65 66 6e 29 20 29 7b 0a 20  ->pWinDefn) ){. 
0ef0: 20 20 20 20 20 73 71 6c 69 74 65 33 57 69 6e 64       sqlite3Wind
0f00: 6f 77 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c  owListDelete(db,
0f10: 20 70 2d 3e 70 57 69 6e 44 65 66 6e 29 3b 0a 20   p->pWinDefn);. 
0f20: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
0f30: 69 66 28 20 4f 4b 5f 49 46 5f 41 4c 57 41 59 53  if( OK_IF_ALWAYS
0f40: 5f 54 52 55 45 28 70 2d 3e 70 57 69 74 68 29 20  _TRUE(p->pWith) 
0f50: 29 20 73 71 6c 69 74 65 33 57 69 74 68 44 65 6c  ) sqlite3WithDel
0f60: 65 74 65 28 64 62 2c 20 70 2d 3e 70 57 69 74 68  ete(db, p->pWith
0f70: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
0f80: 2d 3e 70 57 69 6e 3d 3d 30 20 29 3b 0a 20 20 20  ->pWin==0 );.   
0f90: 20 69 66 28 20 62 46 72 65 65 20 29 20 73 71 6c   if( bFree ) sql
0fa0: 69 74 65 33 44 62 46 72 65 65 4e 4e 28 64 62 2c  ite3DbFreeNN(db,
0fb0: 20 70 29 3b 0a 20 20 20 20 70 20 3d 20 70 50 72   p);.    p = pPr
0fc0: 69 6f 72 3b 0a 20 20 20 20 62 46 72 65 65 20 3d  ior;.    bFree =
0fd0: 20 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a   1;.  }.}../*.**
0fe0: 20 49 6e 69 74 69 61 6c 69 7a 65 20 61 20 53 65   Initialize a Se
0ff0: 6c 65 63 74 44 65 73 74 20 73 74 72 75 63 74 75  lectDest structu
1000: 72 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  re..*/.void sqli
1010: 74 65 33 53 65 6c 65 63 74 44 65 73 74 49 6e 69  te3SelectDestIni
1020: 74 28 53 65 6c 65 63 74 44 65 73 74 20 2a 70 44  t(SelectDest *pD
1030: 65 73 74 2c 20 69 6e 74 20 65 44 65 73 74 2c 20  est, int eDest, 
1040: 69 6e 74 20 69 50 61 72 6d 29 7b 0a 20 20 70 44  int iParm){.  pD
1050: 65 73 74 2d 3e 65 44 65 73 74 20 3d 20 28 75 38  est->eDest = (u8
1060: 29 65 44 65 73 74 3b 0a 20 20 70 44 65 73 74 2d  )eDest;.  pDest-
1070: 3e 69 53 44 50 61 72 6d 20 3d 20 69 50 61 72 6d  >iSDParm = iParm
1080: 3b 0a 20 20 70 44 65 73 74 2d 3e 7a 41 66 66 53  ;.  pDest->zAffS
1090: 64 73 74 20 3d 20 30 3b 0a 20 20 70 44 65 73 74  dst = 0;.  pDest
10a0: 2d 3e 69 53 64 73 74 20 3d 20 30 3b 0a 20 20 70  ->iSdst = 0;.  p
10b0: 44 65 73 74 2d 3e 6e 53 64 73 74 20 3d 20 30 3b  Dest->nSdst = 0;
10c0: 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63  .}.../*.** Alloc
10d0: 61 74 65 20 61 20 6e 65 77 20 53 65 6c 65 63 74  ate a new Select
10e0: 20 73 74 72 75 63 74 75 72 65 20 61 6e 64 20 72   structure and r
10f0: 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
1100: 74 6f 20 74 68 61 74 0a 2a 2a 20 73 74 72 75 63  to that.** struc
1110: 74 75 72 65 2e 0a 2a 2f 0a 53 65 6c 65 63 74 20  ture..*/.Select 
1120: 2a 73 71 6c 69 74 65 33 53 65 6c 65 63 74 4e 65  *sqlite3SelectNe
1130: 77 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  w(.  Parse *pPar
1140: 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 61  se,        /* Pa
1150: 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
1160: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c  .  ExprList *pEL
1170: 69 73 74 2c 20 20 20 20 20 2f 2a 20 77 68 69 63  ist,     /* whic
1180: 68 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 69 6e 63  h columns to inc
1190: 6c 75 64 65 20 69 6e 20 74 68 65 20 72 65 73 75  lude in the resu
11a0: 6c 74 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20  lt */.  SrcList 
11b0: 2a 70 53 72 63 2c 20 20 20 20 20 20 20 20 2f 2a  *pSrc,        /*
11c0: 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
11d0: 20 2d 2d 20 77 68 69 63 68 20 74 61 62 6c 65 73   -- which tables
11e0: 20 74 6f 20 73 63 61 6e 20 2a 2f 0a 20 20 45 78   to scan */.  Ex
11f0: 70 72 20 2a 70 57 68 65 72 65 2c 20 20 20 20 20  pr *pWhere,     
1200: 20 20 20 20 2f 2a 20 74 68 65 20 57 48 45 52 45      /* the WHERE
1210: 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45 78 70   clause */.  Exp
1220: 72 4c 69 73 74 20 2a 70 47 72 6f 75 70 42 79 2c  rList *pGroupBy,
1230: 20 20 20 2f 2a 20 74 68 65 20 47 52 4f 55 50 20     /* the GROUP 
1240: 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45  BY clause */.  E
1250: 78 70 72 20 2a 70 48 61 76 69 6e 67 2c 20 20 20  xpr *pHaving,   
1260: 20 20 20 20 20 2f 2a 20 74 68 65 20 48 41 56 49       /* the HAVI
1270: 4e 47 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45  NG clause */.  E
1280: 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42  xprList *pOrderB
1290: 79 2c 20 20 20 2f 2a 20 74 68 65 20 4f 52 44 45  y,   /* the ORDE
12a0: 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20  R BY clause */. 
12b0: 20 75 33 32 20 73 65 6c 46 6c 61 67 73 2c 20 20   u32 selFlags,  
12c0: 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 20 70         /* Flag p
12d0: 61 72 61 6d 65 74 65 72 73 2c 20 73 75 63 68 20  arameters, such 
12e0: 61 73 20 53 46 5f 44 69 73 74 69 6e 63 74 20 2a  as SF_Distinct *
12f0: 2f 0a 20 20 45 78 70 72 20 2a 70 4c 69 6d 69 74  /.  Expr *pLimit
1300: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 49 4d            /* LIM
1310: 49 54 20 76 61 6c 75 65 2e 20 20 4e 55 4c 4c 20  IT value.  NULL 
1320: 6d 65 61 6e 73 20 6e 6f 74 20 75 73 65 64 20 2a  means not used *
1330: 2f 0a 29 7b 0a 20 20 53 65 6c 65 63 74 20 2a 70  /.){.  Select *p
1340: 4e 65 77 3b 0a 20 20 53 65 6c 65 63 74 20 73 74  New;.  Select st
1350: 61 6e 64 69 6e 3b 0a 20 20 70 4e 65 77 20 3d 20  andin;.  pNew = 
1360: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52  sqlite3DbMallocR
1370: 61 77 4e 4e 28 70 50 61 72 73 65 2d 3e 64 62 2c  awNN(pParse->db,
1380: 20 73 69 7a 65 6f 66 28 2a 70 4e 65 77 29 20 29   sizeof(*pNew) )
1390: 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20  ;.  if( pNew==0 
13a0: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
13b0: 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  Parse->db->mallo
13c0: 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 70  cFailed );.    p
13d0: 4e 65 77 20 3d 20 26 73 74 61 6e 64 69 6e 3b 0a  New = &standin;.
13e0: 20 20 7d 0a 20 20 69 66 28 20 70 45 4c 69 73 74    }.  if( pEList
13f0: 3d 3d 30 20 29 7b 0a 20 20 20 20 70 45 4c 69 73  ==0 ){.    pELis
1400: 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c  t = sqlite3ExprL
1410: 69 73 74 41 70 70 65 6e 64 28 70 50 61 72 73 65  istAppend(pParse
1420: 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20  , 0,.           
1430: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1440: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
1450: 78 70 72 28 70 50 61 72 73 65 2d 3e 64 62 2c 54  xpr(pParse->db,T
1460: 4b 5f 41 53 54 45 52 49 53 4b 2c 30 29 29 3b 0a  K_ASTERISK,0));.
1470: 20 20 7d 0a 20 20 70 4e 65 77 2d 3e 70 45 4c 69    }.  pNew->pELi
1480: 73 74 20 3d 20 70 45 4c 69 73 74 3b 0a 20 20 70  st = pEList;.  p
1490: 4e 65 77 2d 3e 6f 70 20 3d 20 54 4b 5f 53 45 4c  New->op = TK_SEL
14a0: 45 43 54 3b 0a 20 20 70 4e 65 77 2d 3e 73 65 6c  ECT;.  pNew->sel
14b0: 46 6c 61 67 73 20 3d 20 73 65 6c 46 6c 61 67 73  Flags = selFlags
14c0: 3b 0a 20 20 70 4e 65 77 2d 3e 69 4c 69 6d 69 74  ;.  pNew->iLimit
14d0: 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 69 4f   = 0;.  pNew->iO
14e0: 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 70 4e 65  ffset = 0;.  pNe
14f0: 77 2d 3e 73 65 6c 49 64 20 3d 20 2b 2b 70 50 61  w->selId = ++pPa
1500: 72 73 65 2d 3e 6e 53 65 6c 65 63 74 3b 0a 20 20  rse->nSelect;.  
1510: 70 4e 65 77 2d 3e 61 64 64 72 4f 70 65 6e 45 70  pNew->addrOpenEp
1520: 68 6d 5b 30 5d 20 3d 20 2d 31 3b 0a 20 20 70 4e  hm[0] = -1;.  pN
1530: 65 77 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d  ew->addrOpenEphm
1540: 5b 31 5d 20 3d 20 2d 31 3b 0a 20 20 70 4e 65 77  [1] = -1;.  pNew
1550: 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 30  ->nSelectRow = 0
1560: 3b 0a 20 20 69 66 28 20 70 53 72 63 3d 3d 30 20  ;.  if( pSrc==0 
1570: 29 20 70 53 72 63 20 3d 20 73 71 6c 69 74 65 33  ) pSrc = sqlite3
1580: 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 70 50 61  DbMallocZero(pPa
1590: 72 73 65 2d 3e 64 62 2c 20 73 69 7a 65 6f 66 28  rse->db, sizeof(
15a0: 2a 70 53 72 63 29 29 3b 0a 20 20 70 4e 65 77 2d  *pSrc));.  pNew-
15b0: 3e 70 53 72 63 20 3d 20 70 53 72 63 3b 0a 20 20  >pSrc = pSrc;.  
15c0: 70 4e 65 77 2d 3e 70 57 68 65 72 65 20 3d 20 70  pNew->pWhere = p
15d0: 57 68 65 72 65 3b 0a 20 20 70 4e 65 77 2d 3e 70  Where;.  pNew->p
15e0: 47 72 6f 75 70 42 79 20 3d 20 70 47 72 6f 75 70  GroupBy = pGroup
15f0: 42 79 3b 0a 20 20 70 4e 65 77 2d 3e 70 48 61 76  By;.  pNew->pHav
1600: 69 6e 67 20 3d 20 70 48 61 76 69 6e 67 3b 0a 20  ing = pHaving;. 
1610: 20 70 4e 65 77 2d 3e 70 4f 72 64 65 72 42 79 20   pNew->pOrderBy 
1620: 3d 20 70 4f 72 64 65 72 42 79 3b 0a 20 20 70 4e  = pOrderBy;.  pN
1630: 65 77 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a  ew->pPrior = 0;.
1640: 20 20 70 4e 65 77 2d 3e 70 4e 65 78 74 20 3d 20    pNew->pNext = 
1650: 30 3b 0a 20 20 70 4e 65 77 2d 3e 70 4c 69 6d 69  0;.  pNew->pLimi
1660: 74 20 3d 20 70 4c 69 6d 69 74 3b 0a 20 20 70 4e  t = pLimit;.  pN
1670: 65 77 2d 3e 70 57 69 74 68 20 3d 20 30 3b 0a 23  ew->pWith = 0;.#
1680: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1690: 49 54 5f 57 49 4e 44 4f 57 46 55 4e 43 0a 20 20  IT_WINDOWFUNC.  
16a0: 70 4e 65 77 2d 3e 70 57 69 6e 20 3d 20 30 3b 0a  pNew->pWin = 0;.
16b0: 20 20 70 4e 65 77 2d 3e 70 57 69 6e 44 65 66 6e    pNew->pWinDefn
16c0: 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20 69   = 0;.#endif.  i
16d0: 66 28 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d  f( pParse->db->m
16e0: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 7b 0a  allocFailed ) {.
16f0: 20 20 20 20 63 6c 65 61 72 53 65 6c 65 63 74 28      clearSelect(
1700: 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 4e 65 77  pParse->db, pNew
1710: 2c 20 70 4e 65 77 21 3d 26 73 74 61 6e 64 69 6e  , pNew!=&standin
1720: 29 3b 0a 20 20 20 20 70 4e 65 77 20 3d 20 30 3b  );.    pNew = 0;
1730: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73  .  }else{.    as
1740: 73 65 72 74 28 20 70 4e 65 77 2d 3e 70 53 72 63  sert( pNew->pSrc
1750: 21 3d 30 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e  !=0 || pParse->n
1760: 45 72 72 3e 30 20 29 3b 0a 20 20 7d 0a 20 20 61  Err>0 );.  }.  a
1770: 73 73 65 72 74 28 20 70 4e 65 77 21 3d 26 73 74  ssert( pNew!=&st
1780: 61 6e 64 69 6e 20 29 3b 0a 20 20 72 65 74 75 72  andin );.  retur
1790: 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  n pNew;.}.../*.*
17a0: 2a 20 44 65 6c 65 74 65 20 74 68 65 20 67 69 76  * Delete the giv
17b0: 65 6e 20 53 65 6c 65 63 74 20 73 74 72 75 63 74  en Select struct
17c0: 75 72 65 20 61 6e 64 20 61 6c 6c 20 6f 66 20 69  ure and all of i
17d0: 74 73 20 73 75 62 73 74 72 75 63 74 75 72 65 73  ts substructures
17e0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
17f0: 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 73 71  3SelectDelete(sq
1800: 6c 69 74 65 33 20 2a 64 62 2c 20 53 65 6c 65 63  lite3 *db, Selec
1810: 74 20 2a 70 29 7b 0a 20 20 69 66 28 20 4f 4b 5f  t *p){.  if( OK_
1820: 49 46 5f 41 4c 57 41 59 53 5f 54 52 55 45 28 70  IF_ALWAYS_TRUE(p
1830: 29 20 29 20 63 6c 65 61 72 53 65 6c 65 63 74 28  ) ) clearSelect(
1840: 64 62 2c 20 70 2c 20 31 29 3b 0a 7d 0a 0a 2f 2a  db, p, 1);.}../*
1850: 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69  .** Return a poi
1860: 6e 74 65 72 20 74 6f 20 74 68 65 20 72 69 67 68  nter to the righ
1870: 74 2d 6d 6f 73 74 20 53 45 4c 45 43 54 20 73 74  t-most SELECT st
1880: 61 74 65 6d 65 6e 74 20 69 6e 20 61 20 63 6f 6d  atement in a com
1890: 70 6f 75 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  pound..*/.static
18a0: 20 53 65 6c 65 63 74 20 2a 66 69 6e 64 52 69 67   Select *findRig
18b0: 68 74 6d 6f 73 74 28 53 65 6c 65 63 74 20 2a 70  htmost(Select *p
18c0: 29 7b 0a 20 20 77 68 69 6c 65 28 20 70 2d 3e 70  ){.  while( p->p
18d0: 4e 65 78 74 20 29 20 70 20 3d 20 70 2d 3e 70 4e  Next ) p = p->pN
18e0: 65 78 74 3b 0a 20 20 72 65 74 75 72 6e 20 70 3b  ext;.  return p;
18f0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20  .}../*.** Given 
1900: 31 20 74 6f 20 33 20 69 64 65 6e 74 69 66 69 65  1 to 3 identifie
1910: 72 73 20 70 72 65 63 65 64 69 6e 67 20 74 68 65  rs preceding the
1920: 20 4a 4f 49 4e 20 6b 65 79 77 6f 72 64 2c 20 64   JOIN keyword, d
1930: 65 74 65 72 6d 69 6e 65 20 74 68 65 0a 2a 2a 20  etermine the.** 
1940: 74 79 70 65 20 6f 66 20 6a 6f 69 6e 2e 20 20 52  type of join.  R
1950: 65 74 75 72 6e 20 61 6e 20 69 6e 74 65 67 65 72  eturn an integer
1960: 20 63 6f 6e 73 74 61 6e 74 20 74 68 61 74 20 65   constant that e
1970: 78 70 72 65 73 73 65 73 20 74 68 61 74 20 74 79  xpresses that ty
1980: 70 65 0a 2a 2a 20 69 6e 20 74 65 72 6d 73 20 6f  pe.** in terms o
1990: 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
19a0: 62 69 74 20 76 61 6c 75 65 73 3a 0a 2a 2a 0a 2a  bit values:.**.*
19b0: 2a 20 20 20 20 20 4a 54 5f 49 4e 4e 45 52 0a 2a  *     JT_INNER.*
19c0: 2a 20 20 20 20 20 4a 54 5f 43 52 4f 53 53 0a 2a  *     JT_CROSS.*
19d0: 2a 20 20 20 20 20 4a 54 5f 4f 55 54 45 52 0a 2a  *     JT_OUTER.*
19e0: 2a 20 20 20 20 20 4a 54 5f 4e 41 54 55 52 41 4c  *     JT_NATURAL
19f0: 0a 2a 2a 20 20 20 20 20 4a 54 5f 4c 45 46 54 0a  .**     JT_LEFT.
1a00: 2a 2a 20 20 20 20 20 4a 54 5f 52 49 47 48 54 0a  **     JT_RIGHT.
1a10: 2a 2a 0a 2a 2a 20 41 20 66 75 6c 6c 20 6f 75 74  **.** A full out
1a20: 65 72 20 6a 6f 69 6e 20 69 73 20 74 68 65 20 63  er join is the c
1a30: 6f 6d 62 69 6e 61 74 69 6f 6e 20 6f 66 20 4a 54  ombination of JT
1a40: 5f 4c 45 46 54 20 61 6e 64 20 4a 54 5f 52 49 47  _LEFT and JT_RIG
1a50: 48 54 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  HT..**.** If an 
1a60: 69 6c 6c 65 67 61 6c 20 6f 72 20 75 6e 73 75 70  illegal or unsup
1a70: 70 6f 72 74 65 64 20 6a 6f 69 6e 20 74 79 70 65  ported join type
1a80: 20 69 73 20 73 65 65 6e 2c 20 74 68 65 6e 20 73   is seen, then s
1a90: 74 69 6c 6c 20 72 65 74 75 72 6e 0a 2a 2a 20 61  till return.** a
1aa0: 20 6a 6f 69 6e 20 74 79 70 65 2c 20 62 75 74 20   join type, but 
1ab0: 70 75 74 20 61 6e 20 65 72 72 6f 72 20 69 6e 20  put an error in 
1ac0: 74 68 65 20 70 50 61 72 73 65 20 73 74 72 75 63  the pParse struc
1ad0: 74 75 72 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ture..*/.int sql
1ae0: 69 74 65 33 4a 6f 69 6e 54 79 70 65 28 50 61 72  ite3JoinType(Par
1af0: 73 65 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65  se *pParse, Toke
1b00: 6e 20 2a 70 41 2c 20 54 6f 6b 65 6e 20 2a 70 42  n *pA, Token *pB
1b10: 2c 20 54 6f 6b 65 6e 20 2a 70 43 29 7b 0a 20 20  , Token *pC){.  
1b20: 69 6e 74 20 6a 6f 69 6e 74 79 70 65 20 3d 20 30  int jointype = 0
1b30: 3b 0a 20 20 54 6f 6b 65 6e 20 2a 61 70 41 6c 6c  ;.  Token *apAll
1b40: 5b 33 5d 3b 0a 20 20 54 6f 6b 65 6e 20 2a 70 3b  [3];.  Token *p;
1b50: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1b60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1b70: 20 20 20 30 31 32 33 34 35 36 37 38 39 20 31 32     0123456789 12
1b80: 33 34 35 36 37 38 39 20 31 32 33 34 35 36 37 38  3456789 12345678
1b90: 39 20 31 32 33 20 2a 2f 0a 20 20 73 74 61 74 69  9 123 */.  stati
1ba0: 63 20 63 6f 6e 73 74 20 63 68 61 72 20 7a 4b 65  c const char zKe
1bb0: 79 54 65 78 74 5b 5d 20 3d 20 22 6e 61 74 75 72  yText[] = "natur
1bc0: 61 6c 65 66 74 6f 75 74 65 72 69 67 68 74 66 75  aleftouterightfu
1bd0: 6c 6c 69 6e 6e 65 72 63 72 6f 73 73 22 3b 0a 20  llinnercross";. 
1be0: 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 74   static const st
1bf0: 72 75 63 74 20 7b 0a 20 20 20 20 75 38 20 69 3b  ruct {.    u8 i;
1c00: 20 20 20 20 20 20 20 20 2f 2a 20 42 65 67 69 6e          /* Begin
1c10: 6e 69 6e 67 20 6f 66 20 6b 65 79 77 6f 72 64 20  ning of keyword 
1c20: 74 65 78 74 20 69 6e 20 7a 4b 65 79 54 65 78 74  text in zKeyText
1c30: 5b 5d 20 2a 2f 0a 20 20 20 20 75 38 20 6e 43 68  [] */.    u8 nCh
1c40: 61 72 3b 20 20 20 20 2f 2a 20 4c 65 6e 67 74 68  ar;    /* Length
1c50: 20 6f 66 20 74 68 65 20 6b 65 79 77 6f 72 64 20   of the keyword 
1c60: 69 6e 20 63 68 61 72 61 63 74 65 72 73 20 2a 2f  in characters */
1c70: 0a 20 20 20 20 75 38 20 63 6f 64 65 3b 20 20 20  .    u8 code;   
1c80: 20 20 2f 2a 20 4a 6f 69 6e 20 74 79 70 65 20 6d    /* Join type m
1c90: 61 73 6b 20 2a 2f 0a 20 20 7d 20 61 4b 65 79 77  ask */.  } aKeyw
1ca0: 6f 72 64 5b 5d 20 3d 20 7b 0a 20 20 20 20 2f 2a  ord[] = {.    /*
1cb0: 20 6e 61 74 75 72 61 6c 20 2a 2f 20 7b 20 30 2c   natural */ { 0,
1cc0: 20 20 37 2c 20 4a 54 5f 4e 41 54 55 52 41 4c 20    7, JT_NATURAL 
1cd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
1ce0: 2c 0a 20 20 20 20 2f 2a 20 6c 65 66 74 20 20 20  ,.    /* left   
1cf0: 20 2a 2f 20 7b 20 36 2c 20 20 34 2c 20 4a 54 5f   */ { 6,  4, JT_
1d00: 4c 45 46 54 7c 4a 54 5f 4f 55 54 45 52 20 20 20  LEFT|JT_OUTER   
1d10: 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 2f 2a         },.    /*
1d20: 20 6f 75 74 65 72 20 20 20 2a 2f 20 7b 20 31 30   outer   */ { 10
1d30: 2c 20 35 2c 20 4a 54 5f 4f 55 54 45 52 20 20 20  , 5, JT_OUTER   
1d40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
1d50: 2c 0a 20 20 20 20 2f 2a 20 72 69 67 68 74 20 20  ,.    /* right  
1d60: 20 2a 2f 20 7b 20 31 34 2c 20 35 2c 20 4a 54 5f   */ { 14, 5, JT_
1d70: 52 49 47 48 54 7c 4a 54 5f 4f 55 54 45 52 20 20  RIGHT|JT_OUTER  
1d80: 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 2f 2a         },.    /*
1d90: 20 66 75 6c 6c 20 20 20 20 2a 2f 20 7b 20 31 39   full    */ { 19
1da0: 2c 20 34 2c 20 4a 54 5f 4c 45 46 54 7c 4a 54 5f  , 4, JT_LEFT|JT_
1db0: 52 49 47 48 54 7c 4a 54 5f 4f 55 54 45 52 20 7d  RIGHT|JT_OUTER }
1dc0: 2c 0a 20 20 20 20 2f 2a 20 69 6e 6e 65 72 20 20  ,.    /* inner  
1dd0: 20 2a 2f 20 7b 20 32 33 2c 20 35 2c 20 4a 54 5f   */ { 23, 5, JT_
1de0: 49 4e 4e 45 52 20 20 20 20 20 20 20 20 20 20 20  INNER           
1df0: 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 2f 2a         },.    /*
1e00: 20 63 72 6f 73 73 20 20 20 2a 2f 20 7b 20 32 38   cross   */ { 28
1e10: 2c 20 35 2c 20 4a 54 5f 49 4e 4e 45 52 7c 4a 54  , 5, JT_INNER|JT
1e20: 5f 43 52 4f 53 53 20 20 20 20 20 20 20 20 20 7d  _CROSS         }
1e30: 2c 0a 20 20 7d 3b 0a 20 20 69 6e 74 20 69 2c 20  ,.  };.  int i, 
1e40: 6a 3b 0a 20 20 61 70 41 6c 6c 5b 30 5d 20 3d 20  j;.  apAll[0] = 
1e50: 70 41 3b 0a 20 20 61 70 41 6c 6c 5b 31 5d 20 3d  pA;.  apAll[1] =
1e60: 20 70 42 3b 0a 20 20 61 70 41 6c 6c 5b 32 5d 20   pB;.  apAll[2] 
1e70: 3d 20 70 43 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  = pC;.  for(i=0;
1e80: 20 69 3c 33 20 26 26 20 61 70 41 6c 6c 5b 69 5d   i<3 && apAll[i]
1e90: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 70 20 3d 20  ; i++){.    p = 
1ea0: 61 70 41 6c 6c 5b 69 5d 3b 0a 20 20 20 20 66 6f  apAll[i];.    fo
1eb0: 72 28 6a 3d 30 3b 20 6a 3c 41 72 72 61 79 53 69  r(j=0; j<ArraySi
1ec0: 7a 65 28 61 4b 65 79 77 6f 72 64 29 3b 20 6a 2b  ze(aKeyword); j+
1ed0: 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d  +){.      if( p-
1ee0: 3e 6e 3d 3d 61 4b 65 79 77 6f 72 64 5b 6a 5d 2e  >n==aKeyword[j].
1ef0: 6e 43 68 61 72 20 0a 20 20 20 20 20 20 20 20 20  nChar .         
1f00: 20 26 26 20 73 71 6c 69 74 65 33 53 74 72 4e 49   && sqlite3StrNI
1f10: 43 6d 70 28 28 63 68 61 72 2a 29 70 2d 3e 7a 2c  Cmp((char*)p->z,
1f20: 20 26 7a 4b 65 79 54 65 78 74 5b 61 4b 65 79 77   &zKeyText[aKeyw
1f30: 6f 72 64 5b 6a 5d 2e 69 5d 2c 20 70 2d 3e 6e 29  ord[j].i], p->n)
1f40: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 6a  ==0 ){.        j
1f50: 6f 69 6e 74 79 70 65 20 7c 3d 20 61 4b 65 79 77  ointype |= aKeyw
1f60: 6f 72 64 5b 6a 5d 2e 63 6f 64 65 3b 0a 20 20 20  ord[j].code;.   
1f70: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1f80: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 74 65    }.    }.    te
1f90: 73 74 63 61 73 65 28 20 6a 3d 3d 30 20 7c 7c 20  stcase( j==0 || 
1fa0: 6a 3d 3d 31 20 7c 7c 20 6a 3d 3d 32 20 7c 7c 20  j==1 || j==2 || 
1fb0: 6a 3d 3d 33 20 7c 7c 20 6a 3d 3d 34 20 7c 7c 20  j==3 || j==4 || 
1fc0: 6a 3d 3d 35 20 7c 7c 20 6a 3d 3d 36 20 29 3b 0a  j==5 || j==6 );.
1fd0: 20 20 20 20 69 66 28 20 6a 3e 3d 41 72 72 61 79      if( j>=Array
1fe0: 53 69 7a 65 28 61 4b 65 79 77 6f 72 64 29 20 29  Size(aKeyword) )
1ff0: 7b 0a 20 20 20 20 20 20 6a 6f 69 6e 74 79 70 65  {.      jointype
2000: 20 7c 3d 20 4a 54 5f 45 52 52 4f 52 3b 0a 20 20   |= JT_ERROR;.  
2010: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
2020: 0a 20 20 7d 0a 20 20 69 66 28 0a 20 20 20 20 20  .  }.  if(.     
2030: 28 6a 6f 69 6e 74 79 70 65 20 26 20 28 4a 54 5f  (jointype & (JT_
2040: 49 4e 4e 45 52 7c 4a 54 5f 4f 55 54 45 52 29 29  INNER|JT_OUTER))
2050: 3d 3d 28 4a 54 5f 49 4e 4e 45 52 7c 4a 54 5f 4f  ==(JT_INNER|JT_O
2060: 55 54 45 52 29 20 7c 7c 0a 20 20 20 20 20 28 6a  UTER) ||.     (j
2070: 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 45 52 52  ointype & JT_ERR
2080: 4f 52 29 21 3d 30 0a 20 20 29 7b 0a 20 20 20 20  OR)!=0.  ){.    
2090: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 70 20  const char *zSp 
20a0: 3d 20 22 20 22 3b 0a 20 20 20 20 61 73 73 65 72  = " ";.    asser
20b0: 74 28 20 70 42 21 3d 30 20 29 3b 0a 20 20 20 20  t( pB!=0 );.    
20c0: 69 66 28 20 70 43 3d 3d 30 20 29 7b 20 7a 53 70  if( pC==0 ){ zSp
20d0: 2b 2b 3b 20 7d 0a 20 20 20 20 73 71 6c 69 74 65  ++; }.    sqlite
20e0: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
20f0: 2c 20 22 75 6e 6b 6e 6f 77 6e 20 6f 72 20 75 6e  , "unknown or un
2100: 73 75 70 70 6f 72 74 65 64 20 6a 6f 69 6e 20 74  supported join t
2110: 79 70 65 3a 20 22 0a 20 20 20 20 20 20 20 22 25  ype: ".       "%
2120: 54 20 25 54 25 73 25 54 22 2c 20 70 41 2c 20 70  T %T%s%T", pA, p
2130: 42 2c 20 7a 53 70 2c 20 70 43 29 3b 0a 20 20 20  B, zSp, pC);.   
2140: 20 6a 6f 69 6e 74 79 70 65 20 3d 20 4a 54 5f 49   jointype = JT_I
2150: 4e 4e 45 52 3b 0a 20 20 7d 65 6c 73 65 20 69 66  NNER;.  }else if
2160: 28 20 28 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54  ( (jointype & JT
2170: 5f 4f 55 54 45 52 29 21 3d 30 20 0a 20 20 20 20  _OUTER)!=0 .    
2180: 20 20 20 20 20 26 26 20 28 6a 6f 69 6e 74 79 70       && (jointyp
2190: 65 20 26 20 28 4a 54 5f 4c 45 46 54 7c 4a 54 5f  e & (JT_LEFT|JT_
21a0: 52 49 47 48 54 29 29 21 3d 4a 54 5f 4c 45 46 54  RIGHT))!=JT_LEFT
21b0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
21c0: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
21d0: 0a 20 20 20 20 20 20 22 52 49 47 48 54 20 61 6e  .      "RIGHT an
21e0: 64 20 46 55 4c 4c 20 4f 55 54 45 52 20 4a 4f 49  d FULL OUTER JOI
21f0: 4e 73 20 61 72 65 20 6e 6f 74 20 63 75 72 72 65  Ns are not curre
2200: 6e 74 6c 79 20 73 75 70 70 6f 72 74 65 64 22 29  ntly supported")
2210: 3b 0a 20 20 20 20 6a 6f 69 6e 74 79 70 65 20 3d  ;.    jointype =
2220: 20 4a 54 5f 49 4e 4e 45 52 3b 0a 20 20 7d 0a 20   JT_INNER;.  }. 
2230: 20 72 65 74 75 72 6e 20 6a 6f 69 6e 74 79 70 65   return jointype
2240: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
2250: 6e 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 61  n the index of a
2260: 20 63 6f 6c 75 6d 6e 20 69 6e 20 61 20 74 61 62   column in a tab
2270: 6c 65 2e 20 20 52 65 74 75 72 6e 20 2d 31 20 69  le.  Return -1 i
2280: 66 20 74 68 65 20 63 6f 6c 75 6d 6e 0a 2a 2a 20  f the column.** 
2290: 69 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 65 64  is not contained
22a0: 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a   in the table..*
22b0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f 6c  /.static int col
22c0: 75 6d 6e 49 6e 64 65 78 28 54 61 62 6c 65 20 2a  umnIndex(Table *
22d0: 70 54 61 62 2c 20 63 6f 6e 73 74 20 63 68 61 72  pTab, const char
22e0: 20 2a 7a 43 6f 6c 29 7b 0a 20 20 69 6e 74 20 69   *zCol){.  int i
22f0: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
2300: 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b  Tab->nCol; i++){
2310: 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
2320: 53 74 72 49 43 6d 70 28 70 54 61 62 2d 3e 61 43  StrICmp(pTab->aC
2330: 6f 6c 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 7a 43 6f  ol[i].zName, zCo
2340: 6c 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 69  l)==0 ) return i
2350: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 2d  ;.  }.  return -
2360: 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 61 72  1;.}../*.** Sear
2370: 63 68 20 74 68 65 20 66 69 72 73 74 20 4e 20 74  ch the first N t
2380: 61 62 6c 65 73 20 69 6e 20 70 53 72 63 2c 20 66  ables in pSrc, f
2390: 72 6f 6d 20 6c 65 66 74 20 74 6f 20 72 69 67 68  rom left to righ
23a0: 74 2c 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 61  t, looking for a
23b0: 0a 2a 2a 20 74 61 62 6c 65 20 74 68 61 74 20 68  .** table that h
23c0: 61 73 20 61 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65  as a column name
23d0: 64 20 7a 43 6f 6c 2e 20 20 0a 2a 2a 0a 2a 2a 20  d zCol.  .**.** 
23e0: 57 68 65 6e 20 66 6f 75 6e 64 2c 20 73 65 74 20  When found, set 
23f0: 2a 70 69 54 61 62 20 61 6e 64 20 2a 70 69 43 6f  *piTab and *piCo
2400: 6c 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20 69  l to the table i
2410: 6e 64 65 78 20 61 6e 64 20 63 6f 6c 75 6d 6e 20  ndex and column 
2420: 69 6e 64 65 78 0a 2a 2a 20 6f 66 20 74 68 65 20  index.** of the 
2430: 6d 61 74 63 68 69 6e 67 20 63 6f 6c 75 6d 6e 20  matching column 
2440: 61 6e 64 20 72 65 74 75 72 6e 20 54 52 55 45 2e  and return TRUE.
2450: 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 74 20 66 6f  .**.** If not fo
2460: 75 6e 64 2c 20 72 65 74 75 72 6e 20 46 41 4c 53  und, return FALS
2470: 45 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  E..*/.static int
2480: 20 74 61 62 6c 65 41 6e 64 43 6f 6c 75 6d 6e 49   tableAndColumnI
2490: 6e 64 65 78 28 0a 20 20 53 72 63 4c 69 73 74 20  ndex(.  SrcList 
24a0: 2a 70 53 72 63 2c 20 20 20 20 20 20 20 2f 2a 20  *pSrc,       /* 
24b0: 41 72 72 61 79 20 6f 66 20 74 61 62 6c 65 73 20  Array of tables 
24c0: 74 6f 20 73 65 61 72 63 68 20 2a 2f 0a 20 20 69  to search */.  i
24d0: 6e 74 20 4e 2c 20 20 20 20 20 20 20 20 20 20 20  nt N,           
24e0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
24f0: 20 74 61 62 6c 65 73 20 69 6e 20 70 53 72 63 2d   tables in pSrc-
2500: 3e 61 5b 5d 20 74 6f 20 73 65 61 72 63 68 20 2a  >a[] to search *
2510: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
2520: 7a 43 6f 6c 2c 20 20 20 20 2f 2a 20 4e 61 6d 65  zCol,    /* Name
2530: 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 77   of the column w
2540: 65 20 61 72 65 20 6c 6f 6f 6b 69 6e 67 20 66 6f  e are looking fo
2550: 72 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 69 54 61  r */.  int *piTa
2560: 62 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57  b,          /* W
2570: 72 69 74 65 20 69 6e 64 65 78 20 6f 66 20 70 53  rite index of pS
2580: 72 63 2d 3e 61 5b 5d 20 68 65 72 65 20 2a 2f 0a  rc->a[] here */.
2590: 20 20 69 6e 74 20 2a 70 69 43 6f 6c 20 20 20 20    int *piCol    
25a0: 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20         /* Write 
25b0: 69 6e 64 65 78 20 6f 66 20 70 53 72 63 2d 3e 61  index of pSrc->a
25c0: 5b 2a 70 69 54 61 62 5d 2e 70 54 61 62 2d 3e 61  [*piTab].pTab->a
25d0: 43 6f 6c 5b 5d 20 68 65 72 65 20 2a 2f 0a 29 7b  Col[] here */.){
25e0: 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20  .  int i;       
25f0: 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c          /* For l
2600: 6f 6f 70 69 6e 67 20 6f 76 65 72 20 74 61 62 6c  ooping over tabl
2610: 65 73 20 69 6e 20 70 53 72 63 20 2a 2f 0a 20 20  es in pSrc */.  
2620: 69 6e 74 20 69 43 6f 6c 3b 20 20 20 20 20 20 20  int iCol;       
2630: 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66       /* Index of
2640: 20 63 6f 6c 75 6d 6e 20 6d 61 74 63 68 69 6e 67   column matching
2650: 20 7a 43 6f 6c 20 2a 2f 0a 0a 20 20 61 73 73 65   zCol */..  asse
2660: 72 74 28 20 28 70 69 54 61 62 3d 3d 30 29 3d 3d  rt( (piTab==0)==
2670: 28 70 69 43 6f 6c 3d 3d 30 29 20 29 3b 20 20 2f  (piCol==0) );  /
2680: 2a 20 42 6f 74 68 20 6f 72 20 6e 65 69 74 68 65  * Both or neithe
2690: 72 20 61 72 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20  r are NULL */.  
26a0: 66 6f 72 28 69 3d 30 3b 20 69 3c 4e 3b 20 69 2b  for(i=0; i<N; i+
26b0: 2b 29 7b 0a 20 20 20 20 69 43 6f 6c 20 3d 20 63  +){.    iCol = c
26c0: 6f 6c 75 6d 6e 49 6e 64 65 78 28 70 53 72 63 2d  olumnIndex(pSrc-
26d0: 3e 61 5b 69 5d 2e 70 54 61 62 2c 20 7a 43 6f 6c  >a[i].pTab, zCol
26e0: 29 3b 0a 20 20 20 20 69 66 28 20 69 43 6f 6c 3e  );.    if( iCol>
26f0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  =0 ){.      if( 
2700: 70 69 54 61 62 20 29 7b 0a 20 20 20 20 20 20 20  piTab ){.       
2710: 20 2a 70 69 54 61 62 20 3d 20 69 3b 0a 20 20 20   *piTab = i;.   
2720: 20 20 20 20 20 2a 70 69 43 6f 6c 20 3d 20 69 43       *piCol = iC
2730: 6f 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ol;.      }.    
2740: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
2750: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  }.  }.  return 0
2760: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
2770: 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64  function is used
2780: 20 74 6f 20 61 64 64 20 74 65 72 6d 73 20 69 6d   to add terms im
2790: 70 6c 69 65 64 20 62 79 20 4a 4f 49 4e 20 73 79  plied by JOIN sy
27a0: 6e 74 61 78 20 74 6f 20 74 68 65 0a 2a 2a 20 57  ntax to the.** W
27b0: 48 45 52 45 20 63 6c 61 75 73 65 20 65 78 70 72  HERE clause expr
27c0: 65 73 73 69 6f 6e 20 6f 66 20 61 20 53 45 4c 45  ession of a SELE
27d0: 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 20 54 68  CT statement. Th
27e0: 65 20 6e 65 77 20 74 65 72 6d 2c 20 77 68 69 63  e new term, whic
27f0: 68 0a 2a 2a 20 69 73 20 41 4e 44 65 64 20 77 69  h.** is ANDed wi
2800: 74 68 20 74 68 65 20 65 78 69 73 74 69 6e 67 20  th the existing 
2810: 57 48 45 52 45 20 63 6c 61 75 73 65 2c 20 69 73  WHERE clause, is
2820: 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a 2a 2a   of the form:.**
2830: 0a 2a 2a 20 20 20 20 28 74 61 62 31 2e 63 6f 6c  .**    (tab1.col
2840: 31 20 3d 20 74 61 62 32 2e 63 6f 6c 32 29 0a 2a  1 = tab2.col2).*
2850: 2a 0a 2a 2a 20 77 68 65 72 65 20 74 61 62 31 20  *.** where tab1 
2860: 69 73 20 74 68 65 20 69 53 72 63 27 74 68 20 74  is the iSrc'th t
2870: 61 62 6c 65 20 69 6e 20 53 72 63 4c 69 73 74 20  able in SrcList 
2880: 70 53 72 63 20 61 6e 64 20 74 61 62 32 20 69 73  pSrc and tab2 is
2890: 20 74 68 65 20 0a 2a 2a 20 28 69 53 72 63 2b 31   the .** (iSrc+1
28a0: 29 27 74 68 2e 20 43 6f 6c 75 6d 6e 20 63 6f 6c  )'th. Column col
28b0: 31 20 69 73 20 63 6f 6c 75 6d 6e 20 69 43 6f 6c  1 is column iCol
28c0: 4c 65 66 74 20 6f 66 20 74 61 62 31 2c 20 61 6e  Left of tab1, an
28d0: 64 20 63 6f 6c 32 20 69 73 0a 2a 2a 20 63 6f 6c  d col2 is.** col
28e0: 75 6d 6e 20 69 43 6f 6c 52 69 67 68 74 20 6f 66  umn iColRight of
28f0: 20 74 61 62 32 2e 0a 2a 2f 0a 73 74 61 74 69 63   tab2..*/.static
2900: 20 76 6f 69 64 20 61 64 64 57 68 65 72 65 54 65   void addWhereTe
2910: 72 6d 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  rm(.  Parse *pPa
2920: 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  rse,            
2930: 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
2940: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 72   context */.  Sr
2950: 63 4c 69 73 74 20 2a 70 53 72 63 2c 20 20 20 20  cList *pSrc,    
2960: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2970: 20 4c 69 73 74 20 6f 66 20 74 61 62 6c 65 73 20   List of tables 
2980: 69 6e 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a  in FROM clause *
2990: 2f 0a 20 20 69 6e 74 20 69 4c 65 66 74 2c 20 20  /.  int iLeft,  
29a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29b0: 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20      /* Index of 
29c0: 66 69 72 73 74 20 74 61 62 6c 65 20 74 6f 20 6a  first table to j
29d0: 6f 69 6e 20 69 6e 20 70 53 72 63 20 2a 2f 0a 20  oin in pSrc */. 
29e0: 20 69 6e 74 20 69 43 6f 6c 4c 65 66 74 2c 20 20   int iColLeft,  
29f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a00: 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 63 6f 6c   /* Index of col
2a10: 75 6d 6e 20 69 6e 20 66 69 72 73 74 20 74 61 62  umn in first tab
2a20: 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 52 69 67  le */.  int iRig
2a30: 68 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ht,             
2a40: 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
2a50: 20 6f 66 20 73 65 63 6f 6e 64 20 74 61 62 6c 65   of second table
2a60: 20 69 6e 20 70 53 72 63 20 2a 2f 0a 20 20 69 6e   in pSrc */.  in
2a70: 74 20 69 43 6f 6c 52 69 67 68 74 2c 20 20 20 20  t iColRight,    
2a80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2a90: 20 49 6e 64 65 78 20 6f 66 20 63 6f 6c 75 6d 6e   Index of column
2aa0: 20 69 6e 20 73 65 63 6f 6e 64 20 74 61 62 6c 65   in second table
2ab0: 20 2a 2f 0a 20 20 69 6e 74 20 69 73 4f 75 74 65   */.  int isOute
2ac0: 72 4a 6f 69 6e 2c 20 20 20 20 20 20 20 20 20 20  rJoin,          
2ad0: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
2ae0: 20 74 68 69 73 20 69 73 20 61 6e 20 4f 55 54 45   this is an OUTE
2af0: 52 20 6a 6f 69 6e 20 2a 2f 0a 20 20 45 78 70 72  R join */.  Expr
2b00: 20 2a 2a 70 70 57 68 65 72 65 20 20 20 20 20 20   **ppWhere      
2b10: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
2b20: 4e 2f 4f 55 54 3a 20 54 68 65 20 57 48 45 52 45  N/OUT: The WHERE
2b30: 20 63 6c 61 75 73 65 20 74 6f 20 61 64 64 20 74   clause to add t
2b40: 6f 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65  o */.){.  sqlite
2b50: 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
2b60: 64 62 3b 0a 20 20 45 78 70 72 20 2a 70 45 31 3b  db;.  Expr *pE1;
2b70: 0a 20 20 45 78 70 72 20 2a 70 45 32 3b 0a 20 20  .  Expr *pE2;.  
2b80: 45 78 70 72 20 2a 70 45 71 3b 0a 0a 20 20 61 73  Expr *pEq;..  as
2b90: 73 65 72 74 28 20 69 4c 65 66 74 3c 69 52 69 67  sert( iLeft<iRig
2ba0: 68 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ht );.  assert( 
2bb0: 70 53 72 63 2d 3e 6e 53 72 63 3e 69 52 69 67 68  pSrc->nSrc>iRigh
2bc0: 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  t );.  assert( p
2bd0: 53 72 63 2d 3e 61 5b 69 4c 65 66 74 5d 2e 70 54  Src->a[iLeft].pT
2be0: 61 62 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ab );.  assert( 
2bf0: 70 53 72 63 2d 3e 61 5b 69 52 69 67 68 74 5d 2e  pSrc->a[iRight].
2c00: 70 54 61 62 20 29 3b 0a 0a 20 20 70 45 31 20 3d  pTab );..  pE1 =
2c10: 20 73 71 6c 69 74 65 33 43 72 65 61 74 65 43 6f   sqlite3CreateCo
2c20: 6c 75 6d 6e 45 78 70 72 28 64 62 2c 20 70 53 72  lumnExpr(db, pSr
2c30: 63 2c 20 69 4c 65 66 74 2c 20 69 43 6f 6c 4c 65  c, iLeft, iColLe
2c40: 66 74 29 3b 0a 20 20 70 45 32 20 3d 20 73 71 6c  ft);.  pE2 = sql
2c50: 69 74 65 33 43 72 65 61 74 65 43 6f 6c 75 6d 6e  ite3CreateColumn
2c60: 45 78 70 72 28 64 62 2c 20 70 53 72 63 2c 20 69  Expr(db, pSrc, i
2c70: 52 69 67 68 74 2c 20 69 43 6f 6c 52 69 67 68 74  Right, iColRight
2c80: 29 3b 0a 0a 20 20 70 45 71 20 3d 20 73 71 6c 69  );..  pEq = sqli
2c90: 74 65 33 50 45 78 70 72 28 70 50 61 72 73 65 2c  te3PExpr(pParse,
2ca0: 20 54 4b 5f 45 51 2c 20 70 45 31 2c 20 70 45 32   TK_EQ, pE1, pE2
2cb0: 29 3b 0a 20 20 69 66 28 20 70 45 71 20 26 26 20  );.  if( pEq && 
2cc0: 69 73 4f 75 74 65 72 4a 6f 69 6e 20 29 7b 0a 20  isOuterJoin ){. 
2cd0: 20 20 20 45 78 70 72 53 65 74 50 72 6f 70 65 72     ExprSetProper
2ce0: 74 79 28 70 45 71 2c 20 45 50 5f 46 72 6f 6d 4a  ty(pEq, EP_FromJ
2cf0: 6f 69 6e 29 3b 0a 20 20 20 20 61 73 73 65 72 74  oin);.    assert
2d00: 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
2d10: 74 79 28 70 45 71 2c 20 45 50 5f 54 6f 6b 65 6e  ty(pEq, EP_Token
2d20: 4f 6e 6c 79 7c 45 50 5f 52 65 64 75 63 65 64 29  Only|EP_Reduced)
2d30: 20 29 3b 0a 20 20 20 20 45 78 70 72 53 65 74 56   );.    ExprSetV
2d40: 56 41 50 72 6f 70 65 72 74 79 28 70 45 71 2c 20  VAProperty(pEq, 
2d50: 45 50 5f 4e 6f 52 65 64 75 63 65 29 3b 0a 20 20  EP_NoReduce);.  
2d60: 20 20 70 45 71 2d 3e 69 52 69 67 68 74 4a 6f 69    pEq->iRightJoi
2d70: 6e 54 61 62 6c 65 20 3d 20 28 69 31 36 29 70 45  nTable = (i16)pE
2d80: 32 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 7d 0a 20  2->iTable;.  }. 
2d90: 20 2a 70 70 57 68 65 72 65 20 3d 20 73 71 6c 69   *ppWhere = sqli
2da0: 74 65 33 45 78 70 72 41 6e 64 28 70 50 61 72 73  te3ExprAnd(pPars
2db0: 65 2c 20 2a 70 70 57 68 65 72 65 2c 20 70 45 71  e, *ppWhere, pEq
2dc0: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20  );.}../*.** Set 
2dd0: 74 68 65 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 20  the EP_FromJoin 
2de0: 70 72 6f 70 65 72 74 79 20 6f 6e 20 61 6c 6c 20  property on all 
2df0: 74 65 72 6d 73 20 6f 66 20 74 68 65 20 67 69 76  terms of the giv
2e00: 65 6e 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a  en expression..*
2e10: 2a 20 41 6e 64 20 73 65 74 20 74 68 65 20 45 78  * And set the Ex
2e20: 70 72 2e 69 52 69 67 68 74 4a 6f 69 6e 54 61 62  pr.iRightJoinTab
2e30: 6c 65 20 74 6f 20 69 54 61 62 6c 65 20 66 6f 72  le to iTable for
2e40: 20 65 76 65 72 79 20 74 65 72 6d 20 69 6e 20 74   every term in t
2e50: 68 65 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e  he.** expression
2e60: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 45 50 5f 46  ..**.** The EP_F
2e70: 72 6f 6d 4a 6f 69 6e 20 70 72 6f 70 65 72 74 79  romJoin property
2e80: 20 69 73 20 75 73 65 64 20 6f 6e 20 74 65 72 6d   is used on term
2e90: 73 20 6f 66 20 61 6e 20 65 78 70 72 65 73 73 69  s of an expressi
2ea0: 6f 6e 20 74 6f 20 74 65 6c 6c 0a 2a 2a 20 74 68  on to tell.** th
2eb0: 65 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49  e LEFT OUTER JOI
2ec0: 4e 20 70 72 6f 63 65 73 73 69 6e 67 20 6c 6f 67  N processing log
2ed0: 69 63 20 74 68 61 74 20 74 68 69 73 20 74 65 72  ic that this ter
2ee0: 6d 20 69 73 20 70 61 72 74 20 6f 66 20 74 68 65  m is part of the
2ef0: 0a 2a 2a 20 6a 6f 69 6e 20 72 65 73 74 72 69 63  .** join restric
2f00: 74 69 6f 6e 20 73 70 65 63 69 66 69 65 64 20 69  tion specified i
2f10: 6e 20 74 68 65 20 4f 4e 20 6f 72 20 55 53 49 4e  n the ON or USIN
2f20: 47 20 63 6c 61 75 73 65 20 61 6e 64 20 6e 6f 74  G clause and not
2f30: 20 61 20 70 61 72 74 0a 2a 2a 20 6f 66 20 74 68   a part.** of th
2f40: 65 20 6d 6f 72 65 20 67 65 6e 65 72 61 6c 20 57  e more general W
2f50: 48 45 52 45 20 63 6c 61 75 73 65 2e 20 20 54 68  HERE clause.  Th
2f60: 65 73 65 20 74 65 72 6d 73 20 61 72 65 20 6d 6f  ese terms are mo
2f70: 76 65 64 20 6f 76 65 72 20 74 6f 20 74 68 65 0a  ved over to the.
2f80: 2a 2a 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  ** WHERE clause 
2f90: 64 75 72 69 6e 67 20 6a 6f 69 6e 20 70 72 6f 63  during join proc
2fa0: 65 73 73 69 6e 67 20 62 75 74 20 77 65 20 6e 65  essing but we ne
2fb0: 65 64 20 74 6f 20 72 65 6d 65 6d 62 65 72 20 74  ed to remember t
2fc0: 68 61 74 20 74 68 65 79 0a 2a 2a 20 6f 72 69 67  hat they.** orig
2fd0: 69 6e 61 74 65 64 20 69 6e 20 74 68 65 20 4f 4e  inated in the ON
2fe0: 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65   or USING clause
2ff0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 45 78 70 72  ..**.** The Expr
3000: 2e 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65  .iRightJoinTable
3010: 20 74 65 6c 6c 73 20 74 68 65 20 57 48 45 52 45   tells the WHERE
3020: 20 63 6c 61 75 73 65 20 70 72 6f 63 65 73 73 69   clause processi
3030: 6e 67 20 74 68 61 74 20 74 68 65 0a 2a 2a 20 65  ng that the.** e
3040: 78 70 72 65 73 73 69 6f 6e 20 64 65 70 65 6e 64  xpression depend
3050: 73 20 6f 6e 20 74 61 62 6c 65 20 69 52 69 67 68  s on table iRigh
3060: 74 4a 6f 69 6e 54 61 62 6c 65 20 65 76 65 6e 20  tJoinTable even 
3070: 69 66 20 74 68 61 74 20 74 61 62 6c 65 20 69 73  if that table is
3080: 20 6e 6f 74 0a 2a 2a 20 65 78 70 6c 69 63 69 74   not.** explicit
3090: 6c 79 20 6d 65 6e 74 69 6f 6e 65 64 20 69 6e 20  ly mentioned in 
30a0: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 2e 20  the expression. 
30b0: 20 54 68 61 74 20 69 6e 66 6f 72 6d 61 74 69 6f   That informatio
30c0: 6e 20 69 73 20 6e 65 65 64 65 64 0a 2a 2a 20 66  n is needed.** f
30d0: 6f 72 20 63 61 73 65 73 20 6c 69 6b 65 20 74 68  or cases like th
30e0: 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 53 45 4c  is:.**.**    SEL
30f0: 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 4c 45  ECT * FROM t1 LE
3100: 46 54 20 4a 4f 49 4e 20 74 32 20 4f 4e 20 74 31  FT JOIN t2 ON t1
3110: 2e 61 3d 74 32 2e 62 20 41 4e 44 20 74 31 2e 78  .a=t2.b AND t1.x
3120: 3d 35 0a 2a 2a 0a 2a 2a 20 54 68 65 20 77 68 65  =5.**.** The whe
3130: 72 65 20 63 6c 61 75 73 65 20 6e 65 65 64 73 20  re clause needs 
3140: 74 6f 20 64 65 66 65 72 20 74 68 65 20 68 61 6e  to defer the han
3150: 64 6c 69 6e 67 20 6f 66 20 74 68 65 20 74 31 2e  dling of the t1.
3160: 78 3d 35 0a 2a 2a 20 74 65 72 6d 20 75 6e 74 69  x=5.** term unti
3170: 6c 20 61 66 74 65 72 20 74 68 65 20 74 32 20 6c  l after the t2 l
3180: 6f 6f 70 20 6f 66 20 74 68 65 20 6a 6f 69 6e 2e  oop of the join.
3190: 20 20 49 6e 20 74 68 61 74 20 77 61 79 2c 20 61    In that way, a
31a0: 0a 2a 2a 20 4e 55 4c 4c 20 74 32 20 72 6f 77 20  .** NULL t2 row 
31b0: 77 69 6c 6c 20 62 65 20 69 6e 73 65 72 74 65 64  will be inserted
31c0: 20 77 68 65 6e 65 76 65 72 20 74 31 2e 78 21 3d   whenever t1.x!=
31d0: 35 2e 20 20 49 66 20 77 65 20 64 6f 20 6e 6f 74  5.  If we do not
31e0: 0a 2a 2a 20 64 65 66 65 72 20 74 68 65 20 68 61  .** defer the ha
31f0: 6e 64 6c 69 6e 67 20 6f 66 20 74 31 2e 78 3d 35  ndling of t1.x=5
3200: 2c 20 69 74 20 77 69 6c 6c 20 62 65 20 70 72 6f  , it will be pro
3210: 63 65 73 73 65 64 20 69 6d 6d 65 64 69 61 74 65  cessed immediate
3220: 6c 79 0a 2a 2a 20 61 66 74 65 72 20 74 68 65 20  ly.** after the 
3230: 74 31 20 6c 6f 6f 70 20 61 6e 64 20 72 6f 77 73  t1 loop and rows
3240: 20 77 69 74 68 20 74 31 2e 78 21 3d 35 20 77 69   with t1.x!=5 wi
3250: 6c 6c 20 6e 65 76 65 72 20 61 70 70 65 61 72 20  ll never appear 
3260: 69 6e 0a 2a 2a 20 74 68 65 20 6f 75 74 70 75 74  in.** the output
3270: 2c 20 77 68 69 63 68 20 69 73 20 69 6e 63 6f 72  , which is incor
3280: 72 65 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rect..*/.static 
3290: 76 6f 69 64 20 73 65 74 4a 6f 69 6e 45 78 70 72  void setJoinExpr
32a0: 28 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 69 54  (Expr *p, int iT
32b0: 61 62 6c 65 29 7b 0a 20 20 77 68 69 6c 65 28 20  able){.  while( 
32c0: 70 20 29 7b 0a 20 20 20 20 45 78 70 72 53 65 74  p ){.    ExprSet
32d0: 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 46  Property(p, EP_F
32e0: 72 6f 6d 4a 6f 69 6e 29 3b 0a 20 20 20 20 61 73  romJoin);.    as
32f0: 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72  sert( !ExprHasPr
3300: 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 54 6f 6b  operty(p, EP_Tok
3310: 65 6e 4f 6e 6c 79 7c 45 50 5f 52 65 64 75 63 65  enOnly|EP_Reduce
3320: 64 29 20 29 3b 0a 20 20 20 20 45 78 70 72 53 65  d) );.    ExprSe
3330: 74 56 56 41 50 72 6f 70 65 72 74 79 28 70 2c 20  tVVAProperty(p, 
3340: 45 50 5f 4e 6f 52 65 64 75 63 65 29 3b 0a 20 20  EP_NoReduce);.  
3350: 20 20 70 2d 3e 69 52 69 67 68 74 4a 6f 69 6e 54    p->iRightJoinT
3360: 61 62 6c 65 20 3d 20 28 69 31 36 29 69 54 61 62  able = (i16)iTab
3370: 6c 65 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6f  le;.    if( p->o
3380: 70 3d 3d 54 4b 5f 46 55 4e 43 54 49 4f 4e 20 26  p==TK_FUNCTION &
3390: 26 20 70 2d 3e 78 2e 70 4c 69 73 74 20 29 7b 0a  & p->x.pList ){.
33a0: 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20        int i;.   
33b0: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d     for(i=0; i<p-
33c0: 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b  >x.pList->nExpr;
33d0: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 73   i++){.        s
33e0: 65 74 4a 6f 69 6e 45 78 70 72 28 70 2d 3e 78 2e  etJoinExpr(p->x.
33f0: 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70  pList->a[i].pExp
3400: 72 2c 20 69 54 61 62 6c 65 29 3b 0a 20 20 20 20  r, iTable);.    
3410: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 65    }.    }.    se
3420: 74 4a 6f 69 6e 45 78 70 72 28 70 2d 3e 70 4c 65  tJoinExpr(p->pLe
3430: 66 74 2c 20 69 54 61 62 6c 65 29 3b 0a 20 20 20  ft, iTable);.   
3440: 20 70 20 3d 20 70 2d 3e 70 52 69 67 68 74 3b 0a   p = p->pRight;.
3450: 20 20 7d 20 0a 7d 0a 0a 2f 2a 20 55 6e 64 6f 20    } .}../* Undo 
3460: 74 68 65 20 77 6f 72 6b 20 6f 66 20 73 65 74 4a  the work of setJ
3470: 6f 69 6e 45 78 70 72 28 29 2e 20 20 49 6e 20 74  oinExpr().  In t
3480: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72  he expression tr
3490: 65 65 20 70 2c 20 63 6f 6e 76 65 72 74 20 65 76  ee p, convert ev
34a0: 65 72 79 0a 2a 2a 20 74 65 72 6d 20 74 68 61 74  ery.** term that
34b0: 20 69 73 20 6d 61 72 6b 65 64 20 77 69 74 68 20   is marked with 
34c0: 45 50 5f 46 72 6f 6d 4a 6f 69 6e 20 61 6e 64 20  EP_FromJoin and 
34d0: 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 3d  iRightJoinTable=
34e0: 3d 69 54 61 62 6c 65 20 69 6e 74 6f 0a 2a 2a 20  =iTable into.** 
34f0: 61 6e 20 6f 72 64 69 6e 61 72 79 20 74 65 72 6d  an ordinary term
3500: 20 74 68 61 74 20 6f 6d 69 74 73 20 74 68 65 20   that omits the 
3510: 45 50 5f 46 72 6f 6d 4a 6f 69 6e 20 6d 61 72 6b  EP_FromJoin mark
3520: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 68 61 70  ..**.** This hap
3530: 70 65 6e 73 20 77 68 65 6e 20 61 20 4c 45 46 54  pens when a LEFT
3540: 20 4a 4f 49 4e 20 69 73 20 73 69 6d 70 6c 69 66   JOIN is simplif
3550: 69 65 64 20 69 6e 74 6f 20 61 6e 20 6f 72 64 69  ied into an ordi
3560: 6e 61 72 79 20 4a 4f 49 4e 2e 0a 2a 2f 0a 73 74  nary JOIN..*/.st
3570: 61 74 69 63 20 76 6f 69 64 20 75 6e 73 65 74 4a  atic void unsetJ
3580: 6f 69 6e 45 78 70 72 28 45 78 70 72 20 2a 70 2c  oinExpr(Expr *p,
3590: 20 69 6e 74 20 69 54 61 62 6c 65 29 7b 0a 20 20   int iTable){.  
35a0: 77 68 69 6c 65 28 20 70 20 29 7b 0a 20 20 20 20  while( p ){.    
35b0: 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65  if( ExprHasPrope
35c0: 72 74 79 28 70 2c 20 45 50 5f 46 72 6f 6d 4a 6f  rty(p, EP_FromJo
35d0: 69 6e 29 0a 20 20 20 20 20 26 26 20 28 69 54 61  in).     && (iTa
35e0: 62 6c 65 3c 30 20 7c 7c 20 70 2d 3e 69 52 69 67  ble<0 || p->iRig
35f0: 68 74 4a 6f 69 6e 54 61 62 6c 65 3d 3d 69 54 61  htJoinTable==iTa
3600: 62 6c 65 29 20 29 7b 0a 20 20 20 20 20 20 45 78  ble) ){.      Ex
3610: 70 72 43 6c 65 61 72 50 72 6f 70 65 72 74 79 28  prClearProperty(
3620: 70 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 3b  p, EP_FromJoin);
3630: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
3640: 2d 3e 6f 70 3d 3d 54 4b 5f 46 55 4e 43 54 49 4f  ->op==TK_FUNCTIO
3650: 4e 20 26 26 20 70 2d 3e 78 2e 70 4c 69 73 74 20  N && p->x.pList 
3660: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a  ){.      int i;.
3670: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
3680: 3c 70 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78  <p->x.pList->nEx
3690: 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  pr; i++){.      
36a0: 20 20 75 6e 73 65 74 4a 6f 69 6e 45 78 70 72 28    unsetJoinExpr(
36b0: 70 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 69 5d  p->x.pList->a[i]
36c0: 2e 70 45 78 70 72 2c 20 69 54 61 62 6c 65 29 3b  .pExpr, iTable);
36d0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
36e0: 20 20 20 75 6e 73 65 74 4a 6f 69 6e 45 78 70 72     unsetJoinExpr
36f0: 28 70 2d 3e 70 4c 65 66 74 2c 20 69 54 61 62 6c  (p->pLeft, iTabl
3700: 65 29 3b 0a 20 20 20 20 70 20 3d 20 70 2d 3e 70  e);.    p = p->p
3710: 52 69 67 68 74 3b 0a 20 20 7d 20 0a 7d 0a 0a 2f  Right;.  } .}../
3720: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
3730: 65 20 70 72 6f 63 65 73 73 65 73 20 74 68 65 20  e processes the 
3740: 6a 6f 69 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  join information
3750: 20 66 6f 72 20 61 20 53 45 4c 45 43 54 20 73 74   for a SELECT st
3760: 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 4f 4e 20 61  atement..** ON a
3770: 6e 64 20 55 53 49 4e 47 20 63 6c 61 75 73 65 73  nd USING clauses
3780: 20 61 72 65 20 63 6f 6e 76 65 72 74 65 64 20 69   are converted i
3790: 6e 74 6f 20 65 78 74 72 61 20 74 65 72 6d 73 20  nto extra terms 
37a0: 6f 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  of the WHERE cla
37b0: 75 73 65 2e 0a 2a 2a 20 4e 41 54 55 52 41 4c 20  use..** NATURAL 
37c0: 6a 6f 69 6e 73 20 61 6c 73 6f 20 63 72 65 61 74  joins also creat
37d0: 65 20 65 78 74 72 61 20 57 48 45 52 45 20 63 6c  e extra WHERE cl
37e0: 61 75 73 65 20 74 65 72 6d 73 2e 0a 2a 2a 0a 2a  ause terms..**.*
37f0: 2a 20 54 68 65 20 74 65 72 6d 73 20 6f 66 20 61  * The terms of a
3800: 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 61 72 65   FROM clause are
3810: 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 74 68   contained in th
3820: 65 20 53 65 6c 65 63 74 2e 70 53 72 63 20 73 74  e Select.pSrc st
3830: 72 75 63 74 75 72 65 2e 0a 2a 2a 20 54 68 65 20  ructure..** The 
3840: 6c 65 66 74 20 6d 6f 73 74 20 74 61 62 6c 65 20  left most table 
3850: 69 73 20 74 68 65 20 66 69 72 73 74 20 65 6e 74  is the first ent
3860: 72 79 20 69 6e 20 53 65 6c 65 63 74 2e 70 53 72  ry in Select.pSr
3870: 63 2e 20 20 54 68 65 20 72 69 67 68 74 2d 6d 6f  c.  The right-mo
3880: 73 74 0a 2a 2a 20 74 61 62 6c 65 20 69 73 20 74  st.** table is t
3890: 68 65 20 6c 61 73 74 20 65 6e 74 72 79 2e 20 20  he last entry.  
38a0: 54 68 65 20 6a 6f 69 6e 20 6f 70 65 72 61 74 6f  The join operato
38b0: 72 20 69 73 20 68 65 6c 64 20 69 6e 20 74 68 65  r is held in the
38c0: 20 65 6e 74 72 79 20 74 6f 0a 2a 2a 20 74 68 65   entry to.** the
38d0: 20 6c 65 66 74 2e 20 20 54 68 75 73 20 65 6e 74   left.  Thus ent
38e0: 72 79 20 30 20 63 6f 6e 74 61 69 6e 73 20 74 68  ry 0 contains th
38f0: 65 20 6a 6f 69 6e 20 6f 70 65 72 61 74 6f 72 20  e join operator 
3900: 66 6f 72 20 74 68 65 20 6a 6f 69 6e 20 62 65 74  for the join bet
3910: 77 65 65 6e 0a 2a 2a 20 65 6e 74 72 69 65 73 20  ween.** entries 
3920: 30 20 61 6e 64 20 31 2e 20 20 41 6e 79 20 4f 4e  0 and 1.  Any ON
3930: 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65   or USING clause
3940: 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  s associated wit
3950: 68 20 74 68 65 20 6a 6f 69 6e 20 61 72 65 0a 2a  h the join are.*
3960: 2a 20 61 6c 73 6f 20 61 74 74 61 63 68 65 64 20  * also attached 
3970: 74 6f 20 74 68 65 20 6c 65 66 74 20 65 6e 74 72  to the left entr
3980: 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  y..**.** This ro
3990: 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 74 68  utine returns th
39a0: 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f  e number of erro
39b0: 72 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 2e 0a  rs encountered..
39c0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71  */.static int sq
39d0: 6c 69 74 65 50 72 6f 63 65 73 73 4a 6f 69 6e 28  liteProcessJoin(
39e0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53  Parse *pParse, S
39f0: 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 53 72 63  elect *p){.  Src
3a00: 4c 69 73 74 20 2a 70 53 72 63 3b 20 20 20 20 20  List *pSrc;     
3a10: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3a20: 41 6c 6c 20 74 61 62 6c 65 73 20 69 6e 20 74 68  All tables in th
3a30: 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f  e FROM clause */
3a40: 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 20 20 20 20  .  int i, j;    
3a50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3a60: 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
3a70: 65 72 73 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  ers */.  struct 
3a80: 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4c  SrcList_item *pL
3a90: 65 66 74 3b 20 20 20 20 20 2f 2a 20 4c 65 66 74  eft;     /* Left
3aa0: 20 74 61 62 6c 65 20 62 65 69 6e 67 20 6a 6f 69   table being joi
3ab0: 6e 65 64 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  ned */.  struct 
3ac0: 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 52  SrcList_item *pR
3ad0: 69 67 68 74 3b 20 20 20 20 2f 2a 20 52 69 67 68  ight;    /* Righ
3ae0: 74 20 74 61 62 6c 65 20 62 65 69 6e 67 20 6a 6f  t table being jo
3af0: 69 6e 65 64 20 2a 2f 0a 0a 20 20 70 53 72 63 20  ined */..  pSrc 
3b00: 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 70 4c 65  = p->pSrc;.  pLe
3b10: 66 74 20 3d 20 26 70 53 72 63 2d 3e 61 5b 30 5d  ft = &pSrc->a[0]
3b20: 3b 0a 20 20 70 52 69 67 68 74 20 3d 20 26 70 4c  ;.  pRight = &pL
3b30: 65 66 74 5b 31 5d 3b 0a 20 20 66 6f 72 28 69 3d  eft[1];.  for(i=
3b40: 30 3b 20 69 3c 70 53 72 63 2d 3e 6e 53 72 63 2d  0; i<pSrc->nSrc-
3b50: 31 3b 20 69 2b 2b 2c 20 70 52 69 67 68 74 2b 2b  1; i++, pRight++
3b60: 2c 20 70 4c 65 66 74 2b 2b 29 7b 0a 20 20 20 20  , pLeft++){.    
3b70: 54 61 62 6c 65 20 2a 70 52 69 67 68 74 54 61 62  Table *pRightTab
3b80: 20 3d 20 70 52 69 67 68 74 2d 3e 70 54 61 62 3b   = pRight->pTab;
3b90: 0a 20 20 20 20 69 6e 74 20 69 73 4f 75 74 65 72  .    int isOuter
3ba0: 3b 0a 0a 20 20 20 20 69 66 28 20 4e 45 56 45 52  ;..    if( NEVER
3bb0: 28 70 4c 65 66 74 2d 3e 70 54 61 62 3d 3d 30 20  (pLeft->pTab==0 
3bc0: 7c 7c 20 70 52 69 67 68 74 54 61 62 3d 3d 30 29  || pRightTab==0)
3bd0: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
3be0: 20 69 73 4f 75 74 65 72 20 3d 20 28 70 52 69 67   isOuter = (pRig
3bf0: 68 74 2d 3e 66 67 2e 6a 6f 69 6e 74 79 70 65 20  ht->fg.jointype 
3c00: 26 20 4a 54 5f 4f 55 54 45 52 29 21 3d 30 3b 0a  & JT_OUTER)!=0;.
3c10: 0a 20 20 20 20 2f 2a 20 57 68 65 6e 20 74 68 65  .    /* When the
3c20: 20 4e 41 54 55 52 41 4c 20 6b 65 79 77 6f 72 64   NATURAL keyword
3c30: 20 69 73 20 70 72 65 73 65 6e 74 2c 20 61 64 64   is present, add
3c40: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 65   WHERE clause te
3c50: 72 6d 73 20 66 6f 72 0a 20 20 20 20 2a 2a 20 65  rms for.    ** e
3c60: 76 65 72 79 20 63 6f 6c 75 6d 6e 20 74 68 61 74  very column that
3c70: 20 74 68 65 20 74 77 6f 20 74 61 62 6c 65 73 20   the two tables 
3c80: 68 61 76 65 20 69 6e 20 63 6f 6d 6d 6f 6e 2e 0a  have in common..
3c90: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
3ca0: 52 69 67 68 74 2d 3e 66 67 2e 6a 6f 69 6e 74 79  Right->fg.jointy
3cb0: 70 65 20 26 20 4a 54 5f 4e 41 54 55 52 41 4c 20  pe & JT_NATURAL 
3cc0: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 52 69  ){.      if( pRi
3cd0: 67 68 74 2d 3e 70 4f 6e 20 7c 7c 20 70 52 69 67  ght->pOn || pRig
3ce0: 68 74 2d 3e 70 55 73 69 6e 67 20 29 7b 0a 20 20  ht->pUsing ){.  
3cf0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
3d00: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 61  orMsg(pParse, "a
3d10: 20 4e 41 54 55 52 41 4c 20 6a 6f 69 6e 20 6d 61   NATURAL join ma
3d20: 79 20 6e 6f 74 20 68 61 76 65 20 22 0a 20 20 20  y not have ".   
3d30: 20 20 20 20 20 20 20 20 22 61 6e 20 4f 4e 20 6f          "an ON o
3d40: 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65 22 2c  r USING clause",
3d50: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74   0);.        ret
3d60: 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20  urn 1;.      }. 
3d70: 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c       for(j=0; j<
3d80: 70 52 69 67 68 74 54 61 62 2d 3e 6e 43 6f 6c 3b  pRightTab->nCol;
3d90: 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 63   j++){.        c
3da0: 68 61 72 20 2a 7a 4e 61 6d 65 3b 20 20 20 2f 2a  har *zName;   /*
3db0: 20 4e 61 6d 65 20 6f 66 20 63 6f 6c 75 6d 6e 20   Name of column 
3dc0: 69 6e 20 74 68 65 20 72 69 67 68 74 20 74 61 62  in the right tab
3dd0: 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e  le */.        in
3de0: 74 20 69 4c 65 66 74 3b 20 20 20 20 20 2f 2a 20  t iLeft;     /* 
3df0: 4d 61 74 63 68 69 6e 67 20 6c 65 66 74 20 74 61  Matching left ta
3e00: 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 69  ble */.        i
3e10: 6e 74 20 69 4c 65 66 74 43 6f 6c 3b 20 20 2f 2a  nt iLeftCol;  /*
3e20: 20 4d 61 74 63 68 69 6e 67 20 63 6f 6c 75 6d 6e   Matching column
3e30: 20 69 6e 20 74 68 65 20 6c 65 66 74 20 74 61 62   in the left tab
3e40: 6c 65 20 2a 2f 0a 0a 20 20 20 20 20 20 20 20 7a  le */..        z
3e50: 4e 61 6d 65 20 3d 20 70 52 69 67 68 74 54 61 62  Name = pRightTab
3e60: 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 3b  ->aCol[j].zName;
3e70: 0a 20 20 20 20 20 20 20 20 69 66 28 20 74 61 62  .        if( tab
3e80: 6c 65 41 6e 64 43 6f 6c 75 6d 6e 49 6e 64 65 78  leAndColumnIndex
3e90: 28 70 53 72 63 2c 20 69 2b 31 2c 20 7a 4e 61 6d  (pSrc, i+1, zNam
3ea0: 65 2c 20 26 69 4c 65 66 74 2c 20 26 69 4c 65 66  e, &iLeft, &iLef
3eb0: 74 43 6f 6c 29 20 29 7b 0a 20 20 20 20 20 20 20  tCol) ){.       
3ec0: 20 20 20 61 64 64 57 68 65 72 65 54 65 72 6d 28     addWhereTerm(
3ed0: 70 50 61 72 73 65 2c 20 70 53 72 63 2c 20 69 4c  pParse, pSrc, iL
3ee0: 65 66 74 2c 20 69 4c 65 66 74 43 6f 6c 2c 20 69  eft, iLeftCol, i
3ef0: 2b 31 2c 20 6a 2c 0a 20 20 20 20 20 20 20 20 20  +1, j,.         
3f00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 73                is
3f10: 4f 75 74 65 72 2c 20 26 70 2d 3e 70 57 68 65 72  Outer, &p->pWher
3f20: 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  e);.        }.  
3f30: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
3f40: 20 2f 2a 20 44 69 73 61 6c 6c 6f 77 20 62 6f 74   /* Disallow bot
3f50: 68 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20 63  h ON and USING c
3f60: 6c 61 75 73 65 73 20 69 6e 20 74 68 65 20 73 61  lauses in the sa
3f70: 6d 65 20 6a 6f 69 6e 0a 20 20 20 20 2a 2f 0a 20  me join.    */. 
3f80: 20 20 20 69 66 28 20 70 52 69 67 68 74 2d 3e 70     if( pRight->p
3f90: 4f 6e 20 26 26 20 70 52 69 67 68 74 2d 3e 70 55  On && pRight->pU
3fa0: 73 69 6e 67 20 29 7b 0a 20 20 20 20 20 20 73 71  sing ){.      sq
3fb0: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
3fc0: 61 72 73 65 2c 20 22 63 61 6e 6e 6f 74 20 68 61  arse, "cannot ha
3fd0: 76 65 20 62 6f 74 68 20 4f 4e 20 61 6e 64 20 55  ve both ON and U
3fe0: 53 49 4e 47 20 22 0a 20 20 20 20 20 20 20 20 22  SING ".        "
3ff0: 63 6c 61 75 73 65 73 20 69 6e 20 74 68 65 20 73  clauses in the s
4000: 61 6d 65 20 6a 6f 69 6e 22 29 3b 0a 20 20 20 20  ame join");.    
4010: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
4020: 7d 0a 0a 20 20 20 20 2f 2a 20 41 64 64 20 74 68  }..    /* Add th
4030: 65 20 4f 4e 20 63 6c 61 75 73 65 20 74 6f 20 74  e ON clause to t
4040: 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 57 48  he end of the WH
4050: 45 52 45 20 63 6c 61 75 73 65 2c 20 63 6f 6e 6e  ERE clause, conn
4060: 65 63 74 65 64 20 62 79 0a 20 20 20 20 2a 2a 20  ected by.    ** 
4070: 61 6e 20 41 4e 44 20 6f 70 65 72 61 74 6f 72 2e  an AND operator.
4080: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
4090: 70 52 69 67 68 74 2d 3e 70 4f 6e 20 29 7b 0a 20  pRight->pOn ){. 
40a0: 20 20 20 20 20 69 66 28 20 69 73 4f 75 74 65 72       if( isOuter
40b0: 20 29 20 73 65 74 4a 6f 69 6e 45 78 70 72 28 70   ) setJoinExpr(p
40c0: 52 69 67 68 74 2d 3e 70 4f 6e 2c 20 70 52 69 67  Right->pOn, pRig
40d0: 68 74 2d 3e 69 43 75 72 73 6f 72 29 3b 0a 20 20  ht->iCursor);.  
40e0: 20 20 20 20 70 2d 3e 70 57 68 65 72 65 20 3d 20      p->pWhere = 
40f0: 73 71 6c 69 74 65 33 45 78 70 72 41 6e 64 28 70  sqlite3ExprAnd(p
4100: 50 61 72 73 65 2c 20 70 2d 3e 70 57 68 65 72 65  Parse, p->pWhere
4110: 2c 20 70 52 69 67 68 74 2d 3e 70 4f 6e 29 3b 0a  , pRight->pOn);.
4120: 20 20 20 20 20 20 70 52 69 67 68 74 2d 3e 70 4f        pRight->pO
4130: 6e 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20  n = 0;.    }..  
4140: 20 20 2f 2a 20 43 72 65 61 74 65 20 65 78 74 72    /* Create extr
4150: 61 20 74 65 72 6d 73 20 6f 6e 20 74 68 65 20 57  a terms on the W
4160: 48 45 52 45 20 63 6c 61 75 73 65 20 66 6f 72 20  HERE clause for 
4170: 65 61 63 68 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65  each column name
4180: 64 0a 20 20 20 20 2a 2a 20 69 6e 20 74 68 65 20  d.    ** in the 
4190: 55 53 49 4e 47 20 63 6c 61 75 73 65 2e 20 20 45  USING clause.  E
41a0: 78 61 6d 70 6c 65 3a 20 49 66 20 74 68 65 20 74  xample: If the t
41b0: 77 6f 20 74 61 62 6c 65 73 20 74 6f 20 62 65 20  wo tables to be 
41c0: 6a 6f 69 6e 65 64 20 61 72 65 20 0a 20 20 20 20  joined are .    
41d0: 2a 2a 20 41 20 61 6e 64 20 42 20 61 6e 64 20 74  ** A and B and t
41e0: 68 65 20 55 53 49 4e 47 20 63 6c 61 75 73 65 20  he USING clause 
41f0: 6e 61 6d 65 73 20 58 2c 20 59 2c 20 61 6e 64 20  names X, Y, and 
4200: 5a 2c 20 74 68 65 6e 20 61 64 64 20 74 68 69 73  Z, then add this
4210: 0a 20 20 20 20 2a 2a 20 74 6f 20 74 68 65 20 57  .    ** to the W
4220: 48 45 52 45 20 63 6c 61 75 73 65 3a 20 20 20 20  HERE clause:    
4230: 41 2e 58 3d 42 2e 58 20 41 4e 44 20 41 2e 59 3d  A.X=B.X AND A.Y=
4240: 42 2e 59 20 41 4e 44 20 41 2e 5a 3d 42 2e 5a 0a  B.Y AND A.Z=B.Z.
4250: 20 20 20 20 2a 2a 20 52 65 70 6f 72 74 20 61 6e      ** Report an
4260: 20 65 72 72 6f 72 20 69 66 20 61 6e 79 20 63 6f   error if any co
4270: 6c 75 6d 6e 20 6d 65 6e 74 69 6f 6e 65 64 20 69  lumn mentioned i
4280: 6e 20 74 68 65 20 55 53 49 4e 47 20 63 6c 61 75  n the USING clau
4290: 73 65 20 69 73 0a 20 20 20 20 2a 2a 20 6e 6f 74  se is.    ** not
42a0: 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 62 6f   contained in bo
42b0: 74 68 20 74 61 62 6c 65 73 20 74 6f 20 62 65 20  th tables to be 
42c0: 6a 6f 69 6e 65 64 2e 0a 20 20 20 20 2a 2f 0a 20  joined..    */. 
42d0: 20 20 20 69 66 28 20 70 52 69 67 68 74 2d 3e 70     if( pRight->p
42e0: 55 73 69 6e 67 20 29 7b 0a 20 20 20 20 20 20 49  Using ){.      I
42f0: 64 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d 20 70  dList *pList = p
4300: 52 69 67 68 74 2d 3e 70 55 73 69 6e 67 3b 0a 20  Right->pUsing;. 
4310: 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c       for(j=0; j<
4320: 70 4c 69 73 74 2d 3e 6e 49 64 3b 20 6a 2b 2b 29  pList->nId; j++)
4330: 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a  {.        char *
4340: 7a 4e 61 6d 65 3b 20 20 20 20 20 2f 2a 20 4e 61  zName;     /* Na
4350: 6d 65 20 6f 66 20 74 68 65 20 74 65 72 6d 20 69  me of the term i
4360: 6e 20 74 68 65 20 55 53 49 4e 47 20 63 6c 61 75  n the USING clau
4370: 73 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e  se */.        in
4380: 74 20 69 4c 65 66 74 3b 20 20 20 20 20 20 20 2f  t iLeft;       /
4390: 2a 20 54 61 62 6c 65 20 6f 6e 20 74 68 65 20 6c  * Table on the l
43a0: 65 66 74 20 77 69 74 68 20 6d 61 74 63 68 69 6e  eft with matchin
43b0: 67 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 2a 2f  g column name */
43c0: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 4c 65  .        int iLe
43d0: 66 74 43 6f 6c 3b 20 20 20 20 2f 2a 20 43 6f 6c  ftCol;    /* Col
43e0: 75 6d 6e 20 6e 75 6d 62 65 72 20 6f 66 20 6d 61  umn number of ma
43f0: 74 63 68 69 6e 67 20 63 6f 6c 75 6d 6e 20 6f 6e  tching column on
4400: 20 74 68 65 20 6c 65 66 74 20 2a 2f 0a 20 20 20   the left */.   
4410: 20 20 20 20 20 69 6e 74 20 69 52 69 67 68 74 43       int iRightC
4420: 6f 6c 3b 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20  ol;   /* Column 
4430: 6e 75 6d 62 65 72 20 6f 66 20 6d 61 74 63 68 69  number of matchi
4440: 6e 67 20 63 6f 6c 75 6d 6e 20 6f 6e 20 74 68 65  ng column on the
4450: 20 72 69 67 68 74 20 2a 2f 0a 0a 20 20 20 20 20   right */..     
4460: 20 20 20 7a 4e 61 6d 65 20 3d 20 70 4c 69 73 74     zName = pList
4470: 2d 3e 61 5b 6a 5d 2e 7a 4e 61 6d 65 3b 0a 20 20  ->a[j].zName;.  
4480: 20 20 20 20 20 20 69 52 69 67 68 74 43 6f 6c 20        iRightCol 
4490: 3d 20 63 6f 6c 75 6d 6e 49 6e 64 65 78 28 70 52  = columnIndex(pR
44a0: 69 67 68 74 54 61 62 2c 20 7a 4e 61 6d 65 29 3b  ightTab, zName);
44b0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 52 69  .        if( iRi
44c0: 67 68 74 43 6f 6c 3c 30 0a 20 20 20 20 20 20 20  ghtCol<0.       
44d0: 20 20 7c 7c 20 21 74 61 62 6c 65 41 6e 64 43 6f    || !tableAndCo
44e0: 6c 75 6d 6e 49 6e 64 65 78 28 70 53 72 63 2c 20  lumnIndex(pSrc, 
44f0: 69 2b 31 2c 20 7a 4e 61 6d 65 2c 20 26 69 4c 65  i+1, zName, &iLe
4500: 66 74 2c 20 26 69 4c 65 66 74 43 6f 6c 29 0a 20  ft, &iLeftCol). 
4510: 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20         ){.      
4520: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
4530: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 63 61 6e  Msg(pParse, "can
4540: 6e 6f 74 20 6a 6f 69 6e 20 75 73 69 6e 67 20 63  not join using c
4550: 6f 6c 75 6d 6e 20 25 73 20 2d 20 63 6f 6c 75 6d  olumn %s - colum
4560: 6e 20 22 0a 20 20 20 20 20 20 20 20 20 20 20 20  n ".            
4570: 22 6e 6f 74 20 70 72 65 73 65 6e 74 20 69 6e 20  "not present in 
4580: 62 6f 74 68 20 74 61 62 6c 65 73 22 2c 20 7a 4e  both tables", zN
4590: 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ame);.          
45a0: 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20  return 1;.      
45b0: 20 20 7d 0a 20 20 20 20 20 20 20 20 61 64 64 57    }.        addW
45c0: 68 65 72 65 54 65 72 6d 28 70 50 61 72 73 65 2c  hereTerm(pParse,
45d0: 20 70 53 72 63 2c 20 69 4c 65 66 74 2c 20 69 4c   pSrc, iLeft, iL
45e0: 65 66 74 43 6f 6c 2c 20 69 2b 31 2c 20 69 52 69  eftCol, i+1, iRi
45f0: 67 68 74 43 6f 6c 2c 0a 20 20 20 20 20 20 20 20  ghtCol,.        
4600: 20 20 20 20 20 20 20 20 20 20 20 20 20 69 73 4f               isO
4610: 75 74 65 72 2c 20 26 70 2d 3e 70 57 68 65 72 65  uter, &p->pWhere
4620: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
4630: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
4640: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73  .}../*.** An ins
4650: 74 61 6e 63 65 20 6f 66 20 74 68 69 73 20 6f 62  tance of this ob
4660: 6a 65 63 74 20 68 6f 6c 64 73 20 69 6e 66 6f 72  ject holds infor
4670: 6d 61 74 69 6f 6e 20 28 62 65 79 6f 6e 64 20 70  mation (beyond p
4680: 50 61 72 73 65 20 61 6e 64 20 70 53 65 6c 65 63  Parse and pSelec
4690: 74 29 0a 2a 2a 20 6e 65 65 64 65 64 20 74 6f 20  t).** needed to 
46a0: 6c 6f 61 64 20 74 68 65 20 6e 65 78 74 20 72 65  load the next re
46b0: 73 75 6c 74 20 72 6f 77 20 74 68 61 74 20 69 73  sult row that is
46c0: 20 74 6f 20 62 65 20 61 64 64 65 64 20 74 6f 20   to be added to 
46d0: 74 68 65 20 73 6f 72 74 65 72 2e 0a 2a 2f 0a 74  the sorter..*/.t
46e0: 79 70 65 64 65 66 20 73 74 72 75 63 74 20 52 6f  ypedef struct Ro
46f0: 77 4c 6f 61 64 49 6e 66 6f 20 52 6f 77 4c 6f 61  wLoadInfo RowLoa
4700: 64 49 6e 66 6f 3b 0a 73 74 72 75 63 74 20 52 6f  dInfo;.struct Ro
4710: 77 4c 6f 61 64 49 6e 66 6f 20 7b 0a 20 20 69 6e  wLoadInfo {.  in
4720: 74 20 72 65 67 52 65 73 75 6c 74 3b 20 20 20 20  t regResult;    
4730: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74             /* St
4740: 6f 72 65 20 72 65 73 75 6c 74 73 20 69 6e 20 61  ore results in a
4750: 72 72 61 79 20 6f 66 20 72 65 67 69 73 74 65 72  rray of register
4760: 73 20 68 65 72 65 20 2a 2f 0a 20 20 75 38 20 65  s here */.  u8 e
4770: 63 65 6c 46 6c 61 67 73 3b 20 20 20 20 20 20 20  celFlags;       
4780: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67           /* Flag
4790: 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 45 78 70   argument to Exp
47a0: 72 43 6f 64 65 45 78 70 72 4c 69 73 74 28 29 20  rCodeExprList() 
47b0: 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
47c0: 5f 45 4e 41 42 4c 45 5f 53 4f 52 54 45 52 5f 52  _ENABLE_SORTER_R
47d0: 45 46 45 52 45 4e 43 45 53 0a 20 20 45 78 70 72  EFERENCES.  Expr
47e0: 4c 69 73 74 20 2a 70 45 78 74 72 61 3b 20 20 20  List *pExtra;   
47f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 74 72           /* Extr
4800: 61 20 63 6f 6c 75 6d 6e 73 20 6e 65 65 64 65 64  a columns needed
4810: 20 62 79 20 73 6f 72 74 65 72 20 72 65 66 73 20   by sorter refs 
4820: 2a 2f 0a 20 20 69 6e 74 20 72 65 67 45 78 74 72  */.  int regExtr
4830: 61 52 65 73 75 6c 74 3b 20 20 20 20 20 20 20 20  aResult;        
4840: 20 20 2f 2a 20 57 68 65 72 65 20 74 6f 20 6c 6f    /* Where to lo
4850: 61 64 20 74 68 65 20 65 78 74 72 61 20 63 6f 6c  ad the extra col
4860: 75 6d 6e 73 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d  umns */.#endif.}
4870: 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  ;../*.** This ro
4880: 75 74 69 6e 65 20 64 6f 65 73 20 74 68 65 20 77  utine does the w
4890: 6f 72 6b 20 6f 66 20 6c 6f 61 64 69 6e 67 20 71  ork of loading q
48a0: 75 65 72 79 20 64 61 74 61 20 69 6e 74 6f 20 61  uery data into a
48b0: 6e 20 61 72 72 61 79 20 6f 66 0a 2a 2a 20 72 65  n array of.** re
48c0: 67 69 73 74 65 72 73 20 73 6f 20 74 68 61 74 20  gisters so that 
48d0: 69 74 20 63 61 6e 20 62 65 20 61 64 64 65 64 20  it can be added 
48e0: 74 6f 20 74 68 65 20 73 6f 72 74 65 72 2e 0a 2a  to the sorter..*
48f0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 69 6e  /.static void in
4900: 6e 65 72 4c 6f 6f 70 4c 6f 61 64 52 6f 77 28 0a  nerLoopLoadRow(.
4910: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
4920: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
4930: 53 74 61 74 65 6d 65 6e 74 20 75 6e 64 65 72 20  Statement under 
4940: 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a  construction */.
4950: 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63    Select *pSelec
4960: 74 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  t,           /* 
4970: 54 68 65 20 71 75 65 72 79 20 62 65 69 6e 67 20  The query being 
4980: 63 6f 64 65 64 20 2a 2f 0a 20 20 52 6f 77 4c 6f  coded */.  RowLo
4990: 61 64 49 6e 66 6f 20 2a 70 49 6e 66 6f 20 20 20  adInfo *pInfo   
49a0: 20 20 20 20 20 20 2f 2a 20 49 6e 66 6f 20 6e 65        /* Info ne
49b0: 65 64 65 64 20 74 6f 20 63 6f 6d 70 6c 65 74 65  eded to complete
49c0: 20 74 68 65 20 72 6f 77 20 6c 6f 61 64 20 2a 2f   the row load */
49d0: 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 45 78 70  .){.  sqlite3Exp
49e0: 72 43 6f 64 65 45 78 70 72 4c 69 73 74 28 70 50  rCodeExprList(pP
49f0: 61 72 73 65 2c 20 70 53 65 6c 65 63 74 2d 3e 70  arse, pSelect->p
4a00: 45 4c 69 73 74 2c 20 70 49 6e 66 6f 2d 3e 72 65  EList, pInfo->re
4a10: 67 52 65 73 75 6c 74 2c 0a 20 20 20 20 20 20 20  gResult,.       
4a20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4a30: 20 20 20 30 2c 20 70 49 6e 66 6f 2d 3e 65 63 65     0, pInfo->ece
4a40: 6c 46 6c 61 67 73 29 3b 0a 23 69 66 64 65 66 20  lFlags);.#ifdef 
4a50: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 4f  SQLITE_ENABLE_SO
4a60: 52 54 45 52 5f 52 45 46 45 52 45 4e 43 45 53 0a  RTER_REFERENCES.
4a70: 20 20 69 66 28 20 70 49 6e 66 6f 2d 3e 70 45 78    if( pInfo->pEx
4a80: 74 72 61 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  tra ){.    sqlit
4a90: 65 33 45 78 70 72 43 6f 64 65 45 78 70 72 4c 69  e3ExprCodeExprLi
4aa0: 73 74 28 70 50 61 72 73 65 2c 20 70 49 6e 66 6f  st(pParse, pInfo
4ab0: 2d 3e 70 45 78 74 72 61 2c 20 70 49 6e 66 6f 2d  ->pExtra, pInfo-
4ac0: 3e 72 65 67 45 78 74 72 61 52 65 73 75 6c 74 2c  >regExtraResult,
4ad0: 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69   0, 0);.    sqli
4ae0: 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74  te3ExprListDelet
4af0: 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 49  e(pParse->db, pI
4b00: 6e 66 6f 2d 3e 70 45 78 74 72 61 29 3b 0a 20 20  nfo->pExtra);.  
4b10: 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a  }.#endif.}../*.*
4b20: 2a 20 43 6f 64 65 20 74 68 65 20 4f 50 5f 4d 61  * Code the OP_Ma
4b30: 6b 65 52 65 63 6f 72 64 20 69 6e 73 74 72 75 63  keRecord instruc
4b40: 74 69 6f 6e 20 74 68 61 74 20 67 65 6e 65 72 61  tion that genera
4b50: 74 65 73 20 74 68 65 20 65 6e 74 72 79 20 74 6f  tes the entry to
4b60: 20 62 65 0a 2a 2a 20 61 64 64 65 64 20 69 6e 74   be.** added int
4b70: 6f 20 74 68 65 20 73 6f 72 74 65 72 2e 0a 2a 2a  o the sorter..**
4b80: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 72  .** Return the r
4b90: 65 67 69 73 74 65 72 20 69 6e 20 77 68 69 63 68  egister in which
4ba0: 20 74 68 65 20 72 65 73 75 6c 74 20 69 73 20 73   the result is s
4bb0: 74 6f 72 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  tored..*/.static
4bc0: 20 69 6e 74 20 6d 61 6b 65 53 6f 72 74 65 72 52   int makeSorterR
4bd0: 65 63 6f 72 64 28 0a 20 20 50 61 72 73 65 20 2a  ecord(.  Parse *
4be0: 70 50 61 72 73 65 2c 0a 20 20 53 6f 72 74 43 74  pParse,.  SortCt
4bf0: 78 20 2a 70 53 6f 72 74 2c 0a 20 20 53 65 6c 65  x *pSort,.  Sele
4c00: 63 74 20 2a 70 53 65 6c 65 63 74 2c 0a 20 20 69  ct *pSelect,.  i
4c10: 6e 74 20 72 65 67 42 61 73 65 2c 0a 20 20 69 6e  nt regBase,.  in
4c20: 74 20 6e 42 61 73 65 0a 29 7b 0a 20 20 69 6e 74  t nBase.){.  int
4c30: 20 6e 4f 42 53 61 74 20 3d 20 70 53 6f 72 74 2d   nOBSat = pSort-
4c40: 3e 6e 4f 42 53 61 74 3b 0a 20 20 56 64 62 65 20  >nOBSat;.  Vdbe 
4c50: 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64  *v = pParse->pVd
4c60: 62 65 3b 0a 20 20 69 6e 74 20 72 65 67 4f 75 74  be;.  int regOut
4c70: 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
4c80: 6d 3b 0a 20 20 69 66 28 20 70 53 6f 72 74 2d 3e  m;.  if( pSort->
4c90: 70 44 65 66 65 72 72 65 64 52 6f 77 4c 6f 61 64  pDeferredRowLoad
4ca0: 20 29 7b 0a 20 20 20 20 69 6e 6e 65 72 4c 6f 6f   ){.    innerLoo
4cb0: 70 4c 6f 61 64 52 6f 77 28 70 50 61 72 73 65 2c  pLoadRow(pParse,
4cc0: 20 70 53 65 6c 65 63 74 2c 20 70 53 6f 72 74 2d   pSelect, pSort-
4cd0: 3e 70 44 65 66 65 72 72 65 64 52 6f 77 4c 6f 61  >pDeferredRowLoa
4ce0: 64 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  d);.  }.  sqlite
4cf0: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
4d00: 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 65  P_MakeRecord, re
4d10: 67 42 61 73 65 2b 6e 4f 42 53 61 74 2c 20 6e 42  gBase+nOBSat, nB
4d20: 61 73 65 2d 6e 4f 42 53 61 74 2c 20 72 65 67 4f  ase-nOBSat, regO
4d30: 75 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 65  ut);.  return re
4d40: 67 4f 75 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  gOut;.}../*.** G
4d50: 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61  enerate code tha
4d60: 74 20 77 69 6c 6c 20 70 75 73 68 20 74 68 65 20  t will push the 
4d70: 72 65 63 6f 72 64 20 69 6e 20 72 65 67 69 73 74  record in regist
4d80: 65 72 73 20 72 65 67 44 61 74 61 0a 2a 2a 20 74  ers regData.** t
4d90: 68 72 6f 75 67 68 20 72 65 67 44 61 74 61 2b 6e  hrough regData+n
4da0: 44 61 74 61 2d 31 20 6f 6e 74 6f 20 74 68 65 20  Data-1 onto the 
4db0: 73 6f 72 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69  sorter..*/.stati
4dc0: 63 20 76 6f 69 64 20 70 75 73 68 4f 6e 74 6f 53  c void pushOntoS
4dd0: 6f 72 74 65 72 28 0a 20 20 50 61 72 73 65 20 2a  orter(.  Parse *
4de0: 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20  pParse,         
4df0: 2f 2a 20 50 61 72 73 65 72 20 63 6f 6e 74 65 78  /* Parser contex
4e00: 74 20 2a 2f 0a 20 20 53 6f 72 74 43 74 78 20 2a  t */.  SortCtx *
4e10: 70 53 6f 72 74 2c 20 20 20 20 20 20 20 20 2f 2a  pSort,        /*
4e20: 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f   Information abo
4e30: 75 74 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  ut the ORDER BY 
4e40: 63 6c 61 75 73 65 20 2a 2f 0a 20 20 53 65 6c 65  clause */.  Sele
4e50: 63 74 20 2a 70 53 65 6c 65 63 74 2c 20 20 20 20  ct *pSelect,    
4e60: 20 20 20 2f 2a 20 54 68 65 20 77 68 6f 6c 65 20     /* The whole 
4e70: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
4e80: 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 44 61 74   */.  int regDat
4e90: 61 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  a,           /* 
4ea0: 46 69 72 73 74 20 72 65 67 69 73 74 65 72 20 68  First register h
4eb0: 6f 6c 64 69 6e 67 20 64 61 74 61 20 74 6f 20 62  olding data to b
4ec0: 65 20 73 6f 72 74 65 64 20 2a 2f 0a 20 20 69 6e  e sorted */.  in
4ed0: 74 20 72 65 67 4f 72 69 67 44 61 74 61 2c 20 20  t regOrigData,  
4ee0: 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 72 65       /* First re
4ef0: 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 64  gister holding d
4f00: 61 74 61 20 62 65 66 6f 72 65 20 70 61 63 6b 69  ata before packi
4f10: 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 6e 44 61 74  ng */.  int nDat
4f20: 61 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  a,             /
4f30: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d  * Number of elem
4f40: 65 6e 74 73 20 69 6e 20 74 68 65 20 72 65 67 44  ents in the regD
4f50: 61 74 61 20 64 61 74 61 20 61 72 72 61 79 20 2a  ata data array *
4f60: 2f 0a 20 20 69 6e 74 20 6e 50 72 65 66 69 78 52  /.  int nPrefixR
4f70: 65 67 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f  eg         /* No
4f80: 2e 20 6f 66 20 72 65 67 20 70 72 69 6f 72 20 74  . of reg prior t
4f90: 6f 20 72 65 67 44 61 74 61 20 61 76 61 69 6c 61  o regData availa
4fa0: 62 6c 65 20 66 6f 72 20 75 73 65 20 2a 2f 0a 29  ble for use */.)
4fb0: 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50  {.  Vdbe *v = pP
4fc0: 61 72 73 65 2d 3e 70 56 64 62 65 3b 20 20 20 20  arse->pVdbe;    
4fd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4fe0: 20 20 20 20 20 2f 2a 20 53 74 6d 74 20 75 6e 64       /* Stmt und
4ff0: 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20  er construction 
5000: 2a 2f 0a 20 20 69 6e 74 20 62 53 65 71 20 3d 20  */.  int bSeq = 
5010: 28 28 70 53 6f 72 74 2d 3e 73 6f 72 74 46 6c 61  ((pSort->sortFla
5020: 67 73 20 26 20 53 4f 52 54 46 4c 41 47 5f 55 73  gs & SORTFLAG_Us
5030: 65 53 6f 72 74 65 72 29 3d 3d 30 29 3b 0a 20 20  eSorter)==0);.  
5040: 69 6e 74 20 6e 45 78 70 72 20 3d 20 70 53 6f 72  int nExpr = pSor
5050: 74 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78  t->pOrderBy->nEx
5060: 70 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  pr;             
5070: 20 2f 2a 20 4e 6f 2e 20 6f 66 20 4f 52 44 45 52   /* No. of ORDER
5080: 20 42 59 20 74 65 72 6d 73 20 2a 2f 0a 20 20 69   BY terms */.  i
5090: 6e 74 20 6e 42 61 73 65 20 3d 20 6e 45 78 70 72  nt nBase = nExpr
50a0: 20 2b 20 62 53 65 71 20 2b 20 6e 44 61 74 61 3b   + bSeq + nData;
50b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
50c0: 2f 2a 20 46 69 65 6c 64 73 20 69 6e 20 73 6f 72  /* Fields in sor
50d0: 74 65 72 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20  ter record */.  
50e0: 69 6e 74 20 72 65 67 42 61 73 65 3b 20 20 20 20  int regBase;    
50f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5100: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5110: 20 2f 2a 20 52 65 67 73 20 66 6f 72 20 73 6f 72   /* Regs for sor
5120: 74 65 72 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20  ter record */.  
5130: 69 6e 74 20 72 65 67 52 65 63 6f 72 64 20 3d 20  int regRecord = 
5140: 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
5150: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5160: 20 2f 2a 20 41 73 73 65 6d 62 6c 65 64 20 73 6f   /* Assembled so
5170: 72 74 65 72 20 72 65 63 6f 72 64 20 2a 2f 0a 20  rter record */. 
5180: 20 69 6e 74 20 6e 4f 42 53 61 74 20 3d 20 70 53   int nOBSat = pS
5190: 6f 72 74 2d 3e 6e 4f 42 53 61 74 3b 20 20 20 20  ort->nOBSat;    
51a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
51b0: 20 20 2f 2a 20 4f 52 44 45 52 20 42 59 20 74 65    /* ORDER BY te
51c0: 72 6d 73 20 74 6f 20 73 6b 69 70 20 2a 2f 0a 20  rms to skip */. 
51d0: 20 69 6e 74 20 6f 70 3b 20 20 20 20 20 20 20 20   int op;        
51e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
51f0: 20 20 20 20 2f 2a 20 4f 70 63 6f 64 65 20 74 6f      /* Opcode to
5200: 20 61 64 64 20 73 6f 72 74 65 72 20 72 65 63 6f   add sorter reco
5210: 72 64 20 74 6f 20 73 6f 72 74 65 72 20 2a 2f 0a  rd to sorter */.
5220: 20 20 69 6e 74 20 69 4c 69 6d 69 74 3b 20 20 20    int iLimit;   
5230: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5240: 20 20 20 20 20 2f 2a 20 4c 49 4d 49 54 20 63 6f       /* LIMIT co
5250: 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 69  unter */.  int i
5260: 53 6b 69 70 20 3d 20 30 3b 20 20 20 20 20 20 20  Skip = 0;       
5270: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
5280: 20 45 6e 64 20 6f 66 20 74 68 65 20 73 6f 72 74   End of the sort
5290: 65 72 20 69 6e 73 65 72 74 20 6c 6f 6f 70 20 2a  er insert loop *
52a0: 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 62 53 65  /..  assert( bSe
52b0: 71 3d 3d 30 20 7c 7c 20 62 53 65 71 3d 3d 31 20  q==0 || bSeq==1 
52c0: 29 3b 0a 0a 20 20 2f 2a 20 54 68 72 65 65 20 63  );..  /* Three c
52d0: 61 73 65 73 3a 0a 20 20 2a 2a 20 20 20 28 31 29  ases:.  **   (1)
52e0: 20 54 68 65 20 64 61 74 61 20 74 6f 20 62 65 20   The data to be 
52f0: 73 6f 72 74 65 64 20 68 61 73 20 61 6c 72 65 61  sorted has alrea
5300: 64 79 20 62 65 65 6e 20 70 61 63 6b 65 64 20 69  dy been packed i
5310: 6e 74 6f 20 61 20 52 65 63 6f 72 64 0a 20 20 2a  nto a Record.  *
5320: 2a 20 20 20 20 20 20 20 62 79 20 61 20 70 72 69  *       by a pri
5330: 6f 72 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64  or OP_MakeRecord
5340: 2e 20 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  .  In this case 
5350: 6e 44 61 74 61 3d 3d 31 20 61 6e 64 20 72 65 67  nData==1 and reg
5360: 44 61 74 61 0a 20 20 2a 2a 20 20 20 20 20 20 20  Data.  **       
5370: 77 69 6c 6c 20 62 65 20 63 6f 6d 70 6c 65 74 65  will be complete
5380: 6c 79 20 75 6e 72 65 6c 61 74 65 64 20 74 6f 20  ly unrelated to 
5390: 72 65 67 4f 72 69 67 44 61 74 61 2e 0a 20 20 2a  regOrigData..  *
53a0: 2a 20 20 20 28 32 29 20 41 6c 6c 20 6f 75 74 70  *   (2) All outp
53b0: 75 74 20 63 6f 6c 75 6d 6e 73 20 61 72 65 20 69  ut columns are i
53c0: 6e 63 6c 75 64 65 64 20 69 6e 20 74 68 65 20 73  ncluded in the s
53d0: 6f 72 74 20 72 65 63 6f 72 64 2e 20 20 49 6e 20  ort record.  In 
53e0: 74 68 61 74 0a 20 20 2a 2a 20 20 20 20 20 20 20  that.  **       
53f0: 63 61 73 65 20 72 65 67 44 61 74 61 3d 3d 72 65  case regData==re
5400: 67 4f 72 69 67 44 61 74 61 2e 0a 20 20 2a 2a 20  gOrigData..  ** 
5410: 20 20 28 33 29 20 53 6f 6d 65 20 6f 75 74 70 75    (3) Some outpu
5420: 74 20 63 6f 6c 75 6d 6e 73 20 61 72 65 20 6f 6d  t columns are om
5430: 69 74 74 65 64 20 66 72 6f 6d 20 74 68 65 20 73  itted from the s
5440: 6f 72 74 20 72 65 63 6f 72 64 20 64 75 65 20 74  ort record due t
5450: 6f 0a 20 20 2a 2a 20 20 20 20 20 20 20 74 68 65  o.  **       the
5460: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53   SQLITE_ENABLE_S
5470: 4f 52 54 45 52 5f 52 45 46 45 52 45 4e 43 45 20  ORTER_REFERENCE 
5480: 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2c 20 6f 72  optimization, or
5490: 20 64 75 65 20 74 6f 20 74 68 65 0a 20 20 2a 2a   due to the.  **
54a0: 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 45 43         SQLITE_EC
54b0: 45 4c 5f 4f 4d 49 54 52 45 46 20 6f 70 74 69 6d  EL_OMITREF optim
54c0: 69 7a 61 74 69 6f 6e 2c 20 6f 72 20 64 75 65 20  ization, or due 
54d0: 74 6f 20 74 68 65 20 0a 20 20 2a 2a 20 20 20 20  to the .  **    
54e0: 20 20 20 53 6f 72 74 43 74 78 2e 70 44 65 66 65     SortCtx.pDefe
54f0: 72 72 65 64 52 6f 77 4c 6f 61 64 20 6f 70 74 69  rredRowLoad opti
5500: 6d 69 61 74 69 6f 6e 2e 20 20 49 6e 20 61 6e 79  miation.  In any
5510: 20 6f 66 20 74 68 65 73 65 20 63 61 73 65 73 0a   of these cases.
5520: 20 20 2a 2a 20 20 20 20 20 20 20 72 65 67 4f 72    **       regOr
5530: 69 67 44 61 74 61 20 69 73 20 30 20 74 6f 20 70  igData is 0 to p
5540: 72 65 76 65 6e 74 20 74 68 69 73 20 72 6f 75 74  revent this rout
5550: 69 6e 65 20 66 72 6f 6d 20 74 72 79 69 6e 67 20  ine from trying 
5560: 74 6f 20 63 6f 70 79 0a 20 20 2a 2a 20 20 20 20  to copy.  **    
5570: 20 20 20 76 61 6c 75 65 73 20 74 68 61 74 20 6d     values that m
5580: 69 67 68 74 20 6e 6f 74 20 79 65 74 20 65 78 69  ight not yet exi
5590: 73 74 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  st..  */.  asser
55a0: 74 28 20 6e 44 61 74 61 3d 3d 31 20 7c 7c 20 72  t( nData==1 || r
55b0: 65 67 44 61 74 61 3d 3d 72 65 67 4f 72 69 67 44  egData==regOrigD
55c0: 61 74 61 20 7c 7c 20 72 65 67 4f 72 69 67 44 61  ata || regOrigDa
55d0: 74 61 3d 3d 30 20 29 3b 0a 0a 20 20 69 66 28 20  ta==0 );..  if( 
55e0: 6e 50 72 65 66 69 78 52 65 67 20 29 7b 0a 20 20  nPrefixReg ){.  
55f0: 20 20 61 73 73 65 72 74 28 20 6e 50 72 65 66 69    assert( nPrefi
5600: 78 52 65 67 3d 3d 6e 45 78 70 72 2b 62 53 65 71  xReg==nExpr+bSeq
5610: 20 29 3b 0a 20 20 20 20 72 65 67 42 61 73 65 20   );.    regBase 
5620: 3d 20 72 65 67 44 61 74 61 20 2d 20 6e 50 72 65  = regData - nPre
5630: 66 69 78 52 65 67 3b 0a 20 20 7d 65 6c 73 65 7b  fixReg;.  }else{
5640: 0a 20 20 20 20 72 65 67 42 61 73 65 20 3d 20 70  .    regBase = p
5650: 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 20 31 3b  Parse->nMem + 1;
5660: 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65  .    pParse->nMe
5670: 6d 20 2b 3d 20 6e 42 61 73 65 3b 0a 20 20 7d 0a  m += nBase;.  }.
5680: 20 20 61 73 73 65 72 74 28 20 70 53 65 6c 65 63    assert( pSelec
5690: 74 2d 3e 69 4f 66 66 73 65 74 3d 3d 30 20 7c 7c  t->iOffset==0 ||
56a0: 20 70 53 65 6c 65 63 74 2d 3e 69 4c 69 6d 69 74   pSelect->iLimit
56b0: 21 3d 30 20 29 3b 0a 20 20 69 4c 69 6d 69 74 20  !=0 );.  iLimit 
56c0: 3d 20 70 53 65 6c 65 63 74 2d 3e 69 4f 66 66 73  = pSelect->iOffs
56d0: 65 74 20 3f 20 70 53 65 6c 65 63 74 2d 3e 69 4f  et ? pSelect->iO
56e0: 66 66 73 65 74 2b 31 20 3a 20 70 53 65 6c 65 63  ffset+1 : pSelec
56f0: 74 2d 3e 69 4c 69 6d 69 74 3b 0a 20 20 70 53 6f  t->iLimit;.  pSo
5700: 72 74 2d 3e 6c 61 62 65 6c 44 6f 6e 65 20 3d 20  rt->labelDone = 
5710: 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
5720: 61 62 65 6c 28 70 50 61 72 73 65 29 3b 0a 20 20  abel(pParse);.  
5730: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 45  sqlite3ExprCodeE
5740: 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20  xprList(pParse, 
5750: 70 53 6f 72 74 2d 3e 70 4f 72 64 65 72 42 79 2c  pSort->pOrderBy,
5760: 20 72 65 67 42 61 73 65 2c 20 72 65 67 4f 72 69   regBase, regOri
5770: 67 44 61 74 61 2c 0a 20 20 20 20 20 20 20 20 20  gData,.         
5780: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5790: 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f 44 55 50   SQLITE_ECEL_DUP
57a0: 20 7c 20 28 72 65 67 4f 72 69 67 44 61 74 61 3f   | (regOrigData?
57b0: 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f 52 45 46   SQLITE_ECEL_REF
57c0: 20 3a 20 30 29 29 3b 0a 20 20 69 66 28 20 62 53   : 0));.  if( bS
57d0: 65 71 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  eq ){.    sqlite
57e0: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
57f0: 50 5f 53 65 71 75 65 6e 63 65 2c 20 70 53 6f 72  P_Sequence, pSor
5800: 74 2d 3e 69 45 43 75 72 73 6f 72 2c 20 72 65 67  t->iECursor, reg
5810: 42 61 73 65 2b 6e 45 78 70 72 29 3b 0a 20 20 7d  Base+nExpr);.  }
5820: 0a 20 20 69 66 28 20 6e 50 72 65 66 69 78 52 65  .  if( nPrefixRe
5830: 67 3d 3d 30 20 26 26 20 6e 44 61 74 61 3e 30 20  g==0 && nData>0 
5840: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  ){.    sqlite3Ex
5850: 70 72 43 6f 64 65 4d 6f 76 65 28 70 50 61 72 73  prCodeMove(pPars
5860: 65 2c 20 72 65 67 44 61 74 61 2c 20 72 65 67 42  e, regData, regB
5870: 61 73 65 2b 6e 45 78 70 72 2b 62 53 65 71 2c 20  ase+nExpr+bSeq, 
5880: 6e 44 61 74 61 29 3b 0a 20 20 7d 0a 20 20 69 66  nData);.  }.  if
5890: 28 20 6e 4f 42 53 61 74 3e 30 20 29 7b 0a 20 20  ( nOBSat>0 ){.  
58a0: 20 20 69 6e 74 20 72 65 67 50 72 65 76 4b 65 79    int regPrevKey
58b0: 3b 20 20 20 2f 2a 20 54 68 65 20 66 69 72 73 74  ;   /* The first
58c0: 20 6e 4f 42 53 61 74 20 63 6f 6c 75 6d 6e 73 20   nOBSat columns 
58d0: 6f 66 20 74 68 65 20 70 72 65 76 69 6f 75 73 20  of the previous 
58e0: 72 6f 77 20 2a 2f 0a 20 20 20 20 69 6e 74 20 61  row */.    int a
58f0: 64 64 72 46 69 72 73 74 3b 20 20 20 20 2f 2a 20  ddrFirst;    /* 
5900: 41 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 4f  Address of the O
5910: 50 5f 49 66 4e 6f 74 20 6f 70 63 6f 64 65 20 2a  P_IfNot opcode *
5920: 2f 0a 20 20 20 20 69 6e 74 20 61 64 64 72 4a 6d  /.    int addrJm
5930: 70 3b 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65  p;      /* Addre
5940: 73 73 20 6f 66 20 74 68 65 20 4f 50 5f 4a 75 6d  ss of the OP_Jum
5950: 70 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 20 20  p opcode */.    
5960: 56 64 62 65 4f 70 20 2a 70 4f 70 3b 20 20 20 20  VdbeOp *pOp;    
5970: 20 20 2f 2a 20 4f 70 63 6f 64 65 20 74 68 61 74    /* Opcode that
5980: 20 6f 70 65 6e 73 20 74 68 65 20 73 6f 72 74 65   opens the sorte
5990: 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 4b 65  r */.    int nKe
59a0: 79 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75  y;         /* Nu
59b0: 6d 62 65 72 20 6f 66 20 73 6f 72 74 69 6e 67 20  mber of sorting 
59c0: 6b 65 79 20 63 6f 6c 75 6d 6e 73 2c 20 69 6e 63  key columns, inc
59d0: 6c 75 64 69 6e 67 20 4f 50 5f 53 65 71 75 65 6e  luding OP_Sequen
59e0: 63 65 20 2a 2f 0a 20 20 20 20 4b 65 79 49 6e 66  ce */.    KeyInf
59f0: 6f 20 2a 70 4b 49 3b 20 20 20 20 20 2f 2a 20 4f  o *pKI;     /* O
5a00: 72 69 67 69 6e 61 6c 20 4b 65 79 49 6e 66 6f 20  riginal KeyInfo 
5a10: 6f 6e 20 74 68 65 20 73 6f 72 74 65 72 20 74 61  on the sorter ta
5a20: 62 6c 65 20 2a 2f 0a 0a 20 20 20 20 72 65 67 52  ble */..    regR
5a30: 65 63 6f 72 64 20 3d 20 6d 61 6b 65 53 6f 72 74  ecord = makeSort
5a40: 65 72 52 65 63 6f 72 64 28 70 50 61 72 73 65 2c  erRecord(pParse,
5a50: 20 70 53 6f 72 74 2c 20 70 53 65 6c 65 63 74 2c   pSort, pSelect,
5a60: 20 72 65 67 42 61 73 65 2c 20 6e 42 61 73 65 29   regBase, nBase)
5a70: 3b 0a 20 20 20 20 72 65 67 50 72 65 76 4b 65 79  ;.    regPrevKey
5a80: 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b   = pParse->nMem+
5a90: 31 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  1;.    pParse->n
5aa0: 4d 65 6d 20 2b 3d 20 70 53 6f 72 74 2d 3e 6e 4f  Mem += pSort->nO
5ab0: 42 53 61 74 3b 0a 20 20 20 20 6e 4b 65 79 20 3d  BSat;.    nKey =
5ac0: 20 6e 45 78 70 72 20 2d 20 70 53 6f 72 74 2d 3e   nExpr - pSort->
5ad0: 6e 4f 42 53 61 74 20 2b 20 62 53 65 71 3b 0a 20  nOBSat + bSeq;. 
5ae0: 20 20 20 69 66 28 20 62 53 65 71 20 29 7b 0a 20     if( bSeq ){. 
5af0: 20 20 20 20 20 61 64 64 72 46 69 72 73 74 20 3d       addrFirst =
5b00: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
5b10: 70 31 28 76 2c 20 4f 50 5f 49 66 4e 6f 74 2c 20  p1(v, OP_IfNot, 
5b20: 72 65 67 42 61 73 65 2b 6e 45 78 70 72 29 3b 20  regBase+nExpr); 
5b30: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
5b40: 20 20 61 64 64 72 46 69 72 73 74 20 3d 20 73 71    addrFirst = sq
5b50: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
5b60: 76 2c 20 4f 50 5f 53 65 71 75 65 6e 63 65 54 65  v, OP_SequenceTe
5b70: 73 74 2c 20 70 53 6f 72 74 2d 3e 69 45 43 75 72  st, pSort->iECur
5b80: 73 6f 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  sor);.    }.    
5b90: 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
5ba0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
5bb0: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6d  AddOp3(v, OP_Com
5bc0: 70 61 72 65 2c 20 72 65 67 50 72 65 76 4b 65 79  pare, regPrevKey
5bd0: 2c 20 72 65 67 42 61 73 65 2c 20 70 53 6f 72 74  , regBase, pSort
5be0: 2d 3e 6e 4f 42 53 61 74 29 3b 0a 20 20 20 20 70  ->nOBSat);.    p
5bf0: 4f 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  Op = sqlite3Vdbe
5c00: 47 65 74 4f 70 28 76 2c 20 70 53 6f 72 74 2d 3e  GetOp(v, pSort->
5c10: 61 64 64 72 53 6f 72 74 49 6e 64 65 78 29 3b 0a  addrSortIndex);.
5c20: 20 20 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e      if( pParse->
5c30: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
5c40: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 70   ) return;.    p
5c50: 4f 70 2d 3e 70 32 20 3d 20 6e 4b 65 79 20 2b 20  Op->p2 = nKey + 
5c60: 6e 44 61 74 61 3b 0a 20 20 20 20 70 4b 49 20 3d  nData;.    pKI =
5c70: 20 70 4f 70 2d 3e 70 34 2e 70 4b 65 79 49 6e 66   pOp->p4.pKeyInf
5c80: 6f 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 4b  o;.    memset(pK
5c90: 49 2d 3e 61 53 6f 72 74 46 6c 61 67 73 2c 20 30  I->aSortFlags, 0
5ca0: 2c 20 70 4b 49 2d 3e 6e 4b 65 79 46 69 65 6c 64  , pKI->nKeyField
5cb0: 29 3b 20 2f 2a 20 4d 61 6b 65 73 20 4f 50 5f 4a  ); /* Makes OP_J
5cc0: 75 6d 70 20 74 65 73 74 61 62 6c 65 20 2a 2f 0a  ump testable */.
5cd0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
5ce0: 68 61 6e 67 65 50 34 28 76 2c 20 2d 31 2c 20 28  hangeP4(v, -1, (
5cf0: 63 68 61 72 2a 29 70 4b 49 2c 20 50 34 5f 4b 45  char*)pKI, P4_KE
5d00: 59 49 4e 46 4f 29 3b 0a 20 20 20 20 74 65 73 74  YINFO);.    test
5d10: 63 61 73 65 28 20 70 4b 49 2d 3e 6e 41 6c 6c 46  case( pKI->nAllF
5d20: 69 65 6c 64 20 3e 20 70 4b 49 2d 3e 6e 4b 65 79  ield > pKI->nKey
5d30: 46 69 65 6c 64 2b 32 20 29 3b 0a 20 20 20 20 70  Field+2 );.    p
5d40: 4f 70 2d 3e 70 34 2e 70 4b 65 79 49 6e 66 6f 20  Op->p4.pKeyInfo 
5d50: 3d 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f  = sqlite3KeyInfo
5d60: 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 70 50 61  FromExprList(pPa
5d70: 72 73 65 2c 70 53 6f 72 74 2d 3e 70 4f 72 64 65  rse,pSort->pOrde
5d80: 72 42 79 2c 6e 4f 42 53 61 74 2c 0a 20 20 20 20  rBy,nOBSat,.    
5d90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5da0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5db0: 20 20 20 20 20 20 20 70 4b 49 2d 3e 6e 41 6c 6c         pKI->nAll
5dc0: 46 69 65 6c 64 2d 70 4b 49 2d 3e 6e 4b 65 79 46  Field-pKI->nKeyF
5dd0: 69 65 6c 64 2d 31 29 3b 0a 20 20 20 20 61 64 64  ield-1);.    add
5de0: 72 4a 6d 70 20 3d 20 73 71 6c 69 74 65 33 56 64  rJmp = sqlite3Vd
5df0: 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
5e00: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
5e10: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4a 75  eAddOp3(v, OP_Ju
5e20: 6d 70 2c 20 61 64 64 72 4a 6d 70 2b 31 2c 20 30  mp, addrJmp+1, 0
5e30: 2c 20 61 64 64 72 4a 6d 70 2b 31 29 3b 20 56 64  , addrJmp+1); Vd
5e40: 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
5e50: 20 20 20 70 53 6f 72 74 2d 3e 6c 61 62 65 6c 42     pSort->labelB
5e60: 6b 4f 75 74 20 3d 20 73 71 6c 69 74 65 33 56 64  kOut = sqlite3Vd
5e70: 62 65 4d 61 6b 65 4c 61 62 65 6c 28 70 50 61 72  beMakeLabel(pPar
5e80: 73 65 29 3b 0a 20 20 20 20 70 53 6f 72 74 2d 3e  se);.    pSort->
5e90: 72 65 67 52 65 74 75 72 6e 20 3d 20 2b 2b 70 50  regReturn = ++pP
5ea0: 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20  arse->nMem;.    
5eb0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
5ec0: 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 70  2(v, OP_Gosub, p
5ed0: 53 6f 72 74 2d 3e 72 65 67 52 65 74 75 72 6e 2c  Sort->regReturn,
5ee0: 20 70 53 6f 72 74 2d 3e 6c 61 62 65 6c 42 6b 4f   pSort->labelBkO
5ef0: 75 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ut);.    sqlite3
5f00: 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
5f10: 5f 52 65 73 65 74 53 6f 72 74 65 72 2c 20 70 53  _ResetSorter, pS
5f20: 6f 72 74 2d 3e 69 45 43 75 72 73 6f 72 29 3b 0a  ort->iECursor);.
5f30: 20 20 20 20 69 66 28 20 69 4c 69 6d 69 74 20 29      if( iLimit )
5f40: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
5f50: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
5f60: 49 66 4e 6f 74 2c 20 69 4c 69 6d 69 74 2c 20 70  IfNot, iLimit, p
5f70: 53 6f 72 74 2d 3e 6c 61 62 65 6c 44 6f 6e 65 29  Sort->labelDone)
5f80: 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65  ;.      VdbeCove
5f90: 72 61 67 65 28 76 29 3b 0a 20 20 20 20 7d 0a 20  rage(v);.    }. 
5fa0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
5fb0: 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 46 69  mpHere(v, addrFi
5fc0: 72 73 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  rst);.    sqlite
5fd0: 33 45 78 70 72 43 6f 64 65 4d 6f 76 65 28 70 50  3ExprCodeMove(pP
5fe0: 61 72 73 65 2c 20 72 65 67 42 61 73 65 2c 20 72  arse, regBase, r
5ff0: 65 67 50 72 65 76 4b 65 79 2c 20 70 53 6f 72 74  egPrevKey, pSort
6000: 2d 3e 6e 4f 42 53 61 74 29 3b 0a 20 20 20 20 73  ->nOBSat);.    s
6010: 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
6020: 72 65 28 76 2c 20 61 64 64 72 4a 6d 70 29 3b 0a  re(v, addrJmp);.
6030: 20 20 7d 0a 20 20 69 66 28 20 69 4c 69 6d 69 74    }.  if( iLimit
6040: 20 29 7b 0a 20 20 20 20 2f 2a 20 41 74 20 74 68   ){.    /* At th
6050: 69 73 20 70 6f 69 6e 74 20 74 68 65 20 76 61 6c  is point the val
6060: 75 65 73 20 66 6f 72 20 74 68 65 20 6e 65 77 20  ues for the new 
6070: 73 6f 72 74 65 72 20 65 6e 74 72 79 20 61 72 65  sorter entry are
6080: 20 73 74 6f 72 65 64 0a 20 20 20 20 2a 2a 20 69   stored.    ** i
6090: 6e 20 61 6e 20 61 72 72 61 79 20 6f 66 20 72 65  n an array of re
60a0: 67 69 73 74 65 72 73 2e 20 54 68 65 79 20 6e 65  gisters. They ne
60b0: 65 64 20 74 6f 20 62 65 20 63 6f 6d 70 6f 73 65  ed to be compose
60c0: 64 20 69 6e 74 6f 20 61 20 72 65 63 6f 72 64 0a  d into a record.
60d0: 20 20 20 20 2a 2a 20 61 6e 64 20 69 6e 73 65 72      ** and inser
60e0: 74 65 64 20 69 6e 74 6f 20 74 68 65 20 73 6f 72  ted into the sor
60f0: 74 65 72 20 69 66 20 65 69 74 68 65 72 20 28 61  ter if either (a
6100: 29 20 74 68 65 72 65 20 61 72 65 20 63 75 72 72  ) there are curr
6110: 65 6e 74 6c 79 0a 20 20 20 20 2a 2a 20 6c 65 73  ently.    ** les
6120: 73 20 74 68 61 6e 20 4c 49 4d 49 54 2b 4f 46 46  s than LIMIT+OFF
6130: 53 45 54 20 69 74 65 6d 73 20 6f 72 20 28 62 29  SET items or (b)
6140: 20 74 68 65 20 6e 65 77 20 72 65 63 6f 72 64 20   the new record 
6150: 69 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20  is smaller than 
6160: 0a 20 20 20 20 2a 2a 20 74 68 65 20 6c 61 72 67  .    ** the larg
6170: 65 73 74 20 72 65 63 6f 72 64 20 63 75 72 72 65  est record curre
6180: 6e 74 6c 79 20 69 6e 20 74 68 65 20 73 6f 72 74  ntly in the sort
6190: 65 72 2e 20 49 66 20 28 62 29 20 69 73 20 74 72  er. If (b) is tr
61a0: 75 65 20 61 6e 64 20 74 68 65 72 65 0a 20 20 20  ue and there.   
61b0: 20 2a 2a 20 61 72 65 20 61 6c 72 65 61 64 79 20   ** are already 
61c0: 4c 49 4d 49 54 2b 4f 46 46 53 45 54 20 69 74 65  LIMIT+OFFSET ite
61d0: 6d 73 20 69 6e 20 74 68 65 20 73 6f 72 74 65 72  ms in the sorter
61e0: 2c 20 64 65 6c 65 74 65 20 74 68 65 20 6c 61 72  , delete the lar
61f0: 67 65 73 74 0a 20 20 20 20 2a 2a 20 65 6e 74 72  gest.    ** entr
6200: 79 20 62 65 66 6f 72 65 20 69 6e 73 65 72 74 69  y before inserti
6210: 6e 67 20 74 68 65 20 6e 65 77 20 6f 6e 65 2e 20  ng the new one. 
6220: 54 68 69 73 20 77 61 79 20 74 68 65 72 65 20 61  This way there a
6230: 72 65 20 6e 65 76 65 72 20 6d 6f 72 65 20 0a 20  re never more . 
6240: 20 20 20 2a 2a 20 74 68 61 6e 20 4c 49 4d 49 54     ** than LIMIT
6250: 2b 4f 46 46 53 45 54 20 69 74 65 6d 73 20 69 6e  +OFFSET items in
6260: 20 74 68 65 20 73 6f 72 74 65 72 2e 0a 20 20 20   the sorter..   
6270: 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20 74 68   **.    ** If th
6280: 65 20 6e 65 77 20 72 65 63 6f 72 64 20 64 6f 65  e new record doe
6290: 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65  s not need to be
62a0: 20 69 6e 73 65 72 74 65 64 20 69 6e 74 6f 20 74   inserted into t
62b0: 68 65 20 73 6f 72 74 65 72 2c 0a 20 20 20 20 2a  he sorter,.    *
62c0: 2a 20 6a 75 6d 70 20 74 6f 20 74 68 65 20 6e 65  * jump to the ne
62d0: 78 74 20 69 74 65 72 61 74 69 6f 6e 20 6f 66 20  xt iteration of 
62e0: 74 68 65 20 6c 6f 6f 70 2e 20 49 66 20 74 68 65  the loop. If the
62f0: 20 70 53 6f 72 74 2d 3e 6c 61 62 65 6c 4f 42 4c   pSort->labelOBL
6300: 6f 70 74 0a 20 20 20 20 2a 2a 20 76 61 6c 75 65  opt.    ** value
6310: 20 69 73 20 6e 6f 74 20 7a 65 72 6f 2c 20 74 68   is not zero, th
6320: 65 6e 20 69 74 20 69 73 20 61 20 6c 61 62 65 6c  en it is a label
6330: 20 6f 66 20 77 68 65 72 65 20 74 6f 20 6a 75 6d   of where to jum
6340: 70 2e 20 20 4f 74 68 65 72 77 69 73 65 2c 0a 20  p.  Otherwise,. 
6350: 20 20 20 2a 2a 20 6a 75 73 74 20 62 79 70 61 73     ** just bypas
6360: 73 20 74 68 65 20 72 6f 77 20 69 6e 73 65 72 74  s the row insert
6370: 20 6c 6f 67 69 63 2e 20 20 53 65 65 20 74 68 65   logic.  See the
6380: 20 68 65 61 64 65 72 20 63 6f 6d 6d 65 6e 74 20   header comment 
6390: 6f 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 73 71  on the.    ** sq
63a0: 6c 69 74 65 33 57 68 65 72 65 4f 72 64 65 72 42  lite3WhereOrderB
63b0: 79 4c 69 6d 69 74 4f 70 74 4c 61 62 65 6c 28 29  yLimitOptLabel()
63c0: 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20 61 64   function for ad
63d0: 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 2e 0a 20  ditional info.. 
63e0: 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 43     */.    int iC
63f0: 73 72 20 3d 20 70 53 6f 72 74 2d 3e 69 45 43 75  sr = pSort->iECu
6400: 72 73 6f 72 3b 0a 20 20 20 20 73 71 6c 69 74 65  rsor;.    sqlite
6410: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
6420: 50 5f 49 66 4e 6f 74 5a 65 72 6f 2c 20 69 4c 69  P_IfNotZero, iLi
6430: 6d 69 74 2c 20 73 71 6c 69 74 65 33 56 64 62 65  mit, sqlite3Vdbe
6440: 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 2b 34  CurrentAddr(v)+4
6450: 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 76 65 72  );.    VdbeCover
6460: 61 67 65 28 76 29 3b 0a 20 20 20 20 73 71 6c 69  age(v);.    sqli
6470: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
6480: 20 4f 50 5f 4c 61 73 74 2c 20 69 43 73 72 2c 20   OP_Last, iCsr, 
6490: 30 29 3b 0a 20 20 20 20 69 53 6b 69 70 20 3d 20  0);.    iSkip = 
64a0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
64b0: 34 49 6e 74 28 76 2c 20 4f 50 5f 49 64 78 4c 45  4Int(v, OP_IdxLE
64c0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
64d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
64e0: 20 20 20 69 43 73 72 2c 20 30 2c 20 72 65 67 42     iCsr, 0, regB
64f0: 61 73 65 2b 6e 4f 42 53 61 74 2c 20 6e 45 78 70  ase+nOBSat, nExp
6500: 72 2d 6e 4f 42 53 61 74 29 3b 0a 20 20 20 20 56  r-nOBSat);.    V
6510: 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
6520: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
6530: 64 64 4f 70 31 28 76 2c 20 4f 50 5f 44 65 6c 65  ddOp1(v, OP_Dele
6540: 74 65 2c 20 69 43 73 72 29 3b 0a 20 20 7d 0a 20  te, iCsr);.  }. 
6550: 20 69 66 28 20 72 65 67 52 65 63 6f 72 64 3d 3d   if( regRecord==
6560: 30 20 29 7b 0a 20 20 20 20 72 65 67 52 65 63 6f  0 ){.    regReco
6570: 72 64 20 3d 20 6d 61 6b 65 53 6f 72 74 65 72 52  rd = makeSorterR
6580: 65 63 6f 72 64 28 70 50 61 72 73 65 2c 20 70 53  ecord(pParse, pS
6590: 6f 72 74 2c 20 70 53 65 6c 65 63 74 2c 20 72 65  ort, pSelect, re
65a0: 67 42 61 73 65 2c 20 6e 42 61 73 65 29 3b 0a 20  gBase, nBase);. 
65b0: 20 7d 0a 20 20 69 66 28 20 70 53 6f 72 74 2d 3e   }.  if( pSort->
65c0: 73 6f 72 74 46 6c 61 67 73 20 26 20 53 4f 52 54  sortFlags & SORT
65d0: 46 4c 41 47 5f 55 73 65 53 6f 72 74 65 72 20 29  FLAG_UseSorter )
65e0: 7b 0a 20 20 20 20 6f 70 20 3d 20 4f 50 5f 53 6f  {.    op = OP_So
65f0: 72 74 65 72 49 6e 73 65 72 74 3b 0a 20 20 7d 65  rterInsert;.  }e
6600: 6c 73 65 7b 0a 20 20 20 20 6f 70 20 3d 20 4f 50  lse{.    op = OP
6610: 5f 49 64 78 49 6e 73 65 72 74 3b 0a 20 20 7d 0a  _IdxInsert;.  }.
6620: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
6630: 4f 70 34 49 6e 74 28 76 2c 20 6f 70 2c 20 70 53  Op4Int(v, op, pS
6640: 6f 72 74 2d 3e 69 45 43 75 72 73 6f 72 2c 20 72  ort->iECursor, r
6650: 65 67 52 65 63 6f 72 64 2c 0a 20 20 20 20 20 20  egRecord,.      
6660: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6670: 20 72 65 67 42 61 73 65 2b 6e 4f 42 53 61 74 2c   regBase+nOBSat,
6680: 20 6e 42 61 73 65 2d 6e 4f 42 53 61 74 29 3b 0a   nBase-nOBSat);.
6690: 20 20 69 66 28 20 69 53 6b 69 70 20 29 7b 0a 20    if( iSkip ){. 
66a0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
66b0: 61 6e 67 65 50 32 28 76 2c 20 69 53 6b 69 70 2c  angeP2(v, iSkip,
66c0: 0a 20 20 20 20 20 20 20 20 20 70 53 6f 72 74 2d  .         pSort-
66d0: 3e 6c 61 62 65 6c 4f 42 4c 6f 70 74 20 3f 20 70  >labelOBLopt ? p
66e0: 53 6f 72 74 2d 3e 6c 61 62 65 6c 4f 42 4c 6f 70  Sort->labelOBLop
66f0: 74 20 3a 20 73 71 6c 69 74 65 33 56 64 62 65 43  t : sqlite3VdbeC
6700: 75 72 72 65 6e 74 41 64 64 72 28 76 29 29 3b 0a  urrentAddr(v));.
6710: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64    }.}../*.** Add
6720: 20 63 6f 64 65 20 74 6f 20 69 6d 70 6c 65 6d 65   code to impleme
6730: 6e 74 20 74 68 65 20 4f 46 46 53 45 54 0a 2a 2f  nt the OFFSET.*/
6740: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f 64  .static void cod
6750: 65 4f 66 66 73 65 74 28 0a 20 20 56 64 62 65 20  eOffset(.  Vdbe 
6760: 2a 76 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  *v,          /* 
6770: 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 69 6e  Generate code in
6780: 74 6f 20 74 68 69 73 20 56 4d 20 2a 2f 0a 20 20  to this VM */.  
6790: 69 6e 74 20 69 4f 66 66 73 65 74 2c 20 20 20 20  int iOffset,    
67a0: 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 68 6f    /* Register ho
67b0: 6c 64 69 6e 67 20 74 68 65 20 6f 66 66 73 65 74  lding the offset
67c0: 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e   counter */.  in
67d0: 74 20 69 43 6f 6e 74 69 6e 75 65 20 20 20 20 20  t iContinue     
67e0: 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 74 6f 20  /* Jump here to 
67f0: 73 6b 69 70 20 74 68 65 20 63 75 72 72 65 6e 74  skip the current
6800: 20 72 65 63 6f 72 64 20 2a 2f 0a 29 7b 0a 20 20   record */.){.  
6810: 69 66 28 20 69 4f 66 66 73 65 74 3e 30 20 29 7b  if( iOffset>0 ){
6820: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
6830: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 66 50  AddOp3(v, OP_IfP
6840: 6f 73 2c 20 69 4f 66 66 73 65 74 2c 20 69 43 6f  os, iOffset, iCo
6850: 6e 74 69 6e 75 65 2c 20 31 29 3b 20 56 64 62 65  ntinue, 1); Vdbe
6860: 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
6870: 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
6880: 20 22 4f 46 46 53 45 54 22 29 29 3b 0a 20 20 7d   "OFFSET"));.  }
6890: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 63 6f  .}../*.** Add co
68a0: 64 65 20 74 68 61 74 20 77 69 6c 6c 20 63 68 65  de that will che
68b0: 63 6b 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20  ck to make sure 
68c0: 74 68 65 20 4e 20 72 65 67 69 73 74 65 72 73 20  the N registers 
68d0: 73 74 61 72 74 69 6e 67 20 61 74 20 69 4d 65 6d  starting at iMem
68e0: 0a 2a 2a 20 66 6f 72 6d 20 61 20 64 69 73 74 69  .** form a disti
68f0: 6e 63 74 20 65 6e 74 72 79 2e 20 20 69 54 61 62  nct entry.  iTab
6900: 20 69 73 20 61 20 73 6f 72 74 69 6e 67 20 69 6e   is a sorting in
6910: 64 65 78 20 74 68 61 74 20 68 6f 6c 64 73 20 70  dex that holds p
6920: 72 65 76 69 6f 75 73 6c 79 0a 2a 2a 20 73 65 65  reviously.** see
6930: 6e 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 73 20 6f  n combinations o
6940: 66 20 74 68 65 20 4e 20 76 61 6c 75 65 73 2e 20  f the N values. 
6950: 20 41 20 6e 65 77 20 65 6e 74 72 79 20 69 73 20   A new entry is 
6960: 6d 61 64 65 20 69 6e 20 69 54 61 62 0a 2a 2a 20  made in iTab.** 
6970: 69 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 4e  if the current N
6980: 20 76 61 6c 75 65 73 20 61 72 65 20 6e 65 77 2e   values are new.
6990: 0a 2a 2a 0a 2a 2a 20 41 20 6a 75 6d 70 20 74 6f  .**.** A jump to
69a0: 20 61 64 64 72 52 65 70 65 61 74 20 69 73 20 6d   addrRepeat is m
69b0: 61 64 65 20 61 6e 64 20 74 68 65 20 4e 2b 31 20  ade and the N+1 
69c0: 76 61 6c 75 65 73 20 61 72 65 20 70 6f 70 70 65  values are poppe
69d0: 64 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20 73 74  d from the.** st
69e0: 61 63 6b 20 69 66 20 74 68 65 20 74 6f 70 20 4e  ack if the top N
69f0: 20 65 6c 65 6d 65 6e 74 73 20 61 72 65 20 6e 6f   elements are no
6a00: 74 20 64 69 73 74 69 6e 63 74 2e 0a 2a 2f 0a 73  t distinct..*/.s
6a10: 74 61 74 69 63 20 76 6f 69 64 20 63 6f 64 65 44  tatic void codeD
6a20: 69 73 74 69 6e 63 74 28 0a 20 20 50 61 72 73 65  istinct(.  Parse
6a30: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 2f 2a   *pParse,     /*
6a40: 20 50 61 72 73 69 6e 67 20 61 6e 64 20 63 6f 64   Parsing and cod
6a50: 65 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e  e generating con
6a60: 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20 69 54  text */.  int iT
6a70: 61 62 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ab,          /* 
6a80: 41 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 20  A sorting index 
6a90: 75 73 65 64 20 74 6f 20 74 65 73 74 20 66 6f 72  used to test for
6aa0: 20 64 69 73 74 69 6e 63 74 6e 65 73 73 20 2a 2f   distinctness */
6ab0: 0a 20 20 69 6e 74 20 61 64 64 72 52 65 70 65 61  .  int addrRepea
6ac0: 74 2c 20 20 20 20 2f 2a 20 4a 75 6d 70 20 74 6f  t,    /* Jump to
6ad0: 20 68 65 72 65 20 69 66 20 6e 6f 74 20 64 69 73   here if not dis
6ae0: 74 69 6e 63 74 20 2a 2f 0a 20 20 69 6e 74 20 4e  tinct */.  int N
6af0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
6b00: 20 4e 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65   Number of eleme
6b10: 6e 74 73 20 2a 2f 0a 20 20 69 6e 74 20 69 4d 65  nts */.  int iMe
6b20: 6d 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46  m           /* F
6b30: 69 72 73 74 20 65 6c 65 6d 65 6e 74 20 2a 2f 0a  irst element */.
6b40: 29 7b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20 20  ){.  Vdbe *v;.  
6b50: 69 6e 74 20 72 31 3b 0a 0a 20 20 76 20 3d 20 70  int r1;..  v = p
6b60: 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
6b70: 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  r1 = sqlite3GetT
6b80: 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a  empReg(pParse);.
6b90: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
6ba0: 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 46 6f 75  Op4Int(v, OP_Fou
6bb0: 6e 64 2c 20 69 54 61 62 2c 20 61 64 64 72 52 65  nd, iTab, addrRe
6bc0: 70 65 61 74 2c 20 69 4d 65 6d 2c 20 4e 29 3b 20  peat, iMem, N); 
6bd0: 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
6be0: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
6bf0: 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52  dOp3(v, OP_MakeR
6c00: 65 63 6f 72 64 2c 20 69 4d 65 6d 2c 20 4e 2c 20  ecord, iMem, N, 
6c10: 72 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  r1);.  sqlite3Vd
6c20: 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f  beAddOp4Int(v, O
6c30: 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 69 54 61  P_IdxInsert, iTa
6c40: 62 2c 20 72 31 2c 20 69 4d 65 6d 2c 20 4e 29 3b  b, r1, iMem, N);
6c50: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68  .  sqlite3VdbeCh
6c60: 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41 47  angeP5(v, OPFLAG
6c70: 5f 55 53 45 53 45 45 4b 52 45 53 55 4c 54 29 3b  _USESEEKRESULT);
6c80: 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73  .  sqlite3Releas
6c90: 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
6ca0: 20 72 31 29 3b 0a 7d 0a 0a 23 69 66 64 65 66 20   r1);.}..#ifdef 
6cb0: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 4f  SQLITE_ENABLE_SO
6cc0: 52 54 45 52 5f 52 45 46 45 52 45 4e 43 45 53 0a  RTER_REFERENCES.
6cd0: 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
6ce0: 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 61 73  ion is called as
6cf0: 20 70 61 72 74 20 6f 66 20 69 6e 6e 65 72 2d 6c   part of inner-l
6d00: 6f 6f 70 20 67 65 6e 65 72 61 74 69 6f 6e 20 66  oop generation f
6d10: 6f 72 20 61 20 53 45 4c 45 43 54 0a 2a 2a 20 73  or a SELECT.** s
6d20: 74 61 74 65 6d 65 6e 74 20 77 69 74 68 20 61 6e  tatement with an
6d30: 20 4f 52 44 45 52 20 42 59 20 74 68 61 74 20 69   ORDER BY that i
6d40: 73 20 6e 6f 74 20 6f 70 74 69 6d 69 7a 65 64 20  s not optimized 
6d50: 62 79 20 61 6e 20 69 6e 64 65 78 2e 20 49 74 20  by an index. It 
6d60: 0a 2a 2a 20 64 65 74 65 72 6d 69 6e 65 73 20 74  .** determines t
6d70: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 73 2c 20  he expressions, 
6d80: 69 66 20 61 6e 79 2c 20 74 68 61 74 20 74 68 65  if any, that the
6d90: 20 73 6f 72 74 65 72 2d 72 65 66 65 72 65 6e 63   sorter-referenc
6da0: 65 20 0a 2a 2a 20 6f 70 74 69 6d 69 7a 61 74 69  e .** optimizati
6db0: 6f 6e 20 73 68 6f 75 6c 64 20 62 65 20 75 73 65  on should be use
6dc0: 64 20 66 6f 72 2e 20 54 68 65 20 73 6f 72 74 65  d for. The sorte
6dd0: 72 2d 72 65 66 65 72 65 6e 63 65 20 6f 70 74 69  r-reference opti
6de0: 6d 69 7a 61 74 69 6f 6e 0a 2a 2a 20 69 73 20 75  mization.** is u
6df0: 73 65 64 20 66 6f 72 20 53 45 4c 45 43 54 20 71  sed for SELECT q
6e00: 75 65 72 69 65 73 20 6c 69 6b 65 3a 0a 2a 2a 0a  ueries like:.**.
6e10: 2a 2a 20 20 20 53 45 4c 45 43 54 20 61 2c 20 62  **   SELECT a, b
6e20: 69 67 62 6c 6f 62 20 46 52 4f 4d 20 74 31 20 4f  igblob FROM t1 O
6e30: 52 44 45 52 20 42 59 20 61 20 4c 49 4d 49 54 20  RDER BY a LIMIT 
6e40: 31 30 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  10.**.** If the 
6e50: 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20  optimization is 
6e60: 75 73 65 64 20 66 6f 72 20 65 78 70 72 65 73 73  used for express
6e70: 69 6f 6e 20 22 62 69 67 62 6c 6f 62 22 2c 20 74  ion "bigblob", t
6e80: 68 65 6e 20 69 6e 73 74 65 61 64 20 6f 66 0a 2a  hen instead of.*
6e90: 2a 20 73 74 6f 72 69 6e 67 20 76 61 6c 75 65 73  * storing values
6ea0: 20 72 65 61 64 20 66 72 6f 6d 20 74 68 61 74 20   read from that 
6eb0: 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20 73 6f  column in the so
6ec0: 72 74 65 72 20 72 65 63 6f 72 64 73 2c 20 74 68  rter records, th
6ed0: 65 20 50 4b 20 6f 66 0a 2a 2a 20 74 68 65 20 72  e PK of.** the r
6ee0: 6f 77 20 66 72 6f 6d 20 74 61 62 6c 65 20 74 31  ow from table t1
6ef0: 20 69 73 20 73 74 6f 72 65 64 20 69 6e 73 74 65   is stored inste
6f00: 61 64 2e 20 54 68 65 6e 2c 20 61 73 20 72 65 63  ad. Then, as rec
6f10: 6f 72 64 73 20 61 72 65 20 65 78 74 72 61 63 74  ords are extract
6f20: 65 64 20 66 72 6f 6d 0a 2a 2a 20 74 68 65 20 73  ed from.** the s
6f30: 6f 72 74 65 72 20 74 6f 20 72 65 74 75 72 6e 20  orter to return 
6f40: 74 6f 20 74 68 65 20 75 73 65 72 2c 20 74 68 65  to the user, the
6f50: 20 72 65 71 75 69 72 65 64 20 76 61 6c 75 65 20   required value 
6f60: 6f 66 20 62 69 67 62 6c 6f 62 20 69 73 0a 2a 2a  of bigblob is.**
6f70: 20 72 65 74 72 69 65 76 65 64 20 64 69 72 65 63   retrieved direc
6f80: 74 6c 79 20 66 72 6f 6d 20 74 61 62 6c 65 20 74  tly from table t
6f90: 31 2e 20 49 66 20 74 68 65 20 76 61 6c 75 65 73  1. If the values
6fa0: 20 61 72 65 20 76 65 72 79 20 6c 61 72 67 65 2c   are very large,
6fb0: 20 74 68 69 73 20 0a 2a 2a 20 63 61 6e 20 62 65   this .** can be
6fc0: 20 6d 6f 72 65 20 65 66 66 69 63 69 65 6e 74 20   more efficient 
6fd0: 74 68 61 6e 20 73 74 6f 72 69 6e 67 20 74 68 65  than storing the
6fe0: 6d 20 64 69 72 65 63 74 6c 79 20 69 6e 20 74 68  m directly in th
6ff0: 65 20 73 6f 72 74 65 72 20 72 65 63 6f 72 64 73  e sorter records
7000: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 45 78 70 72  ..**.** The Expr
7010: 4c 69 73 74 5f 69 74 65 6d 2e 62 53 6f 72 74 65  List_item.bSorte
7020: 72 52 65 66 20 66 6c 61 67 20 69 73 20 73 65 74  rRef flag is set
7030: 20 66 6f 72 20 65 61 63 68 20 65 78 70 72 65 73   for each expres
7040: 73 69 6f 6e 20 69 6e 20 70 45 4c 69 73 74 20 0a  sion in pEList .
7050: 2a 2a 20 66 6f 72 20 77 68 69 63 68 20 74 68 65  ** for which the
7060: 20 73 6f 72 74 65 72 2d 72 65 66 65 72 65 6e 63   sorter-referenc
7070: 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 73  e optimization s
7080: 68 6f 75 6c 64 20 62 65 20 65 6e 61 62 6c 65 64  hould be enabled
7090: 2e 20 0a 2a 2a 20 41 64 64 69 74 69 6f 6e 61 6c  . .** Additional
70a0: 6c 79 2c 20 74 68 65 20 70 53 6f 72 74 2d 3e 61  ly, the pSort->a
70b0: 44 65 66 65 72 5b 5d 20 61 72 72 61 79 20 69 73  Defer[] array is
70c0: 20 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68 20   populated with 
70d0: 65 6e 74 72 69 65 73 0a 2a 2a 20 66 6f 72 20 61  entries.** for a
70e0: 6c 6c 20 63 75 72 73 6f 72 73 20 72 65 71 75 69  ll cursors requi
70f0: 72 65 64 20 74 6f 20 65 76 61 6c 75 61 74 65 20  red to evaluate 
7100: 61 6c 6c 20 73 65 6c 65 63 74 65 64 20 65 78 70  all selected exp
7110: 72 65 73 73 69 6f 6e 73 2e 20 46 69 6e 61 6c 6c  ressions. Finall
7120: 79 2e 0a 2a 2a 20 6f 75 74 70 75 74 20 76 61 72  y..** output var
7130: 69 61 62 6c 65 20 28 2a 70 70 45 78 74 72 61 29  iable (*ppExtra)
7140: 20 69 73 20 73 65 74 20 74 6f 20 61 6e 20 65 78   is set to an ex
7150: 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 20 63 6f  pression list co
7160: 6e 74 61 69 6e 69 6e 67 0a 2a 2a 20 65 78 70 72  ntaining.** expr
7170: 65 73 73 69 6f 6e 73 20 66 6f 72 20 61 6c 6c 20  essions for all 
7180: 65 78 74 72 61 20 50 4b 20 76 61 6c 75 65 73 20  extra PK values 
7190: 74 68 61 74 20 73 68 6f 75 6c 64 20 62 65 20 73  that should be s
71a0: 74 6f 72 65 64 20 69 6e 20 74 68 65 0a 2a 2a 20  tored in the.** 
71b0: 73 6f 72 74 65 72 20 72 65 63 6f 72 64 73 2e 0a  sorter records..
71c0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  */.static void s
71d0: 65 6c 65 63 74 45 78 70 72 44 65 66 65 72 28 0a  electExprDefer(.
71e0: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
71f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7200: 20 20 2f 2a 20 4c 65 61 76 65 20 61 6e 79 20 65    /* Leave any e
7210: 72 72 6f 72 20 68 65 72 65 20 2a 2f 0a 20 20 53  rror here */.  S
7220: 6f 72 74 43 74 78 20 2a 70 53 6f 72 74 2c 20 20  ortCtx *pSort,  
7230: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
7240: 2a 20 53 6f 72 74 65 72 20 63 6f 6e 74 65 78 74  * Sorter context
7250: 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
7260: 70 45 4c 69 73 74 2c 20 20 20 20 20 20 20 20 20  pEList,         
7270: 20 20 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73        /* Express
7280: 69 6f 6e 73 20 64 65 73 74 69 6e 65 64 20 66 6f  ions destined fo
7290: 72 20 73 6f 72 74 65 72 20 2a 2f 0a 20 20 45 78  r sorter */.  Ex
72a0: 70 72 4c 69 73 74 20 2a 2a 70 70 45 78 74 72 61  prList **ppExtra
72b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
72c0: 20 45 78 70 72 65 73 73 69 6f 6e 73 20 74 6f 20   Expressions to 
72d0: 61 70 70 65 6e 64 20 74 6f 20 73 6f 72 74 65 72  append to sorter
72e0: 20 72 65 63 6f 72 64 20 2a 2f 0a 29 7b 0a 20 20   record */.){.  
72f0: 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e 44 65  int i;.  int nDe
7300: 66 65 72 20 3d 20 30 3b 0a 20 20 45 78 70 72 4c  fer = 0;.  ExprL
7310: 69 73 74 20 2a 70 45 78 74 72 61 20 3d 20 30 3b  ist *pExtra = 0;
7320: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 45  .  for(i=0; i<pE
7330: 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b  List->nExpr; i++
7340: 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 45 78  ){.    struct Ex
7350: 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  prList_item *pIt
7360: 65 6d 20 3d 20 26 70 45 4c 69 73 74 2d 3e 61 5b  em = &pEList->a[
7370: 69 5d 3b 0a 20 20 20 20 69 66 28 20 70 49 74 65  i];.    if( pIte
7380: 6d 2d 3e 75 2e 78 2e 69 4f 72 64 65 72 42 79 43  m->u.x.iOrderByC
7390: 6f 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 45  ol==0 ){.      E
73a0: 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70 49 74  xpr *pExpr = pIt
73b0: 65 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20  em->pExpr;.     
73c0: 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70   Table *pTab = p
73d0: 45 78 70 72 2d 3e 79 2e 70 54 61 62 3b 0a 20 20  Expr->y.pTab;.  
73e0: 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f      if( pExpr->o
73f0: 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20  p==TK_COLUMN && 
7400: 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3e 3d  pExpr->iColumn>=
7410: 30 20 26 26 20 70 54 61 62 20 26 26 20 21 49 73  0 && pTab && !Is
7420: 56 69 72 74 75 61 6c 28 70 54 61 62 29 0a 20 20  Virtual(pTab).  
7430: 20 20 20 20 20 26 26 20 28 70 54 61 62 2d 3e 61       && (pTab->a
7440: 43 6f 6c 5b 70 45 78 70 72 2d 3e 69 43 6f 6c 75  Col[pExpr->iColu
7450: 6d 6e 5d 2e 63 6f 6c 46 6c 61 67 73 20 26 20 43  mn].colFlags & C
7460: 4f 4c 46 4c 41 47 5f 53 4f 52 54 45 52 52 45 46  OLFLAG_SORTERREF
7470: 29 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20  ).      ){.     
7480: 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20     int j;.      
7490: 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 44 65    for(j=0; j<nDe
74a0: 66 65 72 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  fer; j++){.     
74b0: 20 20 20 20 20 69 66 28 20 70 53 6f 72 74 2d 3e       if( pSort->
74c0: 61 44 65 66 65 72 5b 6a 5d 2e 69 43 73 72 3d 3d  aDefer[j].iCsr==
74d0: 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 29 20  pExpr->iTable ) 
74e0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d  break;.        }
74f0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 6a 3d 3d  .        if( j==
7500: 6e 44 65 66 65 72 20 29 7b 0a 20 20 20 20 20 20  nDefer ){.      
7510: 20 20 20 20 69 66 28 20 6e 44 65 66 65 72 3d 3d      if( nDefer==
7520: 41 72 72 61 79 53 69 7a 65 28 70 53 6f 72 74 2d  ArraySize(pSort-
7530: 3e 61 44 65 66 65 72 29 20 29 7b 0a 20 20 20 20  >aDefer) ){.    
7540: 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65          continue
7550: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73  ;.          }els
7560: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  e{.            i
7570: 6e 74 20 6e 4b 65 79 20 3d 20 31 3b 0a 20 20 20  nt nKey = 1;.   
7580: 20 20 20 20 20 20 20 20 20 69 6e 74 20 6b 3b 0a           int k;.
7590: 20 20 20 20 20 20 20 20 20 20 20 20 49 6e 64 65              Inde
75a0: 78 20 2a 70 50 6b 20 3d 20 30 3b 0a 20 20 20 20  x *pPk = 0;.    
75b0: 20 20 20 20 20 20 20 20 69 66 28 20 21 48 61 73          if( !Has
75c0: 52 6f 77 69 64 28 70 54 61 62 29 20 29 7b 0a 20  Rowid(pTab) ){. 
75d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 50 6b               pPk
75e0: 20 3d 20 73 71 6c 69 74 65 33 50 72 69 6d 61 72   = sqlite3Primar
75f0: 79 4b 65 79 49 6e 64 65 78 28 70 54 61 62 29 3b  yKeyIndex(pTab);
7600: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6e  .              n
7610: 4b 65 79 20 3d 20 70 50 6b 2d 3e 6e 4b 65 79 43  Key = pPk->nKeyC
7620: 6f 6c 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ol;.            
7630: 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 6f  }.            fo
7640: 72 28 6b 3d 30 3b 20 6b 3c 6e 4b 65 79 3b 20 6b  r(k=0; k<nKey; k
7650: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ++){.           
7660: 20 20 20 45 78 70 72 20 2a 70 4e 65 77 20 3d 20     Expr *pNew = 
7670: 73 71 6c 69 74 65 33 50 45 78 70 72 28 70 50 61  sqlite3PExpr(pPa
7680: 72 73 65 2c 20 54 4b 5f 43 4f 4c 55 4d 4e 2c 20  rse, TK_COLUMN, 
7690: 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20  0, 0);.         
76a0: 20 20 20 20 20 69 66 28 20 70 4e 65 77 20 29 7b       if( pNew ){
76b0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
76c0: 20 70 4e 65 77 2d 3e 69 54 61 62 6c 65 20 3d 20   pNew->iTable = 
76d0: 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3b 0a 20  pExpr->iTable;. 
76e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
76f0: 4e 65 77 2d 3e 79 2e 70 54 61 62 20 3d 20 70 45  New->y.pTab = pE
7700: 78 70 72 2d 3e 79 2e 70 54 61 62 3b 0a 20 20 20  xpr->y.pTab;.   
7710: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 4e 65               pNe
7720: 77 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 70 50 6b  w->iColumn = pPk
7730: 20 3f 20 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e   ? pPk->aiColumn
7740: 5b 6b 5d 20 3a 20 2d 31 3b 0a 20 20 20 20 20 20  [k] : -1;.      
7750: 20 20 20 20 20 20 20 20 20 20 70 45 78 74 72 61            pExtra
7760: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69   = sqlite3ExprLi
7770: 73 74 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c  stAppend(pParse,
7780: 20 70 45 78 74 72 61 2c 20 70 4e 65 77 29 3b 0a   pExtra, pNew);.
7790: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a                }.
77a0: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
77b0: 20 20 20 20 20 20 20 20 20 20 70 53 6f 72 74 2d            pSort-
77c0: 3e 61 44 65 66 65 72 5b 6e 44 65 66 65 72 5d 2e  >aDefer[nDefer].
77d0: 70 54 61 62 20 3d 20 70 45 78 70 72 2d 3e 79 2e  pTab = pExpr->y.
77e0: 70 54 61 62 3b 0a 20 20 20 20 20 20 20 20 20 20  pTab;.          
77f0: 20 20 70 53 6f 72 74 2d 3e 61 44 65 66 65 72 5b    pSort->aDefer[
7800: 6e 44 65 66 65 72 5d 2e 69 43 73 72 20 3d 20 70  nDefer].iCsr = p
7810: 45 78 70 72 2d 3e 69 54 61 62 6c 65 3b 0a 20 20  Expr->iTable;.  
7820: 20 20 20 20 20 20 20 20 20 20 70 53 6f 72 74 2d            pSort-
7830: 3e 61 44 65 66 65 72 5b 6e 44 65 66 65 72 5d 2e  >aDefer[nDefer].
7840: 6e 4b 65 79 20 3d 20 6e 4b 65 79 3b 0a 20 20 20  nKey = nKey;.   
7850: 20 20 20 20 20 20 20 20 20 6e 44 65 66 65 72 2b           nDefer+
7860: 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  +;.          }. 
7870: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
7880: 20 70 49 74 65 6d 2d 3e 62 53 6f 72 74 65 72 52   pItem->bSorterR
7890: 65 66 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a  ef = 1;.      }.
78a0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 53 6f 72      }.  }.  pSor
78b0: 74 2d 3e 6e 44 65 66 65 72 20 3d 20 28 75 38 29  t->nDefer = (u8)
78c0: 6e 44 65 66 65 72 3b 0a 20 20 2a 70 70 45 78 74  nDefer;.  *ppExt
78d0: 72 61 20 3d 20 70 45 78 74 72 61 3b 0a 7d 0a 23  ra = pExtra;.}.#
78e0: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  endif../*.** Thi
78f0: 73 20 72 6f 75 74 69 6e 65 20 67 65 6e 65 72 61  s routine genera
7900: 74 65 73 20 74 68 65 20 63 6f 64 65 20 66 6f 72  tes the code for
7910: 20 74 68 65 20 69 6e 73 69 64 65 20 6f 66 20 74   the inside of t
7920: 68 65 20 69 6e 6e 65 72 20 6c 6f 6f 70 0a 2a 2a  he inner loop.**
7930: 20 6f 66 20 61 20 53 45 4c 45 43 54 2e 0a 2a 2a   of a SELECT..**
7940: 0a 2a 2a 20 49 66 20 73 72 63 54 61 62 20 69 73  .** If srcTab is
7950: 20 6e 65 67 61 74 69 76 65 2c 20 74 68 65 6e 20   negative, then 
7960: 74 68 65 20 70 2d 3e 70 45 4c 69 73 74 20 65 78  the p->pEList ex
7970: 70 72 65 73 73 69 6f 6e 73 0a 2a 2a 20 61 72 65  pressions.** are
7980: 20 65 76 61 6c 75 61 74 65 64 20 69 6e 20 6f 72   evaluated in or
7990: 64 65 72 20 74 6f 20 67 65 74 20 74 68 65 20 64  der to get the d
79a0: 61 74 61 20 66 6f 72 20 74 68 69 73 20 72 6f 77  ata for this row
79b0: 2e 20 20 49 66 20 73 72 63 54 61 62 20 69 73 0a  .  If srcTab is.
79c0: 2a 2a 20 7a 65 72 6f 20 6f 72 20 6d 6f 72 65 2c  ** zero or more,
79d0: 20 74 68 65 6e 20 64 61 74 61 20 69 73 20 70 75   then data is pu
79e0: 6c 6c 65 64 20 66 72 6f 6d 20 73 72 63 54 61 62  lled from srcTab
79f0: 20 61 6e 64 20 70 2d 3e 70 45 4c 69 73 74 20 69   and p->pEList i
7a00: 73 20 75 73 65 64 20 6f 6e 6c 79 20 0a 2a 2a 20  s used only .** 
7a10: 74 6f 20 67 65 74 20 74 68 65 20 6e 75 6d 62 65  to get the numbe
7a20: 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 61 6e 64  r of columns and
7a30: 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73   the collation s
7a40: 65 71 75 65 6e 63 65 20 66 6f 72 20 65 61 63 68  equence for each
7a50: 20 63 6f 6c 75 6d 6e 2e 0a 2a 2f 0a 73 74 61 74   column..*/.stat
7a60: 69 63 20 76 6f 69 64 20 73 65 6c 65 63 74 49 6e  ic void selectIn
7a70: 6e 65 72 4c 6f 6f 70 28 0a 20 20 50 61 72 73 65  nerLoop(.  Parse
7a80: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
7a90: 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 65 72     /* The parser
7aa0: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65   context */.  Se
7ab0: 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20  lect *p,        
7ac0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6d        /* The com
7ad0: 70 6c 65 74 65 20 73 65 6c 65 63 74 20 73 74 61  plete select sta
7ae0: 74 65 6d 65 6e 74 20 62 65 69 6e 67 20 63 6f 64  tement being cod
7af0: 65 64 20 2a 2f 0a 20 20 69 6e 74 20 73 72 63 54  ed */.  int srcT
7b00: 61 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ab,             
7b10: 2f 2a 20 50 75 6c 6c 20 64 61 74 61 20 66 72 6f  /* Pull data fro
7b20: 6d 20 74 68 69 73 20 74 61 62 6c 65 20 69 66 20  m this table if 
7b30: 6e 6f 6e 2d 6e 65 67 61 74 69 76 65 20 2a 2f 0a  non-negative */.
7b40: 20 20 53 6f 72 74 43 74 78 20 2a 70 53 6f 72 74    SortCtx *pSort
7b50: 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20  ,         /* If 
7b60: 6e 6f 74 20 4e 55 4c 4c 2c 20 69 6e 66 6f 20 6f  not NULL, info o
7b70: 6e 20 68 6f 77 20 74 6f 20 70 72 6f 63 65 73 73  n how to process
7b80: 20 4f 52 44 45 52 20 42 59 20 2a 2f 0a 20 20 44   ORDER BY */.  D
7b90: 69 73 74 69 6e 63 74 43 74 78 20 2a 70 44 69 73  istinctCtx *pDis
7ba0: 74 69 6e 63 74 2c 20 2f 2a 20 49 66 20 6e 6f 74  tinct, /* If not
7bb0: 20 4e 55 4c 4c 2c 20 69 6e 66 6f 20 6f 6e 20 68   NULL, info on h
7bc0: 6f 77 20 74 6f 20 70 72 6f 63 65 73 73 20 44 49  ow to process DI
7bd0: 53 54 49 4e 43 54 20 2a 2f 0a 20 20 53 65 6c 65  STINCT */.  Sele
7be0: 63 74 44 65 73 74 20 2a 70 44 65 73 74 2c 20 20  ctDest *pDest,  
7bf0: 20 20 20 20 2f 2a 20 48 6f 77 20 74 6f 20 64 69      /* How to di
7c00: 73 70 6f 73 65 20 6f 66 20 74 68 65 20 72 65 73  spose of the res
7c10: 75 6c 74 73 20 2a 2f 0a 20 20 69 6e 74 20 69 43  ults */.  int iC
7c20: 6f 6e 74 69 6e 75 65 2c 20 20 20 20 20 20 20 20  ontinue,        
7c30: 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 74    /* Jump here t
7c40: 6f 20 63 6f 6e 74 69 6e 75 65 20 77 69 74 68 20  o continue with 
7c50: 6e 65 78 74 20 72 6f 77 20 2a 2f 0a 20 20 69 6e  next row */.  in
7c60: 74 20 69 42 72 65 61 6b 20 20 20 20 20 20 20 20  t iBreak        
7c70: 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65        /* Jump he
7c80: 72 65 20 74 6f 20 62 72 65 61 6b 20 6f 75 74 20  re to break out 
7c90: 6f 66 20 74 68 65 20 69 6e 6e 65 72 20 6c 6f 6f  of the inner loo
7ca0: 70 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a  p */.){.  Vdbe *
7cb0: 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
7cc0: 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e  e;.  int i;.  in
7cd0: 74 20 68 61 73 44 69 73 74 69 6e 63 74 3b 20 20  t hasDistinct;  
7ce0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
7cf0: 65 20 69 66 20 74 68 65 20 44 49 53 54 49 4e 43  e if the DISTINC
7d00: 54 20 6b 65 79 77 6f 72 64 20 69 73 20 70 72 65  T keyword is pre
7d10: 73 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 65 44  sent */.  int eD
7d20: 65 73 74 20 3d 20 70 44 65 73 74 2d 3e 65 44 65  est = pDest->eDe
7d30: 73 74 3b 20 20 20 2f 2a 20 48 6f 77 20 74 6f 20  st;   /* How to 
7d40: 64 69 73 70 6f 73 65 20 6f 66 20 72 65 73 75 6c  dispose of resul
7d50: 74 73 20 2a 2f 0a 20 20 69 6e 74 20 69 50 61 72  ts */.  int iPar
7d60: 6d 20 3d 20 70 44 65 73 74 2d 3e 69 53 44 50 61  m = pDest->iSDPa
7d70: 72 6d 3b 20 2f 2a 20 46 69 72 73 74 20 61 72 67  rm; /* First arg
7d80: 75 6d 65 6e 74 20 74 6f 20 64 69 73 70 6f 73 61  ument to disposa
7d90: 6c 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 69 6e  l method */.  in
7da0: 74 20 6e 52 65 73 75 6c 74 43 6f 6c 3b 20 20 20  t nResultCol;   
7db0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
7dc0: 62 65 72 20 6f 66 20 72 65 73 75 6c 74 20 63 6f  ber of result co
7dd0: 6c 75 6d 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 6e  lumns */.  int n
7de0: 50 72 65 66 69 78 52 65 67 20 3d 20 30 3b 20 20  PrefixReg = 0;  
7df0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
7e00: 20 6f 66 20 65 78 74 72 61 20 72 65 67 69 73 74   of extra regist
7e10: 65 72 73 20 62 65 66 6f 72 65 20 72 65 67 52 65  ers before regRe
7e20: 73 75 6c 74 20 2a 2f 0a 20 20 52 6f 77 4c 6f 61  sult */.  RowLoa
7e30: 64 49 6e 66 6f 20 73 52 6f 77 4c 6f 61 64 49 6e  dInfo sRowLoadIn
7e40: 66 6f 3b 20 20 20 2f 2a 20 49 6e 66 6f 20 66 6f  fo;   /* Info fo
7e50: 72 20 64 65 66 65 72 72 65 64 20 72 6f 77 20 6c  r deferred row l
7e60: 6f 61 64 69 6e 67 20 2a 2f 0a 0a 20 20 2f 2a 20  oading */..  /* 
7e70: 55 73 75 61 6c 6c 79 2c 20 72 65 67 52 65 73 75  Usually, regResu
7e80: 6c 74 20 69 73 20 74 68 65 20 66 69 72 73 74 20  lt is the first 
7e90: 63 65 6c 6c 20 69 6e 20 61 6e 20 61 72 72 61 79  cell in an array
7ea0: 20 6f 66 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73   of memory cells
7eb0: 0a 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 69 6e 67  .  ** containing
7ec0: 20 74 68 65 20 63 75 72 72 65 6e 74 20 72 65 73   the current res
7ed0: 75 6c 74 20 72 6f 77 2e 20 49 6e 20 74 68 69 73  ult row. In this
7ee0: 20 63 61 73 65 20 72 65 67 4f 72 69 67 20 69 73   case regOrig is
7ef0: 20 73 65 74 20 74 6f 20 74 68 65 0a 20 20 2a 2a   set to the.  **
7f00: 20 73 61 6d 65 20 76 61 6c 75 65 2e 20 48 6f 77   same value. How
7f10: 65 76 65 72 2c 20 69 66 20 74 68 65 20 72 65 73  ever, if the res
7f20: 75 6c 74 73 20 61 72 65 20 62 65 69 6e 67 20 73  ults are being s
7f30: 65 6e 74 20 74 6f 20 74 68 65 20 73 6f 72 74 65  ent to the sorte
7f40: 72 2c 20 74 68 65 0a 20 20 2a 2a 20 76 61 6c 75  r, the.  ** valu
7f50: 65 73 20 66 6f 72 20 61 6e 79 20 65 78 70 72 65  es for any expre
7f60: 73 73 69 6f 6e 73 20 74 68 61 74 20 61 72 65 20  ssions that are 
7f70: 61 6c 73 6f 20 70 61 72 74 20 6f 66 20 74 68 65  also part of the
7f80: 20 73 6f 72 74 2d 6b 65 79 20 61 72 65 20 6f 6d   sort-key are om
7f90: 69 74 74 65 64 0a 20 20 2a 2a 20 66 72 6f 6d 20  itted.  ** from 
7fa0: 74 68 69 73 20 61 72 72 61 79 2e 20 49 6e 20 74  this array. In t
7fb0: 68 69 73 20 63 61 73 65 20 72 65 67 4f 72 69 67  his case regOrig
7fc0: 20 69 73 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e   is set to zero.
7fd0: 20 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 52 65    */.  int regRe
7fe0: 73 75 6c 74 3b 20 20 20 20 20 20 20 20 20 20 20  sult;           
7ff0: 20 20 20 2f 2a 20 53 74 61 72 74 20 6f 66 20 6d     /* Start of m
8000: 65 6d 6f 72 79 20 68 6f 6c 64 69 6e 67 20 63 75  emory holding cu
8010: 72 72 65 6e 74 20 72 65 73 75 6c 74 73 20 2a 2f  rrent results */
8020: 0a 20 20 69 6e 74 20 72 65 67 4f 72 69 67 3b 20  .  int regOrig; 
8030: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
8040: 2a 20 53 74 61 72 74 20 6f 66 20 6d 65 6d 6f 72  * Start of memor
8050: 79 20 68 6f 6c 64 69 6e 67 20 66 75 6c 6c 20 72  y holding full r
8060: 65 73 75 6c 74 20 28 6f 72 20 30 29 20 2a 2f 0a  esult (or 0) */.
8070: 0a 20 20 61 73 73 65 72 74 28 20 76 20 29 3b 0a  .  assert( v );.
8080: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c    assert( p->pEL
8090: 69 73 74 21 3d 30 20 29 3b 0a 20 20 68 61 73 44  ist!=0 );.  hasD
80a0: 69 73 74 69 6e 63 74 20 3d 20 70 44 69 73 74 69  istinct = pDisti
80b0: 6e 63 74 20 3f 20 70 44 69 73 74 69 6e 63 74 2d  nct ? pDistinct-
80c0: 3e 65 54 6e 63 74 54 79 70 65 20 3a 20 57 48 45  >eTnctType : WHE
80d0: 52 45 5f 44 49 53 54 49 4e 43 54 5f 4e 4f 4f 50  RE_DISTINCT_NOOP
80e0: 3b 0a 20 20 69 66 28 20 70 53 6f 72 74 20 26 26  ;.  if( pSort &&
80f0: 20 70 53 6f 72 74 2d 3e 70 4f 72 64 65 72 42 79   pSort->pOrderBy
8100: 3d 3d 30 20 29 20 70 53 6f 72 74 20 3d 20 30 3b  ==0 ) pSort = 0;
8110: 0a 20 20 69 66 28 20 70 53 6f 72 74 3d 3d 30 20  .  if( pSort==0 
8120: 26 26 20 21 68 61 73 44 69 73 74 69 6e 63 74 20  && !hasDistinct 
8130: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69  ){.    assert( i
8140: 43 6f 6e 74 69 6e 75 65 21 3d 30 20 29 3b 0a 20  Continue!=0 );. 
8150: 20 20 20 63 6f 64 65 4f 66 66 73 65 74 28 76 2c     codeOffset(v,
8160: 20 70 2d 3e 69 4f 66 66 73 65 74 2c 20 69 43 6f   p->iOffset, iCo
8170: 6e 74 69 6e 75 65 29 3b 0a 20 20 7d 0a 0a 20 20  ntinue);.  }..  
8180: 2f 2a 20 50 75 6c 6c 20 74 68 65 20 72 65 71 75  /* Pull the requ
8190: 65 73 74 65 64 20 63 6f 6c 75 6d 6e 73 2e 0a 20  ested columns.. 
81a0: 20 2a 2f 0a 20 20 6e 52 65 73 75 6c 74 43 6f 6c   */.  nResultCol
81b0: 20 3d 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45   = p->pEList->nE
81c0: 78 70 72 3b 0a 0a 20 20 69 66 28 20 70 44 65 73  xpr;..  if( pDes
81d0: 74 2d 3e 69 53 64 73 74 3d 3d 30 20 29 7b 0a 20  t->iSdst==0 ){. 
81e0: 20 20 20 69 66 28 20 70 53 6f 72 74 20 29 7b 0a     if( pSort ){.
81f0: 20 20 20 20 20 20 6e 50 72 65 66 69 78 52 65 67        nPrefixReg
8200: 20 3d 20 70 53 6f 72 74 2d 3e 70 4f 72 64 65 72   = pSort->pOrder
8210: 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20  By->nExpr;.     
8220: 20 69 66 28 20 21 28 70 53 6f 72 74 2d 3e 73 6f   if( !(pSort->so
8230: 72 74 46 6c 61 67 73 20 26 20 53 4f 52 54 46 4c  rtFlags & SORTFL
8240: 41 47 5f 55 73 65 53 6f 72 74 65 72 29 20 29 20  AG_UseSorter) ) 
8250: 6e 50 72 65 66 69 78 52 65 67 2b 2b 3b 0a 20 20  nPrefixReg++;.  
8260: 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d      pParse->nMem
8270: 20 2b 3d 20 6e 50 72 65 66 69 78 52 65 67 3b 0a   += nPrefixReg;.
8280: 20 20 20 20 7d 0a 20 20 20 20 70 44 65 73 74 2d      }.    pDest-
8290: 3e 69 53 64 73 74 20 3d 20 70 50 61 72 73 65 2d  >iSdst = pParse-
82a0: 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20 70 50 61  >nMem+1;.    pPa
82b0: 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 52 65  rse->nMem += nRe
82c0: 73 75 6c 74 43 6f 6c 3b 0a 20 20 7d 65 6c 73 65  sultCol;.  }else
82d0: 20 69 66 28 20 70 44 65 73 74 2d 3e 69 53 64 73   if( pDest->iSds
82e0: 74 2b 6e 52 65 73 75 6c 74 43 6f 6c 20 3e 20 70  t+nResultCol > p
82f0: 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 29 7b 0a 20  Parse->nMem ){. 
8300: 20 20 20 2f 2a 20 54 68 69 73 20 69 73 20 61 6e     /* This is an
8310: 20 65 72 72 6f 72 20 63 6f 6e 64 69 74 69 6f 6e   error condition
8320: 20 74 68 61 74 20 63 61 6e 20 72 65 73 75 6c 74   that can result
8330: 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 2c 20 77  , for example, w
8340: 68 65 6e 20 61 20 53 45 4c 45 43 54 0a 20 20 20  hen a SELECT.   
8350: 20 2a 2a 20 6f 6e 20 74 68 65 20 72 69 67 68 74   ** on the right
8360: 2d 68 61 6e 64 20 73 69 64 65 20 6f 66 20 61 6e  -hand side of an
8370: 20 49 4e 53 45 52 54 20 63 6f 6e 74 61 69 6e 73   INSERT contains
8380: 20 6d 6f 72 65 20 72 65 73 75 6c 74 20 63 6f 6c   more result col
8390: 75 6d 6e 73 20 74 68 61 6e 0a 20 20 20 20 2a 2a  umns than.    **
83a0: 20 74 68 65 72 65 20 61 72 65 20 63 6f 6c 75 6d   there are colum
83b0: 6e 73 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20  ns in the table 
83c0: 6f 6e 20 74 68 65 20 6c 65 66 74 2e 20 20 54 68  on the left.  Th
83d0: 65 20 65 72 72 6f 72 20 77 69 6c 6c 20 62 65 20  e error will be 
83e0: 63 61 75 67 68 74 0a 20 20 20 20 2a 2a 20 61 6e  caught.    ** an
83f0: 64 20 72 65 70 6f 72 74 65 64 20 6c 61 74 65 72  d reported later
8400: 2e 20 20 42 75 74 20 77 65 20 6e 65 65 64 20 74  .  But we need t
8410: 6f 20 6d 61 6b 65 20 73 75 72 65 20 65 6e 6f 75  o make sure enou
8420: 67 68 20 6d 65 6d 6f 72 79 20 69 73 20 61 6c 6c  gh memory is all
8430: 6f 63 61 74 65 64 0a 20 20 20 20 2a 2a 20 74 6f  ocated.    ** to
8440: 20 61 76 6f 69 64 20 6f 74 68 65 72 20 73 70 75   avoid other spu
8450: 72 69 6f 75 73 20 65 72 72 6f 72 73 20 69 6e 20  rious errors in 
8460: 74 68 65 20 6d 65 61 6e 74 69 6d 65 2e 20 2a 2f  the meantime. */
8470: 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65  .    pParse->nMe
8480: 6d 20 2b 3d 20 6e 52 65 73 75 6c 74 43 6f 6c 3b  m += nResultCol;
8490: 0a 20 20 7d 0a 20 20 70 44 65 73 74 2d 3e 6e 53  .  }.  pDest->nS
84a0: 64 73 74 20 3d 20 6e 52 65 73 75 6c 74 43 6f 6c  dst = nResultCol
84b0: 3b 0a 20 20 72 65 67 4f 72 69 67 20 3d 20 72 65  ;.  regOrig = re
84c0: 67 52 65 73 75 6c 74 20 3d 20 70 44 65 73 74 2d  gResult = pDest-
84d0: 3e 69 53 64 73 74 3b 0a 20 20 69 66 28 20 73 72  >iSdst;.  if( sr
84e0: 63 54 61 62 3e 3d 30 20 29 7b 0a 20 20 20 20 66  cTab>=0 ){.    f
84f0: 6f 72 28 69 3d 30 3b 20 69 3c 6e 52 65 73 75 6c  or(i=0; i<nResul
8500: 74 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  tCol; i++){.    
8510: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
8520: 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e  Op3(v, OP_Column
8530: 2c 20 73 72 63 54 61 62 2c 20 69 2c 20 72 65 67  , srcTab, i, reg
8540: 52 65 73 75 6c 74 2b 69 29 3b 0a 20 20 20 20 20  Result+i);.     
8550: 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
8560: 20 22 25 73 22 2c 20 70 2d 3e 70 45 4c 69 73 74   "%s", p->pEList
8570: 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 29 3b 0a  ->a[i].zName));.
8580: 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66      }.  }else if
8590: 28 20 65 44 65 73 74 21 3d 53 52 54 5f 45 78 69  ( eDest!=SRT_Exi
85a0: 73 74 73 20 29 7b 0a 23 69 66 64 65 66 20 53 51  sts ){.#ifdef SQ
85b0: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 4f 52 54  LITE_ENABLE_SORT
85c0: 45 52 5f 52 45 46 45 52 45 4e 43 45 53 0a 20 20  ER_REFERENCES.  
85d0: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 78 74    ExprList *pExt
85e0: 72 61 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 20  ra = 0;.#endif. 
85f0: 20 20 20 2f 2a 20 49 66 20 74 68 65 20 64 65 73     /* If the des
8600: 74 69 6e 61 74 69 6f 6e 20 69 73 20 61 6e 20 45  tination is an E
8610: 58 49 53 54 53 28 2e 2e 2e 29 20 65 78 70 72 65  XISTS(...) expre
8620: 73 73 69 6f 6e 2c 20 74 68 65 20 61 63 74 75 61  ssion, the actua
8630: 6c 0a 20 20 20 20 2a 2a 20 76 61 6c 75 65 73 20  l.    ** values 
8640: 72 65 74 75 72 6e 65 64 20 62 79 20 74 68 65 20  returned by the 
8650: 53 45 4c 45 43 54 20 61 72 65 20 6e 6f 74 20 72  SELECT are not r
8660: 65 71 75 69 72 65 64 2e 0a 20 20 20 20 2a 2f 0a  equired..    */.
8670: 20 20 20 20 75 38 20 65 63 65 6c 46 6c 61 67 73      u8 ecelFlags
8680: 3b 20 20 20 20 2f 2a 20 22 65 63 65 6c 22 20 69  ;    /* "ecel" i
8690: 73 20 61 6e 20 61 62 62 72 65 76 69 61 74 69 6f  s an abbreviatio
86a0: 6e 20 6f 66 20 22 45 78 70 72 43 6f 64 65 45 78  n of "ExprCodeEx
86b0: 70 72 4c 69 73 74 22 20 2a 2f 0a 20 20 20 20 45  prList" */.    E
86c0: 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b  xprList *pEList;
86d0: 0a 20 20 20 20 69 66 28 20 65 44 65 73 74 3d 3d  .    if( eDest==
86e0: 53 52 54 5f 4d 65 6d 20 7c 7c 20 65 44 65 73 74  SRT_Mem || eDest
86f0: 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20 7c 7c 20  ==SRT_Output || 
8700: 65 44 65 73 74 3d 3d 53 52 54 5f 43 6f 72 6f 75  eDest==SRT_Corou
8710: 74 69 6e 65 20 29 7b 0a 20 20 20 20 20 20 65 63  tine ){.      ec
8720: 65 6c 46 6c 61 67 73 20 3d 20 53 51 4c 49 54 45  elFlags = SQLITE
8730: 5f 45 43 45 4c 5f 44 55 50 3b 0a 20 20 20 20 7d  _ECEL_DUP;.    }
8740: 65 6c 73 65 7b 0a 20 20 20 20 20 20 65 63 65 6c  else{.      ecel
8750: 46 6c 61 67 73 20 3d 20 30 3b 0a 20 20 20 20 7d  Flags = 0;.    }
8760: 0a 20 20 20 20 69 66 28 20 70 53 6f 72 74 20 26  .    if( pSort &
8770: 26 20 68 61 73 44 69 73 74 69 6e 63 74 3d 3d 30  & hasDistinct==0
8780: 20 26 26 20 65 44 65 73 74 21 3d 53 52 54 5f 45   && eDest!=SRT_E
8790: 70 68 65 6d 54 61 62 20 26 26 20 65 44 65 73 74  phemTab && eDest
87a0: 21 3d 53 52 54 5f 54 61 62 6c 65 20 29 7b 0a 20  !=SRT_Table ){. 
87b0: 20 20 20 20 20 2f 2a 20 46 6f 72 20 65 61 63 68       /* For each
87c0: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 70   expression in p
87d0: 2d 3e 70 45 4c 69 73 74 20 74 68 61 74 20 69 73  ->pEList that is
87e0: 20 61 20 63 6f 70 79 20 6f 66 20 61 6e 20 65 78   a copy of an ex
87f0: 70 72 65 73 73 69 6f 6e 20 69 6e 0a 20 20 20 20  pression in.    
8800: 20 20 2a 2a 20 74 68 65 20 4f 52 44 45 52 20 42    ** the ORDER B
8810: 59 20 63 6c 61 75 73 65 20 28 70 53 6f 72 74 2d  Y clause (pSort-
8820: 3e 70 4f 72 64 65 72 42 79 29 2c 20 73 65 74 20  >pOrderBy), set 
8830: 74 68 65 20 61 73 73 6f 63 69 61 74 65 64 20 0a  the associated .
8840: 20 20 20 20 20 20 2a 2a 20 69 4f 72 64 65 72 42        ** iOrderB
8850: 79 43 6f 6c 20 76 61 6c 75 65 20 74 6f 20 6f 6e  yCol value to on
8860: 65 20 6d 6f 72 65 20 74 68 61 6e 20 74 68 65 20  e more than the 
8870: 69 6e 64 65 78 20 6f 66 20 74 68 65 20 4f 52 44  index of the ORD
8880: 45 52 20 42 59 20 0a 20 20 20 20 20 20 2a 2a 20  ER BY .      ** 
8890: 65 78 70 72 65 73 73 69 6f 6e 20 77 69 74 68 69  expression withi
88a0: 6e 20 74 68 65 20 73 6f 72 74 2d 6b 65 79 20 74  n the sort-key t
88b0: 68 61 74 20 70 75 73 68 4f 6e 74 6f 53 6f 72 74  hat pushOntoSort
88c0: 65 72 28 29 20 77 69 6c 6c 20 67 65 6e 65 72 61  er() will genera
88d0: 74 65 2e 0a 20 20 20 20 20 20 2a 2a 20 54 68 69  te..      ** Thi
88e0: 73 20 61 6c 6c 6f 77 73 20 74 68 65 20 70 2d 3e  s allows the p->
88f0: 70 45 4c 69 73 74 20 66 69 65 6c 64 20 74 6f 20  pEList field to 
8900: 62 65 20 6f 6d 69 74 74 65 64 20 66 72 6f 6d 20  be omitted from 
8910: 74 68 65 20 73 6f 72 74 65 64 20 72 65 63 6f 72  the sorted recor
8920: 64 2c 0a 20 20 20 20 20 20 2a 2a 20 73 61 76 69  d,.      ** savi
8930: 6e 67 20 73 70 61 63 65 20 61 6e 64 20 43 50 55  ng space and CPU
8940: 20 63 79 63 6c 65 73 2e 20 20 2a 2f 0a 20 20 20   cycles.  */.   
8950: 20 20 20 65 63 65 6c 46 6c 61 67 73 20 7c 3d 20     ecelFlags |= 
8960: 28 53 51 4c 49 54 45 5f 45 43 45 4c 5f 4f 4d 49  (SQLITE_ECEL_OMI
8970: 54 52 45 46 7c 53 51 4c 49 54 45 5f 45 43 45 4c  TREF|SQLITE_ECEL
8980: 5f 52 45 46 29 3b 0a 0a 20 20 20 20 20 20 66 6f  _REF);..      fo
8990: 72 28 69 3d 70 53 6f 72 74 2d 3e 6e 4f 42 53 61  r(i=pSort->nOBSa
89a0: 74 3b 20 69 3c 70 53 6f 72 74 2d 3e 70 4f 72 64  t; i<pSort->pOrd
89b0: 65 72 42 79 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b  erBy->nExpr; i++
89c0: 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6a  ){.        int j
89d0: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 6a  ;.        if( (j
89e0: 20 3d 20 70 53 6f 72 74 2d 3e 70 4f 72 64 65 72   = pSort->pOrder
89f0: 42 79 2d 3e 61 5b 69 5d 2e 75 2e 78 2e 69 4f 72  By->a[i].u.x.iOr
8a00: 64 65 72 42 79 43 6f 6c 29 3e 30 20 29 7b 0a 20  derByCol)>0 ){. 
8a10: 20 20 20 20 20 20 20 20 20 70 2d 3e 70 45 4c 69           p->pELi
8a20: 73 74 2d 3e 61 5b 6a 2d 31 5d 2e 75 2e 78 2e 69  st->a[j-1].u.x.i
8a30: 4f 72 64 65 72 42 79 43 6f 6c 20 3d 20 69 2b 31  OrderByCol = i+1
8a40: 2d 70 53 6f 72 74 2d 3e 6e 4f 42 53 61 74 3b 0a  -pSort->nOBSat;.
8a50: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
8a60: 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  }.#ifdef SQLITE_
8a70: 45 4e 41 42 4c 45 5f 53 4f 52 54 45 52 5f 52 45  ENABLE_SORTER_RE
8a80: 46 45 52 45 4e 43 45 53 0a 20 20 20 20 20 20 73  FERENCES.      s
8a90: 65 6c 65 63 74 45 78 70 72 44 65 66 65 72 28 70  electExprDefer(p
8aa0: 50 61 72 73 65 2c 20 70 53 6f 72 74 2c 20 70 2d  Parse, pSort, p-
8ab0: 3e 70 45 4c 69 73 74 2c 20 26 70 45 78 74 72 61  >pEList, &pExtra
8ac0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45 78  );.      if( pEx
8ad0: 74 72 61 20 26 26 20 70 50 61 72 73 65 2d 3e 64  tra && pParse->d
8ae0: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 3d  b->mallocFailed=
8af0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  =0 ){.        /*
8b00: 20 49 66 20 74 68 65 72 65 20 61 72 65 20 61 6e   If there are an
8b10: 79 20 65 78 74 72 61 20 50 4b 20 63 6f 6c 75 6d  y extra PK colum
8b20: 6e 73 20 74 6f 20 61 64 64 20 74 6f 20 74 68 65  ns to add to the
8b30: 20 73 6f 72 74 65 72 20 72 65 63 6f 72 64 73 2c   sorter records,
8b40: 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6c 6c 6f  .        ** allo
8b50: 63 61 74 65 20 65 78 74 72 61 20 6d 65 6d 6f 72  cate extra memor
8b60: 79 20 63 65 6c 6c 73 20 61 6e 64 20 61 64 6a 75  y cells and adju
8b70: 73 74 20 74 68 65 20 4f 70 65 6e 45 70 68 65 6d  st the OpenEphem
8b80: 65 72 61 6c 20 0a 20 20 20 20 20 20 20 20 2a 2a  eral .        **
8b90: 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f 20   instruction to 
8ba0: 61 63 63 6f 75 6e 74 20 66 6f 72 20 74 68 65 20  account for the 
8bb0: 6c 61 72 67 65 72 20 72 65 63 6f 72 64 73 2e 20  larger records. 
8bc0: 54 68 69 73 20 69 73 20 6f 6e 6c 79 0a 20 20 20  This is only.   
8bd0: 20 20 20 20 20 2a 2a 20 72 65 71 75 69 72 65 64       ** required
8be0: 20 69 66 20 74 68 65 72 65 20 61 72 65 20 6f 6e   if there are on
8bf0: 65 20 6f 72 20 6d 6f 72 65 20 57 49 54 48 4f 55  e or more WITHOU
8c00: 54 20 52 4f 57 49 44 20 74 61 62 6c 65 73 20 77  T ROWID tables w
8c10: 69 74 68 0a 20 20 20 20 20 20 20 20 2a 2a 20 63  ith.        ** c
8c20: 6f 6d 70 6f 73 69 74 65 20 70 72 69 6d 61 72 79  omposite primary
8c30: 20 6b 65 79 73 20 69 6e 20 74 68 65 20 53 6f 72   keys in the Sor
8c40: 74 43 74 78 2e 61 44 65 66 65 72 5b 5d 20 61 72  tCtx.aDefer[] ar
8c50: 72 61 79 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20  ray.  */.       
8c60: 20 56 64 62 65 4f 70 20 2a 70 4f 70 20 3d 20 73   VdbeOp *pOp = s
8c70: 71 6c 69 74 65 33 56 64 62 65 47 65 74 4f 70 28  qlite3VdbeGetOp(
8c80: 76 2c 20 70 53 6f 72 74 2d 3e 61 64 64 72 53 6f  v, pSort->addrSo
8c90: 72 74 49 6e 64 65 78 29 3b 0a 20 20 20 20 20 20  rtIndex);.      
8ca0: 20 20 70 4f 70 2d 3e 70 32 20 2b 3d 20 28 70 45    pOp->p2 += (pE
8cb0: 78 74 72 61 2d 3e 6e 45 78 70 72 20 2d 20 70 53  xtra->nExpr - pS
8cc0: 6f 72 74 2d 3e 6e 44 65 66 65 72 29 3b 0a 20 20  ort->nDefer);.  
8cd0: 20 20 20 20 20 20 70 4f 70 2d 3e 70 34 2e 70 4b        pOp->p4.pK
8ce0: 65 79 49 6e 66 6f 2d 3e 6e 41 6c 6c 46 69 65 6c  eyInfo->nAllFiel
8cf0: 64 20 2b 3d 20 28 70 45 78 74 72 61 2d 3e 6e 45  d += (pExtra->nE
8d00: 78 70 72 20 2d 20 70 53 6f 72 74 2d 3e 6e 44 65  xpr - pSort->nDe
8d10: 66 65 72 29 3b 0a 20 20 20 20 20 20 20 20 70 50  fer);.        pP
8d20: 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 70 45  arse->nMem += pE
8d30: 78 74 72 61 2d 3e 6e 45 78 70 72 3b 0a 20 20 20  xtra->nExpr;.   
8d40: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20     }.#endif..   
8d50: 20 20 20 2f 2a 20 41 64 6a 75 73 74 20 6e 52 65     /* Adjust nRe
8d60: 73 75 6c 74 43 6f 6c 20 74 6f 20 61 63 63 6f 75  sultCol to accou
8d70: 6e 74 20 66 6f 72 20 63 6f 6c 75 6d 6e 73 20 74  nt for columns t
8d80: 68 61 74 20 61 72 65 20 6f 6d 69 74 74 65 64 0a  hat are omitted.
8d90: 20 20 20 20 20 20 2a 2a 20 66 72 6f 6d 20 74 68        ** from th
8da0: 65 20 73 6f 72 74 65 72 20 62 79 20 74 68 65 20  e sorter by the 
8db0: 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20 69 6e  optimizations in
8dc0: 20 74 68 69 73 20 62 72 61 6e 63 68 20 2a 2f 0a   this branch */.
8dd0: 20 20 20 20 20 20 70 45 4c 69 73 74 20 3d 20 70        pEList = p
8de0: 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 20 20 20 20  ->pEList;.      
8df0: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 45 4c 69 73  for(i=0; i<pELis
8e00: 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a  t->nExpr; i++){.
8e10: 20 20 20 20 20 20 20 20 69 66 28 20 70 45 4c 69          if( pELi
8e20: 73 74 2d 3e 61 5b 69 5d 2e 75 2e 78 2e 69 4f 72  st->a[i].u.x.iOr
8e30: 64 65 72 42 79 43 6f 6c 3e 30 0a 23 69 66 64 65  derByCol>0.#ifde
8e40: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
8e50: 53 4f 52 54 45 52 5f 52 45 46 45 52 45 4e 43 45  SORTER_REFERENCE
8e60: 53 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 70 45  S.         || pE
8e70: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 62 53 6f 72 74  List->a[i].bSort
8e80: 65 72 52 65 66 0a 23 65 6e 64 69 66 0a 20 20 20  erRef.#endif.   
8e90: 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
8ea0: 20 20 6e 52 65 73 75 6c 74 43 6f 6c 2d 2d 3b 0a    nResultCol--;.
8eb0: 20 20 20 20 20 20 20 20 20 20 72 65 67 4f 72 69            regOri
8ec0: 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d  g = 0;.        }
8ed0: 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
8ee0: 74 65 73 74 63 61 73 65 28 20 72 65 67 4f 72 69  testcase( regOri
8ef0: 67 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  g );.      testc
8f00: 61 73 65 28 20 65 44 65 73 74 3d 3d 53 52 54 5f  ase( eDest==SRT_
8f10: 53 65 74 20 29 3b 0a 20 20 20 20 20 20 74 65 73  Set );.      tes
8f20: 74 63 61 73 65 28 20 65 44 65 73 74 3d 3d 53 52  tcase( eDest==SR
8f30: 54 5f 4d 65 6d 20 29 3b 0a 20 20 20 20 20 20 74  T_Mem );.      t
8f40: 65 73 74 63 61 73 65 28 20 65 44 65 73 74 3d 3d  estcase( eDest==
8f50: 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 20 29 3b  SRT_Coroutine );
8f60: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
8f70: 20 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70   eDest==SRT_Outp
8f80: 75 74 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  ut );.      asse
8f90: 72 74 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 53  rt( eDest==SRT_S
8fa0: 65 74 20 7c 7c 20 65 44 65 73 74 3d 3d 53 52 54  et || eDest==SRT
8fb0: 5f 4d 65 6d 20 0a 20 20 20 20 20 20 20 20 20 20  _Mem .          
8fc0: 20 7c 7c 20 65 44 65 73 74 3d 3d 53 52 54 5f 43   || eDest==SRT_C
8fd0: 6f 72 6f 75 74 69 6e 65 20 7c 7c 20 65 44 65 73  oroutine || eDes
8fe0: 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20 29 3b  t==SRT_Output );
8ff0: 0a 20 20 20 20 7d 0a 20 20 20 20 73 52 6f 77 4c  .    }.    sRowL
9000: 6f 61 64 49 6e 66 6f 2e 72 65 67 52 65 73 75 6c  oadInfo.regResul
9010: 74 20 3d 20 72 65 67 52 65 73 75 6c 74 3b 0a 20  t = regResult;. 
9020: 20 20 20 73 52 6f 77 4c 6f 61 64 49 6e 66 6f 2e     sRowLoadInfo.
9030: 65 63 65 6c 46 6c 61 67 73 20 3d 20 65 63 65 6c  ecelFlags = ecel
9040: 46 6c 61 67 73 3b 0a 23 69 66 64 65 66 20 53 51  Flags;.#ifdef SQ
9050: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 4f 52 54  LITE_ENABLE_SORT
9060: 45 52 5f 52 45 46 45 52 45 4e 43 45 53 0a 20 20  ER_REFERENCES.  
9070: 20 20 73 52 6f 77 4c 6f 61 64 49 6e 66 6f 2e 70    sRowLoadInfo.p
9080: 45 78 74 72 61 20 3d 20 70 45 78 74 72 61 3b 0a  Extra = pExtra;.
9090: 20 20 20 20 73 52 6f 77 4c 6f 61 64 49 6e 66 6f      sRowLoadInfo
90a0: 2e 72 65 67 45 78 74 72 61 52 65 73 75 6c 74 20  .regExtraResult 
90b0: 3d 20 72 65 67 52 65 73 75 6c 74 20 2b 20 6e 52  = regResult + nR
90c0: 65 73 75 6c 74 43 6f 6c 3b 0a 20 20 20 20 69 66  esultCol;.    if
90d0: 28 20 70 45 78 74 72 61 20 29 20 6e 52 65 73 75  ( pExtra ) nResu
90e0: 6c 74 43 6f 6c 20 2b 3d 20 70 45 78 74 72 61 2d  ltCol += pExtra-
90f0: 3e 6e 45 78 70 72 3b 0a 23 65 6e 64 69 66 0a 20  >nExpr;.#endif. 
9100: 20 20 20 69 66 28 20 70 2d 3e 69 4c 69 6d 69 74     if( p->iLimit
9110: 0a 20 20 20 20 20 26 26 20 28 65 63 65 6c 46 6c  .     && (ecelFl
9120: 61 67 73 20 26 20 53 51 4c 49 54 45 5f 45 43 45  ags & SQLITE_ECE
9130: 4c 5f 4f 4d 49 54 52 45 46 29 21 3d 30 20 0a 20  L_OMITREF)!=0 . 
9140: 20 20 20 20 26 26 20 6e 50 72 65 66 69 78 52 65      && nPrefixRe
9150: 67 3e 30 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  g>0.    ){.     
9160: 20 61 73 73 65 72 74 28 20 70 53 6f 72 74 21 3d   assert( pSort!=
9170: 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  0 );.      asser
9180: 74 28 20 68 61 73 44 69 73 74 69 6e 63 74 3d 3d  t( hasDistinct==
9190: 30 20 29 3b 0a 20 20 20 20 20 20 70 53 6f 72 74  0 );.      pSort
91a0: 2d 3e 70 44 65 66 65 72 72 65 64 52 6f 77 4c 6f  ->pDeferredRowLo
91b0: 61 64 20 3d 20 26 73 52 6f 77 4c 6f 61 64 49 6e  ad = &sRowLoadIn
91c0: 66 6f 3b 0a 20 20 20 20 20 20 72 65 67 4f 72 69  fo;.      regOri
91d0: 67 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65  g = 0;.    }else
91e0: 7b 0a 20 20 20 20 20 20 69 6e 6e 65 72 4c 6f 6f  {.      innerLoo
91f0: 70 4c 6f 61 64 52 6f 77 28 70 50 61 72 73 65 2c  pLoadRow(pParse,
9200: 20 70 2c 20 26 73 52 6f 77 4c 6f 61 64 49 6e 66   p, &sRowLoadInf
9210: 6f 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  o);.    }.  }.. 
9220: 20 2f 2a 20 49 66 20 74 68 65 20 44 49 53 54 49   /* If the DISTI
9230: 4e 43 54 20 6b 65 79 77 6f 72 64 20 77 61 73 20  NCT keyword was 
9240: 70 72 65 73 65 6e 74 20 6f 6e 20 74 68 65 20 53  present on the S
9250: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 0a  ELECT statement.
9260: 20 20 2a 2a 20 61 6e 64 20 74 68 69 73 20 72 6f    ** and this ro
9270: 77 20 68 61 73 20 62 65 65 6e 20 73 65 65 6e 20  w has been seen 
9280: 62 65 66 6f 72 65 2c 20 74 68 65 6e 20 64 6f 20  before, then do 
9290: 6e 6f 74 20 6d 61 6b 65 20 74 68 69 73 20 72 6f  not make this ro
92a0: 77 0a 20 20 2a 2a 20 70 61 72 74 20 6f 66 20 74  w.  ** part of t
92b0: 68 65 20 72 65 73 75 6c 74 2e 0a 20 20 2a 2f 0a  he result..  */.
92c0: 20 20 69 66 28 20 68 61 73 44 69 73 74 69 6e 63    if( hasDistinc
92d0: 74 20 29 7b 0a 20 20 20 20 73 77 69 74 63 68 28  t ){.    switch(
92e0: 20 70 44 69 73 74 69 6e 63 74 2d 3e 65 54 6e 63   pDistinct->eTnc
92f0: 74 54 79 70 65 20 29 7b 0a 20 20 20 20 20 20 63  tType ){.      c
9300: 61 73 65 20 57 48 45 52 45 5f 44 49 53 54 49 4e  ase WHERE_DISTIN
9310: 43 54 5f 4f 52 44 45 52 45 44 3a 20 7b 0a 20 20  CT_ORDERED: {.  
9320: 20 20 20 20 20 20 56 64 62 65 4f 70 20 2a 70 4f        VdbeOp *pO
9330: 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  p;            /*
9340: 20 4e 6f 20 6c 6f 6e 67 65 72 20 72 65 71 75 69   No longer requi
9350: 72 65 64 20 4f 70 65 6e 45 70 68 65 6d 65 72 61  red OpenEphemera
9360: 6c 20 69 6e 73 74 72 2e 20 2a 2f 0a 20 20 20 20  l instr. */.    
9370: 20 20 20 20 69 6e 74 20 69 4a 75 6d 70 3b 20 20      int iJump;  
9380: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4a              /* J
9390: 75 6d 70 20 64 65 73 74 69 6e 61 74 69 6f 6e 20  ump destination 
93a0: 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72  */.        int r
93b0: 65 67 50 72 65 76 3b 20 20 20 20 20 20 20 20 20  egPrev;         
93c0: 20 20 20 2f 2a 20 50 72 65 76 69 6f 75 73 20 72     /* Previous r
93d0: 6f 77 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 0a 20  ow content */.. 
93e0: 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 6f 63 61         /* Alloca
93f0: 74 65 20 73 70 61 63 65 20 66 6f 72 20 74 68 65  te space for the
9400: 20 70 72 65 76 69 6f 75 73 20 72 6f 77 20 2a 2f   previous row */
9410: 0a 20 20 20 20 20 20 20 20 72 65 67 50 72 65 76  .        regPrev
9420: 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b   = pParse->nMem+
9430: 31 3b 0a 20 20 20 20 20 20 20 20 70 50 61 72 73  1;.        pPars
9440: 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 52 65 73 75  e->nMem += nResu
9450: 6c 74 43 6f 6c 3b 0a 0a 20 20 20 20 20 20 20 20  ltCol;..        
9460: 2f 2a 20 43 68 61 6e 67 65 20 74 68 65 20 4f 50  /* Change the OP
9470: 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 63  _OpenEphemeral c
9480: 6f 64 65 64 20 65 61 72 6c 69 65 72 20 74 6f 20  oded earlier to 
9490: 61 6e 20 4f 50 5f 4e 75 6c 6c 0a 20 20 20 20 20  an OP_Null.     
94a0: 20 20 20 2a 2a 20 73 65 74 73 20 74 68 65 20 4d     ** sets the M
94b0: 45 4d 5f 43 6c 65 61 72 65 64 20 62 69 74 20 6f  EM_Cleared bit o
94c0: 6e 20 74 68 65 20 66 69 72 73 74 20 72 65 67 69  n the first regi
94d0: 73 74 65 72 20 6f 66 20 74 68 65 0a 20 20 20 20  ster of the.    
94e0: 20 20 20 20 2a 2a 20 70 72 65 76 69 6f 75 73 20      ** previous 
94f0: 76 61 6c 75 65 2e 20 20 54 68 69 73 20 77 69 6c  value.  This wil
9500: 6c 20 63 61 75 73 65 20 74 68 65 20 4f 50 5f 4e  l cause the OP_N
9510: 65 20 62 65 6c 6f 77 20 74 6f 20 61 6c 77 61 79  e below to alway
9520: 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 61 69  s.        ** fai
9530: 6c 20 6f 6e 20 74 68 65 20 66 69 72 73 74 20 69  l on the first i
9540: 74 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  teration of the 
9550: 6c 6f 6f 70 20 65 76 65 6e 20 69 66 20 74 68 65  loop even if the
9560: 20 66 69 72 73 74 0a 20 20 20 20 20 20 20 20 2a   first.        *
9570: 2a 20 72 6f 77 20 69 73 20 61 6c 6c 20 4e 55 4c  * row is all NUL
9580: 4c 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  Ls..        */. 
9590: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
95a0: 62 65 43 68 61 6e 67 65 54 6f 4e 6f 6f 70 28 76  beChangeToNoop(v
95b0: 2c 20 70 44 69 73 74 69 6e 63 74 2d 3e 61 64 64  , pDistinct->add
95c0: 72 54 6e 63 74 29 3b 0a 20 20 20 20 20 20 20 20  rTnct);.        
95d0: 70 4f 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62  pOp = sqlite3Vdb
95e0: 65 47 65 74 4f 70 28 76 2c 20 70 44 69 73 74 69  eGetOp(v, pDisti
95f0: 6e 63 74 2d 3e 61 64 64 72 54 6e 63 74 29 3b 0a  nct->addrTnct);.
9600: 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 6f 70 63          pOp->opc
9610: 6f 64 65 20 3d 20 4f 50 5f 4e 75 6c 6c 3b 0a 20  ode = OP_Null;. 
9620: 20 20 20 20 20 20 20 70 4f 70 2d 3e 70 31 20 3d         pOp->p1 =
9630: 20 31 3b 0a 20 20 20 20 20 20 20 20 70 4f 70 2d   1;.        pOp-
9640: 3e 70 32 20 3d 20 72 65 67 50 72 65 76 3b 0a 0a  >p2 = regPrev;..
9650: 20 20 20 20 20 20 20 20 69 4a 75 6d 70 20 3d 20          iJump = 
9660: 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
9670: 6e 74 41 64 64 72 28 76 29 20 2b 20 6e 52 65 73  ntAddr(v) + nRes
9680: 75 6c 74 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20  ultCol;.        
9690: 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 52 65 73 75  for(i=0; i<nResu
96a0: 6c 74 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  ltCol; i++){.   
96b0: 20 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a         CollSeq *
96c0: 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45  pColl = sqlite3E
96d0: 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  xprCollSeq(pPars
96e0: 65 2c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b  e, p->pEList->a[
96f0: 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20  i].pExpr);.     
9700: 20 20 20 20 20 69 66 28 20 69 3c 6e 52 65 73 75       if( i<nResu
9710: 6c 74 43 6f 6c 2d 31 20 29 7b 0a 20 20 20 20 20  ltCol-1 ){.     
9720: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
9730: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4e  beAddOp3(v, OP_N
9740: 65 2c 20 72 65 67 52 65 73 75 6c 74 2b 69 2c 20  e, regResult+i, 
9750: 69 4a 75 6d 70 2c 20 72 65 67 50 72 65 76 2b 69  iJump, regPrev+i
9760: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 56  );.            V
9770: 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
9780: 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
9790: 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
97a0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
97b0: 2c 20 4f 50 5f 45 71 2c 20 72 65 67 52 65 73 75  , OP_Eq, regResu
97c0: 6c 74 2b 69 2c 20 69 43 6f 6e 74 69 6e 75 65 2c  lt+i, iContinue,
97d0: 20 72 65 67 50 72 65 76 2b 69 29 3b 0a 20 20 20   regPrev+i);.   
97e0: 20 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 76           VdbeCov
97f0: 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20  erage(v);.      
9800: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
9810: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
9820: 67 65 50 34 28 76 2c 20 2d 31 2c 20 28 63 6f 6e  geP4(v, -1, (con
9830: 73 74 20 63 68 61 72 20 2a 29 70 43 6f 6c 6c 2c  st char *)pColl,
9840: 20 50 34 5f 43 4f 4c 4c 53 45 51 29 3b 0a 20 20   P4_COLLSEQ);.  
9850: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
9860: 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 53  dbeChangeP5(v, S
9870: 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 29 3b 0a 20  QLITE_NULLEQ);. 
9880: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
9890: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
98a0: 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
98b0: 76 29 3d 3d 69 4a 75 6d 70 20 7c 7c 20 70 50 61  v)==iJump || pPa
98c0: 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  rse->db->mallocF
98d0: 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 20 20 20  ailed );.       
98e0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
98f0: 70 33 28 76 2c 20 4f 50 5f 43 6f 70 79 2c 20 72  p3(v, OP_Copy, r
9900: 65 67 52 65 73 75 6c 74 2c 20 72 65 67 50 72 65  egResult, regPre
9910: 76 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 2d 31 29  v, nResultCol-1)
9920: 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
9930: 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
9940: 63 61 73 65 20 57 48 45 52 45 5f 44 49 53 54 49  case WHERE_DISTI
9950: 4e 43 54 5f 55 4e 49 51 55 45 3a 20 7b 0a 20 20  NCT_UNIQUE: {.  
9960: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
9970: 65 43 68 61 6e 67 65 54 6f 4e 6f 6f 70 28 76 2c  eChangeToNoop(v,
9980: 20 70 44 69 73 74 69 6e 63 74 2d 3e 61 64 64 72   pDistinct->addr
9990: 54 6e 63 74 29 3b 0a 20 20 20 20 20 20 20 20 62  Tnct);.        b
99a0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  reak;.      }.. 
99b0: 20 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a       default: {.
99c0: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
99d0: 70 44 69 73 74 69 6e 63 74 2d 3e 65 54 6e 63 74  pDistinct->eTnct
99e0: 54 79 70 65 3d 3d 57 48 45 52 45 5f 44 49 53 54  Type==WHERE_DIST
99f0: 49 4e 43 54 5f 55 4e 4f 52 44 45 52 45 44 20 29  INCT_UNORDERED )
9a00: 3b 0a 20 20 20 20 20 20 20 20 63 6f 64 65 44 69  ;.        codeDi
9a10: 73 74 69 6e 63 74 28 70 50 61 72 73 65 2c 20 70  stinct(pParse, p
9a20: 44 69 73 74 69 6e 63 74 2d 3e 74 61 62 54 6e 63  Distinct->tabTnc
9a30: 74 2c 20 69 43 6f 6e 74 69 6e 75 65 2c 20 6e 52  t, iContinue, nR
9a40: 65 73 75 6c 74 43 6f 6c 2c 0a 20 20 20 20 20 20  esultCol,.      
9a50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
9a60: 65 67 52 65 73 75 6c 74 29 3b 0a 20 20 20 20 20  egResult);.     
9a70: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
9a80: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
9a90: 70 53 6f 72 74 3d 3d 30 20 29 7b 0a 20 20 20 20  pSort==0 ){.    
9aa0: 20 20 63 6f 64 65 4f 66 66 73 65 74 28 76 2c 20    codeOffset(v, 
9ab0: 70 2d 3e 69 4f 66 66 73 65 74 2c 20 69 43 6f 6e  p->iOffset, iCon
9ac0: 74 69 6e 75 65 29 3b 0a 20 20 20 20 7d 0a 20 20  tinue);.    }.  
9ad0: 7d 0a 0a 20 20 73 77 69 74 63 68 28 20 65 44 65  }..  switch( eDe
9ae0: 73 74 20 29 7b 0a 20 20 20 20 2f 2a 20 49 6e 20  st ){.    /* In 
9af0: 74 68 69 73 20 6d 6f 64 65 2c 20 77 72 69 74 65  this mode, write
9b00: 20 65 61 63 68 20 71 75 65 72 79 20 72 65 73 75   each query resu
9b10: 6c 74 20 74 6f 20 74 68 65 20 6b 65 79 20 6f 66  lt to the key of
9b20: 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 0a 20   the temporary. 
9b30: 20 20 20 2a 2a 20 74 61 62 6c 65 20 69 50 61 72     ** table iPar
9b40: 6d 2e 0a 20 20 20 20 2a 2f 0a 23 69 66 6e 64 65  m..    */.#ifnde
9b50: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f  f SQLITE_OMIT_CO
9b60: 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 0a 20 20  MPOUND_SELECT.  
9b70: 20 20 63 61 73 65 20 53 52 54 5f 55 6e 69 6f 6e    case SRT_Union
9b80: 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 31  : {.      int r1
9b90: 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c  ;.      r1 = sql
9ba0: 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70  ite3GetTempReg(p
9bb0: 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 73 71  Parse);.      sq
9bc0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
9bd0: 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64  v, OP_MakeRecord
9be0: 2c 20 72 65 67 52 65 73 75 6c 74 2c 20 6e 52 65  , regResult, nRe
9bf0: 73 75 6c 74 43 6f 6c 2c 20 72 31 29 3b 0a 20 20  sultCol, r1);.  
9c00: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
9c10: 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 49  ddOp4Int(v, OP_I
9c20: 64 78 49 6e 73 65 72 74 2c 20 69 50 61 72 6d 2c  dxInsert, iParm,
9c30: 20 72 31 2c 20 72 65 67 52 65 73 75 6c 74 2c 20   r1, regResult, 
9c40: 6e 52 65 73 75 6c 74 43 6f 6c 29 3b 0a 20 20 20  nResultCol);.   
9c50: 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
9c60: 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
9c70: 20 72 31 29 3b 0a 20 20 20 20 20 20 62 72 65 61   r1);.      brea
9c80: 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  k;.    }..    /*
9c90: 20 43 6f 6e 73 74 72 75 63 74 20 61 20 72 65 63   Construct a rec
9ca0: 6f 72 64 20 66 72 6f 6d 20 74 68 65 20 71 75 65  ord from the que
9cb0: 72 79 20 72 65 73 75 6c 74 2c 20 62 75 74 20 69  ry result, but i
9cc0: 6e 73 74 65 61 64 20 6f 66 0a 20 20 20 20 2a 2a  nstead of.    **
9cd0: 20 73 61 76 69 6e 67 20 74 68 61 74 20 72 65 63   saving that rec
9ce0: 6f 72 64 2c 20 75 73 65 20 69 74 20 61 73 20 61  ord, use it as a
9cf0: 20 6b 65 79 20 74 6f 20 64 65 6c 65 74 65 20 65   key to delete e
9d00: 6c 65 6d 65 6e 74 73 20 66 72 6f 6d 0a 20 20 20  lements from.   
9d10: 20 2a 2a 20 74 68 65 20 74 65 6d 70 6f 72 61 72   ** the temporar
9d20: 79 20 74 61 62 6c 65 20 69 50 61 72 6d 2e 0a 20  y table iParm.. 
9d30: 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53     */.    case S
9d40: 52 54 5f 45 78 63 65 70 74 3a 20 7b 0a 20 20 20  RT_Except: {.   
9d50: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
9d60: 64 4f 70 33 28 76 2c 20 4f 50 5f 49 64 78 44 65  dOp3(v, OP_IdxDe
9d70: 6c 65 74 65 2c 20 69 50 61 72 6d 2c 20 72 65 67  lete, iParm, reg
9d80: 52 65 73 75 6c 74 2c 20 6e 52 65 73 75 6c 74 43  Result, nResultC
9d90: 6f 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  ol);.      break
9da0: 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f  ;.    }.#endif /
9db0: 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f  * SQLITE_OMIT_CO
9dc0: 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 20 2a 2f  MPOUND_SELECT */
9dd0: 0a 0a 20 20 20 20 2f 2a 20 53 74 6f 72 65 20 74  ..    /* Store t
9de0: 68 65 20 72 65 73 75 6c 74 20 61 73 20 64 61 74  he result as dat
9df0: 61 20 75 73 69 6e 67 20 61 20 75 6e 69 71 75 65  a using a unique
9e00: 20 6b 65 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20   key..    */.   
9e10: 20 63 61 73 65 20 53 52 54 5f 46 69 66 6f 3a 0a   case SRT_Fifo:.
9e20: 20 20 20 20 63 61 73 65 20 53 52 54 5f 44 69 73      case SRT_Dis
9e30: 74 46 69 66 6f 3a 0a 20 20 20 20 63 61 73 65 20  tFifo:.    case 
9e40: 53 52 54 5f 54 61 62 6c 65 3a 0a 20 20 20 20 63  SRT_Table:.    c
9e50: 61 73 65 20 53 52 54 5f 45 70 68 65 6d 54 61 62  ase SRT_EphemTab
9e60: 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 31  : {.      int r1
9e70: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
9e80: 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 6e  pRange(pParse, n
9e90: 50 72 65 66 69 78 52 65 67 2b 31 29 3b 0a 20 20  PrefixReg+1);.  
9ea0: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 65 44      testcase( eD
9eb0: 65 73 74 3d 3d 53 52 54 5f 54 61 62 6c 65 20 29  est==SRT_Table )
9ec0: 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
9ed0: 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 45 70 68  ( eDest==SRT_Eph
9ee0: 65 6d 54 61 62 20 29 3b 0a 20 20 20 20 20 20 74  emTab );.      t
9ef0: 65 73 74 63 61 73 65 28 20 65 44 65 73 74 3d 3d  estcase( eDest==
9f00: 53 52 54 5f 46 69 66 6f 20 29 3b 0a 20 20 20 20  SRT_Fifo );.    
9f10: 20 20 74 65 73 74 63 61 73 65 28 20 65 44 65 73    testcase( eDes
9f20: 74 3d 3d 53 52 54 5f 44 69 73 74 46 69 66 6f 20  t==SRT_DistFifo 
9f30: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
9f40: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
9f50: 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 65 67  _MakeRecord, reg
9f60: 52 65 73 75 6c 74 2c 20 6e 52 65 73 75 6c 74 43  Result, nResultC
9f70: 6f 6c 2c 20 72 31 2b 6e 50 72 65 66 69 78 52 65  ol, r1+nPrefixRe
9f80: 67 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  g);.#ifndef SQLI
9f90: 54 45 5f 4f 4d 49 54 5f 43 54 45 0a 20 20 20 20  TE_OMIT_CTE.    
9fa0: 20 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54    if( eDest==SRT
9fb0: 5f 44 69 73 74 46 69 66 6f 20 29 7b 0a 20 20 20  _DistFifo ){.   
9fc0: 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 64       /* If the d
9fd0: 65 73 74 69 6e 61 74 69 6f 6e 20 69 73 20 44 69  estination is Di
9fe0: 73 74 46 69 66 6f 2c 20 74 68 65 6e 20 63 75 72  stFifo, then cur
9ff0: 73 6f 72 20 28 69 50 61 72 6d 2b 31 29 20 69 73  sor (iParm+1) is
a000: 20 6f 70 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a   open.        **
a010: 20 6f 6e 20 61 6e 20 65 70 68 65 6d 65 72 61 6c   on an ephemeral
a020: 20 69 6e 64 65 78 2e 20 49 66 20 74 68 65 20 63   index. If the c
a030: 75 72 72 65 6e 74 20 72 6f 77 20 69 73 20 61 6c  urrent row is al
a040: 72 65 61 64 79 20 70 72 65 73 65 6e 74 0a 20 20  ready present.  
a050: 20 20 20 20 20 20 2a 2a 20 69 6e 20 74 68 65 20        ** in the 
a060: 69 6e 64 65 78 2c 20 64 6f 20 6e 6f 74 20 77 72  index, do not wr
a070: 69 74 65 20 69 74 20 74 6f 20 74 68 65 20 6f 75  ite it to the ou
a080: 74 70 75 74 2e 20 49 66 20 6e 6f 74 2c 20 61 64  tput. If not, ad
a090: 64 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a  d the.        **
a0a0: 20 63 75 72 72 65 6e 74 20 72 6f 77 20 74 6f 20   current row to 
a0b0: 74 68 65 20 69 6e 64 65 78 20 61 6e 64 20 70 72  the index and pr
a0c0: 6f 63 65 65 64 20 77 69 74 68 20 77 72 69 74 69  oceed with writi
a0d0: 6e 67 20 69 74 20 74 6f 20 74 68 65 0a 20 20 20  ng it to the.   
a0e0: 20 20 20 20 20 2a 2a 20 6f 75 74 70 75 74 20 74       ** output t
a0f0: 61 62 6c 65 20 61 73 20 77 65 6c 6c 2e 20 20 2a  able as well.  *
a100: 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 61 64  /.        int ad
a110: 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  dr = sqlite3Vdbe
a120: 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 20 2b  CurrentAddr(v) +
a130: 20 34 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   4;.        sqli
a140: 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74  te3VdbeAddOp4Int
a150: 28 76 2c 20 4f 50 5f 46 6f 75 6e 64 2c 20 69 50  (v, OP_Found, iP
a160: 61 72 6d 2b 31 2c 20 61 64 64 72 2c 20 72 31 2c  arm+1, addr, r1,
a170: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62   0);.        Vdb
a180: 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
a190: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
a1a0: 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50  eAddOp4Int(v, OP
a1b0: 5f 49 64 78 49 6e 73 65 72 74 2c 20 69 50 61 72  _IdxInsert, iPar
a1c0: 6d 2b 31 2c 20 72 31 2c 72 65 67 52 65 73 75 6c  m+1, r1,regResul
a1d0: 74 2c 6e 52 65 73 75 6c 74 43 6f 6c 29 3b 0a 20  t,nResultCol);. 
a1e0: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
a1f0: 53 6f 72 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20  Sort==0 );.     
a200: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20   }.#endif.      
a210: 69 66 28 20 70 53 6f 72 74 20 29 7b 0a 20 20 20  if( pSort ){.   
a220: 20 20 20 20 20 61 73 73 65 72 74 28 20 72 65 67       assert( reg
a230: 52 65 73 75 6c 74 3d 3d 72 65 67 4f 72 69 67 20  Result==regOrig 
a240: 29 3b 0a 20 20 20 20 20 20 20 20 70 75 73 68 4f  );.        pushO
a250: 6e 74 6f 53 6f 72 74 65 72 28 70 50 61 72 73 65  ntoSorter(pParse
a260: 2c 20 70 53 6f 72 74 2c 20 70 2c 20 72 31 2b 6e  , pSort, p, r1+n
a270: 50 72 65 66 69 78 52 65 67 2c 20 72 65 67 4f 72  PrefixReg, regOr
a280: 69 67 2c 20 31 2c 20 6e 50 72 65 66 69 78 52 65  ig, 1, nPrefixRe
a290: 67 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  g);.      }else{
a2a0: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72 32 20  .        int r2 
a2b0: 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
a2c0: 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20  Reg(pParse);.   
a2d0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
a2e0: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 77  AddOp2(v, OP_New
a2f0: 52 6f 77 69 64 2c 20 69 50 61 72 6d 2c 20 72 32  Rowid, iParm, r2
a300: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
a310: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
a320: 4f 50 5f 49 6e 73 65 72 74 2c 20 69 50 61 72 6d  OP_Insert, iParm
a330: 2c 20 72 31 2c 20 72 32 29 3b 0a 20 20 20 20 20  , r1, r2);.     
a340: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
a350: 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41 47  angeP5(v, OPFLAG
a360: 5f 41 50 50 45 4e 44 29 3b 0a 20 20 20 20 20 20  _APPEND);.      
a370: 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
a380: 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
a390: 72 32 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  r2);.      }.   
a3a0: 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
a3b0: 65 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73  eTempRange(pPars
a3c0: 65 2c 20 72 31 2c 20 6e 50 72 65 66 69 78 52 65  e, r1, nPrefixRe
a3d0: 67 2b 31 29 3b 0a 20 20 20 20 20 20 62 72 65 61  g+1);.      brea
a3e0: 6b 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 6e 64 65  k;.    }..#ifnde
a3f0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  f SQLITE_OMIT_SU
a400: 42 51 55 45 52 59 0a 20 20 20 20 2f 2a 20 49 66  BQUERY.    /* If
a410: 20 77 65 20 61 72 65 20 63 72 65 61 74 69 6e 67   we are creating
a420: 20 61 20 73 65 74 20 66 6f 72 20 61 6e 20 22 65   a set for an "e
a430: 78 70 72 20 49 4e 20 28 53 45 4c 45 43 54 20 2e  xpr IN (SELECT .
a440: 2e 2e 29 22 20 63 6f 6e 73 74 72 75 63 74 2c 0a  ..)" construct,.
a450: 20 20 20 20 2a 2a 20 74 68 65 6e 20 74 68 65 72      ** then ther
a460: 65 20 73 68 6f 75 6c 64 20 62 65 20 61 20 73 69  e should be a si
a470: 6e 67 6c 65 20 69 74 65 6d 20 6f 6e 20 74 68 65  ngle item on the
a480: 20 73 74 61 63 6b 2e 20 20 57 72 69 74 65 20 74   stack.  Write t
a490: 68 69 73 0a 20 20 20 20 2a 2a 20 69 74 65 6d 20  his.    ** item 
a4a0: 69 6e 74 6f 20 74 68 65 20 73 65 74 20 74 61 62  into the set tab
a4b0: 6c 65 20 77 69 74 68 20 62 6f 67 75 73 20 64 61  le with bogus da
a4c0: 74 61 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63  ta..    */.    c
a4d0: 61 73 65 20 53 52 54 5f 53 65 74 3a 20 7b 0a 20  ase SRT_Set: {. 
a4e0: 20 20 20 20 20 69 66 28 20 70 53 6f 72 74 20 29       if( pSort )
a4f0: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 74 20  {.        /* At 
a500: 66 69 72 73 74 20 67 6c 61 6e 63 65 20 79 6f 75  first glance you
a510: 20 77 6f 75 6c 64 20 74 68 69 6e 6b 20 77 65 20   would think we 
a520: 63 6f 75 6c 64 20 6f 70 74 69 6d 69 7a 65 20 6f  could optimize o
a530: 75 74 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a  ut the.        *
a540: 2a 20 4f 52 44 45 52 20 42 59 20 69 6e 20 74 68  * ORDER BY in th
a550: 69 73 20 63 61 73 65 20 73 69 6e 63 65 20 74 68  is case since th
a560: 65 20 6f 72 64 65 72 20 6f 66 20 65 6e 74 72 69  e order of entri
a570: 65 73 20 69 6e 20 74 68 65 20 73 65 74 0a 20 20  es in the set.  
a580: 20 20 20 20 20 20 2a 2a 20 64 6f 65 73 20 6e 6f        ** does no
a590: 74 20 6d 61 74 74 65 72 2e 20 20 42 75 74 20 74  t matter.  But t
a5a0: 68 65 72 65 20 6d 69 67 68 74 20 62 65 20 61 20  here might be a 
a5b0: 4c 49 4d 49 54 20 63 6c 61 75 73 65 2c 20 69 6e  LIMIT clause, in
a5c0: 20 77 68 69 63 68 0a 20 20 20 20 20 20 20 20 2a   which.        *
a5d0: 2a 20 63 61 73 65 20 74 68 65 20 6f 72 64 65 72  * case the order
a5e0: 20 64 6f 65 73 20 6d 61 74 74 65 72 20 2a 2f 0a   does matter */.
a5f0: 20 20 20 20 20 20 20 20 70 75 73 68 4f 6e 74 6f          pushOnto
a600: 53 6f 72 74 65 72 28 0a 20 20 20 20 20 20 20 20  Sorter(.        
a610: 20 20 20 20 70 50 61 72 73 65 2c 20 70 53 6f 72      pParse, pSor
a620: 74 2c 20 70 2c 20 72 65 67 52 65 73 75 6c 74 2c  t, p, regResult,
a630: 20 72 65 67 4f 72 69 67 2c 20 6e 52 65 73 75 6c   regOrig, nResul
a640: 74 43 6f 6c 2c 20 6e 50 72 65 66 69 78 52 65 67  tCol, nPrefixReg
a650: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
a660: 20 20 20 20 20 20 20 20 69 6e 74 20 72 31 20 3d          int r1 =
a670: 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
a680: 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  eg(pParse);.    
a690: 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
a6a0: 74 65 33 53 74 72 6c 65 6e 33 30 28 70 44 65 73  te3Strlen30(pDes
a6b0: 74 2d 3e 7a 41 66 66 53 64 73 74 29 3d 3d 6e 52  t->zAffSdst)==nR
a6c0: 65 73 75 6c 74 43 6f 6c 20 29 3b 0a 20 20 20 20  esultCol );.    
a6d0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
a6e0: 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4d 61 6b 65  ddOp4(v, OP_Make
a6f0: 52 65 63 6f 72 64 2c 20 72 65 67 52 65 73 75 6c  Record, regResul
a700: 74 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 2c 20 0a  t, nResultCol, .
a710: 20 20 20 20 20 20 20 20 20 20 20 20 72 31 2c 20              r1, 
a720: 70 44 65 73 74 2d 3e 7a 41 66 66 53 64 73 74 2c  pDest->zAffSdst,
a730: 20 6e 52 65 73 75 6c 74 43 6f 6c 29 3b 0a 20 20   nResultCol);.  
a740: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
a750: 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50  eAddOp4Int(v, OP
a760: 5f 49 64 78 49 6e 73 65 72 74 2c 20 69 50 61 72  _IdxInsert, iPar
a770: 6d 2c 20 72 31 2c 20 72 65 67 52 65 73 75 6c 74  m, r1, regResult
a780: 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 29 3b 0a 20  , nResultCol);. 
a790: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65         sqlite3Re
a7a0: 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
a7b0: 72 73 65 2c 20 72 31 29 3b 0a 20 20 20 20 20 20  rse, r1);.      
a7c0: 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
a7d0: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20     }..    /* If 
a7e0: 61 6e 79 20 72 6f 77 20 65 78 69 73 74 20 69 6e  any row exist in
a7f0: 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 2c   the result set,
a800: 20 72 65 63 6f 72 64 20 74 68 61 74 20 66 61 63   record that fac
a810: 74 20 61 6e 64 20 61 62 6f 72 74 2e 0a 20 20 20  t and abort..   
a820: 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54   */.    case SRT
a830: 5f 45 78 69 73 74 73 3a 20 7b 0a 20 20 20 20 20  _Exists: {.     
a840: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
a850: 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
a860: 2c 20 31 2c 20 69 50 61 72 6d 29 3b 0a 20 20 20  , 1, iParm);.   
a870: 20 20 20 2f 2a 20 54 68 65 20 4c 49 4d 49 54 20     /* The LIMIT 
a880: 63 6c 61 75 73 65 20 77 69 6c 6c 20 74 65 72 6d  clause will term
a890: 69 6e 61 74 65 20 74 68 65 20 6c 6f 6f 70 20 66  inate the loop f
a8a0: 6f 72 20 75 73 20 2a 2f 0a 20 20 20 20 20 20 62  or us */.      b
a8b0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  reak;.    }..   
a8c0: 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61   /* If this is a
a8d0: 20 73 63 61 6c 61 72 20 73 65 6c 65 63 74 20 74   scalar select t
a8e0: 68 61 74 20 69 73 20 70 61 72 74 20 6f 66 20 61  hat is part of a
a8f0: 6e 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 74 68  n expression, th
a900: 65 6e 0a 20 20 20 20 2a 2a 20 73 74 6f 72 65 20  en.    ** store 
a910: 74 68 65 20 72 65 73 75 6c 74 73 20 69 6e 20 74  the results in t
a920: 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 20 6d  he appropriate m
a930: 65 6d 6f 72 79 20 63 65 6c 6c 20 6f 72 20 61 72  emory cell or ar
a940: 72 61 79 20 6f 66 20 0a 20 20 20 20 2a 2a 20 6d  ray of .    ** m
a950: 65 6d 6f 72 79 20 63 65 6c 6c 73 20 61 6e 64 20  emory cells and 
a960: 62 72 65 61 6b 20 6f 75 74 20 6f 66 20 74 68 65  break out of the
a970: 20 73 63 61 6e 20 6c 6f 6f 70 2e 0a 20 20 20 20   scan loop..    
a980: 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f  */.    case SRT_
a990: 4d 65 6d 3a 20 7b 0a 20 20 20 20 20 20 69 66 28  Mem: {.      if(
a9a0: 20 70 53 6f 72 74 20 29 7b 0a 20 20 20 20 20 20   pSort ){.      
a9b0: 20 20 61 73 73 65 72 74 28 20 6e 52 65 73 75 6c    assert( nResul
a9c0: 74 43 6f 6c 3c 3d 70 44 65 73 74 2d 3e 6e 53 64  tCol<=pDest->nSd
a9d0: 73 74 20 29 3b 0a 20 20 20 20 20 20 20 20 70 75  st );.        pu
a9e0: 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28 0a 20 20  shOntoSorter(.  
a9f0: 20 20 20 20 20 20 20 20 20 20 70 50 61 72 73 65            pParse
aa00: 2c 20 70 53 6f 72 74 2c 20 70 2c 20 72 65 67 52  , pSort, p, regR
aa10: 65 73 75 6c 74 2c 20 72 65 67 4f 72 69 67 2c 20  esult, regOrig, 
aa20: 6e 52 65 73 75 6c 74 43 6f 6c 2c 20 6e 50 72 65  nResultCol, nPre
aa30: 66 69 78 52 65 67 29 3b 0a 20 20 20 20 20 20 7d  fixReg);.      }
aa40: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61 73  else{.        as
aa50: 73 65 72 74 28 20 6e 52 65 73 75 6c 74 43 6f 6c  sert( nResultCol
aa60: 3d 3d 70 44 65 73 74 2d 3e 6e 53 64 73 74 20 29  ==pDest->nSdst )
aa70: 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
aa80: 28 20 72 65 67 52 65 73 75 6c 74 3d 3d 69 50 61  ( regResult==iPa
aa90: 72 6d 20 29 3b 0a 20 20 20 20 20 20 20 20 2f 2a  rm );.        /*
aaa0: 20 54 68 65 20 4c 49 4d 49 54 20 63 6c 61 75 73   The LIMIT claus
aab0: 65 20 77 69 6c 6c 20 6a 75 6d 70 20 6f 75 74 20  e will jump out 
aac0: 6f 66 20 74 68 65 20 6c 6f 6f 70 20 66 6f 72 20  of the loop for 
aad0: 75 73 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20  us */.      }.  
aae0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
aaf0: 0a 23 65 6e 64 69 66 20 2f 2a 20 23 69 66 6e 64  .#endif /* #ifnd
ab00: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
ab10: 55 42 51 55 45 52 59 20 2a 2f 0a 0a 20 20 20 20  UBQUERY */..    
ab20: 63 61 73 65 20 53 52 54 5f 43 6f 72 6f 75 74 69  case SRT_Corouti
ab30: 6e 65 3a 20 20 20 20 20 20 20 2f 2a 20 53 65 6e  ne:       /* Sen
ab40: 64 20 64 61 74 61 20 74 6f 20 61 20 63 6f 2d 72  d data to a co-r
ab50: 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 20 20 63 61  outine */.    ca
ab60: 73 65 20 53 52 54 5f 4f 75 74 70 75 74 3a 20 7b  se SRT_Output: {
ab70: 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
ab80: 6e 20 74 68 65 20 72 65 73 75 6c 74 73 20 2a 2f  n the results */
ab90: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
aba0: 20 65 44 65 73 74 3d 3d 53 52 54 5f 43 6f 72 6f   eDest==SRT_Coro
abb0: 75 74 69 6e 65 20 29 3b 0a 20 20 20 20 20 20 74  utine );.      t
abc0: 65 73 74 63 61 73 65 28 20 65 44 65 73 74 3d 3d  estcase( eDest==
abd0: 53 52 54 5f 4f 75 74 70 75 74 20 29 3b 0a 20 20  SRT_Output );.  
abe0: 20 20 20 20 69 66 28 20 70 53 6f 72 74 20 29 7b      if( pSort ){
abf0: 0a 20 20 20 20 20 20 20 20 70 75 73 68 4f 6e 74  .        pushOnt
ac00: 6f 53 6f 72 74 65 72 28 70 50 61 72 73 65 2c 20  oSorter(pParse, 
ac10: 70 53 6f 72 74 2c 20 70 2c 20 72 65 67 52 65 73  pSort, p, regRes
ac20: 75 6c 74 2c 20 72 65 67 4f 72 69 67 2c 20 6e 52  ult, regOrig, nR
ac30: 65 73 75 6c 74 43 6f 6c 2c 0a 20 20 20 20 20 20  esultCol,.      
ac40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ac50: 20 6e 50 72 65 66 69 78 52 65 67 29 3b 0a 20 20   nPrefixReg);.  
ac60: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 65 44      }else if( eD
ac70: 65 73 74 3d 3d 53 52 54 5f 43 6f 72 6f 75 74 69  est==SRT_Corouti
ac80: 6e 65 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  ne ){.        sq
ac90: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
aca0: 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 70 44 65  v, OP_Yield, pDe
acb0: 73 74 2d 3e 69 53 44 50 61 72 6d 29 3b 0a 20 20  st->iSDParm);.  
acc0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
acd0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
ace0: 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 73 75 6c  dOp2(v, OP_Resul
acf0: 74 52 6f 77 2c 20 72 65 67 52 65 73 75 6c 74 2c  tRow, regResult,
ad00: 20 6e 52 65 73 75 6c 74 43 6f 6c 29 3b 0a 20 20   nResultCol);.  
ad10: 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
ad20: 6b 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 6e 64 65  k;.    }..#ifnde
ad30: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 54  f SQLITE_OMIT_CT
ad40: 45 0a 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74  E.    /* Write t
ad50: 68 65 20 72 65 73 75 6c 74 73 20 69 6e 74 6f 20  he results into 
ad60: 61 20 70 72 69 6f 72 69 74 79 20 71 75 65 75 65  a priority queue
ad70: 20 74 68 61 74 20 69 73 20 6f 72 64 65 72 20 61   that is order a
ad80: 63 63 6f 72 64 69 6e 67 20 74 6f 0a 20 20 20 20  ccording to.    
ad90: 2a 2a 20 70 44 65 73 74 2d 3e 70 4f 72 64 65 72  ** pDest->pOrder
ada0: 42 79 20 28 69 6e 20 70 53 4f 29 2e 20 20 70 44  By (in pSO).  pD
adb0: 65 73 74 2d 3e 69 53 44 50 61 72 6d 20 28 69 6e  est->iSDParm (in
adc0: 20 69 50 61 72 6d 29 20 69 73 20 74 68 65 20 63   iParm) is the c
add0: 75 72 73 6f 72 20 66 6f 72 20 61 6e 0a 20 20 20  ursor for an.   
ade0: 20 2a 2a 20 69 6e 64 65 78 20 77 69 74 68 20 70   ** index with p
adf0: 53 4f 2d 3e 6e 45 78 70 72 2b 32 20 63 6f 6c 75  SO->nExpr+2 colu
ae00: 6d 6e 73 2e 20 20 42 75 69 6c 64 20 61 20 6b 65  mns.  Build a ke
ae10: 79 20 75 73 69 6e 67 20 70 53 4f 20 66 6f 72 20  y using pSO for 
ae20: 74 68 65 20 66 69 72 73 74 0a 20 20 20 20 2a 2a  the first.    **
ae30: 20 70 53 4f 2d 3e 6e 45 78 70 72 20 63 6f 6c 75   pSO->nExpr colu
ae40: 6d 6e 73 2c 20 74 68 65 6e 20 6d 61 6b 65 20 73  mns, then make s
ae50: 75 72 65 20 61 6c 6c 20 6b 65 79 73 20 61 72 65  ure all keys are
ae60: 20 75 6e 69 71 75 65 20 62 79 20 61 64 64 69 6e   unique by addin
ae70: 67 20 61 0a 20 20 20 20 2a 2a 20 66 69 6e 61 6c  g a.    ** final
ae80: 20 4f 50 5f 53 65 71 75 65 6e 63 65 20 63 6f 6c   OP_Sequence col
ae90: 75 6d 6e 2e 20 20 54 68 65 20 6c 61 73 74 20 63  umn.  The last c
aea0: 6f 6c 75 6d 6e 20 69 73 20 74 68 65 20 72 65 63  olumn is the rec
aeb0: 6f 72 64 20 61 73 20 61 20 62 6c 6f 62 2e 0a 20  ord as a blob.. 
aec0: 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53     */.    case S
aed0: 52 54 5f 44 69 73 74 51 75 65 75 65 3a 0a 20 20  RT_DistQueue:.  
aee0: 20 20 63 61 73 65 20 53 52 54 5f 51 75 65 75 65    case SRT_Queue
aef0: 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 4b  : {.      int nK
af00: 65 79 3b 0a 20 20 20 20 20 20 69 6e 74 20 72 31  ey;.      int r1
af10: 2c 20 72 32 2c 20 72 33 3b 0a 20 20 20 20 20 20  , r2, r3;.      
af20: 69 6e 74 20 61 64 64 72 54 65 73 74 20 3d 20 30  int addrTest = 0
af30: 3b 0a 20 20 20 20 20 20 45 78 70 72 4c 69 73 74  ;.      ExprList
af40: 20 2a 70 53 4f 3b 0a 20 20 20 20 20 20 70 53 4f   *pSO;.      pSO
af50: 20 3d 20 70 44 65 73 74 2d 3e 70 4f 72 64 65 72   = pDest->pOrder
af60: 42 79 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  By;.      assert
af70: 28 20 70 53 4f 20 29 3b 0a 20 20 20 20 20 20 6e  ( pSO );.      n
af80: 4b 65 79 20 3d 20 70 53 4f 2d 3e 6e 45 78 70 72  Key = pSO->nExpr
af90: 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c  ;.      r1 = sql
afa0: 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70  ite3GetTempReg(p
afb0: 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 72 32  Parse);.      r2
afc0: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
afd0: 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 6e  pRange(pParse, n
afe0: 4b 65 79 2b 32 29 3b 0a 20 20 20 20 20 20 72 33  Key+2);.      r3
aff0: 20 3d 20 72 32 2b 6e 4b 65 79 2b 31 3b 0a 20 20   = r2+nKey+1;.  
b000: 20 20 20 20 69 66 28 20 65 44 65 73 74 3d 3d 53      if( eDest==S
b010: 52 54 5f 44 69 73 74 51 75 65 75 65 20 29 7b 0a  RT_DistQueue ){.
b020: 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68          /* If th
b030: 65 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 69 73  e destination is
b040: 20 44 69 73 74 51 75 65 75 65 2c 20 74 68 65 6e   DistQueue, then
b050: 20 63 75 72 73 6f 72 20 28 69 50 61 72 6d 2b 31   cursor (iParm+1
b060: 29 20 69 73 20 6f 70 65 6e 0a 20 20 20 20 20 20  ) is open.      
b070: 20 20 2a 2a 20 6f 6e 20 61 20 73 65 63 6f 6e 64    ** on a second
b080: 20 65 70 68 65 6d 65 72 61 6c 20 69 6e 64 65 78   ephemeral index
b090: 20 74 68 61 74 20 68 6f 6c 64 73 20 61 6c 6c 20   that holds all 
b0a0: 76 61 6c 75 65 73 20 65 76 65 72 79 20 70 72 65  values every pre
b0b0: 76 69 6f 75 73 6c 79 0a 20 20 20 20 20 20 20 20  viously.        
b0c0: 2a 2a 20 61 64 64 65 64 20 74 6f 20 74 68 65 20  ** added to the 
b0d0: 71 75 65 75 65 2e 20 2a 2f 0a 20 20 20 20 20 20  queue. */.      
b0e0: 20 20 61 64 64 72 54 65 73 74 20 3d 20 73 71 6c    addrTest = sql
b0f0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e  ite3VdbeAddOp4In
b100: 74 28 76 2c 20 4f 50 5f 46 6f 75 6e 64 2c 20 69  t(v, OP_Found, i
b110: 50 61 72 6d 2b 31 2c 20 30 2c 20 0a 20 20 20 20  Parm+1, 0, .    
b120: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b130: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b140: 20 20 20 20 72 65 67 52 65 73 75 6c 74 2c 20 6e      regResult, n
b150: 52 65 73 75 6c 74 43 6f 6c 29 3b 0a 20 20 20 20  ResultCol);.    
b160: 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
b170: 28 76 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  (v);.      }.   
b180: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
b190: 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52  dOp3(v, OP_MakeR
b1a0: 65 63 6f 72 64 2c 20 72 65 67 52 65 73 75 6c 74  ecord, regResult
b1b0: 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 2c 20 72 33  , nResultCol, r3
b1c0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 65 44 65  );.      if( eDe
b1d0: 73 74 3d 3d 53 52 54 5f 44 69 73 74 51 75 65 75  st==SRT_DistQueu
b1e0: 65 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  e ){.        sql
b1f0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
b200: 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20  , OP_IdxInsert, 
b210: 69 50 61 72 6d 2b 31 2c 20 72 33 29 3b 0a 20 20  iParm+1, r3);.  
b220: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
b230: 65 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46  eChangeP5(v, OPF
b240: 4c 41 47 5f 55 53 45 53 45 45 4b 52 45 53 55 4c  LAG_USESEEKRESUL
b250: 54 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  T);.      }.    
b260: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4b 65    for(i=0; i<nKe
b270: 79 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  y; i++){.       
b280: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
b290: 70 32 28 76 2c 20 4f 50 5f 53 43 6f 70 79 2c 0a  p2(v, OP_SCopy,.
b2a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b2b0: 20 20 20 20 20 20 20 20 20 20 72 65 67 52 65 73            regRes
b2c0: 75 6c 74 20 2b 20 70 53 4f 2d 3e 61 5b 69 5d 2e  ult + pSO->a[i].
b2d0: 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 20  u.x.iOrderByCol 
b2e0: 2d 20 31 2c 0a 20 20 20 20 20 20 20 20 20 20 20  - 1,.           
b2f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
b300: 32 2b 69 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  2+i);.      }.  
b310: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
b320: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 65 71 75  ddOp2(v, OP_Sequ
b330: 65 6e 63 65 2c 20 69 50 61 72 6d 2c 20 72 32 2b  ence, iParm, r2+
b340: 6e 4b 65 79 29 3b 0a 20 20 20 20 20 20 73 71 6c  nKey);.      sql
b350: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
b360: 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c  , OP_MakeRecord,
b370: 20 72 32 2c 20 6e 4b 65 79 2b 32 2c 20 72 31 29   r2, nKey+2, r1)
b380: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
b390: 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20  dbeAddOp4Int(v, 
b3a0: 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 69 50  OP_IdxInsert, iP
b3b0: 61 72 6d 2c 20 72 31 2c 20 72 32 2c 20 6e 4b 65  arm, r1, r2, nKe
b3c0: 79 2b 32 29 3b 0a 20 20 20 20 20 20 69 66 28 20  y+2);.      if( 
b3d0: 61 64 64 72 54 65 73 74 20 29 20 73 71 6c 69 74  addrTest ) sqlit
b3e0: 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
b3f0: 2c 20 61 64 64 72 54 65 73 74 29 3b 0a 20 20 20  , addrTest);.   
b400: 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
b410: 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
b420: 20 72 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69   r1);.      sqli
b430: 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 61  te3ReleaseTempRa
b440: 6e 67 65 28 70 50 61 72 73 65 2c 20 72 32 2c 20  nge(pParse, r2, 
b450: 6e 4b 65 79 2b 32 29 3b 0a 20 20 20 20 20 20 62  nKey+2);.      b
b460: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  reak;.    }.#end
b470: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
b480: 54 5f 43 54 45 20 2a 2f 0a 0a 0a 0a 23 69 66 20  T_CTE */....#if 
b490: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
b4a0: 4f 4d 49 54 5f 54 52 49 47 47 45 52 29 0a 20 20  OMIT_TRIGGER).  
b4b0: 20 20 2f 2a 20 44 69 73 63 61 72 64 20 74 68 65    /* Discard the
b4c0: 20 72 65 73 75 6c 74 73 2e 20 20 54 68 69 73 20   results.  This 
b4d0: 69 73 20 75 73 65 64 20 66 6f 72 20 53 45 4c 45  is used for SELE
b4e0: 43 54 20 73 74 61 74 65 6d 65 6e 74 73 20 69 6e  CT statements in
b4f0: 73 69 64 65 0a 20 20 20 20 2a 2a 20 74 68 65 20  side.    ** the 
b500: 62 6f 64 79 20 6f 66 20 61 20 54 52 49 47 47 45  body of a TRIGGE
b510: 52 2e 20 20 54 68 65 20 70 75 72 70 6f 73 65 20  R.  The purpose 
b520: 6f 66 20 73 75 63 68 20 73 65 6c 65 63 74 73 20  of such selects 
b530: 69 73 20 74 6f 20 63 61 6c 6c 0a 20 20 20 20 2a  is to call.    *
b540: 2a 20 75 73 65 72 2d 64 65 66 69 6e 65 64 20 66  * user-defined f
b550: 75 6e 63 74 69 6f 6e 73 20 74 68 61 74 20 68 61  unctions that ha
b560: 76 65 20 73 69 64 65 20 65 66 66 65 63 74 73 2e  ve side effects.
b570: 20 20 57 65 20 64 6f 20 6e 6f 74 20 63 61 72 65    We do not care
b580: 0a 20 20 20 20 2a 2a 20 61 62 6f 75 74 20 74 68  .    ** about th
b590: 65 20 61 63 74 75 61 6c 20 72 65 73 75 6c 74 73  e actual results
b5a0: 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74 2e 0a   of the select..
b5b0: 20 20 20 20 2a 2f 0a 20 20 20 20 64 65 66 61 75      */.    defau
b5c0: 6c 74 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65  lt: {.      asse
b5d0: 72 74 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 44  rt( eDest==SRT_D
b5e0: 69 73 63 61 72 64 20 29 3b 0a 20 20 20 20 20 20  iscard );.      
b5f0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e  break;.    }.#en
b600: 64 69 66 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4a 75  dif.  }..  /* Ju
b610: 6d 70 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66  mp to the end of
b620: 20 74 68 65 20 6c 6f 6f 70 20 69 66 20 74 68 65   the loop if the
b630: 20 4c 49 4d 49 54 20 69 73 20 72 65 61 63 68 65   LIMIT is reache
b640: 64 2e 20 20 45 78 63 65 70 74 2c 20 69 66 0a 20  d.  Except, if. 
b650: 20 2a 2a 20 74 68 65 72 65 20 69 73 20 61 20 73   ** there is a s
b660: 6f 72 74 65 72 2c 20 69 6e 20 77 68 69 63 68 20  orter, in which 
b670: 63 61 73 65 20 74 68 65 20 73 6f 72 74 65 72 20  case the sorter 
b680: 68 61 73 20 61 6c 72 65 61 64 79 20 6c 69 6d 69  has already limi
b690: 74 65 64 0a 20 20 2a 2a 20 74 68 65 20 6f 75 74  ted.  ** the out
b6a0: 70 75 74 20 66 6f 72 20 75 73 2e 0a 20 20 2a 2f  put for us..  */
b6b0: 0a 20 20 69 66 28 20 70 53 6f 72 74 3d 3d 30 20  .  if( pSort==0 
b6c0: 26 26 20 70 2d 3e 69 4c 69 6d 69 74 20 29 7b 0a  && p->iLimit ){.
b6d0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
b6e0: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 44 65 63 72  ddOp2(v, OP_Decr
b6f0: 4a 75 6d 70 5a 65 72 6f 2c 20 70 2d 3e 69 4c 69  JumpZero, p->iLi
b700: 6d 69 74 2c 20 69 42 72 65 61 6b 29 3b 20 56 64  mit, iBreak); Vd
b710: 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
b720: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f   }.}../*.** Allo
b730: 63 61 74 65 20 61 20 4b 65 79 49 6e 66 6f 20 6f  cate a KeyInfo o
b740: 62 6a 65 63 74 20 73 75 66 66 69 63 69 65 6e 74  bject sufficient
b750: 20 66 6f 72 20 61 6e 20 69 6e 64 65 78 20 6f 66   for an index of
b760: 20 4e 20 6b 65 79 20 63 6f 6c 75 6d 6e 73 20 61   N key columns a
b770: 6e 64 0a 2a 2a 20 58 20 65 78 74 72 61 20 63 6f  nd.** X extra co
b780: 6c 75 6d 6e 73 2e 0a 2a 2f 0a 4b 65 79 49 6e 66  lumns..*/.KeyInf
b790: 6f 20 2a 73 71 6c 69 74 65 33 4b 65 79 49 6e 66  o *sqlite3KeyInf
b7a0: 6f 41 6c 6c 6f 63 28 73 71 6c 69 74 65 33 20 2a  oAlloc(sqlite3 *
b7b0: 64 62 2c 20 69 6e 74 20 4e 2c 20 69 6e 74 20 58  db, int N, int X
b7c0: 29 7b 0a 20 20 69 6e 74 20 6e 45 78 74 72 61 20  ){.  int nExtra 
b7d0: 3d 20 28 4e 2b 58 29 2a 28 73 69 7a 65 6f 66 28  = (N+X)*(sizeof(
b7e0: 43 6f 6c 6c 53 65 71 2a 29 2b 31 29 20 2d 20 73  CollSeq*)+1) - s
b7f0: 69 7a 65 6f 66 28 43 6f 6c 6c 53 65 71 2a 29 3b  izeof(CollSeq*);
b800: 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 20 3d 20  .  KeyInfo *p = 
b810: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52  sqlite3DbMallocR
b820: 61 77 4e 4e 28 64 62 2c 20 73 69 7a 65 6f 66 28  awNN(db, sizeof(
b830: 4b 65 79 49 6e 66 6f 29 20 2b 20 6e 45 78 74 72  KeyInfo) + nExtr
b840: 61 29 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20  a);.  if( p ){. 
b850: 20 20 20 70 2d 3e 61 53 6f 72 74 46 6c 61 67 73     p->aSortFlags
b860: 20 3d 20 28 75 38 2a 29 26 70 2d 3e 61 43 6f 6c   = (u8*)&p->aCol
b870: 6c 5b 4e 2b 58 5d 3b 0a 20 20 20 20 70 2d 3e 6e  l[N+X];.    p->n
b880: 4b 65 79 46 69 65 6c 64 20 3d 20 28 75 31 36 29  KeyField = (u16)
b890: 4e 3b 0a 20 20 20 20 70 2d 3e 6e 41 6c 6c 46 69  N;.    p->nAllFi
b8a0: 65 6c 64 20 3d 20 28 75 31 36 29 28 4e 2b 58 29  eld = (u16)(N+X)
b8b0: 3b 0a 20 20 20 20 70 2d 3e 65 6e 63 20 3d 20 45  ;.    p->enc = E
b8c0: 4e 43 28 64 62 29 3b 0a 20 20 20 20 70 2d 3e 64  NC(db);.    p->d
b8d0: 62 20 3d 20 64 62 3b 0a 20 20 20 20 70 2d 3e 6e  b = db;.    p->n
b8e0: 52 65 66 20 3d 20 31 3b 0a 20 20 20 20 6d 65 6d  Ref = 1;.    mem
b8f0: 73 65 74 28 26 70 5b 31 5d 2c 20 30 2c 20 6e 45  set(&p[1], 0, nE
b900: 78 74 72 61 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  xtra);.  }else{.
b910: 20 20 20 20 73 71 6c 69 74 65 33 4f 6f 6d 46 61      sqlite3OomFa
b920: 75 6c 74 28 64 62 29 3b 0a 20 20 7d 0a 20 20 72  ult(db);.  }.  r
b930: 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn p;.}../*.*
b940: 2a 20 44 65 61 6c 6c 6f 63 61 74 65 20 61 20 4b  * Deallocate a K
b950: 65 79 49 6e 66 6f 20 6f 62 6a 65 63 74 0a 2a 2f  eyInfo object.*/
b960: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 4b 65 79  .void sqlite3Key
b970: 49 6e 66 6f 55 6e 72 65 66 28 4b 65 79 49 6e 66  InfoUnref(KeyInf
b980: 6f 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 20 29  o *p){.  if( p )
b990: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  {.    assert( p-
b9a0: 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20 20 20 70  >nRef>0 );.    p
b9b0: 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 20 20 69 66  ->nRef--;.    if
b9c0: 28 20 70 2d 3e 6e 52 65 66 3d 3d 30 20 29 20 73  ( p->nRef==0 ) s
b9d0: 71 6c 69 74 65 33 44 62 46 72 65 65 4e 4e 28 70  qlite3DbFreeNN(p
b9e0: 2d 3e 64 62 2c 20 70 29 3b 0a 20 20 7d 0a 7d 0a  ->db, p);.  }.}.
b9f0: 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 61 20 6e 65  ./*.** Make a ne
ba00: 77 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 4b  w pointer to a K
ba10: 65 79 49 6e 66 6f 20 6f 62 6a 65 63 74 0a 2a 2f  eyInfo object.*/
ba20: 0a 4b 65 79 49 6e 66 6f 20 2a 73 71 6c 69 74 65  .KeyInfo *sqlite
ba30: 33 4b 65 79 49 6e 66 6f 52 65 66 28 4b 65 79 49  3KeyInfoRef(KeyI
ba40: 6e 66 6f 20 2a 70 29 7b 0a 20 20 69 66 28 20 70  nfo *p){.  if( p
ba50: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
ba60: 70 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20 20  p->nRef>0 );.   
ba70: 20 70 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 7d 0a   p->nRef++;.  }.
ba80: 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 23    return p;.}..#
ba90: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
baa0: 55 47 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  UG./*.** Return 
bab0: 54 52 55 45 20 69 66 20 61 20 4b 65 79 49 6e 66  TRUE if a KeyInf
bac0: 6f 20 6f 62 6a 65 63 74 20 63 61 6e 20 62 65 20  o object can be 
bad0: 63 68 61 6e 67 65 2e 20 20 54 68 65 20 4b 65 79  change.  The Key
bae0: 49 6e 66 6f 20 6f 62 6a 65 63 74 0a 2a 2a 20 63  Info object.** c
baf0: 61 6e 20 6f 6e 6c 79 20 62 65 20 63 68 61 6e 67  an only be chang
bb00: 65 64 20 69 66 20 74 68 69 73 20 69 73 20 6a 75  ed if this is ju
bb10: 73 74 20 61 20 73 69 6e 67 6c 65 20 72 65 66 65  st a single refe
bb20: 72 65 6e 63 65 20 74 6f 20 74 68 65 20 6f 62 6a  rence to the obj
bb30: 65 63 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ect..**.** This 
bb40: 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20  routine is used 
bb50: 6f 6e 6c 79 20 69 6e 73 69 64 65 20 6f 66 20 61  only inside of a
bb60: 73 73 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e  ssert() statemen
bb70: 74 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ts..*/.int sqlit
bb80: 65 33 4b 65 79 49 6e 66 6f 49 73 57 72 69 74 65  e3KeyInfoIsWrite
bb90: 61 62 6c 65 28 4b 65 79 49 6e 66 6f 20 2a 70 29  able(KeyInfo *p)
bba0: 7b 20 72 65 74 75 72 6e 20 70 2d 3e 6e 52 65 66  { return p->nRef
bbb0: 3d 3d 31 3b 20 7d 0a 23 65 6e 64 69 66 20 2f 2a  ==1; }.#endif /*
bbc0: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20 2a 2f   SQLITE_DEBUG */
bbd0: 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 6e  ../*.** Given an
bbe0: 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74   expression list
bbf0: 2c 20 67 65 6e 65 72 61 74 65 20 61 20 4b 65 79  , generate a Key
bc00: 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 74  Info structure t
bc10: 68 61 74 20 72 65 63 6f 72 64 73 0a 2a 2a 20 74  hat records.** t
bc20: 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71  he collating seq
bc30: 75 65 6e 63 65 20 66 6f 72 20 65 61 63 68 20 65  uence for each e
bc40: 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 74 68 61  xpression in tha
bc50: 74 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73  t expression lis
bc60: 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  t..**.** If the 
bc70: 45 78 70 72 4c 69 73 74 20 69 73 20 61 6e 20 4f  ExprList is an O
bc80: 52 44 45 52 20 42 59 20 6f 72 20 47 52 4f 55 50  RDER BY or GROUP
bc90: 20 42 59 20 63 6c 61 75 73 65 20 74 68 65 6e 20   BY clause then 
bca0: 74 68 65 20 72 65 73 75 6c 74 69 6e 67 0a 2a 2a  the resulting.**
bcb0: 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75   KeyInfo structu
bcc0: 72 65 20 69 73 20 61 70 70 72 6f 70 72 69 61 74  re is appropriat
bcd0: 65 20 66 6f 72 20 69 6e 69 74 69 61 6c 69 7a 69  e for initializi
bce0: 6e 67 20 61 20 76 69 72 74 75 61 6c 20 69 6e 64  ng a virtual ind
bcf0: 65 78 20 74 6f 0a 2a 2a 20 69 6d 70 6c 65 6d 65  ex to.** impleme
bd00: 6e 74 20 74 68 61 74 20 63 6c 61 75 73 65 2e 20  nt that clause. 
bd10: 20 49 66 20 74 68 65 20 45 78 70 72 4c 69 73 74   If the ExprList
bd20: 20 69 73 20 74 68 65 20 72 65 73 75 6c 74 20 73   is the result s
bd30: 65 74 20 6f 66 20 61 20 53 45 4c 45 43 54 0a 2a  et of a SELECT.*
bd40: 2a 20 74 68 65 6e 20 74 68 65 20 4b 65 79 49 6e  * then the KeyIn
bd50: 66 6f 20 73 74 72 75 63 74 75 72 65 20 69 73 20  fo structure is 
bd60: 61 70 70 72 6f 70 72 69 61 74 65 20 66 6f 72 20  appropriate for 
bd70: 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20 61 20 76  initializing a v
bd80: 69 72 74 75 61 6c 0a 2a 2a 20 69 6e 64 65 78 20  irtual.** index 
bd90: 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 61 20 44  to implement a D
bda0: 49 53 54 49 4e 43 54 20 74 65 73 74 2e 0a 2a 2a  ISTINCT test..**
bdb0: 0a 2a 2a 20 53 70 61 63 65 20 74 6f 20 68 6f 6c  .** Space to hol
bdc0: 64 20 74 68 65 20 4b 65 79 49 6e 66 6f 20 73 74  d the KeyInfo st
bdd0: 72 75 63 74 75 72 65 20 69 73 20 6f 62 74 61 69  ructure is obtai
bde0: 6e 65 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 2e  ned from malloc.
bdf0: 20 20 54 68 65 20 63 61 6c 6c 69 6e 67 0a 2a 2a    The calling.**
be00: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 72 65 73   function is res
be10: 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 73 65 65  ponsible for see
be20: 69 6e 67 20 74 68 61 74 20 74 68 69 73 20 73 74  ing that this st
be30: 72 75 63 74 75 72 65 20 69 73 20 65 76 65 6e 74  ructure is event
be40: 75 61 6c 6c 79 0a 2a 2a 20 66 72 65 65 64 2e 0a  ually.** freed..
be50: 2a 2f 0a 4b 65 79 49 6e 66 6f 20 2a 73 71 6c 69  */.KeyInfo *sqli
be60: 74 65 33 4b 65 79 49 6e 66 6f 46 72 6f 6d 45 78  te3KeyInfoFromEx
be70: 70 72 4c 69 73 74 28 0a 20 20 50 61 72 73 65 20  prList(.  Parse 
be80: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 2f  *pParse,       /
be90: 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
bea0: 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  t */.  ExprList 
beb0: 2a 70 4c 69 73 74 2c 20 20 20 20 20 2f 2a 20 46  *pList,     /* F
bec0: 6f 72 6d 20 74 68 65 20 4b 65 79 49 6e 66 6f 20  orm the KeyInfo 
bed0: 6f 62 6a 65 63 74 20 66 72 6f 6d 20 74 68 69 73  object from this
bee0: 20 45 78 70 72 4c 69 73 74 20 2a 2f 0a 20 20 69   ExprList */.  i
bef0: 6e 74 20 69 53 74 61 72 74 2c 20 20 20 20 20 20  nt iStart,      
bf00: 20 20 20 20 2f 2a 20 42 65 67 69 6e 20 77 69 74      /* Begin wit
bf10: 68 20 74 68 69 73 20 63 6f 6c 75 6d 6e 20 6f 66  h this column of
bf20: 20 70 4c 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20   pList */.  int 
bf30: 6e 45 78 74 72 61 20 20 20 20 20 20 20 20 20 20  nExtra          
bf40: 20 2f 2a 20 41 64 64 20 74 68 69 73 20 6d 61 6e   /* Add this man
bf50: 79 20 65 78 74 72 61 20 63 6f 6c 75 6d 6e 73 20  y extra columns 
bf60: 74 6f 20 74 68 65 20 65 6e 64 20 2a 2f 0a 29 7b  to the end */.){
bf70: 0a 20 20 69 6e 74 20 6e 45 78 70 72 3b 0a 20 20  .  int nExpr;.  
bf80: 4b 65 79 49 6e 66 6f 20 2a 70 49 6e 66 6f 3b 0a  KeyInfo *pInfo;.
bf90: 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
bfa0: 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20  t_item *pItem;. 
bfb0: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
bfc0: 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74  Parse->db;.  int
bfd0: 20 69 3b 0a 0a 20 20 6e 45 78 70 72 20 3d 20 70   i;..  nExpr = p
bfe0: 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 70  List->nExpr;.  p
bff0: 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 4b 65  Info = sqlite3Ke
c000: 79 49 6e 66 6f 41 6c 6c 6f 63 28 64 62 2c 20 6e  yInfoAlloc(db, n
c010: 45 78 70 72 2d 69 53 74 61 72 74 2c 20 6e 45 78  Expr-iStart, nEx
c020: 74 72 61 2b 31 29 3b 0a 20 20 69 66 28 20 70 49  tra+1);.  if( pI
c030: 6e 66 6f 20 29 7b 0a 20 20 20 20 61 73 73 65 72  nfo ){.    asser
c040: 74 28 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66  t( sqlite3KeyInf
c050: 6f 49 73 57 72 69 74 65 61 62 6c 65 28 70 49 6e  oIsWriteable(pIn
c060: 66 6f 29 20 29 3b 0a 20 20 20 20 66 6f 72 28 69  fo) );.    for(i
c070: 3d 69 53 74 61 72 74 2c 20 70 49 74 65 6d 3d 70  =iStart, pItem=p
c080: 4c 69 73 74 2d 3e 61 2b 69 53 74 61 72 74 3b 20  List->a+iStart; 
c090: 69 3c 6e 45 78 70 72 3b 20 69 2b 2b 2c 20 70 49  i<nExpr; i++, pI
c0a0: 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 70 49  tem++){.      pI
c0b0: 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 69 2d 69 53 74  nfo->aColl[i-iSt
c0c0: 61 72 74 5d 20 3d 20 73 71 6c 69 74 65 33 45 78  art] = sqlite3Ex
c0d0: 70 72 4e 4e 43 6f 6c 6c 53 65 71 28 70 50 61 72  prNNCollSeq(pPar
c0e0: 73 65 2c 20 70 49 74 65 6d 2d 3e 70 45 78 70 72  se, pItem->pExpr
c0f0: 29 3b 0a 20 20 20 20 20 20 70 49 6e 66 6f 2d 3e  );.      pInfo->
c100: 61 53 6f 72 74 46 6c 61 67 73 5b 69 2d 69 53 74  aSortFlags[i-iSt
c110: 61 72 74 5d 20 3d 20 70 49 74 65 6d 2d 3e 73 6f  art] = pItem->so
c120: 72 74 46 6c 61 67 73 3b 0a 20 20 20 20 7d 0a 20  rtFlags;.    }. 
c130: 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 49 6e 66   }.  return pInf
c140: 6f 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4e 61 6d 65  o;.}../*.** Name
c150: 20 6f 66 20 74 68 65 20 63 6f 6e 6e 65 63 74 69   of the connecti
c160: 6f 6e 20 6f 70 65 72 61 74 6f 72 2c 20 75 73 65  on operator, use
c170: 64 20 66 6f 72 20 65 72 72 6f 72 20 6d 65 73 73  d for error mess
c180: 61 67 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ages..*/.static 
c190: 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 65 6c 65  const char *sele
c1a0: 63 74 4f 70 4e 61 6d 65 28 69 6e 74 20 69 64 29  ctOpName(int id)
c1b0: 7b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20 73  {.  char *z;.  s
c1c0: 77 69 74 63 68 28 20 69 64 20 29 7b 0a 20 20 20  witch( id ){.   
c1d0: 20 63 61 73 65 20 54 4b 5f 41 4c 4c 3a 20 20 20   case TK_ALL:   
c1e0: 20 20 20 20 7a 20 3d 20 22 55 4e 49 4f 4e 20 41      z = "UNION A
c1f0: 4c 4c 22 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20  LL";   break;.  
c200: 20 20 63 61 73 65 20 54 4b 5f 49 4e 54 45 52 53    case TK_INTERS
c210: 45 43 54 3a 20 7a 20 3d 20 22 49 4e 54 45 52 53  ECT: z = "INTERS
c220: 45 43 54 22 3b 20 20 20 62 72 65 61 6b 3b 0a 20  ECT";   break;. 
c230: 20 20 20 63 61 73 65 20 54 4b 5f 45 58 43 45 50     case TK_EXCEP
c240: 54 3a 20 20 20 20 7a 20 3d 20 22 45 58 43 45 50  T:    z = "EXCEP
c250: 54 22 3b 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  T";      break;.
c260: 20 20 20 20 64 65 66 61 75 6c 74 3a 20 20 20 20      default:    
c270: 20 20 20 20 20 20 20 7a 20 3d 20 22 55 4e 49 4f         z = "UNIO
c280: 4e 22 3b 20 20 20 20 20 20 20 62 72 65 61 6b 3b  N";       break;
c290: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 3b  .  }.  return z;
c2a0: 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
c2b0: 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a  TE_OMIT_EXPLAIN.
c2c0: 2f 2a 0a 2a 2a 20 55 6e 6c 65 73 73 20 61 6e 20  /*.** Unless an 
c2d0: 22 45 58 50 4c 41 49 4e 20 51 55 45 52 59 20 50  "EXPLAIN QUERY P
c2e0: 4c 41 4e 22 20 63 6f 6d 6d 61 6e 64 20 69 73 20  LAN" command is 
c2f0: 62 65 69 6e 67 20 70 72 6f 63 65 73 73 65 64 2c  being processed,
c300: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a   this function.*
c310: 2a 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 4f 74  * is a no-op. Ot
c320: 68 65 72 77 69 73 65 2c 20 69 74 20 61 64 64 73  herwise, it adds
c330: 20 61 20 73 69 6e 67 6c 65 20 72 6f 77 20 6f 66   a single row of
c340: 20 6f 75 74 70 75 74 20 74 6f 20 74 68 65 20 45   output to the E
c350: 51 50 20 72 65 73 75 6c 74 2c 0a 2a 2a 20 77 68  QP result,.** wh
c360: 65 72 65 20 74 68 65 20 63 61 70 74 69 6f 6e 20  ere the caption 
c370: 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a  is of the form:.
c380: 2a 2a 0a 2a 2a 20 20 20 22 55 53 45 20 54 45 4d  **.**   "USE TEM
c390: 50 20 42 2d 54 52 45 45 20 46 4f 52 20 78 78 78  P B-TREE FOR xxx
c3a0: 22 0a 2a 2a 0a 2a 2a 20 77 68 65 72 65 20 78 78  ".**.** where xx
c3b0: 78 20 69 73 20 6f 6e 65 20 6f 66 20 22 44 49 53  x is one of "DIS
c3c0: 54 49 4e 43 54 22 2c 20 22 4f 52 44 45 52 20 42  TINCT", "ORDER B
c3d0: 59 22 20 6f 72 20 22 47 52 4f 55 50 20 42 59 22  Y" or "GROUP BY"
c3e0: 2e 20 45 78 61 63 74 6c 79 20 77 68 69 63 68 0a  . Exactly which.
c3f0: 2a 2a 20 69 73 20 64 65 74 65 72 6d 69 6e 65 64  ** is determined
c400: 20 62 79 20 74 68 65 20 7a 55 73 61 67 65 20 61   by the zUsage a
c410: 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74  rgument..*/.stat
c420: 69 63 20 76 6f 69 64 20 65 78 70 6c 61 69 6e 54  ic void explainT
c430: 65 6d 70 54 61 62 6c 65 28 50 61 72 73 65 20 2a  empTable(Parse *
c440: 70 50 61 72 73 65 2c 20 63 6f 6e 73 74 20 63 68  pParse, const ch
c450: 61 72 20 2a 7a 55 73 61 67 65 29 7b 0a 20 20 45  ar *zUsage){.  E
c460: 78 70 6c 61 69 6e 51 75 65 72 79 50 6c 61 6e 28  xplainQueryPlan(
c470: 28 70 50 61 72 73 65 2c 20 30 2c 20 22 55 53 45  (pParse, 0, "USE
c480: 20 54 45 4d 50 20 42 2d 54 52 45 45 20 46 4f 52   TEMP B-TREE FOR
c490: 20 25 73 22 2c 20 7a 55 73 61 67 65 29 29 3b 0a   %s", zUsage));.
c4a0: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 73 73 69 67 6e 20  }../*.** Assign 
c4b0: 65 78 70 72 65 73 73 69 6f 6e 20 62 20 74 6f 20  expression b to 
c4c0: 6c 76 61 6c 75 65 20 61 2e 20 41 20 73 65 63 6f  lvalue a. A seco
c4d0: 6e 64 2c 20 6e 6f 2d 6f 70 2c 20 76 65 72 73 69  nd, no-op, versi
c4e0: 6f 6e 20 6f 66 20 74 68 69 73 20 6d 61 63 72 6f  on of this macro
c4f0: 0a 2a 2a 20 69 73 20 70 72 6f 76 69 64 65 64 20  .** is provided 
c500: 77 68 65 6e 20 53 51 4c 49 54 45 5f 4f 4d 49 54  when SQLITE_OMIT
c510: 5f 45 58 50 4c 41 49 4e 20 69 73 20 64 65 66 69  _EXPLAIN is defi
c520: 6e 65 64 2e 20 54 68 69 73 20 61 6c 6c 6f 77 73  ned. This allows
c530: 20 74 68 65 20 63 6f 64 65 0a 2a 2a 20 69 6e 20   the code.** in 
c540: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 29 20  sqlite3Select() 
c550: 74 6f 20 61 73 73 69 67 6e 20 76 61 6c 75 65 73  to assign values
c560: 20 74 6f 20 73 74 72 75 63 74 75 72 65 20 6d 65   to structure me
c570: 6d 62 65 72 20 76 61 72 69 61 62 6c 65 73 20 74  mber variables t
c580: 68 61 74 0a 2a 2a 20 6f 6e 6c 79 20 65 78 69 73  hat.** only exis
c590: 74 20 69 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  t if SQLITE_OMIT
c5a0: 5f 45 58 50 4c 41 49 4e 20 69 73 20 6e 6f 74 20  _EXPLAIN is not 
c5b0: 64 65 66 69 6e 65 64 20 77 69 74 68 6f 75 74 20  defined without 
c5c0: 70 6f 6c 6c 75 74 69 6e 67 20 74 68 65 0a 2a 2a  polluting the.**
c5d0: 20 63 6f 64 65 20 77 69 74 68 20 23 69 66 6e 64   code with #ifnd
c5e0: 65 66 20 64 69 72 65 63 74 69 76 65 73 2e 0a 2a  ef directives..*
c5f0: 2f 0a 23 20 64 65 66 69 6e 65 20 65 78 70 6c 61  /.# define expla
c600: 69 6e 53 65 74 49 6e 74 65 67 65 72 28 61 2c 20  inSetInteger(a, 
c610: 62 29 20 61 20 3d 20 62 0a 0a 23 65 6c 73 65 0a  b) a = b..#else.
c620: 2f 2a 20 4e 6f 2d 6f 70 20 76 65 72 73 69 6f 6e  /* No-op version
c630: 73 20 6f 66 20 74 68 65 20 65 78 70 6c 61 69 6e  s of the explain
c640: 58 58 58 28 29 20 66 75 6e 63 74 69 6f 6e 73 20  XXX() functions 
c650: 61 6e 64 20 6d 61 63 72 6f 73 2e 20 2a 2f 0a 23  and macros. */.#
c660: 20 64 65 66 69 6e 65 20 65 78 70 6c 61 69 6e 54   define explainT
c670: 65 6d 70 54 61 62 6c 65 28 79 2c 7a 29 0a 23 20  empTable(y,z).# 
c680: 64 65 66 69 6e 65 20 65 78 70 6c 61 69 6e 53 65  define explainSe
c690: 74 49 6e 74 65 67 65 72 28 79 2c 7a 29 0a 23 65  tInteger(y,z).#e
c6a0: 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 49 66 20  ndif.../*.** If 
c6b0: 74 68 65 20 69 6e 6e 65 72 20 6c 6f 6f 70 20 77  the inner loop w
c6c0: 61 73 20 67 65 6e 65 72 61 74 65 64 20 75 73 69  as generated usi
c6d0: 6e 67 20 61 20 6e 6f 6e 2d 6e 75 6c 6c 20 70 4f  ng a non-null pO
c6e0: 72 64 65 72 42 79 20 61 72 67 75 6d 65 6e 74 2c  rderBy argument,
c6f0: 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20 72 65 73  .** then the res
c700: 75 6c 74 73 20 77 65 72 65 20 70 6c 61 63 65 64  ults were placed
c710: 20 69 6e 20 61 20 73 6f 72 74 65 72 2e 20 20 41   in a sorter.  A
c720: 66 74 65 72 20 74 68 65 20 6c 6f 6f 70 20 69 73  fter the loop is
c730: 20 74 65 72 6d 69 6e 61 74 65 64 0a 2a 2a 20 77   terminated.** w
c740: 65 20 6e 65 65 64 20 74 6f 20 72 75 6e 20 74 68  e need to run th
c750: 65 20 73 6f 72 74 65 72 20 61 6e 64 20 6f 75 74  e sorter and out
c760: 70 75 74 20 74 68 65 20 72 65 73 75 6c 74 73 2e  put the results.
c770: 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a    The following.
c780: 2a 2a 20 72 6f 75 74 69 6e 65 20 67 65 6e 65 72  ** routine gener
c790: 61 74 65 73 20 74 68 65 20 63 6f 64 65 20 6e 65  ates the code ne
c7a0: 65 64 65 64 20 74 6f 20 64 6f 20 74 68 61 74 2e  eded to do that.
c7b0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
c7c0: 67 65 6e 65 72 61 74 65 53 6f 72 74 54 61 69 6c  generateSortTail
c7d0: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
c7e0: 65 2c 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67  e,    /* Parsing
c7f0: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65   context */.  Se
c800: 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20  lect *p,        
c810: 2f 2a 20 54 68 65 20 53 45 4c 45 43 54 20 73 74  /* The SELECT st
c820: 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 53 6f 72  atement */.  Sor
c830: 74 43 74 78 20 2a 70 53 6f 72 74 2c 20 20 20 2f  tCtx *pSort,   /
c840: 2a 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f 6e  * Information on
c850: 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   the ORDER BY cl
c860: 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 43  ause */.  int nC
c870: 6f 6c 75 6d 6e 2c 20 20 20 20 20 20 2f 2a 20 4e  olumn,      /* N
c880: 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73  umber of columns
c890: 20 6f 66 20 64 61 74 61 20 2a 2f 0a 20 20 53 65   of data */.  Se
c8a0: 6c 65 63 74 44 65 73 74 20 2a 70 44 65 73 74 20  lectDest *pDest 
c8b0: 2f 2a 20 57 72 69 74 65 20 74 68 65 20 73 6f 72  /* Write the sor
c8c0: 74 65 64 20 72 65 73 75 6c 74 73 20 68 65 72 65  ted results here
c8d0: 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76   */.){.  Vdbe *v
c8e0: 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
c8f0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
c900: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 72 65        /* The pre
c910: 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20  pared statement 
c920: 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 42 72 65  */.  int addrBre
c930: 61 6b 20 3d 20 70 53 6f 72 74 2d 3e 6c 61 62 65  ak = pSort->labe
c940: 6c 44 6f 6e 65 3b 20 20 20 20 20 20 20 20 20 20  lDone;          
c950: 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 74    /* Jump here t
c960: 6f 20 65 78 69 74 20 6c 6f 6f 70 20 2a 2f 0a 20  o exit loop */. 
c970: 20 69 6e 74 20 61 64 64 72 43 6f 6e 74 69 6e 75   int addrContinu
c980: 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  e = sqlite3VdbeM
c990: 61 6b 65 4c 61 62 65 6c 28 70 50 61 72 73 65 29  akeLabel(pParse)
c9a0: 3b 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 66 6f  ;/* Jump here fo
c9b0: 72 20 6e 65 78 74 20 63 79 63 6c 65 20 2a 2f 0a  r next cycle */.
c9c0: 20 20 69 6e 74 20 61 64 64 72 3b 20 20 20 20 20    int addr;     
c9d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c9e0: 20 20 2f 2a 20 54 6f 70 20 6f 66 20 6f 75 74 70    /* Top of outp
c9f0: 75 74 20 6c 6f 6f 70 2e 20 4a 75 6d 70 20 66 6f  ut loop. Jump fo
ca00: 72 20 4e 65 78 74 2e 20 2a 2f 0a 20 20 69 6e 74  r Next. */.  int
ca10: 20 61 64 64 72 4f 6e 63 65 20 3d 20 30 3b 0a 20   addrOnce = 0;. 
ca20: 20 69 6e 74 20 69 54 61 62 3b 0a 20 20 45 78 70   int iTab;.  Exp
ca30: 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 20  rList *pOrderBy 
ca40: 3d 20 70 53 6f 72 74 2d 3e 70 4f 72 64 65 72 42  = pSort->pOrderB
ca50: 79 3b 0a 20 20 69 6e 74 20 65 44 65 73 74 20 3d  y;.  int eDest =
ca60: 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3b 0a 20   pDest->eDest;. 
ca70: 20 69 6e 74 20 69 50 61 72 6d 20 3d 20 70 44 65   int iParm = pDe
ca80: 73 74 2d 3e 69 53 44 50 61 72 6d 3b 0a 20 20 69  st->iSDParm;.  i
ca90: 6e 74 20 72 65 67 52 6f 77 3b 0a 20 20 69 6e 74  nt regRow;.  int
caa0: 20 72 65 67 52 6f 77 69 64 3b 0a 20 20 69 6e 74   regRowid;.  int
cab0: 20 69 43 6f 6c 3b 0a 20 20 69 6e 74 20 6e 4b 65   iCol;.  int nKe
cac0: 79 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  y;              
cad0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
cae0: 65 72 20 6f 66 20 6b 65 79 20 63 6f 6c 75 6d 6e  er of key column
caf0: 73 20 69 6e 20 73 6f 72 74 65 72 20 72 65 63 6f  s in sorter reco
cb00: 72 64 20 2a 2f 0a 20 20 69 6e 74 20 69 53 6f 72  rd */.  int iSor
cb10: 74 54 61 62 3b 20 20 20 20 20 20 20 20 20 20 20  tTab;           
cb20: 20 20 20 20 20 20 20 20 2f 2a 20 53 6f 72 74 65          /* Sorte
cb30: 72 20 63 75 72 73 6f 72 20 74 6f 20 72 65 61 64  r cursor to read
cb40: 20 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20 69   from */.  int i
cb50: 3b 0a 20 20 69 6e 74 20 62 53 65 71 3b 20 20 20  ;.  int bSeq;   
cb60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cb70: 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 73      /* True if s
cb80: 6f 72 74 65 72 20 72 65 63 6f 72 64 20 69 6e 63  orter record inc
cb90: 6c 75 64 65 73 20 73 65 71 2e 20 6e 6f 2e 20 2a  ludes seq. no. *
cba0: 2f 0a 20 20 69 6e 74 20 6e 52 65 66 4b 65 79 20  /.  int nRefKey 
cbb0: 3d 20 30 3b 0a 20 20 73 74 72 75 63 74 20 45 78  = 0;.  struct Ex
cbc0: 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 61 4f 75  prList_item *aOu
cbd0: 74 45 78 20 3d 20 70 2d 3e 70 45 4c 69 73 74 2d  tEx = p->pEList-
cbe0: 3e 61 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 61  >a;..  assert( a
cbf0: 64 64 72 42 72 65 61 6b 3c 30 20 29 3b 0a 20 20  ddrBreak<0 );.  
cc00: 69 66 28 20 70 53 6f 72 74 2d 3e 6c 61 62 65 6c  if( pSort->label
cc10: 42 6b 4f 75 74 20 29 7b 0a 20 20 20 20 73 71 6c  BkOut ){.    sql
cc20: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
cc30: 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 70 53 6f 72  , OP_Gosub, pSor
cc40: 74 2d 3e 72 65 67 52 65 74 75 72 6e 2c 20 70 53  t->regReturn, pS
cc50: 6f 72 74 2d 3e 6c 61 62 65 6c 42 6b 4f 75 74 29  ort->labelBkOut)
cc60: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
cc70: 65 47 6f 74 6f 28 76 2c 20 61 64 64 72 42 72 65  eGoto(v, addrBre
cc80: 61 6b 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ak);.    sqlite3
cc90: 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
cca0: 28 76 2c 20 70 53 6f 72 74 2d 3e 6c 61 62 65 6c  (v, pSort->label
ccb0: 42 6b 4f 75 74 29 3b 0a 20 20 7d 0a 0a 23 69 66  BkOut);.  }..#if
ccc0: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
ccd0: 45 5f 53 4f 52 54 45 52 5f 52 45 46 45 52 45 4e  E_SORTER_REFEREN
cce0: 43 45 53 0a 20 20 2f 2a 20 4f 70 65 6e 20 61 6e  CES.  /* Open an
ccf0: 79 20 63 75 72 73 6f 72 73 20 6e 65 65 64 65 64  y cursors needed
cd00: 20 66 6f 72 20 73 6f 72 74 65 72 2d 72 65 66 65   for sorter-refe
cd10: 72 65 6e 63 65 20 65 78 70 72 65 73 73 69 6f 6e  rence expression
cd20: 73 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20  s */.  for(i=0; 
cd30: 69 3c 70 53 6f 72 74 2d 3e 6e 44 65 66 65 72 3b  i<pSort->nDefer;
cd40: 20 69 2b 2b 29 7b 0a 20 20 20 20 54 61 62 6c 65   i++){.    Table
cd50: 20 2a 70 54 61 62 20 3d 20 70 53 6f 72 74 2d 3e   *pTab = pSort->
cd60: 61 44 65 66 65 72 5b 69 5d 2e 70 54 61 62 3b 0a  aDefer[i].pTab;.
cd70: 20 20 20 20 69 6e 74 20 69 44 62 20 3d 20 73 71      int iDb = sq
cd80: 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64  lite3SchemaToInd
cd90: 65 78 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  ex(pParse->db, p
cda0: 54 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20  Tab->pSchema);. 
cdb0: 20 20 20 73 71 6c 69 74 65 33 4f 70 65 6e 54 61     sqlite3OpenTa
cdc0: 62 6c 65 28 70 50 61 72 73 65 2c 20 70 53 6f 72  ble(pParse, pSor
cdd0: 74 2d 3e 61 44 65 66 65 72 5b 69 5d 2e 69 43 73  t->aDefer[i].iCs
cde0: 72 2c 20 69 44 62 2c 20 70 54 61 62 2c 20 4f 50  r, iDb, pTab, OP
cdf0: 5f 4f 70 65 6e 52 65 61 64 29 3b 0a 20 20 20 20  _OpenRead);.    
ce00: 6e 52 65 66 4b 65 79 20 3d 20 4d 41 58 28 6e 52  nRefKey = MAX(nR
ce10: 65 66 4b 65 79 2c 20 70 53 6f 72 74 2d 3e 61 44  efKey, pSort->aD
ce20: 65 66 65 72 5b 69 5d 2e 6e 4b 65 79 29 3b 0a 20  efer[i].nKey);. 
ce30: 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 69 54 61   }.#endif..  iTa
ce40: 62 20 3d 20 70 53 6f 72 74 2d 3e 69 45 43 75 72  b = pSort->iECur
ce50: 73 6f 72 3b 0a 20 20 69 66 28 20 65 44 65 73 74  sor;.  if( eDest
ce60: 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20 7c 7c 20  ==SRT_Output || 
ce70: 65 44 65 73 74 3d 3d 53 52 54 5f 43 6f 72 6f 75  eDest==SRT_Corou
ce80: 74 69 6e 65 20 7c 7c 20 65 44 65 73 74 3d 3d 53  tine || eDest==S
ce90: 52 54 5f 4d 65 6d 20 29 7b 0a 20 20 20 20 72 65  RT_Mem ){.    re
cea0: 67 52 6f 77 69 64 20 3d 20 30 3b 0a 20 20 20 20  gRowid = 0;.    
ceb0: 72 65 67 52 6f 77 20 3d 20 70 44 65 73 74 2d 3e  regRow = pDest->
cec0: 69 53 64 73 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a  iSdst;.  }else{.
ced0: 20 20 20 20 72 65 67 52 6f 77 69 64 20 3d 20 73      regRowid = s
cee0: 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67  qlite3GetTempReg
cef0: 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 69 66  (pParse);.    if
cf00: 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 45 70 68  ( eDest==SRT_Eph
cf10: 65 6d 54 61 62 20 7c 7c 20 65 44 65 73 74 3d 3d  emTab || eDest==
cf20: 53 52 54 5f 54 61 62 6c 65 20 29 7b 0a 20 20 20  SRT_Table ){.   
cf30: 20 20 20 72 65 67 52 6f 77 20 3d 20 73 71 6c 69     regRow = sqli
cf40: 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50  te3GetTempReg(pP
cf50: 61 72 73 65 29 3b 0a 20 20 20 20 20 20 6e 43 6f  arse);.      nCo
cf60: 6c 75 6d 6e 20 3d 20 30 3b 0a 20 20 20 20 7d 65  lumn = 0;.    }e
cf70: 6c 73 65 7b 0a 20 20 20 20 20 20 72 65 67 52 6f  lse{.      regRo
cf80: 77 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  w = sqlite3GetTe
cf90: 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20  mpRange(pParse, 
cfa0: 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 7d 0a  nColumn);.    }.
cfb0: 20 20 7d 0a 20 20 6e 4b 65 79 20 3d 20 70 4f 72    }.  nKey = pOr
cfc0: 64 65 72 42 79 2d 3e 6e 45 78 70 72 20 2d 20 70  derBy->nExpr - p
cfd0: 53 6f 72 74 2d 3e 6e 4f 42 53 61 74 3b 0a 20 20  Sort->nOBSat;.  
cfe0: 69 66 28 20 70 53 6f 72 74 2d 3e 73 6f 72 74 46  if( pSort->sortF
cff0: 6c 61 67 73 20 26 20 53 4f 52 54 46 4c 41 47 5f  lags & SORTFLAG_
d000: 55 73 65 53 6f 72 74 65 72 20 29 7b 0a 20 20 20  UseSorter ){.   
d010: 20 69 6e 74 20 72 65 67 53 6f 72 74 4f 75 74 20   int regSortOut 
d020: 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
d030: 3b 0a 20 20 20 20 69 53 6f 72 74 54 61 62 20 3d  ;.    iSortTab =
d040: 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b   pParse->nTab++;
d050: 0a 20 20 20 20 69 66 28 20 70 53 6f 72 74 2d 3e  .    if( pSort->
d060: 6c 61 62 65 6c 42 6b 4f 75 74 20 29 7b 0a 20 20  labelBkOut ){.  
d070: 20 20 20 20 61 64 64 72 4f 6e 63 65 20 3d 20 73      addrOnce = s
d080: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 30  qlite3VdbeAddOp0
d090: 28 76 2c 20 4f 50 5f 4f 6e 63 65 29 3b 20 56 64  (v, OP_Once); Vd
d0a0: 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
d0b0: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
d0c0: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
d0d0: 5f 4f 70 65 6e 50 73 65 75 64 6f 2c 20 69 53 6f  _OpenPseudo, iSo
d0e0: 72 74 54 61 62 2c 20 72 65 67 53 6f 72 74 4f 75  rtTab, regSortOu
d0f0: 74 2c 20 0a 20 20 20 20 20 20 20 20 6e 4b 65 79  t, .        nKey
d100: 2b 31 2b 6e 43 6f 6c 75 6d 6e 2b 6e 52 65 66 4b  +1+nColumn+nRefK
d110: 65 79 29 3b 0a 20 20 20 20 69 66 28 20 61 64 64  ey);.    if( add
d120: 72 4f 6e 63 65 20 29 20 73 71 6c 69 74 65 33 56  rOnce ) sqlite3V
d130: 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61  dbeJumpHere(v, a
d140: 64 64 72 4f 6e 63 65 29 3b 0a 20 20 20 20 61 64  ddrOnce);.    ad
d150: 64 72 20 3d 20 31 20 2b 20 73 71 6c 69 74 65 33  dr = 1 + sqlite3
d160: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
d170: 5f 53 6f 72 74 65 72 53 6f 72 74 2c 20 69 54 61  _SorterSort, iTa
d180: 62 2c 20 61 64 64 72 42 72 65 61 6b 29 3b 0a 20  b, addrBreak);. 
d190: 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28     VdbeCoverage(
d1a0: 76 29 3b 0a 20 20 20 20 63 6f 64 65 4f 66 66 73  v);.    codeOffs
d1b0: 65 74 28 76 2c 20 70 2d 3e 69 4f 66 66 73 65 74  et(v, p->iOffset
d1c0: 2c 20 61 64 64 72 43 6f 6e 74 69 6e 75 65 29 3b  , addrContinue);
d1d0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
d1e0: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 53 6f 72  AddOp3(v, OP_Sor
d1f0: 74 65 72 44 61 74 61 2c 20 69 54 61 62 2c 20 72  terData, iTab, r
d200: 65 67 53 6f 72 74 4f 75 74 2c 20 69 53 6f 72 74  egSortOut, iSort
d210: 54 61 62 29 3b 0a 20 20 20 20 62 53 65 71 20 3d  Tab);.    bSeq =
d220: 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   0;.  }else{.   
d230: 20 61 64 64 72 20 3d 20 31 20 2b 20 73 71 6c 69   addr = 1 + sqli
d240: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
d250: 20 4f 50 5f 53 6f 72 74 2c 20 69 54 61 62 2c 20   OP_Sort, iTab, 
d260: 61 64 64 72 42 72 65 61 6b 29 3b 20 56 64 62 65  addrBreak); Vdbe
d270: 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
d280: 20 63 6f 64 65 4f 66 66 73 65 74 28 76 2c 20 70   codeOffset(v, p
d290: 2d 3e 69 4f 66 66 73 65 74 2c 20 61 64 64 72 43  ->iOffset, addrC
d2a0: 6f 6e 74 69 6e 75 65 29 3b 0a 20 20 20 20 69 53  ontinue);.    iS
d2b0: 6f 72 74 54 61 62 20 3d 20 69 54 61 62 3b 0a 20  ortTab = iTab;. 
d2c0: 20 20 20 62 53 65 71 20 3d 20 31 3b 0a 20 20 7d     bSeq = 1;.  }
d2d0: 0a 20 20 66 6f 72 28 69 3d 30 2c 20 69 43 6f 6c  .  for(i=0, iCol
d2e0: 3d 6e 4b 65 79 2b 62 53 65 71 2d 31 3b 20 69 3c  =nKey+bSeq-1; i<
d2f0: 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 23  nColumn; i++){.#
d300: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
d310: 42 4c 45 5f 53 4f 52 54 45 52 5f 52 45 46 45 52  BLE_SORTER_REFER
d320: 45 4e 43 45 53 0a 20 20 20 20 69 66 28 20 61 4f  ENCES.    if( aO
d330: 75 74 45 78 5b 69 5d 2e 62 53 6f 72 74 65 72 52  utEx[i].bSorterR
d340: 65 66 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 23  ef ) continue;.#
d350: 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20 61 4f  endif.    if( aO
d360: 75 74 45 78 5b 69 5d 2e 75 2e 78 2e 69 4f 72 64  utEx[i].u.x.iOrd
d370: 65 72 42 79 43 6f 6c 3d 3d 30 20 29 20 69 43 6f  erByCol==0 ) iCo
d380: 6c 2b 2b 3b 0a 20 20 7d 0a 23 69 66 64 65 66 20  l++;.  }.#ifdef 
d390: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 4f  SQLITE_ENABLE_SO
d3a0: 52 54 45 52 5f 52 45 46 45 52 45 4e 43 45 53 0a  RTER_REFERENCES.
d3b0: 20 20 69 66 28 20 70 53 6f 72 74 2d 3e 6e 44 65    if( pSort->nDe
d3c0: 66 65 72 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  fer ){.    int i
d3d0: 4b 65 79 20 3d 20 69 43 6f 6c 2b 31 3b 0a 20 20  Key = iCol+1;.  
d3e0: 20 20 69 6e 74 20 72 65 67 4b 65 79 20 3d 20 73    int regKey = s
d3f0: 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 61 6e  qlite3GetTempRan
d400: 67 65 28 70 50 61 72 73 65 2c 20 6e 52 65 66 4b  ge(pParse, nRefK
d410: 65 79 29 3b 0a 0a 20 20 20 20 66 6f 72 28 69 3d  ey);..    for(i=
d420: 30 3b 20 69 3c 70 53 6f 72 74 2d 3e 6e 44 65 66  0; i<pSort->nDef
d430: 65 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  er; i++){.      
d440: 69 6e 74 20 69 43 73 72 20 3d 20 70 53 6f 72 74  int iCsr = pSort
d450: 2d 3e 61 44 65 66 65 72 5b 69 5d 2e 69 43 73 72  ->aDefer[i].iCsr
d460: 3b 0a 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70  ;.      Table *p
d470: 54 61 62 20 3d 20 70 53 6f 72 74 2d 3e 61 44 65  Tab = pSort->aDe
d480: 66 65 72 5b 69 5d 2e 70 54 61 62 3b 0a 20 20 20  fer[i].pTab;.   
d490: 20 20 20 69 6e 74 20 6e 4b 65 79 20 3d 20 70 53     int nKey = pS
d4a0: 6f 72 74 2d 3e 61 44 65 66 65 72 5b 69 5d 2e 6e  ort->aDefer[i].n
d4b0: 4b 65 79 3b 0a 0a 20 20 20 20 20 20 73 71 6c 69  Key;..      sqli
d4c0: 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
d4d0: 20 4f 50 5f 4e 75 6c 6c 52 6f 77 2c 20 69 43 73   OP_NullRow, iCs
d4e0: 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20 48 61  r);.      if( Ha
d4f0: 73 52 6f 77 69 64 28 70 54 61 62 29 20 29 7b 0a  sRowid(pTab) ){.
d500: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
d510: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
d520: 43 6f 6c 75 6d 6e 2c 20 69 53 6f 72 74 54 61 62  Column, iSortTab
d530: 2c 20 69 4b 65 79 2b 2b 2c 20 72 65 67 4b 65 79  , iKey++, regKey
d540: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
d550: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
d560: 4f 50 5f 53 65 65 6b 52 6f 77 69 64 2c 20 69 43  OP_SeekRowid, iC
d570: 73 72 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  sr, .           
d580: 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
d590: 65 6e 74 41 64 64 72 28 76 29 2b 31 2c 20 72 65  entAddr(v)+1, re
d5a0: 67 4b 65 79 29 3b 0a 20 20 20 20 20 20 7d 65 6c  gKey);.      }el
d5b0: 73 65 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  se{.        int 
d5c0: 6b 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69  k;.        int i
d5d0: 4a 6d 70 3b 0a 20 20 20 20 20 20 20 20 61 73 73  Jmp;.        ass
d5e0: 65 72 74 28 20 73 71 6c 69 74 65 33 50 72 69 6d  ert( sqlite3Prim
d5f0: 61 72 79 4b 65 79 49 6e 64 65 78 28 70 54 61 62  aryKeyIndex(pTab
d600: 29 2d 3e 6e 4b 65 79 43 6f 6c 3d 3d 6e 4b 65 79  )->nKeyCol==nKey
d610: 20 29 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28   );.        for(
d620: 6b 3d 30 3b 20 6b 3c 6e 4b 65 79 3b 20 6b 2b 2b  k=0; k<nKey; k++
d630: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
d640: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
d650: 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69 53 6f  , OP_Column, iSo
d660: 72 74 54 61 62 2c 20 69 4b 65 79 2b 2b 2c 20 72  rtTab, iKey++, r
d670: 65 67 4b 65 79 2b 6b 29 3b 0a 20 20 20 20 20 20  egKey+k);.      
d680: 20 20 7d 0a 20 20 20 20 20 20 20 20 69 4a 6d 70    }.        iJmp
d690: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75   = sqlite3VdbeCu
d6a0: 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20  rrentAddr(v);.  
d6b0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
d6c0: 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50  eAddOp4Int(v, OP
d6d0: 5f 53 65 65 6b 47 45 2c 20 69 43 73 72 2c 20 69  _SeekGE, iCsr, i
d6e0: 4a 6d 70 2b 32 2c 20 72 65 67 4b 65 79 2c 20 6e  Jmp+2, regKey, n
d6f0: 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20 73 71  Key);.        sq
d700: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 49  lite3VdbeAddOp4I
d710: 6e 74 28 76 2c 20 4f 50 5f 49 64 78 4c 45 2c 20  nt(v, OP_IdxLE, 
d720: 69 43 73 72 2c 20 69 4a 6d 70 2b 33 2c 20 72 65  iCsr, iJmp+3, re
d730: 67 4b 65 79 2c 20 6e 4b 65 79 29 3b 0a 20 20 20  gKey, nKey);.   
d740: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
d750: 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4e 75 6c  AddOp1(v, OP_Nul
d760: 6c 52 6f 77 2c 20 69 43 73 72 29 3b 0a 20 20 20  lRow, iCsr);.   
d770: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73     }.    }.    s
d780: 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
d790: 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72  pRange(pParse, r
d7a0: 65 67 4b 65 79 2c 20 6e 52 65 66 4b 65 79 29 3b  egKey, nRefKey);
d7b0: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 66 6f  .  }.#endif.  fo
d7c0: 72 28 69 3d 6e 43 6f 6c 75 6d 6e 2d 31 3b 20 69  r(i=nColumn-1; i
d7d0: 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 23 69 66 64 65  >=0; i--){.#ifde
d7e0: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
d7f0: 53 4f 52 54 45 52 5f 52 45 46 45 52 45 4e 43 45  SORTER_REFERENCE
d800: 53 0a 20 20 20 20 69 66 28 20 61 4f 75 74 45 78  S.    if( aOutEx
d810: 5b 69 5d 2e 62 53 6f 72 74 65 72 52 65 66 20 29  [i].bSorterRef )
d820: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
d830: 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
d840: 61 4f 75 74 45 78 5b 69 5d 2e 70 45 78 70 72 2c  aOutEx[i].pExpr,
d850: 20 72 65 67 52 6f 77 2b 69 29 3b 0a 20 20 20 20   regRow+i);.    
d860: 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 20  }else.#endif.   
d870: 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 52 65   {.      int iRe
d880: 61 64 3b 0a 20 20 20 20 20 20 69 66 28 20 61 4f  ad;.      if( aO
d890: 75 74 45 78 5b 69 5d 2e 75 2e 78 2e 69 4f 72 64  utEx[i].u.x.iOrd
d8a0: 65 72 42 79 43 6f 6c 20 29 7b 0a 20 20 20 20 20  erByCol ){.     
d8b0: 20 20 20 69 52 65 61 64 20 3d 20 61 4f 75 74 45     iRead = aOutE
d8c0: 78 5b 69 5d 2e 75 2e 78 2e 69 4f 72 64 65 72 42  x[i].u.x.iOrderB
d8d0: 79 43 6f 6c 2d 31 3b 0a 20 20 20 20 20 20 7d 65  yCol-1;.      }e
d8e0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 52 65  lse{.        iRe
d8f0: 61 64 20 3d 20 69 43 6f 6c 2d 2d 3b 0a 20 20 20  ad = iCol--;.   
d900: 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
d910: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
d920: 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69 53 6f 72 74  OP_Column, iSort
d930: 54 61 62 2c 20 69 52 65 61 64 2c 20 72 65 67 52  Tab, iRead, regR
d940: 6f 77 2b 69 29 3b 0a 20 20 20 20 20 20 56 64 62  ow+i);.      Vdb
d950: 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 25 73  eComment((v, "%s
d960: 22 2c 20 61 4f 75 74 45 78 5b 69 5d 2e 7a 4e 61  ", aOutEx[i].zNa
d970: 6d 65 3f 61 4f 75 74 45 78 5b 69 5d 2e 7a 4e 61  me?aOutEx[i].zNa
d980: 6d 65 20 3a 20 61 4f 75 74 45 78 5b 69 5d 2e 7a  me : aOutEx[i].z
d990: 53 70 61 6e 29 29 3b 0a 20 20 20 20 7d 0a 20 20  Span));.    }.  
d9a0: 7d 0a 20 20 73 77 69 74 63 68 28 20 65 44 65 73  }.  switch( eDes
d9b0: 74 20 29 7b 0a 20 20 20 20 63 61 73 65 20 53 52  t ){.    case SR
d9c0: 54 5f 54 61 62 6c 65 3a 0a 20 20 20 20 63 61 73  T_Table:.    cas
d9d0: 65 20 53 52 54 5f 45 70 68 65 6d 54 61 62 3a 20  e SRT_EphemTab: 
d9e0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
d9f0: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
da00: 43 6f 6c 75 6d 6e 2c 20 69 53 6f 72 74 54 61 62  Column, iSortTab
da10: 2c 20 6e 4b 65 79 2b 62 53 65 71 2c 20 72 65 67  , nKey+bSeq, reg
da20: 52 6f 77 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  Row);.      sqli
da30: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
da40: 20 4f 50 5f 4e 65 77 52 6f 77 69 64 2c 20 69 50   OP_NewRowid, iP
da50: 61 72 6d 2c 20 72 65 67 52 6f 77 69 64 29 3b 0a  arm, regRowid);.
da60: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
da70: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e  eAddOp3(v, OP_In
da80: 73 65 72 74 2c 20 69 50 61 72 6d 2c 20 72 65 67  sert, iParm, reg
da90: 52 6f 77 2c 20 72 65 67 52 6f 77 69 64 29 3b 0a  Row, regRowid);.
daa0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
dab0: 65 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46  eChangeP5(v, OPF
dac0: 4c 41 47 5f 41 50 50 45 4e 44 29 3b 0a 20 20 20  LAG_APPEND);.   
dad0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
dae0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
daf0: 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20 20  MIT_SUBQUERY.   
db00: 20 63 61 73 65 20 53 52 54 5f 53 65 74 3a 20 7b   case SRT_Set: {
db10: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e  .      assert( n
db20: 43 6f 6c 75 6d 6e 3d 3d 73 71 6c 69 74 65 33 53  Column==sqlite3S
db30: 74 72 6c 65 6e 33 30 28 70 44 65 73 74 2d 3e 7a  trlen30(pDest->z
db40: 41 66 66 53 64 73 74 29 20 29 3b 0a 20 20 20 20  AffSdst) );.    
db50: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
db60: 4f 70 34 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65  Op4(v, OP_MakeRe
db70: 63 6f 72 64 2c 20 72 65 67 52 6f 77 2c 20 6e 43  cord, regRow, nC
db80: 6f 6c 75 6d 6e 2c 20 72 65 67 52 6f 77 69 64 2c  olumn, regRowid,
db90: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
dba0: 20 20 20 20 20 20 20 20 20 70 44 65 73 74 2d 3e           pDest->
dbb0: 7a 41 66 66 53 64 73 74 2c 20 6e 43 6f 6c 75 6d  zAffSdst, nColum
dbc0: 6e 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  n);.      sqlite
dbd0: 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76  3VdbeAddOp4Int(v
dbe0: 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20  , OP_IdxInsert, 
dbf0: 69 50 61 72 6d 2c 20 72 65 67 52 6f 77 69 64 2c  iParm, regRowid,
dc00: 20 72 65 67 52 6f 77 2c 20 6e 43 6f 6c 75 6d 6e   regRow, nColumn
dc10: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
dc20: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53      }.    case S
dc30: 52 54 5f 4d 65 6d 3a 20 7b 0a 20 20 20 20 20 20  RT_Mem: {.      
dc40: 2f 2a 20 54 68 65 20 4c 49 4d 49 54 20 63 6c 61  /* The LIMIT cla
dc50: 75 73 65 20 77 69 6c 6c 20 74 65 72 6d 69 6e 61  use will termina
dc60: 74 65 20 74 68 65 20 6c 6f 6f 70 20 66 6f 72 20  te the loop for 
dc70: 75 73 20 2a 2f 0a 20 20 20 20 20 20 62 72 65 61  us */.      brea
dc80: 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  k;.    }.#endif.
dc90: 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20      default: {. 
dca0: 20 20 20 20 20 61 73 73 65 72 74 28 20 65 44 65       assert( eDe
dcb0: 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20 7c  st==SRT_Output |
dcc0: 7c 20 65 44 65 73 74 3d 3d 53 52 54 5f 43 6f 72  | eDest==SRT_Cor
dcd0: 6f 75 74 69 6e 65 20 29 3b 20 0a 20 20 20 20 20  outine ); .     
dce0: 20 74 65 73 74 63 61 73 65 28 20 65 44 65 73 74   testcase( eDest
dcf0: 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20 29 3b 0a  ==SRT_Output );.
dd00: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
dd10: 65 44 65 73 74 3d 3d 53 52 54 5f 43 6f 72 6f 75  eDest==SRT_Corou
dd20: 74 69 6e 65 20 29 3b 0a 20 20 20 20 20 20 69 66  tine );.      if
dd30: 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74  ( eDest==SRT_Out
dd40: 70 75 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73  put ){.        s
dd50: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
dd60: 28 76 2c 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77  (v, OP_ResultRow
dd70: 2c 20 70 44 65 73 74 2d 3e 69 53 64 73 74 2c 20  , pDest->iSdst, 
dd80: 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20  nColumn);.      
dd90: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
dda0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
ddb0: 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 70 44  (v, OP_Yield, pD
ddc0: 65 73 74 2d 3e 69 53 44 50 61 72 6d 29 3b 0a 20  est->iSDParm);. 
ddd0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
dde0: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ak;.    }.  }.  
ddf0: 69 66 28 20 72 65 67 52 6f 77 69 64 20 29 7b 0a  if( regRowid ){.
de00: 20 20 20 20 69 66 28 20 65 44 65 73 74 3d 3d 53      if( eDest==S
de10: 52 54 5f 53 65 74 20 29 7b 0a 20 20 20 20 20 20  RT_Set ){.      
de20: 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
de30: 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20  mpRange(pParse, 
de40: 72 65 67 52 6f 77 2c 20 6e 43 6f 6c 75 6d 6e 29  regRow, nColumn)
de50: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
de60: 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
de70: 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
de80: 20 72 65 67 52 6f 77 29 3b 0a 20 20 20 20 7d 0a   regRow);.    }.
de90: 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61      sqlite3Relea
dea0: 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
deb0: 2c 20 72 65 67 52 6f 77 69 64 29 3b 0a 20 20 7d  , regRowid);.  }
dec0: 0a 20 20 2f 2a 20 54 68 65 20 62 6f 74 74 6f 6d  .  /* The bottom
ded0: 20 6f 66 20 74 68 65 20 6c 6f 6f 70 0a 20 20 2a   of the loop.  *
dee0: 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 52  /.  sqlite3VdbeR
def0: 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61  esolveLabel(v, a
df00: 64 64 72 43 6f 6e 74 69 6e 75 65 29 3b 0a 20 20  ddrContinue);.  
df10: 69 66 28 20 70 53 6f 72 74 2d 3e 73 6f 72 74 46  if( pSort->sortF
df20: 6c 61 67 73 20 26 20 53 4f 52 54 46 4c 41 47 5f  lags & SORTFLAG_
df30: 55 73 65 53 6f 72 74 65 72 20 29 7b 0a 20 20 20  UseSorter ){.   
df40: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
df50: 70 32 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72 4e  p2(v, OP_SorterN
df60: 65 78 74 2c 20 69 54 61 62 2c 20 61 64 64 72 29  ext, iTab, addr)
df70: 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
df80: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
df90: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
dfa0: 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 69 54  2(v, OP_Next, iT
dfb0: 61 62 2c 20 61 64 64 72 29 3b 20 56 64 62 65 43  ab, addr); VdbeC
dfc0: 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 7d 0a  overage(v);.  }.
dfd0: 20 20 69 66 28 20 70 53 6f 72 74 2d 3e 72 65 67    if( pSort->reg
dfe0: 52 65 74 75 72 6e 20 29 20 73 71 6c 69 74 65 33  Return ) sqlite3
dff0: 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
e000: 5f 52 65 74 75 72 6e 2c 20 70 53 6f 72 74 2d 3e  _Return, pSort->
e010: 72 65 67 52 65 74 75 72 6e 29 3b 0a 20 20 73 71  regReturn);.  sq
e020: 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
e030: 4c 61 62 65 6c 28 76 2c 20 61 64 64 72 42 72 65  Label(v, addrBre
e040: 61 6b 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  ak);.}../*.** Re
e050: 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
e060: 6f 20 61 20 73 74 72 69 6e 67 20 63 6f 6e 74 61  o a string conta
e070: 69 6e 69 6e 67 20 74 68 65 20 27 64 65 63 6c 61  ining the 'decla
e080: 72 61 74 69 6f 6e 20 74 79 70 65 27 20 6f 66 20  ration type' of 
e090: 74 68 65 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f  the.** expressio
e0a0: 6e 20 70 45 78 70 72 2e 20 54 68 65 20 73 74 72  n pExpr. The str
e0b0: 69 6e 67 20 6d 61 79 20 62 65 20 74 72 65 61 74  ing may be treat
e0c0: 65 64 20 61 73 20 73 74 61 74 69 63 20 62 79 20  ed as static by 
e0d0: 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2a 0a 2a  the caller..**.*
e0e0: 2a 20 41 6c 73 6f 20 74 72 79 20 74 6f 20 65 73  * Also try to es
e0f0: 74 69 6d 61 74 65 20 74 68 65 20 73 69 7a 65 20  timate the size 
e100: 6f 66 20 74 68 65 20 72 65 74 75 72 6e 65 64 20  of the returned 
e110: 76 61 6c 75 65 20 61 6e 64 20 72 65 74 75 72 6e  value and return
e120: 20 74 68 61 74 0a 2a 2a 20 72 65 73 75 6c 74 20   that.** result 
e130: 69 6e 20 2a 70 45 73 74 57 69 64 74 68 2e 0a 2a  in *pEstWidth..*
e140: 2a 0a 2a 2a 20 54 68 65 20 64 65 63 6c 61 72 61  *.** The declara
e150: 74 69 6f 6e 20 74 79 70 65 20 69 73 20 74 68 65  tion type is the
e160: 20 65 78 61 63 74 20 64 61 74 61 74 79 70 65 20   exact datatype 
e170: 64 65 66 69 6e 69 74 69 6f 6e 20 65 78 74 72 61  definition extra
e180: 63 74 65 64 20 66 72 6f 6d 20 74 68 65 0a 2a 2a  cted from the.**
e190: 20 6f 72 69 67 69 6e 61 6c 20 43 52 45 41 54 45   original CREATE
e1a0: 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74   TABLE statement
e1b0: 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73 69   if the expressi
e1c0: 6f 6e 20 69 73 20 61 20 63 6f 6c 75 6d 6e 2e 20  on is a column. 
e1d0: 54 68 65 0a 2a 2a 20 64 65 63 6c 61 72 61 74 69  The.** declarati
e1e0: 6f 6e 20 74 79 70 65 20 66 6f 72 20 61 20 52 4f  on type for a RO
e1f0: 57 49 44 20 66 69 65 6c 64 20 69 73 20 49 4e 54  WID field is INT
e200: 45 47 45 52 2e 20 45 78 61 63 74 6c 79 20 77 68  EGER. Exactly wh
e210: 65 6e 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e  en an expression
e220: 0a 2a 2a 20 69 73 20 63 6f 6e 73 69 64 65 72 65  .** is considere
e230: 64 20 61 20 63 6f 6c 75 6d 6e 20 63 61 6e 20 62  d a column can b
e240: 65 20 63 6f 6d 70 6c 65 78 20 69 6e 20 74 68 65  e complex in the
e250: 20 70 72 65 73 65 6e 63 65 20 6f 66 20 73 75 62   presence of sub
e260: 71 75 65 72 69 65 73 2e 20 54 68 65 0a 2a 2a 20  queries. The.** 
e270: 72 65 73 75 6c 74 2d 73 65 74 20 65 78 70 72 65  result-set expre
e280: 73 73 69 6f 6e 20 69 6e 20 61 6c 6c 20 6f 66 20  ssion in all of 
e290: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 53 45  the following SE
e2a0: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73 20  LECT statements 
e2b0: 69 73 20 0a 2a 2a 20 63 6f 6e 73 69 64 65 72 65  is .** considere
e2c0: 64 20 61 20 63 6f 6c 75 6d 6e 20 62 79 20 74 68  d a column by th
e2d0: 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a  is function..**.
e2e0: 2a 2a 20 20 20 53 45 4c 45 43 54 20 63 6f 6c 20  **   SELECT col 
e2f0: 46 52 4f 4d 20 74 62 6c 3b 0a 2a 2a 20 20 20 53  FROM tbl;.**   S
e300: 45 4c 45 43 54 20 28 53 45 4c 45 43 54 20 63 6f  ELECT (SELECT co
e310: 6c 20 46 52 4f 4d 20 74 62 6c 3b 0a 2a 2a 20 20  l FROM tbl;.**  
e320: 20 53 45 4c 45 43 54 20 28 53 45 4c 45 43 54 20   SELECT (SELECT 
e330: 63 6f 6c 20 46 52 4f 4d 20 74 62 6c 29 3b 0a 2a  col FROM tbl);.*
e340: 2a 20 20 20 53 45 4c 45 43 54 20 61 62 63 20 46  *   SELECT abc F
e350: 52 4f 4d 20 28 53 45 4c 45 43 54 20 63 6f 6c 20  ROM (SELECT col 
e360: 41 53 20 61 62 63 20 46 52 4f 4d 20 74 62 6c 29  AS abc FROM tbl)
e370: 3b 0a 2a 2a 20 0a 2a 2a 20 54 68 65 20 64 65 63  ;.** .** The dec
e380: 6c 61 72 61 74 69 6f 6e 20 74 79 70 65 20 66 6f  laration type fo
e390: 72 20 61 6e 79 20 65 78 70 72 65 73 73 69 6f 6e  r any expression
e3a0: 20 6f 74 68 65 72 20 74 68 61 6e 20 61 20 63 6f   other than a co
e3b0: 6c 75 6d 6e 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2a  lumn is NULL..**
e3c0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
e3d0: 20 68 61 73 20 65 69 74 68 65 72 20 33 20 6f 72   has either 3 or
e3e0: 20 36 20 70 61 72 61 6d 65 74 65 72 73 20 64 65   6 parameters de
e3f0: 70 65 6e 64 69 6e 67 20 6f 6e 20 77 68 65 74 68  pending on wheth
e400: 65 72 20 6f 72 20 6e 6f 74 0a 2a 2a 20 74 68 65  er or not.** the
e410: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43   SQLITE_ENABLE_C
e420: 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41 54 41 20 63  OLUMN_METADATA c
e430: 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 6f 70 74 69  ompile-time opti
e440: 6f 6e 20 69 73 20 75 73 65 64 2e 0a 2a 2f 0a 23  on is used..*/.#
e450: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
e460: 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44  BLE_COLUMN_METAD
e470: 41 54 41 0a 23 20 64 65 66 69 6e 65 20 63 6f 6c  ATA.# define col
e480: 75 6d 6e 54 79 70 65 28 41 2c 42 2c 43 2c 44 2c  umnType(A,B,C,D,
e490: 45 29 20 63 6f 6c 75 6d 6e 54 79 70 65 49 6d 70  E) columnTypeImp
e4a0: 6c 28 41 2c 42 2c 43 2c 44 2c 45 29 0a 23 65 6c  l(A,B,C,D,E).#el
e4b0: 73 65 20 2f 2a 20 69 66 20 21 64 65 66 69 6e 65  se /* if !define
e4c0: 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  d(SQLITE_ENABLE_
e4d0: 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41 54 41 29  COLUMN_METADATA)
e4e0: 20 2a 2f 0a 23 20 64 65 66 69 6e 65 20 63 6f 6c   */.# define col
e4f0: 75 6d 6e 54 79 70 65 28 41 2c 42 2c 43 2c 44 2c  umnType(A,B,C,D,
e500: 45 29 20 63 6f 6c 75 6d 6e 54 79 70 65 49 6d 70  E) columnTypeImp
e510: 6c 28 41 2c 42 29 0a 23 65 6e 64 69 66 0a 73 74  l(A,B).#endif.st
e520: 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20  atic const char 
e530: 2a 63 6f 6c 75 6d 6e 54 79 70 65 49 6d 70 6c 28  *columnTypeImpl(
e540: 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a  .  NameContext *
e550: 70 4e 43 2c 20 0a 23 69 66 6e 64 65 66 20 53 51  pNC, .#ifndef SQ
e560: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55  LITE_ENABLE_COLU
e570: 4d 4e 5f 4d 45 54 41 44 41 54 41 0a 20 20 45 78  MN_METADATA.  Ex
e580: 70 72 20 2a 70 45 78 70 72 0a 23 65 6c 73 65 0a  pr *pExpr.#else.
e590: 20 20 45 78 70 72 20 2a 70 45 78 70 72 2c 0a 20    Expr *pExpr,. 
e5a0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a 70 7a   const char **pz
e5b0: 4f 72 69 67 44 62 2c 0a 20 20 63 6f 6e 73 74 20  OrigDb,.  const 
e5c0: 63 68 61 72 20 2a 2a 70 7a 4f 72 69 67 54 61 62  char **pzOrigTab
e5d0: 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ,.  const char *
e5e0: 2a 70 7a 4f 72 69 67 43 6f 6c 0a 23 65 6e 64 69  *pzOrigCol.#endi
e5f0: 66 0a 29 7b 0a 20 20 63 68 61 72 20 63 6f 6e 73  f.){.  char cons
e600: 74 20 2a 7a 54 79 70 65 20 3d 20 30 3b 0a 20 20  t *zType = 0;.  
e610: 69 6e 74 20 6a 3b 0a 23 69 66 64 65 66 20 53 51  int j;.#ifdef SQ
e620: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55  LITE_ENABLE_COLU
e630: 4d 4e 5f 4d 45 54 41 44 41 54 41 0a 20 20 63 68  MN_METADATA.  ch
e640: 61 72 20 63 6f 6e 73 74 20 2a 7a 4f 72 69 67 44  ar const *zOrigD
e650: 62 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 63 6f  b = 0;.  char co
e660: 6e 73 74 20 2a 7a 4f 72 69 67 54 61 62 20 3d 20  nst *zOrigTab = 
e670: 30 3b 0a 20 20 63 68 61 72 20 63 6f 6e 73 74 20  0;.  char const 
e680: 2a 7a 4f 72 69 67 43 6f 6c 20 3d 20 30 3b 0a 23  *zOrigCol = 0;.#
e690: 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28  endif..  assert(
e6a0: 20 70 45 78 70 72 21 3d 30 20 29 3b 0a 20 20 61   pExpr!=0 );.  a
e6b0: 73 73 65 72 74 28 20 70 4e 43 2d 3e 70 53 72 63  ssert( pNC->pSrc
e6c0: 4c 69 73 74 21 3d 30 20 29 3b 0a 20 20 73 77 69  List!=0 );.  swi
e6d0: 74 63 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29  tch( pExpr->op )
e6e0: 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f  {.    case TK_CO
e6f0: 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20 20 20 2f 2a  LUMN: {.      /*
e700: 20 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   The expression 
e710: 69 73 20 61 20 63 6f 6c 75 6d 6e 2e 20 4c 6f 63  is a column. Loc
e720: 61 74 65 20 74 68 65 20 74 61 62 6c 65 20 74 68  ate the table th
e730: 65 20 63 6f 6c 75 6d 6e 20 69 73 20 62 65 69 6e  e column is bein
e740: 67 0a 20 20 20 20 20 20 2a 2a 20 65 78 74 72 61  g.      ** extra
e750: 63 74 65 64 20 66 72 6f 6d 20 69 6e 20 4e 61 6d  cted from in Nam
e760: 65 43 6f 6e 74 65 78 74 2e 70 53 72 63 4c 69 73  eContext.pSrcLis
e770: 74 2e 20 54 68 69 73 20 74 61 62 6c 65 20 6d 61  t. This table ma
e780: 79 20 62 65 20 72 65 61 6c 0a 20 20 20 20 20 20  y be real.      
e790: 2a 2a 20 64 61 74 61 62 61 73 65 20 74 61 62 6c  ** database tabl
e7a0: 65 20 6f 72 20 61 20 73 75 62 71 75 65 72 79 2e  e or a subquery.
e7b0: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
e7c0: 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 30 3b  Table *pTab = 0;
e7d0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
e7e0: 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 20 63  able structure c
e7f0: 6f 6c 75 6d 6e 20 69 73 20 65 78 74 72 61 63 74  olumn is extract
e800: 65 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 20 20 20  ed from */.     
e810: 20 53 65 6c 65 63 74 20 2a 70 53 20 3d 20 30 3b   Select *pS = 0;
e820: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
e830: 53 65 6c 65 63 74 20 74 68 65 20 63 6f 6c 75 6d  Select the colum
e840: 6e 20 69 73 20 65 78 74 72 61 63 74 65 64 20 66  n is extracted f
e850: 72 6f 6d 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  rom */.      int
e860: 20 69 43 6f 6c 20 3d 20 70 45 78 70 72 2d 3e 69   iCol = pExpr->i
e870: 43 6f 6c 75 6d 6e 3b 20 20 2f 2a 20 49 6e 64 65  Column;  /* Inde
e880: 78 20 6f 66 20 63 6f 6c 75 6d 6e 20 69 6e 20 70  x of column in p
e890: 54 61 62 20 2a 2f 0a 20 20 20 20 20 20 77 68 69  Tab */.      whi
e8a0: 6c 65 28 20 70 4e 43 20 26 26 20 21 70 54 61 62  le( pNC && !pTab
e8b0: 20 29 7b 0a 20 20 20 20 20 20 20 20 53 72 63 4c   ){.        SrcL
e8c0: 69 73 74 20 2a 70 54 61 62 4c 69 73 74 20 3d 20  ist *pTabList = 
e8d0: 70 4e 43 2d 3e 70 53 72 63 4c 69 73 74 3b 0a 20  pNC->pSrcList;. 
e8e0: 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 6a         for(j=0;j
e8f0: 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 20  <pTabList->nSrc 
e900: 26 26 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 6a  && pTabList->a[j
e910: 5d 2e 69 43 75 72 73 6f 72 21 3d 70 45 78 70 72  ].iCursor!=pExpr
e920: 2d 3e 69 54 61 62 6c 65 3b 6a 2b 2b 29 3b 0a 20  ->iTable;j++);. 
e930: 20 20 20 20 20 20 20 69 66 28 20 6a 3c 70 54 61         if( j<pTa
e940: 62 4c 69 73 74 2d 3e 6e 53 72 63 20 29 7b 0a 20  bList->nSrc ){. 
e950: 20 20 20 20 20 20 20 20 20 70 54 61 62 20 3d 20           pTab = 
e960: 70 54 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 70  pTabList->a[j].p
e970: 54 61 62 3b 0a 20 20 20 20 20 20 20 20 20 20 70  Tab;.          p
e980: 53 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b  S = pTabList->a[
e990: 6a 5d 2e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20  j].pSelect;.    
e9a0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
e9b0: 20 20 20 20 20 70 4e 43 20 3d 20 70 4e 43 2d 3e       pNC = pNC->
e9c0: 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 20 20 7d  pNext;.        }
e9d0: 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
e9e0: 69 66 28 20 70 54 61 62 3d 3d 30 20 29 7b 0a 20  if( pTab==0 ){. 
e9f0: 20 20 20 20 20 20 20 2f 2a 20 41 74 20 6f 6e 65         /* At one
ea00: 20 74 69 6d 65 2c 20 63 6f 64 65 20 73 75 63 68   time, code such
ea10: 20 61 73 20 22 53 45 4c 45 43 54 20 6e 65 77 2e   as "SELECT new.
ea20: 78 22 20 77 69 74 68 69 6e 20 61 20 74 72 69 67  x" within a trig
ea30: 67 65 72 20 77 6f 75 6c 64 0a 20 20 20 20 20 20  ger would.      
ea40: 20 20 2a 2a 20 63 61 75 73 65 20 74 68 69 73 20    ** cause this 
ea50: 63 6f 6e 64 69 74 69 6f 6e 20 74 6f 20 72 75 6e  condition to run
ea60: 2e 20 20 53 69 6e 63 65 20 74 68 65 6e 2c 20 77  .  Since then, w
ea70: 65 20 68 61 76 65 20 72 65 73 74 72 75 63 74 75  e have restructu
ea80: 72 65 64 20 68 6f 77 0a 20 20 20 20 20 20 20 20  red how.        
ea90: 2a 2a 20 74 72 69 67 67 65 72 20 63 6f 64 65 20  ** trigger code 
eaa0: 69 73 20 67 65 6e 65 72 61 74 65 64 20 61 6e 64  is generated and
eab0: 20 73 6f 20 74 68 69 73 20 63 6f 6e 64 69 74 69   so this conditi
eac0: 6f 6e 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20  on is no longer 
ead0: 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 6f 73 73  .        ** poss
eae0: 69 62 6c 65 2e 20 48 6f 77 65 76 65 72 2c 20 69  ible. However, i
eaf0: 74 20 63 61 6e 20 73 74 69 6c 6c 20 62 65 20 74  t can still be t
eb00: 72 75 65 20 66 6f 72 20 73 74 61 74 65 6d 65 6e  rue for statemen
eb10: 74 73 20 6c 69 6b 65 0a 20 20 20 20 20 20 20 20  ts like.        
eb20: 2a 2a 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** the following
eb30: 3a 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20  :.        **.   
eb40: 20 20 20 20 20 2a 2a 20 20 20 43 52 45 41 54 45       **   CREATE
eb50: 20 54 41 42 4c 45 20 74 31 28 63 6f 6c 20 49 4e   TABLE t1(col IN
eb60: 54 45 47 45 52 29 3b 0a 20 20 20 20 20 20 20 20  TEGER);.        
eb70: 2a 2a 20 20 20 53 45 4c 45 43 54 20 28 53 45 4c  **   SELECT (SEL
eb80: 45 43 54 20 74 31 2e 63 6f 6c 29 20 46 52 4f 4d  ECT t1.col) FROM
eb90: 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 20 20   FROM t1;.      
eba0: 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20    **.        ** 
ebb0: 77 68 65 6e 20 63 6f 6c 75 6d 6e 54 79 70 65 28  when columnType(
ebc0: 29 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e 20 74  ) is called on t
ebd0: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 22 74  he expression "t
ebe0: 31 2e 63 6f 6c 22 20 69 6e 20 74 68 65 20 0a 20  1.col" in the . 
ebf0: 20 20 20 20 20 20 20 2a 2a 20 73 75 62 2d 73 65         ** sub-se
ec00: 6c 65 63 74 2e 20 49 6e 20 74 68 69 73 20 63 61  lect. In this ca
ec10: 73 65 2c 20 73 65 74 20 74 68 65 20 63 6f 6c 75  se, set the colu
ec20: 6d 6e 20 74 79 70 65 20 74 6f 20 4e 55 4c 4c 2c  mn type to NULL,
ec30: 20 65 76 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a   even.        **
ec40: 20 74 68 6f 75 67 68 20 69 74 20 73 68 6f 75 6c   though it shoul
ec50: 64 20 72 65 61 6c 6c 79 20 62 65 20 22 49 4e 54  d really be "INT
ec60: 45 47 45 52 22 2e 0a 20 20 20 20 20 20 20 20 2a  EGER"..        *
ec70: 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 54 68 69  *.        ** Thi
ec80: 73 20 69 73 20 6e 6f 74 20 61 20 70 72 6f 62 6c  s is not a probl
ec90: 65 6d 2c 20 61 73 20 74 68 65 20 63 6f 6c 75 6d  em, as the colum
eca0: 6e 20 74 79 70 65 20 6f 66 20 22 74 31 2e 63 6f  n type of "t1.co
ecb0: 6c 22 20 69 73 20 6e 65 76 65 72 0a 20 20 20 20  l" is never.    
ecc0: 20 20 20 20 2a 2a 20 75 73 65 64 2e 20 57 68 65      ** used. Whe
ecd0: 6e 20 63 6f 6c 75 6d 6e 54 79 70 65 28 29 20 69  n columnType() i
ece0: 73 20 63 61 6c 6c 65 64 20 6f 6e 20 74 68 65 20  s called on the 
ecf0: 65 78 70 72 65 73 73 69 6f 6e 20 0a 20 20 20 20  expression .    
ed00: 20 20 20 20 2a 2a 20 22 28 53 45 4c 45 43 54 20      ** "(SELECT 
ed10: 74 31 2e 63 6f 6c 29 22 2c 20 74 68 65 20 63 6f  t1.col)", the co
ed20: 72 72 65 63 74 20 74 79 70 65 20 69 73 20 72 65  rrect type is re
ed30: 74 75 72 6e 65 64 20 28 73 65 65 20 74 68 65 20  turned (see the 
ed40: 54 4b 5f 53 45 4c 45 43 54 0a 20 20 20 20 20 20  TK_SELECT.      
ed50: 20 20 2a 2a 20 62 72 61 6e 63 68 20 62 65 6c 6f    ** branch belo
ed60: 77 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 62  w.  */.        b
ed70: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  reak;.      }.. 
ed80: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54 61       assert( pTa
ed90: 62 20 26 26 20 70 45 78 70 72 2d 3e 79 2e 70 54  b && pExpr->y.pT
eda0: 61 62 3d 3d 70 54 61 62 20 29 3b 0a 20 20 20 20  ab==pTab );.    
edb0: 20 20 69 66 28 20 70 53 20 29 7b 0a 20 20 20 20    if( pS ){.    
edc0: 20 20 20 20 2f 2a 20 54 68 65 20 22 74 61 62 6c      /* The "tabl
edd0: 65 22 20 69 73 20 61 63 74 75 61 6c 6c 79 20 61  e" is actually a
ede0: 20 73 75 62 2d 73 65 6c 65 63 74 20 6f 72 20 61   sub-select or a
edf0: 20 76 69 65 77 20 69 6e 20 74 68 65 20 46 52 4f   view in the FRO
ee00: 4d 20 63 6c 61 75 73 65 0a 20 20 20 20 20 20 20  M clause.       
ee10: 20 2a 2a 20 6f 66 20 74 68 65 20 53 45 4c 45 43   ** of the SELEC
ee20: 54 20 73 74 61 74 65 6d 65 6e 74 2e 20 52 65 74  T statement. Ret
ee30: 75 72 6e 20 74 68 65 20 64 65 63 6c 61 72 61 74  urn the declarat
ee40: 69 6f 6e 20 74 79 70 65 20 61 6e 64 20 6f 72 69  ion type and ori
ee50: 67 69 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 64  gin.        ** d
ee60: 61 74 61 20 66 6f 72 20 74 68 65 20 72 65 73 75  ata for the resu
ee70: 6c 74 2d 73 65 74 20 63 6f 6c 75 6d 6e 20 6f 66  lt-set column of
ee80: 20 74 68 65 20 73 75 62 2d 73 65 6c 65 63 74 2e   the sub-select.
ee90: 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
eea0: 20 20 20 20 69 66 28 20 69 43 6f 6c 3e 3d 30 20      if( iCol>=0 
eeb0: 26 26 20 69 43 6f 6c 3c 70 53 2d 3e 70 45 4c 69  && iCol<pS->pELi
eec0: 73 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20  st->nExpr ){.   
eed0: 20 20 20 20 20 20 20 2f 2a 20 49 66 20 69 43 6f         /* If iCo
eee0: 6c 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 7a  l is less than z
eef0: 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 65 78  ero, then the ex
ef00: 70 72 65 73 73 69 6f 6e 20 72 65 71 75 65 73 74  pression request
ef10: 73 20 74 68 65 0a 20 20 20 20 20 20 20 20 20 20  s the.          
ef20: 2a 2a 20 72 6f 77 69 64 20 6f 66 20 74 68 65 20  ** rowid of the 
ef30: 73 75 62 2d 73 65 6c 65 63 74 20 6f 72 20 76 69  sub-select or vi
ef40: 65 77 2e 20 54 68 69 73 20 65 78 70 72 65 73 73  ew. This express
ef50: 69 6f 6e 20 69 73 20 6c 65 67 61 6c 20 28 73 65  ion is legal (se
ef60: 65 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  e .          ** 
ef70: 74 65 73 74 20 63 61 73 65 20 6d 69 73 63 32 2e  test case misc2.
ef80: 32 2e 32 29 20 2d 20 69 74 20 61 6c 77 61 79 73  2.2) - it always
ef90: 20 65 76 61 6c 75 61 74 65 73 20 74 6f 20 4e 55   evaluates to NU
efa0: 4c 4c 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f  LL..          */
efb0: 0a 20 20 20 20 20 20 20 20 20 20 4e 61 6d 65 43  .          NameC
efc0: 6f 6e 74 65 78 74 20 73 4e 43 3b 0a 20 20 20 20  ontext sNC;.    
efd0: 20 20 20 20 20 20 45 78 70 72 20 2a 70 20 3d 20        Expr *p = 
efe0: 70 53 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 69 43  pS->pEList->a[iC
eff0: 6f 6c 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20  ol].pExpr;.     
f000: 20 20 20 20 20 73 4e 43 2e 70 53 72 63 4c 69 73       sNC.pSrcLis
f010: 74 20 3d 20 70 53 2d 3e 70 53 72 63 3b 0a 20 20  t = pS->pSrc;.  
f020: 20 20 20 20 20 20 20 20 73 4e 43 2e 70 4e 65 78          sNC.pNex
f030: 74 20 3d 20 70 4e 43 3b 0a 20 20 20 20 20 20 20  t = pNC;.       
f040: 20 20 20 73 4e 43 2e 70 50 61 72 73 65 20 3d 20     sNC.pParse = 
f050: 70 4e 43 2d 3e 70 50 61 72 73 65 3b 0a 20 20 20  pNC->pParse;.   
f060: 20 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20 63         zType = c
f070: 6f 6c 75 6d 6e 54 79 70 65 28 26 73 4e 43 2c 20  olumnType(&sNC, 
f080: 70 2c 26 7a 4f 72 69 67 44 62 2c 26 7a 4f 72 69  p,&zOrigDb,&zOri
f090: 67 54 61 62 2c 26 7a 4f 72 69 67 43 6f 6c 29 3b  gTab,&zOrigCol);
f0a0: 20 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20   .        }.    
f0b0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
f0c0: 20 2f 2a 20 41 20 72 65 61 6c 20 74 61 62 6c 65   /* A real table
f0d0: 20 6f 72 20 61 20 43 54 45 20 74 61 62 6c 65 20   or a CTE table 
f0e0: 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  */.        asser
f0f0: 74 28 20 21 70 53 20 29 3b 0a 23 69 66 64 65 66  t( !pS );.#ifdef
f100: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43   SQLITE_ENABLE_C
f110: 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41 54 41 0a 20  OLUMN_METADATA. 
f120: 20 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3c         if( iCol<
f130: 30 20 29 20 69 43 6f 6c 20 3d 20 70 54 61 62 2d  0 ) iCol = pTab-
f140: 3e 69 50 4b 65 79 3b 0a 20 20 20 20 20 20 20 20  >iPKey;.        
f150: 61 73 73 65 72 74 28 20 69 43 6f 6c 3d 3d 58 4e  assert( iCol==XN
f160: 5f 52 4f 57 49 44 20 7c 7c 20 28 69 43 6f 6c 3e  _ROWID || (iCol>
f170: 3d 30 20 26 26 20 69 43 6f 6c 3c 70 54 61 62 2d  =0 && iCol<pTab-
f180: 3e 6e 43 6f 6c 29 20 29 3b 0a 20 20 20 20 20 20  >nCol) );.      
f190: 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 29 7b 0a    if( iCol<0 ){.
f1a0: 20 20 20 20 20 20 20 20 20 20 7a 54 79 70 65 20            zType 
f1b0: 3d 20 22 49 4e 54 45 47 45 52 22 3b 0a 20 20 20  = "INTEGER";.   
f1c0: 20 20 20 20 20 20 20 7a 4f 72 69 67 43 6f 6c 20         zOrigCol 
f1d0: 3d 20 22 72 6f 77 69 64 22 3b 0a 20 20 20 20 20  = "rowid";.     
f1e0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
f1f0: 20 20 20 20 7a 4f 72 69 67 43 6f 6c 20 3d 20 70      zOrigCol = p
f200: 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e  Tab->aCol[iCol].
f210: 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 20  zName;.         
f220: 20 7a 54 79 70 65 20 3d 20 73 71 6c 69 74 65 33   zType = sqlite3
f230: 43 6f 6c 75 6d 6e 54 79 70 65 28 26 70 54 61 62  ColumnType(&pTab
f240: 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2c 30 29 3b  ->aCol[iCol],0);
f250: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
f260: 20 20 20 7a 4f 72 69 67 54 61 62 20 3d 20 70 54     zOrigTab = pT
f270: 61 62 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20  ab->zName;.     
f280: 20 20 20 69 66 28 20 70 4e 43 2d 3e 70 50 61 72     if( pNC->pPar
f290: 73 65 20 26 26 20 70 54 61 62 2d 3e 70 53 63 68  se && pTab->pSch
f2a0: 65 6d 61 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ema ){.         
f2b0: 20 69 6e 74 20 69 44 62 20 3d 20 73 71 6c 69 74   int iDb = sqlit
f2c0: 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28  e3SchemaToIndex(
f2d0: 70 4e 43 2d 3e 70 50 61 72 73 65 2d 3e 64 62 2c  pNC->pParse->db,
f2e0: 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b   pTab->pSchema);
f2f0: 0a 20 20 20 20 20 20 20 20 20 20 7a 4f 72 69 67  .          zOrig
f300: 44 62 20 3d 20 70 4e 43 2d 3e 70 50 61 72 73 65  Db = pNC->pParse
f310: 2d 3e 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a  ->db->aDb[iDb].z
f320: 44 62 53 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20  DbSName;.       
f330: 20 7d 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 20   }.#else.       
f340: 20 61 73 73 65 72 74 28 20 69 43 6f 6c 3d 3d 58   assert( iCol==X
f350: 4e 5f 52 4f 57 49 44 20 7c 7c 20 28 69 43 6f 6c  N_ROWID || (iCol
f360: 3e 3d 30 20 26 26 20 69 43 6f 6c 3c 70 54 61 62  >=0 && iCol<pTab
f370: 2d 3e 6e 43 6f 6c 29 20 29 3b 0a 20 20 20 20 20  ->nCol) );.     
f380: 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 29 7b     if( iCol<0 ){
f390: 0a 20 20 20 20 20 20 20 20 20 20 7a 54 79 70 65  .          zType
f3a0: 20 3d 20 22 49 4e 54 45 47 45 52 22 3b 0a 20 20   = "INTEGER";.  
f3b0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
f3c0: 20 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20 73         zType = s
f3d0: 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 54 79 70 65  qlite3ColumnType
f3e0: 28 26 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f  (&pTab->aCol[iCo
f3f0: 6c 5d 2c 30 29 3b 0a 20 20 20 20 20 20 20 20 7d  l],0);.        }
f400: 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 7d 0a  .#endif.      }.
f410: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
f420: 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54   }.#ifndef SQLIT
f430: 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a  E_OMIT_SUBQUERY.
f440: 20 20 20 20 63 61 73 65 20 54 4b 5f 53 45 4c 45      case TK_SELE
f450: 43 54 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 54  CT: {.      /* T
f460: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  he expression is
f470: 20 61 20 73 75 62 2d 73 65 6c 65 63 74 2e 20 52   a sub-select. R
f480: 65 74 75 72 6e 20 74 68 65 20 64 65 63 6c 61 72  eturn the declar
f490: 61 74 69 6f 6e 20 74 79 70 65 20 61 6e 64 0a 20  ation type and. 
f4a0: 20 20 20 20 20 2a 2a 20 6f 72 69 67 69 6e 20 69       ** origin i
f4b0: 6e 66 6f 20 66 6f 72 20 74 68 65 20 73 69 6e 67  nfo for the sing
f4c0: 6c 65 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65  le column in the
f4d0: 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20 74   result set of t
f4e0: 68 65 20 53 45 4c 45 43 54 0a 20 20 20 20 20 20  he SELECT.      
f4f0: 2a 2a 20 73 74 61 74 65 6d 65 6e 74 2e 0a 20 20  ** statement..  
f500: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 4e 61 6d      */.      Nam
f510: 65 43 6f 6e 74 65 78 74 20 73 4e 43 3b 0a 20 20  eContext sNC;.  
f520: 20 20 20 20 53 65 6c 65 63 74 20 2a 70 53 20 3d      Select *pS =
f530: 20 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63   pExpr->x.pSelec
f540: 74 3b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70  t;.      Expr *p
f550: 20 3d 20 70 53 2d 3e 70 45 4c 69 73 74 2d 3e 61   = pS->pEList->a
f560: 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20  [0].pExpr;.     
f570: 20 61 73 73 65 72 74 28 20 45 78 70 72 48 61 73   assert( ExprHas
f580: 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
f590: 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b  EP_xIsSelect) );
f5a0: 0a 20 20 20 20 20 20 73 4e 43 2e 70 53 72 63 4c  .      sNC.pSrcL
f5b0: 69 73 74 20 3d 20 70 53 2d 3e 70 53 72 63 3b 0a  ist = pS->pSrc;.
f5c0: 20 20 20 20 20 20 73 4e 43 2e 70 4e 65 78 74 20        sNC.pNext 
f5d0: 3d 20 70 4e 43 3b 0a 20 20 20 20 20 20 73 4e 43  = pNC;.      sNC
f5e0: 2e 70 50 61 72 73 65 20 3d 20 70 4e 43 2d 3e 70  .pParse = pNC->p
f5f0: 50 61 72 73 65 3b 0a 20 20 20 20 20 20 7a 54 79  Parse;.      zTy
f600: 70 65 20 3d 20 63 6f 6c 75 6d 6e 54 79 70 65 28  pe = columnType(
f610: 26 73 4e 43 2c 20 70 2c 20 26 7a 4f 72 69 67 44  &sNC, p, &zOrigD
f620: 62 2c 20 26 7a 4f 72 69 67 54 61 62 2c 20 26 7a  b, &zOrigTab, &z
f630: 4f 72 69 67 43 6f 6c 29 3b 20 0a 20 20 20 20 20  OrigCol); .     
f640: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65   break;.    }.#e
f650: 6e 64 69 66 0a 20 20 7d 0a 0a 23 69 66 64 65 66  ndif.  }..#ifdef
f660: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43   SQLITE_ENABLE_C
f670: 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41 54 41 20 20  OLUMN_METADATA  
f680: 0a 20 20 69 66 28 20 70 7a 4f 72 69 67 44 62 20  .  if( pzOrigDb 
f690: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
f6a0: 7a 4f 72 69 67 54 61 62 20 26 26 20 70 7a 4f 72  zOrigTab && pzOr
f6b0: 69 67 43 6f 6c 20 29 3b 0a 20 20 20 20 2a 70 7a  igCol );.    *pz
f6c0: 4f 72 69 67 44 62 20 3d 20 7a 4f 72 69 67 44 62  OrigDb = zOrigDb
f6d0: 3b 0a 20 20 20 20 2a 70 7a 4f 72 69 67 54 61 62  ;.    *pzOrigTab
f6e0: 20 3d 20 7a 4f 72 69 67 54 61 62 3b 0a 20 20 20   = zOrigTab;.   
f6f0: 20 2a 70 7a 4f 72 69 67 43 6f 6c 20 3d 20 7a 4f   *pzOrigCol = zO
f700: 72 69 67 43 6f 6c 3b 0a 20 20 7d 0a 23 65 6e 64  rigCol;.  }.#end
f710: 69 66 0a 20 20 72 65 74 75 72 6e 20 7a 54 79 70  if.  return zTyp
f720: 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  e;.}../*.** Gene
f730: 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 77  rate code that w
f740: 69 6c 6c 20 74 65 6c 6c 20 74 68 65 20 56 44 42  ill tell the VDB
f750: 45 20 74 68 65 20 64 65 63 6c 61 72 61 74 69 6f  E the declaratio
f760: 6e 20 74 79 70 65 73 20 6f 66 20 63 6f 6c 75 6d  n types of colum
f770: 6e 73 0a 2a 2a 20 69 6e 20 74 68 65 20 72 65 73  ns.** in the res
f780: 75 6c 74 20 73 65 74 2e 0a 2a 2f 0a 73 74 61 74  ult set..*/.stat
f790: 69 63 20 76 6f 69 64 20 67 65 6e 65 72 61 74 65  ic void generate
f7a0: 43 6f 6c 75 6d 6e 54 79 70 65 73 28 0a 20 20 50  ColumnTypes(.  P
f7b0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
f7c0: 20 20 20 2f 2a 20 50 61 72 73 65 72 20 63 6f 6e     /* Parser con
f7d0: 74 65 78 74 20 2a 2f 0a 20 20 53 72 63 4c 69 73  text */.  SrcLis
f7e0: 74 20 2a 70 54 61 62 4c 69 73 74 2c 20 20 2f 2a  t *pTabList,  /*
f7f0: 20 4c 69 73 74 20 6f 66 20 74 61 62 6c 65 73 20   List of tables 
f800: 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
f810: 45 4c 69 73 74 20 20 20 20 2f 2a 20 45 78 70 72  EList    /* Expr
f820: 65 73 73 69 6f 6e 73 20 64 65 66 69 6e 69 6e 67  essions defining
f830: 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20   the result set 
f840: 2a 2f 0a 29 7b 0a 23 69 66 6e 64 65 66 20 53 51  */.){.#ifndef SQ
f850: 4c 49 54 45 5f 4f 4d 49 54 5f 44 45 43 4c 54 59  LITE_OMIT_DECLTY
f860: 50 45 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  PE.  Vdbe *v = p
f870: 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
f880: 69 6e 74 20 69 3b 0a 20 20 4e 61 6d 65 43 6f 6e  int i;.  NameCon
f890: 74 65 78 74 20 73 4e 43 3b 0a 20 20 73 4e 43 2e  text sNC;.  sNC.
f8a0: 70 53 72 63 4c 69 73 74 20 3d 20 70 54 61 62 4c  pSrcList = pTabL
f8b0: 69 73 74 3b 0a 20 20 73 4e 43 2e 70 50 61 72 73  ist;.  sNC.pPars
f8c0: 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20 73 4e  e = pParse;.  sN
f8d0: 43 2e 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 66  C.pNext = 0;.  f
f8e0: 6f 72 28 69 3d 30 3b 20 69 3c 70 45 4c 69 73 74  or(i=0; i<pEList
f8f0: 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20  ->nExpr; i++){. 
f900: 20 20 20 45 78 70 72 20 2a 70 20 3d 20 70 45 4c     Expr *p = pEL
f910: 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b  ist->a[i].pExpr;
f920: 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
f930: 2a 7a 54 79 70 65 3b 0a 23 69 66 64 65 66 20 53  *zType;.#ifdef S
f940: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c  QLITE_ENABLE_COL
f950: 55 4d 4e 5f 4d 45 54 41 44 41 54 41 0a 20 20 20  UMN_METADATA.   
f960: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f 72   const char *zOr
f970: 69 67 44 62 20 3d 20 30 3b 0a 20 20 20 20 63 6f  igDb = 0;.    co
f980: 6e 73 74 20 63 68 61 72 20 2a 7a 4f 72 69 67 54  nst char *zOrigT
f990: 61 62 20 3d 20 30 3b 0a 20 20 20 20 63 6f 6e 73  ab = 0;.    cons
f9a0: 74 20 63 68 61 72 20 2a 7a 4f 72 69 67 43 6f 6c  t char *zOrigCol
f9b0: 20 3d 20 30 3b 0a 20 20 20 20 7a 54 79 70 65 20   = 0;.    zType 
f9c0: 3d 20 63 6f 6c 75 6d 6e 54 79 70 65 28 26 73 4e  = columnType(&sN
f9d0: 43 2c 20 70 2c 20 26 7a 4f 72 69 67 44 62 2c 20  C, p, &zOrigDb, 
f9e0: 26 7a 4f 72 69 67 54 61 62 2c 20 26 7a 4f 72 69  &zOrigTab, &zOri
f9f0: 67 43 6f 6c 29 3b 0a 0a 20 20 20 20 2f 2a 20 54  gCol);..    /* T
fa00: 68 65 20 76 64 62 65 20 6d 75 73 74 20 6d 61 6b  he vdbe must mak
fa10: 65 20 69 74 73 20 6f 77 6e 20 63 6f 70 79 20 6f  e its own copy o
fa20: 66 20 74 68 65 20 63 6f 6c 75 6d 6e 2d 74 79 70  f the column-typ
fa30: 65 20 61 6e 64 20 6f 74 68 65 72 20 0a 20 20 20  e and other .   
fa40: 20 2a 2a 20 63 6f 6c 75 6d 6e 20 73 70 65 63 69   ** column speci
fa50: 66 69 63 20 73 74 72 69 6e 67 73 2c 20 69 6e 20  fic strings, in 
fa60: 63 61 73 65 20 74 68 65 20 73 63 68 65 6d 61 20  case the schema 
fa70: 69 73 20 72 65 73 65 74 20 62 65 66 6f 72 65 20  is reset before 
fa80: 74 68 69 73 0a 20 20 20 20 2a 2a 20 76 69 72 74  this.    ** virt
fa90: 75 61 6c 20 6d 61 63 68 69 6e 65 20 69 73 20 64  ual machine is d
faa0: 65 6c 65 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20  eleted..    */. 
fab0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65     sqlite3VdbeSe
fac0: 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43  tColName(v, i, C
fad0: 4f 4c 4e 41 4d 45 5f 44 41 54 41 42 41 53 45 2c  OLNAME_DATABASE,
fae0: 20 7a 4f 72 69 67 44 62 2c 20 53 51 4c 49 54 45   zOrigDb, SQLITE
faf0: 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20  _TRANSIENT);.   
fb00: 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43   sqlite3VdbeSetC
fb10: 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c  olName(v, i, COL
fb20: 4e 41 4d 45 5f 54 41 42 4c 45 2c 20 7a 4f 72 69  NAME_TABLE, zOri
fb30: 67 54 61 62 2c 20 53 51 4c 49 54 45 5f 54 52 41  gTab, SQLITE_TRA
fb40: 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20 73 71 6c  NSIENT);.    sql
fb50: 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61  ite3VdbeSetColNa
fb60: 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45  me(v, i, COLNAME
fb70: 5f 43 4f 4c 55 4d 4e 2c 20 7a 4f 72 69 67 43 6f  _COLUMN, zOrigCo
fb80: 6c 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49  l, SQLITE_TRANSI
fb90: 45 4e 54 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20  ENT);.#else.    
fba0: 7a 54 79 70 65 20 3d 20 63 6f 6c 75 6d 6e 54 79  zType = columnTy
fbb0: 70 65 28 26 73 4e 43 2c 20 70 2c 20 30 2c 20 30  pe(&sNC, p, 0, 0
fbc0: 2c 20 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  , 0);.#endif.   
fbd0: 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43   sqlite3VdbeSetC
fbe0: 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c  olName(v, i, COL
fbf0: 4e 41 4d 45 5f 44 45 43 4c 54 59 50 45 2c 20 7a  NAME_DECLTYPE, z
fc00: 54 79 70 65 2c 20 53 51 4c 49 54 45 5f 54 52 41  Type, SQLITE_TRA
fc10: 4e 53 49 45 4e 54 29 3b 0a 20 20 7d 0a 23 65 6e  NSIENT);.  }.#en
fc20: 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28  dif /* !defined(
fc30: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 45 43 4c  SQLITE_OMIT_DECL
fc40: 54 59 50 45 29 20 2a 2f 0a 7d 0a 0a 0a 2f 2a 0a  TYPE) */.}.../*.
fc50: 2a 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20 63  ** Compute the c
fc60: 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 66 6f 72 20  olumn names for 
fc70: 61 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  a SELECT stateme
fc80: 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 6e  nt..**.** The on
fc90: 6c 79 20 67 75 61 72 61 6e 74 65 65 20 74 68 61  ly guarantee tha
fca0: 74 20 53 51 4c 69 74 65 20 6d 61 6b 65 73 20 61  t SQLite makes a
fcb0: 62 6f 75 74 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65  bout column name
fcc0: 73 20 69 73 20 74 68 61 74 20 69 66 20 74 68 65  s is that if the
fcd0: 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 68 61 73 20 61  .** column has a
fce0: 6e 20 41 53 20 63 6c 61 75 73 65 20 61 73 73 69  n AS clause assi
fcf0: 67 6e 69 6e 67 20 69 74 20 61 20 6e 61 6d 65 2c  gning it a name,
fd00: 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20 74 68   that will be th
fd10: 65 20 6e 61 6d 65 20 75 73 65 64 2e 0a 2a 2a 20  e name used..** 
fd20: 54 68 61 74 20 69 73 20 74 68 65 20 6f 6e 6c 79  That is the only
fd30: 20 64 6f 63 75 6d 65 6e 74 65 64 20 67 75 61 72   documented guar
fd40: 61 6e 74 65 65 2e 20 20 48 6f 77 65 76 65 72 2c  antee.  However,
fd50: 20 63 6f 75 6e 74 6c 65 73 73 20 61 70 70 6c 69   countless appli
fd60: 63 61 74 69 6f 6e 73 0a 2a 2a 20 64 65 76 65 6c  cations.** devel
fd70: 6f 70 65 64 20 6f 76 65 72 20 74 68 65 20 79 65  oped over the ye
fd80: 61 72 73 20 68 61 76 65 20 6d 61 64 65 20 62 61  ars have made ba
fd90: 73 65 6c 65 73 73 20 61 73 73 75 6d 70 74 69 6f  seless assumptio
fda0: 6e 73 20 61 62 6f 75 74 20 63 6f 6c 75 6d 6e 20  ns about column 
fdb0: 6e 61 6d 65 73 0a 2a 2a 20 61 6e 64 20 77 69 6c  names.** and wil
fdc0: 6c 20 62 72 65 61 6b 20 69 66 20 74 68 6f 73 65  l break if those
fdd0: 20 61 73 73 75 6d 70 74 69 6f 6e 73 20 63 68 61   assumptions cha
fde0: 6e 67 65 73 2e 20 20 48 65 6e 63 65 2c 20 75 73  nges.  Hence, us
fdf0: 65 20 65 78 74 72 65 6d 65 20 63 61 75 74 69 6f  e extreme cautio
fe00: 6e 0a 2a 2a 20 77 68 65 6e 20 6d 6f 64 69 66 79  n.** when modify
fe10: 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ing this routine
fe20: 20 74 6f 20 61 76 6f 69 64 20 62 72 65 61 6b 69   to avoid breaki
fe30: 6e 67 20 6c 65 67 61 63 79 2e 0a 2a 2a 0a 2a 2a  ng legacy..**.**
fe40: 20 53 65 65 20 41 6c 73 6f 3a 20 73 71 6c 69 74   See Also: sqlit
fe50: 65 33 43 6f 6c 75 6d 6e 73 46 72 6f 6d 45 78 70  e3ColumnsFromExp
fe60: 72 4c 69 73 74 28 29 0a 2a 2a 0a 2a 2a 20 54 68  rList().**.** Th
fe70: 65 20 50 52 41 47 4d 41 20 73 68 6f 72 74 5f 63  e PRAGMA short_c
fe80: 6f 6c 75 6d 6e 5f 6e 61 6d 65 73 20 61 6e 64 20  olumn_names and 
fe90: 50 52 41 47 4d 41 20 66 75 6c 6c 5f 63 6f 6c 75  PRAGMA full_colu
fea0: 6d 6e 5f 6e 61 6d 65 73 20 73 65 74 74 69 6e 67  mn_names setting
feb0: 73 20 61 72 65 0a 2a 2a 20 64 65 70 72 65 63 61  s are.** depreca
fec0: 74 65 64 2e 20 20 54 68 65 20 64 65 66 61 75 6c  ted.  The defaul
fed0: 74 20 73 65 74 74 69 6e 67 20 69 73 20 73 68 6f  t setting is sho
fee0: 72 74 3d 4f 4e 2c 20 66 75 6c 6c 3d 4f 46 46 2e  rt=ON, full=OFF.
fef0: 20 20 39 39 2e 39 25 20 6f 66 20 61 6c 6c 0a 2a    99.9% of all.*
ff00: 2a 20 61 70 70 6c 69 63 61 74 69 6f 6e 73 20 73  * applications s
ff10: 68 6f 75 6c 64 20 6f 70 65 72 61 74 65 20 74 68  hould operate th
ff20: 69 73 20 77 61 79 2e 20 20 4e 65 76 65 72 74 68  is way.  Neverth
ff30: 65 6c 65 73 73 2c 20 77 65 20 6e 65 65 64 20 74  eless, we need t
ff40: 6f 20 73 75 70 70 6f 72 74 20 74 68 65 0a 2a 2a  o support the.**
ff50: 20 6f 74 68 65 72 20 6d 6f 64 65 73 20 66 6f 72   other modes for
ff60: 20 6c 65 67 61 63 79 3a 0a 2a 2a 0a 2a 2a 20 20   legacy:.**.**  
ff70: 20 20 73 68 6f 72 74 3d 4f 46 46 2c 20 66 75 6c    short=OFF, ful
ff80: 6c 3d 4f 46 46 3a 20 20 20 20 20 20 43 6f 6c 75  l=OFF:      Colu
ff90: 6d 6e 20 6e 61 6d 65 20 69 73 20 74 68 65 20 74  mn name is the t
ffa0: 65 78 74 20 6f 66 20 74 68 65 20 65 78 70 72 65  ext of the expre
ffb0: 73 73 69 6f 6e 20 68 61 73 20 69 74 0a 2a 2a 20  ssion has it.** 
ffc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ffd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 72 69               ori
ffe0: 67 69 6e 61 6c 6c 79 20 61 70 70 65 61 72 73 20  ginally appears 
fff0: 69 6e 20 74 68 65 20 53 45 4c 45 43 54 20 73 74  in the SELECT st
10000 61 74 65 6d 65 6e 74 2e 20 20 49 6e 0a 2a 2a 20  atement.  In.** 
10010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10020 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 74 68               oth
10030 65 72 20 77 6f 72 64 73 2c 20 74 68 65 20 7a 53  er words, the zS
10040 70 61 6e 20 6f 66 20 74 68 65 20 72 65 73 75 6c  pan of the resul
10050 74 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a  t expression..**
10060 0a 2a 2a 20 20 20 20 73 68 6f 72 74 3d 4f 4e 2c  .**    short=ON,
10070 20 66 75 6c 6c 3d 4f 46 46 3a 20 20 20 20 20 20   full=OFF:      
10080 20 28 54 68 69 73 20 69 73 20 74 68 65 20 64 65   (This is the de
10090 66 61 75 6c 74 20 73 65 74 74 69 6e 67 29 2e 20  fault setting). 
100a0 20 49 66 20 74 68 65 20 72 65 73 75 6c 74 0a 2a   If the result.*
100b0 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
100c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
100d0 65 66 65 72 73 20 64 69 72 65 63 74 6c 79 20 74  efers directly t
100e0 6f 20 61 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e  o a table column
100f0 2c 20 74 68 65 6e 20 74 68 65 0a 2a 2a 20 20 20  , then the.**   
10100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10110 20 20 20 20 20 20 20 20 20 20 20 72 65 73 75 6c             resul
10120 74 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 69 73  t column name is
10130 20 6a 75 73 74 20 74 68 65 20 74 61 62 6c 65 20   just the table 
10140 63 6f 6c 75 6d 6e 0a 2a 2a 20 20 20 20 20 20 20  column.**       
10150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10160 20 20 20 20 20 20 20 6e 61 6d 65 3a 20 43 4f 4c         name: COL
10170 55 4d 4e 2e 20 20 4f 74 68 65 72 77 69 73 65 20  UMN.  Otherwise 
10180 75 73 65 20 7a 53 70 61 6e 2e 0a 2a 2a 0a 2a 2a  use zSpan..**.**
10190 20 20 20 20 66 75 6c 6c 3d 4f 4e 2c 20 73 68 6f      full=ON, sho
101a0 72 74 3d 41 4e 59 3a 20 20 20 20 20 20 20 49 66  rt=ANY:       If
101b0 20 74 68 65 20 72 65 73 75 6c 74 20 72 65 66 65   the result refe
101c0 72 73 20 64 69 72 65 63 74 6c 79 20 74 6f 20 61  rs directly to a
101d0 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 2c 0a 2a   table column,.*
101e0 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
101f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74                 t
10200 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74 20 63  hen the result c
10210 6f 6c 75 6d 6e 20 6e 61 6d 65 20 77 69 74 68 20  olumn name with 
10220 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 0a 2a  the table name.*
10230 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
10240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
10250 72 65 66 69 78 2c 20 65 78 3a 20 54 41 42 4c 45  refix, ex: TABLE
10260 2e 43 4f 4c 55 4d 4e 2e 20 20 4f 74 68 65 72 77  .COLUMN.  Otherw
10270 69 73 65 20 75 73 65 20 7a 53 70 61 6e 2e 0a 2a  ise use zSpan..*
10280 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 67 65  /.static void ge
10290 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65  nerateColumnName
102a0 73 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  s(.  Parse *pPar
102b0 73 65 2c 20 20 20 20 20 20 2f 2a 20 50 61 72 73  se,      /* Pars
102c0 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  er context */.  
102d0 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 20  Select *pSelect 
102e0 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20      /* Generate 
102f0 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 66 6f 72  column names for
10300 20 74 68 69 73 20 53 45 4c 45 43 54 20 73 74 61   this SELECT sta
10310 74 65 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 56  tement */.){.  V
10320 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
10330 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b  >pVdbe;.  int i;
10340 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a  .  Table *pTab;.
10350 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c    SrcList *pTabL
10360 69 73 74 3b 0a 20 20 45 78 70 72 4c 69 73 74 20  ist;.  ExprList 
10370 2a 70 45 4c 69 73 74 3b 0a 20 20 73 71 6c 69 74  *pEList;.  sqlit
10380 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
10390 3e 64 62 3b 0a 20 20 69 6e 74 20 66 75 6c 6c 4e  >db;.  int fullN
103a0 61 6d 65 3b 20 20 20 20 2f 2a 20 54 41 42 4c 45  ame;    /* TABLE
103b0 2e 43 4f 4c 55 4d 4e 20 69 66 20 6e 6f 20 41 53  .COLUMN if no AS
103c0 20 63 6c 61 75 73 65 20 61 6e 64 20 69 73 20 61   clause and is a
103d0 20 64 69 72 65 63 74 20 74 61 62 6c 65 20 72 65   direct table re
103e0 66 20 2a 2f 0a 20 20 69 6e 74 20 73 72 63 4e 61  f */.  int srcNa
103f0 6d 65 3b 20 20 20 20 20 2f 2a 20 43 4f 4c 55 4d  me;     /* COLUM
10400 4e 20 6f 72 20 54 41 42 4c 45 2e 43 4f 4c 55 4d  N or TABLE.COLUM
10410 4e 20 69 66 20 6e 6f 20 41 53 20 63 6c 61 75 73  N if no AS claus
10420 65 20 61 6e 64 20 69 73 20 64 69 72 65 63 74 20  e and is direct 
10430 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  */..#ifndef SQLI
10440 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a  TE_OMIT_EXPLAIN.
10450 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20    /* If this is 
10460 61 6e 20 45 58 50 4c 41 49 4e 2c 20 73 6b 69 70  an EXPLAIN, skip
10470 20 74 68 69 73 20 73 74 65 70 20 2a 2f 0a 20 20   this step */.  
10480 69 66 28 20 70 50 61 72 73 65 2d 3e 65 78 70 6c  if( pParse->expl
10490 61 69 6e 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ain ){.    retur
104a0 6e 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  n;.  }.#endif.. 
104b0 20 69 66 28 20 70 50 61 72 73 65 2d 3e 63 6f 6c   if( pParse->col
104c0 4e 61 6d 65 73 53 65 74 20 29 20 72 65 74 75 72  NamesSet ) retur
104d0 6e 3b 0a 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 6e  n;.  /* Column n
104e0 61 6d 65 73 20 61 72 65 20 64 65 74 65 72 6d 69  ames are determi
104f0 6e 65 64 20 62 79 20 74 68 65 20 6c 65 66 74 2d  ned by the left-
10500 6d 6f 73 74 20 74 65 72 6d 20 6f 66 20 61 20 63  most term of a c
10510 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 20 2a  ompound select *
10520 2f 0a 20 20 77 68 69 6c 65 28 20 70 53 65 6c 65  /.  while( pSele
10530 63 74 2d 3e 70 50 72 69 6f 72 20 29 20 70 53 65  ct->pPrior ) pSe
10540 6c 65 63 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e  lect = pSelect->
10550 70 50 72 69 6f 72 3b 0a 20 20 53 45 4c 45 43 54  pPrior;.  SELECT
10560 54 52 41 43 45 28 31 2c 70 50 61 72 73 65 2c 70  TRACE(1,pParse,p
10570 53 65 6c 65 63 74 2c 28 22 67 65 6e 65 72 61 74  Select,("generat
10580 69 6e 67 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73  ing column names
10590 5c 6e 22 29 29 3b 0a 20 20 70 54 61 62 4c 69 73  \n"));.  pTabLis
105a0 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70 53 72  t = pSelect->pSr
105b0 63 3b 0a 20 20 70 45 4c 69 73 74 20 3d 20 70 53  c;.  pEList = pS
105c0 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 3b 0a 20  elect->pEList;. 
105d0 20 61 73 73 65 72 74 28 20 76 21 3d 30 20 29 3b   assert( v!=0 );
105e0 0a 20 20 61 73 73 65 72 74 28 20 70 54 61 62 4c  .  assert( pTabL
105f0 69 73 74 21 3d 30 20 29 3b 0a 20 20 70 50 61 72  ist!=0 );.  pPar
10600 73 65 2d 3e 63 6f 6c 4e 61 6d 65 73 53 65 74 20  se->colNamesSet 
10610 3d 20 31 3b 0a 20 20 66 75 6c 6c 4e 61 6d 65 20  = 1;.  fullName 
10620 3d 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20 53  = (db->flags & S
10630 51 4c 49 54 45 5f 46 75 6c 6c 43 6f 6c 4e 61 6d  QLITE_FullColNam
10640 65 73 29 21 3d 30 3b 0a 20 20 73 72 63 4e 61 6d  es)!=0;.  srcNam
10650 65 20 3d 20 28 64 62 2d 3e 66 6c 61 67 73 20 26  e = (db->flags &
10660 20 53 51 4c 49 54 45 5f 53 68 6f 72 74 43 6f 6c   SQLITE_ShortCol
10670 4e 61 6d 65 73 29 21 3d 30 20 7c 7c 20 66 75 6c  Names)!=0 || ful
10680 6c 4e 61 6d 65 3b 0a 20 20 73 71 6c 69 74 65 33  lName;.  sqlite3
10690 56 64 62 65 53 65 74 4e 75 6d 43 6f 6c 73 28 76  VdbeSetNumCols(v
106a0 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29  , pEList->nExpr)
106b0 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
106c0 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b  EList->nExpr; i+
106d0 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 20  +){.    Expr *p 
106e0 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70  = pEList->a[i].p
106f0 45 78 70 72 3b 0a 0a 20 20 20 20 61 73 73 65 72  Expr;..    asser
10700 74 28 20 70 21 3d 30 20 29 3b 0a 20 20 20 20 61  t( p!=0 );.    a
10710 73 73 65 72 74 28 20 70 2d 3e 6f 70 21 3d 54 4b  ssert( p->op!=TK
10720 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 29 3b 20 20  _AGG_COLUMN );  
10730 2f 2a 20 41 67 67 20 70 72 6f 63 65 73 73 69 6e  /* Agg processin
10740 67 20 68 61 73 20 6e 6f 74 20 72 75 6e 20 79 65  g has not run ye
10750 74 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28  t */.    assert(
10760 20 70 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d   p->op!=TK_COLUM
10770 4e 20 7c 7c 20 70 2d 3e 79 2e 70 54 61 62 21 3d  N || p->y.pTab!=
10780 30 20 29 3b 20 2f 2a 20 43 6f 76 65 72 69 6e 67  0 ); /* Covering
10790 20 69 64 78 20 6e 6f 74 20 79 65 74 20 63 6f 64   idx not yet cod
107a0 65 64 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 45  ed */.    if( pE
107b0 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65  List->a[i].zName
107c0 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 6e 20   ){.      /* An 
107d0 41 53 20 63 6c 61 75 73 65 20 61 6c 77 61 79 73  AS clause always
107e0 20 74 61 6b 65 73 20 66 69 72 73 74 20 70 72 69   takes first pri
107f0 6f 72 69 74 79 20 2a 2f 0a 20 20 20 20 20 20 63  ority */.      c
10800 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 70 45 4c  har *zName = pEL
10810 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 3b  ist->a[i].zName;
10820 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
10830 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20  beSetColName(v, 
10840 69 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c  i, COLNAME_NAME,
10850 20 7a 4e 61 6d 65 2c 20 53 51 4c 49 54 45 5f 54   zName, SQLITE_T
10860 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20 7d  RANSIENT);.    }
10870 65 6c 73 65 20 69 66 28 20 73 72 63 4e 61 6d 65  else if( srcName
10880 20 26 26 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f   && p->op==TK_CO
10890 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 20 20 63 68  LUMN ){.      ch
108a0 61 72 20 2a 7a 43 6f 6c 3b 0a 20 20 20 20 20 20  ar *zCol;.      
108b0 69 6e 74 20 69 43 6f 6c 20 3d 20 70 2d 3e 69 43  int iCol = p->iC
108c0 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 70 54 61  olumn;.      pTa
108d0 62 20 3d 20 70 2d 3e 79 2e 70 54 61 62 3b 0a 20  b = p->y.pTab;. 
108e0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54 61       assert( pTa
108f0 62 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66  b!=0 );.      if
10900 28 20 69 43 6f 6c 3c 30 20 29 20 69 43 6f 6c 20  ( iCol<0 ) iCol 
10910 3d 20 70 54 61 62 2d 3e 69 50 4b 65 79 3b 0a 20  = pTab->iPKey;. 
10920 20 20 20 20 20 61 73 73 65 72 74 28 20 69 43 6f       assert( iCo
10930 6c 3d 3d 2d 31 20 7c 7c 20 28 69 43 6f 6c 3e 3d  l==-1 || (iCol>=
10940 30 20 26 26 20 69 43 6f 6c 3c 70 54 61 62 2d 3e  0 && iCol<pTab->
10950 6e 43 6f 6c 29 20 29 3b 0a 20 20 20 20 20 20 69  nCol) );.      i
10960 66 28 20 69 43 6f 6c 3c 30 20 29 7b 0a 20 20 20  f( iCol<0 ){.   
10970 20 20 20 20 20 7a 43 6f 6c 20 3d 20 22 72 6f 77       zCol = "row
10980 69 64 22 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  id";.      }else
10990 7b 0a 20 20 20 20 20 20 20 20 7a 43 6f 6c 20 3d  {.        zCol =
109a0 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c   pTab->aCol[iCol
109b0 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 7d  ].zName;.      }
109c0 0a 20 20 20 20 20 20 69 66 28 20 66 75 6c 6c 4e  .      if( fullN
109d0 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 20 20 63  ame ){.        c
109e0 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 30 3b 0a  har *zName = 0;.
109f0 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20          zName = 
10a00 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64  sqlite3MPrintf(d
10a10 62 2c 20 22 25 73 2e 25 73 22 2c 20 70 54 61 62  b, "%s.%s", pTab
10a20 2d 3e 7a 4e 61 6d 65 2c 20 7a 43 6f 6c 29 3b 0a  ->zName, zCol);.
10a30 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
10a40 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c  dbeSetColName(v,
10a50 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45   i, COLNAME_NAME
10a60 2c 20 7a 4e 61 6d 65 2c 20 53 51 4c 49 54 45 5f  , zName, SQLITE_
10a70 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 20 20  DYNAMIC);.      
10a80 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
10a90 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c  qlite3VdbeSetCol
10aa0 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41  Name(v, i, COLNA
10ab0 4d 45 5f 4e 41 4d 45 2c 20 7a 43 6f 6c 2c 20 53  ME_NAME, zCol, S
10ac0 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29  QLITE_TRANSIENT)
10ad0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
10ae0 6c 73 65 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74  lse{.      const
10af0 20 63 68 61 72 20 2a 7a 20 3d 20 70 45 4c 69 73   char *z = pELis
10b00 74 2d 3e 61 5b 69 5d 2e 7a 53 70 61 6e 3b 0a 20  t->a[i].zSpan;. 
10b10 20 20 20 20 20 7a 20 3d 20 7a 3d 3d 30 20 3f 20       z = z==0 ? 
10b20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64  sqlite3MPrintf(d
10b30 62 2c 20 22 63 6f 6c 75 6d 6e 25 64 22 2c 20 69  b, "column%d", i
10b40 2b 31 29 20 3a 20 73 71 6c 69 74 65 33 44 62 53  +1) : sqlite3DbS
10b50 74 72 44 75 70 28 64 62 2c 20 7a 29 3b 0a 20 20  trDup(db, z);.  
10b60 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53      sqlite3VdbeS
10b70 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20  etColName(v, i, 
10b80 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20 7a 2c  COLNAME_NAME, z,
10b90 20 53 51 4c 49 54 45 5f 44 59 4e 41 4d 49 43 29   SQLITE_DYNAMIC)
10ba0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 67 65  ;.    }.  }.  ge
10bb0 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 54 79 70 65  nerateColumnType
10bc0 73 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69  s(pParse, pTabLi
10bd0 73 74 2c 20 70 45 4c 69 73 74 29 3b 0a 7d 0a 0a  st, pEList);.}..
10be0 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 6e 20 65  /*.** Given an e
10bf0 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 20 28  xpression list (
10c00 77 68 69 63 68 20 69 73 20 72 65 61 6c 6c 79 20  which is really 
10c10 74 68 65 20 6c 69 73 74 20 6f 66 20 65 78 70 72  the list of expr
10c20 65 73 73 69 6f 6e 73 0a 2a 2a 20 74 68 61 74 20  essions.** that 
10c30 66 6f 72 6d 20 74 68 65 20 72 65 73 75 6c 74 20  form the result 
10c40 73 65 74 20 6f 66 20 61 20 53 45 4c 45 43 54 20  set of a SELECT 
10c50 73 74 61 74 65 6d 65 6e 74 29 20 63 6f 6d 70 75  statement) compu
10c60 74 65 20 61 70 70 72 6f 70 72 69 61 74 65 0a 2a  te appropriate.*
10c70 2a 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 66  * column names f
10c80 6f 72 20 61 20 74 61 62 6c 65 20 74 68 61 74 20  or a table that 
10c90 77 6f 75 6c 64 20 68 6f 6c 64 20 74 68 65 20 65  would hold the e
10ca0 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e 0a  xpression list..
10cb0 2a 2a 0a 2a 2a 20 41 6c 6c 20 63 6f 6c 75 6d 6e  **.** All column
10cc0 20 6e 61 6d 65 73 20 77 69 6c 6c 20 62 65 20 75   names will be u
10cd0 6e 69 71 75 65 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c  nique..**.** Onl
10ce0 79 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d  y the column nam
10cf0 65 73 20 61 72 65 20 63 6f 6d 70 75 74 65 64 2e  es are computed.
10d00 20 20 43 6f 6c 75 6d 6e 2e 7a 54 79 70 65 2c 20    Column.zType, 
10d10 43 6f 6c 75 6d 6e 2e 7a 43 6f 6c 6c 2c 0a 2a 2a  Column.zColl,.**
10d20 20 61 6e 64 20 6f 74 68 65 72 20 66 69 65 6c 64   and other field
10d30 73 20 6f 66 20 43 6f 6c 75 6d 6e 20 61 72 65 20  s of Column are 
10d40 7a 65 72 6f 65 64 2e 0a 2a 2a 0a 2a 2a 20 52 65  zeroed..**.** Re
10d50 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f  turn SQLITE_OK o
10d60 6e 20 73 75 63 63 65 73 73 2e 20 20 49 66 20 61  n success.  If a
10d70 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69   memory allocati
10d80 6f 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  on error occurs,
10d90 0a 2a 2a 20 73 74 6f 72 65 20 4e 55 4c 4c 20 69  .** store NULL i
10da0 6e 20 2a 70 61 43 6f 6c 20 61 6e 64 20 30 20 69  n *paCol and 0 i
10db0 6e 20 2a 70 6e 43 6f 6c 20 61 6e 64 20 72 65 74  n *pnCol and ret
10dc0 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
10dd0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 6e 6c 79  ..**.** The only
10de0 20 67 75 61 72 61 6e 74 65 65 20 74 68 61 74 20   guarantee that 
10df0 53 51 4c 69 74 65 20 6d 61 6b 65 73 20 61 62 6f  SQLite makes abo
10e00 75 74 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20  ut column names 
10e10 69 73 20 74 68 61 74 20 69 66 20 74 68 65 0a 2a  is that if the.*
10e20 2a 20 63 6f 6c 75 6d 6e 20 68 61 73 20 61 6e 20  * column has an 
10e30 41 53 20 63 6c 61 75 73 65 20 61 73 73 69 67 6e  AS clause assign
10e40 69 6e 67 20 69 74 20 61 20 6e 61 6d 65 2c 20 74  ing it a name, t
10e50 68 61 74 20 77 69 6c 6c 20 62 65 20 74 68 65 20  hat will be the 
10e60 6e 61 6d 65 20 75 73 65 64 2e 0a 2a 2a 20 54 68  name used..** Th
10e70 61 74 20 69 73 20 74 68 65 20 6f 6e 6c 79 20 64  at is the only d
10e80 6f 63 75 6d 65 6e 74 65 64 20 67 75 61 72 61 6e  ocumented guaran
10e90 74 65 65 2e 20 20 48 6f 77 65 76 65 72 2c 20 63  tee.  However, c
10ea0 6f 75 6e 74 6c 65 73 73 20 61 70 70 6c 69 63 61  ountless applica
10eb0 74 69 6f 6e 73 0a 2a 2a 20 64 65 76 65 6c 6f 70  tions.** develop
10ec0 65 64 20 6f 76 65 72 20 74 68 65 20 79 65 61 72  ed over the year
10ed0 73 20 68 61 76 65 20 6d 61 64 65 20 62 61 73 65  s have made base
10ee0 6c 65 73 73 20 61 73 73 75 6d 70 74 69 6f 6e 73  less assumptions
10ef0 20 61 62 6f 75 74 20 63 6f 6c 75 6d 6e 20 6e 61   about column na
10f00 6d 65 73 0a 2a 2a 20 61 6e 64 20 77 69 6c 6c 20  mes.** and will 
10f10 62 72 65 61 6b 20 69 66 20 74 68 6f 73 65 20 61  break if those a
10f20 73 73 75 6d 70 74 69 6f 6e 73 20 63 68 61 6e 67  ssumptions chang
10f30 65 73 2e 20 20 48 65 6e 63 65 2c 20 75 73 65 20  es.  Hence, use 
10f40 65 78 74 72 65 6d 65 20 63 61 75 74 69 6f 6e 0a  extreme caution.
10f50 2a 2a 20 77 68 65 6e 20 6d 6f 64 69 66 79 69 6e  ** when modifyin
10f60 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 74  g this routine t
10f70 6f 20 61 76 6f 69 64 20 62 72 65 61 6b 69 6e 67  o avoid breaking
10f80 20 6c 65 67 61 63 79 2e 0a 2a 2a 0a 2a 2a 20 53   legacy..**.** S
10f90 65 65 20 41 6c 73 6f 3a 20 67 65 6e 65 72 61 74  ee Also: generat
10fa0 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 29 0a 2a  eColumnNames().*
10fb0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 43 6f 6c  /.int sqlite3Col
10fc0 75 6d 6e 73 46 72 6f 6d 45 78 70 72 4c 69 73 74  umnsFromExprList
10fd0 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
10fe0 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50  e,          /* P
10ff0 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
11000 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45  /.  ExprList *pE
11010 4c 69 73 74 2c 20 20 20 20 20 20 20 2f 2a 20 45  List,       /* E
11020 78 70 72 20 6c 69 73 74 20 66 72 6f 6d 20 77 68  xpr list from wh
11030 69 63 68 20 74 6f 20 64 65 72 69 76 65 20 63 6f  ich to derive co
11040 6c 75 6d 6e 20 6e 61 6d 65 73 20 2a 2f 0a 20 20  lumn names */.  
11050 69 31 36 20 2a 70 6e 43 6f 6c 2c 20 20 20 20 20  i16 *pnCol,     
11060 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65          /* Write
11070 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63   the number of c
11080 6f 6c 75 6d 6e 73 20 68 65 72 65 20 2a 2f 0a 20  olumns here */. 
11090 20 43 6f 6c 75 6d 6e 20 2a 2a 70 61 43 6f 6c 20   Column **paCol 
110a0 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74           /* Writ
110b0 65 20 74 68 65 20 6e 65 77 20 63 6f 6c 75 6d 6e  e the new column
110c0 20 6c 69 73 74 20 68 65 72 65 20 2a 2f 0a 29 7b   list here */.){
110d0 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
110e0 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 20 2f   pParse->db;   /
110f0 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  * Database conne
11100 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 69  ction */.  int i
11110 2c 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20  , j;            
11120 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
11130 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 75 33 32  ounters */.  u32
11140 20 63 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20   cnt;           
11150 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
11160 78 20 61 64 64 65 64 20 74 6f 20 6d 61 6b 65 20  x added to make 
11170 74 68 65 20 6e 61 6d 65 20 75 6e 69 71 75 65 20  the name unique 
11180 2a 2f 0a 20 20 43 6f 6c 75 6d 6e 20 2a 61 43 6f  */.  Column *aCo
11190 6c 2c 20 2a 70 43 6f 6c 3b 20 20 20 20 20 20 20  l, *pCol;       
111a0 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20   /* For looping 
111b0 6f 76 65 72 20 72 65 73 75 6c 74 20 63 6f 6c 75  over result colu
111c0 6d 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f  mns */.  int nCo
111d0 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
111e0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
111f0 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65  f columns in the
11200 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 20   result set */. 
11210 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 20 20 20   char *zName;   
11220 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
11230 43 6f 6c 75 6d 6e 20 6e 61 6d 65 20 2a 2f 0a 20  Column name */. 
11240 20 69 6e 74 20 6e 4e 61 6d 65 3b 20 20 20 20 20   int nName;     
11250 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
11260 53 69 7a 65 20 6f 66 20 6e 61 6d 65 20 69 6e 20  Size of name in 
11270 7a 4e 61 6d 65 5b 5d 20 2a 2f 0a 20 20 48 61 73  zName[] */.  Has
11280 68 20 68 74 3b 20 20 20 20 20 20 20 20 20 20 20  h ht;           
11290 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61 73 68           /* Hash
112a0 20 74 61 62 6c 65 20 6f 66 20 63 6f 6c 75 6d 6e   table of column
112b0 20 6e 61 6d 65 73 20 2a 2f 0a 0a 20 20 73 71 6c   names */..  sql
112c0 69 74 65 33 48 61 73 68 49 6e 69 74 28 26 68 74  ite3HashInit(&ht
112d0 29 3b 0a 20 20 69 66 28 20 70 45 4c 69 73 74 20  );.  if( pEList 
112e0 29 7b 0a 20 20 20 20 6e 43 6f 6c 20 3d 20 70 45  ){.    nCol = pE
112f0 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 20  List->nExpr;.   
11300 20 61 43 6f 6c 20 3d 20 73 71 6c 69 74 65 33 44   aCol = sqlite3D
11310 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20  bMallocZero(db, 
11320 73 69 7a 65 6f 66 28 61 43 6f 6c 5b 30 5d 29 2a  sizeof(aCol[0])*
11330 6e 43 6f 6c 29 3b 0a 20 20 20 20 74 65 73 74 63  nCol);.    testc
11340 61 73 65 28 20 61 43 6f 6c 3d 3d 30 20 29 3b 0a  ase( aCol==0 );.
11350 20 20 20 20 69 66 28 20 6e 43 6f 6c 3e 33 32 37      if( nCol>327
11360 36 37 20 29 20 6e 43 6f 6c 20 3d 20 33 32 37 36  67 ) nCol = 3276
11370 37 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  7;.  }else{.    
11380 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 61 43  nCol = 0;.    aC
11390 6f 6c 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 61 73  ol = 0;.  }.  as
113a0 73 65 72 74 28 20 6e 43 6f 6c 3d 3d 28 69 31 36  sert( nCol==(i16
113b0 29 6e 43 6f 6c 20 29 3b 0a 20 20 2a 70 6e 43 6f  )nCol );.  *pnCo
113c0 6c 20 3d 20 6e 43 6f 6c 3b 0a 20 20 2a 70 61 43  l = nCol;.  *paC
113d0 6f 6c 20 3d 20 61 43 6f 6c 3b 0a 0a 20 20 66 6f  ol = aCol;..  fo
113e0 72 28 69 3d 30 2c 20 70 43 6f 6c 3d 61 43 6f 6c  r(i=0, pCol=aCol
113f0 3b 20 69 3c 6e 43 6f 6c 20 26 26 20 21 64 62 2d  ; i<nCol && !db-
11400 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 3b 20 69  >mallocFailed; i
11410 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20  ++, pCol++){.   
11420 20 2f 2a 20 47 65 74 20 61 6e 20 61 70 70 72 6f   /* Get an appro
11430 70 72 69 61 74 65 20 6e 61 6d 65 20 66 6f 72 20  priate name for 
11440 74 68 65 20 63 6f 6c 75 6d 6e 0a 20 20 20 20 2a  the column.    *
11450 2f 0a 20 20 20 20 69 66 28 20 28 7a 4e 61 6d 65  /.    if( (zName
11460 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e   = pEList->a[i].
11470 7a 4e 61 6d 65 29 21 3d 30 20 29 7b 0a 20 20 20  zName)!=0 ){.   
11480 20 20 20 2f 2a 20 49 66 20 74 68 65 20 63 6f 6c     /* If the col
11490 75 6d 6e 20 63 6f 6e 74 61 69 6e 73 20 61 6e 20  umn contains an 
114a0 22 41 53 20 3c 6e 61 6d 65 3e 22 20 70 68 72 61  "AS <name>" phra
114b0 73 65 2c 20 75 73 65 20 3c 6e 61 6d 65 3e 20 61  se, use <name> a
114c0 73 20 74 68 65 20 6e 61 6d 65 20 2a 2f 0a 20 20  s the name */.  
114d0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 45    }else{.      E
114e0 78 70 72 20 2a 70 43 6f 6c 45 78 70 72 20 3d 20  xpr *pColExpr = 
114f0 73 71 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43  sqlite3ExprSkipC
11500 6f 6c 6c 61 74 65 41 6e 64 4c 69 6b 65 6c 79 28  ollateAndLikely(
11510 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78  pEList->a[i].pEx
11520 70 72 29 3b 0a 20 20 20 20 20 20 77 68 69 6c 65  pr);.      while
11530 28 20 70 43 6f 6c 45 78 70 72 2d 3e 6f 70 3d 3d  ( pColExpr->op==
11540 54 4b 5f 44 4f 54 20 29 7b 0a 20 20 20 20 20 20  TK_DOT ){.      
11550 20 20 70 43 6f 6c 45 78 70 72 20 3d 20 70 43 6f    pColExpr = pCo
11560 6c 45 78 70 72 2d 3e 70 52 69 67 68 74 3b 0a 20  lExpr->pRight;. 
11570 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
11580 43 6f 6c 45 78 70 72 21 3d 30 20 29 3b 0a 20 20  ColExpr!=0 );.  
11590 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
115a0 70 43 6f 6c 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  pColExpr->op==TK
115b0 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 20  _COLUMN ){.     
115c0 20 20 20 2f 2a 20 46 6f 72 20 63 6f 6c 75 6d 6e     /* For column
115d0 73 20 75 73 65 20 74 68 65 20 63 6f 6c 75 6d 6e  s use the column
115e0 20 6e 61 6d 65 20 6e 61 6d 65 20 2a 2f 0a 20 20   name name */.  
115f0 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d        int iCol =
11600 20 70 43 6f 6c 45 78 70 72 2d 3e 69 43 6f 6c 75   pColExpr->iColu
11610 6d 6e 3b 0a 20 20 20 20 20 20 20 20 54 61 62 6c  mn;.        Tabl
11620 65 20 2a 70 54 61 62 20 3d 20 70 43 6f 6c 45 78  e *pTab = pColEx
11630 70 72 2d 3e 79 2e 70 54 61 62 3b 0a 20 20 20 20  pr->y.pTab;.    
11640 20 20 20 20 61 73 73 65 72 74 28 20 70 54 61 62      assert( pTab
11650 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69  !=0 );.        i
11660 66 28 20 69 43 6f 6c 3c 30 20 29 20 69 43 6f 6c  f( iCol<0 ) iCol
11670 20 3d 20 70 54 61 62 2d 3e 69 50 4b 65 79 3b 0a   = pTab->iPKey;.
11680 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20          zName = 
11690 69 43 6f 6c 3e 3d 30 20 3f 20 70 54 61 62 2d 3e  iCol>=0 ? pTab->
116a0 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65  aCol[iCol].zName
116b0 20 3a 20 22 72 6f 77 69 64 22 3b 0a 20 20 20 20   : "rowid";.    
116c0 20 20 7d 65 6c 73 65 20 69 66 28 20 70 43 6f 6c    }else if( pCol
116d0 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 44 20  Expr->op==TK_ID 
116e0 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ){.        asser
116f0 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  t( !ExprHasPrope
11700 72 74 79 28 70 43 6f 6c 45 78 70 72 2c 20 45 50  rty(pColExpr, EP
11710 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20 20  _IntValue) );.  
11720 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 70 43        zName = pC
11730 6f 6c 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e  olExpr->u.zToken
11740 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
11750 20 20 20 20 20 20 20 2f 2a 20 55 73 65 20 74 68         /* Use th
11760 65 20 6f 72 69 67 69 6e 61 6c 20 74 65 78 74 20  e original text 
11770 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 65 78  of the column ex
11780 70 72 65 73 73 69 6f 6e 20 61 73 20 69 74 73 20  pression as its 
11790 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 20 20 20 20  name */.        
117a0 7a 4e 61 6d 65 20 3d 20 70 45 4c 69 73 74 2d 3e  zName = pEList->
117b0 61 5b 69 5d 2e 7a 53 70 61 6e 3b 0a 20 20 20 20  a[i].zSpan;.    
117c0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
117d0 28 20 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20  ( zName ){.     
117e0 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33   zName = sqlite3
117f0 44 62 53 74 72 44 75 70 28 64 62 2c 20 7a 4e 61  DbStrDup(db, zNa
11800 6d 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  me);.    }else{.
11810 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71        zName = sq
11820 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c  lite3MPrintf(db,
11830 22 63 6f 6c 75 6d 6e 25 64 22 2c 69 2b 31 29 3b  "column%d",i+1);
11840 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4d  .    }..    /* M
11850 61 6b 65 20 73 75 72 65 20 74 68 65 20 63 6f 6c  ake sure the col
11860 75 6d 6e 20 6e 61 6d 65 20 69 73 20 75 6e 69 71  umn name is uniq
11870 75 65 2e 20 20 49 66 20 74 68 65 20 6e 61 6d 65  ue.  If the name
11880 20 69 73 20 6e 6f 74 20 75 6e 69 71 75 65 2c 0a   is not unique,.
11890 20 20 20 20 2a 2a 20 61 70 70 65 6e 64 20 61 6e      ** append an
118a0 20 69 6e 74 65 67 65 72 20 74 6f 20 74 68 65 20   integer to the 
118b0 6e 61 6d 65 20 73 6f 20 74 68 61 74 20 69 74 20  name so that it 
118c0 62 65 63 6f 6d 65 73 20 75 6e 69 71 75 65 2e 0a  becomes unique..
118d0 20 20 20 20 2a 2f 0a 20 20 20 20 63 6e 74 20 3d      */.    cnt =
118e0 20 30 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 7a   0;.    while( z
118f0 4e 61 6d 65 20 26 26 20 73 71 6c 69 74 65 33 48  Name && sqlite3H
11900 61 73 68 46 69 6e 64 28 26 68 74 2c 20 7a 4e 61  ashFind(&ht, zNa
11910 6d 65 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  me)!=0 ){.      
11920 6e 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 53  nName = sqlite3S
11930 74 72 6c 65 6e 33 30 28 7a 4e 61 6d 65 29 3b 0a  trlen30(zName);.
11940 20 20 20 20 20 20 69 66 28 20 6e 4e 61 6d 65 3e        if( nName>
11950 30 20 29 7b 0a 20 20 20 20 20 20 20 20 66 6f 72  0 ){.        for
11960 28 6a 3d 6e 4e 61 6d 65 2d 31 3b 20 6a 3e 30 20  (j=nName-1; j>0 
11970 26 26 20 73 71 6c 69 74 65 33 49 73 64 69 67 69  && sqlite3Isdigi
11980 74 28 7a 4e 61 6d 65 5b 6a 5d 29 3b 20 6a 2d 2d  t(zName[j]); j--
11990 29 7b 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20  ){}.        if( 
119a0 7a 4e 61 6d 65 5b 6a 5d 3d 3d 27 3a 27 20 29 20  zName[j]==':' ) 
119b0 6e 4e 61 6d 65 20 3d 20 6a 3b 0a 20 20 20 20 20  nName = j;.     
119c0 20 7d 0a 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d   }.      zName =
119d0 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28   sqlite3MPrintf(
119e0 64 62 2c 20 22 25 2e 2a 7a 3a 25 75 22 2c 20 6e  db, "%.*z:%u", n
119f0 4e 61 6d 65 2c 20 7a 4e 61 6d 65 2c 20 2b 2b 63  Name, zName, ++c
11a00 6e 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 63  nt);.      if( c
11a10 6e 74 3e 33 20 29 20 73 71 6c 69 74 65 33 5f 72  nt>3 ) sqlite3_r
11a20 61 6e 64 6f 6d 6e 65 73 73 28 73 69 7a 65 6f 66  andomness(sizeof
11a30 28 63 6e 74 29 2c 20 26 63 6e 74 29 3b 0a 20 20  (cnt), &cnt);.  
11a40 20 20 7d 0a 20 20 20 20 70 43 6f 6c 2d 3e 7a 4e    }.    pCol->zN
11a50 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20 20  ame = zName;.   
11a60 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 50 72   sqlite3ColumnPr
11a70 6f 70 65 72 74 69 65 73 46 72 6f 6d 4e 61 6d 65  opertiesFromName
11a80 28 30 2c 20 70 43 6f 6c 29 3b 0a 20 20 20 20 69  (0, pCol);.    i
11a90 66 28 20 7a 4e 61 6d 65 20 26 26 20 73 71 6c 69  f( zName && sqli
11aa0 74 65 33 48 61 73 68 49 6e 73 65 72 74 28 26 68  te3HashInsert(&h
11ab0 74 2c 20 7a 4e 61 6d 65 2c 20 70 43 6f 6c 29 3d  t, zName, pCol)=
11ac0 3d 70 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20 73  =pCol ){.      s
11ad0 71 6c 69 74 65 33 4f 6f 6d 46 61 75 6c 74 28 64  qlite3OomFault(d
11ae0 62 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  b);.    }.  }.  
11af0 73 71 6c 69 74 65 33 48 61 73 68 43 6c 65 61 72  sqlite3HashClear
11b00 28 26 68 74 29 3b 0a 20 20 69 66 28 20 64 62 2d  (&ht);.  if( db-
11b10 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b  >mallocFailed ){
11b20 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c  .    for(j=0; j<
11b30 69 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 73  i; j++){.      s
11b40 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
11b50 20 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 29 3b   aCol[j].zName);
11b60 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
11b70 65 33 44 62 46 72 65 65 28 64 62 2c 20 61 43 6f  e3DbFree(db, aCo
11b80 6c 29 3b 0a 20 20 20 20 2a 70 61 43 6f 6c 20 3d  l);.    *paCol =
11b90 20 30 3b 0a 20 20 20 20 2a 70 6e 43 6f 6c 20 3d   0;.    *pnCol =
11ba0 20 30 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   0;.    return S
11bb0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54  QLITE_NOMEM_BKPT
11bc0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
11bd0 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
11be0 2a 2a 20 41 64 64 20 74 79 70 65 20 61 6e 64 20  ** Add type and 
11bf0 63 6f 6c 6c 61 74 69 6f 6e 20 69 6e 66 6f 72 6d  collation inform
11c00 61 74 69 6f 6e 20 74 6f 20 61 20 63 6f 6c 75 6d  ation to a colum
11c10 6e 20 6c 69 73 74 20 62 61 73 65 64 20 6f 6e 0a  n list based on.
11c20 2a 2a 20 61 20 53 45 4c 45 43 54 20 73 74 61 74  ** a SELECT stat
11c30 65 6d 65 6e 74 2e 0a 2a 2a 20 0a 2a 2a 20 54 68  ement..** .** Th
11c40 65 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 20 70 72  e column list pr
11c50 65 73 75 6d 61 62 6c 79 20 63 61 6d 65 20 66 72  esumably came fr
11c60 6f 6d 20 73 65 6c 65 63 74 43 6f 6c 75 6d 6e 4e  om selectColumnN
11c70 61 6d 65 73 46 72 6f 6d 45 78 70 72 4c 69 73 74  amesFromExprList
11c80 28 29 2e 0a 2a 2a 20 54 68 65 20 63 6f 6c 75 6d  ()..** The colum
11c90 6e 20 6c 69 73 74 20 68 61 73 20 6f 6e 6c 79 20  n list has only 
11ca0 6e 61 6d 65 73 2c 20 6e 6f 74 20 74 79 70 65 73  names, not types
11cb0 20 6f 72 20 63 6f 6c 6c 61 74 69 6f 6e 73 2e 20   or collations. 
11cc0 20 54 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65   This.** routine
11cd0 20 67 6f 65 73 20 74 68 72 6f 75 67 68 20 61 6e   goes through an
11ce0 64 20 61 64 64 73 20 74 68 65 20 74 79 70 65 73  d adds the types
11cf0 20 61 6e 64 20 63 6f 6c 6c 61 74 69 6f 6e 73 2e   and collations.
11d00 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
11d10 69 6e 65 20 72 65 71 75 69 72 65 73 20 74 68 61  ine requires tha
11d20 74 20 61 6c 6c 20 69 64 65 6e 74 69 66 69 65 72  t all identifier
11d30 73 20 69 6e 20 74 68 65 20 53 45 4c 45 43 54 0a  s in the SELECT.
11d40 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 62 65 20  ** statement be 
11d50 72 65 73 6f 6c 76 65 64 2e 0a 2a 2f 0a 76 6f 69  resolved..*/.voi
11d60 64 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 41  d sqlite3SelectA
11d70 64 64 43 6f 6c 75 6d 6e 54 79 70 65 41 6e 64 43  ddColumnTypeAndC
11d80 6f 6c 6c 61 74 69 6f 6e 28 0a 20 20 50 61 72 73  ollation(.  Pars
11d90 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
11da0 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
11db0 74 65 78 74 73 20 2a 2f 0a 20 20 54 61 62 6c 65  texts */.  Table
11dc0 20 2a 70 54 61 62 2c 20 20 20 20 20 20 20 20 20   *pTab,         
11dd0 20 2f 2a 20 41 64 64 20 63 6f 6c 75 6d 6e 20 74   /* Add column t
11de0 79 70 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ype information 
11df0 74 6f 20 74 68 69 73 20 74 61 62 6c 65 20 2a 2f  to this table */
11e00 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65  .  Select *pSele
11e10 63 74 2c 20 20 20 20 20 20 2f 2a 20 53 45 4c 45  ct,      /* SELE
11e20 43 54 20 75 73 65 64 20 74 6f 20 64 65 74 65 72  CT used to deter
11e30 6d 69 6e 65 20 74 79 70 65 73 20 61 6e 64 20 63  mine types and c
11e40 6f 6c 6c 61 74 69 6f 6e 73 20 2a 2f 0a 20 20 63  ollations */.  c
11e50 68 61 72 20 61 66 66 20 20 20 20 20 20 20 20 20  har aff         
11e60 20 20 20 20 20 2f 2a 20 44 65 66 61 75 6c 74 20       /* Default 
11e70 61 66 66 69 6e 69 74 79 20 66 6f 72 20 63 6f 6c  affinity for col
11e80 75 6d 6e 73 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c  umns */.){.  sql
11e90 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
11ea0 65 2d 3e 64 62 3b 0a 20 20 4e 61 6d 65 43 6f 6e  e->db;.  NameCon
11eb0 74 65 78 74 20 73 4e 43 3b 0a 20 20 43 6f 6c 75  text sNC;.  Colu
11ec0 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20 43 6f 6c 6c  mn *pCol;.  Coll
11ed0 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20 69 6e  Seq *pColl;.  in
11ee0 74 20 69 3b 0a 20 20 45 78 70 72 20 2a 70 3b 0a  t i;.  Expr *p;.
11ef0 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
11f00 74 5f 69 74 65 6d 20 2a 61 3b 0a 0a 20 20 61 73  t_item *a;..  as
11f10 73 65 72 74 28 20 70 53 65 6c 65 63 74 21 3d 30  sert( pSelect!=0
11f20 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70   );.  assert( (p
11f30 53 65 6c 65 63 74 2d 3e 73 65 6c 46 6c 61 67 73  Select->selFlags
11f40 20 26 20 53 46 5f 52 65 73 6f 6c 76 65 64 29 21   & SF_Resolved)!
11f50 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
11f60 70 54 61 62 2d 3e 6e 43 6f 6c 3d 3d 70 53 65 6c  pTab->nCol==pSel
11f70 65 63 74 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78  ect->pEList->nEx
11f80 70 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63  pr || db->malloc
11f90 46 61 69 6c 65 64 20 29 3b 0a 20 20 69 66 28 20  Failed );.  if( 
11fa0 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
11fb0 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 6d 65 6d   ) return;.  mem
11fc0 73 65 74 28 26 73 4e 43 2c 20 30 2c 20 73 69 7a  set(&sNC, 0, siz
11fd0 65 6f 66 28 73 4e 43 29 29 3b 0a 20 20 73 4e 43  eof(sNC));.  sNC
11fe0 2e 70 53 72 63 4c 69 73 74 20 3d 20 70 53 65 6c  .pSrcList = pSel
11ff0 65 63 74 2d 3e 70 53 72 63 3b 0a 20 20 61 20 3d  ect->pSrc;.  a =
12000 20 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74   pSelect->pEList
12010 2d 3e 61 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20  ->a;.  for(i=0, 
12020 70 43 6f 6c 3d 70 54 61 62 2d 3e 61 43 6f 6c 3b  pCol=pTab->aCol;
12030 20 69 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69   i<pTab->nCol; i
12040 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20  ++, pCol++){.   
12050 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 79   const char *zTy
12060 70 65 3b 0a 20 20 20 20 69 6e 74 20 6e 2c 20 6d  pe;.    int n, m
12070 3b 0a 20 20 20 20 70 20 3d 20 61 5b 69 5d 2e 70  ;.    p = a[i].p
12080 45 78 70 72 3b 0a 20 20 20 20 7a 54 79 70 65 20  Expr;.    zType 
12090 3d 20 63 6f 6c 75 6d 6e 54 79 70 65 28 26 73 4e  = columnType(&sN
120a0 43 2c 20 70 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  C, p, 0, 0, 0);.
120b0 20 20 20 20 2f 2a 20 70 43 6f 6c 2d 3e 73 7a 45      /* pCol->szE
120c0 73 74 20 3d 20 2e 2e 2e 20 2f 2f 20 43 6f 6c 75  st = ... // Colu
120d0 6d 6e 20 73 69 7a 65 20 65 73 74 20 66 6f 72 20  mn size est for 
120e0 53 45 4c 45 43 54 20 74 61 62 6c 65 73 20 6e 65  SELECT tables ne
120f0 76 65 72 20 75 73 65 64 20 2a 2f 0a 20 20 20 20  ver used */.    
12100 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 20 3d  pCol->affinity =
12110 20 73 71 6c 69 74 65 33 45 78 70 72 41 66 66 69   sqlite3ExprAffi
12120 6e 69 74 79 28 70 29 3b 0a 20 20 20 20 69 66 28  nity(p);.    if(
12130 20 7a 54 79 70 65 20 29 7b 0a 20 20 20 20 20 20   zType ){.      
12140 6d 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65  m = sqlite3Strle
12150 6e 33 30 28 7a 54 79 70 65 29 3b 0a 20 20 20 20  n30(zType);.    
12160 20 20 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72    n = sqlite3Str
12170 6c 65 6e 33 30 28 70 43 6f 6c 2d 3e 7a 4e 61 6d  len30(pCol->zNam
12180 65 29 3b 0a 20 20 20 20 20 20 70 43 6f 6c 2d 3e  e);.      pCol->
12190 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44  zName = sqlite3D
121a0 62 52 65 61 6c 6c 6f 63 4f 72 46 72 65 65 28 64  bReallocOrFree(d
121b0 62 2c 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 2c 20  b, pCol->zName, 
121c0 6e 2b 6d 2b 32 29 3b 0a 20 20 20 20 20 20 69 66  n+m+2);.      if
121d0 28 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 20 29 7b  ( pCol->zName ){
121e0 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28  .        memcpy(
121f0 26 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 5b 6e 2b 31  &pCol->zName[n+1
12200 5d 2c 20 7a 54 79 70 65 2c 20 6d 2b 31 29 3b 0a  ], zType, m+1);.
12210 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 63 6f          pCol->co
12220 6c 46 6c 61 67 73 20 7c 3d 20 43 4f 4c 46 4c 41  lFlags |= COLFLA
12230 47 5f 48 41 53 54 59 50 45 3b 0a 20 20 20 20 20  G_HASTYPE;.     
12240 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
12250 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 3c   pCol->affinity<
12260 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45  =SQLITE_AFF_NONE
12270 20 29 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74   ) pCol->affinit
12280 79 20 3d 20 61 66 66 3b 0a 20 20 20 20 70 43 6f  y = aff;.    pCo
12290 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ll = sqlite3Expr
122a0 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
122b0 70 29 3b 0a 20 20 20 20 69 66 28 20 70 43 6f 6c  p);.    if( pCol
122c0 6c 20 26 26 20 70 43 6f 6c 2d 3e 7a 43 6f 6c 6c  l && pCol->zColl
122d0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 43 6f  ==0 ){.      pCo
122e0 6c 2d 3e 7a 43 6f 6c 6c 20 3d 20 73 71 6c 69 74  l->zColl = sqlit
122f0 65 33 44 62 53 74 72 44 75 70 28 64 62 2c 20 70  e3DbStrDup(db, p
12300 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  Coll->zName);.  
12310 20 20 7d 0a 20 20 7d 0a 20 20 70 54 61 62 2d 3e    }.  }.  pTab->
12320 73 7a 54 61 62 52 6f 77 20 3d 20 31 3b 20 2f 2a  szTabRow = 1; /*
12330 20 41 6e 79 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61   Any non-zero va
12340 6c 75 65 20 77 6f 72 6b 73 20 2a 2f 0a 7d 0a 0a  lue works */.}..
12350 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 20 53 45  /*.** Given a SE
12360 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2c 20  LECT statement, 
12370 67 65 6e 65 72 61 74 65 20 61 20 54 61 62 6c 65  generate a Table
12380 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20   structure that 
12390 64 65 73 63 72 69 62 65 73 0a 2a 2a 20 74 68 65  describes.** the
123a0 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20 74   result set of t
123b0 68 61 74 20 53 45 4c 45 43 54 2e 0a 2a 2f 0a 54  hat SELECT..*/.T
123c0 61 62 6c 65 20 2a 73 71 6c 69 74 65 33 52 65 73  able *sqlite3Res
123d0 75 6c 74 53 65 74 4f 66 53 65 6c 65 63 74 28 50  ultSetOfSelect(P
123e0 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 65  arse *pParse, Se
123f0 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 2c 20 63  lect *pSelect, c
12400 68 61 72 20 61 66 66 29 7b 0a 20 20 54 61 62 6c  har aff){.  Tabl
12410 65 20 2a 70 54 61 62 3b 0a 20 20 73 71 6c 69 74  e *pTab;.  sqlit
12420 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
12430 3e 64 62 3b 0a 20 20 75 36 34 20 73 61 76 65 64  >db;.  u64 saved
12440 46 6c 61 67 73 3b 0a 0a 20 20 73 61 76 65 64 46  Flags;..  savedF
12450 6c 61 67 73 20 3d 20 64 62 2d 3e 66 6c 61 67 73  lags = db->flags
12460 3b 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d  ;.  db->flags &=
12470 20 7e 28 75 36 34 29 53 51 4c 49 54 45 5f 46 75   ~(u64)SQLITE_Fu
12480 6c 6c 43 6f 6c 4e 61 6d 65 73 3b 0a 20 20 64 62  llColNames;.  db
12490 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54  ->flags |= SQLIT
124a0 45 5f 53 68 6f 72 74 43 6f 6c 4e 61 6d 65 73 3b  E_ShortColNames;
124b0 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  .  sqlite3Select
124c0 50 72 65 70 28 70 50 61 72 73 65 2c 20 70 53 65  Prep(pParse, pSe
124d0 6c 65 63 74 2c 20 30 29 3b 0a 20 20 64 62 2d 3e  lect, 0);.  db->
124e0 66 6c 61 67 73 20 3d 20 73 61 76 65 64 46 6c 61  flags = savedFla
124f0 67 73 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65  gs;.  if( pParse
12500 2d 3e 6e 45 72 72 20 29 20 72 65 74 75 72 6e 20  ->nErr ) return 
12510 30 3b 0a 20 20 77 68 69 6c 65 28 20 70 53 65 6c  0;.  while( pSel
12520 65 63 74 2d 3e 70 50 72 69 6f 72 20 29 20 70 53  ect->pPrior ) pS
12530 65 6c 65 63 74 20 3d 20 70 53 65 6c 65 63 74 2d  elect = pSelect-
12540 3e 70 50 72 69 6f 72 3b 0a 20 20 70 54 61 62 20  >pPrior;.  pTab 
12550 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
12560 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66  cZero(db, sizeof
12570 28 54 61 62 6c 65 29 20 29 3b 0a 20 20 69 66 28  (Table) );.  if(
12580 20 70 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20   pTab==0 ){.    
12590 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
125a0 70 54 61 62 2d 3e 6e 54 61 62 52 65 66 20 3d 20  pTab->nTabRef = 
125b0 31 3b 0a 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  1;.  pTab->zName
125c0 20 3d 20 30 3b 0a 20 20 70 54 61 62 2d 3e 6e 52   = 0;.  pTab->nR
125d0 6f 77 4c 6f 67 45 73 74 20 3d 20 32 30 30 3b 20  owLogEst = 200; 
125e0 61 73 73 65 72 74 28 20 32 30 30 3d 3d 73 71 6c  assert( 200==sql
125f0 69 74 65 33 4c 6f 67 45 73 74 28 31 30 34 38 35  ite3LogEst(10485
12600 37 36 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  76) );.  sqlite3
12610 43 6f 6c 75 6d 6e 73 46 72 6f 6d 45 78 70 72 4c  ColumnsFromExprL
12620 69 73 74 28 70 50 61 72 73 65 2c 20 70 53 65 6c  ist(pParse, pSel
12630 65 63 74 2d 3e 70 45 4c 69 73 74 2c 20 26 70 54  ect->pEList, &pT
12640 61 62 2d 3e 6e 43 6f 6c 2c 20 26 70 54 61 62 2d  ab->nCol, &pTab-
12650 3e 61 43 6f 6c 29 3b 0a 20 20 73 71 6c 69 74 65  >aCol);.  sqlite
12660 33 53 65 6c 65 63 74 41 64 64 43 6f 6c 75 6d 6e  3SelectAddColumn
12670 54 79 70 65 41 6e 64 43 6f 6c 6c 61 74 69 6f 6e  TypeAndCollation
12680 28 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20 70  (pParse, pTab, p
12690 53 65 6c 65 63 74 2c 20 61 66 66 29 3b 0a 20 20  Select, aff);.  
126a0 70 54 61 62 2d 3e 69 50 4b 65 79 20 3d 20 2d 31  pTab->iPKey = -1
126b0 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c  ;.  if( db->mall
126c0 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20  ocFailed ){.    
126d0 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54 61 62  sqlite3DeleteTab
126e0 6c 65 28 64 62 2c 20 70 54 61 62 29 3b 0a 20 20  le(db, pTab);.  
126f0 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
12700 20 20 72 65 74 75 72 6e 20 70 54 61 62 3b 0a 7d    return pTab;.}
12710 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61 20 56 44  ../*.** Get a VD
12720 42 45 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e  BE for the given
12730 20 70 61 72 73 65 72 20 63 6f 6e 74 65 78 74 2e   parser context.
12740 20 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 6f    Create a new o
12750 6e 65 20 69 66 20 6e 65 63 65 73 73 61 72 79 2e  ne if necessary.
12760 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20  .** If an error 
12770 6f 63 63 75 72 73 2c 20 72 65 74 75 72 6e 20 4e  occurs, return N
12780 55 4c 4c 20 61 6e 64 20 6c 65 61 76 65 20 61 20  ULL and leave a 
12790 6d 65 73 73 61 67 65 20 69 6e 20 70 50 61 72 73  message in pPars
127a0 65 2e 0a 2a 2f 0a 56 64 62 65 20 2a 73 71 6c 69  e..*/.Vdbe *sqli
127b0 74 65 33 47 65 74 56 64 62 65 28 50 61 72 73 65  te3GetVdbe(Parse
127c0 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 69 66 28   *pParse){.  if(
127d0 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 20 29   pParse->pVdbe )
127e0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 50 61  {.    return pPa
127f0 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 7d 0a  rse->pVdbe;.  }.
12800 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 70 54    if( pParse->pT
12810 6f 70 6c 65 76 65 6c 3d 3d 30 0a 20 20 20 26 26  oplevel==0.   &&
12820 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 45 6e 61   OptimizationEna
12830 62 6c 65 64 28 70 50 61 72 73 65 2d 3e 64 62 2c  bled(pParse->db,
12840 53 51 4c 49 54 45 5f 46 61 63 74 6f 72 4f 75 74  SQLITE_FactorOut
12850 43 6f 6e 73 74 29 0a 20 20 29 7b 0a 20 20 20 20  Const).  ){.    
12860 70 50 61 72 73 65 2d 3e 6f 6b 43 6f 6e 73 74 46  pParse->okConstF
12870 61 63 74 6f 72 20 3d 20 31 3b 0a 20 20 7d 0a 20  actor = 1;.  }. 
12880 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 56   return sqlite3V
12890 64 62 65 43 72 65 61 74 65 28 70 50 61 72 73 65  dbeCreate(pParse
128a0 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d  );.}.../*.** Com
128b0 70 75 74 65 20 74 68 65 20 69 4c 69 6d 69 74 20  pute the iLimit 
128c0 61 6e 64 20 69 4f 66 66 73 65 74 20 66 69 65 6c  and iOffset fiel
128d0 64 73 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54  ds of the SELECT
128e0 20 62 61 73 65 64 20 6f 6e 20 74 68 65 0a 2a 2a   based on the.**
128f0 20 70 4c 69 6d 69 74 20 65 78 70 72 65 73 73 69   pLimit expressi
12900 6f 6e 73 2e 20 20 70 4c 69 6d 69 74 2d 3e 70 4c  ons.  pLimit->pL
12910 65 66 74 20 61 6e 64 20 70 4c 69 6d 69 74 2d 3e  eft and pLimit->
12920 70 52 69 67 68 74 20 68 6f 6c 64 20 74 68 65 20  pRight hold the 
12930 65 78 70 72 65 73 73 69 6f 6e 73 0a 2a 2a 20 74  expressions.** t
12940 68 61 74 20 61 70 70 65 61 72 20 69 6e 20 74 68  hat appear in th
12950 65 20 6f 72 69 67 69 6e 61 6c 20 53 51 4c 20 73  e original SQL s
12960 74 61 74 65 6d 65 6e 74 20 61 66 74 65 72 20 74  tatement after t
12970 68 65 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46  he LIMIT and OFF
12980 53 45 54 0a 2a 2a 20 6b 65 79 77 6f 72 64 73 2e  SET.** keywords.
12990 20 20 4f 72 20 4e 55 4c 4c 20 69 66 20 74 68 6f    Or NULL if tho
129a0 73 65 20 6b 65 79 77 6f 72 64 73 20 61 72 65 20  se keywords are 
129b0 6f 6d 69 74 74 65 64 2e 20 69 4c 69 6d 69 74 20  omitted. iLimit 
129c0 61 6e 64 20 69 4f 66 66 73 65 74 20 0a 2a 2a 20  and iOffset .** 
129d0 61 72 65 20 74 68 65 20 69 6e 74 65 67 65 72 20  are the integer 
129e0 6d 65 6d 6f 72 79 20 72 65 67 69 73 74 65 72 20  memory register 
129f0 6e 75 6d 62 65 72 73 20 66 6f 72 20 63 6f 75 6e  numbers for coun
12a00 74 65 72 73 20 75 73 65 64 20 74 6f 20 63 6f 6d  ters used to com
12a10 70 75 74 65 20 0a 2a 2a 20 74 68 65 20 6c 69 6d  pute .** the lim
12a20 69 74 20 61 6e 64 20 6f 66 66 73 65 74 2e 20 20  it and offset.  
12a30 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6c  If there is no l
12a40 69 6d 69 74 20 61 6e 64 2f 6f 72 20 6f 66 66 73  imit and/or offs
12a50 65 74 2c 20 74 68 65 6e 20 0a 2a 2a 20 69 4c 69  et, then .** iLi
12a60 6d 69 74 20 61 6e 64 20 69 4f 66 66 73 65 74 20  mit and iOffset 
12a70 61 72 65 20 6e 65 67 61 74 69 76 65 2e 0a 2a 2a  are negative..**
12a80 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
12a90 20 63 68 61 6e 67 65 73 20 74 68 65 20 76 61 6c   changes the val
12aa0 75 65 73 20 6f 66 20 69 4c 69 6d 69 74 20 61 6e  ues of iLimit an
12ab0 64 20 69 4f 66 66 73 65 74 20 6f 6e 6c 79 20 69  d iOffset only i
12ac0 66 0a 2a 2a 20 61 20 6c 69 6d 69 74 20 6f 72 20  f.** a limit or 
12ad0 6f 66 66 73 65 74 20 69 73 20 64 65 66 69 6e 65  offset is define
12ae0 64 20 62 79 20 70 4c 69 6d 69 74 2d 3e 70 4c 65  d by pLimit->pLe
12af0 66 74 20 61 6e 64 20 70 4c 69 6d 69 74 2d 3e 70  ft and pLimit->p
12b00 52 69 67 68 74 2e 20 20 69 4c 69 6d 69 74 0a 2a  Right.  iLimit.*
12b10 2a 20 61 6e 64 20 69 4f 66 66 73 65 74 20 73 68  * and iOffset sh
12b20 6f 75 6c 64 20 68 61 76 65 20 62 65 65 6e 20 70  ould have been p
12b30 72 65 73 65 74 20 74 6f 20 61 70 70 72 6f 70 72  reset to appropr
12b40 69 61 74 65 20 64 65 66 61 75 6c 74 20 76 61 6c  iate default val
12b50 75 65 73 20 28 7a 65 72 6f 29 0a 2a 2a 20 70 72  ues (zero).** pr
12b60 69 6f 72 20 74 6f 20 63 61 6c 6c 69 6e 67 20 74  ior to calling t
12b70 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a 0a  his routine..**.
12b80 2a 2a 20 54 68 65 20 69 4f 66 66 73 65 74 20 72  ** The iOffset r
12b90 65 67 69 73 74 65 72 20 28 69 66 20 69 74 20 65  egister (if it e
12ba0 78 69 73 74 73 29 20 69 73 20 69 6e 69 74 69 61  xists) is initia
12bb0 6c 69 7a 65 64 20 74 6f 20 74 68 65 20 76 61 6c  lized to the val
12bc0 75 65 0a 2a 2a 20 6f 66 20 74 68 65 20 4f 46 46  ue.** of the OFF
12bd0 53 45 54 2e 20 20 54 68 65 20 69 4c 69 6d 69 74  SET.  The iLimit
12be0 20 72 65 67 69 73 74 65 72 20 69 73 20 69 6e 69   register is ini
12bf0 74 69 61 6c 69 7a 65 64 20 74 6f 20 4c 49 4d 49  tialized to LIMI
12c00 54 2e 20 20 52 65 67 69 73 74 65 72 0a 2a 2a 20  T.  Register.** 
12c10 69 4f 66 66 73 65 74 2b 31 20 69 73 20 69 6e 69  iOffset+1 is ini
12c20 74 69 61 6c 69 7a 65 64 20 74 6f 20 4c 49 4d 49  tialized to LIMI
12c30 54 2b 4f 46 46 53 45 54 2e 0a 2a 2a 0a 2a 2a 20  T+OFFSET..**.** 
12c40 4f 6e 6c 79 20 69 66 20 70 4c 69 6d 69 74 2d 3e  Only if pLimit->
12c50 70 4c 65 66 74 21 3d 30 20 64 6f 20 74 68 65 20  pLeft!=0 do the 
12c60 6c 69 6d 69 74 20 72 65 67 69 73 74 65 72 73 20  limit registers 
12c70 67 65 74 0a 2a 2a 20 72 65 64 65 66 69 6e 65 64  get.** redefined
12c80 2e 20 20 54 68 65 20 55 4e 49 4f 4e 20 41 4c 4c  .  The UNION ALL
12c90 20 6f 70 65 72 61 74 6f 72 20 75 73 65 73 20 74   operator uses t
12ca0 68 69 73 20 70 72 6f 70 65 72 74 79 20 74 6f 20  his property to 
12cb0 66 6f 72 63 65 0a 2a 2a 20 74 68 65 20 72 65 75  force.** the reu
12cc0 73 65 20 6f 66 20 74 68 65 20 73 61 6d 65 20 6c  se of the same l
12cd0 69 6d 69 74 20 61 6e 64 20 6f 66 66 73 65 74 20  imit and offset 
12ce0 72 65 67 69 73 74 65 72 73 20 61 63 72 6f 73 73  registers across
12cf0 20 6d 75 6c 74 69 70 6c 65 0a 2a 2a 20 53 45 4c   multiple.** SEL
12d00 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a  ECT statements..
12d10 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63  */.static void c
12d20 6f 6d 70 75 74 65 4c 69 6d 69 74 52 65 67 69 73  omputeLimitRegis
12d30 74 65 72 73 28 50 61 72 73 65 20 2a 70 50 61 72  ters(Parse *pPar
12d40 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 2c 20 69  se, Select *p, i
12d50 6e 74 20 69 42 72 65 61 6b 29 7b 0a 20 20 56 64  nt iBreak){.  Vd
12d60 62 65 20 2a 76 20 3d 20 30 3b 0a 20 20 69 6e 74  be *v = 0;.  int
12d70 20 69 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 69   iLimit = 0;.  i
12d80 6e 74 20 69 4f 66 66 73 65 74 3b 0a 20 20 69 6e  nt iOffset;.  in
12d90 74 20 6e 3b 0a 20 20 45 78 70 72 20 2a 70 4c 69  t n;.  Expr *pLi
12da0 6d 69 74 20 3d 20 70 2d 3e 70 4c 69 6d 69 74 3b  mit = p->pLimit;
12db0 0a 0a 20 20 69 66 28 20 70 2d 3e 69 4c 69 6d 69  ..  if( p->iLimi
12dc0 74 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 2f  t ) return;..  /
12dd0 2a 20 0a 20 20 2a 2a 20 22 4c 49 4d 49 54 20 2d  * .  ** "LIMIT -
12de0 31 22 20 61 6c 77 61 79 73 20 73 68 6f 77 73 20  1" always shows 
12df0 61 6c 6c 20 72 6f 77 73 2e 20 20 54 68 65 72 65  all rows.  There
12e00 20 69 73 20 73 6f 6d 65 0a 20 20 2a 2a 20 63 6f   is some.  ** co
12e10 6e 74 72 6f 76 65 72 73 79 20 61 62 6f 75 74 20  ntroversy about 
12e20 77 68 61 74 20 74 68 65 20 63 6f 72 72 65 63 74  what the correct
12e30 20 62 65 68 61 76 69 6f 72 20 73 68 6f 75 6c 64   behavior should
12e40 20 62 65 2e 0a 20 20 2a 2a 20 54 68 65 20 63 75   be..  ** The cu
12e50 72 72 65 6e 74 20 69 6d 70 6c 65 6d 65 6e 74 61  rrent implementa
12e60 74 69 6f 6e 20 69 6e 74 65 72 70 72 65 74 73 20  tion interprets 
12e70 22 4c 49 4d 49 54 20 30 22 20 74 6f 20 6d 65 61  "LIMIT 0" to mea
12e80 6e 0a 20 20 2a 2a 20 6e 6f 20 72 6f 77 73 2e 0a  n.  ** no rows..
12e90 20 20 2a 2f 0a 20 20 69 66 28 20 70 4c 69 6d 69    */.  if( pLimi
12ea0 74 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  t ){.    assert(
12eb0 20 70 4c 69 6d 69 74 2d 3e 6f 70 3d 3d 54 4b 5f   pLimit->op==TK_
12ec0 4c 49 4d 49 54 20 29 3b 0a 20 20 20 20 61 73 73  LIMIT );.    ass
12ed0 65 72 74 28 20 70 4c 69 6d 69 74 2d 3e 70 4c 65  ert( pLimit->pLe
12ee0 66 74 21 3d 30 20 29 3b 0a 20 20 20 20 70 2d 3e  ft!=0 );.    p->
12ef0 69 4c 69 6d 69 74 20 3d 20 69 4c 69 6d 69 74 20  iLimit = iLimit 
12f00 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
12f10 3b 0a 20 20 20 20 76 20 3d 20 73 71 6c 69 74 65  ;.    v = sqlite
12f20 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  3GetVdbe(pParse)
12f30 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 76 21  ;.    assert( v!
12f40 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 73 71  =0 );.    if( sq
12f50 6c 69 74 65 33 45 78 70 72 49 73 49 6e 74 65 67  lite3ExprIsInteg
12f60 65 72 28 70 4c 69 6d 69 74 2d 3e 70 4c 65 66 74  er(pLimit->pLeft
12f70 2c 20 26 6e 29 20 29 7b 0a 20 20 20 20 20 20 73  , &n) ){.      s
12f80 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
12f90 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
12fa0 6e 2c 20 69 4c 69 6d 69 74 29 3b 0a 20 20 20 20  n, iLimit);.    
12fb0 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
12fc0 2c 20 22 4c 49 4d 49 54 20 63 6f 75 6e 74 65 72  , "LIMIT counter
12fd0 22 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6e  "));.      if( n
12fe0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ==0 ){.        s
12ff0 71 6c 69 74 65 33 56 64 62 65 47 6f 74 6f 28 76  qlite3VdbeGoto(v
13000 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20  , iBreak);.     
13010 20 7d 65 6c 73 65 20 69 66 28 20 6e 3e 3d 30 20   }else if( n>=0 
13020 26 26 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77  && p->nSelectRow
13030 3e 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 28  >sqlite3LogEst((
13040 75 36 34 29 6e 29 20 29 7b 0a 20 20 20 20 20 20  u64)n) ){.      
13050 20 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20    p->nSelectRow 
13060 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28  = sqlite3LogEst(
13070 28 75 36 34 29 6e 29 3b 0a 20 20 20 20 20 20 20  (u64)n);.       
13080 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20   p->selFlags |= 
13090 53 46 5f 46 69 78 65 64 4c 69 6d 69 74 3b 0a 20  SF_FixedLimit;. 
130a0 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
130b0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
130c0 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
130d0 70 4c 69 6d 69 74 2d 3e 70 4c 65 66 74 2c 20 69  pLimit->pLeft, i
130e0 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20 20 73 71  Limit);.      sq
130f0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
13100 76 2c 20 4f 50 5f 4d 75 73 74 42 65 49 6e 74 2c  v, OP_MustBeInt,
13110 20 69 4c 69 6d 69 74 29 3b 20 56 64 62 65 43 6f   iLimit); VdbeCo
13120 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20  verage(v);.     
13130 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
13140 20 22 4c 49 4d 49 54 20 63 6f 75 6e 74 65 72 22   "LIMIT counter"
13150 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ));.      sqlite
13160 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
13170 50 5f 49 66 4e 6f 74 2c 20 69 4c 69 6d 69 74 2c  P_IfNot, iLimit,
13180 20 69 42 72 65 61 6b 29 3b 20 56 64 62 65 43 6f   iBreak); VdbeCo
13190 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 7d  verage(v);.    }
131a0 0a 20 20 20 20 69 66 28 20 70 4c 69 6d 69 74 2d  .    if( pLimit-
131b0 3e 70 52 69 67 68 74 20 29 7b 0a 20 20 20 20 20  >pRight ){.     
131c0 20 70 2d 3e 69 4f 66 66 73 65 74 20 3d 20 69 4f   p->iOffset = iO
131d0 66 66 73 65 74 20 3d 20 2b 2b 70 50 61 72 73 65  ffset = ++pParse
131e0 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 70 50  ->nMem;.      pP
131f0 61 72 73 65 2d 3e 6e 4d 65 6d 2b 2b 3b 20 20 20  arse->nMem++;   
13200 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 20 65  /* Allocate an e
13210 78 74 72 61 20 72 65 67 69 73 74 65 72 20 66 6f  xtra register fo
13220 72 20 6c 69 6d 69 74 2b 6f 66 66 73 65 74 20 2a  r limit+offset *
13230 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  /.      sqlite3E
13240 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
13250 70 4c 69 6d 69 74 2d 3e 70 52 69 67 68 74 2c 20  pLimit->pRight, 
13260 69 4f 66 66 73 65 74 29 3b 0a 20 20 20 20 20 20  iOffset);.      
13270 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
13280 31 28 76 2c 20 4f 50 5f 4d 75 73 74 42 65 49 6e  1(v, OP_MustBeIn
13290 74 2c 20 69 4f 66 66 73 65 74 29 3b 20 56 64 62  t, iOffset); Vdb
132a0 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
132b0 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
132c0 28 76 2c 20 22 4f 46 46 53 45 54 20 63 6f 75 6e  (v, "OFFSET coun
132d0 74 65 72 22 29 29 3b 0a 20 20 20 20 20 20 73 71  ter"));.      sq
132e0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
132f0 76 2c 20 4f 50 5f 4f 66 66 73 65 74 4c 69 6d 69  v, OP_OffsetLimi
13300 74 2c 20 69 4c 69 6d 69 74 2c 20 69 4f 66 66 73  t, iLimit, iOffs
13310 65 74 2b 31 2c 20 69 4f 66 66 73 65 74 29 3b 0a  et+1, iOffset);.
13320 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e        VdbeCommen
13330 74 28 28 76 2c 20 22 4c 49 4d 49 54 2b 4f 46 46  t((v, "LIMIT+OFF
13340 53 45 54 22 29 29 3b 0a 20 20 20 20 7d 0a 20 20  SET"));.    }.  
13350 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  }.}..#ifndef SQL
13360 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e  ITE_OMIT_COMPOUN
13370 44 5f 53 45 4c 45 43 54 0a 2f 2a 0a 2a 2a 20 52  D_SELECT./*.** R
13380 65 74 75 72 6e 20 74 68 65 20 61 70 70 72 6f 70  eturn the approp
13390 72 69 61 74 65 20 63 6f 6c 6c 61 74 69 6e 67 20  riate collating 
133a0 73 65 71 75 65 6e 63 65 20 66 6f 72 20 74 68 65  sequence for the
133b0 20 69 43 6f 6c 2d 74 68 20 63 6f 6c 75 6d 6e 20   iCol-th column 
133c0 6f 66 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c 74  of.** the result
133d0 20 73 65 74 20 66 6f 72 20 74 68 65 20 63 6f 6d   set for the com
133e0 70 6f 75 6e 64 2d 73 65 6c 65 63 74 20 73 74 61  pound-select sta
133f0 74 65 6d 65 6e 74 20 22 70 22 2e 20 20 52 65 74  tement "p".  Ret
13400 75 72 6e 20 4e 55 4c 4c 20 69 66 0a 2a 2a 20 74  urn NULL if.** t
13410 68 65 20 63 6f 6c 75 6d 6e 20 68 61 73 20 6e 6f  he column has no
13420 20 64 65 66 61 75 6c 74 20 63 6f 6c 6c 61 74 69   default collati
13430 6e 67 20 73 65 71 75 65 6e 63 65 2e 0a 2a 2a 0a  ng sequence..**.
13440 2a 2a 20 54 68 65 20 63 6f 6c 6c 61 74 69 6e 67  ** The collating
13450 20 73 65 71 75 65 6e 63 65 20 66 6f 72 20 74 68   sequence for th
13460 65 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63  e compound selec
13470 74 20 69 73 20 74 61 6b 65 6e 20 66 72 6f 6d 20  t is taken from 
13480 74 68 65 0a 2a 2a 20 6c 65 66 74 2d 6d 6f 73 74  the.** left-most
13490 20 74 65 72 6d 20 6f 66 20 74 68 65 20 73 65 6c   term of the sel
134a0 65 63 74 20 74 68 61 74 20 68 61 73 20 61 20 63  ect that has a c
134b0 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
134c0 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 43 6f 6c  e..*/.static Col
134d0 6c 53 65 71 20 2a 6d 75 6c 74 69 53 65 6c 65 63  lSeq *multiSelec
134e0 74 43 6f 6c 6c 53 65 71 28 50 61 72 73 65 20 2a  tCollSeq(Parse *
134f0 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a  pParse, Select *
13500 70 2c 20 69 6e 74 20 69 43 6f 6c 29 7b 0a 20 20  p, int iCol){.  
13510 43 6f 6c 6c 53 65 71 20 2a 70 52 65 74 3b 0a 20  CollSeq *pRet;. 
13520 20 69 66 28 20 70 2d 3e 70 50 72 69 6f 72 20 29   if( p->pPrior )
13530 7b 0a 20 20 20 20 70 52 65 74 20 3d 20 6d 75 6c  {.    pRet = mul
13540 74 69 53 65 6c 65 63 74 43 6f 6c 6c 53 65 71 28  tiSelectCollSeq(
13550 70 50 61 72 73 65 2c 20 70 2d 3e 70 50 72 69 6f  pParse, p->pPrio
13560 72 2c 20 69 43 6f 6c 29 3b 0a 20 20 7d 65 6c 73  r, iCol);.  }els
13570 65 7b 0a 20 20 20 20 70 52 65 74 20 3d 20 30 3b  e{.    pRet = 0;
13580 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 69  .  }.  assert( i
13590 43 6f 6c 3e 3d 30 20 29 3b 0a 20 20 2f 2a 20 69  Col>=0 );.  /* i
135a0 43 6f 6c 20 6d 75 73 74 20 62 65 20 6c 65 73 73  Col must be less
135b0 20 74 68 61 6e 20 70 2d 3e 70 45 4c 69 73 74 2d   than p->pEList-
135c0 3e 6e 45 78 70 72 2e 20 20 4f 74 68 65 72 77 69  >nExpr.  Otherwi
135d0 73 65 20 61 6e 20 65 72 72 6f 72 20 77 6f 75 6c  se an error woul
135e0 64 0a 20 20 2a 2a 20 68 61 76 65 20 62 65 65 6e  d.  ** have been
135f0 20 74 68 72 6f 77 6e 20 64 75 72 69 6e 67 20 6e   thrown during n
13600 61 6d 65 20 72 65 73 6f 6c 75 74 69 6f 6e 20 61  ame resolution a
13610 6e 64 20 77 65 20 77 6f 75 6c 64 20 6e 6f 74 20  nd we would not 
13620 68 61 76 65 20 67 6f 74 74 65 6e 0a 20 20 2a 2a  have gotten.  **
13630 20 74 68 69 73 20 66 61 72 20 2a 2f 0a 20 20 69   this far */.  i
13640 66 28 20 70 52 65 74 3d 3d 30 20 26 26 20 41 4c  f( pRet==0 && AL
13650 57 41 59 53 28 69 43 6f 6c 3c 70 2d 3e 70 45 4c  WAYS(iCol<p->pEL
13660 69 73 74 2d 3e 6e 45 78 70 72 29 20 29 7b 0a 20  ist->nExpr) ){. 
13670 20 20 20 70 52 65 74 20 3d 20 73 71 6c 69 74 65     pRet = sqlite
13680 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61  3ExprCollSeq(pPa
13690 72 73 65 2c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e  rse, p->pEList->
136a0 61 5b 69 43 6f 6c 5d 2e 70 45 78 70 72 29 3b 0a  a[iCol].pExpr);.
136b0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 52 65    }.  return pRe
136c0 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  t;.}../*.** The 
136d0 73 65 6c 65 63 74 20 73 74 61 74 65 6d 65 6e 74  select statement
136e0 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73   passed as the s
136f0 65 63 6f 6e 64 20 70 61 72 61 6d 65 74 65 72 20  econd parameter 
13700 69 73 20 61 20 63 6f 6d 70 6f 75 6e 64 20 53 45  is a compound SE
13710 4c 45 43 54 0a 2a 2a 20 77 69 74 68 20 61 6e 20  LECT.** with an 
13720 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 2e  ORDER BY clause.
13730 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61   This function a
13740 6c 6c 6f 63 61 74 65 73 20 61 6e 64 20 72 65 74  llocates and ret
13750 75 72 6e 73 20 61 20 4b 65 79 49 6e 66 6f 0a 2a  urns a KeyInfo.*
13760 2a 20 73 74 72 75 63 74 75 72 65 20 73 75 69 74  * structure suit
13770 61 62 6c 65 20 66 6f 72 20 69 6d 70 6c 65 6d 65  able for impleme
13780 6e 74 69 6e 67 20 74 68 65 20 4f 52 44 45 52 20  nting the ORDER 
13790 42 59 2e 0a 2a 2a 0a 2a 2a 20 53 70 61 63 65 20  BY..**.** Space 
137a0 74 6f 20 68 6f 6c 64 20 74 68 65 20 4b 65 79 49  to hold the KeyI
137b0 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 69 73  nfo structure is
137c0 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 6d   obtained from m
137d0 61 6c 6c 6f 63 2e 20 54 68 65 20 63 61 6c 6c 69  alloc. The calli
137e0 6e 67 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 69  ng.** function i
137f0 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f  s responsible fo
13800 72 20 65 6e 73 75 72 69 6e 67 20 74 68 61 74 20  r ensuring that 
13810 74 68 69 73 20 73 74 72 75 63 74 75 72 65 20 69  this structure i
13820 73 20 65 76 65 6e 74 75 61 6c 6c 79 0a 2a 2a 20  s eventually.** 
13830 66 72 65 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  freed..*/.static
13840 20 4b 65 79 49 6e 66 6f 20 2a 6d 75 6c 74 69 53   KeyInfo *multiS
13850 65 6c 65 63 74 4f 72 64 65 72 42 79 4b 65 79 49  electOrderByKeyI
13860 6e 66 6f 28 50 61 72 73 65 20 2a 70 50 61 72 73  nfo(Parse *pPars
13870 65 2c 20 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e  e, Select *p, in
13880 74 20 6e 45 78 74 72 61 29 7b 0a 20 20 45 78 70  t nExtra){.  Exp
13890 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 20  rList *pOrderBy 
138a0 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20  = p->pOrderBy;. 
138b0 20 69 6e 74 20 6e 4f 72 64 65 72 42 79 20 3d 20   int nOrderBy = 
138c0 70 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78  p->pOrderBy->nEx
138d0 70 72 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  pr;.  sqlite3 *d
138e0 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
138f0 20 20 4b 65 79 49 6e 66 6f 20 2a 70 52 65 74 20    KeyInfo *pRet 
13900 3d 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f  = sqlite3KeyInfo
13910 41 6c 6c 6f 63 28 64 62 2c 20 6e 4f 72 64 65 72  Alloc(db, nOrder
13920 42 79 2b 6e 45 78 74 72 61 2c 20 31 29 3b 0a 20  By+nExtra, 1);. 
13930 20 69 66 28 20 70 52 65 74 20 29 7b 0a 20 20 20   if( pRet ){.   
13940 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28   int i;.    for(
13950 69 3d 30 3b 20 69 3c 6e 4f 72 64 65 72 42 79 3b  i=0; i<nOrderBy;
13960 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 74 72   i++){.      str
13970 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
13980 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70 4f 72 64  m *pItem = &pOrd
13990 65 72 42 79 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20  erBy->a[i];.    
139a0 20 20 45 78 70 72 20 2a 70 54 65 72 6d 20 3d 20    Expr *pTerm = 
139b0 70 49 74 65 6d 2d 3e 70 45 78 70 72 3b 0a 20 20  pItem->pExpr;.  
139c0 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f      CollSeq *pCo
139d0 6c 6c 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 70  ll;..      if( p
139e0 54 65 72 6d 2d 3e 66 6c 61 67 73 20 26 20 45 50  Term->flags & EP
139f0 5f 43 6f 6c 6c 61 74 65 20 29 7b 0a 20 20 20 20  _Collate ){.    
13a00 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69      pColl = sqli
13a10 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70  te3ExprCollSeq(p
13a20 50 61 72 73 65 2c 20 70 54 65 72 6d 29 3b 0a 20  Parse, pTerm);. 
13a30 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
13a40 20 20 20 20 70 43 6f 6c 6c 20 3d 20 6d 75 6c 74      pColl = mult
13a50 69 53 65 6c 65 63 74 43 6f 6c 6c 53 65 71 28 70  iSelectCollSeq(p
13a60 50 61 72 73 65 2c 20 70 2c 20 70 49 74 65 6d 2d  Parse, p, pItem-
13a70 3e 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c  >u.x.iOrderByCol
13a80 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  -1);.        if(
13a90 20 70 43 6f 6c 6c 3d 3d 30 20 29 20 70 43 6f 6c   pColl==0 ) pCol
13aa0 6c 20 3d 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c  l = db->pDfltCol
13ab0 6c 3b 0a 20 20 20 20 20 20 20 20 70 4f 72 64 65  l;.        pOrde
13ac0 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 20  rBy->a[i].pExpr 
13ad0 3d 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  =.          sqli
13ae0 74 65 33 45 78 70 72 41 64 64 43 6f 6c 6c 61 74  te3ExprAddCollat
13af0 65 53 74 72 69 6e 67 28 70 50 61 72 73 65 2c 20  eString(pParse, 
13b00 70 54 65 72 6d 2c 20 70 43 6f 6c 6c 2d 3e 7a 4e  pTerm, pColl->zN
13b10 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ame);.      }.  
13b20 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
13b30 74 65 33 4b 65 79 49 6e 66 6f 49 73 57 72 69 74  te3KeyInfoIsWrit
13b40 65 61 62 6c 65 28 70 52 65 74 29 20 29 3b 0a 20  eable(pRet) );. 
13b50 20 20 20 20 20 70 52 65 74 2d 3e 61 43 6f 6c 6c       pRet->aColl
13b60 5b 69 5d 20 3d 20 70 43 6f 6c 6c 3b 0a 20 20 20  [i] = pColl;.   
13b70 20 20 20 70 52 65 74 2d 3e 61 53 6f 72 74 46 6c     pRet->aSortFl
13b80 61 67 73 5b 69 5d 20 3d 20 70 4f 72 64 65 72 42  ags[i] = pOrderB
13b90 79 2d 3e 61 5b 69 5d 2e 73 6f 72 74 46 6c 61 67  y->a[i].sortFlag
13ba0 73 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  s;.    }.  }..  
13bb0 72 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 0a  return pRet;.}..
13bc0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
13bd0 4d 49 54 5f 43 54 45 0a 2f 2a 0a 2a 2a 20 54 68  MIT_CTE./*.** Th
13be0 69 73 20 72 6f 75 74 69 6e 65 20 67 65 6e 65 72  is routine gener
13bf0 61 74 65 73 20 56 44 42 45 20 63 6f 64 65 20 74  ates VDBE code t
13c00 6f 20 63 6f 6d 70 75 74 65 20 74 68 65 20 63 6f  o compute the co
13c10 6e 74 65 6e 74 20 6f 66 20 61 20 57 49 54 48 20  ntent of a WITH 
13c20 52 45 43 55 52 53 49 56 45 0a 2a 2a 20 71 75 65  RECURSIVE.** que
13c30 72 79 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a  ry of the form:.
13c40 2a 2a 0a 2a 2a 20 20 20 3c 72 65 63 75 72 73 69  **.**   <recursi
13c50 76 65 2d 74 61 62 6c 65 3e 20 41 53 20 28 3c 73  ve-table> AS (<s
13c60 65 74 75 70 2d 71 75 65 72 79 3e 20 55 4e 49 4f  etup-query> UNIO
13c70 4e 20 5b 41 4c 4c 5d 20 3c 72 65 63 75 72 73 69  N [ALL] <recursi
13c80 76 65 2d 71 75 65 72 79 3e 29 0a 2a 2a 20 20 20  ve-query>).**   
13c90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13ca0 20 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f        \_________
13cb0 5f 5f 2f 20 20 20 20 20 20 20 20 20 20 20 20 20  __/             
13cc0 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  \_______________
13cd0 2f 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  /.**            
13ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
13cf0 2d 3e 70 50 72 69 6f 72 20 20 20 20 20 20 20 20  ->pPrior        
13d00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 0a                p.
13d10 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 69  **.**.** There i
13d20 73 20 65 78 61 63 74 6c 79 20 6f 6e 65 20 72 65  s exactly one re
13d30 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20 72  ference to the r
13d40 65 63 75 72 73 69 76 65 2d 74 61 62 6c 65 20 69  ecursive-table i
13d50 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  n the FROM claus
13d60 65 0a 2a 2a 20 6f 66 20 72 65 63 75 72 73 69 76  e.** of recursiv
13d70 65 2d 71 75 65 72 79 2c 20 6d 61 72 6b 65 64 20  e-query, marked 
13d80 77 69 74 68 20 74 68 65 20 53 72 63 4c 69 73 74  with the SrcList
13d90 2d 3e 61 5b 5d 2e 66 67 2e 69 73 52 65 63 75 72  ->a[].fg.isRecur
13da0 73 69 76 65 20 66 6c 61 67 2e 0a 2a 2a 0a 2a 2a  sive flag..**.**
13db0 20 54 68 65 20 73 65 74 75 70 2d 71 75 65 72 79   The setup-query
13dc0 20 72 75 6e 73 20 6f 6e 63 65 20 74 6f 20 67 65   runs once to ge
13dd0 6e 65 72 61 74 65 20 61 6e 20 69 6e 69 74 69 61  nerate an initia
13de0 6c 20 73 65 74 20 6f 66 20 72 6f 77 73 20 74 68  l set of rows th
13df0 61 74 20 67 6f 0a 2a 2a 20 69 6e 74 6f 20 61 20  at go.** into a 
13e00 51 75 65 75 65 20 74 61 62 6c 65 2e 20 20 52 6f  Queue table.  Ro
13e10 77 73 20 61 72 65 20 65 78 74 72 61 63 74 65 64  ws are extracted
13e20 20 66 72 6f 6d 20 74 68 65 20 51 75 65 75 65 20   from the Queue 
13e30 74 61 62 6c 65 20 6f 6e 65 20 62 79 0a 2a 2a 20  table one by.** 
13e40 6f 6e 65 2e 20 20 45 61 63 68 20 72 6f 77 20 65  one.  Each row e
13e50 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20 51 75  xtracted from Qu
13e60 65 75 65 20 69 73 20 6f 75 74 70 75 74 20 74 6f  eue is output to
13e70 20 70 44 65 73 74 2e 20 20 54 68 65 6e 20 74 68   pDest.  Then th
13e80 65 20 73 69 6e 67 6c 65 0a 2a 2a 20 65 78 74 72  e single.** extr
13e90 61 63 74 65 64 20 72 6f 77 20 28 6e 6f 77 20 69  acted row (now i
13ea0 6e 20 74 68 65 20 69 43 75 72 72 65 6e 74 20 74  n the iCurrent t
13eb0 61 62 6c 65 29 20 62 65 63 6f 6d 65 73 20 74 68  able) becomes th
13ec0 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65  e content of the
13ed0 0a 2a 2a 20 72 65 63 75 72 73 69 76 65 2d 74 61  .** recursive-ta
13ee0 62 6c 65 20 66 6f 72 20 61 20 72 65 63 75 72 73  ble for a recurs
13ef0 69 76 65 2d 71 75 65 72 79 20 72 75 6e 2e 20 20  ive-query run.  
13f00 54 68 65 20 6f 75 74 70 75 74 20 6f 66 20 74 68  The output of th
13f10 65 20 72 65 63 75 72 73 69 76 65 2d 71 75 65 72  e recursive-quer
13f20 79 0a 2a 2a 20 69 73 20 61 64 64 65 64 20 62 61  y.** is added ba
13f30 63 6b 20 69 6e 74 6f 20 74 68 65 20 51 75 65 75  ck into the Queu
13f40 65 20 74 61 62 6c 65 2e 20 20 54 68 65 6e 20 61  e table.  Then a
13f50 6e 6f 74 68 65 72 20 72 6f 77 20 69 73 20 65 78  nother row is ex
13f60 74 72 61 63 74 65 64 20 66 72 6f 6d 20 51 75 65  tracted from Que
13f70 75 65 0a 2a 2a 20 61 6e 64 20 74 68 65 20 69 74  ue.** and the it
13f80 65 72 61 74 69 6f 6e 20 63 6f 6e 74 69 6e 75 65  eration continue
13f90 73 20 75 6e 74 69 6c 20 74 68 65 20 51 75 65 75  s until the Queu
13fa0 65 20 74 61 62 6c 65 20 69 73 20 65 6d 70 74 79  e table is empty
13fb0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63  ..**.** If the c
13fc0 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79 20 6f 70  ompound query op
13fd0 65 72 61 74 6f 72 20 69 73 20 55 4e 49 4f 4e 20  erator is UNION 
13fe0 74 68 65 6e 20 6e 6f 20 64 75 70 6c 69 63 61 74  then no duplicat
13ff0 65 20 72 6f 77 73 20 61 72 65 20 65 76 65 72 0a  e rows are ever.
14000 2a 2a 20 69 6e 73 65 72 74 65 64 20 69 6e 74 6f  ** inserted into
14010 20 74 68 65 20 51 75 65 75 65 20 74 61 62 6c 65   the Queue table
14020 2e 20 20 54 68 65 20 69 44 69 73 74 69 6e 63 74  .  The iDistinct
14030 20 74 61 62 6c 65 20 6b 65 65 70 73 20 61 20 63   table keeps a c
14040 6f 70 79 20 6f 66 20 61 6c 6c 20 72 6f 77 73 0a  opy of all rows.
14050 2a 2a 20 74 68 61 74 20 68 61 76 65 20 65 76 65  ** that have eve
14060 72 20 62 65 65 6e 20 69 6e 73 65 72 74 65 64 20  r been inserted 
14070 69 6e 74 6f 20 51 75 65 75 65 20 61 6e 64 20 63  into Queue and c
14080 61 75 73 65 73 20 64 75 70 6c 69 63 61 74 65 73  auses duplicates
14090 20 74 6f 20 62 65 0a 2a 2a 20 64 69 73 63 61 72   to be.** discar
140a0 64 65 64 2e 20 20 49 66 20 74 68 65 20 6f 70 65  ded.  If the ope
140b0 72 61 74 6f 72 20 69 73 20 55 4e 49 4f 4e 20 41  rator is UNION A
140c0 4c 4c 2c 20 74 68 65 6e 20 64 75 70 6c 69 63 61  LL, then duplica
140d0 74 65 73 20 61 72 65 20 61 6c 6c 6f 77 65 64 2e  tes are allowed.
140e0 0a 2a 2a 20 0a 2a 2a 20 49 66 20 74 68 65 20 71  .** .** If the q
140f0 75 65 72 79 20 68 61 73 20 61 6e 20 4f 52 44 45  uery has an ORDE
14100 52 20 42 59 2c 20 74 68 65 6e 20 65 6e 74 72 69  R BY, then entri
14110 65 73 20 69 6e 20 74 68 65 20 51 75 65 75 65 20  es in the Queue 
14120 74 61 62 6c 65 20 61 72 65 20 6b 65 70 74 20 69  table are kept i
14130 6e 0a 2a 2a 20 4f 52 44 45 52 20 42 59 20 6f 72  n.** ORDER BY or
14140 64 65 72 20 61 6e 64 20 74 68 65 20 66 69 72 73  der and the firs
14150 74 20 65 6e 74 72 79 20 69 73 20 65 78 74 72 61  t entry is extra
14160 63 74 65 64 20 66 6f 72 20 65 61 63 68 20 63 79  cted for each cy
14170 63 6c 65 2e 20 20 57 69 74 68 6f 75 74 0a 2a 2a  cle.  Without.**
14180 20 61 6e 20 4f 52 44 45 52 20 42 59 2c 20 74 68   an ORDER BY, th
14190 65 20 51 75 65 75 65 20 74 61 62 6c 65 20 69 73  e Queue table is
141a0 20 6a 75 73 74 20 61 20 46 49 46 4f 2e 0a 2a 2a   just a FIFO..**
141b0 0a 2a 2a 20 49 66 20 61 20 4c 49 4d 49 54 20 63  .** If a LIMIT c
141c0 6c 61 75 73 65 20 69 73 20 70 72 6f 76 69 64 65  lause is provide
141d0 64 2c 20 74 68 65 6e 20 74 68 65 20 69 74 65 72  d, then the iter
141e0 61 74 69 6f 6e 20 73 74 6f 70 73 20 61 66 74 65  ation stops afte
141f0 72 20 4c 49 4d 49 54 20 72 6f 77 73 0a 2a 2a 20  r LIMIT rows.** 
14200 68 61 76 65 20 62 65 65 6e 20 6f 75 74 70 75 74  have been output
14210 20 74 6f 20 70 44 65 73 74 2e 20 20 41 20 4c 49   to pDest.  A LI
14220 4d 49 54 20 6f 66 20 7a 65 72 6f 20 6d 65 61 6e  MIT of zero mean
14230 73 20 74 6f 20 6f 75 74 70 75 74 20 6e 6f 20 72  s to output no r
14240 6f 77 73 20 61 6e 64 20 61 0a 2a 2a 20 6e 65 67  ows and a.** neg
14250 61 74 69 76 65 20 4c 49 4d 49 54 20 6d 65 61 6e  ative LIMIT mean
14260 73 20 74 6f 20 6f 75 74 70 75 74 20 61 6c 6c 20  s to output all 
14270 72 6f 77 73 2e 20 20 49 66 20 74 68 65 72 65 20  rows.  If there 
14280 69 73 20 61 6c 73 6f 20 61 6e 20 4f 46 46 53 45  is also an OFFSE
14290 54 20 63 6c 61 75 73 65 0a 2a 2a 20 77 69 74 68  T clause.** with
142a0 20 61 20 70 6f 73 69 74 69 76 65 20 76 61 6c 75   a positive valu
142b0 65 2c 20 74 68 65 6e 20 74 68 65 20 66 69 72 73  e, then the firs
142c0 74 20 4f 46 46 53 45 54 20 6f 75 74 70 75 74 73  t OFFSET outputs
142d0 20 61 72 65 20 64 69 73 63 61 72 64 65 64 20 72   are discarded r
142e0 61 74 68 65 72 0a 2a 2a 20 74 68 61 6e 20 62 65  ather.** than be
142f0 69 6e 67 20 73 65 6e 74 20 74 6f 20 70 44 65 73  ing sent to pDes
14300 74 2e 20 20 54 68 65 20 4c 49 4d 49 54 20 63 6f  t.  The LIMIT co
14310 75 6e 74 20 64 6f 65 73 20 6e 6f 74 20 62 65 67  unt does not beg
14320 69 6e 20 75 6e 74 69 6c 20 61 66 74 65 72 20 4f  in until after O
14330 46 46 53 45 54 0a 2a 2a 20 72 6f 77 73 20 68 61  FFSET.** rows ha
14340 76 65 20 62 65 65 6e 20 73 6b 69 70 70 65 64 2e  ve been skipped.
14350 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
14360 67 65 6e 65 72 61 74 65 57 69 74 68 52 65 63 75  generateWithRecu
14370 72 73 69 76 65 51 75 65 72 79 28 0a 20 20 50 61  rsiveQuery(.  Pa
14380 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
14390 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63      /* Parsing c
143a0 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65  ontext */.  Sele
143b0 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  ct *p,          
143c0 20 20 2f 2a 20 54 68 65 20 72 65 63 75 72 73 69    /* The recursi
143d0 76 65 20 53 45 4c 45 43 54 20 74 6f 20 62 65 20  ve SELECT to be 
143e0 63 6f 64 65 64 20 2a 2f 0a 20 20 53 65 6c 65 63  coded */.  Selec
143f0 74 44 65 73 74 20 2a 70 44 65 73 74 20 20 20 20  tDest *pDest    
14400 20 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f 20 77   /* What to do w
14410 69 74 68 20 71 75 65 72 79 20 72 65 73 75 6c 74  ith query result
14420 73 20 2a 2f 0a 29 7b 0a 20 20 53 72 63 4c 69 73  s */.){.  SrcLis
14430 74 20 2a 70 53 72 63 20 3d 20 70 2d 3e 70 53 72  t *pSrc = p->pSr
14440 63 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20 46  c;      /* The F
14450 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68  ROM clause of th
14460 65 20 72 65 63 75 72 73 69 76 65 20 71 75 65 72  e recursive quer
14470 79 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c 20  y */.  int nCol 
14480 3d 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78  = p->pEList->nEx
14490 70 72 3b 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f  pr;  /* Number o
144a0 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65  f columns in the
144b0 20 72 65 63 75 72 73 69 76 65 20 74 61 62 6c 65   recursive table
144c0 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 20 3d 20   */.  Vdbe *v = 
144d0 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 20 20  pParse->pVdbe;  
144e0 20 20 20 20 2f 2a 20 54 68 65 20 70 72 65 70 61      /* The prepa
144f0 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20 75 6e  red statement un
14500 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e  der construction
14510 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53   */.  Select *pS
14520 65 74 75 70 20 3d 20 70 2d 3e 70 50 72 69 6f 72  etup = p->pPrior
14530 3b 20 20 20 2f 2a 20 54 68 65 20 73 65 74 75 70  ;   /* The setup
14540 20 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20   query */.  int 
14550 61 64 64 72 54 6f 70 3b 20 20 20 20 20 20 20 20  addrTop;        
14560 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 70            /* Top
14570 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 2a 2f 0a   of the loop */.
14580 20 20 69 6e 74 20 61 64 64 72 43 6f 6e 74 2c 20    int addrCont, 
14590 61 64 64 72 42 72 65 61 6b 3b 20 20 20 20 20 20  addrBreak;      
145a0 2f 2a 20 43 4f 4e 54 49 4e 55 45 20 61 6e 64 20  /* CONTINUE and 
145b0 42 52 45 41 4b 20 61 64 64 72 65 73 73 65 73 20  BREAK addresses 
145c0 2a 2f 0a 20 20 69 6e 74 20 69 43 75 72 72 65 6e  */.  int iCurren
145d0 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  t = 0;          
145e0 20 20 20 2f 2a 20 54 68 65 20 43 75 72 72 65 6e     /* The Curren
145f0 74 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74  t table */.  int
14600 20 72 65 67 43 75 72 72 65 6e 74 3b 20 20 20 20   regCurrent;    
14610 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
14620 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 43  gister holding C
14630 75 72 72 65 6e 74 20 74 61 62 6c 65 20 2a 2f 0a  urrent table */.
14640 20 20 69 6e 74 20 69 51 75 65 75 65 3b 20 20 20    int iQueue;   
14650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14660 2f 2a 20 54 68 65 20 51 75 65 75 65 20 74 61 62  /* The Queue tab
14670 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 44 69 73  le */.  int iDis
14680 74 69 6e 63 74 20 3d 20 30 3b 20 20 20 20 20 20  tinct = 0;      
14690 20 20 20 20 20 20 2f 2a 20 54 6f 20 65 6e 73 75        /* To ensu
146a0 72 65 20 75 6e 69 71 75 65 20 72 65 73 75 6c 74  re unique result
146b0 73 20 69 66 20 55 4e 49 4f 4e 20 2a 2f 0a 20 20  s if UNION */.  
146c0 69 6e 74 20 65 44 65 73 74 20 3d 20 53 52 54 5f  int eDest = SRT_
146d0 46 69 66 6f 3b 20 20 20 20 20 20 20 20 20 2f 2a  Fifo;         /*
146e0 20 48 6f 77 20 74 6f 20 77 72 69 74 65 20 74 6f   How to write to
146f0 20 51 75 65 75 65 20 2a 2f 0a 20 20 53 65 6c 65   Queue */.  Sele
14700 63 74 44 65 73 74 20 64 65 73 74 51 75 65 75 65  ctDest destQueue
14710 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 6c  ;         /* Sel
14720 65 63 74 44 65 73 74 20 74 61 72 67 65 74 74 69  ectDest targetti
14730 6e 67 20 74 68 65 20 51 75 65 75 65 20 74 61 62  ng the Queue tab
14740 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20  le */.  int i;  
14750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14760 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
14770 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72  unter */.  int r
14780 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
14790 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75           /* Resu
147a0 6c 74 20 63 6f 64 65 20 2a 2f 0a 20 20 45 78 70  lt code */.  Exp
147b0 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 3b  rList *pOrderBy;
147c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
147d0 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
147e0 65 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 4c 69  e */.  Expr *pLi
147f0 6d 69 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  mit;            
14800 20 20 20 20 20 2f 2a 20 53 61 76 65 64 20 4c 49       /* Saved LI
14810 4d 49 54 20 61 6e 64 20 4f 46 46 53 45 54 20 2a  MIT and OFFSET *
14820 2f 0a 20 20 69 6e 74 20 72 65 67 4c 69 6d 69 74  /.  int regLimit
14830 2c 20 72 65 67 4f 66 66 73 65 74 3b 20 20 20 20  , regOffset;    
14840 20 20 2f 2a 20 52 65 67 69 73 74 65 72 73 20 75    /* Registers u
14850 73 65 64 20 62 79 20 4c 49 4d 49 54 20 61 6e 64  sed by LIMIT and
14860 20 4f 46 46 53 45 54 20 2a 2f 0a 0a 23 69 66 6e   OFFSET */..#ifn
14870 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
14880 57 49 4e 44 4f 57 46 55 4e 43 0a 20 20 69 66 28  WINDOWFUNC.  if(
14890 20 70 2d 3e 70 57 69 6e 20 29 7b 0a 20 20 20 20   p->pWin ){.    
148a0 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
148b0 70 50 61 72 73 65 2c 20 22 63 61 6e 6e 6f 74 20  pParse, "cannot 
148c0 75 73 65 20 77 69 6e 64 6f 77 20 66 75 6e 63 74  use window funct
148d0 69 6f 6e 73 20 69 6e 20 72 65 63 75 72 73 69 76  ions in recursiv
148e0 65 20 71 75 65 72 69 65 73 22 29 3b 0a 20 20 20  e queries");.   
148f0 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 23 65 6e   return;.  }.#en
14900 64 69 66 0a 0a 20 20 2f 2a 20 4f 62 74 61 69 6e  dif..  /* Obtain
14910 20 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e 20 74   authorization t
14920 6f 20 64 6f 20 61 20 72 65 63 75 72 73 69 76 65  o do a recursive
14930 20 71 75 65 72 79 20 2a 2f 0a 20 20 69 66 28 20   query */.  if( 
14940 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b  sqlite3AuthCheck
14950 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f  (pParse, SQLITE_
14960 52 45 43 55 52 53 49 56 45 2c 20 30 2c 20 30 2c  RECURSIVE, 0, 0,
14970 20 30 29 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20   0) ) return;.. 
14980 20 2f 2a 20 50 72 6f 63 65 73 73 20 74 68 65 20   /* Process the 
14990 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46 53 45 54  LIMIT and OFFSET
149a0 20 63 6c 61 75 73 65 73 2c 20 69 66 20 74 68 65   clauses, if the
149b0 79 20 65 78 69 73 74 20 2a 2f 0a 20 20 61 64 64  y exist */.  add
149c0 72 42 72 65 61 6b 20 3d 20 73 71 6c 69 74 65 33  rBreak = sqlite3
149d0 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 70 50  VdbeMakeLabel(pP
149e0 61 72 73 65 29 3b 0a 20 20 70 2d 3e 6e 53 65 6c  arse);.  p->nSel
149f0 65 63 74 52 6f 77 20 3d 20 33 32 30 3b 20 20 2f  ectRow = 320;  /
14a00 2a 20 34 20 62 69 6c 6c 69 6f 6e 20 72 6f 77 73  * 4 billion rows
14a10 20 2a 2f 0a 20 20 63 6f 6d 70 75 74 65 4c 69 6d   */.  computeLim
14a20 69 74 52 65 67 69 73 74 65 72 73 28 70 50 61 72  itRegisters(pPar
14a30 73 65 2c 20 70 2c 20 61 64 64 72 42 72 65 61 6b  se, p, addrBreak
14a40 29 3b 0a 20 20 70 4c 69 6d 69 74 20 3d 20 70 2d  );.  pLimit = p-
14a50 3e 70 4c 69 6d 69 74 3b 0a 20 20 72 65 67 4c 69  >pLimit;.  regLi
14a60 6d 69 74 20 3d 20 70 2d 3e 69 4c 69 6d 69 74 3b  mit = p->iLimit;
14a70 0a 20 20 72 65 67 4f 66 66 73 65 74 20 3d 20 70  .  regOffset = p
14a80 2d 3e 69 4f 66 66 73 65 74 3b 0a 20 20 70 2d 3e  ->iOffset;.  p->
14a90 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 70 2d  pLimit = 0;.  p-
14aa0 3e 69 4c 69 6d 69 74 20 3d 20 70 2d 3e 69 4f 66  >iLimit = p->iOf
14ab0 66 73 65 74 20 3d 20 30 3b 0a 20 20 70 4f 72 64  fset = 0;.  pOrd
14ac0 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72  erBy = p->pOrder
14ad0 42 79 3b 0a 0a 20 20 2f 2a 20 4c 6f 63 61 74 65  By;..  /* Locate
14ae0 20 74 68 65 20 63 75 72 73 6f 72 20 6e 75 6d 62   the cursor numb
14af0 65 72 20 6f 66 20 74 68 65 20 43 75 72 72 65 6e  er of the Curren
14b00 74 20 74 61 62 6c 65 20 2a 2f 0a 20 20 66 6f 72  t table */.  for
14b10 28 69 3d 30 3b 20 41 4c 57 41 59 53 28 69 3c 70  (i=0; ALWAYS(i<p
14b20 53 72 63 2d 3e 6e 53 72 63 29 3b 20 69 2b 2b 29  Src->nSrc); i++)
14b30 7b 0a 20 20 20 20 69 66 28 20 70 53 72 63 2d 3e  {.    if( pSrc->
14b40 61 5b 69 5d 2e 66 67 2e 69 73 52 65 63 75 72 73  a[i].fg.isRecurs
14b50 69 76 65 20 29 7b 0a 20 20 20 20 20 20 69 43 75  ive ){.      iCu
14b60 72 72 65 6e 74 20 3d 20 70 53 72 63 2d 3e 61 5b  rrent = pSrc->a[
14b70 69 5d 2e 69 43 75 72 73 6f 72 3b 0a 20 20 20 20  i].iCursor;.    
14b80 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
14b90 20 7d 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74   }..  /* Allocat
14ba0 65 20 63 75 72 73 6f 72 73 20 6e 75 6d 62 65 72  e cursors number
14bb0 73 20 66 6f 72 20 51 75 65 75 65 20 61 6e 64 20  s for Queue and 
14bc0 44 69 73 74 69 6e 63 74 2e 20 20 54 68 65 20 63  Distinct.  The c
14bd0 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 66 6f 72  ursor number for
14be0 0a 20 20 2a 2a 20 74 68 65 20 44 69 73 74 69 6e  .  ** the Distin
14bf0 63 74 20 74 61 62 6c 65 20 6d 75 73 74 20 62 65  ct table must be
14c00 20 65 78 61 63 74 6c 79 20 6f 6e 65 20 67 72 65   exactly one gre
14c10 61 74 65 72 20 74 68 61 6e 20 51 75 65 75 65 20  ater than Queue 
14c20 69 6e 20 6f 72 64 65 72 0a 20 20 2a 2a 20 66 6f  in order.  ** fo
14c30 72 20 74 68 65 20 53 52 54 5f 44 69 73 74 46 69  r the SRT_DistFi
14c40 66 6f 20 61 6e 64 20 53 52 54 5f 44 69 73 74 51  fo and SRT_DistQ
14c50 75 65 75 65 20 64 65 73 74 69 6e 61 74 69 6f 6e  ueue destination
14c60 73 20 74 6f 20 77 6f 72 6b 2e 20 2a 2f 0a 20 20  s to work. */.  
14c70 69 51 75 65 75 65 20 3d 20 70 50 61 72 73 65 2d  iQueue = pParse-
14c80 3e 6e 54 61 62 2b 2b 3b 0a 20 20 69 66 28 20 70  >nTab++;.  if( p
14c90 2d 3e 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29  ->op==TK_UNION )
14ca0 7b 0a 20 20 20 20 65 44 65 73 74 20 3d 20 70 4f  {.    eDest = pO
14cb0 72 64 65 72 42 79 20 3f 20 53 52 54 5f 44 69 73  rderBy ? SRT_Dis
14cc0 74 51 75 65 75 65 20 3a 20 53 52 54 5f 44 69 73  tQueue : SRT_Dis
14cd0 74 46 69 66 6f 3b 0a 20 20 20 20 69 44 69 73 74  tFifo;.    iDist
14ce0 69 6e 63 74 20 3d 20 70 50 61 72 73 65 2d 3e 6e  inct = pParse->n
14cf0 54 61 62 2b 2b 3b 0a 20 20 7d 65 6c 73 65 7b 0a  Tab++;.  }else{.
14d00 20 20 20 20 65 44 65 73 74 20 3d 20 70 4f 72 64      eDest = pOrd
14d10 65 72 42 79 20 3f 20 53 52 54 5f 51 75 65 75 65  erBy ? SRT_Queue
14d20 20 3a 20 53 52 54 5f 46 69 66 6f 3b 0a 20 20 7d   : SRT_Fifo;.  }
14d30 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  .  sqlite3Select
14d40 44 65 73 74 49 6e 69 74 28 26 64 65 73 74 51 75  DestInit(&destQu
14d50 65 75 65 2c 20 65 44 65 73 74 2c 20 69 51 75 65  eue, eDest, iQue
14d60 75 65 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63  ue);..  /* Alloc
14d70 61 74 65 20 63 75 72 73 6f 72 73 20 66 6f 72 20  ate cursors for 
14d80 43 75 72 72 65 6e 74 2c 20 51 75 65 75 65 2c 20  Current, Queue, 
14d90 61 6e 64 20 44 69 73 74 69 6e 63 74 2e 20 2a 2f  and Distinct. */
14da0 0a 20 20 72 65 67 43 75 72 72 65 6e 74 20 3d 20  .  regCurrent = 
14db0 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
14dc0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
14dd0 4f 70 33 28 76 2c 20 4f 50 5f 4f 70 65 6e 50 73  Op3(v, OP_OpenPs
14de0 65 75 64 6f 2c 20 69 43 75 72 72 65 6e 74 2c 20  eudo, iCurrent, 
14df0 72 65 67 43 75 72 72 65 6e 74 2c 20 6e 43 6f 6c  regCurrent, nCol
14e00 29 3b 0a 20 20 69 66 28 20 70 4f 72 64 65 72 42  );.  if( pOrderB
14e10 79 20 29 7b 0a 20 20 20 20 4b 65 79 49 6e 66 6f  y ){.    KeyInfo
14e20 20 2a 70 4b 65 79 49 6e 66 6f 20 3d 20 6d 75 6c   *pKeyInfo = mul
14e30 74 69 53 65 6c 65 63 74 4f 72 64 65 72 42 79 4b  tiSelectOrderByK
14e40 65 79 49 6e 66 6f 28 70 50 61 72 73 65 2c 20 70  eyInfo(pParse, p
14e50 2c 20 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 1);.    sqlite
14e60 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
14e70 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c  P_OpenEphemeral,
14e80 20 69 51 75 65 75 65 2c 20 70 4f 72 64 65 72 42   iQueue, pOrderB
14e90 79 2d 3e 6e 45 78 70 72 2b 32 2c 20 30 2c 0a 20  y->nExpr+2, 0,. 
14ea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14eb0 20 20 20 20 20 28 63 68 61 72 2a 29 70 4b 65 79       (char*)pKey
14ec0 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f  Info, P4_KEYINFO
14ed0 29 3b 0a 20 20 20 20 64 65 73 74 51 75 65 75 65  );.    destQueue
14ee0 2e 70 4f 72 64 65 72 42 79 20 3d 20 70 4f 72 64  .pOrderBy = pOrd
14ef0 65 72 42 79 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  erBy;.  }else{. 
14f00 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
14f10 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45  dOp2(v, OP_OpenE
14f20 70 68 65 6d 65 72 61 6c 2c 20 69 51 75 65 75 65  phemeral, iQueue
14f30 2c 20 6e 43 6f 6c 29 3b 0a 20 20 7d 0a 20 20 56  , nCol);.  }.  V
14f40 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
14f50 51 75 65 75 65 20 74 61 62 6c 65 22 29 29 3b 0a  Queue table"));.
14f60 20 20 69 66 28 20 69 44 69 73 74 69 6e 63 74 20    if( iDistinct 
14f70 29 7b 0a 20 20 20 20 70 2d 3e 61 64 64 72 4f 70  ){.    p->addrOp
14f80 65 6e 45 70 68 6d 5b 30 5d 20 3d 20 73 71 6c 69  enEphm[0] = sqli
14f90 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
14fa0 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61   OP_OpenEphemera
14fb0 6c 2c 20 69 44 69 73 74 69 6e 63 74 2c 20 30 29  l, iDistinct, 0)
14fc0 3b 0a 20 20 20 20 70 2d 3e 73 65 6c 46 6c 61 67  ;.    p->selFlag
14fd0 73 20 7c 3d 20 53 46 5f 55 73 65 73 45 70 68 65  s |= SF_UsesEphe
14fe0 6d 65 72 61 6c 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  meral;.  }..  /*
14ff0 20 44 65 74 61 63 68 20 74 68 65 20 4f 52 44 45   Detach the ORDE
15000 52 20 42 59 20 63 6c 61 75 73 65 20 66 72 6f 6d  R BY clause from
15010 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 53 45   the compound SE
15020 4c 45 43 54 20 2a 2f 0a 20 20 70 2d 3e 70 4f 72  LECT */.  p->pOr
15030 64 65 72 42 79 20 3d 20 30 3b 0a 0a 20 20 2f 2a  derBy = 0;..  /*
15040 20 53 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c   Store the resul
15050 74 73 20 6f 66 20 74 68 65 20 73 65 74 75 70 2d  ts of the setup-
15060 71 75 65 72 79 20 69 6e 20 51 75 65 75 65 2e 20  query in Queue. 
15070 2a 2f 0a 20 20 70 53 65 74 75 70 2d 3e 70 4e 65  */.  pSetup->pNe
15080 78 74 20 3d 20 30 3b 0a 20 20 45 78 70 6c 61 69  xt = 0;.  Explai
15090 6e 51 75 65 72 79 50 6c 61 6e 28 28 70 50 61 72  nQueryPlan((pPar
150a0 73 65 2c 20 31 2c 20 22 53 45 54 55 50 22 29 29  se, 1, "SETUP"))
150b0 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
150c0 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70  Select(pParse, p
150d0 53 65 74 75 70 2c 20 26 64 65 73 74 51 75 65 75  Setup, &destQueu
150e0 65 29 3b 0a 20 20 70 53 65 74 75 70 2d 3e 70 4e  e);.  pSetup->pN
150f0 65 78 74 20 3d 20 70 3b 0a 20 20 69 66 28 20 72  ext = p;.  if( r
15100 63 20 29 20 67 6f 74 6f 20 65 6e 64 5f 6f 66 5f  c ) goto end_of_
15110 72 65 63 75 72 73 69 76 65 5f 71 75 65 72 79 3b  recursive_query;
15120 0a 0a 20 20 2f 2a 20 46 69 6e 64 20 74 68 65 20  ..  /* Find the 
15130 6e 65 78 74 20 72 6f 77 20 69 6e 20 74 68 65 20  next row in the 
15140 51 75 65 75 65 20 61 6e 64 20 6f 75 74 70 75 74  Queue and output
15150 20 74 68 61 74 20 72 6f 77 20 2a 2f 0a 20 20 61   that row */.  a
15160 64 64 72 54 6f 70 20 3d 20 73 71 6c 69 74 65 33  ddrTop = sqlite3
15170 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
15180 5f 52 65 77 69 6e 64 2c 20 69 51 75 65 75 65 2c  _Rewind, iQueue,
15190 20 61 64 64 72 42 72 65 61 6b 29 3b 20 56 64 62   addrBreak); Vdb
151a0 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 0a 20  eCoverage(v);.. 
151b0 20 2f 2a 20 54 72 61 6e 73 66 65 72 20 74 68 65   /* Transfer the
151c0 20 6e 65 78 74 20 72 6f 77 20 69 6e 20 51 75 65   next row in Que
151d0 75 65 20 6f 76 65 72 20 74 6f 20 43 75 72 72 65  ue over to Curre
151e0 6e 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56  nt */.  sqlite3V
151f0 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
15200 4e 75 6c 6c 52 6f 77 2c 20 69 43 75 72 72 65 6e  NullRow, iCurren
15210 74 29 3b 20 2f 2a 20 54 6f 20 72 65 73 65 74 20  t); /* To reset 
15220 63 6f 6c 75 6d 6e 20 63 61 63 68 65 20 2a 2f 0a  column cache */.
15230 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 20 29    if( pOrderBy )
15240 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
15250 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f  eAddOp3(v, OP_Co
15260 6c 75 6d 6e 2c 20 69 51 75 65 75 65 2c 20 70 4f  lumn, iQueue, pO
15270 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 2b 31 2c  rderBy->nExpr+1,
15280 20 72 65 67 43 75 72 72 65 6e 74 29 3b 0a 20 20   regCurrent);.  
15290 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74  }else{.    sqlit
152a0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
152b0 4f 50 5f 52 6f 77 44 61 74 61 2c 20 69 51 75 65  OP_RowData, iQue
152c0 75 65 2c 20 72 65 67 43 75 72 72 65 6e 74 29 3b  ue, regCurrent);
152d0 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64  .  }.  sqlite3Vd
152e0 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 44  beAddOp1(v, OP_D
152f0 65 6c 65 74 65 2c 20 69 51 75 65 75 65 29 3b 0a  elete, iQueue);.
15300 0a 20 20 2f 2a 20 4f 75 74 70 75 74 20 74 68 65  .  /* Output the
15310 20 73 69 6e 67 6c 65 20 72 6f 77 20 69 6e 20 43   single row in C
15320 75 72 72 65 6e 74 20 2a 2f 0a 20 20 61 64 64 72  urrent */.  addr
15330 43 6f 6e 74 20 3d 20 73 71 6c 69 74 65 33 56 64  Cont = sqlite3Vd
15340 62 65 4d 61 6b 65 4c 61 62 65 6c 28 70 50 61 72  beMakeLabel(pPar
15350 73 65 29 3b 0a 20 20 63 6f 64 65 4f 66 66 73 65  se);.  codeOffse
15360 74 28 76 2c 20 72 65 67 4f 66 66 73 65 74 2c 20  t(v, regOffset, 
15370 61 64 64 72 43 6f 6e 74 29 3b 0a 20 20 73 65 6c  addrCont);.  sel
15380 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61  ectInnerLoop(pPa
15390 72 73 65 2c 20 70 2c 20 69 43 75 72 72 65 6e 74  rse, p, iCurrent
153a0 2c 0a 20 20 20 20 20 20 30 2c 20 30 2c 20 70 44  ,.      0, 0, pD
153b0 65 73 74 2c 20 61 64 64 72 43 6f 6e 74 2c 20 61  est, addrCont, a
153c0 64 64 72 42 72 65 61 6b 29 3b 0a 20 20 69 66 28  ddrBreak);.  if(
153d0 20 72 65 67 4c 69 6d 69 74 20 29 7b 0a 20 20 20   regLimit ){.   
153e0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
153f0 70 32 28 76 2c 20 4f 50 5f 44 65 63 72 4a 75 6d  p2(v, OP_DecrJum
15400 70 5a 65 72 6f 2c 20 72 65 67 4c 69 6d 69 74 2c  pZero, regLimit,
15410 20 61 64 64 72 42 72 65 61 6b 29 3b 0a 20 20 20   addrBreak);.   
15420 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
15430 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56  ;.  }.  sqlite3V
15440 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
15450 76 2c 20 61 64 64 72 43 6f 6e 74 29 3b 0a 0a 20  v, addrCont);.. 
15460 20 2f 2a 20 45 78 65 63 75 74 65 20 74 68 65 20   /* Execute the 
15470 72 65 63 75 72 73 69 76 65 20 53 45 4c 45 43 54  recursive SELECT
15480 20 74 61 6b 69 6e 67 20 74 68 65 20 73 69 6e 67   taking the sing
15490 6c 65 20 72 6f 77 20 69 6e 20 43 75 72 72 65 6e  le row in Curren
154a0 74 20 61 73 0a 20 20 2a 2a 20 74 68 65 20 76 61  t as.  ** the va
154b0 6c 75 65 20 66 6f 72 20 74 68 65 20 72 65 63 75  lue for the recu
154c0 72 73 69 76 65 2d 74 61 62 6c 65 2e 20 53 74 6f  rsive-table. Sto
154d0 72 65 20 74 68 65 20 72 65 73 75 6c 74 73 20 69  re the results i
154e0 6e 20 74 68 65 20 51 75 65 75 65 2e 0a 20 20 2a  n the Queue..  *
154f0 2f 0a 20 20 69 66 28 20 70 2d 3e 73 65 6c 46 6c  /.  if( p->selFl
15500 61 67 73 20 26 20 53 46 5f 41 67 67 72 65 67 61  ags & SF_Aggrega
15510 74 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  te ){.    sqlite
15520 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
15530 2c 20 22 72 65 63 75 72 73 69 76 65 20 61 67 67  , "recursive agg
15540 72 65 67 61 74 65 20 71 75 65 72 69 65 73 20 6e  regate queries n
15550 6f 74 20 73 75 70 70 6f 72 74 65 64 22 29 3b 0a  ot supported");.
15560 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 2d 3e    }else{.    p->
15570 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20  pPrior = 0;.    
15580 45 78 70 6c 61 69 6e 51 75 65 72 79 50 6c 61 6e  ExplainQueryPlan
15590 28 28 70 50 61 72 73 65 2c 20 31 2c 20 22 52 45  ((pParse, 1, "RE
155a0 43 55 52 53 49 56 45 20 53 54 45 50 22 29 29 3b  CURSIVE STEP"));
155b0 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65  .    sqlite3Sele
155c0 63 74 28 70 50 61 72 73 65 2c 20 70 2c 20 26 64  ct(pParse, p, &d
155d0 65 73 74 51 75 65 75 65 29 3b 0a 20 20 20 20 61  estQueue);.    a
155e0 73 73 65 72 74 28 20 70 2d 3e 70 50 72 69 6f 72  ssert( p->pPrior
155f0 3d 3d 30 20 29 3b 0a 20 20 20 20 70 2d 3e 70 50  ==0 );.    p->pP
15600 72 69 6f 72 20 3d 20 70 53 65 74 75 70 3b 0a 20  rior = pSetup;. 
15610 20 7d 0a 0a 20 20 2f 2a 20 4b 65 65 70 20 72 75   }..  /* Keep ru
15620 6e 6e 69 6e 67 20 74 68 65 20 6c 6f 6f 70 20 75  nning the loop u
15630 6e 74 69 6c 20 74 68 65 20 51 75 65 75 65 20 69  ntil the Queue i
15640 73 20 65 6d 70 74 79 20 2a 2f 0a 20 20 73 71 6c  s empty */.  sql
15650 69 74 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20  ite3VdbeGoto(v, 
15660 61 64 64 72 54 6f 70 29 3b 0a 20 20 73 71 6c 69  addrTop);.  sqli
15670 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
15680 62 65 6c 28 76 2c 20 61 64 64 72 42 72 65 61 6b  bel(v, addrBreak
15690 29 3b 0a 0a 65 6e 64 5f 6f 66 5f 72 65 63 75 72  );..end_of_recur
156a0 73 69 76 65 5f 71 75 65 72 79 3a 0a 20 20 73 71  sive_query:.  sq
156b0 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c  lite3ExprListDel
156c0 65 74 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ete(pParse->db, 
156d0 70 2d 3e 70 4f 72 64 65 72 42 79 29 3b 0a 20 20  p->pOrderBy);.  
156e0 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 70 4f  p->pOrderBy = pO
156f0 72 64 65 72 42 79 3b 0a 20 20 70 2d 3e 70 4c 69  rderBy;.  p->pLi
15700 6d 69 74 20 3d 20 70 4c 69 6d 69 74 3b 0a 20 20  mit = pLimit;.  
15710 72 65 74 75 72 6e 3b 0a 7d 0a 23 65 6e 64 69 66  return;.}.#endif
15720 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
15730 43 54 45 20 2a 2f 0a 0a 2f 2a 20 46 6f 72 77 61  CTE */../* Forwa
15740 72 64 20 72 65 66 65 72 65 6e 63 65 73 20 2a 2f  rd references */
15750 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 75 6c 74  .static int mult
15760 69 53 65 6c 65 63 74 4f 72 64 65 72 42 79 28 0a  iSelectOrderBy(.
15770 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
15780 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69          /* Parsi
15790 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
157a0 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20  Select *p,      
157b0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 69 67        /* The rig
157c0 68 74 2d 6d 6f 73 74 20 6f 66 20 53 45 4c 45 43  ht-most of SELEC
157d0 54 73 20 74 6f 20 62 65 20 63 6f 64 65 64 20 2a  Ts to be coded *
157e0 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 2a  /.  SelectDest *
157f0 70 44 65 73 74 20 20 20 20 20 2f 2a 20 57 68 61  pDest     /* Wha
15800 74 20 74 6f 20 64 6f 20 77 69 74 68 20 71 75 65  t to do with que
15810 72 79 20 72 65 73 75 6c 74 73 20 2a 2f 0a 29 3b  ry results */.);
15820 0a 0a 2f 2a 0a 2a 2a 20 48 61 6e 64 6c 65 20 74  ../*.** Handle t
15830 68 65 20 73 70 65 63 69 61 6c 20 63 61 73 65 20  he special case 
15840 6f 66 20 61 20 63 6f 6d 70 6f 75 6e 64 2d 73 65  of a compound-se
15850 6c 65 63 74 20 74 68 61 74 20 6f 72 69 67 69 6e  lect that origin
15860 61 74 65 73 20 66 72 6f 6d 20 61 0a 2a 2a 20 56  ates from a.** V
15870 41 4c 55 45 53 20 63 6c 61 75 73 65 2e 20 20 42  ALUES clause.  B
15880 79 20 68 61 6e 64 6c 69 6e 67 20 74 68 69 73 20  y handling this 
15890 61 73 20 61 20 73 70 65 63 69 61 6c 20 63 61 73  as a special cas
158a0 65 2c 20 77 65 20 61 76 6f 69 64 20 64 65 65 70  e, we avoid deep
158b0 0a 2a 2a 20 72 65 63 75 72 73 69 6f 6e 2c 20 61  .** recursion, a
158c0 6e 64 20 74 68 75 73 20 64 6f 20 6e 6f 74 20 6e  nd thus do not n
158d0 65 65 64 20 74 6f 20 65 6e 66 6f 72 63 65 20 74  eed to enforce t
158e0 68 65 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f  he SQLITE_LIMIT_
158f0 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 0a  COMPOUND_SELECT.
15900 2a 2a 20 6f 6e 20 61 20 56 41 4c 55 45 53 20 63  ** on a VALUES c
15910 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 42 65 63  lause..**.** Bec
15920 61 75 73 65 20 74 68 65 20 53 65 6c 65 63 74 20  ause the Select 
15930 6f 62 6a 65 63 74 20 6f 72 69 67 69 6e 61 74 65  object originate
15940 73 20 66 72 6f 6d 20 61 20 56 41 4c 55 45 53 20  s from a VALUES 
15950 63 6c 61 75 73 65 3a 0a 2a 2a 20 20 20 28 31 29  clause:.**   (1)
15960 20 54 68 65 72 65 20 69 73 20 6e 6f 20 4c 49 4d   There is no LIM
15970 49 54 20 6f 72 20 4f 46 46 53 45 54 20 6f 72 20  IT or OFFSET or 
15980 65 6c 73 65 20 74 68 65 72 65 20 69 73 20 61 20  else there is a 
15990 4c 49 4d 49 54 20 6f 66 20 65 78 61 63 74 6c 79  LIMIT of exactly
159a0 20 31 0a 2a 2a 20 20 20 28 32 29 20 41 6c 6c 20   1.**   (2) All 
159b0 74 65 72 6d 73 20 61 72 65 20 55 4e 49 4f 4e 20  terms are UNION 
159c0 41 4c 4c 0a 2a 2a 20 20 20 28 33 29 20 54 68 65  ALL.**   (3) The
159d0 72 65 20 69 73 20 6e 6f 20 4f 52 44 45 52 20 42  re is no ORDER B
159e0 59 20 63 6c 61 75 73 65 0a 2a 2a 0a 2a 2a 20 54  Y clause.**.** T
159f0 68 65 20 22 4c 49 4d 49 54 20 6f 66 20 65 78 61  he "LIMIT of exa
15a00 63 74 6c 79 20 31 22 20 63 61 73 65 20 6f 66 20  ctly 1" case of 
15a10 63 6f 6e 64 69 74 69 6f 6e 20 28 31 29 20 63 6f  condition (1) co
15a20 6d 65 73 20 61 62 6f 75 74 20 77 68 65 6e 20 61  mes about when a
15a30 20 56 41 4c 55 45 53 0a 2a 2a 20 63 6c 61 75 73   VALUES.** claus
15a40 65 20 6f 63 63 75 72 73 20 77 69 74 68 69 6e 20  e occurs within 
15a50 73 63 61 6c 61 72 20 65 78 70 72 65 73 73 69 6f  scalar expressio
15a60 6e 20 28 65 78 3a 20 22 53 45 4c 45 43 54 20 28  n (ex: "SELECT (
15a70 56 41 4c 55 45 53 28 31 29 2c 28 32 29 2c 28 33  VALUES(1),(2),(3
15a80 29 29 22 29 2e 0a 2a 2a 20 54 68 65 20 73 71 6c  ))")..** The sql
15a90 69 74 65 33 43 6f 64 65 53 75 62 73 65 6c 65 63  ite3CodeSubselec
15aa0 74 20 77 69 6c 6c 20 68 61 76 65 20 61 64 64 65  t will have adde
15ab0 64 20 74 68 65 20 4c 49 4d 49 54 20 31 20 63 6c  d the LIMIT 1 cl
15ac0 61 75 73 65 20 69 6e 20 74 68 74 20 63 61 73 65  ause in tht case
15ad0 2e 0a 2a 2a 20 53 69 6e 63 65 20 74 68 65 20 6c  ..** Since the l
15ae0 69 6d 69 74 20 69 73 20 65 78 61 63 74 6c 79 20  imit is exactly 
15af0 31 2c 20 77 65 20 6f 6e 6c 79 20 6e 65 65 64 20  1, we only need 
15b00 74 6f 20 65 76 61 6c 75 74 65 73 20 74 68 65 20  to evalutes the 
15b10 6c 65 66 74 2d 6d 6f 73 74 20 56 41 4c 55 45 53  left-most VALUES
15b20 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
15b30 6d 75 6c 74 69 53 65 6c 65 63 74 56 61 6c 75 65  multiSelectValue
15b40 73 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  s(.  Parse *pPar
15b50 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 61  se,        /* Pa
15b60 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
15b70 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20  .  Select *p,   
15b80 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
15b90 72 69 67 68 74 2d 6d 6f 73 74 20 6f 66 20 53 45  right-most of SE
15ba0 4c 45 43 54 73 20 74 6f 20 62 65 20 63 6f 64 65  LECTs to be code
15bb0 64 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73  d */.  SelectDes
15bc0 74 20 2a 70 44 65 73 74 20 20 20 20 20 2f 2a 20  t *pDest     /* 
15bd0 57 68 61 74 20 74 6f 20 64 6f 20 77 69 74 68 20  What to do with 
15be0 71 75 65 72 79 20 72 65 73 75 6c 74 73 20 2a 2f  query results */
15bf0 0a 29 7b 0a 20 20 69 6e 74 20 6e 52 6f 77 20 3d  .){.  int nRow =
15c00 20 31 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 30   1;.  int rc = 0
15c10 3b 0a 20 20 69 6e 74 20 62 53 68 6f 77 41 6c 6c  ;.  int bShowAll
15c20 20 3d 20 70 2d 3e 70 4c 69 6d 69 74 3d 3d 30 3b   = p->pLimit==0;
15c30 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 73 65  .  assert( p->se
15c40 6c 46 6c 61 67 73 20 26 20 53 46 5f 4d 75 6c 74  lFlags & SF_Mult
15c50 69 56 61 6c 75 65 20 29 3b 0a 20 20 64 6f 7b 0a  iValue );.  do{.
15c60 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 73      assert( p->s
15c70 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 56 61 6c  elFlags & SF_Val
15c80 75 65 73 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ues );.    asser
15c90 74 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c  t( p->op==TK_ALL
15ca0 20 7c 7c 20 28 70 2d 3e 6f 70 3d 3d 54 4b 5f 53   || (p->op==TK_S
15cb0 45 4c 45 43 54 20 26 26 20 70 2d 3e 70 50 72 69  ELECT && p->pPri
15cc0 6f 72 3d 3d 30 29 20 29 3b 0a 20 20 20 20 61 73  or==0) );.    as
15cd0 73 65 72 74 28 20 70 2d 3e 70 4e 65 78 74 3d 3d  sert( p->pNext==
15ce0 30 20 7c 7c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e  0 || p->pEList->
15cf0 6e 45 78 70 72 3d 3d 70 2d 3e 70 4e 65 78 74 2d  nExpr==p->pNext-
15d00 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29  >pEList->nExpr )
15d10 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 50 72  ;.    if( p->pPr
15d20 69 6f 72 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a  ior==0 ) break;.
15d30 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70      assert( p->p
15d40 50 72 69 6f 72 2d 3e 70 4e 65 78 74 3d 3d 70 20  Prior->pNext==p 
15d50 29 3b 0a 20 20 20 20 70 20 3d 20 70 2d 3e 70 50  );.    p = p->pP
15d60 72 69 6f 72 3b 0a 20 20 20 20 6e 52 6f 77 20 2b  rior;.    nRow +
15d70 3d 20 62 53 68 6f 77 41 6c 6c 3b 0a 20 20 7d 77  = bShowAll;.  }w
15d80 68 69 6c 65 28 31 29 3b 0a 20 20 45 78 70 6c 61  hile(1);.  Expla
15d90 69 6e 51 75 65 72 79 50 6c 61 6e 28 28 70 50 61  inQueryPlan((pPa
15da0 72 73 65 2c 20 30 2c 20 22 53 43 41 4e 20 25 64  rse, 0, "SCAN %d
15db0 20 43 4f 4e 53 54 41 4e 54 20 52 4f 57 25 73 22   CONSTANT ROW%s"
15dc0 2c 20 6e 52 6f 77 2c 0a 20 20 20 20 20 20 20 20  , nRow,.        
15dd0 20 20 20 20 20 20 20 20 20 20 20 20 6e 52 6f 77              nRow
15de0 3d 3d 31 20 3f 20 22 22 20 3a 20 22 53 22 29 29  ==1 ? "" : "S"))
15df0 3b 0a 20 20 77 68 69 6c 65 28 20 70 20 29 7b 0a  ;.  while( p ){.
15e00 20 20 20 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c      selectInnerL
15e10 6f 6f 70 28 70 50 61 72 73 65 2c 20 70 2c 20 2d  oop(pParse, p, -
15e20 31 2c 20 30 2c 20 30 2c 20 70 44 65 73 74 2c 20  1, 0, 0, pDest, 
15e30 31 2c 20 31 29 3b 0a 20 20 20 20 69 66 28 20 21  1, 1);.    if( !
15e40 62 53 68 6f 77 41 6c 6c 20 29 20 62 72 65 61 6b  bShowAll ) break
15e50 3b 0a 20 20 20 20 70 2d 3e 6e 53 65 6c 65 63 74  ;.    p->nSelect
15e60 52 6f 77 20 3d 20 6e 52 6f 77 3b 0a 20 20 20 20  Row = nRow;.    
15e70 70 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20  p = p->pNext;.  
15e80 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
15e90 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
15ea0 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74  tine is called t
15eb0 6f 20 70 72 6f 63 65 73 73 20 61 20 63 6f 6d 70  o process a comp
15ec0 6f 75 6e 64 20 71 75 65 72 79 20 66 6f 72 6d 20  ound query form 
15ed0 66 72 6f 6d 0a 2a 2a 20 74 77 6f 20 6f 72 20 6d  from.** two or m
15ee0 6f 72 65 20 73 65 70 61 72 61 74 65 20 71 75 65  ore separate que
15ef0 72 69 65 73 20 75 73 69 6e 67 20 55 4e 49 4f 4e  ries using UNION
15f00 2c 20 55 4e 49 4f 4e 20 41 4c 4c 2c 20 45 58 43  , UNION ALL, EXC
15f10 45 50 54 2c 20 6f 72 0a 2a 2a 20 49 4e 54 45 52  EPT, or.** INTER
15f20 53 45 43 54 0a 2a 2a 0a 2a 2a 20 22 70 22 20 70  SECT.**.** "p" p
15f30 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 72 69 67  oints to the rig
15f40 68 74 2d 6d 6f 73 74 20 6f 66 20 74 68 65 20 74  ht-most of the t
15f50 77 6f 20 71 75 65 72 69 65 73 2e 20 20 74 68 65  wo queries.  the
15f60 20 71 75 65 72 79 20 6f 6e 20 74 68 65 0a 2a 2a   query on the.**
15f70 20 6c 65 66 74 20 69 73 20 70 2d 3e 70 50 72 69   left is p->pPri
15f80 6f 72 2e 20 20 54 68 65 20 6c 65 66 74 20 71 75  or.  The left qu
15f90 65 72 79 20 63 6f 75 6c 64 20 61 6c 73 6f 20 62  ery could also b
15fa0 65 20 61 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65  e a compound que
15fb0 72 79 0a 2a 2a 20 69 6e 20 77 68 69 63 68 20 63  ry.** in which c
15fc0 61 73 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ase this routine
15fd0 20 77 69 6c 6c 20 62 65 20 63 61 6c 6c 65 64 20   will be called 
15fe0 72 65 63 75 72 73 69 76 65 6c 79 2e 20 0a 2a 2a  recursively. .**
15ff0 0a 2a 2a 20 54 68 65 20 72 65 73 75 6c 74 73 20  .** The results 
16000 6f 66 20 74 68 65 20 74 6f 74 61 6c 20 71 75 65  of the total que
16010 72 79 20 61 72 65 20 74 6f 20 62 65 20 77 72 69  ry are to be wri
16020 74 74 65 6e 20 69 6e 74 6f 20 61 20 64 65 73 74  tten into a dest
16030 69 6e 61 74 69 6f 6e 0a 2a 2a 20 6f 66 20 74 79  ination.** of ty
16040 70 65 20 65 44 65 73 74 20 77 69 74 68 20 70 61  pe eDest with pa
16050 72 61 6d 65 74 65 72 20 69 50 61 72 6d 2e 0a 2a  rameter iParm..*
16060 2a 0a 2a 2a 20 45 78 61 6d 70 6c 65 20 31 3a 20  *.** Example 1: 
16070 20 43 6f 6e 73 69 64 65 72 20 61 20 74 68 72 65   Consider a thre
16080 65 2d 77 61 79 20 63 6f 6d 70 6f 75 6e 64 20 53  e-way compound S
16090 51 4c 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a  QL statement..**
160a0 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 61  .**     SELECT a
160b0 20 46 52 4f 4d 20 74 31 20 55 4e 49 4f 4e 20 53   FROM t1 UNION S
160c0 45 4c 45 43 54 20 62 20 46 52 4f 4d 20 74 32 20  ELECT b FROM t2 
160d0 55 4e 49 4f 4e 20 53 45 4c 45 43 54 20 63 20 46  UNION SELECT c F
160e0 52 4f 4d 20 74 33 0a 2a 2a 0a 2a 2a 20 54 68 69  ROM t3.**.** Thi
160f0 73 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 70  s statement is p
16100 61 72 73 65 64 20 75 70 20 61 73 20 66 6f 6c 6c  arsed up as foll
16110 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53  ows:.**.**     S
16120 45 4c 45 43 54 20 63 20 46 52 4f 4d 20 74 33 0a  ELECT c FROM t3.
16130 2a 2a 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20  **      |.**    
16140 20 20 60 2d 2d 2d 2d 2d 3e 20 20 53 45 4c 45 43    `----->  SELEC
16150 54 20 62 20 46 52 4f 4d 20 74 32 0a 2a 2a 20 20  T b FROM t2.**  
16160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 0a                |.
16170 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
16180 20 20 60 2d 2d 2d 2d 2d 2d 3e 20 20 53 45 4c 45    `------>  SELE
16190 43 54 20 61 20 46 52 4f 4d 20 74 31 0a 2a 2a 0a  CT a FROM t1.**.
161a0 2a 2a 20 54 68 65 20 61 72 72 6f 77 73 20 69 6e  ** The arrows in
161b0 20 74 68 65 20 64 69 61 67 72 61 6d 20 61 62 6f   the diagram abo
161c0 76 65 20 72 65 70 72 65 73 65 6e 74 20 74 68 65  ve represent the
161d0 20 53 65 6c 65 63 74 2e 70 50 72 69 6f 72 20 70   Select.pPrior p
161e0 6f 69 6e 74 65 72 2e 0a 2a 2a 20 53 6f 20 69 66  ointer..** So if
161f0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
16200 20 63 61 6c 6c 65 64 20 77 69 74 68 20 70 20 65   called with p e
16210 71 75 61 6c 20 74 6f 20 74 68 65 20 74 33 20 71  qual to the t3 q
16220 75 65 72 79 2c 20 74 68 65 6e 0a 2a 2a 20 70 50  uery, then.** pP
16230 72 69 6f 72 20 77 69 6c 6c 20 62 65 20 74 68 65  rior will be the
16240 20 74 32 20 71 75 65 72 79 2e 20 20 70 2d 3e 6f   t2 query.  p->o
16250 70 20 77 69 6c 6c 20 62 65 20 54 4b 5f 55 4e 49  p will be TK_UNI
16260 4f 4e 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e  ON in this case.
16270 0a 2a 2a 0a 2a 2a 20 4e 6f 74 69 63 65 20 74 68  .**.** Notice th
16280 61 74 20 62 65 63 61 75 73 65 20 6f 66 20 74 68  at because of th
16290 65 20 77 61 79 20 53 51 4c 69 74 65 20 70 61 72  e way SQLite par
162a0 73 65 73 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c  ses compound SEL
162b0 45 43 54 73 2c 20 74 68 65 0a 2a 2a 20 69 6e 64  ECTs, the.** ind
162c0 69 76 69 64 75 61 6c 20 73 65 6c 65 63 74 73 20  ividual selects 
162d0 61 6c 77 61 79 73 20 67 72 6f 75 70 20 66 72 6f  always group fro
162e0 6d 20 6c 65 66 74 20 74 6f 20 72 69 67 68 74 2e  m left to right.
162f0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d  .*/.static int m
16300 75 6c 74 69 53 65 6c 65 63 74 28 0a 20 20 50 61  ultiSelect(.  Pa
16310 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
16320 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63      /* Parsing c
16330 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65  ontext */.  Sele
16340 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  ct *p,          
16350 20 20 2f 2a 20 54 68 65 20 72 69 67 68 74 2d 6d    /* The right-m
16360 6f 73 74 20 6f 66 20 53 45 4c 45 43 54 73 20 74  ost of SELECTs t
16370 6f 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20  o be coded */.  
16380 53 65 6c 65 63 74 44 65 73 74 20 2a 70 44 65 73  SelectDest *pDes
16390 74 20 20 20 20 20 2f 2a 20 57 68 61 74 20 74 6f  t     /* What to
163a0 20 64 6f 20 77 69 74 68 20 71 75 65 72 79 20 72   do with query r
163b0 65 73 75 6c 74 73 20 2a 2f 0a 29 7b 0a 20 20 69  esults */.){.  i
163c0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
163d0 4b 3b 20 20 20 2f 2a 20 53 75 63 63 65 73 73 20  K;   /* Success 
163e0 63 6f 64 65 20 66 72 6f 6d 20 61 20 73 75 62 72  code from a subr
163f0 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 53 65 6c 65  outine */.  Sele
16400 63 74 20 2a 70 50 72 69 6f 72 3b 20 20 20 20 20  ct *pPrior;     
16410 20 20 2f 2a 20 41 6e 6f 74 68 65 72 20 53 45 4c    /* Another SEL
16420 45 43 54 20 69 6d 6d 65 64 69 61 74 65 6c 79 20  ECT immediately 
16430 74 6f 20 6f 75 72 20 6c 65 66 74 20 2a 2f 0a 20  to our left */. 
16440 20 56 64 62 65 20 2a 76 3b 20 20 20 20 20 20 20   Vdbe *v;       
16450 20 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61         /* Genera
16460 74 65 20 63 6f 64 65 20 74 6f 20 74 68 69 73 20  te code to this 
16470 56 44 42 45 20 2a 2f 0a 20 20 53 65 6c 65 63 74  VDBE */.  Select
16480 44 65 73 74 20 64 65 73 74 3b 20 20 20 20 20 20  Dest dest;      
16490 2f 2a 20 41 6c 74 65 72 6e 61 74 69 76 65 20 64  /* Alternative d
164a0 61 74 61 20 64 65 73 74 69 6e 61 74 69 6f 6e 20  ata destination 
164b0 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 44 65  */.  Select *pDe
164c0 6c 65 74 65 20 3d 20 30 3b 20 20 2f 2a 20 43 68  lete = 0;  /* Ch
164d0 61 69 6e 20 6f 66 20 73 69 6d 70 6c 65 20 73 65  ain of simple se
164e0 6c 65 63 74 73 20 74 6f 20 64 65 6c 65 74 65 20  lects to delete 
164f0 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  */.  sqlite3 *db
16500 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61  ;          /* Da
16510 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
16520 6e 20 2a 2f 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20  n */..  /* Make 
16530 73 75 72 65 20 74 68 65 72 65 20 69 73 20 6e 6f  sure there is no
16540 20 4f 52 44 45 52 20 42 59 20 6f 72 20 4c 49 4d   ORDER BY or LIM
16550 49 54 20 63 6c 61 75 73 65 20 6f 6e 20 70 72 69  IT clause on pri
16560 6f 72 20 53 45 4c 45 43 54 73 2e 20 20 4f 6e 6c  or SELECTs.  Onl
16570 79 0a 20 20 2a 2a 20 74 68 65 20 6c 61 73 74 20  y.  ** the last 
16580 28 72 69 67 68 74 2d 6d 6f 73 74 29 20 53 45 4c  (right-most) SEL
16590 45 43 54 20 69 6e 20 74 68 65 20 73 65 72 69 65  ECT in the serie
165a0 73 20 6d 61 79 20 68 61 76 65 20 61 6e 20 4f 52  s may have an OR
165b0 44 45 52 20 42 59 20 6f 72 20 4c 49 4d 49 54 2e  DER BY or LIMIT.
165c0 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
165d0 70 20 26 26 20 70 2d 3e 70 50 72 69 6f 72 20 29  p && p->pPrior )
165e0 3b 20 20 2f 2a 20 43 61 6c 6c 69 6e 67 20 66 75  ;  /* Calling fu
165f0 6e 63 74 69 6f 6e 20 67 75 61 72 61 6e 74 65 65  nction guarantee
16600 73 20 74 68 69 73 20 6d 75 63 68 20 2a 2f 0a 20  s this much */. 
16610 20 61 73 73 65 72 74 28 20 28 70 2d 3e 73 65 6c   assert( (p->sel
16620 46 6c 61 67 73 20 26 20 53 46 5f 52 65 63 75 72  Flags & SF_Recur
16630 73 69 76 65 29 3d 3d 30 20 7c 7c 20 70 2d 3e 6f  sive)==0 || p->o
16640 70 3d 3d 54 4b 5f 41 4c 4c 20 7c 7c 20 70 2d 3e  p==TK_ALL || p->
16650 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29 3b 0a  op==TK_UNION );.
16660 20 20 61 73 73 65 72 74 28 20 70 2d 3e 73 65 6c    assert( p->sel
16670 46 6c 61 67 73 20 26 20 53 46 5f 43 6f 6d 70 6f  Flags & SF_Compo
16680 75 6e 64 20 29 3b 0a 20 20 64 62 20 3d 20 70 50  und );.  db = pP
16690 61 72 73 65 2d 3e 64 62 3b 0a 20 20 70 50 72 69  arse->db;.  pPri
166a0 6f 72 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 0a  or = p->pPrior;.
166b0 20 20 64 65 73 74 20 3d 20 2a 70 44 65 73 74 3b    dest = *pDest;
166c0 0a 20 20 69 66 28 20 70 50 72 69 6f 72 2d 3e 70  .  if( pPrior->p
166d0 4f 72 64 65 72 42 79 20 7c 7c 20 70 50 72 69 6f  OrderBy || pPrio
166e0 72 2d 3e 70 4c 69 6d 69 74 20 29 7b 0a 20 20 20  r->pLimit ){.   
166f0 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
16700 28 70 50 61 72 73 65 2c 22 25 73 20 63 6c 61 75  (pParse,"%s clau
16710 73 65 20 73 68 6f 75 6c 64 20 63 6f 6d 65 20 61  se should come a
16720 66 74 65 72 20 25 73 20 6e 6f 74 20 62 65 66 6f  fter %s not befo
16730 72 65 22 2c 0a 20 20 20 20 20 20 70 50 72 69 6f  re",.      pPrio
16740 72 2d 3e 70 4f 72 64 65 72 42 79 21 3d 30 20 3f  r->pOrderBy!=0 ?
16750 20 22 4f 52 44 45 52 20 42 59 22 20 3a 20 22 4c   "ORDER BY" : "L
16760 49 4d 49 54 22 2c 20 73 65 6c 65 63 74 4f 70 4e  IMIT", selectOpN
16770 61 6d 65 28 70 2d 3e 6f 70 29 29 3b 0a 20 20 20  ame(p->op));.   
16780 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 67 6f 74   rc = 1;.    got
16790 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65  o multi_select_e
167a0 6e 64 3b 0a 20 20 7d 0a 0a 20 20 76 20 3d 20 73  nd;.  }..  v = s
167b0 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50  qlite3GetVdbe(pP
167c0 61 72 73 65 29 3b 0a 20 20 61 73 73 65 72 74 28  arse);.  assert(
167d0 20 76 21 3d 30 20 29 3b 20 20 2f 2a 20 54 68 65   v!=0 );  /* The
167e0 20 56 44 42 45 20 61 6c 72 65 61 64 79 20 63 72   VDBE already cr
167f0 65 61 74 65 64 20 62 79 20 63 61 6c 6c 69 6e 67  eated by calling
16800 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 0a 20 20   function */..  
16810 2f 2a 20 43 72 65 61 74 65 20 74 68 65 20 64 65  /* Create the de
16820 73 74 69 6e 61 74 69 6f 6e 20 74 65 6d 70 6f 72  stination tempor
16830 61 72 79 20 74 61 62 6c 65 20 69 66 20 6e 65 63  ary table if nec
16840 65 73 73 61 72 79 0a 20 20 2a 2f 0a 20 20 69 66  essary.  */.  if
16850 28 20 64 65 73 74 2e 65 44 65 73 74 3d 3d 53 52  ( dest.eDest==SR
16860 54 5f 45 70 68 65 6d 54 61 62 20 29 7b 0a 20 20  T_EphemTab ){.  
16870 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c    assert( p->pEL
16880 69 73 74 20 29 3b 0a 20 20 20 20 73 71 6c 69 74  ist );.    sqlit
16890 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
168a0 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c  OP_OpenEphemeral
168b0 2c 20 64 65 73 74 2e 69 53 44 50 61 72 6d 2c 20  , dest.iSDParm, 
168c0 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  p->pEList->nExpr
168d0 29 3b 0a 20 20 20 20 64 65 73 74 2e 65 44 65 73  );.    dest.eDes
168e0 74 20 3d 20 53 52 54 5f 54 61 62 6c 65 3b 0a 20  t = SRT_Table;. 
168f0 20 7d 0a 0a 20 20 2f 2a 20 53 70 65 63 69 61 6c   }..  /* Special
16900 20 68 61 6e 64 6c 69 6e 67 20 66 6f 72 20 61 20   handling for a 
16910 63 6f 6d 70 6f 75 6e 64 2d 73 65 6c 65 63 74 20  compound-select 
16920 74 68 61 74 20 6f 72 69 67 69 6e 61 74 65 73 20  that originates 
16930 61 73 20 61 20 56 41 4c 55 45 53 20 63 6c 61 75  as a VALUES clau
16940 73 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  se..  */.  if( p
16950 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f  ->selFlags & SF_
16960 4d 75 6c 74 69 56 61 6c 75 65 20 29 7b 0a 20 20  MultiValue ){.  
16970 20 20 72 63 20 3d 20 6d 75 6c 74 69 53 65 6c 65    rc = multiSele
16980 63 74 56 61 6c 75 65 73 28 70 50 61 72 73 65 2c  ctValues(pParse,
16990 20 70 2c 20 26 64 65 73 74 29 3b 0a 20 20 20 20   p, &dest);.    
169a0 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63  goto multi_selec
169b0 74 5f 65 6e 64 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  t_end;.  }..  /*
169c0 20 4d 61 6b 65 20 73 75 72 65 20 61 6c 6c 20 53   Make sure all S
169d0 45 4c 45 43 54 73 20 69 6e 20 74 68 65 20 73 74  ELECTs in the st
169e0 61 74 65 6d 65 6e 74 20 68 61 76 65 20 74 68 65  atement have the
169f0 20 73 61 6d 65 20 6e 75 6d 62 65 72 20 6f 66 20   same number of 
16a00 65 6c 65 6d 65 6e 74 73 0a 20 20 2a 2a 20 69 6e  elements.  ** in
16a10 20 74 68 65 69 72 20 72 65 73 75 6c 74 20 73 65   their result se
16a20 74 73 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  ts..  */.  asser
16a30 74 28 20 70 2d 3e 70 45 4c 69 73 74 20 26 26 20  t( p->pEList && 
16a40 70 50 72 69 6f 72 2d 3e 70 45 4c 69 73 74 20 29  pPrior->pEList )
16a50 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70  ;.  assert( p->p
16a60 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 70 50  EList->nExpr==pP
16a70 72 69 6f 72 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45  rior->pEList->nE
16a80 78 70 72 20 29 3b 0a 0a 23 69 66 6e 64 65 66 20  xpr );..#ifndef 
16a90 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 54 45 0a  SQLITE_OMIT_CTE.
16aa0 20 20 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61 67    if( p->selFlag
16ab0 73 20 26 20 53 46 5f 52 65 63 75 72 73 69 76 65  s & SF_Recursive
16ac0 20 29 7b 0a 20 20 20 20 67 65 6e 65 72 61 74 65   ){.    generate
16ad0 57 69 74 68 52 65 63 75 72 73 69 76 65 51 75 65  WithRecursiveQue
16ae0 72 79 28 70 50 61 72 73 65 2c 20 70 2c 20 26 64  ry(pParse, p, &d
16af0 65 73 74 29 3b 0a 20 20 7d 65 6c 73 65 0a 23 65  est);.  }else.#e
16b00 6e 64 69 66 0a 0a 20 20 2f 2a 20 43 6f 6d 70 6f  ndif..  /* Compo
16b10 75 6e 64 20 53 45 4c 45 43 54 73 20 74 68 61 74  und SELECTs that
16b20 20 68 61 76 65 20 61 6e 20 4f 52 44 45 52 20 42   have an ORDER B
16b30 59 20 63 6c 61 75 73 65 20 61 72 65 20 68 61 6e  Y clause are han
16b40 64 6c 65 64 20 73 65 70 61 72 61 74 65 6c 79 2e  dled separately.
16b50 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70  .  */.  if( p->p
16b60 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 72  OrderBy ){.    r
16b70 65 74 75 72 6e 20 6d 75 6c 74 69 53 65 6c 65 63  eturn multiSelec
16b80 74 4f 72 64 65 72 42 79 28 70 50 61 72 73 65 2c  tOrderBy(pParse,
16b90 20 70 2c 20 70 44 65 73 74 29 3b 0a 20 20 7d 65   p, pDest);.  }e
16ba0 6c 73 65 7b 0a 0a 23 69 66 6e 64 65 66 20 53 51  lse{..#ifndef SQ
16bb0 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49  LITE_OMIT_EXPLAI
16bc0 4e 0a 20 20 20 20 69 66 28 20 70 50 72 69 6f 72  N.    if( pPrior
16bd0 2d 3e 70 50 72 69 6f 72 3d 3d 30 20 29 7b 0a 20  ->pPrior==0 ){. 
16be0 20 20 20 20 20 45 78 70 6c 61 69 6e 51 75 65 72       ExplainQuer
16bf0 79 50 6c 61 6e 28 28 70 50 61 72 73 65 2c 20 31  yPlan((pParse, 1
16c00 2c 20 22 43 4f 4d 50 4f 55 4e 44 20 51 55 45 52  , "COMPOUND QUER
16c10 59 22 29 29 3b 0a 20 20 20 20 20 20 45 78 70 6c  Y"));.      Expl
16c20 61 69 6e 51 75 65 72 79 50 6c 61 6e 28 28 70 50  ainQueryPlan((pP
16c30 61 72 73 65 2c 20 31 2c 20 22 4c 45 46 54 2d 4d  arse, 1, "LEFT-M
16c40 4f 53 54 20 53 55 42 51 55 45 52 59 22 29 29 3b  OST SUBQUERY"));
16c50 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  .    }.#endif.. 
16c60 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63     /* Generate c
16c70 6f 64 65 20 66 6f 72 20 74 68 65 20 6c 65 66 74  ode for the left
16c80 20 61 6e 64 20 72 69 67 68 74 20 53 45 4c 45 43   and right SELEC
16c90 54 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 20 20  T statements..  
16ca0 20 20 2a 2f 0a 20 20 20 20 73 77 69 74 63 68 28    */.    switch(
16cb0 20 70 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 20 20   p->op ){.      
16cc0 63 61 73 65 20 54 4b 5f 41 4c 4c 3a 20 7b 0a 20  case TK_ALL: {. 
16cd0 20 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 20         int addr 
16ce0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 69 6e 74  = 0;.        int
16cf0 20 6e 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 20   nLimit;.       
16d00 20 61 73 73 65 72 74 28 20 21 70 50 72 69 6f 72   assert( !pPrior
16d10 2d 3e 70 4c 69 6d 69 74 20 29 3b 0a 20 20 20 20  ->pLimit );.    
16d20 20 20 20 20 70 50 72 69 6f 72 2d 3e 69 4c 69 6d      pPrior->iLim
16d30 69 74 20 3d 20 70 2d 3e 69 4c 69 6d 69 74 3b 0a  it = p->iLimit;.
16d40 20 20 20 20 20 20 20 20 70 50 72 69 6f 72 2d 3e          pPrior->
16d50 69 4f 66 66 73 65 74 20 3d 20 70 2d 3e 69 4f 66  iOffset = p->iOf
16d60 66 73 65 74 3b 0a 20 20 20 20 20 20 20 20 70 50  fset;.        pP
16d70 72 69 6f 72 2d 3e 70 4c 69 6d 69 74 20 3d 20 70  rior->pLimit = p
16d80 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20  ->pLimit;.      
16d90 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53 65    rc = sqlite3Se
16da0 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 50 72  lect(pParse, pPr
16db0 69 6f 72 2c 20 26 64 65 73 74 29 3b 0a 20 20 20  ior, &dest);.   
16dc0 20 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d       p->pLimit =
16dd0 20 30 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   0;.        if( 
16de0 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  rc ){.          
16df0 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63  goto multi_selec
16e00 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 20 20 7d  t_end;.        }
16e10 0a 20 20 20 20 20 20 20 20 70 2d 3e 70 50 72 69  .        p->pPri
16e20 6f 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  or = 0;.        
16e30 70 2d 3e 69 4c 69 6d 69 74 20 3d 20 70 50 72 69  p->iLimit = pPri
16e40 6f 72 2d 3e 69 4c 69 6d 69 74 3b 0a 20 20 20 20  or->iLimit;.    
16e50 20 20 20 20 70 2d 3e 69 4f 66 66 73 65 74 20 3d      p->iOffset =
16e60 20 70 50 72 69 6f 72 2d 3e 69 4f 66 66 73 65 74   pPrior->iOffset
16e70 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 2d  ;.        if( p-
16e80 3e 69 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 20  >iLimit ){.     
16e90 20 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69       addr = sqli
16ea0 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
16eb0 20 4f 50 5f 49 66 4e 6f 74 2c 20 70 2d 3e 69 4c   OP_IfNot, p->iL
16ec0 69 6d 69 74 29 3b 20 56 64 62 65 43 6f 76 65 72  imit); VdbeCover
16ed0 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20  age(v);.        
16ee0 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
16ef0 2c 20 22 4a 75 6d 70 20 61 68 65 61 64 20 69 66  , "Jump ahead if
16f00 20 4c 49 4d 49 54 20 72 65 61 63 68 65 64 22 29   LIMIT reached")
16f10 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
16f20 20 70 2d 3e 69 4f 66 66 73 65 74 20 29 7b 0a 20   p->iOffset ){. 
16f30 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
16f40 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
16f50 4f 50 5f 4f 66 66 73 65 74 4c 69 6d 69 74 2c 0a  OP_OffsetLimit,.
16f60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16f70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 2d                p-
16f80 3e 69 4c 69 6d 69 74 2c 20 70 2d 3e 69 4f 66 66  >iLimit, p->iOff
16f90 73 65 74 2b 31 2c 20 70 2d 3e 69 4f 66 66 73 65  set+1, p->iOffse
16fa0 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  t);.          }.
16fb0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
16fc0 20 20 45 78 70 6c 61 69 6e 51 75 65 72 79 50 6c    ExplainQueryPl
16fd0 61 6e 28 28 70 50 61 72 73 65 2c 20 31 2c 20 22  an((pParse, 1, "
16fe0 55 4e 49 4f 4e 20 41 4c 4c 22 29 29 3b 0a 20 20  UNION ALL"));.  
16ff0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
17000 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c  e3Select(pParse,
17010 20 70 2c 20 26 64 65 73 74 29 3b 0a 20 20 20 20   p, &dest);.    
17020 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 63      testcase( rc
17030 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  !=SQLITE_OK );. 
17040 20 20 20 20 20 20 20 70 44 65 6c 65 74 65 20 3d         pDelete =
17050 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20   p->pPrior;.    
17060 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20      p->pPrior = 
17070 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 20 20  pPrior;.        
17080 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20  p->nSelectRow = 
17090 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 41 64 64  sqlite3LogEstAdd
170a0 28 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 2c 20  (p->nSelectRow, 
170b0 70 50 72 69 6f 72 2d 3e 6e 53 65 6c 65 63 74 52  pPrior->nSelectR
170c0 6f 77 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ow);.        if(
170d0 20 70 50 72 69 6f 72 2d 3e 70 4c 69 6d 69 74 0a   pPrior->pLimit.
170e0 20 20 20 20 20 20 20 20 20 26 26 20 73 71 6c 69           && sqli
170f0 74 65 33 45 78 70 72 49 73 49 6e 74 65 67 65 72  te3ExprIsInteger
17100 28 70 50 72 69 6f 72 2d 3e 70 4c 69 6d 69 74 2d  (pPrior->pLimit-
17110 3e 70 4c 65 66 74 2c 20 26 6e 4c 69 6d 69 74 29  >pLeft, &nLimit)
17120 0a 20 20 20 20 20 20 20 20 20 26 26 20 6e 4c 69  .         && nLi
17130 6d 69 74 3e 30 20 26 26 20 70 2d 3e 6e 53 65 6c  mit>0 && p->nSel
17140 65 63 74 52 6f 77 20 3e 20 73 71 6c 69 74 65 33  ectRow > sqlite3
17150 4c 6f 67 45 73 74 28 28 75 36 34 29 6e 4c 69 6d  LogEst((u64)nLim
17160 69 74 29 20 0a 20 20 20 20 20 20 20 20 29 7b 0a  it) .        ){.
17170 20 20 20 20 20 20 20 20 20 20 70 2d 3e 6e 53 65            p->nSe
17180 6c 65 63 74 52 6f 77 20 3d 20 73 71 6c 69 74 65  lectRow = sqlite
17190 33 4c 6f 67 45 73 74 28 28 75 36 34 29 6e 4c 69  3LogEst((u64)nLi
171a0 6d 69 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  mit);.        }.
171b0 20 20 20 20 20 20 20 20 69 66 28 20 61 64 64 72          if( addr
171c0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
171d0 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
171e0 65 28 76 2c 20 61 64 64 72 29 3b 0a 20 20 20 20  e(v, addr);.    
171f0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 62 72      }.        br
17200 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
17210 20 20 20 63 61 73 65 20 54 4b 5f 45 58 43 45 50     case TK_EXCEP
17220 54 3a 0a 20 20 20 20 20 20 63 61 73 65 20 54 4b  T:.      case TK
17230 5f 55 4e 49 4f 4e 3a 20 7b 0a 20 20 20 20 20 20  _UNION: {.      
17240 20 20 69 6e 74 20 75 6e 69 6f 6e 54 61 62 3b 20    int unionTab; 
17250 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6e 75 6d     /* Cursor num
17260 62 65 72 20 6f 66 20 74 68 65 20 74 65 6d 70 20  ber of the temp 
17270 74 61 62 6c 65 20 68 6f 6c 64 69 6e 67 20 72 65  table holding re
17280 73 75 6c 74 20 2a 2f 0a 20 20 20 20 20 20 20 20  sult */.        
17290 75 38 20 6f 70 20 3d 20 30 3b 20 20 20 20 20 20  u8 op = 0;      
172a0 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20 53   /* One of the S
172b0 52 54 5f 20 6f 70 65 72 61 74 69 6f 6e 73 20 74  RT_ operations t
172c0 6f 20 61 70 70 6c 79 20 74 6f 20 73 65 6c 66 20  o apply to self 
172d0 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 70  */.        int p
172e0 72 69 6f 72 4f 70 3b 20 20 20 20 20 2f 2a 20 54  riorOp;     /* T
172f0 68 65 20 53 52 54 5f 20 6f 70 65 72 61 74 69 6f  he SRT_ operatio
17300 6e 20 74 6f 20 61 70 70 6c 79 20 74 6f 20 70 72  n to apply to pr
17310 69 6f 72 20 73 65 6c 65 63 74 73 20 2a 2f 0a 20  ior selects */. 
17320 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 4c 69         Expr *pLi
17330 6d 69 74 3b 20 20 20 20 2f 2a 20 53 61 76 65 64  mit;    /* Saved
17340 20 76 61 6c 75 65 73 20 6f 66 20 70 2d 3e 6e 4c   values of p->nL
17350 69 6d 69 74 20 20 2a 2f 0a 20 20 20 20 20 20 20  imit  */.       
17360 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 20 20 20   int addr;.     
17370 20 20 20 53 65 6c 65 63 74 44 65 73 74 20 75 6e     SelectDest un
17380 69 6f 6e 64 65 73 74 3b 0a 20 20 0a 20 20 20 20  iondest;.  .    
17390 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 2d      testcase( p-
173a0 3e 6f 70 3d 3d 54 4b 5f 45 58 43 45 50 54 20 29  >op==TK_EXCEPT )
173b0 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  ;.        testca
173c0 73 65 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 4e  se( p->op==TK_UN
173d0 49 4f 4e 20 29 3b 0a 20 20 20 20 20 20 20 20 70  ION );.        p
173e0 72 69 6f 72 4f 70 20 3d 20 53 52 54 5f 55 6e 69  riorOp = SRT_Uni
173f0 6f 6e 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  on;.        if( 
17400 64 65 73 74 2e 65 44 65 73 74 3d 3d 70 72 69 6f  dest.eDest==prio
17410 72 4f 70 20 29 7b 0a 20 20 20 20 20 20 20 20 20  rOp ){.         
17420 20 2f 2a 20 57 65 20 63 61 6e 20 72 65 75 73 65   /* We can reuse
17430 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62   a temporary tab
17440 6c 65 20 67 65 6e 65 72 61 74 65 64 20 62 79 20  le generated by 
17450 61 20 53 45 4c 45 43 54 20 74 6f 20 6f 75 72 0a  a SELECT to our.
17460 20 20 20 20 20 20 20 20 20 20 2a 2a 20 72 69 67            ** rig
17470 68 74 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f  ht..          */
17480 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
17490 74 28 20 70 2d 3e 70 4c 69 6d 69 74 3d 3d 30 20  t( p->pLimit==0 
174a0 29 3b 20 20 20 20 20 20 2f 2a 20 4e 6f 74 20 61  );      /* Not a
174b0 6c 6c 6f 77 65 64 20 6f 6e 20 6c 65 66 74 77 61  llowed on leftwa
174c0 72 64 20 65 6c 65 6d 65 6e 74 73 20 2a 2f 0a 20  rd elements */. 
174d0 20 20 20 20 20 20 20 20 20 75 6e 69 6f 6e 54 61           unionTa
174e0 62 20 3d 20 64 65 73 74 2e 69 53 44 50 61 72 6d  b = dest.iSDParm
174f0 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
17500 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 65  .          /* We
17510 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f 20 63 72   will need to cr
17520 65 61 74 65 20 6f 75 72 20 6f 77 6e 20 74 65 6d  eate our own tem
17530 70 6f 72 61 72 79 20 74 61 62 6c 65 20 74 6f 20  porary table to 
17540 68 6f 6c 64 20 74 68 65 0a 20 20 20 20 20 20 20  hold the.       
17550 20 20 20 2a 2a 20 69 6e 74 65 72 6d 65 64 69 61     ** intermedia
17560 74 65 20 72 65 73 75 6c 74 73 2e 0a 20 20 20 20  te results..    
17570 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
17580 20 20 20 75 6e 69 6f 6e 54 61 62 20 3d 20 70 50     unionTab = pP
17590 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20  arse->nTab++;.  
175a0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
175b0 70 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 29  p->pOrderBy==0 )
175c0 3b 0a 20 20 20 20 20 20 20 20 20 20 61 64 64 72  ;.          addr
175d0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
175e0 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45  dOp2(v, OP_OpenE
175f0 70 68 65 6d 65 72 61 6c 2c 20 75 6e 69 6f 6e 54  phemeral, unionT
17600 61 62 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  ab, 0);.        
17610 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 64 64    assert( p->add
17620 72 4f 70 65 6e 45 70 68 6d 5b 30 5d 20 3d 3d 20  rOpenEphm[0] == 
17630 2d 31 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  -1 );.          
17640 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b  p->addrOpenEphm[
17650 30 5d 20 3d 20 61 64 64 72 3b 0a 20 20 20 20 20  0] = addr;.     
17660 20 20 20 20 20 66 69 6e 64 52 69 67 68 74 6d 6f       findRightmo
17670 73 74 28 70 29 2d 3e 73 65 6c 46 6c 61 67 73 20  st(p)->selFlags 
17680 7c 3d 20 53 46 5f 55 73 65 73 45 70 68 65 6d 65  |= SF_UsesEpheme
17690 72 61 6c 3b 0a 20 20 20 20 20 20 20 20 20 20 61  ral;.          a
176a0 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74  ssert( p->pEList
176b0 20 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   );.        }.  
176c0 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 64 65  .        /* Code
176d0 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74   the SELECT stat
176e0 65 6d 65 6e 74 73 20 74 6f 20 6f 75 72 20 6c 65  ements to our le
176f0 66 74 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  ft.        */.  
17700 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70        assert( !p
17710 50 72 69 6f 72 2d 3e 70 4f 72 64 65 72 42 79 20  Prior->pOrderBy 
17720 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
17730 65 33 53 65 6c 65 63 74 44 65 73 74 49 6e 69 74  e3SelectDestInit
17740 28 26 75 6e 69 6f 6e 64 65 73 74 2c 20 70 72 69  (&uniondest, pri
17750 6f 72 4f 70 2c 20 75 6e 69 6f 6e 54 61 62 29 3b  orOp, unionTab);
17760 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
17770 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72  lite3Select(pPar
17780 73 65 2c 20 70 50 72 69 6f 72 2c 20 26 75 6e 69  se, pPrior, &uni
17790 6f 6e 64 65 73 74 29 3b 0a 20 20 20 20 20 20 20  ondest);.       
177a0 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
177b0 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f       goto multi_
177c0 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20  select_end;.    
177d0 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 20 20 20      }.  .       
177e0 20 2f 2a 20 43 6f 64 65 20 74 68 65 20 63 75 72   /* Code the cur
177f0 72 65 6e 74 20 53 45 4c 45 43 54 20 73 74 61 74  rent SELECT stat
17800 65 6d 65 6e 74 0a 20 20 20 20 20 20 20 20 2a 2f  ement.        */
17810 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e  .        if( p->
17820 6f 70 3d 3d 54 4b 5f 45 58 43 45 50 54 20 29 7b  op==TK_EXCEPT ){
17830 0a 20 20 20 20 20 20 20 20 20 20 6f 70 20 3d 20  .          op = 
17840 53 52 54 5f 45 78 63 65 70 74 3b 0a 20 20 20 20  SRT_Except;.    
17850 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
17860 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
17870 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29 3b 0a  op==TK_UNION );.
17880 20 20 20 20 20 20 20 20 20 20 6f 70 20 3d 20 53            op = S
17890 52 54 5f 55 6e 69 6f 6e 3b 0a 20 20 20 20 20 20  RT_Union;.      
178a0 20 20 7d 0a 20 20 20 20 20 20 20 20 70 2d 3e 70    }.        p->p
178b0 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20 20  Prior = 0;.     
178c0 20 20 20 70 4c 69 6d 69 74 20 3d 20 70 2d 3e 70     pLimit = p->p
178d0 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 20 20 70  Limit;.        p
178e0 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20  ->pLimit = 0;.  
178f0 20 20 20 20 20 20 75 6e 69 6f 6e 64 65 73 74 2e        uniondest.
17900 65 44 65 73 74 20 3d 20 6f 70 3b 0a 20 20 20 20  eDest = op;.    
17910 20 20 20 20 45 78 70 6c 61 69 6e 51 75 65 72 79      ExplainQuery
17920 50 6c 61 6e 28 28 70 50 61 72 73 65 2c 20 31 2c  Plan((pParse, 1,
17930 20 22 25 73 20 55 53 49 4e 47 20 54 45 4d 50 20   "%s USING TEMP 
17940 42 2d 54 52 45 45 22 2c 0a 20 20 20 20 20 20 20  B-TREE",.       
17950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17960 20 20 20 73 65 6c 65 63 74 4f 70 4e 61 6d 65 28     selectOpName(
17970 70 2d 3e 6f 70 29 29 29 3b 0a 20 20 20 20 20 20  p->op)));.      
17980 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53 65    rc = sqlite3Se
17990 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 2c 20  lect(pParse, p, 
179a0 26 75 6e 69 6f 6e 64 65 73 74 29 3b 0a 20 20 20  &uniondest);.   
179b0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72       testcase( r
179c0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  c!=SQLITE_OK );.
179d0 20 20 20 20 20 20 20 20 2f 2a 20 51 75 65 72 79          /* Query
179e0 20 66 6c 61 74 74 65 6e 69 6e 67 20 69 6e 20 73   flattening in s
179f0 71 6c 69 74 65 33 53 65 6c 65 63 74 28 29 20 6d  qlite3Select() m
17a00 69 67 68 74 20 72 65 66 69 6c 6c 20 70 2d 3e 70  ight refill p->p
17a10 4f 72 64 65 72 42 79 2e 0a 20 20 20 20 20 20 20  OrderBy..       
17a20 20 2a 2a 20 42 65 20 73 75 72 65 20 74 6f 20 64   ** Be sure to d
17a30 65 6c 65 74 65 20 70 2d 3e 70 4f 72 64 65 72 42  elete p->pOrderB
17a40 79 2c 20 74 68 65 72 65 66 6f 72 65 2c 20 74 6f  y, therefore, to
17a50 20 61 76 6f 69 64 20 61 20 6d 65 6d 6f 72 79 20   avoid a memory 
17a60 6c 65 61 6b 2e 20 2a 2f 0a 20 20 20 20 20 20 20  leak. */.       
17a70 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
17a80 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 4f  Delete(db, p->pO
17a90 72 64 65 72 42 79 29 3b 0a 20 20 20 20 20 20 20  rderBy);.       
17aa0 20 70 44 65 6c 65 74 65 20 3d 20 70 2d 3e 70 50   pDelete = p->pP
17ab0 72 69 6f 72 3b 0a 20 20 20 20 20 20 20 20 70 2d  rior;.        p-
17ac0 3e 70 50 72 69 6f 72 20 3d 20 70 50 72 69 6f 72  >pPrior = pPrior
17ad0 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 70 4f 72  ;.        p->pOr
17ae0 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 20 20 20  derBy = 0;.     
17af0 20 20 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b     if( p->op==TK
17b00 5f 55 4e 49 4f 4e 20 29 7b 0a 20 20 20 20 20 20  _UNION ){.      
17b10 20 20 20 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f      p->nSelectRo
17b20 77 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73  w = sqlite3LogEs
17b30 74 41 64 64 28 70 2d 3e 6e 53 65 6c 65 63 74 52  tAdd(p->nSelectR
17b40 6f 77 2c 20 70 50 72 69 6f 72 2d 3e 6e 53 65 6c  ow, pPrior->nSel
17b50 65 63 74 52 6f 77 29 3b 0a 20 20 20 20 20 20 20  ectRow);.       
17b60 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74   }.        sqlit
17b70 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c  e3ExprDelete(db,
17b80 20 70 2d 3e 70 4c 69 6d 69 74 29 3b 0a 20 20 20   p->pLimit);.   
17b90 20 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d       p->pLimit =
17ba0 20 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 20   pLimit;.       
17bb0 20 70 2d 3e 69 4c 69 6d 69 74 20 3d 20 30 3b 0a   p->iLimit = 0;.
17bc0 20 20 20 20 20 20 20 20 70 2d 3e 69 4f 66 66 73          p->iOffs
17bd0 65 74 20 3d 20 30 3b 0a 20 20 0a 20 20 20 20 20  et = 0;.  .     
17be0 20 20 20 2f 2a 20 43 6f 6e 76 65 72 74 20 74 68     /* Convert th
17bf0 65 20 64 61 74 61 20 69 6e 20 74 68 65 20 74 65  e data in the te
17c00 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 69 6e  mporary table in
17c10 74 6f 20 77 68 61 74 65 76 65 72 20 66 6f 72 6d  to whatever form
17c20 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 74 20 69  .        ** it i
17c30 73 20 74 68 61 74 20 77 65 20 63 75 72 72 65 6e  s that we curren
17c40 74 6c 79 20 6e 65 65 64 2e 0a 20 20 20 20 20 20  tly need..      
17c50 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73    */.        ass
17c60 65 72 74 28 20 75 6e 69 6f 6e 54 61 62 3d 3d 64  ert( unionTab==d
17c70 65 73 74 2e 69 53 44 50 61 72 6d 20 7c 7c 20 64  est.iSDParm || d
17c80 65 73 74 2e 65 44 65 73 74 21 3d 70 72 69 6f 72  est.eDest!=prior
17c90 4f 70 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66  Op );.        if
17ca0 28 20 64 65 73 74 2e 65 44 65 73 74 21 3d 70 72  ( dest.eDest!=pr
17cb0 69 6f 72 4f 70 20 29 7b 0a 20 20 20 20 20 20 20  iorOp ){.       
17cc0 20 20 20 69 6e 74 20 69 43 6f 6e 74 2c 20 69 42     int iCont, iB
17cd0 72 65 61 6b 2c 20 69 53 74 61 72 74 3b 0a 20 20  reak, iStart;.  
17ce0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
17cf0 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20 20  p->pEList );.   
17d00 20 20 20 20 20 20 20 69 42 72 65 61 6b 20 3d 20         iBreak = 
17d10 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
17d20 61 62 65 6c 28 70 50 61 72 73 65 29 3b 0a 20 20  abel(pParse);.  
17d30 20 20 20 20 20 20 20 20 69 43 6f 6e 74 20 3d 20          iCont = 
17d40 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
17d50 61 62 65 6c 28 70 50 61 72 73 65 29 3b 0a 20 20  abel(pParse);.  
17d60 20 20 20 20 20 20 20 20 63 6f 6d 70 75 74 65 4c          computeL
17d70 69 6d 69 74 52 65 67 69 73 74 65 72 73 28 70 50  imitRegisters(pP
17d80 61 72 73 65 2c 20 70 2c 20 69 42 72 65 61 6b 29  arse, p, iBreak)
17d90 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
17da0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
17db0 20 4f 50 5f 52 65 77 69 6e 64 2c 20 75 6e 69 6f   OP_Rewind, unio
17dc0 6e 54 61 62 2c 20 69 42 72 65 61 6b 29 3b 20 56  nTab, iBreak); V
17dd0 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
17de0 20 20 20 20 20 20 20 20 20 20 69 53 74 61 72 74            iStart
17df0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75   = sqlite3VdbeCu
17e00 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20  rrentAddr(v);.  
17e10 20 20 20 20 20 20 20 20 73 65 6c 65 63 74 49 6e          selectIn
17e20 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20  nerLoop(pParse, 
17e30 70 2c 20 75 6e 69 6f 6e 54 61 62 2c 0a 20 20 20  p, unionTab,.   
17e40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17e50 20 20 20 20 20 20 20 30 2c 20 30 2c 20 26 64 65         0, 0, &de
17e60 73 74 2c 20 69 43 6f 6e 74 2c 20 69 42 72 65 61  st, iCont, iBrea
17e70 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  k);.          sq
17e80 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
17e90 4c 61 62 65 6c 28 76 2c 20 69 43 6f 6e 74 29 3b  Label(v, iCont);
17ea0 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
17eb0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
17ec0 4f 50 5f 4e 65 78 74 2c 20 75 6e 69 6f 6e 54 61  OP_Next, unionTa
17ed0 62 2c 20 69 53 74 61 72 74 29 3b 20 56 64 62 65  b, iStart); Vdbe
17ee0 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
17ef0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
17f00 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
17f10 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20  , iBreak);.     
17f20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
17f30 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6c 6f  AddOp2(v, OP_Clo
17f40 73 65 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 30 29  se, unionTab, 0)
17f50 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
17f60 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
17f70 20 7d 0a 20 20 20 20 20 20 64 65 66 61 75 6c 74   }.      default
17f80 3a 20 61 73 73 65 72 74 28 20 70 2d 3e 6f 70 3d  : assert( p->op=
17f90 3d 54 4b 5f 49 4e 54 45 52 53 45 43 54 20 29 3b  =TK_INTERSECT );
17fa0 20 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 74   {.        int t
17fb0 61 62 31 2c 20 74 61 62 32 3b 0a 20 20 20 20 20  ab1, tab2;.     
17fc0 20 20 20 69 6e 74 20 69 43 6f 6e 74 2c 20 69 42     int iCont, iB
17fd0 72 65 61 6b 2c 20 69 53 74 61 72 74 3b 0a 20 20  reak, iStart;.  
17fe0 20 20 20 20 20 20 45 78 70 72 20 2a 70 4c 69 6d        Expr *pLim
17ff0 69 74 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  it;.        int 
18000 61 64 64 72 3b 0a 20 20 20 20 20 20 20 20 53 65  addr;.        Se
18010 6c 65 63 74 44 65 73 74 20 69 6e 74 65 72 73 65  lectDest interse
18020 63 74 64 65 73 74 3b 0a 20 20 20 20 20 20 20 20  ctdest;.        
18030 69 6e 74 20 72 31 3b 0a 20 20 0a 20 20 20 20 20  int r1;.  .     
18040 20 20 20 2f 2a 20 49 4e 54 45 52 53 45 43 54 20     /* INTERSECT 
18050 69 73 20 64 69 66 66 65 72 65 6e 74 20 66 72 6f  is different fro
18060 6d 20 74 68 65 20 6f 74 68 65 72 73 20 73 69 6e  m the others sin
18070 63 65 20 69 74 20 72 65 71 75 69 72 65 73 0a 20  ce it requires. 
18080 20 20 20 20 20 20 20 2a 2a 20 74 77 6f 20 74 65         ** two te
18090 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 73 2e 20  mporary tables. 
180a0 20 48 65 6e 63 65 20 69 74 20 68 61 73 20 69 74   Hence it has it
180b0 73 20 6f 77 6e 20 63 61 73 65 2e 20 20 42 65 67  s own case.  Beg
180c0 69 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 62 79  in.        ** by
180d0 20 61 6c 6c 6f 63 61 74 69 6e 67 20 74 68 65 20   allocating the 
180e0 74 61 62 6c 65 73 20 77 65 20 77 69 6c 6c 20 6e  tables we will n
180f0 65 65 64 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  eed..        */.
18100 20 20 20 20 20 20 20 20 74 61 62 31 20 3d 20 70          tab1 = p
18110 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20  Parse->nTab++;. 
18120 20 20 20 20 20 20 20 74 61 62 32 20 3d 20 70 50         tab2 = pP
18130 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20  arse->nTab++;.  
18140 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
18150 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 3b 0a  >pOrderBy==0 );.
18160 20 20 0a 20 20 20 20 20 20 20 20 61 64 64 72 20    .        addr 
18170 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
18180 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70  Op2(v, OP_OpenEp
18190 68 65 6d 65 72 61 6c 2c 20 74 61 62 31 2c 20 30  hemeral, tab1, 0
181a0 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
181b0 74 28 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70  t( p->addrOpenEp
181c0 68 6d 5b 30 5d 20 3d 3d 20 2d 31 20 29 3b 0a 20  hm[0] == -1 );. 
181d0 20 20 20 20 20 20 20 70 2d 3e 61 64 64 72 4f 70         p->addrOp
181e0 65 6e 45 70 68 6d 5b 30 5d 20 3d 20 61 64 64 72  enEphm[0] = addr
181f0 3b 0a 20 20 20 20 20 20 20 20 66 69 6e 64 52 69  ;.        findRi
18200 67 68 74 6d 6f 73 74 28 70 29 2d 3e 73 65 6c 46  ghtmost(p)->selF
18210 6c 61 67 73 20 7c 3d 20 53 46 5f 55 73 65 73 45  lags |= SF_UsesE
18220 70 68 65 6d 65 72 61 6c 3b 0a 20 20 20 20 20 20  phemeral;.      
18230 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c    assert( p->pEL
18240 69 73 74 20 29 3b 0a 20 20 0a 20 20 20 20 20 20  ist );.  .      
18250 20 20 2f 2a 20 43 6f 64 65 20 74 68 65 20 53 45    /* Code the SE
18260 4c 45 43 54 73 20 74 6f 20 6f 75 72 20 6c 65 66  LECTs to our lef
18270 74 20 69 6e 74 6f 20 74 65 6d 70 6f 72 61 72 79  t into temporary
18280 20 74 61 62 6c 65 20 22 74 61 62 31 22 2e 0a 20   table "tab1".. 
18290 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
182a0 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44    sqlite3SelectD
182b0 65 73 74 49 6e 69 74 28 26 69 6e 74 65 72 73 65  estInit(&interse
182c0 63 74 64 65 73 74 2c 20 53 52 54 5f 55 6e 69 6f  ctdest, SRT_Unio
182d0 6e 2c 20 74 61 62 31 29 3b 0a 20 20 20 20 20 20  n, tab1);.      
182e0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53 65    rc = sqlite3Se
182f0 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 50 72  lect(pParse, pPr
18300 69 6f 72 2c 20 26 69 6e 74 65 72 73 65 63 74 64  ior, &intersectd
18310 65 73 74 29 3b 0a 20 20 20 20 20 20 20 20 69 66  est);.        if
18320 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20  ( rc ){.        
18330 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c    goto multi_sel
18340 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 20  ect_end;.       
18350 20 7d 0a 20 20 0a 20 20 20 20 20 20 20 20 2f 2a   }.  .        /*
18360 20 43 6f 64 65 20 74 68 65 20 63 75 72 72 65 6e   Code the curren
18370 74 20 53 45 4c 45 43 54 20 69 6e 74 6f 20 74 65  t SELECT into te
18380 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 22 74  mporary table "t
18390 61 62 32 22 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ab2".        */.
183a0 20 20 20 20 20 20 20 20 61 64 64 72 20 3d 20 73          addr = s
183b0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
183c0 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d  (v, OP_OpenEphem
183d0 65 72 61 6c 2c 20 74 61 62 32 2c 20 30 29 3b 0a  eral, tab2, 0);.
183e0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
183f0 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b  p->addrOpenEphm[
18400 31 5d 20 3d 3d 20 2d 31 20 29 3b 0a 20 20 20 20  1] == -1 );.    
18410 20 20 20 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45      p->addrOpenE
18420 70 68 6d 5b 31 5d 20 3d 20 61 64 64 72 3b 0a 20  phm[1] = addr;. 
18430 20 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72         p->pPrior
18440 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70 4c   = 0;.        pL
18450 69 6d 69 74 20 3d 20 70 2d 3e 70 4c 69 6d 69 74  imit = p->pLimit
18460 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 70 4c 69  ;.        p->pLi
18470 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  mit = 0;.       
18480 20 69 6e 74 65 72 73 65 63 74 64 65 73 74 2e 69   intersectdest.i
18490 53 44 50 61 72 6d 20 3d 20 74 61 62 32 3b 0a 20  SDParm = tab2;. 
184a0 20 20 20 20 20 20 20 45 78 70 6c 61 69 6e 51 75         ExplainQu
184b0 65 72 79 50 6c 61 6e 28 28 70 50 61 72 73 65 2c  eryPlan((pParse,
184c0 20 31 2c 20 22 25 73 20 55 53 49 4e 47 20 54 45   1, "%s USING TE
184d0 4d 50 20 42 2d 54 52 45 45 22 2c 0a 20 20 20 20  MP B-TREE",.    
184e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
184f0 20 20 20 20 20 20 73 65 6c 65 63 74 4f 70 4e 61        selectOpNa
18500 6d 65 28 70 2d 3e 6f 70 29 29 29 3b 0a 20 20 20  me(p->op)));.   
18510 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
18520 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20  3Select(pParse, 
18530 70 2c 20 26 69 6e 74 65 72 73 65 63 74 64 65 73  p, &intersectdes
18540 74 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74  t);.        test
18550 63 61 73 65 28 20 72 63 21 3d 53 51 4c 49 54 45  case( rc!=SQLITE
18560 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 20 20 70  _OK );.        p
18570 44 65 6c 65 74 65 20 3d 20 70 2d 3e 70 50 72 69  Delete = p->pPri
18580 6f 72 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 70  or;.        p->p
18590 50 72 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a  Prior = pPrior;.
185a0 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 6e          if( p->n
185b0 53 65 6c 65 63 74 52 6f 77 3e 70 50 72 69 6f 72  SelectRow>pPrior
185c0 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 29 7b 0a  ->nSelectRow ){.
185d0 20 20 20 20 20 20 20 20 20 20 70 2d 3e 6e 53 65            p->nSe
185e0 6c 65 63 74 52 6f 77 20 3d 20 70 50 72 69 6f 72  lectRow = pPrior
185f0 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 3b 0a 20 20  ->nSelectRow;.  
18600 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
18610 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
18620 65 28 64 62 2c 20 70 2d 3e 70 4c 69 6d 69 74 29  e(db, p->pLimit)
18630 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 70 4c 69  ;.        p->pLi
18640 6d 69 74 20 3d 20 70 4c 69 6d 69 74 3b 0a 20 20  mit = pLimit;.  
18650 0a 20 20 20 20 20 20 20 20 2f 2a 20 47 65 6e 65  .        /* Gene
18660 72 61 74 65 20 63 6f 64 65 20 74 6f 20 74 61 6b  rate code to tak
18670 65 20 74 68 65 20 69 6e 74 65 72 73 65 63 74 69  e the intersecti
18680 6f 6e 20 6f 66 20 74 68 65 20 74 77 6f 20 74 65  on of the two te
18690 6d 70 6f 72 61 72 79 0a 20 20 20 20 20 20 20 20  mporary.        
186a0 2a 2a 20 74 61 62 6c 65 73 2e 0a 20 20 20 20 20  ** tables..     
186b0 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73     */.        as
186c0 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 20  sert( p->pEList 
186d0 29 3b 0a 20 20 20 20 20 20 20 20 69 42 72 65 61  );.        iBrea
186e0 6b 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  k = sqlite3VdbeM
186f0 61 6b 65 4c 61 62 65 6c 28 70 50 61 72 73 65 29  akeLabel(pParse)
18700 3b 0a 20 20 20 20 20 20 20 20 69 43 6f 6e 74 20  ;.        iCont 
18710 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
18720 65 4c 61 62 65 6c 28 70 50 61 72 73 65 29 3b 0a  eLabel(pParse);.
18730 20 20 20 20 20 20 20 20 63 6f 6d 70 75 74 65 4c          computeL
18740 69 6d 69 74 52 65 67 69 73 74 65 72 73 28 70 50  imitRegisters(pP
18750 61 72 73 65 2c 20 70 2c 20 69 42 72 65 61 6b 29  arse, p, iBreak)
18760 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
18770 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
18780 50 5f 52 65 77 69 6e 64 2c 20 74 61 62 31 2c 20  P_Rewind, tab1, 
18790 69 42 72 65 61 6b 29 3b 20 56 64 62 65 43 6f 76  iBreak); VdbeCov
187a0 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20  erage(v);.      
187b0 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65    r1 = sqlite3Ge
187c0 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29  tTempReg(pParse)
187d0 3b 0a 20 20 20 20 20 20 20 20 69 53 74 61 72 74  ;.        iStart
187e0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
187f0 64 4f 70 32 28 76 2c 20 4f 50 5f 52 6f 77 44 61  dOp2(v, OP_RowDa
18800 74 61 2c 20 74 61 62 31 2c 20 72 31 29 3b 0a 20  ta, tab1, r1);. 
18810 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
18820 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f  beAddOp4Int(v, O
18830 50 5f 4e 6f 74 46 6f 75 6e 64 2c 20 74 61 62 32  P_NotFound, tab2
18840 2c 20 69 43 6f 6e 74 2c 20 72 31 2c 20 30 29 3b  , iCont, r1, 0);
18850 0a 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 76  .        VdbeCov
18860 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20  erage(v);.      
18870 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
18880 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
18890 72 31 29 3b 0a 20 20 20 20 20 20 20 20 73 65 6c  r1);.        sel
188a0 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61  ectInnerLoop(pPa
188b0 72 73 65 2c 20 70 2c 20 74 61 62 31 2c 0a 20 20  rse, p, tab1,.  
188c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
188d0 20 20 20 20 20 20 30 2c 20 30 2c 20 26 64 65 73        0, 0, &des
188e0 74 2c 20 69 43 6f 6e 74 2c 20 69 42 72 65 61 6b  t, iCont, iBreak
188f0 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
18900 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
18910 65 6c 28 76 2c 20 69 43 6f 6e 74 29 3b 0a 20 20  el(v, iCont);.  
18920 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
18930 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65  eAddOp2(v, OP_Ne
18940 78 74 2c 20 74 61 62 31 2c 20 69 53 74 61 72 74  xt, tab1, iStart
18950 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
18960 76 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  v);.        sqli
18970 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
18980 62 65 6c 28 76 2c 20 69 42 72 65 61 6b 29 3b 0a  bel(v, iBreak);.
18990 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
189a0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
189b0 43 6c 6f 73 65 2c 20 74 61 62 32 2c 20 30 29 3b  Close, tab2, 0);
189c0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
189d0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
189e0 5f 43 6c 6f 73 65 2c 20 74 61 62 31 2c 20 30 29  _Close, tab1, 0)
189f0 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
18a00 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
18a10 20 0a 20 20 23 69 66 6e 64 65 66 20 53 51 4c 49   .  #ifndef SQLI
18a20 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a  TE_OMIT_EXPLAIN.
18a30 20 20 20 20 69 66 28 20 70 2d 3e 70 4e 65 78 74      if( p->pNext
18a40 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 45 78 70  ==0 ){.      Exp
18a50 6c 61 69 6e 51 75 65 72 79 50 6c 61 6e 50 6f 70  lainQueryPlanPop
18a60 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 7d 0a  (pParse);.    }.
18a70 20 20 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 0a    #endif.  }.  .
18a80 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 63 6f 6c    /* Compute col
18a90 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 73  lating sequences
18aa0 20 75 73 65 64 20 62 79 20 0a 20 20 2a 2a 20 74   used by .  ** t
18ab0 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 73 20  emporary tables 
18ac0 6e 65 65 64 65 64 20 74 6f 20 69 6d 70 6c 65 6d  needed to implem
18ad0 65 6e 74 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64  ent the compound
18ae0 20 73 65 6c 65 63 74 2e 0a 20 20 2a 2a 20 41 74   select..  ** At
18af0 74 61 63 68 20 74 68 65 20 4b 65 79 49 6e 66 6f  tach the KeyInfo
18b00 20 73 74 72 75 63 74 75 72 65 20 74 6f 20 61 6c   structure to al
18b10 6c 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  l temporary tabl
18b20 65 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  es..  **.  ** Th
18b30 69 73 20 73 65 63 74 69 6f 6e 20 69 73 20 72 75  is section is ru
18b40 6e 20 62 79 20 74 68 65 20 72 69 67 68 74 2d 6d  n by the right-m
18b50 6f 73 74 20 53 45 4c 45 43 54 20 73 74 61 74 65  ost SELECT state
18b60 6d 65 6e 74 20 6f 6e 6c 79 2e 0a 20 20 2a 2a 20  ment only..  ** 
18b70 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
18b80 73 20 74 6f 20 74 68 65 20 6c 65 66 74 20 61 6c  s to the left al
18b90 77 61 79 73 20 73 6b 69 70 20 74 68 69 73 20 70  ways skip this p
18ba0 61 72 74 2e 20 20 54 68 65 20 72 69 67 68 74 2d  art.  The right-
18bb0 6d 6f 73 74 0a 20 20 2a 2a 20 53 45 4c 45 43 54  most.  ** SELECT
18bc0 20 6d 69 67 68 74 20 61 6c 73 6f 20 73 6b 69 70   might also skip
18bd0 20 74 68 69 73 20 70 61 72 74 20 69 66 20 69 74   this part if it
18be0 20 68 61 73 20 6e 6f 20 4f 52 44 45 52 20 42 59   has no ORDER BY
18bf0 20 63 6c 61 75 73 65 20 61 6e 64 0a 20 20 2a 2a   clause and.  **
18c00 20 6e 6f 20 74 65 6d 70 20 74 61 62 6c 65 73 20   no temp tables 
18c10 61 72 65 20 72 65 71 75 69 72 65 64 2e 0a 20 20  are required..  
18c20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 73 65 6c 46  */.  if( p->selF
18c30 6c 61 67 73 20 26 20 53 46 5f 55 73 65 73 45 70  lags & SF_UsesEp
18c40 68 65 6d 65 72 61 6c 20 29 7b 0a 20 20 20 20 69  hemeral ){.    i
18c50 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20  nt i;           
18c60 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
18c70 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  Loop counter */.
18c80 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65      KeyInfo *pKe
18c90 79 49 6e 66 6f 3b 20 20 20 20 20 20 20 20 20 20  yInfo;          
18ca0 20 20 2f 2a 20 43 6f 6c 6c 61 74 69 6e 67 20 73    /* Collating s
18cb0 65 71 75 65 6e 63 65 20 66 6f 72 20 74 68 65 20  equence for the 
18cc0 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 20 20  result set */.  
18cd0 20 20 53 65 6c 65 63 74 20 2a 70 4c 6f 6f 70 3b    Select *pLoop;
18ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18cf0 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 74  /* For looping t
18d00 68 72 6f 75 67 68 20 53 45 4c 45 43 54 20 73 74  hrough SELECT st
18d10 61 74 65 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20  atements */.    
18d20 43 6f 6c 6c 53 65 71 20 2a 2a 61 70 43 6f 6c 6c  CollSeq **apColl
18d30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
18d40 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 74 68 72   For looping thr
18d50 6f 75 67 68 20 70 4b 65 79 49 6e 66 6f 2d 3e 61  ough pKeyInfo->a
18d60 43 6f 6c 6c 5b 5d 20 2a 2f 0a 20 20 20 20 69 6e  Coll[] */.    in
18d70 74 20 6e 43 6f 6c 3b 20 20 20 20 20 20 20 20 20  t nCol;         
18d80 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
18d90 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73  umber of columns
18da0 20 69 6e 20 72 65 73 75 6c 74 20 73 65 74 20 2a   in result set *
18db0 2f 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  /..    assert( p
18dc0 2d 3e 70 4e 65 78 74 3d 3d 30 20 29 3b 0a 20 20  ->pNext==0 );.  
18dd0 20 20 6e 43 6f 6c 20 3d 20 70 2d 3e 70 45 4c 69    nCol = p->pELi
18de0 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 70  st->nExpr;.    p
18df0 4b 65 79 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65  KeyInfo = sqlite
18e00 33 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63 28 64 62  3KeyInfoAlloc(db
18e10 2c 20 6e 43 6f 6c 2c 20 31 29 3b 0a 20 20 20 20  , nCol, 1);.    
18e20 69 66 28 20 21 70 4b 65 79 49 6e 66 6f 20 29 7b  if( !pKeyInfo ){
18e30 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
18e40 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20  TE_NOMEM_BKPT;. 
18e50 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f       goto multi_
18e60 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20  select_end;.    
18e70 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30 2c 20 61  }.    for(i=0, a
18e80 70 43 6f 6c 6c 3d 70 4b 65 79 49 6e 66 6f 2d 3e  pColl=pKeyInfo->
18e90 61 43 6f 6c 6c 3b 20 69 3c 6e 43 6f 6c 3b 20 69  aColl; i<nCol; i
18ea0 2b 2b 2c 20 61 70 43 6f 6c 6c 2b 2b 29 7b 0a 20  ++, apColl++){. 
18eb0 20 20 20 20 20 2a 61 70 43 6f 6c 6c 20 3d 20 6d       *apColl = m
18ec0 75 6c 74 69 53 65 6c 65 63 74 43 6f 6c 6c 53 65  ultiSelectCollSe
18ed0 71 28 70 50 61 72 73 65 2c 20 70 2c 20 69 29 3b  q(pParse, p, i);
18ee0 0a 20 20 20 20 20 20 69 66 28 20 30 3d 3d 2a 61  .      if( 0==*a
18ef0 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20  pColl ){.       
18f00 20 2a 61 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70   *apColl = db->p
18f10 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20 20  DfltColl;.      
18f20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 66 6f 72  }.    }..    for
18f30 28 70 4c 6f 6f 70 3d 70 3b 20 70 4c 6f 6f 70 3b  (pLoop=p; pLoop;
18f40 20 70 4c 6f 6f 70 3d 70 4c 6f 6f 70 2d 3e 70 50   pLoop=pLoop->pP
18f50 72 69 6f 72 29 7b 0a 20 20 20 20 20 20 66 6f 72  rior){.      for
18f60 28 69 3d 30 3b 20 69 3c 32 3b 20 69 2b 2b 29 7b  (i=0; i<2; i++){
18f70 0a 20 20 20 20 20 20 20 20 69 6e 74 20 61 64 64  .        int add
18f80 72 20 3d 20 70 4c 6f 6f 70 2d 3e 61 64 64 72 4f  r = pLoop->addrO
18f90 70 65 6e 45 70 68 6d 5b 69 5d 3b 0a 20 20 20 20  penEphm[i];.    
18fa0 20 20 20 20 69 66 28 20 61 64 64 72 3c 30 20 29      if( addr<0 )
18fb0 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49  {.          /* I
18fc0 66 20 5b 30 5d 20 69 73 20 75 6e 75 73 65 64 20  f [0] is unused 
18fd0 74 68 65 6e 20 5b 31 5d 20 69 73 20 61 6c 73 6f  then [1] is also
18fe0 20 75 6e 75 73 65 64 2e 20 20 53 6f 20 77 65 20   unused.  So we 
18ff0 63 61 6e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  can.          **
19000 20 61 6c 77 61 79 73 20 73 61 66 65 6c 79 20 61   always safely a
19010 62 6f 72 74 20 61 73 20 73 6f 6f 6e 20 61 73 20  bort as soon as 
19020 74 68 65 20 66 69 72 73 74 20 75 6e 75 73 65 64  the first unused
19030 20 73 6c 6f 74 20 69 73 20 66 6f 75 6e 64 20 2a   slot is found *
19040 2f 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  /.          asse
19050 72 74 28 20 70 4c 6f 6f 70 2d 3e 61 64 64 72 4f  rt( pLoop->addrO
19060 70 65 6e 45 70 68 6d 5b 31 5d 3c 30 20 29 3b 0a  penEphm[1]<0 );.
19070 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
19080 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
19090 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
190a0 61 6e 67 65 50 32 28 76 2c 20 61 64 64 72 2c 20  angeP2(v, addr, 
190b0 6e 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20 73  nCol);.        s
190c0 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
190d0 50 34 28 76 2c 20 61 64 64 72 2c 20 28 63 68 61  P4(v, addr, (cha
190e0 72 2a 29 73 71 6c 69 74 65 33 4b 65 79 49 6e 66  r*)sqlite3KeyInf
190f0 6f 52 65 66 28 70 4b 65 79 49 6e 66 6f 29 2c 0a  oRef(pKeyInfo),.
19100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19110 20 20 20 20 20 20 20 20 20 20 20 20 50 34 5f 4b              P4_K
19120 45 59 49 4e 46 4f 29 3b 0a 20 20 20 20 20 20 20  EYINFO);.       
19130 20 70 4c 6f 6f 70 2d 3e 61 64 64 72 4f 70 65 6e   pLoop->addrOpen
19140 45 70 68 6d 5b 69 5d 20 3d 20 2d 31 3b 0a 20 20  Ephm[i] = -1;.  
19150 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
19160 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 55 6e  sqlite3KeyInfoUn
19170 72 65 66 28 70 4b 65 79 49 6e 66 6f 29 3b 0a 20  ref(pKeyInfo);. 
19180 20 7d 0a 0a 6d 75 6c 74 69 5f 73 65 6c 65 63 74   }..multi_select
19190 5f 65 6e 64 3a 0a 20 20 70 44 65 73 74 2d 3e 69  _end:.  pDest->i
191a0 53 64 73 74 20 3d 20 64 65 73 74 2e 69 53 64 73  Sdst = dest.iSds
191b0 74 3b 0a 20 20 70 44 65 73 74 2d 3e 6e 53 64 73  t;.  pDest->nSds
191c0 74 20 3d 20 64 65 73 74 2e 6e 53 64 73 74 3b 0a  t = dest.nSdst;.
191d0 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44    sqlite3SelectD
191e0 65 6c 65 74 65 28 64 62 2c 20 70 44 65 6c 65 74  elete(db, pDelet
191f0 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  e);.  return rc;
19200 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
19210 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e  ITE_OMIT_COMPOUN
19220 44 5f 53 45 4c 45 43 54 20 2a 2f 0a 0a 2f 2a 0a  D_SELECT */../*.
19230 2a 2a 20 45 72 72 6f 72 20 6d 65 73 73 61 67 65  ** Error message
19240 20 66 6f 72 20 77 68 65 6e 20 74 77 6f 20 6f 72   for when two or
19250 20 6d 6f 72 65 20 74 65 72 6d 73 20 6f 66 20 61   more terms of a
19260 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74   compound select
19270 20 68 61 76 65 20 64 69 66 66 65 72 65 6e 74 0a   have different.
19280 2a 2a 20 73 69 7a 65 20 72 65 73 75 6c 74 20 73  ** size result s
19290 65 74 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ets..*/.void sql
192a0 69 74 65 33 53 65 6c 65 63 74 57 72 6f 6e 67 4e  ite3SelectWrongN
192b0 75 6d 54 65 72 6d 73 45 72 72 6f 72 28 50 61 72  umTermsError(Par
192c0 73 65 20 2a 70 50 61 72 73 65 2c 20 53 65 6c 65  se *pParse, Sele
192d0 63 74 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d  ct *p){.  if( p-
192e0 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 56  >selFlags & SF_V
192f0 61 6c 75 65 73 20 29 7b 0a 20 20 20 20 73 71 6c  alues ){.    sql
19300 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
19310 72 73 65 2c 20 22 61 6c 6c 20 56 41 4c 55 45 53  rse, "all VALUES
19320 20 6d 75 73 74 20 68 61 76 65 20 74 68 65 20 73   must have the s
19330 61 6d 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 65  ame number of te
19340 72 6d 73 22 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  rms");.  }else{.
19350 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
19360 4d 73 67 28 70 50 61 72 73 65 2c 20 22 53 45 4c  Msg(pParse, "SEL
19370 45 43 54 73 20 74 6f 20 74 68 65 20 6c 65 66 74  ECTs to the left
19380 20 61 6e 64 20 72 69 67 68 74 20 6f 66 20 25 73   and right of %s
19390 22 0a 20 20 20 20 20 20 22 20 64 6f 20 6e 6f 74  ".      " do not
193a0 20 68 61 76 65 20 74 68 65 20 73 61 6d 65 20 6e   have the same n
193b0 75 6d 62 65 72 20 6f 66 20 72 65 73 75 6c 74 20  umber of result 
193c0 63 6f 6c 75 6d 6e 73 22 2c 20 73 65 6c 65 63 74  columns", select
193d0 4f 70 4e 61 6d 65 28 70 2d 3e 6f 70 29 29 3b 0a  OpName(p->op));.
193e0 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 64    }.}../*.** Cod
193f0 65 20 61 6e 20 6f 75 74 70 75 74 20 73 75 62 72  e an output subr
19400 6f 75 74 69 6e 65 20 66 6f 72 20 61 20 63 6f 72  outine for a cor
19410 6f 75 74 69 6e 65 20 69 6d 70 6c 65 6d 65 6e 74  outine implement
19420 61 74 69 6f 6e 20 6f 66 20 61 0a 2a 2a 20 53 45  ation of a.** SE
19430 4c 45 43 54 20 73 74 61 74 6d 65 6e 74 2e 0a 2a  LECT statment..*
19440 2a 0a 2a 2a 20 54 68 65 20 64 61 74 61 20 74 6f  *.** The data to
19450 20 62 65 20 6f 75 74 70 75 74 20 69 73 20 63 6f   be output is co
19460 6e 74 61 69 6e 65 64 20 69 6e 20 70 49 6e 2d 3e  ntained in pIn->
19470 69 53 64 73 74 2e 20 20 54 68 65 72 65 20 61 72  iSdst.  There ar
19480 65 0a 2a 2a 20 70 49 6e 2d 3e 6e 53 64 73 74 20  e.** pIn->nSdst 
19490 63 6f 6c 75 6d 6e 73 20 74 6f 20 62 65 20 6f 75  columns to be ou
194a0 74 70 75 74 2e 20 20 70 44 65 73 74 20 69 73 20  tput.  pDest is 
194b0 77 68 65 72 65 20 74 68 65 20 6f 75 74 70 75 74  where the output
194c0 20 73 68 6f 75 6c 64 0a 2a 2a 20 62 65 20 73 65   should.** be se
194d0 6e 74 2e 0a 2a 2a 0a 2a 2a 20 72 65 67 52 65 74  nt..**.** regRet
194e0 75 72 6e 20 69 73 20 74 68 65 20 6e 75 6d 62 65  urn is the numbe
194f0 72 20 6f 66 20 74 68 65 20 72 65 67 69 73 74 65  r of the registe
19500 72 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 73 75  r holding the su
19510 62 72 6f 75 74 69 6e 65 0a 2a 2a 20 72 65 74 75  broutine.** retu
19520 72 6e 20 61 64 64 72 65 73 73 2e 0a 2a 2a 0a 2a  rn address..**.*
19530 2a 20 49 66 20 72 65 67 50 72 65 76 3e 30 20 74  * If regPrev>0 t
19540 68 65 6e 20 69 74 20 69 73 20 74 68 65 20 66 69  hen it is the fi
19550 72 73 74 20 72 65 67 69 73 74 65 72 20 69 6e 20  rst register in 
19560 61 20 76 65 63 74 6f 72 20 74 68 61 74 0a 2a 2a  a vector that.**
19570 20 72 65 63 6f 72 64 73 20 74 68 65 20 70 72 65   records the pre
19580 76 69 6f 75 73 20 6f 75 74 70 75 74 2e 20 20 6d  vious output.  m
19590 65 6d 5b 72 65 67 50 72 65 76 5d 20 69 73 20 61  em[regPrev] is a
195a0 20 66 6c 61 67 20 74 68 61 74 20 69 73 20 66 61   flag that is fa
195b0 6c 73 65 0a 2a 2a 20 69 66 20 74 68 65 72 65 20  lse.** if there 
195c0 68 61 73 20 62 65 65 6e 20 6e 6f 20 70 72 65 76  has been no prev
195d0 69 6f 75 73 20 6f 75 74 70 75 74 2e 20 20 49 66  ious output.  If
195e0 20 72 65 67 50 72 65 76 3e 30 20 74 68 65 6e 20   regPrev>0 then 
195f0 63 6f 64 65 20 69 73 0a 2a 2a 20 67 65 6e 65 72  code is.** gener
19600 61 74 65 64 20 74 6f 20 73 75 70 70 72 65 73 73  ated to suppress
19610 20 64 75 70 6c 69 63 61 74 65 73 2e 20 20 70 4b   duplicates.  pK
19620 65 79 49 6e 66 6f 20 69 73 20 75 73 65 64 20 66  eyInfo is used f
19630 6f 72 20 63 6f 6d 70 61 72 69 6e 67 0a 2a 2a 20  or comparing.** 
19640 6b 65 79 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  keys..**.** If t
19650 68 65 20 4c 49 4d 49 54 20 66 6f 75 6e 64 20 69  he LIMIT found i
19660 6e 20 70 2d 3e 69 4c 69 6d 69 74 20 69 73 20 72  n p->iLimit is r
19670 65 61 63 68 65 64 2c 20 6a 75 6d 70 20 69 6d 6d  eached, jump imm
19680 65 64 69 61 74 65 6c 79 20 74 6f 0a 2a 2a 20 69  ediately to.** i
19690 42 72 65 61 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63  Break..*/.static
196a0 20 69 6e 74 20 67 65 6e 65 72 61 74 65 4f 75 74   int generateOut
196b0 70 75 74 53 75 62 72 6f 75 74 69 6e 65 28 0a 20  putSubroutine(. 
196c0 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
196d0 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73           /* Pars
196e0 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
196f0 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20   Select *p,     
19700 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
19710 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
19720 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74   */.  SelectDest
19730 20 2a 70 49 6e 2c 20 20 20 20 20 20 20 20 2f 2a   *pIn,        /*
19740 20 43 6f 72 6f 75 74 69 6e 65 20 73 75 70 70 6c   Coroutine suppl
19750 79 69 6e 67 20 64 61 74 61 20 2a 2f 0a 20 20 53  ying data */.  S
19760 65 6c 65 63 74 44 65 73 74 20 2a 70 44 65 73 74  electDest *pDest
19770 2c 20 20 20 20 20 20 2f 2a 20 57 68 65 72 65 20  ,      /* Where 
19780 74 6f 20 73 65 6e 64 20 74 68 65 20 64 61 74 61  to send the data
19790 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 52 65 74   */.  int regRet
197a0 75 72 6e 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  urn,          /*
197b0 20 54 68 65 20 72 65 74 75 72 6e 20 61 64 64 72   The return addr
197c0 65 73 73 20 72 65 67 69 73 74 65 72 20 2a 2f 0a  ess register */.
197d0 20 20 69 6e 74 20 72 65 67 50 72 65 76 2c 20 20    int regPrev,  
197e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72 65            /* Pre
197f0 76 69 6f 75 73 20 72 65 73 75 6c 74 20 72 65 67  vious result reg
19800 69 73 74 65 72 2e 20 20 4e 6f 20 75 6e 69 71 75  ister.  No uniqu
19810 65 6e 65 73 73 20 69 66 20 30 20 2a 2f 0a 20 20  eness if 0 */.  
19820 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66  KeyInfo *pKeyInf
19830 6f 2c 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 63  o,      /* For c
19840 6f 6d 70 61 72 69 6e 67 20 77 69 74 68 20 70 72  omparing with pr
19850 65 76 69 6f 75 73 20 65 6e 74 72 79 20 2a 2f 0a  evious entry */.
19860 20 20 69 6e 74 20 69 42 72 65 61 6b 20 20 20 20    int iBreak    
19870 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d            /* Jum
19880 70 20 68 65 72 65 20 69 66 20 77 65 20 68 69 74  p here if we hit
19890 20 74 68 65 20 4c 49 4d 49 54 20 2a 2f 0a 29 7b   the LIMIT */.){
198a0 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61  .  Vdbe *v = pPa
198b0 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e  rse->pVdbe;.  in
198c0 74 20 69 43 6f 6e 74 69 6e 75 65 3b 0a 20 20 69  t iContinue;.  i
198d0 6e 74 20 61 64 64 72 3b 0a 0a 20 20 61 64 64 72  nt addr;..  addr
198e0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75   = sqlite3VdbeCu
198f0 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20  rrentAddr(v);.  
19900 69 43 6f 6e 74 69 6e 75 65 20 3d 20 73 71 6c 69  iContinue = sqli
19910 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
19920 28 70 50 61 72 73 65 29 3b 0a 0a 20 20 2f 2a 20  (pParse);..  /* 
19930 53 75 70 70 72 65 73 73 20 64 75 70 6c 69 63 61  Suppress duplica
19940 74 65 73 20 66 6f 72 20 55 4e 49 4f 4e 2c 20 45  tes for UNION, E
19950 58 43 45 50 54 2c 20 61 6e 64 20 49 4e 54 45 52  XCEPT, and INTER
19960 53 45 43 54 20 0a 20 20 2a 2f 0a 20 20 69 66 28  SECT .  */.  if(
19970 20 72 65 67 50 72 65 76 20 29 7b 0a 20 20 20 20   regPrev ){.    
19980 69 6e 74 20 61 64 64 72 31 2c 20 61 64 64 72 32  int addr1, addr2
19990 3b 0a 20 20 20 20 61 64 64 72 31 20 3d 20 73 71  ;.    addr1 = sq
199a0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
199b0 76 2c 20 4f 50 5f 49 66 4e 6f 74 2c 20 72 65 67  v, OP_IfNot, reg
199c0 50 72 65 76 29 3b 20 56 64 62 65 43 6f 76 65 72  Prev); VdbeCover
199d0 61 67 65 28 76 29 3b 0a 20 20 20 20 61 64 64 72  age(v);.    addr
199e0 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  2 = sqlite3VdbeA
199f0 64 64 4f 70 34 28 76 2c 20 4f 50 5f 43 6f 6d 70  ddOp4(v, OP_Comp
19a00 61 72 65 2c 20 70 49 6e 2d 3e 69 53 64 73 74 2c  are, pIn->iSdst,
19a10 20 72 65 67 50 72 65 76 2b 31 2c 20 70 49 6e 2d   regPrev+1, pIn-
19a20 3e 6e 53 64 73 74 2c 0a 20 20 20 20 20 20 20 20  >nSdst,.        
19a30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19a40 20 20 20 20 20 20 28 63 68 61 72 2a 29 73 71 6c        (char*)sql
19a50 69 74 65 33 4b 65 79 49 6e 66 6f 52 65 66 28 70  ite3KeyInfoRef(p
19a60 4b 65 79 49 6e 66 6f 29 2c 20 50 34 5f 4b 45 59  KeyInfo), P4_KEY
19a70 49 4e 46 4f 29 3b 0a 20 20 20 20 73 71 6c 69 74  INFO);.    sqlit
19a80 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
19a90 4f 50 5f 4a 75 6d 70 2c 20 61 64 64 72 32 2b 32  OP_Jump, addr2+2
19aa0 2c 20 69 43 6f 6e 74 69 6e 75 65 2c 20 61 64 64  , iContinue, add
19ab0 72 32 2b 32 29 3b 20 56 64 62 65 43 6f 76 65 72  r2+2); VdbeCover
19ac0 61 67 65 28 76 29 3b 0a 20 20 20 20 73 71 6c 69  age(v);.    sqli
19ad0 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
19ae0 76 2c 20 61 64 64 72 31 29 3b 0a 20 20 20 20 73  v, addr1);.    s
19af0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
19b00 28 76 2c 20 4f 50 5f 43 6f 70 79 2c 20 70 49 6e  (v, OP_Copy, pIn
19b10 2d 3e 69 53 64 73 74 2c 20 72 65 67 50 72 65 76  ->iSdst, regPrev
19b20 2b 31 2c 20 70 49 6e 2d 3e 6e 53 64 73 74 2d 31  +1, pIn->nSdst-1
19b30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
19b40 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
19b50 6e 74 65 67 65 72 2c 20 31 2c 20 72 65 67 50 72  nteger, 1, regPr
19b60 65 76 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  ev);.  }.  if( p
19b70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  Parse->db->mallo
19b80 63 46 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e  cFailed ) return
19b90 20 30 3b 0a 0a 20 20 2f 2a 20 53 75 70 70 72 65   0;..  /* Suppre
19ba0 73 73 20 74 68 65 20 66 69 72 73 74 20 4f 46 46  ss the first OFF
19bb0 53 45 54 20 65 6e 74 72 69 65 73 20 69 66 20 74  SET entries if t
19bc0 68 65 72 65 20 69 73 20 61 6e 20 4f 46 46 53 45  here is an OFFSE
19bd0 54 20 63 6c 61 75 73 65 0a 20 20 2a 2f 0a 20 20  T clause.  */.  
19be0 63 6f 64 65 4f 66 66 73 65 74 28 76 2c 20 70 2d  codeOffset(v, p-
19bf0 3e 69 4f 66 66 73 65 74 2c 20 69 43 6f 6e 74 69  >iOffset, iConti
19c00 6e 75 65 29 3b 0a 0a 20 20 61 73 73 65 72 74 28  nue);..  assert(
19c10 20 70 44 65 73 74 2d 3e 65 44 65 73 74 21 3d 53   pDest->eDest!=S
19c20 52 54 5f 45 78 69 73 74 73 20 29 3b 0a 20 20 61  RT_Exists );.  a
19c30 73 73 65 72 74 28 20 70 44 65 73 74 2d 3e 65 44  ssert( pDest->eD
19c40 65 73 74 21 3d 53 52 54 5f 54 61 62 6c 65 20 29  est!=SRT_Table )
19c50 3b 0a 20 20 73 77 69 74 63 68 28 20 70 44 65 73  ;.  switch( pDes
19c60 74 2d 3e 65 44 65 73 74 20 29 7b 0a 20 20 20 20  t->eDest ){.    
19c70 2f 2a 20 53 74 6f 72 65 20 74 68 65 20 72 65 73  /* Store the res
19c80 75 6c 74 20 61 73 20 64 61 74 61 20 75 73 69 6e  ult as data usin
19c90 67 20 61 20 75 6e 69 71 75 65 20 6b 65 79 2e 0a  g a unique key..
19ca0 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20      */.    case 
19cb0 53 52 54 5f 45 70 68 65 6d 54 61 62 3a 20 7b 0a  SRT_EphemTab: {.
19cc0 20 20 20 20 20 20 69 6e 74 20 72 31 20 3d 20 73        int r1 = s
19cd0 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67  qlite3GetTempReg
19ce0 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
19cf0 69 6e 74 20 72 32 20 3d 20 73 71 6c 69 74 65 33  int r2 = sqlite3
19d00 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73  GetTempReg(pPars
19d10 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  e);.      sqlite
19d20 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
19d30 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 70 49  P_MakeRecord, pI
19d40 6e 2d 3e 69 53 64 73 74 2c 20 70 49 6e 2d 3e 6e  n->iSdst, pIn->n
19d50 53 64 73 74 2c 20 72 31 29 3b 0a 20 20 20 20 20  Sdst, r1);.     
19d60 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
19d70 70 32 28 76 2c 20 4f 50 5f 4e 65 77 52 6f 77 69  p2(v, OP_NewRowi
19d80 64 2c 20 70 44 65 73 74 2d 3e 69 53 44 50 61 72  d, pDest->iSDPar
19d90 6d 2c 20 72 32 29 3b 0a 20 20 20 20 20 20 73 71  m, r2);.      sq
19da0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
19db0 76 2c 20 4f 50 5f 49 6e 73 65 72 74 2c 20 70 44  v, OP_Insert, pD
19dc0 65 73 74 2d 3e 69 53 44 50 61 72 6d 2c 20 72 31  est->iSDParm, r1
19dd0 2c 20 72 32 29 3b 0a 20 20 20 20 20 20 73 71 6c  , r2);.      sql
19de0 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35  ite3VdbeChangeP5
19df0 28 76 2c 20 4f 50 46 4c 41 47 5f 41 50 50 45 4e  (v, OPFLAG_APPEN
19e00 44 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  D);.      sqlite
19e10 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
19e20 70 50 61 72 73 65 2c 20 72 32 29 3b 0a 20 20 20  pParse, r2);.   
19e30 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
19e40 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
19e50 20 72 31 29 3b 0a 20 20 20 20 20 20 62 72 65 61   r1);.      brea
19e60 6b 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 6e 64 65  k;.    }..#ifnde
19e70 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  f SQLITE_OMIT_SU
19e80 42 51 55 45 52 59 0a 20 20 20 20 2f 2a 20 49 66  BQUERY.    /* If
19e90 20 77 65 20 61 72 65 20 63 72 65 61 74 69 6e 67   we are creating
19ea0 20 61 20 73 65 74 20 66 6f 72 20 61 6e 20 22 65   a set for an "e
19eb0 78 70 72 20 49 4e 20 28 53 45 4c 45 43 54 20 2e  xpr IN (SELECT .
19ec0 2e 2e 29 22 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ..)"..    */.   
19ed0 20 63 61 73 65 20 53 52 54 5f 53 65 74 3a 20 7b   case SRT_Set: {
19ee0 0a 20 20 20 20 20 20 69 6e 74 20 72 31 3b 0a 20  .      int r1;. 
19ef0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
19f00 49 6e 2d 3e 6e 53 64 73 74 3e 31 20 29 3b 0a 20  In->nSdst>1 );. 
19f10 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65       r1 = sqlite
19f20 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72  3GetTempReg(pPar
19f30 73 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  se);.      sqlit
19f40 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
19f50 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 70  OP_MakeRecord, 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 2c 20 0a 20 20 20 20 20 20 20 20  nSdst, .        
19f80 20 20 72 31 2c 20 70 44 65 73 74 2d 3e 7a 41 66    r1, pDest->zAf
19f90 66 53 64 73 74 2c 20 70 49 6e 2d 3e 6e 53 64 73  fSdst, pIn->nSds
19fa0 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
19fb0 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76  3VdbeAddOp4Int(v
19fc0 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20  , OP_IdxInsert, 
19fd0 70 44 65 73 74 2d 3e 69 53 44 50 61 72 6d 2c 20  pDest->iSDParm, 
19fe0 72 31 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  r1,.            
19ff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
1a000 49 6e 2d 3e 69 53 64 73 74 2c 20 70 49 6e 2d 3e  In->iSdst, pIn->
1a010 6e 53 64 73 74 29 3b 0a 20 20 20 20 20 20 73 71  nSdst);.      sq
1a020 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
1a030 52 65 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b  Reg(pParse, r1);
1a040 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
1a050 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74    }..    /* If t
1a060 68 69 73 20 69 73 20 61 20 73 63 61 6c 61 72 20  his is a scalar 
1a070 73 65 6c 65 63 74 20 74 68 61 74 20 69 73 20 70  select that is p
1a080 61 72 74 20 6f 66 20 61 6e 20 65 78 70 72 65 73  art of an expres
1a090 73 69 6f 6e 2c 20 74 68 65 6e 0a 20 20 20 20 2a  sion, then.    *
1a0a0 2a 20 73 74 6f 72 65 20 74 68 65 20 72 65 73 75  * store the resu
1a0b0 6c 74 73 20 69 6e 20 74 68 65 20 61 70 70 72 6f  lts in the appro
1a0c0 70 72 69 61 74 65 20 6d 65 6d 6f 72 79 20 63 65  priate memory ce
1a0d0 6c 6c 20 61 6e 64 20 62 72 65 61 6b 20 6f 75 74  ll and break out
1a0e0 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 73  .    ** of the s
1a0f0 63 61 6e 20 6c 6f 6f 70 2e 20 20 4e 6f 74 65 20  can loop.  Note 
1a100 74 68 61 74 20 74 68 65 20 73 65 6c 65 63 74 20  that the select 
1a110 6d 69 67 68 74 20 72 65 74 75 72 6e 20 6d 75 6c  might return mul
1a120 74 69 70 6c 65 20 63 6f 6c 75 6d 6e 73 0a 20 20  tiple columns.  
1a130 20 20 2a 2a 20 69 66 20 69 74 20 69 73 20 74 68    ** if it is th
1a140 65 20 52 48 53 20 6f 66 20 61 20 72 6f 77 2d 76  e RHS of a row-v
1a150 61 6c 75 65 20 49 4e 20 6f 70 65 72 61 74 6f 72  alue IN operator
1a160 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73  ..    */.    cas
1a170 65 20 53 52 54 5f 4d 65 6d 3a 20 7b 0a 20 20 20  e SRT_Mem: {.   
1a180 20 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e     if( pParse->n
1a190 45 72 72 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Err==0 ){.      
1a1a0 20 20 74 65 73 74 63 61 73 65 28 20 70 49 6e 2d    testcase( pIn-
1a1b0 3e 6e 53 64 73 74 3e 31 20 29 3b 0a 20 20 20 20  >nSdst>1 );.    
1a1c0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
1a1d0 6f 64 65 4d 6f 76 65 28 70 50 61 72 73 65 2c 20  odeMove(pParse, 
1a1e0 70 49 6e 2d 3e 69 53 64 73 74 2c 20 70 44 65 73  pIn->iSdst, pDes
1a1f0 74 2d 3e 69 53 44 50 61 72 6d 2c 20 70 49 6e 2d  t->iSDParm, pIn-
1a200 3e 6e 53 64 73 74 29 3b 0a 20 20 20 20 20 20 7d  >nSdst);.      }
1a210 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 4c 49  .      /* The LI
1a220 4d 49 54 20 63 6c 61 75 73 65 20 77 69 6c 6c 20  MIT clause will 
1a230 6a 75 6d 70 20 6f 75 74 20 6f 66 20 74 68 65 20  jump out of the 
1a240 6c 6f 6f 70 20 66 6f 72 20 75 73 20 2a 2f 0a 20  loop for us */. 
1a250 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1a260 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 23 69 66 6e  }.#endif /* #ifn
1a270 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1a280 53 55 42 51 55 45 52 59 20 2a 2f 0a 0a 20 20 20  SUBQUERY */..   
1a290 20 2f 2a 20 54 68 65 20 72 65 73 75 6c 74 73 20   /* The results 
1a2a0 61 72 65 20 73 74 6f 72 65 64 20 69 6e 20 61 20  are stored in a 
1a2b0 73 65 71 75 65 6e 63 65 20 6f 66 20 72 65 67 69  sequence of regi
1a2c0 73 74 65 72 73 0a 20 20 20 20 2a 2a 20 73 74 61  sters.    ** sta
1a2d0 72 74 69 6e 67 20 61 74 20 70 44 65 73 74 2d 3e  rting at pDest->
1a2e0 69 53 64 73 74 2e 20 20 54 68 65 6e 20 74 68 65  iSdst.  Then the
1a2f0 20 63 6f 2d 72 6f 75 74 69 6e 65 20 79 69 65 6c   co-routine yiel
1a300 64 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63  ds..    */.    c
1a310 61 73 65 20 53 52 54 5f 43 6f 72 6f 75 74 69 6e  ase SRT_Coroutin
1a320 65 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 70  e: {.      if( p
1a330 44 65 73 74 2d 3e 69 53 64 73 74 3d 3d 30 20 29  Dest->iSdst==0 )
1a340 7b 0a 20 20 20 20 20 20 20 20 70 44 65 73 74 2d  {.        pDest-
1a350 3e 69 53 64 73 74 20 3d 20 73 71 6c 69 74 65 33  >iSdst = sqlite3
1a360 47 65 74 54 65 6d 70 52 61 6e 67 65 28 70 50 61  GetTempRange(pPa
1a370 72 73 65 2c 20 70 49 6e 2d 3e 6e 53 64 73 74 29  rse, pIn->nSdst)
1a380 3b 0a 20 20 20 20 20 20 20 20 70 44 65 73 74 2d  ;.        pDest-
1a390 3e 6e 53 64 73 74 20 3d 20 70 49 6e 2d 3e 6e 53  >nSdst = pIn->nS
1a3a0 64 73 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  dst;.      }.   
1a3b0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
1a3c0 64 65 4d 6f 76 65 28 70 50 61 72 73 65 2c 20 70  deMove(pParse, p
1a3d0 49 6e 2d 3e 69 53 64 73 74 2c 20 70 44 65 73 74  In->iSdst, pDest
1a3e0 2d 3e 69 53 64 73 74 2c 20 70 49 6e 2d 3e 6e 53  ->iSdst, pIn->nS
1a3f0 64 73 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  dst);.      sqli
1a400 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
1a410 20 4f 50 5f 59 69 65 6c 64 2c 20 70 44 65 73 74   OP_Yield, pDest
1a420 2d 3e 69 53 44 50 61 72 6d 29 3b 0a 20 20 20 20  ->iSDParm);.    
1a430 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
1a440 20 20 20 20 2f 2a 20 49 66 20 6e 6f 6e 65 20 6f      /* If none o
1a450 66 20 74 68 65 20 61 62 6f 76 65 2c 20 74 68 65  f the above, the
1a460 6e 20 74 68 65 20 72 65 73 75 6c 74 20 64 65 73  n the result des
1a470 74 69 6e 61 74 69 6f 6e 20 6d 75 73 74 20 62 65  tination must be
1a480 0a 20 20 20 20 2a 2a 20 53 52 54 5f 4f 75 74 70  .    ** SRT_Outp
1a490 75 74 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  ut.  This routin
1a4a0 65 20 69 73 20 6e 65 76 65 72 20 63 61 6c 6c 65  e is never calle
1a4b0 64 20 77 69 74 68 20 61 6e 79 20 6f 74 68 65 72  d with any other
1a4c0 0a 20 20 20 20 2a 2a 20 64 65 73 74 69 6e 61 74  .    ** destinat
1a4d0 69 6f 6e 20 6f 74 68 65 72 20 74 68 61 6e 20 74  ion other than t
1a4e0 68 65 20 6f 6e 65 73 20 68 61 6e 64 6c 65 64 20  he ones handled 
1a4f0 61 62 6f 76 65 20 6f 72 20 53 52 54 5f 4f 75 74  above or SRT_Out
1a500 70 75 74 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  put..    **.    
1a510 2a 2a 20 46 6f 72 20 53 52 54 5f 4f 75 74 70 75  ** For SRT_Outpu
1a520 74 2c 20 72 65 73 75 6c 74 73 20 61 72 65 20 73  t, results are s
1a530 74 6f 72 65 64 20 69 6e 20 61 20 73 65 71 75 65  tored in a seque
1a540 6e 63 65 20 6f 66 20 72 65 67 69 73 74 65 72 73  nce of registers
1a550 2e 20 20 0a 20 20 20 20 2a 2a 20 54 68 65 6e 20  .  .    ** Then 
1a560 74 68 65 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77  the OP_ResultRow
1a570 20 6f 70 63 6f 64 65 20 69 73 20 75 73 65 64 20   opcode is used 
1a580 74 6f 20 63 61 75 73 65 20 73 71 6c 69 74 65 33  to cause sqlite3
1a590 5f 73 74 65 70 28 29 20 74 6f 0a 20 20 20 20 2a  _step() to.    *
1a5a0 2a 20 72 65 74 75 72 6e 20 74 68 65 20 6e 65 78  * return the nex
1a5b0 74 20 72 6f 77 20 6f 66 20 72 65 73 75 6c 74 2e  t row of result.
1a5c0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64 65 66 61  .    */.    defa
1a5d0 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 61 73 73  ult: {.      ass
1a5e0 65 72 74 28 20 70 44 65 73 74 2d 3e 65 44 65 73  ert( pDest->eDes
1a5f0 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20 29 3b  t==SRT_Output );
1a600 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
1a610 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52  beAddOp2(v, OP_R
1a620 65 73 75 6c 74 52 6f 77 2c 20 70 49 6e 2d 3e 69  esultRow, pIn->i
1a630 53 64 73 74 2c 20 70 49 6e 2d 3e 6e 53 64 73 74  Sdst, pIn->nSdst
1a640 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
1a650 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
1a660 4a 75 6d 70 20 74 6f 20 74 68 65 20 65 6e 64 20  Jump to the end 
1a670 6f 66 20 74 68 65 20 6c 6f 6f 70 20 69 66 20 74  of the loop if t
1a680 68 65 20 4c 49 4d 49 54 20 69 73 20 72 65 61 63  he LIMIT is reac
1a690 68 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  hed..  */.  if( 
1a6a0 70 2d 3e 69 4c 69 6d 69 74 20 29 7b 0a 20 20 20  p->iLimit ){.   
1a6b0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1a6c0 70 32 28 76 2c 20 4f 50 5f 44 65 63 72 4a 75 6d  p2(v, OP_DecrJum
1a6d0 70 5a 65 72 6f 2c 20 70 2d 3e 69 4c 69 6d 69 74  pZero, p->iLimit
1a6e0 2c 20 69 42 72 65 61 6b 29 3b 20 56 64 62 65 43  , iBreak); VdbeC
1a6f0 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 7d 0a  overage(v);.  }.
1a700 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 74  .  /* Generate t
1a710 68 65 20 73 75 62 72 6f 75 74 69 6e 65 20 72 65  he subroutine re
1a720 74 75 72 6e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69  turn.  */.  sqli
1a730 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
1a740 62 65 6c 28 76 2c 20 69 43 6f 6e 74 69 6e 75 65  bel(v, iContinue
1a750 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
1a760 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 74  AddOp1(v, OP_Ret
1a770 75 72 6e 2c 20 72 65 67 52 65 74 75 72 6e 29 3b  urn, regReturn);
1a780 0a 0a 20 20 72 65 74 75 72 6e 20 61 64 64 72 3b  ..  return addr;
1a790 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 74 65 72 6e  .}../*.** Altern
1a7a0 61 74 69 76 65 20 63 6f 6d 70 6f 75 6e 64 20 73  ative compound s
1a7b0 65 6c 65 63 74 20 63 6f 64 65 20 67 65 6e 65 72  elect code gener
1a7c0 61 74 6f 72 20 66 6f 72 20 63 61 73 65 73 20 77  ator for cases w
1a7d0 68 65 6e 20 74 68 65 72 65 0a 2a 2a 20 69 73 20  hen there.** is 
1a7e0 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  an ORDER BY clau
1a7f0 73 65 2e 0a 2a 2a 0a 2a 2a 20 57 65 20 61 73 73  se..**.** We ass
1a800 75 6d 65 20 61 20 71 75 65 72 79 20 6f 66 20 74  ume a query of t
1a810 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 6f 72  he following for
1a820 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 3c 73  m:.**.**      <s
1a830 65 6c 65 63 74 41 3e 20 20 3c 6f 70 65 72 61 74  electA>  <operat
1a840 6f 72 3e 20 20 3c 73 65 6c 65 63 74 42 3e 20 20  or>  <selectB>  
1a850 4f 52 44 45 52 20 42 59 20 3c 6f 72 64 65 72 62  ORDER BY <orderb
1a860 79 6c 69 73 74 3e 0a 2a 2a 0a 2a 2a 20 3c 6f 70  ylist>.**.** <op
1a870 65 72 61 74 6f 72 3e 20 69 73 20 6f 6e 65 20 6f  erator> is one o
1a880 66 20 55 4e 49 4f 4e 20 41 4c 4c 2c 20 55 4e 49  f UNION ALL, UNI
1a890 4f 4e 2c 20 45 58 43 45 50 54 2c 20 6f 72 20 49  ON, EXCEPT, or I
1a8a0 4e 54 45 52 53 45 43 54 2e 20 20 54 68 65 20 69  NTERSECT.  The i
1a8b0 64 65 61 0a 2a 2a 20 69 73 20 74 6f 20 63 6f 64  dea.** is to cod
1a8c0 65 20 62 6f 74 68 20 3c 73 65 6c 65 63 74 41 3e  e both <selectA>
1a8d0 20 61 6e 64 20 3c 73 65 6c 65 63 74 42 3e 20 77   and <selectB> w
1a8e0 69 74 68 20 74 68 65 20 4f 52 44 45 52 20 42 59  ith the ORDER BY
1a8f0 20 63 6c 61 75 73 65 20 61 73 0a 2a 2a 20 63 6f   clause as.** co
1a900 2d 72 6f 75 74 69 6e 65 73 2e 20 20 54 68 65 6e  -routines.  Then
1a910 20 72 75 6e 20 74 68 65 20 63 6f 2d 72 6f 75 74   run the co-rout
1a920 69 6e 65 73 20 69 6e 20 70 61 72 61 6c 6c 65 6c  ines in parallel
1a930 20 61 6e 64 20 6d 65 72 67 65 20 74 68 65 20 72   and merge the r
1a940 65 73 75 6c 74 73 0a 2a 2a 20 69 6e 74 6f 20 74  esults.** into t
1a950 68 65 20 6f 75 74 70 75 74 2e 20 20 49 6e 20 61  he output.  In a
1a960 64 64 69 74 69 6f 6e 20 74 6f 20 74 68 65 20 74  ddition to the t
1a970 77 6f 20 63 6f 72 6f 75 74 69 6e 65 73 20 28 63  wo coroutines (c
1a980 61 6c 6c 65 64 20 73 65 6c 65 63 74 41 20 61 6e  alled selectA an
1a990 64 0a 2a 2a 20 73 65 6c 65 63 74 42 29 20 74 68  d.** selectB) th
1a9a0 65 72 65 20 61 72 65 20 37 20 73 75 62 72 6f 75  ere are 7 subrou
1a9b0 74 69 6e 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  tines:.**.**    
1a9c0 6f 75 74 41 3a 20 20 20 20 4d 6f 76 65 20 74 68  outA:    Move th
1a9d0 65 20 6f 75 74 70 75 74 20 6f 66 20 74 68 65 20  e output of the 
1a9e0 73 65 6c 65 63 74 41 20 63 6f 72 6f 75 74 69 6e  selectA coroutin
1a9f0 65 20 69 6e 74 6f 20 74 68 65 20 6f 75 74 70 75  e into the outpu
1aa00 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  t.**            
1aa10 20 6f 66 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64   of the compound
1aa20 20 71 75 65 72 79 2e 0a 2a 2a 0a 2a 2a 20 20 20   query..**.**   
1aa30 20 6f 75 74 42 3a 20 20 20 20 4d 6f 76 65 20 74   outB:    Move t
1aa40 68 65 20 6f 75 74 70 75 74 20 6f 66 20 74 68 65  he output of the
1aa50 20 73 65 6c 65 63 74 42 20 63 6f 72 6f 75 74 69   selectB corouti
1aa60 6e 65 20 69 6e 74 6f 20 74 68 65 20 6f 75 74 70  ne into the outp
1aa70 75 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  ut.**           
1aa80 20 20 6f 66 20 74 68 65 20 63 6f 6d 70 6f 75 6e    of the compoun
1aa90 64 20 71 75 65 72 79 2e 20 20 28 4f 6e 6c 79 20  d query.  (Only 
1aaa0 67 65 6e 65 72 61 74 65 64 20 66 6f 72 20 55 4e  generated for UN
1aab0 49 4f 4e 20 61 6e 64 0a 2a 2a 20 20 20 20 20 20  ION and.**      
1aac0 20 20 20 20 20 20 20 55 4e 49 4f 4e 20 41 4c 4c         UNION ALL
1aad0 2e 20 20 45 58 43 45 50 54 20 61 6e 64 20 49 4e  .  EXCEPT and IN
1aae0 53 45 52 54 53 45 43 54 20 6e 65 76 65 72 20 6f  SERTSECT never o
1aaf0 75 74 70 75 74 20 61 20 72 6f 77 20 74 68 61 74  utput a row that
1ab00 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
1ab10 61 70 70 65 61 72 73 20 6f 6e 6c 79 20 69 6e 20  appears only in 
1ab20 42 2e 29 0a 2a 2a 0a 2a 2a 20 20 20 20 41 6c 74  B.).**.**    Alt
1ab30 42 3a 20 20 20 20 43 61 6c 6c 65 64 20 77 68 65  B:    Called whe
1ab40 6e 20 74 68 65 72 65 20 69 73 20 64 61 74 61 20  n there is data 
1ab50 66 72 6f 6d 20 62 6f 74 68 20 63 6f 72 6f 75 74  from both corout
1ab60 69 6e 65 73 20 61 6e 64 20 41 3c 42 2e 0a 2a 2a  ines and A<B..**
1ab70 0a 2a 2a 20 20 20 20 41 65 71 42 3a 20 20 20 20  .**    AeqB:    
1ab80 43 61 6c 6c 65 64 20 77 68 65 6e 20 74 68 65 72  Called when ther
1ab90 65 20 69 73 20 64 61 74 61 20 66 72 6f 6d 20 62  e is data from b
1aba0 6f 74 68 20 63 6f 72 6f 75 74 69 6e 65 73 20 61  oth coroutines a
1abb0 6e 64 20 41 3d 3d 42 2e 0a 2a 2a 0a 2a 2a 20 20  nd A==B..**.**  
1abc0 20 20 41 67 74 42 3a 20 20 20 20 43 61 6c 6c 65    AgtB:    Calle
1abd0 64 20 77 68 65 6e 20 74 68 65 72 65 20 69 73 20  d when there is 
1abe0 64 61 74 61 20 66 72 6f 6d 20 62 6f 74 68 20 63  data from both c
1abf0 6f 72 6f 75 74 69 6e 65 73 20 61 6e 64 20 41 3e  oroutines and A>
1ac00 42 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 45 6f 66 41  B..**.**    EofA
1ac10 3a 20 20 20 20 43 61 6c 6c 65 64 20 77 68 65 6e  :    Called when
1ac20 20 64 61 74 61 20 69 73 20 65 78 68 61 75 73 74   data is exhaust
1ac30 65 64 20 66 72 6f 6d 20 73 65 6c 65 63 74 41 2e  ed from selectA.
1ac40 0a 2a 2a 0a 2a 2a 20 20 20 20 45 6f 66 42 3a 20  .**.**    EofB: 
1ac50 20 20 20 43 61 6c 6c 65 64 20 77 68 65 6e 20 64     Called when d
1ac60 61 74 61 20 69 73 20 65 78 68 61 75 73 74 65 64  ata is exhausted
1ac70 20 66 72 6f 6d 20 73 65 6c 65 63 74 42 2e 0a 2a   from selectB..*
1ac80 2a 0a 2a 2a 20 54 68 65 20 69 6d 70 6c 65 6d 65  *.** The impleme
1ac90 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 6c  ntation of the l
1aca0 61 74 74 65 72 20 66 69 76 65 20 73 75 62 72 6f  atter five subro
1acb0 75 74 69 6e 65 73 20 64 65 70 65 6e 64 20 6f 6e  utines depend on
1acc0 20 77 68 69 63 68 20 0a 2a 2a 20 3c 6f 70 65 72   which .** <oper
1acd0 61 74 6f 72 3e 20 69 73 20 75 73 65 64 3a 0a 2a  ator> is used:.*
1ace0 2a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20  *.**.**         
1acf0 20 20 20 20 55 4e 49 4f 4e 20 41 4c 4c 20 20 20      UNION ALL   
1ad00 20 20 20 20 20 20 55 4e 49 4f 4e 20 20 20 20 20        UNION     
1ad10 20 20 20 20 20 20 20 45 58 43 45 50 54 20 20 20         EXCEPT   
1ad20 20 20 20 20 20 20 20 49 4e 54 45 52 53 45 43 54         INTERSECT
1ad30 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 2d 2d 2d  .**          ---
1ad40 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 2d 2d 2d 2d  ----------  ----
1ad50 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 2d  -------------  -
1ad60 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 2d  -------------  -
1ad70 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1ad80 0a 2a 2a 20 20 20 41 6c 74 42 3a 20 20 20 6f 75  .**   AltB:   ou
1ad90 74 41 2c 20 6e 65 78 74 41 20 20 20 20 20 20 6f  tA, nextA      o
1ada0 75 74 41 2c 20 6e 65 78 74 41 20 20 20 20 20 20  utA, nextA      
1adb0 20 6f 75 74 41 2c 20 6e 65 78 74 41 20 20 20 20   outA, nextA    
1adc0 20 20 20 20 20 6e 65 78 74 41 0a 2a 2a 0a 2a 2a       nextA.**.**
1add0 20 20 20 41 65 71 42 3a 20 20 20 6f 75 74 41 2c     AeqB:   outA,
1ade0 20 6e 65 78 74 41 20 20 20 20 20 20 20 20 20 6e   nextA         n
1adf0 65 78 74 41 20 20 20 20 20 20 20 20 20 20 20 20  extA            
1ae00 20 6e 65 78 74 41 20 20 20 20 20 20 20 20 20 6f   nextA         o
1ae10 75 74 41 2c 20 6e 65 78 74 41 0a 2a 2a 0a 2a 2a  utA, nextA.**.**
1ae20 20 20 20 41 67 74 42 3a 20 20 20 6f 75 74 42 2c     AgtB:   outB,
1ae30 20 6e 65 78 74 42 20 20 20 20 20 20 6f 75 74 42   nextB      outB
1ae40 2c 20 6e 65 78 74 42 20 20 20 20 20 20 20 20 20  , nextB         
1ae50 20 6e 65 78 74 42 20 20 20 20 20 20 20 20 20 20   nextB          
1ae60 20 20 6e 65 78 74 42 0a 2a 2a 0a 2a 2a 20 20 20    nextB.**.**   
1ae70 45 6f 66 41 3a 20 20 20 6f 75 74 42 2c 20 6e 65  EofA:   outB, ne
1ae80 78 74 42 20 20 20 20 20 20 6f 75 74 42 2c 20 6e  xtB      outB, n
1ae90 65 78 74 42 20 20 20 20 20 20 20 20 20 20 68 61  extB          ha
1aea0 6c 74 20 20 20 20 20 20 20 20 20 20 20 20 20 68  lt             h
1aeb0 61 6c 74 0a 2a 2a 0a 2a 2a 20 20 20 45 6f 66 42  alt.**.**   EofB
1aec0 3a 20 20 20 6f 75 74 41 2c 20 6e 65 78 74 41 20  :   outA, nextA 
1aed0 20 20 20 20 20 6f 75 74 41 2c 20 6e 65 78 74 41       outA, nextA
1aee0 20 20 20 20 20 20 20 6f 75 74 41 2c 20 6e 65 78         outA, nex
1aef0 74 41 20 20 20 20 20 20 20 20 20 68 61 6c 74 0a  tA         halt.
1af00 2a 2a 0a 2a 2a 20 49 6e 20 74 68 65 20 41 6c 74  **.** In the Alt
1af10 42 2c 20 41 65 71 42 2c 20 61 6e 64 20 41 67 74  B, AeqB, and Agt
1af20 42 20 73 75 62 72 6f 75 74 69 6e 65 73 2c 20 61  B subroutines, a
1af30 6e 20 45 4f 46 20 6f 6e 20 41 20 66 6f 6c 6c 6f  n EOF on A follo
1af40 77 69 6e 67 20 6e 65 78 74 41 0a 2a 2a 20 63 61  wing nextA.** ca
1af50 75 73 65 73 20 61 6e 20 69 6d 6d 65 64 69 61 74  uses an immediat
1af60 65 20 6a 75 6d 70 20 74 6f 20 45 6f 66 41 20 61  e jump to EofA a
1af70 6e 64 20 61 6e 20 45 4f 46 20 6f 6e 20 42 20 66  nd an EOF on B f
1af80 6f 6c 6c 6f 77 69 6e 67 20 6e 65 78 74 42 20 63  ollowing nextB c
1af90 61 75 73 65 73 0a 2a 2a 20 61 6e 20 69 6d 6d 65  auses.** an imme
1afa0 64 69 61 74 65 20 6a 75 6d 70 20 74 6f 20 45 6f  diate jump to Eo
1afb0 66 42 2e 20 20 57 69 74 68 69 6e 20 45 6f 66 41  fB.  Within EofA
1afc0 20 61 6e 64 20 45 6f 66 42 2c 20 61 6e 64 20 45   and EofB, and E
1afd0 4f 46 20 6f 6e 20 65 6e 74 72 79 20 6f 72 0a 2a  OF on entry or.*
1afe0 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 6e 65 78 74  * following next
1aff0 58 20 63 61 75 73 65 73 20 61 20 6a 75 6d 70 20  X causes a jump 
1b000 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  to the end of th
1b010 65 20 73 65 6c 65 63 74 20 70 72 6f 63 65 73 73  e select process
1b020 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 44 75 70 6c 69  ing..**.** Dupli
1b030 63 61 74 65 20 72 65 6d 6f 76 61 6c 20 69 6e 20  cate removal in 
1b040 74 68 65 20 55 4e 49 4f 4e 2c 20 45 58 43 45 50  the UNION, EXCEP
1b050 54 2c 20 61 6e 64 20 49 4e 54 45 52 53 45 43 54  T, and INTERSECT
1b060 20 63 61 73 65 73 20 69 73 20 68 61 6e 64 6c 65   cases is handle
1b070 64 0a 2a 2a 20 77 69 74 68 69 6e 20 74 68 65 20  d.** within the 
1b080 6f 75 74 70 75 74 20 73 75 62 72 6f 75 74 69 6e  output subroutin
1b090 65 2e 20 20 54 68 65 20 72 65 67 50 72 65 76 20  e.  The regPrev 
1b0a0 72 65 67 69 73 74 65 72 20 73 65 74 20 68 6f 6c  register set hol
1b0b0 64 73 20 74 68 65 20 70 72 65 76 69 6f 75 73 6c  ds the previousl
1b0c0 79 0a 2a 2a 20 6f 75 74 70 75 74 20 76 61 6c 75  y.** output valu
1b0d0 65 2e 20 20 41 20 63 6f 6d 70 61 72 69 73 6f 6e  e.  A comparison
1b0e0 20 69 73 20 6d 61 64 65 20 61 67 61 69 6e 73 74   is made against
1b0f0 20 74 68 69 73 20 76 61 6c 75 65 20 61 6e 64 20   this value and 
1b100 74 68 65 20 6f 75 74 70 75 74 0a 2a 2a 20 69 73  the output.** is
1b110 20 73 6b 69 70 70 65 64 20 69 66 20 74 68 65 20   skipped if the 
1b120 6e 65 78 74 20 72 65 73 75 6c 74 73 20 77 6f 75  next results wou
1b130 6c 64 20 62 65 20 74 68 65 20 73 61 6d 65 20 61  ld be the same a
1b140 73 20 74 68 65 20 70 72 65 76 69 6f 75 73 2e 0a  s the previous..
1b150 2a 2a 0a 2a 2a 20 54 68 65 20 69 6d 70 6c 65 6d  **.** The implem
1b160 65 6e 74 61 74 69 6f 6e 20 70 6c 61 6e 20 69 73  entation plan is
1b170 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68   to implement th
1b180 65 20 74 77 6f 20 63 6f 72 6f 75 74 69 6e 65 73  e two coroutines
1b190 20 61 6e 64 20 73 65 76 65 6e 0a 2a 2a 20 73 75   and seven.** su
1b1a0 62 72 6f 75 74 69 6e 65 73 20 66 69 72 73 74 2c  broutines first,
1b1b0 20 74 68 65 6e 20 70 75 74 20 74 68 65 20 63 6f   then put the co
1b1c0 6e 74 72 6f 6c 20 6c 6f 67 69 63 20 61 74 20 74  ntrol logic at t
1b1d0 68 65 20 62 6f 74 74 6f 6d 2e 20 20 4c 69 6b 65  he bottom.  Like
1b1e0 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20   this:.**.**    
1b1f0 20 20 20 20 20 20 67 6f 74 6f 20 49 6e 69 74 0a        goto Init.
1b200 2a 2a 20 20 20 20 20 63 6f 41 3a 20 63 6f 72 6f  **     coA: coro
1b210 75 74 69 6e 65 20 66 6f 72 20 6c 65 66 74 20 71  utine for left q
1b220 75 65 72 79 20 28 41 29 0a 2a 2a 20 20 20 20 20  uery (A).**     
1b230 63 6f 42 3a 20 63 6f 72 6f 75 74 69 6e 65 20 66  coB: coroutine f
1b240 6f 72 20 72 69 67 68 74 20 71 75 65 72 79 20 28  or right query (
1b250 42 29 0a 2a 2a 20 20 20 20 6f 75 74 41 3a 20 6f  B).**    outA: o
1b260 75 74 70 75 74 20 6f 6e 65 20 72 6f 77 20 6f 66  utput one row of
1b270 20 41 0a 2a 2a 20 20 20 20 6f 75 74 42 3a 20 6f   A.**    outB: o
1b280 75 74 70 75 74 20 6f 6e 65 20 72 6f 77 20 6f 66  utput one row of
1b290 20 42 20 28 55 4e 49 4f 4e 20 61 6e 64 20 55 4e   B (UNION and UN
1b2a0 49 4f 4e 20 41 4c 4c 20 6f 6e 6c 79 29 0a 2a 2a  ION ALL only).**
1b2b0 20 20 20 20 45 6f 66 41 3a 20 2e 2e 2e 0a 2a 2a      EofA: ....**
1b2c0 20 20 20 20 45 6f 66 42 3a 20 2e 2e 2e 0a 2a 2a      EofB: ....**
1b2d0 20 20 20 20 41 6c 74 42 3a 20 2e 2e 2e 0a 2a 2a      AltB: ....**
1b2e0 20 20 20 20 41 65 71 42 3a 20 2e 2e 2e 0a 2a 2a      AeqB: ....**
1b2f0 20 20 20 20 41 67 74 42 3a 20 2e 2e 2e 0a 2a 2a      AgtB: ....**
1b300 20 20 20 20 49 6e 69 74 3a 20 69 6e 69 74 69 61      Init: initia
1b310 6c 69 7a 65 20 63 6f 72 6f 75 74 69 6e 65 20 72  lize coroutine r
1b320 65 67 69 73 74 65 72 73 0a 2a 2a 20 20 20 20 20  egisters.**     
1b330 20 20 20 20 20 79 69 65 6c 64 20 63 6f 41 0a 2a       yield coA.*
1b340 2a 20 20 20 20 20 20 20 20 20 20 69 66 20 65 6f  *          if eo
1b350 66 28 41 29 20 67 6f 74 6f 20 45 6f 66 41 0a 2a  f(A) goto EofA.*
1b360 2a 20 20 20 20 20 20 20 20 20 20 79 69 65 6c 64  *          yield
1b370 20 63 6f 42 0a 2a 2a 20 20 20 20 20 20 20 20 20   coB.**         
1b380 20 69 66 20 65 6f 66 28 42 29 20 67 6f 74 6f 20   if eof(B) goto 
1b390 45 6f 66 42 0a 2a 2a 20 20 20 20 43 6d 70 72 3a  EofB.**    Cmpr:
1b3a0 20 43 6f 6d 70 61 72 65 20 41 2c 20 42 0a 2a 2a   Compare A, B.**
1b3b0 20 20 20 20 20 20 20 20 20 20 4a 75 6d 70 20 41            Jump A
1b3c0 6c 74 42 2c 20 41 65 71 42 2c 20 41 67 74 42 0a  ltB, AeqB, AgtB.
1b3d0 2a 2a 20 20 20 20 20 45 6e 64 3a 20 2e 2e 2e 0a  **     End: ....
1b3e0 2a 2a 0a 2a 2a 20 57 65 20 63 61 6c 6c 20 41 6c  **.** We call Al
1b3f0 74 42 2c 20 41 65 71 42 2c 20 41 67 74 42 2c 20  tB, AeqB, AgtB, 
1b400 45 6f 66 41 2c 20 61 6e 64 20 45 6f 66 42 20 22  EofA, and EofB "
1b410 73 75 62 72 6f 75 74 69 6e 65 73 22 20 62 75 74  subroutines" but
1b420 20 74 68 65 79 20 61 72 65 20 6e 6f 74 0a 2a 2a   they are not.**
1b430 20 61 63 74 75 61 6c 6c 79 20 63 61 6c 6c 65 64   actually called
1b440 20 75 73 69 6e 67 20 47 6f 73 75 62 20 61 6e 64   using Gosub and
1b450 20 74 68 65 79 20 64 6f 20 6e 6f 74 20 52 65 74   they do not Ret
1b460 75 72 6e 2e 20 20 45 6f 66 41 20 61 6e 64 20 45  urn.  EofA and E
1b470 6f 66 42 20 6c 6f 6f 70 0a 2a 2a 20 75 6e 74 69  ofB loop.** unti
1b480 6c 20 61 6c 6c 20 64 61 74 61 20 69 73 20 65 78  l all data is ex
1b490 68 61 75 73 74 65 64 20 74 68 65 6e 20 6a 75 6d  hausted then jum
1b4a0 70 20 74 6f 20 74 68 65 20 22 65 6e 64 22 20 6c  p to the "end" l
1b4b0 61 62 65 2e 20 20 41 6c 74 42 2c 20 41 65 71 42  abe.  AltB, AeqB
1b4c0 2c 0a 2a 2a 20 61 6e 64 20 41 67 74 42 20 6a 75  ,.** and AgtB ju
1b4d0 6d 70 20 74 6f 20 65 69 74 68 65 72 20 4c 32 20  mp to either L2 
1b4e0 6f 72 20 74 6f 20 6f 6e 65 20 6f 66 20 45 6f 66  or to one of Eof
1b4f0 41 20 6f 72 20 45 6f 66 42 2e 0a 2a 2f 0a 23 69  A or EofB..*/.#i
1b500 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
1b510 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43  T_COMPOUND_SELEC
1b520 54 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 75 6c  T.static int mul
1b530 74 69 53 65 6c 65 63 74 4f 72 64 65 72 42 79 28  tiSelectOrderBy(
1b540 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
1b550 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73  ,        /* Pars
1b560 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
1b570 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20   Select *p,     
1b580 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 69         /* The ri
1b590 67 68 74 2d 6d 6f 73 74 20 6f 66 20 53 45 4c 45  ght-most of SELE
1b5a0 43 54 73 20 74 6f 20 62 65 20 63 6f 64 65 64 20  CTs to be coded 
1b5b0 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20  */.  SelectDest 
1b5c0 2a 70 44 65 73 74 20 20 20 20 20 2f 2a 20 57 68  *pDest     /* Wh
1b5d0 61 74 20 74 6f 20 64 6f 20 77 69 74 68 20 71 75  at to do with qu
1b5e0 65 72 79 20 72 65 73 75 6c 74 73 20 2a 2f 0a 29  ery results */.)
1b5f0 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 20 20 20  {.  int i, j;   
1b600 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
1b610 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20  p counters */.  
1b620 53 65 6c 65 63 74 20 2a 70 50 72 69 6f 72 3b 20  Select *pPrior; 
1b630 20 20 20 20 20 20 2f 2a 20 41 6e 6f 74 68 65 72        /* Another
1b640 20 53 45 4c 45 43 54 20 69 6d 6d 65 64 69 61 74   SELECT immediat
1b650 65 6c 79 20 74 6f 20 6f 75 72 20 6c 65 66 74 20  ely to our left 
1b660 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b 20 20 20  */.  Vdbe *v;   
1b670 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 47 65             /* Ge
1b680 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 74  nerate code to t
1b690 68 69 73 20 56 44 42 45 20 2a 2f 0a 20 20 53 65  his VDBE */.  Se
1b6a0 6c 65 63 74 44 65 73 74 20 64 65 73 74 41 3b 20  lectDest destA; 
1b6b0 20 20 20 20 2f 2a 20 44 65 73 74 69 6e 61 74 69      /* Destinati
1b6c0 6f 6e 20 66 6f 72 20 63 6f 72 6f 75 74 69 6e 65  on for coroutine
1b6d0 20 41 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65   A */.  SelectDe
1b6e0 73 74 20 64 65 73 74 42 3b 20 20 20 20 20 2f 2a  st destB;     /*
1b6f0 20 44 65 73 74 69 6e 61 74 69 6f 6e 20 66 6f 72   Destination for
1b700 20 63 6f 72 6f 75 74 69 6e 65 20 42 20 2a 2f 0a   coroutine B */.
1b710 20 20 69 6e 74 20 72 65 67 41 64 64 72 41 3b 20    int regAddrA; 
1b720 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65          /* Addre
1b730 73 73 20 72 65 67 69 73 74 65 72 20 66 6f 72 20  ss register for 
1b740 73 65 6c 65 63 74 2d 41 20 63 6f 72 6f 75 74 69  select-A corouti
1b750 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 41  ne */.  int regA
1b760 64 64 72 42 3b 20 20 20 20 20 20 20 20 20 2f 2a  ddrB;         /*
1b770 20 41 64 64 72 65 73 73 20 72 65 67 69 73 74 65   Address registe
1b780 72 20 66 6f 72 20 73 65 6c 65 63 74 2d 42 20 63  r for select-B c
1b790 6f 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e  oroutine */.  in
1b7a0 74 20 61 64 64 72 53 65 6c 65 63 74 41 3b 20 20  t addrSelectA;  
1b7b0 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f      /* Address o
1b7c0 66 20 74 68 65 20 73 65 6c 65 63 74 2d 41 20 63  f the select-A c
1b7d0 6f 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e  oroutine */.  in
1b7e0 74 20 61 64 64 72 53 65 6c 65 63 74 42 3b 20 20  t addrSelectB;  
1b7f0 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f      /* Address o
1b800 66 20 74 68 65 20 73 65 6c 65 63 74 2d 42 20 63  f the select-B c
1b810 6f 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e  oroutine */.  in
1b820 74 20 72 65 67 4f 75 74 41 3b 20 20 20 20 20 20  t regOutA;      
1b830 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 72      /* Address r
1b840 65 67 69 73 74 65 72 20 66 6f 72 20 74 68 65 20  egister for the 
1b850 6f 75 74 70 75 74 2d 41 20 73 75 62 72 6f 75 74  output-A subrout
1b860 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67  ine */.  int reg
1b870 4f 75 74 42 3b 20 20 20 20 20 20 20 20 20 20 2f  OutB;          /
1b880 2a 20 41 64 64 72 65 73 73 20 72 65 67 69 73 74  * Address regist
1b890 65 72 20 66 6f 72 20 74 68 65 20 6f 75 74 70 75  er for the outpu
1b8a0 74 2d 42 20 73 75 62 72 6f 75 74 69 6e 65 20 2a  t-B subroutine *
1b8b0 2f 0a 20 20 69 6e 74 20 61 64 64 72 4f 75 74 41  /.  int addrOutA
1b8c0 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64  ;         /* Add
1b8d0 72 65 73 73 20 6f 66 20 74 68 65 20 6f 75 74 70  ress of the outp
1b8e0 75 74 2d 41 20 73 75 62 72 6f 75 74 69 6e 65 20  ut-A subroutine 
1b8f0 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 4f 75 74  */.  int addrOut
1b900 42 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 41 64  B = 0;     /* Ad
1b910 64 72 65 73 73 20 6f 66 20 74 68 65 20 6f 75 74  dress of the out
1b920 70 75 74 2d 42 20 73 75 62 72 6f 75 74 69 6e 65  put-B subroutine
1b930 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 45 6f   */.  int addrEo
1b940 66 41 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41  fA;         /* A
1b950 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 73 65  ddress of the se
1b960 6c 65 63 74 2d 41 2d 65 78 68 61 75 73 74 65 64  lect-A-exhausted
1b970 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20   subroutine */. 
1b980 20 69 6e 74 20 61 64 64 72 45 6f 66 41 5f 6e 6f   int addrEofA_no
1b990 42 3b 20 20 20 20 20 2f 2a 20 41 6c 74 65 72 6e  B;     /* Altern
1b9a0 61 74 65 20 61 64 64 72 45 6f 66 41 20 69 66 20  ate addrEofA if 
1b9b0 42 20 69 73 20 75 6e 69 6e 69 74 69 61 6c 69 7a  B is uninitializ
1b9c0 65 64 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72  ed */.  int addr
1b9d0 45 6f 66 42 3b 20 20 20 20 20 20 20 20 20 2f 2a  EofB;         /*
1b9e0 20 41 64 64 72 65 73 73 20 6f 66 20 74 68 65 20   Address of the 
1b9f0 73 65 6c 65 63 74 2d 42 2d 65 78 68 61 75 73 74  select-B-exhaust
1ba00 65 64 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f  ed subroutine */
1ba10 0a 20 20 69 6e 74 20 61 64 64 72 41 6c 74 42 3b  .  int addrAltB;
1ba20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72           /* Addr
1ba30 65 73 73 20 6f 66 20 74 68 65 20 41 3c 42 20 73  ess of the A<B s
1ba40 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69  ubroutine */.  i
1ba50 6e 74 20 61 64 64 72 41 65 71 42 3b 20 20 20 20  nt addrAeqB;    
1ba60 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
1ba70 6f 66 20 74 68 65 20 41 3d 3d 42 20 73 75 62 72  of the A==B subr
1ba80 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20  outine */.  int 
1ba90 61 64 64 72 41 67 74 42 3b 20 20 20 20 20 20 20  addrAgtB;       
1baa0 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20    /* Address of 
1bab0 74 68 65 20 41 3e 42 20 73 75 62 72 6f 75 74 69  the A>B subrouti
1bac0 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 4c  ne */.  int regL
1bad0 69 6d 69 74 41 3b 20 20 20 20 20 20 20 20 2f 2a  imitA;        /*
1bae0 20 4c 69 6d 69 74 20 72 65 67 69 73 74 65 72 20   Limit register 
1baf0 66 6f 72 20 73 65 6c 65 63 74 2d 41 20 2a 2f 0a  for select-A */.
1bb00 20 20 69 6e 74 20 72 65 67 4c 69 6d 69 74 42 3b    int regLimitB;
1bb10 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 6d 69 74          /* Limit
1bb20 20 72 65 67 69 73 74 65 72 20 66 6f 72 20 73 65   register for se
1bb30 6c 65 63 74 2d 41 20 2a 2f 0a 20 20 69 6e 74 20  lect-A */.  int 
1bb40 72 65 67 50 72 65 76 3b 20 20 20 20 20 20 20 20  regPrev;        
1bb50 20 20 2f 2a 20 41 20 72 61 6e 67 65 20 6f 66 20    /* A range of 
1bb60 72 65 67 69 73 74 65 72 73 20 74 6f 20 68 6f 6c  registers to hol
1bb70 64 20 70 72 65 76 69 6f 75 73 20 6f 75 74 70 75  d previous outpu
1bb80 74 20 2a 2f 0a 20 20 69 6e 74 20 73 61 76 65 64  t */.  int saved
1bb90 4c 69 6d 69 74 3b 20 20 20 20 20 20 20 2f 2a 20  Limit;       /* 
1bba0 53 61 76 65 64 20 76 61 6c 75 65 20 6f 66 20 70  Saved value of p
1bbb0 2d 3e 69 4c 69 6d 69 74 20 2a 2f 0a 20 20 69 6e  ->iLimit */.  in
1bbc0 74 20 73 61 76 65 64 4f 66 66 73 65 74 3b 20 20  t savedOffset;  
1bbd0 20 20 20 20 2f 2a 20 53 61 76 65 64 20 76 61 6c      /* Saved val
1bbe0 75 65 20 6f 66 20 70 2d 3e 69 4f 66 66 73 65 74  ue of p->iOffset
1bbf0 20 2a 2f 0a 20 20 69 6e 74 20 6c 61 62 65 6c 43   */.  int labelC
1bc00 6d 70 72 3b 20 20 20 20 20 20 20 20 2f 2a 20 4c  mpr;        /* L
1bc10 61 62 65 6c 20 66 6f 72 20 74 68 65 20 73 74 61  abel for the sta
1bc20 72 74 20 6f 66 20 74 68 65 20 6d 65 72 67 65 20  rt of the merge 
1bc30 61 6c 67 6f 72 69 74 68 6d 20 2a 2f 0a 20 20 69  algorithm */.  i
1bc40 6e 74 20 6c 61 62 65 6c 45 6e 64 3b 20 20 20 20  nt labelEnd;    
1bc50 20 20 20 20 20 2f 2a 20 4c 61 62 65 6c 20 66 6f       /* Label fo
1bc60 72 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  r the end of the
1bc70 20 6f 76 65 72 61 6c 6c 20 53 45 4c 45 43 54 20   overall SELECT 
1bc80 73 74 6d 74 20 2a 2f 0a 20 20 69 6e 74 20 61 64  stmt */.  int ad
1bc90 64 72 31 3b 20 20 20 20 20 20 20 20 20 20 20 20  dr1;            
1bca0 2f 2a 20 4a 75 6d 70 20 69 6e 73 74 72 75 63 74  /* Jump instruct
1bcb0 69 6f 6e 73 20 74 68 61 74 20 67 65 74 20 72 65  ions that get re
1bcc0 74 61 72 67 65 74 74 65 64 20 2a 2f 0a 20 20 69  targetted */.  i
1bcd0 6e 74 20 6f 70 3b 20 20 20 20 20 20 20 20 20 20  nt op;          
1bce0 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 54       /* One of T
1bcf0 4b 5f 41 4c 4c 2c 20 54 4b 5f 55 4e 49 4f 4e 2c  K_ALL, TK_UNION,
1bd00 20 54 4b 5f 45 58 43 45 50 54 2c 20 54 4b 5f 49   TK_EXCEPT, TK_I
1bd10 4e 54 45 52 53 45 43 54 20 2a 2f 0a 20 20 4b 65  NTERSECT */.  Ke
1bd20 79 49 6e 66 6f 20 2a 70 4b 65 79 44 75 70 20 3d  yInfo *pKeyDup =
1bd30 20 30 3b 20 2f 2a 20 43 6f 6d 70 61 72 69 73 6f   0; /* Compariso
1bd40 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f  n information fo
1bd50 72 20 64 75 70 6c 69 63 61 74 65 20 72 65 6d 6f  r duplicate remo
1bd60 76 61 6c 20 2a 2f 0a 20 20 4b 65 79 49 6e 66 6f  val */.  KeyInfo
1bd70 20 2a 70 4b 65 79 4d 65 72 67 65 3b 20 20 20 2f   *pKeyMerge;   /
1bd80 2a 20 43 6f 6d 70 61 72 69 73 6f 6e 20 69 6e 66  * Comparison inf
1bd90 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20 6d 65 72  ormation for mer
1bda0 67 69 6e 67 20 72 6f 77 73 20 2a 2f 0a 20 20 73  ging rows */.  s
1bdb0 71 6c 69 74 65 33 20 2a 64 62 3b 20 20 20 20 20  qlite3 *db;     
1bdc0 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
1bdd0 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20   connection */. 
1bde0 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65   ExprList *pOrde
1bdf0 72 42 79 3b 20 20 20 2f 2a 20 54 68 65 20 4f 52  rBy;   /* The OR
1be00 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f  DER BY clause */
1be10 0a 20 20 69 6e 74 20 6e 4f 72 64 65 72 42 79 3b  .  int nOrderBy;
1be20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
1be30 65 72 20 6f 66 20 74 65 72 6d 73 20 69 6e 20 74  er of terms in t
1be40 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
1be50 73 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 61 50 65  se */.  int *aPe
1be60 72 6d 75 74 65 3b 20 20 20 20 20 20 20 20 2f 2a  rmute;        /*
1be70 20 4d 61 70 70 69 6e 67 20 66 72 6f 6d 20 4f 52   Mapping from OR
1be80 44 45 52 20 42 59 20 74 65 72 6d 73 20 74 6f 20  DER BY terms to 
1be90 72 65 73 75 6c 74 20 73 65 74 20 63 6f 6c 75 6d  result set colum
1bea0 6e 73 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  ns */..  assert(
1beb0 20 70 2d 3e 70 4f 72 64 65 72 42 79 21 3d 30 20   p->pOrderBy!=0 
1bec0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4b 65  );.  assert( pKe
1bed0 79 44 75 70 3d 3d 30 20 29 3b 20 2f 2a 20 22 4d  yDup==0 ); /* "M
1bee0 61 6e 61 67 65 64 22 20 63 6f 64 65 20 6e 65 65  anaged" code nee
1bef0 64 73 20 74 68 69 73 2e 20 20 54 69 63 6b 65 74  ds this.  Ticket
1bf00 20 23 33 33 38 32 2e 20 2a 2f 0a 20 20 64 62 20   #3382. */.  db 
1bf10 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
1bf20 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
1bf30 65 3b 0a 20 20 61 73 73 65 72 74 28 20 76 21 3d  e;.  assert( v!=
1bf40 30 20 29 3b 20 20 20 20 20 20 20 2f 2a 20 41 6c  0 );       /* Al
1bf50 72 65 61 64 79 20 74 68 72 6f 77 6e 20 74 68 65  ready thrown the
1bf60 20 65 72 72 6f 72 20 69 66 20 56 44 42 45 20 61   error if VDBE a
1bf70 6c 6c 6f 63 20 66 61 69 6c 65 64 20 2a 2f 0a 20  lloc failed */. 
1bf80 20 6c 61 62 65 6c 45 6e 64 20 3d 20 73 71 6c 69   labelEnd = sqli
1bf90 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
1bfa0 28 70 50 61 72 73 65 29 3b 0a 20 20 6c 61 62 65  (pParse);.  labe
1bfb0 6c 43 6d 70 72 20 3d 20 73 71 6c 69 74 65 33 56  lCmpr = sqlite3V
1bfc0 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 70 50 61  dbeMakeLabel(pPa
1bfd0 72 73 65 29 3b 0a 0a 0a 20 20 2f 2a 20 50 61 74  rse);...  /* Pat
1bfe0 63 68 20 75 70 20 74 68 65 20 4f 52 44 45 52 20  ch up the ORDER 
1bff0 42 59 20 63 6c 61 75 73 65 0a 20 20 2a 2f 0a 20  BY clause.  */. 
1c000 20 6f 70 20 3d 20 70 2d 3e 6f 70 3b 20 20 0a 20   op = p->op;  . 
1c010 20 70 50 72 69 6f 72 20 3d 20 70 2d 3e 70 50 72   pPrior = p->pPr
1c020 69 6f 72 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ior;.  assert( p
1c030 50 72 69 6f 72 2d 3e 70 4f 72 64 65 72 42 79 3d  Prior->pOrderBy=
1c040 3d 30 20 29 3b 0a 20 20 70 4f 72 64 65 72 42 79  =0 );.  pOrderBy
1c050 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a   = p->pOrderBy;.
1c060 20 20 61 73 73 65 72 74 28 20 70 4f 72 64 65 72    assert( pOrder
1c070 42 79 20 29 3b 0a 20 20 6e 4f 72 64 65 72 42 79  By );.  nOrderBy
1c080 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78   = pOrderBy->nEx
1c090 70 72 3b 0a 0a 20 20 2f 2a 20 46 6f 72 20 6f 70  pr;..  /* For op
1c0a0 65 72 61 74 6f 72 73 20 6f 74 68 65 72 20 74 68  erators other th
1c0b0 61 6e 20 55 4e 49 4f 4e 20 41 4c 4c 20 77 65 20  an UNION ALL we 
1c0c0 68 61 76 65 20 74 6f 20 6d 61 6b 65 20 73 75 72  have to make sur
1c0d0 65 20 74 68 61 74 0a 20 20 2a 2a 20 74 68 65 20  e that.  ** the 
1c0e0 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
1c0f0 63 6f 76 65 72 73 20 65 76 65 72 79 20 74 65 72  covers every ter
1c100 6d 20 6f 66 20 74 68 65 20 72 65 73 75 6c 74 20  m of the result 
1c110 73 65 74 2e 20 20 41 64 64 0a 20 20 2a 2a 20 74  set.  Add.  ** t
1c120 65 72 6d 73 20 74 6f 20 74 68 65 20 4f 52 44 45  erms to the ORDE
1c130 52 20 42 59 20 63 6c 61 75 73 65 20 61 73 20 6e  R BY clause as n
1c140 65 63 65 73 73 61 72 79 2e 0a 20 20 2a 2f 0a 20  ecessary..  */. 
1c150 20 69 66 28 20 6f 70 21 3d 54 4b 5f 41 4c 4c 20   if( op!=TK_ALL 
1c160 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 31 3b 20  ){.    for(i=1; 
1c170 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
1c180 3d 3d 30 20 26 26 20 69 3c 3d 70 2d 3e 70 45 4c  ==0 && i<=p->pEL
1c190 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29  ist->nExpr; i++)
1c1a0 7b 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 45  {.      struct E
1c1b0 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  xprList_item *pI
1c1c0 74 65 6d 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a  tem;.      for(j
1c1d0 3d 30 2c 20 70 49 74 65 6d 3d 70 4f 72 64 65 72  =0, pItem=pOrder
1c1e0 42 79 2d 3e 61 3b 20 6a 3c 6e 4f 72 64 65 72 42  By->a; j<nOrderB
1c1f0 79 3b 20 6a 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29  y; j++, pItem++)
1c200 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
1c210 28 20 70 49 74 65 6d 2d 3e 75 2e 78 2e 69 4f 72  ( pItem->u.x.iOr
1c220 64 65 72 42 79 43 6f 6c 3e 30 20 29 3b 0a 20 20  derByCol>0 );.  
1c230 20 20 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d        if( pItem-
1c240 3e 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c  >u.x.iOrderByCol
1c250 3d 3d 69 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ==i ) break;.   
1c260 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6a     }.      if( j
1c270 3d 3d 6e 4f 72 64 65 72 42 79 20 29 7b 0a 20 20  ==nOrderBy ){.  
1c280 20 20 20 20 20 20 45 78 70 72 20 2a 70 4e 65 77        Expr *pNew
1c290 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28 64   = sqlite3Expr(d
1c2a0 62 2c 20 54 4b 5f 49 4e 54 45 47 45 52 2c 20 30  b, TK_INTEGER, 0
1c2b0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
1c2c0 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  New==0 ) return 
1c2d0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50  SQLITE_NOMEM_BKP
1c2e0 54 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d  T;.        pNew-
1c2f0 3e 66 6c 61 67 73 20 7c 3d 20 45 50 5f 49 6e 74  >flags |= EP_Int
1c300 56 61 6c 75 65 3b 0a 20 20 20 20 20 20 20 20 70  Value;.        p
1c310 4e 65 77 2d 3e 75 2e 69 56 61 6c 75 65 20 3d 20  New->u.iValue = 
1c320 69 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 70 4f  i;.        p->pO
1c330 72 64 65 72 42 79 20 3d 20 70 4f 72 64 65 72 42  rderBy = pOrderB
1c340 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c  y = sqlite3ExprL
1c350 69 73 74 41 70 70 65 6e 64 28 70 50 61 72 73 65  istAppend(pParse
1c360 2c 20 70 4f 72 64 65 72 42 79 2c 20 70 4e 65 77  , pOrderBy, pNew
1c370 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
1c380 4f 72 64 65 72 42 79 20 29 20 70 4f 72 64 65 72  OrderBy ) pOrder
1c390 42 79 2d 3e 61 5b 6e 4f 72 64 65 72 42 79 2b 2b  By->a[nOrderBy++
1c3a0 5d 2e 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f  ].u.x.iOrderByCo
1c3b0 6c 20 3d 20 28 75 31 36 29 69 3b 0a 20 20 20 20  l = (u16)i;.    
1c3c0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
1c3d0 20 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20   /* Compute the 
1c3e0 63 6f 6d 70 61 72 69 73 6f 6e 20 70 65 72 6d 75  comparison permu
1c3f0 74 61 74 69 6f 6e 20 61 6e 64 20 6b 65 79 69 6e  tation and keyin
1c400 66 6f 20 74 68 61 74 20 69 73 20 75 73 65 64 20  fo that is used 
1c410 77 69 74 68 0a 20 20 2a 2a 20 74 68 65 20 70 65  with.  ** the pe
1c420 72 6d 75 74 61 74 69 6f 6e 20 75 73 65 64 20 74  rmutation used t
1c430 6f 20 64 65 74 65 72 6d 69 6e 65 20 69 66 20 74  o determine if t
1c440 68 65 20 6e 65 78 74 0a 20 20 2a 2a 20 72 6f 77  he next.  ** row
1c450 20 6f 66 20 72 65 73 75 6c 74 73 20 63 6f 6d 65   of results come
1c460 73 20 66 72 6f 6d 20 73 65 6c 65 63 74 41 20 6f  s from selectA o
1c470 72 20 73 65 6c 65 63 74 42 2e 20 20 41 6c 73 6f  r selectB.  Also
1c480 20 61 64 64 20 65 78 70 6c 69 63 69 74 0a 20 20   add explicit.  
1c490 2a 2a 20 63 6f 6c 6c 61 74 69 6f 6e 73 20 74 6f  ** collations to
1c4a0 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   the ORDER BY cl
1c4b0 61 75 73 65 20 74 65 72 6d 73 20 73 6f 20 74 68  ause terms so th
1c4c0 61 74 20 77 68 65 6e 20 74 68 65 20 73 75 62 71  at when the subq
1c4d0 75 65 72 69 65 73 0a 20 20 2a 2a 20 74 6f 20 74  ueries.  ** to t
1c4e0 68 65 20 72 69 67 68 74 20 61 6e 64 20 74 68 65  he right and the
1c4f0 20 6c 65 66 74 20 61 72 65 20 65 76 61 6c 75 61   left are evalua
1c500 74 65 64 2c 20 74 68 65 79 20 75 73 65 20 74 68  ted, they use th
1c510 65 20 63 6f 72 72 65 63 74 0a 20 20 2a 2a 20 63  e correct.  ** c
1c520 6f 6c 6c 61 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20  ollation..  */. 
1c530 20 61 50 65 72 6d 75 74 65 20 3d 20 73 71 6c 69   aPermute = sqli
1c540 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e  te3DbMallocRawNN
1c550 28 64 62 2c 20 73 69 7a 65 6f 66 28 69 6e 74 29  (db, sizeof(int)
1c560 2a 28 6e 4f 72 64 65 72 42 79 20 2b 20 31 29 29  *(nOrderBy + 1))
1c570 3b 0a 20 20 69 66 28 20 61 50 65 72 6d 75 74 65  ;.  if( aPermute
1c580 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 45   ){.    struct E
1c590 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  xprList_item *pI
1c5a0 74 65 6d 3b 0a 20 20 20 20 61 50 65 72 6d 75 74  tem;.    aPermut
1c5b0 65 5b 30 5d 20 3d 20 6e 4f 72 64 65 72 42 79 3b  e[0] = nOrderBy;
1c5c0 0a 20 20 20 20 66 6f 72 28 69 3d 31 2c 20 70 49  .    for(i=1, pI
1c5d0 74 65 6d 3d 70 4f 72 64 65 72 42 79 2d 3e 61 3b  tem=pOrderBy->a;
1c5e0 20 69 3c 3d 6e 4f 72 64 65 72 42 79 3b 20 69 2b   i<=nOrderBy; i+
1c5f0 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20  +, pItem++){.   
1c600 20 20 20 61 73 73 65 72 74 28 20 70 49 74 65 6d     assert( pItem
1c610 2d 3e 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f  ->u.x.iOrderByCo
1c620 6c 3e 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73  l>0 );.      ass
1c630 65 72 74 28 20 70 49 74 65 6d 2d 3e 75 2e 78 2e  ert( pItem->u.x.
1c640 69 4f 72 64 65 72 42 79 43 6f 6c 3c 3d 70 2d 3e  iOrderByCol<=p->
1c650 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 3b  pEList->nExpr );
1c660 0a 20 20 20 20 20 20 61 50 65 72 6d 75 74 65 5b  .      aPermute[
1c670 69 5d 20 3d 20 70 49 74 65 6d 2d 3e 75 2e 78 2e  i] = pItem->u.x.
1c680 69 4f 72 64 65 72 42 79 43 6f 6c 20 2d 20 31 3b  iOrderByCol - 1;
1c690 0a 20 20 20 20 7d 0a 20 20 20 20 70 4b 65 79 4d  .    }.    pKeyM
1c6a0 65 72 67 65 20 3d 20 6d 75 6c 74 69 53 65 6c 65  erge = multiSele
1c6b0 63 74 4f 72 64 65 72 42 79 4b 65 79 49 6e 66 6f  ctOrderByKeyInfo
1c6c0 28 70 50 61 72 73 65 2c 20 70 2c 20 31 29 3b 0a  (pParse, p, 1);.
1c6d0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 4b 65    }else{.    pKe
1c6e0 79 4d 65 72 67 65 20 3d 20 30 3b 0a 20 20 7d 0a  yMerge = 0;.  }.
1c6f0 0a 20 20 2f 2a 20 52 65 61 74 74 61 63 68 20 74  .  /* Reattach t
1c700 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
1c710 73 65 20 74 6f 20 74 68 65 20 71 75 65 72 79 2e  se to the query.
1c720 0a 20 20 2a 2f 0a 20 20 70 2d 3e 70 4f 72 64 65  .  */.  p->pOrde
1c730 72 42 79 20 3d 20 70 4f 72 64 65 72 42 79 3b 0a  rBy = pOrderBy;.
1c740 20 20 70 50 72 69 6f 72 2d 3e 70 4f 72 64 65 72    pPrior->pOrder
1c750 42 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  By = sqlite3Expr
1c760 4c 69 73 74 44 75 70 28 70 50 61 72 73 65 2d 3e  ListDup(pParse->
1c770 64 62 2c 20 70 4f 72 64 65 72 42 79 2c 20 30 29  db, pOrderBy, 0)
1c780 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65  ;..  /* Allocate
1c790 20 61 20 72 61 6e 67 65 20 6f 66 20 74 65 6d 70   a range of temp
1c7a0 6f 72 61 72 79 20 72 65 67 69 73 74 65 72 73 20  orary registers 
1c7b0 61 6e 64 20 74 68 65 20 4b 65 79 49 6e 66 6f 20  and the KeyInfo 
1c7c0 6e 65 65 64 65 64 0a 20 20 2a 2a 20 66 6f 72 20  needed.  ** for 
1c7d0 74 68 65 20 6c 6f 67 69 63 20 74 68 61 74 20 72  the logic that r
1c7e0 65 6d 6f 76 65 73 20 64 75 70 6c 69 63 61 74 65  emoves duplicate
1c7f0 20 72 65 73 75 6c 74 20 72 6f 77 73 20 77 68 65   result rows whe
1c800 6e 20 74 68 65 0a 20 20 2a 2a 20 6f 70 65 72 61  n the.  ** opera
1c810 74 6f 72 20 69 73 20 55 4e 49 4f 4e 2c 20 45 58  tor is UNION, EX
1c820 43 45 50 54 2c 20 6f 72 20 49 4e 54 45 52 53 45  CEPT, or INTERSE
1c830 43 54 20 28 62 75 74 20 6e 6f 74 20 55 4e 49 4f  CT (but not UNIO
1c840 4e 20 41 4c 4c 29 2e 0a 20 20 2a 2f 0a 20 20 69  N ALL)..  */.  i
1c850 66 28 20 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 29 7b  f( op==TK_ALL ){
1c860 0a 20 20 20 20 72 65 67 50 72 65 76 20 3d 20 30  .    regPrev = 0
1c870 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
1c880 6e 74 20 6e 45 78 70 72 20 3d 20 70 2d 3e 70 45  nt nExpr = p->pE
1c890 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 20  List->nExpr;.   
1c8a0 20 61 73 73 65 72 74 28 20 6e 4f 72 64 65 72 42   assert( nOrderB
1c8b0 79 3e 3d 6e 45 78 70 72 20 7c 7c 20 64 62 2d 3e  y>=nExpr || db->
1c8c0 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a  mallocFailed );.
1c8d0 20 20 20 20 72 65 67 50 72 65 76 20 3d 20 70 50      regPrev = pP
1c8e0 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20  arse->nMem+1;.  
1c8f0 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b    pParse->nMem +
1c900 3d 20 6e 45 78 70 72 2b 31 3b 0a 20 20 20 20 73  = nExpr+1;.    s
1c910 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
1c920 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
1c930 30 2c 20 72 65 67 50 72 65 76 29 3b 0a 20 20 20  0, regPrev);.   
1c940 20 70 4b 65 79 44 75 70 20 3d 20 73 71 6c 69 74   pKeyDup = sqlit
1c950 65 33 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63 28 64  e3KeyInfoAlloc(d
1c960 62 2c 20 6e 45 78 70 72 2c 20 31 29 3b 0a 20 20  b, nExpr, 1);.  
1c970 20 20 69 66 28 20 70 4b 65 79 44 75 70 20 29 7b    if( pKeyDup ){
1c980 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73  .      assert( s
1c990 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 49 73 57  qlite3KeyInfoIsW
1c9a0 72 69 74 65 61 62 6c 65 28 70 4b 65 79 44 75 70  riteable(pKeyDup
1c9b0 29 20 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  ) );.      for(i
1c9c0 3d 30 3b 20 69 3c 6e 45 78 70 72 3b 20 69 2b 2b  =0; i<nExpr; i++
1c9d0 29 7b 0a 20 20 20 20 20 20 20 20 70 4b 65 79 44  ){.        pKeyD
1c9e0 75 70 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 3d 20 6d  up->aColl[i] = m
1c9f0 75 6c 74 69 53 65 6c 65 63 74 43 6f 6c 6c 53 65  ultiSelectCollSe
1ca00 71 28 70 50 61 72 73 65 2c 20 70 2c 20 69 29 3b  q(pParse, p, i);
1ca10 0a 20 20 20 20 20 20 20 20 70 4b 65 79 44 75 70  .        pKeyDup
1ca20 2d 3e 61 53 6f 72 74 46 6c 61 67 73 5b 69 5d 20  ->aSortFlags[i] 
1ca30 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 0;.      }.   
1ca40 20 7d 0a 20 20 7d 0a 20 0a 20 20 2f 2a 20 53 65   }.  }. .  /* Se
1ca50 70 61 72 61 74 65 20 74 68 65 20 6c 65 66 74 20  parate the left 
1ca60 61 6e 64 20 74 68 65 20 72 69 67 68 74 20 71 75  and the right qu
1ca70 65 72 79 20 66 72 6f 6d 20 6f 6e 65 20 61 6e 6f  ery from one ano
1ca80 74 68 65 72 0a 20 20 2a 2f 0a 20 20 70 2d 3e 70  ther.  */.  p->p
1ca90 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 70 50 72  Prior = 0;.  pPr
1caa0 69 6f 72 2d 3e 70 4e 65 78 74 20 3d 20 30 3b 0a  ior->pNext = 0;.
1cab0 20 20 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65    sqlite3Resolve
1cac0 4f 72 64 65 72 47 72 6f 75 70 42 79 28 70 50 61  OrderGroupBy(pPa
1cad0 72 73 65 2c 20 70 2c 20 70 2d 3e 70 4f 72 64 65  rse, p, p->pOrde
1cae0 72 42 79 2c 20 22 4f 52 44 45 52 22 29 3b 0a 20  rBy, "ORDER");. 
1caf0 20 69 66 28 20 70 50 72 69 6f 72 2d 3e 70 50 72   if( pPrior->pPr
1cb00 69 6f 72 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71  ior==0 ){.    sq
1cb10 6c 69 74 65 33 52 65 73 6f 6c 76 65 4f 72 64 65  lite3ResolveOrde
1cb20 72 47 72 6f 75 70 42 79 28 70 50 61 72 73 65 2c  rGroupBy(pParse,
1cb30 20 70 50 72 69 6f 72 2c 20 70 50 72 69 6f 72 2d   pPrior, pPrior-
1cb40 3e 70 4f 72 64 65 72 42 79 2c 20 22 4f 52 44 45  >pOrderBy, "ORDE
1cb50 52 22 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43  R");.  }..  /* C
1cb60 6f 6d 70 75 74 65 20 74 68 65 20 6c 69 6d 69 74  ompute the limit
1cb70 20 72 65 67 69 73 74 65 72 73 20 2a 2f 0a 20 20   registers */.  
1cb80 63 6f 6d 70 75 74 65 4c 69 6d 69 74 52 65 67 69  computeLimitRegi
1cb90 73 74 65 72 73 28 70 50 61 72 73 65 2c 20 70 2c  sters(pParse, p,
1cba0 20 6c 61 62 65 6c 45 6e 64 29 3b 0a 20 20 69 66   labelEnd);.  if
1cbb0 28 20 70 2d 3e 69 4c 69 6d 69 74 20 26 26 20 6f  ( p->iLimit && o
1cbc0 70 3d 3d 54 4b 5f 41 4c 4c 20 29 7b 0a 20 20 20  p==TK_ALL ){.   
1cbd0 20 72 65 67 4c 69 6d 69 74 41 20 3d 20 2b 2b 70   regLimitA = ++p
1cbe0 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  Parse->nMem;.   
1cbf0 20 72 65 67 4c 69 6d 69 74 42 20 3d 20 2b 2b 70   regLimitB = ++p
1cc00 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  Parse->nMem;.   
1cc10 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1cc20 70 32 28 76 2c 20 4f 50 5f 43 6f 70 79 2c 20 70  p2(v, OP_Copy, p
1cc30 2d 3e 69 4f 66 66 73 65 74 20 3f 20 70 2d 3e 69  ->iOffset ? p->i
1cc40 4f 66 66 73 65 74 2b 31 20 3a 20 70 2d 3e 69 4c  Offset+1 : p->iL
1cc50 69 6d 69 74 2c 0a 20 20 20 20 20 20 20 20 20 20  imit,.          
1cc60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cc70 20 20 20 20 20 20 20 20 72 65 67 4c 69 6d 69 74          regLimit
1cc80 41 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  A);.    sqlite3V
1cc90 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
1cca0 43 6f 70 79 2c 20 72 65 67 4c 69 6d 69 74 41 2c  Copy, regLimitA,
1ccb0 20 72 65 67 4c 69 6d 69 74 42 29 3b 0a 20 20 7d   regLimitB);.  }
1ccc0 65 6c 73 65 7b 0a 20 20 20 20 72 65 67 4c 69 6d  else{.    regLim
1ccd0 69 74 41 20 3d 20 72 65 67 4c 69 6d 69 74 42 20  itA = regLimitB 
1cce0 3d 20 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  = 0;.  }.  sqlit
1ccf0 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c  e3ExprDelete(db,
1cd00 20 70 2d 3e 70 4c 69 6d 69 74 29 3b 0a 20 20 70   p->pLimit);.  p
1cd10 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 0a 20  ->pLimit = 0;.. 
1cd20 20 72 65 67 41 64 64 72 41 20 3d 20 2b 2b 70 50   regAddrA = ++pP
1cd30 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 72 65  arse->nMem;.  re
1cd40 67 41 64 64 72 42 20 3d 20 2b 2b 70 50 61 72 73  gAddrB = ++pPars
1cd50 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 72 65 67 4f 75  e->nMem;.  regOu
1cd60 74 41 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  tA = ++pParse->n
1cd70 4d 65 6d 3b 0a 20 20 72 65 67 4f 75 74 42 20 3d  Mem;.  regOutB =
1cd80 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
1cd90 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  .  sqlite3Select
1cda0 44 65 73 74 49 6e 69 74 28 26 64 65 73 74 41 2c  DestInit(&destA,
1cdb0 20 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 2c 20   SRT_Coroutine, 
1cdc0 72 65 67 41 64 64 72 41 29 3b 0a 20 20 73 71 6c  regAddrA);.  sql
1cdd0 69 74 65 33 53 65 6c 65 63 74 44 65 73 74 49 6e  ite3SelectDestIn
1cde0 69 74 28 26 64 65 73 74 42 2c 20 53 52 54 5f 43  it(&destB, SRT_C
1cdf0 6f 72 6f 75 74 69 6e 65 2c 20 72 65 67 41 64 64  oroutine, regAdd
1ce00 72 42 29 3b 0a 0a 20 20 45 78 70 6c 61 69 6e 51  rB);..  ExplainQ
1ce10 75 65 72 79 50 6c 61 6e 28 28 70 50 61 72 73 65  ueryPlan((pParse
1ce20 2c 20 31 2c 20 22 4d 45 52 47 45 20 28 25 73 29  , 1, "MERGE (%s)
1ce30 22 2c 20 73 65 6c 65 63 74 4f 70 4e 61 6d 65 28  ", selectOpName(
1ce40 70 2d 3e 6f 70 29 29 29 3b 0a 0a 20 20 2f 2a 20  p->op)));..  /* 
1ce50 47 65 6e 65 72 61 74 65 20 61 20 63 6f 72 6f 75  Generate a corou
1ce60 74 69 6e 65 20 74 6f 20 65 76 61 6c 75 61 74 65  tine to evaluate
1ce70 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74   the SELECT stat
1ce80 65 6d 65 6e 74 20 74 6f 20 74 68 65 0a 20 20 2a  ement to the.  *
1ce90 2a 20 6c 65 66 74 20 6f 66 20 74 68 65 20 63 6f  * left of the co
1cea0 6d 70 6f 75 6e 64 20 6f 70 65 72 61 74 6f 72 20  mpound operator 
1ceb0 2d 20 74 68 65 20 22 41 22 20 73 65 6c 65 63 74  - the "A" select
1cec0 2e 0a 20 20 2a 2f 0a 20 20 61 64 64 72 53 65 6c  ..  */.  addrSel
1ced0 65 63 74 41 20 3d 20 73 71 6c 69 74 65 33 56 64  ectA = sqlite3Vd
1cee0 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
1cef0 20 2b 20 31 3b 0a 20 20 61 64 64 72 31 20 3d 20   + 1;.  addr1 = 
1cf00 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1cf10 33 28 76 2c 20 4f 50 5f 49 6e 69 74 43 6f 72 6f  3(v, OP_InitCoro
1cf20 75 74 69 6e 65 2c 20 72 65 67 41 64 64 72 41 2c  utine, regAddrA,
1cf30 20 30 2c 20 61 64 64 72 53 65 6c 65 63 74 41 29   0, addrSelectA)
1cf40 3b 0a 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28  ;.  VdbeComment(
1cf50 28 76 2c 20 22 6c 65 66 74 20 53 45 4c 45 43 54  (v, "left SELECT
1cf60 22 29 29 3b 0a 20 20 70 50 72 69 6f 72 2d 3e 69  "));.  pPrior->i
1cf70 4c 69 6d 69 74 20 3d 20 72 65 67 4c 69 6d 69 74  Limit = regLimit
1cf80 41 3b 0a 20 20 45 78 70 6c 61 69 6e 51 75 65 72  A;.  ExplainQuer
1cf90 79 50 6c 61 6e 28 28 70 50 61 72 73 65 2c 20 31  yPlan((pParse, 1
1cfa0 2c 20 22 4c 45 46 54 22 29 29 3b 0a 20 20 73 71  , "LEFT"));.  sq
1cfb0 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72  lite3Select(pPar
1cfc0 73 65 2c 20 70 50 72 69 6f 72 2c 20 26 64 65 73  se, pPrior, &des
1cfd0 74 41 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  tA);.  sqlite3Vd
1cfe0 62 65 45 6e 64 43 6f 72 6f 75 74 69 6e 65 28 76  beEndCoroutine(v
1cff0 2c 20 72 65 67 41 64 64 72 41 29 3b 0a 20 20 73  , regAddrA);.  s
1d000 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
1d010 72 65 28 76 2c 20 61 64 64 72 31 29 3b 0a 0a 20  re(v, addr1);.. 
1d020 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20 63   /* Generate a c
1d030 6f 72 6f 75 74 69 6e 65 20 74 6f 20 65 76 61 6c  oroutine to eval
1d040 75 61 74 65 20 74 68 65 20 53 45 4c 45 43 54 20  uate the SELECT 
1d050 73 74 61 74 65 6d 65 6e 74 20 6f 6e 20 0a 20 20  statement on .  
1d060 2a 2a 20 74 68 65 20 72 69 67 68 74 20 2d 20 74  ** the right - t
1d070 68 65 20 22 42 22 20 73 65 6c 65 63 74 0a 20 20  he "B" select.  
1d080 2a 2f 0a 20 20 61 64 64 72 53 65 6c 65 63 74 42  */.  addrSelectB
1d090 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75   = sqlite3VdbeCu
1d0a0 72 72 65 6e 74 41 64 64 72 28 76 29 20 2b 20 31  rrentAddr(v) + 1
1d0b0 3b 0a 20 20 61 64 64 72 31 20 3d 20 73 71 6c 69  ;.  addr1 = sqli
1d0c0 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
1d0d0 20 4f 50 5f 49 6e 69 74 43 6f 72 6f 75 74 69 6e   OP_InitCoroutin
1d0e0 65 2c 20 72 65 67 41 64 64 72 42 2c 20 30 2c 20  e, regAddrB, 0, 
1d0f0 61 64 64 72 53 65 6c 65 63 74 42 29 3b 0a 20 20  addrSelectB);.  
1d100 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
1d110 22 72 69 67 68 74 20 53 45 4c 45 43 54 22 29 29  "right SELECT"))
1d120 3b 0a 20 20 73 61 76 65 64 4c 69 6d 69 74 20 3d  ;.  savedLimit =
1d130 20 70 2d 3e 69 4c 69 6d 69 74 3b 0a 20 20 73 61   p->iLimit;.  sa
1d140 76 65 64 4f 66 66 73 65 74 20 3d 20 70 2d 3e 69  vedOffset = p->i
1d150 4f 66 66 73 65 74 3b 0a 20 20 70 2d 3e 69 4c 69  Offset;.  p->iLi
1d160 6d 69 74 20 3d 20 72 65 67 4c 69 6d 69 74 42 3b  mit = regLimitB;
1d170 0a 20 20 70 2d 3e 69 4f 66 66 73 65 74 20 3d 20  .  p->iOffset = 
1d180 30 3b 20 20 0a 20 20 45 78 70 6c 61 69 6e 51 75  0;  .  ExplainQu
1d190 65 72 79 50 6c 61 6e 28 28 70 50 61 72 73 65 2c  eryPlan((pParse,
1d1a0 20 31 2c 20 22 52 49 47 48 54 22 29 29 3b 0a 20   1, "RIGHT"));. 
1d1b0 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70   sqlite3Select(p
1d1c0 50 61 72 73 65 2c 20 70 2c 20 26 64 65 73 74 42  Parse, p, &destB
1d1d0 29 3b 0a 20 20 70 2d 3e 69 4c 69 6d 69 74 20 3d  );.  p->iLimit =
1d1e0 20 73 61 76 65 64 4c 69 6d 69 74 3b 0a 20 20 70   savedLimit;.  p
1d1f0 2d 3e 69 4f 66 66 73 65 74 20 3d 20 73 61 76 65  ->iOffset = save
1d200 64 4f 66 66 73 65 74 3b 0a 20 20 73 71 6c 69 74  dOffset;.  sqlit
1d210 65 33 56 64 62 65 45 6e 64 43 6f 72 6f 75 74 69  e3VdbeEndCorouti
1d220 6e 65 28 76 2c 20 72 65 67 41 64 64 72 42 29 3b  ne(v, regAddrB);
1d230 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20  ..  /* Generate 
1d240 61 20 73 75 62 72 6f 75 74 69 6e 65 20 74 68 61  a subroutine tha
1d250 74 20 6f 75 74 70 75 74 73 20 74 68 65 20 63 75  t outputs the cu
1d260 72 72 65 6e 74 20 72 6f 77 20 6f 66 20 74 68 65  rrent row of the
1d270 20 41 0a 20 20 2a 2a 20 73 65 6c 65 63 74 20 61   A.  ** select a
1d280 73 20 74 68 65 20 6e 65 78 74 20 6f 75 74 70 75  s the next outpu
1d290 74 20 72 6f 77 20 6f 66 20 74 68 65 20 63 6f 6d  t row of the com
1d2a0 70 6f 75 6e 64 20 73 65 6c 65 63 74 2e 0a 20 20  pound select..  
1d2b0 2a 2f 0a 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d  */.  VdbeNoopCom
1d2c0 6d 65 6e 74 28 28 76 2c 20 22 4f 75 74 70 75 74  ment((v, "Output
1d2d0 20 72 6f 75 74 69 6e 65 20 66 6f 72 20 41 22 29   routine for A")
1d2e0 29 3b 0a 20 20 61 64 64 72 4f 75 74 41 20 3d 20  );.  addrOutA = 
1d2f0 67 65 6e 65 72 61 74 65 4f 75 74 70 75 74 53 75  generateOutputSu
1d300 62 72 6f 75 74 69 6e 65 28 70 50 61 72 73 65 2c  broutine(pParse,
1d310 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1d320 20 20 70 2c 20 26 64 65 73 74 41 2c 20 70 44 65    p, &destA, pDe
1d330 73 74 2c 20 72 65 67 4f 75 74 41 2c 0a 20 20 20  st, regOutA,.   
1d340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65                re
1d350 67 50 72 65 76 2c 20 70 4b 65 79 44 75 70 2c 20  gPrev, pKeyDup, 
1d360 6c 61 62 65 6c 45 6e 64 29 3b 0a 20 20 0a 20 20  labelEnd);.  .  
1d370 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20 73 75  /* Generate a su
1d380 62 72 6f 75 74 69 6e 65 20 74 68 61 74 20 6f 75  broutine that ou
1d390 74 70 75 74 73 20 74 68 65 20 63 75 72 72 65 6e  tputs the curren
1d3a0 74 20 72 6f 77 20 6f 66 20 74 68 65 20 42 0a 20  t row of the B. 
1d3b0 20 2a 2a 20 73 65 6c 65 63 74 20 61 73 20 74 68   ** select as th
1d3c0 65 20 6e 65 78 74 20 6f 75 74 70 75 74 20 72 6f  e next output ro
1d3d0 77 20 6f 66 20 74 68 65 20 63 6f 6d 70 6f 75 6e  w of the compoun
1d3e0 64 20 73 65 6c 65 63 74 2e 0a 20 20 2a 2f 0a 20  d select..  */. 
1d3f0 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 41 4c 4c 20   if( op==TK_ALL 
1d400 7c 7c 20 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20  || op==TK_UNION 
1d410 29 7b 0a 20 20 20 20 56 64 62 65 4e 6f 6f 70 43  ){.    VdbeNoopC
1d420 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4f 75 74 70  omment((v, "Outp
1d430 75 74 20 72 6f 75 74 69 6e 65 20 66 6f 72 20 42  ut routine for B
1d440 22 29 29 3b 0a 20 20 20 20 61 64 64 72 4f 75 74  "));.    addrOut
1d450 42 20 3d 20 67 65 6e 65 72 61 74 65 4f 75 74 70  B = generateOutp
1d460 75 74 53 75 62 72 6f 75 74 69 6e 65 28 70 50 61  utSubroutine(pPa
1d470 72 73 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20  rse,.           
1d480 20 20 20 20 20 20 70 2c 20 26 64 65 73 74 42 2c        p, &destB,
1d490 20 70 44 65 73 74 2c 20 72 65 67 4f 75 74 42 2c   pDest, regOutB,
1d4a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1d4b0 20 20 72 65 67 50 72 65 76 2c 20 70 4b 65 79 44    regPrev, pKeyD
1d4c0 75 70 2c 20 6c 61 62 65 6c 45 6e 64 29 3b 0a 20  up, labelEnd);. 
1d4d0 20 7d 0a 20 20 73 71 6c 69 74 65 33 4b 65 79 49   }.  sqlite3KeyI
1d4e0 6e 66 6f 55 6e 72 65 66 28 70 4b 65 79 44 75 70  nfoUnref(pKeyDup
1d4f0 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74  );..  /* Generat
1d500 65 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20 74  e a subroutine t
1d510 6f 20 72 75 6e 20 77 68 65 6e 20 74 68 65 20 72  o run when the r
1d520 65 73 75 6c 74 73 20 66 72 6f 6d 20 73 65 6c 65  esults from sele
1d530 63 74 20 41 0a 20 20 2a 2a 20 61 72 65 20 65 78  ct A.  ** are ex
1d540 68 61 75 73 74 65 64 20 61 6e 64 20 6f 6e 6c 79  hausted and only
1d550 20 64 61 74 61 20 69 6e 20 73 65 6c 65 63 74 20   data in select 
1d560 42 20 72 65 6d 61 69 6e 73 2e 0a 20 20 2a 2f 0a  B remains..  */.
1d570 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 45 58 43    if( op==TK_EXC
1d580 45 50 54 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 49 4e  EPT || op==TK_IN
1d590 54 45 52 53 45 43 54 20 29 7b 0a 20 20 20 20 61  TERSECT ){.    a
1d5a0 64 64 72 45 6f 66 41 5f 6e 6f 42 20 3d 20 61 64  ddrEofA_noB = ad
1d5b0 64 72 45 6f 66 41 20 3d 20 6c 61 62 65 6c 45 6e  drEofA = labelEn
1d5c0 64 3b 0a 20 20 7d 65 6c 73 65 7b 20 20 0a 20 20  d;.  }else{  .  
1d5d0 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e    VdbeNoopCommen
1d5e0 74 28 28 76 2c 20 22 65 6f 66 2d 41 20 73 75 62  t((v, "eof-A sub
1d5f0 72 6f 75 74 69 6e 65 22 29 29 3b 0a 20 20 20 20  routine"));.    
1d600 61 64 64 72 45 6f 66 41 20 3d 20 73 71 6c 69 74  addrEofA = sqlit
1d610 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
1d620 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 4f 75 74  OP_Gosub, regOut
1d630 42 2c 20 61 64 64 72 4f 75 74 42 29 3b 0a 20 20  B, addrOutB);.  
1d640 20 20 61 64 64 72 45 6f 66 41 5f 6e 6f 42 20 3d    addrEofA_noB =
1d650 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1d660 70 32 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20  p2(v, OP_Yield, 
1d670 72 65 67 41 64 64 72 42 2c 20 6c 61 62 65 6c 45  regAddrB, labelE
1d680 6e 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  nd);.           
1d690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d6a0 20 20 20 20 20 20 20 20 20 20 56 64 62 65 43 6f            VdbeCo
1d6b0 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 73  verage(v);.    s
1d6c0 71 6c 69 74 65 33 56 64 62 65 47 6f 74 6f 28 76  qlite3VdbeGoto(v
1d6d0 2c 20 61 64 64 72 45 6f 66 41 29 3b 0a 20 20 20  , addrEofA);.   
1d6e0 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d   p->nSelectRow =
1d6f0 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 41 64   sqlite3LogEstAd
1d700 64 28 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 2c  d(p->nSelectRow,
1d710 20 70 50 72 69 6f 72 2d 3e 6e 53 65 6c 65 63 74   pPrior->nSelect
1d720 52 6f 77 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  Row);.  }..  /* 
1d730 47 65 6e 65 72 61 74 65 20 61 20 73 75 62 72 6f  Generate a subro
1d740 75 74 69 6e 65 20 74 6f 20 72 75 6e 20 77 68 65  utine to run whe
1d750 6e 20 74 68 65 20 72 65 73 75 6c 74 73 20 66 72  n the results fr
1d760 6f 6d 20 73 65 6c 65 63 74 20 42 0a 20 20 2a 2a  om select B.  **
1d770 20 61 72 65 20 65 78 68 61 75 73 74 65 64 20 61   are exhausted a
1d780 6e 64 20 6f 6e 6c 79 20 64 61 74 61 20 69 6e 20  nd only data in 
1d790 73 65 6c 65 63 74 20 41 20 72 65 6d 61 69 6e 73  select A remains
1d7a0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6f 70 3d  ..  */.  if( op=
1d7b0 3d 54 4b 5f 49 4e 54 45 52 53 45 43 54 20 29 7b  =TK_INTERSECT ){
1d7c0 0a 20 20 20 20 61 64 64 72 45 6f 66 42 20 3d 20  .    addrEofB = 
1d7d0 61 64 64 72 45 6f 66 41 3b 0a 20 20 20 20 69 66  addrEofA;.    if
1d7e0 28 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20  ( p->nSelectRow 
1d7f0 3e 20 70 50 72 69 6f 72 2d 3e 6e 53 65 6c 65 63  > pPrior->nSelec
1d800 74 52 6f 77 20 29 20 70 2d 3e 6e 53 65 6c 65 63  tRow ) p->nSelec
1d810 74 52 6f 77 20 3d 20 70 50 72 69 6f 72 2d 3e 6e  tRow = pPrior->n
1d820 53 65 6c 65 63 74 52 6f 77 3b 0a 20 20 7d 65 6c  SelectRow;.  }el
1d830 73 65 7b 20 20 0a 20 20 20 20 56 64 62 65 4e 6f  se{  .    VdbeNo
1d840 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 65  opComment((v, "e
1d850 6f 66 2d 42 20 73 75 62 72 6f 75 74 69 6e 65 22  of-B subroutine"
1d860 29 29 3b 0a 20 20 20 20 61 64 64 72 45 6f 66 42  ));.    addrEofB
1d870 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
1d880 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62  dOp2(v, OP_Gosub
1d890 2c 20 72 65 67 4f 75 74 41 2c 20 61 64 64 72 4f  , regOutA, addrO
1d8a0 75 74 41 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  utA);.    sqlite
1d8b0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
1d8c0 50 5f 59 69 65 6c 64 2c 20 72 65 67 41 64 64 72  P_Yield, regAddr
1d8d0 41 2c 20 6c 61 62 65 6c 45 6e 64 29 3b 20 56 64  A, labelEnd); Vd
1d8e0 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
1d8f0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 47 6f     sqlite3VdbeGo
1d900 74 6f 28 76 2c 20 61 64 64 72 45 6f 66 42 29 3b  to(v, addrEofB);
1d910 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72  .  }..  /* Gener
1d920 61 74 65 20 63 6f 64 65 20 74 6f 20 68 61 6e 64  ate code to hand
1d930 6c 65 20 74 68 65 20 63 61 73 65 20 6f 66 20 41  le the case of A
1d940 3c 42 0a 20 20 2a 2f 0a 20 20 56 64 62 65 4e 6f  <B.  */.  VdbeNo
1d950 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 41  opComment((v, "A
1d960 2d 6c 74 2d 42 20 73 75 62 72 6f 75 74 69 6e 65  -lt-B subroutine
1d970 22 29 29 3b 0a 20 20 61 64 64 72 41 6c 74 42 20  "));.  addrAltB 
1d980 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
1d990 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c  Op2(v, OP_Gosub,
1d9a0 20 72 65 67 4f 75 74 41 2c 20 61 64 64 72 4f 75   regOutA, addrOu
1d9b0 74 41 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  tA);.  sqlite3Vd
1d9c0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 59  beAddOp2(v, OP_Y
1d9d0 69 65 6c 64 2c 20 72 65 67 41 64 64 72 41 2c 20  ield, regAddrA, 
1d9e0 61 64 64 72 45 6f 66 41 29 3b 20 56 64 62 65 43  addrEofA); VdbeC
1d9f0 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 73 71  overage(v);.  sq
1da00 6c 69 74 65 33 56 64 62 65 47 6f 74 6f 28 76 2c  lite3VdbeGoto(v,
1da10 20 6c 61 62 65 6c 43 6d 70 72 29 3b 0a 0a 20 20   labelCmpr);..  
1da20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  /* Generate code
1da30 20 74 6f 20 68 61 6e 64 6c 65 20 74 68 65 20 63   to handle the c
1da40 61 73 65 20 6f 66 20 41 3d 3d 42 0a 20 20 2a 2f  ase of A==B.  */
1da50 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 41 4c  .  if( op==TK_AL
1da60 4c 20 29 7b 0a 20 20 20 20 61 64 64 72 41 65 71  L ){.    addrAeq
1da70 42 20 3d 20 61 64 64 72 41 6c 74 42 3b 0a 20 20  B = addrAltB;.  
1da80 7d 65 6c 73 65 20 69 66 28 20 6f 70 3d 3d 54 4b  }else if( op==TK
1da90 5f 49 4e 54 45 52 53 45 43 54 20 29 7b 0a 20 20  _INTERSECT ){.  
1daa0 20 20 61 64 64 72 41 65 71 42 20 3d 20 61 64 64    addrAeqB = add
1dab0 72 41 6c 74 42 3b 0a 20 20 20 20 61 64 64 72 41  rAltB;.    addrA
1dac0 6c 74 42 2b 2b 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ltB++;.  }else{.
1dad0 20 20 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d      VdbeNoopComm
1dae0 65 6e 74 28 28 76 2c 20 22 41 2d 65 71 2d 42 20  ent((v, "A-eq-B 
1daf0 73 75 62 72 6f 75 74 69 6e 65 22 29 29 3b 0a 20  subroutine"));. 
1db00 20 20 20 61 64 64 72 41 65 71 42 20 3d 0a 20 20     addrAeqB =.  
1db10 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1db20 4f 70 32 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c  Op2(v, OP_Yield,
1db30 20 72 65 67 41 64 64 72 41 2c 20 61 64 64 72 45   regAddrA, addrE
1db40 6f 66 41 29 3b 20 56 64 62 65 43 6f 76 65 72 61  ofA); VdbeCovera
1db50 67 65 28 76 29 3b 0a 20 20 20 20 73 71 6c 69 74  ge(v);.    sqlit
1db60 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 6c 61  e3VdbeGoto(v, la
1db70 62 65 6c 43 6d 70 72 29 3b 0a 20 20 7d 0a 0a 20  belCmpr);.  }.. 
1db80 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64   /* Generate cod
1db90 65 20 74 6f 20 68 61 6e 64 6c 65 20 74 68 65 20  e to handle the 
1dba0 63 61 73 65 20 6f 66 20 41 3e 42 0a 20 20 2a 2f  case of A>B.  */
1dbb0 0a 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65  .  VdbeNoopComme
1dbc0 6e 74 28 28 76 2c 20 22 41 2d 67 74 2d 42 20 73  nt((v, "A-gt-B s
1dbd0 75 62 72 6f 75 74 69 6e 65 22 29 29 3b 0a 20 20  ubroutine"));.  
1dbe0 61 64 64 72 41 67 74 42 20 3d 20 73 71 6c 69 74  addrAgtB = sqlit
1dbf0 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
1dc00 72 28 76 29 3b 0a 20 20 69 66 28 20 6f 70 3d 3d  r(v);.  if( op==
1dc10 54 4b 5f 41 4c 4c 20 7c 7c 20 6f 70 3d 3d 54 4b  TK_ALL || op==TK
1dc20 5f 55 4e 49 4f 4e 20 29 7b 0a 20 20 20 20 73 71  _UNION ){.    sq
1dc30 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
1dc40 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67  v, OP_Gosub, reg
1dc50 4f 75 74 42 2c 20 61 64 64 72 4f 75 74 42 29 3b  OutB, addrOutB);
1dc60 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64  .  }.  sqlite3Vd
1dc70 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 59  beAddOp2(v, OP_Y
1dc80 69 65 6c 64 2c 20 72 65 67 41 64 64 72 42 2c 20  ield, regAddrB, 
1dc90 61 64 64 72 45 6f 66 42 29 3b 20 56 64 62 65 43  addrEofB); VdbeC
1dca0 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 73 71  overage(v);.  sq
1dcb0 6c 69 74 65 33 56 64 62 65 47 6f 74 6f 28 76 2c  lite3VdbeGoto(v,
1dcc0 20 6c 61 62 65 6c 43 6d 70 72 29 3b 0a 0a 20 20   labelCmpr);..  
1dcd0 2f 2a 20 54 68 69 73 20 63 6f 64 65 20 72 75 6e  /* This code run
1dce0 73 20 6f 6e 63 65 20 74 6f 20 69 6e 69 74 69 61  s once to initia
1dcf0 6c 69 7a 65 20 65 76 65 72 79 74 68 69 6e 67 2e  lize everything.
1dd00 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56  .  */.  sqlite3V
1dd10 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61  dbeJumpHere(v, a
1dd20 64 64 72 31 29 3b 0a 20 20 73 71 6c 69 74 65 33  ddr1);.  sqlite3
1dd30 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
1dd40 5f 59 69 65 6c 64 2c 20 72 65 67 41 64 64 72 41  _Yield, regAddrA
1dd50 2c 20 61 64 64 72 45 6f 66 41 5f 6e 6f 42 29 3b  , addrEofA_noB);
1dd60 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
1dd70 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
1dd80 64 64 4f 70 32 28 76 2c 20 4f 50 5f 59 69 65 6c  ddOp2(v, OP_Yiel
1dd90 64 2c 20 72 65 67 41 64 64 72 42 2c 20 61 64 64  d, regAddrB, add
1dda0 72 45 6f 66 42 29 3b 20 56 64 62 65 43 6f 76 65  rEofB); VdbeCove
1ddb0 72 61 67 65 28 76 29 3b 0a 0a 20 20 2f 2a 20 49  rage(v);..  /* I
1ddc0 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 6d 61 69  mplement the mai
1ddd0 6e 20 6d 65 72 67 65 20 6c 6f 6f 70 0a 20 20 2a  n merge loop.  *
1dde0 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 52  /.  sqlite3VdbeR
1ddf0 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 6c  esolveLabel(v, l
1de00 61 62 65 6c 43 6d 70 72 29 3b 0a 20 20 73 71 6c  abelCmpr);.  sql
1de10 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
1de20 2c 20 4f 50 5f 50 65 72 6d 75 74 61 74 69 6f 6e  , OP_Permutation
1de30 2c 20 30 2c 20 30 2c 20 30 2c 20 28 63 68 61 72  , 0, 0, 0, (char
1de40 2a 29 61 50 65 72 6d 75 74 65 2c 20 50 34 5f 49  *)aPermute, P4_I
1de50 4e 54 41 52 52 41 59 29 3b 0a 20 20 73 71 6c 69  NTARRAY);.  sqli
1de60 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
1de70 20 4f 50 5f 43 6f 6d 70 61 72 65 2c 20 64 65 73   OP_Compare, des
1de80 74 41 2e 69 53 64 73 74 2c 20 64 65 73 74 42 2e  tA.iSdst, destB.
1de90 69 53 64 73 74 2c 20 6e 4f 72 64 65 72 42 79 2c  iSdst, nOrderBy,
1dea0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1deb0 20 20 20 20 20 20 20 20 20 20 28 63 68 61 72 2a            (char*
1dec0 29 70 4b 65 79 4d 65 72 67 65 2c 20 50 34 5f 4b  )pKeyMerge, P4_K
1ded0 45 59 49 4e 46 4f 29 3b 0a 20 20 73 71 6c 69 74  EYINFO);.  sqlit
1dee0 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76  e3VdbeChangeP5(v
1def0 2c 20 4f 50 46 4c 41 47 5f 50 45 52 4d 55 54 45  , OPFLAG_PERMUTE
1df00 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
1df10 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4a 75 6d  AddOp3(v, OP_Jum
1df20 70 2c 20 61 64 64 72 41 6c 74 42 2c 20 61 64 64  p, addrAltB, add
1df30 72 41 65 71 42 2c 20 61 64 64 72 41 67 74 42 29  rAeqB, addrAgtB)
1df40 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
1df50 29 3b 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 74 6f  );..  /* Jump to
1df60 20 74 68 65 20 74 68 69 73 20 70 6f 69 6e 74 20   the this point 
1df70 69 6e 20 6f 72 64 65 72 20 74 6f 20 74 65 72 6d  in order to term
1df80 69 6e 61 74 65 20 74 68 65 20 71 75 65 72 79 2e  inate the query.
1df90 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56  .  */.  sqlite3V
1dfa0 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
1dfb0 76 2c 20 6c 61 62 65 6c 45 6e 64 29 3b 0a 0a 20  v, labelEnd);.. 
1dfc0 20 2f 2a 20 52 65 61 73 73 65 6d 62 6c 79 20 74   /* Reassembly t
1dfd0 68 65 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72  he compound quer
1dfe0 79 20 73 6f 20 74 68 61 74 20 69 74 20 77 69 6c  y so that it wil
1dff0 6c 20 62 65 20 66 72 65 65 64 20 63 6f 72 72 65  l be freed corre
1e000 63 74 6c 79 0a 20 20 2a 2a 20 62 79 20 74 68 65  ctly.  ** by the
1e010 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f   calling functio
1e020 6e 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 50  n */.  if( p->pP
1e030 72 69 6f 72 20 29 7b 0a 20 20 20 20 73 71 6c 69  rior ){.    sqli
1e040 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28  te3SelectDelete(
1e050 64 62 2c 20 70 2d 3e 70 50 72 69 6f 72 29 3b 0a  db, p->pPrior);.
1e060 20 20 7d 0a 20 20 70 2d 3e 70 50 72 69 6f 72 20    }.  p->pPrior 
1e070 3d 20 70 50 72 69 6f 72 3b 0a 20 20 70 50 72 69  = pPrior;.  pPri
1e080 6f 72 2d 3e 70 4e 65 78 74 20 3d 20 70 3b 0a 0a  or->pNext = p;..
1e090 20 20 2f 2a 2a 2a 20 54 42 44 3a 20 20 49 6e 73    /*** TBD:  Ins
1e0a0 65 72 74 20 73 75 62 72 6f 75 74 69 6e 65 20 63  ert subroutine c
1e0b0 61 6c 6c 73 20 74 6f 20 63 6c 6f 73 65 20 63 75  alls to close cu
1e0c0 72 73 6f 72 73 20 6f 6e 20 69 6e 63 6f 6d 70 6c  rsors on incompl
1e0d0 65 74 65 0a 20 20 2a 2a 2a 2a 20 73 75 62 71 75  ete.  **** subqu
1e0e0 65 72 69 65 73 20 2a 2a 2a 2a 2f 0a 20 20 45 78  eries ****/.  Ex
1e0f0 70 6c 61 69 6e 51 75 65 72 79 50 6c 61 6e 50 6f  plainQueryPlanPo
1e100 70 28 70 50 61 72 73 65 29 3b 0a 20 20 72 65 74  p(pParse);.  ret
1e110 75 72 6e 20 70 50 61 72 73 65 2d 3e 6e 45 72 72  urn pParse->nErr
1e120 21 3d 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23  !=0;.}.#endif..#
1e130 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
1e140 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
1e150 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51  ) || !defined(SQ
1e160 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 0a  LITE_OMIT_VIEW).
1e170 0a 2f 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65 20  ./* An instance 
1e180 6f 66 20 74 68 65 20 53 75 62 73 74 43 6f 6e 74  of the SubstCont
1e190 65 78 74 20 6f 62 6a 65 63 74 20 64 65 73 63 72  ext object descr
1e1a0 69 62 65 73 20 61 6e 20 73 75 62 73 74 69 74 75  ibes an substitu
1e1b0 74 69 6f 6e 20 65 64 69 74 0a 2a 2a 20 74 6f 20  tion edit.** to 
1e1c0 62 65 20 70 65 72 66 6f 72 6d 65 64 20 6f 6e 20  be performed on 
1e1d0 61 20 70 61 72 73 65 20 74 72 65 65 2e 0a 2a 2a  a parse tree..**
1e1e0 0a 2a 2a 20 41 6c 6c 20 72 65 66 65 72 65 6e 63  .** All referenc
1e1f0 65 73 20 74 6f 20 63 6f 6c 75 6d 6e 73 20 69 6e  es to columns in
1e200 20 74 61 62 6c 65 20 69 54 61 62 6c 65 20 61 72   table iTable ar
1e210 65 20 74 6f 20 62 65 20 72 65 70 6c 61 63 65 64  e to be replaced
1e220 20 62 79 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e   by correspondin
1e230 67 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 73  g.** expressions
1e240 20 69 6e 20 70 45 4c 69 73 74 2e 0a 2a 2f 0a 74   in pEList..*/.t
1e250 79 70 65 64 65 66 20 73 74 72 75 63 74 20 53 75  ypedef struct Su
1e260 62 73 74 43 6f 6e 74 65 78 74 20 7b 0a 20 20 50  bstContext {.  P
1e270 61 72 73 65 20 2a 70 50 61 72 73 65 3b 20 20 20  arse *pParse;   
1e280 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
1e290 70 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  parsing context 
1e2a0 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 6c 65 3b  */.  int iTable;
1e2b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1e2c0 2a 20 52 65 70 6c 61 63 65 20 72 65 66 65 72 65  * Replace refere
1e2d0 6e 63 65 73 20 74 6f 20 74 68 69 73 20 74 61 62  nces to this tab
1e2e0 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 4e 65 77  le */.  int iNew
1e2f0 54 61 62 6c 65 3b 20 20 20 20 20 20 20 20 20 20  Table;          
1e300 20 20 2f 2a 20 4e 65 77 20 74 61 62 6c 65 20 6e    /* New table n
1e310 75 6d 62 65 72 20 2a 2f 0a 20 20 69 6e 74 20 69  umber */.  int i
1e320 73 4c 65 66 74 4a 6f 69 6e 3b 20 20 20 20 20 20  sLeftJoin;      
1e330 20 20 20 20 20 2f 2a 20 41 64 64 20 54 4b 5f 49       /* Add TK_I
1e340 46 5f 4e 55 4c 4c 5f 52 4f 57 20 6f 70 63 6f 64  F_NULL_ROW opcod
1e350 65 73 20 6f 6e 20 65 61 63 68 20 72 65 70 6c 61  es on each repla
1e360 63 65 6d 65 6e 74 20 2a 2f 0a 20 20 45 78 70 72  cement */.  Expr
1e370 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 20 20 20  List *pEList;   
1e380 20 20 20 20 20 20 2f 2a 20 52 65 70 6c 61 63 65        /* Replace
1e390 6d 65 6e 74 20 65 78 70 72 65 73 73 69 6f 6e 73  ment expressions
1e3a0 20 2a 2f 0a 7d 20 53 75 62 73 74 43 6f 6e 74 65   */.} SubstConte
1e3b0 78 74 3b 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20  xt;../* Forward 
1e3c0 44 65 63 6c 61 72 61 74 69 6f 6e 73 20 2a 2f 0a  Declarations */.
1e3d0 73 74 61 74 69 63 20 76 6f 69 64 20 73 75 62 73  static void subs
1e3e0 74 45 78 70 72 4c 69 73 74 28 53 75 62 73 74 43  tExprList(SubstC
1e3f0 6f 6e 74 65 78 74 2a 2c 20 45 78 70 72 4c 69 73  ontext*, ExprLis
1e400 74 2a 29 3b 0a 73 74 61 74 69 63 20 76 6f 69 64  t*);.static void
1e410 20 73 75 62 73 74 53 65 6c 65 63 74 28 53 75 62   substSelect(Sub
1e420 73 74 43 6f 6e 74 65 78 74 2a 2c 20 53 65 6c 65  stContext*, Sele
1e430 63 74 2a 2c 20 69 6e 74 29 3b 0a 0a 2f 2a 0a 2a  ct*, int);../*.*
1e440 2a 20 53 63 61 6e 20 74 68 72 6f 75 67 68 20 74  * Scan through t
1e450 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 70 45  he expression pE
1e460 78 70 72 2e 20 20 52 65 70 6c 61 63 65 20 65 76  xpr.  Replace ev
1e470 65 72 79 20 72 65 66 65 72 65 6e 63 65 20 74 6f  ery reference to
1e480 0a 2a 2a 20 61 20 63 6f 6c 75 6d 6e 20 69 6e 20  .** a column in 
1e490 74 61 62 6c 65 20 6e 75 6d 62 65 72 20 69 54 61  table number iTa
1e4a0 62 6c 65 20 77 69 74 68 20 61 20 63 6f 70 79 20  ble with a copy 
1e4b0 6f 66 20 74 68 65 20 69 43 6f 6c 75 6d 6e 2d 74  of the iColumn-t
1e4c0 68 0a 2a 2a 20 65 6e 74 72 79 20 69 6e 20 70 45  h.** entry in pE
1e4d0 4c 69 73 74 2e 20 20 28 42 75 74 20 6c 65 61 76  List.  (But leav
1e4e0 65 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20  e references to 
1e4f0 74 68 65 20 52 4f 57 49 44 20 63 6f 6c 75 6d 6e  the ROWID column
1e500 20 0a 2a 2a 20 75 6e 63 68 61 6e 67 65 64 2e 29   .** unchanged.)
1e510 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
1e520 69 6e 65 20 69 73 20 70 61 72 74 20 6f 66 20 74  ine is part of t
1e530 68 65 20 66 6c 61 74 74 65 6e 69 6e 67 20 70 72  he flattening pr
1e540 6f 63 65 64 75 72 65 2e 20 20 41 20 73 75 62 71  ocedure.  A subq
1e550 75 65 72 79 0a 2a 2a 20 77 68 6f 73 65 20 72 65  uery.** whose re
1e560 73 75 6c 74 20 73 65 74 20 69 73 20 64 65 66 69  sult set is defi
1e570 6e 65 64 20 62 79 20 70 45 4c 69 73 74 20 61 70  ned by pEList ap
1e580 70 65 61 72 73 20 61 73 20 65 6e 74 72 79 20 69  pears as entry i
1e590 6e 20 74 68 65 0a 2a 2a 20 46 52 4f 4d 20 63 6c  n the.** FROM cl
1e5a0 61 75 73 65 20 6f 66 20 61 20 53 45 4c 45 43 54  ause of a SELECT
1e5b0 20 73 75 63 68 20 74 68 61 74 20 74 68 65 20 56   such that the V
1e5c0 44 42 45 20 63 75 72 73 6f 72 20 61 73 73 69 67  DBE cursor assig
1e5d0 6e 65 64 20 74 6f 20 74 68 61 74 0a 2a 2a 20 46  ned to that.** F
1e5e0 4f 52 4d 20 63 6c 61 75 73 65 20 65 6e 74 72 79  ORM clause entry
1e5f0 20 69 73 20 69 54 61 62 6c 65 2e 20 20 54 68 69   is iTable.  Thi
1e600 73 20 72 6f 75 74 69 6e 65 20 6d 61 6b 65 73 20  s routine makes 
1e610 74 68 65 20 6e 65 63 65 73 73 61 72 79 20 0a 2a  the necessary .*
1e620 2a 20 63 68 61 6e 67 65 73 20 74 6f 20 70 45 78  * changes to pEx
1e630 70 72 20 73 6f 20 74 68 61 74 20 69 74 20 72 65  pr so that it re
1e640 66 65 72 73 20 64 69 72 65 63 74 6c 79 20 74 6f  fers directly to
1e650 20 74 68 65 20 73 6f 75 72 63 65 20 74 61 62 6c   the source tabl
1e660 65 0a 2a 2a 20 6f 66 20 74 68 65 20 73 75 62 71  e.** of the subq
1e670 75 65 72 79 20 72 61 74 68 65 72 20 74 68 65 20  uery rather the 
1e680 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20 74 68  result set of th
1e690 65 20 73 75 62 71 75 65 72 79 2e 0a 2a 2f 0a 73  e subquery..*/.s
1e6a0 74 61 74 69 63 20 45 78 70 72 20 2a 73 75 62 73  tatic Expr *subs
1e6b0 74 45 78 70 72 28 0a 20 20 53 75 62 73 74 43 6f  tExpr(.  SubstCo
1e6c0 6e 74 65 78 74 20 2a 70 53 75 62 73 74 2c 20 20  ntext *pSubst,  
1e6d0 2f 2a 20 44 65 73 63 72 69 70 74 69 6f 6e 20 6f  /* Description o
1e6e0 66 20 74 68 65 20 73 75 62 73 74 69 74 75 74 69  f the substituti
1e6f0 6f 6e 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45  on */.  Expr *pE
1e700 78 70 72 20 20 20 20 20 20 20 20 20 20 20 20 2f  xpr            /
1e710 2a 20 45 78 70 72 20 69 6e 20 77 68 69 63 68 20  * Expr in which 
1e720 73 75 62 73 74 69 74 75 74 69 6f 6e 20 6f 63 63  substitution occ
1e730 75 72 73 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20  urs */.){.  if( 
1e740 70 45 78 70 72 3d 3d 30 20 29 20 72 65 74 75 72  pExpr==0 ) retur
1e750 6e 20 30 3b 0a 20 20 69 66 28 20 45 78 70 72 48  n 0;.  if( ExprH
1e760 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  asProperty(pExpr
1e770 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 0a 20  , EP_FromJoin). 
1e780 20 20 26 26 20 70 45 78 70 72 2d 3e 69 52 69 67    && pExpr->iRig
1e790 68 74 4a 6f 69 6e 54 61 62 6c 65 3d 3d 70 53 75  htJoinTable==pSu
1e7a0 62 73 74 2d 3e 69 54 61 62 6c 65 0a 20 20 29 7b  bst->iTable.  ){
1e7b0 0a 20 20 20 20 70 45 78 70 72 2d 3e 69 52 69 67  .    pExpr->iRig
1e7c0 68 74 4a 6f 69 6e 54 61 62 6c 65 20 3d 20 70 53  htJoinTable = pS
1e7d0 75 62 73 74 2d 3e 69 4e 65 77 54 61 62 6c 65 3b  ubst->iNewTable;
1e7e0 0a 20 20 7d 0a 20 20 69 66 28 20 70 45 78 70 72  .  }.  if( pExpr
1e7f0 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20  ->op==TK_COLUMN 
1e800 26 26 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  && pExpr->iTable
1e810 3d 3d 70 53 75 62 73 74 2d 3e 69 54 61 62 6c 65  ==pSubst->iTable
1e820 20 29 7b 0a 20 20 20 20 69 66 28 20 70 45 78 70   ){.    if( pExp
1e830 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 20 29 7b 0a  r->iColumn<0 ){.
1e840 20 20 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 20        pExpr->op 
1e850 3d 20 54 4b 5f 4e 55 4c 4c 3b 0a 20 20 20 20 7d  = TK_NULL;.    }
1e860 65 6c 73 65 7b 0a 20 20 20 20 20 20 45 78 70 72  else{.      Expr
1e870 20 2a 70 4e 65 77 3b 0a 20 20 20 20 20 20 45 78   *pNew;.      Ex
1e880 70 72 20 2a 70 43 6f 70 79 20 3d 20 70 53 75 62  pr *pCopy = pSub
1e890 73 74 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 70 45  st->pEList->a[pE
1e8a0 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 5d 2e 70 45  xpr->iColumn].pE
1e8b0 78 70 72 3b 0a 20 20 20 20 20 20 45 78 70 72 20  xpr;.      Expr 
1e8c0 69 66 4e 75 6c 6c 52 6f 77 3b 0a 20 20 20 20 20  ifNullRow;.     
1e8d0 20 61 73 73 65 72 74 28 20 70 53 75 62 73 74 2d   assert( pSubst-
1e8e0 3e 70 45 4c 69 73 74 21 3d 30 20 26 26 20 70 45  >pEList!=0 && pE
1e8f0 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 70 53 75  xpr->iColumn<pSu
1e900 62 73 74 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78  bst->pEList->nEx
1e910 70 72 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  pr );.      asse
1e920 72 74 28 20 70 45 78 70 72 2d 3e 70 52 69 67 68  rt( pExpr->pRigh
1e930 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66  t==0 );.      if
1e940 28 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 56  ( sqlite3ExprIsV
1e950 65 63 74 6f 72 28 70 43 6f 70 79 29 20 29 7b 0a  ector(pCopy) ){.
1e960 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
1e970 65 63 74 6f 72 45 72 72 6f 72 4d 73 67 28 70 53  ectorErrorMsg(pS
1e980 75 62 73 74 2d 3e 70 50 61 72 73 65 2c 20 70 43  ubst->pParse, pC
1e990 6f 70 79 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  opy);.      }els
1e9a0 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e{.        sqlit
1e9b0 65 33 20 2a 64 62 20 3d 20 70 53 75 62 73 74 2d  e3 *db = pSubst-
1e9c0 3e 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 20  >pParse->db;.   
1e9d0 20 20 20 20 20 69 66 28 20 70 53 75 62 73 74 2d       if( pSubst-
1e9e0 3e 69 73 4c 65 66 74 4a 6f 69 6e 20 26 26 20 70  >isLeftJoin && p
1e9f0 43 6f 70 79 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c  Copy->op!=TK_COL
1ea00 55 4d 4e 20 29 7b 0a 20 20 20 20 20 20 20 20 20  UMN ){.         
1ea10 20 6d 65 6d 73 65 74 28 26 69 66 4e 75 6c 6c 52   memset(&ifNullR
1ea20 6f 77 2c 20 30 2c 20 73 69 7a 65 6f 66 28 69 66  ow, 0, sizeof(if
1ea30 4e 75 6c 6c 52 6f 77 29 29 3b 0a 20 20 20 20 20  NullRow));.     
1ea40 20 20 20 20 20 69 66 4e 75 6c 6c 52 6f 77 2e 6f       ifNullRow.o
1ea50 70 20 3d 20 54 4b 5f 49 46 5f 4e 55 4c 4c 5f 52  p = TK_IF_NULL_R
1ea60 4f 57 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  OW;.          if
1ea70 4e 75 6c 6c 52 6f 77 2e 70 4c 65 66 74 20 3d 20  NullRow.pLeft = 
1ea80 70 43 6f 70 79 3b 0a 20 20 20 20 20 20 20 20 20  pCopy;.         
1ea90 20 69 66 4e 75 6c 6c 52 6f 77 2e 69 54 61 62 6c   ifNullRow.iTabl
1eaa0 65 20 3d 20 70 53 75 62 73 74 2d 3e 69 4e 65 77  e = pSubst->iNew
1eab0 54 61 62 6c 65 3b 0a 20 20 20 20 20 20 20 20 20  Table;.         
1eac0 20 70 43 6f 70 79 20 3d 20 26 69 66 4e 75 6c 6c   pCopy = &ifNull
1ead0 52 6f 77 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  Row;.        }. 
1eae0 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
1eaf0 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79   ExprHasProperty
1eb00 28 70 43 6f 70 79 2c 20 45 50 5f 53 75 62 71 75  (pCopy, EP_Subqu
1eb10 65 72 79 29 20 29 3b 0a 20 20 20 20 20 20 20 20  ery) );.        
1eb20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 45 78  pNew = sqlite3Ex
1eb30 70 72 44 75 70 28 64 62 2c 20 70 43 6f 70 79 2c  prDup(db, pCopy,
1eb40 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28   0);.        if(
1eb50 20 70 4e 65 77 20 26 26 20 70 53 75 62 73 74 2d   pNew && pSubst-
1eb60 3e 69 73 4c 65 66 74 4a 6f 69 6e 20 29 7b 0a 20  >isLeftJoin ){. 
1eb70 20 20 20 20 20 20 20 20 20 45 78 70 72 53 65 74           ExprSet
1eb80 50 72 6f 70 65 72 74 79 28 70 4e 65 77 2c 20 45  Property(pNew, E
1eb90 50 5f 43 61 6e 42 65 4e 75 6c 6c 29 3b 0a 20 20  P_CanBeNull);.  
1eba0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1ebb0 69 66 28 20 70 4e 65 77 20 26 26 20 45 78 70 72  if( pNew && Expr
1ebc0 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
1ebd0 72 2c 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29  r,EP_FromJoin) )
1ebe0 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4e 65 77  {.          pNew
1ebf0 2d 3e 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c  ->iRightJoinTabl
1ec00 65 20 3d 20 70 45 78 70 72 2d 3e 69 52 69 67 68  e = pExpr->iRigh
1ec10 74 4a 6f 69 6e 54 61 62 6c 65 3b 0a 20 20 20 20  tJoinTable;.    
1ec20 20 20 20 20 20 20 45 78 70 72 53 65 74 50 72 6f        ExprSetPro
1ec30 70 65 72 74 79 28 70 4e 65 77 2c 20 45 50 5f 46  perty(pNew, EP_F
1ec40 72 6f 6d 4a 6f 69 6e 29 3b 0a 20 20 20 20 20 20  romJoin);.      
1ec50 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
1ec60 70 4e 65 77 20 26 26 20 45 78 70 72 48 61 73 50  pNew && ExprHasP
1ec70 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 45 50  roperty(pExpr,EP
1ec80 5f 47 65 6e 65 72 69 63 29 20 29 7b 0a 20 20 20  _Generic) ){.   
1ec90 20 20 20 20 20 20 20 45 78 70 72 53 65 74 50 72         ExprSetPr
1eca0 6f 70 65 72 74 79 28 70 4e 65 77 2c 20 45 50 5f  operty(pNew, EP_
1ecb0 47 65 6e 65 72 69 63 29 3b 0a 20 20 20 20 20 20  Generic);.      
1ecc0 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69    }.        sqli
1ecd0 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62  te3ExprDelete(db
1ece0 2c 20 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20  , pExpr);.      
1ecf0 20 20 70 45 78 70 72 20 3d 20 70 4e 65 77 3b 0a    pExpr = pNew;.
1ed00 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
1ed10 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66 28 20 70  }else{.    if( p
1ed20 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 46 5f  Expr->op==TK_IF_
1ed30 4e 55 4c 4c 5f 52 4f 57 20 26 26 20 70 45 78 70  NULL_ROW && pExp
1ed40 72 2d 3e 69 54 61 62 6c 65 3d 3d 70 53 75 62 73  r->iTable==pSubs
1ed50 74 2d 3e 69 54 61 62 6c 65 20 29 7b 0a 20 20 20  t->iTable ){.   
1ed60 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65     pExpr->iTable
1ed70 20 3d 20 70 53 75 62 73 74 2d 3e 69 4e 65 77 54   = pSubst->iNewT
1ed80 61 62 6c 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20  able;.    }.    
1ed90 70 45 78 70 72 2d 3e 70 4c 65 66 74 20 3d 20 73  pExpr->pLeft = s
1eda0 75 62 73 74 45 78 70 72 28 70 53 75 62 73 74 2c  ubstExpr(pSubst,
1edb0 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a   pExpr->pLeft);.
1edc0 20 20 20 20 70 45 78 70 72 2d 3e 70 52 69 67 68      pExpr->pRigh
1edd0 74 20 3d 20 73 75 62 73 74 45 78 70 72 28 70 53  t = substExpr(pS
1ede0 75 62 73 74 2c 20 70 45 78 70 72 2d 3e 70 52 69  ubst, pExpr->pRi
1edf0 67 68 74 29 3b 0a 20 20 20 20 69 66 28 20 45 78  ght);.    if( Ex
1ee00 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
1ee10 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63  xpr, EP_xIsSelec
1ee20 74 29 20 29 7b 0a 20 20 20 20 20 20 73 75 62 73  t) ){.      subs
1ee30 74 53 65 6c 65 63 74 28 70 53 75 62 73 74 2c 20  tSelect(pSubst, 
1ee40 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74  pExpr->x.pSelect
1ee50 2c 20 31 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  , 1);.    }else{
1ee60 0a 20 20 20 20 20 20 73 75 62 73 74 45 78 70 72  .      substExpr
1ee70 4c 69 73 74 28 70 53 75 62 73 74 2c 20 70 45 78  List(pSubst, pEx
1ee80 70 72 2d 3e 78 2e 70 4c 69 73 74 29 3b 0a 20 20  pr->x.pList);.  
1ee90 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
1eea0 20 70 45 78 70 72 3b 0a 7d 0a 73 74 61 74 69 63   pExpr;.}.static
1eeb0 20 76 6f 69 64 20 73 75 62 73 74 45 78 70 72 4c   void substExprL
1eec0 69 73 74 28 0a 20 20 53 75 62 73 74 43 6f 6e 74  ist(.  SubstCont
1eed0 65 78 74 20 2a 70 53 75 62 73 74 2c 20 2f 2a 20  ext *pSubst, /* 
1eee0 44 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 74  Description of t
1eef0 68 65 20 73 75 62 73 74 69 74 75 74 69 6f 6e 20  he substitution 
1ef00 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
1ef10 4c 69 73 74 20 20 20 20 20 20 20 2f 2a 20 4c 69  List       /* Li
1ef20 73 74 20 74 6f 20 73 63 61 6e 20 61 6e 64 20 69  st to scan and i
1ef30 6e 20 77 68 69 63 68 20 74 6f 20 6d 61 6b 65 20  n which to make 
1ef40 73 75 62 73 74 69 74 75 74 65 73 20 2a 2f 0a 29  substitutes */.)
1ef50 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28  {.  int i;.  if(
1ef60 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75   pList==0 ) retu
1ef70 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  rn;.  for(i=0; i
1ef80 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69  <pList->nExpr; i
1ef90 2b 2b 29 7b 0a 20 20 20 20 70 4c 69 73 74 2d 3e  ++){.    pList->
1efa0 61 5b 69 5d 2e 70 45 78 70 72 20 3d 20 73 75 62  a[i].pExpr = sub
1efb0 73 74 45 78 70 72 28 70 53 75 62 73 74 2c 20 70  stExpr(pSubst, p
1efc0 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  List->a[i].pExpr
1efd0 29 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20  );.  }.}.static 
1efe0 76 6f 69 64 20 73 75 62 73 74 53 65 6c 65 63 74  void substSelect
1eff0 28 0a 20 20 53 75 62 73 74 43 6f 6e 74 65 78 74  (.  SubstContext
1f000 20 2a 70 53 75 62 73 74 2c 20 2f 2a 20 44 65 73   *pSubst, /* Des
1f010 63 72 69 70 74 69 6f 6e 20 6f 66 20 74 68 65 20  cription of the 
1f020 73 75 62 73 74 69 74 75 74 69 6f 6e 20 2a 2f 0a  substitution */.
1f030 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20    Select *p,    
1f040 20 20 20 20 20 20 20 20 2f 2a 20 53 45 4c 45 43          /* SELEC
1f050 54 20 73 74 61 74 65 6d 65 6e 74 20 69 6e 20 77  T statement in w
1f060 68 69 63 68 20 74 6f 20 6d 61 6b 65 20 73 75 62  hich to make sub
1f070 73 74 69 74 75 74 69 6f 6e 73 20 2a 2f 0a 20 20  stitutions */.  
1f080 69 6e 74 20 64 6f 50 72 69 6f 72 20 20 20 20 20  int doPrior     
1f090 20 20 20 20 20 20 2f 2a 20 44 6f 20 73 75 62 73        /* Do subs
1f0a0 74 69 74 75 74 65 73 20 6f 6e 20 70 2d 3e 70 50  titutes on p->pP
1f0b0 72 69 6f 72 20 74 6f 6f 20 2a 2f 0a 29 7b 0a 20  rior too */.){. 
1f0c0 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63 3b 0a   SrcList *pSrc;.
1f0d0 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
1f0e0 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20  _item *pItem;.  
1f0f0 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 21 70 20  int i;.  if( !p 
1f100 29 20 72 65 74 75 72 6e 3b 0a 20 20 64 6f 7b 0a  ) return;.  do{.
1f110 20 20 20 20 73 75 62 73 74 45 78 70 72 4c 69 73      substExprLis
1f120 74 28 70 53 75 62 73 74 2c 20 70 2d 3e 70 45 4c  t(pSubst, p->pEL
1f130 69 73 74 29 3b 0a 20 20 20 20 73 75 62 73 74 45  ist);.    substE
1f140 78 70 72 4c 69 73 74 28 70 53 75 62 73 74 2c 20  xprList(pSubst, 
1f150 70 2d 3e 70 47 72 6f 75 70 42 79 29 3b 0a 20 20  p->pGroupBy);.  
1f160 20 20 73 75 62 73 74 45 78 70 72 4c 69 73 74 28    substExprList(
1f170 70 53 75 62 73 74 2c 20 70 2d 3e 70 4f 72 64 65  pSubst, p->pOrde
1f180 72 42 79 29 3b 0a 20 20 20 20 70 2d 3e 70 48 61  rBy);.    p->pHa
1f190 76 69 6e 67 20 3d 20 73 75 62 73 74 45 78 70 72  ving = substExpr
1f1a0 28 70 53 75 62 73 74 2c 20 70 2d 3e 70 48 61 76  (pSubst, p->pHav
1f1b0 69 6e 67 29 3b 0a 20 20 20 20 70 2d 3e 70 57 68  ing);.    p->pWh
1f1c0 65 72 65 20 3d 20 73 75 62 73 74 45 78 70 72 28  ere = substExpr(
1f1d0 70 53 75 62 73 74 2c 20 70 2d 3e 70 57 68 65 72  pSubst, p->pWher
1f1e0 65 29 3b 0a 20 20 20 20 70 53 72 63 20 3d 20 70  e);.    pSrc = p
1f1f0 2d 3e 70 53 72 63 3b 0a 20 20 20 20 61 73 73 65  ->pSrc;.    asse
1f200 72 74 28 20 70 53 72 63 21 3d 30 20 29 3b 0a 20  rt( pSrc!=0 );. 
1f210 20 20 20 66 6f 72 28 69 3d 70 53 72 63 2d 3e 6e     for(i=pSrc->n
1f220 53 72 63 2c 20 70 49 74 65 6d 3d 70 53 72 63 2d  Src, pItem=pSrc-
1f230 3e 61 3b 20 69 3e 30 3b 20 69 2d 2d 2c 20 70 49  >a; i>0; i--, pI
1f240 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 73 75  tem++){.      su
1f250 62 73 74 53 65 6c 65 63 74 28 70 53 75 62 73 74  bstSelect(pSubst
1f260 2c 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74  , pItem->pSelect
1f270 2c 20 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 1);.      if( 
1f280 70 49 74 65 6d 2d 3e 66 67 2e 69 73 54 61 62 46  pItem->fg.isTabF
1f290 75 6e 63 20 29 7b 0a 20 20 20 20 20 20 20 20 73  unc ){.        s
1f2a0 75 62 73 74 45 78 70 72 4c 69 73 74 28 70 53 75  ubstExprList(pSu
1f2b0 62 73 74 2c 20 70 49 74 65 6d 2d 3e 75 31 2e 70  bst, pItem->u1.p
1f2c0 46 75 6e 63 41 72 67 29 3b 0a 20 20 20 20 20 20  FuncArg);.      
1f2d0 7d 0a 20 20 20 20 7d 0a 20 20 7d 77 68 69 6c 65  }.    }.  }while
1f2e0 28 20 64 6f 50 72 69 6f 72 20 26 26 20 28 70 20  ( doPrior && (p 
1f2f0 3d 20 70 2d 3e 70 50 72 69 6f 72 29 21 3d 30 20  = p->pPrior)!=0 
1f300 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21  );.}.#endif /* !
1f310 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
1f320 4d 49 54 5f 53 55 42 51 55 45 52 59 29 20 7c 7c  MIT_SUBQUERY) ||
1f330 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
1f340 5f 4f 4d 49 54 5f 56 49 45 57 29 20 2a 2f 0a 0a  _OMIT_VIEW) */..
1f350 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
1f360 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
1f370 59 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53  Y) || !defined(S
1f380 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29  QLITE_OMIT_VIEW)
1f390 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
1f3a0 69 6e 65 20 61 74 74 65 6d 70 74 73 20 74 6f 20  ine attempts to 
1f3b0 66 6c 61 74 74 65 6e 20 73 75 62 71 75 65 72 69  flatten subqueri
1f3c0 65 73 20 61 73 20 61 20 70 65 72 66 6f 72 6d 61  es as a performa
1f3d0 6e 63 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  nce optimization
1f3e0 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  ..** This routin
1f3f0 65 20 72 65 74 75 72 6e 73 20 31 20 69 66 20 69  e returns 1 if i
1f400 74 20 6d 61 6b 65 73 20 63 68 61 6e 67 65 73 20  t makes changes 
1f410 61 6e 64 20 30 20 69 66 20 6e 6f 20 66 6c 61 74  and 0 if no flat
1f420 74 65 6e 69 6e 67 20 6f 63 63 75 72 73 2e 0a 2a  tening occurs..*
1f430 2a 0a 2a 2a 20 54 6f 20 75 6e 64 65 72 73 74 61  *.** To understa
1f440 6e 64 20 74 68 65 20 63 6f 6e 63 65 70 74 20 6f  nd the concept o
1f450 66 20 66 6c 61 74 74 65 6e 69 6e 67 2c 20 63 6f  f flattening, co
1f460 6e 73 69 64 65 72 20 74 68 65 20 66 6f 6c 6c 6f  nsider the follo
1f470 77 69 6e 67 0a 2a 2a 20 71 75 65 72 79 3a 0a 2a  wing.** query:.*
1f480 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20  *.**     SELECT 
1f490 61 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20 78  a FROM (SELECT x
1f4a0 2b 79 20 41 53 20 61 20 46 52 4f 4d 20 74 31 20  +y AS a FROM t1 
1f4b0 57 48 45 52 45 20 7a 3c 31 30 30 29 20 57 48 45  WHERE z<100) WHE
1f4c0 52 45 20 61 3e 35 0a 2a 2a 0a 2a 2a 20 54 68 65  RE a>5.**.** The
1f4d0 20 64 65 66 61 75 6c 74 20 77 61 79 20 6f 66 20   default way of 
1f4e0 69 6d 70 6c 65 6d 65 6e 74 69 6e 67 20 74 68 69  implementing thi
1f4f0 73 20 71 75 65 72 79 20 69 73 20 74 6f 20 65 78  s query is to ex
1f500 65 63 75 74 65 20 74 68 65 0a 2a 2a 20 73 75 62  ecute the.** sub
1f510 71 75 65 72 79 20 66 69 72 73 74 20 61 6e 64 20  query first and 
1f520 73 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74  store the result
1f530 73 20 69 6e 20 61 20 74 65 6d 70 6f 72 61 72 79  s in a temporary
1f540 20 74 61 62 6c 65 2c 20 74 68 65 6e 0a 2a 2a 20   table, then.** 
1f550 72 75 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75  run the outer qu
1f560 65 72 79 20 6f 6e 20 74 68 61 74 20 74 65 6d 70  ery on that temp
1f570 6f 72 61 72 79 20 74 61 62 6c 65 2e 20 20 54 68  orary table.  Th
1f580 69 73 20 72 65 71 75 69 72 65 73 20 74 77 6f 0a  is requires two.
1f590 2a 2a 20 70 61 73 73 65 73 20 6f 76 65 72 20 74  ** passes over t
1f5a0 68 65 20 64 61 74 61 2e 20 20 46 75 72 74 68 65  he data.  Furthe
1f5b0 72 6d 6f 72 65 2c 20 62 65 63 61 75 73 65 20 74  rmore, because t
1f5c0 68 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  he temporary tab
1f5d0 6c 65 0a 2a 2a 20 68 61 73 20 6e 6f 20 69 6e 64  le.** has no ind
1f5e0 69 63 65 73 2c 20 74 68 65 20 57 48 45 52 45 20  ices, the WHERE 
1f5f0 63 6c 61 75 73 65 20 6f 6e 20 74 68 65 20 6f 75  clause on the ou
1f600 74 65 72 20 71 75 65 72 79 20 63 61 6e 6e 6f 74  ter query cannot
1f610 20 62 65 0a 2a 2a 20 6f 70 74 69 6d 69 7a 65 64   be.** optimized
1f620 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
1f630 74 69 6e 65 20 61 74 74 65 6d 70 74 73 20 74 6f  tine attempts to
1f640 20 72 65 77 72 69 74 65 20 71 75 65 72 69 65 73   rewrite queries
1f650 20 73 75 63 68 20 61 73 20 74 68 65 20 61 62 6f   such as the abo
1f660 76 65 20 69 6e 74 6f 0a 2a 2a 20 61 20 73 69 6e  ve into.** a sin
1f670 67 6c 65 20 66 6c 61 74 20 73 65 6c 65 63 74 2c  gle flat select,
1f680 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a   like this:.**.*
1f690 2a 20 20 20 20 20 53 45 4c 45 43 54 20 78 2b 79  *     SELECT x+y
1f6a0 20 41 53 20 61 20 46 52 4f 4d 20 74 31 20 57 48   AS a FROM t1 WH
1f6b0 45 52 45 20 7a 3c 31 30 30 20 41 4e 44 20 61 3e  ERE z<100 AND a>
1f6c0 35 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 64 65  5.**.** The code
1f6d0 20 67 65 6e 65 72 61 74 65 64 20 66 6f 72 20 74   generated for t
1f6e0 68 69 73 20 73 69 6d 70 6c 69 66 69 63 61 74 69  his simplificati
1f6f0 6f 6e 20 67 69 76 65 73 20 74 68 65 20 73 61 6d  on gives the sam
1f700 65 20 72 65 73 75 6c 74 0a 2a 2a 20 62 75 74 20  e result.** but 
1f710 6f 6e 6c 79 20 68 61 73 20 74 6f 20 73 63 61 6e  only has to scan
1f720 20 74 68 65 20 64 61 74 61 20 6f 6e 63 65 2e 20   the data once. 
1f730 20 41 6e 64 20 62 65 63 61 75 73 65 20 69 6e 64   And because ind
1f740 69 63 65 73 20 6d 69 67 68 74 20 0a 2a 2a 20 65  ices might .** e
1f750 78 69 73 74 20 6f 6e 20 74 68 65 20 74 61 62 6c  xist on the tabl
1f760 65 20 74 31 2c 20 61 20 63 6f 6d 70 6c 65 74 65  e t1, a complete
1f770 20 73 63 61 6e 20 6f 66 20 74 68 65 20 64 61 74   scan of the dat
1f780 61 20 6d 69 67 68 74 20 62 65 0a 2a 2a 20 61 76  a might be.** av
1f790 6f 69 64 65 64 2e 0a 2a 2a 0a 2a 2a 20 46 6c 61  oided..**.** Fla
1f7a0 74 74 65 6e 69 6e 67 20 69 73 20 73 75 62 6a 65  ttening is subje
1f7b0 63 74 20 74 6f 20 74 68 65 20 66 6f 6c 6c 6f 77  ct to the follow
1f7c0 69 6e 67 20 63 6f 6e 73 74 72 61 69 6e 74 73 3a  ing constraints:
1f7d0 0a 2a 2a 0a 2a 2a 20 20 28 2a 2a 29 20 20 57 65  .**.**  (**)  We
1f7e0 20 6e 6f 20 6c 6f 6e 67 65 72 20 61 74 74 65 6d   no longer attem
1f7f0 70 74 20 74 6f 20 66 6c 61 74 74 65 6e 20 61 67  pt to flatten ag
1f800 67 72 65 67 61 74 65 20 73 75 62 71 75 65 72 69  gregate subqueri
1f810 65 73 2e 20 57 61 73 3a 0a 2a 2a 20 20 20 20 20  es. Was:.**     
1f820 20 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20     The subquery 
1f830 61 6e 64 20 74 68 65 20 6f 75 74 65 72 20 71 75  and the outer qu
1f840 65 72 79 20 63 61 6e 6e 6f 74 20 62 6f 74 68 20  ery cannot both 
1f850 62 65 20 61 67 67 72 65 67 61 74 65 73 2e 0a 2a  be aggregates..*
1f860 2a 0a 2a 2a 20 20 28 2a 2a 29 20 20 57 65 20 6e  *.**  (**)  We n
1f870 6f 20 6c 6f 6e 67 65 72 20 61 74 74 65 6d 70 74  o longer attempt
1f880 20 74 6f 20 66 6c 61 74 74 65 6e 20 61 67 67 72   to flatten aggr
1f890 65 67 61 74 65 20 73 75 62 71 75 65 72 69 65 73  egate subqueries
1f8a0 2e 20 57 61 73 3a 0a 2a 2a 20 20 20 20 20 20 20  . Was:.**       
1f8b0 20 28 32 29 20 49 66 20 74 68 65 20 73 75 62 71   (2) If the subq
1f8c0 75 65 72 79 20 69 73 20 61 6e 20 61 67 67 72 65  uery is an aggre
1f8d0 67 61 74 65 20 74 68 65 6e 0a 2a 2a 20 20 20 20  gate then.**    
1f8e0 20 20 20 20 28 32 61 29 20 74 68 65 20 6f 75 74      (2a) the out
1f8f0 65 72 20 71 75 65 72 79 20 6d 75 73 74 20 6e 6f  er query must no
1f900 74 20 62 65 20 61 20 6a 6f 69 6e 20 61 6e 64 0a  t be a join and.
1f910 2a 2a 20 20 20 20 20 20 20 20 28 32 62 29 20 74  **        (2b) t
1f920 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 6d  he outer query m
1f930 75 73 74 20 6e 6f 74 20 75 73 65 20 73 75 62 71  ust not use subq
1f940 75 65 72 69 65 73 0a 2a 2a 20 20 20 20 20 20 20  ueries.**       
1f950 20 20 20 20 20 20 6f 74 68 65 72 20 74 68 61 6e        other than
1f960 20 74 68 65 20 6f 6e 65 20 46 52 4f 4d 2d 63 6c   the one FROM-cl
1f970 61 75 73 65 20 73 75 62 71 75 65 72 79 20 74 68  ause subquery th
1f980 61 74 20 69 73 20 61 20 63 61 6e 64 69 64 61 74  at is a candidat
1f990 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  e.**            
1f9a0 20 66 6f 72 20 66 6c 61 74 74 65 6e 69 6e 67 2e   for flattening.
1f9b0 20 20 28 54 68 69 73 20 69 73 20 64 75 65 20 74    (This is due t
1f9c0 6f 20 74 69 63 6b 65 74 20 5b 32 66 37 31 37 30  o ticket [2f7170
1f9d0 64 37 33 62 66 39 61 62 66 38 30 5d 0a 2a 2a 20  d73bf9abf80].** 
1f9e0 20 20 20 20 20 20 20 20 20 20 20 20 66 72 6f 6d              from
1f9f0 20 32 30 31 35 2d 30 32 2d 30 39 2e 29 0a 2a 2a   2015-02-09.).**
1fa00 0a 2a 2a 20 20 20 28 33 29 20 20 49 66 20 74 68  .**   (3)  If th
1fa10 65 20 73 75 62 71 75 65 72 79 20 69 73 20 74 68  e subquery is th
1fa20 65 20 72 69 67 68 74 20 6f 70 65 72 61 6e 64 20  e right operand 
1fa30 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e 20 74  of a LEFT JOIN t
1fa40 68 65 6e 0a 2a 2a 20 20 20 20 20 20 20 20 28 33  hen.**        (3
1fa50 61 29 20 74 68 65 20 73 75 62 71 75 65 72 79 20  a) the subquery 
1fa60 6d 61 79 20 6e 6f 74 20 62 65 20 61 20 6a 6f 69  may not be a joi
1fa70 6e 20 61 6e 64 0a 2a 2a 20 20 20 20 20 20 20 20  n and.**        
1fa80 28 33 62 29 20 74 68 65 20 46 52 4f 4d 20 63 6c  (3b) the FROM cl
1fa90 61 75 73 65 20 6f 66 20 74 68 65 20 73 75 62 71  ause of the subq
1faa0 75 65 72 79 20 6d 61 79 20 6e 6f 74 20 63 6f 6e  uery may not con
1fab0 74 61 69 6e 20 61 20 76 69 72 74 75 61 6c 0a 2a  tain a virtual.*
1fac0 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 74 61  *             ta
1fad0 62 6c 65 20 61 6e 64 0a 2a 2a 20 20 20 20 20 20  ble and.**      
1fae0 20 20 28 33 63 29 20 74 68 65 20 6f 75 74 65 72    (3c) the outer
1faf0 20 71 75 65 72 79 20 6d 61 79 20 6e 6f 74 20 62   query may not b
1fb00 65 20 61 6e 20 61 67 67 72 65 67 61 74 65 2e 0a  e an aggregate..
1fb10 2a 2a 0a 2a 2a 20 20 20 28 34 29 20 20 54 68 65  **.**   (4)  The
1fb20 20 73 75 62 71 75 65 72 79 20 63 61 6e 20 6e 6f   subquery can no
1fb30 74 20 62 65 20 44 49 53 54 49 4e 43 54 2e 0a 2a  t be DISTINCT..*
1fb40 2a 0a 2a 2a 20 20 28 2a 2a 29 20 20 41 74 20 6f  *.**  (**)  At o
1fb50 6e 65 20 70 6f 69 6e 74 20 72 65 73 74 72 69 63  ne point restric
1fb60 74 69 6f 6e 73 20 28 34 29 20 61 6e 64 20 28 35  tions (4) and (5
1fb70 29 20 64 65 66 69 6e 65 64 20 61 20 73 75 62 73  ) defined a subs
1fb80 65 74 20 6f 66 20 44 49 53 54 49 4e 43 54 0a 2a  et of DISTINCT.*
1fb90 2a 20 20 20 20 20 20 20 20 73 75 62 2d 71 75 65  *        sub-que
1fba0 72 69 65 73 20 74 68 61 74 20 77 65 72 65 20 65  ries that were e
1fbb0 78 63 6c 75 64 65 64 20 66 72 6f 6d 20 74 68 69  xcluded from thi
1fbc0 73 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 20  s optimization. 
1fbd0 52 65 73 74 72 69 63 74 69 6f 6e 20 0a 2a 2a 20  Restriction .** 
1fbe0 20 20 20 20 20 20 20 28 34 29 20 68 61 73 20 73         (4) has s
1fbf0 69 6e 63 65 20 62 65 65 6e 20 65 78 70 61 6e 64  ince been expand
1fc00 65 64 20 74 6f 20 65 78 63 6c 75 64 65 20 61 6c  ed to exclude al
1fc10 6c 20 44 49 53 54 49 4e 43 54 20 73 75 62 71 75  l DISTINCT subqu
1fc20 65 72 69 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 28 2a  eries..**.**  (*
1fc30 2a 29 20 20 57 65 20 6e 6f 20 6c 6f 6e 67 65 72  *)  We no longer
1fc40 20 61 74 74 65 6d 70 74 20 74 6f 20 66 6c 61 74   attempt to flat
1fc50 74 65 6e 20 61 67 67 72 65 67 61 74 65 20 73 75  ten aggregate su
1fc60 62 71 75 65 72 69 65 73 2e 20 20 57 61 73 3a 0a  bqueries.  Was:.
1fc70 2a 2a 20 20 20 20 20 20 20 20 49 66 20 74 68 65  **        If the
1fc80 20 73 75 62 71 75 65 72 79 20 69 73 20 61 67 67   subquery is agg
1fc90 72 65 67 61 74 65 2c 20 74 68 65 20 6f 75 74 65  regate, the oute
1fca0 72 20 71 75 65 72 79 20 6d 61 79 20 6e 6f 74 20  r query may not 
1fcb0 62 65 20 44 49 53 54 49 4e 43 54 2e 0a 2a 2a 0a  be DISTINCT..**.
1fcc0 2a 2a 20 20 20 28 37 29 20 20 54 68 65 20 73 75  **   (7)  The su
1fcd0 62 71 75 65 72 79 20 6d 75 73 74 20 68 61 76 65  bquery must have
1fce0 20 61 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20   a FROM clause. 
1fcf0 20 54 4f 44 4f 3a 20 20 46 6f 72 20 73 75 62 71   TODO:  For subq
1fd00 75 65 72 69 65 73 20 77 69 74 68 6f 75 74 0a 2a  ueries without.*
1fd10 2a 20 20 20 20 20 20 20 20 41 20 46 52 4f 4d 20  *        A FROM 
1fd20 63 6c 61 75 73 65 2c 20 63 6f 6e 73 69 64 65 72  clause, consider
1fd30 20 61 64 64 69 6e 67 20 61 20 46 52 4f 4d 20 63   adding a FROM c
1fd40 6c 61 75 73 65 20 77 69 74 68 20 74 68 65 20 73  lause with the s
1fd50 70 65 63 69 61 6c 0a 2a 2a 20 20 20 20 20 20 20  pecial.**       
1fd60 20 74 61 62 6c 65 20 73 71 6c 69 74 65 5f 6f 6e   table sqlite_on
1fd70 63 65 20 74 68 61 74 20 63 6f 6e 73 69 73 74 73  ce that consists
1fd80 20 6f 66 20 61 20 73 69 6e 67 6c 65 20 72 6f 77   of a single row
1fd90 20 63 6f 6e 74 61 69 6e 69 6e 67 20 61 0a 2a 2a   containing a.**
1fda0 20 20 20 20 20 20 20 20 73 69 6e 67 6c 65 20 4e          single N
1fdb0 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 38 29  ULL..**.**   (8)
1fdc0 20 20 49 66 20 74 68 65 20 73 75 62 71 75 65 72    If the subquer
1fdd0 79 20 75 73 65 73 20 4c 49 4d 49 54 20 74 68 65  y uses LIMIT the
1fde0 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  n the outer quer
1fdf0 79 20 6d 61 79 20 6e 6f 74 20 62 65 20 61 20 6a  y may not be a j
1fe00 6f 69 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 39 29  oin..**.**   (9)
1fe10 20 20 49 66 20 74 68 65 20 73 75 62 71 75 65 72    If the subquer
1fe20 79 20 75 73 65 73 20 4c 49 4d 49 54 20 74 68 65  y uses LIMIT the
1fe30 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  n the outer quer
1fe40 79 20 6d 61 79 20 6e 6f 74 20 62 65 20 61 67 67  y may not be agg
1fe50 72 65 67 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 20 28  regate..**.**  (
1fe60 2a 2a 29 20 20 52 65 73 74 72 69 63 74 69 6f 6e  **)  Restriction
1fe70 20 28 31 30 29 20 77 61 73 20 72 65 6d 6f 76 65   (10) was remove
1fe80 64 20 66 72 6f 6d 20 74 68 65 20 63 6f 64 65 20  d from the code 
1fe90 6f 6e 20 32 30 30 35 2d 30 32 2d 30 35 20 62 75  on 2005-02-05 bu
1fea0 74 20 77 65 0a 2a 2a 20 20 20 20 20 20 20 20 61  t we.**        a
1feb0 63 63 69 64 65 6e 74 6c 79 20 63 61 72 72 69 65  ccidently carrie
1fec0 64 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20 66 6f  d the comment fo
1fed0 72 77 61 72 64 20 75 6e 74 69 6c 20 32 30 31 34  rward until 2014
1fee0 2d 30 39 2d 31 35 2e 20 20 4f 72 69 67 69 6e 61  -09-15.  Origina
1fef0 6c 0a 2a 2a 20 20 20 20 20 20 20 20 63 6f 6e 73  l.**        cons
1ff00 74 72 61 69 6e 74 3a 20 22 49 66 20 74 68 65 20  traint: "If the 
1ff10 73 75 62 71 75 65 72 79 20 69 73 20 61 67 67 72  subquery is aggr
1ff20 65 67 61 74 65 20 74 68 65 6e 20 74 68 65 20 6f  egate then the o
1ff30 75 74 65 72 20 71 75 65 72 79 20 0a 2a 2a 20 20  uter query .**  
1ff40 20 20 20 20 20 20 6d 61 79 20 6e 6f 74 20 75 73        may not us
1ff50 65 20 4c 49 4d 49 54 2e 22 0a 2a 2a 0a 2a 2a 20  e LIMIT.".**.** 
1ff60 20 28 31 31 29 20 20 54 68 65 20 73 75 62 71 75   (11)  The subqu
1ff70 65 72 79 20 61 6e 64 20 74 68 65 20 6f 75 74 65  ery and the oute
1ff80 72 20 71 75 65 72 79 20 6d 61 79 20 6e 6f 74 20  r query may not 
1ff90 62 6f 74 68 20 68 61 76 65 20 4f 52 44 45 52 20  both have ORDER 
1ffa0 42 59 20 63 6c 61 75 73 65 73 2e 0a 2a 2a 0a 2a  BY clauses..**.*
1ffb0 2a 20 20 28 2a 2a 29 20 20 4e 6f 74 20 69 6d 70  *  (**)  Not imp
1ffc0 6c 65 6d 65 6e 74 65 64 2e 20 20 53 75 62 73 75  lemented.  Subsu
1ffd0 6d 65 64 20 69 6e 74 6f 20 72 65 73 74 72 69 63  med into restric
1ffe0 74 69 6f 6e 20 28 33 29 2e 20 20 57 61 73 20 70  tion (3).  Was p
1fff0 72 65 76 69 6f 75 73 6c 79 0a 2a 2a 20 20 20 20  reviously.**    
20000 20 20 20 20 61 20 73 65 70 61 72 61 74 65 20 72      a separate r
20010 65 73 74 72 69 63 74 69 6f 6e 20 64 65 72 69 76  estriction deriv
20020 69 6e 67 20 66 72 6f 6d 20 74 69 63 6b 65 74 20  ing from ticket 
20030 23 33 35 30 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 33  #350..**.**  (13
20040 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20  )  The subquery 
20050 61 6e 64 20 6f 75 74 65 72 20 71 75 65 72 79 20  and outer query 
20060 6d 61 79 20 6e 6f 74 20 62 6f 74 68 20 75 73 65  may not both use
20070 20 4c 49 4d 49 54 2e 0a 2a 2a 0a 2a 2a 20 20 28   LIMIT..**.**  (
20080 31 34 29 20 20 54 68 65 20 73 75 62 71 75 65 72  14)  The subquer
20090 79 20 6d 61 79 20 6e 6f 74 20 75 73 65 20 4f 46  y may not use OF
200a0 46 53 45 54 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 35  FSET..**.**  (15
200b0 29 20 20 49 66 20 74 68 65 20 6f 75 74 65 72 20  )  If the outer 
200c0 71 75 65 72 79 20 69 73 20 70 61 72 74 20 6f 66  query is part of
200d0 20 61 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65   a compound sele
200e0 63 74 2c 20 74 68 65 6e 20 74 68 65 0a 2a 2a 20  ct, then the.** 
200f0 20 20 20 20 20 20 20 73 75 62 71 75 65 72 79 20         subquery 
20100 6d 61 79 20 6e 6f 74 20 75 73 65 20 4c 49 4d 49  may not use LIMI
20110 54 2e 0a 2a 2a 20 20 20 20 20 20 20 20 28 53 65  T..**        (Se
20120 65 20 74 69 63 6b 65 74 20 23 32 33 33 39 20 61  e ticket #2339 a
20130 6e 64 20 74 69 63 6b 65 74 20 5b 30 32 61 38 65  nd ticket [02a8e
20140 38 31 64 34 34 5d 29 2e 0a 2a 2a 0a 2a 2a 20 20  81d44])..**.**  
20150 28 31 36 29 20 20 49 66 20 74 68 65 20 6f 75 74  (16)  If the out
20160 65 72 20 71 75 65 72 79 20 69 73 20 61 67 67 72  er query is aggr
20170 65 67 61 74 65 2c 20 74 68 65 6e 20 74 68 65 20  egate, then the 
20180 73 75 62 71 75 65 72 79 20 6d 61 79 20 6e 6f 74  subquery may not
20190 0a 2a 2a 20 20 20 20 20 20 20 20 75 73 65 20 4f  .**        use O
201a0 52 44 45 52 20 42 59 2e 20 20 28 54 69 63 6b 65  RDER BY.  (Ticke
201b0 74 20 23 32 39 34 32 29 20 20 54 68 69 73 20 75  t #2942)  This u
201c0 73 65 64 20 74 6f 20 6e 6f 74 20 6d 61 74 74 65  sed to not matte
201d0 72 0a 2a 2a 20 20 20 20 20 20 20 20 75 6e 74 69  r.**        unti
201e0 6c 20 77 65 20 69 6e 74 72 6f 64 75 63 65 64 20  l we introduced 
201f0 74 68 65 20 67 72 6f 75 70 5f 63 6f 6e 63 61 74  the group_concat
20200 28 29 20 66 75 6e 63 74 69 6f 6e 2e 20 20 0a 2a  () function.  .*
20210 2a 0a 2a 2a 20 20 28 31 37 29 20 20 49 66 20 74  *.**  (17)  If t
20220 68 65 20 73 75 62 71 75 65 72 79 20 69 73 20 61  he subquery is a
20230 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74   compound select
20240 2c 20 74 68 65 6e 0a 2a 2a 20 20 20 20 20 20 20  , then.**       
20250 20 28 31 37 61 29 20 61 6c 6c 20 63 6f 6d 70 6f   (17a) all compo
20260 75 6e 64 20 6f 70 65 72 61 74 6f 72 73 20 6d 75  und operators mu
20270 73 74 20 62 65 20 61 20 55 4e 49 4f 4e 20 41 4c  st be a UNION AL
20280 4c 2c 20 61 6e 64 0a 2a 2a 20 20 20 20 20 20 20  L, and.**       
20290 20 28 31 37 62 29 20 6e 6f 20 74 65 72 6d 73 20   (17b) no terms 
202a0 77 69 74 68 69 6e 20 74 68 65 20 73 75 62 71 75  within the subqu
202b0 65 72 79 20 63 6f 6d 70 6f 75 6e 64 20 6d 61 79  ery compound may
202c0 20 62 65 20 61 67 67 72 65 67 61 74 65 0a 2a 2a   be aggregate.**
202d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 72                or
202e0 20 44 49 53 54 49 4e 43 54 2c 20 61 6e 64 0a 2a   DISTINCT, and.*
202f0 2a 20 20 20 20 20 20 20 20 28 31 37 63 29 20 65  *        (17c) e
20300 76 65 72 79 20 74 65 72 6d 20 77 69 74 68 69 6e  very term within
20310 20 74 68 65 20 73 75 62 71 75 65 72 79 20 63 6f   the subquery co
20320 6d 70 6f 75 6e 64 20 6d 75 73 74 20 68 61 76 65  mpound must have
20330 20 61 20 46 52 4f 4d 20 63 6c 61 75 73 65 0a 2a   a FROM clause.*
20340 2a 20 20 20 20 20 20 20 20 28 31 37 64 29 20 74  *        (17d) t
20350 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 6d  he outer query m
20360 61 79 20 6e 6f 74 20 62 65 0a 2a 2a 20 20 20 20  ay not be.**    
20370 20 20 20 20 20 20 20 20 20 20 28 31 37 64 31 29            (17d1)
20380 20 61 67 67 72 65 67 61 74 65 2c 20 6f 72 0a 2a   aggregate, or.*
20390 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28  *              (
203a0 31 37 64 32 29 20 44 49 53 54 49 4e 43 54 2c 20  17d2) DISTINCT, 
203b0 6f 72 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  or.**           
203c0 20 20 20 28 31 37 64 33 29 20 61 20 6a 6f 69 6e     (17d3) a join
203d0 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 54  ..**.**        T
203e0 68 65 20 70 61 72 65 6e 74 20 61 6e 64 20 73 75  he parent and su
203f0 62 2d 71 75 65 72 79 20 6d 61 79 20 63 6f 6e 74  b-query may cont
20400 61 69 6e 20 57 48 45 52 45 20 63 6c 61 75 73 65  ain WHERE clause
20410 73 2e 20 53 75 62 6a 65 63 74 20 74 6f 0a 2a 2a  s. Subject to.**
20420 20 20 20 20 20 20 20 20 72 75 6c 65 73 20 28 31          rules (1
20430 31 29 2c 20 28 31 33 29 20 61 6e 64 20 28 31 34  1), (13) and (14
20440 29 2c 20 74 68 65 79 20 6d 61 79 20 61 6c 73 6f  ), they may also
20450 20 63 6f 6e 74 61 69 6e 20 4f 52 44 45 52 20 42   contain ORDER B
20460 59 2c 0a 2a 2a 20 20 20 20 20 20 20 20 4c 49 4d  Y,.**        LIM
20470 49 54 20 61 6e 64 20 4f 46 46 53 45 54 20 63 6c  IT and OFFSET cl
20480 61 75 73 65 73 2e 20 20 54 68 65 20 73 75 62 71  auses.  The subq
20490 75 65 72 79 20 63 61 6e 6e 6f 74 20 75 73 65 20  uery cannot use 
204a0 61 6e 79 20 63 6f 6d 70 6f 75 6e 64 0a 2a 2a 20  any compound.** 
204b0 20 20 20 20 20 20 20 6f 70 65 72 61 74 6f 72 20         operator 
204c0 6f 74 68 65 72 20 74 68 61 6e 20 55 4e 49 4f 4e  other than UNION
204d0 20 41 4c 4c 20 62 65 63 61 75 73 65 20 61 6c 6c   ALL because all
204e0 20 74 68 65 20 6f 74 68 65 72 20 63 6f 6d 70 6f   the other compo
204f0 75 6e 64 0a 2a 2a 20 20 20 20 20 20 20 20 6f 70  und.**        op
20500 65 72 61 74 6f 72 73 20 68 61 76 65 20 61 6e 20  erators have an 
20510 69 6d 70 6c 69 65 64 20 44 49 53 54 49 4e 43 54  implied DISTINCT
20520 20 77 68 69 63 68 20 69 73 20 64 69 73 61 6c 6c   which is disall
20530 6f 77 65 64 20 62 79 0a 2a 2a 20 20 20 20 20 20  owed by.**      
20540 20 20 72 65 73 74 72 69 63 74 69 6f 6e 20 28 34    restriction (4
20550 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20  )..**.**        
20560 41 6c 73 6f 2c 20 65 61 63 68 20 63 6f 6d 70 6f  Also, each compo
20570 6e 65 6e 74 20 6f 66 20 74 68 65 20 73 75 62 2d  nent of the sub-
20580 71 75 65 72 79 20 6d 75 73 74 20 72 65 74 75 72  query must retur
20590 6e 20 74 68 65 20 73 61 6d 65 20 6e 75 6d 62 65  n the same numbe
205a0 72 0a 2a 2a 20 20 20 20 20 20 20 20 6f 66 20 72  r.**        of r
205b0 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 2e 20 54  esult columns. T
205c0 68 69 73 20 69 73 20 61 63 74 75 61 6c 6c 79 20  his is actually 
205d0 61 20 72 65 71 75 69 72 65 6d 65 6e 74 20 66 6f  a requirement fo
205e0 72 20 61 6e 79 20 63 6f 6d 70 6f 75 6e 64 0a 2a  r any compound.*
205f0 2a 20 20 20 20 20 20 20 20 53 45 4c 45 43 54 20  *        SELECT 
20600 73 74 61 74 65 6d 65 6e 74 2c 20 62 75 74 20 61  statement, but a
20610 6c 6c 20 74 68 65 20 63 6f 64 65 20 68 65 72 65  ll the code here
20620 20 64 6f 65 73 20 69 73 20 6d 61 6b 65 20 73 75   does is make su
20630 72 65 20 74 68 61 74 20 6e 6f 0a 2a 2a 20 20 20  re that no.**   
20640 20 20 20 20 20 73 75 63 68 20 28 69 6c 6c 65 67       such (illeg
20650 61 6c 29 20 73 75 62 2d 71 75 65 72 79 20 69 73  al) sub-query is
20660 20 66 6c 61 74 74 65 6e 65 64 2e 20 54 68 65 20   flattened. The 
20670 63 61 6c 6c 65 72 20 77 69 6c 6c 20 64 65 74 65  caller will dete
20680 63 74 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20  ct the.**       
20690 20 73 79 6e 74 61 78 20 65 72 72 6f 72 20 61 6e   syntax error an
206a0 64 20 72 65 74 75 72 6e 20 61 20 64 65 74 61 69  d return a detai
206b0 6c 65 64 20 6d 65 73 73 61 67 65 2e 0a 2a 2a 0a  led message..**.
206c0 2a 2a 20 20 28 31 38 29 20 20 49 66 20 74 68 65  **  (18)  If the
206d0 20 73 75 62 2d 71 75 65 72 79 20 69 73 20 61 20   sub-query is a 
206e0 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 2c  compound select,
206f0 20 74 68 65 6e 20 61 6c 6c 20 74 65 72 6d 73 20   then all terms 
20700 6f 66 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20  of the.**       
20710 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
20720 20 6f 66 20 74 68 65 20 70 61 72 65 6e 74 20 6d   of the parent m
20730 75 73 74 20 62 65 20 73 69 6d 70 6c 65 20 72 65  ust be simple re
20740 66 65 72 65 6e 63 65 73 20 74 6f 20 0a 2a 2a 20  ferences to .** 
20750 20 20 20 20 20 20 20 63 6f 6c 75 6d 6e 73 20 6f         columns o
20760 66 20 74 68 65 20 73 75 62 2d 71 75 65 72 79 2e  f the sub-query.
20770 0a 2a 2a 0a 2a 2a 20 20 28 31 39 29 20 20 49 66  .**.**  (19)  If
20780 20 74 68 65 20 73 75 62 71 75 65 72 79 20 75 73   the subquery us
20790 65 73 20 4c 49 4d 49 54 20 74 68 65 6e 20 74 68  es LIMIT then th
207a0 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 6d 61  e outer query ma
207b0 79 20 6e 6f 74 0a 2a 2a 20 20 20 20 20 20 20 20  y not.**        
207c0 68 61 76 65 20 61 20 57 48 45 52 45 20 63 6c 61  have a WHERE cla
207d0 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 20 28 32 30 29  use..**.**  (20)
207e0 20 20 49 66 20 74 68 65 20 73 75 62 2d 71 75 65    If the sub-que
207f0 72 79 20 69 73 20 61 20 63 6f 6d 70 6f 75 6e 64  ry is a compound
20800 20 73 65 6c 65 63 74 2c 20 74 68 65 6e 20 69 74   select, then it
20810 20 6d 75 73 74 20 6e 6f 74 20 75 73 65 0a 2a 2a   must not use.**
20820 20 20 20 20 20 20 20 20 61 6e 20 4f 52 44 45 52          an ORDER
20830 20 42 59 20 63 6c 61 75 73 65 2e 20 20 54 69 63   BY clause.  Tic
20840 6b 65 74 20 23 33 37 37 33 2e 20 20 57 65 20 63  ket #3773.  We c
20850 6f 75 6c 64 20 72 65 6c 61 78 20 74 68 69 73 20  ould relax this 
20860 63 6f 6e 73 74 72 61 69 6e 74 0a 2a 2a 20 20 20  constraint.**   
20870 20 20 20 20 20 73 6f 6d 65 77 68 61 74 20 62 79       somewhat by
20880 20 73 61 79 69 6e 67 20 74 68 61 74 20 74 68 65   saying that the
20890 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 4f 52   terms of the OR
208a0 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 6d 75  DER BY clause mu
208b0 73 74 0a 2a 2a 20 20 20 20 20 20 20 20 61 70 70  st.**        app
208c0 65 61 72 20 61 73 20 75 6e 6d 6f 64 69 66 69 65  ear as unmodifie
208d0 64 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73  d result columns
208e0 20 69 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75   in the outer qu
208f0 65 72 79 2e 20 20 42 75 74 20 77 65 0a 2a 2a 20  ery.  But we.** 
20900 20 20 20 20 20 20 20 68 61 76 65 20 6f 74 68 65         have othe
20910 72 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20  r optimizations 
20920 69 6e 20 6d 69 6e 64 20 74 6f 20 64 65 61 6c 20  in mind to deal 
20930 77 69 74 68 20 74 68 61 74 20 63 61 73 65 2e 0a  with that case..
20940 2a 2a 0a 2a 2a 20 20 28 32 31 29 20 20 49 66 20  **.**  (21)  If 
20950 74 68 65 20 73 75 62 71 75 65 72 79 20 75 73 65  the subquery use
20960 73 20 4c 49 4d 49 54 20 74 68 65 6e 20 74 68 65  s LIMIT then the
20970 20 6f 75 74 65 72 20 71 75 65 72 79 20 6d 61 79   outer query may
20980 20 6e 6f 74 20 62 65 0a 2a 2a 20 20 20 20 20 20   not be.**      
20990 20 20 44 49 53 54 49 4e 43 54 2e 20 20 28 53 65    DISTINCT.  (Se
209a0 65 20 74 69 63 6b 65 74 20 5b 37 35 32 65 31 36  e ticket [752e16
209b0 34 36 66 63 5d 29 2e 0a 2a 2a 0a 2a 2a 20 20 28  46fc])..**.**  (
209c0 32 32 29 20 20 54 68 65 20 73 75 62 71 75 65 72  22)  The subquer
209d0 79 20 6d 61 79 20 6e 6f 74 20 62 65 20 61 20 72  y may not be a r
209e0 65 63 75 72 73 69 76 65 20 43 54 45 2e 0a 2a 2a  ecursive CTE..**
209f0 0a 2a 2a 20 20 28 2a 2a 29 20 20 53 75 62 73 75  .**  (**)  Subsu
20a00 6d 65 64 20 69 6e 74 6f 20 72 65 73 74 72 69 63  med into restric
20a10 74 69 6f 6e 20 28 31 37 64 33 29 2e 20 20 57 61  tion (17d3).  Wa
20a20 73 3a 20 49 66 20 74 68 65 20 6f 75 74 65 72 20  s: If the outer 
20a30 71 75 65 72 79 20 69 73 0a 2a 2a 20 20 20 20 20  query is.**     
20a40 20 20 20 61 20 72 65 63 75 72 73 69 76 65 20 43     a recursive C
20a50 54 45 2c 20 74 68 65 6e 20 74 68 65 20 73 75 62  TE, then the sub
20a60 2d 71 75 65 72 79 20 6d 61 79 20 6e 6f 74 20 62  -query may not b
20a70 65 20 61 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65  e a compound que
20a80 72 79 2e 0a 2a 2a 20 20 20 20 20 20 20 20 54 68  ry..**        Th
20a90 69 73 20 72 65 73 74 72 69 63 74 69 6f 6e 20 69  is restriction i
20aa0 73 20 62 65 63 61 75 73 65 20 74 72 61 6e 73 66  s because transf
20ab0 6f 72 6d 69 6e 67 20 74 68 65 0a 2a 2a 20 20 20  orming the.**   
20ac0 20 20 20 20 20 70 61 72 65 6e 74 20 74 6f 20 61       parent to a
20ad0 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79 20   compound query 
20ae0 63 6f 6e 66 75 73 65 73 20 74 68 65 20 63 6f 64  confuses the cod
20af0 65 20 74 68 61 74 20 68 61 6e 64 6c 65 73 0a 2a  e that handles.*
20b00 2a 20 20 20 20 20 20 20 20 72 65 63 75 72 73 69  *        recursi
20b10 76 65 20 71 75 65 72 69 65 73 20 69 6e 20 6d 75  ve queries in mu
20b20 6c 74 69 53 65 6c 65 63 74 28 29 2e 0a 2a 2a 0a  ltiSelect()..**.
20b30 2a 2a 20 20 28 2a 2a 29 20 20 57 65 20 6e 6f 20  **  (**)  We no 
20b40 6c 6f 6e 67 65 72 20 61 74 74 65 6d 70 74 20 74  longer attempt t
20b50 6f 20 66 6c 61 74 74 65 6e 20 61 67 67 72 65 67  o flatten aggreg
20b60 61 74 65 20 73 75 62 71 75 65 72 69 65 73 2e 20  ate subqueries. 
20b70 20 57 61 73 3a 0a 2a 2a 20 20 20 20 20 20 20 20   Was:.**        
20b80 54 68 65 20 73 75 62 71 75 65 72 79 20 6d 61 79  The subquery may
20b90 20 6e 6f 74 20 62 65 20 61 6e 20 61 67 67 72 65   not be an aggre
20ba0 67 61 74 65 20 74 68 61 74 20 75 73 65 73 20 74  gate that uses t
20bb0 68 65 20 62 75 69 6c 74 2d 69 6e 20 6d 69 6e 28  he built-in min(
20bc0 29 20 6f 72 20 0a 2a 2a 20 20 20 20 20 20 20 20  ) or .**        
20bd0 6f 72 20 6d 61 78 28 29 20 66 75 6e 63 74 69 6f  or max() functio
20be0 6e 73 2e 20 20 28 57 69 74 68 6f 75 74 20 74 68  ns.  (Without th
20bf0 69 73 20 72 65 73 74 72 69 63 74 69 6f 6e 2c 20  is restriction, 
20c00 61 20 71 75 65 72 79 20 6c 69 6b 65 3a 0a 2a 2a  a query like:.**
20c10 20 20 20 20 20 20 20 20 22 53 45 4c 45 43 54 20          "SELECT 
20c20 78 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20 6d  x FROM (SELECT m
20c30 61 78 28 79 29 2c 20 78 20 46 52 4f 4d 20 74 31  ax(y), x FROM t1
20c40 29 22 20 77 6f 75 6c 64 20 6e 6f 74 20 6e 65 63  )" would not nec
20c50 65 73 73 61 72 69 6c 79 0a 2a 2a 20 20 20 20 20  essarily.**     
20c60 20 20 20 72 65 74 75 72 6e 20 74 68 65 20 76 61     return the va
20c70 6c 75 65 20 58 20 66 6f 72 20 77 68 69 63 68 20  lue X for which 
20c80 59 20 77 61 73 20 6d 61 78 69 6d 61 6c 2e 29 0a  Y was maximal.).
20c90 2a 2a 0a 2a 2a 20 20 28 32 35 29 20 20 49 66 20  **.**  (25)  If 
20ca0 65 69 74 68 65 72 20 74 68 65 20 73 75 62 71 75  either the subqu
20cb0 65 72 79 20 6f 72 20 74 68 65 20 70 61 72 65 6e  ery or the paren
20cc0 74 20 71 75 65 72 79 20 63 6f 6e 74 61 69 6e 73  t query contains
20cd0 20 61 20 77 69 6e 64 6f 77 0a 2a 2a 20 20 20 20   a window.**    
20ce0 20 20 20 20 66 75 6e 63 74 69 6f 6e 20 69 6e 20      function in 
20cf0 74 68 65 20 73 65 6c 65 63 74 20 6c 69 73 74 20  the select list 
20d00 6f 72 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  or ORDER BY clau
20d10 73 65 2c 20 66 6c 61 74 74 65 6e 69 6e 67 0a 2a  se, flattening.*
20d20 2a 20 20 20 20 20 20 20 20 69 73 20 6e 6f 74 20  *        is not 
20d30 61 74 74 65 6d 70 74 65 64 2e 0a 2a 2a 0a 2a 2a  attempted..**.**
20d40 0a 2a 2a 20 49 6e 20 74 68 69 73 20 72 6f 75 74  .** In this rout
20d50 69 6e 65 2c 20 74 68 65 20 22 70 22 20 70 61 72  ine, the "p" par
20d60 61 6d 65 74 65 72 20 69 73 20 61 20 70 6f 69 6e  ameter is a poin
20d70 74 65 72 20 74 6f 20 74 68 65 20 6f 75 74 65 72  ter to the outer
20d80 20 71 75 65 72 79 2e 0a 2a 2a 20 54 68 65 20 73   query..** The s
20d90 75 62 71 75 65 72 79 20 69 73 20 70 2d 3e 70 53  ubquery is p->pS
20da0 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d 2e 20 20 69  rc->a[iFrom].  i
20db0 73 41 67 67 20 69 73 20 74 72 75 65 20 69 66 20  sAgg is true if 
20dc0 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 0a  the outer query.
20dd0 2a 2a 20 75 73 65 73 20 61 67 67 72 65 67 61 74  ** uses aggregat
20de0 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 66 6c 61  es..**.** If fla
20df0 74 74 65 6e 69 6e 67 20 69 73 20 6e 6f 74 20 61  ttening is not a
20e00 74 74 65 6d 70 74 65 64 2c 20 74 68 69 73 20 72  ttempted, this r
20e10 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f  outine is a no-o
20e20 70 20 61 6e 64 20 72 65 74 75 72 6e 73 20 30 2e  p and returns 0.
20e30 0a 2a 2a 20 49 66 20 66 6c 61 74 74 65 6e 69 6e  .** If flattenin
20e40 67 20 69 73 20 61 74 74 65 6d 70 74 65 64 20 74  g is attempted t
20e50 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75  his routine retu
20e60 72 6e 73 20 31 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c  rns 1..**.** All
20e70 20 6f 66 20 74 68 65 20 65 78 70 72 65 73 73 69   of the expressi
20e80 6f 6e 20 61 6e 61 6c 79 73 69 73 20 6d 75 73 74  on analysis must
20e90 20 6f 63 63 75 72 20 6f 6e 20 62 6f 74 68 20 74   occur on both t
20ea0 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 61  he outer query a
20eb0 6e 64 0a 2a 2a 20 74 68 65 20 73 75 62 71 75 65  nd.** the subque
20ec0 72 79 20 62 65 66 6f 72 65 20 74 68 69 73 20 72  ry before this r
20ed0 6f 75 74 69 6e 65 20 72 75 6e 73 2e 0a 2a 2f 0a  outine runs..*/.
20ee0 73 74 61 74 69 63 20 69 6e 74 20 66 6c 61 74 74  static int flatt
20ef0 65 6e 53 75 62 71 75 65 72 79 28 0a 20 20 50 61  enSubquery(.  Pa
20f00 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
20f10 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
20f20 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63  ntext */.  Selec
20f30 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  t *p,           
20f40 2f 2a 20 54 68 65 20 70 61 72 65 6e 74 20 6f 72  /* The parent or
20f50 20 6f 75 74 65 72 20 53 45 4c 45 43 54 20 73 74   outer SELECT st
20f60 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74  atement */.  int
20f70 20 69 46 72 6f 6d 2c 20 20 20 20 20 20 20 20 20   iFrom,         
20f80 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e 20 70 2d    /* Index in p-
20f90 3e 70 53 72 63 2d 3e 61 5b 5d 20 6f 66 20 74 68  >pSrc->a[] of th
20fa0 65 20 69 6e 6e 65 72 20 73 75 62 71 75 65 72 79  e inner subquery
20fb0 20 2a 2f 0a 20 20 69 6e 74 20 69 73 41 67 67 20   */.  int isAgg 
20fc0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
20fd0 75 65 20 69 66 20 6f 75 74 65 72 20 53 45 4c 45  ue if outer SELE
20fe0 43 54 20 75 73 65 73 20 61 67 67 72 65 67 61 74  CT uses aggregat
20ff0 65 20 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 29  e functions */.)
21000 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  {.  const char *
21010 7a 53 61 76 65 64 41 75 74 68 43 6f 6e 74 65 78  zSavedAuthContex
21020 74 20 3d 20 70 50 61 72 73 65 2d 3e 7a 41 75 74  t = pParse->zAut
21030 68 43 6f 6e 74 65 78 74 3b 0a 20 20 53 65 6c 65  hContext;.  Sele
21040 63 74 20 2a 70 50 61 72 65 6e 74 3b 20 20 20 20  ct *pParent;    
21050 2f 2a 20 43 75 72 72 65 6e 74 20 55 4e 49 4f 4e  /* Current UNION
21060 20 41 4c 4c 20 74 65 72 6d 20 6f 66 20 74 68 65   ALL term of the
21070 20 6f 74 68 65 72 20 71 75 65 72 79 20 2a 2f 0a   other query */.
21080 20 20 53 65 6c 65 63 74 20 2a 70 53 75 62 3b 20    Select *pSub; 
21090 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 6e        /* The inn
210a0 65 72 20 71 75 65 72 79 20 6f 72 20 22 73 75 62  er query or "sub
210b0 71 75 65 72 79 22 20 2a 2f 0a 20 20 53 65 6c 65  query" */.  Sele
210c0 63 74 20 2a 70 53 75 62 31 3b 20 20 20 20 20 20  ct *pSub1;      
210d0 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 74 68  /* Pointer to th
210e0 65 20 72 69 67 68 74 6d 6f 73 74 20 73 65 6c 65  e rightmost sele
210f0 63 74 20 69 6e 20 73 75 62 2d 71 75 65 72 79 20  ct in sub-query 
21100 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53  */.  SrcList *pS
21110 72 63 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20  rc;      /* The 
21120 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74  FROM clause of t
21130 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 2a  he outer query *
21140 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53 75  /.  SrcList *pSu
21150 62 53 72 63 3b 20 20 20 2f 2a 20 54 68 65 20 46  bSrc;   /* The F
21160 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68  ROM clause of th
21170 65 20 73 75 62 71 75 65 72 79 20 2a 2f 0a 20 20  e subquery */.  
21180 69 6e 74 20 69 50 61 72 65 6e 74 3b 20 20 20 20  int iParent;    
21190 20 20 20 20 2f 2a 20 56 44 42 45 20 63 75 72 73      /* VDBE curs
211a0 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65  or number of the
211b0 20 70 53 75 62 20 72 65 73 75 6c 74 20 73 65 74   pSub result set
211c0 20 74 65 6d 70 20 74 61 62 6c 65 20 2a 2f 0a 20   temp table */. 
211d0 20 69 6e 74 20 69 4e 65 77 50 61 72 65 6e 74 20   int iNewParent 
211e0 3d 20 2d 31 3b 2f 2a 20 52 65 70 6c 61 63 65 6d  = -1;/* Replacem
211f0 65 6e 74 20 74 61 62 6c 65 20 66 6f 72 20 69 50  ent table for iP
21200 61 72 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 69  arent */.  int i
21210 73 4c 65 66 74 4a 6f 69 6e 20 3d 20 30 3b 20 2f  sLeftJoin = 0; /
21220 2a 20 54 72 75 65 20 69 66 20 70 53 75 62 20 69  * True if pSub i
21230 73 20 74 68 65 20 72 69 67 68 74 20 73 69 64 65  s the right side
21240 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e 20   of a LEFT JOIN 
21250 2a 2f 20 20 20 20 0a 20 20 69 6e 74 20 69 3b 20  */    .  int i; 
21260 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
21270 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  Loop counter */.
21280 20 20 45 78 70 72 20 2a 70 57 68 65 72 65 3b 20    Expr *pWhere; 
21290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
212a0 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20     /* The WHERE 
212b0 63 6c 61 75 73 65 20 2a 2f 0a 20 20 73 74 72 75  clause */.  stru
212c0 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
212d0 2a 70 53 75 62 69 74 65 6d 3b 20 20 20 2f 2a 20  *pSubitem;   /* 
212e0 54 68 65 20 73 75 62 71 75 65 72 79 20 2a 2f 0a  The subquery */.
212f0 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
21300 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 2f  pParse->db;..  /
21310 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69  * Check to see i
21320 66 20 66 6c 61 74 74 65 6e 69 6e 67 20 69 73 20  f flattening is 
21330 70 65 72 6d 69 74 74 65 64 2e 20 20 52 65 74 75  permitted.  Retu
21340 72 6e 20 30 20 69 66 20 6e 6f 74 2e 0a 20 20 2a  rn 0 if not..  *
21350 2f 0a 20 20 61 73 73 65 72 74 28 20 70 21 3d 30  /.  assert( p!=0
21360 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d   );.  assert( p-
21370 3e 70 50 72 69 6f 72 3d 3d 30 20 29 3b 0a 20 20  >pPrior==0 );.  
21380 69 66 28 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e  if( Optimization
21390 44 69 73 61 62 6c 65 64 28 64 62 2c 20 53 51 4c  Disabled(db, SQL
213a0 49 54 45 5f 51 75 65 72 79 46 6c 61 74 74 65 6e  ITE_QueryFlatten
213b0 65 72 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  er) ) return 0;.
213c0 20 20 70 53 72 63 20 3d 20 70 2d 3e 70 53 72 63    pSrc = p->pSrc
213d0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 72 63  ;.  assert( pSrc
213e0 20 26 26 20 69 46 72 6f 6d 3e 3d 30 20 26 26 20   && iFrom>=0 && 
213f0 69 46 72 6f 6d 3c 70 53 72 63 2d 3e 6e 53 72 63  iFrom<pSrc->nSrc
21400 20 29 3b 0a 20 20 70 53 75 62 69 74 65 6d 20 3d   );.  pSubitem =
21410 20 26 70 53 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d   &pSrc->a[iFrom]
21420 3b 0a 20 20 69 50 61 72 65 6e 74 20 3d 20 70 53  ;.  iParent = pS
21430 75 62 69 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b  ubitem->iCursor;
21440 0a 20 20 70 53 75 62 20 3d 20 70 53 75 62 69 74  .  pSub = pSubit
21450 65 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a 20 20 61  em->pSelect;.  a
21460 73 73 65 72 74 28 20 70 53 75 62 21 3d 30 20 29  ssert( pSub!=0 )
21470 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ;..#ifndef SQLIT
21480 45 5f 4f 4d 49 54 5f 57 49 4e 44 4f 57 46 55 4e  E_OMIT_WINDOWFUN
21490 43 0a 20 20 69 66 28 20 70 2d 3e 70 57 69 6e 20  C.  if( p->pWin 
214a0 7c 7c 20 70 53 75 62 2d 3e 70 57 69 6e 20 29 20  || pSub->pWin ) 
214b0 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20  return 0;       
214c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
214d0 73 74 72 69 63 74 69 6f 6e 20 28 32 35 29 20 2a  striction (25) *
214e0 2f 0a 23 65 6e 64 69 66 0a 0a 20 20 70 53 75 62  /.#endif..  pSub
214f0 53 72 63 20 3d 20 70 53 75 62 2d 3e 70 53 72 63  Src = pSub->pSrc
21500 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 75 62  ;.  assert( pSub
21510 53 72 63 20 29 3b 0a 20 20 2f 2a 20 50 72 69 6f  Src );.  /* Prio
21520 72 20 74 6f 20 76 65 72 73 69 6f 6e 20 33 2e 31  r to version 3.1
21530 2e 32 2c 20 77 68 65 6e 20 4c 49 4d 49 54 20 61  .2, when LIMIT a
21540 6e 64 20 4f 46 46 53 45 54 20 68 61 64 20 74 6f  nd OFFSET had to
21550 20 62 65 20 73 69 6d 70 6c 65 20 63 6f 6e 73 74   be simple const
21560 61 6e 74 73 2c 0a 20 20 2a 2a 20 6e 6f 74 20 61  ants,.  ** not a
21570 72 62 69 74 72 61 72 79 20 65 78 70 72 65 73 73  rbitrary express
21580 69 6f 6e 73 2c 20 77 65 20 61 6c 6c 6f 77 65 64  ions, we allowed
21590 20 73 6f 6d 65 20 63 6f 6d 62 69 6e 69 6e 67 20   some combining 
215a0 6f 66 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46  of LIMIT and OFF
215b0 53 45 54 0a 20 20 2a 2a 20 62 65 63 61 75 73 65  SET.  ** because
215c0 20 74 68 65 79 20 63 6f 75 6c 64 20 62 65 20 63   they could be c
215d0 6f 6d 70 75 74 65 64 20 61 74 20 63 6f 6d 70 69  omputed at compi
215e0 6c 65 2d 74 69 6d 65 2e 20 20 42 75 74 20 77 68  le-time.  But wh
215f0 65 6e 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46  en LIMIT and OFF
21600 53 45 54 0a 20 20 2a 2a 20 62 65 63 61 6d 65 20  SET.  ** became 
21610 61 72 62 69 74 72 61 72 79 20 65 78 70 72 65 73  arbitrary expres
21620 73 69 6f 6e 73 2c 20 77 65 20 77 65 72 65 20 66  sions, we were f
21630 6f 72 63 65 64 20 74 6f 20 61 64 64 20 72 65 73  orced to add res
21640 74 72 69 63 74 69 6f 6e 73 20 28 31 33 29 0a 20  trictions (13). 
21650 20 2a 2a 20 61 6e 64 20 28 31 34 29 2e 20 2a 2f   ** and (14). */
21660 0a 20 20 69 66 28 20 70 53 75 62 2d 3e 70 4c 69  .  if( pSub->pLi
21670 6d 69 74 20 26 26 20 70 2d 3e 70 4c 69 6d 69 74  mit && p->pLimit
21680 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20   ) return 0;    
21690 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73            /* Res
216a0 74 72 69 63 74 69 6f 6e 20 28 31 33 29 20 2a 2f  triction (13) */
216b0 0a 20 20 69 66 28 20 70 53 75 62 2d 3e 70 4c 69  .  if( pSub->pLi
216c0 6d 69 74 20 26 26 20 70 53 75 62 2d 3e 70 4c 69  mit && pSub->pLi
216d0 6d 69 74 2d 3e 70 52 69 67 68 74 20 29 20 72 65  mit->pRight ) re
216e0 74 75 72 6e 20 30 3b 20 20 20 2f 2a 20 52 65 73  turn 0;   /* Res
216f0 74 72 69 63 74 69 6f 6e 20 28 31 34 29 20 2a 2f  triction (14) */
21700 0a 20 20 69 66 28 20 28 70 2d 3e 73 65 6c 46 6c  .  if( (p->selFl
21710 61 67 73 20 26 20 53 46 5f 43 6f 6d 70 6f 75 6e  ags & SF_Compoun
21720 64 29 21 3d 30 20 26 26 20 70 53 75 62 2d 3e 70  d)!=0 && pSub->p
21730 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 72 65 74  Limit ){.    ret
21740 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20  urn 0;          
21750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21770 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e    /* Restriction
21780 20 28 31 35 29 20 2a 2f 0a 20 20 7d 0a 20 20 69   (15) */.  }.  i
21790 66 28 20 70 53 75 62 53 72 63 2d 3e 6e 53 72 63  f( pSubSrc->nSrc
217a0 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 20  ==0 ) return 0; 
217b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
217c0 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63        /* Restric
217d0 74 69 6f 6e 20 28 37 29 20 20 2a 2f 0a 20 20 69  tion (7)  */.  i
217e0 66 28 20 70 53 75 62 2d 3e 73 65 6c 46 6c 61 67  f( pSub->selFlag
217f0 73 20 26 20 53 46 5f 44 69 73 74 69 6e 63 74 20  s & SF_Distinct 
21800 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20  ) return 0;     
21810 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63        /* Restric
21820 74 69 6f 6e 20 28 34 29 20 20 2a 2f 0a 20 20 69  tion (4)  */.  i
21830 66 28 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20  f( pSub->pLimit 
21840 26 26 20 28 70 53 72 63 2d 3e 6e 53 72 63 3e 31  && (pSrc->nSrc>1
21850 20 7c 7c 20 69 73 41 67 67 29 20 29 7b 0a 20 20   || isAgg) ){.  
21860 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20     return 0;    
21870 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74       /* Restrict
21880 69 6f 6e 73 20 28 38 29 28 39 29 20 2a 2f 0a 20  ions (8)(9) */. 
21890 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70 4f 72 64   }.  if( p->pOrd
218a0 65 72 42 79 20 26 26 20 70 53 75 62 2d 3e 70 4f  erBy && pSub->pO
218b0 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20 72  rderBy ){.     r
218c0 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20  eturn 0;        
218d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
218e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
218f0 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f     /* Restrictio
21900 6e 20 28 31 31 29 20 2a 2f 0a 20 20 7d 0a 20 20  n (11) */.  }.  
21910 69 66 28 20 69 73 41 67 67 20 26 26 20 70 53 75  if( isAgg && pSu
21920 62 2d 3e 70 4f 72 64 65 72 42 79 20 29 20 72 65  b->pOrderBy ) re
21930 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20  turn 0;         
21940 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69         /* Restri
21950 63 74 69 6f 6e 20 28 31 36 29 20 2a 2f 0a 20 20  ction (16) */.  
21960 69 66 28 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74  if( pSub->pLimit
21970 20 26 26 20 70 2d 3e 70 57 68 65 72 65 20 29 20   && p->pWhere ) 
21980 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20  return 0;       
21990 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69         /* Restri
219a0 63 74 69 6f 6e 20 28 31 39 29 20 2a 2f 0a 20 20  ction (19) */.  
219b0 69 66 28 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74  if( pSub->pLimit
219c0 20 26 26 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73   && (p->selFlags
219d0 20 26 20 53 46 5f 44 69 73 74 69 6e 63 74 29 21   & SF_Distinct)!
219e0 3d 30 20 29 7b 0a 20 20 20 20 20 72 65 74 75 72  =0 ){.     retur
219f0 6e 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  n 0;         /* 
21a00 52 65 73 74 72 69 63 74 69 6f 6e 20 28 32 31 29  Restriction (21)
21a10 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20 70 53   */.  }.  if( pS
21a20 75 62 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 28  ub->selFlags & (
21a30 53 46 5f 52 65 63 75 72 73 69 76 65 29 20 29 7b  SF_Recursive) ){
21a40 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 2f  .    return 0; /
21a50 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 73 20 28  * Restrictions (
21a60 32 32 29 20 2a 2f 0a 20 20 7d 0a 0a 20 20 2f 2a  22) */.  }..  /*
21a70 0a 20 20 2a 2a 20 49 66 20 74 68 65 20 73 75 62  .  ** If the sub
21a80 71 75 65 72 79 20 69 73 20 74 68 65 20 72 69 67  query is the rig
21a90 68 74 20 6f 70 65 72 61 6e 64 20 6f 66 20 61 20  ht operand of a 
21aa0 4c 45 46 54 20 4a 4f 49 4e 2c 20 74 68 65 6e 20  LEFT JOIN, then 
21ab0 74 68 65 0a 20 20 2a 2a 20 73 75 62 71 75 65 72  the.  ** subquer
21ac0 79 20 6d 61 79 20 6e 6f 74 20 62 65 20 61 20 6a  y may not be a j
21ad0 6f 69 6e 20 69 74 73 65 6c 66 20 28 33 61 29 2e  oin itself (3a).
21ae0 20 45 78 61 6d 70 6c 65 20 6f 66 20 77 68 79 20   Example of why 
21af0 74 68 69 73 20 69 73 20 6e 6f 74 0a 20 20 2a 2a  this is not.  **
21b00 20 61 6c 6c 6f 77 65 64 3a 0a 20 20 2a 2a 0a 20   allowed:.  **. 
21b10 20 2a 2a 20 20 20 20 20 20 20 20 20 74 31 20 4c   **         t1 L
21b20 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20 28  EFT OUTER JOIN (
21b30 74 32 20 4a 4f 49 4e 20 74 33 29 0a 20 20 2a 2a  t2 JOIN t3).  **
21b40 0a 20 20 2a 2a 20 49 66 20 77 65 20 66 6c 61 74  .  ** If we flat
21b50 74 65 6e 20 74 68 65 20 61 62 6f 76 65 2c 20 77  ten the above, w
21b60 65 20 77 6f 75 6c 64 20 67 65 74 0a 20 20 2a 2a  e would get.  **
21b70 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20 28 74  .  **         (t
21b80 31 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49  1 LEFT OUTER JOI
21b90 4e 20 74 32 29 20 4a 4f 49 4e 20 74 33 0a 20 20  N t2) JOIN t3.  
21ba0 2a 2a 0a 20 20 2a 2a 20 77 68 69 63 68 20 69 73  **.  ** which is
21bb0 20 6e 6f 74 20 61 74 20 61 6c 6c 20 74 68 65 20   not at all the 
21bc0 73 61 6d 65 20 74 68 69 6e 67 2e 0a 20 20 2a 2a  same thing..  **
21bd0 0a 20 20 2a 2a 20 49 66 20 74 68 65 20 73 75 62  .  ** If the sub
21be0 71 75 65 72 79 20 69 73 20 74 68 65 20 72 69 67  query is the rig
21bf0 68 74 20 6f 70 65 72 61 6e 64 20 6f 66 20 61 20  ht operand of a 
21c00 4c 45 46 54 20 4a 4f 49 4e 2c 20 74 68 65 6e 20  LEFT JOIN, then 
21c10 74 68 65 20 6f 75 74 65 72 0a 20 20 2a 2a 20 71  the outer.  ** q
21c20 75 65 72 79 20 63 61 6e 6e 6f 74 20 62 65 20 61  uery cannot be a
21c30 6e 20 61 67 67 72 65 67 61 74 65 2e 20 28 33 63  n aggregate. (3c
21c40 29 20 20 54 68 69 73 20 69 73 20 61 6e 20 61 72  )  This is an ar
21c50 74 69 66 61 63 74 20 6f 66 20 74 68 65 20 77 61  tifact of the wa
21c60 79 0a 20 20 2a 2a 20 61 67 67 72 65 67 61 74 65  y.  ** aggregate
21c70 73 20 61 72 65 20 70 72 6f 63 65 73 73 65 64 20  s are processed 
21c80 2d 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6d 65  - there is no me
21c90 63 68 61 6e 69 73 6d 20 74 6f 20 64 65 74 65 72  chanism to deter
21ca0 6d 69 6e 65 20 69 66 0a 20 20 2a 2a 20 74 68 65  mine if.  ** the
21cb0 20 4c 45 46 54 20 4a 4f 49 4e 20 74 61 62 6c 65   LEFT JOIN table
21cc0 20 73 68 6f 75 6c 64 20 62 65 20 61 6c 6c 2d 4e   should be all-N
21cd0 55 4c 4c 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 53  ULL..  **.  ** S
21ce0 65 65 20 61 6c 73 6f 20 74 69 63 6b 65 74 73 20  ee also tickets 
21cf0 23 33 30 36 2c 20 23 33 35 30 2c 20 61 6e 64 20  #306, #350, and 
21d00 23 33 33 30 30 2e 0a 20 20 2a 2f 0a 20 20 69 66  #3300..  */.  if
21d10 28 20 28 70 53 75 62 69 74 65 6d 2d 3e 66 67 2e  ( (pSubitem->fg.
21d20 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 4f 55  jointype & JT_OU
21d30 54 45 52 29 21 3d 30 20 29 7b 0a 20 20 20 20 69  TER)!=0 ){.    i
21d40 73 4c 65 66 74 4a 6f 69 6e 20 3d 20 31 3b 0a 20  sLeftJoin = 1;. 
21d50 20 20 20 69 66 28 20 70 53 75 62 53 72 63 2d 3e     if( pSubSrc->
21d60 6e 53 72 63 3e 31 20 7c 7c 20 69 73 41 67 67 20  nSrc>1 || isAgg 
21d70 7c 7c 20 49 73 56 69 72 74 75 61 6c 28 70 53 75  || IsVirtual(pSu
21d80 62 53 72 63 2d 3e 61 5b 30 5d 2e 70 54 61 62 29  bSrc->a[0].pTab)
21d90 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 20 28 33   ){.      /*  (3
21da0 61 29 20 20 20 20 20 20 20 20 20 20 20 20 20 28  a)             (
21db0 33 63 29 20 20 20 20 20 28 33 62 29 20 2a 2f 0a  3c)     (3b) */.
21dc0 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a        return 0;.
21dd0 20 20 20 20 7d 0a 20 20 7d 0a 23 69 66 64 65 66      }.  }.#ifdef
21de0 20 53 51 4c 49 54 45 5f 45 58 54 52 41 5f 49 46   SQLITE_EXTRA_IF
21df0 4e 55 4c 4c 52 4f 57 0a 20 20 65 6c 73 65 20 69  NULLROW.  else i
21e00 66 28 20 69 46 72 6f 6d 3e 30 20 26 26 20 21 69  f( iFrom>0 && !i
21e10 73 41 67 67 20 29 7b 0a 20 20 20 20 2f 2a 20 53  sAgg ){.    /* S
21e20 65 74 74 69 6e 67 20 69 73 4c 65 66 74 4a 6f 69  etting isLeftJoi
21e30 6e 20 74 6f 20 2d 31 20 63 61 75 73 65 73 20 4f  n to -1 causes O
21e40 50 5f 49 66 4e 75 6c 6c 52 6f 77 20 6f 70 63 6f  P_IfNullRow opco
21e50 64 65 73 20 74 6f 20 62 65 20 67 65 6e 65 72 61  des to be genera
21e60 74 65 64 20 66 6f 72 0a 20 20 20 20 2a 2a 20 65  ted for.    ** e
21e70 76 65 72 79 20 72 65 66 65 72 65 6e 63 65 20 74  very reference t
21e80 6f 20 61 6e 79 20 72 65 73 75 6c 74 20 63 6f 6c  o any result col
21e90 75 6d 6e 20 66 72 6f 6d 20 73 75 62 71 75 65 72  umn from subquer
21ea0 79 20 69 6e 20 61 20 6a 6f 69 6e 2c 20 65 76 65  y in a join, eve
21eb0 6e 0a 20 20 20 20 2a 2a 20 74 68 6f 75 67 68 20  n.    ** though 
21ec0 74 68 65 79 20 61 72 65 20 6e 6f 74 20 6e 65 63  they are not nec
21ed0 65 73 73 61 72 79 2e 20 20 54 68 69 73 20 77 69  essary.  This wi
21ee0 6c 6c 20 73 74 72 65 73 73 2d 74 65 73 74 20 74  ll stress-test t
21ef0 68 65 20 4f 50 5f 49 66 4e 75 6c 6c 52 6f 77 20  he OP_IfNullRow 
21f00 0a 20 20 20 20 2a 2a 20 6f 70 63 6f 64 65 2e 20  .    ** opcode. 
21f10 2a 2f 0a 20 20 20 20 69 73 4c 65 66 74 4a 6f 69  */.    isLeftJoi
21f20 6e 20 3d 20 2d 31 3b 0a 20 20 7d 0a 23 65 6e 64  n = -1;.  }.#end
21f30 69 66 0a 0a 20 20 2f 2a 20 52 65 73 74 72 69 63  if..  /* Restric
21f40 74 69 6f 6e 20 28 31 37 29 3a 20 49 66 20 74 68  tion (17): If th
21f50 65 20 73 75 62 2d 71 75 65 72 79 20 69 73 20 61  e sub-query is a
21f60 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54   compound SELECT
21f70 2c 20 74 68 65 6e 20 69 74 20 6d 75 73 74 0a 20  , then it must. 
21f80 20 2a 2a 20 75 73 65 20 6f 6e 6c 79 20 74 68 65   ** use only the
21f90 20 55 4e 49 4f 4e 20 41 4c 4c 20 6f 70 65 72 61   UNION ALL opera
21fa0 74 6f 72 2e 20 41 6e 64 20 6e 6f 6e 65 20 6f 66  tor. And none of
21fb0 20 74 68 65 20 73 69 6d 70 6c 65 20 73 65 6c 65   the simple sele
21fc0 63 74 20 71 75 65 72 69 65 73 0a 20 20 2a 2a 20  ct queries.  ** 
21fd0 74 68 61 74 20 6d 61 6b 65 20 75 70 20 74 68 65  that make up the
21fe0 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54   compound SELECT
21ff0 20 61 72 65 20 61 6c 6c 6f 77 65 64 20 74 6f 20   are allowed to 
22000 62 65 20 61 67 67 72 65 67 61 74 65 20 6f 72 20  be aggregate or 
22010 64 69 73 74 69 6e 63 74 0a 20 20 2a 2a 20 71 75  distinct.  ** qu
22020 65 72 69 65 73 2e 0a 20 20 2a 2f 0a 20 20 69 66  eries..  */.  if
22030 28 20 70 53 75 62 2d 3e 70 50 72 69 6f 72 20 29  ( pSub->pPrior )
22040 7b 0a 20 20 20 20 69 66 28 20 70 53 75 62 2d 3e  {.    if( pSub->
22050 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20  pOrderBy ){.    
22060 20 20 72 65 74 75 72 6e 20 30 3b 20 20 2f 2a 20    return 0;  /* 
22070 52 65 73 74 72 69 63 74 69 6f 6e 20 28 32 30 29  Restriction (20)
22080 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 69 66   */.    }.    if
22090 28 20 69 73 41 67 67 20 7c 7c 20 28 70 2d 3e 73  ( isAgg || (p->s
220a0 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 44 69 73  elFlags & SF_Dis
220b0 74 69 6e 63 74 29 21 3d 30 20 7c 7c 20 70 53 72  tinct)!=0 || pSr
220c0 63 2d 3e 6e 53 72 63 21 3d 31 20 29 7b 0a 20 20  c->nSrc!=1 ){.  
220d0 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 2f 2a      return 0; /*
220e0 20 28 31 37 64 31 29 2c 20 28 31 37 64 32 29 2c   (17d1), (17d2),
220f0 20 6f 72 20 28 31 37 64 33 29 20 2a 2f 0a 20 20   or (17d3) */.  
22100 20 20 7d 0a 20 20 20 20 66 6f 72 28 70 53 75 62    }.    for(pSub
22110 31 3d 70 53 75 62 3b 20 70 53 75 62 31 3b 20 70  1=pSub; pSub1; p
22120 53 75 62 31 3d 70 53 75 62 31 2d 3e 70 50 72 69  Sub1=pSub1->pPri
22130 6f 72 29 7b 0a 20 20 20 20 20 20 74 65 73 74 63  or){.      testc
22140 61 73 65 28 20 28 70 53 75 62 31 2d 3e 73 65 6c  ase( (pSub1->sel
22150 46 6c 61 67 73 20 26 20 28 53 46 5f 44 69 73 74  Flags & (SF_Dist
22160 69 6e 63 74 7c 53 46 5f 41 67 67 72 65 67 61 74  inct|SF_Aggregat
22170 65 29 29 3d 3d 53 46 5f 44 69 73 74 69 6e 63 74  e))==SF_Distinct
22180 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
22190 73 65 28 20 28 70 53 75 62 31 2d 3e 73 65 6c 46  se( (pSub1->selF
221a0 6c 61 67 73 20 26 20 28 53 46 5f 44 69 73 74 69  lags & (SF_Disti
221b0 6e 63 74 7c 53 46 5f 41 67 67 72 65 67 61 74 65  nct|SF_Aggregate
221c0 29 29 3d 3d 53 46 5f 41 67 67 72 65 67 61 74 65  ))==SF_Aggregate
221d0 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
221e0 28 20 70 53 75 62 2d 3e 70 53 72 63 21 3d 30 20  ( pSub->pSrc!=0 
221f0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
22200 20 70 53 75 62 2d 3e 70 45 4c 69 73 74 2d 3e 6e   pSub->pEList->n
22210 45 78 70 72 3d 3d 70 53 75 62 31 2d 3e 70 45 4c  Expr==pSub1->pEL
22220 69 73 74 2d 3e 6e 45 78 70 72 20 29 3b 0a 20 20  ist->nExpr );.  
22230 20 20 20 20 69 66 28 20 28 70 53 75 62 31 2d 3e      if( (pSub1->
22240 73 65 6c 46 6c 61 67 73 20 26 20 28 53 46 5f 44  selFlags & (SF_D
22250 69 73 74 69 6e 63 74 7c 53 46 5f 41 67 67 72 65  istinct|SF_Aggre
22260 67 61 74 65 29 29 21 3d 30 20 20 20 20 2f 2a 20  gate))!=0    /* 
22270 28 31 37 62 29 20 2a 2f 0a 20 20 20 20 20 20 20  (17b) */.       
22280 7c 7c 20 28 70 53 75 62 31 2d 3e 70 50 72 69 6f  || (pSub1->pPrio
22290 72 20 26 26 20 70 53 75 62 31 2d 3e 6f 70 21 3d  r && pSub1->op!=
222a0 54 4b 5f 41 4c 4c 29 20 20 20 20 20 20 20 20 20  TK_ALL)         
222b0 20 20 20 20 20 20 20 20 2f 2a 20 28 31 37 61 29          /* (17a)
222c0 20 2a 2f 0a 20 20 20 20 20 20 20 7c 7c 20 70 53   */.       || pS
222d0 75 62 31 2d 3e 70 53 72 63 2d 3e 6e 53 72 63 3c  ub1->pSrc->nSrc<
222e0 31 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  1               
222f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22300 20 20 20 2f 2a 20 28 31 37 63 29 20 2a 2f 0a 20     /* (17c) */. 
22310 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
22320 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20  return 0;.      
22330 7d 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  }.      testcase
22340 28 20 70 53 75 62 31 2d 3e 70 53 72 63 2d 3e 6e  ( pSub1->pSrc->n
22350 53 72 63 3e 31 20 29 3b 0a 20 20 20 20 7d 0a 0a  Src>1 );.    }..
22360 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69      /* Restricti
22370 6f 6e 20 28 31 38 29 2e 20 2a 2f 0a 20 20 20 20  on (18). */.    
22380 69 66 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 20  if( p->pOrderBy 
22390 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 69 3b  ){.      int ii;
223a0 0a 20 20 20 20 20 20 66 6f 72 28 69 69 3d 30 3b  .      for(ii=0;
223b0 20 69 69 3c 70 2d 3e 70 4f 72 64 65 72 42 79 2d   ii<p->pOrderBy-
223c0 3e 6e 45 78 70 72 3b 20 69 69 2b 2b 29 7b 0a 20  >nExpr; ii++){. 
223d0 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70 4f         if( p->pO
223e0 72 64 65 72 42 79 2d 3e 61 5b 69 69 5d 2e 75 2e  rderBy->a[ii].u.
223f0 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 3d 3d 30  x.iOrderByCol==0
22400 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20   ) return 0;.   
22410 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
22420 20 20 2f 2a 20 45 78 2d 72 65 73 74 72 69 63 74    /* Ex-restrict
22430 69 6f 6e 20 28 32 33 29 3a 0a 20 20 2a 2a 20 54  ion (23):.  ** T
22440 68 65 20 6f 6e 6c 79 20 77 61 79 20 74 68 61 74  he only way that
22450 20 74 68 65 20 72 65 63 75 72 73 69 76 65 20 70   the recursive p
22460 61 72 74 20 6f 66 20 61 20 43 54 45 20 63 61 6e  art of a CTE can
22470 20 63 6f 6e 74 61 69 6e 20 61 20 63 6f 6d 70 6f   contain a compo
22480 75 6e 64 0a 20 20 2a 2a 20 73 75 62 71 75 65 72  und.  ** subquer
22490 79 20 69 73 20 66 6f 72 20 74 68 65 20 73 75 62  y is for the sub
224a0 71 75 65 72 79 20 74 6f 20 62 65 20 6f 6e 65 20  query to be one 
224b0 74 65 72 6d 20 6f 66 20 61 20 6a 6f 69 6e 2e 20  term of a join. 
224c0 20 42 75 74 20 69 66 20 74 68 65 0a 20 20 2a 2a   But if the.  **
224d0 20 73 75 62 71 75 65 72 79 20 69 73 20 61 20 6a   subquery is a j
224e0 6f 69 6e 2c 20 74 68 65 6e 20 74 68 65 20 66 6c  oin, then the fl
224f0 61 74 74 65 6e 69 6e 67 20 68 61 73 20 61 6c 72  attening has alr
22500 65 61 64 79 20 62 65 65 6e 20 73 74 6f 70 70 65  eady been stoppe
22510 64 20 62 79 0a 20 20 2a 2a 20 72 65 73 74 72 69  d by.  ** restri
22520 63 74 69 6f 6e 20 28 31 37 64 33 29 0a 20 20 2a  ction (17d3).  *
22530 2f 0a 20 20 61 73 73 65 72 74 28 20 28 70 2d 3e  /.  assert( (p->
22540 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 52 65  selFlags & SF_Re
22550 63 75 72 73 69 76 65 29 3d 3d 30 20 7c 7c 20 70  cursive)==0 || p
22560 53 75 62 2d 3e 70 50 72 69 6f 72 3d 3d 30 20 29  Sub->pPrior==0 )
22570 3b 0a 0a 20 20 2f 2a 2a 2a 2a 2a 20 49 66 20 77  ;..  /***** If w
22580 65 20 72 65 61 63 68 20 74 68 69 73 20 70 6f 69  e reach this poi
22590 6e 74 2c 20 66 6c 61 74 74 65 6e 69 6e 67 20 69  nt, flattening i
225a0 73 20 70 65 72 6d 69 74 74 65 64 2e 20 2a 2a 2a  s permitted. ***
225b0 2a 2a 2f 0a 20 20 53 45 4c 45 43 54 54 52 41 43  **/.  SELECTTRAC
225c0 45 28 31 2c 70 50 61 72 73 65 2c 70 2c 28 22 66  E(1,pParse,p,("f
225d0 6c 61 74 74 65 6e 20 25 75 2e 25 70 20 66 72 6f  latten %u.%p fro
225e0 6d 20 74 65 72 6d 20 25 64 5c 6e 22 2c 0a 20 20  m term %d\n",.  
225f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22600 20 70 53 75 62 2d 3e 73 65 6c 49 64 2c 20 70 53   pSub->selId, pS
22610 75 62 2c 20 69 46 72 6f 6d 29 29 3b 0a 0a 20 20  ub, iFrom));..  
22620 2f 2a 20 41 75 74 68 6f 72 69 7a 65 20 74 68 65  /* Authorize the
22630 20 73 75 62 71 75 65 72 79 20 2a 2f 0a 20 20 70   subquery */.  p
22640 50 61 72 73 65 2d 3e 7a 41 75 74 68 43 6f 6e 74  Parse->zAuthCont
22650 65 78 74 20 3d 20 70 53 75 62 69 74 65 6d 2d 3e  ext = pSubitem->
22660 7a 4e 61 6d 65 3b 0a 20 20 54 45 53 54 4f 4e 4c  zName;.  TESTONL
22670 59 28 69 20 3d 29 20 73 71 6c 69 74 65 33 41 75  Y(i =) sqlite3Au
22680 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20  thCheck(pParse, 
22690 53 51 4c 49 54 45 5f 53 45 4c 45 43 54 2c 20 30  SQLITE_SELECT, 0
226a0 2c 20 30 2c 20 30 29 3b 0a 20 20 74 65 73 74 63  , 0, 0);.  testc
226b0 61 73 65 28 20 69 3d 3d 53 51 4c 49 54 45 5f 44  ase( i==SQLITE_D
226c0 45 4e 59 20 29 3b 0a 20 20 70 50 61 72 73 65 2d  ENY );.  pParse-
226d0 3e 7a 41 75 74 68 43 6f 6e 74 65 78 74 20 3d 20  >zAuthContext = 
226e0 7a 53 61 76 65 64 41 75 74 68 43 6f 6e 74 65 78  zSavedAuthContex
226f0 74 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  t;..  /* If the 
22700 73 75 62 2d 71 75 65 72 79 20 69 73 20 61 20 63  sub-query is a c
22710 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 20 73  ompound SELECT s
22720 74 61 74 65 6d 65 6e 74 2c 20 74 68 65 6e 20 28  tatement, then (
22730 62 79 20 72 65 73 74 72 69 63 74 69 6f 6e 73 0a  by restrictions.
22740 20 20 2a 2a 20 31 37 20 61 6e 64 20 31 38 20 61    ** 17 and 18 a
22750 62 6f 76 65 29 20 69 74 20 6d 75 73 74 20 62 65  bove) it must be
22760 20 61 20 55 4e 49 4f 4e 20 41 4c 4c 20 61 6e 64   a UNION ALL and
22770 20 74 68 65 20 70 61 72 65 6e 74 20 71 75 65 72   the parent quer
22780 79 20 6d 75 73 74 20 0a 20 20 2a 2a 20 62 65 20  y must .  ** be 
22790 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a 20 20 2a  of the form:.  *
227a0 2a 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c 45 43  *.  **     SELEC
227b0 54 20 3c 65 78 70 72 2d 6c 69 73 74 3e 20 46 52  T <expr-list> FR
227c0 4f 4d 20 28 3c 73 75 62 2d 71 75 65 72 79 3e 29  OM (<sub-query>)
227d0 20 3c 77 68 65 72 65 2d 63 6c 61 75 73 65 3e 20   <where-clause> 
227e0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 66 6f 6c 6c 6f  .  **.  ** follo
227f0 77 65 64 20 62 79 20 61 6e 79 20 4f 52 44 45 52  wed by any ORDER
22800 20 42 59 2c 20 4c 49 4d 49 54 20 61 6e 64 2f 6f   BY, LIMIT and/o
22810 72 20 4f 46 46 53 45 54 20 63 6c 61 75 73 65 73  r OFFSET clauses
22820 2e 20 54 68 69 73 20 62 6c 6f 63 6b 0a 20 20 2a  . This block.  *
22830 2a 20 63 72 65 61 74 65 73 20 4e 2d 31 20 63 6f  * creates N-1 co
22840 70 69 65 73 20 6f 66 20 74 68 65 20 70 61 72 65  pies of the pare
22850 6e 74 20 71 75 65 72 79 20 77 69 74 68 6f 75 74  nt query without
22860 20 61 6e 79 20 4f 52 44 45 52 20 42 59 2c 20 4c   any ORDER BY, L
22870 49 4d 49 54 20 6f 72 20 0a 20 20 2a 2a 20 4f 46  IMIT or .  ** OF
22880 46 53 45 54 20 63 6c 61 75 73 65 73 20 61 6e 64  FSET clauses and
22890 20 6a 6f 69 6e 73 20 74 68 65 6d 20 74 6f 20 74   joins them to t
228a0 68 65 20 6c 65 66 74 2d 68 61 6e 64 2d 73 69 64  he left-hand-sid
228b0 65 20 6f 66 20 74 68 65 20 6f 72 69 67 69 6e 61  e of the origina
228c0 6c 0a 20 20 2a 2a 20 75 73 69 6e 67 20 55 4e 49  l.  ** using UNI
228d0 4f 4e 20 41 4c 4c 20 6f 70 65 72 61 74 6f 72 73  ON ALL operators
228e0 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 4e  . In this case N
228f0 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   is the number o
22900 66 20 73 69 6d 70 6c 65 0a 20 20 2a 2a 20 73 65  f simple.  ** se
22910 6c 65 63 74 20 73 74 61 74 65 6d 65 6e 74 73 20  lect statements 
22920 69 6e 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20  in the compound 
22930 73 75 62 2d 71 75 65 72 79 2e 0a 20 20 2a 2a 0a  sub-query..  **.
22940 20 20 2a 2a 20 45 78 61 6d 70 6c 65 3a 0a 20 20    ** Example:.  
22950 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c 45  **.  **     SELE
22960 43 54 20 61 2b 31 20 46 52 4f 4d 20 28 0a 20 20  CT a+1 FROM (.  
22970 2a 2a 20 20 20 20 20 20 20 20 53 45 4c 45 43 54  **        SELECT
22980 20 78 20 46 52 4f 4d 20 74 61 62 0a 20 20 2a 2a   x FROM tab.  **
22990 20 20 20 20 20 20 20 20 55 4e 49 4f 4e 20 41 4c          UNION AL
229a0 4c 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 53 45  L.  **        SE
229b0 4c 45 43 54 20 79 20 46 52 4f 4d 20 74 61 62 0a  LECT y FROM tab.
229c0 20 20 2a 2a 20 20 20 20 20 20 20 20 55 4e 49 4f    **        UNIO
229d0 4e 20 41 4c 4c 0a 20 20 2a 2a 20 20 20 20 20 20  N ALL.  **      
229e0 20 20 53 45 4c 45 43 54 20 61 62 73 28 7a 2a 32    SELECT abs(z*2
229f0 29 20 46 52 4f 4d 20 74 61 62 32 0a 20 20 2a 2a  ) FROM tab2.  **
22a00 20 20 20 20 20 29 20 57 48 45 52 45 20 61 21 3d       ) WHERE a!=
22a10 35 20 4f 52 44 45 52 20 42 59 20 31 0a 20 20 2a  5 ORDER BY 1.  *
22a20 2a 0a 20 20 2a 2a 20 54 72 61 6e 73 66 6f 72 6d  *.  ** Transform
22a30 65 64 20 69 6e 74 6f 3a 0a 20 20 2a 2a 0a 20 20  ed into:.  **.  
22a40 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 78 2b  **     SELECT x+
22a50 31 20 46 52 4f 4d 20 74 61 62 20 57 48 45 52 45  1 FROM tab WHERE
22a60 20 78 2b 31 21 3d 35 0a 20 20 2a 2a 20 20 20 20   x+1!=5.  **    
22a70 20 55 4e 49 4f 4e 20 41 4c 4c 0a 20 20 2a 2a 20   UNION ALL.  ** 
22a80 20 20 20 20 53 45 4c 45 43 54 20 79 2b 31 20 46      SELECT y+1 F
22a90 52 4f 4d 20 74 61 62 20 57 48 45 52 45 20 79 2b  ROM tab WHERE y+
22aa0 31 21 3d 35 0a 20 20 2a 2a 20 20 20 20 20 55 4e  1!=5.  **     UN
22ab0 49 4f 4e 20 41 4c 4c 0a 20 20 2a 2a 20 20 20 20  ION ALL.  **    
22ac0 20 53 45 4c 45 43 54 20 61 62 73 28 7a 2a 32 29   SELECT abs(z*2)
22ad0 2b 31 20 46 52 4f 4d 20 74 61 62 32 20 57 48 45  +1 FROM tab2 WHE
22ae0 52 45 20 61 62 73 28 7a 2a 32 29 2b 31 21 3d 35  RE abs(z*2)+1!=5
22af0 0a 20 20 2a 2a 20 20 20 20 20 4f 52 44 45 52 20  .  **     ORDER 
22b00 42 59 20 31 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57  BY 1.  **.  ** W
22b10 65 20 63 61 6c 6c 20 74 68 69 73 20 74 68 65 20  e call this the 
22b20 22 63 6f 6d 70 6f 75 6e 64 2d 73 75 62 71 75 65  "compound-subque
22b30 72 79 20 66 6c 61 74 74 65 6e 69 6e 67 22 2e 0a  ry flattening"..
22b40 20 20 2a 2f 0a 20 20 66 6f 72 28 70 53 75 62 3d    */.  for(pSub=
22b50 70 53 75 62 2d 3e 70 50 72 69 6f 72 3b 20 70 53  pSub->pPrior; pS
22b60 75 62 3b 20 70 53 75 62 3d 70 53 75 62 2d 3e 70  ub; pSub=pSub->p
22b70 50 72 69 6f 72 29 7b 0a 20 20 20 20 53 65 6c 65  Prior){.    Sele
22b80 63 74 20 2a 70 4e 65 77 3b 0a 20 20 20 20 45 78  ct *pNew;.    Ex
22b90 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79  prList *pOrderBy
22ba0 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a   = p->pOrderBy;.
22bb0 20 20 20 20 45 78 70 72 20 2a 70 4c 69 6d 69 74      Expr *pLimit
22bc0 20 3d 20 70 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20   = p->pLimit;.  
22bd0 20 20 53 65 6c 65 63 74 20 2a 70 50 72 69 6f 72    Select *pPrior
22be0 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20   = p->pPrior;.  
22bf0 20 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20    p->pOrderBy = 
22c00 30 3b 0a 20 20 20 20 70 2d 3e 70 53 72 63 20 3d  0;.    p->pSrc =
22c10 20 30 3b 0a 20 20 20 20 70 2d 3e 70 50 72 69 6f   0;.    p->pPrio
22c20 72 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 70 4c  r = 0;.    p->pL
22c30 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20 70 4e  imit = 0;.    pN
22c40 65 77 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65  ew = sqlite3Sele
22c50 63 74 44 75 70 28 64 62 2c 20 70 2c 20 30 29 3b  ctDup(db, p, 0);
22c60 0a 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d  .    p->pLimit =
22c70 20 70 4c 69 6d 69 74 3b 0a 20 20 20 20 70 2d 3e   pLimit;.    p->
22c80 70 4f 72 64 65 72 42 79 20 3d 20 70 4f 72 64 65  pOrderBy = pOrde
22c90 72 42 79 3b 0a 20 20 20 20 70 2d 3e 70 53 72 63  rBy;.    p->pSrc
22ca0 20 3d 20 70 53 72 63 3b 0a 20 20 20 20 70 2d 3e   = pSrc;.    p->
22cb0 6f 70 20 3d 20 54 4b 5f 41 4c 4c 3b 0a 20 20 20  op = TK_ALL;.   
22cc0 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a   if( pNew==0 ){.
22cd0 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20        p->pPrior 
22ce0 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20 20 7d 65  = pPrior;.    }e
22cf0 6c 73 65 7b 0a 20 20 20 20 20 20 70 4e 65 77 2d  lse{.      pNew-
22d00 3e 70 50 72 69 6f 72 20 3d 20 70 50 72 69 6f 72  >pPrior = pPrior
22d10 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50 72 69  ;.      if( pPri
22d20 6f 72 20 29 20 70 50 72 69 6f 72 2d 3e 70 4e 65  or ) pPrior->pNe
22d30 78 74 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 20  xt = pNew;.     
22d40 20 70 4e 65 77 2d 3e 70 4e 65 78 74 20 3d 20 70   pNew->pNext = p
22d50 3b 0a 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f  ;.      p->pPrio
22d60 72 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 20 20  r = pNew;.      
22d70 53 45 4c 45 43 54 54 52 41 43 45 28 32 2c 70 50  SELECTTRACE(2,pP
22d80 61 72 73 65 2c 70 2c 28 22 63 6f 6d 70 6f 75 6e  arse,p,("compoun
22d90 64 2d 73 75 62 71 75 65 72 79 20 66 6c 61 74 74  d-subquery flatt
22da0 65 6e 65 72 22 0a 20 20 20 20 20 20 20 20 20 20  ener".          
22db0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22dc0 20 20 20 20 22 20 63 72 65 61 74 65 73 20 25 75      " creates %u
22dd0 20 61 73 20 70 65 65 72 5c 6e 22 2c 70 4e 65 77   as peer\n",pNew
22de0 2d 3e 73 65 6c 49 64 29 29 3b 0a 20 20 20 20 7d  ->selId));.    }
22df0 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c  .    if( db->mal
22e00 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74 75  locFailed ) retu
22e10 72 6e 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  rn 1;.  }..  /* 
22e20 42 65 67 69 6e 20 66 6c 61 74 74 65 6e 69 6e 67  Begin flattening
22e30 20 74 68 65 20 69 46 72 6f 6d 2d 74 68 20 65 6e   the iFrom-th en
22e40 74 72 79 20 6f 66 20 74 68 65 20 46 52 4f 4d 20  try of the FROM 
22e50 63 6c 61 75 73 65 20 0a 20 20 2a 2a 20 69 6e 20  clause .  ** in 
22e60 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 2e  the outer query.
22e70 0a 20 20 2a 2f 0a 20 20 70 53 75 62 20 3d 20 70  .  */.  pSub = p
22e80 53 75 62 31 20 3d 20 70 53 75 62 69 74 65 6d 2d  Sub1 = pSubitem-
22e90 3e 70 53 65 6c 65 63 74 3b 0a 0a 20 20 2f 2a 20  >pSelect;..  /* 
22ea0 44 65 6c 65 74 65 20 74 68 65 20 74 72 61 6e 73  Delete the trans
22eb0 69 65 6e 74 20 74 61 62 6c 65 20 73 74 72 75 63  ient table struc
22ec0 74 75 72 65 20 61 73 73 6f 63 69 61 74 65 64 20  ture associated 
22ed0 77 69 74 68 20 74 68 65 0a 20 20 2a 2a 20 73 75  with the.  ** su
22ee0 62 71 75 65 72 79 0a 20 20 2a 2f 0a 20 20 73 71  bquery.  */.  sq
22ef0 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
22f00 70 53 75 62 69 74 65 6d 2d 3e 7a 44 61 74 61 62  pSubitem->zDatab
22f10 61 73 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 44  ase);.  sqlite3D
22f20 62 46 72 65 65 28 64 62 2c 20 70 53 75 62 69 74  bFree(db, pSubit
22f30 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 73 71  em->zName);.  sq
22f40 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
22f50 70 53 75 62 69 74 65 6d 2d 3e 7a 41 6c 69 61 73  pSubitem->zAlias
22f60 29 3b 0a 20 20 70 53 75 62 69 74 65 6d 2d 3e 7a  );.  pSubitem->z
22f70 44 61 74 61 62 61 73 65 20 3d 20 30 3b 0a 20 20  Database = 0;.  
22f80 70 53 75 62 69 74 65 6d 2d 3e 7a 4e 61 6d 65 20  pSubitem->zName 
22f90 3d 20 30 3b 0a 20 20 70 53 75 62 69 74 65 6d 2d  = 0;.  pSubitem-
22fa0 3e 7a 41 6c 69 61 73 20 3d 20 30 3b 0a 20 20 70  >zAlias = 0;.  p
22fb0 53 75 62 69 74 65 6d 2d 3e 70 53 65 6c 65 63 74  Subitem->pSelect
22fc0 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 44 65 66 65   = 0;..  /* Defe
22fd0 72 20 64 65 6c 65 74 69 6e 67 20 74 68 65 20 54  r deleting the T
22fe0 61 62 6c 65 20 6f 62 6a 65 63 74 20 61 73 73 6f  able object asso
22ff0 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65 0a  ciated with the.
23000 20 20 2a 2a 20 73 75 62 71 75 65 72 79 20 75 6e    ** subquery un
23010 74 69 6c 20 63 6f 64 65 20 67 65 6e 65 72 61 74  til code generat
23020 69 6f 6e 20 69 73 0a 20 20 2a 2a 20 63 6f 6d 70  ion is.  ** comp
23030 6c 65 74 65 2c 20 73 69 6e 63 65 20 74 68 65 72  lete, since ther
23040 65 20 6d 61 79 20 73 74 69 6c 6c 20 65 78 69 73  e may still exis
23050 74 20 45 78 70 72 2e 70 54 61 62 20 65 6e 74 72  t Expr.pTab entr
23060 69 65 73 20 74 68 61 74 0a 20 20 2a 2a 20 72 65  ies that.  ** re
23070 66 65 72 20 74 6f 20 74 68 65 20 73 75 62 71 75  fer to the subqu
23080 65 72 79 20 65 76 65 6e 20 61 66 74 65 72 20 66  ery even after f
23090 6c 61 74 74 65 6e 69 6e 67 2e 20 20 54 69 63 6b  lattening.  Tick
230a0 65 74 20 23 33 33 34 36 2e 0a 20 20 2a 2a 0a 20  et #3346..  **. 
230b0 20 2a 2a 20 70 53 75 62 69 74 65 6d 2d 3e 70 54   ** pSubitem->pT
230c0 61 62 20 69 73 20 61 6c 77 61 79 73 20 6e 6f 6e  ab is always non
230d0 2d 4e 55 4c 4c 20 62 79 20 74 65 73 74 20 72 65  -NULL by test re
230e0 73 74 72 69 63 74 69 6f 6e 73 20 61 6e 64 20 74  strictions and t
230f0 65 73 74 73 20 61 62 6f 76 65 2e 0a 20 20 2a 2f  ests above..  */
23100 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28 70 53  .  if( ALWAYS(pS
23110 75 62 69 74 65 6d 2d 3e 70 54 61 62 21 3d 30 29  ubitem->pTab!=0)
23120 20 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70   ){.    Table *p
23130 54 61 62 54 6f 44 65 6c 20 3d 20 70 53 75 62 69  TabToDel = pSubi
23140 74 65 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20 69  tem->pTab;.    i
23150 66 28 20 70 54 61 62 54 6f 44 65 6c 2d 3e 6e 54  f( pTabToDel->nT
23160 61 62 52 65 66 3d 3d 31 20 29 7b 0a 20 20 20 20  abRef==1 ){.    
23170 20 20 50 61 72 73 65 20 2a 70 54 6f 70 6c 65 76    Parse *pToplev
23180 65 6c 20 3d 20 73 71 6c 69 74 65 33 50 61 72 73  el = sqlite3Pars
23190 65 54 6f 70 6c 65 76 65 6c 28 70 50 61 72 73 65  eToplevel(pParse
231a0 29 3b 0a 20 20 20 20 20 20 70 54 61 62 54 6f 44  );.      pTabToD
231b0 65 6c 2d 3e 70 4e 65 78 74 5a 6f 6d 62 69 65 20  el->pNextZombie 
231c0 3d 20 70 54 6f 70 6c 65 76 65 6c 2d 3e 70 5a 6f  = pToplevel->pZo
231d0 6d 62 69 65 54 61 62 3b 0a 20 20 20 20 20 20 70  mbieTab;.      p
231e0 54 6f 70 6c 65 76 65 6c 2d 3e 70 5a 6f 6d 62 69  Toplevel->pZombi
231f0 65 54 61 62 20 3d 20 70 54 61 62 54 6f 44 65 6c  eTab = pTabToDel
23200 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
23210 20 20 20 70 54 61 62 54 6f 44 65 6c 2d 3e 6e 54     pTabToDel->nT
23220 61 62 52 65 66 2d 2d 3b 0a 20 20 20 20 7d 0a 20  abRef--;.    }. 
23230 20 20 20 70 53 75 62 69 74 65 6d 2d 3e 70 54 61     pSubitem->pTa
23240 62 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  b = 0;.  }..  /*
23250 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6c   The following l
23260 6f 6f 70 20 72 75 6e 73 20 6f 6e 63 65 20 66 6f  oop runs once fo
23270 72 20 65 61 63 68 20 74 65 72 6d 20 69 6e 20 61  r each term in a
23280 20 63 6f 6d 70 6f 75 6e 64 2d 73 75 62 71 75 65   compound-subque
23290 72 79 0a 20 20 2a 2a 20 66 6c 61 74 74 65 6e 69  ry.  ** flatteni
232a0 6e 67 20 28 61 73 20 64 65 73 63 72 69 62 65 64  ng (as described
232b0 20 61 62 6f 76 65 29 2e 20 20 49 66 20 77 65 20   above).  If we 
232c0 61 72 65 20 64 6f 69 6e 67 20 61 20 64 69 66 66  are doing a diff
232d0 65 72 65 6e 74 20 6b 69 6e 64 0a 20 20 2a 2a 20  erent kind.  ** 
232e0 6f 66 20 66 6c 61 74 74 65 6e 69 6e 67 20 2d 20  of flattening - 
232f0 61 20 66 6c 61 74 74 65 6e 69 6e 67 20 6f 74 68  a flattening oth
23300 65 72 20 74 68 61 6e 20 61 20 63 6f 6d 70 6f 75  er than a compou
23310 6e 64 2d 73 75 62 71 75 65 72 79 20 66 6c 61 74  nd-subquery flat
23320 74 65 6e 69 6e 67 20 2d 0a 20 20 2a 2a 20 74 68  tening -.  ** th
23330 65 6e 20 74 68 69 73 20 6c 6f 6f 70 20 6f 6e 6c  en this loop onl
23340 79 20 72 75 6e 73 20 6f 6e 63 65 2e 0a 20 20 2a  y runs once..  *
23350 2a 0a 20 20 2a 2a 20 54 68 69 73 20 6c 6f 6f 70  *.  ** This loop
23360 20 6d 6f 76 65 73 20 61 6c 6c 20 6f 66 20 74 68   moves all of th
23370 65 20 46 52 4f 4d 20 65 6c 65 6d 65 6e 74 73 20  e FROM elements 
23380 6f 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20  of the subquery 
23390 69 6e 74 6f 20 74 68 65 0a 20 20 2a 2a 20 74 68  into the.  ** th
233a0 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66  e FROM clause of
233b0 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
233c0 2e 20 20 42 65 66 6f 72 65 20 64 6f 69 6e 67 20  .  Before doing 
233d0 74 68 69 73 2c 20 72 65 6d 65 6d 62 65 72 0a 20  this, remember. 
233e0 20 2a 2a 20 74 68 65 20 63 75 72 73 6f 72 20 6e   ** the cursor n
233f0 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20 6f 72  umber for the or
23400 69 67 69 6e 61 6c 20 6f 75 74 65 72 20 71 75 65  iginal outer que
23410 72 79 20 46 52 4f 4d 20 65 6c 65 6d 65 6e 74 20  ry FROM element 
23420 69 6e 0a 20 20 2a 2a 20 69 50 61 72 65 6e 74 2e  in.  ** iParent.
23430 20 20 54 68 65 20 69 50 61 72 65 6e 74 20 63 75    The iParent cu
23440 72 73 6f 72 20 77 69 6c 6c 20 6e 65 76 65 72 20  rsor will never 
23450 62 65 20 75 73 65 64 2e 20 20 53 75 62 73 65 71  be used.  Subseq
23460 75 65 6e 74 20 63 6f 64 65 0a 20 20 2a 2a 20 77  uent code.  ** w
23470 69 6c 6c 20 73 63 61 6e 20 65 78 70 72 65 73 73  ill scan express
23480 69 6f 6e 73 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72  ions looking for
23490 20 69 50 61 72 65 6e 74 20 72 65 66 65 72 65 6e   iParent referen
234a0 63 65 73 20 61 6e 64 20 72 65 70 6c 61 63 65 0a  ces and replace.
234b0 20 20 2a 2a 20 74 68 6f 73 65 20 72 65 66 65 72    ** those refer
234c0 65 6e 63 65 73 20 77 69 74 68 20 65 78 70 72 65  ences with expre
234d0 73 73 69 6f 6e 73 20 74 68 61 74 20 72 65 73 6f  ssions that reso
234e0 6c 76 65 20 74 6f 20 74 68 65 20 73 75 62 71 75  lve to the subqu
234f0 65 72 79 20 46 52 4f 4d 0a 20 20 2a 2a 20 65 6c  ery FROM.  ** el
23500 65 6d 65 6e 74 73 20 77 65 20 61 72 65 20 6e 6f  ements we are no
23510 77 20 63 6f 70 79 69 6e 67 20 69 6e 2e 0a 20 20  w copying in..  
23520 2a 2f 0a 20 20 66 6f 72 28 70 50 61 72 65 6e 74  */.  for(pParent
23530 3d 70 3b 20 70 50 61 72 65 6e 74 3b 20 70 50 61  =p; pParent; pPa
23540 72 65 6e 74 3d 70 50 61 72 65 6e 74 2d 3e 70 50  rent=pParent->pP
23550 72 69 6f 72 2c 20 70 53 75 62 3d 70 53 75 62 2d  rior, pSub=pSub-
23560 3e 70 50 72 69 6f 72 29 7b 0a 20 20 20 20 69 6e  >pPrior){.    in
23570 74 20 6e 53 75 62 53 72 63 3b 0a 20 20 20 20 75  t nSubSrc;.    u
23580 38 20 6a 6f 69 6e 74 79 70 65 20 3d 20 30 3b 0a  8 jointype = 0;.
23590 20 20 20 20 61 73 73 65 72 74 28 20 70 53 75 62      assert( pSub
235a0 21 3d 30 20 29 3b 0a 20 20 20 20 70 53 75 62 53  !=0 );.    pSubS
235b0 72 63 20 3d 20 70 53 75 62 2d 3e 70 53 72 63 3b  rc = pSub->pSrc;
235c0 20 20 20 20 20 2f 2a 20 46 52 4f 4d 20 63 6c 61       /* FROM cla
235d0 75 73 65 20 6f 66 20 73 75 62 71 75 65 72 79 20  use of subquery 
235e0 2a 2f 0a 20 20 20 20 6e 53 75 62 53 72 63 20 3d  */.    nSubSrc =
235f0 20 70 53 75 62 53 72 63 2d 3e 6e 53 72 63 3b 20   pSubSrc->nSrc; 
23600 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74 65   /* Number of te
23610 72 6d 73 20 69 6e 20 73 75 62 71 75 65 72 79 20  rms in subquery 
23620 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20  FROM clause */. 
23630 20 20 20 70 53 72 63 20 3d 20 70 50 61 72 65 6e     pSrc = pParen
23640 74 2d 3e 70 53 72 63 3b 20 20 20 20 20 2f 2a 20  t->pSrc;     /* 
23650 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74  FROM clause of t
23660 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 2a  he outer query *
23670 2f 0a 0a 20 20 20 20 69 66 28 20 70 53 72 63 20  /..    if( pSrc 
23680 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
23690 20 70 50 61 72 65 6e 74 3d 3d 70 20 29 3b 20 20   pParent==p );  
236a0 2f 2a 20 46 69 72 73 74 20 74 69 6d 65 20 74 68  /* First time th
236b0 72 6f 75 67 68 20 74 68 65 20 6c 6f 6f 70 20 2a  rough the loop *
236c0 2f 0a 20 20 20 20 20 20 6a 6f 69 6e 74 79 70 65  /.      jointype
236d0 20 3d 20 70 53 75 62 69 74 65 6d 2d 3e 66 67 2e   = pSubitem->fg.
236e0 6a 6f 69 6e 74 79 70 65 3b 0a 20 20 20 20 7d 65  jointype;.    }e
236f0 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72  lse{.      asser
23700 74 28 20 70 50 61 72 65 6e 74 21 3d 70 20 29 3b  t( pParent!=p );
23710 20 20 2f 2a 20 32 6e 64 20 61 6e 64 20 73 75 62    /* 2nd and sub
23720 73 65 71 75 65 6e 74 20 74 69 6d 65 73 20 74 68  sequent times th
23730 72 6f 75 67 68 20 74 68 65 20 6c 6f 6f 70 20 2a  rough the loop *
23740 2f 0a 20 20 20 20 20 20 70 53 72 63 20 3d 20 73  /.      pSrc = s
23750 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41 70 70  qlite3SrcListApp
23760 65 6e 64 28 70 50 61 72 73 65 2c 20 30 2c 20 30  end(pParse, 0, 0
23770 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 0);.      if( 
23780 70 53 72 63 3d 3d 30 20 29 20 62 72 65 61 6b 3b  pSrc==0 ) break;
23790 0a 20 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e  .      pParent->
237a0 70 53 72 63 20 3d 20 70 53 72 63 3b 0a 20 20 20  pSrc = pSrc;.   
237b0 20 7d 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 73   }..    /* The s
237c0 75 62 71 75 65 72 79 20 75 73 65 73 20 61 20 73  ubquery uses a s
237d0 69 6e 67 6c 65 20 73 6c 6f 74 20 6f 66 20 74 68  ingle slot of th
237e0 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66  e FROM clause of
237f0 20 74 68 65 20 6f 75 74 65 72 0a 20 20 20 20 2a   the outer.    *
23800 2a 20 71 75 65 72 79 2e 20 20 49 66 20 74 68 65  * query.  If the
23810 20 73 75 62 71 75 65 72 79 20 68 61 73 20 6d 6f   subquery has mo
23820 72 65 20 74 68 61 6e 20 6f 6e 65 20 65 6c 65 6d  re than one elem
23830 65 6e 74 20 69 6e 20 69 74 73 20 46 52 4f 4d 20  ent in its FROM 
23840 63 6c 61 75 73 65 2c 0a 20 20 20 20 2a 2a 20 74  clause,.    ** t
23850 68 65 6e 20 65 78 70 61 6e 64 20 74 68 65 20 6f  hen expand the o
23860 75 74 65 72 20 71 75 65 72 79 20 74 6f 20 6d 61  uter query to ma
23870 6b 65 20 73 70 61 63 65 20 66 6f 72 20 69 74 20  ke space for it 
23880 74 6f 20 68 6f 6c 64 20 61 6c 6c 20 65 6c 65 6d  to hold all elem
23890 65 6e 74 73 0a 20 20 20 20 2a 2a 20 6f 66 20 74  ents.    ** of t
238a0 68 65 20 73 75 62 71 75 65 72 79 2e 0a 20 20 20  he subquery..   
238b0 20 2a 2a 0a 20 20 20 20 2a 2a 20 45 78 61 6d 70   **.    ** Examp
238c0 6c 65 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  le:.    **.    *
238d0 2a 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52  *    SELECT * FR
238e0 4f 4d 20 74 61 62 41 2c 20 28 53 45 4c 45 43 54  OM tabA, (SELECT
238f0 20 2a 20 46 52 4f 4d 20 73 75 62 31 2c 20 73 75   * FROM sub1, su
23900 62 32 29 2c 20 74 61 62 42 3b 0a 20 20 20 20 2a  b2), tabB;.    *
23910 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 6f 75 74  *.    ** The out
23920 65 72 20 71 75 65 72 79 20 68 61 73 20 33 20 73  er query has 3 s
23930 6c 6f 74 73 20 69 6e 20 69 74 73 20 46 52 4f 4d  lots in its FROM
23940 20 63 6c 61 75 73 65 2e 20 20 4f 6e 65 20 73 6c   clause.  One sl
23950 6f 74 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a  ot of the.    **
23960 20 6f 75 74 65 72 20 71 75 65 72 79 20 28 74 68   outer query (th
23970 65 20 6d 69 64 64 6c 65 20 73 6c 6f 74 29 20 69  e middle slot) i
23980 73 20 75 73 65 64 20 62 79 20 74 68 65 20 73 75  s used by the su
23990 62 71 75 65 72 79 2e 20 20 54 68 65 20 6e 65 78  bquery.  The nex
239a0 74 0a 20 20 20 20 2a 2a 20 62 6c 6f 63 6b 20 6f  t.    ** block o
239b0 66 20 63 6f 64 65 20 77 69 6c 6c 20 65 78 70 61  f code will expa
239c0 6e 64 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  nd the outer que
239d0 72 79 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 74  ry FROM clause t
239e0 6f 20 34 20 73 6c 6f 74 73 2e 0a 20 20 20 20 2a  o 4 slots..    *
239f0 2a 20 54 68 65 20 6d 69 64 64 6c 65 20 73 6c 6f  * The middle slo
23a00 74 20 69 73 20 65 78 70 61 6e 64 65 64 20 74 6f  t is expanded to
23a10 20 74 77 6f 20 73 6c 6f 74 73 20 69 6e 20 6f 72   two slots in or
23a20 64 65 72 20 74 6f 20 6d 61 6b 65 20 73 70 61 63  der to make spac
23a30 65 0a 20 20 20 20 2a 2a 20 66 6f 72 20 74 68 65  e.    ** for the
23a40 20 74 77 6f 20 65 6c 65 6d 65 6e 74 73 20 69 6e   two elements in
23a50 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
23a60 20 6f 66 20 74 68 65 20 73 75 62 71 75 65 72 79   of the subquery
23a70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
23a80 20 6e 53 75 62 53 72 63 3e 31 20 29 7b 0a 20 20   nSubSrc>1 ){.  
23a90 20 20 20 20 70 53 72 63 20 3d 20 73 71 6c 69 74      pSrc = sqlit
23aa0 65 33 53 72 63 4c 69 73 74 45 6e 6c 61 72 67 65  e3SrcListEnlarge
23ab0 28 70 50 61 72 73 65 2c 20 70 53 72 63 2c 20 6e  (pParse, pSrc, n
23ac0 53 75 62 53 72 63 2d 31 2c 69 46 72 6f 6d 2b 31  SubSrc-1,iFrom+1
23ad0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 53 72  );.      if( pSr
23ae0 63 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  c==0 ) break;.  
23af0 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70 53 72      pParent->pSr
23b00 63 20 3d 20 70 53 72 63 3b 0a 20 20 20 20 7d 0a  c = pSrc;.    }.
23b10 0a 20 20 20 20 2f 2a 20 54 72 61 6e 73 66 65 72  .    /* Transfer
23b20 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
23b30 20 74 65 72 6d 73 20 66 72 6f 6d 20 74 68 65 20   terms from the 
23b40 73 75 62 71 75 65 72 79 20 69 6e 74 6f 20 74 68  subquery into th
23b50 65 0a 20 20 20 20 2a 2a 20 6f 75 74 65 72 20 71  e.    ** outer q
23b60 75 65 72 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  uery..    */.   
23b70 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 53 75 62   for(i=0; i<nSub
23b80 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Src; i++){.     
23b90 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44 65   sqlite3IdListDe
23ba0 6c 65 74 65 28 64 62 2c 20 70 53 72 63 2d 3e 61  lete(db, pSrc->a
23bb0 5b 69 2b 69 46 72 6f 6d 5d 2e 70 55 73 69 6e 67  [i+iFrom].pUsing
23bc0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
23bd0 20 70 53 72 63 2d 3e 61 5b 69 2b 69 46 72 6f 6d   pSrc->a[i+iFrom
23be0 5d 2e 66 67 2e 69 73 54 61 62 46 75 6e 63 3d 3d  ].fg.isTabFunc==
23bf0 30 20 29 3b 0a 20 20 20 20 20 20 70 53 72 63 2d  0 );.      pSrc-
23c00 3e 61 5b 69 2b 69 46 72 6f 6d 5d 20 3d 20 70 53  >a[i+iFrom] = pS
23c10 75 62 53 72 63 2d 3e 61 5b 69 5d 3b 0a 20 20 20  ubSrc->a[i];.   
23c20 20 20 20 69 4e 65 77 50 61 72 65 6e 74 20 3d 20     iNewParent = 
23c30 70 53 75 62 53 72 63 2d 3e 61 5b 69 5d 2e 69 43  pSubSrc->a[i].iC
23c40 75 72 73 6f 72 3b 0a 20 20 20 20 20 20 6d 65 6d  ursor;.      mem
23c50 73 65 74 28 26 70 53 75 62 53 72 63 2d 3e 61 5b  set(&pSubSrc->a[
23c60 69 5d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 53  i], 0, sizeof(pS
23c70 75 62 53 72 63 2d 3e 61 5b 69 5d 29 29 3b 0a 20  ubSrc->a[i]));. 
23c80 20 20 20 7d 0a 20 20 20 20 70 53 72 63 2d 3e 61     }.    pSrc->a
23c90 5b 69 46 72 6f 6d 5d 2e 66 67 2e 6a 6f 69 6e 74  [iFrom].fg.joint
23ca0 79 70 65 20 3d 20 6a 6f 69 6e 74 79 70 65 3b 0a  ype = jointype;.
23cb0 20 20 0a 20 20 20 20 2f 2a 20 4e 6f 77 20 62 65    .    /* Now be
23cc0 67 69 6e 20 73 75 62 73 74 69 74 75 74 69 6e 67  gin substituting
23cd0 20 73 75 62 71 75 65 72 79 20 72 65 73 75 6c 74   subquery result
23ce0 20 73 65 74 20 65 78 70 72 65 73 73 69 6f 6e 73   set expressions
23cf0 20 66 6f 72 20 0a 20 20 20 20 2a 2a 20 72 65 66   for .    ** ref
23d00 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20 69  erences to the i
23d10 50 61 72 65 6e 74 20 69 6e 20 74 68 65 20 6f 75  Parent in the ou
23d20 74 65 72 20 71 75 65 72 79 2e 0a 20 20 20 20 2a  ter query..    *
23d30 2a 20 0a 20 20 20 20 2a 2a 20 45 78 61 6d 70 6c  * .    ** Exampl
23d40 65 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  e:.    **.    **
23d50 20 20 20 53 45 4c 45 43 54 20 61 2b 35 2c 20 62     SELECT a+5, b
23d60 2a 31 30 20 46 52 4f 4d 20 28 53 45 4c 45 43 54  *10 FROM (SELECT
23d70 20 78 2a 33 20 41 53 20 61 2c 20 79 2b 31 30 20   x*3 AS a, y+10 
23d80 41 53 20 62 20 46 52 4f 4d 20 74 31 29 20 57 48  AS b FROM t1) WH
23d90 45 52 45 20 61 3e 62 3b 0a 20 20 20 20 2a 2a 20  ERE a>b;.    ** 
23da0 20 20 5c 20 20 20 20 20 20 20 20 20 20 20 20 20    \             
23db0 20 20 20 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f          \_______
23dc0 5f 5f 5f 5f 5f 5f 20 73 75 62 71 75 65 72 79 20  ______ subquery 
23dd0 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 20 20 20 20 20  __________/     
23de0 20 20 20 20 20 2f 0a 20 20 20 20 2a 2a 20 20 20       /.    **   
23df0 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f   \______________
23e00 5f 5f 5f 5f 5f 5f 5f 20 6f 75 74 65 72 20 71 75  _______ outer qu
23e10 65 72 79 20 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ery ____________
23e20 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
23e30 5f 5f 2f 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  __/.    **.    *
23e40 2a 20 57 65 20 6c 6f 6f 6b 20 61 74 20 65 76 65  * We look at eve
23e50 72 79 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e  ry expression in
23e60 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
23e70 20 61 6e 64 20 65 76 65 72 79 20 70 6c 61 63 65   and every place
23e80 20 77 65 20 73 65 65 0a 20 20 20 20 2a 2a 20 22   we see.    ** "
23e90 61 22 20 77 65 20 73 75 62 73 74 69 74 75 74 65  a" we substitute
23ea0 20 22 78 2a 33 22 20 61 6e 64 20 65 76 65 72 79   "x*3" and every
23eb0 20 70 6c 61 63 65 20 77 65 20 73 65 65 20 22 62   place we see "b
23ec0 22 20 77 65 20 73 75 62 73 74 69 74 75 74 65 20  " we substitute 
23ed0 22 79 2b 31 30 22 2e 0a 20 20 20 20 2a 2f 0a 20  "y+10"..    */. 
23ee0 20 20 20 69 66 28 20 70 53 75 62 2d 3e 70 4f 72     if( pSub->pOr
23ef0 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20 2f  derBy ){.      /
23f00 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 2c  * At this point,
23f10 20 61 6e 79 20 6e 6f 6e 2d 7a 65 72 6f 20 69 4f   any non-zero iO
23f20 72 64 65 72 42 79 43 6f 6c 20 76 61 6c 75 65 73  rderByCol values
23f30 20 69 6e 64 69 63 61 74 65 20 74 68 61 74 20 74   indicate that t
23f40 68 65 0a 20 20 20 20 20 20 2a 2a 20 4f 52 44 45  he.      ** ORDE
23f50 52 20 42 59 20 63 6f 6c 75 6d 6e 20 65 78 70 72  R BY column expr
23f60 65 73 73 69 6f 6e 20 69 73 20 69 64 65 6e 74 69  ession is identi
23f70 63 61 6c 20 74 6f 20 74 68 65 20 69 4f 72 64 65  cal to the iOrde
23f80 72 42 79 43 6f 6c 27 74 68 0a 20 20 20 20 20 20  rByCol'th.      
23f90 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 72 65  ** expression re
23fa0 74 75 72 6e 65 64 20 62 79 20 53 45 4c 45 43 54  turned by SELECT
23fb0 20 73 74 61 74 65 6d 65 6e 74 20 70 53 75 62 2e   statement pSub.
23fc0 20 53 69 6e 63 65 20 74 68 65 73 65 20 76 61 6c   Since these val
23fd0 75 65 73 0a 20 20 20 20 20 20 2a 2a 20 64 6f 20  ues.      ** do 
23fe0 6e 6f 74 20 6e 65 63 65 73 73 61 72 69 6c 79 20  not necessarily 
23ff0 63 6f 72 72 65 73 70 6f 6e 64 20 74 6f 20 63 6f  correspond to co
24000 6c 75 6d 6e 73 20 69 6e 20 53 45 4c 45 43 54 20  lumns in SELECT 
24010 73 74 61 74 65 6d 65 6e 74 20 70 50 61 72 65 6e  statement pParen
24020 74 2c 0a 20 20 20 20 20 20 2a 2a 20 7a 65 72 6f  t,.      ** zero
24030 20 74 68 65 6d 20 62 65 66 6f 72 65 20 74 72 61   them before tra
24040 6e 73 66 65 72 69 6e 67 20 74 68 65 20 4f 52 44  nsfering the ORD
24050 45 52 20 42 59 20 63 6c 61 75 73 65 2e 0a 20 20  ER BY clause..  
24060 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
24070 4e 6f 74 20 64 6f 69 6e 67 20 74 68 69 73 20 6d  Not doing this m
24080 61 79 20 63 61 75 73 65 20 61 6e 20 65 72 72 6f  ay cause an erro
24090 72 20 69 66 20 61 20 73 75 62 73 65 71 75 65 6e  r if a subsequen
240a0 74 20 63 61 6c 6c 20 74 6f 20 74 68 69 73 0a 20  t call to this. 
240b0 20 20 20 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e       ** function
240c0 20 61 74 74 65 6d 70 74 73 20 74 6f 20 66 6c 61   attempts to fla
240d0 74 74 65 6e 20 61 20 63 6f 6d 70 6f 75 6e 64 20  tten a compound 
240e0 73 75 62 2d 71 75 65 72 79 20 69 6e 74 6f 20 70  sub-query into p
240f0 50 61 72 65 6e 74 0a 20 20 20 20 20 20 2a 2a 20  Parent.      ** 
24100 28 74 68 65 20 6f 6e 6c 79 20 77 61 79 20 74 68  (the only way th
24110 69 73 20 63 61 6e 20 68 61 70 70 65 6e 20 69 73  is can happen is
24120 20 69 66 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64   if the compound
24130 20 73 75 62 2d 71 75 65 72 79 20 69 73 0a 20 20   sub-query is.  
24140 20 20 20 20 2a 2a 20 63 75 72 72 65 6e 74 6c 79      ** currently
24150 20 70 61 72 74 20 6f 66 20 70 53 75 62 2d 3e 70   part of pSub->p
24160 53 72 63 29 2e 20 53 65 65 20 74 69 63 6b 65 74  Src). See ticket
24170 20 5b 64 31 31 61 36 65 39 30 38 66 5d 2e 20 20   [d11a6e908f].  
24180 2a 2f 0a 20 20 20 20 20 20 45 78 70 72 4c 69 73  */.      ExprLis
24190 74 20 2a 70 4f 72 64 65 72 42 79 20 3d 20 70 53  t *pOrderBy = pS
241a0 75 62 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20  ub->pOrderBy;.  
241b0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
241c0 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 20  OrderBy->nExpr; 
241d0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 70 4f  i++){.        pO
241e0 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 75 2e 78  rderBy->a[i].u.x
241f0 2e 69 4f 72 64 65 72 42 79 43 6f 6c 20 3d 20 30  .iOrderByCol = 0
24200 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
24210 61 73 73 65 72 74 28 20 70 50 61 72 65 6e 74 2d  assert( pParent-
24220 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 3b 0a  >pOrderBy==0 );.
24230 20 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70        pParent->p
24240 4f 72 64 65 72 42 79 20 3d 20 70 4f 72 64 65 72  OrderBy = pOrder
24250 42 79 3b 0a 20 20 20 20 20 20 70 53 75 62 2d 3e  By;.      pSub->
24260 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20  pOrderBy = 0;.  
24270 20 20 7d 0a 20 20 20 20 70 57 68 65 72 65 20 3d    }.    pWhere =
24280 20 70 53 75 62 2d 3e 70 57 68 65 72 65 3b 0a 20   pSub->pWhere;. 
24290 20 20 20 70 53 75 62 2d 3e 70 57 68 65 72 65 20     pSub->pWhere 
242a0 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 69 73 4c  = 0;.    if( isL
242b0 65 66 74 4a 6f 69 6e 3e 30 20 29 7b 0a 20 20 20  eftJoin>0 ){.   
242c0 20 20 20 73 65 74 4a 6f 69 6e 45 78 70 72 28 70     setJoinExpr(p
242d0 57 68 65 72 65 2c 20 69 4e 65 77 50 61 72 65 6e  Where, iNewParen
242e0 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50  t);.    }.    pP
242f0 61 72 65 6e 74 2d 3e 70 57 68 65 72 65 20 3d 20  arent->pWhere = 
24300 73 71 6c 69 74 65 33 45 78 70 72 41 6e 64 28 70  sqlite3ExprAnd(p
24310 50 61 72 73 65 2c 20 70 57 68 65 72 65 2c 20 70  Parse, pWhere, p
24320 50 61 72 65 6e 74 2d 3e 70 57 68 65 72 65 29 3b  Parent->pWhere);
24330 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c  .    if( db->mal
24340 6c 6f 63 46 61 69 6c 65 64 3d 3d 30 20 29 7b 0a  locFailed==0 ){.
24350 20 20 20 20 20 20 53 75 62 73 74 43 6f 6e 74 65        SubstConte
24360 78 74 20 78 3b 0a 20 20 20 20 20 20 78 2e 70 50  xt x;.      x.pP
24370 61 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20  arse = pParse;. 
24380 20 20 20 20 20 78 2e 69 54 61 62 6c 65 20 3d 20       x.iTable = 
24390 69 50 61 72 65 6e 74 3b 0a 20 20 20 20 20 20 78  iParent;.      x
243a0 2e 69 4e 65 77 54 61 62 6c 65 20 3d 20 69 4e 65  .iNewTable = iNe
243b0 77 50 61 72 65 6e 74 3b 0a 20 20 20 20 20 20 78  wParent;.      x
243c0 2e 69 73 4c 65 66 74 4a 6f 69 6e 20 3d 20 69 73  .isLeftJoin = is
243d0 4c 65 66 74 4a 6f 69 6e 3b 0a 20 20 20 20 20 20  LeftJoin;.      
243e0 78 2e 70 45 4c 69 73 74 20 3d 20 70 53 75 62 2d  x.pEList = pSub-
243f0 3e 70 45 4c 69 73 74 3b 0a 20 20 20 20 20 20 73  >pEList;.      s
24400 75 62 73 74 53 65 6c 65 63 74 28 26 78 2c 20 70  ubstSelect(&x, p
24410 50 61 72 65 6e 74 2c 20 30 29 3b 0a 20 20 20 20  Parent, 0);.    
24420 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 54 68 65 20  }.  .    /* The 
24430 66 6c 61 74 74 65 6e 65 64 20 71 75 65 72 79 20  flattened query 
24440 69 73 20 61 20 63 6f 6d 70 6f 75 6e 64 20 69 66  is a compound if
24450 20 65 69 74 68 65 72 20 74 68 65 20 69 6e 6e 65   either the inne
24460 72 20 6f 72 20 74 68 65 0a 20 20 20 20 2a 2a 20  r or the.    ** 
24470 6f 75 74 65 72 20 71 75 65 72 79 20 69 73 20 61  outer query is a
24480 20 63 6f 6d 70 6f 75 6e 64 2e 20 2a 2f 0a 20 20   compound. */.  
24490 20 20 70 50 61 72 65 6e 74 2d 3e 73 65 6c 46 6c    pParent->selFl
244a0 61 67 73 20 7c 3d 20 70 53 75 62 2d 3e 73 65 6c  ags |= pSub->sel
244b0 46 6c 61 67 73 20 26 20 53 46 5f 43 6f 6d 70 6f  Flags & SF_Compo
244c0 75 6e 64 3b 0a 20 20 20 20 61 73 73 65 72 74 28  und;.    assert(
244d0 20 28 70 53 75 62 2d 3e 73 65 6c 46 6c 61 67 73   (pSub->selFlags
244e0 20 26 20 53 46 5f 44 69 73 74 69 6e 63 74 29 3d   & SF_Distinct)=
244f0 3d 30 20 29 3b 20 2f 2a 20 72 65 73 74 72 69 63  =0 ); /* restric
24500 74 69 6f 6e 20 28 31 37 62 29 20 2a 2f 0a 20 20  tion (17b) */.  
24510 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 53  .    /*.    ** S
24520 45 4c 45 43 54 20 2e 2e 2e 20 46 52 4f 4d 20 28  ELECT ... FROM (
24530 53 45 4c 45 43 54 20 2e 2e 2e 20 4c 49 4d 49 54  SELECT ... LIMIT
24540 20 61 20 4f 46 46 53 45 54 20 62 29 20 4c 49 4d   a OFFSET b) LIM
24550 49 54 20 78 20 4f 46 46 53 45 54 20 79 3b 0a 20  IT x OFFSET y;. 
24560 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 4f 6e 65     **.    ** One
24570 20 69 73 20 74 65 6d 70 74 65 64 20 74 6f 20 74   is tempted to t
24580 72 79 20 74 6f 20 61 64 64 20 61 20 61 6e 64 20  ry to add a and 
24590 62 20 74 6f 20 63 6f 6d 62 69 6e 65 20 74 68 65  b to combine the
245a0 20 6c 69 6d 69 74 73 2e 20 20 42 75 74 20 74 68   limits.  But th
245b0 69 73 0a 20 20 20 20 2a 2a 20 64 6f 65 73 20 6e  is.    ** does n
245c0 6f 74 20 77 6f 72 6b 20 69 66 20 65 69 74 68 65  ot work if eithe
245d0 72 20 6c 69 6d 69 74 20 69 73 20 6e 65 67 61 74  r limit is negat
245e0 69 76 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ive..    */.    
245f0 69 66 28 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74  if( pSub->pLimit
24600 20 29 7b 0a 20 20 20 20 20 20 70 50 61 72 65 6e   ){.      pParen
24610 74 2d 3e 70 4c 69 6d 69 74 20 3d 20 70 53 75 62  t->pLimit = pSub
24620 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20  ->pLimit;.      
24630 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20 3d 20 30  pSub->pLimit = 0
24640 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
24650 2a 20 46 69 6e 69 61 6c 6c 79 2c 20 64 65 6c 65  * Finially, dele
24660 74 65 20 77 68 61 74 20 69 73 20 6c 65 66 74 20  te what is left 
24670 6f 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20  of the subquery 
24680 61 6e 64 20 72 65 74 75 72 6e 0a 20 20 2a 2a 20  and return.  ** 
24690 73 75 63 63 65 73 73 2e 0a 20 20 2a 2f 0a 20 20  success..  */.  
246a0 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c  sqlite3SelectDel
246b0 65 74 65 28 64 62 2c 20 70 53 75 62 31 29 3b 0a  ete(db, pSub1);.
246c0 0a 23 69 66 20 53 45 4c 45 43 54 54 52 41 43 45  .#if SELECTTRACE
246d0 5f 45 4e 41 42 4c 45 44 0a 20 20 69 66 28 20 73  _ENABLED.  if( s
246e0 71 6c 69 74 65 33 53 65 6c 65 63 74 54 72 61 63  qlite3SelectTrac
246f0 65 20 26 20 30 78 31 30 30 20 29 7b 0a 20 20 20  e & 0x100 ){.   
24700 20 53 45 4c 45 43 54 54 52 41 43 45 28 30 78 31   SELECTTRACE(0x1
24710 30 30 2c 70 50 61 72 73 65 2c 70 2c 28 22 41 66  00,pParse,p,("Af
24720 74 65 72 20 66 6c 61 74 74 65 6e 69 6e 67 3a 5c  ter flattening:\
24730 6e 22 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  n"));.    sqlite
24740 33 54 72 65 65 56 69 65 77 53 65 6c 65 63 74 28  3TreeViewSelect(
24750 30 2c 20 70 2c 20 30 29 3b 0a 20 20 7d 0a 23 65  0, p, 0);.  }.#e
24760 6e 64 69 66 0a 0a 20 20 72 65 74 75 72 6e 20 31  ndif..  return 1
24770 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64  ;.}.#endif /* !d
24780 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
24790 49 54 5f 53 55 42 51 55 45 52 59 29 20 7c 7c 20  IT_SUBQUERY) || 
247a0 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
247b0 4f 4d 49 54 5f 56 49 45 57 29 20 2a 2f 0a 0a 2f  OMIT_VIEW) */../
247c0 2a 0a 2a 2a 20 41 20 73 74 72 75 63 74 75 72 65  *.** A structure
247d0 20 74 6f 20 6b 65 65 70 20 74 72 61 63 6b 20 6f   to keep track o
247e0 66 20 61 6c 6c 20 6f 66 20 74 68 65 20 63 6f 6c  f all of the col
247f0 75 6d 6e 20 76 61 6c 75 65 73 20 74 68 61 74 20  umn values that 
24800 61 72 65 20 66 69 78 65 64 20 74 6f 0a 2a 2a 20  are fixed to.** 
24810 61 20 6b 6e 6f 77 6e 20 76 61 6c 75 65 20 64 75  a known value du
24820 65 20 74 6f 20 57 48 45 52 45 20 63 6c 61 75 73  e to WHERE claus
24830 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 6f 66  e constraints of
24840 20 74 68 65 20 66 6f 72 6d 20 43 4f 4c 55 4d 4e   the form COLUMN
24850 3d 56 41 4c 55 45 2e 0a 2a 2f 0a 74 79 70 65 64  =VALUE..*/.typed
24860 65 66 20 73 74 72 75 63 74 20 57 68 65 72 65 43  ef struct WhereC
24870 6f 6e 73 74 20 57 68 65 72 65 43 6f 6e 73 74 3b  onst WhereConst;
24880 0a 73 74 72 75 63 74 20 57 68 65 72 65 43 6f 6e  .struct WhereCon
24890 73 74 20 7b 0a 20 20 50 61 72 73 65 20 2a 70 50  st {.  Parse *pP
248a0 61 72 73 65 3b 20 20 20 2f 2a 20 50 61 72 73 69  arse;   /* Parsi
248b0 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
248c0 69 6e 74 20 6e 43 6f 6e 73 74 3b 20 20 20 20 20  int nConst;     
248d0 20 2f 2a 20 4e 75 6d 62 65 72 20 66 6f 72 20 43   /* Number for C
248e0 4f 4c 55 4d 4e 3d 43 4f 4e 53 54 41 4e 54 20 74  OLUMN=CONSTANT t
248f0 65 72 6d 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 43  erms */.  int nC
24900 68 6e 67 3b 20 20 20 20 20 20 20 2f 2a 20 4e 75  hng;       /* Nu
24910 6d 62 65 72 20 6f 66 20 74 69 6d 65 73 20 61 20  mber of times a 
24920 63 6f 6e 73 74 61 6e 74 20 69 73 20 70 72 6f 70  constant is prop
24930 61 67 61 74 65 64 20 2a 2f 0a 20 20 45 78 70 72  agated */.  Expr
24940 20 2a 2a 61 70 45 78 70 72 3b 20 20 20 2f 2a 20   **apExpr;   /* 
24950 5b 69 2a 32 5d 20 69 73 20 43 4f 4c 55 4d 4e 20  [i*2] is COLUMN 
24960 61 6e 64 20 5b 69 2a 32 2b 31 5d 20 69 73 20 56  and [i*2+1] is V
24970 41 4c 55 45 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a  ALUE */.};../*.*
24980 2a 20 41 64 64 20 61 20 6e 65 77 20 65 6e 74 72  * Add a new entr
24990 79 20 74 6f 20 74 68 65 20 70 43 6f 6e 73 74 20  y to the pConst 
249a0 6f 62 6a 65 63 74 2e 20 20 45 78 63 65 70 74 2c  object.  Except,
249b0 20 64 6f 20 6e 6f 74 20 61 64 64 20 64 75 70 6c   do not add dupl
249c0 69 63 61 74 65 0a 2a 2a 20 70 43 6f 6c 75 6d 6e  icate.** pColumn
249d0 20 65 6e 74 69 72 65 73 2e 0a 2a 2f 0a 73 74 61   entires..*/.sta
249e0 74 69 63 20 76 6f 69 64 20 63 6f 6e 73 74 49 6e  tic void constIn
249f0 73 65 72 74 28 0a 20 20 57 68 65 72 65 43 6f 6e  sert(.  WhereCon
24a00 73 74 20 2a 70 43 6f 6e 73 74 2c 20 20 20 20 20  st *pConst,     
24a10 20 2f 2a 20 54 68 65 20 57 68 65 72 65 43 6f 6e   /* The WhereCon
24a20 73 74 20 69 6e 74 6f 20 77 68 69 63 68 20 77 65  st into which we
24a30 20 61 72 65 20 69 6e 73 65 72 74 69 6e 67 20 2a   are inserting *
24a40 2f 0a 20 20 45 78 70 72 20 2a 70 43 6f 6c 75 6d  /.  Expr *pColum
24a50 6e 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  n,           /* 
24a60 54 68 65 20 43 4f 4c 55 4d 4e 20 70 61 72 74 20  The COLUMN part 
24a70 6f 66 20 74 68 65 20 63 6f 6e 73 74 72 61 69 6e  of the constrain
24a80 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 56 61  t */.  Expr *pVa
24a90 6c 75 65 20 20 20 20 20 20 20 20 20 20 20 20 20  lue             
24aa0 2f 2a 20 54 68 65 20 56 41 4c 55 45 20 70 61 72  /* The VALUE par
24ab0 74 20 6f 66 20 74 68 65 20 63 6f 6e 73 74 72 61  t of the constra
24ac0 69 6e 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  int */.){.  int 
24ad0 69 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 6f  i;.  assert( pCo
24ae0 6c 75 6d 6e 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c  lumn->op==TK_COL
24af0 55 4d 4e 20 29 3b 0a 0a 20 20 2f 2a 20 32 30 31  UMN );..  /* 201
24b00 38 2d 31 30 2d 32 35 20 74 69 63 6b 65 74 20 5b  8-10-25 ticket [
24b10 63 66 35 65 64 32 30 66 5d 0a 20 20 2a 2a 20 4d  cf5ed20f].  ** M
24b20 61 6b 65 20 73 75 72 65 20 74 68 65 20 73 61 6d  ake sure the sam
24b30 65 20 70 43 6f 6c 75 6d 6e 20 69 73 20 6e 6f 74  e pColumn is not
24b40 20 69 6e 73 65 72 74 65 64 20 6d 6f 72 65 20 74   inserted more t
24b50 68 61 6e 20 6f 6e 63 65 20 2a 2f 0a 20 20 66 6f  han once */.  fo
24b60 72 28 69 3d 30 3b 20 69 3c 70 43 6f 6e 73 74 2d  r(i=0; i<pConst-
24b70 3e 6e 43 6f 6e 73 74 3b 20 69 2b 2b 29 7b 0a 20  >nConst; i++){. 
24b80 20 20 20 63 6f 6e 73 74 20 45 78 70 72 20 2a 70     const Expr *p
24b90 45 78 70 72 20 3d 20 70 43 6f 6e 73 74 2d 3e 61  Expr = pConst->a
24ba0 70 45 78 70 72 5b 69 2a 32 5d 3b 0a 20 20 20 20  pExpr[i*2];.    
24bb0 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f  assert( pExpr->o
24bc0 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 3b 0a  p==TK_COLUMN );.
24bd0 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 69      if( pExpr->i
24be0 54 61 62 6c 65 3d 3d 70 43 6f 6c 75 6d 6e 2d 3e  Table==pColumn->
24bf0 69 54 61 62 6c 65 0a 20 20 20 20 20 26 26 20 70  iTable.     && p
24c00 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 70  Expr->iColumn==p
24c10 43 6f 6c 75 6d 6e 2d 3e 69 43 6f 6c 75 6d 6e 0a  Column->iColumn.
24c20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 72 65 74      ){.      ret
24c30 75 72 6e 3b 20 20 2f 2a 20 41 6c 72 65 61 64 79  urn;  /* Already
24c40 20 70 72 65 73 65 6e 74 2e 20 20 52 65 74 75 72   present.  Retur
24c50 6e 20 77 69 74 68 6f 75 74 20 64 6f 69 6e 67 20  n without doing 
24c60 61 6e 79 74 68 69 6e 67 2e 20 2a 2f 0a 20 20 20  anything. */.   
24c70 20 7d 0a 20 20 7d 0a 0a 20 20 70 43 6f 6e 73 74   }.  }..  pConst
24c80 2d 3e 6e 43 6f 6e 73 74 2b 2b 3b 0a 20 20 70 43  ->nConst++;.  pC
24c90 6f 6e 73 74 2d 3e 61 70 45 78 70 72 20 3d 20 73  onst->apExpr = s
24ca0 71 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f 63 4f  qlite3DbReallocO
24cb0 72 46 72 65 65 28 70 43 6f 6e 73 74 2d 3e 70 50  rFree(pConst->pP
24cc0 61 72 73 65 2d 3e 64 62 2c 20 70 43 6f 6e 73 74  arse->db, pConst
24cd0 2d 3e 61 70 45 78 70 72 2c 0a 20 20 20 20 20 20  ->apExpr,.      
24ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24cf0 20 20 20 70 43 6f 6e 73 74 2d 3e 6e 43 6f 6e 73     pConst->nCons
24d00 74 2a 32 2a 73 69 7a 65 6f 66 28 45 78 70 72 2a  t*2*sizeof(Expr*
24d10 29 29 3b 0a 20 20 69 66 28 20 70 43 6f 6e 73 74  ));.  if( pConst
24d20 2d 3e 61 70 45 78 70 72 3d 3d 30 20 29 7b 0a 20  ->apExpr==0 ){. 
24d30 20 20 20 70 43 6f 6e 73 74 2d 3e 6e 43 6f 6e 73     pConst->nCons
24d40 74 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a  t = 0;.  }else{.
24d50 20 20 20 20 69 66 28 20 45 78 70 72 48 61 73 50      if( ExprHasP
24d60 72 6f 70 65 72 74 79 28 70 56 61 6c 75 65 2c 20  roperty(pValue, 
24d70 45 50 5f 46 69 78 65 64 43 6f 6c 29 20 29 20 70  EP_FixedCol) ) p
24d80 56 61 6c 75 65 20 3d 20 70 56 61 6c 75 65 2d 3e  Value = pValue->
24d90 70 4c 65 66 74 3b 0a 20 20 20 20 70 43 6f 6e 73  pLeft;.    pCons
24da0 74 2d 3e 61 70 45 78 70 72 5b 70 43 6f 6e 73 74  t->apExpr[pConst
24db0 2d 3e 6e 43 6f 6e 73 74 2a 32 2d 32 5d 20 3d 20  ->nConst*2-2] = 
24dc0 70 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 70 43 6f  pColumn;.    pCo
24dd0 6e 73 74 2d 3e 61 70 45 78 70 72 5b 70 43 6f 6e  nst->apExpr[pCon
24de0 73 74 2d 3e 6e 43 6f 6e 73 74 2a 32 2d 31 5d 20  st->nConst*2-1] 
24df0 3d 20 70 56 61 6c 75 65 3b 0a 20 20 7d 0a 7d 0a  = pValue;.  }.}.
24e00 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20 61 6c 6c 20  ./*.** Find all 
24e10 74 65 72 6d 73 20 6f 66 20 43 4f 4c 55 4d 4e 3d  terms of COLUMN=
24e20 56 41 4c 55 45 20 6f 72 20 56 41 4c 55 45 3d 43  VALUE or VALUE=C
24e30 4f 4c 55 4d 4e 20 69 6e 20 70 45 78 70 72 20 77  OLUMN in pExpr w
24e40 68 65 72 65 20 56 41 4c 55 45 0a 2a 2a 20 69 73  here VALUE.** is
24e50 20 61 20 63 6f 6e 73 74 61 6e 74 20 65 78 70 72   a constant expr
24e60 65 73 73 69 6f 6e 20 61 6e 64 20 77 68 65 72 65  ession and where
24e70 20 74 68 65 20 74 65 72 6d 20 6d 75 73 74 20 62   the term must b
24e80 65 20 74 72 75 65 20 62 65 63 61 75 73 65 20 69  e true because i
24e90 74 0a 2a 2a 20 69 73 20 70 61 72 74 20 6f 66 20  t.** is part of 
24ea0 74 68 65 20 41 4e 44 2d 63 6f 6e 6e 65 63 74 65  the AND-connecte
24eb0 64 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 65  d terms of the e
24ec0 78 70 72 65 73 73 69 6f 6e 2e 20 20 46 6f 72 20  xpression.  For 
24ed0 65 61 63 68 20 74 65 72 6d 0a 2a 2a 20 66 6f 75  each term.** fou
24ee0 6e 64 2c 20 61 64 64 20 69 74 20 74 6f 20 74 68  nd, add it to th
24ef0 65 20 70 43 6f 6e 73 74 20 73 74 72 75 63 74 75  e pConst structu
24f00 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  re..*/.static vo
24f10 69 64 20 66 69 6e 64 43 6f 6e 73 74 49 6e 57 68  id findConstInWh
24f20 65 72 65 28 57 68 65 72 65 43 6f 6e 73 74 20 2a  ere(WhereConst *
24f30 70 43 6f 6e 73 74 2c 20 45 78 70 72 20 2a 70 45  pConst, Expr *pE
24f40 78 70 72 29 7b 0a 20 20 45 78 70 72 20 2a 70 52  xpr){.  Expr *pR
24f50 69 67 68 74 2c 20 2a 70 4c 65 66 74 3b 0a 20 20  ight, *pLeft;.  
24f60 69 66 28 20 70 45 78 70 72 3d 3d 30 20 29 20 72  if( pExpr==0 ) r
24f70 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 45 78 70  eturn;.  if( Exp
24f80 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
24f90 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29  pr, EP_FromJoin)
24fa0 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28   ) return;.  if(
24fb0 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41   pExpr->op==TK_A
24fc0 4e 44 20 29 7b 0a 20 20 20 20 66 69 6e 64 43 6f  ND ){.    findCo
24fd0 6e 73 74 49 6e 57 68 65 72 65 28 70 43 6f 6e 73  nstInWhere(pCons
24fe0 74 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74  t, pExpr->pRight
24ff0 29 3b 0a 20 20 20 20 66 69 6e 64 43 6f 6e 73 74  );.    findConst
25000 49 6e 57 68 65 72 65 28 70 43 6f 6e 73 74 2c 20  InWhere(pConst, 
25010 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20  pExpr->pLeft);. 
25020 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
25030 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d   if( pExpr->op!=
25040 54 4b 5f 45 51 20 29 20 72 65 74 75 72 6e 3b 0a  TK_EQ ) return;.
25050 20 20 70 52 69 67 68 74 20 3d 20 70 45 78 70 72    pRight = pExpr
25060 2d 3e 70 52 69 67 68 74 3b 0a 20 20 70 4c 65 66  ->pRight;.  pLef
25070 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  t = pExpr->pLeft
25080 3b 0a 20 20 61 73 73 65 72 74 28 20 70 52 69 67  ;.  assert( pRig
25090 68 74 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  ht!=0 );.  asser
250a0 74 28 20 70 4c 65 66 74 21 3d 30 20 29 3b 0a 20  t( pLeft!=0 );. 
250b0 20 69 66 28 20 70 52 69 67 68 74 2d 3e 6f 70 3d   if( pRight->op=
250c0 3d 54 4b 5f 43 4f 4c 55 4d 4e 0a 20 20 20 26 26  =TK_COLUMN.   &&
250d0 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
250e0 79 28 70 52 69 67 68 74 2c 20 45 50 5f 46 69 78  y(pRight, EP_Fix
250f0 65 64 43 6f 6c 29 0a 20 20 20 26 26 20 73 71 6c  edCol).   && sql
25100 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61  ite3ExprIsConsta
25110 6e 74 28 70 4c 65 66 74 29 0a 20 20 20 26 26 20  nt(pLeft).   && 
25120 73 71 6c 69 74 65 33 49 73 42 69 6e 61 72 79 28  sqlite3IsBinary(
25130 73 71 6c 69 74 65 33 42 69 6e 61 72 79 43 6f 6d  sqlite3BinaryCom
25140 70 61 72 65 43 6f 6c 6c 53 65 71 28 70 43 6f 6e  pareCollSeq(pCon
25150 73 74 2d 3e 70 50 61 72 73 65 2c 70 4c 65 66 74  st->pParse,pLeft
25160 2c 70 52 69 67 68 74 29 29 0a 20 20 29 7b 0a 20  ,pRight)).  ){. 
25170 20 20 20 63 6f 6e 73 74 49 6e 73 65 72 74 28 70     constInsert(p
25180 43 6f 6e 73 74 2c 20 70 52 69 67 68 74 2c 20 70  Const, pRight, p
25190 4c 65 66 74 29 3b 0a 20 20 7d 65 6c 73 65 0a 20  Left);.  }else. 
251a0 20 69 66 28 20 70 4c 65 66 74 2d 3e 6f 70 3d 3d   if( pLeft->op==
251b0 54 4b 5f 43 4f 4c 55 4d 4e 0a 20 20 20 26 26 20  TK_COLUMN.   && 
251c0 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
251d0 28 70 4c 65 66 74 2c 20 45 50 5f 46 69 78 65 64  (pLeft, EP_Fixed
251e0 43 6f 6c 29 0a 20 20 20 26 26 20 73 71 6c 69 74  Col).   && sqlit
251f0 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74  e3ExprIsConstant
25200 28 70 52 69 67 68 74 29 0a 20 20 20 26 26 20 73  (pRight).   && s
25210 71 6c 69 74 65 33 49 73 42 69 6e 61 72 79 28 73  qlite3IsBinary(s
25220 71 6c 69 74 65 33 42 69 6e 61 72 79 43 6f 6d 70  qlite3BinaryComp
25230 61 72 65 43 6f 6c 6c 53 65 71 28 70 43 6f 6e 73  areCollSeq(pCons
25240 74 2d 3e 70 50 61 72 73 65 2c 70 4c 65 66 74 2c  t->pParse,pLeft,
25250 70 52 69 67 68 74 29 29 0a 20 20 29 7b 0a 20 20  pRight)).  ){.  
25260 20 20 63 6f 6e 73 74 49 6e 73 65 72 74 28 70 43    constInsert(pC
25270 6f 6e 73 74 2c 20 70 4c 65 66 74 2c 20 70 52 69  onst, pLeft, pRi
25280 67 68 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  ght);.  }.}../*.
25290 2a 2a 20 54 68 69 73 20 69 73 20 61 20 57 61 6c  ** This is a Wal
252a0 6b 65 72 20 65 78 70 72 65 73 73 69 6f 6e 20 63  ker expression c
252b0 61 6c 6c 62 61 63 6b 2e 20 20 70 45 78 70 72 20  allback.  pExpr 
252c0 69 73 20 61 20 63 61 6e 64 69 64 61 74 65 20 65  is a candidate e
252d0 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 74 6f 20  xpression.** to 
252e0 62 65 20 72 65 70 6c 61 63 65 64 20 62 79 20 61  be replaced by a
252f0 20 76 61 6c 75 65 2e 20 20 49 66 20 70 45 78 70   value.  If pExp
25300 72 20 69 73 20 65 71 75 69 76 61 6c 65 6e 74 20  r is equivalent 
25310 74 6f 20 6f 6e 65 20 6f 66 20 74 68 65 0a 2a 2a  to one of the.**
25320 20 63 6f 6c 75 6d 6e 73 20 6e 61 6d 65 64 20 69   columns named i
25330 6e 20 70 57 61 6c 6b 65 72 2d 3e 75 2e 70 43 6f  n pWalker->u.pCo
25340 6e 73 74 2c 20 74 68 65 6e 20 6f 76 65 72 77 72  nst, then overwr
25350 69 74 65 20 69 74 20 77 69 74 68 20 69 74 73 0a  ite it with its.
25360 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  ** corresponding
25370 20 76 61 6c 75 65 2e 0a 2a 2f 0a 73 74 61 74 69   value..*/.stati
25380 63 20 69 6e 74 20 70 72 6f 70 61 67 61 74 65 43  c int propagateC
25390 6f 6e 73 74 61 6e 74 45 78 70 72 52 65 77 72 69  onstantExprRewri
253a0 74 65 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b  te(Walker *pWalk
253b0 65 72 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29  er, Expr *pExpr)
253c0 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 57 68 65  {.  int i;.  Whe
253d0 72 65 43 6f 6e 73 74 20 2a 70 43 6f 6e 73 74 3b  reConst *pConst;
253e0 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70  .  if( pExpr->op
253f0 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 20 72 65  !=TK_COLUMN ) re
25400 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75  turn WRC_Continu
25410 65 3b 0a 20 20 69 66 28 20 45 78 70 72 48 61 73  e;.  if( ExprHas
25420 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
25430 45 50 5f 46 69 78 65 64 43 6f 6c 29 20 29 20 72  EP_FixedCol) ) r
25440 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e  eturn WRC_Contin
25450 75 65 3b 0a 20 20 70 43 6f 6e 73 74 20 3d 20 70  ue;.  pConst = p
25460 57 61 6c 6b 65 72 2d 3e 75 2e 70 43 6f 6e 73 74  Walker->u.pConst
25470 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
25480 43 6f 6e 73 74 2d 3e 6e 43 6f 6e 73 74 3b 20 69  Const->nConst; i
25490 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70  ++){.    Expr *p
254a0 43 6f 6c 75 6d 6e 20 3d 20 70 43 6f 6e 73 74 2d  Column = pConst-
254b0 3e 61 70 45 78 70 72 5b 69 2a 32 5d 3b 0a 20 20  >apExpr[i*2];.  
254c0 20 20 69 66 28 20 70 43 6f 6c 75 6d 6e 3d 3d 70    if( pColumn==p
254d0 45 78 70 72 20 29 20 63 6f 6e 74 69 6e 75 65 3b  Expr ) continue;
254e0 0a 20 20 20 20 69 66 28 20 70 43 6f 6c 75 6d 6e  .    if( pColumn
254f0 2d 3e 69 54 61 62 6c 65 21 3d 70 45 78 70 72 2d  ->iTable!=pExpr-
25500 3e 69 54 61 62 6c 65 20 29 20 63 6f 6e 74 69 6e  >iTable ) contin
25510 75 65 3b 0a 20 20 20 20 69 66 28 20 70 43 6f 6c  ue;.    if( pCol
25520 75 6d 6e 2d 3e 69 43 6f 6c 75 6d 6e 21 3d 70 45  umn->iColumn!=pE
25530 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 29 20 63  xpr->iColumn ) c
25540 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 2f 2a 20  ontinue;.    /* 
25550 41 20 6d 61 74 63 68 20 69 73 20 66 6f 75 6e 64  A match is found
25560 2e 20 20 41 64 64 20 74 68 65 20 45 50 5f 46 69  .  Add the EP_Fi
25570 78 65 64 43 6f 6c 20 70 72 6f 70 65 72 74 79 20  xedCol property 
25580 2a 2f 0a 20 20 20 20 70 43 6f 6e 73 74 2d 3e 6e  */.    pConst->n
25590 43 68 6e 67 2b 2b 3b 0a 20 20 20 20 45 78 70 72  Chng++;.    Expr
255a0 43 6c 65 61 72 50 72 6f 70 65 72 74 79 28 70 45  ClearProperty(pE
255b0 78 70 72 2c 20 45 50 5f 4c 65 61 66 29 3b 0a 20  xpr, EP_Leaf);. 
255c0 20 20 20 45 78 70 72 53 65 74 50 72 6f 70 65 72     ExprSetProper
255d0 74 79 28 70 45 78 70 72 2c 20 45 50 5f 46 69 78  ty(pExpr, EP_Fix
255e0 65 64 43 6f 6c 29 3b 0a 20 20 20 20 61 73 73 65  edCol);.    asse
255f0 72 74 28 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  rt( pExpr->pLeft
25600 3d 3d 30 20 29 3b 0a 20 20 20 20 70 45 78 70 72  ==0 );.    pExpr
25610 2d 3e 70 4c 65 66 74 20 3d 20 73 71 6c 69 74 65  ->pLeft = sqlite
25620 33 45 78 70 72 44 75 70 28 70 43 6f 6e 73 74 2d  3ExprDup(pConst-
25630 3e 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 43 6f  >pParse->db, pCo
25640 6e 73 74 2d 3e 61 70 45 78 70 72 5b 69 2a 32 2b  nst->apExpr[i*2+
25650 31 5d 2c 20 30 29 3b 0a 20 20 20 20 62 72 65 61  1], 0);.    brea
25660 6b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  k;.  }.  return 
25670 57 52 43 5f 50 72 75 6e 65 3b 0a 7d 0a 0a 2f 2a  WRC_Prune;.}../*
25680 0a 2a 2a 20 54 68 65 20 57 48 45 52 45 2d 63 6c  .** The WHERE-cl
25690 61 75 73 65 20 63 6f 6e 73 74 61 6e 74 20 70 72  ause constant pr
256a0 6f 70 61 67 61 74 69 6f 6e 20 6f 70 74 69 6d 69  opagation optimi
256b0 7a 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66  zation..**.** If
256c0 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
256d0 65 20 63 6f 6e 74 61 69 6e 73 20 74 65 72 6d 73  e contains terms
256e0 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 43 4f 4c   of the form COL
256f0 55 4d 4e 3d 43 4f 4e 53 54 41 4e 54 20 6f 72 0a  UMN=CONSTANT or.
25700 2a 2a 20 43 4f 4e 53 54 41 4e 54 3d 43 4f 4c 55  ** CONSTANT=COLU
25710 4d 4e 20 74 68 61 74 20 6d 75 73 74 20 62 65 20  MN that must be 
25720 74 72 65 65 20 28 69 6e 20 6f 74 68 65 72 20 77  tree (in other w
25730 6f 72 64 73 2c 20 69 66 20 74 68 65 20 74 65 72  ords, if the ter
25740 6d 73 20 74 6f 70 2d 6c 65 76 65 6c 0a 2a 2a 20  ms top-level.** 
25750 41 4e 44 2d 63 6f 6e 6e 65 63 74 65 64 20 74 65  AND-connected te
25760 72 6d 73 20 74 68 61 74 20 61 72 65 20 6e 6f 74  rms that are not
25770 20 70 61 72 74 20 6f 66 20 61 20 4f 4e 20 63 6c   part of a ON cl
25780 61 75 73 65 20 66 72 6f 6d 20 61 20 4c 45 46 54  ause from a LEFT
25790 20 4a 4f 49 4e 29 0a 2a 2a 20 74 68 65 6e 20 74   JOIN).** then t
257a0 68 72 6f 75 67 68 6f 75 74 20 74 68 65 20 71 75  hroughout the qu
257b0 65 72 79 20 72 65 70 6c 61 63 65 20 61 6c 6c 20  ery replace all 
257c0 6f 74 68 65 72 20 6f 63 63 75 72 72 65 6e 63 65  other occurrence
257d0 73 20 6f 66 20 43 4f 4c 55 4d 4e 0a 2a 2a 20 77  s of COLUMN.** w
257e0 69 74 68 20 43 4f 4e 53 54 41 4e 54 20 77 69 74  ith CONSTANT wit
257f0 68 69 6e 20 74 68 65 20 57 48 45 52 45 20 63 6c  hin the WHERE cl
25800 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20  ause..**.** For 
25810 65 78 61 6d 70 6c 65 2c 20 74 68 65 20 71 75 65  example, the que
25820 72 79 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 53  ry:.**.**      S
25830 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 2c  ELECT * FROM t1,
25840 20 74 32 2c 20 74 33 20 57 48 45 52 45 20 74 31   t2, t3 WHERE t1
25850 2e 61 3d 33 39 20 41 4e 44 20 74 32 2e 62 3d 74  .a=39 AND t2.b=t
25860 31 2e 61 20 41 4e 44 20 74 33 2e 63 3d 74 32 2e  1.a AND t3.c=t2.
25870 62 0a 2a 2a 0a 2a 2a 20 49 73 20 74 72 61 6e 73  b.**.** Is trans
25880 66 6f 72 6d 65 64 20 69 6e 74 6f 0a 2a 2a 0a 2a  formed into.**.*
25890 2a 20 20 20 20 20 20 53 45 4c 45 43 54 20 2a 20  *      SELECT * 
258a0 46 52 4f 4d 20 74 31 2c 20 74 32 2c 20 74 33 20  FROM t1, t2, t3 
258b0 57 48 45 52 45 20 74 31 2e 61 3d 33 39 20 41 4e  WHERE t1.a=39 AN
258c0 44 20 74 32 2e 62 3d 33 39 20 41 4e 44 20 74 33  D t2.b=39 AND t3
258d0 2e 63 3d 33 39 0a 2a 2a 0a 2a 2a 20 52 65 74 75  .c=39.**.** Retu
258e0 72 6e 20 74 72 75 65 20 69 66 20 61 6e 79 20 74  rn true if any t
258f0 72 61 6e 73 66 6f 72 6d 61 74 69 6f 6e 73 20 77  ransformations w
25900 68 65 72 65 20 6d 61 64 65 20 61 6e 64 20 66 61  here made and fa
25910 6c 73 65 20 69 66 20 6e 6f 74 2e 0a 2a 2a 0a 2a  lse if not..**.*
25920 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  * Implementation
25930 20 6e 6f 74 65 3a 20 20 43 6f 6e 73 74 61 6e 74   note:  Constant
25940 20 70 72 6f 70 61 67 61 74 69 6f 6e 20 69 73 20   propagation is 
25950 74 72 69 63 6b 79 20 64 75 65 20 74 6f 20 61 66  tricky due to af
25960 66 69 6e 69 74 79 0a 2a 2a 20 61 6e 64 20 63 6f  finity.** and co
25970 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
25980 20 69 6e 74 65 72 61 63 74 69 6f 6e 73 2e 20 20   interactions.  
25990 43 6f 6e 73 69 64 65 72 20 74 68 69 73 20 65 78  Consider this ex
259a0 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  ample:.**.**    
259b0 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28  CREATE TABLE t1(
259c0 61 20 49 4e 54 2c 62 20 54 45 58 54 29 3b 0a 2a  a INT,b TEXT);.*
259d0 2a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  *    INSERT INTO
259e0 20 74 31 20 56 41 4c 55 45 53 28 31 32 33 2c 27   t1 VALUES(123,'
259f0 30 31 32 33 27 29 3b 0a 2a 2a 20 20 20 20 53 45  0123');.**    SE
25a00 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 57  LECT * FROM t1 W
25a10 48 45 52 45 20 61 3d 31 32 33 20 41 4e 44 20 62  HERE a=123 AND b
25a20 3d 61 3b 0a 2a 2a 20 20 20 20 53 45 4c 45 43 54  =a;.**    SELECT
25a30 20 2a 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45   * FROM t1 WHERE
25a40 20 61 3d 31 32 33 20 41 4e 44 20 62 3d 31 32 33   a=123 AND b=123
25a50 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 77 6f 20  ;.**.** The two 
25a60 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
25a70 73 20 61 62 6f 76 65 20 73 68 6f 75 6c 64 20 72  s above should r
25a80 65 74 75 72 6e 20 64 69 66 66 65 72 65 6e 74 20  eturn different 
25a90 61 6e 73 77 65 72 73 2e 20 20 62 3d 61 0a 2a 2a  answers.  b=a.**
25aa0 20 69 73 20 61 6c 77 61 79 20 74 72 75 65 20 62   is alway true b
25ab0 65 63 61 75 73 65 20 74 68 65 20 63 6f 6d 70 61  ecause the compa
25ac0 72 69 73 6f 6e 20 75 73 65 73 20 6e 75 6d 65 72  rison uses numer
25ad0 69 63 20 61 66 66 69 6e 69 74 79 2c 20 62 75 74  ic affinity, but
25ae0 20 62 3d 31 32 33 0a 2a 2a 20 69 73 20 66 61 6c   b=123.** is fal
25af0 73 65 20 62 65 63 61 75 73 65 20 69 74 20 75 73  se because it us
25b00 65 73 20 74 65 78 74 20 61 66 66 69 6e 69 74 79  es text affinity
25b10 20 61 6e 64 20 27 30 31 32 33 27 20 69 73 20 6e   and '0123' is n
25b20 6f 74 20 74 68 65 20 73 61 6d 65 20 61 73 20 27  ot the same as '
25b30 31 32 33 27 2e 0a 2a 2a 20 54 6f 20 77 6f 72 6b  123'..** To work
25b40 20 61 72 6f 75 6e 64 20 74 68 69 73 2c 20 74 68   around this, th
25b50 65 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65  e expression tre
25b60 65 20 69 73 20 6e 6f 74 20 61 63 74 75 61 6c 6c  e is not actuall
25b70 79 20 63 68 61 6e 67 65 64 20 66 72 6f 6d 0a 2a  y changed from.*
25b80 2a 20 22 62 3d 61 22 20 74 6f 20 22 62 3d 31 32  * "b=a" to "b=12
25b90 33 22 20 62 75 74 20 72 61 74 68 65 72 20 74 68  3" but rather th
25ba0 65 20 22 61 22 20 69 6e 20 22 62 3d 61 22 20 69  e "a" in "b=a" i
25bb0 73 20 74 61 67 67 65 64 20 77 69 74 68 20 45 50  s tagged with EP
25bc0 5f 46 69 78 65 64 43 6f 6c 0a 2a 2a 20 61 6e 64  _FixedCol.** and
25bd0 20 74 68 65 20 22 31 32 33 22 20 76 61 6c 75 65   the "123" value
25be0 20 69 73 20 68 75 6e 67 20 6f 66 66 20 6f 66 20   is hung off of 
25bf0 74 68 65 20 70 4c 65 66 74 20 70 6f 69 6e 74 65  the pLeft pointe
25c00 72 2e 20 20 43 6f 64 65 20 67 65 6e 65 72 61 74  r.  Code generat
25c10 6f 72 0a 2a 2a 20 72 6f 75 74 69 6e 65 73 20 6b  or.** routines k
25c20 6e 6f 77 20 74 6f 20 67 65 6e 65 72 61 74 65 20  now to generate 
25c30 74 68 65 20 63 6f 6e 73 74 61 6e 74 20 22 31 32  the constant "12
25c40 33 22 20 69 6e 73 74 65 61 64 20 6f 66 20 6c 6f  3" instead of lo
25c50 6f 6b 69 6e 67 20 75 70 20 74 68 65 0a 2a 2a 20  oking up the.** 
25c60 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 2e 20 20 41  column value.  A
25c70 6c 73 6f 2c 20 74 6f 20 61 76 6f 69 64 20 63 6f  lso, to avoid co
25c80 6c 6c 61 74 69 6f 6e 20 70 72 6f 62 6c 65 6d 73  llation problems
25c90 2c 20 74 68 69 73 20 6f 70 74 69 6d 69 7a 61 74  , this optimizat
25ca0 69 6f 6e 20 69 73 0a 2a 2a 20 6f 6e 6c 79 20 61  ion is.** only a
25cb0 74 74 65 6d 70 74 65 64 20 69 66 20 74 68 65 20  ttempted if the 
25cc0 22 61 3d 31 32 33 22 20 74 65 72 6d 20 75 73 65  "a=123" term use
25cd0 73 20 74 68 65 20 64 65 66 61 75 6c 74 20 42 49  s the default BI
25ce0 4e 41 52 59 20 63 6f 6c 6c 61 74 69 6f 6e 2e 0a  NARY collation..
25cf0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72  */.static int pr
25d00 6f 70 61 67 61 74 65 43 6f 6e 73 74 61 6e 74 73  opagateConstants
25d10 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
25d20 65 2c 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73  e,   /* The pars
25d30 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
25d40 20 53 65 6c 65 63 74 20 2a 70 20 20 20 20 20 20   Select *p      
25d50 20 20 2f 2a 20 54 68 65 20 71 75 65 72 79 20 69    /* The query i
25d60 6e 20 77 68 69 63 68 20 74 6f 20 70 72 6f 70 61  n which to propa
25d70 67 61 74 65 20 63 6f 6e 73 74 61 6e 74 73 20 2a  gate constants *
25d80 2f 0a 29 7b 0a 20 20 57 68 65 72 65 43 6f 6e 73  /.){.  WhereCons
25d90 74 20 78 3b 0a 20 20 57 61 6c 6b 65 72 20 77 3b  t x;.  Walker w;
25da0 0a 20 20 69 6e 74 20 6e 43 68 6e 67 20 3d 20 30  .  int nChng = 0
25db0 3b 0a 20 20 78 2e 70 50 61 72 73 65 20 3d 20 70  ;.  x.pParse = p
25dc0 50 61 72 73 65 3b 0a 20 20 64 6f 7b 0a 20 20 20  Parse;.  do{.   
25dd0 20 78 2e 6e 43 6f 6e 73 74 20 3d 20 30 3b 0a 20   x.nConst = 0;. 
25de0 20 20 20 78 2e 6e 43 68 6e 67 20 3d 20 30 3b 0a     x.nChng = 0;.
25df0 20 20 20 20 78 2e 61 70 45 78 70 72 20 3d 20 30      x.apExpr = 0
25e00 3b 0a 20 20 20 20 66 69 6e 64 43 6f 6e 73 74 49  ;.    findConstI
25e10 6e 57 68 65 72 65 28 26 78 2c 20 70 2d 3e 70 57  nWhere(&x, p->pW
25e20 68 65 72 65 29 3b 0a 20 20 20 20 69 66 28 20 78  here);.    if( x
25e30 2e 6e 43 6f 6e 73 74 20 29 7b 0a 20 20 20 20 20  .nConst ){.     
25e40 20 6d 65 6d 73 65 74 28 26 77 2c 20 30 2c 20 73   memset(&w, 0, s
25e50 69 7a 65 6f 66 28 77 29 29 3b 0a 20 20 20 20 20  izeof(w));.     
25e60 20 77 2e 70 50 61 72 73 65 20 3d 20 70 50 61 72   w.pParse = pPar
25e70 73 65 3b 0a 20 20 20 20 20 20 77 2e 78 45 78 70  se;.      w.xExp
25e80 72 43 61 6c 6c 62 61 63 6b 20 3d 20 70 72 6f 70  rCallback = prop
25e90 61 67 61 74 65 43 6f 6e 73 74 61 6e 74 45 78 70  agateConstantExp
25ea0 72 52 65 77 72 69 74 65 3b 0a 20 20 20 20 20 20  rRewrite;.      
25eb0 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63  w.xSelectCallbac
25ec0 6b 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63  k = sqlite3Selec
25ed0 74 57 61 6c 6b 4e 6f 6f 70 3b 0a 20 20 20 20 20  tWalkNoop;.     
25ee0 20 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61   w.xSelectCallba
25ef0 63 6b 32 20 3d 20 30 3b 0a 20 20 20 20 20 20 77  ck2 = 0;.      w
25f00 2e 77 61 6c 6b 65 72 44 65 70 74 68 20 3d 20 30  .walkerDepth = 0
25f10 3b 0a 20 20 20 20 20 20 77 2e 75 2e 70 43 6f 6e  ;.      w.u.pCon
25f20 73 74 20 3d 20 26 78 3b 0a 20 20 20 20 20 20 73  st = &x;.      s
25f30 71 6c 69 74 65 33 57 61 6c 6b 45 78 70 72 28 26  qlite3WalkExpr(&
25f40 77 2c 20 70 2d 3e 70 57 68 65 72 65 29 3b 0a 20  w, p->pWhere);. 
25f50 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72       sqlite3DbFr
25f60 65 65 28 78 2e 70 50 61 72 73 65 2d 3e 64 62 2c  ee(x.pParse->db,
25f70 20 78 2e 61 70 45 78 70 72 29 3b 0a 20 20 20 20   x.apExpr);.    
25f80 20 20 6e 43 68 6e 67 20 2b 3d 20 78 2e 6e 43 68    nChng += x.nCh
25f90 6e 67 3b 0a 20 20 20 20 7d 0a 20 20 7d 77 68 69  ng;.    }.  }whi
25fa0 6c 65 28 20 78 2e 6e 43 68 6e 67 20 29 3b 20 20  le( x.nChng );  
25fb0 0a 20 20 72 65 74 75 72 6e 20 6e 43 68 6e 67 3b  .  return nChng;
25fc0 0a 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64  .}..#if !defined
25fd0 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42  (SQLITE_OMIT_SUB
25fe0 51 55 45 52 59 29 20 7c 7c 20 21 64 65 66 69 6e  QUERY) || !defin
25ff0 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ed(SQLITE_OMIT_V
26000 49 45 57 29 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20  IEW)./*.** Make 
26010 63 6f 70 69 65 73 20 6f 66 20 72 65 6c 65 76 61  copies of releva
26020 6e 74 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  nt WHERE clause 
26030 74 65 72 6d 73 20 6f 66 20 74 68 65 20 6f 75 74  terms of the out
26040 65 72 20 71 75 65 72 79 20 69 6e 74 6f 0a 2a 2a  er query into.**
26050 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
26060 65 20 6f 66 20 73 75 62 71 75 65 72 79 2e 20 20  e of subquery.  
26070 45 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20  Example:.**.**  
26080 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
26090 28 53 45 4c 45 43 54 20 61 20 41 53 20 78 2c 20  (SELECT a AS x, 
260a0 63 2d 64 20 41 53 20 79 20 46 52 4f 4d 20 74 31  c-d AS y FROM t1
260b0 29 20 57 48 45 52 45 20 78 3d 35 20 41 4e 44 20  ) WHERE x=5 AND 
260c0 79 3d 31 30 3b 0a 2a 2a 0a 2a 2a 20 54 72 61 6e  y=10;.**.** Tran
260d0 73 66 6f 72 6d 65 64 20 69 6e 74 6f 3a 0a 2a 2a  sformed into:.**
260e0 0a 2a 2a 20 20 20 20 53 45 4c 45 43 54 20 2a 20  .**    SELECT * 
260f0 46 52 4f 4d 20 28 53 45 4c 45 43 54 20 61 20 41  FROM (SELECT a A
26100 53 20 78 2c 20 63 2d 64 20 41 53 20 79 20 46 52  S x, c-d AS y FR
26110 4f 4d 20 74 31 20 57 48 45 52 45 20 61 3d 35 20  OM t1 WHERE a=5 
26120 41 4e 44 20 63 2d 64 3d 31 30 29 0a 2a 2a 20 20  AND c-d=10).**  
26130 20 20 20 57 48 45 52 45 20 78 3d 35 20 41 4e 44     WHERE x=5 AND
26140 20 79 3d 31 30 3b 0a 2a 2a 0a 2a 2a 20 54 68 65   y=10;.**.** The
26150 20 68 6f 70 65 20 69 73 20 74 68 61 74 20 74 68   hope is that th
26160 65 20 74 65 72 6d 73 20 61 64 64 65 64 20 74 6f  e terms added to
26170 20 74 68 65 20 69 6e 6e 65 72 20 71 75 65 72 79   the inner query
26180 20 77 69 6c 6c 20 6d 61 6b 65 20 69 74 20 6d 6f   will make it mo
26190 72 65 0a 2a 2a 20 65 66 66 69 63 69 65 6e 74 2e  re.** efficient.
261a0 0a 2a 2a 0a 2a 2a 20 44 6f 20 6e 6f 74 20 61 74  .**.** Do not at
261b0 74 65 6d 70 74 20 74 68 69 73 20 6f 70 74 69 6d  tempt this optim
261c0 69 7a 61 74 69 6f 6e 20 69 66 3a 0a 2a 2a 0a 2a  ization if:.**.*
261d0 2a 20 20 20 28 31 29 20 28 2a 2a 20 54 68 69 73  *   (1) (** This
261e0 20 72 65 73 74 72 69 63 74 69 6f 6e 20 77 61 73   restriction was
261f0 20 72 65 6d 6f 76 65 64 20 6f 6e 20 32 30 31 37   removed on 2017
26200 2d 30 39 2d 32 39 2e 20 20 57 65 20 75 73 65 64  -09-29.  We used
26210 20 74 6f 0a 2a 2a 20 20 20 20 20 20 20 20 20 20   to.**          
26220 20 64 69 73 61 6c 6c 6f 77 20 74 68 69 73 20 6f   disallow this o
26230 70 74 69 6d 69 7a 61 74 69 6f 6e 20 66 6f 72 20  ptimization for 
26240 61 67 67 72 65 67 61 74 65 20 73 75 62 71 75 65  aggregate subque
26250 72 69 65 73 2c 20 62 75 74 20 6e 6f 77 0a 2a 2a  ries, but now.**
26260 20 20 20 20 20 20 20 20 20 20 20 69 74 20 69 73             it is
26270 20 61 6c 6c 6f 77 65 64 20 62 79 20 70 75 74 74   allowed by putt
26280 69 6e 67 20 74 68 65 20 65 78 74 72 61 20 74 65  ing the extra te
26290 72 6d 73 20 6f 6e 20 74 68 65 20 48 41 56 49 4e  rms on the HAVIN
262a0 47 20 63 6c 61 75 73 65 2e 0a 2a 2a 20 20 20 20  G clause..**    
262b0 20 20 20 20 20 20 20 54 68 65 20 61 64 64 65 64         The added
262c0 20 48 41 56 49 4e 47 20 63 6c 61 75 73 65 20 69   HAVING clause i
262d0 73 20 70 6f 69 6e 74 6c 65 73 73 20 69 66 20 74  s pointless if t
262e0 68 65 20 73 75 62 71 75 65 72 79 20 6c 61 63 6b  he subquery lack
262f0 73 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 61  s.**           a
26300 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65   GROUP BY clause
26310 2e 20 20 42 75 74 20 73 75 63 68 20 61 20 48 41  .  But such a HA
26320 56 49 4e 47 20 63 6c 61 75 73 65 20 69 73 20 61  VING clause is a
26330 6c 73 6f 20 68 61 72 6d 6c 65 73 73 0a 2a 2a 20  lso harmless.** 
26340 20 20 20 20 20 20 20 20 20 20 73 6f 20 74 68 65            so the
26350 72 65 20 64 6f 65 73 20 6e 6f 74 20 61 70 70 65  re does not appe
26360 61 72 20 74 6f 20 62 65 20 61 6e 79 20 72 65 61  ar to be any rea
26370 73 6f 6e 20 74 6f 20 61 64 64 20 65 78 74 72 61  son to add extra
26380 20 6c 6f 67 69 63 0a 2a 2a 20 20 20 20 20 20 20   logic.**       
26390 20 20 20 20 74 6f 20 73 75 70 70 72 65 73 73 20      to suppress 
263a0 69 74 2e 20 2a 2a 29 0a 2a 2a 0a 2a 2a 20 20 20  it. **).**.**   
263b0 28 32 29 20 54 68 65 20 69 6e 6e 65 72 20 71 75  (2) The inner qu
263c0 65 72 79 20 69 73 20 74 68 65 20 72 65 63 75 72  ery is the recur
263d0 73 69 76 65 20 70 61 72 74 20 6f 66 20 61 20 63  sive part of a c
263e0 6f 6d 6d 6f 6e 20 74 61 62 6c 65 20 65 78 70 72  ommon table expr
263f0 65 73 73 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20  ession..**.**   
26400 28 33 29 20 54 68 65 20 69 6e 6e 65 72 20 71 75  (3) The inner qu
26410 65 72 79 20 68 61 73 20 61 20 4c 49 4d 49 54 20  ery has a LIMIT 
26420 63 6c 61 75 73 65 20 28 73 69 6e 63 65 20 74 68  clause (since th
26430 65 20 63 68 61 6e 67 65 73 20 74 6f 20 74 68 65  e changes to the
26440 20 57 48 45 52 45 0a 2a 2a 20 20 20 20 20 20 20   WHERE.**       
26450 63 6c 61 75 73 65 20 77 6f 75 6c 64 20 63 68 61  clause would cha
26460 6e 67 65 20 74 68 65 20 6d 65 61 6e 69 6e 67 20  nge the meaning 
26470 6f 66 20 74 68 65 20 4c 49 4d 49 54 29 2e 0a 2a  of the LIMIT)..*
26480 2a 0a 2a 2a 20 20 20 28 34 29 20 54 68 65 20 69  *.**   (4) The i
26490 6e 6e 65 72 20 71 75 65 72 79 20 69 73 20 74 68  nner query is th
264a0 65 20 72 69 67 68 74 20 6f 70 65 72 61 6e 64 20  e right operand 
264b0 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e 20 61  of a LEFT JOIN a
264c0 6e 64 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20  nd the.**       
264d0 65 78 70 72 65 73 73 69 6f 6e 20 74 6f 20 62 65  expression to be
264e0 20 70 75 73 68 65 64 20 64 6f 77 6e 20 64 6f 65   pushed down doe
264f0 73 20 6e 6f 74 20 63 6f 6d 65 20 66 72 6f 6d 20  s not come from 
26500 74 68 65 20 4f 4e 20 63 6c 61 75 73 65 0a 2a 2a  the ON clause.**
26510 20 20 20 20 20 20 20 6f 6e 20 74 68 61 74 20 4c         on that L
26520 45 46 54 20 4a 4f 49 4e 2e 0a 2a 2a 0a 2a 2a 20  EFT JOIN..**.** 
26530 20 20 28 35 29 20 54 68 65 20 57 48 45 52 45 20    (5) The WHERE 
26540 63 6c 61 75 73 65 20 65 78 70 72 65 73 73 69 6f  clause expressio
26550 6e 20 6f 72 69 67 69 6e 61 74 65 73 20 69 6e 20  n originates in 
26560 74 68 65 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20  the ON or USING 
26570 63 6c 61 75 73 65 0a 2a 2a 20 20 20 20 20 20 20  clause.**       
26580 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e 20 77  of a LEFT JOIN w
26590 68 65 72 65 20 69 43 75 72 73 6f 72 20 69 73 20  here iCursor is 
265a0 6e 6f 74 20 74 68 65 20 72 69 67 68 74 2d 68 61  not the right-ha
265b0 6e 64 20 74 61 62 6c 65 20 6f 66 20 74 68 61 74  nd table of that
265c0 0a 2a 2a 20 20 20 20 20 20 20 6c 65 66 74 20 6a  .**       left j
265d0 6f 69 6e 2e 20 20 41 6e 20 65 78 61 6d 70 6c 65  oin.  An example
265e0 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20  :.**.**         
265f0 20 20 53 45 4c 45 43 54 20 2a 0a 2a 2a 20 20 20    SELECT *.**   
26600 20 20 20 20 20 20 20 20 46 52 4f 4d 20 28 53 45          FROM (SE
26610 4c 45 43 54 20 31 20 41 53 20 61 31 20 55 4e 49  LECT 1 AS a1 UNI
26620 4f 4e 20 41 4c 4c 20 53 45 4c 45 43 54 20 32 29  ON ALL SELECT 2)
26630 20 41 53 20 61 61 0a 2a 2a 20 20 20 20 20 20 20   AS aa.**       
26640 20 20 20 20 4a 4f 49 4e 20 28 53 45 4c 45 43 54      JOIN (SELECT
26650 20 31 20 41 53 20 62 32 20 55 4e 49 4f 4e 20 41   1 AS b2 UNION A
26660 4c 4c 20 53 45 4c 45 43 54 20 32 29 20 41 53 20  LL SELECT 2) AS 
26670 62 62 20 4f 4e 20 28 61 31 3d 62 32 29 0a 2a 2a  bb ON (a1=b2).**
26680 20 20 20 20 20 20 20 20 20 20 20 4c 45 46 54 20             LEFT 
26690 4a 4f 49 4e 20 28 53 45 4c 45 43 54 20 38 20 41  JOIN (SELECT 8 A
266a0 53 20 63 33 20 55 4e 49 4f 4e 20 41 4c 4c 20 53  S c3 UNION ALL S
266b0 45 4c 45 43 54 20 39 29 20 41 53 20 63 63 20 4f  ELECT 9) AS cc O
266c0 4e 20 28 62 32 3d 32 29 3b 0a 2a 2a 0a 2a 2a 20  N (b2=2);.**.** 
266d0 20 20 20 20 20 20 54 68 65 20 63 6f 72 72 65 63        The correc
266e0 74 20 61 6e 73 77 65 72 20 69 73 20 74 68 72 65  t answer is thre
266f0 65 20 72 6f 77 73 3a 20 20 28 31 2c 31 2c 4e 55  e rows:  (1,1,NU
26700 4c 4c 29 2c 28 32 2c 32 2c 38 29 2c 28 32 2c 32  LL),(2,2,8),(2,2
26710 2c 39 29 2e 0a 2a 2a 20 20 20 20 20 20 20 42 75  ,9)..**       Bu
26720 74 20 69 66 20 74 68 65 20 28 62 32 3d 32 29 20  t if the (b2=2) 
26730 74 65 72 6d 20 77 65 72 65 20 74 6f 20 62 65 20  term were to be 
26740 70 75 73 68 65 64 20 64 6f 77 6e 20 69 6e 74 6f  pushed down into
26750 20 74 68 65 20 62 62 20 73 75 62 71 75 65 72 79   the bb subquery
26760 2c 0a 2a 2a 20 20 20 20 20 20 20 74 68 65 6e 20  ,.**       then 
26770 74 68 65 20 28 31 2c 31 2c 4e 55 4c 4c 29 20 72  the (1,1,NULL) r
26780 6f 77 20 77 6f 75 6c 64 20 62 65 20 73 75 70 70  ow would be supp
26790 72 65 73 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 20  ressed..**.**   
267a0 28 36 29 20 54 68 65 20 69 6e 6e 65 72 20 71 75  (6) The inner qu
267b0 65 72 79 20 66 65 61 74 75 72 65 73 20 6f 6e 65  ery features one
267c0 20 6f 72 20 6d 6f 72 65 20 77 69 6e 64 6f 77 2d   or more window-
267d0 66 75 6e 63 74 69 6f 6e 73 20 28 73 69 6e 63 65  functions (since
267e0 20 0a 2a 2a 20 20 20 20 20 20 20 63 68 61 6e 67   .**       chang
267f0 65 73 20 74 6f 20 74 68 65 20 57 48 45 52 45 20  es to the WHERE 
26800 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 69 6e  clause of the in
26810 6e 65 72 20 71 75 65 72 79 20 63 6f 75 6c 64 20  ner query could 
26820 63 68 61 6e 67 65 20 74 68 65 20 0a 2a 2a 20 20  change the .**  
26830 20 20 20 20 20 77 69 6e 64 6f 77 20 6f 76 65 72       window over
26840 20 77 68 69 63 68 20 77 69 6e 64 6f 77 20 66 75   which window fu
26850 6e 63 74 69 6f 6e 73 20 61 72 65 20 63 61 6c 63  nctions are calc
26860 75 6c 61 74 65 64 29 2e 0a 2a 2a 0a 2a 2a 20 52  ulated)..**.** R
26870 65 74 75 72 6e 20 30 20 69 66 20 6e 6f 20 63 68  eturn 0 if no ch
26880 61 6e 67 65 73 20 61 72 65 20 6d 61 64 65 20 61  anges are made a
26890 6e 64 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 6f  nd non-zero if o
268a0 6e 65 20 6f 72 20 6d 6f 72 65 20 57 48 45 52 45  ne or more WHERE
268b0 20 63 6c 61 75 73 65 0a 2a 2a 20 74 65 72 6d 73   clause.** terms
268c0 20 61 72 65 20 64 75 70 6c 69 63 61 74 65 64 20   are duplicated 
268d0 69 6e 74 6f 20 74 68 65 20 73 75 62 71 75 65 72  into the subquer
268e0 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  y..*/.static int
268f0 20 70 75 73 68 44 6f 77 6e 57 68 65 72 65 54 65   pushDownWhereTe
26900 72 6d 73 28 0a 20 20 50 61 72 73 65 20 2a 70 50  rms(.  Parse *pP
26910 61 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20  arse,        /* 
26920 50 61 72 73 65 20 63 6f 6e 74 65 78 74 20 28 66  Parse context (f
26930 6f 72 20 6d 61 6c 6c 6f 63 28 29 20 61 6e 64 20  or malloc() and 
26940 65 72 72 6f 72 20 72 65 70 6f 72 74 69 6e 67 29  error reporting)
26950 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53   */.  Select *pS
26960 75 62 71 2c 20 20 20 20 20 20 20 20 2f 2a 20 54  ubq,        /* T
26970 68 65 20 73 75 62 71 75 65 72 79 20 77 68 6f 73  he subquery whos
26980 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 69  e WHERE clause i
26990 73 20 74 6f 20 62 65 20 61 75 67 6d 65 6e 74 65  s to be augmente
269a0 64 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 57 68  d */.  Expr *pWh
269b0 65 72 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  ere,         /* 
269c0 54 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  The WHERE clause
269d0 20 6f 66 20 74 68 65 20 6f 75 74 65 72 20 71 75   of the outer qu
269e0 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20 69 43 75  ery */.  int iCu
269f0 72 73 6f 72 2c 20 20 20 20 20 20 20 20 20 20 2f  rsor,          /
26a00 2a 20 43 75 72 73 6f 72 20 6e 75 6d 62 65 72 20  * Cursor number 
26a10 6f 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20  of the subquery 
26a20 2a 2f 0a 20 20 69 6e 74 20 69 73 4c 65 66 74 4a  */.  int isLeftJ
26a30 6f 69 6e 20 20 20 20 20 20 20 20 2f 2a 20 54 72  oin        /* Tr
26a40 75 65 20 69 66 20 70 53 75 62 71 20 69 73 20 74  ue if pSubq is t
26a50 68 65 20 72 69 67 68 74 20 74 65 72 6d 20 6f 66  he right term of
26a60 20 61 20 4c 45 46 54 20 4a 4f 49 4e 20 2a 2f 0a   a LEFT JOIN */.
26a70 29 7b 0a 20 20 45 78 70 72 20 2a 70 4e 65 77 3b  ){.  Expr *pNew;
26a80 0a 20 20 69 6e 74 20 6e 43 68 6e 67 20 3d 20 30  .  int nChng = 0
26a90 3b 0a 20 20 69 66 28 20 70 57 68 65 72 65 3d 3d  ;.  if( pWhere==
26aa0 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
26ab0 69 66 28 20 70 53 75 62 71 2d 3e 73 65 6c 46 6c  if( pSubq->selFl
26ac0 61 67 73 20 26 20 53 46 5f 52 65 63 75 72 73 69  ags & SF_Recursi
26ad0 76 65 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20  ve ) return 0;  
26ae0 2f 2a 20 72 65 73 74 72 69 63 74 69 6f 6e 20 28  /* restriction (
26af0 32 29 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53  2) */..#ifndef S
26b00 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 49 4e 44 4f  QLITE_OMIT_WINDO
26b10 57 46 55 4e 43 0a 20 20 69 66 28 20 70 53 75 62  WFUNC.  if( pSub
26b20 71 2d 3e 70 57 69 6e 20 29 20 72 65 74 75 72 6e  q->pWin ) return
26b30 20 30 3b 20 20 20 20 2f 2a 20 72 65 73 74 72 69   0;    /* restri
26b40 63 74 69 6f 6e 20 28 36 29 20 2a 2f 0a 23 65 6e  ction (6) */.#en
26b50 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  dif..#ifdef SQLI
26b60 54 45 5f 44 45 42 55 47 0a 20 20 2f 2a 20 4f 6e  TE_DEBUG.  /* On
26b70 6c 79 20 74 68 65 20 66 69 72 73 74 20 74 65 72  ly the first ter
26b80 6d 20 6f 66 20 61 20 63 6f 6d 70 6f 75 6e 64 20  m of a compound 
26b90 63 61 6e 20 68 61 76 65 20 61 20 57 49 54 48 20  can have a WITH 
26ba0 63 6c 61 75 73 65 2e 20 20 42 75 74 20 6d 61 6b  clause.  But mak
26bb0 65 0a 20 20 2a 2a 20 73 75 72 65 20 6e 6f 20 6f  e.  ** sure no o
26bc0 74 68 65 72 20 74 65 72 6d 73 20 61 72 65 20 6d  ther terms are m
26bd0 61 72 6b 65 64 20 53 46 5f 52 65 63 75 72 73 69  arked SF_Recursi
26be0 76 65 20 69 6e 20 63 61 73 65 20 73 6f 6d 65 74  ve in case somet
26bf0 68 69 6e 67 20 63 68 61 6e 67 65 73 0a 20 20 2a  hing changes.  *
26c00 2a 20 69 6e 20 74 68 65 20 66 75 74 75 72 65 2e  * in the future.
26c10 0a 20 20 2a 2f 0a 20 20 7b 0a 20 20 20 20 53 65  .  */.  {.    Se
26c20 6c 65 63 74 20 2a 70 58 3b 20 20 0a 20 20 20 20  lect *pX;  .    
26c30 66 6f 72 28 70 58 3d 70 53 75 62 71 3b 20 70 58  for(pX=pSubq; pX
26c40 3b 20 70 58 3d 70 58 2d 3e 70 50 72 69 6f 72 29  ; pX=pX->pPrior)
26c50 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
26c60 28 70 58 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20  (pX->selFlags & 
26c70 28 53 46 5f 52 65 63 75 72 73 69 76 65 29 29 3d  (SF_Recursive))=
26c80 3d 30 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  =0 );.    }.  }.
26c90 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 70 53  #endif..  if( pS
26ca0 75 62 71 2d 3e 70 4c 69 6d 69 74 21 3d 30 20 29  ubq->pLimit!=0 )
26cb0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20  {.    return 0; 
26cc0 2f 2a 20 72 65 73 74 72 69 63 74 69 6f 6e 20 28  /* restriction (
26cd0 33 29 20 2a 2f 0a 20 20 7d 0a 20 20 77 68 69 6c  3) */.  }.  whil
26ce0 65 28 20 70 57 68 65 72 65 2d 3e 6f 70 3d 3d 54  e( pWhere->op==T
26cf0 4b 5f 41 4e 44 20 29 7b 0a 20 20 20 20 6e 43 68  K_AND ){.    nCh
26d00 6e 67 20 2b 3d 20 70 75 73 68 44 6f 77 6e 57 68  ng += pushDownWh
26d10 65 72 65 54 65 72 6d 73 28 70 50 61 72 73 65 2c  ereTerms(pParse,
26d20 20 70 53 75 62 71 2c 20 70 57 68 65 72 65 2d 3e   pSubq, pWhere->
26d30 70 52 69 67 68 74 2c 0a 20 20 20 20 20 20 20 20  pRight,.        
26d40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26d50 20 20 20 20 20 20 20 20 69 43 75 72 73 6f 72 2c          iCursor,
26d60 20 69 73 4c 65 66 74 4a 6f 69 6e 29 3b 0a 20 20   isLeftJoin);.  
26d70 20 20 70 57 68 65 72 65 20 3d 20 70 57 68 65 72    pWhere = pWher
26d80 65 2d 3e 70 4c 65 66 74 3b 0a 20 20 7d 0a 20 20  e->pLeft;.  }.  
26d90 69 66 28 20 69 73 4c 65 66 74 4a 6f 69 6e 0a 20  if( isLeftJoin. 
26da0 20 20 26 26 20 28 45 78 70 72 48 61 73 50 72 6f    && (ExprHasPro
26db0 70 65 72 74 79 28 70 57 68 65 72 65 2c 45 50 5f  perty(pWhere,EP_
26dc0 46 72 6f 6d 4a 6f 69 6e 29 3d 3d 30 0a 20 20 20  FromJoin)==0.   
26dd0 20 20 20 20 20 20 7c 7c 20 70 57 68 65 72 65 2d        || pWhere-
26de0 3e 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65  >iRightJoinTable
26df0 21 3d 69 43 75 72 73 6f 72 29 0a 20 20 29 7b 0a  !=iCursor).  ){.
26e00 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 2f 2a      return 0; /*
26e10 20 72 65 73 74 72 69 63 74 69 6f 6e 20 28 34 29   restriction (4)
26e20 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20 45 78   */.  }.  if( Ex
26e30 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 57  prHasProperty(pW
26e40 68 65 72 65 2c 45 50 5f 46 72 6f 6d 4a 6f 69 6e  here,EP_FromJoin
26e50 29 20 26 26 20 70 57 68 65 72 65 2d 3e 69 52 69  ) && pWhere->iRi
26e60 67 68 74 4a 6f 69 6e 54 61 62 6c 65 21 3d 69 43  ghtJoinTable!=iC
26e70 75 72 73 6f 72 20 29 7b 0a 20 20 20 20 72 65 74  ursor ){.    ret
26e80 75 72 6e 20 30 3b 20 2f 2a 20 72 65 73 74 72 69  urn 0; /* restri
26e90 63 74 69 6f 6e 20 28 35 29 20 2a 2f 0a 20 20 7d  ction (5) */.  }
26ea0 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78  .  if( sqlite3Ex
26eb0 70 72 49 73 54 61 62 6c 65 43 6f 6e 73 74 61 6e  prIsTableConstan
26ec0 74 28 70 57 68 65 72 65 2c 20 69 43 75 72 73 6f  t(pWhere, iCurso
26ed0 72 29 20 29 7b 0a 20 20 20 20 6e 43 68 6e 67 2b  r) ){.    nChng+
26ee0 2b 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 70 53  +;.    while( pS
26ef0 75 62 71 20 29 7b 0a 20 20 20 20 20 20 53 75 62  ubq ){.      Sub
26f00 73 74 43 6f 6e 74 65 78 74 20 78 3b 0a 20 20 20  stContext x;.   
26f10 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65     pNew = sqlite
26f20 33 45 78 70 72 44 75 70 28 70 50 61 72 73 65 2d  3ExprDup(pParse-
26f30 3e 64 62 2c 20 70 57 68 65 72 65 2c 20 30 29 3b  >db, pWhere, 0);
26f40 0a 20 20 20 20 20 20 75 6e 73 65 74 4a 6f 69 6e  .      unsetJoin
26f50 45 78 70 72 28 70 4e 65 77 2c 20 2d 31 29 3b 0a  Expr(pNew, -1);.
26f60 20 20 20 20 20 20 78 2e 70 50 61 72 73 65 20 3d        x.pParse =
26f70 20 70 50 61 72 73 65 3b 0a 20 20 20 20 20 20 78   pParse;.      x
26f80 2e 69 54 61 62 6c 65 20 3d 20 69 43 75 72 73 6f  .iTable = iCurso
26f90 72 3b 0a 20 20 20 20 20 20 78 2e 69 4e 65 77 54  r;.      x.iNewT
26fa0 61 62 6c 65 20 3d 20 69 43 75 72 73 6f 72 3b 0a  able = iCursor;.
26fb0 20 20 20 20 20 20 78 2e 69 73 4c 65 66 74 4a 6f        x.isLeftJo
26fc0 69 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 78 2e  in = 0;.      x.
26fd0 70 45 4c 69 73 74 20 3d 20 70 53 75 62 71 2d 3e  pEList = pSubq->
26fe0 70 45 4c 69 73 74 3b 0a 20 20 20 20 20 20 70 4e  pEList;.      pN
26ff0 65 77 20 3d 20 73 75 62 73 74 45 78 70 72 28 26  ew = substExpr(&
27000 78 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20 20 20  x, pNew);.      
27010 69 66 28 20 70 53 75 62 71 2d 3e 73 65 6c 46 6c  if( pSubq->selFl
27020 61 67 73 20 26 20 53 46 5f 41 67 67 72 65 67 61  ags & SF_Aggrega
27030 74 65 20 29 7b 0a 20 20 20 20 20 20 20 20 70 53  te ){.        pS
27040 75 62 71 2d 3e 70 48 61 76 69 6e 67 20 3d 20 73  ubq->pHaving = s
27050 71 6c 69 74 65 33 45 78 70 72 41 6e 64 28 70 50  qlite3ExprAnd(pP
27060 61 72 73 65 2c 20 70 53 75 62 71 2d 3e 70 48 61  arse, pSubq->pHa
27070 76 69 6e 67 2c 20 70 4e 65 77 29 3b 0a 20 20 20  ving, pNew);.   
27080 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
27090 20 20 70 53 75 62 71 2d 3e 70 57 68 65 72 65 20    pSubq->pWhere 
270a0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 64  = sqlite3ExprAnd
270b0 28 70 50 61 72 73 65 2c 20 70 53 75 62 71 2d 3e  (pParse, pSubq->
270c0 70 57 68 65 72 65 2c 20 70 4e 65 77 29 3b 0a 20  pWhere, pNew);. 
270d0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 53 75       }.      pSu
270e0 62 71 20 3d 20 70 53 75 62 71 2d 3e 70 50 72 69  bq = pSubq->pPri
270f0 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  or;.    }.  }.  
27100 72 65 74 75 72 6e 20 6e 43 68 6e 67 3b 0a 7d 0a  return nChng;.}.
27110 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e  #endif /* !defin
27120 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ed(SQLITE_OMIT_S
27130 55 42 51 55 45 52 59 29 20 7c 7c 20 21 64 65 66  UBQUERY) || !def
27140 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
27150 5f 56 49 45 57 29 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  _VIEW) */../*.**
27160 20 54 68 65 20 70 46 75 6e 63 20 69 73 20 74 68   The pFunc is th
27170 65 20 6f 6e 6c 79 20 61 67 67 72 65 67 61 74 65  e only aggregate
27180 20 66 75 6e 63 74 69 6f 6e 20 69 6e 20 74 68 65   function in the
27190 20 71 75 65 72 79 2e 20 20 43 68 65 63 6b 20 74   query.  Check t
271a0 6f 20 73 65 65 0a 2a 2a 20 69 66 20 74 68 65 20  o see.** if the 
271b0 71 75 65 72 79 20 69 73 20 61 20 63 61 6e 64 69  query is a candi
271c0 64 61 74 65 20 66 6f 72 20 74 68 65 20 6d 69 6e  date for the min
271d0 2f 6d 61 78 20 6f 70 74 69 6d 69 7a 61 74 69 6f  /max optimizatio
271e0 6e 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  n. .**.** If the
271f0 20 71 75 65 72 79 20 69 73 20 61 20 63 61 6e 64   query is a cand
27200 69 64 61 74 65 20 66 6f 72 20 74 68 65 20 6d 69  idate for the mi
27210 6e 2f 6d 61 78 20 6f 70 74 69 6d 69 7a 61 74 69  n/max optimizati
27220 6f 6e 2c 20 74 68 65 6e 20 73 65 74 0a 2a 2a 20  on, then set.** 
27230 2a 70 70 4d 69 6e 4d 61 78 20 74 6f 20 62 65 20  *ppMinMax to be 
27240 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  an ORDER BY clau
27250 73 65 20 74 6f 20 62 65 20 75 73 65 64 20 66 6f  se to be used fo
27260 72 20 74 68 65 20 6f 70 74 69 6d 69 7a 61 74 69  r the optimizati
27270 6f 6e 0a 2a 2a 20 61 6e 64 20 72 65 74 75 72 6e  on.** and return
27280 20 65 69 74 68 65 72 20 57 48 45 52 45 5f 4f 52   either WHERE_OR
27290 44 45 52 42 59 5f 4d 49 4e 20 6f 72 20 57 48 45  DERBY_MIN or WHE
272a0 52 45 5f 4f 52 44 45 52 42 59 5f 4d 41 58 20 64  RE_ORDERBY_MAX d
272b0 65 70 65 6e 64 69 6e 67 20 6f 6e 0a 2a 2a 20 77  epending on.** w
272c0 68 65 74 68 65 72 20 70 46 75 6e 63 20 69 73 20  hether pFunc is 
272d0 61 20 6d 69 6e 28 29 20 6f 72 20 6d 61 78 28 29  a min() or max()
272e0 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a   function..**.**
272f0 20 49 66 20 74 68 65 20 71 75 65 72 79 20 69 73   If the query is
27300 20 6e 6f 74 20 61 20 63 61 6e 64 69 64 61 74 65   not a candidate
27310 20 66 6f 72 20 74 68 65 20 6d 69 6e 2f 6d 61 78   for the min/max
27320 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2c 20 72   optimization, r
27330 65 74 75 72 6e 0a 2a 2a 20 57 48 45 52 45 5f 4f  eturn.** WHERE_O
27340 52 44 45 52 42 59 5f 4e 4f 52 4d 41 4c 20 28 77  RDERBY_NORMAL (w
27350 68 69 63 68 20 6d 75 73 74 20 62 65 20 7a 65 72  hich must be zer
27360 6f 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  o)..**.** This r
27370 6f 75 74 69 6e 65 20 6d 75 73 74 20 62 65 20 63  outine must be c
27380 61 6c 6c 65 64 20 61 66 74 65 72 20 61 67 67 72  alled after aggr
27390 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 20  egate functions 
273a0 68 61 76 65 20 62 65 65 6e 0a 2a 2a 20 6c 6f 63  have been.** loc
273b0 61 74 65 64 20 62 75 74 20 62 65 66 6f 72 65 20  ated but before 
273c0 74 68 65 69 72 20 61 72 67 75 6d 65 6e 74 73 20  their arguments 
273d0 68 61 76 65 20 62 65 65 6e 20 73 75 62 6a 65 63  have been subjec
273e0 74 65 64 20 74 6f 20 61 67 67 72 65 67 61 74 65  ted to aggregate
273f0 0a 2a 2a 20 61 6e 61 6c 79 73 69 73 2e 0a 2a 2f  .** analysis..*/
27400 0a 73 74 61 74 69 63 20 75 38 20 6d 69 6e 4d 61  .static u8 minMa
27410 78 51 75 65 72 79 28 73 71 6c 69 74 65 33 20 2a  xQuery(sqlite3 *
27420 64 62 2c 20 45 78 70 72 20 2a 70 46 75 6e 63 2c  db, Expr *pFunc,
27430 20 45 78 70 72 4c 69 73 74 20 2a 2a 70 70 4d 69   ExprList **ppMi
27440 6e 4d 61 78 29 7b 0a 20 20 69 6e 74 20 65 52 65  nMax){.  int eRe
27450 74 20 3d 20 57 48 45 52 45 5f 4f 52 44 45 52 42  t = WHERE_ORDERB
27460 59 5f 4e 4f 52 4d 41 4c 3b 20 20 20 20 20 20 2f  Y_NORMAL;      /
27470 2a 20 52 65 74 75 72 6e 20 76 61 6c 75 65 20 2a  * Return value *
27480 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45  /.  ExprList *pE
27490 4c 69 73 74 20 3d 20 70 46 75 6e 63 2d 3e 78 2e  List = pFunc->x.
274a0 70 4c 69 73 74 3b 20 20 20 20 2f 2a 20 41 72 67  pList;    /* Arg
274b0 75 6d 65 6e 74 73 20 74 6f 20 61 67 67 20 66 75  uments to agg fu
274c0 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 63 6f 6e 73  nction */.  cons
274d0 74 20 63 68 61 72 20 2a 7a 46 75 6e 63 3b 20 20  t char *zFunc;  
274e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
274f0 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 61 67 67    /* Name of agg
27500 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 20  regate function 
27510 70 46 75 6e 63 20 2a 2f 0a 20 20 45 78 70 72 4c  pFunc */.  ExprL
27520 69 73 74 20 2a 70 4f 72 64 65 72 42 79 3b 0a 20  ist *pOrderBy;. 
27530 20 75 38 20 73 6f 72 74 46 6c 61 67 73 3b 0a 0a   u8 sortFlags;..
27540 20 20 61 73 73 65 72 74 28 20 2a 70 70 4d 69 6e    assert( *ppMin
27550 4d 61 78 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65  Max==0 );.  asse
27560 72 74 28 20 70 46 75 6e 63 2d 3e 6f 70 3d 3d 54  rt( pFunc->op==T
27570 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 20 29  K_AGG_FUNCTION )
27580 3b 0a 20 20 61 73 73 65 72 74 28 20 21 49 73 57  ;.  assert( !IsW
27590 69 6e 64 6f 77 46 75 6e 63 28 70 46 75 6e 63 29  indowFunc(pFunc)
275a0 20 29 3b 0a 20 20 69 66 28 20 70 45 4c 69 73 74   );.  if( pEList
275b0 3d 3d 30 20 7c 7c 20 70 45 4c 69 73 74 2d 3e 6e  ==0 || pEList->n
275c0 45 78 70 72 21 3d 31 20 7c 7c 20 45 78 70 72 48  Expr!=1 || ExprH
275d0 61 73 50 72 6f 70 65 72 74 79 28 70 46 75 6e 63  asProperty(pFunc
275e0 2c 20 45 50 5f 57 69 6e 46 75 6e 63 29 20 29 7b  , EP_WinFunc) ){
275f0 0a 20 20 20 20 72 65 74 75 72 6e 20 65 52 65 74  .    return eRet
27600 3b 0a 20 20 7d 0a 20 20 7a 46 75 6e 63 20 3d 20  ;.  }.  zFunc = 
27610 70 46 75 6e 63 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b  pFunc->u.zToken;
27620 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74  .  if( sqlite3St
27630 72 49 43 6d 70 28 7a 46 75 6e 63 2c 20 22 6d 69  rICmp(zFunc, "mi
27640 6e 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 65 52  n")==0 ){.    eR
27650 65 74 20 3d 20 57 48 45 52 45 5f 4f 52 44 45 52  et = WHERE_ORDER
27660 42 59 5f 4d 49 4e 3b 0a 20 20 20 20 73 6f 72 74  BY_MIN;.    sort
27670 46 6c 61 67 73 20 3d 20 4b 45 59 49 4e 46 4f 5f  Flags = KEYINFO_
27680 4f 52 44 45 52 5f 42 49 47 4e 55 4c 4c 3b 0a 20  ORDER_BIGNULL;. 
27690 20 7d 65 6c 73 65 20 69 66 28 20 73 71 6c 69 74   }else if( sqlit
276a0 65 33 53 74 72 49 43 6d 70 28 7a 46 75 6e 63 2c  e3StrICmp(zFunc,
276b0 20 22 6d 61 78 22 29 3d 3d 30 20 29 7b 0a 20 20   "max")==0 ){.  
276c0 20 20 65 52 65 74 20 3d 20 57 48 45 52 45 5f 4f    eRet = WHERE_O
276d0 52 44 45 52 42 59 5f 4d 41 58 3b 0a 20 20 20 20  RDERBY_MAX;.    
276e0 73 6f 72 74 46 6c 61 67 73 20 3d 20 4b 45 59 49  sortFlags = KEYI
276f0 4e 46 4f 5f 4f 52 44 45 52 5f 44 45 53 43 3b 0a  NFO_ORDER_DESC;.
27700 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74    }else{.    ret
27710 75 72 6e 20 65 52 65 74 3b 0a 20 20 7d 0a 20 20  urn eRet;.  }.  
27720 2a 70 70 4d 69 6e 4d 61 78 20 3d 20 70 4f 72 64  *ppMinMax = pOrd
27730 65 72 42 79 20 3d 20 73 71 6c 69 74 65 33 45 78  erBy = sqlite3Ex
27740 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70 45  prListDup(db, pE
27750 4c 69 73 74 2c 20 30 29 3b 0a 20 20 61 73 73 65  List, 0);.  asse
27760 72 74 28 20 70 4f 72 64 65 72 42 79 21 3d 30 20  rt( pOrderBy!=0 
27770 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  || db->mallocFai
27780 6c 65 64 20 29 3b 0a 20 20 69 66 28 20 70 4f 72  led );.  if( pOr
27790 64 65 72 42 79 20 29 20 70 4f 72 64 65 72 42 79  derBy ) pOrderBy
277a0 2d 3e 61 5b 30 5d 2e 73 6f 72 74 46 6c 61 67 73  ->a[0].sortFlags
277b0 20 3d 20 73 6f 72 74 46 6c 61 67 73 3b 0a 20 20   = sortFlags;.  
277c0 72 65 74 75 72 6e 20 65 52 65 74 3b 0a 7d 0a 0a  return eRet;.}..
277d0 2f 2a 0a 2a 2a 20 54 68 65 20 73 65 6c 65 63 74  /*.** The select
277e0 20 73 74 61 74 65 6d 65 6e 74 20 70 61 73 73 65   statement passe
277f0 64 20 61 73 20 74 68 65 20 66 69 72 73 74 20 61  d as the first a
27800 72 67 75 6d 65 6e 74 20 69 73 20 61 6e 20 61 67  rgument is an ag
27810 67 72 65 67 61 74 65 20 71 75 65 72 79 2e 0a 2a  gregate query..*
27820 2a 20 54 68 65 20 73 65 63 6f 6e 64 20 61 72 67  * The second arg
27830 75 6d 65 6e 74 20 69 73 20 74 68 65 20 61 73 73  ument is the ass
27840 6f 63 69 61 74 65 64 20 61 67 67 72 65 67 61 74  ociated aggregat
27850 65 2d 69 6e 66 6f 20 6f 62 6a 65 63 74 2e 20 54  e-info object. T
27860 68 69 73 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e  his .** function
27870 20 74 65 73 74 73 20 69 66 20 74 68 65 20 53 45   tests if the SE
27880 4c 45 43 54 20 69 73 20 6f 66 20 74 68 65 20 66  LECT is of the f
27890 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 53 45 4c  orm:.**.**   SEL
278a0 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f  ECT count(*) FRO
278b0 4d 20 3c 74 62 6c 3e 0a 2a 2a 0a 2a 2a 20 77 68  M <tbl>.**.** wh
278c0 65 72 65 20 74 61 62 6c 65 20 69 73 20 61 20 64  ere table is a d
278d0 61 74 61 62 61 73 65 20 74 61 62 6c 65 2c 20 6e  atabase table, n
278e0 6f 74 20 61 20 73 75 62 2d 73 65 6c 65 63 74 20  ot a sub-select 
278f0 6f 72 20 76 69 65 77 2e 20 49 66 20 74 68 65 20  or view. If the 
27900 71 75 65 72 79 0a 2a 2a 20 64 6f 65 73 20 6d 61  query.** does ma
27910 74 63 68 20 74 68 69 73 20 70 61 74 74 65 72 6e  tch this pattern
27920 2c 20 74 68 65 6e 20 61 20 70 6f 69 6e 74 65 72  , then a pointer
27930 20 74 6f 20 74 68 65 20 54 61 62 6c 65 20 6f 62   to the Table ob
27940 6a 65 63 74 20 72 65 70 72 65 73 65 6e 74 69 6e  ject representin
27950 67 0a 2a 2a 20 3c 74 62 6c 3e 20 69 73 20 72 65  g.** <tbl> is re
27960 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73  turned. Otherwis
27970 65 2c 20 30 20 69 73 20 72 65 74 75 72 6e 65 64  e, 0 is returned
27980 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 54 61 62 6c  ..*/.static Tabl
27990 65 20 2a 69 73 53 69 6d 70 6c 65 43 6f 75 6e 74  e *isSimpleCount
279a0 28 53 65 6c 65 63 74 20 2a 70 2c 20 41 67 67 49  (Select *p, AggI
279b0 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f 29 7b 0a  nfo *pAggInfo){.
279c0 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20    Table *pTab;. 
279d0 20 45 78 70 72 20 2a 70 45 78 70 72 3b 0a 0a 20   Expr *pExpr;.. 
279e0 20 61 73 73 65 72 74 28 20 21 70 2d 3e 70 47 72   assert( !p->pGr
279f0 6f 75 70 42 79 20 29 3b 0a 0a 20 20 69 66 28 20  oupBy );..  if( 
27a00 70 2d 3e 70 57 68 65 72 65 20 7c 7c 20 70 2d 3e  p->pWhere || p->
27a10 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d 31  pEList->nExpr!=1
27a20 20 0a 20 20 20 7c 7c 20 70 2d 3e 70 53 72 63 2d   .   || p->pSrc-
27a30 3e 6e 53 72 63 21 3d 31 20 7c 7c 20 70 2d 3e 70  >nSrc!=1 || p->p
27a40 53 72 63 2d 3e 61 5b 30 5d 2e 70 53 65 6c 65 63  Src->a[0].pSelec
27a50 74 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72  t.  ){.    retur
27a60 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 54 61 62 20  n 0;.  }.  pTab 
27a70 3d 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 30 5d 2e  = p->pSrc->a[0].
27a80 70 54 61 62 3b 0a 20 20 70 45 78 70 72 20 3d 20  pTab;.  pExpr = 
27a90 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e  p->pEList->a[0].
27aa0 70 45 78 70 72 3b 0a 20 20 61 73 73 65 72 74 28  pExpr;.  assert(
27ab0 20 70 54 61 62 20 26 26 20 21 70 54 61 62 2d 3e   pTab && !pTab->
27ac0 70 53 65 6c 65 63 74 20 26 26 20 70 45 78 70 72  pSelect && pExpr
27ad0 20 29 3b 0a 0a 20 20 69 66 28 20 49 73 56 69 72   );..  if( IsVir
27ae0 74 75 61 6c 28 70 54 61 62 29 20 29 20 72 65 74  tual(pTab) ) ret
27af0 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 45 78  urn 0;.  if( pEx
27b00 70 72 2d 3e 6f 70 21 3d 54 4b 5f 41 47 47 5f 46  pr->op!=TK_AGG_F
27b10 55 4e 43 54 49 4f 4e 20 29 20 72 65 74 75 72 6e  UNCTION ) return
27b20 20 30 3b 0a 20 20 69 66 28 20 4e 45 56 45 52 28   0;.  if( NEVER(
27b30 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3d  pAggInfo->nFunc=
27b40 3d 30 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  =0) ) return 0;.
27b50 20 20 69 66 28 20 28 70 41 67 67 49 6e 66 6f 2d    if( (pAggInfo-
27b60 3e 61 46 75 6e 63 5b 30 5d 2e 70 46 75 6e 63 2d  >aFunc[0].pFunc-
27b70 3e 66 75 6e 63 46 6c 61 67 73 26 53 51 4c 49 54  >funcFlags&SQLIT
27b80 45 5f 46 55 4e 43 5f 43 4f 55 4e 54 29 3d 3d 30  E_FUNC_COUNT)==0
27b90 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69   ) return 0;.  i
27ba0 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72  f( ExprHasProper
27bb0 74 79 28 70 45 78 70 72 2c 20 45 50 5f 44 69 73  ty(pExpr, EP_Dis
27bc0 74 69 6e 63 74 7c 45 50 5f 57 69 6e 46 75 6e 63  tinct|EP_WinFunc
27bd0 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20  ) ) return 0;.. 
27be0 20 72 65 74 75 72 6e 20 70 54 61 62 3b 0a 7d 0a   return pTab;.}.
27bf0 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 73 6f  ./*.** If the so
27c00 75 72 63 65 2d 6c 69 73 74 20 69 74 65 6d 20 70  urce-list item p
27c10 61 73 73 65 64 20 61 73 20 61 6e 20 61 72 67 75  assed as an argu
27c20 6d 65 6e 74 20 77 61 73 20 61 75 67 6d 65 6e 74  ment was augment
27c30 65 64 20 77 69 74 68 20 61 6e 0a 2a 2a 20 49 4e  ed with an.** IN
27c40 44 45 58 45 44 20 42 59 20 63 6c 61 75 73 65 2c  DEXED BY clause,
27c50 20 74 68 65 6e 20 74 72 79 20 74 6f 20 6c 6f 63   then try to loc
27c60 61 74 65 20 74 68 65 20 73 70 65 63 69 66 69 65  ate the specifie
27c70 64 20 69 6e 64 65 78 2e 20 49 66 20 74 68 65 72  d index. If ther
27c80 65 0a 2a 2a 20 77 61 73 20 73 75 63 68 20 61 20  e.** was such a 
27c90 63 6c 61 75 73 65 20 61 6e 64 20 74 68 65 20 6e  clause and the n
27ca0 61 6d 65 64 20 69 6e 64 65 78 20 63 61 6e 6e 6f  amed index canno
27cb0 74 20 62 65 20 66 6f 75 6e 64 2c 20 72 65 74 75  t be found, retu
27cc0 72 6e 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 45 52  rn .** SQLITE_ER
27cd0 52 4f 52 20 61 6e 64 20 6c 65 61 76 65 20 61 6e  ROR and leave an
27ce0 20 65 72 72 6f 72 20 69 6e 20 70 50 61 72 73 65   error in pParse
27cf0 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 70 6f 70  . Otherwise, pop
27d00 75 6c 61 74 65 20 0a 2a 2a 20 70 46 72 6f 6d 2d  ulate .** pFrom-
27d10 3e 70 49 6e 64 65 78 20 61 6e 64 20 72 65 74 75  >pIndex and retu
27d20 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f  rn SQLITE_OK..*/
27d30 0a 69 6e 74 20 73 71 6c 69 74 65 33 49 6e 64 65  .int sqlite3Inde
27d40 78 65 64 42 79 4c 6f 6f 6b 75 70 28 50 61 72 73  xedByLookup(Pars
27d50 65 20 2a 70 50 61 72 73 65 2c 20 73 74 72 75 63  e *pParse, struc
27d60 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
27d70 70 46 72 6f 6d 29 7b 0a 20 20 69 66 28 20 70 46  pFrom){.  if( pF
27d80 72 6f 6d 2d 3e 70 54 61 62 20 26 26 20 70 46 72  rom->pTab && pFr
27d90 6f 6d 2d 3e 66 67 2e 69 73 49 6e 64 65 78 65 64  om->fg.isIndexed
27da0 42 79 20 29 7b 0a 20 20 20 20 54 61 62 6c 65 20  By ){.    Table 
27db0 2a 70 54 61 62 20 3d 20 70 46 72 6f 6d 2d 3e 70  *pTab = pFrom->p
27dc0 54 61 62 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a  Tab;.    char *z
27dd0 49 6e 64 65 78 65 64 42 79 20 3d 20 70 46 72 6f  IndexedBy = pFro
27de0 6d 2d 3e 75 31 2e 7a 49 6e 64 65 78 65 64 42 79  m->u1.zIndexedBy
27df0 3b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64  ;.    Index *pId
27e00 78 3b 0a 20 20 20 20 66 6f 72 28 70 49 64 78 3d  x;.    for(pIdx=
27e10 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 0a 20  pTab->pIndex; . 
27e20 20 20 20 20 20 20 20 70 49 64 78 20 26 26 20 73         pIdx && s
27e30 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 49  qlite3StrICmp(pI
27e40 64 78 2d 3e 7a 4e 61 6d 65 2c 20 7a 49 6e 64 65  dx->zName, zInde
27e50 78 65 64 42 79 29 3b 20 0a 20 20 20 20 20 20 20  xedBy); .       
27e60 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78   pIdx=pIdx->pNex
27e70 74 0a 20 20 20 20 29 3b 0a 20 20 20 20 69 66 28  t.    );.    if(
27e80 20 21 70 49 64 78 20 29 7b 0a 20 20 20 20 20 20   !pIdx ){.      
27e90 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
27ea0 70 50 61 72 73 65 2c 20 22 6e 6f 20 73 75 63 68  pParse, "no such
27eb0 20 69 6e 64 65 78 3a 20 25 73 22 2c 20 7a 49 6e   index: %s", zIn
27ec0 64 65 78 65 64 42 79 2c 20 30 29 3b 0a 20 20 20  dexedBy, 0);.   
27ed0 20 20 20 70 50 61 72 73 65 2d 3e 63 68 65 63 6b     pParse->check
27ee0 53 63 68 65 6d 61 20 3d 20 31 3b 0a 20 20 20 20  Schema = 1;.    
27ef0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
27f00 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20  ERROR;.    }.   
27f10 20 70 46 72 6f 6d 2d 3e 70 49 42 49 6e 64 65 78   pFrom->pIBIndex
27f20 20 3d 20 70 49 64 78 3b 0a 20 20 7d 0a 20 20 72   = pIdx;.  }.  r
27f30 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
27f40 0a 7d 0a 2f 2a 0a 2a 2a 20 44 65 74 65 63 74 20  .}./*.** Detect 
27f50 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 20  compound SELECT 
27f60 73 74 61 74 65 6d 65 6e 74 73 20 74 68 61 74 20  statements that 
27f70 75 73 65 20 61 6e 20 4f 52 44 45 52 20 42 59 20  use an ORDER BY 
27f80 63 6c 61 75 73 65 20 77 69 74 68 20 0a 2a 2a 20  clause with .** 
27f90 61 6e 20 61 6c 74 65 72 6e 61 74 69 76 65 20 63  an alternative c
27fa0 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
27fb0 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 53 45 4c 45  e..**.**    SELE
27fc0 43 54 20 2e 2e 2e 20 46 52 4f 4d 20 74 31 20 45  CT ... FROM t1 E
27fd0 58 43 45 50 54 20 53 45 4c 45 43 54 20 2e 2e 2e  XCEPT SELECT ...
27fe0 20 46 52 4f 4d 20 74 32 20 4f 52 44 45 52 20 42   FROM t2 ORDER B
27ff0 59 20 2e 2e 20 43 4f 4c 4c 41 54 45 20 2e 2e 2e  Y .. COLLATE ...
28000 0a 2a 2a 0a 2a 2a 20 54 68 65 73 65 20 61 72 65  .**.** These are
28010 20 72 65 77 72 69 74 74 65 6e 20 61 73 20 61 20   rewritten as a 
28020 73 75 62 71 75 65 72 79 3a 0a 2a 2a 0a 2a 2a 20  subquery:.**.** 
28030 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d     SELECT * FROM
28040 20 28 53 45 4c 45 43 54 20 2e 2e 2e 20 46 52 4f   (SELECT ... FRO
28050 4d 20 74 31 20 45 58 43 45 50 54 20 53 45 4c 45  M t1 EXCEPT SELE
28060 43 54 20 2e 2e 2e 20 46 52 4f 4d 20 74 32 29 0a  CT ... FROM t2).
28070 2a 2a 20 20 20 20 20 4f 52 44 45 52 20 42 59 20  **     ORDER BY 
28080 2e 2e 2e 20 43 4f 4c 4c 41 54 45 20 2e 2e 2e 0a  ... COLLATE ....
28090 2a 2a 0a 2a 2a 20 54 68 69 73 20 74 72 61 6e 73  **.** This trans
280a0 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 6e 65 63  formation is nec
280b0 65 73 73 61 72 79 20 62 65 63 61 75 73 65 20 74  essary because t
280c0 68 65 20 6d 75 6c 74 69 53 65 6c 65 63 74 4f 72  he multiSelectOr
280d0 64 65 72 42 79 28 29 20 72 6f 75 74 69 6e 65 0a  derBy() routine.
280e0 2a 2a 20 61 62 6f 76 65 20 74 68 61 74 20 67 65  ** above that ge
280f0 6e 65 72 61 74 65 73 20 74 68 65 20 63 6f 64 65  nerates the code
28100 20 66 6f 72 20 61 20 63 6f 6d 70 6f 75 6e 64 20   for a compound 
28110 53 45 4c 45 43 54 20 77 69 74 68 20 61 6e 20 4f  SELECT with an O
28120 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 0a 2a  RDER BY clause.*
28130 2a 20 75 73 65 73 20 61 20 6d 65 72 67 65 20 61  * uses a merge a
28140 6c 67 6f 72 69 74 68 6d 20 74 68 61 74 20 72 65  lgorithm that re
28150 71 75 69 72 65 73 20 74 68 65 20 73 61 6d 65 20  quires the same 
28160 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  collating sequen
28170 63 65 20 6f 6e 20 74 68 65 0a 2a 2a 20 72 65 73  ce on the.** res
28180 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 61 73 20 6f  ult columns as o
28190 6e 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63  n the ORDER BY c
281a0 6c 61 75 73 65 2e 20 20 53 65 65 20 74 69 63 6b  lause.  See tick
281b0 65 74 0a 2a 2a 20 68 74 74 70 3a 2f 2f 77 77 77  et.** http://www
281c0 2e 73 71 6c 69 74 65 2e 6f 72 67 2f 73 72 63 2f  .sqlite.org/src/
281d0 69 6e 66 6f 2f 36 37 30 39 35 37 34 64 32 61 0a  info/6709574d2a.
281e0 2a 2a 0a 2a 2a 20 54 68 69 73 20 74 72 61 6e 73  **.** This trans
281f0 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 6f 6e 6c  formation is onl
28200 79 20 6e 65 65 64 65 64 20 66 6f 72 20 45 58 43  y needed for EXC
28210 45 50 54 2c 20 49 4e 54 45 52 53 45 43 54 2c 20  EPT, INTERSECT, 
28220 61 6e 64 20 55 4e 49 4f 4e 2e 0a 2a 2a 20 54 68  and UNION..** Th
28230 65 20 55 4e 49 4f 4e 20 41 4c 4c 20 6f 70 65 72  e UNION ALL oper
28240 61 74 6f 72 20 77 6f 72 6b 73 20 66 69 6e 65 20  ator works fine 
28250 77 69 74 68 20 6d 75 6c 74 69 53 65 6c 65 63 74  with multiSelect
28260 4f 72 64 65 72 42 79 28 29 20 65 76 65 6e 20 77  OrderBy() even w
28270 68 65 6e 0a 2a 2a 20 74 68 65 72 65 20 61 72 65  hen.** there are
28280 20 43 4f 4c 4c 41 54 45 20 74 65 72 6d 73 20 69   COLLATE terms i
28290 6e 20 74 68 65 20 4f 52 44 45 52 20 42 59 2e 0a  n the ORDER BY..
282a0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f  */.static int co
282b0 6e 76 65 72 74 43 6f 6d 70 6f 75 6e 64 53 65 6c  nvertCompoundSel
282c0 65 63 74 54 6f 53 75 62 71 75 65 72 79 28 57 61  ectToSubquery(Wa
282d0 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 53  lker *pWalker, S
282e0 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 69 6e 74  elect *p){.  int
282f0 20 69 3b 0a 20 20 53 65 6c 65 63 74 20 2a 70 4e   i;.  Select *pN
28300 65 77 3b 0a 20 20 53 65 6c 65 63 74 20 2a 70 58  ew;.  Select *pX
28310 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  ;.  sqlite3 *db;
28320 0a 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69  .  struct ExprLi
28330 73 74 5f 69 74 65 6d 20 2a 61 3b 0a 20 20 53 72  st_item *a;.  Sr
28340 63 4c 69 73 74 20 2a 70 4e 65 77 53 72 63 3b 0a  cList *pNewSrc;.
28350 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 3b    Parse *pParse;
28360 0a 20 20 54 6f 6b 65 6e 20 64 75 6d 6d 79 3b 0a  .  Token dummy;.
28370 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 69 6f 72  .  if( p->pPrior
28380 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 57 52 43  ==0 ) return WRC
28390 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20 20 69 66 28  _Continue;.  if(
283a0 20 70 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20   p->pOrderBy==0 
283b0 29 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e  ) return WRC_Con
283c0 74 69 6e 75 65 3b 0a 20 20 66 6f 72 28 70 58 3d  tinue;.  for(pX=
283d0 70 3b 20 70 58 20 26 26 20 28 70 58 2d 3e 6f 70  p; pX && (pX->op
283e0 3d 3d 54 4b 5f 41 4c 4c 20 7c 7c 20 70 58 2d 3e  ==TK_ALL || pX->
283f0 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 29 3b 20  op==TK_SELECT); 
28400 70 58 3d 70 58 2d 3e 70 50 72 69 6f 72 29 7b 7d  pX=pX->pPrior){}
28410 0a 20 20 69 66 28 20 70 58 3d 3d 30 20 29 20 72  .  if( pX==0 ) r
28420 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e  eturn WRC_Contin
28430 75 65 3b 0a 20 20 61 20 3d 20 70 2d 3e 70 4f 72  ue;.  a = p->pOr
28440 64 65 72 42 79 2d 3e 61 3b 0a 20 20 66 6f 72 28  derBy->a;.  for(
28450 69 3d 70 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 6e  i=p->pOrderBy->n
28460 45 78 70 72 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d  Expr-1; i>=0; i-
28470 2d 29 7b 0a 20 20 20 20 69 66 28 20 61 5b 69 5d  -){.    if( a[i]
28480 2e 70 45 78 70 72 2d 3e 66 6c 61 67 73 20 26 20  .pExpr->flags & 
28490 45 50 5f 43 6f 6c 6c 61 74 65 20 29 20 62 72 65  EP_Collate ) bre
284a0 61 6b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 3c  ak;.  }.  if( i<
284b0 30 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f 43  0 ) return WRC_C
284c0 6f 6e 74 69 6e 75 65 3b 0a 0a 20 20 2f 2a 20 49  ontinue;..  /* I
284d0 66 20 77 65 20 72 65 61 63 68 20 74 68 69 73 20  f we reach this 
284e0 70 6f 69 6e 74 2c 20 74 68 61 74 20 6d 65 61 6e  point, that mean
284f0 73 20 74 68 65 20 74 72 61 6e 73 66 6f 72 6d 61  s the transforma
28500 74 69 6f 6e 20 69 73 20 72 65 71 75 69 72 65 64  tion is required
28510 2e 20 2a 2f 0a 0a 20 20 70 50 61 72 73 65 20 3d  . */..  pParse =
28520 20 70 57 61 6c 6b 65 72 2d 3e 70 50 61 72 73 65   pWalker->pParse
28530 3b 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d  ;.  db = pParse-
28540 3e 64 62 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71  >db;.  pNew = sq
28550 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72  lite3DbMallocZer
28560 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70 4e  o(db, sizeof(*pN
28570 65 77 29 20 29 3b 0a 20 20 69 66 28 20 70 4e 65  ew) );.  if( pNe
28580 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 57 52  w==0 ) return WR
28590 43 5f 41 62 6f 72 74 3b 0a 20 20 6d 65 6d 73 65  C_Abort;.  memse
285a0 74 28 26 64 75 6d 6d 79 2c 20 30 2c 20 73 69 7a  t(&dummy, 0, siz
285b0 65 6f 66 28 64 75 6d 6d 79 29 29 3b 0a 20 20 70  eof(dummy));.  p
285c0 4e 65 77 53 72 63 20 3d 20 73 71 6c 69 74 65 33  NewSrc = sqlite3
285d0 53 72 63 4c 69 73 74 41 70 70 65 6e 64 46 72 6f  SrcListAppendFro
285e0 6d 54 65 72 6d 28 70 50 61 72 73 65 2c 30 2c 30  mTerm(pParse,0,0
285f0 2c 30 2c 26 64 75 6d 6d 79 2c 70 4e 65 77 2c 30  ,0,&dummy,pNew,0
28600 2c 30 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 53  ,0);.  if( pNewS
28610 72 63 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 57  rc==0 ) return W
28620 52 43 5f 41 62 6f 72 74 3b 0a 20 20 2a 70 4e 65  RC_Abort;.  *pNe
28630 77 20 3d 20 2a 70 3b 0a 20 20 70 2d 3e 70 53 72  w = *p;.  p->pSr
28640 63 20 3d 20 70 4e 65 77 53 72 63 3b 0a 20 20 70  c = pNewSrc;.  p
28650 2d 3e 70 45 4c 69 73 74 20 3d 20 73 71 6c 69 74  ->pEList = sqlit
28660 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64  e3ExprListAppend
28670 28 70 50 61 72 73 65 2c 20 30 2c 20 73 71 6c 69  (pParse, 0, sqli
28680 74 65 33 45 78 70 72 28 64 62 2c 20 54 4b 5f 41  te3Expr(db, TK_A
28690 53 54 45 52 49 53 4b 2c 20 30 29 29 3b 0a 20 20  STERISK, 0));.  
286a0 70 2d 3e 6f 70 20 3d 20 54 4b 5f 53 45 4c 45 43  p->op = TK_SELEC
286b0 54 3b 0a 20 20 70 2d 3e 70 57 68 65 72 65 20 3d  T;.  p->pWhere =
286c0 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 70 47 72 6f   0;.  pNew->pGro
286d0 75 70 42 79 20 3d 20 30 3b 0a 20 20 70 4e 65 77  upBy = 0;.  pNew
286e0 2d 3e 70 48 61 76 69 6e 67 20 3d 20 30 3b 0a 20  ->pHaving = 0;. 
286f0 20 70 4e 65 77 2d 3e 70 4f 72 64 65 72 42 79 20   pNew->pOrderBy 
28700 3d 20 30 3b 0a 20 20 70 2d 3e 70 50 72 69 6f 72  = 0;.  p->pPrior
28710 20 3d 20 30 3b 0a 20 20 70 2d 3e 70 4e 65 78 74   = 0;.  p->pNext
28720 20 3d 20 30 3b 0a 20 20 70 2d 3e 70 57 69 74 68   = 0;.  p->pWith
28730 20 3d 20 30 3b 0a 20 20 70 2d 3e 73 65 6c 46 6c   = 0;.  p->selFl
28740 61 67 73 20 26 3d 20 7e 53 46 5f 43 6f 6d 70 6f  ags &= ~SF_Compo
28750 75 6e 64 3b 0a 20 20 61 73 73 65 72 74 28 20 28  und;.  assert( (
28760 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46  p->selFlags & SF
28770 5f 43 6f 6e 76 65 72 74 65 64 29 3d 3d 30 20 29  _Converted)==0 )
28780 3b 0a 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20  ;.  p->selFlags 
28790 7c 3d 20 53 46 5f 43 6f 6e 76 65 72 74 65 64 3b  |= SF_Converted;
287a0 0a 20 20 61 73 73 65 72 74 28 20 70 4e 65 77 2d  .  assert( pNew-
287b0 3e 70 50 72 69 6f 72 21 3d 30 20 29 3b 0a 20 20  >pPrior!=0 );.  
287c0 70 4e 65 77 2d 3e 70 50 72 69 6f 72 2d 3e 70 4e  pNew->pPrior->pN
287d0 65 78 74 20 3d 20 70 4e 65 77 3b 0a 20 20 70 4e  ext = pNew;.  pN
287e0 65 77 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a  ew->pLimit = 0;.
287f0 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e    return WRC_Con
28800 74 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  tinue;.}../*.** 
28810 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20  Check to see if 
28820 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
28830 74 65 72 6d 20 70 46 72 6f 6d 20 68 61 73 20 74  term pFrom has t
28840 61 62 6c 65 2d 76 61 6c 75 65 64 20 66 75 6e 63  able-valued func
28850 74 69 6f 6e 0a 2a 2a 20 61 72 67 75 6d 65 6e 74  tion.** argument
28860 73 2e 20 20 49 66 20 69 74 20 64 6f 65 73 2c 20  s.  If it does, 
28870 6c 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20 6d  leave an error m
28880 65 73 73 61 67 65 20 69 6e 20 70 50 61 72 73 65  essage in pParse
28890 20 61 6e 64 20 72 65 74 75 72 6e 0a 2a 2a 20 6e   and return.** n
288a0 6f 6e 2d 7a 65 72 6f 2c 20 73 69 6e 63 65 20 70  on-zero, since p
288b0 46 72 6f 6d 20 69 73 20 6e 6f 74 20 61 6c 6c 6f  From is not allo
288c0 77 65 64 20 74 6f 20 62 65 20 61 20 74 61 62 6c  wed to be a tabl
288d0 65 2d 76 61 6c 75 65 64 20 66 75 6e 63 74 69 6f  e-valued functio
288e0 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  n..*/.static int
288f0 20 63 61 6e 6e 6f 74 42 65 46 75 6e 63 74 69 6f   cannotBeFunctio
28900 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  n(Parse *pParse,
28910 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
28920 69 74 65 6d 20 2a 70 46 72 6f 6d 29 7b 0a 20 20  item *pFrom){.  
28930 69 66 28 20 70 46 72 6f 6d 2d 3e 66 67 2e 69 73  if( pFrom->fg.is
28940 54 61 62 46 75 6e 63 20 29 7b 0a 20 20 20 20 73  TabFunc ){.    s
28950 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
28960 50 61 72 73 65 2c 20 22 27 25 73 27 20 69 73 20  Parse, "'%s' is 
28970 6e 6f 74 20 61 20 66 75 6e 63 74 69 6f 6e 22 2c  not a function",
28980 20 70 46 72 6f 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a   pFrom->zName);.
28990 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
289a0 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
289b0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
289c0 4f 4d 49 54 5f 43 54 45 0a 2f 2a 0a 2a 2a 20 41  OMIT_CTE./*.** A
289d0 72 67 75 6d 65 6e 74 20 70 57 69 74 68 20 28 77  rgument pWith (w
289e0 68 69 63 68 20 6d 61 79 20 62 65 20 4e 55 4c 4c  hich may be NULL
289f0 29 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 6c 69  ) points to a li
28a00 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20 6e 65 73  nked list of nes
28a10 74 65 64 20 0a 2a 2a 20 57 49 54 48 20 63 6f 6e  ted .** WITH con
28a20 74 65 78 74 73 2c 20 66 72 6f 6d 20 69 6e 6e 65  texts, from inne
28a30 72 20 74 6f 20 6f 75 74 65 72 6d 6f 73 74 2e 20  r to outermost. 
28a40 49 66 20 74 68 65 20 74 61 62 6c 65 20 69 64 65  If the table ide
28a50 6e 74 69 66 69 65 64 20 62 79 20 0a 2a 2a 20 46  ntified by .** F
28a60 52 4f 4d 20 63 6c 61 75 73 65 20 65 6c 65 6d 65  ROM clause eleme
28a70 6e 74 20 70 49 74 65 6d 20 69 73 20 72 65 61 6c  nt pItem is real
28a80 6c 79 20 61 20 63 6f 6d 6d 6f 6e 2d 74 61 62 6c  ly a common-tabl
28a90 65 2d 65 78 70 72 65 73 73 69 6f 6e 20 28 43 54  e-expression (CT
28aa0 45 29 20 0a 2a 2a 20 74 68 65 6e 20 72 65 74 75  E) .** then retu
28ab0 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rn a pointer to 
28ac0 74 68 65 20 43 54 45 20 64 65 66 69 6e 69 74 69  the CTE definiti
28ad0 6f 6e 20 66 6f 72 20 74 68 61 74 20 74 61 62 6c  on for that tabl
28ae0 65 2e 20 4f 74 68 65 72 77 69 73 65 0a 2a 2a 20  e. Otherwise.** 
28af0 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2a 0a  return NULL..**.
28b00 2a 2a 20 49 66 20 61 20 6e 6f 6e 2d 4e 55 4c 4c  ** If a non-NULL
28b10 20 76 61 6c 75 65 20 69 73 20 72 65 74 75 72 6e   value is return
28b20 65 64 2c 20 73 65 74 20 2a 70 70 43 6f 6e 74 65  ed, set *ppConte
28b30 78 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74  xt to point to t
28b40 68 65 20 57 69 74 68 0a 2a 2a 20 6f 62 6a 65 63  he With.** objec
28b50 74 20 74 68 61 74 20 74 68 65 20 72 65 74 75 72  t that the retur
28b60 6e 65 64 20 43 54 45 20 62 65 6c 6f 6e 67 73 20  ned CTE belongs 
28b70 74 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 73 74  to..*/.static st
28b80 72 75 63 74 20 43 74 65 20 2a 73 65 61 72 63 68  ruct Cte *search
28b90 57 69 74 68 28 0a 20 20 57 69 74 68 20 2a 70 57  With(.  With *pW
28ba0 69 74 68 2c 20 20 20 20 20 20 20 20 20 20 20 20  ith,            
28bb0 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65          /* Curre
28bc0 6e 74 20 69 6e 6e 65 72 6d 6f 73 74 20 57 49 54  nt innermost WIT
28bd0 48 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 73 74  H clause */.  st
28be0 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
28bf0 6d 20 2a 70 49 74 65 6d 2c 20 20 20 20 20 2f 2a  m *pItem,     /*
28c00 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 65 6c 65   FROM clause ele
28c10 6d 65 6e 74 20 74 6f 20 72 65 73 6f 6c 76 65 20  ment to resolve 
28c20 2a 2f 0a 20 20 57 69 74 68 20 2a 2a 70 70 43 6f  */.  With **ppCo
28c30 6e 74 65 78 74 20 20 20 20 20 20 20 20 20 20 20  ntext           
28c40 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 57 49 54       /* OUT: WIT
28c50 48 20 63 6c 61 75 73 65 20 72 65 74 75 72 6e 20  H clause return 
28c60 76 61 6c 75 65 20 62 65 6c 6f 6e 67 73 20 74 6f  value belongs to
28c70 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63   */.){.  const c
28c80 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 69 66  har *zName;.  if
28c90 28 20 70 49 74 65 6d 2d 3e 7a 44 61 74 61 62 61  ( pItem->zDataba
28ca0 73 65 3d 3d 30 20 26 26 20 28 7a 4e 61 6d 65 20  se==0 && (zName 
28cb0 3d 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 21  = pItem->zName)!
28cc0 3d 30 20 29 7b 0a 20 20 20 20 57 69 74 68 20 2a  =0 ){.    With *
28cd0 70 3b 0a 20 20 20 20 66 6f 72 28 70 3d 70 57 69  p;.    for(p=pWi
28ce0 74 68 3b 20 70 3b 20 70 3d 70 2d 3e 70 4f 75 74  th; p; p=p->pOut
28cf0 65 72 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  er){.      int i
28d00 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  ;.      for(i=0;
28d10 20 69 3c 70 2d 3e 6e 43 74 65 3b 20 69 2b 2b 29   i<p->nCte; i++)
28d20 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71  {.        if( sq
28d30 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 4e 61  lite3StrICmp(zNa
28d40 6d 65 2c 20 70 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d  me, p->a[i].zNam
28d50 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  e)==0 ){.       
28d60 20 20 20 2a 70 70 43 6f 6e 74 65 78 74 20 3d 20     *ppContext = 
28d70 70 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  p;.          ret
28d80 75 72 6e 20 26 70 2d 3e 61 5b 69 5d 3b 0a 20 20  urn &p->a[i];.  
28d90 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
28da0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
28db0 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 20 54 68 65 20  rn 0;.}../* The 
28dc0 63 6f 64 65 20 67 65 6e 65 72 61 74 6f 72 20 6d  code generator m
28dd0 61 69 6e 74 61 69 6e 73 20 61 20 73 74 61 63 6b  aintains a stack
28de0 20 6f 66 20 61 63 74 69 76 65 20 57 49 54 48 20   of active WITH 
28df0 63 6c 61 75 73 65 73 0a 2a 2a 20 77 69 74 68 20  clauses.** with 
28e00 74 68 65 20 69 6e 6e 65 72 2d 6d 6f 73 74 20 57  the inner-most W
28e10 49 54 48 20 63 6c 61 75 73 65 20 62 65 69 6e 67  ITH clause being
28e20 20 61 74 20 74 68 65 20 74 6f 70 20 6f 66 20 74   at the top of t
28e30 68 65 20 73 74 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20  he stack..**.** 
28e40 54 68 69 73 20 72 6f 75 74 69 6e 65 20 70 75 73  This routine pus
28e50 68 65 73 20 74 68 65 20 57 49 54 48 20 63 6c 61  hes the WITH cla
28e60 75 73 65 20 70 61 73 73 65 64 20 61 73 20 74 68  use passed as th
28e70 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
28e80 74 0a 2a 2a 20 6f 6e 74 6f 20 74 68 65 20 74 6f  t.** onto the to
28e90 70 20 6f 66 20 74 68 65 20 73 74 61 63 6b 2e 20  p of the stack. 
28ea0 49 66 20 61 72 67 75 6d 65 6e 74 20 62 46 72 65  If argument bFre
28eb0 65 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20  e is true, then 
28ec0 74 68 69 73 0a 2a 2a 20 57 49 54 48 20 63 6c 61  this.** WITH cla
28ed0 75 73 65 20 77 69 6c 6c 20 6e 65 76 65 72 20 62  use will never b
28ee0 65 20 70 6f 70 70 65 64 20 66 72 6f 6d 20 74 68  e popped from th
28ef0 65 20 73 74 61 63 6b 2e 20 49 6e 20 74 68 69 73  e stack. In this
28f00 20 63 61 73 65 20 69 74 0a 2a 2a 20 73 68 6f 75   case it.** shou
28f10 6c 64 20 62 65 20 66 72 65 65 64 20 61 6c 6f 6e  ld be freed alon
28f20 67 20 77 69 74 68 20 74 68 65 20 50 61 72 73 65  g with the Parse
28f30 20 6f 62 6a 65 63 74 2e 20 49 6e 20 6f 74 68 65   object. In othe
28f40 72 20 63 61 73 65 73 2c 20 77 68 65 6e 0a 2a 2a  r cases, when.**
28f50 20 62 46 72 65 65 3d 3d 30 2c 20 74 68 65 20 57   bFree==0, the W
28f60 69 74 68 20 6f 62 6a 65 63 74 20 77 69 6c 6c 20  ith object will 
28f70 62 65 20 66 72 65 65 64 20 61 6c 6f 6e 67 20 77  be freed along w
28f80 69 74 68 20 74 68 65 20 53 45 4c 45 43 54 20 0a  ith the SELECT .
28f90 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 77 69 74  ** statement wit
28fa0 68 20 77 68 69 63 68 20 69 74 20 69 73 20 61 73  h which it is as
28fb0 73 6f 63 69 61 74 65 64 2e 0a 2a 2f 0a 76 6f 69  sociated..*/.voi
28fc0 64 20 73 71 6c 69 74 65 33 57 69 74 68 50 75 73  d sqlite3WithPus
28fd0 68 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  h(Parse *pParse,
28fe0 20 57 69 74 68 20 2a 70 57 69 74 68 2c 20 75 38   With *pWith, u8
28ff0 20 62 46 72 65 65 29 7b 0a 20 20 61 73 73 65 72   bFree){.  asser
29000 74 28 20 62 46 72 65 65 3d 3d 30 20 7c 7c 20 28  t( bFree==0 || (
29010 70 50 61 72 73 65 2d 3e 70 57 69 74 68 3d 3d 30  pParse->pWith==0
29020 20 26 26 20 70 50 61 72 73 65 2d 3e 70 57 69 74   && pParse->pWit
29030 68 54 6f 46 72 65 65 3d 3d 30 29 20 29 3b 0a 20  hToFree==0) );. 
29040 20 69 66 28 20 70 57 69 74 68 20 29 7b 0a 20 20   if( pWith ){.  
29050 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65    assert( pParse
29060 2d 3e 70 57 69 74 68 21 3d 70 57 69 74 68 20 29  ->pWith!=pWith )
29070 3b 0a 20 20 20 20 70 57 69 74 68 2d 3e 70 4f 75  ;.    pWith->pOu
29080 74 65 72 20 3d 20 70 50 61 72 73 65 2d 3e 70 57  ter = pParse->pW
29090 69 74 68 3b 0a 20 20 20 20 70 50 61 72 73 65 2d  ith;.    pParse-
290a0 3e 70 57 69 74 68 20 3d 20 70 57 69 74 68 3b 0a  >pWith = pWith;.
290b0 20 20 20 20 69 66 28 20 62 46 72 65 65 20 29 20      if( bFree ) 
290c0 70 50 61 72 73 65 2d 3e 70 57 69 74 68 54 6f 46  pParse->pWithToF
290d0 72 65 65 20 3d 20 70 57 69 74 68 3b 0a 20 20 7d  ree = pWith;.  }
290e0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
290f0 75 6e 63 74 69 6f 6e 20 63 68 65 63 6b 73 20 69  unction checks i
29100 66 20 61 72 67 75 6d 65 6e 74 20 70 46 72 6f 6d  f argument pFrom
29110 20 72 65 66 65 72 73 20 74 6f 20 61 20 43 54 45   refers to a CTE
29120 20 64 65 63 6c 61 72 65 64 20 62 79 20 0a 2a 2a   declared by .**
29130 20 61 20 57 49 54 48 20 63 6c 61 75 73 65 20 6f   a WITH clause o
29140 6e 20 74 68 65 20 73 74 61 63 6b 20 63 75 72 72  n the stack curr
29150 65 6e 74 6c 79 20 6d 61 69 6e 74 61 69 6e 65 64  ently maintained
29160 20 62 79 20 74 68 65 20 70 61 72 73 65 72 2e 20   by the parser. 
29170 41 6e 64 2c 0a 2a 2a 20 69 66 20 63 75 72 72 65  And,.** if curre
29180 6e 74 6c 79 20 70 72 6f 63 65 73 73 69 6e 67 20  ntly processing 
29190 61 20 43 54 45 20 65 78 70 72 65 73 73 69 6f 6e  a CTE expression
291a0 2c 20 69 66 20 69 74 20 69 73 20 61 20 72 65 63  , if it is a rec
291b0 75 72 73 69 76 65 0a 2a 2a 20 72 65 66 65 72 65  ursive.** refere
291c0 6e 63 65 20 74 6f 20 74 68 65 20 63 75 72 72 65  nce to the curre
291d0 6e 74 20 43 54 45 2e 0a 2a 2a 0a 2a 2a 20 49 66  nt CTE..**.** If
291e0 20 70 46 72 6f 6d 20 66 61 6c 6c 73 20 69 6e 74   pFrom falls int
291f0 6f 20 65 69 74 68 65 72 20 6f 66 20 74 68 65 20  o either of the 
29200 74 77 6f 20 63 61 74 65 67 6f 72 69 65 73 20 61  two categories a
29210 62 6f 76 65 2c 20 70 46 72 6f 6d 2d 3e 70 54 61  bove, pFrom->pTa
29220 62 0a 2a 2a 20 61 6e 64 20 6f 74 68 65 72 20 66  b.** and other f
29230 69 65 6c 64 73 20 61 72 65 20 70 6f 70 75 6c 61  ields are popula
29240 74 65 64 20 61 63 63 6f 72 64 69 6e 67 6c 79 2e  ted accordingly.
29250 20 54 68 65 20 63 61 6c 6c 65 72 20 73 68 6f 75   The caller shou
29260 6c 64 20 63 68 65 63 6b 0a 2a 2a 20 28 70 46 72  ld check.** (pFr
29270 6f 6d 2d 3e 70 54 61 62 21 3d 30 29 20 74 6f 20  om->pTab!=0) to 
29280 64 65 74 65 72 6d 69 6e 65 20 77 68 65 74 68 65  determine whethe
29290 72 20 6f 72 20 6e 6f 74 20 61 20 73 75 63 63 65  r or not a succe
292a0 73 73 66 75 6c 20 6d 61 74 63 68 0a 2a 2a 20 77  ssful match.** w
292b0 61 73 20 66 6f 75 6e 64 2e 0a 2a 2a 0a 2a 2a 20  as found..**.** 
292c0 57 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 61  Whether or not a
292d0 20 6d 61 74 63 68 20 69 73 20 66 6f 75 6e 64 2c   match is found,
292e0 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
292f0 74 75 72 6e 65 64 20 69 66 20 6e 6f 20 65 72 72  turned if no err
29300 6f 72 0a 2a 2a 20 6f 63 63 75 72 73 2e 20 49 66  or.** occurs. If
29310 20 61 6e 20 65 72 72 6f 72 20 64 6f 65 73 20 6f   an error does o
29320 63 63 75 72 2c 20 61 6e 20 65 72 72 6f 72 20 6d  ccur, an error m
29330 65 73 73 61 67 65 20 69 73 20 73 74 6f 72 65 64  essage is stored
29340 20 69 6e 20 74 68 65 0a 2a 2a 20 70 61 72 73 65   in the.** parse
29350 72 20 61 6e 64 20 73 6f 6d 65 20 65 72 72 6f 72  r and some error
29360 20 63 6f 64 65 20 6f 74 68 65 72 20 74 68 61 6e   code other than
29370 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72   SQLITE_OK retur
29380 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ned..*/.static i
29390 6e 74 20 77 69 74 68 45 78 70 61 6e 64 28 0a 20  nt withExpand(. 
293a0 20 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72   Walker *pWalker
293b0 2c 20 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c  , .  struct SrcL
293c0 69 73 74 5f 69 74 65 6d 20 2a 70 46 72 6f 6d 0a  ist_item *pFrom.
293d0 29 7b 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  ){.  Parse *pPar
293e0 73 65 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 70 50  se = pWalker->pP
293f0 61 72 73 65 3b 0a 20 20 73 71 6c 69 74 65 33 20  arse;.  sqlite3 
29400 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
29410 3b 0a 20 20 73 74 72 75 63 74 20 43 74 65 20 2a  ;.  struct Cte *
29420 70 43 74 65 3b 20 20 20 20 20 20 20 20 20 20 20  pCte;           
29430 20 20 20 20 2f 2a 20 4d 61 74 63 68 65 64 20 43      /* Matched C
29440 54 45 20 28 6f 72 20 4e 55 4c 4c 20 69 66 20 6e  TE (or NULL if n
29450 6f 20 6d 61 74 63 68 29 20 2a 2f 0a 20 20 57 69  o match) */.  Wi
29460 74 68 20 2a 70 57 69 74 68 3b 20 20 20 20 20 20  th *pWith;      
29470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
29480 20 57 49 54 48 20 63 6c 61 75 73 65 20 74 68 61   WITH clause tha
29490 74 20 70 43 74 65 20 62 65 6c 6f 6e 67 73 20 74  t pCte belongs t
294a0 6f 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  o */..  assert( 
294b0 70 46 72 6f 6d 2d 3e 70 54 61 62 3d 3d 30 20 29  pFrom->pTab==0 )
294c0 3b 0a 0a 20 20 70 43 74 65 20 3d 20 73 65 61 72  ;..  pCte = sear
294d0 63 68 57 69 74 68 28 70 50 61 72 73 65 2d 3e 70  chWith(pParse->p
294e0 57 69 74 68 2c 20 70 46 72 6f 6d 2c 20 26 70 57  With, pFrom, &pW
294f0 69 74 68 29 3b 0a 20 20 69 66 28 20 70 43 74 65  ith);.  if( pCte
29500 20 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70   ){.    Table *p
29510 54 61 62 3b 0a 20 20 20 20 45 78 70 72 4c 69 73  Tab;.    ExprLis
29520 74 20 2a 70 45 4c 69 73 74 3b 0a 20 20 20 20 53  t *pEList;.    S
29530 65 6c 65 63 74 20 2a 70 53 65 6c 3b 0a 20 20 20  elect *pSel;.   
29540 20 53 65 6c 65 63 74 20 2a 70 4c 65 66 74 3b 20   Select *pLeft; 
29550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
29560 2a 20 4c 65 66 74 2d 6d 6f 73 74 20 53 45 4c 45  * Left-most SELE
29570 43 54 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a  CT statement */.
29580 20 20 20 20 69 6e 74 20 62 4d 61 79 52 65 63 75      int bMayRecu
29590 72 73 69 76 65 3b 20 20 20 20 20 20 20 20 20 20  rsive;          
295a0 20 20 2f 2a 20 54 72 75 65 20 69 66 20 63 6f 6d    /* True if com
295b0 70 6f 75 6e 64 20 6a 6f 69 6e 65 64 20 62 79 20  pound joined by 
295c0 55 4e 49 4f 4e 20 5b 41 4c 4c 5d 20 2a 2f 0a 20  UNION [ALL] */. 
295d0 20 20 20 57 69 74 68 20 2a 70 53 61 76 65 64 57     With *pSavedW
295e0 69 74 68 3b 20 20 20 20 20 20 20 20 20 20 20 20  ith;            
295f0 20 2f 2a 20 49 6e 69 74 69 61 6c 20 76 61 6c 75   /* Initial valu
29600 65 20 6f 66 20 70 50 61 72 73 65 2d 3e 70 57 69  e of pParse->pWi
29610 74 68 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 49 66  th */..    /* If
29620 20 70 43 74 65 2d 3e 7a 43 74 65 45 72 72 20 69   pCte->zCteErr i
29630 73 20 6e 6f 6e 2d 4e 55 4c 4c 20 61 74 20 74 68  s non-NULL at th
29640 69 73 20 70 6f 69 6e 74 2c 20 74 68 65 6e 20 74  is point, then t
29650 68 69 73 20 69 73 20 61 6e 20 69 6c 6c 65 67 61  his is an illega
29660 6c 0a 20 20 20 20 2a 2a 20 72 65 63 75 72 73 69  l.    ** recursi
29670 76 65 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20  ve reference to 
29680 43 54 45 20 70 43 74 65 2e 20 4c 65 61 76 65 20  CTE pCte. Leave 
29690 61 6e 20 65 72 72 6f 72 20 69 6e 20 70 50 61 72  an error in pPar
296a0 73 65 20 61 6e 64 20 72 65 74 75 72 6e 0a 20 20  se and return.  
296b0 20 20 2a 2a 20 65 61 72 6c 79 2e 20 49 66 20 70    ** early. If p
296c0 43 74 65 2d 3e 7a 43 74 65 45 72 72 20 69 73 20  Cte->zCteErr is 
296d0 4e 55 4c 4c 2c 20 74 68 65 6e 20 74 68 69 73 20  NULL, then this 
296e0 69 73 20 6e 6f 74 20 61 20 72 65 63 75 72 73 69  is not a recursi
296f0 76 65 20 72 65 66 65 72 65 6e 63 65 2e 0a 20 20  ve reference..  
29700 20 20 2a 2a 20 49 6e 20 74 68 69 73 20 63 61 73    ** In this cas
29710 65 2c 20 70 72 6f 63 65 65 64 2e 20 20 2a 2f 0a  e, proceed.  */.
29720 20 20 20 20 69 66 28 20 70 43 74 65 2d 3e 7a 43      if( pCte->zC
29730 74 65 45 72 72 20 29 7b 0a 20 20 20 20 20 20 73  teErr ){.      s
29740 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
29750 50 61 72 73 65 2c 20 70 43 74 65 2d 3e 7a 43 74  Parse, pCte->zCt
29760 65 45 72 72 2c 20 70 43 74 65 2d 3e 7a 4e 61 6d  eErr, pCte->zNam
29770 65 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  e);.      return
29780 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
29790 20 20 20 7d 0a 20 20 20 20 69 66 28 20 63 61 6e     }.    if( can
297a0 6e 6f 74 42 65 46 75 6e 63 74 69 6f 6e 28 70 50  notBeFunction(pP
297b0 61 72 73 65 2c 20 70 46 72 6f 6d 29 20 29 20 72  arse, pFrom) ) r
297c0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
297d0 4f 52 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28  OR;..    assert(
297e0 20 70 46 72 6f 6d 2d 3e 70 54 61 62 3d 3d 30 20   pFrom->pTab==0 
297f0 29 3b 0a 20 20 20 20 70 46 72 6f 6d 2d 3e 70 54  );.    pFrom->pT
29800 61 62 20 3d 20 70 54 61 62 20 3d 20 73 71 6c 69  ab = pTab = sqli
29810 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28  te3DbMallocZero(
29820 64 62 2c 20 73 69 7a 65 6f 66 28 54 61 62 6c 65  db, sizeof(Table
29830 29 29 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62  ));.    if( pTab
29840 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 57 52 43  ==0 ) return WRC
29850 5f 41 62 6f 72 74 3b 0a 20 20 20 20 70 54 61 62  _Abort;.    pTab
29860 2d 3e 6e 54 61 62 52 65 66 20 3d 20 31 3b 0a 20  ->nTabRef = 1;. 
29870 20 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 20 3d     pTab->zName =
29880 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70   sqlite3DbStrDup
29890 28 64 62 2c 20 70 43 74 65 2d 3e 7a 4e 61 6d 65  (db, pCte->zName
298a0 29 3b 0a 20 20 20 20 70 54 61 62 2d 3e 69 50 4b  );.    pTab->iPK
298b0 65 79 20 3d 20 2d 31 3b 0a 20 20 20 20 70 54 61  ey = -1;.    pTa
298c0 62 2d 3e 6e 52 6f 77 4c 6f 67 45 73 74 20 3d 20  b->nRowLogEst = 
298d0 32 30 30 3b 20 61 73 73 65 72 74 28 20 32 30 30  200; assert( 200
298e0 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28  ==sqlite3LogEst(
298f0 31 30 34 38 35 37 36 29 20 29 3b 0a 20 20 20 20  1048576) );.    
29900 70 54 61 62 2d 3e 74 61 62 46 6c 61 67 73 20 7c  pTab->tabFlags |
29910 3d 20 54 46 5f 45 70 68 65 6d 65 72 61 6c 20 7c  = TF_Ephemeral |
29920 20 54 46 5f 4e 6f 56 69 73 69 62 6c 65 52 6f 77   TF_NoVisibleRow
29930 69 64 3b 0a 20 20 20 20 70 46 72 6f 6d 2d 3e 70  id;.    pFrom->p
29940 53 65 6c 65 63 74 20 3d 20 73 71 6c 69 74 65 33  Select = sqlite3
29950 53 65 6c 65 63 74 44 75 70 28 64 62 2c 20 70 43  SelectDup(db, pC
29960 74 65 2d 3e 70 53 65 6c 65 63 74 2c 20 30 29 3b  te->pSelect, 0);
29970 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c  .    if( db->mal
29980 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74 75  locFailed ) retu
29990 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f  rn SQLITE_NOMEM_
299a0 42 4b 50 54 3b 0a 20 20 20 20 61 73 73 65 72 74  BKPT;.    assert
299b0 28 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74  ( pFrom->pSelect
299c0 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63   );..    /* Chec
299d0 6b 20 69 66 20 74 68 69 73 20 69 73 20 61 20 72  k if this is a r
299e0 65 63 75 72 73 69 76 65 20 43 54 45 2e 20 2a 2f  ecursive CTE. */
299f0 0a 20 20 20 20 70 53 65 6c 20 3d 20 70 46 72 6f  .    pSel = pFro
29a00 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20  m->pSelect;.    
29a10 62 4d 61 79 52 65 63 75 72 73 69 76 65 20 3d 20  bMayRecursive = 
29a20 28 20 70 53 65 6c 2d 3e 6f 70 3d 3d 54 4b 5f 41  ( pSel->op==TK_A
29a30 4c 4c 20 7c 7c 20 70 53 65 6c 2d 3e 6f 70 3d 3d  LL || pSel->op==
29a40 54 4b 5f 55 4e 49 4f 4e 20 29 3b 0a 20 20 20 20  TK_UNION );.    
29a50 69 66 28 20 62 4d 61 79 52 65 63 75 72 73 69 76  if( bMayRecursiv
29a60 65 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  e ){.      int i
29a70 3b 0a 20 20 20 20 20 20 53 72 63 4c 69 73 74 20  ;.      SrcList 
29a80 2a 70 53 72 63 20 3d 20 70 46 72 6f 6d 2d 3e 70  *pSrc = pFrom->p
29a90 53 65 6c 65 63 74 2d 3e 70 53 72 63 3b 0a 20 20  Select->pSrc;.  
29aa0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
29ab0 53 72 63 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b  Src->nSrc; i++){
29ac0 0a 20 20 20 20 20 20 20 20 73 74 72 75 63 74 20  .        struct 
29ad0 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  SrcList_item *pI
29ae0 74 65 6d 20 3d 20 26 70 53 72 63 2d 3e 61 5b 69  tem = &pSrc->a[i
29af0 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  ];.        if( p
29b00 49 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65 3d  Item->zDatabase=
29b10 3d 30 20 0a 20 20 20 20 20 20 20 20 20 26 26 20  =0 .         && 
29b20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 21 3d 30 20  pItem->zName!=0 
29b30 0a 20 20 20 20 20 20 20 20 20 26 26 20 30 3d 3d  .         && 0==
29b40 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70  sqlite3StrICmp(p
29b50 49 74 65 6d 2d 3e 7a 4e 61 6d 65 2c 20 70 43 74  Item->zName, pCt
29b60 65 2d 3e 7a 4e 61 6d 65 29 0a 20 20 20 20 20 20  e->zName).      
29b70 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20      ){.         
29b80 20 70 49 74 65 6d 2d 3e 70 54 61 62 20 3d 20 70   pItem->pTab = p
29b90 54 61 62 3b 0a 20 20 20 20 20 20 20 20 20 20 70  Tab;.          p
29ba0 49 74 65 6d 2d 3e 66 67 2e 69 73 52 65 63 75 72  Item->fg.isRecur
29bb0 73 69 76 65 20 3d 20 31 3b 0a 20 20 20 20 20 20  sive = 1;.      
29bc0 20 20 20 20 70 54 61 62 2d 3e 6e 54 61 62 52 65      pTab->nTabRe
29bd0 66 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 70  f++;.          p
29be0 53 65 6c 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d  Sel->selFlags |=
29bf0 20 53 46 5f 52 65 63 75 72 73 69 76 65 3b 0a 20   SF_Recursive;. 
29c00 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
29c10 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4f  .    }..    /* O
29c20 6e 6c 79 20 6f 6e 65 20 72 65 63 75 72 73 69 76  nly one recursiv
29c30 65 20 72 65 66 65 72 65 6e 63 65 20 69 73 20 70  e reference is p
29c40 65 72 6d 69 74 74 65 64 2e 20 2a 2f 20 0a 20 20  ermitted. */ .  
29c50 20 20 69 66 28 20 70 54 61 62 2d 3e 6e 54 61 62    if( pTab->nTab
29c60 52 65 66 3e 32 20 29 7b 0a 20 20 20 20 20 20 73  Ref>2 ){.      s
29c70 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 0a  qlite3ErrorMsg(.
29c80 20 20 20 20 20 20 20 20 20 20 70 50 61 72 73 65            pParse
29c90 2c 20 22 6d 75 6c 74 69 70 6c 65 20 72 65 66 65  , "multiple refe
29ca0 72 65 6e 63 65 73 20 74 6f 20 72 65 63 75 72 73  rences to recurs
29cb0 69 76 65 20 74 61 62 6c 65 3a 20 25 73 22 2c 20  ive table: %s", 
29cc0 70 43 74 65 2d 3e 7a 4e 61 6d 65 0a 20 20 20 20  pCte->zName.    
29cd0 20 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72    );.      retur
29ce0 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  n SQLITE_ERROR;.
29cf0 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
29d00 28 20 70 54 61 62 2d 3e 6e 54 61 62 52 65 66 3d  ( pTab->nTabRef=
29d10 3d 31 20 7c 7c 20 0a 20 20 20 20 20 20 20 20 20  =1 || .         
29d20 20 20 20 28 28 70 53 65 6c 2d 3e 73 65 6c 46 6c     ((pSel->selFl
29d30 61 67 73 26 53 46 5f 52 65 63 75 72 73 69 76 65  ags&SF_Recursive
29d40 29 20 26 26 20 70 54 61 62 2d 3e 6e 54 61 62 52  ) && pTab->nTabR
29d50 65 66 3d 3d 32 20 29 29 3b 0a 0a 20 20 20 20 70  ef==2 ));..    p
29d60 43 74 65 2d 3e 7a 43 74 65 45 72 72 20 3d 20 22  Cte->zCteErr = "
29d70 63 69 72 63 75 6c 61 72 20 72 65 66 65 72 65 6e  circular referen
29d80 63 65 3a 20 25 73 22 3b 0a 20 20 20 20 70 53 61  ce: %s";.    pSa
29d90 76 65 64 57 69 74 68 20 3d 20 70 50 61 72 73 65  vedWith = pParse
29da0 2d 3e 70 57 69 74 68 3b 0a 20 20 20 20 70 50 61  ->pWith;.    pPa
29db0 72 73 65 2d 3e 70 57 69 74 68 20 3d 20 70 57 69  rse->pWith = pWi
29dc0 74 68 3b 0a 20 20 20 20 69 66 28 20 62 4d 61 79  th;.    if( bMay
29dd0 52 65 63 75 72 73 69 76 65 20 29 7b 0a 20 20 20  Recursive ){.   
29de0 20 20 20 53 65 6c 65 63 74 20 2a 70 50 72 69 6f     Select *pPrio
29df0 72 20 3d 20 70 53 65 6c 2d 3e 70 50 72 69 6f 72  r = pSel->pPrior
29e00 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
29e10 70 50 72 69 6f 72 2d 3e 70 57 69 74 68 3d 3d 30  pPrior->pWith==0
29e20 20 29 3b 0a 20 20 20 20 20 20 70 50 72 69 6f 72   );.      pPrior
29e30 2d 3e 70 57 69 74 68 20 3d 20 70 53 65 6c 2d 3e  ->pWith = pSel->
29e40 70 57 69 74 68 3b 0a 20 20 20 20 20 20 73 71 6c  pWith;.      sql
29e50 69 74 65 33 57 61 6c 6b 53 65 6c 65 63 74 28 70  ite3WalkSelect(p
29e60 57 61 6c 6b 65 72 2c 20 70 50 72 69 6f 72 29 3b  Walker, pPrior);
29e70 0a 20 20 20 20 20 20 70 50 72 69 6f 72 2d 3e 70  .      pPrior->p
29e80 57 69 74 68 20 3d 20 30 3b 0a 20 20 20 20 7d 65  With = 0;.    }e
29e90 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  lse{.      sqlit
29ea0 65 33 57 61 6c 6b 53 65 6c 65 63 74 28 70 57 61  e3WalkSelect(pWa
29eb0 6c 6b 65 72 2c 20 70 53 65 6c 29 3b 0a 20 20 20  lker, pSel);.   
29ec0 20 7d 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 70   }.    pParse->p
29ed0 57 69 74 68 20 3d 20 70 57 69 74 68 3b 0a 0a 20  With = pWith;.. 
29ee0 20 20 20 66 6f 72 28 70 4c 65 66 74 3d 70 53 65     for(pLeft=pSe
29ef0 6c 3b 20 70 4c 65 66 74 2d 3e 70 50 72 69 6f 72  l; pLeft->pPrior
29f00 3b 20 70 4c 65 66 74 3d 70 4c 65 66 74 2d 3e 70  ; pLeft=pLeft->p
29f10 50 72 69 6f 72 29 3b 0a 20 20 20 20 70 45 4c 69  Prior);.    pELi
29f20 73 74 20 3d 20 70 4c 65 66 74 2d 3e 70 45 4c 69  st = pLeft->pELi
29f30 73 74 3b 0a 20 20 20 20 69 66 28 20 70 43 74 65  st;.    if( pCte
29f40 2d 3e 70 43 6f 6c 73 20 29 7b 0a 20 20 20 20 20  ->pCols ){.     
29f50 20 69 66 28 20 70 45 4c 69 73 74 20 26 26 20 70   if( pEList && p
29f60 45 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d 70 43  EList->nExpr!=pC
29f70 74 65 2d 3e 70 43 6f 6c 73 2d 3e 6e 45 78 70 72  te->pCols->nExpr
29f80 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
29f90 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
29fa0 73 65 2c 20 22 74 61 62 6c 65 20 25 73 20 68 61  se, "table %s ha
29fb0 73 20 25 64 20 76 61 6c 75 65 73 20 66 6f 72 20  s %d values for 
29fc0 25 64 20 63 6f 6c 75 6d 6e 73 22 2c 0a 20 20 20  %d columns",.   
29fd0 20 20 20 20 20 20 20 20 20 70 43 74 65 2d 3e 7a           pCte->z
29fe0 4e 61 6d 65 2c 20 70 45 4c 69 73 74 2d 3e 6e 45  Name, pEList->nE
29ff0 78 70 72 2c 20 70 43 74 65 2d 3e 70 43 6f 6c 73  xpr, pCte->pCols
2a000 2d 3e 6e 45 78 70 72 0a 20 20 20 20 20 20 20 20  ->nExpr.        
2a010 29 3b 0a 20 20 20 20 20 20 20 20 70 50 61 72 73  );.        pPars
2a020 65 2d 3e 70 57 69 74 68 20 3d 20 70 53 61 76 65  e->pWith = pSave
2a030 64 57 69 74 68 3b 0a 20 20 20 20 20 20 20 20 72  dWith;.        r
2a040 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
2a050 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  OR;.      }.    
2a060 20 20 70 45 4c 69 73 74 20 3d 20 70 43 74 65 2d    pEList = pCte-
2a070 3e 70 43 6f 6c 73 3b 0a 20 20 20 20 7d 0a 0a 20  >pCols;.    }.. 
2a080 20 20 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e     sqlite3Column
2a090 73 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 70 50  sFromExprList(pP
2a0a0 61 72 73 65 2c 20 70 45 4c 69 73 74 2c 20 26 70  arse, pEList, &p
2a0b0 54 61 62 2d 3e 6e 43 6f 6c 2c 20 26 70 54 61 62  Tab->nCol, &pTab
2a0c0 2d 3e 61 43 6f 6c 29 3b 0a 20 20 20 20 69 66 28  ->aCol);.    if(
2a0d0 20 62 4d 61 79 52 65 63 75 72 73 69 76 65 20 29   bMayRecursive )
2a0e0 7b 0a 20 20 20 20 20 20 69 66 28 20 70 53 65 6c  {.      if( pSel
2a0f0 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f  ->selFlags & SF_
2a100 52 65 63 75 72 73 69 76 65 20 29 7b 0a 20 20 20  Recursive ){.   
2a110 20 20 20 20 20 70 43 74 65 2d 3e 7a 43 74 65 45       pCte->zCteE
2a120 72 72 20 3d 20 22 6d 75 6c 74 69 70 6c 65 20 72  rr = "multiple r
2a130 65 63 75 72 73 69 76 65 20 72 65 66 65 72 65 6e  ecursive referen
2a140 63 65 73 3a 20 25 73 22 3b 0a 20 20 20 20 20 20  ces: %s";.      
2a150 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70  }else{.        p
2a160 43 74 65 2d 3e 7a 43 74 65 45 72 72 20 3d 20 22  Cte->zCteErr = "
2a170 72 65 63 75 72 73 69 76 65 20 72 65 66 65 72 65  recursive refere
2a180 6e 63 65 20 69 6e 20 61 20 73 75 62 71 75 65 72  nce in a subquer
2a190 79 3a 20 25 73 22 3b 0a 20 20 20 20 20 20 7d 0a  y: %s";.      }.
2a1a0 20 20 20 20 20 20 73 71 6c 69 74 65 33 57 61 6c        sqlite3Wal
2a1b0 6b 53 65 6c 65 63 74 28 70 57 61 6c 6b 65 72 2c  kSelect(pWalker,
2a1c0 20 70 53 65 6c 29 3b 0a 20 20 20 20 7d 0a 20 20   pSel);.    }.  
2a1d0 20 20 70 43 74 65 2d 3e 7a 43 74 65 45 72 72 20    pCte->zCteErr 
2a1e0 3d 20 30 3b 0a 20 20 20 20 70 50 61 72 73 65 2d  = 0;.    pParse-
2a1f0 3e 70 57 69 74 68 20 3d 20 70 53 61 76 65 64 57  >pWith = pSavedW
2a200 69 74 68 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  ith;.  }..  retu
2a210 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
2a220 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20  #endif..#ifndef 
2a230 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 54 45 0a  SQLITE_OMIT_CTE.
2a240 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 53 45 4c  /*.** If the SEL
2a250 45 43 54 20 70 61 73 73 65 64 20 61 73 20 74 68  ECT passed as th
2a260 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
2a270 74 20 68 61 73 20 61 6e 20 61 73 73 6f 63 69 61  t has an associa
2a280 74 65 64 20 57 49 54 48 20 0a 2a 2a 20 63 6c 61  ted WITH .** cla
2a290 75 73 65 2c 20 70 6f 70 20 69 74 20 66 72 6f 6d  use, pop it from
2a2a0 20 74 68 65 20 73 74 61 63 6b 20 73 74 6f 72 65   the stack store
2a2b0 64 20 61 73 20 70 61 72 74 20 6f 66 20 74 68 65  d as part of the
2a2c0 20 50 61 72 73 65 20 6f 62 6a 65 63 74 2e 0a 2a   Parse object..*
2a2d0 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
2a2e0 6f 6e 20 69 73 20 75 73 65 64 20 61 73 20 74 68  on is used as th
2a2f0 65 20 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63  e xSelectCallbac
2a300 6b 32 28 29 20 63 61 6c 6c 62 61 63 6b 20 62 79  k2() callback by
2a310 0a 2a 2a 20 73 71 6c 69 74 65 33 53 65 6c 65 63  .** sqlite3Selec
2a320 74 45 78 70 61 6e 64 28 29 20 77 68 65 6e 20 77  tExpand() when w
2a330 61 6c 6b 69 6e 67 20 61 20 53 45 4c 45 43 54 20  alking a SELECT 
2a340 74 72 65 65 20 74 6f 20 72 65 73 6f 6c 76 65 20  tree to resolve 
2a350 74 61 62 6c 65 0a 2a 2a 20 6e 61 6d 65 73 20 61  table.** names a
2a360 6e 64 20 6f 74 68 65 72 20 46 52 4f 4d 20 63 6c  nd other FROM cl
2a370 61 75 73 65 20 65 6c 65 6d 65 6e 74 73 2e 20 0a  ause elements. .
2a380 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  */.static void s
2a390 65 6c 65 63 74 50 6f 70 57 69 74 68 28 57 61 6c  electPopWith(Wal
2a3a0 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 53 65  ker *pWalker, Se
2a3b0 6c 65 63 74 20 2a 70 29 7b 0a 20 20 50 61 72 73  lect *p){.  Pars
2a3c0 65 20 2a 70 50 61 72 73 65 20 3d 20 70 57 61 6c  e *pParse = pWal
2a3d0 6b 65 72 2d 3e 70 50 61 72 73 65 3b 0a 20 20 69  ker->pParse;.  i
2a3e0 66 28 20 4f 4b 5f 49 46 5f 41 4c 57 41 59 53 5f  f( OK_IF_ALWAYS_
2a3f0 54 52 55 45 28 70 50 61 72 73 65 2d 3e 70 57 69  TRUE(pParse->pWi
2a400 74 68 29 20 26 26 20 70 2d 3e 70 50 72 69 6f 72  th) && p->pPrior
2a410 3d 3d 30 20 29 7b 0a 20 20 20 20 57 69 74 68 20  ==0 ){.    With 
2a420 2a 70 57 69 74 68 20 3d 20 66 69 6e 64 52 69 67  *pWith = findRig
2a430 68 74 6d 6f 73 74 28 70 29 2d 3e 70 57 69 74 68  htmost(p)->pWith
2a440 3b 0a 20 20 20 20 69 66 28 20 70 57 69 74 68 21  ;.    if( pWith!
2a450 3d 30 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  =0 ){.      asse
2a460 72 74 28 20 70 50 61 72 73 65 2d 3e 70 57 69 74  rt( pParse->pWit
2a470 68 3d 3d 70 57 69 74 68 20 29 3b 0a 20 20 20 20  h==pWith );.    
2a480 20 20 70 50 61 72 73 65 2d 3e 70 57 69 74 68 20    pParse->pWith 
2a490 3d 20 70 57 69 74 68 2d 3e 70 4f 75 74 65 72 3b  = pWith->pOuter;
2a4a0 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6c  .    }.  }.}.#el
2a4b0 73 65 0a 23 64 65 66 69 6e 65 20 73 65 6c 65 63  se.#define selec
2a4c0 74 50 6f 70 57 69 74 68 20 30 0a 23 65 6e 64 69  tPopWith 0.#endi
2a4d0 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 53 72 63  f../*.** The Src
2a4e0 4c 69 73 74 5f 69 74 65 6d 20 73 74 72 75 63 74  List_item struct
2a4f0 75 72 65 20 70 61 73 73 65 64 20 61 73 20 74 68  ure passed as th
2a500 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
2a510 74 20 72 65 70 72 65 73 65 6e 74 73 20 61 0a 2a  t represents a.*
2a520 2a 20 73 75 62 2d 71 75 65 72 79 20 69 6e 20 74  * sub-query in t
2a530 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f  he FROM clause o
2a540 66 20 61 20 53 45 4c 45 43 54 20 73 74 61 74 65  f a SELECT state
2a550 6d 65 6e 74 2e 20 54 68 69 73 20 66 75 6e 63 74  ment. This funct
2a560 69 6f 6e 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 73  ion.** allocates
2a570 20 61 6e 64 20 70 6f 70 75 6c 61 74 65 73 20 74   and populates t
2a580 68 65 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 2e  he SrcList_item.
2a590 70 54 61 62 20 6f 62 6a 65 63 74 2e 20 49 66 20  pTab object. If 
2a5a0 73 75 63 63 65 73 73 66 75 6c 2c 0a 2a 2a 20 53  successful,.** S
2a5b0 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
2a5c0 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c  rned. Otherwise,
2a5d0 20 69 66 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72   if an OOM error
2a5e0 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c   is encountered,
2a5f0 0a 2a 2a 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  .** SQLITE_NOMEM
2a600 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
2a610 45 78 70 61 6e 64 53 75 62 71 75 65 72 79 28 50  ExpandSubquery(P
2a620 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 73 74  arse *pParse, st
2a630 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
2a640 6d 20 2a 70 46 72 6f 6d 29 7b 0a 20 20 53 65 6c  m *pFrom){.  Sel
2a650 65 63 74 20 2a 70 53 65 6c 20 3d 20 70 46 72 6f  ect *pSel = pFro
2a660 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a 20 20 54 61  m->pSelect;.  Ta
2a670 62 6c 65 20 2a 70 54 61 62 3b 0a 0a 20 20 61 73  ble *pTab;..  as
2a680 73 65 72 74 28 20 70 53 65 6c 20 29 3b 0a 20 20  sert( pSel );.  
2a690 70 46 72 6f 6d 2d 3e 70 54 61 62 20 3d 20 70 54  pFrom->pTab = pT
2a6a0 61 62 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  ab = sqlite3DbMa
2a6b0 6c 6c 6f 63 5a 65 72 6f 28 70 50 61 72 73 65 2d  llocZero(pParse-
2a6c0 3e 64 62 2c 20 73 69 7a 65 6f 66 28 54 61 62 6c  >db, sizeof(Tabl
2a6d0 65 29 29 3b 0a 20 20 69 66 28 20 70 54 61 62 3d  e));.  if( pTab=
2a6e0 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  =0 ) return SQLI
2a6f0 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 70 54 61 62  TE_NOMEM;.  pTab
2a700 2d 3e 6e 54 61 62 52 65 66 20 3d 20 31 3b 0a 20  ->nTabRef = 1;. 
2a710 20 69 66 28 20 70 46 72 6f 6d 2d 3e 7a 41 6c 69   if( pFrom->zAli
2a720 61 73 20 29 7b 0a 20 20 20 20 70 54 61 62 2d 3e  as ){.    pTab->
2a730 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44  zName = sqlite3D
2a740 62 53 74 72 44 75 70 28 70 50 61 72 73 65 2d 3e  bStrDup(pParse->
2a750 64 62 2c 20 70 46 72 6f 6d 2d 3e 7a 41 6c 69 61  db, pFrom->zAlia
2a760 73 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  s);.  }else{.   
2a770 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 20 3d 20 73   pTab->zName = s
2a780 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 70 50  qlite3MPrintf(pP
2a790 61 72 73 65 2d 3e 64 62 2c 20 22 73 75 62 71 75  arse->db, "subqu
2a7a0 65 72 79 5f 25 75 22 2c 20 70 53 65 6c 2d 3e 73  ery_%u", pSel->s
2a7b0 65 6c 49 64 29 3b 0a 20 20 7d 0a 20 20 77 68 69  elId);.  }.  whi
2a7c0 6c 65 28 20 70 53 65 6c 2d 3e 70 50 72 69 6f 72  le( pSel->pPrior
2a7d0 20 29 7b 20 70 53 65 6c 20 3d 20 70 53 65 6c 2d   ){ pSel = pSel-
2a7e0 3e 70 50 72 69 6f 72 3b 20 7d 0a 20 20 73 71 6c  >pPrior; }.  sql
2a7f0 69 74 65 33 43 6f 6c 75 6d 6e 73 46 72 6f 6d 45  ite3ColumnsFromE
2a800 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20  xprList(pParse, 
2a810 70 53 65 6c 2d 3e 70 45 4c 69 73 74 2c 26 70 54  pSel->pEList,&pT
2a820 61 62 2d 3e 6e 43 6f 6c 2c 26 70 54 61 62 2d 3e  ab->nCol,&pTab->
2a830 61 43 6f 6c 29 3b 0a 20 20 70 54 61 62 2d 3e 69  aCol);.  pTab->i
2a840 50 4b 65 79 20 3d 20 2d 31 3b 0a 20 20 70 54 61  PKey = -1;.  pTa
2a850 62 2d 3e 6e 52 6f 77 4c 6f 67 45 73 74 20 3d 20  b->nRowLogEst = 
2a860 32 30 30 3b 20 61 73 73 65 72 74 28 20 32 30 30  200; assert( 200
2a870 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28  ==sqlite3LogEst(
2a880 31 30 34 38 35 37 36 29 20 29 3b 0a 20 20 70 54  1048576) );.  pT
2a890 61 62 2d 3e 74 61 62 46 6c 61 67 73 20 7c 3d 20  ab->tabFlags |= 
2a8a0 54 46 5f 45 70 68 65 6d 65 72 61 6c 3b 0a 0a 20  TF_Ephemeral;.. 
2a8b0 20 72 65 74 75 72 6e 20 70 50 61 72 73 65 2d 3e   return pParse->
2a8c0 6e 45 72 72 20 3f 20 53 51 4c 49 54 45 5f 45 52  nErr ? SQLITE_ER
2a8d0 52 4f 52 20 3a 20 53 51 4c 49 54 45 5f 4f 4b 3b  ROR : SQLITE_OK;
2a8e0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
2a8f0 6f 75 74 69 6e 65 20 69 73 20 61 20 57 61 6c 6b  outine is a Walk
2a900 65 72 20 63 61 6c 6c 62 61 63 6b 20 66 6f 72 20  er callback for 
2a910 22 65 78 70 61 6e 64 69 6e 67 22 20 61 20 53 45  "expanding" a SE
2a920 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a  LECT statement..
2a930 2a 2a 20 22 45 78 70 61 6e 64 69 6e 67 22 20 6d  ** "Expanding" m
2a940 65 61 6e 73 20 74 6f 20 64 6f 20 74 68 65 20 66  eans to do the f
2a950 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20  ollowing:.**.** 
2a960 20 20 20 28 31 29 20 20 4d 61 6b 65 20 73 75 72     (1)  Make sur
2a970 65 20 56 44 42 45 20 63 75 72 73 6f 72 20 6e 75  e VDBE cursor nu
2a980 6d 62 65 72 73 20 68 61 76 65 20 62 65 65 6e 20  mbers have been 
2a990 61 73 73 69 67 6e 65 64 20 74 6f 20 65 76 65 72  assigned to ever
2a9a0 79 0a 2a 2a 20 20 20 20 20 20 20 20 20 65 6c 65  y.**         ele
2a9b0 6d 65 6e 74 20 6f 66 20 74 68 65 20 46 52 4f 4d  ment of the FROM
2a9c0 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 20   clause..**.**  
2a9d0 20 20 28 32 29 20 20 46 69 6c 6c 20 69 6e 20 74    (2)  Fill in t
2a9e0 68 65 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 5d  he pTabList->a[]
2a9f0 2e 70 54 61 62 20 66 69 65 6c 64 73 20 69 6e 20  .pTab fields in 
2aa00 74 68 65 20 53 72 63 4c 69 73 74 20 74 68 61 74  the SrcList that
2aa10 20 0a 2a 2a 20 20 20 20 20 20 20 20 20 64 65 66   .**         def
2aa20 69 6e 65 73 20 46 52 4f 4d 20 63 6c 61 75 73 65  ines FROM clause
2aa30 2e 20 20 57 68 65 6e 20 76 69 65 77 73 20 61 70  .  When views ap
2aa40 70 65 61 72 20 69 6e 20 74 68 65 20 46 52 4f 4d  pear in the FROM
2aa50 20 63 6c 61 75 73 65 2c 0a 2a 2a 20 20 20 20 20   clause,.**     
2aa60 20 20 20 20 66 69 6c 6c 20 70 54 61 62 4c 69 73      fill pTabLis
2aa70 74 2d 3e 61 5b 5d 2e 70 53 65 6c 65 63 74 20 77  t->a[].pSelect w
2aa80 69 74 68 20 61 20 63 6f 70 79 20 6f 66 20 74 68  ith a copy of th
2aa90 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  e SELECT stateme
2aaa0 6e 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 74 68  nt.**         th
2aab0 61 74 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68  at implements th
2aac0 65 20 76 69 65 77 2e 20 20 41 20 63 6f 70 79 20  e view.  A copy 
2aad0 69 73 20 6d 61 64 65 20 6f 66 20 74 68 65 20 76  is made of the v
2aae0 69 65 77 27 73 20 53 45 4c 45 43 54 0a 2a 2a 20  iew's SELECT.** 
2aaf0 20 20 20 20 20 20 20 20 73 74 61 74 65 6d 65 6e          statemen
2ab00 74 20 73 6f 20 74 68 61 74 20 77 65 20 63 61 6e  t so that we can
2ab10 20 66 72 65 65 6c 79 20 6d 6f 64 69 66 79 20 6f   freely modify o
2ab20 72 20 64 65 6c 65 74 65 20 74 68 61 74 20 73 74  r delete that st
2ab30 61 74 65 6d 65 6e 74 0a 2a 2a 20 20 20 20 20 20  atement.**      
2ab40 20 20 20 77 69 74 68 6f 75 74 20 77 6f 72 72 79     without worry
2ab50 69 6e 67 20 61 62 6f 75 74 20 6d 65 73 73 69 6e  ing about messin
2ab60 67 20 75 70 20 74 68 65 20 70 65 72 73 69 73 74  g up the persist
2ab70 65 6e 74 20 72 65 70 72 65 73 65 6e 74 61 74 69  ent representati
2ab80 6f 6e 0a 2a 2a 20 20 20 20 20 20 20 20 20 6f 66  on.**         of
2ab90 20 74 68 65 20 76 69 65 77 2e 0a 2a 2a 0a 2a 2a   the view..**.**
2aba0 20 20 20 20 28 33 29 20 20 41 64 64 20 74 65 72      (3)  Add ter
2abb0 6d 73 20 74 6f 20 74 68 65 20 57 48 45 52 45 20  ms to the WHERE 
2abc0 63 6c 61 75 73 65 20 74 6f 20 61 63 63 6f 6d 6d  clause to accomm
2abd0 6f 64 61 74 65 20 74 68 65 20 4e 41 54 55 52 41  odate the NATURA
2abe0 4c 20 6b 65 79 77 6f 72 64 0a 2a 2a 20 20 20 20  L keyword.**    
2abf0 20 20 20 20 20 6f 6e 20 6a 6f 69 6e 73 20 61 6e       on joins an
2ac00 64 20 74 68 65 20 4f 4e 20 61 6e 64 20 55 53 49  d the ON and USI
2ac10 4e 47 20 63 6c 61 75 73 65 20 6f 66 20 6a 6f 69  NG clause of joi
2ac20 6e 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 34 29  ns..**.**    (4)
2ac30 20 20 53 63 61 6e 20 74 68 65 20 6c 69 73 74 20    Scan the list 
2ac40 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68  of columns in th
2ac50 65 20 72 65 73 75 6c 74 20 73 65 74 20 28 70 45  e result set (pE
2ac60 4c 69 73 74 29 20 6c 6f 6f 6b 69 6e 67 0a 2a 2a  List) looking.**
2ac70 20 20 20 20 20 20 20 20 20 66 6f 72 20 69 6e 73           for ins
2ac80 74 61 6e 63 65 73 20 6f 66 20 74 68 65 20 22 2a  tances of the "*
2ac90 22 20 6f 70 65 72 61 74 6f 72 20 6f 72 20 74 68  " operator or th
2aca0 65 20 54 41 42 4c 45 2e 2a 20 6f 70 65 72 61 74  e TABLE.* operat
2acb0 6f 72 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20 49  or..**         I
2acc0 66 20 66 6f 75 6e 64 2c 20 65 78 70 61 6e 64 20  f found, expand 
2acd0 65 61 63 68 20 22 2a 22 20 74 6f 20 62 65 20 65  each "*" to be e
2ace0 76 65 72 79 20 63 6f 6c 75 6d 6e 20 69 6e 20 65  very column in e
2acf0 76 65 72 79 20 74 61 62 6c 65 0a 2a 2a 20 20 20  very table.**   
2ad00 20 20 20 20 20 20 61 6e 64 20 54 41 42 4c 45 2e        and TABLE.
2ad10 2a 20 74 6f 20 62 65 20 65 76 65 72 79 20 63 6f  * to be every co
2ad20 6c 75 6d 6e 20 69 6e 20 54 41 42 4c 45 2e 0a 2a  lumn in TABLE..*
2ad30 2a 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  *.*/.static int 
2ad40 73 65 6c 65 63 74 45 78 70 61 6e 64 65 72 28 57  selectExpander(W
2ad50 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20  alker *pWalker, 
2ad60 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 50 61  Select *p){.  Pa
2ad70 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20 70 57  rse *pParse = pW
2ad80 61 6c 6b 65 72 2d 3e 70 50 61 72 73 65 3b 0a 20  alker->pParse;. 
2ad90 20 69 6e 74 20 69 2c 20 6a 2c 20 6b 3b 0a 20 20   int i, j, k;.  
2ada0 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73  SrcList *pTabLis
2adb0 74 3b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  t;.  ExprList *p
2adc0 45 4c 69 73 74 3b 0a 20 20 73 74 72 75 63 74 20  EList;.  struct 
2add0 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 46  SrcList_item *pF
2ade0 72 6f 6d 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a  rom;.  sqlite3 *
2adf0 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
2ae00 0a 20 20 45 78 70 72 20 2a 70 45 2c 20 2a 70 52  .  Expr *pE, *pR
2ae10 69 67 68 74 2c 20 2a 70 45 78 70 72 3b 0a 20 20  ight, *pExpr;.  
2ae20 75 31 36 20 73 65 6c 46 6c 61 67 73 20 3d 20 70  u16 selFlags = p
2ae30 2d 3e 73 65 6c 46 6c 61 67 73 3b 0a 20 20 75 33  ->selFlags;.  u3
2ae40 32 20 65 6c 69 73 74 46 6c 61 67 73 20 3d 20 30  2 elistFlags = 0
2ae50 3b 0a 0a 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73  ;..  p->selFlags
2ae60 20 7c 3d 20 53 46 5f 45 78 70 61 6e 64 65 64 3b   |= SF_Expanded;
2ae70 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f  .  if( db->mallo
2ae80 63 46 61 69 6c 65 64 20 20 29 7b 0a 20 20 20 20  cFailed  ){.    
2ae90 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74  return WRC_Abort
2aea0 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
2aeb0 70 2d 3e 70 53 72 63 21 3d 30 20 29 3b 0a 20 20  p->pSrc!=0 );.  
2aec0 69 66 28 20 28 73 65 6c 46 6c 61 67 73 20 26 20  if( (selFlags & 
2aed0 53 46 5f 45 78 70 61 6e 64 65 64 29 21 3d 30 20  SF_Expanded)!=0 
2aee0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 57 52  ){.    return WR
2aef0 43 5f 50 72 75 6e 65 3b 0a 20 20 7d 0a 20 20 69  C_Prune;.  }.  i
2af00 66 28 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64  f( pWalker->eCod
2af10 65 20 29 7b 0a 20 20 20 20 2f 2a 20 52 65 6e 75  e ){.    /* Renu
2af20 6d 62 65 72 20 73 65 6c 49 64 20 62 65 63 61 75  mber selId becau
2af30 73 65 20 69 74 20 68 61 73 20 62 65 65 6e 20 63  se it has been c
2af40 6f 70 69 65 64 20 66 72 6f 6d 20 61 20 76 69 65  opied from a vie
2af50 77 20 2a 2f 0a 20 20 20 20 70 2d 3e 73 65 6c 49  w */.    p->selI
2af60 64 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 53  d = ++pParse->nS
2af70 65 6c 65 63 74 3b 0a 20 20 7d 0a 20 20 70 54 61  elect;.  }.  pTa
2af80 62 4c 69 73 74 20 3d 20 70 2d 3e 70 53 72 63 3b  bList = p->pSrc;
2af90 0a 20 20 70 45 4c 69 73 74 20 3d 20 70 2d 3e 70  .  pEList = p->p
2afa0 45 4c 69 73 74 3b 0a 20 20 73 71 6c 69 74 65 33  EList;.  sqlite3
2afb0 57 69 74 68 50 75 73 68 28 70 50 61 72 73 65 2c  WithPush(pParse,
2afc0 20 70 2d 3e 70 57 69 74 68 2c 20 30 29 3b 0a 0a   p->pWith, 0);..
2afd0 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 63    /* Make sure c
2afe0 75 72 73 6f 72 20 6e 75 6d 62 65 72 73 20 68 61  ursor numbers ha
2aff0 76 65 20 62 65 65 6e 20 61 73 73 69 67 6e 65 64  ve been assigned
2b000 20 74 6f 20 61 6c 6c 20 65 6e 74 72 69 65 73 20   to all entries 
2b010 69 6e 0a 20 20 2a 2a 20 74 68 65 20 46 52 4f 4d  in.  ** the FROM
2b020 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 53   clause of the S
2b030 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e  ELECT statement.
2b040 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 53  .  */.  sqlite3S
2b050 72 63 4c 69 73 74 41 73 73 69 67 6e 43 75 72 73  rcListAssignCurs
2b060 6f 72 73 28 70 50 61 72 73 65 2c 20 70 54 61 62  ors(pParse, pTab
2b070 4c 69 73 74 29 3b 0a 0a 20 20 2f 2a 20 4c 6f 6f  List);..  /* Loo
2b080 6b 20 75 70 20 65 76 65 72 79 20 74 61 62 6c 65  k up every table
2b090 20 6e 61 6d 65 64 20 69 6e 20 74 68 65 20 46 52   named in the FR
2b0a0 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65  OM clause of the
2b0b0 20 73 65 6c 65 63 74 2e 20 20 49 66 0a 20 20 2a   select.  If.  *
2b0c0 2a 20 61 6e 20 65 6e 74 72 79 20 6f 66 20 74 68  * an entry of th
2b0d0 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 69 73  e FROM clause is
2b0e0 20 61 20 73 75 62 71 75 65 72 79 20 69 6e 73 74   a subquery inst
2b0f0 65 61 64 20 6f 66 20 61 20 74 61 62 6c 65 20 6f  ead of a table o
2b100 72 20 76 69 65 77 2c 0a 20 20 2a 2a 20 74 68 65  r view,.  ** the
2b110 6e 20 63 72 65 61 74 65 20 61 20 74 72 61 6e 73  n create a trans
2b120 69 65 6e 74 20 74 61 62 6c 65 20 73 74 72 75 63  ient table struc
2b130 74 75 72 65 20 74 6f 20 64 65 73 63 72 69 62 65  ture to describe
2b140 20 74 68 65 20 73 75 62 71 75 65 72 79 2e 0a 20   the subquery.. 
2b150 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70   */.  for(i=0, p
2b160 46 72 6f 6d 3d 70 54 61 62 4c 69 73 74 2d 3e 61  From=pTabList->a
2b170 3b 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53  ; i<pTabList->nS
2b180 72 63 3b 20 69 2b 2b 2c 20 70 46 72 6f 6d 2b 2b  rc; i++, pFrom++
2b190 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54  ){.    Table *pT
2b1a0 61 62 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ab;.    assert( 
2b1b0 70 46 72 6f 6d 2d 3e 66 67 2e 69 73 52 65 63 75  pFrom->fg.isRecu
2b1c0 72 73 69 76 65 3d 3d 30 20 7c 7c 20 70 46 72 6f  rsive==0 || pFro
2b1d0 6d 2d 3e 70 54 61 62 21 3d 30 20 29 3b 0a 20 20  m->pTab!=0 );.  
2b1e0 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e 66 67 2e    if( pFrom->fg.
2b1f0 69 73 52 65 63 75 72 73 69 76 65 20 29 20 63 6f  isRecursive ) co
2b200 6e 74 69 6e 75 65 3b 0a 20 20 20 20 61 73 73 65  ntinue;.    asse
2b210 72 74 28 20 70 46 72 6f 6d 2d 3e 70 54 61 62 3d  rt( pFrom->pTab=
2b220 3d 30 20 29 3b 0a 23 69 66 6e 64 65 66 20 53 51  =0 );.#ifndef SQ
2b230 4c 49 54 45 5f 4f 4d 49 54 5f 43 54 45 0a 20 20  LITE_OMIT_CTE.  
2b240 20 20 69 66 28 20 77 69 74 68 45 78 70 61 6e 64    if( withExpand
2b250 28 70 57 61 6c 6b 65 72 2c 20 70 46 72 6f 6d 29  (pWalker, pFrom)
2b260 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62   ) return WRC_Ab
2b270 6f 72 74 3b 0a 20 20 20 20 69 66 28 20 70 46 72  ort;.    if( pFr
2b280 6f 6d 2d 3e 70 54 61 62 20 29 20 7b 7d 20 65 6c  om->pTab ) {} el
2b290 73 65 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66  se.#endif.    if
2b2a0 28 20 70 46 72 6f 6d 2d 3e 7a 4e 61 6d 65 3d 3d  ( pFrom->zName==
2b2b0 30 20 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c  0 ){.#ifndef SQL
2b2c0 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
2b2d0 59 0a 20 20 20 20 20 20 53 65 6c 65 63 74 20 2a  Y.      Select *
2b2e0 70 53 65 6c 20 3d 20 70 46 72 6f 6d 2d 3e 70 53  pSel = pFrom->pS
2b2f0 65 6c 65 63 74 3b 0a 20 20 20 20 20 20 2f 2a 20  elect;.      /* 
2b300 41 20 73 75 62 2d 71 75 65 72 79 20 69 6e 20 74  A sub-query in t
2b310 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f  he FROM clause o
2b320 66 20 61 20 53 45 4c 45 43 54 20 2a 2f 0a 20 20  f a SELECT */.  
2b330 20 20 20 20 61 73 73 65 72 74 28 20 70 53 65 6c      assert( pSel
2b340 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73  !=0 );.      ass
2b350 65 72 74 28 20 70 46 72 6f 6d 2d 3e 70 54 61 62  ert( pFrom->pTab
2b360 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28  ==0 );.      if(
2b370 20 73 71 6c 69 74 65 33 57 61 6c 6b 53 65 6c 65   sqlite3WalkSele
2b380 63 74 28 70 57 61 6c 6b 65 72 2c 20 70 53 65 6c  ct(pWalker, pSel
2b390 29 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f 41  ) ) return WRC_A
2b3a0 62 6f 72 74 3b 0a 20 20 20 20 20 20 69 66 28 20  bort;.      if( 
2b3b0 73 71 6c 69 74 65 33 45 78 70 61 6e 64 53 75 62  sqlite3ExpandSub
2b3c0 71 75 65 72 79 28 70 50 61 72 73 65 2c 20 70 46  query(pParse, pF
2b3d0 72 6f 6d 29 20 29 20 72 65 74 75 72 6e 20 57 52  rom) ) return WR
2b3e0 43 5f 41 62 6f 72 74 3b 0a 23 65 6e 64 69 66 0a  C_Abort;.#endif.
2b3f0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2b400 20 2f 2a 20 41 6e 20 6f 72 64 69 6e 61 72 79 20   /* An ordinary 
2b410 74 61 62 6c 65 20 6f 72 20 76 69 65 77 20 6e 61  table or view na
2b420 6d 65 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63  me in the FROM c
2b430 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20 20 20 61  lause */.      a
2b440 73 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e 70 54  ssert( pFrom->pT
2b450 61 62 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70  ab==0 );.      p
2b460 46 72 6f 6d 2d 3e 70 54 61 62 20 3d 20 70 54 61  From->pTab = pTa
2b470 62 20 3d 20 73 71 6c 69 74 65 33 4c 6f 63 61 74  b = sqlite3Locat
2b480 65 54 61 62 6c 65 49 74 65 6d 28 70 50 61 72 73  eTableItem(pPars
2b490 65 2c 20 30 2c 20 70 46 72 6f 6d 29 3b 0a 20 20  e, 0, pFrom);.  
2b4a0 20 20 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20      if( pTab==0 
2b4b0 29 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f  ) return WRC_Abo
2b4c0 72 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54  rt;.      if( pT
2b4d0 61 62 2d 3e 6e 54 61 62 52 65 66 3e 3d 30 78 66  ab->nTabRef>=0xf
2b4e0 66 66 66 20 29 7b 0a 20 20 20 20 20 20 20 20 73  fff ){.        s
2b4f0 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
2b500 50 61 72 73 65 2c 20 22 74 6f 6f 20 6d 61 6e 79  Parse, "too many
2b510 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 5c   references to \
2b520 22 25 73 5c 22 3a 20 6d 61 78 20 36 35 35 33 35  "%s\": max 65535
2b530 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 54  ",.           pT
2b540 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  ab->zName);.    
2b550 20 20 20 20 70 46 72 6f 6d 2d 3e 70 54 61 62 20      pFrom->pTab 
2b560 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72 65 74  = 0;.        ret
2b570 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20  urn WRC_Abort;. 
2b580 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 54 61       }.      pTa
2b590 62 2d 3e 6e 54 61 62 52 65 66 2b 2b 3b 0a 20 20  b->nTabRef++;.  
2b5a0 20 20 20 20 69 66 28 20 21 49 73 56 69 72 74 75      if( !IsVirtu
2b5b0 61 6c 28 70 54 61 62 29 20 26 26 20 63 61 6e 6e  al(pTab) && cann
2b5c0 6f 74 42 65 46 75 6e 63 74 69 6f 6e 28 70 50 61  otBeFunction(pPa
2b5d0 72 73 65 2c 20 70 46 72 6f 6d 29 20 29 7b 0a 20  rse, pFrom) ){. 
2b5e0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 57 52         return WR
2b5f0 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 20 20 7d  C_Abort;.      }
2b600 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
2b610 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20  LITE_OMIT_VIEW) 
2b620 7c 7c 20 21 64 65 66 69 6e 65 64 20 28 53 51 4c  || !defined (SQL
2b630 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
2b640 54 41 42 4c 45 29 0a 20 20 20 20 20 20 69 66 28  TABLE).      if(
2b650 20 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 29   IsVirtual(pTab)
2b660 20 7c 7c 20 70 54 61 62 2d 3e 70 53 65 6c 65 63   || pTab->pSelec
2b670 74 20 29 7b 0a 20 20 20 20 20 20 20 20 69 31 36  t ){.        i16
2b680 20 6e 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20 75   nCol;.        u
2b690 38 20 65 43 6f 64 65 4f 72 69 67 20 3d 20 70 57  8 eCodeOrig = pW
2b6a0 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 3b 0a 20 20  alker->eCode;.  
2b6b0 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
2b6c0 33 56 69 65 77 47 65 74 43 6f 6c 75 6d 6e 4e 61  3ViewGetColumnNa
2b6d0 6d 65 73 28 70 50 61 72 73 65 2c 20 70 54 61 62  mes(pParse, pTab
2b6e0 29 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f 41  ) ) return WRC_A
2b6f0 62 6f 72 74 3b 0a 20 20 20 20 20 20 20 20 61 73  bort;.        as
2b700 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e 70 53 65  sert( pFrom->pSe
2b710 6c 65 63 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20  lect==0 );.     
2b720 20 20 20 69 66 28 20 70 54 61 62 2d 3e 70 53 65     if( pTab->pSe
2b730 6c 65 63 74 20 26 26 20 28 64 62 2d 3e 66 6c 61  lect && (db->fla
2b740 67 73 20 26 20 53 51 4c 49 54 45 5f 45 6e 61 62  gs & SQLITE_Enab
2b750 6c 65 56 69 65 77 29 3d 3d 30 20 29 7b 0a 20 20  leView)==0 ){.  
2b760 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
2b770 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
2b780 22 61 63 63 65 73 73 20 74 6f 20 76 69 65 77 20  "access to view 
2b790 5c 22 25 73 5c 22 20 70 72 6f 68 69 62 69 74 65  \"%s\" prohibite
2b7a0 64 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  d",.            
2b7b0 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a    pTab->zName);.
2b7c0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2b7d0 20 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74    pFrom->pSelect
2b7e0 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74   = sqlite3Select
2b7f0 44 75 70 28 64 62 2c 20 70 54 61 62 2d 3e 70 53  Dup(db, pTab->pS
2b800 65 6c 65 63 74 2c 20 30 29 3b 0a 20 20 20 20 20  elect, 0);.     
2b810 20 20 20 6e 43 6f 6c 20 3d 20 70 54 61 62 2d 3e     nCol = pTab->
2b820 6e 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20 70 54  nCol;.        pT
2b830 61 62 2d 3e 6e 43 6f 6c 20 3d 20 2d 31 3b 0a 20  ab->nCol = -1;. 
2b840 20 20 20 20 20 20 20 70 57 61 6c 6b 65 72 2d 3e         pWalker->
2b850 65 43 6f 64 65 20 3d 20 31 3b 20 20 2f 2a 20 54  eCode = 1;  /* T
2b860 75 72 6e 20 6f 6e 20 53 65 6c 65 63 74 2e 73 65  urn on Select.se
2b870 6c 49 64 20 72 65 6e 75 6d 62 65 72 69 6e 67 20  lId renumbering 
2b880 2a 2f 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  */.        sqlit
2b890 65 33 57 61 6c 6b 53 65 6c 65 63 74 28 70 57 61  e3WalkSelect(pWa
2b8a0 6c 6b 65 72 2c 20 70 46 72 6f 6d 2d 3e 70 53 65  lker, pFrom->pSe
2b8b0 6c 65 63 74 29 3b 0a 20 20 20 20 20 20 20 20 70  lect);.        p
2b8c0 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 20 3d 20  Walker->eCode = 
2b8d0 65 43 6f 64 65 4f 72 69 67 3b 0a 20 20 20 20 20  eCodeOrig;.     
2b8e0 20 20 20 70 54 61 62 2d 3e 6e 43 6f 6c 20 3d 20     pTab->nCol = 
2b8f0 6e 43 6f 6c 3b 0a 20 20 20 20 20 20 7d 0a 23 65  nCol;.      }.#e
2b900 6e 64 69 66 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ndif.    }..    
2b910 2f 2a 20 4c 6f 63 61 74 65 20 74 68 65 20 69 6e  /* Locate the in
2b920 64 65 78 20 6e 61 6d 65 64 20 62 79 20 74 68 65  dex named by the
2b930 20 49 4e 44 45 58 45 44 20 42 59 20 63 6c 61 75   INDEXED BY clau
2b940 73 65 2c 20 69 66 20 61 6e 79 2e 20 2a 2f 0a 20  se, if any. */. 
2b950 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 49 6e     if( sqlite3In
2b960 64 65 78 65 64 42 79 4c 6f 6f 6b 75 70 28 70 50  dexedByLookup(pP
2b970 61 72 73 65 2c 20 70 46 72 6f 6d 29 20 29 7b 0a  arse, pFrom) ){.
2b980 20 20 20 20 20 20 72 65 74 75 72 6e 20 57 52 43        return WRC
2b990 5f 41 62 6f 72 74 3b 0a 20 20 20 20 7d 0a 20 20  _Abort;.    }.  
2b9a0 7d 0a 0a 20 20 2f 2a 20 50 72 6f 63 65 73 73 20  }..  /* Process 
2b9b0 4e 41 54 55 52 41 4c 20 6b 65 79 77 6f 72 64 73  NATURAL keywords
2b9c0 2c 20 61 6e 64 20 4f 4e 20 61 6e 64 20 55 53 49  , and ON and USI
2b9d0 4e 47 20 63 6c 61 75 73 65 73 20 6f 66 20 6a 6f  NG clauses of jo
2b9e0 69 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ins..  */.  if( 
2b9f0 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
2ba00 20 7c 7c 20 73 71 6c 69 74 65 50 72 6f 63 65 73   || sqliteProces
2ba10 73 4a 6f 69 6e 28 70 50 61 72 73 65 2c 20 70 29  sJoin(pParse, p)
2ba20 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 57   ){.    return W
2ba30 52 43 5f 41 62 6f 72 74 3b 0a 20 20 7d 0a 0a 20  RC_Abort;.  }.. 
2ba40 20 2f 2a 20 46 6f 72 20 65 76 65 72 79 20 22 2a   /* For every "*
2ba50 22 20 74 68 61 74 20 6f 63 63 75 72 73 20 69 6e  " that occurs in
2ba60 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6c 69 73 74   the column list
2ba70 2c 20 69 6e 73 65 72 74 20 74 68 65 20 6e 61 6d  , insert the nam
2ba80 65 73 20 6f 66 0a 20 20 2a 2a 20 61 6c 6c 20 63  es of.  ** all c
2ba90 6f 6c 75 6d 6e 73 20 69 6e 20 61 6c 6c 20 74 61  olumns in all ta
2baa0 62 6c 65 73 2e 20 20 41 6e 64 20 66 6f 72 20 65  bles.  And for e
2bab0 76 65 72 79 20 54 41 42 4c 45 2e 2a 20 69 6e 73  very TABLE.* ins
2bac0 65 72 74 20 74 68 65 20 6e 61 6d 65 73 0a 20 20  ert the names.  
2bad0 2a 2a 20 6f 66 20 61 6c 6c 20 63 6f 6c 75 6d 6e  ** of all column
2bae0 73 20 69 6e 20 54 41 42 4c 45 2e 20 20 54 68 65  s in TABLE.  The
2baf0 20 70 61 72 73 65 72 20 69 6e 73 65 72 74 65 64   parser inserted
2bb00 20 61 20 73 70 65 63 69 61 6c 20 65 78 70 72 65   a special expre
2bb10 73 73 69 6f 6e 0a 20 20 2a 2a 20 77 69 74 68 20  ssion.  ** with 
2bb20 74 68 65 20 54 4b 5f 41 53 54 45 52 49 53 4b 20  the TK_ASTERISK 
2bb30 6f 70 65 72 61 74 6f 72 20 66 6f 72 20 65 61 63  operator for eac
2bb40 68 20 22 2a 22 20 74 68 61 74 20 69 74 20 66 6f  h "*" that it fo
2bb50 75 6e 64 20 69 6e 20 74 68 65 20 63 6f 6c 75 6d  und in the colum
2bb60 6e 0a 20 20 2a 2a 20 6c 69 73 74 2e 20 20 54 68  n.  ** list.  Th
2bb70 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 64 65  e following code
2bb80 20 6a 75 73 74 20 68 61 73 20 74 6f 20 6c 6f 63   just has to loc
2bb90 61 74 65 20 74 68 65 20 54 4b 5f 41 53 54 45 52  ate the TK_ASTER
2bba0 49 53 4b 0a 20 20 2a 2a 20 65 78 70 72 65 73 73  ISK.  ** express
2bbb0 69 6f 6e 73 20 61 6e 64 20 65 78 70 61 6e 64 20  ions and expand 
2bbc0 65 61 63 68 20 6f 6e 65 20 74 6f 20 74 68 65 20  each one to the 
2bbd0 6c 69 73 74 20 6f 66 20 61 6c 6c 20 63 6f 6c 75  list of all colu
2bbe0 6d 6e 73 20 69 6e 0a 20 20 2a 2a 20 61 6c 6c 20  mns in.  ** all 
2bbf0 74 61 62 6c 65 73 2e 0a 20 20 2a 2a 0a 20 20 2a  tables..  **.  *
2bc00 2a 20 54 68 65 20 66 69 72 73 74 20 6c 6f 6f 70  * The first loop
2bc10 20 6a 75 73 74 20 63 68 65 63 6b 73 20 74 6f 20   just checks to 
2bc20 73 65 65 20 69 66 20 74 68 65 72 65 20 61 72 65  see if there are
2bc30 20 61 6e 79 20 22 2a 22 20 6f 70 65 72 61 74 6f   any "*" operato
2bc40 72 73 0a 20 20 2a 2a 20 74 68 61 74 20 6e 65 65  rs.  ** that nee
2bc50 64 20 65 78 70 61 6e 64 69 6e 67 2e 0a 20 20 2a  d expanding..  *
2bc60 2f 0a 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 70  /.  for(k=0; k<p
2bc70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 6b 2b  EList->nExpr; k+
2bc80 2b 29 7b 0a 20 20 20 20 70 45 20 3d 20 70 45 4c  +){.    pE = pEL
2bc90 69 73 74 2d 3e 61 5b 6b 5d 2e 70 45 78 70 72 3b  ist->a[k].pExpr;
2bca0 0a 20 20 20 20 69 66 28 20 70 45 2d 3e 6f 70 3d  .    if( pE->op=
2bcb0 3d 54 4b 5f 41 53 54 45 52 49 53 4b 20 29 20 62  =TK_ASTERISK ) b
2bcc0 72 65 61 6b 3b 0a 20 20 20 20 61 73 73 65 72 74  reak;.    assert
2bcd0 28 20 70 45 2d 3e 6f 70 21 3d 54 4b 5f 44 4f 54  ( pE->op!=TK_DOT
2bce0 20 7c 7c 20 70 45 2d 3e 70 52 69 67 68 74 21 3d   || pE->pRight!=
2bcf0 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
2bd00 20 70 45 2d 3e 6f 70 21 3d 54 4b 5f 44 4f 54 20   pE->op!=TK_DOT 
2bd10 7c 7c 20 28 70 45 2d 3e 70 4c 65 66 74 21 3d 30  || (pE->pLeft!=0
2bd20 20 26 26 20 70 45 2d 3e 70 4c 65 66 74 2d 3e 6f   && pE->pLeft->o
2bd30 70 3d 3d 54 4b 5f 49 44 29 20 29 3b 0a 20 20 20  p==TK_ID) );.   
2bd40 20 69 66 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f   if( pE->op==TK_
2bd50 44 4f 54 20 26 26 20 70 45 2d 3e 70 52 69 67 68  DOT && pE->pRigh
2bd60 74 2d 3e 6f 70 3d 3d 54 4b 5f 41 53 54 45 52 49  t->op==TK_ASTERI
2bd70 53 4b 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  SK ) break;.    
2bd80 65 6c 69 73 74 46 6c 61 67 73 20 7c 3d 20 70 45  elistFlags |= pE
2bd90 2d 3e 66 6c 61 67 73 3b 0a 20 20 7d 0a 20 20 69  ->flags;.  }.  i
2bda0 66 28 20 6b 3c 70 45 4c 69 73 74 2d 3e 6e 45 78  f( k<pEList->nEx
2bdb0 70 72 20 29 7b 0a 20 20 20 20 2f 2a 0a 20 20 20  pr ){.    /*.   
2bdc0 20 2a 2a 20 49 66 20 77 65 20 67 65 74 20 68 65   ** If we get he
2bdd0 72 65 20 69 74 20 6d 65 61 6e 73 20 74 68 65 20  re it means the 
2bde0 72 65 73 75 6c 74 20 73 65 74 20 63 6f 6e 74 61  result set conta
2bdf0 69 6e 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20  ins one or more 
2be00 22 2a 22 0a 20 20 20 20 2a 2a 20 6f 70 65 72 61  "*".    ** opera
2be10 74 6f 72 73 20 74 68 61 74 20 6e 65 65 64 20 74  tors that need t
2be20 6f 20 62 65 20 65 78 70 61 6e 64 65 64 2e 20 20  o be expanded.  
2be30 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20 65 61 63  Loop through eac
2be40 68 20 65 78 70 72 65 73 73 69 6f 6e 0a 20 20 20  h expression.   
2be50 20 2a 2a 20 69 6e 20 74 68 65 20 72 65 73 75 6c   ** in the resul
2be60 74 20 73 65 74 20 61 6e 64 20 65 78 70 61 6e 64  t set and expand
2be70 20 74 68 65 6d 20 6f 6e 65 20 62 79 20 6f 6e 65   them one by one
2be80 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 74 72  ..    */.    str
2be90 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
2bea0 6d 20 2a 61 20 3d 20 70 45 4c 69 73 74 2d 3e 61  m *a = pEList->a
2beb0 3b 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a  ;.    ExprList *
2bec0 70 4e 65 77 20 3d 20 30 3b 0a 20 20 20 20 69 6e  pNew = 0;.    in
2bed0 74 20 66 6c 61 67 73 20 3d 20 70 50 61 72 73 65  t flags = pParse
2bee0 2d 3e 64 62 2d 3e 66 6c 61 67 73 3b 0a 20 20 20  ->db->flags;.   
2bef0 20 69 6e 74 20 6c 6f 6e 67 4e 61 6d 65 73 20 3d   int longNames =
2bf00 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45   (flags & SQLITE
2bf10 5f 46 75 6c 6c 43 6f 6c 4e 61 6d 65 73 29 21 3d  _FullColNames)!=
2bf20 30 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0.              
2bf30 20 20 20 20 20 20 20 20 26 26 20 28 66 6c 61 67          && (flag
2bf40 73 20 26 20 53 51 4c 49 54 45 5f 53 68 6f 72 74  s & SQLITE_Short
2bf50 43 6f 6c 4e 61 6d 65 73 29 3d 3d 30 3b 0a 0a 20  ColNames)==0;.. 
2bf60 20 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 70 45     for(k=0; k<pE
2bf70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 6b 2b 2b  List->nExpr; k++
2bf80 29 7b 0a 20 20 20 20 20 20 70 45 20 3d 20 61 5b  ){.      pE = a[
2bf90 6b 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20  k].pExpr;.      
2bfa0 65 6c 69 73 74 46 6c 61 67 73 20 7c 3d 20 70 45  elistFlags |= pE
2bfb0 2d 3e 66 6c 61 67 73 3b 0a 20 20 20 20 20 20 70  ->flags;.      p
2bfc0 52 69 67 68 74 20 3d 20 70 45 2d 3e 70 52 69 67  Right = pE->pRig
2bfd0 68 74 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  ht;.      assert
2bfe0 28 20 70 45 2d 3e 6f 70 21 3d 54 4b 5f 44 4f 54  ( pE->op!=TK_DOT
2bff0 20 7c 7c 20 70 52 69 67 68 74 21 3d 30 20 29 3b   || pRight!=0 );
2c000 0a 20 20 20 20 20 20 69 66 28 20 70 45 2d 3e 6f  .      if( pE->o
2c010 70 21 3d 54 4b 5f 41 53 54 45 52 49 53 4b 0a 20  p!=TK_ASTERISK. 
2c020 20 20 20 20 20 20 26 26 20 28 70 45 2d 3e 6f 70        && (pE->op
2c030 21 3d 54 4b 5f 44 4f 54 20 7c 7c 20 70 52 69 67  !=TK_DOT || pRig
2c040 68 74 2d 3e 6f 70 21 3d 54 4b 5f 41 53 54 45 52  ht->op!=TK_ASTER
2c050 49 53 4b 29 0a 20 20 20 20 20 20 29 7b 0a 20 20  ISK).      ){.  
2c060 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 70 61        /* This pa
2c070 72 74 69 63 75 6c 61 72 20 65 78 70 72 65 73 73  rticular express
2c080 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65  ion does not nee
2c090 64 20 74 6f 20 62 65 20 65 78 70 61 6e 64 65 64  d to be expanded
2c0a0 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
2c0b0 20 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69       pNew = sqli
2c0c0 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e  te3ExprListAppen
2c0d0 64 28 70 50 61 72 73 65 2c 20 70 4e 65 77 2c 20  d(pParse, pNew, 
2c0e0 61 5b 6b 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20  a[k].pExpr);.   
2c0f0 20 20 20 20 20 69 66 28 20 70 4e 65 77 20 29 7b       if( pNew ){
2c100 0a 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d  .          pNew-
2c110 3e 61 5b 70 4e 65 77 2d 3e 6e 45 78 70 72 2d 31  >a[pNew->nExpr-1
2c120 5d 2e 7a 4e 61 6d 65 20 3d 20 61 5b 6b 5d 2e 7a  ].zName = a[k].z
2c130 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 20 20  Name;.          
2c140 70 4e 65 77 2d 3e 61 5b 70 4e 65 77 2d 3e 6e 45  pNew->a[pNew->nE
2c150 78 70 72 2d 31 5d 2e 7a 53 70 61 6e 20 3d 20 61  xpr-1].zSpan = a
2c160 5b 6b 5d 2e 7a 53 70 61 6e 3b 0a 20 20 20 20 20  [k].zSpan;.     
2c170 20 20 20 20 20 61 5b 6b 5d 2e 7a 4e 61 6d 65 20       a[k].zName 
2c180 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 61  = 0;.          a
2c190 5b 6b 5d 2e 7a 53 70 61 6e 20 3d 20 30 3b 0a 20  [k].zSpan = 0;. 
2c1a0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2c1b0 20 61 5b 6b 5d 2e 70 45 78 70 72 20 3d 20 30 3b   a[k].pExpr = 0;
2c1c0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
2c1d0 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 65 78        /* This ex
2c1e0 70 72 65 73 73 69 6f 6e 20 69 73 20 61 20 22 2a  pression is a "*
2c1f0 22 20 6f 72 20 61 20 22 54 41 42 4c 45 2e 2a 22  " or a "TABLE.*"
2c200 20 61 6e 64 20 6e 65 65 64 73 20 74 6f 20 62 65   and needs to be
2c210 0a 20 20 20 20 20 20 20 20 2a 2a 20 65 78 70 61  .        ** expa
2c220 6e 64 65 64 2e 20 2a 2f 0a 20 20 20 20 20 20 20  nded. */.       
2c230 20 69 6e 74 20 74 61 62 6c 65 53 65 65 6e 20 3d   int tableSeen =
2c240 20 30 3b 20 20 20 20 20 20 2f 2a 20 53 65 74 20   0;      /* Set 
2c250 74 6f 20 31 20 77 68 65 6e 20 54 41 42 4c 45 20  to 1 when TABLE 
2c260 6d 61 74 63 68 65 73 20 2a 2f 0a 20 20 20 20 20  matches */.     
2c270 20 20 20 63 68 61 72 20 2a 7a 54 4e 61 6d 65 20     char *zTName 
2c280 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 74 65  = 0;       /* te
2c290 78 74 20 6f 66 20 6e 61 6d 65 20 6f 66 20 54 41  xt of name of TA
2c2a0 42 4c 45 20 2a 2f 0a 20 20 20 20 20 20 20 20 69  BLE */.        i
2c2b0 66 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f  f( pE->op==TK_DO
2c2c0 54 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61  T ){.          a
2c2d0 73 73 65 72 74 28 20 70 45 2d 3e 70 4c 65 66 74  ssert( pE->pLeft
2c2e0 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20  !=0 );.         
2c2f0 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61   assert( !ExprHa
2c300 73 50 72 6f 70 65 72 74 79 28 70 45 2d 3e 70 4c  sProperty(pE->pL
2c310 65 66 74 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65  eft, EP_IntValue
2c320 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7a  ) );.          z
2c330 54 4e 61 6d 65 20 3d 20 70 45 2d 3e 70 4c 65 66  TName = pE->pLef
2c340 74 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 20  t->u.zToken;.   
2c350 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 66       }.        f
2c360 6f 72 28 69 3d 30 2c 20 70 46 72 6f 6d 3d 70 54  or(i=0, pFrom=pT
2c370 61 62 4c 69 73 74 2d 3e 61 3b 20 69 3c 70 54 61  abList->a; i<pTa
2c380 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b  bList->nSrc; i++
2c390 2c 20 70 46 72 6f 6d 2b 2b 29 7b 0a 20 20 20 20  , pFrom++){.    
2c3a0 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61        Table *pTa
2c3b0 62 20 3d 20 70 46 72 6f 6d 2d 3e 70 54 61 62 3b  b = pFrom->pTab;
2c3c0 0a 20 20 20 20 20 20 20 20 20 20 53 65 6c 65 63  .          Selec
2c3d0 74 20 2a 70 53 75 62 20 3d 20 70 46 72 6f 6d 2d  t *pSub = pFrom-
2c3e0 3e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 20 20  >pSelect;.      
2c3f0 20 20 20 20 63 68 61 72 20 2a 7a 54 61 62 4e 61      char *zTabNa
2c400 6d 65 20 3d 20 70 46 72 6f 6d 2d 3e 7a 41 6c 69  me = pFrom->zAli
2c410 61 73 3b 0a 20 20 20 20 20 20 20 20 20 20 63 6f  as;.          co
2c420 6e 73 74 20 63 68 61 72 20 2a 7a 53 63 68 65 6d  nst char *zSchem
2c430 61 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 20  aName = 0;.     
2c440 20 20 20 20 20 69 6e 74 20 69 44 62 3b 0a 20 20       int iDb;.  
2c450 20 20 20 20 20 20 20 20 69 66 28 20 7a 54 61 62          if( zTab
2c460 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Name==0 ){.     
2c470 20 20 20 20 20 20 20 7a 54 61 62 4e 61 6d 65 20         zTabName 
2c480 3d 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 3b 0a 20  = pTab->zName;. 
2c490 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
2c4a0 20 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c       if( db->mal
2c4b0 6c 6f 63 46 61 69 6c 65 64 20 29 20 62 72 65 61  locFailed ) brea
2c4c0 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  k;.          if(
2c4d0 20 70 53 75 62 3d 3d 30 20 7c 7c 20 28 70 53 75   pSub==0 || (pSu
2c4e0 62 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46  b->selFlags & SF
2c4f0 5f 4e 65 73 74 65 64 46 72 6f 6d 29 3d 3d 30 20  _NestedFrom)==0 
2c500 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  ){.            p
2c510 53 75 62 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  Sub = 0;.       
2c520 20 20 20 20 20 69 66 28 20 7a 54 4e 61 6d 65 20       if( zTName 
2c530 26 26 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  && sqlite3StrICm
2c540 70 28 7a 54 4e 61 6d 65 2c 20 7a 54 61 62 4e 61  p(zTName, zTabNa
2c550 6d 65 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  me)!=0 ){.      
2c560 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65          continue
2c570 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
2c580 20 20 20 20 20 20 20 20 20 20 20 20 69 44 62 20              iDb 
2c590 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54  = sqlite3SchemaT
2c5a0 6f 49 6e 64 65 78 28 64 62 2c 20 70 54 61 62 2d  oIndex(db, pTab-
2c5b0 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 20  >pSchema);.     
2c5c0 20 20 20 20 20 20 20 7a 53 63 68 65 6d 61 4e 61         zSchemaNa
2c5d0 6d 65 20 3d 20 69 44 62 3e 3d 30 20 3f 20 64 62  me = iDb>=0 ? db
2c5e0 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 44 62 53 4e  ->aDb[iDb].zDbSN
2c5f0 61 6d 65 20 3a 20 22 2a 22 3b 0a 20 20 20 20 20  ame : "*";.     
2c600 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
2c610 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 54 61 62   for(j=0; j<pTab
2c620 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20  ->nCol; j++){.  
2c630 20 20 20 20 20 20 20 20 20 20 63 68 61 72 20 2a            char *
2c640 7a 4e 61 6d 65 20 3d 20 70 54 61 62 2d 3e 61 43  zName = pTab->aC
2c650 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20  ol[j].zName;.   
2c660 20 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a           char *z
2c670 43 6f 6c 6e 61 6d 65 3b 20 20 2f 2a 20 54 68 65  Colname;  /* The
2c680 20 63 6f 6d 70 75 74 65 64 20 63 6f 6c 75 6d 6e   computed column
2c690 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 20 20 20   name */.       
2c6a0 20 20 20 20 20 63 68 61 72 20 2a 7a 54 6f 46 72       char *zToFr
2c6b0 65 65 3b 20 20 20 2f 2a 20 4d 61 6c 6c 6f 63 65  ee;   /* Malloce
2c6c0 64 20 73 74 72 69 6e 67 20 74 68 61 74 20 6e 65  d string that ne
2c6d0 65 64 73 20 74 6f 20 62 65 20 66 72 65 65 64 20  eds to be freed 
2c6e0 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 54  */.            T
2c6f0 6f 6b 65 6e 20 73 43 6f 6c 6e 61 6d 65 3b 20 20  oken sColname;  
2c700 2f 2a 20 43 6f 6d 70 75 74 65 64 20 63 6f 6c 75  /* Computed colu
2c710 6d 6e 20 6e 61 6d 65 20 61 73 20 61 20 74 6f 6b  mn name as a tok
2c720 65 6e 20 2a 2f 0a 0a 20 20 20 20 20 20 20 20 20  en */..         
2c730 20 20 20 61 73 73 65 72 74 28 20 7a 4e 61 6d 65     assert( zName
2c740 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   );.            
2c750 69 66 28 20 7a 54 4e 61 6d 65 20 26 26 20 70 53  if( zTName && pS
2c760 75 62 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ub.             
2c770 26 26 20 73 71 6c 69 74 65 33 4d 61 74 63 68 53  && sqlite3MatchS
2c780 70 61 6e 4e 61 6d 65 28 70 53 75 62 2d 3e 70 45  panName(pSub->pE
2c790 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 7a 53 70 61 6e  List->a[j].zSpan
2c7a0 2c 20 30 2c 20 7a 54 4e 61 6d 65 2c 20 30 29 3d  , 0, zTName, 0)=
2c7b0 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20 20 29  =0.            )
2c7c0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
2c7d0 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
2c7e0 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20        }..       
2c7f0 20 20 20 20 20 2f 2a 20 49 66 20 61 20 63 6f 6c       /* If a col
2c800 75 6d 6e 20 69 73 20 6d 61 72 6b 65 64 20 61 73  umn is marked as
2c810 20 27 68 69 64 64 65 6e 27 2c 20 6f 6d 69 74 20   'hidden', omit 
2c820 69 74 20 66 72 6f 6d 20 74 68 65 20 65 78 70 61  it from the expa
2c830 6e 64 65 64 0a 20 20 20 20 20 20 20 20 20 20 20  nded.           
2c840 20 2a 2a 20 72 65 73 75 6c 74 2d 73 65 74 20 6c   ** result-set l
2c850 69 73 74 20 75 6e 6c 65 73 73 20 74 68 65 20 53  ist unless the S
2c860 45 4c 45 43 54 20 68 61 73 20 74 68 65 20 53 46  ELECT has the SF
2c870 5f 49 6e 63 6c 75 64 65 48 69 64 64 65 6e 0a 20  _IncludeHidden. 
2c880 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 62 69             ** bi
2c890 74 20 73 65 74 2e 0a 20 20 20 20 20 20 20 20 20  t set..         
2c8a0 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20     */.          
2c8b0 20 20 69 66 28 20 28 70 2d 3e 73 65 6c 46 6c 61    if( (p->selFla
2c8c0 67 73 20 26 20 53 46 5f 49 6e 63 6c 75 64 65 48  gs & SF_IncludeH
2c8d0 69 64 64 65 6e 29 3d 3d 30 0a 20 20 20 20 20 20  idden)==0.      
2c8e0 20 20 20 20 20 20 20 26 26 20 49 73 48 69 64 64         && IsHidd
2c8f0 65 6e 43 6f 6c 75 6d 6e 28 26 70 54 61 62 2d 3e  enColumn(&pTab->
2c900 61 43 6f 6c 5b 6a 5d 29 20 0a 20 20 20 20 20 20  aCol[j]) .      
2c910 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
2c920 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b         continue;
2c930 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
2c940 20 20 20 20 20 20 20 20 20 20 20 74 61 62 6c 65             table
2c950 53 65 65 6e 20 3d 20 31 3b 0a 0a 20 20 20 20 20  Seen = 1;..     
2c960 20 20 20 20 20 20 20 69 66 28 20 69 3e 30 20 26         if( i>0 &
2c970 26 20 7a 54 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20  & zTName==0 ){. 
2c980 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28               if(
2c990 20 28 70 46 72 6f 6d 2d 3e 66 67 2e 6a 6f 69 6e   (pFrom->fg.join
2c9a0 74 79 70 65 20 26 20 4a 54 5f 4e 41 54 55 52 41  type & JT_NATURA
2c9b0 4c 29 21 3d 30 0a 20 20 20 20 20 20 20 20 20 20  L)!=0.          
2c9c0 20 20 20 20 20 20 26 26 20 74 61 62 6c 65 41 6e        && tableAn
2c9d0 64 43 6f 6c 75 6d 6e 49 6e 64 65 78 28 70 54 61  dColumnIndex(pTa
2c9e0 62 4c 69 73 74 2c 20 69 2c 20 7a 4e 61 6d 65 2c  bList, i, zName,
2c9f0 20 30 2c 20 30 29 0a 20 20 20 20 20 20 20 20 20   0, 0).         
2ca00 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
2ca10 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 20 61 20          /* In a 
2ca20 4e 41 54 55 52 41 4c 20 6a 6f 69 6e 2c 20 6f 6d  NATURAL join, om
2ca30 69 74 20 74 68 65 20 6a 6f 69 6e 20 63 6f 6c 75  it the join colu
2ca40 6d 6e 73 20 66 72 6f 6d 20 74 68 65 20 0a 20 20  mns from the .  
2ca50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a                **
2ca60 20 74 61 62 6c 65 20 74 6f 20 74 68 65 20 72 69   table to the ri
2ca70 67 68 74 20 6f 66 20 74 68 65 20 6a 6f 69 6e 20  ght of the join 
2ca80 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  */.             
2ca90 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
2caa0 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
2cab0 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73             if( s
2cac0 71 6c 69 74 65 33 49 64 4c 69 73 74 49 6e 64 65  qlite3IdListInde
2cad0 78 28 70 46 72 6f 6d 2d 3e 70 55 73 69 6e 67 2c  x(pFrom->pUsing,
2cae0 20 7a 4e 61 6d 65 29 3e 3d 30 20 29 7b 0a 20 20   zName)>=0 ){.  
2caf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2cb00 20 49 6e 20 61 20 6a 6f 69 6e 20 77 69 74 68 20   In a join with 
2cb10 61 20 55 53 49 4e 47 20 63 6c 61 75 73 65 2c 20  a USING clause, 
2cb20 6f 6d 69 74 20 63 6f 6c 75 6d 6e 73 20 69 6e 20  omit columns in 
2cb30 74 68 65 0a 20 20 20 20 20 20 20 20 20 20 20 20  the.            
2cb40 20 20 20 20 2a 2a 20 75 73 69 6e 67 20 63 6c 61      ** using cla
2cb50 75 73 65 20 66 72 6f 6d 20 74 68 65 20 74 61 62  use from the tab
2cb60 6c 65 20 6f 6e 20 74 68 65 20 72 69 67 68 74 2e  le on the right.
2cb70 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
2cb80 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
2cb90 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
2cba0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2cbb0 20 20 20 20 20 20 20 20 70 52 69 67 68 74 20 3d          pRight =
2cbc0 20 73 71 6c 69 74 65 33 45 78 70 72 28 64 62 2c   sqlite3Expr(db,
2cbd0 20 54 4b 5f 49 44 2c 20 7a 4e 61 6d 65 29 3b 0a   TK_ID, zName);.
2cbe0 20 20 20 20 20 20 20 20 20 20 20 20 7a 43 6f 6c              zCol
2cbf0 6e 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20  name = zName;.  
2cc00 20 20 20 20 20 20 20 20 20 20 7a 54 6f 46 72 65            zToFre
2cc10 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  e = 0;.         
2cc20 20 20 20 69 66 28 20 6c 6f 6e 67 4e 61 6d 65 73     if( longNames
2cc30 20 7c 7c 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53   || pTabList->nS
2cc40 72 63 3e 31 20 29 7b 0a 20 20 20 20 20 20 20 20  rc>1 ){.        
2cc50 20 20 20 20 20 20 45 78 70 72 20 2a 70 4c 65 66        Expr *pLef
2cc60 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  t;.             
2cc70 20 70 4c 65 66 74 20 3d 20 73 71 6c 69 74 65 33   pLeft = sqlite3
2cc80 45 78 70 72 28 64 62 2c 20 54 4b 5f 49 44 2c 20  Expr(db, TK_ID, 
2cc90 7a 54 61 62 4e 61 6d 65 29 3b 0a 20 20 20 20 20  zTabName);.     
2cca0 20 20 20 20 20 20 20 20 20 70 45 78 70 72 20 3d           pExpr =
2ccb0 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70 50   sqlite3PExpr(pP
2ccc0 61 72 73 65 2c 20 54 4b 5f 44 4f 54 2c 20 70 4c  arse, TK_DOT, pL
2ccd0 65 66 74 2c 20 70 52 69 67 68 74 29 3b 0a 20 20  eft, pRight);.  
2cce0 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
2ccf0 7a 53 63 68 65 6d 61 4e 61 6d 65 20 29 7b 0a 20  zSchemaName ){. 
2cd00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
2cd10 4c 65 66 74 20 3d 20 73 71 6c 69 74 65 33 45 78  Left = sqlite3Ex
2cd20 70 72 28 64 62 2c 20 54 4b 5f 49 44 2c 20 7a 53  pr(db, TK_ID, zS
2cd30 63 68 65 6d 61 4e 61 6d 65 29 3b 0a 20 20 20 20  chemaName);.    
2cd40 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70              pExp
2cd50 72 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72  r = sqlite3PExpr
2cd60 28 70 50 61 72 73 65 2c 20 54 4b 5f 44 4f 54 2c  (pParse, TK_DOT,
2cd70 20 70 4c 65 66 74 2c 20 70 45 78 70 72 29 3b 0a   pLeft, pExpr);.
2cd80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a                }.
2cd90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
2cda0 28 20 6c 6f 6e 67 4e 61 6d 65 73 20 29 7b 0a 20  ( longNames ){. 
2cdb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a                 z
2cdc0 43 6f 6c 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65  Colname = sqlite
2cdd0 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 25 73  3MPrintf(db, "%s
2cde0 2e 25 73 22 2c 20 7a 54 61 62 4e 61 6d 65 2c 20  .%s", zTabName, 
2cdf0 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  zName);.        
2ce00 20 20 20 20 20 20 20 20 7a 54 6f 46 72 65 65 20          zToFree 
2ce10 3d 20 7a 43 6f 6c 6e 61 6d 65 3b 0a 20 20 20 20  = zColname;.    
2ce20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2ce30 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
2ce40 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78               pEx
2ce50 70 72 20 3d 20 70 52 69 67 68 74 3b 0a 20 20 20  pr = pRight;.   
2ce60 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
2ce70 20 20 20 20 20 20 20 70 4e 65 77 20 3d 20 73 71         pNew = sq
2ce80 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70 70  lite3ExprListApp
2ce90 65 6e 64 28 70 50 61 72 73 65 2c 20 70 4e 65 77  end(pParse, pNew
2cea0 2c 20 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20  , pExpr);.      
2ceb0 20 20 20 20 20 20 73 71 6c 69 74 65 33 54 6f 6b        sqlite3Tok
2cec0 65 6e 49 6e 69 74 28 26 73 43 6f 6c 6e 61 6d 65  enInit(&sColname
2ced0 2c 20 7a 43 6f 6c 6e 61 6d 65 29 3b 0a 20 20 20  , zColname);.   
2cee0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
2cef0 45 78 70 72 4c 69 73 74 53 65 74 4e 61 6d 65 28  ExprListSetName(
2cf00 70 50 61 72 73 65 2c 20 70 4e 65 77 2c 20 26 73  pParse, pNew, &s
2cf10 43 6f 6c 6e 61 6d 65 2c 20 30 29 3b 0a 20 20 20  Colname, 0);.   
2cf20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 4e 65           if( pNe
2cf30 77 20 26 26 20 28 70 2d 3e 73 65 6c 46 6c 61 67  w && (p->selFlag
2cf40 73 20 26 20 53 46 5f 4e 65 73 74 65 64 46 72 6f  s & SF_NestedFro
2cf50 6d 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  m)!=0 ){.       
2cf60 20 20 20 20 20 20 20 73 74 72 75 63 74 20 45 78         struct Ex
2cf70 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 58 20  prList_item *pX 
2cf80 3d 20 26 70 4e 65 77 2d 3e 61 5b 70 4e 65 77 2d  = &pNew->a[pNew-
2cf90 3e 6e 45 78 70 72 2d 31 5d 3b 0a 20 20 20 20 20  >nExpr-1];.     
2cfa0 20 20 20 20 20 20 20 20 20 69 66 28 20 70 53 75           if( pSu
2cfb0 62 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  b ){.           
2cfc0 20 20 20 20 20 70 58 2d 3e 7a 53 70 61 6e 20 3d       pX->zSpan =
2cfd0 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70   sqlite3DbStrDup
2cfe0 28 64 62 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73  (db, pSub->pELis
2cff0 74 2d 3e 61 5b 6a 5d 2e 7a 53 70 61 6e 29 3b 0a  t->a[j].zSpan);.
2d000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d010 74 65 73 74 63 61 73 65 28 20 70 58 2d 3e 7a 53  testcase( pX->zS
2d020 70 61 6e 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  pan==0 );.      
2d030 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
2d040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
2d050 58 2d 3e 7a 53 70 61 6e 20 3d 20 73 71 6c 69 74  X->zSpan = sqlit
2d060 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 25  e3MPrintf(db, "%
2d070 73 2e 25 73 2e 25 73 22 2c 0a 20 20 20 20 20 20  s.%s.%s",.      
2d080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d0a0 20 20 20 20 20 7a 53 63 68 65 6d 61 4e 61 6d 65       zSchemaName
2d0b0 2c 20 7a 54 61 62 4e 61 6d 65 2c 20 7a 43 6f 6c  , zTabName, zCol
2d0c0 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20  name);.         
2d0d0 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
2d0e0 20 70 58 2d 3e 7a 53 70 61 6e 3d 3d 30 20 29 3b   pX->zSpan==0 );
2d0f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  .              }
2d100 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
2d110 58 2d 3e 62 53 70 61 6e 49 73 54 61 62 20 3d 20  X->bSpanIsTab = 
2d120 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  1;.            }
2d130 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
2d140 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a  ite3DbFree(db, z
2d150 54 6f 46 72 65 65 29 3b 0a 20 20 20 20 20 20 20  ToFree);.       
2d160 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
2d170 20 20 20 20 20 20 20 69 66 28 20 21 74 61 62 6c         if( !tabl
2d180 65 53 65 65 6e 20 29 7b 0a 20 20 20 20 20 20 20  eSeen ){.       
2d190 20 20 20 69 66 28 20 7a 54 4e 61 6d 65 20 29 7b     if( zTName ){
2d1a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
2d1b0 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
2d1c0 72 73 65 2c 20 22 6e 6f 20 73 75 63 68 20 74 61  rse, "no such ta
2d1d0 62 6c 65 3a 20 25 73 22 2c 20 7a 54 4e 61 6d 65  ble: %s", zTName
2d1e0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c  );.          }el
2d1f0 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
2d200 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
2d210 70 50 61 72 73 65 2c 20 22 6e 6f 20 74 61 62 6c  pParse, "no tabl
2d220 65 73 20 73 70 65 63 69 66 69 65 64 22 29 3b 0a  es specified");.
2d230 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2d240 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
2d250 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 45    }.    sqlite3E
2d260 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62  xprListDelete(db
2d270 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 70  , pEList);.    p
2d280 2d 3e 70 45 4c 69 73 74 20 3d 20 70 4e 65 77 3b  ->pEList = pNew;
2d290 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70 45  .  }.  if( p->pE
2d2a0 4c 69 73 74 20 29 7b 0a 20 20 20 20 69 66 28 20  List ){.    if( 
2d2b0 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  p->pEList->nExpr
2d2c0 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49  >db->aLimit[SQLI
2d2d0 54 45 5f 4c 49 4d 49 54 5f 43 4f 4c 55 4d 4e 5d  TE_LIMIT_COLUMN]
2d2e0 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
2d2f0 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
2d300 2c 20 22 74 6f 6f 20 6d 61 6e 79 20 63 6f 6c 75  , "too many colu
2d310 6d 6e 73 20 69 6e 20 72 65 73 75 6c 74 20 73 65  mns in result se
2d320 74 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  t");.      retur
2d330 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20  n WRC_Abort;.   
2d340 20 7d 0a 20 20 20 20 69 66 28 20 28 65 6c 69 73   }.    if( (elis
2d350 74 46 6c 61 67 73 20 26 20 28 45 50 5f 48 61 73  tFlags & (EP_Has
2d360 46 75 6e 63 7c 45 50 5f 53 75 62 71 75 65 72 79  Func|EP_Subquery
2d370 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 70  ))!=0 ){.      p
2d380 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46  ->selFlags |= SF
2d390 5f 43 6f 6d 70 6c 65 78 52 65 73 75 6c 74 3b 0a  _ComplexResult;.
2d3a0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
2d3b0 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b  rn WRC_Continue;
2d3c0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4e 6f 2d 6f 70 20  .}../*.** No-op 
2d3d0 72 6f 75 74 69 6e 65 20 66 6f 72 20 74 68 65 20  routine for the 
2d3e0 70 61 72 73 65 2d 74 72 65 65 20 77 61 6c 6b 65  parse-tree walke
2d3f0 72 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68  r..**.** When th
2d400 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 74 68  is routine is th
2d410 65 20 57 61 6c 6b 65 72 2e 78 45 78 70 72 43 61  e Walker.xExprCa
2d420 6c 6c 62 61 63 6b 20 74 68 65 6e 20 65 78 70 72  llback then expr
2d430 65 73 73 69 6f 6e 20 74 72 65 65 73 0a 2a 2a 20  ession trees.** 
2d440 61 72 65 20 77 61 6c 6b 65 64 20 77 69 74 68 6f  are walked witho
2d450 75 74 20 61 6e 79 20 61 63 74 69 6f 6e 73 20 62  ut any actions b
2d460 65 69 6e 67 20 74 61 6b 65 6e 20 61 74 20 65 61  eing taken at ea
2d470 63 68 20 6e 6f 64 65 2e 20 20 50 72 65 73 75 6d  ch node.  Presum
2d480 61 62 6c 79 2c 0a 2a 2a 20 77 68 65 6e 20 74 68  ably,.** when th
2d490 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73  is routine is us
2d4a0 65 64 20 66 6f 72 20 57 61 6c 6b 65 72 2e 78 45  ed for Walker.xE
2d4b0 78 70 72 43 61 6c 6c 62 61 63 6b 20 74 68 65 6e  xprCallback then
2d4c0 20 0a 2a 2a 20 57 61 6c 6b 65 72 2e 78 53 65 6c   .** Walker.xSel
2d4d0 65 63 74 43 61 6c 6c 62 61 63 6b 20 69 73 20 73  ectCallback is s
2d4e0 65 74 20 74 6f 20 64 6f 20 73 6f 6d 65 74 68 69  et to do somethi
2d4f0 6e 67 20 75 73 65 66 75 6c 20 66 6f 72 20 65 76  ng useful for ev
2d500 65 72 79 20 0a 2a 2a 20 73 75 62 71 75 65 72 79  ery .** subquery
2d510 20 69 6e 20 74 68 65 20 70 61 72 73 65 72 20 74   in the parser t
2d520 72 65 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ree..*/.int sqli
2d530 74 65 33 45 78 70 72 57 61 6c 6b 4e 6f 6f 70 28  te3ExprWalkNoop(
2d540 57 61 6c 6b 65 72 20 2a 4e 6f 74 55 73 65 64 2c  Walker *NotUsed,
2d550 20 45 78 70 72 20 2a 4e 6f 74 55 73 65 64 32 29   Expr *NotUsed2)
2d560 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  {.  UNUSED_PARAM
2d570 45 54 45 52 32 28 4e 6f 74 55 73 65 64 2c 20 4e  ETER2(NotUsed, N
2d580 6f 74 55 73 65 64 32 29 3b 0a 20 20 72 65 74 75  otUsed2);.  retu
2d590 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b  rn WRC_Continue;
2d5a0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4e 6f 2d 6f 70 20  .}../*.** No-op 
2d5b0 72 6f 75 74 69 6e 65 20 66 6f 72 20 74 68 65 20  routine for the 
2d5c0 70 61 72 73 65 2d 74 72 65 65 20 77 61 6c 6b 65  parse-tree walke
2d5d0 72 20 66 6f 72 20 53 45 4c 45 43 54 20 73 74 61  r for SELECT sta
2d5e0 74 65 6d 65 6e 74 73 2e 0a 2a 2a 20 73 75 62 71  tements..** subq
2d5f0 75 65 72 79 20 69 6e 20 74 68 65 20 70 61 72 73  uery in the pars
2d600 65 72 20 74 72 65 65 2e 0a 2a 2f 0a 69 6e 74 20  er tree..*/.int 
2d610 73 71 6c 69 74 65 33 53 65 6c 65 63 74 57 61 6c  sqlite3SelectWal
2d620 6b 4e 6f 6f 70 28 57 61 6c 6b 65 72 20 2a 4e 6f  kNoop(Walker *No
2d630 74 55 73 65 64 2c 20 53 65 6c 65 63 74 20 2a 4e  tUsed, Select *N
2d640 6f 74 55 73 65 64 32 29 7b 0a 20 20 55 4e 55 53  otUsed2){.  UNUS
2d650 45 44 5f 50 41 52 41 4d 45 54 45 52 32 28 4e 6f  ED_PARAMETER2(No
2d660 74 55 73 65 64 2c 20 4e 6f 74 55 73 65 64 32 29  tUsed, NotUsed2)
2d670 3b 0a 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43  ;.  return WRC_C
2d680 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 23 69 66 20  ontinue;.}..#if 
2d690 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a  SQLITE_DEBUG./*.
2d6a0 2a 2a 20 41 6c 77 61 79 73 20 61 73 73 65 72 74  ** Always assert
2d6b0 2e 20 20 54 68 69 73 20 78 53 65 6c 65 63 74 43  .  This xSelectC
2d6c0 61 6c 6c 62 61 63 6b 32 20 69 6d 70 6c 65 6d 65  allback2 impleme
2d6d0 6e 74 61 74 69 6f 6e 20 70 72 6f 76 65 73 20 74  ntation proves t
2d6e0 68 61 74 20 74 68 65 0a 2a 2a 20 78 53 65 6c 65  hat the.** xSele
2d6f0 63 74 43 61 6c 6c 62 61 63 6b 32 20 69 73 20 6e  ctCallback2 is n
2d700 65 76 65 72 20 69 6e 76 6f 6b 65 64 2e 0a 2a 2f  ever invoked..*/
2d710 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53 65 6c  .void sqlite3Sel
2d720 65 63 74 57 61 6c 6b 41 73 73 65 72 74 32 28 57  ectWalkAssert2(W
2d730 61 6c 6b 65 72 20 2a 4e 6f 74 55 73 65 64 2c 20  alker *NotUsed, 
2d740 53 65 6c 65 63 74 20 2a 4e 6f 74 55 73 65 64 32  Select *NotUsed2
2d750 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  ){.  UNUSED_PARA
2d760 4d 45 54 45 52 32 28 4e 6f 74 55 73 65 64 2c 20  METER2(NotUsed, 
2d770 4e 6f 74 55 73 65 64 32 29 3b 0a 20 20 61 73 73  NotUsed2);.  ass
2d780 65 72 74 28 20 30 20 29 3b 0a 7d 0a 23 65 6e 64  ert( 0 );.}.#end
2d790 69 66 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  if./*.** This ro
2d7a0 75 74 69 6e 65 20 22 65 78 70 61 6e 64 73 22 20  utine "expands" 
2d7b0 61 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  a SELECT stateme
2d7c0 6e 74 20 61 6e 64 20 61 6c 6c 20 6f 66 20 69 74  nt and all of it
2d7d0 73 20 73 75 62 71 75 65 72 69 65 73 2e 0a 2a 2a  s subqueries..**
2d7e0 20 46 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20   For additional 
2d7f0 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f 6e 20 77  information on w
2d800 68 61 74 20 69 74 20 6d 65 61 6e 73 20 74 6f 20  hat it means to 
2d810 22 65 78 70 61 6e 64 22 20 61 20 53 45 4c 45 43  "expand" a SELEC
2d820 54 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 2c 20  T.** statement, 
2d830 73 65 65 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20  see the comment 
2d840 6f 6e 20 74 68 65 20 73 65 6c 65 63 74 45 78 70  on the selectExp
2d850 61 6e 64 20 77 6f 72 6b 65 72 20 63 61 6c 6c 62  and worker callb
2d860 61 63 6b 20 61 62 6f 76 65 2e 0a 2a 2a 0a 2a 2a  ack above..**.**
2d870 20 45 78 70 61 6e 64 69 6e 67 20 61 20 53 45 4c   Expanding a SEL
2d880 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 69 73  ECT statement is
2d890 20 74 68 65 20 66 69 72 73 74 20 73 74 65 70 20   the first step 
2d8a0 69 6e 20 70 72 6f 63 65 73 73 69 6e 67 20 61 0a  in processing a.
2d8b0 2a 2a 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  ** SELECT statem
2d8c0 65 6e 74 2e 20 20 54 68 65 20 53 45 4c 45 43 54  ent.  The SELECT
2d8d0 20 73 74 61 74 65 6d 65 6e 74 20 6d 75 73 74 20   statement must 
2d8e0 62 65 20 65 78 70 61 6e 64 65 64 20 62 65 66 6f  be expanded befo
2d8f0 72 65 0a 2a 2a 20 6e 61 6d 65 20 72 65 73 6f 6c  re.** name resol
2d900 75 74 69 6f 6e 20 69 73 20 70 65 72 66 6f 72 6d  ution is perform
2d910 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 79  ed..**.** If any
2d920 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67  thing goes wrong
2d930 2c 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61  , an error messa
2d940 67 65 20 69 73 20 77 72 69 74 74 65 6e 20 69 6e  ge is written in
2d950 74 6f 20 70 50 61 72 73 65 2e 0a 2a 2a 20 54 68  to pParse..** Th
2d960 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69  e calling functi
2d970 6f 6e 20 63 61 6e 20 64 65 74 65 63 74 20 74 68  on can detect th
2d980 65 20 70 72 6f 62 6c 65 6d 20 62 79 20 6c 6f 6f  e problem by loo
2d990 6b 69 6e 67 20 61 74 20 70 50 61 72 73 65 2d 3e  king at pParse->
2d9a0 6e 45 72 72 0a 2a 2a 20 61 6e 64 2f 6f 72 20 70  nErr.** and/or p
2d9b0 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  Parse->db->mallo
2d9c0 63 46 61 69 6c 65 64 2e 0a 2a 2f 0a 73 74 61 74  cFailed..*/.stat
2d9d0 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65 33 53  ic void sqlite3S
2d9e0 65 6c 65 63 74 45 78 70 61 6e 64 28 50 61 72 73  electExpand(Pars
2d9f0 65 20 2a 70 50 61 72 73 65 2c 20 53 65 6c 65 63  e *pParse, Selec
2da00 74 20 2a 70 53 65 6c 65 63 74 29 7b 0a 20 20 57  t *pSelect){.  W
2da10 61 6c 6b 65 72 20 77 3b 0a 20 20 77 2e 78 45 78  alker w;.  w.xEx
2da20 70 72 43 61 6c 6c 62 61 63 6b 20 3d 20 73 71 6c  prCallback = sql
2da30 69 74 65 33 45 78 70 72 57 61 6c 6b 4e 6f 6f 70  ite3ExprWalkNoop
2da40 3b 0a 20 20 77 2e 70 50 61 72 73 65 20 3d 20 70  ;.  w.pParse = p
2da50 50 61 72 73 65 3b 0a 20 20 69 66 28 20 4f 4b 5f  Parse;.  if( OK_
2da60 49 46 5f 41 4c 57 41 59 53 5f 54 52 55 45 28 70  IF_ALWAYS_TRUE(p
2da70 50 61 72 73 65 2d 3e 68 61 73 43 6f 6d 70 6f 75  Parse->hasCompou
2da80 6e 64 29 20 29 7b 0a 20 20 20 20 77 2e 78 53 65  nd) ){.    w.xSe
2da90 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20 3d 20 63  lectCallback = c
2daa0 6f 6e 76 65 72 74 43 6f 6d 70 6f 75 6e 64 53 65  onvertCompoundSe
2dab0 6c 65 63 74 54 6f 53 75 62 71 75 65 72 79 3b 0a  lectToSubquery;.
2dac0 20 20 20 20 77 2e 78 53 65 6c 65 63 74 43 61 6c      w.xSelectCal
2dad0 6c 62 61 63 6b 32 20 3d 20 30 3b 0a 20 20 20 20  lback2 = 0;.    
2dae0 73 71 6c 69 74 65 33 57 61 6c 6b 53 65 6c 65 63  sqlite3WalkSelec
2daf0 74 28 26 77 2c 20 70 53 65 6c 65 63 74 29 3b 0a  t(&w, pSelect);.
2db00 20 20 7d 0a 20 20 77 2e 78 53 65 6c 65 63 74 43    }.  w.xSelectC
2db10 61 6c 6c 62 61 63 6b 20 3d 20 73 65 6c 65 63 74  allback = select
2db20 45 78 70 61 6e 64 65 72 3b 0a 20 20 77 2e 78 53  Expander;.  w.xS
2db30 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 32 20 3d  electCallback2 =
2db40 20 73 65 6c 65 63 74 50 6f 70 57 69 74 68 3b 0a   selectPopWith;.
2db50 20 20 77 2e 65 43 6f 64 65 20 3d 20 30 3b 0a 20    w.eCode = 0;. 
2db60 20 73 71 6c 69 74 65 33 57 61 6c 6b 53 65 6c 65   sqlite3WalkSele
2db70 63 74 28 26 77 2c 20 70 53 65 6c 65 63 74 29 3b  ct(&w, pSelect);
2db80 0a 7d 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  .}...#ifndef SQL
2db90 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
2dba0 59 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20  Y./*.** This is 
2dbb0 61 20 57 61 6c 6b 65 72 2e 78 53 65 6c 65 63 74  a Walker.xSelect
2dbc0 43 61 6c 6c 62 61 63 6b 20 63 61 6c 6c 62 61 63  Callback callbac
2dbd0 6b 20 66 6f 72 20 74 68 65 20 73 71 6c 69 74 65  k for the sqlite
2dbe0 33 53 65 6c 65 63 74 54 79 70 65 49 6e 66 6f 28  3SelectTypeInfo(
2dbf0 29 0a 2a 2a 20 69 6e 74 65 72 66 61 63 65 2e 0a  ).** interface..
2dc00 2a 2a 0a 2a 2a 20 46 6f 72 20 65 61 63 68 20 46  **.** For each F
2dc10 52 4f 4d 2d 63 6c 61 75 73 65 20 73 75 62 71 75  ROM-clause subqu
2dc20 65 72 79 2c 20 61 64 64 20 43 6f 6c 75 6d 6e 2e  ery, add Column.
2dc30 7a 54 79 70 65 20 61 6e 64 20 43 6f 6c 75 6d 6e  zType and Column
2dc40 2e 7a 43 6f 6c 6c 0a 2a 2a 20 69 6e 66 6f 72 6d  .zColl.** inform
2dc50 61 74 69 6f 6e 20 74 6f 20 74 68 65 20 54 61 62  ation to the Tab
2dc60 6c 65 20 73 74 72 75 63 74 75 72 65 20 74 68 61  le structure tha
2dc70 74 20 72 65 70 72 65 73 65 6e 74 73 20 74 68 65  t represents the
2dc80 20 72 65 73 75 6c 74 20 73 65 74 0a 2a 2a 20 6f   result set.** o
2dc90 66 20 74 68 61 74 20 73 75 62 71 75 65 72 79 2e  f that subquery.
2dca0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 54 61 62 6c 65  .**.** The Table
2dcb0 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20   structure that 
2dcc0 72 65 70 72 65 73 65 6e 74 73 20 74 68 65 20 72  represents the r
2dcd0 65 73 75 6c 74 20 73 65 74 20 77 61 73 20 63 6f  esult set was co
2dce0 6e 73 74 72 75 63 74 65 64 0a 2a 2a 20 62 79 20  nstructed.** by 
2dcf0 73 65 6c 65 63 74 45 78 70 61 6e 64 65 72 28 29  selectExpander()
2dd00 20 62 75 74 20 74 68 65 20 74 79 70 65 20 61 6e   but the type an
2dd10 64 20 63 6f 6c 6c 61 74 69 6f 6e 20 69 6e 66 6f  d collation info
2dd20 72 6d 61 74 69 6f 6e 20 77 61 73 20 6f 6d 69 74  rmation was omit
2dd30 74 65 64 0a 2a 2a 20 61 74 20 74 68 61 74 20 70  ted.** at that p
2dd40 6f 69 6e 74 20 62 65 63 61 75 73 65 20 69 64 65  oint because ide
2dd50 6e 74 69 66 69 65 72 73 20 68 61 64 20 6e 6f 74  ntifiers had not
2dd60 20 79 65 74 20 62 65 65 6e 20 72 65 73 6f 6c 76   yet been resolv
2dd70 65 64 2e 20 20 54 68 69 73 0a 2a 2a 20 72 6f 75  ed.  This.** rou
2dd80 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 61  tine is called a
2dd90 66 74 65 72 20 69 64 65 6e 74 69 66 69 65 72 20  fter identifier 
2dda0 72 65 73 6f 6c 75 74 69 6f 6e 2e 0a 2a 2f 0a 73  resolution..*/.s
2ddb0 74 61 74 69 63 20 76 6f 69 64 20 73 65 6c 65 63  tatic void selec
2ddc0 74 41 64 64 53 75 62 71 75 65 72 79 54 79 70 65  tAddSubqueryType
2ddd0 49 6e 66 6f 28 57 61 6c 6b 65 72 20 2a 70 57 61  Info(Walker *pWa
2dde0 6c 6b 65 72 2c 20 53 65 6c 65 63 74 20 2a 70 29  lker, Select *p)
2ddf0 7b 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  {.  Parse *pPars
2de00 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 53 72  e;.  int i;.  Sr
2de10 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74 3b  cList *pTabList;
2de20 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73  .  struct SrcLis
2de30 74 5f 69 74 65 6d 20 2a 70 46 72 6f 6d 3b 0a 0a  t_item *pFrom;..
2de40 20 20 61 73 73 65 72 74 28 20 70 2d 3e 73 65 6c    assert( p->sel
2de50 46 6c 61 67 73 20 26 20 53 46 5f 52 65 73 6f 6c  Flags & SF_Resol
2de60 76 65 64 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e  ved );.  if( p->
2de70 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 48 61  selFlags & SF_Ha
2de80 73 54 79 70 65 49 6e 66 6f 20 29 20 72 65 74 75  sTypeInfo ) retu
2de90 72 6e 3b 0a 20 20 70 2d 3e 73 65 6c 46 6c 61 67  rn;.  p->selFlag
2dea0 73 20 7c 3d 20 53 46 5f 48 61 73 54 79 70 65 49  s |= SF_HasTypeI
2deb0 6e 66 6f 3b 0a 20 20 70 50 61 72 73 65 20 3d 20  nfo;.  pParse = 
2dec0 70 57 61 6c 6b 65 72 2d 3e 70 50 61 72 73 65 3b  pWalker->pParse;
2ded0 0a 20 20 70 54 61 62 4c 69 73 74 20 3d 20 70 2d  .  pTabList = p-
2dee0 3e 70 53 72 63 3b 0a 20 20 66 6f 72 28 69 3d 30  >pSrc;.  for(i=0
2def0 2c 20 70 46 72 6f 6d 3d 70 54 61 62 4c 69 73 74  , pFrom=pTabList
2df00 2d 3e 61 3b 20 69 3c 70 54 61 62 4c 69 73 74 2d  ->a; i<pTabList-
2df10 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 46 72 6f  >nSrc; i++, pFro
2df20 6d 2b 2b 29 7b 0a 20 20 20 20 54 61 62 6c 65 20  m++){.    Table 
2df30 2a 70 54 61 62 20 3d 20 70 46 72 6f 6d 2d 3e 70  *pTab = pFrom->p
2df40 54 61 62 3b 0a 20 20 20 20 61 73 73 65 72 74 28  Tab;.    assert(
2df50 20 70 54 61 62 21 3d 30 20 29 3b 0a 20 20 20 20   pTab!=0 );.    
2df60 69 66 28 20 28 70 54 61 62 2d 3e 74 61 62 46 6c  if( (pTab->tabFl
2df70 61 67 73 20 26 20 54 46 5f 45 70 68 65 6d 65 72  ags & TF_Ephemer
2df80 61 6c 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  al)!=0 ){.      
2df90 2f 2a 20 41 20 73 75 62 2d 71 75 65 72 79 20 69  /* A sub-query i
2dfa0 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  n the FROM claus
2dfb0 65 20 6f 66 20 61 20 53 45 4c 45 43 54 20 2a 2f  e of a SELECT */
2dfc0 0a 20 20 20 20 20 20 53 65 6c 65 63 74 20 2a 70  .      Select *p
2dfd0 53 65 6c 20 3d 20 70 46 72 6f 6d 2d 3e 70 53 65  Sel = pFrom->pSe
2dfe0 6c 65 63 74 3b 0a 20 20 20 20 20 20 69 66 28 20  lect;.      if( 
2dff0 70 53 65 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  pSel ){.        
2e000 77 68 69 6c 65 28 20 70 53 65 6c 2d 3e 70 50 72  while( pSel->pPr
2e010 69 6f 72 20 29 20 70 53 65 6c 20 3d 20 70 53 65  ior ) pSel = pSe
2e020 6c 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 20  l->pPrior;.     
2e030 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74     sqlite3Select
2e040 41 64 64 43 6f 6c 75 6d 6e 54 79 70 65 41 6e 64  AddColumnTypeAnd
2e050 43 6f 6c 6c 61 74 69 6f 6e 28 70 50 61 72 73 65  Collation(pParse
2e060 2c 20 70 54 61 62 2c 20 70 53 65 6c 2c 0a 20 20  , pTab, pSel,.  
2e070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e090 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c               SQL
2e0a0 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 29 3b 0a 20  ITE_AFF_NONE);. 
2e0b0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
2e0c0 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a  .}.#endif.../*.*
2e0d0 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61  * This routine a
2e0e0 64 64 73 20 64 61 74 61 74 79 70 65 20 61 6e 64  dds datatype and
2e0f0 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
2e100 6e 63 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  nce information 
2e110 74 6f 0a 2a 2a 20 74 68 65 20 54 61 62 6c 65 20  to.** the Table 
2e120 73 74 72 75 63 74 75 72 65 73 20 6f 66 20 61 6c  structures of al
2e130 6c 20 46 52 4f 4d 2d 63 6c 61 75 73 65 20 73 75  l FROM-clause su
2e140 62 71 75 65 72 69 65 73 20 69 6e 20 61 0a 2a 2a  bqueries in a.**
2e150 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
2e160 74 2e 0a 2a 2a 0a 2a 2a 20 55 73 65 20 74 68 69  t..**.** Use thi
2e170 73 20 72 6f 75 74 69 6e 65 20 61 66 74 65 72 20  s routine after 
2e180 6e 61 6d 65 20 72 65 73 6f 6c 75 74 69 6f 6e 2e  name resolution.
2e190 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
2e1a0 73 71 6c 69 74 65 33 53 65 6c 65 63 74 41 64 64  sqlite3SelectAdd
2e1b0 54 79 70 65 49 6e 66 6f 28 50 61 72 73 65 20 2a  TypeInfo(Parse *
2e1c0 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a  pParse, Select *
2e1d0 70 53 65 6c 65 63 74 29 7b 0a 23 69 66 6e 64 65  pSelect){.#ifnde
2e1e0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  f SQLITE_OMIT_SU
2e1f0 42 51 55 45 52 59 0a 20 20 57 61 6c 6b 65 72 20  BQUERY.  Walker 
2e200 77 3b 0a 20 20 77 2e 78 53 65 6c 65 63 74 43 61  w;.  w.xSelectCa
2e210 6c 6c 62 61 63 6b 20 3d 20 73 71 6c 69 74 65 33  llback = sqlite3
2e220 53 65 6c 65 63 74 57 61 6c 6b 4e 6f 6f 70 3b 0a  SelectWalkNoop;.
2e230 20 20 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62    w.xSelectCallb
2e240 61 63 6b 32 20 3d 20 73 65 6c 65 63 74 41 64 64  ack2 = selectAdd
2e250 53 75 62 71 75 65 72 79 54 79 70 65 49 6e 66 6f  SubqueryTypeInfo
2e260 3b 0a 20 20 77 2e 78 45 78 70 72 43 61 6c 6c 62  ;.  w.xExprCallb
2e270 61 63 6b 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ack = sqlite3Exp
2e280 72 57 61 6c 6b 4e 6f 6f 70 3b 0a 20 20 77 2e 70  rWalkNoop;.  w.p
2e290 50 61 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a  Parse = pParse;.
2e2a0 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 53 65 6c    sqlite3WalkSel
2e2b0 65 63 74 28 26 77 2c 20 70 53 65 6c 65 63 74 29  ect(&w, pSelect)
2e2c0 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 0a 2f 2a 0a  ;.#endif.}.../*.
2e2d0 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
2e2e0 73 65 74 73 20 75 70 20 61 20 53 45 4c 45 43 54  sets up a SELECT
2e2f0 20 73 74 61 74 65 6d 65 6e 74 20 66 6f 72 20 70   statement for p
2e300 72 6f 63 65 73 73 69 6e 67 2e 20 20 54 68 65 0a  rocessing.  The.
2e310 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 73 20  ** following is 
2e320 61 63 63 6f 6d 70 6c 69 73 68 65 64 3a 0a 2a 2a  accomplished:.**
2e330 0a 2a 2a 20 20 20 20 20 2a 20 20 56 44 42 45 20  .**     *  VDBE 
2e340 43 75 72 73 6f 72 20 6e 75 6d 62 65 72 73 20 61  Cursor numbers a
2e350 72 65 20 61 73 73 69 67 6e 65 64 20 74 6f 20 61  re assigned to a
2e360 6c 6c 20 46 52 4f 4d 2d 63 6c 61 75 73 65 20 74  ll FROM-clause t
2e370 65 72 6d 73 2e 0a 2a 2a 20 20 20 20 20 2a 20 20  erms..**     *  
2e380 45 70 68 65 6d 65 72 61 6c 20 54 61 62 6c 65 20  Ephemeral Table 
2e390 6f 62 6a 65 63 74 73 20 61 72 65 20 63 72 65 61  objects are crea
2e3a0 74 65 64 20 66 6f 72 20 61 6c 6c 20 46 52 4f 4d  ted for all FROM
2e3b0 2d 63 6c 61 75 73 65 20 73 75 62 71 75 65 72 69  -clause subqueri
2e3c0 65 73 2e 0a 2a 2a 20 20 20 20 20 2a 20 20 4f 4e  es..**     *  ON
2e3d0 20 61 6e 64 20 55 53 49 4e 47 20 63 6c 61 75 73   and USING claus
2e3e0 65 73 20 61 72 65 20 73 68 69 66 74 65 64 20 69  es are shifted i
2e3f0 6e 74 6f 20 57 48 45 52 45 20 73 74 61 74 65 6d  nto WHERE statem
2e400 65 6e 74 73 0a 2a 2a 20 20 20 20 20 2a 20 20 57  ents.**     *  W
2e410 69 6c 64 63 61 72 64 73 20 22 2a 22 20 61 6e 64  ildcards "*" and
2e420 20 22 54 41 42 4c 45 2e 2a 22 20 69 6e 20 72 65   "TABLE.*" in re
2e430 73 75 6c 74 20 73 65 74 73 20 61 72 65 20 65 78  sult sets are ex
2e440 70 61 6e 64 65 64 2e 0a 2a 2a 20 20 20 20 20 2a  panded..**     *
2e450 20 20 49 64 65 6e 74 69 66 69 65 72 73 20 69 6e    Identifiers in
2e460 20 65 78 70 72 65 73 73 69 6f 6e 20 61 72 65 20   expression are 
2e470 6d 61 74 63 68 65 64 20 74 6f 20 74 61 62 6c 65  matched to table
2e480 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  s..**.** This ro
2e490 75 74 69 6e 65 20 61 63 74 73 20 72 65 63 75 72  utine acts recur
2e4a0 73 69 76 65 6c 79 20 6f 6e 20 61 6c 6c 20 73 75  sively on all su
2e4b0 62 71 75 65 72 69 65 73 20 77 69 74 68 69 6e 20  bqueries within 
2e4c0 74 68 65 20 53 45 4c 45 43 54 2e 0a 2a 2f 0a 76  the SELECT..*/.v
2e4d0 6f 69 64 20 73 71 6c 69 74 65 33 53 65 6c 65 63  oid sqlite3Selec
2e4e0 74 50 72 65 70 28 0a 20 20 50 61 72 73 65 20 2a  tPrep(.  Parse *
2e4f0 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20  pParse,         
2e500 2f 2a 20 54 68 65 20 70 61 72 73 65 72 20 63 6f  /* The parser co
2e510 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63  ntext */.  Selec
2e520 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  t *p,           
2e530 20 20 2f 2a 20 54 68 65 20 53 45 4c 45 43 54 20    /* The SELECT 
2e540 73 74 61 74 65 6d 65 6e 74 20 62 65 69 6e 67 20  statement being 
2e550 63 6f 64 65 64 2e 20 2a 2f 0a 20 20 4e 61 6d 65  coded. */.  Name
2e560 43 6f 6e 74 65 78 74 20 2a 70 4f 75 74 65 72 4e  Context *pOuterN
2e570 43 20 20 2f 2a 20 4e 61 6d 65 20 63 6f 6e 74 65  C  /* Name conte
2e580 78 74 20 66 6f 72 20 63 6f 6e 74 61 69 6e 65 72  xt for container
2e590 20 2a 2f 0a 29 7b 0a 20 20 61 73 73 65 72 74 28   */.){.  assert(
2e5a0 20 70 21 3d 30 20 7c 7c 20 70 50 61 72 73 65 2d   p!=0 || pParse-
2e5b0 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
2e5c0 64 20 29 3b 0a 20 20 69 66 28 20 70 50 61 72 73  d );.  if( pPars
2e5d0 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  e->db->mallocFai
2e5e0 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  led ) return;.  
2e5f0 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20  if( p->selFlags 
2e600 26 20 53 46 5f 48 61 73 54 79 70 65 49 6e 66 6f  & SF_HasTypeInfo
2e610 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 73 71 6c   ) return;.  sql
2e620 69 74 65 33 53 65 6c 65 63 74 45 78 70 61 6e 64  ite3SelectExpand
2e630 28 70 50 61 72 73 65 2c 20 70 29 3b 0a 20 20 69  (pParse, p);.  i
2e640 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20  f( pParse->nErr 
2e650 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d  || pParse->db->m
2e660 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65  allocFailed ) re
2e670 74 75 72 6e 3b 0a 20 20 73 71 6c 69 74 65 33 52  turn;.  sqlite3R
2e680 65 73 6f 6c 76 65 53 65 6c 65 63 74 4e 61 6d 65  esolveSelectName
2e690 73 28 70 50 61 72 73 65 2c 20 70 2c 20 70 4f 75  s(pParse, p, pOu
2e6a0 74 65 72 4e 43 29 3b 0a 20 20 69 66 28 20 70 50  terNC);.  if( pP
2e6b0 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 70 50  arse->nErr || pP
2e6c0 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  arse->db->malloc
2e6d0 46 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b  Failed ) return;
2e6e0 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  .  sqlite3Select
2e6f0 41 64 64 54 79 70 65 49 6e 66 6f 28 70 50 61 72  AddTypeInfo(pPar
2e700 73 65 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  se, p);.}../*.**
2e710 20 52 65 73 65 74 20 74 68 65 20 61 67 67 72 65   Reset the aggre
2e720 67 61 74 65 20 61 63 63 75 6d 75 6c 61 74 6f 72  gate accumulator
2e730 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 67 67 72  ..**.** The aggr
2e740 65 67 61 74 65 20 61 63 63 75 6d 75 6c 61 74 6f  egate accumulato
2e750 72 20 69 73 20 61 20 73 65 74 20 6f 66 20 6d 65  r is a set of me
2e760 6d 6f 72 79 20 63 65 6c 6c 73 20 74 68 61 74 20  mory cells that 
2e770 68 6f 6c 64 0a 2a 2a 20 69 6e 74 65 72 6d 65 64  hold.** intermed
2e780 69 61 74 65 20 72 65 73 75 6c 74 73 20 77 68 69  iate results whi
2e790 6c 65 20 63 61 6c 63 75 6c 61 74 69 6e 67 20 61  le calculating a
2e7a0 6e 20 61 67 67 72 65 67 61 74 65 2e 20 20 54 68  n aggregate.  Th
2e7b0 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 67 65  is.** routine ge
2e7c0 6e 65 72 61 74 65 73 20 63 6f 64 65 20 74 68 61  nerates code tha
2e7d0 74 20 73 74 6f 72 65 73 20 4e 55 4c 4c 73 20 69  t stores NULLs i
2e7e0 6e 20 61 6c 6c 20 6f 66 20 74 68 6f 73 65 20 6d  n all of those m
2e7f0 65 6d 6f 72 79 0a 2a 2a 20 63 65 6c 6c 73 2e 0a  emory.** cells..
2e800 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72  */.static void r
2e810 65 73 65 74 41 63 63 75 6d 75 6c 61 74 6f 72 28  esetAccumulator(
2e820 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 41  Parse *pParse, A
2e830 67 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f  ggInfo *pAggInfo
2e840 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  ){.  Vdbe *v = p
2e850 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
2e860 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20  int i;.  struct 
2e870 41 67 67 49 6e 66 6f 5f 66 75 6e 63 20 2a 70 46  AggInfo_func *pF
2e880 75 6e 63 3b 0a 20 20 69 6e 74 20 6e 52 65 67 20  unc;.  int nReg 
2e890 3d 20 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e  = pAggInfo->nFun
2e8a0 63 20 2b 20 70 41 67 67 49 6e 66 6f 2d 3e 6e 43  c + pAggInfo->nC
2e8b0 6f 6c 75 6d 6e 3b 0a 20 20 69 66 28 20 6e 52 65  olumn;.  if( nRe
2e8c0 67 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 23  g==0 ) return;.#
2e8d0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
2e8e0 55 47 0a 20 20 2f 2a 20 56 65 72 69 66 79 20 74  UG.  /* Verify t
2e8f0 68 61 74 20 61 6c 6c 20 41 67 67 49 6e 66 6f 20  hat all AggInfo 
2e900 72 65 67 69 73 74 65 72 73 20 61 72 65 20 77 69  registers are wi
2e910 74 68 69 6e 20 74 68 65 20 72 61 6e 67 65 20 73  thin the range s
2e920 70 65 63 69 66 69 65 64 20 62 79 0a 20 20 2a 2a  pecified by.  **
2e930 20 41 67 67 49 6e 66 6f 2e 6d 6e 52 65 67 2e 2e   AggInfo.mnReg..
2e940 41 67 67 49 6e 66 6f 2e 6d 78 52 65 67 20 2a 2f  AggInfo.mxReg */
2e950 0a 20 20 61 73 73 65 72 74 28 20 6e 52 65 67 3d  .  assert( nReg=
2e960 3d 70 41 67 67 49 6e 66 6f 2d 3e 6d 78 52 65 67  =pAggInfo->mxReg
2e970 2d 70 41 67 67 49 6e 66 6f 2d 3e 6d 6e 52 65 67  -pAggInfo->mnReg
2e980 2b 31 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  +1 );.  for(i=0;
2e990 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 43 6f   i<pAggInfo->nCo
2e9a0 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  lumn; i++){.    
2e9b0 61 73 73 65 72 74 28 20 70 41 67 67 49 6e 66 6f  assert( pAggInfo
2e9c0 2d 3e 61 43 6f 6c 5b 69 5d 2e 69 4d 65 6d 3e 3d  ->aCol[i].iMem>=
2e9d0 70 41 67 67 49 6e 66 6f 2d 3e 6d 6e 52 65 67 0a  pAggInfo->mnReg.
2e9e0 20 20 20 20 20 20 20 20 20 26 26 20 70 41 67 67           && pAgg
2e9f0 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 69 5d 2e 69 4d  Info->aCol[i].iM
2ea00 65 6d 3c 3d 70 41 67 67 49 6e 66 6f 2d 3e 6d 78  em<=pAggInfo->mx
2ea10 52 65 67 20 29 3b 0a 20 20 7d 0a 20 20 66 6f 72  Reg );.  }.  for
2ea20 28 69 3d 30 3b 20 69 3c 70 41 67 67 49 6e 66 6f  (i=0; i<pAggInfo
2ea30 2d 3e 6e 46 75 6e 63 3b 20 69 2b 2b 29 7b 0a 20  ->nFunc; i++){. 
2ea40 20 20 20 61 73 73 65 72 74 28 20 70 41 67 67 49     assert( pAggI
2ea50 6e 66 6f 2d 3e 61 46 75 6e 63 5b 69 5d 2e 69 4d  nfo->aFunc[i].iM
2ea60 65 6d 3e 3d 70 41 67 67 49 6e 66 6f 2d 3e 6d 6e  em>=pAggInfo->mn
2ea70 52 65 67 0a 20 20 20 20 20 20 20 20 20 26 26 20  Reg.         && 
2ea80 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b  pAggInfo->aFunc[
2ea90 69 5d 2e 69 4d 65 6d 3c 3d 70 41 67 67 49 6e 66  i].iMem<=pAggInf
2eaa0 6f 2d 3e 6d 78 52 65 67 20 29 3b 0a 20 20 7d 0a  o->mxReg );.  }.
2eab0 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33  #endif.  sqlite3
2eac0 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
2ead0 5f 4e 75 6c 6c 2c 20 30 2c 20 70 41 67 67 49 6e  _Null, 0, pAggIn
2eae0 66 6f 2d 3e 6d 6e 52 65 67 2c 20 70 41 67 67 49  fo->mnReg, pAggI
2eaf0 6e 66 6f 2d 3e 6d 78 52 65 67 29 3b 0a 20 20 66  nfo->mxReg);.  f
2eb00 6f 72 28 70 46 75 6e 63 3d 70 41 67 67 49 6e 66  or(pFunc=pAggInf
2eb10 6f 2d 3e 61 46 75 6e 63 2c 20 69 3d 30 3b 20 69  o->aFunc, i=0; i
2eb20 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63  <pAggInfo->nFunc
2eb30 3b 20 69 2b 2b 2c 20 70 46 75 6e 63 2b 2b 29 7b  ; i++, pFunc++){
2eb40 0a 20 20 20 20 69 66 28 20 70 46 75 6e 63 2d 3e  .    if( pFunc->
2eb50 69 44 69 73 74 69 6e 63 74 3e 3d 30 20 29 7b 0a  iDistinct>=0 ){.
2eb60 20 20 20 20 20 20 45 78 70 72 20 2a 70 45 20 3d        Expr *pE =
2eb70 20 70 46 75 6e 63 2d 3e 70 45 78 70 72 3b 0a 20   pFunc->pExpr;. 
2eb80 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78       assert( !Ex
2eb90 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
2eba0 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20  , EP_xIsSelect) 
2ebb0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45 2d  );.      if( pE-
2ebc0 3e 78 2e 70 4c 69 73 74 3d 3d 30 20 7c 7c 20 70  >x.pList==0 || p
2ebd0 45 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70  E->x.pList->nExp
2ebe0 72 21 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20  r!=1 ){.        
2ebf0 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
2ec00 70 50 61 72 73 65 2c 20 22 44 49 53 54 49 4e 43  pParse, "DISTINC
2ec10 54 20 61 67 67 72 65 67 61 74 65 73 20 6d 75 73  T aggregates mus
2ec20 74 20 68 61 76 65 20 65 78 61 63 74 6c 79 20 6f  t have exactly o
2ec30 6e 65 20 22 0a 20 20 20 20 20 20 20 20 20 20 20  ne ".           
2ec40 22 61 72 67 75 6d 65 6e 74 22 29 3b 0a 20 20 20  "argument");.   
2ec50 20 20 20 20 20 70 46 75 6e 63 2d 3e 69 44 69 73       pFunc->iDis
2ec60 74 69 6e 63 74 20 3d 20 2d 31 3b 0a 20 20 20 20  tinct = -1;.    
2ec70 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
2ec80 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e   KeyInfo *pKeyIn
2ec90 66 6f 20 3d 20 73 71 6c 69 74 65 33 4b 65 79 49  fo = sqlite3KeyI
2eca0 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74 28  nfoFromExprList(
2ecb0 70 50 61 72 73 65 2c 20 70 45 2d 3e 78 2e 70 4c  pParse, pE->x.pL
2ecc0 69 73 74 2c 30 2c 30 29 3b 0a 20 20 20 20 20 20  ist,0,0);.      
2ecd0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
2ece0 4f 70 34 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70  Op4(v, OP_OpenEp
2ecf0 68 65 6d 65 72 61 6c 2c 20 70 46 75 6e 63 2d 3e  hemeral, pFunc->
2ed00 69 44 69 73 74 69 6e 63 74 2c 20 30 2c 20 30 2c  iDistinct, 0, 0,
2ed10 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2ed20 20 20 20 20 20 20 20 20 20 20 20 28 63 68 61 72             (char
2ed30 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b  *)pKeyInfo, P4_K
2ed40 45 59 49 4e 46 4f 29 3b 0a 20 20 20 20 20 20 7d  EYINFO);.      }
2ed50 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
2ed60 0a 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 4f  .** Invoke the O
2ed70 50 5f 41 67 67 46 69 6e 61 6c 69 7a 65 20 6f 70  P_AggFinalize op
2ed80 63 6f 64 65 20 66 6f 72 20 65 76 65 72 79 20 61  code for every a
2ed90 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f  ggregate functio
2eda0 6e 0a 2a 2a 20 69 6e 20 74 68 65 20 41 67 67 49  n.** in the AggI
2edb0 6e 66 6f 20 73 74 72 75 63 74 75 72 65 2e 0a 2a  nfo structure..*
2edc0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 69  /.static void fi
2edd0 6e 61 6c 69 7a 65 41 67 67 46 75 6e 63 74 69 6f  nalizeAggFunctio
2ede0 6e 73 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ns(Parse *pParse
2edf0 2c 20 41 67 67 49 6e 66 6f 20 2a 70 41 67 67 49  , AggInfo *pAggI
2ee00 6e 66 6f 29 7b 0a 20 20 56 64 62 65 20 2a 76 20  nfo){.  Vdbe *v 
2ee10 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
2ee20 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75  .  int i;.  stru
2ee30 63 74 20 41 67 67 49 6e 66 6f 5f 66 75 6e 63 20  ct AggInfo_func 
2ee40 2a 70 46 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20  *pF;.  for(i=0, 
2ee50 70 46 3d 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75  pF=pAggInfo->aFu
2ee60 6e 63 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e  nc; i<pAggInfo->
2ee70 6e 46 75 6e 63 3b 20 69 2b 2b 2c 20 70 46 2b 2b  nFunc; i++, pF++
2ee80 29 7b 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20  ){.    ExprList 
2ee90 2a 70 4c 69 73 74 20 3d 20 70 46 2d 3e 70 45 78  *pList = pF->pEx
2eea0 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20 20  pr->x.pList;.   
2eeb0 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61   assert( !ExprHa
2eec0 73 50 72 6f 70 65 72 74 79 28 70 46 2d 3e 70 45  sProperty(pF->pE
2eed0 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63  xpr, EP_xIsSelec
2eee0 74 29 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  t) );.    sqlite
2eef0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
2ef00 50 5f 41 67 67 46 69 6e 61 6c 2c 20 70 46 2d 3e  P_AggFinal, pF->
2ef10 69 4d 65 6d 2c 20 70 4c 69 73 74 20 3f 20 70 4c  iMem, pList ? pL
2ef20 69 73 74 2d 3e 6e 45 78 70 72 20 3a 20 30 29 3b  ist->nExpr : 0);
2ef30 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
2ef40 41 70 70 65 6e 64 50 34 28 76 2c 20 70 46 2d 3e  AppendP4(v, pF->
2ef50 70 46 75 6e 63 2c 20 50 34 5f 46 55 4e 43 44 45  pFunc, P4_FUNCDE
2ef60 46 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a  F);.  }.}.../*.*
2ef70 2a 20 55 70 64 61 74 65 20 74 68 65 20 61 63 63  * Update the acc
2ef80 75 6d 75 6c 61 74 6f 72 20 6d 65 6d 6f 72 79 20  umulator memory 
2ef90 63 65 6c 6c 73 20 66 6f 72 20 61 6e 20 61 67 67  cells for an agg
2efa0 72 65 67 61 74 65 20 62 61 73 65 64 20 6f 6e 0a  regate based on.
2efb0 2a 2a 20 74 68 65 20 63 75 72 72 65 6e 74 20 63  ** the current c
2efc0 75 72 73 6f 72 20 70 6f 73 69 74 69 6f 6e 2e 0a  ursor position..
2efd0 2a 2a 0a 2a 2a 20 49 66 20 72 65 67 41 63 63 20  **.** If regAcc 
2efe0 69 73 20 6e 6f 6e 2d 7a 65 72 6f 20 61 6e 64 20  is non-zero and 
2eff0 74 68 65 72 65 20 61 72 65 20 6e 6f 20 6d 69 6e  there are no min
2f000 28 29 20 6f 72 20 6d 61 78 28 29 20 61 67 67 72  () or max() aggr
2f010 65 67 61 74 65 73 0a 2a 2a 20 69 6e 20 70 41 67  egates.** in pAg
2f020 67 49 6e 66 6f 2c 20 74 68 65 6e 20 6f 6e 6c 79  gInfo, then only
2f030 20 70 6f 70 75 6c 61 74 65 20 74 68 65 20 70 41   populate the pA
2f040 67 67 49 6e 66 6f 2d 3e 6e 41 63 63 75 6d 75 6c  ggInfo->nAccumul
2f050 61 74 6f 72 20 61 63 63 75 6d 75 6c 61 74 6f 72  ator accumulator
2f060 0a 2a 2a 20 72 65 67 69 73 74 65 72 73 20 69 66  .** registers if
2f070 20 72 65 67 69 73 74 65 72 20 72 65 67 41 63 63   register regAcc
2f080 20 63 6f 6e 74 61 69 6e 73 20 30 2e 20 54 68 65   contains 0. The
2f090 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 74 61 6b   caller will tak
2f0a0 65 20 63 61 72 65 0a 2a 2a 20 6f 66 20 73 65 74  e care.** of set
2f0b0 74 69 6e 67 20 61 6e 64 20 63 6c 65 61 72 69 6e  ting and clearin
2f0c0 67 20 72 65 67 41 63 63 2e 0a 2a 2f 0a 73 74 61  g regAcc..*/.sta
2f0d0 74 69 63 20 76 6f 69 64 20 75 70 64 61 74 65 41  tic void updateA
2f0e0 63 63 75 6d 75 6c 61 74 6f 72 28 50 61 72 73 65  ccumulator(Parse
2f0f0 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 72 65   *pParse, int re
2f100 67 41 63 63 2c 20 41 67 67 49 6e 66 6f 20 2a 70  gAcc, AggInfo *p
2f110 41 67 67 49 6e 66 6f 29 7b 0a 20 20 56 64 62 65  AggInfo){.  Vdbe
2f120 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56   *v = pParse->pV
2f130 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  dbe;.  int i;.  
2f140 69 6e 74 20 72 65 67 48 69 74 20 3d 20 30 3b 0a  int regHit = 0;.
2f150 20 20 69 6e 74 20 61 64 64 72 48 69 74 54 65 73    int addrHitTes
2f160 74 20 3d 20 30 3b 0a 20 20 73 74 72 75 63 74 20  t = 0;.  struct 
2f170 41 67 67 49 6e 66 6f 5f 66 75 6e 63 20 2a 70 46  AggInfo_func *pF
2f180 3b 0a 20 20 73 74 72 75 63 74 20 41 67 67 49 6e  ;.  struct AggIn
2f190 66 6f 5f 63 6f 6c 20 2a 70 43 3b 0a 0a 20 20 70  fo_col *pC;..  p
2f1a0 41 67 67 49 6e 66 6f 2d 3e 64 69 72 65 63 74 4d  AggInfo->directM
2f1b0 6f 64 65 20 3d 20 31 3b 0a 20 20 66 6f 72 28 69  ode = 1;.  for(i
2f1c0 3d 30 2c 20 70 46 3d 70 41 67 67 49 6e 66 6f 2d  =0, pF=pAggInfo-
2f1d0 3e 61 46 75 6e 63 3b 20 69 3c 70 41 67 67 49 6e  >aFunc; i<pAggIn
2f1e0 66 6f 2d 3e 6e 46 75 6e 63 3b 20 69 2b 2b 2c 20  fo->nFunc; i++, 
2f1f0 70 46 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6e  pF++){.    int n
2f200 41 72 67 3b 0a 20 20 20 20 69 6e 74 20 61 64 64  Arg;.    int add
2f210 72 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20 20 69  rNext = 0;.    i
2f220 6e 74 20 72 65 67 41 67 67 3b 0a 20 20 20 20 45  nt regAgg;.    E
2f230 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d  xprList *pList =
2f240 20 70 46 2d 3e 70 45 78 70 72 2d 3e 78 2e 70 4c   pF->pExpr->x.pL
2f250 69 73 74 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ist;.    assert(
2f260 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
2f270 79 28 70 46 2d 3e 70 45 78 70 72 2c 20 45 50 5f  y(pF->pExpr, EP_
2f280 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20  xIsSelect) );.  
2f290 20 20 61 73 73 65 72 74 28 20 21 49 73 57 69 6e    assert( !IsWin
2f2a0 64 6f 77 46 75 6e 63 28 70 46 2d 3e 70 45 78 70  dowFunc(pF->pExp
2f2b0 72 29 20 29 3b 0a 20 20 20 20 69 66 28 20 45 78  r) );.    if( Ex
2f2c0 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 46  prHasProperty(pF
2f2d0 2d 3e 70 45 78 70 72 2c 20 45 50 5f 57 69 6e 46  ->pExpr, EP_WinF
2f2e0 75 6e 63 29 20 29 7b 0a 20 20 20 20 20 20 45 78  unc) ){.      Ex
2f2f0 70 72 20 2a 70 46 69 6c 74 65 72 20 3d 20 70 46  pr *pFilter = pF
2f300 2d 3e 70 45 78 70 72 2d 3e 79 2e 70 57 69 6e 2d  ->pExpr->y.pWin-
2f310 3e 70 46 69 6c 74 65 72 3b 0a 20 20 20 20 20 20  >pFilter;.      
2f320 61 64 64 72 4e 65 78 74 20 3d 20 73 71 6c 69 74  addrNext = sqlit
2f330 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
2f340 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 73  pParse);.      s
2f350 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73  qlite3ExprIfFals
2f360 65 28 70 50 61 72 73 65 2c 20 70 46 69 6c 74 65  e(pParse, pFilte
2f370 72 2c 20 61 64 64 72 4e 65 78 74 2c 20 53 51 4c  r, addrNext, SQL
2f380 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b  ITE_JUMPIFNULL);
2f390 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
2f3a0 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20 6e 41  List ){.      nA
2f3b0 72 67 20 3d 20 70 4c 69 73 74 2d 3e 6e 45 78 70  rg = pList->nExp
2f3c0 72 3b 0a 20 20 20 20 20 20 72 65 67 41 67 67 20  r;.      regAgg 
2f3d0 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
2f3e0 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 6e 41  Range(pParse, nA
2f3f0 72 67 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  rg);.      sqlit
2f400 65 33 45 78 70 72 43 6f 64 65 45 78 70 72 4c 69  e3ExprCodeExprLi
2f410 73 74 28 70 50 61 72 73 65 2c 20 70 4c 69 73 74  st(pParse, pList
2f420 2c 20 72 65 67 41 67 67 2c 20 30 2c 20 53 51 4c  , regAgg, 0, SQL
2f430 49 54 45 5f 45 43 45 4c 5f 44 55 50 29 3b 0a 20  ITE_ECEL_DUP);. 
2f440 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2f450 6e 41 72 67 20 3d 20 30 3b 0a 20 20 20 20 20 20  nArg = 0;.      
2f460 72 65 67 41 67 67 20 3d 20 30 3b 0a 20 20 20 20  regAgg = 0;.    
2f470 7d 0a 20 20 20 20 69 66 28 20 70 46 2d 3e 69 44  }.    if( pF->iD
2f480 69 73 74 69 6e 63 74 3e 3d 30 20 29 7b 0a 20 20  istinct>=0 ){.  
2f490 20 20 20 20 69 66 28 20 61 64 64 72 4e 65 78 74      if( addrNext
2f4a0 3d 3d 30 20 29 7b 20 0a 20 20 20 20 20 20 20 20  ==0 ){ .        
2f4b0 61 64 64 72 4e 65 78 74 20 3d 20 73 71 6c 69 74  addrNext = sqlit
2f4c0 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
2f4d0 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 7d  pParse);.      }
2f4e0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
2f4f0 20 6e 41 72 67 3d 3d 30 20 29 3b 20 20 2f 2a 20   nArg==0 );  /* 
2f500 45 72 72 6f 72 20 63 6f 6e 64 69 74 69 6f 6e 20  Error condition 
2f510 2a 2f 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  */.      testcas
2f520 65 28 20 6e 41 72 67 3e 31 20 29 3b 20 20 20 2f  e( nArg>1 );   /
2f530 2a 20 41 6c 73 6f 20 61 6e 20 65 72 72 6f 72 20  * Also an error 
2f540 2a 2f 0a 20 20 20 20 20 20 63 6f 64 65 44 69 73  */.      codeDis
2f550 74 69 6e 63 74 28 70 50 61 72 73 65 2c 20 70 46  tinct(pParse, pF
2f560 2d 3e 69 44 69 73 74 69 6e 63 74 2c 20 61 64 64  ->iDistinct, add
2f570 72 4e 65 78 74 2c 20 31 2c 20 72 65 67 41 67 67  rNext, 1, regAgg
2f580 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
2f590 20 70 46 2d 3e 70 46 75 6e 63 2d 3e 66 75 6e 63   pF->pFunc->func
2f5a0 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46  Flags & SQLITE_F
2f5b0 55 4e 43 5f 4e 45 45 44 43 4f 4c 4c 20 29 7b 0a  UNC_NEEDCOLL ){.
2f5c0 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70        CollSeq *p
2f5d0 43 6f 6c 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20  Coll = 0;.      
2f5e0 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f  struct ExprList_
2f5f0 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 20  item *pItem;.   
2f600 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20     int j;.      
2f610 61 73 73 65 72 74 28 20 70 4c 69 73 74 21 3d 30  assert( pList!=0
2f620 20 29 3b 20 20 2f 2a 20 70 4c 69 73 74 21 3d 30   );  /* pList!=0
2f630 20 69 66 20 70 46 2d 3e 70 46 75 6e 63 20 68 61   if pF->pFunc ha
2f640 73 20 4e 45 45 44 43 4f 4c 4c 20 2a 2f 0a 20 20  s NEEDCOLL */.  
2f650 20 20 20 20 66 6f 72 28 6a 3d 30 2c 20 70 49 74      for(j=0, pIt
2f660 65 6d 3d 70 4c 69 73 74 2d 3e 61 3b 20 21 70 43  em=pList->a; !pC
2f670 6f 6c 6c 20 26 26 20 6a 3c 6e 41 72 67 3b 20 6a  oll && j<nArg; j
2f680 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20  ++, pItem++){.  
2f690 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71        pColl = sq
2f6a0 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71  lite3ExprCollSeq
2f6b0 28 70 50 61 72 73 65 2c 20 70 49 74 65 6d 2d 3e  (pParse, pItem->
2f6c0 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 7d 0a  pExpr);.      }.
2f6d0 20 20 20 20 20 20 69 66 28 20 21 70 43 6f 6c 6c        if( !pColl
2f6e0 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43 6f 6c   ){.        pCol
2f6f0 6c 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e  l = pParse->db->
2f700 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20  pDfltColl;.     
2f710 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 65 67   }.      if( reg
2f720 48 69 74 3d 3d 30 20 26 26 20 70 41 67 67 49 6e  Hit==0 && pAggIn
2f730 66 6f 2d 3e 6e 41 63 63 75 6d 75 6c 61 74 6f 72  fo->nAccumulator
2f740 20 29 20 72 65 67 48 69 74 20 3d 20 2b 2b 70 50   ) regHit = ++pP
2f750 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20  arse->nMem;.    
2f760 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
2f770 4f 70 34 28 76 2c 20 4f 50 5f 43 6f 6c 6c 53 65  Op4(v, OP_CollSe
2f780 71 2c 20 72 65 67 48 69 74 2c 20 30 2c 20 30 2c  q, regHit, 0, 0,
2f790 20 28 63 68 61 72 20 2a 29 70 43 6f 6c 6c 2c 20   (char *)pColl, 
2f7a0 50 34 5f 43 4f 4c 4c 53 45 51 29 3b 0a 20 20 20  P4_COLLSEQ);.   
2f7b0 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64   }.    sqlite3Vd
2f7c0 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 41  beAddOp3(v, OP_A
2f7d0 67 67 53 74 65 70 2c 20 30 2c 20 72 65 67 41 67  ggStep, 0, regAg
2f7e0 67 2c 20 70 46 2d 3e 69 4d 65 6d 29 3b 0a 20 20  g, pF->iMem);.  
2f7f0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 70 70    sqlite3VdbeApp
2f800 65 6e 64 50 34 28 76 2c 20 70 46 2d 3e 70 46 75  endP4(v, pF->pFu
2f810 6e 63 2c 20 50 34 5f 46 55 4e 43 44 45 46 29 3b  nc, P4_FUNCDEF);
2f820 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
2f830 43 68 61 6e 67 65 50 35 28 76 2c 20 28 75 38 29  ChangeP5(v, (u8)
2f840 6e 41 72 67 29 3b 0a 20 20 20 20 73 71 6c 69 74  nArg);.    sqlit
2f850 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 61 6e  e3ReleaseTempRan
2f860 67 65 28 70 50 61 72 73 65 2c 20 72 65 67 41 67  ge(pParse, regAg
2f870 67 2c 20 6e 41 72 67 29 3b 0a 20 20 20 20 69 66  g, nArg);.    if
2f880 28 20 61 64 64 72 4e 65 78 74 20 29 7b 0a 20 20  ( addrNext ){.  
2f890 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52      sqlite3VdbeR
2f8a0 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61  esolveLabel(v, a
2f8b0 64 64 72 4e 65 78 74 29 3b 0a 20 20 20 20 7d 0a  ddrNext);.    }.
2f8c0 20 20 7d 0a 20 20 69 66 28 20 72 65 67 48 69 74    }.  if( regHit
2f8d0 3d 3d 30 20 26 26 20 70 41 67 67 49 6e 66 6f 2d  ==0 && pAggInfo-
2f8e0 3e 6e 41 63 63 75 6d 75 6c 61 74 6f 72 20 29 7b  >nAccumulator ){
2f8f0 0a 20 20 20 20 72 65 67 48 69 74 20 3d 20 72 65  .    regHit = re
2f900 67 41 63 63 3b 0a 20 20 7d 0a 20 20 69 66 28 20  gAcc;.  }.  if( 
2f910 72 65 67 48 69 74 20 29 7b 0a 20 20 20 20 61 64  regHit ){.    ad
2f920 64 72 48 69 74 54 65 73 74 20 3d 20 73 71 6c 69  drHitTest = sqli
2f930 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
2f940 20 4f 50 5f 49 66 2c 20 72 65 67 48 69 74 29 3b   OP_If, regHit);
2f950 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
2f960 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 2c  ;.  }.  for(i=0,
2f970 20 70 43 3d 70 41 67 67 49 6e 66 6f 2d 3e 61 43   pC=pAggInfo->aC
2f980 6f 6c 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e  ol; i<pAggInfo->
2f990 6e 41 63 63 75 6d 75 6c 61 74 6f 72 3b 20 69 2b  nAccumulator; i+
2f9a0 2b 2c 20 70 43 2b 2b 29 7b 0a 20 20 20 20 73 71  +, pC++){.    sq
2f9b0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50  lite3ExprCode(pP
2f9c0 61 72 73 65 2c 20 70 43 2d 3e 70 45 78 70 72 2c  arse, pC->pExpr,
2f9d0 20 70 43 2d 3e 69 4d 65 6d 29 3b 0a 20 20 7d 0a   pC->iMem);.  }.
2f9e0 20 20 70 41 67 67 49 6e 66 6f 2d 3e 64 69 72 65    pAggInfo->dire
2f9f0 63 74 4d 6f 64 65 20 3d 20 30 3b 0a 20 20 69 66  ctMode = 0;.  if
2fa00 28 20 61 64 64 72 48 69 74 54 65 73 74 20 29 7b  ( addrHitTest ){
2fa10 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
2fa20 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72  JumpHere(v, addr
2fa30 48 69 74 54 65 73 74 29 3b 0a 20 20 7d 0a 7d 0a  HitTest);.  }.}.
2fa40 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 73 69 6e  ./*.** Add a sin
2fa50 67 6c 65 20 4f 50 5f 45 78 70 6c 61 69 6e 20 69  gle OP_Explain i
2fa60 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f 20 74 68  nstruction to th
2fa70 65 20 56 44 42 45 20 74 6f 20 65 78 70 6c 61 69  e VDBE to explai
2fa80 6e 20 61 20 73 69 6d 70 6c 65 0a 2a 2a 20 63 6f  n a simple.** co
2fa90 75 6e 74 28 2a 29 20 71 75 65 72 79 20 28 22 53  unt(*) query ("S
2faa0 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46  ELECT count(*) F
2fab0 52 4f 4d 20 70 54 61 62 22 29 2e 0a 2a 2f 0a 23  ROM pTab")..*/.#
2fac0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
2fad0 49 54 5f 45 58 50 4c 41 49 4e 0a 73 74 61 74 69  IT_EXPLAIN.stati
2fae0 63 20 76 6f 69 64 20 65 78 70 6c 61 69 6e 53 69  c void explainSi
2faf0 6d 70 6c 65 43 6f 75 6e 74 28 0a 20 20 50 61 72  mpleCount(.  Par
2fb00 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
2fb10 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2fb20 50 61 72 73 65 20 63 6f 6e 74 65 78 74 20 2a 2f  Parse context */
2fb30 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 2c 20  .  Table *pTab, 
2fb40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2fb50 20 20 20 2f 2a 20 54 61 62 6c 65 20 62 65 69 6e     /* Table bein
2fb60 67 20 71 75 65 72 69 65 64 20 2a 2f 0a 20 20 49  g queried */.  I
2fb70 6e 64 65 78 20 2a 70 49 64 78 20 20 20 20 20 20  ndex *pIdx      
2fb80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2fb90 2a 20 49 6e 64 65 78 20 75 73 65 64 20 74 6f 20  * Index used to 
2fba0 6f 70 74 69 6d 69 7a 65 20 73 63 61 6e 2c 20 6f  optimize scan, o
2fbb0 72 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 69  r NULL */.){.  i
2fbc0 66 28 20 70 50 61 72 73 65 2d 3e 65 78 70 6c 61  f( pParse->expla
2fbd0 69 6e 3d 3d 32 20 29 7b 0a 20 20 20 20 69 6e 74  in==2 ){.    int
2fbe0 20 62 43 6f 76 65 72 20 3d 20 28 70 49 64 78 21   bCover = (pIdx!
2fbf0 3d 30 20 26 26 20 28 48 61 73 52 6f 77 69 64 28  =0 && (HasRowid(
2fc00 70 54 61 62 29 20 7c 7c 20 21 49 73 50 72 69 6d  pTab) || !IsPrim
2fc10 61 72 79 4b 65 79 49 6e 64 65 78 28 70 49 64 78  aryKeyIndex(pIdx
2fc20 29 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  )));.    sqlite3
2fc30 56 64 62 65 45 78 70 6c 61 69 6e 28 70 50 61 72  VdbeExplain(pPar
2fc40 73 65 2c 20 30 2c 20 22 53 43 41 4e 20 54 41 42  se, 0, "SCAN TAB
2fc50 4c 45 20 25 73 25 73 25 73 22 2c 0a 20 20 20 20  LE %s%s%s",.    
2fc60 20 20 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c      pTab->zName,
2fc70 0a 20 20 20 20 20 20 20 20 62 43 6f 76 65 72 20  .        bCover 
2fc80 3f 20 22 20 55 53 49 4e 47 20 43 4f 56 45 52 49  ? " USING COVERI
2fc90 4e 47 20 49 4e 44 45 58 20 22 20 3a 20 22 22 2c  NG INDEX " : "",
2fca0 0a 20 20 20 20 20 20 20 20 62 43 6f 76 65 72 20  .        bCover 
2fcb0 3f 20 70 49 64 78 2d 3e 7a 4e 61 6d 65 20 3a 20  ? pIdx->zName : 
2fcc0 22 22 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 7d 0a  "".    );.  }.}.
2fcd0 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 65  #else.# define e
2fce0 78 70 6c 61 69 6e 53 69 6d 70 6c 65 43 6f 75 6e  xplainSimpleCoun
2fcf0 74 28 61 2c 62 2c 63 29 0a 23 65 6e 64 69 66 0a  t(a,b,c).#endif.
2fd00 0a 2f 2a 0a 2a 2a 20 73 71 6c 69 74 65 33 57 61  ./*.** sqlite3Wa
2fd10 6c 6b 45 78 70 72 28 29 20 63 61 6c 6c 62 61 63  lkExpr() callbac
2fd20 6b 20 75 73 65 64 20 62 79 20 68 61 76 69 6e 67  k used by having
2fd30 54 6f 57 68 65 72 65 28 29 2e 0a 2a 2a 0a 2a 2a  ToWhere()..**.**
2fd40 20 49 66 20 74 68 65 20 6e 6f 64 65 20 70 61 73   If the node pas
2fd50 73 65 64 20 74 6f 20 74 68 65 20 63 61 6c 6c 62  sed to the callb
2fd60 61 63 6b 20 69 73 20 61 20 54 4b 5f 41 4e 44 20  ack is a TK_AND 
2fd70 6e 6f 64 65 2c 20 72 65 74 75 72 6e 20 0a 2a 2a  node, return .**
2fd80 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 20 74 6f   WRC_Continue to
2fd90 20 74 65 6c 6c 20 73 71 6c 69 74 65 33 57 61 6c   tell sqlite3Wal
2fda0 6b 45 78 70 72 28 29 20 74 6f 20 69 74 65 72 61  kExpr() to itera
2fdb0 74 65 20 74 68 72 6f 75 67 68 20 63 68 69 6c 64  te through child
2fdc0 20 6e 6f 64 65 73 2e 0a 2a 2a 0a 2a 2a 20 4f 74   nodes..**.** Ot
2fdd0 68 65 72 77 69 73 65 2c 20 72 65 74 75 72 6e 20  herwise, return 
2fde0 57 52 43 5f 50 72 75 6e 65 2e 20 49 6e 20 74 68  WRC_Prune. In th
2fdf0 69 73 20 63 61 73 65 2c 20 61 6c 73 6f 20 63 68  is case, also ch
2fe00 65 63 6b 20 69 66 20 74 68 65 20 0a 2a 2a 20 73  eck if the .** s
2fe10 75 62 2d 65 78 70 72 65 73 73 69 6f 6e 20 6d 61  ub-expression ma
2fe20 74 63 68 65 73 20 74 68 65 20 63 72 69 74 65 72  tches the criter
2fe30 69 61 20 66 6f 72 20 62 65 69 6e 67 20 6d 6f 76  ia for being mov
2fe40 65 64 20 74 6f 20 74 68 65 20 57 48 45 52 45 0a  ed to the WHERE.
2fe50 2a 2a 20 63 6c 61 75 73 65 2e 20 49 66 20 73 6f  ** clause. If so
2fe60 2c 20 61 64 64 20 69 74 20 74 6f 20 74 68 65 20  , add it to the 
2fe70 57 48 45 52 45 20 63 6c 61 75 73 65 20 61 6e 64  WHERE clause and
2fe80 20 72 65 70 6c 61 63 65 20 74 68 65 20 73 75 62   replace the sub
2fe90 2d 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 77  -expression.** w
2fea0 69 74 68 69 6e 20 74 68 65 20 48 41 56 49 4e 47  ithin the HAVING
2feb0 20 65 78 70 72 65 73 73 69 6f 6e 20 77 69 74 68   expression with
2fec0 20 61 20 63 6f 6e 73 74 61 6e 74 20 22 31 22 2e   a constant "1".
2fed0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 68  .*/.static int h
2fee0 61 76 69 6e 67 54 6f 57 68 65 72 65 45 78 70 72  avingToWhereExpr
2fef0 43 62 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b  Cb(Walker *pWalk
2ff00 65 72 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29  er, Expr *pExpr)
2ff10 7b 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f  {.  if( pExpr->o
2ff20 70 21 3d 54 4b 5f 41 4e 44 20 29 7b 0a 20 20 20  p!=TK_AND ){.   
2ff30 20 53 65 6c 65 63 74 20 2a 70 53 20 3d 20 70 57   Select *pS = pW
2ff40 61 6c 6b 65 72 2d 3e 75 2e 70 53 65 6c 65 63 74  alker->u.pSelect
2ff50 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  ;.    if( sqlite
2ff60 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 4f  3ExprIsConstantO
2ff70 72 47 72 6f 75 70 42 79 28 70 57 61 6c 6b 65 72  rGroupBy(pWalker
2ff80 2d 3e 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c  ->pParse, pExpr,
2ff90 20 70 53 2d 3e 70 47 72 6f 75 70 42 79 29 20 29   pS->pGroupBy) )
2ffa0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 20  {.      sqlite3 
2ffb0 2a 64 62 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 70  *db = pWalker->p
2ffc0 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 20 20 20  Parse->db;.     
2ffd0 20 45 78 70 72 20 2a 70 4e 65 77 20 3d 20 73 71   Expr *pNew = sq
2ffe0 6c 69 74 65 33 45 78 70 72 41 6c 6c 6f 63 28 64  lite3ExprAlloc(d
2fff0 62 2c 20 54 4b 5f 49 4e 54 45 47 45 52 2c 20 26  b, TK_INTEGER, &
30000 73 71 6c 69 74 65 33 49 6e 74 54 6f 6b 65 6e 73  sqlite3IntTokens
30010 5b 31 5d 2c 20 30 29 3b 0a 20 20 20 20 20 20 69  [1], 0);.      i
30020 66 28 20 70 4e 65 77 20 29 7b 0a 20 20 20 20 20  f( pNew ){.     
30030 20 20 20 45 78 70 72 20 2a 70 57 68 65 72 65 20     Expr *pWhere 
30040 3d 20 70 53 2d 3e 70 57 68 65 72 65 3b 0a 20 20  = pS->pWhere;.  
30050 20 20 20 20 20 20 53 57 41 50 28 45 78 70 72 2c        SWAP(Expr,
30060 20 2a 70 4e 65 77 2c 20 2a 70 45 78 70 72 29 3b   *pNew, *pExpr);
30070 0a 20 20 20 20 20 20 20 20 70 4e 65 77 20 3d 20  .        pNew = 
30080 73 71 6c 69 74 65 33 45 78 70 72 41 6e 64 28 70  sqlite3ExprAnd(p
30090 57 61 6c 6b 65 72 2d 3e 70 50 61 72 73 65 2c 20  Walker->pParse, 
300a0 70 57 68 65 72 65 2c 20 70 4e 65 77 29 3b 0a 20  pWhere, pNew);. 
300b0 20 20 20 20 20 20 20 70 53 2d 3e 70 57 68 65 72         pS->pWher
300c0 65 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 20 20  e = pNew;.      
300d0 20 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65    pWalker->eCode
300e0 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 1;.      }.  
300f0 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 57    }.    return W
30100 52 43 5f 50 72 75 6e 65 3b 0a 20 20 7d 0a 20 20  RC_Prune;.  }.  
30110 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69  return WRC_Conti
30120 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72  nue;.}../*.** Tr
30130 61 6e 73 66 65 72 20 65 6c 69 67 69 62 6c 65 20  ansfer eligible 
30140 74 65 72 6d 73 20 66 72 6f 6d 20 74 68 65 20 48  terms from the H
30150 41 56 49 4e 47 20 63 6c 61 75 73 65 20 6f 66 20  AVING clause of 
30160 61 20 71 75 65 72 79 2c 20 77 68 69 63 68 20 69  a query, which i
30170 73 0a 2a 2a 20 70 72 6f 63 65 73 73 65 64 20 61  s.** processed a
30180 66 74 65 72 20 67 72 6f 75 70 69 6e 67 2c 20 74  fter grouping, t
30190 6f 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  o the WHERE clau
301a0 73 65 2c 20 77 68 69 63 68 20 69 73 20 70 72 6f  se, which is pro
301b0 63 65 73 73 65 64 20 62 65 66 6f 72 65 0a 2a 2a  cessed before.**
301c0 20 67 72 6f 75 70 69 6e 67 2e 20 46 6f 72 20 65   grouping. For e
301d0 78 61 6d 70 6c 65 2c 20 74 68 65 20 71 75 65 72  xample, the quer
301e0 79 3a 0a 2a 2a 0a 2a 2a 20 20 20 53 45 4c 45 43  y:.**.**   SELEC
301f0 54 20 2a 20 46 52 4f 4d 20 3c 74 61 62 6c 65 73  T * FROM <tables
30200 3e 20 57 48 45 52 45 20 61 3d 3f 20 47 52 4f 55  > WHERE a=? GROU
30210 50 20 42 59 20 62 20 48 41 56 49 4e 47 20 62 3d  P BY b HAVING b=
30220 3f 20 41 4e 44 20 63 3d 3f 0a 2a 2a 0a 2a 2a 20  ? AND c=?.**.** 
30230 63 61 6e 20 62 65 20 72 65 77 72 69 74 74 65 6e  can be rewritten
30240 20 61 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 53 45 4c   as:.**.**   SEL
30250 45 43 54 20 2a 20 46 52 4f 4d 20 3c 74 61 62 6c  ECT * FROM <tabl
30260 65 73 3e 20 57 48 45 52 45 20 61 3d 3f 20 41 4e  es> WHERE a=? AN
30270 44 20 62 3d 3f 20 47 52 4f 55 50 20 42 59 20 62  D b=? GROUP BY b
30280 20 48 41 56 49 4e 47 20 63 3d 3f 0a 2a 2a 0a 2a   HAVING c=?.**.*
30290 2a 20 41 20 74 65 72 6d 20 6f 66 20 74 68 65 20  * A term of the 
302a0 48 41 56 49 4e 47 20 65 78 70 72 65 73 73 69 6f  HAVING expressio
302b0 6e 20 69 73 20 65 6c 69 67 69 62 6c 65 20 66 6f  n is eligible fo
302c0 72 20 74 72 61 6e 73 66 65 72 20 69 66 20 69 74  r transfer if it
302d0 20 63 6f 6e 73 69 73 74 73 0a 2a 2a 20 65 6e 74   consists.** ent
302e0 69 72 65 6c 79 20 6f 66 20 63 6f 6e 73 74 61 6e  irely of constan
302f0 74 73 20 61 6e 64 20 65 78 70 72 65 73 73 69 6f  ts and expressio
30300 6e 73 20 74 68 61 74 20 61 72 65 20 61 6c 73 6f  ns that are also
30310 20 47 52 4f 55 50 20 42 59 20 74 65 72 6d 73 20   GROUP BY terms 
30320 74 68 61 74 0a 2a 2a 20 75 73 65 20 74 68 65 20  that.** use the 
30330 22 42 49 4e 41 52 59 22 20 63 6f 6c 6c 61 74 69  "BINARY" collati
30340 6f 6e 20 73 65 71 75 65 6e 63 65 2e 0a 2a 2f 0a  on sequence..*/.
30350 73 74 61 74 69 63 20 76 6f 69 64 20 68 61 76 69  static void havi
30360 6e 67 54 6f 57 68 65 72 65 28 50 61 72 73 65 20  ngToWhere(Parse 
30370 2a 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74 20  *pParse, Select 
30380 2a 70 29 7b 0a 20 20 57 61 6c 6b 65 72 20 73 57  *p){.  Walker sW
30390 61 6c 6b 65 72 3b 0a 20 20 6d 65 6d 73 65 74 28  alker;.  memset(
303a0 26 73 57 61 6c 6b 65 72 2c 20 30 2c 20 73 69 7a  &sWalker, 0, siz
303b0 65 6f 66 28 73 57 61 6c 6b 65 72 29 29 3b 0a 20  eof(sWalker));. 
303c0 20 73 57 61 6c 6b 65 72 2e 70 50 61 72 73 65 20   sWalker.pParse 
303d0 3d 20 70 50 61 72 73 65 3b 0a 20 20 73 57 61 6c  = pParse;.  sWal
303e0 6b 65 72 2e 78 45 78 70 72 43 61 6c 6c 62 61 63  ker.xExprCallbac
303f0 6b 20 3d 20 68 61 76 69 6e 67 54 6f 57 68 65 72  k = havingToWher
30400 65 45 78 70 72 43 62 3b 0a 20 20 73 57 61 6c 6b  eExprCb;.  sWalk
30410 65 72 2e 75 2e 70 53 65 6c 65 63 74 20 3d 20 70  er.u.pSelect = p
30420 3b 0a 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 45  ;.  sqlite3WalkE
30430 78 70 72 28 26 73 57 61 6c 6b 65 72 2c 20 70 2d  xpr(&sWalker, p-
30440 3e 70 48 61 76 69 6e 67 29 3b 0a 23 69 66 20 53  >pHaving);.#if S
30450 45 4c 45 43 54 54 52 41 43 45 5f 45 4e 41 42 4c  ELECTTRACE_ENABL
30460 45 44 0a 20 20 69 66 28 20 73 57 61 6c 6b 65 72  ED.  if( sWalker
30470 2e 65 43 6f 64 65 20 26 26 20 28 73 71 6c 69 74  .eCode && (sqlit
30480 65 33 53 65 6c 65 63 74 54 72 61 63 65 20 26 20  e3SelectTrace & 
30490 30 78 31 30 30 29 21 3d 30 20 29 7b 0a 20 20 20  0x100)!=0 ){.   
304a0 20 53 45 4c 45 43 54 54 52 41 43 45 28 30 78 31   SELECTTRACE(0x1
304b0 30 30 2c 70 50 61 72 73 65 2c 70 2c 28 22 4d 6f  00,pParse,p,("Mo
304c0 76 65 20 48 41 56 49 4e 47 20 74 65 72 6d 73 20  ve HAVING terms 
304d0 69 6e 74 6f 20 57 48 45 52 45 3a 5c 6e 22 29 29  into WHERE:\n"))
304e0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 54 72 65  ;.    sqlite3Tre
304f0 65 56 69 65 77 53 65 6c 65 63 74 28 30 2c 20 70  eViewSelect(0, p
30500 2c 20 30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  , 0);.  }.#endif
30510 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20  .}../*.** Check 
30520 74 6f 20 73 65 65 20 69 66 20 74 68 65 20 70 54  to see if the pT
30530 68 69 73 20 65 6e 74 72 79 20 6f 66 20 70 54 61  his entry of pTa
30540 62 4c 69 73 74 20 69 73 20 61 20 73 65 6c 66 2d  bList is a self-
30550 6a 6f 69 6e 20 6f 66 20 61 20 70 72 69 6f 72 20  join of a prior 
30560 76 69 65 77 2e 0a 2a 2a 20 49 66 20 69 74 20 69  view..** If it i
30570 73 2c 20 74 68 65 6e 20 72 65 74 75 72 6e 20 74  s, then return t
30580 68 65 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  he SrcList_item 
30590 66 6f 72 20 74 68 65 20 70 72 69 6f 72 20 76 69  for the prior vi
305a0 65 77 2e 20 20 49 66 20 69 74 20 69 73 20 6e 6f  ew.  If it is no
305b0 74 2c 0a 2a 2a 20 74 68 65 6e 20 72 65 74 75 72  t,.** then retur
305c0 6e 20 30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 73  n 0..*/.static s
305d0 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
305e0 65 6d 20 2a 69 73 53 65 6c 66 4a 6f 69 6e 56 69  em *isSelfJoinVi
305f0 65 77 28 0a 20 20 53 72 63 4c 69 73 74 20 2a 70  ew(.  SrcList *p
30600 54 61 62 4c 69 73 74 2c 20 20 20 20 20 20 20 20  TabList,        
30610 20 20 20 2f 2a 20 53 65 61 72 63 68 20 66 6f 72     /* Search for
30620 20 73 65 6c 66 2d 6a 6f 69 6e 73 20 69 6e 20 74   self-joins in t
30630 68 69 73 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  his FROM clause 
30640 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c  */.  struct SrcL
30650 69 73 74 5f 69 74 65 6d 20 2a 70 54 68 69 73 20  ist_item *pThis 
30660 20 20 2f 2a 20 53 65 61 72 63 68 20 66 6f 72 20    /* Search for 
30670 70 72 69 6f 72 20 72 65 66 65 72 65 6e 63 65 20  prior reference 
30680 74 6f 20 74 68 69 73 20 73 75 62 71 75 65 72 79  to this subquery
30690 20 2a 2f 0a 29 7b 0a 20 20 73 74 72 75 63 74 20   */.){.  struct 
306a0 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  SrcList_item *pI
306b0 74 65 6d 3b 0a 20 20 66 6f 72 28 70 49 74 65 6d  tem;.  for(pItem
306c0 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61 3b 20   = pTabList->a; 
306d0 70 49 74 65 6d 3c 70 54 68 69 73 3b 20 70 49 74  pItem<pThis; pIt
306e0 65 6d 2b 2b 29 7b 0a 20 20 20 20 53 65 6c 65 63  em++){.    Selec
306f0 74 20 2a 70 53 31 3b 0a 20 20 20 20 69 66 28 20  t *pS1;.    if( 
30700 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 3d 3d  pItem->pSelect==
30710 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  0 ) continue;.  
30720 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 66 67 2e    if( pItem->fg.
30730 76 69 61 43 6f 72 6f 75 74 69 6e 65 20 29 20 63  viaCoroutine ) c
30740 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28  ontinue;.    if(
30750 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 3d 3d 30   pItem->zName==0
30760 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
30770 20 61 73 73 65 72 74 28 20 70 49 74 65 6d 2d 3e   assert( pItem->
30780 70 54 61 62 21 3d 30 20 29 3b 0a 20 20 20 20 61  pTab!=0 );.    a
30790 73 73 65 72 74 28 20 70 54 68 69 73 2d 3e 70 54  ssert( pThis->pT
307a0 61 62 21 3d 30 20 29 3b 0a 20 20 20 20 69 66 28  ab!=0 );.    if(
307b0 20 70 49 74 65 6d 2d 3e 70 54 61 62 2d 3e 70 53   pItem->pTab->pS
307c0 63 68 65 6d 61 21 3d 70 54 68 69 73 2d 3e 70 54  chema!=pThis->pT
307d0 61 62 2d 3e 70 53 63 68 65 6d 61 20 29 20 63 6f  ab->pSchema ) co
307e0 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20  ntinue;.    if( 
307f0 73 71 6c 69 74 65 33 5f 73 74 72 69 63 6d 70 28  sqlite3_stricmp(
30800 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 2c 20 70 54  pItem->zName, pT
30810 68 69 73 2d 3e 7a 4e 61 6d 65 29 21 3d 30 20 29  his->zName)!=0 )
30820 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 70   continue;.    p
30830 53 31 20 3d 20 70 49 74 65 6d 2d 3e 70 53 65 6c  S1 = pItem->pSel
30840 65 63 74 3b 0a 20 20 20 20 69 66 28 20 70 49 74  ect;.    if( pIt
30850 65 6d 2d 3e 70 54 61 62 2d 3e 70 53 63 68 65 6d  em->pTab->pSchem
30860 61 3d 3d 30 20 26 26 20 70 54 68 69 73 2d 3e 70  a==0 && pThis->p
30870 53 65 6c 65 63 74 2d 3e 73 65 6c 49 64 21 3d 70  Select->selId!=p
30880 53 31 2d 3e 73 65 6c 49 64 20 29 7b 0a 20 20 20  S1->selId ){.   
30890 20 20 20 2f 2a 20 54 68 65 20 71 75 65 72 79 20     /* The query 
308a0 66 6c 61 74 74 65 6e 65 72 20 6c 65 66 74 20 74  flattener left t
308b0 77 6f 20 64 69 66 66 65 72 65 6e 74 20 43 54 45  wo different CTE
308c0 20 74 61 62 6c 65 73 20 77 69 74 68 20 69 64 65   tables with ide
308d0 6e 74 69 63 61 6c 0a 20 20 20 20 20 20 2a 2a 20  ntical.      ** 
308e0 6e 61 6d 65 73 20 69 6e 20 74 68 65 20 73 61 6d  names in the sam
308f0 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20 2a  e FROM clause. *
30900 2f 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65  /.      continue
30910 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
30920 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61  sqlite3ExprCompa
30930 72 65 28 30 2c 20 70 54 68 69 73 2d 3e 70 53 65  re(0, pThis->pSe
30940 6c 65 63 74 2d 3e 70 57 68 65 72 65 2c 20 70 53  lect->pWhere, pS
30950 31 2d 3e 70 57 68 65 72 65 2c 20 2d 31 29 0a 20  1->pWhere, -1). 
30960 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 45 78      || sqlite3Ex
30970 70 72 43 6f 6d 70 61 72 65 28 30 2c 20 70 54 68  prCompare(0, pTh
30980 69 73 2d 3e 70 53 65 6c 65 63 74 2d 3e 70 48 61  is->pSelect->pHa
30990 76 69 6e 67 2c 20 70 53 31 2d 3e 70 48 61 76 69  ving, pS1->pHavi
309a0 6e 67 2c 20 2d 31 29 20 0a 20 20 20 20 29 7b 0a  ng, -1) .    ){.
309b0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 76 69 65        /* The vie
309c0 77 20 77 61 73 20 6d 6f 64 69 66 69 65 64 20 62  w was modified b
309d0 79 20 73 6f 6d 65 20 6f 74 68 65 72 20 6f 70 74  y some other opt
309e0 69 6d 69 7a 61 74 69 6f 6e 20 73 75 63 68 20 61  imization such a
309f0 73 0a 20 20 20 20 20 20 2a 2a 20 70 75 73 68 44  s.      ** pushD
30a00 6f 77 6e 57 68 65 72 65 54 65 72 6d 73 28 29 20  ownWhereTerms() 
30a10 2a 2f 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75  */.      continu
30a20 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74  e;.    }.    ret
30a30 75 72 6e 20 70 49 74 65 6d 3b 0a 20 20 7d 0a 20  urn pItem;.  }. 
30a40 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 23 69   return 0;.}..#i
30a50 66 64 65 66 20 53 51 4c 49 54 45 5f 43 4f 55 4e  fdef SQLITE_COUN
30a60 54 4f 46 56 49 45 57 5f 4f 50 54 49 4d 49 5a 41  TOFVIEW_OPTIMIZA
30a70 54 49 4f 4e 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d  TION./*.** Attem
30a80 70 74 20 74 6f 20 74 72 61 6e 73 66 6f 72 6d 20  pt to transform 
30a90 61 20 71 75 65 72 79 20 6f 66 20 74 68 65 20 66  a query of the f
30aa0 6f 72 6d 0a 2a 2a 0a 2a 2a 20 20 20 20 53 45 4c  orm.**.**    SEL
30ab0 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f  ECT count(*) FRO
30ac0 4d 20 28 53 45 4c 45 43 54 20 78 20 46 52 4f 4d  M (SELECT x FROM
30ad0 20 74 31 20 55 4e 49 4f 4e 20 41 4c 4c 20 53 45   t1 UNION ALL SE
30ae0 4c 45 43 54 20 79 20 46 52 4f 4d 20 74 32 29 0a  LECT y FROM t2).
30af0 2a 2a 0a 2a 2a 20 49 6e 74 6f 20 74 68 69 73 3a  **.** Into this:
30b00 0a 2a 2a 0a 2a 2a 20 20 20 20 53 45 4c 45 43 54  .**.**    SELECT
30b10 20 28 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a   (SELECT count(*
30b20 29 20 46 52 4f 4d 20 74 31 29 2b 28 53 45 4c 45  ) FROM t1)+(SELE
30b30 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d  CT count(*) FROM
30b40 20 74 32 29 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74   t2).**.** The t
30b50 72 61 6e 73 66 6f 72 6d 61 74 69 6f 6e 20 6f 6e  ransformation on
30b60 6c 79 20 77 6f 72 6b 73 20 69 66 20 61 6c 6c 20  ly works if all 
30b70 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
30b80 20 61 72 65 20 74 72 75 65 3a 0a 2a 2a 0a 2a 2a   are true:.**.**
30b90 20 20 20 2a 20 20 54 68 65 20 73 75 62 71 75 65     *  The subque
30ba0 72 79 20 69 73 20 61 20 55 4e 49 4f 4e 20 41 4c  ry is a UNION AL
30bb0 4c 20 6f 66 20 74 77 6f 20 6f 72 20 6d 6f 72 65  L of two or more
30bc0 20 74 65 72 6d 73 0a 2a 2a 20 20 20 2a 20 20 54   terms.**   *  T
30bd0 68 65 20 73 75 62 71 75 65 72 79 20 64 6f 65 73  he subquery does
30be0 20 6e 6f 74 20 68 61 76 65 20 61 20 4c 49 4d 49   not have a LIMI
30bf0 54 20 63 6c 61 75 73 65 0a 2a 2a 20 20 20 2a 20  T clause.**   * 
30c00 20 54 68 65 72 65 20 69 73 20 6e 6f 20 57 48 45   There is no WHE
30c10 52 45 20 6f 72 20 47 52 4f 55 50 20 42 59 20 6f  RE or GROUP BY o
30c20 72 20 48 41 56 49 4e 47 20 63 6c 61 75 73 65 73  r HAVING clauses
30c30 20 6f 6e 20 74 68 65 20 73 75 62 71 75 65 72 69   on the subqueri
30c40 65 73 0a 2a 2a 20 20 20 2a 20 20 54 68 65 20 6f  es.**   *  The o
30c50 75 74 65 72 20 71 75 65 72 79 20 69 73 20 61 20  uter query is a 
30c60 73 69 6d 70 6c 65 20 63 6f 75 6e 74 28 2a 29 20  simple count(*) 
30c70 77 69 74 68 20 6e 6f 20 57 48 45 52 45 20 63 6c  with no WHERE cl
30c80 61 75 73 65 20 6f 72 20 6f 74 68 65 72 0a 2a 2a  ause or other.**
30c90 20 20 20 20 20 20 65 78 74 72 61 6e 65 6f 75 73        extraneous
30ca0 20 73 79 6e 74 61 78 2e 0a 2a 2a 0a 2a 2a 20 52   syntax..**.** R
30cb0 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 74 68  eturn TRUE if th
30cc0 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69  e optimization i
30cd0 73 20 75 6e 64 65 72 74 61 6b 65 6e 2e 0a 2a 2f  s undertaken..*/
30ce0 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f 75 6e  .static int coun
30cf0 74 4f 66 56 69 65 77 4f 70 74 69 6d 69 7a 61 74  tOfViewOptimizat
30d00 69 6f 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73  ion(Parse *pPars
30d10 65 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20  e, Select *p){. 
30d20 20 53 65 6c 65 63 74 20 2a 70 53 75 62 2c 20 2a   Select *pSub, *
30d30 70 50 72 69 6f 72 3b 0a 20 20 45 78 70 72 20 2a  pPrior;.  Expr *
30d40 70 45 78 70 72 3b 0a 20 20 45 78 70 72 20 2a 70  pExpr;.  Expr *p
30d50 43 6f 75 6e 74 3b 0a 20 20 73 71 6c 69 74 65 33  Count;.  sqlite3
30d60 20 2a 64 62 3b 0a 20 20 69 66 28 20 28 70 2d 3e   *db;.  if( (p->
30d70 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 41 67  selFlags & SF_Ag
30d80 67 72 65 67 61 74 65 29 3d 3d 30 20 29 20 72 65  gregate)==0 ) re
30d90 74 75 72 6e 20 30 3b 20 20 20 2f 2a 20 54 68 69  turn 0;   /* Thi
30da0 73 20 69 73 20 61 6e 20 61 67 67 72 65 67 61 74  s is an aggregat
30db0 65 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 45  e */.  if( p->pE
30dc0 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d 31 20 29  List->nExpr!=1 )
30dd0 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20   return 0;      
30de0 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 6e 67           /* Sing
30df0 6c 65 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e  le result column
30e00 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 57 68   */.  if( p->pWh
30e10 65 72 65 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ere ) return 0;.
30e20 20 20 69 66 28 20 70 2d 3e 70 47 72 6f 75 70 42    if( p->pGroupB
30e30 79 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  y ) return 0;.  
30e40 70 45 78 70 72 20 3d 20 70 2d 3e 70 45 4c 69 73  pExpr = p->pELis
30e50 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20  t->a[0].pExpr;. 
30e60 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d   if( pExpr->op!=
30e70 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 20  TK_AGG_FUNCTION 
30e80 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20  ) return 0;     
30e90 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 69 73 20     /* Result is 
30ea0 61 6e 20 61 67 67 72 65 67 61 74 65 20 2a 2f 0a  an aggregate */.
30eb0 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73 74    if( sqlite3_st
30ec0 72 69 63 6d 70 28 70 45 78 70 72 2d 3e 75 2e 7a  ricmp(pExpr->u.z
30ed0 54 6f 6b 65 6e 2c 22 63 6f 75 6e 74 22 29 20 29  Token,"count") )
30ee0 20 72 65 74 75 72 6e 20 30 3b 20 20 2f 2a 20 49   return 0;  /* I
30ef0 73 20 63 6f 75 6e 74 28 29 20 2a 2f 0a 20 20 69  s count() */.  i
30f00 66 28 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73  f( pExpr->x.pLis
30f10 74 21 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  t!=0 ) return 0;
30f20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30f30 20 2f 2a 20 4d 75 73 74 20 62 65 20 63 6f 75 6e   /* Must be coun
30f40 74 28 2a 29 20 2a 2f 0a 20 20 69 66 28 20 70 2d  t(*) */.  if( p-
30f50 3e 70 53 72 63 2d 3e 6e 53 72 63 21 3d 31 20 29  >pSrc->nSrc!=1 )
30f60 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20   return 0;      
30f70 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
30f80 6e 65 20 74 61 62 6c 65 20 69 6e 20 46 52 4f 4d  ne table in FROM
30f90 20 20 2a 2f 0a 20 20 70 53 75 62 20 3d 20 70 2d    */.  pSub = p-
30fa0 3e 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 53 65 6c  >pSrc->a[0].pSel
30fb0 65 63 74 3b 0a 20 20 69 66 28 20 70 53 75 62 3d  ect;.  if( pSub=
30fc0 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20  =0 ) return 0;  
30fd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30fe0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
30ff0 46 52 4f 4d 20 69 73 20 61 20 73 75 62 71 75 65  FROM is a subque
31000 72 79 20 2a 2f 0a 20 20 69 66 28 20 70 53 75 62  ry */.  if( pSub
31010 2d 3e 70 50 72 69 6f 72 3d 3d 30 20 29 20 72 65  ->pPrior==0 ) re
31020 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20  turn 0;         
31030 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 75 73            /* Mus
31040 74 20 62 65 20 61 20 63 6f 6d 70 6f 75 6e 64 20  t be a compound 
31050 72 79 20 2a 2f 0a 20 20 64 6f 7b 0a 20 20 20 20  ry */.  do{.    
31060 69 66 28 20 70 53 75 62 2d 3e 6f 70 21 3d 54 4b  if( pSub->op!=TK
31070 5f 41 4c 4c 20 26 26 20 70 53 75 62 2d 3e 70 50  _ALL && pSub->pP
31080 72 69 6f 72 20 29 20 72 65 74 75 72 6e 20 30 3b  rior ) return 0;
31090 20 20 2f 2a 20 4d 75 73 74 20 62 65 20 55 4e 49    /* Must be UNI
310a0 4f 4e 20 41 4c 4c 20 2a 2f 0a 20 20 20 20 69 66  ON ALL */.    if
310b0 28 20 70 53 75 62 2d 3e 70 57 68 65 72 65 20 29  ( pSub->pWhere )
310c0 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20   return 0;      
310d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
310e0 2f 2a 20 4e 6f 20 57 48 45 52 45 20 63 6c 61 75  /* No WHERE clau
310f0 73 65 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 53  se */.    if( pS
31100 75 62 2d 3e 70 4c 69 6d 69 74 20 29 20 72 65 74  ub->pLimit ) ret
31110 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20  urn 0;          
31120 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
31130 6f 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 20 2a  o LIMIT clause *
31140 2f 0a 20 20 20 20 69 66 28 20 70 53 75 62 2d 3e  /.    if( pSub->
31150 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 41 67  selFlags & SF_Ag
31160 67 72 65 67 61 74 65 20 29 20 72 65 74 75 72 6e  gregate ) return
31170 20 30 3b 20 20 20 20 20 2f 2a 20 4e 6f 74 20 61   0;     /* Not a
31180 6e 20 61 67 67 72 65 67 61 74 65 20 2a 2f 0a 20  n aggregate */. 
31190 20 20 20 70 53 75 62 20 3d 20 70 53 75 62 2d 3e     pSub = pSub->
311a0 70 50 72 69 6f 72 3b 20 20 20 20 20 20 20 20 20  pPrior;         
311b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
311c0 20 20 20 20 20 2f 2a 20 52 65 70 65 61 74 20 6f       /* Repeat o
311d0 76 65 72 20 63 6f 6d 70 6f 75 6e 64 20 2a 2f 0a  ver compound */.
311e0 20 20 7d 77 68 69 6c 65 28 20 70 53 75 62 20 29    }while( pSub )
311f0 3b 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 72 65  ;..  /* If we re
31200 61 63 68 20 74 68 69 73 20 70 6f 69 6e 74 20 74  ach this point t
31210 68 65 6e 20 69 74 20 69 73 20 4f 4b 20 74 6f 20  hen it is OK to 
31220 70 65 72 66 6f 72 6d 20 74 68 65 20 74 72 61 6e  perform the tran
31230 73 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a 0a 20  sformation */.. 
31240 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62   db = pParse->db
31250 3b 0a 20 20 70 43 6f 75 6e 74 20 3d 20 70 45 78  ;.  pCount = pEx
31260 70 72 3b 0a 20 20 70 45 78 70 72 20 3d 20 30 3b  pr;.  pExpr = 0;
31270 0a 20 20 70 53 75 62 20 3d 20 70 2d 3e 70 53 72  .  pSub = p->pSr
31280 63 2d 3e 61 5b 30 5d 2e 70 53 65 6c 65 63 74 3b  c->a[0].pSelect;
31290 0a 20 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 30 5d  .  p->pSrc->a[0]
312a0 2e 70 53 65 6c 65 63 74 20 3d 20 30 3b 0a 20 20  .pSelect = 0;.  
312b0 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44 65  sqlite3SrcListDe
312c0 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 53 72 63  lete(db, p->pSrc
312d0 29 3b 0a 20 20 70 2d 3e 70 53 72 63 20 3d 20 73  );.  p->pSrc = s
312e0 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65  qlite3DbMallocZe
312f0 72 6f 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 73  ro(pParse->db, s
31300 69 7a 65 6f 66 28 2a 70 2d 3e 70 53 72 63 29 29  izeof(*p->pSrc))
31310 3b 0a 20 20 77 68 69 6c 65 28 20 70 53 75 62 20  ;.  while( pSub 
31320 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 54 65  ){.    Expr *pTe
31330 72 6d 3b 0a 20 20 20 20 70 50 72 69 6f 72 20 3d  rm;.    pPrior =
31340 20 70 53 75 62 2d 3e 70 50 72 69 6f 72 3b 0a 20   pSub->pPrior;. 
31350 20 20 20 70 53 75 62 2d 3e 70 50 72 69 6f 72 20     pSub->pPrior 
31360 3d 20 30 3b 0a 20 20 20 20 70 53 75 62 2d 3e 70  = 0;.    pSub->p
31370 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20 20 70 53  Next = 0;.    pS
31380 75 62 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20  ub->selFlags |= 
31390 53 46 5f 41 67 67 72 65 67 61 74 65 3b 0a 20 20  SF_Aggregate;.  
313a0 20 20 70 53 75 62 2d 3e 73 65 6c 46 6c 61 67 73    pSub->selFlags
313b0 20 26 3d 20 7e 53 46 5f 43 6f 6d 70 6f 75 6e 64   &= ~SF_Compound
313c0 3b 0a 20 20 20 20 70 53 75 62 2d 3e 6e 53 65 6c  ;.    pSub->nSel
313d0 65 63 74 52 6f 77 20 3d 20 30 3b 0a 20 20 20 20  ectRow = 0;.    
313e0 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
313f0 65 6c 65 74 65 28 64 62 2c 20 70 53 75 62 2d 3e  elete(db, pSub->
31400 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 70 54 65  pEList);.    pTe
31410 72 6d 20 3d 20 70 50 72 69 6f 72 20 3f 20 73 71  rm = pPrior ? sq
31420 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c  lite3ExprDup(db,
31430 20 70 43 6f 75 6e 74 2c 20 30 29 20 3a 20 70 43   pCount, 0) : pC
31440 6f 75 6e 74 3b 0a 20 20 20 20 70 53 75 62 2d 3e  ount;.    pSub->
31450 70 45 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33  pEList = sqlite3
31460 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70  ExprListAppend(p
31470 50 61 72 73 65 2c 20 30 2c 20 70 54 65 72 6d 29  Parse, 0, pTerm)
31480 3b 0a 20 20 20 20 70 54 65 72 6d 20 3d 20 73 71  ;.    pTerm = sq
31490 6c 69 74 65 33 50 45 78 70 72 28 70 50 61 72 73  lite3PExpr(pPars
314a0 65 2c 20 54 4b 5f 53 45 4c 45 43 54 2c 20 30 2c  e, TK_SELECT, 0,
314b0 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
314c0 50 45 78 70 72 41 64 64 53 65 6c 65 63 74 28 70  PExprAddSelect(p
314d0 50 61 72 73 65 2c 20 70 54 65 72 6d 2c 20 70 53  Parse, pTerm, pS
314e0 75 62 29 3b 0a 20 20 20 20 69 66 28 20 70 45 78  ub);.    if( pEx
314f0 70 72 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70  pr==0 ){.      p
31500 45 78 70 72 20 3d 20 70 54 65 72 6d 3b 0a 20 20  Expr = pTerm;.  
31510 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
31520 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 50 45  Expr = sqlite3PE
31530 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 50  xpr(pParse, TK_P
31540 4c 55 53 2c 20 70 54 65 72 6d 2c 20 70 45 78 70  LUS, pTerm, pExp
31550 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 53  r);.    }.    pS
31560 75 62 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20 7d  ub = pPrior;.  }
31570 0a 20 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b  .  p->pEList->a[
31580 30 5d 2e 70 45 78 70 72 20 3d 20 70 45 78 70 72  0].pExpr = pExpr
31590 3b 0a 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20  ;.  p->selFlags 
315a0 26 3d 20 7e 53 46 5f 41 67 67 72 65 67 61 74 65  &= ~SF_Aggregate
315b0 3b 0a 0a 23 69 66 20 53 45 4c 45 43 54 54 52 41  ;..#if SELECTTRA
315c0 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20 69 66 28  CE_ENABLED.  if(
315d0 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 54 72   sqlite3SelectTr
315e0 61 63 65 20 26 20 30 78 34 30 30 20 29 7b 0a 20  ace & 0x400 ){. 
315f0 20 20 20 53 45 4c 45 43 54 54 52 41 43 45 28 30     SELECTTRACE(0
31600 78 34 30 30 2c 70 50 61 72 73 65 2c 70 2c 28 22  x400,pParse,p,("
31610 41 66 74 65 72 20 63 6f 75 6e 74 2d 6f 66 2d 76  After count-of-v
31620 69 65 77 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  iew optimization
31630 3a 5c 6e 22 29 29 3b 0a 20 20 20 20 73 71 6c 69  :\n"));.    sqli
31640 74 65 33 54 72 65 65 56 69 65 77 53 65 6c 65 63  te3TreeViewSelec
31650 74 28 30 2c 20 70 2c 20 30 29 3b 0a 20 20 7d 0a  t(0, p, 0);.  }.
31660 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20  #endif.  return 
31670 31 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  1;.}.#endif /* S
31680 51 4c 49 54 45 5f 43 4f 55 4e 54 4f 46 56 49 45  QLITE_COUNTOFVIE
31690 57 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 20 2a  W_OPTIMIZATION *
316a0 2f 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  /../*.** Generat
316b0 65 20 63 6f 64 65 20 66 6f 72 20 74 68 65 20 53  e code for the S
316c0 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
316d0 67 69 76 65 6e 20 69 6e 20 74 68 65 20 70 20 61  given in the p a
316e0 72 67 75 6d 65 6e 74 2e 20 20 0a 2a 2a 0a 2a 2a  rgument.  .**.**
316f0 20 54 68 65 20 72 65 73 75 6c 74 73 20 61 72 65   The results are
31700 20 72 65 74 75 72 6e 65 64 20 61 63 63 6f 72 64   returned accord
31710 69 6e 67 20 74 6f 20 74 68 65 20 53 65 6c 65 63  ing to the Selec
31720 74 44 65 73 74 20 73 74 72 75 63 74 75 72 65 2e  tDest structure.
31730 0a 2a 2a 20 53 65 65 20 63 6f 6d 6d 65 6e 74 73  .** See comments
31740 20 69 6e 20 73 71 6c 69 74 65 49 6e 74 2e 68 20   in sqliteInt.h 
31750 66 6f 72 20 66 75 72 74 68 65 72 20 69 6e 66 6f  for further info
31760 72 6d 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54  rmation..**.** T
31770 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75  his routine retu
31780 72 6e 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  rns the number o
31790 66 20 65 72 72 6f 72 73 2e 20 20 49 66 20 61 6e  f errors.  If an
317a0 79 20 65 72 72 6f 72 73 20 61 72 65 0a 2a 2a 20  y errors are.** 
317b0 65 6e 63 6f 75 6e 74 65 72 65 64 2c 20 74 68 65  encountered, the
317c0 6e 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65  n an appropriate
317d0 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69   error message i
317e0 73 20 6c 65 66 74 20 69 6e 0a 2a 2a 20 70 50 61  s left in.** pPa
317f0 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2e 0a 2a 2a  rse->zErrMsg..**
31800 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
31810 20 64 6f 65 73 20 4e 4f 54 20 66 72 65 65 20 74   does NOT free t
31820 68 65 20 53 65 6c 65 63 74 20 73 74 72 75 63 74  he Select struct
31830 75 72 65 20 70 61 73 73 65 64 20 69 6e 2e 20 20  ure passed in.  
31840 54 68 65 0a 2a 2a 20 63 61 6c 6c 69 6e 67 20 66  The.** calling f
31850 75 6e 63 74 69 6f 6e 20 6e 65 65 64 73 20 74 6f  unction needs to
31860 20 64 6f 20 74 68 61 74 2e 0a 2a 2f 0a 69 6e 74   do that..*/.int
31870 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 0a   sqlite3Select(.
31880 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
31890 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
318a0 70 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a  parser context *
318b0 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20  /.  Select *p,  
318c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
318d0 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  e SELECT stateme
318e0 6e 74 20 62 65 69 6e 67 20 63 6f 64 65 64 2e 20  nt being coded. 
318f0 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20  */.  SelectDest 
31900 2a 70 44 65 73 74 20 20 20 20 20 20 2f 2a 20 57  *pDest      /* W
31910 68 61 74 20 74 6f 20 64 6f 20 77 69 74 68 20 74  hat to do with t
31920 68 65 20 71 75 65 72 79 20 72 65 73 75 6c 74 73  he query results
31930 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 2c 20   */.){.  int i, 
31940 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  j;              
31950 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73  /* Loop counters
31960 20 2a 2f 0a 20 20 57 68 65 72 65 49 6e 66 6f 20   */.  WhereInfo 
31970 2a 70 57 49 6e 66 6f 3b 20 20 20 20 20 2f 2a 20  *pWInfo;     /* 
31980 52 65 74 75 72 6e 20 66 72 6f 6d 20 73 71 6c 69  Return from sqli
31990 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 29 20  te3WhereBegin() 
319a0 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b 20 20 20  */.  Vdbe *v;   
319b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
319c0 68 65 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69  he virtual machi
319d0 6e 65 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75  ne under constru
319e0 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 69  ction */.  int i
319f0 73 41 67 67 3b 20 20 20 20 20 20 20 20 20 20 20  sAgg;           
31a00 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 73 65    /* True for se
31a10 6c 65 63 74 20 6c 69 73 74 73 20 6c 69 6b 65 20  lect lists like 
31a20 22 63 6f 75 6e 74 28 2a 29 22 20 2a 2f 0a 20 20  "count(*)" */.  
31a30 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74  ExprList *pEList
31a40 20 3d 20 30 3b 20 20 2f 2a 20 4c 69 73 74 20 6f   = 0;  /* List o
31a50 66 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 65 78 74  f columns to ext
31a60 72 61 63 74 2e 20 2a 2f 0a 20 20 53 72 63 4c 69  ract. */.  SrcLi
31a70 73 74 20 2a 70 54 61 62 4c 69 73 74 3b 20 20 20  st *pTabList;   
31a80 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 74 61 62    /* List of tab
31a90 6c 65 73 20 74 6f 20 73 65 6c 65 63 74 20 66 72  les to select fr
31aa0 6f 6d 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 57  om */.  Expr *pW
31ab0 68 65 72 65 3b 20 20 20 20 20 20 20 20 20 20 2f  here;          /
31ac0 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75  * The WHERE clau
31ad0 73 65 2e 20 20 4d 61 79 20 62 65 20 4e 55 4c 4c  se.  May be NULL
31ae0 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
31af0 70 47 72 6f 75 70 42 79 3b 20 20 20 20 2f 2a 20  pGroupBy;    /* 
31b00 54 68 65 20 47 52 4f 55 50 20 42 59 20 63 6c 61  The GROUP BY cla
31b10 75 73 65 2e 20 20 4d 61 79 20 62 65 20 4e 55 4c  use.  May be NUL
31b20 4c 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 48 61  L */.  Expr *pHa
31b30 76 69 6e 67 3b 20 20 20 20 20 20 20 20 20 2f 2a  ving;         /*
31b40 20 54 68 65 20 48 41 56 49 4e 47 20 63 6c 61 75   The HAVING clau
31b50 73 65 2e 20 20 4d 61 79 20 62 65 20 4e 55 4c 4c  se.  May be NULL
31b60 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 31   */.  int rc = 1
31b70 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
31b80 56 61 6c 75 65 20 74 6f 20 72 65 74 75 72 6e 20  Value to return 
31b90 66 72 6f 6d 20 74 68 69 73 20 66 75 6e 63 74 69  from this functi
31ba0 6f 6e 20 2a 2f 0a 20 20 44 69 73 74 69 6e 63 74  on */.  Distinct
31bb0 43 74 78 20 73 44 69 73 74 69 6e 63 74 3b 20 2f  Ctx sDistinct; /
31bc0 2a 20 49 6e 66 6f 20 6f 6e 20 68 6f 77 20 74 6f  * Info on how to
31bd0 20 63 6f 64 65 20 74 68 65 20 44 49 53 54 49 4e   code the DISTIN
31be0 43 54 20 6b 65 79 77 6f 72 64 20 2a 2f 0a 20 20  CT keyword */.  
31bf0 53 6f 72 74 43 74 78 20 73 53 6f 72 74 3b 20 20  SortCtx sSort;  
31c00 20 20 20 20 20 20 20 2f 2a 20 49 6e 66 6f 20 6f         /* Info o
31c10 6e 20 68 6f 77 20 74 6f 20 63 6f 64 65 20 74 68  n how to code th
31c20 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
31c30 65 20 2a 2f 0a 20 20 41 67 67 49 6e 66 6f 20 73  e */.  AggInfo s
31c40 41 67 67 49 6e 66 6f 3b 20 20 20 20 20 20 2f 2a  AggInfo;      /*
31c50 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 75 73 65   Information use
31c60 64 20 62 79 20 61 67 67 72 65 67 61 74 65 20 71  d by aggregate q
31c70 75 65 72 69 65 73 20 2a 2f 0a 20 20 69 6e 74 20  ueries */.  int 
31c80 69 45 6e 64 3b 20 20 20 20 20 20 20 20 20 20 20  iEnd;           
31c90 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66     /* Address of
31ca0 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
31cb0 71 75 65 72 79 20 2a 2f 0a 20 20 73 71 6c 69 74  query */.  sqlit
31cc0 65 33 20 2a 64 62 3b 20 20 20 20 20 20 20 20 20  e3 *db;         
31cd0 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73    /* The databas
31ce0 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a  e connection */.
31cf0 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4d 69 6e    ExprList *pMin
31d00 4d 61 78 4f 72 64 65 72 42 79 20 3d 20 30 3b 20  MaxOrderBy = 0; 
31d10 20 2f 2a 20 41 64 64 65 64 20 4f 52 44 45 52 20   /* Added ORDER 
31d20 42 59 20 66 6f 72 20 6d 69 6e 2f 6d 61 78 20 71  BY for min/max q
31d30 75 65 72 69 65 73 20 2a 2f 0a 20 20 75 38 20 6d  ueries */.  u8 m
31d40 69 6e 4d 61 78 46 6c 61 67 3b 20 20 20 20 20 20  inMaxFlag;      
31d50 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c             /* Fl
31d60 61 67 20 66 6f 72 20 6d 69 6e 2f 6d 61 78 20 71  ag for min/max q
31d70 75 65 72 69 65 73 20 2a 2f 0a 0a 20 20 64 62 20  ueries */..  db 
31d80 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
31d90 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64  v = sqlite3GetVd
31da0 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66  be(pParse);.  if
31db0 28 20 70 3d 3d 30 20 7c 7c 20 64 62 2d 3e 6d 61  ( p==0 || db->ma
31dc0 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20 70 50  llocFailed || pP
31dd0 61 72 73 65 2d 3e 6e 45 72 72 20 29 7b 0a 20 20  arse->nErr ){.  
31de0 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a    return 1;.  }.
31df0 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74    if( sqlite3Aut
31e00 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53  hCheck(pParse, S
31e10 51 4c 49 54 45 5f 53 45 4c 45 43 54 2c 20 30 2c  QLITE_SELECT, 0,
31e20 20 30 2c 20 30 29 20 29 20 72 65 74 75 72 6e 20   0, 0) ) return 
31e30 31 3b 0a 20 20 6d 65 6d 73 65 74 28 26 73 41 67  1;.  memset(&sAg
31e40 67 49 6e 66 6f 2c 20 30 2c 20 73 69 7a 65 6f 66  gInfo, 0, sizeof
31e50 28 73 41 67 67 49 6e 66 6f 29 29 3b 0a 23 69 66  (sAggInfo));.#if
31e60 20 53 45 4c 45 43 54 54 52 41 43 45 5f 45 4e 41   SELECTTRACE_ENA
31e70 42 4c 45 44 0a 20 20 53 45 4c 45 43 54 54 52 41  BLED.  SELECTTRA
31e80 43 45 28 31 2c 70 50 61 72 73 65 2c 70 2c 20 28  CE(1,pParse,p, (
31e90 22 62 65 67 69 6e 20 70 72 6f 63 65 73 73 69 6e  "begin processin
31ea0 67 3a 5c 6e 22 2c 20 70 50 61 72 73 65 2d 3e 61  g:\n", pParse->a
31eb0 64 64 72 45 78 70 6c 61 69 6e 29 29 3b 0a 20 20  ddrExplain));.  
31ec0 69 66 28 20 73 71 6c 69 74 65 33 53 65 6c 65 63  if( sqlite3Selec
31ed0 74 54 72 61 63 65 20 26 20 30 78 31 30 30 20 29  tTrace & 0x100 )
31ee0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 54 72 65  {.    sqlite3Tre
31ef0 65 56 69 65 77 53 65 6c 65 63 74 28 30 2c 20 70  eViewSelect(0, p
31f00 2c 20 30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  , 0);.  }.#endif
31f10 0a 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70  ..  assert( p->p
31f20 4f 72 64 65 72 42 79 3d 3d 30 20 7c 7c 20 70 44  OrderBy==0 || pD
31f30 65 73 74 2d 3e 65 44 65 73 74 21 3d 53 52 54 5f  est->eDest!=SRT_
31f40 44 69 73 74 46 69 66 6f 20 29 3b 0a 20 20 61 73  DistFifo );.  as
31f50 73 65 72 74 28 20 70 2d 3e 70 4f 72 64 65 72 42  sert( p->pOrderB
31f60 79 3d 3d 30 20 7c 7c 20 70 44 65 73 74 2d 3e 65  y==0 || pDest->e
31f70 44 65 73 74 21 3d 53 52 54 5f 46 69 66 6f 20 29  Dest!=SRT_Fifo )
31f80 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70  ;.  assert( p->p
31f90 4f 72 64 65 72 42 79 3d 3d 30 20 7c 7c 20 70 44  OrderBy==0 || pD
31fa0 65 73 74 2d 3e 65 44 65 73 74 21 3d 53 52 54 5f  est->eDest!=SRT_
31fb0 44 69 73 74 51 75 65 75 65 20 29 3b 0a 20 20 61  DistQueue );.  a
31fc0 73 73 65 72 74 28 20 70 2d 3e 70 4f 72 64 65 72  ssert( p->pOrder
31fd0 42 79 3d 3d 30 20 7c 7c 20 70 44 65 73 74 2d 3e  By==0 || pDest->
31fe0 65 44 65 73 74 21 3d 53 52 54 5f 51 75 65 75 65  eDest!=SRT_Queue
31ff0 20 29 3b 0a 20 20 69 66 28 20 49 67 6e 6f 72 61   );.  if( Ignora
32000 62 6c 65 4f 72 64 65 72 62 79 28 70 44 65 73 74  bleOrderby(pDest
32010 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  ) ){.    assert(
32020 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52  pDest->eDest==SR
32030 54 5f 45 78 69 73 74 73 20 7c 7c 20 70 44 65 73  T_Exists || pDes
32040 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 55 6e  t->eDest==SRT_Un
32050 69 6f 6e 20 7c 7c 20 0a 20 20 20 20 20 20 20 20  ion || .        
32060 20 20 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d     pDest->eDest=
32070 3d 53 52 54 5f 45 78 63 65 70 74 20 7c 7c 20 70  =SRT_Except || p
32080 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54  Dest->eDest==SRT
32090 5f 44 69 73 63 61 72 64 20 7c 7c 0a 20 20 20 20  _Discard ||.    
320a0 20 20 20 20 20 20 20 70 44 65 73 74 2d 3e 65 44         pDest->eD
320b0 65 73 74 3d 3d 53 52 54 5f 51 75 65 75 65 20 20  est==SRT_Queue  
320c0 7c 7c 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d  || pDest->eDest=
320d0 3d 53 52 54 5f 44 69 73 74 46 69 66 6f 20 7c 7c  =SRT_DistFifo ||
320e0 0a 20 20 20 20 20 20 20 20 20 20 20 70 44 65 73  .           pDes
320f0 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 44 69  t->eDest==SRT_Di
32100 73 74 51 75 65 75 65 20 7c 7c 20 70 44 65 73 74  stQueue || pDest
32110 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 46 69 66  ->eDest==SRT_Fif
32120 6f 29 3b 0a 20 20 20 20 2f 2a 20 49 66 20 4f 52  o);.    /* If OR
32130 44 45 52 20 42 59 20 6d 61 6b 65 73 20 6e 6f 20  DER BY makes no 
32140 64 69 66 66 65 72 65 6e 63 65 20 69 6e 20 74 68  difference in th
32150 65 20 6f 75 74 70 75 74 20 74 68 65 6e 20 6e 65  e output then ne
32160 69 74 68 65 72 20 64 6f 65 73 0a 20 20 20 20 2a  ither does.    *
32170 2a 20 44 49 53 54 49 4e 43 54 20 73 6f 20 69 74  * DISTINCT so it
32180 20 63 61 6e 20 62 65 20 72 65 6d 6f 76 65 64 20   can be removed 
32190 74 6f 6f 2e 20 2a 2f 0a 20 20 20 20 73 71 6c 69  too. */.    sqli
321a0 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74  te3ExprListDelet
321b0 65 28 64 62 2c 20 70 2d 3e 70 4f 72 64 65 72 42  e(db, p->pOrderB
321c0 79 29 3b 0a 20 20 20 20 70 2d 3e 70 4f 72 64 65  y);.    p->pOrde
321d0 72 42 79 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e  rBy = 0;.    p->
321e0 73 65 6c 46 6c 61 67 73 20 26 3d 20 7e 53 46 5f  selFlags &= ~SF_
321f0 44 69 73 74 69 6e 63 74 3b 0a 20 20 7d 0a 20 20  Distinct;.  }.  
32200 73 71 6c 69 74 65 33 53 65 6c 65 63 74 50 72 65  sqlite3SelectPre
32210 70 28 70 50 61 72 73 65 2c 20 70 2c 20 30 29 3b  p(pParse, p, 0);
32220 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e  .  if( pParse->n
32230 45 72 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f  Err || db->mallo
32240 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 67  cFailed ){.    g
32250 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  oto select_end;.
32260 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 2d    }.  assert( p-
32270 3e 70 45 4c 69 73 74 21 3d 30 20 29 3b 0a 23 69  >pEList!=0 );.#i
32280 66 20 53 45 4c 45 43 54 54 52 41 43 45 5f 45 4e  f SELECTTRACE_EN
32290 41 42 4c 45 44 0a 20 20 69 66 28 20 73 71 6c 69  ABLED.  if( sqli
322a0 74 65 33 53 65 6c 65 63 74 54 72 61 63 65 20 26  te3SelectTrace &
322b0 20 30 78 31 30 34 20 29 7b 0a 20 20 20 20 53 45   0x104 ){.    SE
322c0 4c 45 43 54 54 52 41 43 45 28 30 78 31 30 34 2c  LECTTRACE(0x104,
322d0 70 50 61 72 73 65 2c 70 2c 20 28 22 61 66 74 65  pParse,p, ("afte
322e0 72 20 6e 61 6d 65 20 72 65 73 6f 6c 75 74 69 6f  r name resolutio
322f0 6e 3a 5c 6e 22 29 29 3b 0a 20 20 20 20 73 71 6c  n:\n"));.    sql
32300 69 74 65 33 54 72 65 65 56 69 65 77 53 65 6c 65  ite3TreeViewSele
32310 63 74 28 30 2c 20 70 2c 20 30 29 3b 0a 20 20 7d  ct(0, p, 0);.  }
32320 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 70  .#endif..  if( p
32330 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54  Dest->eDest==SRT
32340 5f 4f 75 74 70 75 74 20 29 7b 0a 20 20 20 20 67  _Output ){.    g
32350 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d  enerateColumnNam
32360 65 73 28 70 50 61 72 73 65 2c 20 70 29 3b 0a 20  es(pParse, p);. 
32370 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   }..#ifndef SQLI
32380 54 45 5f 4f 4d 49 54 5f 57 49 4e 44 4f 57 46 55  TE_OMIT_WINDOWFU
32390 4e 43 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  NC.  if( sqlite3
323a0 57 69 6e 64 6f 77 52 65 77 72 69 74 65 28 70 50  WindowRewrite(pP
323b0 61 72 73 65 2c 20 70 29 20 29 7b 0a 20 20 20 20  arse, p) ){.    
323c0 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b  goto select_end;
323d0 0a 20 20 7d 0a 23 69 66 20 53 45 4c 45 43 54 54  .  }.#if SELECTT
323e0 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20 69  RACE_ENABLED.  i
323f0 66 28 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  f( sqlite3Select
32400 54 72 61 63 65 20 26 20 30 78 31 30 38 20 29 7b  Trace & 0x108 ){
32410 0a 20 20 20 20 53 45 4c 45 43 54 54 52 41 43 45  .    SELECTTRACE
32420 28 30 78 31 30 34 2c 70 50 61 72 73 65 2c 70 2c  (0x104,pParse,p,
32430 20 28 22 61 66 74 65 72 20 77 69 6e 64 6f 77 20   ("after window 
32440 72 65 77 72 69 74 65 3a 5c 6e 22 29 29 3b 0a 20  rewrite:\n"));. 
32450 20 20 20 73 71 6c 69 74 65 33 54 72 65 65 56 69     sqlite3TreeVi
32460 65 77 53 65 6c 65 63 74 28 30 2c 20 70 2c 20 30  ewSelect(0, p, 0
32470 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 23 65  );.  }.#endif.#e
32480 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
32490 4d 49 54 5f 57 49 4e 44 4f 57 46 55 4e 43 20 2a  MIT_WINDOWFUNC *
324a0 2f 0a 20 20 70 54 61 62 4c 69 73 74 20 3d 20 70  /.  pTabList = p
324b0 2d 3e 70 53 72 63 3b 0a 20 20 69 73 41 67 67 20  ->pSrc;.  isAgg 
324c0 3d 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26  = (p->selFlags &
324d0 20 53 46 5f 41 67 67 72 65 67 61 74 65 29 21 3d   SF_Aggregate)!=
324e0 30 3b 0a 20 20 6d 65 6d 73 65 74 28 26 73 53 6f  0;.  memset(&sSo
324f0 72 74 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 53  rt, 0, sizeof(sS
32500 6f 72 74 29 29 3b 0a 20 20 73 53 6f 72 74 2e 70  ort));.  sSort.p
32510 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72  OrderBy = p->pOr
32520 64 65 72 42 79 3b 0a 0a 20 20 2f 2a 20 54 72 79  derBy;..  /* Try
32530 20 74 6f 20 76 61 72 69 6f 75 73 20 6f 70 74 69   to various opti
32540 6d 69 7a 61 74 69 6f 6e 73 20 28 66 6c 61 74 74  mizations (flatt
32550 65 6e 69 6e 67 20 73 75 62 71 75 65 72 69 65 73  ening subqueries
32560 2c 20 61 6e 64 20 73 74 72 65 6e 67 74 68 0a 20  , and strength. 
32570 20 2a 2a 20 72 65 64 75 63 74 69 6f 6e 20 6f 66   ** reduction of
32580 20 6a 6f 69 6e 20 6f 70 65 72 61 74 6f 72 73 29   join operators)
32590 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   in the FROM cla
325a0 75 73 65 20 75 70 20 69 6e 74 6f 20 74 68 65 20  use up into the 
325b0 6d 61 69 6e 20 71 75 65 72 79 0a 20 20 2a 2f 0a  main query.  */.
325c0 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
325d0 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
325e0 59 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53  Y) || !defined(S
325f0 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29  QLITE_OMIT_VIEW)
32600 0a 20 20 66 6f 72 28 69 3d 30 3b 20 21 70 2d 3e  .  for(i=0; !p->
32610 70 50 72 69 6f 72 20 26 26 20 69 3c 70 54 61 62  pPrior && i<pTab
32620 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29  List->nSrc; i++)
32630 7b 0a 20 20 20 20 73 74 72 75 63 74 20 53 72 63  {.    struct Src
32640 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
32650 20 3d 20 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b   = &pTabList->a[
32660 69 5d 3b 0a 20 20 20 20 53 65 6c 65 63 74 20 2a  i];.    Select *
32670 70 53 75 62 20 3d 20 70 49 74 65 6d 2d 3e 70 53  pSub = pItem->pS
32680 65 6c 65 63 74 3b 0a 20 20 20 20 54 61 62 6c 65  elect;.    Table
32690 20 2a 70 54 61 62 20 3d 20 70 49 74 65 6d 2d 3e   *pTab = pItem->
326a0 70 54 61 62 3b 0a 0a 20 20 20 20 2f 2a 20 43 6f  pTab;..    /* Co
326b0 6e 76 65 72 74 20 4c 45 46 54 20 4a 4f 49 4e 20  nvert LEFT JOIN 
326c0 69 6e 74 6f 20 4a 4f 49 4e 20 69 66 20 74 68 65  into JOIN if the
326d0 72 65 20 61 72 65 20 74 65 72 6d 73 20 6f 66 20  re are terms of 
326e0 74 68 65 20 72 69 67 68 74 20 74 61 62 6c 65 0a  the right table.
326f0 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 4c 45      ** of the LE
32700 46 54 20 4a 4f 49 4e 20 75 73 65 64 20 69 6e 20  FT JOIN used in 
32710 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
32720 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
32730 20 28 70 49 74 65 6d 2d 3e 66 67 2e 6a 6f 69 6e   (pItem->fg.join
32740 74 79 70 65 20 26 20 4a 54 5f 4c 45 46 54 29 21  type & JT_LEFT)!
32750 3d 30 0a 20 20 20 20 20 26 26 20 73 71 6c 69 74  =0.     && sqlit
32760 65 33 45 78 70 72 49 6d 70 6c 69 65 73 4e 6f 6e  e3ExprImpliesNon
32770 4e 75 6c 6c 52 6f 77 28 70 2d 3e 70 57 68 65 72  NullRow(p->pWher
32780 65 2c 20 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f  e, pItem->iCurso
32790 72 29 0a 20 20 20 20 20 26 26 20 4f 70 74 69 6d  r).     && Optim
327a0 69 7a 61 74 69 6f 6e 45 6e 61 62 6c 65 64 28 64  izationEnabled(d
327b0 62 2c 20 53 51 4c 49 54 45 5f 53 69 6d 70 6c 69  b, SQLITE_Simpli
327c0 66 79 4a 6f 69 6e 29 0a 20 20 20 20 29 7b 0a 20  fyJoin).    ){. 
327d0 20 20 20 20 20 53 45 4c 45 43 54 54 52 41 43 45       SELECTTRACE
327e0 28 30 78 31 30 30 2c 70 50 61 72 73 65 2c 70 2c  (0x100,pParse,p,
327f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
32800 20 28 22 4c 45 46 54 2d 4a 4f 49 4e 20 73 69 6d   ("LEFT-JOIN sim
32810 70 6c 69 66 69 65 73 20 74 6f 20 4a 4f 49 4e 20  plifies to JOIN 
32820 6f 6e 20 74 65 72 6d 20 25 64 5c 6e 22 2c 69 29  on term %d\n",i)
32830 29 3b 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e  );.      pItem->
32840 66 67 2e 6a 6f 69 6e 74 79 70 65 20 26 3d 20 7e  fg.jointype &= ~
32850 28 4a 54 5f 4c 45 46 54 7c 4a 54 5f 4f 55 54 45  (JT_LEFT|JT_OUTE
32860 52 29 3b 0a 20 20 20 20 20 20 75 6e 73 65 74 4a  R);.      unsetJ
32870 6f 69 6e 45 78 70 72 28 70 2d 3e 70 57 68 65 72  oinExpr(p->pWher
32880 65 2c 20 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f  e, pItem->iCurso
32890 72 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  r);.    }..    /
328a0 2a 20 4e 6f 20 66 75 74 68 65 72 20 61 63 74 69  * No futher acti
328b0 6f 6e 20 69 66 20 74 68 69 73 20 74 65 72 6d 20  on if this term 
328c0 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  of the FROM clau
328d0 73 65 20 69 73 20 6e 6f 20 61 20 73 75 62 71 75  se is no a subqu
328e0 65 72 79 20 2a 2f 0a 20 20 20 20 69 66 28 20 70  ery */.    if( p
328f0 53 75 62 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75  Sub==0 ) continu
32900 65 3b 0a 0a 20 20 20 20 2f 2a 20 43 61 74 63 68  e;..    /* Catch
32910 20 6d 69 73 6d 61 74 63 68 20 69 6e 20 74 68 65   mismatch in the
32920 20 64 65 63 6c 61 72 65 64 20 63 6f 6c 75 6d 6e   declared column
32930 73 20 6f 66 20 61 20 76 69 65 77 20 61 6e 64 20  s of a view and 
32940 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 20 20  the number of.  
32950 20 20 2a 2a 20 63 6f 6c 75 6d 6e 73 20 69 6e 20    ** columns in 
32960 74 68 65 20 53 45 4c 45 43 54 20 6f 6e 20 74 68  the SELECT on th
32970 65 20 52 48 53 20 2a 2f 0a 20 20 20 20 69 66 28  e RHS */.    if(
32980 20 70 54 61 62 2d 3e 6e 43 6f 6c 21 3d 70 53 75   pTab->nCol!=pSu
32990 62 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  b->pEList->nExpr
329a0 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
329b0 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
329c0 2c 20 22 65 78 70 65 63 74 65 64 20 25 64 20 63  , "expected %d c
329d0 6f 6c 75 6d 6e 73 20 66 6f 72 20 27 25 73 27 20  olumns for '%s' 
329e0 62 75 74 20 67 6f 74 20 25 64 22 2c 0a 20 20 20  but got %d",.   
329f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32a00 20 20 20 70 54 61 62 2d 3e 6e 43 6f 6c 2c 20 70     pTab->nCol, p
32a10 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 70 53 75 62  Tab->zName, pSub
32a20 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29  ->pEList->nExpr)
32a30 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 65 6c  ;.      goto sel
32a40 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a 0a  ect_end;.    }..
32a50 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 74 72      /* Do not tr
32a60 79 20 74 6f 20 66 6c 61 74 74 65 6e 20 61 6e 20  y to flatten an 
32a70 61 67 67 72 65 67 61 74 65 20 73 75 62 71 75 65  aggregate subque
32a80 72 79 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  ry..    **.    *
32a90 2a 20 46 6c 61 74 74 65 6e 69 6e 67 20 61 6e 20  * Flattening an 
32aa0 61 67 67 72 65 67 61 74 65 20 73 75 62 71 75 65  aggregate subque
32ab0 72 79 20 69 73 20 6f 6e 6c 79 20 70 6f 73 73 69  ry is only possi
32ac0 62 6c 65 20 69 66 20 74 68 65 20 6f 75 74 65 72  ble if the outer
32ad0 20 71 75 65 72 79 0a 20 20 20 20 2a 2a 20 69 73   query.    ** is
32ae0 20 6e 6f 74 20 61 20 6a 6f 69 6e 2e 20 20 42 75   not a join.  Bu
32af0 74 20 69 66 20 74 68 65 20 6f 75 74 65 72 20 71  t if the outer q
32b00 75 65 72 79 20 69 73 20 6e 6f 74 20 61 20 6a 6f  uery is not a jo
32b10 69 6e 2c 20 74 68 65 6e 20 74 68 65 20 73 75 62  in, then the sub
32b20 71 75 65 72 79 0a 20 20 20 20 2a 2a 20 77 69 6c  query.    ** wil
32b30 6c 20 62 65 20 69 6d 70 6c 65 6d 65 6e 74 65 64  l be implemented
32b40 20 61 73 20 61 20 63 6f 2d 72 6f 75 74 69 6e 65   as a co-routine
32b50 20 61 6e 64 20 74 68 65 72 65 20 69 73 20 6e 6f   and there is no
32b60 20 61 64 76 61 6e 74 61 67 65 20 74 6f 0a 20 20   advantage to.  
32b70 20 20 2a 2a 20 66 6c 61 74 74 65 6e 69 6e 67 20    ** flattening 
32b80 69 6e 20 74 68 61 74 20 63 61 73 65 2e 0a 20 20  in that case..  
32b90 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 70 53    */.    if( (pS
32ba0 75 62 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53  ub->selFlags & S
32bb0 46 5f 41 67 67 72 65 67 61 74 65 29 21 3d 30 20  F_Aggregate)!=0 
32bc0 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
32bd0 61 73 73 65 72 74 28 20 70 53 75 62 2d 3e 70 47  assert( pSub->pG
32be0 72 6f 75 70 42 79 3d 3d 30 20 29 3b 0a 0a 20 20  roupBy==0 );..  
32bf0 20 20 2f 2a 20 49 66 20 74 68 65 20 6f 75 74 65    /* If the oute
32c00 72 20 71 75 65 72 79 20 63 6f 6e 74 61 69 6e 73  r query contains
32c10 20 61 20 22 63 6f 6d 70 6c 65 78 22 20 72 65 73   a "complex" res
32c20 75 6c 74 20 73 65 74 20 28 74 68 61 74 20 69 73  ult set (that is
32c30 2c 0a 20 20 20 20 2a 2a 20 69 66 20 74 68 65 20  ,.    ** if the 
32c40 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20 74 68  result set of th
32c50 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 75 73  e outer query us
32c60 65 73 20 66 75 6e 63 74 69 6f 6e 73 20 6f 72 20  es functions or 
32c70 73 75 62 71 75 65 72 69 65 73 29 0a 20 20 20 20  subqueries).    
32c80 2a 2a 20 61 6e 64 20 69 66 20 74 68 65 20 73 75  ** and if the su
32c90 62 71 75 65 72 79 20 63 6f 6e 74 61 69 6e 73 20  bquery contains 
32ca0 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  an ORDER BY clau
32cb0 73 65 20 61 6e 64 20 69 66 0a 20 20 20 20 2a 2a  se and if.    **
32cc0 20 69 74 20 77 69 6c 6c 20 62 65 20 69 6d 70 6c   it will be impl
32cd0 65 6d 65 6e 74 65 64 20 61 73 20 61 20 63 6f 2d  emented as a co-
32ce0 72 6f 75 74 69 6e 65 2c 20 74 68 65 6e 20 64 6f  routine, then do
32cf0 20 6e 6f 74 20 66 6c 61 74 74 65 6e 2e 20 20 54   not flatten.  T
32d00 68 69 73 0a 20 20 20 20 2a 2a 20 72 65 73 74 72  his.    ** restr
32d10 69 63 74 69 6f 6e 20 61 6c 6c 6f 77 73 20 53 51  iction allows SQ
32d20 4c 20 63 6f 6e 73 74 72 75 63 74 73 20 6c 69 6b  L constructs lik
32d30 65 20 74 68 69 73 3a 0a 20 20 20 20 2a 2a 0a 20  e this:.    **. 
32d40 20 20 20 2a 2a 20 20 53 45 4c 45 43 54 20 65 78     **  SELECT ex
32d50 70 65 6e 73 69 76 65 5f 66 75 6e 63 74 69 6f 6e  pensive_function
32d60 28 78 29 0a 20 20 20 20 2a 2a 20 20 20 20 46 52  (x).    **    FR
32d70 4f 4d 20 28 53 45 4c 45 43 54 20 78 20 46 52 4f  OM (SELECT x FRO
32d80 4d 20 74 61 62 20 4f 52 44 45 52 20 42 59 20 79  M tab ORDER BY y
32d90 20 4c 49 4d 49 54 20 31 30 29 3b 0a 20 20 20 20   LIMIT 10);.    
32da0 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 65 78  **.    ** The ex
32db0 70 65 6e 73 69 76 65 5f 66 75 6e 63 74 69 6f 6e  pensive_function
32dc0 28 29 20 69 73 20 6f 6e 6c 79 20 63 6f 6d 70 75  () is only compu
32dd0 74 65 64 20 6f 6e 20 74 68 65 20 31 30 20 72 6f  ted on the 10 ro
32de0 77 73 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 61  ws that.    ** a
32df0 72 65 20 6f 75 74 70 75 74 2c 20 72 61 74 68 65  re output, rathe
32e00 72 20 74 68 61 6e 20 65 76 65 72 79 20 72 6f 77  r than every row
32e10 20 6f 66 20 74 68 65 20 74 61 62 6c 65 2e 0a 20   of the table.. 
32e20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65     **.    ** The
32e30 20 72 65 71 75 69 72 65 6d 65 6e 74 20 74 68 61   requirement tha
32e40 74 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  t the outer quer
32e50 79 20 68 61 76 65 20 61 20 63 6f 6d 70 6c 65 78  y have a complex
32e60 20 72 65 73 75 6c 74 20 73 65 74 0a 20 20 20 20   result set.    
32e70 2a 2a 20 6d 65 61 6e 73 20 74 68 61 74 20 66 6c  ** means that fl
32e80 61 74 74 65 6e 69 6e 67 20 64 6f 65 73 20 6f 63  attening does oc
32e90 63 75 72 20 6f 6e 20 73 69 6d 70 6c 65 72 20 53  cur on simpler S
32ea0 51 4c 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 77  QL constraints w
32eb0 69 74 68 6f 75 74 0a 20 20 20 20 2a 2a 20 74 68  ithout.    ** th
32ec0 65 20 65 78 70 65 6e 73 69 76 65 5f 66 75 6e 63  e expensive_func
32ed0 74 69 6f 6e 28 29 20 6c 69 6b 65 3a 0a 20 20 20  tion() like:.   
32ee0 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 53 45 4c 45   **.    **  SELE
32ef0 43 54 20 78 20 46 52 4f 4d 20 28 53 45 4c 45 43  CT x FROM (SELEC
32f00 54 20 78 20 46 52 4f 4d 20 74 61 62 20 4f 52 44  T x FROM tab ORD
32f10 45 52 20 42 59 20 79 20 4c 49 4d 49 54 20 31 30  ER BY y LIMIT 10
32f20 29 3b 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  );.    */.    if
32f30 28 20 70 53 75 62 2d 3e 70 4f 72 64 65 72 42 79  ( pSub->pOrderBy
32f40 21 3d 30 0a 20 20 20 20 20 26 26 20 69 3d 3d 30  !=0.     && i==0
32f50 0a 20 20 20 20 20 26 26 20 28 70 2d 3e 73 65 6c  .     && (p->sel
32f60 46 6c 61 67 73 20 26 20 53 46 5f 43 6f 6d 70 6c  Flags & SF_Compl
32f70 65 78 52 65 73 75 6c 74 29 21 3d 30 0a 20 20 20  exResult)!=0.   
32f80 20 20 26 26 20 28 70 54 61 62 4c 69 73 74 2d 3e    && (pTabList->
32f90 6e 53 72 63 3d 3d 31 0a 20 20 20 20 20 20 20 20  nSrc==1.        
32fa0 20 7c 7c 20 28 70 54 61 62 4c 69 73 74 2d 3e 61   || (pTabList->a
32fb0 5b 31 5d 2e 66 67 2e 6a 6f 69 6e 74 79 70 65 26  [1].fg.jointype&
32fc0 28 4a 54 5f 4c 45 46 54 7c 4a 54 5f 43 52 4f 53  (JT_LEFT|JT_CROS
32fd0 53 29 29 21 3d 30 29 0a 20 20 20 20 29 7b 0a 20  S))!=0).    ){. 
32fe0 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
32ff0 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 66 6c     }..    if( fl
33000 61 74 74 65 6e 53 75 62 71 75 65 72 79 28 70 50  attenSubquery(pP
33010 61 72 73 65 2c 20 70 2c 20 69 2c 20 69 73 41 67  arse, p, i, isAg
33020 67 29 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  g) ){.      if( 
33030 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 29 20 67  pParse->nErr ) g
33040 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  oto select_end;.
33050 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 73 75        /* This su
33060 62 71 75 65 72 79 20 63 61 6e 20 62 65 20 61 62  bquery can be ab
33070 73 6f 72 62 65 64 20 69 6e 74 6f 20 69 74 73 20  sorbed into its 
33080 70 61 72 65 6e 74 2e 20 2a 2f 0a 20 20 20 20 20  parent. */.     
33090 20 69 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 0a 20   i = -1;.    }. 
330a0 20 20 20 70 54 61 62 4c 69 73 74 20 3d 20 70 2d     pTabList = p-
330b0 3e 70 53 72 63 3b 0a 20 20 20 20 69 66 28 20 64  >pSrc;.    if( d
330c0 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
330d0 29 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e  ) goto select_en
330e0 64 3b 0a 20 20 20 20 69 66 28 20 21 49 67 6e 6f  d;.    if( !Igno
330f0 72 61 62 6c 65 4f 72 64 65 72 62 79 28 70 44 65  rableOrderby(pDe
33100 73 74 29 20 29 7b 0a 20 20 20 20 20 20 73 53 6f  st) ){.      sSo
33110 72 74 2e 70 4f 72 64 65 72 42 79 20 3d 20 70 2d  rt.pOrderBy = p-
33120 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 20 20 7d  >pOrderBy;.    }
33130 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66  .  }.#endif..#if
33140 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
33150 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54  _COMPOUND_SELECT
33160 0a 20 20 2f 2a 20 48 61 6e 64 6c 65 20 63 6f 6d  .  /* Handle com
33170 70 6f 75 6e 64 20 53 45 4c 45 43 54 20 73 74 61  pound SELECT sta
33180 74 65 6d 65 6e 74 73 20 75 73 69 6e 67 20 74 68  tements using th
33190 65 20 73 65 70 61 72 61 74 65 20 6d 75 6c 74 69  e separate multi
331a0 53 65 6c 65 63 74 28 29 0a 20 20 2a 2a 20 70 72  Select().  ** pr
331b0 6f 63 65 64 75 72 65 2e 0a 20 20 2a 2f 0a 20 20  ocedure..  */.  
331c0 69 66 28 20 70 2d 3e 70 50 72 69 6f 72 20 29 7b  if( p->pPrior ){
331d0 0a 20 20 20 20 72 63 20 3d 20 6d 75 6c 74 69 53  .    rc = multiS
331e0 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 2c  elect(pParse, p,
331f0 20 70 44 65 73 74 29 3b 0a 23 69 66 20 53 45 4c   pDest);.#if SEL
33200 45 43 54 54 52 41 43 45 5f 45 4e 41 42 4c 45 44  ECTTRACE_ENABLED
33210 0a 20 20 20 20 53 45 4c 45 43 54 54 52 41 43 45  .    SELECTTRACE
33220 28 30 78 31 2c 70 50 61 72 73 65 2c 70 2c 28 22  (0x1,pParse,p,("
33230 65 6e 64 20 63 6f 6d 70 6f 75 6e 64 2d 73 65 6c  end compound-sel
33240 65 63 74 20 70 72 6f 63 65 73 73 69 6e 67 5c 6e  ect processing\n
33250 22 29 29 3b 0a 20 20 20 20 69 66 28 20 28 73 71  "));.    if( (sq
33260 6c 69 74 65 33 53 65 6c 65 63 74 54 72 61 63 65  lite3SelectTrace
33270 20 26 20 30 78 32 30 30 30 29 21 3d 30 20 26 26   & 0x2000)!=0 &&
33280 20 45 78 70 6c 61 69 6e 51 75 65 72 79 50 6c 61   ExplainQueryPla
33290 6e 50 61 72 65 6e 74 28 70 50 61 72 73 65 29 3d  nParent(pParse)=
332a0 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =0 ){.      sqli
332b0 74 65 33 54 72 65 65 56 69 65 77 53 65 6c 65 63  te3TreeViewSelec
332c0 74 28 30 2c 20 70 2c 20 30 29 3b 0a 20 20 20 20  t(0, p, 0);.    
332d0 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28  }.#endif.    if(
332e0 20 70 2d 3e 70 4e 65 78 74 3d 3d 30 20 29 20 45   p->pNext==0 ) E
332f0 78 70 6c 61 69 6e 51 75 65 72 79 50 6c 61 6e 50  xplainQueryPlanP
33300 6f 70 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  op(pParse);.    
33310 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 23  return rc;.  }.#
33320 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 44 6f 20 74  endif..  /* Do t
33330 68 65 20 57 48 45 52 45 2d 63 6c 61 75 73 65 20  he WHERE-clause 
33340 63 6f 6e 73 74 61 6e 74 20 70 72 6f 70 61 67 61  constant propaga
33350 74 69 6f 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f  tion optimizatio
33360 6e 20 69 66 20 74 68 69 73 20 69 73 0a 20 20 2a  n if this is.  *
33370 2a 20 61 20 6a 6f 69 6e 2e 20 20 4e 6f 20 6e 65  * a join.  No ne
33380 65 64 20 74 6f 20 73 70 65 65 64 20 74 69 6d 65  ed to speed time
33390 20 6f 6e 20 74 68 69 73 20 6f 70 65 72 61 74 69   on this operati
333a0 6f 6e 20 66 6f 72 20 6e 6f 6e 2d 6a 6f 69 6e 20  on for non-join 
333b0 71 75 65 72 69 65 73 0a 20 20 2a 2a 20 61 73 20  queries.  ** as 
333c0 74 68 65 20 65 71 75 69 76 61 6c 65 6e 74 20 6f  the equivalent o
333d0 70 74 69 6d 69 7a 61 74 69 6f 6e 20 77 69 6c 6c  ptimization will
333e0 20 62 65 20 68 61 6e 64 6c 65 64 20 62 79 20 71   be handled by q
333f0 75 65 72 79 20 70 6c 61 6e 6e 65 72 20 69 6e 0a  uery planner in.
33400 20 20 2a 2a 20 73 71 6c 69 74 65 33 57 68 65 72    ** sqlite3Wher
33410 65 42 65 67 69 6e 28 29 2e 0a 20 20 2a 2f 0a 20  eBegin()..  */. 
33420 20 69 66 28 20 70 54 61 62 4c 69 73 74 2d 3e 6e   if( pTabList->n
33430 53 72 63 3e 31 0a 20 20 20 26 26 20 4f 70 74 69  Src>1.   && Opti
33440 6d 69 7a 61 74 69 6f 6e 45 6e 61 62 6c 65 64 28  mizationEnabled(
33450 64 62 2c 20 53 51 4c 49 54 45 5f 50 72 6f 70 61  db, SQLITE_Propa
33460 67 61 74 65 43 6f 6e 73 74 29 0a 20 20 20 26 26  gateConst).   &&
33470 20 70 72 6f 70 61 67 61 74 65 43 6f 6e 73 74 61   propagateConsta
33480 6e 74 73 28 70 50 61 72 73 65 2c 20 70 29 0a 20  nts(pParse, p). 
33490 20 29 7b 0a 23 69 66 20 53 45 4c 45 43 54 54 52   ){.#if SELECTTR
334a0 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20 20 20  ACE_ENABLED.    
334b0 69 66 28 20 73 71 6c 69 74 65 33 53 65 6c 65 63  if( sqlite3Selec
334c0 74 54 72 61 63 65 20 26 20 30 78 31 30 30 20 29  tTrace & 0x100 )
334d0 7b 0a 20 20 20 20 20 20 53 45 4c 45 43 54 54 52  {.      SELECTTR
334e0 41 43 45 28 30 78 31 30 30 2c 70 50 61 72 73 65  ACE(0x100,pParse
334f0 2c 70 2c 28 22 41 66 74 65 72 20 63 6f 6e 73 74  ,p,("After const
33500 61 6e 74 20 70 72 6f 70 61 67 61 74 69 6f 6e 3a  ant propagation:
33510 5c 6e 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c  \n"));.      sql
33520 69 74 65 33 54 72 65 65 56 69 65 77 53 65 6c 65  ite3TreeViewSele
33530 63 74 28 30 2c 20 70 2c 20 30 29 3b 0a 20 20 20  ct(0, p, 0);.   
33540 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 65 6c 73   }.#endif.  }els
33550 65 7b 0a 20 20 20 20 53 45 4c 45 43 54 54 52 41  e{.    SELECTTRA
33560 43 45 28 30 78 31 30 30 2c 70 50 61 72 73 65 2c  CE(0x100,pParse,
33570 70 2c 28 22 43 6f 6e 73 74 61 6e 74 20 70 72 6f  p,("Constant pro
33580 70 61 67 61 74 69 6f 6e 20 6e 6f 74 20 68 65 6c  pagation not hel
33590 70 66 75 6c 5c 6e 22 29 29 3b 0a 20 20 7d 0a 0a  pful\n"));.  }..
335a0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 43 4f  #ifdef SQLITE_CO
335b0 55 4e 54 4f 46 56 49 45 57 5f 4f 50 54 49 4d 49  UNTOFVIEW_OPTIMI
335c0 5a 41 54 49 4f 4e 0a 20 20 69 66 28 20 4f 70 74  ZATION.  if( Opt
335d0 69 6d 69 7a 61 74 69 6f 6e 45 6e 61 62 6c 65 64  imizationEnabled
335e0 28 64 62 2c 20 53 51 4c 49 54 45 5f 51 75 65 72  (db, SQLITE_Quer
335f0 79 46 6c 61 74 74 65 6e 65 72 7c 53 51 4c 49 54  yFlattener|SQLIT
33600 45 5f 43 6f 75 6e 74 4f 66 56 69 65 77 29 0a 20  E_CountOfView). 
33610 20 20 26 26 20 63 6f 75 6e 74 4f 66 56 69 65 77    && countOfView
33620 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 28 70 50 61  Optimization(pPa
33630 72 73 65 2c 20 70 29 0a 20 20 29 7b 0a 20 20 20  rse, p).  ){.   
33640 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   if( db->mallocF
33650 61 69 6c 65 64 20 29 20 67 6f 74 6f 20 73 65 6c  ailed ) goto sel
33660 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 70 45 4c  ect_end;.    pEL
33670 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b  ist = p->pEList;
33680 0a 20 20 20 20 70 54 61 62 4c 69 73 74 20 3d 20  .    pTabList = 
33690 70 2d 3e 70 53 72 63 3b 0a 20 20 7d 0a 23 65 6e  p->pSrc;.  }.#en
336a0 64 69 66 0a 0a 20 20 2f 2a 20 46 6f 72 20 65 61  dif..  /* For ea
336b0 63 68 20 74 65 72 6d 20 69 6e 20 74 68 65 20 46  ch term in the F
336c0 52 4f 4d 20 63 6c 61 75 73 65 2c 20 64 6f 20 74  ROM clause, do t
336d0 77 6f 20 74 68 69 6e 67 73 3a 0a 20 20 2a 2a 20  wo things:.  ** 
336e0 28 31 29 20 41 75 74 68 6f 72 69 7a 65 64 20 75  (1) Authorized u
336f0 6e 72 65 66 65 72 65 6e 63 65 64 20 74 61 62 6c  nreferenced tabl
33700 65 73 0a 20 20 2a 2a 20 28 32 29 20 47 65 6e 65  es.  ** (2) Gene
33710 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 61 6c  rate code for al
33720 6c 20 73 75 62 2d 71 75 65 72 69 65 73 0a 20 20  l sub-queries.  
33730 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  */.  for(i=0; i<
33740 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20  pTabList->nSrc; 
33750 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75 63 74  i++){.    struct
33760 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
33770 49 74 65 6d 20 3d 20 26 70 54 61 62 4c 69 73 74  Item = &pTabList
33780 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 53 65 6c 65  ->a[i];.    Sele
33790 63 74 44 65 73 74 20 64 65 73 74 3b 0a 20 20 20  ctDest dest;.   
337a0 20 53 65 6c 65 63 74 20 2a 70 53 75 62 3b 0a 23   Select *pSub;.#
337b0 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
337c0 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
337d0 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51  ) || !defined(SQ
337e0 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 0a  LITE_OMIT_VIEW).
337f0 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
33800 7a 53 61 76 65 64 41 75 74 68 43 6f 6e 74 65 78  zSavedAuthContex
33810 74 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f  t;.#endif..    /
33820 2a 20 49 73 73 75 65 20 53 51 4c 49 54 45 5f 52  * Issue SQLITE_R
33830 45 41 44 20 61 75 74 68 6f 72 69 7a 61 74 69 6f  EAD authorizatio
33840 6e 73 20 77 69 74 68 20 61 20 66 61 6b 65 20 63  ns with a fake c
33850 6f 6c 75 6d 6e 20 6e 61 6d 65 20 66 6f 72 20 61  olumn name for a
33860 6e 79 0a 20 20 20 20 2a 2a 20 74 61 62 6c 65 73  ny.    ** tables
33870 20 74 68 61 74 20 61 72 65 20 72 65 66 65 72 65   that are refere
33880 6e 63 65 64 20 62 75 74 20 66 72 6f 6d 20 77 68  nced but from wh
33890 69 63 68 20 6e 6f 20 76 61 6c 75 65 73 20 61 72  ich no values ar
338a0 65 20 65 78 74 72 61 63 74 65 64 2e 0a 20 20 20  e extracted..   
338b0 20 2a 2a 20 45 78 61 6d 70 6c 65 73 20 6f 66 20   ** Examples of 
338c0 77 68 65 72 65 20 74 68 65 73 65 20 6b 69 6e 64  where these kind
338d0 73 20 6f 66 20 6e 75 6c 6c 20 53 51 4c 49 54 45  s of null SQLITE
338e0 5f 52 45 41 44 20 61 75 74 68 6f 72 69 7a 61 74  _READ authorizat
338f0 69 6f 6e 73 0a 20 20 20 20 2a 2a 20 77 6f 75 6c  ions.    ** woul
33900 64 20 6f 63 63 75 72 3a 0a 20 20 20 20 2a 2a 0a  d occur:.    **.
33910 20 20 20 20 2a 2a 20 20 20 20 20 53 45 4c 45 43      **     SELEC
33920 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20  T count(*) FROM 
33930 74 31 3b 20 20 20 2d 2d 20 53 51 4c 49 54 45 5f  t1;   -- SQLITE_
33940 52 45 41 44 20 74 31 2e 22 22 0a 20 20 20 20 2a  READ t1."".    *
33950 2a 20 20 20 20 20 53 45 4c 45 43 54 20 74 31 2e  *     SELECT t1.
33960 2a 20 46 52 4f 4d 20 74 31 2c 20 74 32 3b 20 20  * FROM t1, t2;  
33970 20 2d 2d 20 53 51 4c 49 54 45 5f 52 45 41 44 20   -- SQLITE_READ 
33980 74 32 2e 22 22 0a 20 20 20 20 2a 2a 0a 20 20 20  t2."".    **.   
33990 20 2a 2a 20 54 68 65 20 66 61 6b 65 20 63 6f 6c   ** The fake col
339a0 75 6d 6e 20 6e 61 6d 65 20 69 73 20 61 6e 20 65  umn name is an e
339b0 6d 70 74 79 20 73 74 72 69 6e 67 2e 20 20 49 74  mpty string.  It
339c0 20 69 73 20 70 6f 73 73 69 62 6c 65 20 66 6f 72   is possible for
339d0 20 61 20 74 61 62 6c 65 20 74 6f 0a 20 20 20 20   a table to.    
339e0 2a 2a 20 68 61 76 65 20 61 20 63 6f 6c 75 6d 6e  ** have a column
339f0 20 6e 61 6d 65 64 20 62 79 20 74 68 65 20 65 6d   named by the em
33a00 70 74 79 20 73 74 72 69 6e 67 2c 20 69 6e 20 77  pty string, in w
33a10 68 69 63 68 20 63 61 73 65 20 74 68 65 72 65 20  hich case there 
33a20 69 73 20 6e 6f 20 77 61 79 20 74 6f 0a 20 20 20  is no way to.   
33a30 20 2a 2a 20 64 69 73 74 69 6e 67 75 69 73 68 20   ** distinguish 
33a40 62 65 74 77 65 65 6e 20 61 6e 20 75 6e 72 65 66  between an unref
33a50 65 72 65 6e 63 65 64 20 74 61 62 6c 65 20 61 6e  erenced table an
33a60 64 20 61 6e 20 61 63 74 75 61 6c 20 72 65 66 65  d an actual refe
33a70 72 65 6e 63 65 20 74 6f 20 74 68 65 0a 20 20 20  rence to the.   
33a80 20 2a 2a 20 22 22 20 63 6f 6c 75 6d 6e 2e 20 54   ** "" column. T
33a90 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 65 73 69  he original desi
33aa0 67 6e 20 77 61 73 20 66 6f 72 20 74 68 65 20 66  gn was for the f
33ab0 61 6b 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20  ake column name 
33ac0 74 6f 20 62 65 20 61 20 4e 55 4c 4c 2c 0a 20 20  to be a NULL,.  
33ad0 20 20 2a 2a 20 77 68 69 63 68 20 77 6f 75 6c 64    ** which would
33ae0 20 62 65 20 75 6e 61 6d 62 69 67 75 6f 75 73 2e   be unambiguous.
33af0 20 20 42 75 74 20 6c 65 67 61 63 79 20 61 75 74    But legacy aut
33b00 68 6f 72 69 7a 61 74 69 6f 6e 20 63 61 6c 6c 62  horization callb
33b10 61 63 6b 73 20 6d 69 67 68 74 0a 20 20 20 20 2a  acks might.    *
33b20 2a 20 61 73 73 75 6d 65 20 74 68 65 20 63 6f 6c  * assume the col
33b30 75 6d 6e 20 6e 61 6d 65 20 69 73 20 6e 6f 6e 2d  umn name is non-
33b40 4e 55 4c 4c 20 61 6e 64 20 73 65 67 66 61 75 6c  NULL and segfaul
33b50 74 2e 20 20 54 68 65 20 75 73 65 20 6f 66 20 61  t.  The use of a
33b60 6e 20 65 6d 70 74 79 0a 20 20 20 20 2a 2a 20 73  n empty.    ** s
33b70 74 72 69 6e 67 20 66 6f 72 20 74 68 65 20 66 61  tring for the fa
33b80 6b 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 73  ke column name s
33b90 65 65 6d 73 20 73 61 66 65 72 2e 0a 20 20 20 20  eems safer..    
33ba0 2a 2f 0a 20 20 20 20 69 66 28 20 70 49 74 65 6d  */.    if( pItem
33bb0 2d 3e 63 6f 6c 55 73 65 64 3d 3d 30 20 26 26 20  ->colUsed==0 && 
33bc0 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 21 3d 30 20  pItem->zName!=0 
33bd0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
33be0 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65  AuthCheck(pParse
33bf0 2c 20 53 51 4c 49 54 45 5f 52 45 41 44 2c 20 70  , SQLITE_READ, p
33c00 49 74 65 6d 2d 3e 7a 4e 61 6d 65 2c 20 22 22 2c  Item->zName, "",
33c10 20 70 49 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73   pItem->zDatabas
33c20 65 29 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 20 21  e);.    }..#if !
33c30 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
33c40 4d 49 54 5f 53 55 42 51 55 45 52 59 29 20 7c 7c  MIT_SUBQUERY) ||
33c50 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
33c60 5f 4f 4d 49 54 5f 56 49 45 57 29 0a 20 20 20 20  _OMIT_VIEW).    
33c70 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  /* Generate code
33c80 20 66 6f 72 20 61 6c 6c 20 73 75 62 2d 71 75 65   for all sub-que
33c90 72 69 65 73 20 69 6e 20 74 68 65 20 46 52 4f 4d  ries in the FROM
33ca0 20 63 6c 61 75 73 65 0a 20 20 20 20 2a 2f 0a 20   clause.    */. 
33cb0 20 20 20 70 53 75 62 20 3d 20 70 49 74 65 6d 2d     pSub = pItem-
33cc0 3e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 69 66  >pSelect;.    if
33cd0 28 20 70 53 75 62 3d 3d 30 20 29 20 63 6f 6e 74  ( pSub==0 ) cont
33ce0 69 6e 75 65 3b 0a 0a 20 20 20 20 2f 2a 20 54 68  inue;..    /* Th
33cf0 65 20 63 6f 64 65 20 66 6f 72 20 61 20 73 75 62  e code for a sub
33d00 71 75 65 72 79 20 73 68 6f 75 6c 64 20 6f 6e 6c  query should onl
33d10 79 20 62 65 20 67 65 6e 65 72 61 74 65 64 20 6f  y be generated o
33d20 6e 63 65 2c 20 74 68 6f 75 67 68 20 69 74 20 69  nce, though it i
33d30 73 0a 20 20 20 20 2a 2a 20 74 65 63 68 6e 69 63  s.    ** technic
33d40 61 6c 6c 79 20 68 61 72 6d 6c 65 73 73 20 66 6f  ally harmless fo
33d50 72 20 69 74 20 74 6f 20 62 65 20 67 65 6e 65 72  r it to be gener
33d60 61 74 65 64 20 6d 75 6c 74 69 70 6c 65 20 74 69  ated multiple ti
33d70 6d 65 73 2e 20 54 68 65 0a 20 20 20 20 2a 2a 20  mes. The.    ** 
33d80 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72 74  following assert
33d90 28 29 20 77 69 6c 6c 20 64 65 74 65 63 74 20 69  () will detect i
33da0 66 20 73 6f 6d 65 74 68 69 6e 67 20 63 68 61 6e  f something chan
33db0 67 65 73 20 74 6f 20 63 61 75 73 65 0a 20 20 20  ges to cause.   
33dc0 20 2a 2a 20 74 68 65 20 73 61 6d 65 20 73 75 62   ** the same sub
33dd0 71 75 65 72 79 20 74 6f 20 62 65 20 63 6f 64 65  query to be code
33de0 64 20 6d 75 6c 74 69 70 6c 65 20 74 69 6d 65 73  d multiple times
33df0 2c 20 61 73 20 61 20 73 69 67 6e 61 6c 20 74 6f  , as a signal to
33e00 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 65 76 65   the.    ** deve
33e10 6c 6f 70 65 72 73 20 74 6f 20 74 72 79 20 74 6f  lopers to try to
33e20 20 6f 70 74 69 6d 69 7a 65 20 74 68 65 20 73 69   optimize the si
33e30 74 75 61 74 69 6f 6e 2e 0a 20 20 20 20 2a 2a 0a  tuation..    **.
33e40 20 20 20 20 2a 2a 20 55 70 64 61 74 65 20 32 30      ** Update 20
33e50 31 39 2d 30 37 2d 32 34 3a 0a 20 20 20 20 2a 2a  19-07-24:.    **
33e60 20 53 65 65 20 74 69 63 6b 65 74 20 68 74 74 70   See ticket http
33e70 73 3a 2f 2f 73 71 6c 69 74 65 2e 6f 72 67 2f 73  s://sqlite.org/s
33e80 72 63 2f 74 6b 74 76 69 65 77 2f 63 35 32 62 30  rc/tktview/c52b0
33e90 39 63 37 66 33 38 39 30 33 62 31 33 31 31 63 65  9c7f38903b1311ce
33ea0 63 34 30 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20  c40..    ** The 
33eb0 64 62 73 71 6c 66 75 7a 7a 20 66 75 7a 7a 65 72  dbsqlfuzz fuzzer
33ec0 20 66 6f 75 6e 64 20 61 20 63 61 73 65 20 77 68   found a case wh
33ed0 65 72 65 20 74 68 65 20 73 61 6d 65 20 73 75 62  ere the same sub
33ee0 71 75 65 72 79 20 67 65 74 73 0a 20 20 20 20 2a  query gets.    *
33ef0 2a 20 63 6f 64 65 64 20 74 77 69 63 65 2e 20 20  * coded twice.  
33f00 53 6f 20 74 68 69 73 20 61 73 73 65 72 74 28 29  So this assert()
33f10 20 6e 6f 77 20 62 65 63 6f 6d 65 73 20 61 20 74   now becomes a t
33f20 65 73 74 63 61 73 65 28 29 2e 20 20 49 74 20 73  estcase().  It s
33f30 68 6f 75 6c 64 0a 20 20 20 20 2a 2a 20 62 65 20  hould.    ** be 
33f40 76 65 72 79 20 72 61 72 65 2c 20 74 68 6f 75 67  very rare, thoug
33f50 68 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 74 65  h..    */.    te
33f60 73 74 63 61 73 65 28 20 70 49 74 65 6d 2d 3e 61  stcase( pItem->a
33f70 64 64 72 46 69 6c 6c 53 75 62 21 3d 30 20 29 3b  ddrFillSub!=0 );
33f80 0a 0a 20 20 20 20 2f 2a 20 49 6e 63 72 65 6d 65  ..    /* Increme
33f90 6e 74 20 50 61 72 73 65 2e 6e 48 65 69 67 68 74  nt Parse.nHeight
33fa0 20 62 79 20 74 68 65 20 68 65 69 67 68 74 20 6f   by the height o
33fb0 66 20 74 68 65 20 6c 61 72 67 65 73 74 20 65 78  f the largest ex
33fc0 70 72 65 73 73 69 6f 6e 0a 20 20 20 20 2a 2a 20  pression.    ** 
33fd0 74 72 65 65 20 72 65 66 65 72 72 65 64 20 74 6f  tree referred to
33fe0 20 62 79 20 74 68 69 73 2c 20 74 68 65 20 70 61   by this, the pa
33ff0 72 65 6e 74 20 73 65 6c 65 63 74 2e 20 54 68 65  rent select. The
34000 20 63 68 69 6c 64 20 73 65 6c 65 63 74 0a 20 20   child select.  
34010 20 20 2a 2a 20 6d 61 79 20 63 6f 6e 74 61 69 6e    ** may contain
34020 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65   expression tree
34030 73 20 6f 66 20 61 74 20 6d 6f 73 74 0a 20 20 20  s of at most.   
34040 20 2a 2a 20 28 53 51 4c 49 54 45 5f 4d 41 58 5f   ** (SQLITE_MAX_
34050 45 58 50 52 5f 44 45 50 54 48 2d 50 61 72 73 65  EXPR_DEPTH-Parse
34060 2e 6e 48 65 69 67 68 74 29 20 68 65 69 67 68 74  .nHeight) height
34070 2e 20 54 68 69 73 20 69 73 20 61 20 62 69 74 0a  . This is a bit.
34080 20 20 20 20 2a 2a 20 6d 6f 72 65 20 63 6f 6e 73      ** more cons
34090 65 72 76 61 74 69 76 65 20 74 68 61 6e 20 6e 65  ervative than ne
340a0 63 65 73 73 61 72 79 2c 20 62 75 74 20 6d 75 63  cessary, but muc
340b0 68 20 65 61 73 69 65 72 20 74 68 61 6e 20 65 6e  h easier than en
340c0 66 6f 72 63 69 6e 67 0a 20 20 20 20 2a 2a 20 61  forcing.    ** a
340d0 6e 20 65 78 61 63 74 20 6c 69 6d 69 74 2e 0a 20  n exact limit.. 
340e0 20 20 20 2a 2f 0a 20 20 20 20 70 50 61 72 73 65     */.    pParse
340f0 2d 3e 6e 48 65 69 67 68 74 20 2b 3d 20 73 71 6c  ->nHeight += sql
34100 69 74 65 33 53 65 6c 65 63 74 45 78 70 72 48 65  ite3SelectExprHe
34110 69 67 68 74 28 70 29 3b 0a 0a 20 20 20 20 2f 2a  ight(p);..    /*
34120 20 4d 61 6b 65 20 63 6f 70 69 65 73 20 6f 66 20   Make copies of 
34130 63 6f 6e 73 74 61 6e 74 20 57 48 45 52 45 2d 63  constant WHERE-c
34140 6c 61 75 73 65 20 74 65 72 6d 73 20 69 6e 20 74  lause terms in t
34150 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 64  he outer query d
34160 6f 77 6e 0a 20 20 20 20 2a 2a 20 69 6e 73 69 64  own.    ** insid
34170 65 20 74 68 65 20 73 75 62 71 75 65 72 79 2e 20  e the subquery. 
34180 20 54 68 69 73 20 63 61 6e 20 68 65 6c 70 20 74   This can help t
34190 68 65 20 73 75 62 71 75 65 72 79 20 74 6f 20 72  he subquery to r
341a0 75 6e 20 6d 6f 72 65 20 65 66 66 69 63 69 65 6e  un more efficien
341b0 74 6c 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  tly..    */.    
341c0 69 66 28 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e  if( Optimization
341d0 45 6e 61 62 6c 65 64 28 64 62 2c 20 53 51 4c 49  Enabled(db, SQLI
341e0 54 45 5f 50 75 73 68 44 6f 77 6e 29 0a 20 20 20  TE_PushDown).   
341f0 20 20 26 26 20 70 75 73 68 44 6f 77 6e 57 68 65    && pushDownWhe
34200 72 65 54 65 72 6d 73 28 70 50 61 72 73 65 2c 20  reTerms(pParse, 
34210 70 53 75 62 2c 20 70 2d 3e 70 57 68 65 72 65 2c  pSub, p->pWhere,
34220 20 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 2c   pItem->iCursor,
34230 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
34240 20 20 20 20 20 20 20 20 20 20 20 20 28 70 49 74              (pIt
34250 65 6d 2d 3e 66 67 2e 6a 6f 69 6e 74 79 70 65 20  em->fg.jointype 
34260 26 20 4a 54 5f 4f 55 54 45 52 29 21 3d 30 29 0a  & JT_OUTER)!=0).
34270 20 20 20 20 29 7b 0a 23 69 66 20 53 45 4c 45 43      ){.#if SELEC
34280 54 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20  TTRACE_ENABLED. 
34290 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
342a0 53 65 6c 65 63 74 54 72 61 63 65 20 26 20 30 78  SelectTrace & 0x
342b0 31 30 30 20 29 7b 0a 20 20 20 20 20 20 20 20 53  100 ){.        S
342c0 45 4c 45 43 54 54 52 41 43 45 28 30 78 31 30 30  ELECTTRACE(0x100
342d0 2c 70 50 61 72 73 65 2c 70 2c 0a 20 20 20 20 20  ,pParse,p,.     
342e0 20 20 20 20 20 20 20 28 22 41 66 74 65 72 20 57         ("After W
342f0 48 45 52 45 2d 63 6c 61 75 73 65 20 70 75 73 68  HERE-clause push
34300 2d 64 6f 77 6e 20 69 6e 74 6f 20 73 75 62 71 75  -down into subqu
34310 65 72 79 20 25 64 3a 5c 6e 22 2c 20 70 53 75 62  ery %d:\n", pSub
34320 2d 3e 73 65 6c 49 64 29 29 3b 0a 20 20 20 20 20  ->selId));.     
34330 20 20 20 73 71 6c 69 74 65 33 54 72 65 65 56 69     sqlite3TreeVi
34340 65 77 53 65 6c 65 63 74 28 30 2c 20 70 2c 20 30  ewSelect(0, p, 0
34350 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69  );.      }.#endi
34360 66 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  f.    }else{.   
34370 20 20 20 53 45 4c 45 43 54 54 52 41 43 45 28 30     SELECTTRACE(0
34380 78 31 30 30 2c 70 50 61 72 73 65 2c 70 2c 28 22  x100,pParse,p,("
34390 50 75 73 68 2d 64 6f 77 6e 20 6e 6f 74 20 70 6f  Push-down not po
343a0 73 73 69 62 6c 65 5c 6e 22 29 29 3b 0a 20 20 20  ssible\n"));.   
343b0 20 7d 0a 0a 20 20 20 20 7a 53 61 76 65 64 41 75   }..    zSavedAu
343c0 74 68 43 6f 6e 74 65 78 74 20 3d 20 70 50 61 72  thContext = pPar
343d0 73 65 2d 3e 7a 41 75 74 68 43 6f 6e 74 65 78 74  se->zAuthContext
343e0 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 7a 41  ;.    pParse->zA
343f0 75 74 68 43 6f 6e 74 65 78 74 20 3d 20 70 49 74  uthContext = pIt
34400 65 6d 2d 3e 7a 4e 61 6d 65 3b 0a 0a 20 20 20 20  em->zName;..    
34410 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  /* Generate code
34420 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68   to implement th
34430 65 20 73 75 62 71 75 65 72 79 0a 20 20 20 20 2a  e subquery.    *
34440 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 73 75 62  *.    ** The sub
34450 71 75 65 72 79 20 69 73 20 69 6d 70 6c 65 6d 65  query is impleme
34460 6e 74 65 64 20 61 73 20 61 20 63 6f 2d 72 6f 75  nted as a co-rou
34470 74 69 6e 65 20 69 66 20 74 68 65 20 73 75 62 71  tine if the subq
34480 75 65 72 79 20 69 73 0a 20 20 20 20 2a 2a 20 67  uery is.    ** g
34490 75 61 72 61 6e 74 65 65 64 20 74 6f 20 62 65 20  uaranteed to be 
344a0 74 68 65 20 6f 75 74 65 72 20 6c 6f 6f 70 20 28  the outer loop (
344b0 73 6f 20 74 68 61 74 20 69 74 20 64 6f 65 73 20  so that it does 
344c0 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 0a 20  not need to be. 
344d0 20 20 20 2a 2a 20 63 6f 6d 70 75 74 65 64 20 6d     ** computed m
344e0 6f 72 65 20 74 68 61 6e 20 6f 6e 63 65 29 0a 20  ore than once). 
344f0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 4f 44     **.    ** TOD
34500 4f 3a 20 41 72 65 20 74 68 65 72 65 20 6f 74 68  O: Are there oth
34510 65 72 20 72 65 61 73 6f 6e 73 20 62 65 73 69 64  er reasons besid
34520 65 20 28 31 29 20 74 6f 20 75 73 65 20 61 20 63  e (1) to use a c
34530 6f 2d 72 6f 75 74 69 6e 65 0a 20 20 20 20 2a 2a  o-routine.    **
34540 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 3f   implementation?
34550 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
34560 69 3d 3d 30 0a 20 20 20 20 20 26 26 20 28 70 54  i==0.     && (pT
34570 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3d 3d 31 0a  abList->nSrc==1.
34580 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 28              || (
34590 70 54 61 62 4c 69 73 74 2d 3e 61 5b 31 5d 2e 66  pTabList->a[1].f
345a0 67 2e 6a 6f 69 6e 74 79 70 65 26 28 4a 54 5f 4c  g.jointype&(JT_L
345b0 45 46 54 7c 4a 54 5f 43 52 4f 53 53 29 29 21 3d  EFT|JT_CROSS))!=
345c0 30 29 20 20 2f 2a 20 28 31 29 20 2a 2f 0a 20 20  0)  /* (1) */.  
345d0 20 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 6d    ){.      /* Im
345e0 70 6c 65 6d 65 6e 74 20 61 20 63 6f 2d 72 6f 75  plement a co-rou
345f0 74 69 6e 65 20 74 68 61 74 20 77 69 6c 6c 20 72  tine that will r
34600 65 74 75 72 6e 20 61 20 73 69 6e 67 6c 65 20 72  eturn a single r
34610 6f 77 20 6f 66 20 74 68 65 20 72 65 73 75 6c 74  ow of the result
34620 0a 20 20 20 20 20 20 2a 2a 20 73 65 74 20 6f 6e  .      ** set on
34630 20 65 61 63 68 20 69 6e 76 6f 63 61 74 69 6f 6e   each invocation
34640 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
34650 20 69 6e 74 20 61 64 64 72 54 6f 70 20 3d 20 73   int addrTop = s
34660 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
34670 74 41 64 64 72 28 76 29 2b 31 3b 0a 20 20 20 20  tAddr(v)+1;.    
34680 20 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 72   .      pItem->r
34690 65 67 52 65 74 75 72 6e 20 3d 20 2b 2b 70 50 61  egReturn = ++pPa
346a0 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20  rse->nMem;.     
346b0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
346c0 70 33 28 76 2c 20 4f 50 5f 49 6e 69 74 43 6f 72  p3(v, OP_InitCor
346d0 6f 75 74 69 6e 65 2c 20 70 49 74 65 6d 2d 3e 72  outine, pItem->r
346e0 65 67 52 65 74 75 72 6e 2c 20 30 2c 20 61 64 64  egReturn, 0, add
346f0 72 54 6f 70 29 3b 0a 20 20 20 20 20 20 56 64 62  rTop);.      Vdb
34700 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 25 73  eComment((v, "%s
34710 22 2c 20 70 49 74 65 6d 2d 3e 70 54 61 62 2d 3e  ", pItem->pTab->
34720 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 20 20 70  zName));.      p
34730 49 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75  Item->addrFillSu
34740 62 20 3d 20 61 64 64 72 54 6f 70 3b 0a 20 20 20  b = addrTop;.   
34750 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74     sqlite3Select
34760 44 65 73 74 49 6e 69 74 28 26 64 65 73 74 2c 20  DestInit(&dest, 
34770 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 2c 20 70  SRT_Coroutine, p
34780 49 74 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e 29  Item->regReturn)
34790 3b 0a 20 20 20 20 20 20 45 78 70 6c 61 69 6e 51  ;.      ExplainQ
347a0 75 65 72 79 50 6c 61 6e 28 28 70 50 61 72 73 65  ueryPlan((pParse
347b0 2c 20 31 2c 20 22 43 4f 2d 52 4f 55 54 49 4e 45  , 1, "CO-ROUTINE
347c0 20 25 75 22 2c 20 70 53 75 62 2d 3e 73 65 6c 49   %u", pSub->selI
347d0 64 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  d));.      sqlit
347e0 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c  e3Select(pParse,
347f0 20 70 53 75 62 2c 20 26 64 65 73 74 29 3b 0a 20   pSub, &dest);. 
34800 20 20 20 20 20 70 49 74 65 6d 2d 3e 70 54 61 62       pItem->pTab
34810 2d 3e 6e 52 6f 77 4c 6f 67 45 73 74 20 3d 20 70  ->nRowLogEst = p
34820 53 75 62 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 3b  Sub->nSelectRow;
34830 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 66 67  .      pItem->fg
34840 2e 76 69 61 43 6f 72 6f 75 74 69 6e 65 20 3d 20  .viaCoroutine = 
34850 31 3b 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e  1;.      pItem->
34860 72 65 67 52 65 73 75 6c 74 20 3d 20 64 65 73 74  regResult = dest
34870 2e 69 53 64 73 74 3b 0a 20 20 20 20 20 20 73 71  .iSdst;.      sq
34880 6c 69 74 65 33 56 64 62 65 45 6e 64 43 6f 72 6f  lite3VdbeEndCoro
34890 75 74 69 6e 65 28 76 2c 20 70 49 74 65 6d 2d 3e  utine(v, pItem->
348a0 72 65 67 52 65 74 75 72 6e 29 3b 0a 20 20 20 20  regReturn);.    
348b0 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
348c0 70 48 65 72 65 28 76 2c 20 61 64 64 72 54 6f 70  pHere(v, addrTop
348d0 2d 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  -1);.      sqlit
348e0 65 33 43 6c 65 61 72 54 65 6d 70 52 65 67 43 61  e3ClearTempRegCa
348f0 63 68 65 28 70 50 61 72 73 65 29 3b 0a 20 20 20  che(pParse);.   
34900 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a   }else{.      /*
34910 20 47 65 6e 65 72 61 74 65 20 61 20 73 75 62 72   Generate a subr
34920 6f 75 74 69 6e 65 20 74 68 61 74 20 77 69 6c 6c  outine that will
34930 20 66 69 6c 6c 20 61 6e 20 65 70 68 65 6d 65 72   fill an ephemer
34940 61 6c 20 74 61 62 6c 65 20 77 69 74 68 0a 20 20  al table with.  
34950 20 20 20 20 2a 2a 20 74 68 65 20 63 6f 6e 74 65      ** the conte
34960 6e 74 20 6f 66 20 74 68 69 73 20 73 75 62 71 75  nt of this subqu
34970 65 72 79 2e 20 20 70 49 74 65 6d 2d 3e 61 64 64  ery.  pItem->add
34980 72 46 69 6c 6c 53 75 62 20 77 69 6c 6c 20 70 6f  rFillSub will po
34990 69 6e 74 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20  int.      ** to 
349a0 74 68 65 20 61 64 64 72 65 73 73 20 6f 66 20 74  the address of t
349b0 68 65 20 67 65 6e 65 72 61 74 65 64 20 73 75 62  he generated sub
349c0 72 6f 75 74 69 6e 65 2e 20 20 70 49 74 65 6d 2d  routine.  pItem-
349d0 3e 72 65 67 52 65 74 75 72 6e 0a 20 20 20 20 20  >regReturn.     
349e0 20 2a 2a 20 69 73 20 61 20 72 65 67 69 73 74 65   ** is a registe
349f0 72 20 61 6c 6c 6f 63 61 74 65 64 20 74 6f 20 68  r allocated to h
34a00 6f 6c 64 20 74 68 65 20 73 75 62 72 6f 75 74 69  old the subrouti
34a10 6e 65 20 72 65 74 75 72 6e 20 61 64 64 72 65 73  ne return addres
34a20 73 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  s.      */.     
34a30 20 69 6e 74 20 74 6f 70 41 64 64 72 3b 0a 20 20   int topAddr;.  
34a40 20 20 20 20 69 6e 74 20 6f 6e 63 65 41 64 64 72      int onceAddr
34a50 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 6e 74 20   = 0;.      int 
34a60 72 65 74 41 64 64 72 3b 0a 20 20 20 20 20 20 73  retAddr;.      s
34a70 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
34a80 65 6d 20 2a 70 50 72 69 6f 72 3b 0a 0a 20 20 20  em *pPrior;..   
34a90 20 20 20 74 65 73 74 63 61 73 65 28 20 70 49 74     testcase( pIt
34aa0 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75 62 3d  em->addrFillSub=
34ab0 3d 30 20 29 3b 20 2f 2a 20 54 69 63 6b 65 74 20  =0 ); /* Ticket 
34ac0 63 35 32 62 30 39 63 37 66 33 38 39 30 33 62 31  c52b09c7f38903b1
34ad0 33 31 31 20 2a 2f 0a 20 20 20 20 20 20 70 49 74  311 */.      pIt
34ae0 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e 20 3d 20  em->regReturn = 
34af0 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
34b00 20 20 20 20 20 20 74 6f 70 41 64 64 72 20 3d 20        topAddr = 
34b10 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
34b20 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
34b30 20 30 2c 20 70 49 74 65 6d 2d 3e 72 65 67 52 65   0, pItem->regRe
34b40 74 75 72 6e 29 3b 0a 20 20 20 20 20 20 70 49 74  turn);.      pIt
34b50 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75 62 20  em->addrFillSub 
34b60 3d 20 74 6f 70 41 64 64 72 2b 31 3b 0a 20 20 20  = topAddr+1;.   
34b70 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 66 67     if( pItem->fg
34b80 2e 69 73 43 6f 72 72 65 6c 61 74 65 64 3d 3d 30  .isCorrelated==0
34b90 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49   ){.        /* I
34ba0 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20 69  f the subquery i
34bb0 73 20 6e 6f 74 20 63 6f 72 72 65 6c 61 74 65 64  s not correlated
34bc0 20 61 6e 64 20 69 66 20 77 65 20 61 72 65 20 6e   and if we are n
34bd0 6f 74 20 69 6e 73 69 64 65 20 6f 66 0a 20 20 20  ot inside of.   
34be0 20 20 20 20 20 2a 2a 20 61 20 74 72 69 67 67 65       ** a trigge
34bf0 72 2c 20 74 68 65 6e 20 77 65 20 6f 6e 6c 79 20  r, then we only 
34c00 6e 65 65 64 20 74 6f 20 63 6f 6d 70 75 74 65 20  need to compute 
34c10 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65  the value of the
34c20 20 73 75 62 71 75 65 72 79 0a 20 20 20 20 20 20   subquery.      
34c30 20 20 2a 2a 20 6f 6e 63 65 2e 20 2a 2f 0a 20 20    ** once. */.  
34c40 20 20 20 20 20 20 6f 6e 63 65 41 64 64 72 20 3d        onceAddr =
34c50 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
34c60 70 30 28 76 2c 20 4f 50 5f 4f 6e 63 65 29 3b 20  p0(v, OP_Once); 
34c70 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
34c80 0a 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 6d  .        VdbeCom
34c90 6d 65 6e 74 28 28 76 2c 20 22 6d 61 74 65 72 69  ment((v, "materi
34ca0 61 6c 69 7a 65 20 5c 22 25 73 5c 22 22 2c 20 70  alize \"%s\"", p
34cb0 49 74 65 6d 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d  Item->pTab->zNam
34cc0 65 29 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  e));.      }else
34cd0 7b 0a 20 20 20 20 20 20 20 20 56 64 62 65 4e 6f  {.        VdbeNo
34ce0 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 6d  opComment((v, "m
34cf0 61 74 65 72 69 61 6c 69 7a 65 20 5c 22 25 73 5c  aterialize \"%s\
34d00 22 22 2c 20 70 49 74 65 6d 2d 3e 70 54 61 62 2d  "", pItem->pTab-
34d10 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 20 20  >zName));.      
34d20 7d 0a 20 20 20 20 20 20 70 50 72 69 6f 72 20 3d  }.      pPrior =
34d30 20 69 73 53 65 6c 66 4a 6f 69 6e 56 69 65 77 28   isSelfJoinView(
34d40 70 54 61 62 4c 69 73 74 2c 20 70 49 74 65 6d 29  pTabList, pItem)
34d50 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50 72 69  ;.      if( pPri
34d60 6f 72 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  or ){.        sq
34d70 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
34d80 76 2c 20 4f 50 5f 4f 70 65 6e 44 75 70 2c 20 70  v, OP_OpenDup, p
34d90 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 2c 20 70  Item->iCursor, p
34da0 50 72 69 6f 72 2d 3e 69 43 75 72 73 6f 72 29 3b  Prior->iCursor);
34db0 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
34dc0 20 70 50 72 69 6f 72 2d 3e 70 53 65 6c 65 63 74   pPrior->pSelect
34dd0 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 70  !=0 );.        p
34de0 53 75 62 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20  Sub->nSelectRow 
34df0 3d 20 70 50 72 69 6f 72 2d 3e 70 53 65 6c 65 63  = pPrior->pSelec
34e00 74 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 3b 0a 20  t->nSelectRow;. 
34e10 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
34e20 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63      sqlite3Selec
34e30 74 44 65 73 74 49 6e 69 74 28 26 64 65 73 74 2c  tDestInit(&dest,
34e40 20 53 52 54 5f 45 70 68 65 6d 54 61 62 2c 20 70   SRT_EphemTab, p
34e50 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 29 3b 0a  Item->iCursor);.
34e60 20 20 20 20 20 20 20 20 45 78 70 6c 61 69 6e 51          ExplainQ
34e70 75 65 72 79 50 6c 61 6e 28 28 70 50 61 72 73 65  ueryPlan((pParse
34e80 2c 20 31 2c 20 22 4d 41 54 45 52 49 41 4c 49 5a  , 1, "MATERIALIZ
34e90 45 20 25 75 22 2c 20 70 53 75 62 2d 3e 73 65 6c  E %u", pSub->sel
34ea0 49 64 29 29 3b 0a 20 20 20 20 20 20 20 20 73 71  Id));.        sq
34eb0 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72  lite3Select(pPar
34ec0 73 65 2c 20 70 53 75 62 2c 20 26 64 65 73 74 29  se, pSub, &dest)
34ed0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
34ee0 70 49 74 65 6d 2d 3e 70 54 61 62 2d 3e 6e 52 6f  pItem->pTab->nRo
34ef0 77 4c 6f 67 45 73 74 20 3d 20 70 53 75 62 2d 3e  wLogEst = pSub->
34f00 6e 53 65 6c 65 63 74 52 6f 77 3b 0a 20 20 20 20  nSelectRow;.    
34f10 20 20 69 66 28 20 6f 6e 63 65 41 64 64 72 20 29    if( onceAddr )
34f20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
34f30 48 65 72 65 28 76 2c 20 6f 6e 63 65 41 64 64 72  Here(v, onceAddr
34f40 29 3b 0a 20 20 20 20 20 20 72 65 74 41 64 64 72  );.      retAddr
34f50 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
34f60 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 74 75 72  dOp1(v, OP_Retur
34f70 6e 2c 20 70 49 74 65 6d 2d 3e 72 65 67 52 65 74  n, pItem->regRet
34f80 75 72 6e 29 3b 0a 20 20 20 20 20 20 56 64 62 65  urn);.      Vdbe
34f90 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 65 6e 64  Comment((v, "end
34fa0 20 25 73 22 2c 20 70 49 74 65 6d 2d 3e 70 54 61   %s", pItem->pTa
34fb0 62 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20  b->zName));.    
34fc0 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
34fd0 6e 67 65 50 31 28 76 2c 20 74 6f 70 41 64 64 72  ngeP1(v, topAddr
34fe0 2c 20 72 65 74 41 64 64 72 29 3b 0a 20 20 20 20  , retAddr);.    
34ff0 20 20 73 71 6c 69 74 65 33 43 6c 65 61 72 54 65    sqlite3ClearTe
35000 6d 70 52 65 67 43 61 63 68 65 28 70 50 61 72 73  mpRegCache(pPars
35010 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  e);.    }.    if
35020 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
35030 65 64 20 29 20 67 6f 74 6f 20 73 65 6c 65 63 74  ed ) goto select
35040 5f 65 6e 64 3b 0a 20 20 20 20 70 50 61 72 73 65  _end;.    pParse
35050 2d 3e 6e 48 65 69 67 68 74 20 2d 3d 20 73 71 6c  ->nHeight -= sql
35060 69 74 65 33 53 65 6c 65 63 74 45 78 70 72 48 65  ite3SelectExprHe
35070 69 67 68 74 28 70 29 3b 0a 20 20 20 20 70 50 61  ight(p);.    pPa
35080 72 73 65 2d 3e 7a 41 75 74 68 43 6f 6e 74 65 78  rse->zAuthContex
35090 74 20 3d 20 7a 53 61 76 65 64 41 75 74 68 43 6f  t = zSavedAuthCo
350a0 6e 74 65 78 74 3b 0a 23 65 6e 64 69 66 0a 20 20  ntext;.#endif.  
350b0 7d 0a 0a 20 20 2f 2a 20 56 61 72 69 6f 75 73 20  }..  /* Various 
350c0 65 6c 65 6d 65 6e 74 73 20 6f 66 20 74 68 65 20  elements of the 
350d0 53 45 4c 45 43 54 20 63 6f 70 69 65 64 20 69 6e  SELECT copied in
350e0 74 6f 20 6c 6f 63 61 6c 20 76 61 72 69 61 62 6c  to local variabl
350f0 65 73 20 66 6f 72 0a 20 20 2a 2a 20 63 6f 6e 76  es for.  ** conv
35100 65 6e 69 65 6e 63 65 20 2a 2f 0a 20 20 70 45 4c  enience */.  pEL
35110 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b  ist = p->pEList;
35120 0a 20 20 70 57 68 65 72 65 20 3d 20 70 2d 3e 70  .  pWhere = p->p
35130 57 68 65 72 65 3b 0a 20 20 70 47 72 6f 75 70 42  Where;.  pGroupB
35140 79 20 3d 20 70 2d 3e 70 47 72 6f 75 70 42 79 3b  y = p->pGroupBy;
35150 0a 20 20 70 48 61 76 69 6e 67 20 3d 20 70 2d 3e  .  pHaving = p->
35160 70 48 61 76 69 6e 67 3b 0a 20 20 73 44 69 73 74  pHaving;.  sDist
35170 69 6e 63 74 2e 69 73 54 6e 63 74 20 3d 20 28 70  inct.isTnct = (p
35180 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f  ->selFlags & SF_
35190 44 69 73 74 69 6e 63 74 29 21 3d 30 3b 0a 0a 23  Distinct)!=0;..#
351a0 69 66 20 53 45 4c 45 43 54 54 52 41 43 45 5f 45  if SELECTTRACE_E
351b0 4e 41 42 4c 45 44 0a 20 20 69 66 28 20 73 71 6c  NABLED.  if( sql
351c0 69 74 65 33 53 65 6c 65 63 74 54 72 61 63 65 20  ite3SelectTrace 
351d0 26 20 30 78 34 30 30 20 29 7b 0a 20 20 20 20 53  & 0x400 ){.    S
351e0 45 4c 45 43 54 54 52 41 43 45 28 30 78 34 30 30  ELECTTRACE(0x400
351f0 2c 70 50 61 72 73 65 2c 70 2c 28 22 41 66 74 65  ,pParse,p,("Afte
35200 72 20 61 6c 6c 20 46 52 4f 4d 2d 63 6c 61 75 73  r all FROM-claus
35210 65 20 61 6e 61 6c 79 73 69 73 3a 5c 6e 22 29 29  e analysis:\n"))
35220 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 54 72 65  ;.    sqlite3Tre
35230 65 56 69 65 77 53 65 6c 65 63 74 28 30 2c 20 70  eViewSelect(0, p
35240 2c 20 30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  , 0);.  }.#endif
35250 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 71 75  ..  /* If the qu
35260 65 72 79 20 69 73 20 44 49 53 54 49 4e 43 54 20  ery is DISTINCT 
35270 77 69 74 68 20 61 6e 20 4f 52 44 45 52 20 42 59  with an ORDER BY
35280 20 62 75 74 20 69 73 20 6e 6f 74 20 61 6e 20 61   but is not an a
35290 67 67 72 65 67 61 74 65 2c 20 61 6e 64 20 0a 20  ggregate, and . 
352a0 20 2a 2a 20 69 66 20 74 68 65 20 73 65 6c 65 63   ** if the selec
352b0 74 2d 6c 69 73 74 20 69 73 20 74 68 65 20 73 61  t-list is the sa
352c0 6d 65 20 61 73 20 74 68 65 20 4f 52 44 45 52 20  me as the ORDER 
352d0 42 59 20 6c 69 73 74 2c 20 74 68 65 6e 20 74 68  BY list, then th
352e0 69 73 20 71 75 65 72 79 0a 20 20 2a 2a 20 63 61  is query.  ** ca
352f0 6e 20 62 65 20 72 65 77 72 69 74 74 65 6e 20 61  n be rewritten a
35300 73 20 61 20 47 52 4f 55 50 20 42 59 2e 20 49 6e  s a GROUP BY. In
35310 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 74 68   other words, th
35320 69 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  is:.  **.  **   
35330 20 20 53 45 4c 45 43 54 20 44 49 53 54 49 4e 43    SELECT DISTINC
35340 54 20 78 79 7a 20 46 52 4f 4d 20 2e 2e 2e 20 4f  T xyz FROM ... O
35350 52 44 45 52 20 42 59 20 78 79 7a 0a 20 20 2a 2a  RDER BY xyz.  **
35360 0a 20 20 2a 2a 20 69 73 20 74 72 61 6e 73 66 6f  .  ** is transfo
35370 72 6d 65 64 20 74 6f 3a 0a 20 20 2a 2a 0a 20 20  rmed to:.  **.  
35380 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 78 79  **     SELECT xy
35390 7a 20 46 52 4f 4d 20 2e 2e 2e 20 47 52 4f 55 50  z FROM ... GROUP
353a0 20 42 59 20 78 79 7a 20 4f 52 44 45 52 20 42 59   BY xyz ORDER BY
353b0 20 78 79 7a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54   xyz.  **.  ** T
353c0 68 65 20 73 65 63 6f 6e 64 20 66 6f 72 6d 20 69  he second form i
353d0 73 20 70 72 65 66 65 72 72 65 64 20 61 73 20 61  s preferred as a
353e0 20 73 69 6e 67 6c 65 20 69 6e 64 65 78 20 28 6f   single index (o
353f0 72 20 74 65 6d 70 2d 74 61 62 6c 65 29 20 6d 61  r temp-table) ma
35400 79 20 62 65 20 0a 20 20 2a 2a 20 75 73 65 64 20  y be .  ** used 
35410 66 6f 72 20 62 6f 74 68 20 74 68 65 20 4f 52 44  for both the ORD
35420 45 52 20 42 59 20 61 6e 64 20 44 49 53 54 49 4e  ER BY and DISTIN
35430 43 54 20 70 72 6f 63 65 73 73 69 6e 67 2e 20 41  CT processing. A
35440 73 20 6f 72 69 67 69 6e 61 6c 6c 79 20 0a 20 20  s originally .  
35450 2a 2a 20 77 72 69 74 74 65 6e 20 74 68 65 20 71  ** written the q
35460 75 65 72 79 20 6d 75 73 74 20 75 73 65 20 61 20  uery must use a 
35470 74 65 6d 70 2d 74 61 62 6c 65 20 66 6f 72 20 61  temp-table for a
35480 74 20 6c 65 61 73 74 20 6f 6e 65 20 6f 66 20 74  t least one of t
35490 68 65 20 4f 52 44 45 52 20 0a 20 20 2a 2a 20 42  he ORDER .  ** B
354a0 59 20 61 6e 64 20 44 49 53 54 49 4e 43 54 2c 20  Y and DISTINCT, 
354b0 61 6e 64 20 61 6e 20 69 6e 64 65 78 20 6f 72 20  and an index or 
354c0 73 65 70 61 72 61 74 65 20 74 65 6d 70 2d 74 61  separate temp-ta
354d0 62 6c 65 20 66 6f 72 20 74 68 65 20 6f 74 68 65  ble for the othe
354e0 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 70  r..  */.  if( (p
354f0 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 28 53 46  ->selFlags & (SF
35500 5f 44 69 73 74 69 6e 63 74 7c 53 46 5f 41 67 67  _Distinct|SF_Agg
35510 72 65 67 61 74 65 29 29 3d 3d 53 46 5f 44 69 73  regate))==SF_Dis
35520 74 69 6e 63 74 20 0a 20 20 20 26 26 20 73 71 6c  tinct .   && sql
35530 69 74 65 33 45 78 70 72 4c 69 73 74 43 6f 6d 70  ite3ExprListComp
35540 61 72 65 28 73 53 6f 72 74 2e 70 4f 72 64 65 72  are(sSort.pOrder
35550 42 79 2c 20 70 45 4c 69 73 74 2c 20 2d 31 29 3d  By, pEList, -1)=
35560 3d 30 0a 20 20 29 7b 0a 20 20 20 20 70 2d 3e 73  =0.  ){.    p->s
35570 65 6c 46 6c 61 67 73 20 26 3d 20 7e 53 46 5f 44  elFlags &= ~SF_D
35580 69 73 74 69 6e 63 74 3b 0a 20 20 20 20 70 47 72  istinct;.    pGr
35590 6f 75 70 42 79 20 3d 20 70 2d 3e 70 47 72 6f 75  oupBy = p->pGrou
355a0 70 42 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70  pBy = sqlite3Exp
355b0 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70 45 4c  rListDup(db, pEL
355c0 69 73 74 2c 20 30 29 3b 0a 20 20 20 20 2f 2a 20  ist, 0);.    /* 
355d0 4e 6f 74 69 63 65 20 74 68 61 74 20 65 76 65 6e  Notice that even
355e0 20 74 68 6f 75 67 68 74 20 53 46 5f 44 69 73 74   thought SF_Dist
355f0 69 6e 63 74 20 68 61 73 20 62 65 65 6e 20 63 6c  inct has been cl
35600 65 61 72 65 64 20 66 72 6f 6d 20 70 2d 3e 73 65  eared from p->se
35610 6c 46 6c 61 67 73 2c 0a 20 20 20 20 2a 2a 20 74  lFlags,.    ** t
35620 68 65 20 73 44 69 73 74 69 6e 63 74 2e 69 73 54  he sDistinct.isT
35630 6e 63 74 20 69 73 20 73 74 69 6c 6c 20 73 65 74  nct is still set
35640 2e 20 20 48 65 6e 63 65 2c 20 69 73 54 6e 63 74  .  Hence, isTnct
35650 20 72 65 70 72 65 73 65 6e 74 73 20 74 68 65 0a   represents the.
35660 20 20 20 20 2a 2a 20 6f 72 69 67 69 6e 61 6c 20      ** original 
35670 73 65 74 74 69 6e 67 20 6f 66 20 74 68 65 20 53  setting of the S
35680 46 5f 44 69 73 74 69 6e 63 74 20 66 6c 61 67 2c  F_Distinct flag,
35690 20 6e 6f 74 20 74 68 65 20 63 75 72 72 65 6e 74   not the current
356a0 20 73 65 74 74 69 6e 67 20 2a 2f 0a 20 20 20 20   setting */.    
356b0 61 73 73 65 72 74 28 20 73 44 69 73 74 69 6e 63  assert( sDistinc
356c0 74 2e 69 73 54 6e 63 74 20 29 3b 0a 0a 23 69 66  t.isTnct );..#if
356d0 20 53 45 4c 45 43 54 54 52 41 43 45 5f 45 4e 41   SELECTTRACE_ENA
356e0 42 4c 45 44 0a 20 20 20 20 69 66 28 20 73 71 6c  BLED.    if( sql
356f0 69 74 65 33 53 65 6c 65 63 74 54 72 61 63 65 20  ite3SelectTrace 
35700 26 20 30 78 34 30 30 20 29 7b 0a 20 20 20 20 20  & 0x400 ){.     
35710 20 53 45 4c 45 43 54 54 52 41 43 45 28 30 78 34   SELECTTRACE(0x4
35720 30 30 2c 70 50 61 72 73 65 2c 70 2c 28 22 54 72  00,pParse,p,("Tr
35730 61 6e 73 66 6f 72 6d 20 44 49 53 54 49 4e 43 54  ansform DISTINCT
35740 20 69 6e 74 6f 20 47 52 4f 55 50 20 42 59 3a 5c   into GROUP BY:\
35750 6e 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  n"));.      sqli
35760 74 65 33 54 72 65 65 56 69 65 77 53 65 6c 65 63  te3TreeViewSelec
35770 74 28 30 2c 20 70 2c 20 30 29 3b 0a 20 20 20 20  t(0, p, 0);.    
35780 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 20 20  }.#endif.  }..  
35790 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 61  /* If there is a
357a0 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  n ORDER BY claus
357b0 65 2c 20 74 68 65 6e 20 63 72 65 61 74 65 20 61  e, then create a
357c0 6e 20 65 70 68 65 6d 65 72 61 6c 20 69 6e 64 65  n ephemeral inde
357d0 78 20 74 6f 0a 20 20 2a 2a 20 64 6f 20 74 68 65  x to.  ** do the
357e0 20 73 6f 72 74 69 6e 67 2e 20 20 42 75 74 20 74   sorting.  But t
357f0 68 69 73 20 73 6f 72 74 69 6e 67 20 65 70 68 65  his sorting ephe
35800 6d 65 72 61 6c 20 69 6e 64 65 78 20 6d 69 67 68  meral index migh
35810 74 20 65 6e 64 20 75 70 0a 20 20 2a 2a 20 62 65  t end up.  ** be
35820 69 6e 67 20 75 6e 75 73 65 64 20 69 66 20 74 68  ing unused if th
35830 65 20 64 61 74 61 20 63 61 6e 20 62 65 20 65 78  e data can be ex
35840 74 72 61 63 74 65 64 20 69 6e 20 70 72 65 2d 73  tracted in pre-s
35850 6f 72 74 65 64 20 6f 72 64 65 72 2e 0a 20 20 2a  orted order..  *
35860 2a 20 49 66 20 74 68 61 74 20 69 73 20 74 68 65  * If that is the
35870 20 63 61 73 65 2c 20 74 68 65 6e 20 74 68 65 20   case, then the 
35880 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c  OP_OpenEphemeral
35890 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 77 69 6c   instruction wil
358a0 6c 20 62 65 0a 20 20 2a 2a 20 63 68 61 6e 67 65  l be.  ** change
358b0 64 20 74 6f 20 61 6e 20 4f 50 5f 4e 6f 6f 70 20  d to an OP_Noop 
358c0 6f 6e 63 65 20 77 65 20 66 69 67 75 72 65 20 6f  once we figure o
358d0 75 74 20 74 68 61 74 20 74 68 65 20 73 6f 72 74  ut that the sort
358e0 69 6e 67 20 69 6e 64 65 78 20 69 73 0a 20 20 2a  ing index is.  *
358f0 2a 20 6e 6f 74 20 6e 65 65 64 65 64 2e 20 20 54  * not needed.  T
35900 68 65 20 73 53 6f 72 74 2e 61 64 64 72 53 6f 72  he sSort.addrSor
35910 74 49 6e 64 65 78 20 76 61 72 69 61 62 6c 65 20  tIndex variable 
35920 69 73 20 75 73 65 64 20 74 6f 20 66 61 63 69 6c  is used to facil
35930 69 74 61 74 65 0a 20 20 2a 2a 20 74 68 61 74 20  itate.  ** that 
35940 63 68 61 6e 67 65 2e 0a 20 20 2a 2f 0a 20 20 69  change..  */.  i
35950 66 28 20 73 53 6f 72 74 2e 70 4f 72 64 65 72 42  f( sSort.pOrderB
35960 79 20 29 7b 0a 20 20 20 20 4b 65 79 49 6e 66 6f  y ){.    KeyInfo
35970 20 2a 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 20 20   *pKeyInfo;.    
35980 70 4b 65 79 49 6e 66 6f 20 3d 20 73 71 6c 69 74  pKeyInfo = sqlit
35990 65 33 4b 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70  e3KeyInfoFromExp
359a0 72 4c 69 73 74 28 0a 20 20 20 20 20 20 20 20 70  rList(.        p
359b0 50 61 72 73 65 2c 20 73 53 6f 72 74 2e 70 4f 72  Parse, sSort.pOr
359c0 64 65 72 42 79 2c 20 30 2c 20 70 45 4c 69 73 74  derBy, 0, pEList
359d0 2d 3e 6e 45 78 70 72 29 3b 0a 20 20 20 20 73 53  ->nExpr);.    sS
359e0 6f 72 74 2e 69 45 43 75 72 73 6f 72 20 3d 20 70  ort.iECursor = p
359f0 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20  Parse->nTab++;. 
35a00 20 20 20 73 53 6f 72 74 2e 61 64 64 72 53 6f 72     sSort.addrSor
35a10 74 49 6e 64 65 78 20 3d 0a 20 20 20 20 20 20 73  tIndex =.      s
35a20 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
35a30 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d  (v, OP_OpenEphem
35a40 65 72 61 6c 2c 0a 20 20 20 20 20 20 20 20 20 20  eral,.          
35a50 73 53 6f 72 74 2e 69 45 43 75 72 73 6f 72 2c 20  sSort.iECursor, 
35a60 73 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 2d 3e  sSort.pOrderBy->
35a70 6e 45 78 70 72 2b 31 2b 70 45 4c 69 73 74 2d 3e  nExpr+1+pEList->
35a80 6e 45 78 70 72 2c 20 30 2c 0a 20 20 20 20 20 20  nExpr, 0,.      
35a90 20 20 20 20 28 63 68 61 72 2a 29 70 4b 65 79 49      (char*)pKeyI
35aa0 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 0a  nfo, P4_KEYINFO.
35ab0 20 20 20 20 20 20 29 3b 0a 20 20 7d 65 6c 73 65        );.  }else
35ac0 7b 0a 20 20 20 20 73 53 6f 72 74 2e 61 64 64 72  {.    sSort.addr
35ad0 53 6f 72 74 49 6e 64 65 78 20 3d 20 2d 31 3b 0a  SortIndex = -1;.
35ae0 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65    }..  /* If the
35af0 20 6f 75 74 70 75 74 20 69 73 20 64 65 73 74 69   output is desti
35b00 6e 65 64 20 66 6f 72 20 61 20 74 65 6d 70 6f 72  ned for a tempor
35b10 61 72 79 20 74 61 62 6c 65 2c 20 6f 70 65 6e 20  ary table, open 
35b20 74 68 61 74 20 74 61 62 6c 65 2e 0a 20 20 2a 2f  that table..  */
35b30 0a 20 20 69 66 28 20 70 44 65 73 74 2d 3e 65 44  .  if( pDest->eD
35b40 65 73 74 3d 3d 53 52 54 5f 45 70 68 65 6d 54 61  est==SRT_EphemTa
35b50 62 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  b ){.    sqlite3
35b60 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
35b70 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20  _OpenEphemeral, 
35b80 70 44 65 73 74 2d 3e 69 53 44 50 61 72 6d 2c 20  pDest->iSDParm, 
35b90 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b 0a  pEList->nExpr);.
35ba0 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68    }..  /* Set th
35bb0 65 20 6c 69 6d 69 74 65 72 2e 0a 20 20 2a 2f 0a  e limiter..  */.
35bc0 20 20 69 45 6e 64 20 3d 20 73 71 6c 69 74 65 33    iEnd = sqlite3
35bd0 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 70 50  VdbeMakeLabel(pP
35be0 61 72 73 65 29 3b 0a 20 20 69 66 28 20 28 70 2d  arse);.  if( (p-
35bf0 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 46  >selFlags & SF_F
35c00 69 78 65 64 4c 69 6d 69 74 29 3d 3d 30 20 29 7b  ixedLimit)==0 ){
35c10 0a 20 20 20 20 70 2d 3e 6e 53 65 6c 65 63 74 52  .    p->nSelectR
35c20 6f 77 20 3d 20 33 32 30 3b 20 20 2f 2a 20 34 20  ow = 320;  /* 4 
35c30 62 69 6c 6c 69 6f 6e 20 72 6f 77 73 20 2a 2f 0a  billion rows */.
35c40 20 20 7d 0a 20 20 63 6f 6d 70 75 74 65 4c 69 6d    }.  computeLim
35c50 69 74 52 65 67 69 73 74 65 72 73 28 70 50 61 72  itRegisters(pPar
35c60 73 65 2c 20 70 2c 20 69 45 6e 64 29 3b 0a 20 20  se, p, iEnd);.  
35c70 69 66 28 20 70 2d 3e 69 4c 69 6d 69 74 3d 3d 30  if( p->iLimit==0
35c80 20 26 26 20 73 53 6f 72 74 2e 61 64 64 72 53 6f   && sSort.addrSo
35c90 72 74 49 6e 64 65 78 3e 3d 30 20 29 7b 0a 20 20  rtIndex>=0 ){.  
35ca0 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
35cb0 6e 67 65 4f 70 63 6f 64 65 28 76 2c 20 73 53 6f  ngeOpcode(v, sSo
35cc0 72 74 2e 61 64 64 72 53 6f 72 74 49 6e 64 65 78  rt.addrSortIndex
35cd0 2c 20 4f 50 5f 53 6f 72 74 65 72 4f 70 65 6e 29  , OP_SorterOpen)
35ce0 3b 0a 20 20 20 20 73 53 6f 72 74 2e 73 6f 72 74  ;.    sSort.sort
35cf0 46 6c 61 67 73 20 7c 3d 20 53 4f 52 54 46 4c 41  Flags |= SORTFLA
35d00 47 5f 55 73 65 53 6f 72 74 65 72 3b 0a 20 20 7d  G_UseSorter;.  }
35d10 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 61 6e 20 65  ..  /* Open an e
35d20 70 68 65 6d 65 72 61 6c 20 69 6e 64 65 78 20 74  phemeral index t
35d30 6f 20 75 73 65 20 66 6f 72 20 74 68 65 20 64 69  o use for the di
35d40 73 74 69 6e 63 74 20 73 65 74 2e 0a 20 20 2a 2f  stinct set..  */
35d50 0a 20 20 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61  .  if( p->selFla
35d60 67 73 20 26 20 53 46 5f 44 69 73 74 69 6e 63 74  gs & SF_Distinct
35d70 20 29 7b 0a 20 20 20 20 73 44 69 73 74 69 6e 63   ){.    sDistinc
35d80 74 2e 74 61 62 54 6e 63 74 20 3d 20 70 50 61 72  t.tabTnct = pPar
35d90 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20  se->nTab++;.    
35da0 73 44 69 73 74 69 6e 63 74 2e 61 64 64 72 54 6e  sDistinct.addrTn
35db0 63 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  ct = sqlite3Vdbe
35dc0 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4f 70 65  AddOp4(v, OP_Ope
35dd0 6e 45 70 68 65 6d 65 72 61 6c 2c 0a 20 20 20 20  nEphemeral,.    
35de0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35df0 20 20 20 73 44 69 73 74 69 6e 63 74 2e 74 61 62     sDistinct.tab
35e00 54 6e 63 74 2c 20 30 2c 20 30 2c 0a 20 20 20 20  Tnct, 0, 0,.    
35e10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35e20 20 20 20 28 63 68 61 72 2a 29 73 71 6c 69 74 65     (char*)sqlite
35e30 33 4b 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72  3KeyInfoFromExpr
35e40 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 2d 3e  List(pParse, p->
35e50 70 45 4c 69 73 74 2c 30 2c 30 29 2c 0a 20 20 20  pEList,0,0),.   
35e60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35e70 20 20 20 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b      P4_KEYINFO);
35e80 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
35e90 43 68 61 6e 67 65 50 35 28 76 2c 20 42 54 52 45  ChangeP5(v, BTRE
35ea0 45 5f 55 4e 4f 52 44 45 52 45 44 29 3b 0a 20 20  E_UNORDERED);.  
35eb0 20 20 73 44 69 73 74 69 6e 63 74 2e 65 54 6e 63    sDistinct.eTnc
35ec0 74 54 79 70 65 20 3d 20 57 48 45 52 45 5f 44 49  tType = WHERE_DI
35ed0 53 54 49 4e 43 54 5f 55 4e 4f 52 44 45 52 45 44  STINCT_UNORDERED
35ee0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73  ;.  }else{.    s
35ef0 44 69 73 74 69 6e 63 74 2e 65 54 6e 63 74 54 79  Distinct.eTnctTy
35f00 70 65 20 3d 20 57 48 45 52 45 5f 44 49 53 54 49  pe = WHERE_DISTI
35f10 4e 43 54 5f 4e 4f 4f 50 3b 0a 20 20 7d 0a 0a 20  NCT_NOOP;.  }.. 
35f20 20 69 66 28 20 21 69 73 41 67 67 20 26 26 20 70   if( !isAgg && p
35f30 47 72 6f 75 70 42 79 3d 3d 30 20 29 7b 0a 20 20  GroupBy==0 ){.  
35f40 20 20 2f 2a 20 4e 6f 20 61 67 67 72 65 67 61 74    /* No aggregat
35f50 65 20 66 75 6e 63 74 69 6f 6e 73 20 61 6e 64 20  e functions and 
35f60 6e 6f 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75  no GROUP BY clau
35f70 73 65 20 2a 2f 0a 20 20 20 20 75 31 36 20 77 63  se */.    u16 wc
35f80 74 72 6c 46 6c 61 67 73 20 3d 20 28 73 44 69 73  trlFlags = (sDis
35f90 74 69 6e 63 74 2e 69 73 54 6e 63 74 20 3f 20 57  tinct.isTnct ? W
35fa0 48 45 52 45 5f 57 41 4e 54 5f 44 49 53 54 49 4e  HERE_WANT_DISTIN
35fb0 43 54 20 3a 20 30 29 0a 20 20 20 20 20 20 20 20  CT : 0).        
35fc0 20 20 20 20 20 20 20 20 20 20 20 7c 20 28 70 2d             | (p-
35fd0 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 46  >selFlags & SF_F
35fe0 69 78 65 64 4c 69 6d 69 74 29 3b 0a 23 69 66 6e  ixedLimit);.#ifn
35ff0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
36000 57 49 4e 44 4f 57 46 55 4e 43 0a 20 20 20 20 57  WINDOWFUNC.    W
36010 69 6e 64 6f 77 20 2a 70 57 69 6e 20 3d 20 70 2d  indow *pWin = p-
36020 3e 70 57 69 6e 3b 20 20 20 20 20 20 2f 2a 20 4d  >pWin;      /* M
36030 61 73 74 65 72 20 77 69 6e 64 6f 77 20 6f 62 6a  aster window obj
36040 65 63 74 20 28 6f 72 20 4e 55 4c 4c 29 20 2a 2f  ect (or NULL) */
36050 0a 20 20 20 20 69 66 28 20 70 57 69 6e 20 29 7b  .    if( pWin ){
36060 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 57 69  .      sqlite3Wi
36070 6e 64 6f 77 43 6f 64 65 49 6e 69 74 28 70 50 61  ndowCodeInit(pPa
36080 72 73 65 2c 20 70 57 69 6e 29 3b 0a 20 20 20 20  rse, pWin);.    
36090 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 61 73 73  }.#endif.    ass
360a0 65 72 74 28 20 57 48 45 52 45 5f 55 53 45 5f 4c  ert( WHERE_USE_L
360b0 49 4d 49 54 3d 3d 53 46 5f 46 69 78 65 64 4c 69  IMIT==SF_FixedLi
360c0 6d 69 74 20 29 3b 0a 0a 0a 20 20 20 20 2f 2a 20  mit );...    /* 
360d0 42 65 67 69 6e 20 74 68 65 20 64 61 74 61 62 61  Begin the databa
360e0 73 65 20 73 63 61 6e 2e 20 2a 2f 0a 20 20 20 20  se scan. */.    
360f0 53 45 4c 45 43 54 54 52 41 43 45 28 31 2c 70 50  SELECTTRACE(1,pP
36100 61 72 73 65 2c 70 2c 28 22 57 68 65 72 65 42 65  arse,p,("WhereBe
36110 67 69 6e 5c 6e 22 29 29 3b 0a 20 20 20 20 70 57  gin\n"));.    pW
36120 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 57 68  Info = sqlite3Wh
36130 65 72 65 42 65 67 69 6e 28 70 50 61 72 73 65 2c  ereBegin(pParse,
36140 20 70 54 61 62 4c 69 73 74 2c 20 70 57 68 65 72   pTabList, pWher
36150 65 2c 20 73 53 6f 72 74 2e 70 4f 72 64 65 72 42  e, sSort.pOrderB
36160 79 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  y,.             
36170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36180 20 20 70 2d 3e 70 45 4c 69 73 74 2c 20 77 63 74    p->pEList, wct
36190 72 6c 46 6c 61 67 73 2c 20 70 2d 3e 6e 53 65 6c  rlFlags, p->nSel
361a0 65 63 74 52 6f 77 29 3b 0a 20 20 20 20 69 66 28  ectRow);.    if(
361b0 20 70 57 49 6e 66 6f 3d 3d 30 20 29 20 67 6f 74   pWInfo==0 ) got
361c0 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  o select_end;.  
361d0 20 20 69 66 28 20 73 71 6c 69 74 65 33 57 68 65    if( sqlite3Whe
361e0 72 65 4f 75 74 70 75 74 52 6f 77 43 6f 75 6e 74  reOutputRowCount
361f0 28 70 57 49 6e 66 6f 29 20 3c 20 70 2d 3e 6e 53  (pWInfo) < p->nS
36200 65 6c 65 63 74 52 6f 77 20 29 7b 0a 20 20 20 20  electRow ){.    
36210 20 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20    p->nSelectRow 
36220 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65 4f 75  = sqlite3WhereOu
36230 74 70 75 74 52 6f 77 43 6f 75 6e 74 28 70 57 49  tputRowCount(pWI
36240 6e 66 6f 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  nfo);.    }.    
36250 69 66 28 20 73 44 69 73 74 69 6e 63 74 2e 69 73  if( sDistinct.is
36260 54 6e 63 74 20 26 26 20 73 71 6c 69 74 65 33 57  Tnct && sqlite3W
36270 68 65 72 65 49 73 44 69 73 74 69 6e 63 74 28 70  hereIsDistinct(p
36280 57 49 6e 66 6f 29 20 29 7b 0a 20 20 20 20 20 20  WInfo) ){.      
36290 73 44 69 73 74 69 6e 63 74 2e 65 54 6e 63 74 54  sDistinct.eTnctT
362a0 79 70 65 20 3d 20 73 71 6c 69 74 65 33 57 68 65  ype = sqlite3Whe
362b0 72 65 49 73 44 69 73 74 69 6e 63 74 28 70 57 49  reIsDistinct(pWI
362c0 6e 66 6f 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  nfo);.    }.    
362d0 69 66 28 20 73 53 6f 72 74 2e 70 4f 72 64 65 72  if( sSort.pOrder
362e0 42 79 20 29 7b 0a 20 20 20 20 20 20 73 53 6f 72  By ){.      sSor
362f0 74 2e 6e 4f 42 53 61 74 20 3d 20 73 71 6c 69 74  t.nOBSat = sqlit
36300 65 33 57 68 65 72 65 49 73 4f 72 64 65 72 65 64  e3WhereIsOrdered
36310 28 70 57 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20  (pWInfo);.      
36320 73 53 6f 72 74 2e 6c 61 62 65 6c 4f 42 4c 6f 70  sSort.labelOBLop
36330 74 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65  t = sqlite3Where
36340 4f 72 64 65 72 42 79 4c 69 6d 69 74 4f 70 74 4c  OrderByLimitOptL
36350 61 62 65 6c 28 70 57 49 6e 66 6f 29 3b 0a 20 20  abel(pWInfo);.  
36360 20 20 20 20 69 66 28 20 73 53 6f 72 74 2e 6e 4f      if( sSort.nO
36370 42 53 61 74 3d 3d 73 53 6f 72 74 2e 70 4f 72 64  BSat==sSort.pOrd
36380 65 72 42 79 2d 3e 6e 45 78 70 72 20 29 7b 0a 20  erBy->nExpr ){. 
36390 20 20 20 20 20 20 20 73 53 6f 72 74 2e 70 4f 72         sSort.pOr
363a0 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 20 20 20  derBy = 0;.     
363b0 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
363c0 20 49 66 20 73 6f 72 74 69 6e 67 20 69 6e 64 65   If sorting inde
363d0 78 20 74 68 61 74 20 77 61 73 20 63 72 65 61 74  x that was creat
363e0 65 64 20 62 79 20 61 20 70 72 69 6f 72 20 4f 50  ed by a prior OP
363f0 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 0a  _OpenEphemeral .
36400 20 20 20 20 2a 2a 20 69 6e 73 74 72 75 63 74 69      ** instructi
36410 6f 6e 20 65 6e 64 65 64 20 75 70 20 6e 6f 74 20  on ended up not 
36420 62 65 69 6e 67 20 6e 65 65 64 65 64 2c 20 74 68  being needed, th
36430 65 6e 20 63 68 61 6e 67 65 20 74 68 65 20 4f 50  en change the OP
36440 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 0a 20  _OpenEphemeral. 
36450 20 20 20 2a 2a 20 69 6e 74 6f 20 61 6e 20 4f 50     ** into an OP
36460 5f 4e 6f 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20 20  _Noop..    */.  
36470 20 20 69 66 28 20 73 53 6f 72 74 2e 61 64 64 72    if( sSort.addr
36480 53 6f 72 74 49 6e 64 65 78 3e 3d 30 20 26 26 20  SortIndex>=0 && 
36490 73 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 3d 3d  sSort.pOrderBy==
364a0 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
364b0 65 33 56 64 62 65 43 68 61 6e 67 65 54 6f 4e 6f  e3VdbeChangeToNo
364c0 6f 70 28 76 2c 20 73 53 6f 72 74 2e 61 64 64 72  op(v, sSort.addr
364d0 53 6f 72 74 49 6e 64 65 78 29 3b 0a 20 20 20 20  SortIndex);.    
364e0 7d 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  }..    assert( p
364f0 2d 3e 70 45 4c 69 73 74 3d 3d 70 45 4c 69 73 74  ->pEList==pEList
36500 20 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   );.#ifndef SQLI
36510 54 45 5f 4f 4d 49 54 5f 57 49 4e 44 4f 57 46 55  TE_OMIT_WINDOWFU
36520 4e 43 0a 20 20 20 20 69 66 28 20 70 57 69 6e 20  NC.    if( pWin 
36530 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64  ){.      int add
36540 72 47 6f 73 75 62 20 3d 20 73 71 6c 69 74 65 33  rGosub = sqlite3
36550 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 70 50  VdbeMakeLabel(pP
36560 61 72 73 65 29 3b 0a 20 20 20 20 20 20 69 6e 74  arse);.      int
36570 20 69 43 6f 6e 74 20 3d 20 73 71 6c 69 74 65 33   iCont = sqlite3
36580 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 70 50  VdbeMakeLabel(pP
36590 61 72 73 65 29 3b 0a 20 20 20 20 20 20 69 6e 74  arse);.      int
365a0 20 69 42 72 65 61 6b 20 3d 20 73 71 6c 69 74 65   iBreak = sqlite
365b0 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 70  3VdbeMakeLabel(p
365c0 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 69 6e  Parse);.      in
365d0 74 20 72 65 67 47 6f 73 75 62 20 3d 20 2b 2b 70  t regGosub = ++p
365e0 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 0a 20 20  Parse->nMem;..  
365f0 20 20 20 20 73 71 6c 69 74 65 33 57 69 6e 64 6f      sqlite3Windo
36600 77 43 6f 64 65 53 74 65 70 28 70 50 61 72 73 65  wCodeStep(pParse
36610 2c 20 70 2c 20 70 57 49 6e 66 6f 2c 20 72 65 67  , p, pWInfo, reg
36620 47 6f 73 75 62 2c 20 61 64 64 72 47 6f 73 75 62  Gosub, addrGosub
36630 29 3b 0a 0a 20 20 20 20 20 20 73 71 6c 69 74 65  );..      sqlite
36640 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
36650 50 5f 47 6f 74 6f 2c 20 30 2c 20 69 42 72 65 61  P_Goto, 0, iBrea
36660 6b 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  k);.      sqlite
36670 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
36680 6c 28 76 2c 20 61 64 64 72 47 6f 73 75 62 29 3b  l(v, addrGosub);
36690 0a 20 20 20 20 20 20 56 64 62 65 4e 6f 6f 70 43  .      VdbeNoopC
366a0 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 69 6e 6e 65  omment((v, "inne
366b0 72 2d 6c 6f 6f 70 20 73 75 62 72 6f 75 74 69 6e  r-loop subroutin
366c0 65 22 29 29 3b 0a 20 20 20 20 20 20 73 53 6f 72  e"));.      sSor
366d0 74 2e 6c 61 62 65 6c 4f 42 4c 6f 70 74 20 3d 20  t.labelOBLopt = 
366e0 30 3b 0a 20 20 20 20 20 20 73 65 6c 65 63 74 49  0;.      selectI
366f0 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c  nnerLoop(pParse,
36700 20 70 2c 20 2d 31 2c 20 26 73 53 6f 72 74 2c 20   p, -1, &sSort, 
36710 26 73 44 69 73 74 69 6e 63 74 2c 20 70 44 65 73  &sDistinct, pDes
36720 74 2c 20 69 43 6f 6e 74 2c 20 69 42 72 65 61 6b  t, iCont, iBreak
36730 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
36740 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
36750 28 76 2c 20 69 43 6f 6e 74 29 3b 0a 20 20 20 20  (v, iCont);.    
36760 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
36770 4f 70 31 28 76 2c 20 4f 50 5f 52 65 74 75 72 6e  Op1(v, OP_Return
36780 2c 20 72 65 67 47 6f 73 75 62 29 3b 0a 20 20 20  , regGosub);.   
36790 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
367a0 76 2c 20 22 65 6e 64 20 69 6e 6e 65 72 2d 6c 6f  v, "end inner-lo
367b0 6f 70 20 73 75 62 72 6f 75 74 69 6e 65 22 29 29  op subroutine"))
367c0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
367d0 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
367e0 76 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20  v, iBreak);.    
367f0 7d 65 6c 73 65 0a 23 65 6e 64 69 66 20 2f 2a 20  }else.#endif /* 
36800 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 49 4e 44  SQLITE_OMIT_WIND
36810 4f 57 46 55 4e 43 20 2a 2f 0a 20 20 20 20 7b 0a  OWFUNC */.    {.
36820 20 20 20 20 20 20 2f 2a 20 55 73 65 20 74 68 65        /* Use the
36830 20 73 74 61 6e 64 61 72 64 20 69 6e 6e 65 72 20   standard inner 
36840 6c 6f 6f 70 2e 20 2a 2f 0a 20 20 20 20 20 20 73  loop. */.      s
36850 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70  electInnerLoop(p
36860 50 61 72 73 65 2c 20 70 2c 20 2d 31 2c 20 26 73  Parse, p, -1, &s
36870 53 6f 72 74 2c 20 26 73 44 69 73 74 69 6e 63 74  Sort, &sDistinct
36880 2c 20 70 44 65 73 74 2c 0a 20 20 20 20 20 20 20  , pDest,.       
36890 20 20 20 73 71 6c 69 74 65 33 57 68 65 72 65 43     sqlite3WhereC
368a0 6f 6e 74 69 6e 75 65 4c 61 62 65 6c 28 70 57 49  ontinueLabel(pWI
368b0 6e 66 6f 29 2c 0a 20 20 20 20 20 20 20 20 20 20  nfo),.          
368c0 73 71 6c 69 74 65 33 57 68 65 72 65 42 72 65 61  sqlite3WhereBrea
368d0 6b 4c 61 62 65 6c 28 70 57 49 6e 66 6f 29 29 3b  kLabel(pWInfo));
368e0 0a 0a 20 20 20 20 20 20 2f 2a 20 45 6e 64 20 74  ..      /* End t
368f0 68 65 20 64 61 74 61 62 61 73 65 20 73 63 61 6e  he database scan
36900 20 6c 6f 6f 70 2e 0a 20 20 20 20 20 20 2a 2f 0a   loop..      */.
36910 20 20 20 20 20 20 73 71 6c 69 74 65 33 57 68 65        sqlite3Whe
36920 72 65 45 6e 64 28 70 57 49 6e 66 6f 29 3b 0a 20  reEnd(pWInfo);. 
36930 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
36940 20 20 2f 2a 20 54 68 69 73 20 63 61 73 65 20 77    /* This case w
36950 68 65 6e 20 74 68 65 72 65 20 65 78 69 73 74 20  hen there exist 
36960 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69  aggregate functi
36970 6f 6e 73 20 6f 72 20 61 20 47 52 4f 55 50 20 42  ons or a GROUP B
36980 59 20 63 6c 61 75 73 65 0a 20 20 20 20 2a 2a 20  Y clause.    ** 
36990 6f 72 20 62 6f 74 68 20 2a 2f 0a 20 20 20 20 4e  or both */.    N
369a0 61 6d 65 43 6f 6e 74 65 78 74 20 73 4e 43 3b 20  ameContext sNC; 
369b0 20 20 20 2f 2a 20 4e 61 6d 65 20 63 6f 6e 74 65     /* Name conte
369c0 78 74 20 66 6f 72 20 70 72 6f 63 65 73 73 69 6e  xt for processin
369d0 67 20 61 67 67 72 65 67 61 74 65 20 69 6e 66 6f  g aggregate info
369e0 72 6d 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 69  rmation */.    i
369f0 6e 74 20 69 41 4d 65 6d 3b 20 20 20 20 20 20 20  nt iAMem;       
36a00 20 20 20 2f 2a 20 46 69 72 73 74 20 4d 65 6d 20     /* First Mem 
36a10 61 64 64 72 65 73 73 20 66 6f 72 20 73 74 6f 72  address for stor
36a20 69 6e 67 20 63 75 72 72 65 6e 74 20 47 52 4f 55  ing current GROU
36a30 50 20 42 59 20 2a 2f 0a 20 20 20 20 69 6e 74 20  P BY */.    int 
36a40 69 42 4d 65 6d 3b 20 20 20 20 20 20 20 20 20 20  iBMem;          
36a50 2f 2a 20 46 69 72 73 74 20 4d 65 6d 20 61 64 64  /* First Mem add
36a60 72 65 73 73 20 66 6f 72 20 70 72 65 76 69 6f 75  ress for previou
36a70 73 20 47 52 4f 55 50 20 42 59 20 2a 2f 0a 20 20  s GROUP BY */.  
36a80 20 20 69 6e 74 20 69 55 73 65 46 6c 61 67 3b 20    int iUseFlag; 
36a90 20 20 20 20 20 20 2f 2a 20 4d 65 6d 20 61 64 64        /* Mem add
36aa0 72 65 73 73 20 68 6f 6c 64 69 6e 67 20 66 6c 61  ress holding fla
36ab0 67 20 69 6e 64 69 63 61 74 69 6e 67 20 74 68 61  g indicating tha
36ac0 74 20 61 74 20 6c 65 61 73 74 0a 20 20 20 20 20  t at least.     
36ad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36ae0 20 20 20 2a 2a 20 6f 6e 65 20 72 6f 77 20 6f 66     ** one row of
36af0 20 74 68 65 20 69 6e 70 75 74 20 74 6f 20 74 68   the input to th
36b00 65 20 61 67 67 72 65 67 61 74 6f 72 20 68 61 73  e aggregator has
36b10 20 62 65 65 6e 0a 20 20 20 20 20 20 20 20 20 20   been.          
36b20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a                **
36b30 20 70 72 6f 63 65 73 73 65 64 20 2a 2f 0a 20 20   processed */.  
36b40 20 20 69 6e 74 20 69 41 62 6f 72 74 46 6c 61 67    int iAbortFlag
36b50 3b 20 20 20 20 20 2f 2a 20 4d 65 6d 20 61 64 64  ;     /* Mem add
36b60 72 65 73 73 20 77 68 69 63 68 20 63 61 75 73 65  ress which cause
36b70 73 20 71 75 65 72 79 20 61 62 6f 72 74 20 69 66  s query abort if
36b80 20 70 6f 73 69 74 69 76 65 20 2a 2f 0a 20 20 20   positive */.   
36b90 20 69 6e 74 20 67 72 6f 75 70 42 79 53 6f 72 74   int groupBySort
36ba0 3b 20 20 20 20 2f 2a 20 52 6f 77 73 20 63 6f 6d  ;    /* Rows com
36bb0 65 20 66 72 6f 6d 20 73 6f 75 72 63 65 20 69 6e  e from source in
36bc0 20 47 52 4f 55 50 20 42 59 20 6f 72 64 65 72 20   GROUP BY order 
36bd0 2a 2f 0a 20 20 20 20 69 6e 74 20 61 64 64 72 45  */.    int addrE
36be0 6e 64 3b 20 20 20 20 20 20 20 20 2f 2a 20 45 6e  nd;        /* En
36bf0 64 20 6f 66 20 70 72 6f 63 65 73 73 69 6e 67 20  d of processing 
36c00 66 6f 72 20 74 68 69 73 20 53 45 4c 45 43 54 20  for this SELECT 
36c10 2a 2f 0a 20 20 20 20 69 6e 74 20 73 6f 72 74 50  */.    int sortP
36c20 54 61 62 20 3d 20 30 3b 20 20 20 2f 2a 20 50 73  Tab = 0;   /* Ps
36c30 65 75 64 6f 74 61 62 6c 65 20 75 73 65 64 20 74  eudotable used t
36c40 6f 20 64 65 63 6f 64 65 20 73 6f 72 74 69 6e 67  o decode sorting
36c50 20 72 65 73 75 6c 74 73 20 2a 2f 0a 20 20 20 20   results */.    
36c60 69 6e 74 20 73 6f 72 74 4f 75 74 20 3d 20 30 3b  int sortOut = 0;
36c70 20 20 20 20 2f 2a 20 4f 75 74 70 75 74 20 72 65      /* Output re
36c80 67 69 73 74 65 72 20 66 72 6f 6d 20 74 68 65 20  gister from the 
36c90 73 6f 72 74 65 72 20 2a 2f 0a 20 20 20 20 69 6e  sorter */.    in
36ca0 74 20 6f 72 64 65 72 42 79 47 72 70 20 3d 20 30  t orderByGrp = 0
36cb0 3b 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65  ; /* True if the
36cc0 20 47 52 4f 55 50 20 42 59 20 61 6e 64 20 4f 52   GROUP BY and OR
36cd0 44 45 52 20 42 59 20 61 72 65 20 74 68 65 20 73  DER BY are the s
36ce0 61 6d 65 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 52  ame */..    /* R
36cf0 65 6d 6f 76 65 20 61 6e 79 20 61 6e 64 20 61 6c  emove any and al
36d00 6c 20 61 6c 69 61 73 65 73 20 62 65 74 77 65 65  l aliases betwee
36d10 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  n the result set
36d20 20 61 6e 64 20 74 68 65 0a 20 20 20 20 2a 2a 20   and the.    ** 
36d30 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 2e  GROUP BY clause.
36d40 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
36d50 70 47 72 6f 75 70 42 79 20 29 7b 0a 20 20 20 20  pGroupBy ){.    
36d60 20 20 69 6e 74 20 6b 3b 20 20 20 20 20 20 20 20    int k;        
36d70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36d80 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  /* Loop counter 
36d90 2a 2f 0a 20 20 20 20 20 20 73 74 72 75 63 74 20  */.      struct 
36da0 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70  ExprList_item *p
36db0 49 74 65 6d 3b 20 20 2f 2a 20 46 6f 72 20 6c 6f  Item;  /* For lo
36dc0 6f 70 69 6e 67 20 6f 76 65 72 20 65 78 70 72 65  oping over expre
36dd0 73 73 69 6f 6e 20 69 6e 20 61 20 6c 69 73 74 20  ssion in a list 
36de0 2a 2f 0a 0a 20 20 20 20 20 20 66 6f 72 28 6b 3d  */..      for(k=
36df0 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  p->pEList->nExpr
36e00 2c 20 70 49 74 65 6d 3d 70 2d 3e 70 45 4c 69 73  , pItem=p->pELis
36e10 74 2d 3e 61 3b 20 6b 3e 30 3b 20 6b 2d 2d 2c 20  t->a; k>0; k--, 
36e20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20  pItem++){.      
36e30 20 20 70 49 74 65 6d 2d 3e 75 2e 78 2e 69 41 6c    pItem->u.x.iAl
36e40 69 61 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  ias = 0;.      }
36e50 0a 20 20 20 20 20 20 66 6f 72 28 6b 3d 70 47 72  .      for(k=pGr
36e60 6f 75 70 42 79 2d 3e 6e 45 78 70 72 2c 20 70 49  oupBy->nExpr, pI
36e70 74 65 6d 3d 70 47 72 6f 75 70 42 79 2d 3e 61 3b  tem=pGroupBy->a;
36e80 20 6b 3e 30 3b 20 6b 2d 2d 2c 20 70 49 74 65 6d   k>0; k--, pItem
36e90 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 70 49 74  ++){.        pIt
36ea0 65 6d 2d 3e 75 2e 78 2e 69 41 6c 69 61 73 20 3d  em->u.x.iAlias =
36eb0 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
36ec0 20 20 61 73 73 65 72 74 28 20 36 36 3d 3d 73 71    assert( 66==sq
36ed0 6c 69 74 65 33 4c 6f 67 45 73 74 28 31 30 30 29  lite3LogEst(100)
36ee0 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d   );.      if( p-
36ef0 3e 6e 53 65 6c 65 63 74 52 6f 77 3e 36 36 20 29  >nSelectRow>66 )
36f00 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d   p->nSelectRow =
36f10 20 36 36 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a   66;.    }else{.
36f20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 30 3d        assert( 0=
36f30 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 31  =sqlite3LogEst(1
36f40 29 20 29 3b 0a 20 20 20 20 20 20 70 2d 3e 6e 53  ) );.      p->nS
36f50 65 6c 65 63 74 52 6f 77 20 3d 20 30 3b 0a 20 20  electRow = 0;.  
36f60 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74    }..    /* If t
36f70 68 65 72 65 20 69 73 20 62 6f 74 68 20 61 20 47  here is both a G
36f80 52 4f 55 50 20 42 59 20 61 6e 64 20 61 6e 20 4f  ROUP BY and an O
36f90 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 61  RDER BY clause a
36fa0 6e 64 20 74 68 65 79 20 61 72 65 0a 20 20 20 20  nd they are.    
36fb0 2a 2a 20 69 64 65 6e 74 69 63 61 6c 2c 20 74 68  ** identical, th
36fc0 65 6e 20 69 74 20 6d 61 79 20 62 65 20 70 6f 73  en it may be pos
36fd0 73 69 62 6c 65 20 74 6f 20 64 69 73 61 62 6c 65  sible to disable
36fe0 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   the ORDER BY cl
36ff0 61 75 73 65 20 0a 20 20 20 20 2a 2a 20 6f 6e 20  ause .    ** on 
37000 74 68 65 20 67 72 6f 75 6e 64 73 20 74 68 61 74  the grounds that
37010 20 74 68 65 20 47 52 4f 55 50 20 42 59 20 77 69   the GROUP BY wi
37020 6c 6c 20 63 61 75 73 65 20 65 6c 65 6d 65 6e 74  ll cause element
37030 73 20 74 6f 20 63 6f 6d 65 20 6f 75 74 20 0a 20  s to come out . 
37040 20 20 20 2a 2a 20 69 6e 20 74 68 65 20 63 6f 72     ** in the cor
37050 72 65 63 74 20 6f 72 64 65 72 2e 20 49 74 20 61  rect order. It a
37060 6c 73 6f 20 6d 61 79 20 6e 6f 74 20 2d 20 74 68  lso may not - th
37070 65 20 47 52 4f 55 50 20 42 59 20 6d 69 67 68 74  e GROUP BY might
37080 20 75 73 65 20 61 0a 20 20 20 20 2a 2a 20 64 61   use a.    ** da
37090 74 61 62 61 73 65 20 69 6e 64 65 78 20 74 68 61  tabase index tha
370a0 74 20 63 61 75 73 65 73 20 72 6f 77 73 20 74 6f  t causes rows to
370b0 20 62 65 20 67 72 6f 75 70 65 64 20 74 6f 67 65   be grouped toge
370c0 74 68 65 72 20 61 73 20 72 65 71 75 69 72 65 64  ther as required
370d0 0a 20 20 20 20 2a 2a 20 62 75 74 20 6e 6f 74 20  .    ** but not 
370e0 61 63 74 75 61 6c 6c 79 20 73 6f 72 74 65 64 2e  actually sorted.
370f0 20 45 69 74 68 65 72 20 77 61 79 2c 20 72 65 63   Either way, rec
37100 6f 72 64 20 74 68 65 20 66 61 63 74 20 74 68 61  ord the fact tha
37110 74 20 74 68 65 0a 20 20 20 20 2a 2a 20 4f 52 44  t the.    ** ORD
37120 45 52 20 42 59 20 61 6e 64 20 47 52 4f 55 50 20  ER BY and GROUP 
37130 42 59 20 63 6c 61 75 73 65 73 20 61 72 65 20 74  BY clauses are t
37140 68 65 20 73 61 6d 65 20 62 79 20 73 65 74 74 69  he same by setti
37150 6e 67 20 74 68 65 20 6f 72 64 65 72 42 79 47 72  ng the orderByGr
37160 70 0a 20 20 20 20 2a 2a 20 76 61 72 69 61 62 6c  p.    ** variabl
37170 65 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 73  e.  */.    if( s
37180 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 43 6f  qlite3ExprListCo
37190 6d 70 61 72 65 28 70 47 72 6f 75 70 42 79 2c 20  mpare(pGroupBy, 
371a0 73 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 2c 20  sSort.pOrderBy, 
371b0 2d 31 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  -1)==0 ){.      
371c0 6f 72 64 65 72 42 79 47 72 70 20 3d 20 31 3b 0a  orderByGrp = 1;.
371d0 20 20 20 20 7d 0a 20 0a 20 20 20 20 2f 2a 20 43      }. .    /* C
371e0 72 65 61 74 65 20 61 20 6c 61 62 65 6c 20 74 6f  reate a label to
371f0 20 6a 75 6d 70 20 74 6f 20 77 68 65 6e 20 77 65   jump to when we
37200 20 77 61 6e 74 20 74 6f 20 61 62 6f 72 74 20 74   want to abort t
37210 68 65 20 71 75 65 72 79 20 2a 2f 0a 20 20 20 20  he query */.    
37220 61 64 64 72 45 6e 64 20 3d 20 73 71 6c 69 74 65  addrEnd = sqlite
37230 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 70  3VdbeMakeLabel(p
37240 50 61 72 73 65 29 3b 0a 0a 20 20 20 20 2f 2a 20  Parse);..    /* 
37250 43 6f 6e 76 65 72 74 20 54 4b 5f 43 4f 4c 55 4d  Convert TK_COLUM
37260 4e 20 6e 6f 64 65 73 20 69 6e 74 6f 20 54 4b 5f  N nodes into TK_
37270 41 47 47 5f 43 4f 4c 55 4d 4e 20 61 6e 64 20 6d  AGG_COLUMN and m
37280 61 6b 65 20 65 6e 74 72 69 65 73 20 69 6e 0a 20  ake entries in. 
37290 20 20 20 2a 2a 20 73 41 67 67 49 6e 66 6f 20 66     ** sAggInfo f
372a0 6f 72 20 61 6c 6c 20 54 4b 5f 41 47 47 5f 46 55  or all TK_AGG_FU
372b0 4e 43 54 49 4f 4e 20 6e 6f 64 65 73 20 69 6e 20  NCTION nodes in 
372c0 65 78 70 72 65 73 73 69 6f 6e 73 20 6f 66 20 74  expressions of t
372d0 68 65 0a 20 20 20 20 2a 2a 20 53 45 4c 45 43 54  he.    ** SELECT
372e0 20 73 74 61 74 65 6d 65 6e 74 2e 0a 20 20 20 20   statement..    
372f0 2a 2f 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 73  */.    memset(&s
37300 4e 43 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 4e  NC, 0, sizeof(sN
37310 43 29 29 3b 0a 20 20 20 20 73 4e 43 2e 70 50 61  C));.    sNC.pPa
37320 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20  rse = pParse;.  
37330 20 20 73 4e 43 2e 70 53 72 63 4c 69 73 74 20 3d    sNC.pSrcList =
37340 20 70 54 61 62 4c 69 73 74 3b 0a 20 20 20 20 73   pTabList;.    s
37350 4e 43 2e 75 4e 43 2e 70 41 67 67 49 6e 66 6f 20  NC.uNC.pAggInfo 
37360 3d 20 26 73 41 67 67 49 6e 66 6f 3b 0a 20 20 20  = &sAggInfo;.   
37370 20 56 56 41 5f 4f 4e 4c 59 28 20 73 4e 43 2e 6e   VVA_ONLY( sNC.n
37380 63 46 6c 61 67 73 20 3d 20 4e 43 5f 55 41 67 67  cFlags = NC_UAgg
37390 49 6e 66 6f 3b 20 29 0a 20 20 20 20 73 41 67 67  Info; ).    sAgg
373a0 49 6e 66 6f 2e 6d 6e 52 65 67 20 3d 20 70 50 61  Info.mnReg = pPa
373b0 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20  rse->nMem+1;.   
373c0 20 73 41 67 67 49 6e 66 6f 2e 6e 53 6f 72 74 69   sAggInfo.nSorti
373d0 6e 67 43 6f 6c 75 6d 6e 20 3d 20 70 47 72 6f 75  ngColumn = pGrou
373e0 70 42 79 20 3f 20 70 47 72 6f 75 70 42 79 2d 3e  pBy ? pGroupBy->
373f0 6e 45 78 70 72 20 3a 20 30 3b 0a 20 20 20 20 73  nExpr : 0;.    s
37400 41 67 67 49 6e 66 6f 2e 70 47 72 6f 75 70 42 79  AggInfo.pGroupBy
37410 20 3d 20 70 47 72 6f 75 70 42 79 3b 0a 20 20 20   = pGroupBy;.   
37420 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c   sqlite3ExprAnal
37430 79 7a 65 41 67 67 4c 69 73 74 28 26 73 4e 43 2c  yzeAggList(&sNC,
37440 20 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 73 71   pEList);.    sq
37450 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65  lite3ExprAnalyze
37460 41 67 67 4c 69 73 74 28 26 73 4e 43 2c 20 73 53  AggList(&sNC, sS
37470 6f 72 74 2e 70 4f 72 64 65 72 42 79 29 3b 0a 20  ort.pOrderBy);. 
37480 20 20 20 69 66 28 20 70 48 61 76 69 6e 67 20 29     if( pHaving )
37490 7b 0a 20 20 20 20 20 20 69 66 28 20 70 47 72 6f  {.      if( pGro
374a0 75 70 42 79 20 29 7b 0a 20 20 20 20 20 20 20 20  upBy ){.        
374b0 61 73 73 65 72 74 28 20 70 57 68 65 72 65 3d 3d  assert( pWhere==
374c0 70 2d 3e 70 57 68 65 72 65 20 29 3b 0a 20 20 20  p->pWhere );.   
374d0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 48 61       assert( pHa
374e0 76 69 6e 67 3d 3d 70 2d 3e 70 48 61 76 69 6e 67  ving==p->pHaving
374f0 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65   );.        asse
37500 72 74 28 20 70 47 72 6f 75 70 42 79 3d 3d 70 2d  rt( pGroupBy==p-
37510 3e 70 47 72 6f 75 70 42 79 20 29 3b 0a 20 20 20  >pGroupBy );.   
37520 20 20 20 20 20 68 61 76 69 6e 67 54 6f 57 68 65       havingToWhe
37530 72 65 28 70 50 61 72 73 65 2c 20 70 29 3b 0a 20  re(pParse, p);. 
37540 20 20 20 20 20 20 20 70 57 68 65 72 65 20 3d 20         pWhere = 
37550 70 2d 3e 70 57 68 65 72 65 3b 0a 20 20 20 20 20  p->pWhere;.     
37560 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
37570 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 72 65  ExprAnalyzeAggre
37580 67 61 74 65 73 28 26 73 4e 43 2c 20 70 48 61 76  gates(&sNC, pHav
37590 69 6e 67 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ing);.    }.    
375a0 73 41 67 67 49 6e 66 6f 2e 6e 41 63 63 75 6d 75  sAggInfo.nAccumu
375b0 6c 61 74 6f 72 20 3d 20 73 41 67 67 49 6e 66 6f  lator = sAggInfo
375c0 2e 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 69 66  .nColumn;.    if
375d0 28 20 70 2d 3e 70 47 72 6f 75 70 42 79 3d 3d 30  ( p->pGroupBy==0
375e0 20 26 26 20 70 2d 3e 70 48 61 76 69 6e 67 3d 3d   && p->pHaving==
375f0 30 20 26 26 20 73 41 67 67 49 6e 66 6f 2e 6e 46  0 && sAggInfo.nF
37600 75 6e 63 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20  unc==1 ){.      
37610 6d 69 6e 4d 61 78 46 6c 61 67 20 3d 20 6d 69 6e  minMaxFlag = min
37620 4d 61 78 51 75 65 72 79 28 64 62 2c 20 73 41 67  MaxQuery(db, sAg
37630 67 49 6e 66 6f 2e 61 46 75 6e 63 5b 30 5d 2e 70  gInfo.aFunc[0].p
37640 45 78 70 72 2c 20 26 70 4d 69 6e 4d 61 78 4f 72  Expr, &pMinMaxOr
37650 64 65 72 42 79 29 3b 0a 20 20 20 20 7d 65 6c 73  derBy);.    }els
37660 65 7b 0a 20 20 20 20 20 20 6d 69 6e 4d 61 78 46  e{.      minMaxF
37670 6c 61 67 20 3d 20 57 48 45 52 45 5f 4f 52 44 45  lag = WHERE_ORDE
37680 52 42 59 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 20 20  RBY_NORMAL;.    
37690 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  }.    for(i=0; i
376a0 3c 73 41 67 67 49 6e 66 6f 2e 6e 46 75 6e 63 3b  <sAggInfo.nFunc;
376b0 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 45 78 70   i++){.      Exp
376c0 72 20 2a 70 45 78 70 72 20 3d 20 73 41 67 67 49  r *pExpr = sAggI
376d0 6e 66 6f 2e 61 46 75 6e 63 5b 69 5d 2e 70 45 78  nfo.aFunc[i].pEx
376e0 70 72 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  pr;.      assert
376f0 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
37700 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73  ty(pExpr, EP_xIs
37710 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 20 20 20  Select) );.     
37720 20 73 4e 43 2e 6e 63 46 6c 61 67 73 20 7c 3d 20   sNC.ncFlags |= 
37730 4e 43 5f 49 6e 41 67 67 46 75 6e 63 3b 0a 20 20  NC_InAggFunc;.  
37740 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 41      sqlite3ExprA
37750 6e 61 6c 79 7a 65 41 67 67 4c 69 73 74 28 26 73  nalyzeAggList(&s
37760 4e 43 2c 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69  NC, pExpr->x.pLi
37770 73 74 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  st);.#ifndef SQL
37780 49 54 45 5f 4f 4d 49 54 5f 57 49 4e 44 4f 57 46  ITE_OMIT_WINDOWF
37790 55 4e 43 0a 20 20 20 20 20 20 61 73 73 65 72 74  UNC.      assert
377a0 28 20 21 49 73 57 69 6e 64 6f 77 46 75 6e 63 28  ( !IsWindowFunc(
377b0 70 45 78 70 72 29 20 29 3b 0a 20 20 20 20 20 20  pExpr) );.      
377c0 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65  if( ExprHasPrope
377d0 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 57 69  rty(pExpr, EP_Wi
377e0 6e 46 75 6e 63 29 20 29 7b 0a 20 20 20 20 20 20  nFunc) ){.      
377f0 20 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61    sqlite3ExprAna
37800 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73 28 26  lyzeAggregates(&
37810 73 4e 43 2c 20 70 45 78 70 72 2d 3e 79 2e 70 57  sNC, pExpr->y.pW
37820 69 6e 2d 3e 70 46 69 6c 74 65 72 29 3b 0a 20 20  in->pFilter);.  
37830 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
37840 20 20 20 73 4e 43 2e 6e 63 46 6c 61 67 73 20 26     sNC.ncFlags &
37850 3d 20 7e 4e 43 5f 49 6e 41 67 67 46 75 6e 63 3b  = ~NC_InAggFunc;
37860 0a 20 20 20 20 7d 0a 20 20 20 20 73 41 67 67 49  .    }.    sAggI
37870 6e 66 6f 2e 6d 78 52 65 67 20 3d 20 70 50 61 72  nfo.mxReg = pPar
37880 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 69 66  se->nMem;.    if
37890 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
378a0 65 64 20 29 20 67 6f 74 6f 20 73 65 6c 65 63 74  ed ) goto select
378b0 5f 65 6e 64 3b 0a 23 69 66 20 53 45 4c 45 43 54  _end;.#if SELECT
378c0 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20  TRACE_ENABLED.  
378d0 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 65 6c    if( sqlite3Sel
378e0 65 63 74 54 72 61 63 65 20 26 20 30 78 34 30 30  ectTrace & 0x400
378f0 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 69   ){.      int ii
37900 3b 0a 20 20 20 20 20 20 53 45 4c 45 43 54 54 52  ;.      SELECTTR
37910 41 43 45 28 30 78 34 30 30 2c 70 50 61 72 73 65  ACE(0x400,pParse
37920 2c 70 2c 28 22 41 66 74 65 72 20 61 67 67 72 65  ,p,("After aggre
37930 67 61 74 65 20 61 6e 61 6c 79 73 69 73 3a 5c 6e  gate analysis:\n
37940 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  "));.      sqlit
37950 65 33 54 72 65 65 56 69 65 77 53 65 6c 65 63 74  e3TreeViewSelect
37960 28 30 2c 20 70 2c 20 30 29 3b 0a 20 20 20 20 20  (0, p, 0);.     
37970 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 73 41   for(ii=0; ii<sA
37980 67 67 49 6e 66 6f 2e 6e 43 6f 6c 75 6d 6e 3b 20  ggInfo.nColumn; 
37990 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 73  ii++){.        s
379a0 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
379b0 66 28 22 61 67 67 2d 63 6f 6c 75 6d 6e 5b 25 64  f("agg-column[%d
379c0 5d 20 69 4d 65 6d 3d 25 64 5c 6e 22 2c 0a 20 20  ] iMem=%d\n",.  
379d0 20 20 20 20 20 20 20 20 20 20 69 69 2c 20 73 41            ii, sA
379e0 67 67 49 6e 66 6f 2e 61 43 6f 6c 5b 69 69 5d 2e  ggInfo.aCol[ii].
379f0 69 4d 65 6d 29 3b 0a 20 20 20 20 20 20 20 20 73  iMem);.        s
37a00 71 6c 69 74 65 33 54 72 65 65 56 69 65 77 45 78  qlite3TreeViewEx
37a10 70 72 28 30 2c 20 73 41 67 67 49 6e 66 6f 2e 61  pr(0, sAggInfo.a
37a20 43 6f 6c 5b 69 69 5d 2e 70 45 78 70 72 2c 20 30  Col[ii].pExpr, 0
37a30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
37a40 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 73 41   for(ii=0; ii<sA
37a50 67 67 49 6e 66 6f 2e 6e 46 75 6e 63 3b 20 69 69  ggInfo.nFunc; ii
37a60 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  ++){.        sql
37a70 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
37a80 22 61 67 67 2d 66 75 6e 63 5b 25 64 5d 3a 20 69  "agg-func[%d]: i
37a90 4d 65 6d 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20  Mem=%d\n",.     
37aa0 20 20 20 20 20 20 20 69 69 2c 20 73 41 67 67 49         ii, sAggI
37ab0 6e 66 6f 2e 61 46 75 6e 63 5b 69 69 5d 2e 69 4d  nfo.aFunc[ii].iM
37ac0 65 6d 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  em);.        sql
37ad0 69 74 65 33 54 72 65 65 56 69 65 77 45 78 70 72  ite3TreeViewExpr
37ae0 28 30 2c 20 73 41 67 67 49 6e 66 6f 2e 61 46 75  (0, sAggInfo.aFu
37af0 6e 63 5b 69 69 5d 2e 70 45 78 70 72 2c 20 30 29  nc[ii].pExpr, 0)
37b00 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
37b10 23 65 6e 64 69 66 0a 0a 0a 20 20 20 20 2f 2a 20  #endif...    /* 
37b20 50 72 6f 63 65 73 73 69 6e 67 20 66 6f 72 20 61  Processing for a
37b30 67 67 72 65 67 61 74 65 73 20 77 69 74 68 20 47  ggregates with G
37b40 52 4f 55 50 20 42 59 20 69 73 20 76 65 72 79 20  ROUP BY is very 
37b50 64 69 66 66 65 72 65 6e 74 20 61 6e 64 0a 20 20  different and.  
37b60 20 20 2a 2a 20 6d 75 63 68 20 6d 6f 72 65 20 63    ** much more c
37b70 6f 6d 70 6c 65 78 20 74 68 61 6e 20 61 67 67 72  omplex than aggr
37b80 65 67 61 74 65 73 20 77 69 74 68 6f 75 74 20 61  egates without a
37b90 20 47 52 4f 55 50 20 42 59 2e 0a 20 20 20 20 2a   GROUP BY..    *
37ba0 2f 0a 20 20 20 20 69 66 28 20 70 47 72 6f 75 70  /.    if( pGroup
37bb0 42 79 20 29 7b 0a 20 20 20 20 20 20 4b 65 79 49  By ){.      KeyI
37bc0 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b 20 20  nfo *pKeyInfo;  
37bd0 2f 2a 20 4b 65 79 69 6e 67 20 69 6e 66 6f 72 6d  /* Keying inform
37be0 61 74 69 6f 6e 20 66 6f 72 20 74 68 65 20 67 72  ation for the gr
37bf0 6f 75 70 20 62 79 20 63 6c 61 75 73 65 20 2a 2f  oup by clause */
37c00 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 31  .      int addr1
37c10 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 2d  ;          /* A-
37c20 76 73 2d 42 20 63 6f 6d 70 61 72 69 73 69 6f 6e  vs-B comparision
37c30 20 6a 75 6d 70 20 2a 2f 0a 20 20 20 20 20 20 69   jump */.      i
37c40 6e 74 20 61 64 64 72 4f 75 74 70 75 74 52 6f 77  nt addrOutputRow
37c50 3b 20 20 2f 2a 20 53 74 61 72 74 20 6f 66 20 73  ;  /* Start of s
37c60 75 62 72 6f 75 74 69 6e 65 20 74 68 61 74 20 6f  ubroutine that o
37c70 75 74 70 75 74 73 20 61 20 72 65 73 75 6c 74 20  utputs a result 
37c80 72 6f 77 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  row */.      int
37c90 20 72 65 67 4f 75 74 70 75 74 52 6f 77 3b 20 20   regOutputRow;  
37ca0 20 2f 2a 20 52 65 74 75 72 6e 20 61 64 64 72 65   /* Return addre
37cb0 73 73 20 72 65 67 69 73 74 65 72 20 66 6f 72 20  ss register for 
37cc0 6f 75 74 70 75 74 20 73 75 62 72 6f 75 74 69 6e  output subroutin
37cd0 65 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61  e */.      int a
37ce0 64 64 72 53 65 74 41 62 6f 72 74 3b 20 20 20 2f  ddrSetAbort;   /
37cf0 2a 20 53 65 74 20 74 68 65 20 61 62 6f 72 74 20  * Set the abort 
37d00 66 6c 61 67 20 61 6e 64 20 72 65 74 75 72 6e 20  flag and return 
37d10 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64  */.      int add
37d20 72 54 6f 70 4f 66 4c 6f 6f 70 3b 20 20 2f 2a 20  rTopOfLoop;  /* 
37d30 54 6f 70 20 6f 66 20 74 68 65 20 69 6e 70 75 74  Top of the input
37d40 20 6c 6f 6f 70 20 2a 2f 0a 20 20 20 20 20 20 69   loop */.      i
37d50 6e 74 20 61 64 64 72 53 6f 72 74 69 6e 67 49 64  nt addrSortingId
37d60 78 3b 20 2f 2a 20 54 68 65 20 4f 50 5f 4f 70 65  x; /* The OP_Ope
37d70 6e 45 70 68 65 6d 65 72 61 6c 20 66 6f 72 20 74  nEphemeral for t
37d80 68 65 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78  he sorting index
37d90 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61 64   */.      int ad
37da0 64 72 52 65 73 65 74 3b 20 20 20 20 20 20 2f 2a  drReset;      /*
37db0 20 53 75 62 72 6f 75 74 69 6e 65 20 66 6f 72 20   Subroutine for 
37dc0 72 65 73 65 74 74 69 6e 67 20 74 68 65 20 61 63  resetting the ac
37dd0 63 75 6d 75 6c 61 74 6f 72 20 2a 2f 0a 20 20 20  cumulator */.   
37de0 20 20 20 69 6e 74 20 72 65 67 52 65 73 65 74 3b     int regReset;
37df0 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
37e00 20 61 64 64 72 65 73 73 20 72 65 67 69 73 74 65   address registe
37e10 72 20 66 6f 72 20 72 65 73 65 74 20 73 75 62 72  r for reset subr
37e20 6f 75 74 69 6e 65 20 2a 2f 0a 0a 20 20 20 20 20  outine */..     
37e30 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73 20   /* If there is 
37e40 61 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73  a GROUP BY claus
37e50 65 20 77 65 20 6d 69 67 68 74 20 6e 65 65 64 20  e we might need 
37e60 61 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 20  a sorting index 
37e70 74 6f 0a 20 20 20 20 20 20 2a 2a 20 69 6d 70 6c  to.      ** impl
37e80 65 6d 65 6e 74 20 69 74 2e 20 20 41 6c 6c 6f 63  ement it.  Alloc
37e90 61 74 65 20 74 68 61 74 20 73 6f 72 74 69 6e 67  ate that sorting
37ea0 20 69 6e 64 65 78 20 6e 6f 77 2e 20 20 49 66 20   index now.  If 
37eb0 69 74 20 74 75 72 6e 73 20 6f 75 74 0a 20 20 20  it turns out.   
37ec0 20 20 20 2a 2a 20 74 68 61 74 20 77 65 20 64 6f     ** that we do
37ed0 20 6e 6f 74 20 6e 65 65 64 20 69 74 20 61 66 74   not need it aft
37ee0 65 72 20 61 6c 6c 2c 20 74 68 65 20 4f 50 5f 53  er all, the OP_S
37ef0 6f 72 74 65 72 4f 70 65 6e 20 69 6e 73 74 72 75  orterOpen instru
37f00 63 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 77  ction.      ** w
37f10 69 6c 6c 20 62 65 20 63 6f 6e 76 65 72 74 65 64  ill be converted
37f20 20 69 6e 74 6f 20 61 20 4e 6f 6f 70 2e 20 20 0a   into a Noop.  .
37f30 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73        */.      s
37f40 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49  AggInfo.sortingI
37f50 64 78 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61  dx = pParse->nTa
37f60 62 2b 2b 3b 0a 20 20 20 20 20 20 70 4b 65 79 49  b++;.      pKeyI
37f70 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 4b 65 79  nfo = sqlite3Key
37f80 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74  InfoFromExprList
37f90 28 70 50 61 72 73 65 2c 70 47 72 6f 75 70 42 79  (pParse,pGroupBy
37fa0 2c 30 2c 73 41 67 67 49 6e 66 6f 2e 6e 43 6f 6c  ,0,sAggInfo.nCol
37fb0 75 6d 6e 29 3b 0a 20 20 20 20 20 20 61 64 64 72  umn);.      addr
37fc0 53 6f 72 74 69 6e 67 49 64 78 20 3d 20 73 71 6c  SortingIdx = sql
37fd0 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
37fe0 2c 20 4f 50 5f 53 6f 72 74 65 72 4f 70 65 6e 2c  , OP_SorterOpen,
37ff0 20 0a 20 20 20 20 20 20 20 20 20 20 73 41 67 67   .          sAgg
38000 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78 2c  Info.sortingIdx,
38010 20 73 41 67 67 49 6e 66 6f 2e 6e 53 6f 72 74 69   sAggInfo.nSorti
38020 6e 67 43 6f 6c 75 6d 6e 2c 20 0a 20 20 20 20 20  ngColumn, .     
38030 20 20 20 20 20 30 2c 20 28 63 68 61 72 2a 29 70       0, (char*)p
38040 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49  KeyInfo, P4_KEYI
38050 4e 46 4f 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  NFO);..      /* 
38060 49 6e 69 74 69 61 6c 69 7a 65 20 6d 65 6d 6f 72  Initialize memor
38070 79 20 6c 6f 63 61 74 69 6f 6e 73 20 75 73 65 64  y locations used
38080 20 62 79 20 47 52 4f 55 50 20 42 59 20 61 67 67   by GROUP BY agg
38090 72 65 67 61 74 65 20 70 72 6f 63 65 73 73 69 6e  regate processin
380a0 67 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  g.      */.     
380b0 20 69 55 73 65 46 6c 61 67 20 3d 20 2b 2b 70 50   iUseFlag = ++pP
380c0 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20  arse->nMem;.    
380d0 20 20 69 41 62 6f 72 74 46 6c 61 67 20 3d 20 2b    iAbortFlag = +
380e0 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
380f0 20 20 20 20 20 72 65 67 4f 75 74 70 75 74 52 6f       regOutputRo
38100 77 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  w = ++pParse->nM
38110 65 6d 3b 0a 20 20 20 20 20 20 61 64 64 72 4f 75  em;.      addrOu
38120 74 70 75 74 52 6f 77 20 3d 20 73 71 6c 69 74 65  tputRow = sqlite
38130 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 70  3VdbeMakeLabel(p
38140 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 72 65  Parse);.      re
38150 67 52 65 73 65 74 20 3d 20 2b 2b 70 50 61 72 73  gReset = ++pPars
38160 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 61  e->nMem;.      a
38170 64 64 72 52 65 73 65 74 20 3d 20 73 71 6c 69 74  ddrReset = sqlit
38180 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
38190 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 69  pParse);.      i
381a0 41 4d 65 6d 20 3d 20 70 50 61 72 73 65 2d 3e 6e  AMem = pParse->n
381b0 4d 65 6d 20 2b 20 31 3b 0a 20 20 20 20 20 20 70  Mem + 1;.      p
381c0 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 70  Parse->nMem += p
381d0 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 3b 0a  GroupBy->nExpr;.
381e0 20 20 20 20 20 20 69 42 4d 65 6d 20 3d 20 70 50        iBMem = pP
381f0 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 20 31 3b 0a  arse->nMem + 1;.
38200 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d        pParse->nM
38210 65 6d 20 2b 3d 20 70 47 72 6f 75 70 42 79 2d 3e  em += pGroupBy->
38220 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 73 71 6c  nExpr;.      sql
38230 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
38240 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c  , OP_Integer, 0,
38250 20 69 41 62 6f 72 74 46 6c 61 67 29 3b 0a 20 20   iAbortFlag);.  
38260 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
38270 28 76 2c 20 22 63 6c 65 61 72 20 61 62 6f 72 74  (v, "clear abort
38280 20 66 6c 61 67 22 29 29 3b 0a 20 20 20 20 20 20   flag"));.      
38290 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
382a0 33 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c  3(v, OP_Null, 0,
382b0 20 69 41 4d 65 6d 2c 20 69 41 4d 65 6d 2b 70 47   iAMem, iAMem+pG
382c0 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 2d 31 29  roupBy->nExpr-1)
382d0 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 42 65 67 69  ;..      /* Begi
382e0 6e 20 61 20 6c 6f 6f 70 20 74 68 61 74 20 77 69  n a loop that wi
382f0 6c 6c 20 65 78 74 72 61 63 74 20 61 6c 6c 20 73  ll extract all s
38300 6f 75 72 63 65 20 72 6f 77 73 20 69 6e 20 47 52  ource rows in GR
38310 4f 55 50 20 42 59 20 6f 72 64 65 72 2e 0a 20 20  OUP BY order..  
38320 20 20 20 20 2a 2a 20 54 68 69 73 20 6d 69 67 68      ** This migh
38330 74 20 69 6e 76 6f 6c 76 65 20 74 77 6f 20 73 65  t involve two se
38340 70 61 72 61 74 65 20 6c 6f 6f 70 73 20 77 69 74  parate loops wit
38350 68 20 61 6e 20 4f 50 5f 53 6f 72 74 20 69 6e 20  h an OP_Sort in 
38360 62 65 74 77 65 65 6e 2c 20 6f 72 0a 20 20 20 20  between, or.    
38370 20 20 2a 2a 20 69 74 20 6d 69 67 68 74 20 62 65    ** it might be
38380 20 61 20 73 69 6e 67 6c 65 20 6c 6f 6f 70 20 74   a single loop t
38390 68 61 74 20 75 73 65 73 20 61 6e 20 69 6e 64 65  hat uses an inde
383a0 78 20 74 6f 20 65 78 74 72 61 63 74 20 69 6e 66  x to extract inf
383b0 6f 72 6d 61 74 69 6f 6e 0a