/ Hex Artifact Content
Login

Artifact f509982c96bb24ccf57a0155fbe1e6184e0b8fb8866a04397dc41baa400e5240:


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 73 71 6c 69    }.        sqli
1ec60 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62  te3ExprDelete(db
1ec70 2c 20 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20  , pExpr);.      
1ec80 20 20 70 45 78 70 72 20 3d 20 70 4e 65 77 3b 0a    pExpr = pNew;.
1ec90 0a 20 20 20 20 20 20 20 20 2f 2a 20 45 6e 73 75  .        /* Ensu
1eca0 72 65 20 74 68 61 74 20 74 68 65 20 65 78 70 72  re that the expr
1ecb0 65 73 73 69 6f 6e 20 6e 6f 77 20 68 61 73 20 61  ession now has a
1ecc0 6e 20 69 6d 70 6c 69 63 69 74 20 63 6f 6c 6c 61  n implicit colla
1ecd0 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 2c 0a 20  tion sequence,. 
1ece0 20 20 20 20 20 20 20 2a 2a 20 6a 75 73 74 20 61         ** just a
1ecf0 73 20 69 74 20 64 69 64 20 77 68 65 6e 20 69 74  s it did when it
1ed00 20 77 61 73 20 61 20 63 6f 6c 75 6d 6e 20 6f 66   was a column of
1ed10 20 61 20 76 69 65 77 20 6f 72 20 73 75 62 2d 71   a view or sub-q
1ed20 75 65 72 79 2e 20 2a 2f 0a 20 20 20 20 20 20 20  uery. */.       
1ed30 20 69 66 28 20 70 45 78 70 72 20 29 7b 0a 20 20   if( pExpr ){.  
1ed40 20 20 20 20 20 20 20 20 69 66 28 20 70 45 78 70          if( pExp
1ed50 72 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e  r->op!=TK_COLUMN
1ed60 20 26 26 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54   && pExpr->op!=T
1ed70 4b 5f 43 4f 4c 4c 41 54 45 20 29 7b 0a 20 20 20  K_COLLATE ){.   
1ed80 20 20 20 20 20 20 20 20 20 43 6f 6c 6c 53 65 71           CollSeq
1ed90 20 2a 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65   *pColl = sqlite
1eda0 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 53 75  3ExprCollSeq(pSu
1edb0 62 73 74 2d 3e 70 50 61 72 73 65 2c 20 70 45 78  bst->pParse, pEx
1edc0 70 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  pr);.           
1edd0 20 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33   pExpr = sqlite3
1ede0 45 78 70 72 41 64 64 43 6f 6c 6c 61 74 65 53 74  ExprAddCollateSt
1edf0 72 69 6e 67 28 70 53 75 62 73 74 2d 3e 70 50 61  ring(pSubst->pPa
1ee00 72 73 65 2c 20 70 45 78 70 72 2c 20 0a 20 20 20  rse, pExpr, .   
1ee10 20 20 20 20 20 20 20 20 20 20 20 20 20 28 70 43               (pC
1ee20 6f 6c 6c 20 3f 20 70 43 6f 6c 6c 2d 3e 7a 4e 61  oll ? pColl->zNa
1ee30 6d 65 20 3a 20 22 42 49 4e 41 52 59 22 29 0a 20  me : "BINARY"). 
1ee40 20 20 20 20 20 20 20 20 20 20 20 29 3b 0a 20 20             );.  
1ee50 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1ee60 20 20 20 20 45 78 70 72 43 6c 65 61 72 50 72 6f      ExprClearPro
1ee70 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
1ee80 43 6f 6c 6c 61 74 65 29 3b 0a 20 20 20 20 20 20  Collate);.      
1ee90 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
1eea0 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  }.  }else{.    i
1eeb0 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  f( pExpr->op==TK
1eec0 5f 49 46 5f 4e 55 4c 4c 5f 52 4f 57 20 26 26 20  _IF_NULL_ROW && 
1eed0 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 70  pExpr->iTable==p
1eee0 53 75 62 73 74 2d 3e 69 54 61 62 6c 65 20 29 7b  Subst->iTable ){
1eef0 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 54  .      pExpr->iT
1ef00 61 62 6c 65 20 3d 20 70 53 75 62 73 74 2d 3e 69  able = pSubst->i
1ef10 4e 65 77 54 61 62 6c 65 3b 0a 20 20 20 20 7d 0a  NewTable;.    }.
1ef20 20 20 20 20 70 45 78 70 72 2d 3e 70 4c 65 66 74      pExpr->pLeft
1ef30 20 3d 20 73 75 62 73 74 45 78 70 72 28 70 53 75   = substExpr(pSu
1ef40 62 73 74 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  bst, pExpr->pLef
1ef50 74 29 3b 0a 20 20 20 20 70 45 78 70 72 2d 3e 70  t);.    pExpr->p
1ef60 52 69 67 68 74 20 3d 20 73 75 62 73 74 45 78 70  Right = substExp
1ef70 72 28 70 53 75 62 73 74 2c 20 70 45 78 70 72 2d  r(pSubst, pExpr-
1ef80 3e 70 52 69 67 68 74 29 3b 0a 20 20 20 20 69 66  >pRight);.    if
1ef90 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  ( ExprHasPropert
1efa0 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53  y(pExpr, EP_xIsS
1efb0 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 20 20  elect) ){.      
1efc0 73 75 62 73 74 53 65 6c 65 63 74 28 70 53 75 62  substSelect(pSub
1efd0 73 74 2c 20 70 45 78 70 72 2d 3e 78 2e 70 53 65  st, pExpr->x.pSe
1efe0 6c 65 63 74 2c 20 31 29 3b 0a 20 20 20 20 7d 65  lect, 1);.    }e
1eff0 6c 73 65 7b 0a 20 20 20 20 20 20 73 75 62 73 74  lse{.      subst
1f000 45 78 70 72 4c 69 73 74 28 70 53 75 62 73 74 2c  ExprList(pSubst,
1f010 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 29   pExpr->x.pList)
1f020 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
1f030 74 75 72 6e 20 70 45 78 70 72 3b 0a 7d 0a 73 74  turn pExpr;.}.st
1f040 61 74 69 63 20 76 6f 69 64 20 73 75 62 73 74 45  atic void substE
1f050 78 70 72 4c 69 73 74 28 0a 20 20 53 75 62 73 74  xprList(.  Subst
1f060 43 6f 6e 74 65 78 74 20 2a 70 53 75 62 73 74 2c  Context *pSubst,
1f070 20 2f 2a 20 44 65 73 63 72 69 70 74 69 6f 6e 20   /* Description 
1f080 6f 66 20 74 68 65 20 73 75 62 73 74 69 74 75 74  of the substitut
1f090 69 6f 6e 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  ion */.  ExprLis
1f0a0 74 20 2a 70 4c 69 73 74 20 20 20 20 20 20 20 2f  t *pList       /
1f0b0 2a 20 4c 69 73 74 20 74 6f 20 73 63 61 6e 20 61  * List to scan a
1f0c0 6e 64 20 69 6e 20 77 68 69 63 68 20 74 6f 20 6d  nd in which to m
1f0d0 61 6b 65 20 73 75 62 73 74 69 74 75 74 65 73 20  ake substitutes 
1f0e0 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  */.){.  int i;. 
1f0f0 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20   if( pList==0 ) 
1f100 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d  return;.  for(i=
1f110 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70  0; i<pList->nExp
1f120 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 70 4c 69  r; i++){.    pLi
1f130 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 20 3d  st->a[i].pExpr =
1f140 20 73 75 62 73 74 45 78 70 72 28 70 53 75 62 73   substExpr(pSubs
1f150 74 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70  t, pList->a[i].p
1f160 45 78 70 72 29 3b 0a 20 20 7d 0a 7d 0a 73 74 61  Expr);.  }.}.sta
1f170 74 69 63 20 76 6f 69 64 20 73 75 62 73 74 53 65  tic void substSe
1f180 6c 65 63 74 28 0a 20 20 53 75 62 73 74 43 6f 6e  lect(.  SubstCon
1f190 74 65 78 74 20 2a 70 53 75 62 73 74 2c 20 2f 2a  text *pSubst, /*
1f1a0 20 44 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20   Description of 
1f1b0 74 68 65 20 73 75 62 73 74 69 74 75 74 69 6f 6e  the substitution
1f1c0 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c   */.  Select *p,
1f1d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
1f1e0 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
1f1f0 69 6e 20 77 68 69 63 68 20 74 6f 20 6d 61 6b 65  in which to make
1f200 20 73 75 62 73 74 69 74 75 74 69 6f 6e 73 20 2a   substitutions *
1f210 2f 0a 20 20 69 6e 74 20 64 6f 50 72 69 6f 72 20  /.  int doPrior 
1f220 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20            /* Do 
1f230 73 75 62 73 74 69 74 75 74 65 73 20 6f 6e 20 70  substitutes on p
1f240 2d 3e 70 50 72 69 6f 72 20 74 6f 6f 20 2a 2f 0a  ->pPrior too */.
1f250 29 7b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53  ){.  SrcList *pS
1f260 72 63 3b 0a 20 20 73 74 72 75 63 74 20 53 72 63  rc;.  struct Src
1f270 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
1f280 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28  ;.  int i;.  if(
1f290 20 21 70 20 29 20 72 65 74 75 72 6e 3b 0a 20 20   !p ) return;.  
1f2a0 64 6f 7b 0a 20 20 20 20 73 75 62 73 74 45 78 70  do{.    substExp
1f2b0 72 4c 69 73 74 28 70 53 75 62 73 74 2c 20 70 2d  rList(pSubst, p-
1f2c0 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 73 75  >pEList);.    su
1f2d0 62 73 74 45 78 70 72 4c 69 73 74 28 70 53 75 62  bstExprList(pSub
1f2e0 73 74 2c 20 70 2d 3e 70 47 72 6f 75 70 42 79 29  st, p->pGroupBy)
1f2f0 3b 0a 20 20 20 20 73 75 62 73 74 45 78 70 72 4c  ;.    substExprL
1f300 69 73 74 28 70 53 75 62 73 74 2c 20 70 2d 3e 70  ist(pSubst, p->p
1f310 4f 72 64 65 72 42 79 29 3b 0a 20 20 20 20 70 2d  OrderBy);.    p-
1f320 3e 70 48 61 76 69 6e 67 20 3d 20 73 75 62 73 74  >pHaving = subst
1f330 45 78 70 72 28 70 53 75 62 73 74 2c 20 70 2d 3e  Expr(pSubst, p->
1f340 70 48 61 76 69 6e 67 29 3b 0a 20 20 20 20 70 2d  pHaving);.    p-
1f350 3e 70 57 68 65 72 65 20 3d 20 73 75 62 73 74 45  >pWhere = substE
1f360 78 70 72 28 70 53 75 62 73 74 2c 20 70 2d 3e 70  xpr(pSubst, p->p
1f370 57 68 65 72 65 29 3b 0a 20 20 20 20 70 53 72 63  Where);.    pSrc
1f380 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 20 20   = p->pSrc;.    
1f390 61 73 73 65 72 74 28 20 70 53 72 63 21 3d 30 20  assert( pSrc!=0 
1f3a0 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 70 53 72  );.    for(i=pSr
1f3b0 63 2d 3e 6e 53 72 63 2c 20 70 49 74 65 6d 3d 70  c->nSrc, pItem=p
1f3c0 53 72 63 2d 3e 61 3b 20 69 3e 30 3b 20 69 2d 2d  Src->a; i>0; i--
1f3d0 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20  , pItem++){.    
1f3e0 20 20 73 75 62 73 74 53 65 6c 65 63 74 28 70 53    substSelect(pS
1f3f0 75 62 73 74 2c 20 70 49 74 65 6d 2d 3e 70 53 65  ubst, pItem->pSe
1f400 6c 65 63 74 2c 20 31 29 3b 0a 20 20 20 20 20 20  lect, 1);.      
1f410 69 66 28 20 70 49 74 65 6d 2d 3e 66 67 2e 69 73  if( pItem->fg.is
1f420 54 61 62 46 75 6e 63 20 29 7b 0a 20 20 20 20 20  TabFunc ){.     
1f430 20 20 20 73 75 62 73 74 45 78 70 72 4c 69 73 74     substExprList
1f440 28 70 53 75 62 73 74 2c 20 70 49 74 65 6d 2d 3e  (pSubst, pItem->
1f450 75 31 2e 70 46 75 6e 63 41 72 67 29 3b 0a 20 20  u1.pFuncArg);.  
1f460 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 77      }.    }.  }w
1f470 68 69 6c 65 28 20 64 6f 50 72 69 6f 72 20 26 26  hile( doPrior &&
1f480 20 28 70 20 3d 20 70 2d 3e 70 50 72 69 6f 72 29   (p = p->pPrior)
1f490 21 3d 30 20 29 3b 0a 7d 0a 23 65 6e 64 69 66 20  !=0 );.}.#endif 
1f4a0 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  /* !defined(SQLI
1f4b0 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
1f4c0 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51  ) || !defined(SQ
1f4d0 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20  LITE_OMIT_VIEW) 
1f4e0 2a 2f 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64  */..#if !defined
1f4f0 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42  (SQLITE_OMIT_SUB
1f500 51 55 45 52 59 29 20 7c 7c 20 21 64 65 66 69 6e  QUERY) || !defin
1f510 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ed(SQLITE_OMIT_V
1f520 49 45 57 29 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  IEW)./*.** This 
1f530 72 6f 75 74 69 6e 65 20 61 74 74 65 6d 70 74 73  routine attempts
1f540 20 74 6f 20 66 6c 61 74 74 65 6e 20 73 75 62 71   to flatten subq
1f550 75 65 72 69 65 73 20 61 73 20 61 20 70 65 72 66  ueries as a perf
1f560 6f 72 6d 61 6e 63 65 20 6f 70 74 69 6d 69 7a 61  ormance optimiza
1f570 74 69 6f 6e 2e 0a 2a 2a 20 54 68 69 73 20 72 6f  tion..** This ro
1f580 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 31 20  utine returns 1 
1f590 69 66 20 69 74 20 6d 61 6b 65 73 20 63 68 61 6e  if it makes chan
1f5a0 67 65 73 20 61 6e 64 20 30 20 69 66 20 6e 6f 20  ges and 0 if no 
1f5b0 66 6c 61 74 74 65 6e 69 6e 67 20 6f 63 63 75 72  flattening occur
1f5c0 73 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 75 6e 64 65  s..**.** To unde
1f5d0 72 73 74 61 6e 64 20 74 68 65 20 63 6f 6e 63 65  rstand the conce
1f5e0 70 74 20 6f 66 20 66 6c 61 74 74 65 6e 69 6e 67  pt of flattening
1f5f0 2c 20 63 6f 6e 73 69 64 65 72 20 74 68 65 20 66  , consider the f
1f600 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 71 75 65 72  ollowing.** quer
1f610 79 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c  y:.**.**     SEL
1f620 45 43 54 20 61 20 46 52 4f 4d 20 28 53 45 4c 45  ECT a FROM (SELE
1f630 43 54 20 78 2b 79 20 41 53 20 61 20 46 52 4f 4d  CT x+y AS a FROM
1f640 20 74 31 20 57 48 45 52 45 20 7a 3c 31 30 30 29   t1 WHERE z<100)
1f650 20 57 48 45 52 45 20 61 3e 35 0a 2a 2a 0a 2a 2a   WHERE a>5.**.**
1f660 20 54 68 65 20 64 65 66 61 75 6c 74 20 77 61 79   The default way
1f670 20 6f 66 20 69 6d 70 6c 65 6d 65 6e 74 69 6e 67   of implementing
1f680 20 74 68 69 73 20 71 75 65 72 79 20 69 73 20 74   this query is t
1f690 6f 20 65 78 65 63 75 74 65 20 74 68 65 0a 2a 2a  o execute the.**
1f6a0 20 73 75 62 71 75 65 72 79 20 66 69 72 73 74 20   subquery first 
1f6b0 61 6e 64 20 73 74 6f 72 65 20 74 68 65 20 72 65  and store the re
1f6c0 73 75 6c 74 73 20 69 6e 20 61 20 74 65 6d 70 6f  sults in a tempo
1f6d0 72 61 72 79 20 74 61 62 6c 65 2c 20 74 68 65 6e  rary table, then
1f6e0 0a 2a 2a 20 72 75 6e 20 74 68 65 20 6f 75 74 65  .** run the oute
1f6f0 72 20 71 75 65 72 79 20 6f 6e 20 74 68 61 74 20  r query on that 
1f700 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 2e  temporary table.
1f710 20 20 54 68 69 73 20 72 65 71 75 69 72 65 73 20    This requires 
1f720 74 77 6f 0a 2a 2a 20 70 61 73 73 65 73 20 6f 76  two.** passes ov
1f730 65 72 20 74 68 65 20 64 61 74 61 2e 20 20 46 75  er the data.  Fu
1f740 72 74 68 65 72 6d 6f 72 65 2c 20 62 65 63 61 75  rthermore, becau
1f750 73 65 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79  se the temporary
1f760 20 74 61 62 6c 65 0a 2a 2a 20 68 61 73 20 6e 6f   table.** has no
1f770 20 69 6e 64 69 63 65 73 2c 20 74 68 65 20 57 48   indices, the WH
1f780 45 52 45 20 63 6c 61 75 73 65 20 6f 6e 20 74 68  ERE clause on th
1f790 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 63 61  e outer query ca
1f7a0 6e 6e 6f 74 20 62 65 0a 2a 2a 20 6f 70 74 69 6d  nnot be.** optim
1f7b0 69 7a 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ized..**.** This
1f7c0 20 72 6f 75 74 69 6e 65 20 61 74 74 65 6d 70 74   routine attempt
1f7d0 73 20 74 6f 20 72 65 77 72 69 74 65 20 71 75 65  s to rewrite que
1f7e0 72 69 65 73 20 73 75 63 68 20 61 73 20 74 68 65  ries such as the
1f7f0 20 61 62 6f 76 65 20 69 6e 74 6f 0a 2a 2a 20 61   above into.** a
1f800 20 73 69 6e 67 6c 65 20 66 6c 61 74 20 73 65 6c   single flat sel
1f810 65 63 74 2c 20 6c 69 6b 65 20 74 68 69 73 3a 0a  ect, like this:.
1f820 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43 54  **.**     SELECT
1f830 20 78 2b 79 20 41 53 20 61 20 46 52 4f 4d 20 74   x+y AS a FROM t
1f840 31 20 57 48 45 52 45 20 7a 3c 31 30 30 20 41 4e  1 WHERE z<100 AN
1f850 44 20 61 3e 35 0a 2a 2a 0a 2a 2a 20 54 68 65 20  D a>5.**.** The 
1f860 63 6f 64 65 20 67 65 6e 65 72 61 74 65 64 20 66  code generated f
1f870 6f 72 20 74 68 69 73 20 73 69 6d 70 6c 69 66 69  or this simplifi
1f880 63 61 74 69 6f 6e 20 67 69 76 65 73 20 74 68 65  cation gives the
1f890 20 73 61 6d 65 20 72 65 73 75 6c 74 0a 2a 2a 20   same result.** 
1f8a0 62 75 74 20 6f 6e 6c 79 20 68 61 73 20 74 6f 20  but only has to 
1f8b0 73 63 61 6e 20 74 68 65 20 64 61 74 61 20 6f 6e  scan the data on
1f8c0 63 65 2e 20 20 41 6e 64 20 62 65 63 61 75 73 65  ce.  And because
1f8d0 20 69 6e 64 69 63 65 73 20 6d 69 67 68 74 20 0a   indices might .
1f8e0 2a 2a 20 65 78 69 73 74 20 6f 6e 20 74 68 65 20  ** exist on the 
1f8f0 74 61 62 6c 65 20 74 31 2c 20 61 20 63 6f 6d 70  table t1, a comp
1f900 6c 65 74 65 20 73 63 61 6e 20 6f 66 20 74 68 65  lete scan of the
1f910 20 64 61 74 61 20 6d 69 67 68 74 20 62 65 0a 2a   data might be.*
1f920 2a 20 61 76 6f 69 64 65 64 2e 0a 2a 2a 0a 2a 2a  * avoided..**.**
1f930 20 46 6c 61 74 74 65 6e 69 6e 67 20 69 73 20 73   Flattening is s
1f940 75 62 6a 65 63 74 20 74 6f 20 74 68 65 20 66 6f  ubject to the fo
1f950 6c 6c 6f 77 69 6e 67 20 63 6f 6e 73 74 72 61 69  llowing constrai
1f960 6e 74 73 3a 0a 2a 2a 0a 2a 2a 20 20 28 2a 2a 29  nts:.**.**  (**)
1f970 20 20 57 65 20 6e 6f 20 6c 6f 6e 67 65 72 20 61    We no longer a
1f980 74 74 65 6d 70 74 20 74 6f 20 66 6c 61 74 74 65  ttempt to flatte
1f990 6e 20 61 67 67 72 65 67 61 74 65 20 73 75 62 71  n aggregate subq
1f9a0 75 65 72 69 65 73 2e 20 57 61 73 3a 0a 2a 2a 20  ueries. Was:.** 
1f9b0 20 20 20 20 20 20 20 54 68 65 20 73 75 62 71 75         The subqu
1f9c0 65 72 79 20 61 6e 64 20 74 68 65 20 6f 75 74 65  ery and the oute
1f9d0 72 20 71 75 65 72 79 20 63 61 6e 6e 6f 74 20 62  r query cannot b
1f9e0 6f 74 68 20 62 65 20 61 67 67 72 65 67 61 74 65  oth be aggregate
1f9f0 73 2e 0a 2a 2a 0a 2a 2a 20 20 28 2a 2a 29 20 20  s..**.**  (**)  
1fa00 57 65 20 6e 6f 20 6c 6f 6e 67 65 72 20 61 74 74  We no longer att
1fa10 65 6d 70 74 20 74 6f 20 66 6c 61 74 74 65 6e 20  empt to flatten 
1fa20 61 67 67 72 65 67 61 74 65 20 73 75 62 71 75 65  aggregate subque
1fa30 72 69 65 73 2e 20 57 61 73 3a 0a 2a 2a 20 20 20  ries. Was:.**   
1fa40 20 20 20 20 20 28 32 29 20 49 66 20 74 68 65 20       (2) If the 
1fa50 73 75 62 71 75 65 72 79 20 69 73 20 61 6e 20 61  subquery is an a
1fa60 67 67 72 65 67 61 74 65 20 74 68 65 6e 0a 2a 2a  ggregate then.**
1fa70 20 20 20 20 20 20 20 20 28 32 61 29 20 74 68 65          (2a) the
1fa80 20 6f 75 74 65 72 20 71 75 65 72 79 20 6d 75 73   outer query mus
1fa90 74 20 6e 6f 74 20 62 65 20 61 20 6a 6f 69 6e 20  t not be a join 
1faa0 61 6e 64 0a 2a 2a 20 20 20 20 20 20 20 20 28 32  and.**        (2
1fab0 62 29 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  b) the outer que
1fac0 72 79 20 6d 75 73 74 20 6e 6f 74 20 75 73 65 20  ry must not use 
1fad0 73 75 62 71 75 65 72 69 65 73 0a 2a 2a 20 20 20  subqueries.**   
1fae0 20 20 20 20 20 20 20 20 20 20 6f 74 68 65 72 20            other 
1faf0 74 68 61 6e 20 74 68 65 20 6f 6e 65 20 46 52 4f  than the one FRO
1fb00 4d 2d 63 6c 61 75 73 65 20 73 75 62 71 75 65 72  M-clause subquer
1fb10 79 20 74 68 61 74 20 69 73 20 61 20 63 61 6e 64  y that is a cand
1fb20 69 64 61 74 65 0a 2a 2a 20 20 20 20 20 20 20 20  idate.**        
1fb30 20 20 20 20 20 66 6f 72 20 66 6c 61 74 74 65 6e       for flatten
1fb40 69 6e 67 2e 20 20 28 54 68 69 73 20 69 73 20 64  ing.  (This is d
1fb50 75 65 20 74 6f 20 74 69 63 6b 65 74 20 5b 32 66  ue to ticket [2f
1fb60 37 31 37 30 64 37 33 62 66 39 61 62 66 38 30 5d  7170d73bf9abf80]
1fb70 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
1fb80 66 72 6f 6d 20 32 30 31 35 2d 30 32 2d 30 39 2e  from 2015-02-09.
1fb90 29 0a 2a 2a 0a 2a 2a 20 20 20 28 33 29 20 20 49  ).**.**   (3)  I
1fba0 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20 69  f the subquery i
1fbb0 73 20 74 68 65 20 72 69 67 68 74 20 6f 70 65 72  s the right oper
1fbc0 61 6e 64 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f  and of a LEFT JO
1fbd0 49 4e 20 74 68 65 6e 0a 2a 2a 20 20 20 20 20 20  IN then.**      
1fbe0 20 20 28 33 61 29 20 74 68 65 20 73 75 62 71 75    (3a) the subqu
1fbf0 65 72 79 20 6d 61 79 20 6e 6f 74 20 62 65 20 61  ery may not be a
1fc00 20 6a 6f 69 6e 20 61 6e 64 0a 2a 2a 20 20 20 20   join and.**    
1fc10 20 20 20 20 28 33 62 29 20 74 68 65 20 46 52 4f      (3b) the FRO
1fc20 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20  M clause of the 
1fc30 73 75 62 71 75 65 72 79 20 6d 61 79 20 6e 6f 74  subquery may not
1fc40 20 63 6f 6e 74 61 69 6e 20 61 20 76 69 72 74 75   contain a virtu
1fc50 61 6c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  al.**           
1fc60 20 20 74 61 62 6c 65 20 61 6e 64 0a 2a 2a 20 20    table and.**  
1fc70 20 20 20 20 20 20 28 33 63 29 20 74 68 65 20 6f        (3c) the o
1fc80 75 74 65 72 20 71 75 65 72 79 20 6d 61 79 20 6e  uter query may n
1fc90 6f 74 20 62 65 20 61 6e 20 61 67 67 72 65 67 61  ot be an aggrega
1fca0 74 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 34 29 20  te..**.**   (4) 
1fcb0 20 54 68 65 20 73 75 62 71 75 65 72 79 20 63 61   The subquery ca
1fcc0 6e 20 6e 6f 74 20 62 65 20 44 49 53 54 49 4e 43  n not be DISTINC
1fcd0 54 2e 0a 2a 2a 0a 2a 2a 20 20 28 2a 2a 29 20 20  T..**.**  (**)  
1fce0 41 74 20 6f 6e 65 20 70 6f 69 6e 74 20 72 65 73  At one point res
1fcf0 74 72 69 63 74 69 6f 6e 73 20 28 34 29 20 61 6e  trictions (4) an
1fd00 64 20 28 35 29 20 64 65 66 69 6e 65 64 20 61 20  d (5) defined a 
1fd10 73 75 62 73 65 74 20 6f 66 20 44 49 53 54 49 4e  subset of DISTIN
1fd20 43 54 0a 2a 2a 20 20 20 20 20 20 20 20 73 75 62  CT.**        sub
1fd30 2d 71 75 65 72 69 65 73 20 74 68 61 74 20 77 65  -queries that we
1fd40 72 65 20 65 78 63 6c 75 64 65 64 20 66 72 6f 6d  re excluded from
1fd50 20 74 68 69 73 20 6f 70 74 69 6d 69 7a 61 74 69   this optimizati
1fd60 6f 6e 2e 20 52 65 73 74 72 69 63 74 69 6f 6e 20  on. Restriction 
1fd70 0a 2a 2a 20 20 20 20 20 20 20 20 28 34 29 20 68  .**        (4) h
1fd80 61 73 20 73 69 6e 63 65 20 62 65 65 6e 20 65 78  as since been ex
1fd90 70 61 6e 64 65 64 20 74 6f 20 65 78 63 6c 75 64  panded to exclud
1fda0 65 20 61 6c 6c 20 44 49 53 54 49 4e 43 54 20 73  e all DISTINCT s
1fdb0 75 62 71 75 65 72 69 65 73 2e 0a 2a 2a 0a 2a 2a  ubqueries..**.**
1fdc0 20 20 28 2a 2a 29 20 20 57 65 20 6e 6f 20 6c 6f    (**)  We no lo
1fdd0 6e 67 65 72 20 61 74 74 65 6d 70 74 20 74 6f 20  nger attempt to 
1fde0 66 6c 61 74 74 65 6e 20 61 67 67 72 65 67 61 74  flatten aggregat
1fdf0 65 20 73 75 62 71 75 65 72 69 65 73 2e 20 20 57  e subqueries.  W
1fe00 61 73 3a 0a 2a 2a 20 20 20 20 20 20 20 20 49 66  as:.**        If
1fe10 20 74 68 65 20 73 75 62 71 75 65 72 79 20 69 73   the subquery is
1fe20 20 61 67 67 72 65 67 61 74 65 2c 20 74 68 65 20   aggregate, the 
1fe30 6f 75 74 65 72 20 71 75 65 72 79 20 6d 61 79 20  outer query may 
1fe40 6e 6f 74 20 62 65 20 44 49 53 54 49 4e 43 54 2e  not be DISTINCT.
1fe50 0a 2a 2a 0a 2a 2a 20 20 20 28 37 29 20 20 54 68  .**.**   (7)  Th
1fe60 65 20 73 75 62 71 75 65 72 79 20 6d 75 73 74 20  e subquery must 
1fe70 68 61 76 65 20 61 20 46 52 4f 4d 20 63 6c 61 75  have a FROM clau
1fe80 73 65 2e 20 20 54 4f 44 4f 3a 20 20 46 6f 72 20  se.  TODO:  For 
1fe90 73 75 62 71 75 65 72 69 65 73 20 77 69 74 68 6f  subqueries witho
1fea0 75 74 0a 2a 2a 20 20 20 20 20 20 20 20 41 20 46  ut.**        A F
1feb0 52 4f 4d 20 63 6c 61 75 73 65 2c 20 63 6f 6e 73  ROM clause, cons
1fec0 69 64 65 72 20 61 64 64 69 6e 67 20 61 20 46 52  ider adding a FR
1fed0 4f 4d 20 63 6c 61 75 73 65 20 77 69 74 68 20 74  OM clause with t
1fee0 68 65 20 73 70 65 63 69 61 6c 0a 2a 2a 20 20 20  he special.**   
1fef0 20 20 20 20 20 74 61 62 6c 65 20 73 71 6c 69 74       table sqlit
1ff00 65 5f 6f 6e 63 65 20 74 68 61 74 20 63 6f 6e 73  e_once that cons
1ff10 69 73 74 73 20 6f 66 20 61 20 73 69 6e 67 6c 65  ists of a single
1ff20 20 72 6f 77 20 63 6f 6e 74 61 69 6e 69 6e 67 20   row containing 
1ff30 61 0a 2a 2a 20 20 20 20 20 20 20 20 73 69 6e 67  a.**        sing
1ff40 6c 65 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 20  le NULL..**.**  
1ff50 20 28 38 29 20 20 49 66 20 74 68 65 20 73 75 62   (8)  If the sub
1ff60 71 75 65 72 79 20 75 73 65 73 20 4c 49 4d 49 54  query uses LIMIT
1ff70 20 74 68 65 6e 20 74 68 65 20 6f 75 74 65 72 20   then the outer 
1ff80 71 75 65 72 79 20 6d 61 79 20 6e 6f 74 20 62 65  query may not be
1ff90 20 61 20 6a 6f 69 6e 2e 0a 2a 2a 0a 2a 2a 20 20   a join..**.**  
1ffa0 20 28 39 29 20 20 49 66 20 74 68 65 20 73 75 62   (9)  If the sub
1ffb0 71 75 65 72 79 20 75 73 65 73 20 4c 49 4d 49 54  query uses LIMIT
1ffc0 20 74 68 65 6e 20 74 68 65 20 6f 75 74 65 72 20   then the outer 
1ffd0 71 75 65 72 79 20 6d 61 79 20 6e 6f 74 20 62 65  query may not be
1ffe0 20 61 67 67 72 65 67 61 74 65 2e 0a 2a 2a 0a 2a   aggregate..**.*
1fff0 2a 20 20 28 2a 2a 29 20 20 52 65 73 74 72 69 63  *  (**)  Restric
20000 74 69 6f 6e 20 28 31 30 29 20 77 61 73 20 72 65  tion (10) was re
20010 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68 65 20 63  moved from the c
20020 6f 64 65 20 6f 6e 20 32 30 30 35 2d 30 32 2d 30  ode on 2005-02-0
20030 35 20 62 75 74 20 77 65 0a 2a 2a 20 20 20 20 20  5 but we.**     
20040 20 20 20 61 63 63 69 64 65 6e 74 6c 79 20 63 61     accidently ca
20050 72 72 69 65 64 20 74 68 65 20 63 6f 6d 6d 65 6e  rried the commen
20060 74 20 66 6f 72 77 61 72 64 20 75 6e 74 69 6c 20  t forward until 
20070 32 30 31 34 2d 30 39 2d 31 35 2e 20 20 4f 72 69  2014-09-15.  Ori
20080 67 69 6e 61 6c 0a 2a 2a 20 20 20 20 20 20 20 20  ginal.**        
20090 63 6f 6e 73 74 72 61 69 6e 74 3a 20 22 49 66 20  constraint: "If 
200a0 74 68 65 20 73 75 62 71 75 65 72 79 20 69 73 20  the subquery is 
200b0 61 67 67 72 65 67 61 74 65 20 74 68 65 6e 20 74  aggregate then t
200c0 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 0a  he outer query .
200d0 2a 2a 20 20 20 20 20 20 20 20 6d 61 79 20 6e 6f  **        may no
200e0 74 20 75 73 65 20 4c 49 4d 49 54 2e 22 0a 2a 2a  t use LIMIT.".**
200f0 0a 2a 2a 20 20 28 31 31 29 20 20 54 68 65 20 73  .**  (11)  The s
20100 75 62 71 75 65 72 79 20 61 6e 64 20 74 68 65 20  ubquery and the 
20110 6f 75 74 65 72 20 71 75 65 72 79 20 6d 61 79 20  outer query may 
20120 6e 6f 74 20 62 6f 74 68 20 68 61 76 65 20 4f 52  not both have OR
20130 44 45 52 20 42 59 20 63 6c 61 75 73 65 73 2e 0a  DER BY clauses..
20140 2a 2a 0a 2a 2a 20 20 28 2a 2a 29 20 20 4e 6f 74  **.**  (**)  Not
20150 20 69 6d 70 6c 65 6d 65 6e 74 65 64 2e 20 20 53   implemented.  S
20160 75 62 73 75 6d 65 64 20 69 6e 74 6f 20 72 65 73  ubsumed into res
20170 74 72 69 63 74 69 6f 6e 20 28 33 29 2e 20 20 57  triction (3).  W
20180 61 73 20 70 72 65 76 69 6f 75 73 6c 79 0a 2a 2a  as previously.**
20190 20 20 20 20 20 20 20 20 61 20 73 65 70 61 72 61          a separa
201a0 74 65 20 72 65 73 74 72 69 63 74 69 6f 6e 20 64  te restriction d
201b0 65 72 69 76 69 6e 67 20 66 72 6f 6d 20 74 69 63  eriving from tic
201c0 6b 65 74 20 23 33 35 30 2e 0a 2a 2a 0a 2a 2a 20  ket #350..**.** 
201d0 20 28 31 33 29 20 20 54 68 65 20 73 75 62 71 75   (13)  The subqu
201e0 65 72 79 20 61 6e 64 20 6f 75 74 65 72 20 71 75  ery and outer qu
201f0 65 72 79 20 6d 61 79 20 6e 6f 74 20 62 6f 74 68  ery may not both
20200 20 75 73 65 20 4c 49 4d 49 54 2e 0a 2a 2a 0a 2a   use LIMIT..**.*
20210 2a 20 20 28 31 34 29 20 20 54 68 65 20 73 75 62  *  (14)  The sub
20220 71 75 65 72 79 20 6d 61 79 20 6e 6f 74 20 75 73  query may not us
20230 65 20 4f 46 46 53 45 54 2e 0a 2a 2a 0a 2a 2a 20  e OFFSET..**.** 
20240 20 28 31 35 29 20 20 49 66 20 74 68 65 20 6f 75   (15)  If the ou
20250 74 65 72 20 71 75 65 72 79 20 69 73 20 70 61 72  ter query is par
20260 74 20 6f 66 20 61 20 63 6f 6d 70 6f 75 6e 64 20  t of a compound 
20270 73 65 6c 65 63 74 2c 20 74 68 65 6e 20 74 68 65  select, then the
20280 0a 2a 2a 20 20 20 20 20 20 20 20 73 75 62 71 75  .**        subqu
20290 65 72 79 20 6d 61 79 20 6e 6f 74 20 75 73 65 20  ery may not use 
202a0 4c 49 4d 49 54 2e 0a 2a 2a 20 20 20 20 20 20 20  LIMIT..**       
202b0 20 28 53 65 65 20 74 69 63 6b 65 74 20 23 32 33   (See ticket #23
202c0 33 39 20 61 6e 64 20 74 69 63 6b 65 74 20 5b 30  39 and ticket [0
202d0 32 61 38 65 38 31 64 34 34 5d 29 2e 0a 2a 2a 0a  2a8e81d44])..**.
202e0 2a 2a 20 20 28 31 36 29 20 20 49 66 20 74 68 65  **  (16)  If the
202f0 20 6f 75 74 65 72 20 71 75 65 72 79 20 69 73 20   outer query is 
20300 61 67 67 72 65 67 61 74 65 2c 20 74 68 65 6e 20  aggregate, then 
20310 74 68 65 20 73 75 62 71 75 65 72 79 20 6d 61 79  the subquery may
20320 20 6e 6f 74 0a 2a 2a 20 20 20 20 20 20 20 20 75   not.**        u
20330 73 65 20 4f 52 44 45 52 20 42 59 2e 20 20 28 54  se ORDER BY.  (T
20340 69 63 6b 65 74 20 23 32 39 34 32 29 20 20 54 68  icket #2942)  Th
20350 69 73 20 75 73 65 64 20 74 6f 20 6e 6f 74 20 6d  is used to not m
20360 61 74 74 65 72 0a 2a 2a 20 20 20 20 20 20 20 20  atter.**        
20370 75 6e 74 69 6c 20 77 65 20 69 6e 74 72 6f 64 75  until we introdu
20380 63 65 64 20 74 68 65 20 67 72 6f 75 70 5f 63 6f  ced the group_co
20390 6e 63 61 74 28 29 20 66 75 6e 63 74 69 6f 6e 2e  ncat() function.
203a0 20 20 0a 2a 2a 0a 2a 2a 20 20 28 31 37 29 20 20    .**.**  (17)  
203b0 49 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20  If the subquery 
203c0 69 73 20 61 20 63 6f 6d 70 6f 75 6e 64 20 73 65  is a compound se
203d0 6c 65 63 74 2c 20 74 68 65 6e 0a 2a 2a 20 20 20  lect, then.**   
203e0 20 20 20 20 20 28 31 37 61 29 20 61 6c 6c 20 63       (17a) all c
203f0 6f 6d 70 6f 75 6e 64 20 6f 70 65 72 61 74 6f 72  ompound operator
20400 73 20 6d 75 73 74 20 62 65 20 61 20 55 4e 49 4f  s must be a UNIO
20410 4e 20 41 4c 4c 2c 20 61 6e 64 0a 2a 2a 20 20 20  N ALL, and.**   
20420 20 20 20 20 20 28 31 37 62 29 20 6e 6f 20 74 65       (17b) no te
20430 72 6d 73 20 77 69 74 68 69 6e 20 74 68 65 20 73  rms within the s
20440 75 62 71 75 65 72 79 20 63 6f 6d 70 6f 75 6e 64  ubquery compound
20450 20 6d 61 79 20 62 65 20 61 67 67 72 65 67 61 74   may be aggregat
20460 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  e.**            
20470 20 20 6f 72 20 44 49 53 54 49 4e 43 54 2c 20 61    or DISTINCT, a
20480 6e 64 0a 2a 2a 20 20 20 20 20 20 20 20 28 31 37  nd.**        (17
20490 63 29 20 65 76 65 72 79 20 74 65 72 6d 20 77 69  c) every term wi
204a0 74 68 69 6e 20 74 68 65 20 73 75 62 71 75 65 72  thin the subquer
204b0 79 20 63 6f 6d 70 6f 75 6e 64 20 6d 75 73 74 20  y compound must 
204c0 68 61 76 65 20 61 20 46 52 4f 4d 20 63 6c 61 75  have a FROM clau
204d0 73 65 0a 2a 2a 20 20 20 20 20 20 20 20 28 31 37  se.**        (17
204e0 64 29 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  d) the outer que
204f0 72 79 20 6d 61 79 20 6e 6f 74 20 62 65 0a 2a 2a  ry may not be.**
20500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 31                (1
20510 37 64 31 29 20 61 67 67 72 65 67 61 74 65 2c 20  7d1) aggregate, 
20520 6f 72 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  or.**           
20530 20 20 20 28 31 37 64 32 29 20 44 49 53 54 49 4e     (17d2) DISTIN
20540 43 54 2c 20 6f 72 0a 2a 2a 20 20 20 20 20 20 20  CT, or.**       
20550 20 20 20 20 20 20 20 28 31 37 64 33 29 20 61 20         (17d3) a 
20560 6a 6f 69 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20  join..**.**     
20570 20 20 20 54 68 65 20 70 61 72 65 6e 74 20 61 6e     The parent an
20580 64 20 73 75 62 2d 71 75 65 72 79 20 6d 61 79 20  d sub-query may 
20590 63 6f 6e 74 61 69 6e 20 57 48 45 52 45 20 63 6c  contain WHERE cl
205a0 61 75 73 65 73 2e 20 53 75 62 6a 65 63 74 20 74  auses. Subject t
205b0 6f 0a 2a 2a 20 20 20 20 20 20 20 20 72 75 6c 65  o.**        rule
205c0 73 20 28 31 31 29 2c 20 28 31 33 29 20 61 6e 64  s (11), (13) and
205d0 20 28 31 34 29 2c 20 74 68 65 79 20 6d 61 79 20   (14), they may 
205e0 61 6c 73 6f 20 63 6f 6e 74 61 69 6e 20 4f 52 44  also contain ORD
205f0 45 52 20 42 59 2c 0a 2a 2a 20 20 20 20 20 20 20  ER BY,.**       
20600 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46 53 45   LIMIT and OFFSE
20610 54 20 63 6c 61 75 73 65 73 2e 20 20 54 68 65 20  T clauses.  The 
20620 73 75 62 71 75 65 72 79 20 63 61 6e 6e 6f 74 20  subquery cannot 
20630 75 73 65 20 61 6e 79 20 63 6f 6d 70 6f 75 6e 64  use any compound
20640 0a 2a 2a 20 20 20 20 20 20 20 20 6f 70 65 72 61  .**        opera
20650 74 6f 72 20 6f 74 68 65 72 20 74 68 61 6e 20 55  tor other than U
20660 4e 49 4f 4e 20 41 4c 4c 20 62 65 63 61 75 73 65  NION ALL because
20670 20 61 6c 6c 20 74 68 65 20 6f 74 68 65 72 20 63   all the other c
20680 6f 6d 70 6f 75 6e 64 0a 2a 2a 20 20 20 20 20 20  ompound.**      
20690 20 20 6f 70 65 72 61 74 6f 72 73 20 68 61 76 65    operators have
206a0 20 61 6e 20 69 6d 70 6c 69 65 64 20 44 49 53 54   an implied DIST
206b0 49 4e 43 54 20 77 68 69 63 68 20 69 73 20 64 69  INCT which is di
206c0 73 61 6c 6c 6f 77 65 64 20 62 79 0a 2a 2a 20 20  sallowed by.**  
206d0 20 20 20 20 20 20 72 65 73 74 72 69 63 74 69 6f        restrictio
206e0 6e 20 28 34 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  n (4)..**.**    
206f0 20 20 20 20 41 6c 73 6f 2c 20 65 61 63 68 20 63      Also, each c
20700 6f 6d 70 6f 6e 65 6e 74 20 6f 66 20 74 68 65 20  omponent of the 
20710 73 75 62 2d 71 75 65 72 79 20 6d 75 73 74 20 72  sub-query must r
20720 65 74 75 72 6e 20 74 68 65 20 73 61 6d 65 20 6e  eturn the same n
20730 75 6d 62 65 72 0a 2a 2a 20 20 20 20 20 20 20 20  umber.**        
20740 6f 66 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e  of result column
20750 73 2e 20 54 68 69 73 20 69 73 20 61 63 74 75 61  s. This is actua
20760 6c 6c 79 20 61 20 72 65 71 75 69 72 65 6d 65 6e  lly a requiremen
20770 74 20 66 6f 72 20 61 6e 79 20 63 6f 6d 70 6f 75  t for any compou
20780 6e 64 0a 2a 2a 20 20 20 20 20 20 20 20 53 45 4c  nd.**        SEL
20790 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2c 20 62  ECT statement, b
207a0 75 74 20 61 6c 6c 20 74 68 65 20 63 6f 64 65 20  ut all the code 
207b0 68 65 72 65 20 64 6f 65 73 20 69 73 20 6d 61 6b  here does is mak
207c0 65 20 73 75 72 65 20 74 68 61 74 20 6e 6f 0a 2a  e sure that no.*
207d0 2a 20 20 20 20 20 20 20 20 73 75 63 68 20 28 69  *        such (i
207e0 6c 6c 65 67 61 6c 29 20 73 75 62 2d 71 75 65 72  llegal) sub-quer
207f0 79 20 69 73 20 66 6c 61 74 74 65 6e 65 64 2e 20  y is flattened. 
20800 54 68 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20  The caller will 
20810 64 65 74 65 63 74 20 74 68 65 0a 2a 2a 20 20 20  detect the.**   
20820 20 20 20 20 20 73 79 6e 74 61 78 20 65 72 72 6f       syntax erro
20830 72 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20 64  r and return a d
20840 65 74 61 69 6c 65 64 20 6d 65 73 73 61 67 65 2e  etailed message.
20850 0a 2a 2a 0a 2a 2a 20 20 28 31 38 29 20 20 49 66  .**.**  (18)  If
20860 20 74 68 65 20 73 75 62 2d 71 75 65 72 79 20 69   the sub-query i
20870 73 20 61 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c  s a compound sel
20880 65 63 74 2c 20 74 68 65 6e 20 61 6c 6c 20 74 65  ect, then all te
20890 72 6d 73 20 6f 66 20 74 68 65 0a 2a 2a 20 20 20  rms of the.**   
208a0 20 20 20 20 20 4f 52 44 45 52 20 42 59 20 63 6c       ORDER BY cl
208b0 61 75 73 65 20 6f 66 20 74 68 65 20 70 61 72 65  ause of the pare
208c0 6e 74 20 6d 75 73 74 20 62 65 20 73 69 6d 70 6c  nt must be simpl
208d0 65 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20  e references to 
208e0 0a 2a 2a 20 20 20 20 20 20 20 20 63 6f 6c 75 6d  .**        colum
208f0 6e 73 20 6f 66 20 74 68 65 20 73 75 62 2d 71 75  ns of the sub-qu
20900 65 72 79 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 39 29  ery..**.**  (19)
20910 20 20 49 66 20 74 68 65 20 73 75 62 71 75 65 72    If the subquer
20920 79 20 75 73 65 73 20 4c 49 4d 49 54 20 74 68 65  y uses LIMIT the
20930 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  n the outer quer
20940 79 20 6d 61 79 20 6e 6f 74 0a 2a 2a 20 20 20 20  y may not.**    
20950 20 20 20 20 68 61 76 65 20 61 20 57 48 45 52 45      have a WHERE
20960 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 20   clause..**.**  
20970 28 32 30 29 20 20 49 66 20 74 68 65 20 73 75 62  (20)  If the sub
20980 2d 71 75 65 72 79 20 69 73 20 61 20 63 6f 6d 70  -query is a comp
20990 6f 75 6e 64 20 73 65 6c 65 63 74 2c 20 74 68 65  ound select, the
209a0 6e 20 69 74 20 6d 75 73 74 20 6e 6f 74 20 75 73  n it must not us
209b0 65 0a 2a 2a 20 20 20 20 20 20 20 20 61 6e 20 4f  e.**        an O
209c0 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 2e 20  RDER BY clause. 
209d0 20 54 69 63 6b 65 74 20 23 33 37 37 33 2e 20 20   Ticket #3773.  
209e0 57 65 20 63 6f 75 6c 64 20 72 65 6c 61 78 20 74  We could relax t
209f0 68 69 73 20 63 6f 6e 73 74 72 61 69 6e 74 0a 2a  his constraint.*
20a00 2a 20 20 20 20 20 20 20 20 73 6f 6d 65 77 68 61  *        somewha
20a10 74 20 62 79 20 73 61 79 69 6e 67 20 74 68 61 74  t by saying that
20a20 20 74 68 65 20 74 65 72 6d 73 20 6f 66 20 74 68   the terms of th
20a30 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
20a40 65 20 6d 75 73 74 0a 2a 2a 20 20 20 20 20 20 20  e must.**       
20a50 20 61 70 70 65 61 72 20 61 73 20 75 6e 6d 6f 64   appear as unmod
20a60 69 66 69 65 64 20 72 65 73 75 6c 74 20 63 6f 6c  ified result col
20a70 75 6d 6e 73 20 69 6e 20 74 68 65 20 6f 75 74 65  umns in the oute
20a80 72 20 71 75 65 72 79 2e 20 20 42 75 74 20 77 65  r query.  But we
20a90 0a 2a 2a 20 20 20 20 20 20 20 20 68 61 76 65 20  .**        have 
20aa0 6f 74 68 65 72 20 6f 70 74 69 6d 69 7a 61 74 69  other optimizati
20ab0 6f 6e 73 20 69 6e 20 6d 69 6e 64 20 74 6f 20 64  ons in mind to d
20ac0 65 61 6c 20 77 69 74 68 20 74 68 61 74 20 63 61  eal with that ca
20ad0 73 65 2e 0a 2a 2a 0a 2a 2a 20 20 28 32 31 29 20  se..**.**  (21) 
20ae0 20 49 66 20 74 68 65 20 73 75 62 71 75 65 72 79   If the subquery
20af0 20 75 73 65 73 20 4c 49 4d 49 54 20 74 68 65 6e   uses LIMIT then
20b00 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
20b10 20 6d 61 79 20 6e 6f 74 20 62 65 0a 2a 2a 20 20   may not be.**  
20b20 20 20 20 20 20 20 44 49 53 54 49 4e 43 54 2e 20        DISTINCT. 
20b30 20 28 53 65 65 20 74 69 63 6b 65 74 20 5b 37 35   (See ticket [75
20b40 32 65 31 36 34 36 66 63 5d 29 2e 0a 2a 2a 0a 2a  2e1646fc])..**.*
20b50 2a 20 20 28 32 32 29 20 20 54 68 65 20 73 75 62  *  (22)  The sub
20b60 71 75 65 72 79 20 6d 61 79 20 6e 6f 74 20 62 65  query may not be
20b70 20 61 20 72 65 63 75 72 73 69 76 65 20 43 54 45   a recursive CTE
20b80 2e 0a 2a 2a 0a 2a 2a 20 20 28 2a 2a 29 20 20 53  ..**.**  (**)  S
20b90 75 62 73 75 6d 65 64 20 69 6e 74 6f 20 72 65 73  ubsumed into res
20ba0 74 72 69 63 74 69 6f 6e 20 28 31 37 64 33 29 2e  triction (17d3).
20bb0 20 20 57 61 73 3a 20 49 66 20 74 68 65 20 6f 75    Was: If the ou
20bc0 74 65 72 20 71 75 65 72 79 20 69 73 0a 2a 2a 20  ter query is.** 
20bd0 20 20 20 20 20 20 20 61 20 72 65 63 75 72 73 69         a recursi
20be0 76 65 20 43 54 45 2c 20 74 68 65 6e 20 74 68 65  ve CTE, then the
20bf0 20 73 75 62 2d 71 75 65 72 79 20 6d 61 79 20 6e   sub-query may n
20c00 6f 74 20 62 65 20 61 20 63 6f 6d 70 6f 75 6e 64  ot be a compound
20c10 20 71 75 65 72 79 2e 0a 2a 2a 20 20 20 20 20 20   query..**      
20c20 20 20 54 68 69 73 20 72 65 73 74 72 69 63 74 69    This restricti
20c30 6f 6e 20 69 73 20 62 65 63 61 75 73 65 20 74 72  on is because tr
20c40 61 6e 73 66 6f 72 6d 69 6e 67 20 74 68 65 0a 2a  ansforming the.*
20c50 2a 20 20 20 20 20 20 20 20 70 61 72 65 6e 74 20  *        parent 
20c60 74 6f 20 61 20 63 6f 6d 70 6f 75 6e 64 20 71 75  to a compound qu
20c70 65 72 79 20 63 6f 6e 66 75 73 65 73 20 74 68 65  ery confuses the
20c80 20 63 6f 64 65 20 74 68 61 74 20 68 61 6e 64 6c   code that handl
20c90 65 73 0a 2a 2a 20 20 20 20 20 20 20 20 72 65 63  es.**        rec
20ca0 75 72 73 69 76 65 20 71 75 65 72 69 65 73 20 69  ursive queries i
20cb0 6e 20 6d 75 6c 74 69 53 65 6c 65 63 74 28 29 2e  n multiSelect().
20cc0 0a 2a 2a 0a 2a 2a 20 20 28 2a 2a 29 20 20 57 65  .**.**  (**)  We
20cd0 20 6e 6f 20 6c 6f 6e 67 65 72 20 61 74 74 65 6d   no longer attem
20ce0 70 74 20 74 6f 20 66 6c 61 74 74 65 6e 20 61 67  pt to flatten ag
20cf0 67 72 65 67 61 74 65 20 73 75 62 71 75 65 72 69  gregate subqueri
20d00 65 73 2e 20 20 57 61 73 3a 0a 2a 2a 20 20 20 20  es.  Was:.**    
20d10 20 20 20 20 54 68 65 20 73 75 62 71 75 65 72 79      The subquery
20d20 20 6d 61 79 20 6e 6f 74 20 62 65 20 61 6e 20 61   may not be an a
20d30 67 67 72 65 67 61 74 65 20 74 68 61 74 20 75 73  ggregate that us
20d40 65 73 20 74 68 65 20 62 75 69 6c 74 2d 69 6e 20  es the built-in 
20d50 6d 69 6e 28 29 20 6f 72 20 0a 2a 2a 20 20 20 20  min() or .**    
20d60 20 20 20 20 6f 72 20 6d 61 78 28 29 20 66 75 6e      or max() fun
20d70 63 74 69 6f 6e 73 2e 20 20 28 57 69 74 68 6f 75  ctions.  (Withou
20d80 74 20 74 68 69 73 20 72 65 73 74 72 69 63 74 69  t this restricti
20d90 6f 6e 2c 20 61 20 71 75 65 72 79 20 6c 69 6b 65  on, a query like
20da0 3a 0a 2a 2a 20 20 20 20 20 20 20 20 22 53 45 4c  :.**        "SEL
20db0 45 43 54 20 78 20 46 52 4f 4d 20 28 53 45 4c 45  ECT x FROM (SELE
20dc0 43 54 20 6d 61 78 28 79 29 2c 20 78 20 46 52 4f  CT max(y), x FRO
20dd0 4d 20 74 31 29 22 20 77 6f 75 6c 64 20 6e 6f 74  M t1)" would not
20de0 20 6e 65 63 65 73 73 61 72 69 6c 79 0a 2a 2a 20   necessarily.** 
20df0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 74 68         return th
20e00 65 20 76 61 6c 75 65 20 58 20 66 6f 72 20 77 68  e value X for wh
20e10 69 63 68 20 59 20 77 61 73 20 6d 61 78 69 6d 61  ich Y was maxima
20e20 6c 2e 29 0a 2a 2a 0a 2a 2a 20 20 28 32 35 29 20  l.).**.**  (25) 
20e30 20 49 66 20 65 69 74 68 65 72 20 74 68 65 20 73   If either the s
20e40 75 62 71 75 65 72 79 20 6f 72 20 74 68 65 20 70  ubquery or the p
20e50 61 72 65 6e 74 20 71 75 65 72 79 20 63 6f 6e 74  arent query cont
20e60 61 69 6e 73 20 61 20 77 69 6e 64 6f 77 0a 2a 2a  ains a window.**
20e70 20 20 20 20 20 20 20 20 66 75 6e 63 74 69 6f 6e          function
20e80 20 69 6e 20 74 68 65 20 73 65 6c 65 63 74 20 6c   in the select l
20e90 69 73 74 20 6f 72 20 4f 52 44 45 52 20 42 59 20  ist or ORDER BY 
20ea0 63 6c 61 75 73 65 2c 20 66 6c 61 74 74 65 6e 69  clause, flatteni
20eb0 6e 67 0a 2a 2a 20 20 20 20 20 20 20 20 69 73 20  ng.**        is 
20ec0 6e 6f 74 20 61 74 74 65 6d 70 74 65 64 2e 0a 2a  not attempted..*
20ed0 2a 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 69 73 20  *.**.** In this 
20ee0 72 6f 75 74 69 6e 65 2c 20 74 68 65 20 22 70 22  routine, the "p"
20ef0 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 61 20   parameter is a 
20f00 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 6f  pointer to the o
20f10 75 74 65 72 20 71 75 65 72 79 2e 0a 2a 2a 20 54  uter query..** T
20f20 68 65 20 73 75 62 71 75 65 72 79 20 69 73 20 70  he subquery is p
20f30 2d 3e 70 53 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d  ->pSrc->a[iFrom]
20f40 2e 20 20 69 73 41 67 67 20 69 73 20 74 72 75 65  .  isAgg is true
20f50 20 69 66 20 74 68 65 20 6f 75 74 65 72 20 71 75   if the outer qu
20f60 65 72 79 0a 2a 2a 20 75 73 65 73 20 61 67 67 72  ery.** uses aggr
20f70 65 67 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66  egates..**.** If
20f80 20 66 6c 61 74 74 65 6e 69 6e 67 20 69 73 20 6e   flattening is n
20f90 6f 74 20 61 74 74 65 6d 70 74 65 64 2c 20 74 68  ot attempted, th
20fa0 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20  is routine is a 
20fb0 6e 6f 2d 6f 70 20 61 6e 64 20 72 65 74 75 72 6e  no-op and return
20fc0 73 20 30 2e 0a 2a 2a 20 49 66 20 66 6c 61 74 74  s 0..** If flatt
20fd0 65 6e 69 6e 67 20 69 73 20 61 74 74 65 6d 70 74  ening is attempt
20fe0 65 64 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ed this routine 
20ff0 72 65 74 75 72 6e 73 20 31 2e 0a 2a 2a 0a 2a 2a  returns 1..**.**
21000 20 41 6c 6c 20 6f 66 20 74 68 65 20 65 78 70 72   All of the expr
21010 65 73 73 69 6f 6e 20 61 6e 61 6c 79 73 69 73 20  ession analysis 
21020 6d 75 73 74 20 6f 63 63 75 72 20 6f 6e 20 62 6f  must occur on bo
21030 74 68 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  th the outer que
21040 72 79 20 61 6e 64 0a 2a 2a 20 74 68 65 20 73 75  ry and.** the su
21050 62 71 75 65 72 79 20 62 65 66 6f 72 65 20 74 68  bquery before th
21060 69 73 20 72 6f 75 74 69 6e 65 20 72 75 6e 73 2e  is routine runs.
21070 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
21080 6c 61 74 74 65 6e 53 75 62 71 75 65 72 79 28 0a  lattenSubquery(.
21090 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
210a0 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e         /* Parsin
210b0 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53  g context */.  S
210c0 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20  elect *p,       
210d0 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 65 6e      /* The paren
210e0 74 20 6f 72 20 6f 75 74 65 72 20 53 45 4c 45 43  t or outer SELEC
210f0 54 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20  T statement */. 
21100 20 69 6e 74 20 69 46 72 6f 6d 2c 20 20 20 20 20   int iFrom,     
21110 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 69        /* Index i
21120 6e 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 5d 20 6f  n p->pSrc->a[] o
21130 66 20 74 68 65 20 69 6e 6e 65 72 20 73 75 62 71  f the inner subq
21140 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20 69 73  uery */.  int is
21150 41 67 67 20 20 20 20 20 20 20 20 20 20 20 20 2f  Agg            /
21160 2a 20 54 72 75 65 20 69 66 20 6f 75 74 65 72 20  * True if outer 
21170 53 45 4c 45 43 54 20 75 73 65 73 20 61 67 67 72  SELECT uses aggr
21180 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 20  egate functions 
21190 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68  */.){.  const ch
211a0 61 72 20 2a 7a 53 61 76 65 64 41 75 74 68 43 6f  ar *zSavedAuthCo
211b0 6e 74 65 78 74 20 3d 20 70 50 61 72 73 65 2d 3e  ntext = pParse->
211c0 7a 41 75 74 68 43 6f 6e 74 65 78 74 3b 0a 20 20  zAuthContext;.  
211d0 53 65 6c 65 63 74 20 2a 70 50 61 72 65 6e 74 3b  Select *pParent;
211e0 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 55      /* Current U
211f0 4e 49 4f 4e 20 41 4c 4c 20 74 65 72 6d 20 6f 66  NION ALL term of
21200 20 74 68 65 20 6f 74 68 65 72 20 71 75 65 72 79   the other query
21210 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53   */.  Select *pS
21220 75 62 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65  ub;       /* The
21230 20 69 6e 6e 65 72 20 71 75 65 72 79 20 6f 72 20   inner query or 
21240 22 73 75 62 71 75 65 72 79 22 20 2a 2f 0a 20 20  "subquery" */.  
21250 53 65 6c 65 63 74 20 2a 70 53 75 62 31 3b 20 20  Select *pSub1;  
21260 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
21270 6f 20 74 68 65 20 72 69 67 68 74 6d 6f 73 74 20  o the rightmost 
21280 73 65 6c 65 63 74 20 69 6e 20 73 75 62 2d 71 75  select in sub-qu
21290 65 72 79 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74  ery */.  SrcList
212a0 20 2a 70 53 72 63 3b 20 20 20 20 20 20 2f 2a 20   *pSrc;      /* 
212b0 54 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  The FROM clause 
212c0 6f 66 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  of the outer que
212d0 72 79 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20  ry */.  SrcList 
212e0 2a 70 53 75 62 53 72 63 3b 20 20 20 2f 2a 20 54  *pSubSrc;   /* T
212f0 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f  he FROM clause o
21300 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20 2a  f the subquery *
21310 2f 0a 20 20 69 6e 74 20 69 50 61 72 65 6e 74 3b  /.  int iParent;
21320 20 20 20 20 20 20 20 20 2f 2a 20 56 44 42 45 20          /* VDBE 
21330 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 6f 66  cursor number of
21340 20 74 68 65 20 70 53 75 62 20 72 65 73 75 6c 74   the pSub result
21350 20 73 65 74 20 74 65 6d 70 20 74 61 62 6c 65 20   set temp table 
21360 2a 2f 0a 20 20 69 6e 74 20 69 4e 65 77 50 61 72  */.  int iNewPar
21370 65 6e 74 20 3d 20 2d 31 3b 2f 2a 20 52 65 70 6c  ent = -1;/* Repl
21380 61 63 65 6d 65 6e 74 20 74 61 62 6c 65 20 66 6f  acement table fo
21390 72 20 69 50 61 72 65 6e 74 20 2a 2f 0a 20 20 69  r iParent */.  i
213a0 6e 74 20 69 73 4c 65 66 74 4a 6f 69 6e 20 3d 20  nt isLeftJoin = 
213b0 30 3b 20 2f 2a 20 54 72 75 65 20 69 66 20 70 53  0; /* True if pS
213c0 75 62 20 69 73 20 74 68 65 20 72 69 67 68 74 20  ub is the right 
213d0 73 69 64 65 20 6f 66 20 61 20 4c 45 46 54 20 4a  side of a LEFT J
213e0 4f 49 4e 20 2a 2f 20 20 20 20 0a 20 20 69 6e 74  OIN */    .  int
213f0 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   i;             
21400 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
21410 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 57 68 65   */.  Expr *pWhe
21420 72 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  re;             
21430 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48         /* The WH
21440 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20  ERE clause */.  
21450 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
21460 74 65 6d 20 2a 70 53 75 62 69 74 65 6d 3b 20 20  tem *pSubitem;  
21470 20 2f 2a 20 54 68 65 20 73 75 62 71 75 65 72 79   /* The subquery
21480 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   */.  sqlite3 *d
21490 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
214a0 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73  .  /* Check to s
214b0 65 65 20 69 66 20 66 6c 61 74 74 65 6e 69 6e 67  ee if flattening
214c0 20 69 73 20 70 65 72 6d 69 74 74 65 64 2e 20 20   is permitted.  
214d0 52 65 74 75 72 6e 20 30 20 69 66 20 6e 6f 74 2e  Return 0 if not.
214e0 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
214f0 70 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  p!=0 );.  assert
21500 28 20 70 2d 3e 70 50 72 69 6f 72 3d 3d 30 20 29  ( p->pPrior==0 )
21510 3b 0a 20 20 69 66 28 20 4f 70 74 69 6d 69 7a 61  ;.  if( Optimiza
21520 74 69 6f 6e 44 69 73 61 62 6c 65 64 28 64 62 2c  tionDisabled(db,
21530 20 53 51 4c 49 54 45 5f 51 75 65 72 79 46 6c 61   SQLITE_QueryFla
21540 74 74 65 6e 65 72 29 20 29 20 72 65 74 75 72 6e  ttener) ) return
21550 20 30 3b 0a 20 20 70 53 72 63 20 3d 20 70 2d 3e   0;.  pSrc = p->
21560 70 53 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20  pSrc;.  assert( 
21570 70 53 72 63 20 26 26 20 69 46 72 6f 6d 3e 3d 30  pSrc && iFrom>=0
21580 20 26 26 20 69 46 72 6f 6d 3c 70 53 72 63 2d 3e   && iFrom<pSrc->
21590 6e 53 72 63 20 29 3b 0a 20 20 70 53 75 62 69 74  nSrc );.  pSubit
215a0 65 6d 20 3d 20 26 70 53 72 63 2d 3e 61 5b 69 46  em = &pSrc->a[iF
215b0 72 6f 6d 5d 3b 0a 20 20 69 50 61 72 65 6e 74 20  rom];.  iParent 
215c0 3d 20 70 53 75 62 69 74 65 6d 2d 3e 69 43 75 72  = pSubitem->iCur
215d0 73 6f 72 3b 0a 20 20 70 53 75 62 20 3d 20 70 53  sor;.  pSub = pS
215e0 75 62 69 74 65 6d 2d 3e 70 53 65 6c 65 63 74 3b  ubitem->pSelect;
215f0 0a 20 20 61 73 73 65 72 74 28 20 70 53 75 62 21  .  assert( pSub!
21600 3d 30 20 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53  =0 );..#ifndef S
21610 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 49 4e 44 4f  QLITE_OMIT_WINDO
21620 57 46 55 4e 43 0a 20 20 69 66 28 20 70 2d 3e 70  WFUNC.  if( p->p
21630 57 69 6e 20 7c 7c 20 70 53 75 62 2d 3e 70 57 69  Win || pSub->pWi
21640 6e 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20  n ) return 0;   
21650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
21660 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28 32  * Restriction (2
21670 35 29 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 20 20  5) */.#endif..  
21680 70 53 75 62 53 72 63 20 3d 20 70 53 75 62 2d 3e  pSubSrc = pSub->
21690 70 53 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20  pSrc;.  assert( 
216a0 70 53 75 62 53 72 63 20 29 3b 0a 20 20 2f 2a 20  pSubSrc );.  /* 
216b0 50 72 69 6f 72 20 74 6f 20 76 65 72 73 69 6f 6e  Prior to version
216c0 20 33 2e 31 2e 32 2c 20 77 68 65 6e 20 4c 49 4d   3.1.2, when LIM
216d0 49 54 20 61 6e 64 20 4f 46 46 53 45 54 20 68 61  IT and OFFSET ha
216e0 64 20 74 6f 20 62 65 20 73 69 6d 70 6c 65 20 63  d to be simple c
216f0 6f 6e 73 74 61 6e 74 73 2c 0a 20 20 2a 2a 20 6e  onstants,.  ** n
21700 6f 74 20 61 72 62 69 74 72 61 72 79 20 65 78 70  ot arbitrary exp
21710 72 65 73 73 69 6f 6e 73 2c 20 77 65 20 61 6c 6c  ressions, we all
21720 6f 77 65 64 20 73 6f 6d 65 20 63 6f 6d 62 69 6e  owed some combin
21730 69 6e 67 20 6f 66 20 4c 49 4d 49 54 20 61 6e 64  ing of LIMIT and
21740 20 4f 46 46 53 45 54 0a 20 20 2a 2a 20 62 65 63   OFFSET.  ** bec
21750 61 75 73 65 20 74 68 65 79 20 63 6f 75 6c 64 20  ause they could 
21760 62 65 20 63 6f 6d 70 75 74 65 64 20 61 74 20 63  be computed at c
21770 6f 6d 70 69 6c 65 2d 74 69 6d 65 2e 20 20 42 75  ompile-time.  Bu
21780 74 20 77 68 65 6e 20 4c 49 4d 49 54 20 61 6e 64  t when LIMIT and
21790 20 4f 46 46 53 45 54 0a 20 20 2a 2a 20 62 65 63   OFFSET.  ** bec
217a0 61 6d 65 20 61 72 62 69 74 72 61 72 79 20 65 78  ame arbitrary ex
217b0 70 72 65 73 73 69 6f 6e 73 2c 20 77 65 20 77 65  pressions, we we
217c0 72 65 20 66 6f 72 63 65 64 20 74 6f 20 61 64 64  re forced to add
217d0 20 72 65 73 74 72 69 63 74 69 6f 6e 73 20 28 31   restrictions (1
217e0 33 29 0a 20 20 2a 2a 20 61 6e 64 20 28 31 34 29  3).  ** and (14)
217f0 2e 20 2a 2f 0a 20 20 69 66 28 20 70 53 75 62 2d  . */.  if( pSub-
21800 3e 70 4c 69 6d 69 74 20 26 26 20 70 2d 3e 70 4c  >pLimit && p->pL
21810 69 6d 69 74 20 29 20 72 65 74 75 72 6e 20 30 3b  imit ) return 0;
21820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
21830 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28 31 33   Restriction (13
21840 29 20 2a 2f 0a 20 20 69 66 28 20 70 53 75 62 2d  ) */.  if( pSub-
21850 3e 70 4c 69 6d 69 74 20 26 26 20 70 53 75 62 2d  >pLimit && pSub-
21860 3e 70 4c 69 6d 69 74 2d 3e 70 52 69 67 68 74 20  >pLimit->pRight 
21870 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 2f 2a  ) return 0;   /*
21880 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28 31 34   Restriction (14
21890 29 20 2a 2f 0a 20 20 69 66 28 20 28 70 2d 3e 73  ) */.  if( (p->s
218a0 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 43 6f 6d  elFlags & SF_Com
218b0 70 6f 75 6e 64 29 21 3d 30 20 26 26 20 70 53 75  pound)!=0 && pSu
218c0 62 2d 3e 70 4c 69 6d 69 74 20 29 7b 0a 20 20 20  b->pLimit ){.   
218d0 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20   return 0;      
218e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
218f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21900 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63        /* Restric
21910 74 69 6f 6e 20 28 31 35 29 20 2a 2f 0a 20 20 7d  tion (15) */.  }
21920 0a 20 20 69 66 28 20 70 53 75 62 53 72 63 2d 3e  .  if( pSubSrc->
21930 6e 53 72 63 3d 3d 30 20 29 20 72 65 74 75 72 6e  nSrc==0 ) return
21940 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
21950 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73            /* Res
21960 74 72 69 63 74 69 6f 6e 20 28 37 29 20 20 2a 2f  triction (7)  */
21970 0a 20 20 69 66 28 20 70 53 75 62 2d 3e 73 65 6c  .  if( pSub->sel
21980 46 6c 61 67 73 20 26 20 53 46 5f 44 69 73 74 69  Flags & SF_Disti
21990 6e 63 74 20 29 20 72 65 74 75 72 6e 20 30 3b 20  nct ) return 0; 
219a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73            /* Res
219b0 74 72 69 63 74 69 6f 6e 20 28 34 29 20 20 2a 2f  triction (4)  */
219c0 0a 20 20 69 66 28 20 70 53 75 62 2d 3e 70 4c 69  .  if( pSub->pLi
219d0 6d 69 74 20 26 26 20 28 70 53 72 63 2d 3e 6e 53  mit && (pSrc->nS
219e0 72 63 3e 31 20 7c 7c 20 69 73 41 67 67 29 20 29  rc>1 || isAgg) )
219f0 7b 0a 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b  {.     return 0;
21a00 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74           /* Rest
21a10 72 69 63 74 69 6f 6e 73 20 28 38 29 28 39 29 20  rictions (8)(9) 
21a20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e  */.  }.  if( p->
21a30 70 4f 72 64 65 72 42 79 20 26 26 20 70 53 75 62  pOrderBy && pSub
21a40 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20  ->pOrderBy ){.  
21a50 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20     return 0;    
21a60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21a70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21a80 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69         /* Restri
21a90 63 74 69 6f 6e 20 28 31 31 29 20 2a 2f 0a 20 20  ction (11) */.  
21aa0 7d 0a 20 20 69 66 28 20 69 73 41 67 67 20 26 26  }.  if( isAgg &&
21ab0 20 70 53 75 62 2d 3e 70 4f 72 64 65 72 42 79 20   pSub->pOrderBy 
21ac0 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20  ) return 0;     
21ad0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
21ae0 73 74 72 69 63 74 69 6f 6e 20 28 31 36 29 20 2a  striction (16) *
21af0 2f 0a 20 20 69 66 28 20 70 53 75 62 2d 3e 70 4c  /.  if( pSub->pL
21b00 69 6d 69 74 20 26 26 20 70 2d 3e 70 57 68 65 72  imit && p->pWher
21b10 65 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20  e ) return 0;   
21b20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
21b30 73 74 72 69 63 74 69 6f 6e 20 28 31 39 29 20 2a  striction (19) *
21b40 2f 0a 20 20 69 66 28 20 70 53 75 62 2d 3e 70 4c  /.  if( pSub->pL
21b50 69 6d 69 74 20 26 26 20 28 70 2d 3e 73 65 6c 46  imit && (p->selF
21b60 6c 61 67 73 20 26 20 53 46 5f 44 69 73 74 69 6e  lags & SF_Distin
21b70 63 74 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 72  ct)!=0 ){.     r
21b80 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20  eturn 0;        
21b90 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20   /* Restriction 
21ba0 28 32 31 29 20 2a 2f 0a 20 20 7d 0a 20 20 69 66  (21) */.  }.  if
21bb0 28 20 70 53 75 62 2d 3e 73 65 6c 46 6c 61 67 73  ( pSub->selFlags
21bc0 20 26 20 28 53 46 5f 52 65 63 75 72 73 69 76 65   & (SF_Recursive
21bd0 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
21be0 30 3b 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f  0; /* Restrictio
21bf0 6e 73 20 28 32 32 29 20 2a 2f 0a 20 20 7d 0a 0a  ns (22) */.  }..
21c00 20 20 2f 2a 0a 20 20 2a 2a 20 49 66 20 74 68 65    /*.  ** If the
21c10 20 73 75 62 71 75 65 72 79 20 69 73 20 74 68 65   subquery is the
21c20 20 72 69 67 68 74 20 6f 70 65 72 61 6e 64 20 6f   right operand o
21c30 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e 2c 20 74  f a LEFT JOIN, t
21c40 68 65 6e 20 74 68 65 0a 20 20 2a 2a 20 73 75 62  hen the.  ** sub
21c50 71 75 65 72 79 20 6d 61 79 20 6e 6f 74 20 62 65  query may not be
21c60 20 61 20 6a 6f 69 6e 20 69 74 73 65 6c 66 20 28   a join itself (
21c70 33 61 29 2e 20 45 78 61 6d 70 6c 65 20 6f 66 20  3a). Example of 
21c80 77 68 79 20 74 68 69 73 20 69 73 20 6e 6f 74 0a  why this is not.
21c90 20 20 2a 2a 20 61 6c 6c 6f 77 65 64 3a 0a 20 20    ** allowed:.  
21ca0 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20  **.  **         
21cb0 74 31 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f  t1 LEFT OUTER JO
21cc0 49 4e 20 28 74 32 20 4a 4f 49 4e 20 74 33 29 0a  IN (t2 JOIN t3).
21cd0 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 77 65 20    **.  ** If we 
21ce0 66 6c 61 74 74 65 6e 20 74 68 65 20 61 62 6f 76  flatten the abov
21cf0 65 2c 20 77 65 20 77 6f 75 6c 64 20 67 65 74 0a  e, we would get.
21d00 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20    **.  **       
21d10 20 20 28 74 31 20 4c 45 46 54 20 4f 55 54 45 52    (t1 LEFT OUTER
21d20 20 4a 4f 49 4e 20 74 32 29 20 4a 4f 49 4e 20 74   JOIN t2) JOIN t
21d30 33 0a 20 20 2a 2a 0a 20 20 2a 2a 20 77 68 69 63  3.  **.  ** whic
21d40 68 20 69 73 20 6e 6f 74 20 61 74 20 61 6c 6c 20  h is not at all 
21d50 74 68 65 20 73 61 6d 65 20 74 68 69 6e 67 2e 0a  the same thing..
21d60 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 74 68 65    **.  ** If the
21d70 20 73 75 62 71 75 65 72 79 20 69 73 20 74 68 65   subquery is the
21d80 20 72 69 67 68 74 20 6f 70 65 72 61 6e 64 20 6f   right operand o
21d90 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e 2c 20 74  f a LEFT JOIN, t
21da0 68 65 6e 20 74 68 65 20 6f 75 74 65 72 0a 20 20  hen the outer.  
21db0 2a 2a 20 71 75 65 72 79 20 63 61 6e 6e 6f 74 20  ** query cannot 
21dc0 62 65 20 61 6e 20 61 67 67 72 65 67 61 74 65 2e  be an aggregate.
21dd0 20 28 33 63 29 20 20 54 68 69 73 20 69 73 20 61   (3c)  This is a
21de0 6e 20 61 72 74 69 66 61 63 74 20 6f 66 20 74 68  n artifact of th
21df0 65 20 77 61 79 0a 20 20 2a 2a 20 61 67 67 72 65  e way.  ** aggre
21e00 67 61 74 65 73 20 61 72 65 20 70 72 6f 63 65 73  gates are proces
21e10 73 65 64 20 2d 20 74 68 65 72 65 20 69 73 20 6e  sed - there is n
21e20 6f 20 6d 65 63 68 61 6e 69 73 6d 20 74 6f 20 64  o mechanism to d
21e30 65 74 65 72 6d 69 6e 65 20 69 66 0a 20 20 2a 2a  etermine if.  **
21e40 20 74 68 65 20 4c 45 46 54 20 4a 4f 49 4e 20 74   the LEFT JOIN t
21e50 61 62 6c 65 20 73 68 6f 75 6c 64 20 62 65 20 61  able should be a
21e60 6c 6c 2d 4e 55 4c 4c 2e 0a 20 20 2a 2a 0a 20 20  ll-NULL..  **.  
21e70 2a 2a 20 53 65 65 20 61 6c 73 6f 20 74 69 63 6b  ** See also tick
21e80 65 74 73 20 23 33 30 36 2c 20 23 33 35 30 2c 20  ets #306, #350, 
21e90 61 6e 64 20 23 33 33 30 30 2e 0a 20 20 2a 2f 0a  and #3300..  */.
21ea0 20 20 69 66 28 20 28 70 53 75 62 69 74 65 6d 2d    if( (pSubitem-
21eb0 3e 66 67 2e 6a 6f 69 6e 74 79 70 65 20 26 20 4a  >fg.jointype & J
21ec0 54 5f 4f 55 54 45 52 29 21 3d 30 20 29 7b 0a 20  T_OUTER)!=0 ){. 
21ed0 20 20 20 69 73 4c 65 66 74 4a 6f 69 6e 20 3d 20     isLeftJoin = 
21ee0 31 3b 0a 20 20 20 20 69 66 28 20 70 53 75 62 53  1;.    if( pSubS
21ef0 72 63 2d 3e 6e 53 72 63 3e 31 20 7c 7c 20 69 73  rc->nSrc>1 || is
21f00 41 67 67 20 7c 7c 20 49 73 56 69 72 74 75 61 6c  Agg || IsVirtual
21f10 28 70 53 75 62 53 72 63 2d 3e 61 5b 30 5d 2e 70  (pSubSrc->a[0].p
21f20 54 61 62 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a  Tab) ){.      /*
21f30 20 20 28 33 61 29 20 20 20 20 20 20 20 20 20 20    (3a)          
21f40 20 20 20 28 33 63 29 20 20 20 20 20 28 33 62 29     (3c)     (3b)
21f50 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e   */.      return
21f60 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 69   0;.    }.  }.#i
21f70 66 64 65 66 20 53 51 4c 49 54 45 5f 45 58 54 52  fdef SQLITE_EXTR
21f80 41 5f 49 46 4e 55 4c 4c 52 4f 57 0a 20 20 65 6c  A_IFNULLROW.  el
21f90 73 65 20 69 66 28 20 69 46 72 6f 6d 3e 30 20 26  se if( iFrom>0 &
21fa0 26 20 21 69 73 41 67 67 20 29 7b 0a 20 20 20 20  & !isAgg ){.    
21fb0 2f 2a 20 53 65 74 74 69 6e 67 20 69 73 4c 65 66  /* Setting isLef
21fc0 74 4a 6f 69 6e 20 74 6f 20 2d 31 20 63 61 75 73  tJoin to -1 caus
21fd0 65 73 20 4f 50 5f 49 66 4e 75 6c 6c 52 6f 77 20  es OP_IfNullRow 
21fe0 6f 70 63 6f 64 65 73 20 74 6f 20 62 65 20 67 65  opcodes to be ge
21ff0 6e 65 72 61 74 65 64 20 66 6f 72 0a 20 20 20 20  nerated for.    
22000 2a 2a 20 65 76 65 72 79 20 72 65 66 65 72 65 6e  ** every referen
22010 63 65 20 74 6f 20 61 6e 79 20 72 65 73 75 6c 74  ce to any result
22020 20 63 6f 6c 75 6d 6e 20 66 72 6f 6d 20 73 75 62   column from sub
22030 71 75 65 72 79 20 69 6e 20 61 20 6a 6f 69 6e 2c  query in a join,
22040 20 65 76 65 6e 0a 20 20 20 20 2a 2a 20 74 68 6f   even.    ** tho
22050 75 67 68 20 74 68 65 79 20 61 72 65 20 6e 6f 74  ugh they are not
22060 20 6e 65 63 65 73 73 61 72 79 2e 20 20 54 68 69   necessary.  Thi
22070 73 20 77 69 6c 6c 20 73 74 72 65 73 73 2d 74 65  s will stress-te
22080 73 74 20 74 68 65 20 4f 50 5f 49 66 4e 75 6c 6c  st the OP_IfNull
22090 52 6f 77 20 0a 20 20 20 20 2a 2a 20 6f 70 63 6f  Row .    ** opco
220a0 64 65 2e 20 2a 2f 0a 20 20 20 20 69 73 4c 65 66  de. */.    isLef
220b0 74 4a 6f 69 6e 20 3d 20 2d 31 3b 0a 20 20 7d 0a  tJoin = -1;.  }.
220c0 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 52 65 73  #endif..  /* Res
220d0 74 72 69 63 74 69 6f 6e 20 28 31 37 29 3a 20 49  triction (17): I
220e0 66 20 74 68 65 20 73 75 62 2d 71 75 65 72 79 20  f the sub-query 
220f0 69 73 20 61 20 63 6f 6d 70 6f 75 6e 64 20 53 45  is a compound SE
22100 4c 45 43 54 2c 20 74 68 65 6e 20 69 74 20 6d 75  LECT, then it mu
22110 73 74 0a 20 20 2a 2a 20 75 73 65 20 6f 6e 6c 79  st.  ** use only
22120 20 74 68 65 20 55 4e 49 4f 4e 20 41 4c 4c 20 6f   the UNION ALL o
22130 70 65 72 61 74 6f 72 2e 20 41 6e 64 20 6e 6f 6e  perator. And non
22140 65 20 6f 66 20 74 68 65 20 73 69 6d 70 6c 65 20  e of the simple 
22150 73 65 6c 65 63 74 20 71 75 65 72 69 65 73 0a 20  select queries. 
22160 20 2a 2a 20 74 68 61 74 20 6d 61 6b 65 20 75 70   ** that make up
22170 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 53 45   the compound SE
22180 4c 45 43 54 20 61 72 65 20 61 6c 6c 6f 77 65 64  LECT are allowed
22190 20 74 6f 20 62 65 20 61 67 67 72 65 67 61 74 65   to be aggregate
221a0 20 6f 72 20 64 69 73 74 69 6e 63 74 0a 20 20 2a   or distinct.  *
221b0 2a 20 71 75 65 72 69 65 73 2e 0a 20 20 2a 2f 0a  * queries..  */.
221c0 20 20 69 66 28 20 70 53 75 62 2d 3e 70 50 72 69    if( pSub->pPri
221d0 6f 72 20 29 7b 0a 20 20 20 20 69 66 28 20 70 53  or ){.    if( pS
221e0 75 62 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a  ub->pOrderBy ){.
221f0 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20        return 0; 
22200 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20   /* Restriction 
22210 28 32 30 29 20 2a 2f 0a 20 20 20 20 7d 0a 20 20  (20) */.    }.  
22220 20 20 69 66 28 20 69 73 41 67 67 20 7c 7c 20 28    if( isAgg || (
22230 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46  p->selFlags & SF
22240 5f 44 69 73 74 69 6e 63 74 29 21 3d 30 20 7c 7c  _Distinct)!=0 ||
22250 20 70 53 72 63 2d 3e 6e 53 72 63 21 3d 31 20 29   pSrc->nSrc!=1 )
22260 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30  {.      return 0
22270 3b 20 2f 2a 20 28 31 37 64 31 29 2c 20 28 31 37  ; /* (17d1), (17
22280 64 32 29 2c 20 6f 72 20 28 31 37 64 33 29 20 2a  d2), or (17d3) *
22290 2f 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28  /.    }.    for(
222a0 70 53 75 62 31 3d 70 53 75 62 3b 20 70 53 75 62  pSub1=pSub; pSub
222b0 31 3b 20 70 53 75 62 31 3d 70 53 75 62 31 2d 3e  1; pSub1=pSub1->
222c0 70 50 72 69 6f 72 29 7b 0a 20 20 20 20 20 20 74  pPrior){.      t
222d0 65 73 74 63 61 73 65 28 20 28 70 53 75 62 31 2d  estcase( (pSub1-
222e0 3e 73 65 6c 46 6c 61 67 73 20 26 20 28 53 46 5f  >selFlags & (SF_
222f0 44 69 73 74 69 6e 63 74 7c 53 46 5f 41 67 67 72  Distinct|SF_Aggr
22300 65 67 61 74 65 29 29 3d 3d 53 46 5f 44 69 73 74  egate))==SF_Dist
22310 69 6e 63 74 20 29 3b 0a 20 20 20 20 20 20 74 65  inct );.      te
22320 73 74 63 61 73 65 28 20 28 70 53 75 62 31 2d 3e  stcase( (pSub1->
22330 73 65 6c 46 6c 61 67 73 20 26 20 28 53 46 5f 44  selFlags & (SF_D
22340 69 73 74 69 6e 63 74 7c 53 46 5f 41 67 67 72 65  istinct|SF_Aggre
22350 67 61 74 65 29 29 3d 3d 53 46 5f 41 67 67 72 65  gate))==SF_Aggre
22360 67 61 74 65 20 29 3b 0a 20 20 20 20 20 20 61 73  gate );.      as
22370 73 65 72 74 28 20 70 53 75 62 2d 3e 70 53 72 63  sert( pSub->pSrc
22380 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73  !=0 );.      ass
22390 65 72 74 28 20 70 53 75 62 2d 3e 70 45 4c 69 73  ert( pSub->pELis
223a0 74 2d 3e 6e 45 78 70 72 3d 3d 70 53 75 62 31 2d  t->nExpr==pSub1-
223b0 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29  >pEList->nExpr )
223c0 3b 0a 20 20 20 20 20 20 69 66 28 20 28 70 53 75  ;.      if( (pSu
223d0 62 31 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 28  b1->selFlags & (
223e0 53 46 5f 44 69 73 74 69 6e 63 74 7c 53 46 5f 41  SF_Distinct|SF_A
223f0 67 67 72 65 67 61 74 65 29 29 21 3d 30 20 20 20  ggregate))!=0   
22400 20 2f 2a 20 28 31 37 62 29 20 2a 2f 0a 20 20 20   /* (17b) */.   
22410 20 20 20 20 7c 7c 20 28 70 53 75 62 31 2d 3e 70      || (pSub1->p
22420 50 72 69 6f 72 20 26 26 20 70 53 75 62 31 2d 3e  Prior && pSub1->
22430 6f 70 21 3d 54 4b 5f 41 4c 4c 29 20 20 20 20 20  op!=TK_ALL)     
22440 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 28              /* (
22450 31 37 61 29 20 2a 2f 0a 20 20 20 20 20 20 20 7c  17a) */.       |
22460 7c 20 70 53 75 62 31 2d 3e 70 53 72 63 2d 3e 6e  | pSub1->pSrc->n
22470 53 72 63 3c 31 20 20 20 20 20 20 20 20 20 20 20  Src<1           
22480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22490 20 20 20 20 20 20 20 2f 2a 20 28 31 37 63 29 20         /* (17c) 
224a0 2a 2f 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20  */.      ){.    
224b0 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
224c0 20 20 20 20 7d 0a 20 20 20 20 20 20 74 65 73 74      }.      test
224d0 63 61 73 65 28 20 70 53 75 62 31 2d 3e 70 53 72  case( pSub1->pSr
224e0 63 2d 3e 6e 53 72 63 3e 31 20 29 3b 0a 20 20 20  c->nSrc>1 );.   
224f0 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 65 73 74 72   }..    /* Restr
22500 69 63 74 69 6f 6e 20 28 31 38 29 2e 20 2a 2f 0a  iction (18). */.
22510 20 20 20 20 69 66 28 20 70 2d 3e 70 4f 72 64 65      if( p->pOrde
22520 72 42 79 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  rBy ){.      int
22530 20 69 69 3b 0a 20 20 20 20 20 20 66 6f 72 28 69   ii;.      for(i
22540 69 3d 30 3b 20 69 69 3c 70 2d 3e 70 4f 72 64 65  i=0; ii<p->pOrde
22550 72 42 79 2d 3e 6e 45 78 70 72 3b 20 69 69 2b 2b  rBy->nExpr; ii++
22560 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  ){.        if( p
22570 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 69  ->pOrderBy->a[ii
22580 5d 2e 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f  ].u.x.iOrderByCo
22590 6c 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  l==0 ) return 0;
225a0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
225b0 20 7d 0a 0a 20 20 2f 2a 20 45 78 2d 72 65 73 74   }..  /* Ex-rest
225c0 72 69 63 74 69 6f 6e 20 28 32 33 29 3a 0a 20 20  riction (23):.  
225d0 2a 2a 20 54 68 65 20 6f 6e 6c 79 20 77 61 79 20  ** The only way 
225e0 74 68 61 74 20 74 68 65 20 72 65 63 75 72 73 69  that the recursi
225f0 76 65 20 70 61 72 74 20 6f 66 20 61 20 43 54 45  ve part of a CTE
22600 20 63 61 6e 20 63 6f 6e 74 61 69 6e 20 61 20 63   can contain a c
22610 6f 6d 70 6f 75 6e 64 0a 20 20 2a 2a 20 73 75 62  ompound.  ** sub
22620 71 75 65 72 79 20 69 73 20 66 6f 72 20 74 68 65  query is for the
22630 20 73 75 62 71 75 65 72 79 20 74 6f 20 62 65 20   subquery to be 
22640 6f 6e 65 20 74 65 72 6d 20 6f 66 20 61 20 6a 6f  one term of a jo
22650 69 6e 2e 20 20 42 75 74 20 69 66 20 74 68 65 0a  in.  But if the.
22660 20 20 2a 2a 20 73 75 62 71 75 65 72 79 20 69 73    ** subquery is
22670 20 61 20 6a 6f 69 6e 2c 20 74 68 65 6e 20 74 68   a join, then th
22680 65 20 66 6c 61 74 74 65 6e 69 6e 67 20 68 61 73  e flattening has
22690 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 73 74   already been st
226a0 6f 70 70 65 64 20 62 79 0a 20 20 2a 2a 20 72 65  opped by.  ** re
226b0 73 74 72 69 63 74 69 6f 6e 20 28 31 37 64 33 29  striction (17d3)
226c0 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
226d0 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53  (p->selFlags & S
226e0 46 5f 52 65 63 75 72 73 69 76 65 29 3d 3d 30 20  F_Recursive)==0 
226f0 7c 7c 20 70 53 75 62 2d 3e 70 50 72 69 6f 72 3d  || pSub->pPrior=
22700 3d 30 20 29 3b 0a 0a 20 20 2f 2a 2a 2a 2a 2a 20  =0 );..  /***** 
22710 49 66 20 77 65 20 72 65 61 63 68 20 74 68 69 73  If we reach this
22720 20 70 6f 69 6e 74 2c 20 66 6c 61 74 74 65 6e 69   point, flatteni
22730 6e 67 20 69 73 20 70 65 72 6d 69 74 74 65 64 2e  ng is permitted.
22740 20 2a 2a 2a 2a 2a 2f 0a 20 20 53 45 4c 45 43 54   *****/.  SELECT
22750 54 52 41 43 45 28 31 2c 70 50 61 72 73 65 2c 70  TRACE(1,pParse,p
22760 2c 28 22 66 6c 61 74 74 65 6e 20 25 75 2e 25 70  ,("flatten %u.%p
22770 20 66 72 6f 6d 20 74 65 72 6d 20 25 64 5c 6e 22   from term %d\n"
22780 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
22790 20 20 20 20 20 70 53 75 62 2d 3e 73 65 6c 49 64       pSub->selId
227a0 2c 20 70 53 75 62 2c 20 69 46 72 6f 6d 29 29 3b  , pSub, iFrom));
227b0 0a 0a 20 20 2f 2a 20 41 75 74 68 6f 72 69 7a 65  ..  /* Authorize
227c0 20 74 68 65 20 73 75 62 71 75 65 72 79 20 2a 2f   the subquery */
227d0 0a 20 20 70 50 61 72 73 65 2d 3e 7a 41 75 74 68  .  pParse->zAuth
227e0 43 6f 6e 74 65 78 74 20 3d 20 70 53 75 62 69 74  Context = pSubit
227f0 65 6d 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 54 45 53  em->zName;.  TES
22800 54 4f 4e 4c 59 28 69 20 3d 29 20 73 71 6c 69 74  TONLY(i =) sqlit
22810 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72  e3AuthCheck(pPar
22820 73 65 2c 20 53 51 4c 49 54 45 5f 53 45 4c 45 43  se, SQLITE_SELEC
22830 54 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 74  T, 0, 0, 0);.  t
22840 65 73 74 63 61 73 65 28 20 69 3d 3d 53 51 4c 49  estcase( i==SQLI
22850 54 45 5f 44 45 4e 59 20 29 3b 0a 20 20 70 50 61  TE_DENY );.  pPa
22860 72 73 65 2d 3e 7a 41 75 74 68 43 6f 6e 74 65 78  rse->zAuthContex
22870 74 20 3d 20 7a 53 61 76 65 64 41 75 74 68 43 6f  t = zSavedAuthCo
22880 6e 74 65 78 74 3b 0a 0a 20 20 2f 2a 20 49 66 20  ntext;..  /* If 
22890 74 68 65 20 73 75 62 2d 71 75 65 72 79 20 69 73  the sub-query is
228a0 20 61 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45   a compound SELE
228b0 43 54 20 73 74 61 74 65 6d 65 6e 74 2c 20 74 68  CT statement, th
228c0 65 6e 20 28 62 79 20 72 65 73 74 72 69 63 74 69  en (by restricti
228d0 6f 6e 73 0a 20 20 2a 2a 20 31 37 20 61 6e 64 20  ons.  ** 17 and 
228e0 31 38 20 61 62 6f 76 65 29 20 69 74 20 6d 75 73  18 above) it mus
228f0 74 20 62 65 20 61 20 55 4e 49 4f 4e 20 41 4c 4c  t be a UNION ALL
22900 20 61 6e 64 20 74 68 65 20 70 61 72 65 6e 74 20   and the parent 
22910 71 75 65 72 79 20 6d 75 73 74 20 0a 20 20 2a 2a  query must .  **
22920 20 62 65 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a   be of the form:
22930 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 53  .  **.  **     S
22940 45 4c 45 43 54 20 3c 65 78 70 72 2d 6c 69 73 74  ELECT <expr-list
22950 3e 20 46 52 4f 4d 20 28 3c 73 75 62 2d 71 75 65  > FROM (<sub-que
22960 72 79 3e 29 20 3c 77 68 65 72 65 2d 63 6c 61 75  ry>) <where-clau
22970 73 65 3e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 66  se> .  **.  ** f
22980 6f 6c 6c 6f 77 65 64 20 62 79 20 61 6e 79 20 4f  ollowed by any O
22990 52 44 45 52 20 42 59 2c 20 4c 49 4d 49 54 20 61  RDER BY, LIMIT a
229a0 6e 64 2f 6f 72 20 4f 46 46 53 45 54 20 63 6c 61  nd/or OFFSET cla
229b0 75 73 65 73 2e 20 54 68 69 73 20 62 6c 6f 63 6b  uses. This block
229c0 0a 20 20 2a 2a 20 63 72 65 61 74 65 73 20 4e 2d  .  ** creates N-
229d0 31 20 63 6f 70 69 65 73 20 6f 66 20 74 68 65 20  1 copies of the 
229e0 70 61 72 65 6e 74 20 71 75 65 72 79 20 77 69 74  parent query wit
229f0 68 6f 75 74 20 61 6e 79 20 4f 52 44 45 52 20 42  hout any ORDER B
22a00 59 2c 20 4c 49 4d 49 54 20 6f 72 20 0a 20 20 2a  Y, LIMIT or .  *
22a10 2a 20 4f 46 46 53 45 54 20 63 6c 61 75 73 65 73  * OFFSET clauses
22a20 20 61 6e 64 20 6a 6f 69 6e 73 20 74 68 65 6d 20   and joins them 
22a30 74 6f 20 74 68 65 20 6c 65 66 74 2d 68 61 6e 64  to the left-hand
22a40 2d 73 69 64 65 20 6f 66 20 74 68 65 20 6f 72 69  -side of the ori
22a50 67 69 6e 61 6c 0a 20 20 2a 2a 20 75 73 69 6e 67  ginal.  ** using
22a60 20 55 4e 49 4f 4e 20 41 4c 4c 20 6f 70 65 72 61   UNION ALL opera
22a70 74 6f 72 73 2e 20 49 6e 20 74 68 69 73 20 63 61  tors. In this ca
22a80 73 65 20 4e 20 69 73 20 74 68 65 20 6e 75 6d 62  se N is the numb
22a90 65 72 20 6f 66 20 73 69 6d 70 6c 65 0a 20 20 2a  er of simple.  *
22aa0 2a 20 73 65 6c 65 63 74 20 73 74 61 74 65 6d 65  * select stateme
22ab0 6e 74 73 20 69 6e 20 74 68 65 20 63 6f 6d 70 6f  nts in the compo
22ac0 75 6e 64 20 73 75 62 2d 71 75 65 72 79 2e 0a 20  und sub-query.. 
22ad0 20 2a 2a 0a 20 20 2a 2a 20 45 78 61 6d 70 6c 65   **.  ** Example
22ae0 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20  :.  **.  **     
22af0 53 45 4c 45 43 54 20 61 2b 31 20 46 52 4f 4d 20  SELECT a+1 FROM 
22b00 28 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 53 45  (.  **        SE
22b10 4c 45 43 54 20 78 20 46 52 4f 4d 20 74 61 62 0a  LECT x FROM tab.
22b20 20 20 2a 2a 20 20 20 20 20 20 20 20 55 4e 49 4f    **        UNIO
22b30 4e 20 41 4c 4c 0a 20 20 2a 2a 20 20 20 20 20 20  N ALL.  **      
22b40 20 20 53 45 4c 45 43 54 20 79 20 46 52 4f 4d 20    SELECT y FROM 
22b50 74 61 62 0a 20 20 2a 2a 20 20 20 20 20 20 20 20  tab.  **        
22b60 55 4e 49 4f 4e 20 41 4c 4c 0a 20 20 2a 2a 20 20  UNION ALL.  **  
22b70 20 20 20 20 20 20 53 45 4c 45 43 54 20 61 62 73        SELECT abs
22b80 28 7a 2a 32 29 20 46 52 4f 4d 20 74 61 62 32 0a  (z*2) FROM tab2.
22b90 20 20 2a 2a 20 20 20 20 20 29 20 57 48 45 52 45    **     ) WHERE
22ba0 20 61 21 3d 35 20 4f 52 44 45 52 20 42 59 20 31   a!=5 ORDER BY 1
22bb0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 72 61 6e 73  .  **.  ** Trans
22bc0 66 6f 72 6d 65 64 20 69 6e 74 6f 3a 0a 20 20 2a  formed into:.  *
22bd0 2a 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c 45 43  *.  **     SELEC
22be0 54 20 78 2b 31 20 46 52 4f 4d 20 74 61 62 20 57  T x+1 FROM tab W
22bf0 48 45 52 45 20 78 2b 31 21 3d 35 0a 20 20 2a 2a  HERE x+1!=5.  **
22c00 20 20 20 20 20 55 4e 49 4f 4e 20 41 4c 4c 0a 20       UNION ALL. 
22c10 20 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 79   **     SELECT y
22c20 2b 31 20 46 52 4f 4d 20 74 61 62 20 57 48 45 52  +1 FROM tab WHER
22c30 45 20 79 2b 31 21 3d 35 0a 20 20 2a 2a 20 20 20  E y+1!=5.  **   
22c40 20 20 55 4e 49 4f 4e 20 41 4c 4c 0a 20 20 2a 2a    UNION ALL.  **
22c50 20 20 20 20 20 53 45 4c 45 43 54 20 61 62 73 28       SELECT abs(
22c60 7a 2a 32 29 2b 31 20 46 52 4f 4d 20 74 61 62 32  z*2)+1 FROM tab2
22c70 20 57 48 45 52 45 20 61 62 73 28 7a 2a 32 29 2b   WHERE abs(z*2)+
22c80 31 21 3d 35 0a 20 20 2a 2a 20 20 20 20 20 4f 52  1!=5.  **     OR
22c90 44 45 52 20 42 59 20 31 0a 20 20 2a 2a 0a 20 20  DER BY 1.  **.  
22ca0 2a 2a 20 57 65 20 63 61 6c 6c 20 74 68 69 73 20  ** We call this 
22cb0 74 68 65 20 22 63 6f 6d 70 6f 75 6e 64 2d 73 75  the "compound-su
22cc0 62 71 75 65 72 79 20 66 6c 61 74 74 65 6e 69 6e  bquery flattenin
22cd0 67 22 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 70  g"..  */.  for(p
22ce0 53 75 62 3d 70 53 75 62 2d 3e 70 50 72 69 6f 72  Sub=pSub->pPrior
22cf0 3b 20 70 53 75 62 3b 20 70 53 75 62 3d 70 53 75  ; pSub; pSub=pSu
22d00 62 2d 3e 70 50 72 69 6f 72 29 7b 0a 20 20 20 20  b->pPrior){.    
22d10 53 65 6c 65 63 74 20 2a 70 4e 65 77 3b 0a 20 20  Select *pNew;.  
22d20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64    ExprList *pOrd
22d30 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72  erBy = p->pOrder
22d40 42 79 3b 0a 20 20 20 20 45 78 70 72 20 2a 70 4c  By;.    Expr *pL
22d50 69 6d 69 74 20 3d 20 70 2d 3e 70 4c 69 6d 69 74  imit = p->pLimit
22d60 3b 0a 20 20 20 20 53 65 6c 65 63 74 20 2a 70 50  ;.    Select *pP
22d70 72 69 6f 72 20 3d 20 70 2d 3e 70 50 72 69 6f 72  rior = p->pPrior
22d80 3b 0a 20 20 20 20 70 2d 3e 70 4f 72 64 65 72 42  ;.    p->pOrderB
22d90 79 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 70 53  y = 0;.    p->pS
22da0 72 63 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 70  rc = 0;.    p->p
22db0 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20 70  Prior = 0;.    p
22dc0 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20  ->pLimit = 0;.  
22dd0 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33    pNew = sqlite3
22de0 53 65 6c 65 63 74 44 75 70 28 64 62 2c 20 70 2c  SelectDup(db, p,
22df0 20 30 29 3b 0a 20 20 20 20 70 2d 3e 70 4c 69 6d   0);.    p->pLim
22e00 69 74 20 3d 20 70 4c 69 6d 69 74 3b 0a 20 20 20  it = pLimit;.   
22e10 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 70   p->pOrderBy = p
22e20 4f 72 64 65 72 42 79 3b 0a 20 20 20 20 70 2d 3e  OrderBy;.    p->
22e30 70 53 72 63 20 3d 20 70 53 72 63 3b 0a 20 20 20  pSrc = pSrc;.   
22e40 20 70 2d 3e 6f 70 20 3d 20 54 4b 5f 41 4c 4c 3b   p->op = TK_ALL;
22e50 0a 20 20 20 20 69 66 28 20 70 4e 65 77 3d 3d 30  .    if( pNew==0
22e60 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 70 50 72   ){.      p->pPr
22e70 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20  ior = pPrior;.  
22e80 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
22e90 4e 65 77 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50  New->pPrior = pP
22ea0 72 69 6f 72 3b 0a 20 20 20 20 20 20 69 66 28 20  rior;.      if( 
22eb0 70 50 72 69 6f 72 20 29 20 70 50 72 69 6f 72 2d  pPrior ) pPrior-
22ec0 3e 70 4e 65 78 74 20 3d 20 70 4e 65 77 3b 0a 20  >pNext = pNew;. 
22ed0 20 20 20 20 20 70 4e 65 77 2d 3e 70 4e 65 78 74       pNew->pNext
22ee0 20 3d 20 70 3b 0a 20 20 20 20 20 20 70 2d 3e 70   = p;.      p->p
22ef0 50 72 69 6f 72 20 3d 20 70 4e 65 77 3b 0a 20 20  Prior = pNew;.  
22f00 20 20 20 20 53 45 4c 45 43 54 54 52 41 43 45 28      SELECTTRACE(
22f10 32 2c 70 50 61 72 73 65 2c 70 2c 28 22 63 6f 6d  2,pParse,p,("com
22f20 70 6f 75 6e 64 2d 73 75 62 71 75 65 72 79 20 66  pound-subquery f
22f30 6c 61 74 74 65 6e 65 72 22 0a 20 20 20 20 20 20  lattener".      
22f40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22f50 20 20 20 20 20 20 20 20 22 20 63 72 65 61 74 65          " create
22f60 73 20 25 75 20 61 73 20 70 65 65 72 5c 6e 22 2c  s %u as peer\n",
22f70 70 4e 65 77 2d 3e 73 65 6c 49 64 29 29 3b 0a 20  pNew->selId));. 
22f80 20 20 20 7d 0a 20 20 20 20 69 66 28 20 64 62 2d     }.    if( db-
22f90 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20  >mallocFailed ) 
22fa0 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 0a 20  return 1;.  }.. 
22fb0 20 2f 2a 20 42 65 67 69 6e 20 66 6c 61 74 74 65   /* Begin flatte
22fc0 6e 69 6e 67 20 74 68 65 20 69 46 72 6f 6d 2d 74  ning the iFrom-t
22fd0 68 20 65 6e 74 72 79 20 6f 66 20 74 68 65 20 46  h entry of the F
22fe0 52 4f 4d 20 63 6c 61 75 73 65 20 0a 20 20 2a 2a  ROM clause .  **
22ff0 20 69 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75   in the outer qu
23000 65 72 79 2e 0a 20 20 2a 2f 0a 20 20 70 53 75 62  ery..  */.  pSub
23010 20 3d 20 70 53 75 62 31 20 3d 20 70 53 75 62 69   = pSub1 = pSubi
23020 74 65 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a 0a 20  tem->pSelect;.. 
23030 20 2f 2a 20 44 65 6c 65 74 65 20 74 68 65 20 74   /* Delete the t
23040 72 61 6e 73 69 65 6e 74 20 74 61 62 6c 65 20 73  ransient table s
23050 74 72 75 63 74 75 72 65 20 61 73 73 6f 63 69 61  tructure associa
23060 74 65 64 20 77 69 74 68 20 74 68 65 0a 20 20 2a  ted with the.  *
23070 2a 20 73 75 62 71 75 65 72 79 0a 20 20 2a 2f 0a  * subquery.  */.
23080 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
23090 64 62 2c 20 70 53 75 62 69 74 65 6d 2d 3e 7a 44  db, pSubitem->zD
230a0 61 74 61 62 61 73 65 29 3b 0a 20 20 73 71 6c 69  atabase);.  sqli
230b0 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 53  te3DbFree(db, pS
230c0 75 62 69 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a  ubitem->zName);.
230d0 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
230e0 64 62 2c 20 70 53 75 62 69 74 65 6d 2d 3e 7a 41  db, pSubitem->zA
230f0 6c 69 61 73 29 3b 0a 20 20 70 53 75 62 69 74 65  lias);.  pSubite
23100 6d 2d 3e 7a 44 61 74 61 62 61 73 65 20 3d 20 30  m->zDatabase = 0
23110 3b 0a 20 20 70 53 75 62 69 74 65 6d 2d 3e 7a 4e  ;.  pSubitem->zN
23120 61 6d 65 20 3d 20 30 3b 0a 20 20 70 53 75 62 69  ame = 0;.  pSubi
23130 74 65 6d 2d 3e 7a 41 6c 69 61 73 20 3d 20 30 3b  tem->zAlias = 0;
23140 0a 20 20 70 53 75 62 69 74 65 6d 2d 3e 70 53 65  .  pSubitem->pSe
23150 6c 65 63 74 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20  lect = 0;..  /* 
23160 44 65 66 65 72 20 64 65 6c 65 74 69 6e 67 20 74  Defer deleting t
23170 68 65 20 54 61 62 6c 65 20 6f 62 6a 65 63 74 20  he Table object 
23180 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
23190 74 68 65 0a 20 20 2a 2a 20 73 75 62 71 75 65 72  the.  ** subquer
231a0 79 20 75 6e 74 69 6c 20 63 6f 64 65 20 67 65 6e  y until code gen
231b0 65 72 61 74 69 6f 6e 20 69 73 0a 20 20 2a 2a 20  eration is.  ** 
231c0 63 6f 6d 70 6c 65 74 65 2c 20 73 69 6e 63 65 20  complete, since 
231d0 74 68 65 72 65 20 6d 61 79 20 73 74 69 6c 6c 20  there may still 
231e0 65 78 69 73 74 20 45 78 70 72 2e 70 54 61 62 20  exist Expr.pTab 
231f0 65 6e 74 72 69 65 73 20 74 68 61 74 0a 20 20 2a  entries that.  *
23200 2a 20 72 65 66 65 72 20 74 6f 20 74 68 65 20 73  * refer to the s
23210 75 62 71 75 65 72 79 20 65 76 65 6e 20 61 66 74  ubquery even aft
23220 65 72 20 66 6c 61 74 74 65 6e 69 6e 67 2e 20 20  er flattening.  
23230 54 69 63 6b 65 74 20 23 33 33 34 36 2e 0a 20 20  Ticket #3346..  
23240 2a 2a 0a 20 20 2a 2a 20 70 53 75 62 69 74 65 6d  **.  ** pSubitem
23250 2d 3e 70 54 61 62 20 69 73 20 61 6c 77 61 79 73  ->pTab is always
23260 20 6e 6f 6e 2d 4e 55 4c 4c 20 62 79 20 74 65 73   non-NULL by tes
23270 74 20 72 65 73 74 72 69 63 74 69 6f 6e 73 20 61  t restrictions a
23280 6e 64 20 74 65 73 74 73 20 61 62 6f 76 65 2e 0a  nd tests above..
23290 20 20 2a 2f 0a 20 20 69 66 28 20 41 4c 57 41 59    */.  if( ALWAY
232a0 53 28 70 53 75 62 69 74 65 6d 2d 3e 70 54 61 62  S(pSubitem->pTab
232b0 21 3d 30 29 20 29 7b 0a 20 20 20 20 54 61 62 6c  !=0) ){.    Tabl
232c0 65 20 2a 70 54 61 62 54 6f 44 65 6c 20 3d 20 70  e *pTabToDel = p
232d0 53 75 62 69 74 65 6d 2d 3e 70 54 61 62 3b 0a 20  Subitem->pTab;. 
232e0 20 20 20 69 66 28 20 70 54 61 62 54 6f 44 65 6c     if( pTabToDel
232f0 2d 3e 6e 54 61 62 52 65 66 3d 3d 31 20 29 7b 0a  ->nTabRef==1 ){.
23300 20 20 20 20 20 20 50 61 72 73 65 20 2a 70 54 6f        Parse *pTo
23310 70 6c 65 76 65 6c 20 3d 20 73 71 6c 69 74 65 33  plevel = sqlite3
23320 50 61 72 73 65 54 6f 70 6c 65 76 65 6c 28 70 50  ParseToplevel(pP
23330 61 72 73 65 29 3b 0a 20 20 20 20 20 20 70 54 61  arse);.      pTa
23340 62 54 6f 44 65 6c 2d 3e 70 4e 65 78 74 5a 6f 6d  bToDel->pNextZom
23350 62 69 65 20 3d 20 70 54 6f 70 6c 65 76 65 6c 2d  bie = pToplevel-
23360 3e 70 5a 6f 6d 62 69 65 54 61 62 3b 0a 20 20 20  >pZombieTab;.   
23370 20 20 20 70 54 6f 70 6c 65 76 65 6c 2d 3e 70 5a     pToplevel->pZ
23380 6f 6d 62 69 65 54 61 62 20 3d 20 70 54 61 62 54  ombieTab = pTabT
23390 6f 44 65 6c 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  oDel;.    }else{
233a0 0a 20 20 20 20 20 20 70 54 61 62 54 6f 44 65 6c  .      pTabToDel
233b0 2d 3e 6e 54 61 62 52 65 66 2d 2d 3b 0a 20 20 20  ->nTabRef--;.   
233c0 20 7d 0a 20 20 20 20 70 53 75 62 69 74 65 6d 2d   }.    pSubitem-
233d0 3e 70 54 61 62 20 3d 20 30 3b 0a 20 20 7d 0a 0a  >pTab = 0;.  }..
233e0 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69    /* The followi
233f0 6e 67 20 6c 6f 6f 70 20 72 75 6e 73 20 6f 6e 63  ng loop runs onc
23400 65 20 66 6f 72 20 65 61 63 68 20 74 65 72 6d 20  e for each term 
23410 69 6e 20 61 20 63 6f 6d 70 6f 75 6e 64 2d 73 75  in a compound-su
23420 62 71 75 65 72 79 0a 20 20 2a 2a 20 66 6c 61 74  bquery.  ** flat
23430 74 65 6e 69 6e 67 20 28 61 73 20 64 65 73 63 72  tening (as descr
23440 69 62 65 64 20 61 62 6f 76 65 29 2e 20 20 49 66  ibed above).  If
23450 20 77 65 20 61 72 65 20 64 6f 69 6e 67 20 61 20   we are doing a 
23460 64 69 66 66 65 72 65 6e 74 20 6b 69 6e 64 0a 20  different kind. 
23470 20 2a 2a 20 6f 66 20 66 6c 61 74 74 65 6e 69 6e   ** of flattenin
23480 67 20 2d 20 61 20 66 6c 61 74 74 65 6e 69 6e 67  g - a flattening
23490 20 6f 74 68 65 72 20 74 68 61 6e 20 61 20 63 6f   other than a co
234a0 6d 70 6f 75 6e 64 2d 73 75 62 71 75 65 72 79 20  mpound-subquery 
234b0 66 6c 61 74 74 65 6e 69 6e 67 20 2d 0a 20 20 2a  flattening -.  *
234c0 2a 20 74 68 65 6e 20 74 68 69 73 20 6c 6f 6f 70  * then this loop
234d0 20 6f 6e 6c 79 20 72 75 6e 73 20 6f 6e 63 65 2e   only runs once.
234e0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20  .  **.  ** This 
234f0 6c 6f 6f 70 20 6d 6f 76 65 73 20 61 6c 6c 20 6f  loop moves all o
23500 66 20 74 68 65 20 46 52 4f 4d 20 65 6c 65 6d 65  f the FROM eleme
23510 6e 74 73 20 6f 66 20 74 68 65 20 73 75 62 71 75  nts of the subqu
23520 65 72 79 20 69 6e 74 6f 20 74 68 65 0a 20 20 2a  ery into the.  *
23530 2a 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  * the FROM claus
23540 65 20 6f 66 20 74 68 65 20 6f 75 74 65 72 20 71  e of the outer q
23550 75 65 72 79 2e 20 20 42 65 66 6f 72 65 20 64 6f  uery.  Before do
23560 69 6e 67 20 74 68 69 73 2c 20 72 65 6d 65 6d 62  ing this, rememb
23570 65 72 0a 20 20 2a 2a 20 74 68 65 20 63 75 72 73  er.  ** the curs
23580 6f 72 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68  or number for th
23590 65 20 6f 72 69 67 69 6e 61 6c 20 6f 75 74 65 72  e original outer
235a0 20 71 75 65 72 79 20 46 52 4f 4d 20 65 6c 65 6d   query FROM elem
235b0 65 6e 74 20 69 6e 0a 20 20 2a 2a 20 69 50 61 72  ent in.  ** iPar
235c0 65 6e 74 2e 20 20 54 68 65 20 69 50 61 72 65 6e  ent.  The iParen
235d0 74 20 63 75 72 73 6f 72 20 77 69 6c 6c 20 6e 65  t cursor will ne
235e0 76 65 72 20 62 65 20 75 73 65 64 2e 20 20 53 75  ver be used.  Su
235f0 62 73 65 71 75 65 6e 74 20 63 6f 64 65 0a 20 20  bsequent code.  
23600 2a 2a 20 77 69 6c 6c 20 73 63 61 6e 20 65 78 70  ** will scan exp
23610 72 65 73 73 69 6f 6e 73 20 6c 6f 6f 6b 69 6e 67  ressions looking
23620 20 66 6f 72 20 69 50 61 72 65 6e 74 20 72 65 66   for iParent ref
23630 65 72 65 6e 63 65 73 20 61 6e 64 20 72 65 70 6c  erences and repl
23640 61 63 65 0a 20 20 2a 2a 20 74 68 6f 73 65 20 72  ace.  ** those r
23650 65 66 65 72 65 6e 63 65 73 20 77 69 74 68 20 65  eferences with e
23660 78 70 72 65 73 73 69 6f 6e 73 20 74 68 61 74 20  xpressions that 
23670 72 65 73 6f 6c 76 65 20 74 6f 20 74 68 65 20 73  resolve to the s
23680 75 62 71 75 65 72 79 20 46 52 4f 4d 0a 20 20 2a  ubquery FROM.  *
23690 2a 20 65 6c 65 6d 65 6e 74 73 20 77 65 20 61 72  * elements we ar
236a0 65 20 6e 6f 77 20 63 6f 70 79 69 6e 67 20 69 6e  e now copying in
236b0 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 70 50 61  ..  */.  for(pPa
236c0 72 65 6e 74 3d 70 3b 20 70 50 61 72 65 6e 74 3b  rent=p; pParent;
236d0 20 70 50 61 72 65 6e 74 3d 70 50 61 72 65 6e 74   pParent=pParent
236e0 2d 3e 70 50 72 69 6f 72 2c 20 70 53 75 62 3d 70  ->pPrior, pSub=p
236f0 53 75 62 2d 3e 70 50 72 69 6f 72 29 7b 0a 20 20  Sub->pPrior){.  
23700 20 20 69 6e 74 20 6e 53 75 62 53 72 63 3b 0a 20    int nSubSrc;. 
23710 20 20 20 75 38 20 6a 6f 69 6e 74 79 70 65 20 3d     u8 jointype =
23720 20 30 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   0;.    assert( 
23730 70 53 75 62 21 3d 30 20 29 3b 0a 20 20 20 20 70  pSub!=0 );.    p
23740 53 75 62 53 72 63 20 3d 20 70 53 75 62 2d 3e 70  SubSrc = pSub->p
23750 53 72 63 3b 20 20 20 20 20 2f 2a 20 46 52 4f 4d  Src;     /* FROM
23760 20 63 6c 61 75 73 65 20 6f 66 20 73 75 62 71 75   clause of subqu
23770 65 72 79 20 2a 2f 0a 20 20 20 20 6e 53 75 62 53  ery */.    nSubS
23780 72 63 20 3d 20 70 53 75 62 53 72 63 2d 3e 6e 53  rc = pSubSrc->nS
23790 72 63 3b 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f  rc;  /* Number o
237a0 66 20 74 65 72 6d 73 20 69 6e 20 73 75 62 71 75  f terms in subqu
237b0 65 72 79 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  ery FROM clause 
237c0 2a 2f 0a 20 20 20 20 70 53 72 63 20 3d 20 70 50  */.    pSrc = pP
237d0 61 72 65 6e 74 2d 3e 70 53 72 63 3b 20 20 20 20  arent->pSrc;    
237e0 20 2f 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65 20   /* FROM clause 
237f0 6f 66 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  of the outer que
23800 72 79 20 2a 2f 0a 0a 20 20 20 20 69 66 28 20 70  ry */..    if( p
23810 53 72 63 20 29 7b 0a 20 20 20 20 20 20 61 73 73  Src ){.      ass
23820 65 72 74 28 20 70 50 61 72 65 6e 74 3d 3d 70 20  ert( pParent==p 
23830 29 3b 20 20 2f 2a 20 46 69 72 73 74 20 74 69 6d  );  /* First tim
23840 65 20 74 68 72 6f 75 67 68 20 74 68 65 20 6c 6f  e through the lo
23850 6f 70 20 2a 2f 0a 20 20 20 20 20 20 6a 6f 69 6e  op */.      join
23860 74 79 70 65 20 3d 20 70 53 75 62 69 74 65 6d 2d  type = pSubitem-
23870 3e 66 67 2e 6a 6f 69 6e 74 79 70 65 3b 0a 20 20  >fg.jointype;.  
23880 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61    }else{.      a
23890 73 73 65 72 74 28 20 70 50 61 72 65 6e 74 21 3d  ssert( pParent!=
238a0 70 20 29 3b 20 20 2f 2a 20 32 6e 64 20 61 6e 64  p );  /* 2nd and
238b0 20 73 75 62 73 65 71 75 65 6e 74 20 74 69 6d 65   subsequent time
238c0 73 20 74 68 72 6f 75 67 68 20 74 68 65 20 6c 6f  s through the lo
238d0 6f 70 20 2a 2f 0a 20 20 20 20 20 20 70 53 72 63  op */.      pSrc
238e0 20 3d 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73   = sqlite3SrcLis
238f0 74 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20  tAppend(pParse, 
23900 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  0, 0, 0);.      
23910 69 66 28 20 70 53 72 63 3d 3d 30 20 29 20 62 72  if( pSrc==0 ) br
23920 65 61 6b 3b 0a 20 20 20 20 20 20 70 50 61 72 65  eak;.      pPare
23930 6e 74 2d 3e 70 53 72 63 20 3d 20 70 53 72 63 3b  nt->pSrc = pSrc;
23940 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 54  .    }..    /* T
23950 68 65 20 73 75 62 71 75 65 72 79 20 75 73 65 73  he subquery uses
23960 20 61 20 73 69 6e 67 6c 65 20 73 6c 6f 74 20 6f   a single slot o
23970 66 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  f the FROM claus
23980 65 20 6f 66 20 74 68 65 20 6f 75 74 65 72 0a 20  e of the outer. 
23990 20 20 20 2a 2a 20 71 75 65 72 79 2e 20 20 49 66     ** query.  If
239a0 20 74 68 65 20 73 75 62 71 75 65 72 79 20 68 61   the subquery ha
239b0 73 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20  s more than one 
239c0 65 6c 65 6d 65 6e 74 20 69 6e 20 69 74 73 20 46  element in its F
239d0 52 4f 4d 20 63 6c 61 75 73 65 2c 0a 20 20 20 20  ROM clause,.    
239e0 2a 2a 20 74 68 65 6e 20 65 78 70 61 6e 64 20 74  ** then expand t
239f0 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 74  he outer query t
23a00 6f 20 6d 61 6b 65 20 73 70 61 63 65 20 66 6f 72  o make space for
23a10 20 69 74 20 74 6f 20 68 6f 6c 64 20 61 6c 6c 20   it to hold all 
23a20 65 6c 65 6d 65 6e 74 73 0a 20 20 20 20 2a 2a 20  elements.    ** 
23a30 6f 66 20 74 68 65 20 73 75 62 71 75 65 72 79 2e  of the subquery.
23a40 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 45  .    **.    ** E
23a50 78 61 6d 70 6c 65 3a 0a 20 20 20 20 2a 2a 0a 20  xample:.    **. 
23a60 20 20 20 2a 2a 20 20 20 20 53 45 4c 45 43 54 20     **    SELECT 
23a70 2a 20 46 52 4f 4d 20 74 61 62 41 2c 20 28 53 45  * FROM tabA, (SE
23a80 4c 45 43 54 20 2a 20 46 52 4f 4d 20 73 75 62 31  LECT * FROM sub1
23a90 2c 20 73 75 62 32 29 2c 20 74 61 62 42 3b 0a 20  , sub2), tabB;. 
23aa0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65     **.    ** The
23ab0 20 6f 75 74 65 72 20 71 75 65 72 79 20 68 61 73   outer query has
23ac0 20 33 20 73 6c 6f 74 73 20 69 6e 20 69 74 73 20   3 slots in its 
23ad0 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20 20 4f 6e  FROM clause.  On
23ae0 65 20 73 6c 6f 74 20 6f 66 20 74 68 65 0a 20 20  e slot of the.  
23af0 20 20 2a 2a 20 6f 75 74 65 72 20 71 75 65 72 79    ** outer query
23b00 20 28 74 68 65 20 6d 69 64 64 6c 65 20 73 6c 6f   (the middle slo
23b10 74 29 20 69 73 20 75 73 65 64 20 62 79 20 74 68  t) is used by th
23b20 65 20 73 75 62 71 75 65 72 79 2e 20 20 54 68 65  e subquery.  The
23b30 20 6e 65 78 74 0a 20 20 20 20 2a 2a 20 62 6c 6f   next.    ** blo
23b40 63 6b 20 6f 66 20 63 6f 64 65 20 77 69 6c 6c 20  ck of code will 
23b50 65 78 70 61 6e 64 20 74 68 65 20 6f 75 74 65 72  expand the outer
23b60 20 71 75 65 72 79 20 46 52 4f 4d 20 63 6c 61 75   query FROM clau
23b70 73 65 20 74 6f 20 34 20 73 6c 6f 74 73 2e 0a 20  se to 4 slots.. 
23b80 20 20 20 2a 2a 20 54 68 65 20 6d 69 64 64 6c 65     ** The middle
23b90 20 73 6c 6f 74 20 69 73 20 65 78 70 61 6e 64 65   slot is expande
23ba0 64 20 74 6f 20 74 77 6f 20 73 6c 6f 74 73 20 69  d to two slots i
23bb0 6e 20 6f 72 64 65 72 20 74 6f 20 6d 61 6b 65 20  n order to make 
23bc0 73 70 61 63 65 0a 20 20 20 20 2a 2a 20 66 6f 72  space.    ** for
23bd0 20 74 68 65 20 74 77 6f 20 65 6c 65 6d 65 6e 74   the two element
23be0 73 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c  s in the FROM cl
23bf0 61 75 73 65 20 6f 66 20 74 68 65 20 73 75 62 71  ause of the subq
23c00 75 65 72 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  uery..    */.   
23c10 20 69 66 28 20 6e 53 75 62 53 72 63 3e 31 20 29   if( nSubSrc>1 )
23c20 7b 0a 20 20 20 20 20 20 70 53 72 63 20 3d 20 73  {.      pSrc = s
23c30 71 6c 69 74 65 33 53 72 63 4c 69 73 74 45 6e 6c  qlite3SrcListEnl
23c40 61 72 67 65 28 70 50 61 72 73 65 2c 20 70 53 72  arge(pParse, pSr
23c50 63 2c 20 6e 53 75 62 53 72 63 2d 31 2c 69 46 72  c, nSubSrc-1,iFr
23c60 6f 6d 2b 31 29 3b 0a 20 20 20 20 20 20 69 66 28  om+1);.      if(
23c70 20 70 53 72 63 3d 3d 30 20 29 20 62 72 65 61 6b   pSrc==0 ) break
23c80 3b 0a 20 20 20 20 20 20 70 50 61 72 65 6e 74 2d  ;.      pParent-
23c90 3e 70 53 72 63 20 3d 20 70 53 72 63 3b 0a 20 20  >pSrc = pSrc;.  
23ca0 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 54 72 61 6e    }..    /* Tran
23cb0 73 66 65 72 20 74 68 65 20 46 52 4f 4d 20 63 6c  sfer the FROM cl
23cc0 61 75 73 65 20 74 65 72 6d 73 20 66 72 6f 6d 20  ause terms from 
23cd0 74 68 65 20 73 75 62 71 75 65 72 79 20 69 6e 74  the subquery int
23ce0 6f 20 74 68 65 0a 20 20 20 20 2a 2a 20 6f 75 74  o the.    ** out
23cf0 65 72 20 71 75 65 72 79 2e 0a 20 20 20 20 2a 2f  er query..    */
23d00 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
23d10 6e 53 75 62 53 72 63 3b 20 69 2b 2b 29 7b 0a 20  nSubSrc; i++){. 
23d20 20 20 20 20 20 73 71 6c 69 74 65 33 49 64 4c 69       sqlite3IdLi
23d30 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 53 72  stDelete(db, pSr
23d40 63 2d 3e 61 5b 69 2b 69 46 72 6f 6d 5d 2e 70 55  c->a[i+iFrom].pU
23d50 73 69 6e 67 29 3b 0a 20 20 20 20 20 20 61 73 73  sing);.      ass
23d60 65 72 74 28 20 70 53 72 63 2d 3e 61 5b 69 2b 69  ert( pSrc->a[i+i
23d70 46 72 6f 6d 5d 2e 66 67 2e 69 73 54 61 62 46 75  From].fg.isTabFu
23d80 6e 63 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70  nc==0 );.      p
23d90 53 72 63 2d 3e 61 5b 69 2b 69 46 72 6f 6d 5d 20  Src->a[i+iFrom] 
23da0 3d 20 70 53 75 62 53 72 63 2d 3e 61 5b 69 5d 3b  = pSubSrc->a[i];
23db0 0a 20 20 20 20 20 20 69 4e 65 77 50 61 72 65 6e  .      iNewParen
23dc0 74 20 3d 20 70 53 75 62 53 72 63 2d 3e 61 5b 69  t = pSubSrc->a[i
23dd0 5d 2e 69 43 75 72 73 6f 72 3b 0a 20 20 20 20 20  ].iCursor;.     
23de0 20 6d 65 6d 73 65 74 28 26 70 53 75 62 53 72 63   memset(&pSubSrc
23df0 2d 3e 61 5b 69 5d 2c 20 30 2c 20 73 69 7a 65 6f  ->a[i], 0, sizeo
23e00 66 28 70 53 75 62 53 72 63 2d 3e 61 5b 69 5d 29  f(pSubSrc->a[i])
23e10 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 53 72  );.    }.    pSr
23e20 63 2d 3e 61 5b 69 46 72 6f 6d 5d 2e 66 67 2e 6a  c->a[iFrom].fg.j
23e30 6f 69 6e 74 79 70 65 20 3d 20 6a 6f 69 6e 74 79  ointype = jointy
23e40 70 65 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 4e 6f  pe;.  .    /* No
23e50 77 20 62 65 67 69 6e 20 73 75 62 73 74 69 74 75  w begin substitu
23e60 74 69 6e 67 20 73 75 62 71 75 65 72 79 20 72 65  ting subquery re
23e70 73 75 6c 74 20 73 65 74 20 65 78 70 72 65 73 73  sult set express
23e80 69 6f 6e 73 20 66 6f 72 20 0a 20 20 20 20 2a 2a  ions for .    **
23e90 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74   references to t
23ea0 68 65 20 69 50 61 72 65 6e 74 20 69 6e 20 74 68  he iParent in th
23eb0 65 20 6f 75 74 65 72 20 71 75 65 72 79 2e 0a 20  e outer query.. 
23ec0 20 20 20 2a 2a 20 0a 20 20 20 20 2a 2a 20 45 78     ** .    ** Ex
23ed0 61 6d 70 6c 65 3a 0a 20 20 20 20 2a 2a 0a 20 20  ample:.    **.  
23ee0 20 20 2a 2a 20 20 20 53 45 4c 45 43 54 20 61 2b    **   SELECT a+
23ef0 35 2c 20 62 2a 31 30 20 46 52 4f 4d 20 28 53 45  5, b*10 FROM (SE
23f00 4c 45 43 54 20 78 2a 33 20 41 53 20 61 2c 20 79  LECT x*3 AS a, y
23f10 2b 31 30 20 41 53 20 62 20 46 52 4f 4d 20 74 31  +10 AS b FROM t1
23f20 29 20 57 48 45 52 45 20 61 3e 62 3b 0a 20 20 20  ) WHERE a>b;.   
23f30 20 2a 2a 20 20 20 5c 20 20 20 20 20 20 20 20 20   **   \         
23f40 20 20 20 20 20 20 20 20 20 20 20 20 5c 5f 5f 5f              \___
23f50 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 20 73 75 62 71 75  __________ subqu
23f60 65 72 79 20 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 20  ery __________/ 
23f70 20 20 20 20 20 20 20 20 20 2f 0a 20 20 20 20 2a           /.    *
23f80 2a 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  *    \__________
23f90 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 20 6f 75 74 65  ___________ oute
23fa0 72 20 71 75 65 72 79 20 5f 5f 5f 5f 5f 5f 5f 5f  r query ________
23fb0 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
23fc0 5f 5f 5f 5f 5f 5f 2f 0a 20 20 20 20 2a 2a 0a 20  ______/.    **. 
23fd0 20 20 20 2a 2a 20 57 65 20 6c 6f 6f 6b 20 61 74     ** We look at
23fe0 20 65 76 65 72 79 20 65 78 70 72 65 73 73 69 6f   every expressio
23ff0 6e 20 69 6e 20 74 68 65 20 6f 75 74 65 72 20 71  n in the outer q
24000 75 65 72 79 20 61 6e 64 20 65 76 65 72 79 20 70  uery and every p
24010 6c 61 63 65 20 77 65 20 73 65 65 0a 20 20 20 20  lace we see.    
24020 2a 2a 20 22 61 22 20 77 65 20 73 75 62 73 74 69  ** "a" we substi
24030 74 75 74 65 20 22 78 2a 33 22 20 61 6e 64 20 65  tute "x*3" and e
24040 76 65 72 79 20 70 6c 61 63 65 20 77 65 20 73 65  very place we se
24050 65 20 22 62 22 20 77 65 20 73 75 62 73 74 69 74  e "b" we substit
24060 75 74 65 20 22 79 2b 31 30 22 2e 0a 20 20 20 20  ute "y+10"..    
24070 2a 2f 0a 20 20 20 20 69 66 28 20 70 53 75 62 2d  */.    if( pSub-
24080 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20  >pOrderBy ){.   
24090 20 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f     /* At this po
240a0 69 6e 74 2c 20 61 6e 79 20 6e 6f 6e 2d 7a 65 72  int, any non-zer
240b0 6f 20 69 4f 72 64 65 72 42 79 43 6f 6c 20 76 61  o iOrderByCol va
240c0 6c 75 65 73 20 69 6e 64 69 63 61 74 65 20 74 68  lues indicate th
240d0 61 74 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20  at the.      ** 
240e0 4f 52 44 45 52 20 42 59 20 63 6f 6c 75 6d 6e 20  ORDER BY column 
240f0 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 69 64  expression is id
24100 65 6e 74 69 63 61 6c 20 74 6f 20 74 68 65 20 69  entical to the i
24110 4f 72 64 65 72 42 79 43 6f 6c 27 74 68 0a 20 20  OrderByCol'th.  
24120 20 20 20 20 2a 2a 20 65 78 70 72 65 73 73 69 6f      ** expressio
24130 6e 20 72 65 74 75 72 6e 65 64 20 62 79 20 53 45  n returned by SE
24140 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 70  LECT statement p
24150 53 75 62 2e 20 53 69 6e 63 65 20 74 68 65 73 65  Sub. Since these
24160 20 76 61 6c 75 65 73 0a 20 20 20 20 20 20 2a 2a   values.      **
24170 20 64 6f 20 6e 6f 74 20 6e 65 63 65 73 73 61 72   do not necessar
24180 69 6c 79 20 63 6f 72 72 65 73 70 6f 6e 64 20 74  ily correspond t
24190 6f 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 53 45 4c  o columns in SEL
241a0 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 70 50  ECT statement pP
241b0 61 72 65 6e 74 2c 0a 20 20 20 20 20 20 2a 2a 20  arent,.      ** 
241c0 7a 65 72 6f 20 74 68 65 6d 20 62 65 66 6f 72 65  zero them before
241d0 20 74 72 61 6e 73 66 65 72 69 6e 67 20 74 68 65   transfering the
241e0 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
241f0 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  ..      **.     
24200 20 2a 2a 20 4e 6f 74 20 64 6f 69 6e 67 20 74 68   ** Not doing th
24210 69 73 20 6d 61 79 20 63 61 75 73 65 20 61 6e 20  is may cause an 
24220 65 72 72 6f 72 20 69 66 20 61 20 73 75 62 73 65  error if a subse
24230 71 75 65 6e 74 20 63 61 6c 6c 20 74 6f 20 74 68  quent call to th
24240 69 73 0a 20 20 20 20 20 20 2a 2a 20 66 75 6e 63  is.      ** func
24250 74 69 6f 6e 20 61 74 74 65 6d 70 74 73 20 74 6f  tion attempts to
24260 20 66 6c 61 74 74 65 6e 20 61 20 63 6f 6d 70 6f   flatten a compo
24270 75 6e 64 20 73 75 62 2d 71 75 65 72 79 20 69 6e  und sub-query in
24280 74 6f 20 70 50 61 72 65 6e 74 0a 20 20 20 20 20  to pParent.     
24290 20 2a 2a 20 28 74 68 65 20 6f 6e 6c 79 20 77 61   ** (the only wa
242a0 79 20 74 68 69 73 20 63 61 6e 20 68 61 70 70 65  y this can happe
242b0 6e 20 69 73 20 69 66 20 74 68 65 20 63 6f 6d 70  n is if the comp
242c0 6f 75 6e 64 20 73 75 62 2d 71 75 65 72 79 20 69  ound sub-query i
242d0 73 0a 20 20 20 20 20 20 2a 2a 20 63 75 72 72 65  s.      ** curre
242e0 6e 74 6c 79 20 70 61 72 74 20 6f 66 20 70 53 75  ntly part of pSu
242f0 62 2d 3e 70 53 72 63 29 2e 20 53 65 65 20 74 69  b->pSrc). See ti
24300 63 6b 65 74 20 5b 64 31 31 61 36 65 39 30 38 66  cket [d11a6e908f
24310 5d 2e 20 20 2a 2f 0a 20 20 20 20 20 20 45 78 70  ].  */.      Exp
24320 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 20  rList *pOrderBy 
24330 3d 20 70 53 75 62 2d 3e 70 4f 72 64 65 72 42 79  = pSub->pOrderBy
24340 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  ;.      for(i=0;
24350 20 69 3c 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78   i<pOrderBy->nEx
24360 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  pr; i++){.      
24370 20 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d    pOrderBy->a[i]
24380 2e 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c  .u.x.iOrderByCol
24390 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 0;.      }.  
243a0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72      assert( pPar
243b0 65 6e 74 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30  ent->pOrderBy==0
243c0 20 29 3b 0a 20 20 20 20 20 20 70 50 61 72 65 6e   );.      pParen
243d0 74 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 70 4f  t->pOrderBy = pO
243e0 72 64 65 72 42 79 3b 0a 20 20 20 20 20 20 70 53  rderBy;.      pS
243f0 75 62 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 30  ub->pOrderBy = 0
24400 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 57 68 65  ;.    }.    pWhe
24410 72 65 20 3d 20 70 53 75 62 2d 3e 70 57 68 65 72  re = pSub->pWher
24420 65 3b 0a 20 20 20 20 70 53 75 62 2d 3e 70 57 68  e;.    pSub->pWh
24430 65 72 65 20 3d 20 30 3b 0a 20 20 20 20 69 66 28  ere = 0;.    if(
24440 20 69 73 4c 65 66 74 4a 6f 69 6e 3e 30 20 29 7b   isLeftJoin>0 ){
24450 0a 20 20 20 20 20 20 73 65 74 4a 6f 69 6e 45 78  .      setJoinEx
24460 70 72 28 70 57 68 65 72 65 2c 20 69 4e 65 77 50  pr(pWhere, iNewP
24470 61 72 65 6e 74 29 3b 0a 20 20 20 20 7d 0a 20 20  arent);.    }.  
24480 20 20 70 50 61 72 65 6e 74 2d 3e 70 57 68 65 72    pParent->pWher
24490 65 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41  e = sqlite3ExprA
244a0 6e 64 28 70 50 61 72 73 65 2c 20 70 57 68 65 72  nd(pParse, pWher
244b0 65 2c 20 70 50 61 72 65 6e 74 2d 3e 70 57 68 65  e, pParent->pWhe
244c0 72 65 29 3b 0a 20 20 20 20 69 66 28 20 64 62 2d  re);.    if( db-
244d0 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 3d 3d 30  >mallocFailed==0
244e0 20 29 7b 0a 20 20 20 20 20 20 53 75 62 73 74 43   ){.      SubstC
244f0 6f 6e 74 65 78 74 20 78 3b 0a 20 20 20 20 20 20  ontext x;.      
24500 78 2e 70 50 61 72 73 65 20 3d 20 70 50 61 72 73  x.pParse = pPars
24510 65 3b 0a 20 20 20 20 20 20 78 2e 69 54 61 62 6c  e;.      x.iTabl
24520 65 20 3d 20 69 50 61 72 65 6e 74 3b 0a 20 20 20  e = iParent;.   
24530 20 20 20 78 2e 69 4e 65 77 54 61 62 6c 65 20 3d     x.iNewTable =
24540 20 69 4e 65 77 50 61 72 65 6e 74 3b 0a 20 20 20   iNewParent;.   
24550 20 20 20 78 2e 69 73 4c 65 66 74 4a 6f 69 6e 20     x.isLeftJoin 
24560 3d 20 69 73 4c 65 66 74 4a 6f 69 6e 3b 0a 20 20  = isLeftJoin;.  
24570 20 20 20 20 78 2e 70 45 4c 69 73 74 20 3d 20 70      x.pEList = p
24580 53 75 62 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 20  Sub->pEList;.   
24590 20 20 20 73 75 62 73 74 53 65 6c 65 63 74 28 26     substSelect(&
245a0 78 2c 20 70 50 61 72 65 6e 74 2c 20 30 29 3b 0a  x, pParent, 0);.
245b0 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20      }.  .    /* 
245c0 54 68 65 20 66 6c 61 74 74 65 6e 65 64 20 71 75  The flattened qu
245d0 65 72 79 20 69 73 20 61 20 63 6f 6d 70 6f 75 6e  ery is a compoun
245e0 64 20 69 66 20 65 69 74 68 65 72 20 74 68 65 20  d if either the 
245f0 69 6e 6e 65 72 20 6f 72 20 74 68 65 0a 20 20 20  inner or the.   
24600 20 2a 2a 20 6f 75 74 65 72 20 71 75 65 72 79 20   ** outer query 
24610 69 73 20 61 20 63 6f 6d 70 6f 75 6e 64 2e 20 2a  is a compound. *
24620 2f 0a 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 73  /.    pParent->s
24630 65 6c 46 6c 61 67 73 20 7c 3d 20 70 53 75 62 2d  elFlags |= pSub-
24640 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 43  >selFlags & SF_C
24650 6f 6d 70 6f 75 6e 64 3b 0a 20 20 20 20 61 73 73  ompound;.    ass
24660 65 72 74 28 20 28 70 53 75 62 2d 3e 73 65 6c 46  ert( (pSub->selF
24670 6c 61 67 73 20 26 20 53 46 5f 44 69 73 74 69 6e  lags & SF_Distin
24680 63 74 29 3d 3d 30 20 29 3b 20 2f 2a 20 72 65 73  ct)==0 ); /* res
24690 74 72 69 63 74 69 6f 6e 20 28 31 37 62 29 20 2a  triction (17b) *
246a0 2f 0a 20 20 0a 20 20 20 20 2f 2a 0a 20 20 20 20  /.  .    /*.    
246b0 2a 2a 20 53 45 4c 45 43 54 20 2e 2e 2e 20 46 52  ** SELECT ... FR
246c0 4f 4d 20 28 53 45 4c 45 43 54 20 2e 2e 2e 20 4c  OM (SELECT ... L
246d0 49 4d 49 54 20 61 20 4f 46 46 53 45 54 20 62 29  IMIT a OFFSET b)
246e0 20 4c 49 4d 49 54 20 78 20 4f 46 46 53 45 54 20   LIMIT x OFFSET 
246f0 79 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  y;.    **.    **
24700 20 4f 6e 65 20 69 73 20 74 65 6d 70 74 65 64 20   One is tempted 
24710 74 6f 20 74 72 79 20 74 6f 20 61 64 64 20 61 20  to try to add a 
24720 61 6e 64 20 62 20 74 6f 20 63 6f 6d 62 69 6e 65  and b to combine
24730 20 74 68 65 20 6c 69 6d 69 74 73 2e 20 20 42 75   the limits.  Bu
24740 74 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 64 6f  t this.    ** do
24750 65 73 20 6e 6f 74 20 77 6f 72 6b 20 69 66 20 65  es not work if e
24760 69 74 68 65 72 20 6c 69 6d 69 74 20 69 73 20 6e  ither limit is n
24770 65 67 61 74 69 76 65 2e 0a 20 20 20 20 2a 2f 0a  egative..    */.
24780 20 20 20 20 69 66 28 20 70 53 75 62 2d 3e 70 4c      if( pSub->pL
24790 69 6d 69 74 20 29 7b 0a 20 20 20 20 20 20 70 50  imit ){.      pP
247a0 61 72 65 6e 74 2d 3e 70 4c 69 6d 69 74 20 3d 20  arent->pLimit = 
247b0 70 53 75 62 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20  pSub->pLimit;.  
247c0 20 20 20 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74      pSub->pLimit
247d0 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = 0;.    }.  }.
247e0 0a 20 20 2f 2a 20 46 69 6e 69 61 6c 6c 79 2c 20  .  /* Finially, 
247f0 64 65 6c 65 74 65 20 77 68 61 74 20 69 73 20 6c  delete what is l
24800 65 66 74 20 6f 66 20 74 68 65 20 73 75 62 71 75  eft of the subqu
24810 65 72 79 20 61 6e 64 20 72 65 74 75 72 6e 0a 20  ery and return. 
24820 20 2a 2a 20 73 75 63 63 65 73 73 2e 0a 20 20 2a   ** success..  *
24830 2f 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63  /.  sqlite3Selec
24840 74 44 65 6c 65 74 65 28 64 62 2c 20 70 53 75 62  tDelete(db, pSub
24850 31 29 3b 0a 0a 23 69 66 20 53 45 4c 45 43 54 54  1);..#if SELECTT
24860 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20 69  RACE_ENABLED.  i
24870 66 28 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  f( sqlite3Select
24880 54 72 61 63 65 20 26 20 30 78 31 30 30 20 29 7b  Trace & 0x100 ){
24890 0a 20 20 20 20 53 45 4c 45 43 54 54 52 41 43 45  .    SELECTTRACE
248a0 28 30 78 31 30 30 2c 70 50 61 72 73 65 2c 70 2c  (0x100,pParse,p,
248b0 28 22 41 66 74 65 72 20 66 6c 61 74 74 65 6e 69  ("After flatteni
248c0 6e 67 3a 5c 6e 22 29 29 3b 0a 20 20 20 20 73 71  ng:\n"));.    sq
248d0 6c 69 74 65 33 54 72 65 65 56 69 65 77 53 65 6c  lite3TreeViewSel
248e0 65 63 74 28 30 2c 20 70 2c 20 30 29 3b 0a 20 20  ect(0, p, 0);.  
248f0 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 72 65 74 75  }.#endif..  retu
24900 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  rn 1;.}.#endif /
24910 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  * !defined(SQLIT
24920 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29  E_OMIT_SUBQUERY)
24930 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c   || !defined(SQL
24940 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20 2a  ITE_OMIT_VIEW) *
24950 2f 0a 0a 2f 2a 0a 2a 2a 20 41 20 73 74 72 75 63  /../*.** A struc
24960 74 75 72 65 20 74 6f 20 6b 65 65 70 20 74 72 61  ture to keep tra
24970 63 6b 20 6f 66 20 61 6c 6c 20 6f 66 20 74 68 65  ck of all of the
24980 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 73 20 74   column values t
24990 68 61 74 20 61 72 65 20 66 69 78 65 64 20 74 6f  hat are fixed to
249a0 0a 2a 2a 20 61 20 6b 6e 6f 77 6e 20 76 61 6c 75  .** a known valu
249b0 65 20 64 75 65 20 74 6f 20 57 48 45 52 45 20 63  e due to WHERE c
249c0 6c 61 75 73 65 20 63 6f 6e 73 74 72 61 69 6e 74  lause constraint
249d0 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 43 4f  s of the form CO
249e0 4c 55 4d 4e 3d 56 41 4c 55 45 2e 0a 2a 2f 0a 74  LUMN=VALUE..*/.t
249f0 79 70 65 64 65 66 20 73 74 72 75 63 74 20 57 68  ypedef struct Wh
24a00 65 72 65 43 6f 6e 73 74 20 57 68 65 72 65 43 6f  ereConst WhereCo
24a10 6e 73 74 3b 0a 73 74 72 75 63 74 20 57 68 65 72  nst;.struct Wher
24a20 65 43 6f 6e 73 74 20 7b 0a 20 20 50 61 72 73 65  eConst {.  Parse
24a30 20 2a 70 50 61 72 73 65 3b 20 20 20 2f 2a 20 50   *pParse;   /* P
24a40 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
24a50 2f 0a 20 20 69 6e 74 20 6e 43 6f 6e 73 74 3b 20  /.  int nConst; 
24a60 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 66       /* Number f
24a70 6f 72 20 43 4f 4c 55 4d 4e 3d 43 4f 4e 53 54 41  or COLUMN=CONSTA
24a80 4e 54 20 74 65 72 6d 73 20 2a 2f 0a 20 20 69 6e  NT terms */.  in
24a90 74 20 6e 43 68 6e 67 3b 20 20 20 20 20 20 20 2f  t nChng;       /
24aa0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74 69 6d 65  * Number of time
24ab0 73 20 61 20 63 6f 6e 73 74 61 6e 74 20 69 73 20  s a constant is 
24ac0 70 72 6f 70 61 67 61 74 65 64 20 2a 2f 0a 20 20  propagated */.  
24ad0 45 78 70 72 20 2a 2a 61 70 45 78 70 72 3b 20 20  Expr **apExpr;  
24ae0 20 2f 2a 20 5b 69 2a 32 5d 20 69 73 20 43 4f 4c   /* [i*2] is COL
24af0 55 4d 4e 20 61 6e 64 20 5b 69 2a 32 2b 31 5d 20  UMN and [i*2+1] 
24b00 69 73 20 56 41 4c 55 45 20 2a 2f 0a 7d 3b 0a 0a  is VALUE */.};..
24b10 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6e 65 77 20  /*.** Add a new 
24b20 65 6e 74 72 79 20 74 6f 20 74 68 65 20 70 43 6f  entry to the pCo
24b30 6e 73 74 20 6f 62 6a 65 63 74 2e 20 20 45 78 63  nst object.  Exc
24b40 65 70 74 2c 20 64 6f 20 6e 6f 74 20 61 64 64 20  ept, do not add 
24b50 64 75 70 6c 69 63 61 74 65 0a 2a 2a 20 70 43 6f  duplicate.** pCo
24b60 6c 75 6d 6e 20 65 6e 74 69 72 65 73 2e 0a 2a 2f  lumn entires..*/
24b70 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f 6e  .static void con
24b80 73 74 49 6e 73 65 72 74 28 0a 20 20 57 68 65 72  stInsert(.  Wher
24b90 65 43 6f 6e 73 74 20 2a 70 43 6f 6e 73 74 2c 20  eConst *pConst, 
24ba0 20 20 20 20 20 2f 2a 20 54 68 65 20 57 68 65 72       /* The Wher
24bb0 65 43 6f 6e 73 74 20 69 6e 74 6f 20 77 68 69 63  eConst into whic
24bc0 68 20 77 65 20 61 72 65 20 69 6e 73 65 72 74 69  h we are inserti
24bd0 6e 67 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 43  ng */.  Expr *pC
24be0 6f 6c 75 6d 6e 2c 20 20 20 20 20 20 20 20 20 20  olumn,          
24bf0 20 2f 2a 20 54 68 65 20 43 4f 4c 55 4d 4e 20 70   /* The COLUMN p
24c00 61 72 74 20 6f 66 20 74 68 65 20 63 6f 6e 73 74  art of the const
24c10 72 61 69 6e 74 20 2a 2f 0a 20 20 45 78 70 72 20  raint */.  Expr 
24c20 2a 70 56 61 6c 75 65 20 20 20 20 20 20 20 20 20  *pValue         
24c30 20 20 20 20 2f 2a 20 54 68 65 20 56 41 4c 55 45      /* The VALUE
24c40 20 70 61 72 74 20 6f 66 20 74 68 65 20 63 6f 6e   part of the con
24c50 73 74 72 61 69 6e 74 20 2a 2f 0a 29 7b 0a 20 20  straint */.){.  
24c60 69 6e 74 20 69 3b 0a 20 20 61 73 73 65 72 74 28  int i;.  assert(
24c70 20 70 43 6f 6c 75 6d 6e 2d 3e 6f 70 3d 3d 54 4b   pColumn->op==TK
24c80 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 0a 20 20 2f 2a  _COLUMN );..  /*
24c90 20 32 30 31 38 2d 31 30 2d 32 35 20 74 69 63 6b   2018-10-25 tick
24ca0 65 74 20 5b 63 66 35 65 64 32 30 66 5d 0a 20 20  et [cf5ed20f].  
24cb0 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65  ** Make sure the
24cc0 20 73 61 6d 65 20 70 43 6f 6c 75 6d 6e 20 69 73   same pColumn is
24cd0 20 6e 6f 74 20 69 6e 73 65 72 74 65 64 20 6d 6f   not inserted mo
24ce0 72 65 20 74 68 61 6e 20 6f 6e 63 65 20 2a 2f 0a  re than once */.
24cf0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 43 6f    for(i=0; i<pCo
24d00 6e 73 74 2d 3e 6e 43 6f 6e 73 74 3b 20 69 2b 2b  nst->nConst; i++
24d10 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 45 78 70  ){.    const Exp
24d20 72 20 2a 70 45 78 70 72 20 3d 20 70 43 6f 6e 73  r *pExpr = pCons
24d30 74 2d 3e 61 70 45 78 70 72 5b 69 2a 32 5d 3b 0a  t->apExpr[i*2];.
24d40 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70      assert( pExp
24d50 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e  r->op==TK_COLUMN
24d60 20 29 3b 0a 20 20 20 20 69 66 28 20 70 45 78 70   );.    if( pExp
24d70 72 2d 3e 69 54 61 62 6c 65 3d 3d 70 43 6f 6c 75  r->iTable==pColu
24d80 6d 6e 2d 3e 69 54 61 62 6c 65 0a 20 20 20 20 20  mn->iTable.     
24d90 26 26 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d  && pExpr->iColum
24da0 6e 3d 3d 70 43 6f 6c 75 6d 6e 2d 3e 69 43 6f 6c  n==pColumn->iCol
24db0 75 6d 6e 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  umn.    ){.     
24dc0 20 72 65 74 75 72 6e 3b 20 20 2f 2a 20 41 6c 72   return;  /* Alr
24dd0 65 61 64 79 20 70 72 65 73 65 6e 74 2e 20 20 52  eady present.  R
24de0 65 74 75 72 6e 20 77 69 74 68 6f 75 74 20 64 6f  eturn without do
24df0 69 6e 67 20 61 6e 79 74 68 69 6e 67 2e 20 2a 2f  ing anything. */
24e00 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 43  .    }.  }..  pC
24e10 6f 6e 73 74 2d 3e 6e 43 6f 6e 73 74 2b 2b 3b 0a  onst->nConst++;.
24e20 20 20 70 43 6f 6e 73 74 2d 3e 61 70 45 78 70 72    pConst->apExpr
24e30 20 3d 20 73 71 6c 69 74 65 33 44 62 52 65 61 6c   = sqlite3DbReal
24e40 6c 6f 63 4f 72 46 72 65 65 28 70 43 6f 6e 73 74  locOrFree(pConst
24e50 2d 3e 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 43  ->pParse->db, pC
24e60 6f 6e 73 74 2d 3e 61 70 45 78 70 72 2c 0a 20 20  onst->apExpr,.  
24e70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24e80 20 20 20 20 20 20 20 70 43 6f 6e 73 74 2d 3e 6e         pConst->n
24e90 43 6f 6e 73 74 2a 32 2a 73 69 7a 65 6f 66 28 45  Const*2*sizeof(E
24ea0 78 70 72 2a 29 29 3b 0a 20 20 69 66 28 20 70 43  xpr*));.  if( pC
24eb0 6f 6e 73 74 2d 3e 61 70 45 78 70 72 3d 3d 30 20  onst->apExpr==0 
24ec0 29 7b 0a 20 20 20 20 70 43 6f 6e 73 74 2d 3e 6e  ){.    pConst->n
24ed0 43 6f 6e 73 74 20 3d 20 30 3b 0a 20 20 7d 65 6c  Const = 0;.  }el
24ee0 73 65 7b 0a 20 20 20 20 69 66 28 20 45 78 70 72  se{.    if( Expr
24ef0 48 61 73 50 72 6f 70 65 72 74 79 28 70 56 61 6c  HasProperty(pVal
24f00 75 65 2c 20 45 50 5f 46 69 78 65 64 43 6f 6c 29  ue, EP_FixedCol)
24f10 20 29 20 70 56 61 6c 75 65 20 3d 20 70 56 61 6c   ) pValue = pVal
24f20 75 65 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20 70  ue->pLeft;.    p
24f30 43 6f 6e 73 74 2d 3e 61 70 45 78 70 72 5b 70 43  Const->apExpr[pC
24f40 6f 6e 73 74 2d 3e 6e 43 6f 6e 73 74 2a 32 2d 32  onst->nConst*2-2
24f50 5d 20 3d 20 70 43 6f 6c 75 6d 6e 3b 0a 20 20 20  ] = pColumn;.   
24f60 20 70 43 6f 6e 73 74 2d 3e 61 70 45 78 70 72 5b   pConst->apExpr[
24f70 70 43 6f 6e 73 74 2d 3e 6e 43 6f 6e 73 74 2a 32  pConst->nConst*2
24f80 2d 31 5d 20 3d 20 70 56 61 6c 75 65 3b 0a 20 20  -1] = pValue;.  
24f90 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20  }.}../*.** Find 
24fa0 61 6c 6c 20 74 65 72 6d 73 20 6f 66 20 43 4f 4c  all terms of COL
24fb0 55 4d 4e 3d 56 41 4c 55 45 20 6f 72 20 56 41 4c  UMN=VALUE or VAL
24fc0 55 45 3d 43 4f 4c 55 4d 4e 20 69 6e 20 70 45 78  UE=COLUMN in pEx
24fd0 70 72 20 77 68 65 72 65 20 56 41 4c 55 45 0a 2a  pr where VALUE.*
24fe0 2a 20 69 73 20 61 20 63 6f 6e 73 74 61 6e 74 20  * is a constant 
24ff0 65 78 70 72 65 73 73 69 6f 6e 20 61 6e 64 20 77  expression and w
25000 68 65 72 65 20 74 68 65 20 74 65 72 6d 20 6d 75  here the term mu
25010 73 74 20 62 65 20 74 72 75 65 20 62 65 63 61 75  st be true becau
25020 73 65 20 69 74 0a 2a 2a 20 69 73 20 70 61 72 74  se it.** is part
25030 20 6f 66 20 74 68 65 20 41 4e 44 2d 63 6f 6e 6e   of the AND-conn
25040 65 63 74 65 64 20 74 65 72 6d 73 20 6f 66 20 74  ected terms of t
25050 68 65 20 65 78 70 72 65 73 73 69 6f 6e 2e 20 20  he expression.  
25060 46 6f 72 20 65 61 63 68 20 74 65 72 6d 0a 2a 2a  For each term.**
25070 20 66 6f 75 6e 64 2c 20 61 64 64 20 69 74 20 74   found, add it t
25080 6f 20 74 68 65 20 70 43 6f 6e 73 74 20 73 74 72  o the pConst str
25090 75 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69  ucture..*/.stati
250a0 63 20 76 6f 69 64 20 66 69 6e 64 43 6f 6e 73 74  c void findConst
250b0 49 6e 57 68 65 72 65 28 57 68 65 72 65 43 6f 6e  InWhere(WhereCon
250c0 73 74 20 2a 70 43 6f 6e 73 74 2c 20 45 78 70 72  st *pConst, Expr
250d0 20 2a 70 45 78 70 72 29 7b 0a 20 20 45 78 70 72   *pExpr){.  Expr
250e0 20 2a 70 52 69 67 68 74 2c 20 2a 70 4c 65 66 74   *pRight, *pLeft
250f0 3b 0a 20 20 69 66 28 20 70 45 78 70 72 3d 3d 30  ;.  if( pExpr==0
25100 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28   ) return;.  if(
25110 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79   ExprHasProperty
25120 28 70 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a  (pExpr, EP_FromJ
25130 6f 69 6e 29 20 29 20 72 65 74 75 72 6e 3b 0a 20  oin) ) return;. 
25140 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d   if( pExpr->op==
25150 54 4b 5f 41 4e 44 20 29 7b 0a 20 20 20 20 66 69  TK_AND ){.    fi
25160 6e 64 43 6f 6e 73 74 49 6e 57 68 65 72 65 28 70  ndConstInWhere(p
25170 43 6f 6e 73 74 2c 20 70 45 78 70 72 2d 3e 70 52  Const, pExpr->pR
25180 69 67 68 74 29 3b 0a 20 20 20 20 66 69 6e 64 43  ight);.    findC
25190 6f 6e 73 74 49 6e 57 68 65 72 65 28 70 43 6f 6e  onstInWhere(pCon
251a0 73 74 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  st, pExpr->pLeft
251b0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  );.    return;. 
251c0 20 7d 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e   }.  if( pExpr->
251d0 6f 70 21 3d 54 4b 5f 45 51 20 29 20 72 65 74 75  op!=TK_EQ ) retu
251e0 72 6e 3b 0a 20 20 70 52 69 67 68 74 20 3d 20 70  rn;.  pRight = p
251f0 45 78 70 72 2d 3e 70 52 69 67 68 74 3b 0a 20 20  Expr->pRight;.  
25200 70 4c 65 66 74 20 3d 20 70 45 78 70 72 2d 3e 70  pLeft = pExpr->p
25210 4c 65 66 74 3b 0a 20 20 61 73 73 65 72 74 28 20  Left;.  assert( 
25220 70 52 69 67 68 74 21 3d 30 20 29 3b 0a 20 20 61  pRight!=0 );.  a
25230 73 73 65 72 74 28 20 70 4c 65 66 74 21 3d 30 20  ssert( pLeft!=0 
25240 29 3b 0a 20 20 69 66 28 20 70 52 69 67 68 74 2d  );.  if( pRight-
25250 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 0a 20  >op==TK_COLUMN. 
25260 20 20 26 26 20 21 45 78 70 72 48 61 73 50 72 6f    && !ExprHasPro
25270 70 65 72 74 79 28 70 52 69 67 68 74 2c 20 45 50  perty(pRight, EP
25280 5f 46 69 78 65 64 43 6f 6c 29 0a 20 20 20 26 26  _FixedCol).   &&
25290 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f   sqlite3ExprIsCo
252a0 6e 73 74 61 6e 74 28 70 4c 65 66 74 29 0a 20 20  nstant(pLeft).  
252b0 20 26 26 20 73 71 6c 69 74 65 33 49 73 42 69 6e   && sqlite3IsBin
252c0 61 72 79 28 73 71 6c 69 74 65 33 42 69 6e 61 72  ary(sqlite3Binar
252d0 79 43 6f 6d 70 61 72 65 43 6f 6c 6c 53 65 71 28  yCompareCollSeq(
252e0 70 43 6f 6e 73 74 2d 3e 70 50 61 72 73 65 2c 70  pConst->pParse,p
252f0 4c 65 66 74 2c 70 52 69 67 68 74 29 29 0a 20 20  Left,pRight)).  
25300 29 7b 0a 20 20 20 20 63 6f 6e 73 74 49 6e 73 65  ){.    constInse
25310 72 74 28 70 43 6f 6e 73 74 2c 20 70 52 69 67 68  rt(pConst, pRigh
25320 74 2c 20 70 4c 65 66 74 29 3b 0a 20 20 7d 65 6c  t, pLeft);.  }el
25330 73 65 0a 20 20 69 66 28 20 70 4c 65 66 74 2d 3e  se.  if( pLeft->
25340 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 0a 20 20  op==TK_COLUMN.  
25350 20 26 26 20 21 45 78 70 72 48 61 73 50 72 6f 70   && !ExprHasProp
25360 65 72 74 79 28 70 4c 65 66 74 2c 20 45 50 5f 46  erty(pLeft, EP_F
25370 69 78 65 64 43 6f 6c 29 0a 20 20 20 26 26 20 73  ixedCol).   && s
25380 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73  qlite3ExprIsCons
25390 74 61 6e 74 28 70 52 69 67 68 74 29 0a 20 20 20  tant(pRight).   
253a0 26 26 20 73 71 6c 69 74 65 33 49 73 42 69 6e 61  && sqlite3IsBina
253b0 72 79 28 73 71 6c 69 74 65 33 42 69 6e 61 72 79  ry(sqlite3Binary
253c0 43 6f 6d 70 61 72 65 43 6f 6c 6c 53 65 71 28 70  CompareCollSeq(p
253d0 43 6f 6e 73 74 2d 3e 70 50 61 72 73 65 2c 70 4c  Const->pParse,pL
253e0 65 66 74 2c 70 52 69 67 68 74 29 29 0a 20 20 29  eft,pRight)).  )
253f0 7b 0a 20 20 20 20 63 6f 6e 73 74 49 6e 73 65 72  {.    constInser
25400 74 28 70 43 6f 6e 73 74 2c 20 70 4c 65 66 74 2c  t(pConst, pLeft,
25410 20 70 52 69 67 68 74 29 3b 0a 20 20 7d 0a 7d 0a   pRight);.  }.}.
25420 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 61  ./*.** This is a
25430 20 57 61 6c 6b 65 72 20 65 78 70 72 65 73 73 69   Walker expressi
25440 6f 6e 20 63 61 6c 6c 62 61 63 6b 2e 20 20 70 45  on callback.  pE
25450 78 70 72 20 69 73 20 61 20 63 61 6e 64 69 64 61  xpr is a candida
25460 74 65 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a  te expression.**
25470 20 74 6f 20 62 65 20 72 65 70 6c 61 63 65 64 20   to be replaced 
25480 62 79 20 61 20 76 61 6c 75 65 2e 20 20 49 66 20  by a value.  If 
25490 70 45 78 70 72 20 69 73 20 65 71 75 69 76 61 6c  pExpr is equival
254a0 65 6e 74 20 74 6f 20 6f 6e 65 20 6f 66 20 74 68  ent to one of th
254b0 65 0a 2a 2a 20 63 6f 6c 75 6d 6e 73 20 6e 61 6d  e.** columns nam
254c0 65 64 20 69 6e 20 70 57 61 6c 6b 65 72 2d 3e 75  ed in pWalker->u
254d0 2e 70 43 6f 6e 73 74 2c 20 74 68 65 6e 20 6f 76  .pConst, then ov
254e0 65 72 77 72 69 74 65 20 69 74 20 77 69 74 68 20  erwrite it with 
254f0 69 74 73 0a 2a 2a 20 63 6f 72 72 65 73 70 6f 6e  its.** correspon
25500 64 69 6e 67 20 76 61 6c 75 65 2e 0a 2a 2f 0a 73  ding value..*/.s
25510 74 61 74 69 63 20 69 6e 74 20 70 72 6f 70 61 67  tatic int propag
25520 61 74 65 43 6f 6e 73 74 61 6e 74 45 78 70 72 52  ateConstantExprR
25530 65 77 72 69 74 65 28 57 61 6c 6b 65 72 20 2a 70  ewrite(Walker *p
25540 57 61 6c 6b 65 72 2c 20 45 78 70 72 20 2a 70 45  Walker, Expr *pE
25550 78 70 72 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  xpr){.  int i;. 
25560 20 57 68 65 72 65 43 6f 6e 73 74 20 2a 70 43 6f   WhereConst *pCo
25570 6e 73 74 3b 0a 20 20 69 66 28 20 70 45 78 70 72  nst;.  if( pExpr
25580 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20  ->op!=TK_COLUMN 
25590 29 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e  ) return WRC_Con
255a0 74 69 6e 75 65 3b 0a 20 20 69 66 28 20 45 78 70  tinue;.  if( Exp
255b0 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
255c0 70 72 2c 20 45 50 5f 46 69 78 65 64 43 6f 6c 29  pr, EP_FixedCol)
255d0 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f   ) return WRC_Co
255e0 6e 74 69 6e 75 65 3b 0a 20 20 70 43 6f 6e 73 74  ntinue;.  pConst
255f0 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 75 2e 70 43   = pWalker->u.pC
25600 6f 6e 73 74 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  onst;.  for(i=0;
25610 20 69 3c 70 43 6f 6e 73 74 2d 3e 6e 43 6f 6e 73   i<pConst->nCons
25620 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70  t; i++){.    Exp
25630 72 20 2a 70 43 6f 6c 75 6d 6e 20 3d 20 70 43 6f  r *pColumn = pCo
25640 6e 73 74 2d 3e 61 70 45 78 70 72 5b 69 2a 32 5d  nst->apExpr[i*2]
25650 3b 0a 20 20 20 20 69 66 28 20 70 43 6f 6c 75 6d  ;.    if( pColum
25660 6e 3d 3d 70 45 78 70 72 20 29 20 63 6f 6e 74 69  n==pExpr ) conti
25670 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 70 43 6f  nue;.    if( pCo
25680 6c 75 6d 6e 2d 3e 69 54 61 62 6c 65 21 3d 70 45  lumn->iTable!=pE
25690 78 70 72 2d 3e 69 54 61 62 6c 65 20 29 20 63 6f  xpr->iTable ) co
256a0 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20  ntinue;.    if( 
256b0 70 43 6f 6c 75 6d 6e 2d 3e 69 43 6f 6c 75 6d 6e  pColumn->iColumn
256c0 21 3d 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  !=pExpr->iColumn
256d0 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
256e0 20 2f 2a 20 41 20 6d 61 74 63 68 20 69 73 20 66   /* A match is f
256f0 6f 75 6e 64 2e 20 20 41 64 64 20 74 68 65 20 45  ound.  Add the E
25700 50 5f 46 69 78 65 64 43 6f 6c 20 70 72 6f 70 65  P_FixedCol prope
25710 72 74 79 20 2a 2f 0a 20 20 20 20 70 43 6f 6e 73  rty */.    pCons
25720 74 2d 3e 6e 43 68 6e 67 2b 2b 3b 0a 20 20 20 20  t->nChng++;.    
25730 45 78 70 72 43 6c 65 61 72 50 72 6f 70 65 72 74  ExprClearPropert
25740 79 28 70 45 78 70 72 2c 20 45 50 5f 4c 65 61 66  y(pExpr, EP_Leaf
25750 29 3b 0a 20 20 20 20 45 78 70 72 53 65 74 50 72  );.    ExprSetPr
25760 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
25770 5f 46 69 78 65 64 43 6f 6c 29 3b 0a 20 20 20 20  _FixedCol);.    
25780 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 70  assert( pExpr->p
25790 4c 65 66 74 3d 3d 30 20 29 3b 0a 20 20 20 20 70  Left==0 );.    p
257a0 45 78 70 72 2d 3e 70 4c 65 66 74 20 3d 20 73 71  Expr->pLeft = sq
257b0 6c 69 74 65 33 45 78 70 72 44 75 70 28 70 43 6f  lite3ExprDup(pCo
257c0 6e 73 74 2d 3e 70 50 61 72 73 65 2d 3e 64 62 2c  nst->pParse->db,
257d0 20 70 43 6f 6e 73 74 2d 3e 61 70 45 78 70 72 5b   pConst->apExpr[
257e0 69 2a 32 2b 31 5d 2c 20 30 29 3b 0a 20 20 20 20  i*2+1], 0);.    
257f0 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 65 74  break;.  }.  ret
25800 75 72 6e 20 57 52 43 5f 50 72 75 6e 65 3b 0a 7d  urn WRC_Prune;.}
25810 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 57 48 45 52  ../*.** The WHER
25820 45 2d 63 6c 61 75 73 65 20 63 6f 6e 73 74 61 6e  E-clause constan
25830 74 20 70 72 6f 70 61 67 61 74 69 6f 6e 20 6f 70  t propagation op
25840 74 69 6d 69 7a 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a  timization..**.*
25850 2a 20 49 66 20 74 68 65 20 57 48 45 52 45 20 63  * If the WHERE c
25860 6c 61 75 73 65 20 63 6f 6e 74 61 69 6e 73 20 74  lause contains t
25870 65 72 6d 73 20 6f 66 20 74 68 65 20 66 6f 72 6d  erms of the form
25880 20 43 4f 4c 55 4d 4e 3d 43 4f 4e 53 54 41 4e 54   COLUMN=CONSTANT
25890 20 6f 72 0a 2a 2a 20 43 4f 4e 53 54 41 4e 54 3d   or.** CONSTANT=
258a0 43 4f 4c 55 4d 4e 20 74 68 61 74 20 6d 75 73 74  COLUMN that must
258b0 20 62 65 20 74 72 65 65 20 28 69 6e 20 6f 74 68   be tree (in oth
258c0 65 72 20 77 6f 72 64 73 2c 20 69 66 20 74 68 65  er words, if the
258d0 20 74 65 72 6d 73 20 74 6f 70 2d 6c 65 76 65 6c   terms top-level
258e0 0a 2a 2a 20 41 4e 44 2d 63 6f 6e 6e 65 63 74 65  .** AND-connecte
258f0 64 20 74 65 72 6d 73 20 74 68 61 74 20 61 72 65  d terms that are
25900 20 6e 6f 74 20 70 61 72 74 20 6f 66 20 61 20 4f   not part of a O
25910 4e 20 63 6c 61 75 73 65 20 66 72 6f 6d 20 61 20  N clause from a 
25920 4c 45 46 54 20 4a 4f 49 4e 29 0a 2a 2a 20 74 68  LEFT JOIN).** th
25930 65 6e 20 74 68 72 6f 75 67 68 6f 75 74 20 74 68  en throughout th
25940 65 20 71 75 65 72 79 20 72 65 70 6c 61 63 65 20  e query replace 
25950 61 6c 6c 20 6f 74 68 65 72 20 6f 63 63 75 72 72  all other occurr
25960 65 6e 63 65 73 20 6f 66 20 43 4f 4c 55 4d 4e 0a  ences of COLUMN.
25970 2a 2a 20 77 69 74 68 20 43 4f 4e 53 54 41 4e 54  ** with CONSTANT
25980 20 77 69 74 68 69 6e 20 74 68 65 20 57 48 45 52   within the WHER
25990 45 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20  E clause..**.** 
259a0 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 74 68 65  For example, the
259b0 20 71 75 65 72 79 3a 0a 2a 2a 0a 2a 2a 20 20 20   query:.**.**   
259c0 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d     SELECT * FROM
259d0 20 74 31 2c 20 74 32 2c 20 74 33 20 57 48 45 52   t1, t2, t3 WHER
259e0 45 20 74 31 2e 61 3d 33 39 20 41 4e 44 20 74 32  E t1.a=39 AND t2
259f0 2e 62 3d 74 31 2e 61 20 41 4e 44 20 74 33 2e 63  .b=t1.a AND t3.c
25a00 3d 74 32 2e 62 0a 2a 2a 0a 2a 2a 20 49 73 20 74  =t2.b.**.** Is t
25a10 72 61 6e 73 66 6f 72 6d 65 64 20 69 6e 74 6f 0a  ransformed into.
25a20 2a 2a 0a 2a 2a 20 20 20 20 20 20 53 45 4c 45 43  **.**      SELEC
25a30 54 20 2a 20 46 52 4f 4d 20 74 31 2c 20 74 32 2c  T * FROM t1, t2,
25a40 20 74 33 20 57 48 45 52 45 20 74 31 2e 61 3d 33   t3 WHERE t1.a=3
25a50 39 20 41 4e 44 20 74 32 2e 62 3d 33 39 20 41 4e  9 AND t2.b=39 AN
25a60 44 20 74 33 2e 63 3d 33 39 0a 2a 2a 0a 2a 2a 20  D t3.c=39.**.** 
25a70 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 61  Return true if a
25a80 6e 79 20 74 72 61 6e 73 66 6f 72 6d 61 74 69 6f  ny transformatio
25a90 6e 73 20 77 68 65 72 65 20 6d 61 64 65 20 61 6e  ns where made an
25aa0 64 20 66 61 6c 73 65 20 69 66 20 6e 6f 74 2e 0a  d false if not..
25ab0 2a 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61  **.** Implementa
25ac0 74 69 6f 6e 20 6e 6f 74 65 3a 20 20 43 6f 6e 73  tion note:  Cons
25ad0 74 61 6e 74 20 70 72 6f 70 61 67 61 74 69 6f 6e  tant propagation
25ae0 20 69 73 20 74 72 69 63 6b 79 20 64 75 65 20 74   is tricky due t
25af0 6f 20 61 66 66 69 6e 69 74 79 0a 2a 2a 20 61 6e  o affinity.** an
25b00 64 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  d collating sequ
25b10 65 6e 63 65 20 69 6e 74 65 72 61 63 74 69 6f 6e  ence interaction
25b20 73 2e 20 20 43 6f 6e 73 69 64 65 72 20 74 68 69  s.  Consider thi
25b30 73 20 65 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a  s example:.**.**
25b40 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
25b50 20 74 31 28 61 20 49 4e 54 2c 62 20 54 45 58 54   t1(a INT,b TEXT
25b60 29 3b 0a 2a 2a 20 20 20 20 49 4e 53 45 52 54 20  );.**    INSERT 
25b70 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 31  INTO t1 VALUES(1
25b80 32 33 2c 27 30 31 32 33 27 29 3b 0a 2a 2a 20 20  23,'0123');.**  
25b90 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
25ba0 74 31 20 57 48 45 52 45 20 61 3d 31 32 33 20 41  t1 WHERE a=123 A
25bb0 4e 44 20 62 3d 61 3b 0a 2a 2a 20 20 20 20 53 45  ND b=a;.**    SE
25bc0 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 57  LECT * FROM t1 W
25bd0 48 45 52 45 20 61 3d 31 32 33 20 41 4e 44 20 62  HERE a=123 AND b
25be0 3d 31 32 33 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 20  =123;.**.** The 
25bf0 74 77 6f 20 53 45 4c 45 43 54 20 73 74 61 74 65  two SELECT state
25c00 6d 65 6e 74 73 20 61 62 6f 76 65 20 73 68 6f 75  ments above shou
25c10 6c 64 20 72 65 74 75 72 6e 20 64 69 66 66 65 72  ld return differ
25c20 65 6e 74 20 61 6e 73 77 65 72 73 2e 20 20 62 3d  ent answers.  b=
25c30 61 0a 2a 2a 20 69 73 20 61 6c 77 61 79 20 74 72  a.** is alway tr
25c40 75 65 20 62 65 63 61 75 73 65 20 74 68 65 20 63  ue because the c
25c50 6f 6d 70 61 72 69 73 6f 6e 20 75 73 65 73 20 6e  omparison uses n
25c60 75 6d 65 72 69 63 20 61 66 66 69 6e 69 74 79 2c  umeric affinity,
25c70 20 62 75 74 20 62 3d 31 32 33 0a 2a 2a 20 69 73   but b=123.** is
25c80 20 66 61 6c 73 65 20 62 65 63 61 75 73 65 20 69   false because i
25c90 74 20 75 73 65 73 20 74 65 78 74 20 61 66 66 69  t uses text affi
25ca0 6e 69 74 79 20 61 6e 64 20 27 30 31 32 33 27 20  nity and '0123' 
25cb0 69 73 20 6e 6f 74 20 74 68 65 20 73 61 6d 65 20  is not the same 
25cc0 61 73 20 27 31 32 33 27 2e 0a 2a 2a 20 54 6f 20  as '123'..** To 
25cd0 77 6f 72 6b 20 61 72 6f 75 6e 64 20 74 68 69 73  work around this
25ce0 2c 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  , the expression
25cf0 20 74 72 65 65 20 69 73 20 6e 6f 74 20 61 63 74   tree is not act
25d00 75 61 6c 6c 79 20 63 68 61 6e 67 65 64 20 66 72  ually changed fr
25d10 6f 6d 0a 2a 2a 20 22 62 3d 61 22 20 74 6f 20 22  om.** "b=a" to "
25d20 62 3d 31 32 33 22 20 62 75 74 20 72 61 74 68 65  b=123" but rathe
25d30 72 20 74 68 65 20 22 61 22 20 69 6e 20 22 62 3d  r the "a" in "b=
25d40 61 22 20 69 73 20 74 61 67 67 65 64 20 77 69 74  a" is tagged wit
25d50 68 20 45 50 5f 46 69 78 65 64 43 6f 6c 0a 2a 2a  h EP_FixedCol.**
25d60 20 61 6e 64 20 74 68 65 20 22 31 32 33 22 20 76   and the "123" v
25d70 61 6c 75 65 20 69 73 20 68 75 6e 67 20 6f 66 66  alue is hung off
25d80 20 6f 66 20 74 68 65 20 70 4c 65 66 74 20 70 6f   of the pLeft po
25d90 69 6e 74 65 72 2e 20 20 43 6f 64 65 20 67 65 6e  inter.  Code gen
25da0 65 72 61 74 6f 72 0a 2a 2a 20 72 6f 75 74 69 6e  erator.** routin
25db0 65 73 20 6b 6e 6f 77 20 74 6f 20 67 65 6e 65 72  es know to gener
25dc0 61 74 65 20 74 68 65 20 63 6f 6e 73 74 61 6e 74  ate the constant
25dd0 20 22 31 32 33 22 20 69 6e 73 74 65 61 64 20 6f   "123" instead o
25de0 66 20 6c 6f 6f 6b 69 6e 67 20 75 70 20 74 68 65  f looking up the
25df0 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65  .** column value
25e00 2e 20 20 41 6c 73 6f 2c 20 74 6f 20 61 76 6f 69  .  Also, to avoi
25e10 64 20 63 6f 6c 6c 61 74 69 6f 6e 20 70 72 6f 62  d collation prob
25e20 6c 65 6d 73 2c 20 74 68 69 73 20 6f 70 74 69 6d  lems, this optim
25e30 69 7a 61 74 69 6f 6e 20 69 73 0a 2a 2a 20 6f 6e  ization is.** on
25e40 6c 79 20 61 74 74 65 6d 70 74 65 64 20 69 66 20  ly attempted if 
25e50 74 68 65 20 22 61 3d 31 32 33 22 20 74 65 72 6d  the "a=123" term
25e60 20 75 73 65 73 20 74 68 65 20 64 65 66 61 75 6c   uses the defaul
25e70 74 20 42 49 4e 41 52 59 20 63 6f 6c 6c 61 74 69  t BINARY collati
25e80 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  on..*/.static in
25e90 74 20 70 72 6f 70 61 67 61 74 65 43 6f 6e 73 74  t propagateConst
25ea0 61 6e 74 73 28 0a 20 20 50 61 72 73 65 20 2a 70  ants(.  Parse *p
25eb0 50 61 72 73 65 2c 20 20 20 2f 2a 20 54 68 65 20  Parse,   /* The 
25ec0 70 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  parsing context 
25ed0 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 20 20  */.  Select *p  
25ee0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 71 75 65        /* The que
25ef0 72 79 20 69 6e 20 77 68 69 63 68 20 74 6f 20 70  ry in which to p
25f00 72 6f 70 61 67 61 74 65 20 63 6f 6e 73 74 61 6e  ropagate constan
25f10 74 73 20 2a 2f 0a 29 7b 0a 20 20 57 68 65 72 65  ts */.){.  Where
25f20 43 6f 6e 73 74 20 78 3b 0a 20 20 57 61 6c 6b 65  Const x;.  Walke
25f30 72 20 77 3b 0a 20 20 69 6e 74 20 6e 43 68 6e 67  r w;.  int nChng
25f40 20 3d 20 30 3b 0a 20 20 78 2e 70 50 61 72 73 65   = 0;.  x.pParse
25f50 20 3d 20 70 50 61 72 73 65 3b 0a 20 20 64 6f 7b   = pParse;.  do{
25f60 0a 20 20 20 20 78 2e 6e 43 6f 6e 73 74 20 3d 20  .    x.nConst = 
25f70 30 3b 0a 20 20 20 20 78 2e 6e 43 68 6e 67 20 3d  0;.    x.nChng =
25f80 20 30 3b 0a 20 20 20 20 78 2e 61 70 45 78 70 72   0;.    x.apExpr
25f90 20 3d 20 30 3b 0a 20 20 20 20 66 69 6e 64 43 6f   = 0;.    findCo
25fa0 6e 73 74 49 6e 57 68 65 72 65 28 26 78 2c 20 70  nstInWhere(&x, p
25fb0 2d 3e 70 57 68 65 72 65 29 3b 0a 20 20 20 20 69  ->pWhere);.    i
25fc0 66 28 20 78 2e 6e 43 6f 6e 73 74 20 29 7b 0a 20  f( x.nConst ){. 
25fd0 20 20 20 20 20 6d 65 6d 73 65 74 28 26 77 2c 20       memset(&w, 
25fe0 30 2c 20 73 69 7a 65 6f 66 28 77 29 29 3b 0a 20  0, sizeof(w));. 
25ff0 20 20 20 20 20 77 2e 70 50 61 72 73 65 20 3d 20       w.pParse = 
26000 70 50 61 72 73 65 3b 0a 20 20 20 20 20 20 77 2e  pParse;.      w.
26010 78 45 78 70 72 43 61 6c 6c 62 61 63 6b 20 3d 20  xExprCallback = 
26020 70 72 6f 70 61 67 61 74 65 43 6f 6e 73 74 61 6e  propagateConstan
26030 74 45 78 70 72 52 65 77 72 69 74 65 3b 0a 20 20  tExprRewrite;.  
26040 20 20 20 20 77 2e 78 53 65 6c 65 63 74 43 61 6c      w.xSelectCal
26050 6c 62 61 63 6b 20 3d 20 73 71 6c 69 74 65 33 53  lback = sqlite3S
26060 65 6c 65 63 74 57 61 6c 6b 4e 6f 6f 70 3b 0a 20  electWalkNoop;. 
26070 20 20 20 20 20 77 2e 78 53 65 6c 65 63 74 43 61       w.xSelectCa
26080 6c 6c 62 61 63 6b 32 20 3d 20 30 3b 0a 20 20 20  llback2 = 0;.   
26090 20 20 20 77 2e 77 61 6c 6b 65 72 44 65 70 74 68     w.walkerDepth
260a0 20 3d 20 30 3b 0a 20 20 20 20 20 20 77 2e 75 2e   = 0;.      w.u.
260b0 70 43 6f 6e 73 74 20 3d 20 26 78 3b 0a 20 20 20  pConst = &x;.   
260c0 20 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 45 78     sqlite3WalkEx
260d0 70 72 28 26 77 2c 20 70 2d 3e 70 57 68 65 72 65  pr(&w, p->pWhere
260e0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
260f0 44 62 46 72 65 65 28 78 2e 70 50 61 72 73 65 2d  DbFree(x.pParse-
26100 3e 64 62 2c 20 78 2e 61 70 45 78 70 72 29 3b 0a  >db, x.apExpr);.
26110 20 20 20 20 20 20 6e 43 68 6e 67 20 2b 3d 20 78        nChng += x
26120 2e 6e 43 68 6e 67 3b 0a 20 20 20 20 7d 0a 20 20  .nChng;.    }.  
26130 7d 77 68 69 6c 65 28 20 78 2e 6e 43 68 6e 67 20  }while( x.nChng 
26140 29 3b 20 20 0a 20 20 72 65 74 75 72 6e 20 6e 43  );  .  return nC
26150 68 6e 67 3b 0a 7d 0a 0a 23 69 66 20 21 64 65 66  hng;.}..#if !def
26160 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
26170 5f 53 55 42 51 55 45 52 59 29 20 7c 7c 20 21 64  _SUBQUERY) || !d
26180 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
26190 49 54 5f 56 49 45 57 29 0a 2f 2a 0a 2a 2a 20 4d  IT_VIEW)./*.** M
261a0 61 6b 65 20 63 6f 70 69 65 73 20 6f 66 20 72 65  ake copies of re
261b0 6c 65 76 61 6e 74 20 57 48 45 52 45 20 63 6c 61  levant WHERE cla
261c0 75 73 65 20 74 65 72 6d 73 20 6f 66 20 74 68 65  use terms of the
261d0 20 6f 75 74 65 72 20 71 75 65 72 79 20 69 6e 74   outer query int
261e0 6f 0a 2a 2a 20 74 68 65 20 57 48 45 52 45 20 63  o.** the WHERE c
261f0 6c 61 75 73 65 20 6f 66 20 73 75 62 71 75 65 72  lause of subquer
26200 79 2e 20 20 45 78 61 6d 70 6c 65 3a 0a 2a 2a 0a  y.  Example:.**.
26210 2a 2a 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46  **    SELECT * F
26220 52 4f 4d 20 28 53 45 4c 45 43 54 20 61 20 41 53  ROM (SELECT a AS
26230 20 78 2c 20 63 2d 64 20 41 53 20 79 20 46 52 4f   x, c-d AS y FRO
26240 4d 20 74 31 29 20 57 48 45 52 45 20 78 3d 35 20  M t1) WHERE x=5 
26250 41 4e 44 20 79 3d 31 30 3b 0a 2a 2a 0a 2a 2a 20  AND y=10;.**.** 
26260 54 72 61 6e 73 66 6f 72 6d 65 64 20 69 6e 74 6f  Transformed into
26270 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 53 45 4c 45 43  :.**.**    SELEC
26280 54 20 2a 20 46 52 4f 4d 20 28 53 45 4c 45 43 54  T * FROM (SELECT
26290 20 61 20 41 53 20 78 2c 20 63 2d 64 20 41 53 20   a AS x, c-d AS 
262a0 79 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20  y FROM t1 WHERE 
262b0 61 3d 35 20 41 4e 44 20 63 2d 64 3d 31 30 29 0a  a=5 AND c-d=10).
262c0 2a 2a 20 20 20 20 20 57 48 45 52 45 20 78 3d 35  **     WHERE x=5
262d0 20 41 4e 44 20 79 3d 31 30 3b 0a 2a 2a 0a 2a 2a   AND y=10;.**.**
262e0 20 54 68 65 20 68 6f 70 65 20 69 73 20 74 68 61   The hope is tha
262f0 74 20 74 68 65 20 74 65 72 6d 73 20 61 64 64 65  t the terms adde
26300 64 20 74 6f 20 74 68 65 20 69 6e 6e 65 72 20 71  d to the inner q
26310 75 65 72 79 20 77 69 6c 6c 20 6d 61 6b 65 20 69  uery will make i
26320 74 20 6d 6f 72 65 0a 2a 2a 20 65 66 66 69 63 69  t more.** effici
26330 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 44 6f 20 6e 6f  ent..**.** Do no
26340 74 20 61 74 74 65 6d 70 74 20 74 68 69 73 20 6f  t attempt this o
26350 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69 66 3a 0a  ptimization if:.
26360 2a 2a 0a 2a 2a 20 20 20 28 31 29 20 28 2a 2a 20  **.**   (1) (** 
26370 54 68 69 73 20 72 65 73 74 72 69 63 74 69 6f 6e  This restriction
26380 20 77 61 73 20 72 65 6d 6f 76 65 64 20 6f 6e 20   was removed on 
26390 32 30 31 37 2d 30 39 2d 32 39 2e 20 20 57 65 20  2017-09-29.  We 
263a0 75 73 65 64 20 74 6f 0a 2a 2a 20 20 20 20 20 20  used to.**      
263b0 20 20 20 20 20 64 69 73 61 6c 6c 6f 77 20 74 68       disallow th
263c0 69 73 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20  is optimization 
263d0 66 6f 72 20 61 67 67 72 65 67 61 74 65 20 73 75  for aggregate su
263e0 62 71 75 65 72 69 65 73 2c 20 62 75 74 20 6e 6f  bqueries, but no
263f0 77 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 69  w.**           i
26400 74 20 69 73 20 61 6c 6c 6f 77 65 64 20 62 79 20  t is allowed by 
26410 70 75 74 74 69 6e 67 20 74 68 65 20 65 78 74 72  putting the extr
26420 61 20 74 65 72 6d 73 20 6f 6e 20 74 68 65 20 48  a terms on the H
26430 41 56 49 4e 47 20 63 6c 61 75 73 65 2e 0a 2a 2a  AVING clause..**
26440 20 20 20 20 20 20 20 20 20 20 20 54 68 65 20 61             The a
26450 64 64 65 64 20 48 41 56 49 4e 47 20 63 6c 61 75  dded HAVING clau
26460 73 65 20 69 73 20 70 6f 69 6e 74 6c 65 73 73 20  se is pointless 
26470 69 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20  if the subquery 
26480 6c 61 63 6b 73 0a 2a 2a 20 20 20 20 20 20 20 20  lacks.**        
26490 20 20 20 61 20 47 52 4f 55 50 20 42 59 20 63 6c     a GROUP BY cl
264a0 61 75 73 65 2e 20 20 42 75 74 20 73 75 63 68 20  ause.  But such 
264b0 61 20 48 41 56 49 4e 47 20 63 6c 61 75 73 65 20  a HAVING clause 
264c0 69 73 20 61 6c 73 6f 20 68 61 72 6d 6c 65 73 73  is also harmless
264d0 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 73 6f  .**           so
264e0 20 74 68 65 72 65 20 64 6f 65 73 20 6e 6f 74 20   there does not 
264f0 61 70 70 65 61 72 20 74 6f 20 62 65 20 61 6e 79  appear to be any
26500 20 72 65 61 73 6f 6e 20 74 6f 20 61 64 64 20 65   reason to add e
26510 78 74 72 61 20 6c 6f 67 69 63 0a 2a 2a 20 20 20  xtra logic.**   
26520 20 20 20 20 20 20 20 20 74 6f 20 73 75 70 70 72          to suppr
26530 65 73 73 20 69 74 2e 20 2a 2a 29 0a 2a 2a 0a 2a  ess it. **).**.*
26540 2a 20 20 20 28 32 29 20 54 68 65 20 69 6e 6e 65  *   (2) The inne
26550 72 20 71 75 65 72 79 20 69 73 20 74 68 65 20 72  r query is the r
26560 65 63 75 72 73 69 76 65 20 70 61 72 74 20 6f 66  ecursive part of
26570 20 61 20 63 6f 6d 6d 6f 6e 20 74 61 62 6c 65 20   a common table 
26580 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 0a 2a  expression..**.*
26590 2a 20 20 20 28 33 29 20 54 68 65 20 69 6e 6e 65  *   (3) The inne
265a0 72 20 71 75 65 72 79 20 68 61 73 20 61 20 4c 49  r query has a LI
265b0 4d 49 54 20 63 6c 61 75 73 65 20 28 73 69 6e 63  MIT clause (sinc
265c0 65 20 74 68 65 20 63 68 61 6e 67 65 73 20 74 6f  e the changes to
265d0 20 74 68 65 20 57 48 45 52 45 0a 2a 2a 20 20 20   the WHERE.**   
265e0 20 20 20 20 63 6c 61 75 73 65 20 77 6f 75 6c 64      clause would
265f0 20 63 68 61 6e 67 65 20 74 68 65 20 6d 65 61 6e   change the mean
26600 69 6e 67 20 6f 66 20 74 68 65 20 4c 49 4d 49 54  ing of the LIMIT
26610 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 34 29 20 54  )..**.**   (4) T
26620 68 65 20 69 6e 6e 65 72 20 71 75 65 72 79 20 69  he inner query i
26630 73 20 74 68 65 20 72 69 67 68 74 20 6f 70 65 72  s the right oper
26640 61 6e 64 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f  and of a LEFT JO
26650 49 4e 20 61 6e 64 20 74 68 65 0a 2a 2a 20 20 20  IN and the.**   
26660 20 20 20 20 65 78 70 72 65 73 73 69 6f 6e 20 74      expression t
26670 6f 20 62 65 20 70 75 73 68 65 64 20 64 6f 77 6e  o be pushed down
26680 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6d 65 20 66   does not come f
26690 72 6f 6d 20 74 68 65 20 4f 4e 20 63 6c 61 75 73  rom the ON claus
266a0 65 0a 2a 2a 20 20 20 20 20 20 20 6f 6e 20 74 68  e.**       on th
266b0 61 74 20 4c 45 46 54 20 4a 4f 49 4e 2e 0a 2a 2a  at LEFT JOIN..**
266c0 0a 2a 2a 20 20 20 28 35 29 20 54 68 65 20 57 48  .**   (5) The WH
266d0 45 52 45 20 63 6c 61 75 73 65 20 65 78 70 72 65  ERE clause expre
266e0 73 73 69 6f 6e 20 6f 72 69 67 69 6e 61 74 65 73  ssion originates
266f0 20 69 6e 20 74 68 65 20 4f 4e 20 6f 72 20 55 53   in the ON or US
26700 49 4e 47 20 63 6c 61 75 73 65 0a 2a 2a 20 20 20  ING clause.**   
26710 20 20 20 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f      of a LEFT JO
26720 49 4e 20 77 68 65 72 65 20 69 43 75 72 73 6f 72  IN where iCursor
26730 20 69 73 20 6e 6f 74 20 74 68 65 20 72 69 67 68   is not the righ
26740 74 2d 68 61 6e 64 20 74 61 62 6c 65 20 6f 66 20  t-hand table of 
26750 74 68 61 74 0a 2a 2a 20 20 20 20 20 20 20 6c 65  that.**       le
26760 66 74 20 6a 6f 69 6e 2e 20 20 41 6e 20 65 78 61  ft join.  An exa
26770 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  mple:.**.**     
26780 20 20 20 20 20 20 53 45 4c 45 43 54 20 2a 0a 2a        SELECT *.*
26790 2a 20 20 20 20 20 20 20 20 20 20 20 46 52 4f 4d  *           FROM
267a0 20 28 53 45 4c 45 43 54 20 31 20 41 53 20 61 31   (SELECT 1 AS a1
267b0 20 55 4e 49 4f 4e 20 41 4c 4c 20 53 45 4c 45 43   UNION ALL SELEC
267c0 54 20 32 29 20 41 53 20 61 61 0a 2a 2a 20 20 20  T 2) AS aa.**   
267d0 20 20 20 20 20 20 20 20 4a 4f 49 4e 20 28 53 45          JOIN (SE
267e0 4c 45 43 54 20 31 20 41 53 20 62 32 20 55 4e 49  LECT 1 AS b2 UNI
267f0 4f 4e 20 41 4c 4c 20 53 45 4c 45 43 54 20 32 29  ON ALL SELECT 2)
26800 20 41 53 20 62 62 20 4f 4e 20 28 61 31 3d 62 32   AS bb ON (a1=b2
26810 29 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 4c  ).**           L
26820 45 46 54 20 4a 4f 49 4e 20 28 53 45 4c 45 43 54  EFT JOIN (SELECT
26830 20 38 20 41 53 20 63 33 20 55 4e 49 4f 4e 20 41   8 AS c3 UNION A
26840 4c 4c 20 53 45 4c 45 43 54 20 39 29 20 41 53 20  LL SELECT 9) AS 
26850 63 63 20 4f 4e 20 28 62 32 3d 32 29 3b 0a 2a 2a  cc ON (b2=2);.**
26860 0a 2a 2a 20 20 20 20 20 20 20 54 68 65 20 63 6f  .**       The co
26870 72 72 65 63 74 20 61 6e 73 77 65 72 20 69 73 20  rrect answer is 
26880 74 68 72 65 65 20 72 6f 77 73 3a 20 20 28 31 2c  three rows:  (1,
26890 31 2c 4e 55 4c 4c 29 2c 28 32 2c 32 2c 38 29 2c  1,NULL),(2,2,8),
268a0 28 32 2c 32 2c 39 29 2e 0a 2a 2a 20 20 20 20 20  (2,2,9)..**     
268b0 20 20 42 75 74 20 69 66 20 74 68 65 20 28 62 32    But if the (b2
268c0 3d 32 29 20 74 65 72 6d 20 77 65 72 65 20 74 6f  =2) term were to
268d0 20 62 65 20 70 75 73 68 65 64 20 64 6f 77 6e 20   be pushed down 
268e0 69 6e 74 6f 20 74 68 65 20 62 62 20 73 75 62 71  into the bb subq
268f0 75 65 72 79 2c 0a 2a 2a 20 20 20 20 20 20 20 74  uery,.**       t
26900 68 65 6e 20 74 68 65 20 28 31 2c 31 2c 4e 55 4c  hen the (1,1,NUL
26910 4c 29 20 72 6f 77 20 77 6f 75 6c 64 20 62 65 20  L) row would be 
26920 73 75 70 70 72 65 73 73 65 64 2e 0a 2a 2a 0a 2a  suppressed..**.*
26930 2a 20 20 20 28 36 29 20 54 68 65 20 69 6e 6e 65  *   (6) The inne
26940 72 20 71 75 65 72 79 20 66 65 61 74 75 72 65 73  r query features
26950 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 77 69 6e   one or more win
26960 64 6f 77 2d 66 75 6e 63 74 69 6f 6e 73 20 28 73  dow-functions (s
26970 69 6e 63 65 20 0a 2a 2a 20 20 20 20 20 20 20 63  ince .**       c
26980 68 61 6e 67 65 73 20 74 6f 20 74 68 65 20 57 48  hanges to the WH
26990 45 52 45 20 63 6c 61 75 73 65 20 6f 66 20 74 68  ERE clause of th
269a0 65 20 69 6e 6e 65 72 20 71 75 65 72 79 20 63 6f  e inner query co
269b0 75 6c 64 20 63 68 61 6e 67 65 20 74 68 65 20 0a  uld change the .
269c0 2a 2a 20 20 20 20 20 20 20 77 69 6e 64 6f 77 20  **       window 
269d0 6f 76 65 72 20 77 68 69 63 68 20 77 69 6e 64 6f  over which windo
269e0 77 20 66 75 6e 63 74 69 6f 6e 73 20 61 72 65 20  w functions are 
269f0 63 61 6c 63 75 6c 61 74 65 64 29 2e 0a 2a 2a 0a  calculated)..**.
26a00 2a 2a 20 52 65 74 75 72 6e 20 30 20 69 66 20 6e  ** Return 0 if n
26a10 6f 20 63 68 61 6e 67 65 73 20 61 72 65 20 6d 61  o changes are ma
26a20 64 65 20 61 6e 64 20 6e 6f 6e 2d 7a 65 72 6f 20  de and non-zero 
26a30 69 66 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 57  if one or more W
26a40 48 45 52 45 20 63 6c 61 75 73 65 0a 2a 2a 20 74  HERE clause.** t
26a50 65 72 6d 73 20 61 72 65 20 64 75 70 6c 69 63 61  erms are duplica
26a60 74 65 64 20 69 6e 74 6f 20 74 68 65 20 73 75 62  ted into the sub
26a70 71 75 65 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63  query..*/.static
26a80 20 69 6e 74 20 70 75 73 68 44 6f 77 6e 57 68 65   int pushDownWhe
26a90 72 65 54 65 72 6d 73 28 0a 20 20 50 61 72 73 65  reTerms(.  Parse
26aa0 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
26ab0 20 2f 2a 20 50 61 72 73 65 20 63 6f 6e 74 65 78   /* Parse contex
26ac0 74 20 28 66 6f 72 20 6d 61 6c 6c 6f 63 28 29 20  t (for malloc() 
26ad0 61 6e 64 20 65 72 72 6f 72 20 72 65 70 6f 72 74  and error report
26ae0 69 6e 67 29 20 2a 2f 0a 20 20 53 65 6c 65 63 74  ing) */.  Select
26af0 20 2a 70 53 75 62 71 2c 20 20 20 20 20 20 20 20   *pSubq,        
26b00 2f 2a 20 54 68 65 20 73 75 62 71 75 65 72 79 20  /* The subquery 
26b10 77 68 6f 73 65 20 57 48 45 52 45 20 63 6c 61 75  whose WHERE clau
26b20 73 65 20 69 73 20 74 6f 20 62 65 20 61 75 67 6d  se is to be augm
26b30 65 6e 74 65 64 20 2a 2f 0a 20 20 45 78 70 72 20  ented */.  Expr 
26b40 2a 70 57 68 65 72 65 2c 20 20 20 20 20 20 20 20  *pWhere,        
26b50 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c   /* The WHERE cl
26b60 61 75 73 65 20 6f 66 20 74 68 65 20 6f 75 74 65  ause of the oute
26b70 72 20 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74  r query */.  int
26b80 20 69 43 75 72 73 6f 72 2c 20 20 20 20 20 20 20   iCursor,       
26b90 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6e 75 6d     /* Cursor num
26ba0 62 65 72 20 6f 66 20 74 68 65 20 73 75 62 71 75  ber of the subqu
26bb0 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20 69 73 4c  ery */.  int isL
26bc0 65 66 74 4a 6f 69 6e 20 20 20 20 20 20 20 20 2f  eftJoin        /
26bd0 2a 20 54 72 75 65 20 69 66 20 70 53 75 62 71 20  * True if pSubq 
26be0 69 73 20 74 68 65 20 72 69 67 68 74 20 74 65 72  is the right ter
26bf0 6d 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e  m of a LEFT JOIN
26c00 20 2a 2f 0a 29 7b 0a 20 20 45 78 70 72 20 2a 70   */.){.  Expr *p
26c10 4e 65 77 3b 0a 20 20 69 6e 74 20 6e 43 68 6e 67  New;.  int nChng
26c20 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 57 68 65   = 0;.  if( pWhe
26c30 72 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  re==0 ) return 0
26c40 3b 0a 20 20 69 66 28 20 70 53 75 62 71 2d 3e 73  ;.  if( pSubq->s
26c50 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 52 65 63  elFlags & SF_Rec
26c60 75 72 73 69 76 65 20 29 20 72 65 74 75 72 6e 20  ursive ) return 
26c70 30 3b 20 20 2f 2a 20 72 65 73 74 72 69 63 74 69  0;  /* restricti
26c80 6f 6e 20 28 32 29 20 2a 2f 0a 0a 23 69 66 6e 64  on (2) */..#ifnd
26c90 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57  ef SQLITE_OMIT_W
26ca0 49 4e 44 4f 57 46 55 4e 43 0a 20 20 69 66 28 20  INDOWFUNC.  if( 
26cb0 70 53 75 62 71 2d 3e 70 57 69 6e 20 29 20 72 65  pSubq->pWin ) re
26cc0 74 75 72 6e 20 30 3b 20 20 20 20 2f 2a 20 72 65  turn 0;    /* re
26cd0 73 74 72 69 63 74 69 6f 6e 20 28 36 29 20 2a 2f  striction (6) */
26ce0 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20  .#endif..#ifdef 
26cf0 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 2f  SQLITE_DEBUG.  /
26d00 2a 20 4f 6e 6c 79 20 74 68 65 20 66 69 72 73 74  * Only the first
26d10 20 74 65 72 6d 20 6f 66 20 61 20 63 6f 6d 70 6f   term of a compo
26d20 75 6e 64 20 63 61 6e 20 68 61 76 65 20 61 20 57  und can have a W
26d30 49 54 48 20 63 6c 61 75 73 65 2e 20 20 42 75 74  ITH clause.  But
26d40 20 6d 61 6b 65 0a 20 20 2a 2a 20 73 75 72 65 20   make.  ** sure 
26d50 6e 6f 20 6f 74 68 65 72 20 74 65 72 6d 73 20 61  no other terms a
26d60 72 65 20 6d 61 72 6b 65 64 20 53 46 5f 52 65 63  re marked SF_Rec
26d70 75 72 73 69 76 65 20 69 6e 20 63 61 73 65 20 73  ursive in case s
26d80 6f 6d 65 74 68 69 6e 67 20 63 68 61 6e 67 65 73  omething changes
26d90 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20 66 75 74  .  ** in the fut
26da0 75 72 65 2e 0a 20 20 2a 2f 0a 20 20 7b 0a 20 20  ure..  */.  {.  
26db0 20 20 53 65 6c 65 63 74 20 2a 70 58 3b 20 20 0a    Select *pX;  .
26dc0 20 20 20 20 66 6f 72 28 70 58 3d 70 53 75 62 71      for(pX=pSubq
26dd0 3b 20 70 58 3b 20 70 58 3d 70 58 2d 3e 70 50 72  ; pX; pX=pX->pPr
26de0 69 6f 72 29 7b 0a 20 20 20 20 20 20 61 73 73 65  ior){.      asse
26df0 72 74 28 20 28 70 58 2d 3e 73 65 6c 46 6c 61 67  rt( (pX->selFlag
26e00 73 20 26 20 28 53 46 5f 52 65 63 75 72 73 69 76  s & (SF_Recursiv
26e10 65 29 29 3d 3d 30 20 29 3b 0a 20 20 20 20 7d 0a  e))==0 );.    }.
26e20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66    }.#endif..  if
26e30 28 20 70 53 75 62 71 2d 3e 70 4c 69 6d 69 74 21  ( pSubq->pLimit!
26e40 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
26e50 20 30 3b 20 2f 2a 20 72 65 73 74 72 69 63 74 69   0; /* restricti
26e60 6f 6e 20 28 33 29 20 2a 2f 0a 20 20 7d 0a 20 20  on (3) */.  }.  
26e70 77 68 69 6c 65 28 20 70 57 68 65 72 65 2d 3e 6f  while( pWhere->o
26e80 70 3d 3d 54 4b 5f 41 4e 44 20 29 7b 0a 20 20 20  p==TK_AND ){.   
26e90 20 6e 43 68 6e 67 20 2b 3d 20 70 75 73 68 44 6f   nChng += pushDo
26ea0 77 6e 57 68 65 72 65 54 65 72 6d 73 28 70 50 61  wnWhereTerms(pPa
26eb0 72 73 65 2c 20 70 53 75 62 71 2c 20 70 57 68 65  rse, pSubq, pWhe
26ec0 72 65 2d 3e 70 52 69 67 68 74 2c 0a 20 20 20 20  re->pRight,.    
26ed0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26ee0 20 20 20 20 20 20 20 20 20 20 20 20 69 43 75 72              iCur
26ef0 73 6f 72 2c 20 69 73 4c 65 66 74 4a 6f 69 6e 29  sor, isLeftJoin)
26f00 3b 0a 20 20 20 20 70 57 68 65 72 65 20 3d 20 70  ;.    pWhere = p
26f10 57 68 65 72 65 2d 3e 70 4c 65 66 74 3b 0a 20 20  Where->pLeft;.  
26f20 7d 0a 20 20 69 66 28 20 69 73 4c 65 66 74 4a 6f  }.  if( isLeftJo
26f30 69 6e 0a 20 20 20 26 26 20 28 45 78 70 72 48 61  in.   && (ExprHa
26f40 73 50 72 6f 70 65 72 74 79 28 70 57 68 65 72 65  sProperty(pWhere
26f50 2c 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 3d 3d 30  ,EP_FromJoin)==0
26f60 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 70 57 68  .         || pWh
26f70 65 72 65 2d 3e 69 52 69 67 68 74 4a 6f 69 6e 54  ere->iRightJoinT
26f80 61 62 6c 65 21 3d 69 43 75 72 73 6f 72 29 0a 20  able!=iCursor). 
26f90 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
26fa0 3b 20 2f 2a 20 72 65 73 74 72 69 63 74 69 6f 6e  ; /* restriction
26fb0 20 28 34 29 20 2a 2f 0a 20 20 7d 0a 20 20 69 66   (4) */.  }.  if
26fc0 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  ( ExprHasPropert
26fd0 79 28 70 57 68 65 72 65 2c 45 50 5f 46 72 6f 6d  y(pWhere,EP_From
26fe0 4a 6f 69 6e 29 20 26 26 20 70 57 68 65 72 65 2d  Join) && pWhere-
26ff0 3e 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65  >iRightJoinTable
27000 21 3d 69 43 75 72 73 6f 72 20 29 7b 0a 20 20 20  !=iCursor ){.   
27010 20 72 65 74 75 72 6e 20 30 3b 20 2f 2a 20 72 65   return 0; /* re
27020 73 74 72 69 63 74 69 6f 6e 20 28 35 29 20 2a 2f  striction (5) */
27030 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c 69 74  .  }.  if( sqlit
27040 65 33 45 78 70 72 49 73 54 61 62 6c 65 43 6f 6e  e3ExprIsTableCon
27050 73 74 61 6e 74 28 70 57 68 65 72 65 2c 20 69 43  stant(pWhere, iC
27060 75 72 73 6f 72 29 20 29 7b 0a 20 20 20 20 6e 43  ursor) ){.    nC
27070 68 6e 67 2b 2b 3b 0a 20 20 20 20 77 68 69 6c 65  hng++;.    while
27080 28 20 70 53 75 62 71 20 29 7b 0a 20 20 20 20 20  ( pSubq ){.     
27090 20 53 75 62 73 74 43 6f 6e 74 65 78 74 20 78 3b   SubstContext x;
270a0 0a 20 20 20 20 20 20 70 4e 65 77 20 3d 20 73 71  .      pNew = sq
270b0 6c 69 74 65 33 45 78 70 72 44 75 70 28 70 50 61  lite3ExprDup(pPa
270c0 72 73 65 2d 3e 64 62 2c 20 70 57 68 65 72 65 2c  rse->db, pWhere,
270d0 20 30 29 3b 0a 20 20 20 20 20 20 75 6e 73 65 74   0);.      unset
270e0 4a 6f 69 6e 45 78 70 72 28 70 4e 65 77 2c 20 2d  JoinExpr(pNew, -
270f0 31 29 3b 0a 20 20 20 20 20 20 78 2e 70 50 61 72  1);.      x.pPar
27100 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20 20  se = pParse;.   
27110 20 20 20 78 2e 69 54 61 62 6c 65 20 3d 20 69 43     x.iTable = iC
27120 75 72 73 6f 72 3b 0a 20 20 20 20 20 20 78 2e 69  ursor;.      x.i
27130 4e 65 77 54 61 62 6c 65 20 3d 20 69 43 75 72 73  NewTable = iCurs
27140 6f 72 3b 0a 20 20 20 20 20 20 78 2e 69 73 4c 65  or;.      x.isLe
27150 66 74 4a 6f 69 6e 20 3d 20 30 3b 0a 20 20 20 20  ftJoin = 0;.    
27160 20 20 78 2e 70 45 4c 69 73 74 20 3d 20 70 53 75    x.pEList = pSu
27170 62 71 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 20 20  bq->pEList;.    
27180 20 20 70 4e 65 77 20 3d 20 73 75 62 73 74 45 78    pNew = substEx
27190 70 72 28 26 78 2c 20 70 4e 65 77 29 3b 0a 20 20  pr(&x, pNew);.  
271a0 20 20 20 20 69 66 28 20 70 53 75 62 71 2d 3e 73      if( pSubq->s
271b0 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 41 67 67  elFlags & SF_Agg
271c0 72 65 67 61 74 65 20 29 7b 0a 20 20 20 20 20 20  regate ){.      
271d0 20 20 70 53 75 62 71 2d 3e 70 48 61 76 69 6e 67    pSubq->pHaving
271e0 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e   = sqlite3ExprAn
271f0 64 28 70 50 61 72 73 65 2c 20 70 53 75 62 71 2d  d(pParse, pSubq-
27200 3e 70 48 61 76 69 6e 67 2c 20 70 4e 65 77 29 3b  >pHaving, pNew);
27210 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
27220 20 20 20 20 20 20 70 53 75 62 71 2d 3e 70 57 68        pSubq->pWh
27230 65 72 65 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ere = sqlite3Exp
27240 72 41 6e 64 28 70 50 61 72 73 65 2c 20 70 53 75  rAnd(pParse, pSu
27250 62 71 2d 3e 70 57 68 65 72 65 2c 20 70 4e 65 77  bq->pWhere, pNew
27260 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
27270 20 70 53 75 62 71 20 3d 20 70 53 75 62 71 2d 3e   pSubq = pSubq->
27280 70 50 72 69 6f 72 3b 0a 20 20 20 20 7d 0a 20 20  pPrior;.    }.  
27290 7d 0a 20 20 72 65 74 75 72 6e 20 6e 43 68 6e 67  }.  return nChng
272a0 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64  ;.}.#endif /* !d
272b0 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
272c0 49 54 5f 53 55 42 51 55 45 52 59 29 20 7c 7c 20  IT_SUBQUERY) || 
272d0 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
272e0 4f 4d 49 54 5f 56 49 45 57 29 20 2a 2f 0a 0a 2f  OMIT_VIEW) */../
272f0 2a 0a 2a 2a 20 54 68 65 20 70 46 75 6e 63 20 69  *.** The pFunc i
27300 73 20 74 68 65 20 6f 6e 6c 79 20 61 67 67 72 65  s the only aggre
27310 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 20 69 6e  gate function in
27320 20 74 68 65 20 71 75 65 72 79 2e 20 20 43 68 65   the query.  Che
27330 63 6b 20 74 6f 20 73 65 65 0a 2a 2a 20 69 66 20  ck to see.** if 
27340 74 68 65 20 71 75 65 72 79 20 69 73 20 61 20 63  the query is a c
27350 61 6e 64 69 64 61 74 65 20 66 6f 72 20 74 68 65  andidate for the
27360 20 6d 69 6e 2f 6d 61 78 20 6f 70 74 69 6d 69 7a   min/max optimiz
27370 61 74 69 6f 6e 2e 20 0a 2a 2a 0a 2a 2a 20 49 66  ation. .**.** If
27380 20 74 68 65 20 71 75 65 72 79 20 69 73 20 61 20   the query is a 
27390 63 61 6e 64 69 64 61 74 65 20 66 6f 72 20 74 68  candidate for th
273a0 65 20 6d 69 6e 2f 6d 61 78 20 6f 70 74 69 6d 69  e min/max optimi
273b0 7a 61 74 69 6f 6e 2c 20 74 68 65 6e 20 73 65 74  zation, then set
273c0 0a 2a 2a 20 2a 70 70 4d 69 6e 4d 61 78 20 74 6f  .** *ppMinMax to
273d0 20 62 65 20 61 6e 20 4f 52 44 45 52 20 42 59 20   be an ORDER BY 
273e0 63 6c 61 75 73 65 20 74 6f 20 62 65 20 75 73 65  clause to be use
273f0 64 20 66 6f 72 20 74 68 65 20 6f 70 74 69 6d 69  d for the optimi
27400 7a 61 74 69 6f 6e 0a 2a 2a 20 61 6e 64 20 72 65  zation.** and re
27410 74 75 72 6e 20 65 69 74 68 65 72 20 57 48 45 52  turn either WHER
27420 45 5f 4f 52 44 45 52 42 59 5f 4d 49 4e 20 6f 72  E_ORDERBY_MIN or
27430 20 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d   WHERE_ORDERBY_M
27440 41 58 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 0a  AX depending on.
27450 2a 2a 20 77 68 65 74 68 65 72 20 70 46 75 6e 63  ** whether pFunc
27460 20 69 73 20 61 20 6d 69 6e 28 29 20 6f 72 20 6d   is a min() or m
27470 61 78 28 29 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a  ax() function..*
27480 2a 0a 2a 2a 20 49 66 20 74 68 65 20 71 75 65 72  *.** If the quer
27490 79 20 69 73 20 6e 6f 74 20 61 20 63 61 6e 64 69  y is not a candi
274a0 64 61 74 65 20 66 6f 72 20 74 68 65 20 6d 69 6e  date for the min
274b0 2f 6d 61 78 20 6f 70 74 69 6d 69 7a 61 74 69 6f  /max optimizatio
274c0 6e 2c 20 72 65 74 75 72 6e 0a 2a 2a 20 57 48 45  n, return.** WHE
274d0 52 45 5f 4f 52 44 45 52 42 59 5f 4e 4f 52 4d 41  RE_ORDERBY_NORMA
274e0 4c 20 28 77 68 69 63 68 20 6d 75 73 74 20 62 65  L (which must be
274f0 20 7a 65 72 6f 29 2e 0a 2a 2a 0a 2a 2a 20 54 68   zero)..**.** Th
27500 69 73 20 72 6f 75 74 69 6e 65 20 6d 75 73 74 20  is routine must 
27510 62 65 20 63 61 6c 6c 65 64 20 61 66 74 65 72 20  be called after 
27520 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69  aggregate functi
27530 6f 6e 73 20 68 61 76 65 20 62 65 65 6e 0a 2a 2a  ons have been.**
27540 20 6c 6f 63 61 74 65 64 20 62 75 74 20 62 65 66   located but bef
27550 6f 72 65 20 74 68 65 69 72 20 61 72 67 75 6d 65  ore their argume
27560 6e 74 73 20 68 61 76 65 20 62 65 65 6e 20 73 75  nts have been su
27570 62 6a 65 63 74 65 64 20 74 6f 20 61 67 67 72 65  bjected to aggre
27580 67 61 74 65 0a 2a 2a 20 61 6e 61 6c 79 73 69 73  gate.** analysis
27590 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 38 20 6d  ..*/.static u8 m
275a0 69 6e 4d 61 78 51 75 65 72 79 28 73 71 6c 69 74  inMaxQuery(sqlit
275b0 65 33 20 2a 64 62 2c 20 45 78 70 72 20 2a 70 46  e3 *db, Expr *pF
275c0 75 6e 63 2c 20 45 78 70 72 4c 69 73 74 20 2a 2a  unc, ExprList **
275d0 70 70 4d 69 6e 4d 61 78 29 7b 0a 20 20 69 6e 74  ppMinMax){.  int
275e0 20 65 52 65 74 20 3d 20 57 48 45 52 45 5f 4f 52   eRet = WHERE_OR
275f0 44 45 52 42 59 5f 4e 4f 52 4d 41 4c 3b 20 20 20  DERBY_NORMAL;   
27600 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 76 61 6c     /* Return val
27610 75 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  ue */.  ExprList
27620 20 2a 70 45 4c 69 73 74 20 3d 20 70 46 75 6e 63   *pEList = pFunc
27630 2d 3e 78 2e 70 4c 69 73 74 3b 20 20 20 20 2f 2a  ->x.pList;    /*
27640 20 41 72 67 75 6d 65 6e 74 73 20 74 6f 20 61 67   Arguments to ag
27650 67 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20  g function */.  
27660 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 75 6e  const char *zFun
27670 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
27680 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
27690 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74   aggregate funct
276a0 69 6f 6e 20 70 46 75 6e 63 20 2a 2f 0a 20 20 45  ion pFunc */.  E
276b0 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42  xprList *pOrderB
276c0 79 3b 0a 20 20 75 38 20 73 6f 72 74 46 6c 61 67  y;.  u8 sortFlag
276d0 73 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 2a 70  s;..  assert( *p
276e0 70 4d 69 6e 4d 61 78 3d 3d 30 20 29 3b 0a 20 20  pMinMax==0 );.  
276f0 61 73 73 65 72 74 28 20 70 46 75 6e 63 2d 3e 6f  assert( pFunc->o
27700 70 3d 3d 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49  p==TK_AGG_FUNCTI
27710 4f 4e 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ON );.  assert( 
27720 21 49 73 57 69 6e 64 6f 77 46 75 6e 63 28 70 46  !IsWindowFunc(pF
27730 75 6e 63 29 20 29 3b 0a 20 20 69 66 28 20 70 45  unc) );.  if( pE
27740 4c 69 73 74 3d 3d 30 20 7c 7c 20 70 45 4c 69 73  List==0 || pELis
27750 74 2d 3e 6e 45 78 70 72 21 3d 31 20 7c 7c 20 45  t->nExpr!=1 || E
27760 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
27770 46 75 6e 63 2c 20 45 50 5f 57 69 6e 46 75 6e 63  Func, EP_WinFunc
27780 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
27790 65 52 65 74 3b 0a 20 20 7d 0a 20 20 7a 46 75 6e  eRet;.  }.  zFun
277a0 63 20 3d 20 70 46 75 6e 63 2d 3e 75 2e 7a 54 6f  c = pFunc->u.zTo
277b0 6b 65 6e 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  ken;.  if( sqlit
277c0 65 33 53 74 72 49 43 6d 70 28 7a 46 75 6e 63 2c  e3StrICmp(zFunc,
277d0 20 22 6d 69 6e 22 29 3d 3d 30 20 29 7b 0a 20 20   "min")==0 ){.  
277e0 20 20 65 52 65 74 20 3d 20 57 48 45 52 45 5f 4f    eRet = WHERE_O
277f0 52 44 45 52 42 59 5f 4d 49 4e 3b 0a 20 20 20 20  RDERBY_MIN;.    
27800 73 6f 72 74 46 6c 61 67 73 20 3d 20 4b 45 59 49  sortFlags = KEYI
27810 4e 46 4f 5f 4f 52 44 45 52 5f 42 49 47 4e 55 4c  NFO_ORDER_BIGNUL
27820 4c 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 73  L;.  }else if( s
27830 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 46  qlite3StrICmp(zF
27840 75 6e 63 2c 20 22 6d 61 78 22 29 3d 3d 30 20 29  unc, "max")==0 )
27850 7b 0a 20 20 20 20 65 52 65 74 20 3d 20 57 48 45  {.    eRet = WHE
27860 52 45 5f 4f 52 44 45 52 42 59 5f 4d 41 58 3b 0a  RE_ORDERBY_MAX;.
27870 20 20 20 20 73 6f 72 74 46 6c 61 67 73 20 3d 20      sortFlags = 
27880 4b 45 59 49 4e 46 4f 5f 4f 52 44 45 52 5f 44 45  KEYINFO_ORDER_DE
27890 53 43 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  SC;.  }else{.   
278a0 20 72 65 74 75 72 6e 20 65 52 65 74 3b 0a 20 20   return eRet;.  
278b0 7d 0a 20 20 2a 70 70 4d 69 6e 4d 61 78 20 3d 20  }.  *ppMinMax = 
278c0 70 4f 72 64 65 72 42 79 20 3d 20 73 71 6c 69 74  pOrderBy = sqlit
278d0 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 64 62  e3ExprListDup(db
278e0 2c 20 70 45 4c 69 73 74 2c 20 30 29 3b 0a 20 20  , pEList, 0);.  
278f0 61 73 73 65 72 74 28 20 70 4f 72 64 65 72 42 79  assert( pOrderBy
27900 21 3d 30 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f  !=0 || db->mallo
27910 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 69 66 28  cFailed );.  if(
27920 20 70 4f 72 64 65 72 42 79 20 29 20 70 4f 72 64   pOrderBy ) pOrd
27930 65 72 42 79 2d 3e 61 5b 30 5d 2e 73 6f 72 74 46  erBy->a[0].sortF
27940 6c 61 67 73 20 3d 20 73 6f 72 74 46 6c 61 67 73  lags = sortFlags
27950 3b 0a 20 20 72 65 74 75 72 6e 20 65 52 65 74 3b  ;.  return eRet;
27960 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 65  .}../*.** The se
27970 6c 65 63 74 20 73 74 61 74 65 6d 65 6e 74 20 70  lect statement p
27980 61 73 73 65 64 20 61 73 20 74 68 65 20 66 69 72  assed as the fir
27990 73 74 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61  st argument is a
279a0 6e 20 61 67 67 72 65 67 61 74 65 20 71 75 65 72  n aggregate quer
279b0 79 2e 0a 2a 2a 20 54 68 65 20 73 65 63 6f 6e 64  y..** The second
279c0 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74 68 65   argument is the
279d0 20 61 73 73 6f 63 69 61 74 65 64 20 61 67 67 72   associated aggr
279e0 65 67 61 74 65 2d 69 6e 66 6f 20 6f 62 6a 65 63  egate-info objec
279f0 74 2e 20 54 68 69 73 20 0a 2a 2a 20 66 75 6e 63  t. This .** func
27a00 74 69 6f 6e 20 74 65 73 74 73 20 69 66 20 74 68  tion tests if th
27a10 65 20 53 45 4c 45 43 54 20 69 73 20 6f 66 20 74  e SELECT is of t
27a20 68 65 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20  he form:.**.**  
27a30 20 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29   SELECT count(*)
27a40 20 46 52 4f 4d 20 3c 74 62 6c 3e 0a 2a 2a 0a 2a   FROM <tbl>.**.*
27a50 2a 20 77 68 65 72 65 20 74 61 62 6c 65 20 69 73  * where table is
27a60 20 61 20 64 61 74 61 62 61 73 65 20 74 61 62 6c   a database tabl
27a70 65 2c 20 6e 6f 74 20 61 20 73 75 62 2d 73 65 6c  e, not a sub-sel
27a80 65 63 74 20 6f 72 20 76 69 65 77 2e 20 49 66 20  ect or view. If 
27a90 74 68 65 20 71 75 65 72 79 0a 2a 2a 20 64 6f 65  the query.** doe
27aa0 73 20 6d 61 74 63 68 20 74 68 69 73 20 70 61 74  s match this pat
27ab0 74 65 72 6e 2c 20 74 68 65 6e 20 61 20 70 6f 69  tern, then a poi
27ac0 6e 74 65 72 20 74 6f 20 74 68 65 20 54 61 62 6c  nter to the Tabl
27ad0 65 20 6f 62 6a 65 63 74 20 72 65 70 72 65 73 65  e object represe
27ae0 6e 74 69 6e 67 0a 2a 2a 20 3c 74 62 6c 3e 20 69  nting.** <tbl> i
27af0 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65  s returned. Othe
27b00 72 77 69 73 65 2c 20 30 20 69 73 20 72 65 74 75  rwise, 0 is retu
27b10 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rned..*/.static 
27b20 54 61 62 6c 65 20 2a 69 73 53 69 6d 70 6c 65 43  Table *isSimpleC
27b30 6f 75 6e 74 28 53 65 6c 65 63 74 20 2a 70 2c 20  ount(Select *p, 
27b40 41 67 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66  AggInfo *pAggInf
27b50 6f 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61  o){.  Table *pTa
27b60 62 3b 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72  b;.  Expr *pExpr
27b70 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 21 70 2d  ;..  assert( !p-
27b80 3e 70 47 72 6f 75 70 42 79 20 29 3b 0a 0a 20 20  >pGroupBy );..  
27b90 69 66 28 20 70 2d 3e 70 57 68 65 72 65 20 7c 7c  if( p->pWhere ||
27ba0 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70   p->pEList->nExp
27bb0 72 21 3d 31 20 0a 20 20 20 7c 7c 20 70 2d 3e 70  r!=1 .   || p->p
27bc0 53 72 63 2d 3e 6e 53 72 63 21 3d 31 20 7c 7c 20  Src->nSrc!=1 || 
27bd0 70 2d 3e 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 53  p->pSrc->a[0].pS
27be0 65 6c 65 63 74 0a 20 20 29 7b 0a 20 20 20 20 72  elect.  ){.    r
27bf0 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70  eturn 0;.  }.  p
27c00 54 61 62 20 3d 20 70 2d 3e 70 53 72 63 2d 3e 61  Tab = p->pSrc->a
27c10 5b 30 5d 2e 70 54 61 62 3b 0a 20 20 70 45 78 70  [0].pTab;.  pExp
27c20 72 20 3d 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 61  r = p->pEList->a
27c30 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20 61 73 73  [0].pExpr;.  ass
27c40 65 72 74 28 20 70 54 61 62 20 26 26 20 21 70 54  ert( pTab && !pT
27c50 61 62 2d 3e 70 53 65 6c 65 63 74 20 26 26 20 70  ab->pSelect && p
27c60 45 78 70 72 20 29 3b 0a 0a 20 20 69 66 28 20 49  Expr );..  if( I
27c70 73 56 69 72 74 75 61 6c 28 70 54 61 62 29 20 29  sVirtual(pTab) )
27c80 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28   return 0;.  if(
27c90 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 41   pExpr->op!=TK_A
27ca0 47 47 5f 46 55 4e 43 54 49 4f 4e 20 29 20 72 65  GG_FUNCTION ) re
27cb0 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 4e 45  turn 0;.  if( NE
27cc0 56 45 52 28 70 41 67 67 49 6e 66 6f 2d 3e 6e 46  VER(pAggInfo->nF
27cd0 75 6e 63 3d 3d 30 29 20 29 20 72 65 74 75 72 6e  unc==0) ) return
27ce0 20 30 3b 0a 20 20 69 66 28 20 28 70 41 67 67 49   0;.  if( (pAggI
27cf0 6e 66 6f 2d 3e 61 46 75 6e 63 5b 30 5d 2e 70 46  nfo->aFunc[0].pF
27d00 75 6e 63 2d 3e 66 75 6e 63 46 6c 61 67 73 26 53  unc->funcFlags&S
27d10 51 4c 49 54 45 5f 46 55 4e 43 5f 43 4f 55 4e 54  QLITE_FUNC_COUNT
27d20 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  )==0 ) return 0;
27d30 0a 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72  .  if( ExprHasPr
27d40 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
27d50 5f 44 69 73 74 69 6e 63 74 7c 45 50 5f 57 69 6e  _Distinct|EP_Win
27d60 46 75 6e 63 29 20 29 20 72 65 74 75 72 6e 20 30  Func) ) return 0
27d70 3b 0a 0a 20 20 72 65 74 75 72 6e 20 70 54 61 62  ;..  return pTab
27d80 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68  ;.}../*.** If th
27d90 65 20 73 6f 75 72 63 65 2d 6c 69 73 74 20 69 74  e source-list it
27da0 65 6d 20 70 61 73 73 65 64 20 61 73 20 61 6e 20  em passed as an 
27db0 61 72 67 75 6d 65 6e 74 20 77 61 73 20 61 75 67  argument was aug
27dc0 6d 65 6e 74 65 64 20 77 69 74 68 20 61 6e 0a 2a  mented with an.*
27dd0 2a 20 49 4e 44 45 58 45 44 20 42 59 20 63 6c 61  * INDEXED BY cla
27de0 75 73 65 2c 20 74 68 65 6e 20 74 72 79 20 74 6f  use, then try to
27df0 20 6c 6f 63 61 74 65 20 74 68 65 20 73 70 65 63   locate the spec
27e00 69 66 69 65 64 20 69 6e 64 65 78 2e 20 49 66 20  ified index. If 
27e10 74 68 65 72 65 0a 2a 2a 20 77 61 73 20 73 75 63  there.** was suc
27e20 68 20 61 20 63 6c 61 75 73 65 20 61 6e 64 20 74  h a clause and t
27e30 68 65 20 6e 61 6d 65 64 20 69 6e 64 65 78 20 63  he named index c
27e40 61 6e 6e 6f 74 20 62 65 20 66 6f 75 6e 64 2c 20  annot be found, 
27e50 72 65 74 75 72 6e 20 0a 2a 2a 20 53 51 4c 49 54  return .** SQLIT
27e60 45 5f 45 52 52 4f 52 20 61 6e 64 20 6c 65 61 76  E_ERROR and leav
27e70 65 20 61 6e 20 65 72 72 6f 72 20 69 6e 20 70 50  e an error in pP
27e80 61 72 73 65 2e 20 4f 74 68 65 72 77 69 73 65 2c  arse. Otherwise,
27e90 20 70 6f 70 75 6c 61 74 65 20 0a 2a 2a 20 70 46   populate .** pF
27ea0 72 6f 6d 2d 3e 70 49 6e 64 65 78 20 61 6e 64 20  rom->pIndex and 
27eb0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
27ec0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
27ed0 49 6e 64 65 78 65 64 42 79 4c 6f 6f 6b 75 70 28  IndexedByLookup(
27ee0 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 73  Parse *pParse, s
27ef0 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
27f00 65 6d 20 2a 70 46 72 6f 6d 29 7b 0a 20 20 69 66  em *pFrom){.  if
27f10 28 20 70 46 72 6f 6d 2d 3e 70 54 61 62 20 26 26  ( pFrom->pTab &&
27f20 20 70 46 72 6f 6d 2d 3e 66 67 2e 69 73 49 6e 64   pFrom->fg.isInd
27f30 65 78 65 64 42 79 20 29 7b 0a 20 20 20 20 54 61  exedBy ){.    Ta
27f40 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 46 72 6f  ble *pTab = pFro
27f50 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20 63 68 61  m->pTab;.    cha
27f60 72 20 2a 7a 49 6e 64 65 78 65 64 42 79 20 3d 20  r *zIndexedBy = 
27f70 70 46 72 6f 6d 2d 3e 75 31 2e 7a 49 6e 64 65 78  pFrom->u1.zIndex
27f80 65 64 42 79 3b 0a 20 20 20 20 49 6e 64 65 78 20  edBy;.    Index 
27f90 2a 70 49 64 78 3b 0a 20 20 20 20 66 6f 72 28 70  *pIdx;.    for(p
27fa0 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78  Idx=pTab->pIndex
27fb0 3b 20 0a 20 20 20 20 20 20 20 20 70 49 64 78 20  ; .        pIdx 
27fc0 26 26 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  && sqlite3StrICm
27fd0 70 28 70 49 64 78 2d 3e 7a 4e 61 6d 65 2c 20 7a  p(pIdx->zName, z
27fe0 49 6e 64 65 78 65 64 42 79 29 3b 20 0a 20 20 20  IndexedBy); .   
27ff0 20 20 20 20 20 70 49 64 78 3d 70 49 64 78 2d 3e       pIdx=pIdx->
28000 70 4e 65 78 74 0a 20 20 20 20 29 3b 0a 20 20 20  pNext.    );.   
28010 20 69 66 28 20 21 70 49 64 78 20 29 7b 0a 20 20   if( !pIdx ){.  
28020 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
28030 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6e 6f 20  Msg(pParse, "no 
28040 73 75 63 68 20 69 6e 64 65 78 3a 20 25 73 22 2c  such index: %s",
28050 20 7a 49 6e 64 65 78 65 64 42 79 2c 20 30 29 3b   zIndexedBy, 0);
28060 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 63  .      pParse->c
28070 68 65 63 6b 53 63 68 65 6d 61 20 3d 20 31 3b 0a  heckSchema = 1;.
28080 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
28090 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  ITE_ERROR;.    }
280a0 0a 20 20 20 20 70 46 72 6f 6d 2d 3e 70 49 42 49  .    pFrom->pIBI
280b0 6e 64 65 78 20 3d 20 70 49 64 78 3b 0a 20 20 7d  ndex = pIdx;.  }
280c0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
280d0 5f 4f 4b 3b 0a 7d 0a 2f 2a 0a 2a 2a 20 44 65 74  _OK;.}./*.** Det
280e0 65 63 74 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c  ect compound SEL
280f0 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73 20 74  ECT statements t
28100 68 61 74 20 75 73 65 20 61 6e 20 4f 52 44 45 52  hat use an ORDER
28110 20 42 59 20 63 6c 61 75 73 65 20 77 69 74 68 20   BY clause with 
28120 0a 2a 2a 20 61 6e 20 61 6c 74 65 72 6e 61 74 69  .** an alternati
28130 76 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71  ve collating seq
28140 75 65 6e 63 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  uence..**.**    
28150 53 45 4c 45 43 54 20 2e 2e 2e 20 46 52 4f 4d 20  SELECT ... FROM 
28160 74 31 20 45 58 43 45 50 54 20 53 45 4c 45 43 54  t1 EXCEPT SELECT
28170 20 2e 2e 2e 20 46 52 4f 4d 20 74 32 20 4f 52 44   ... FROM t2 ORD
28180 45 52 20 42 59 20 2e 2e 20 43 4f 4c 4c 41 54 45  ER BY .. COLLATE
28190 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 73 65   ....**.** These
281a0 20 61 72 65 20 72 65 77 72 69 74 74 65 6e 20 61   are rewritten a
281b0 73 20 61 20 73 75 62 71 75 65 72 79 3a 0a 2a 2a  s a subquery:.**
281c0 0a 2a 2a 20 20 20 20 53 45 4c 45 43 54 20 2a 20  .**    SELECT * 
281d0 46 52 4f 4d 20 28 53 45 4c 45 43 54 20 2e 2e 2e  FROM (SELECT ...
281e0 20 46 52 4f 4d 20 74 31 20 45 58 43 45 50 54 20   FROM t1 EXCEPT 
281f0 53 45 4c 45 43 54 20 2e 2e 2e 20 46 52 4f 4d 20  SELECT ... FROM 
28200 74 32 29 0a 2a 2a 20 20 20 20 20 4f 52 44 45 52  t2).**     ORDER
28210 20 42 59 20 2e 2e 2e 20 43 4f 4c 4c 41 54 45 20   BY ... COLLATE 
28220 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 74  ....**.** This t
28230 72 61 6e 73 66 6f 72 6d 61 74 69 6f 6e 20 69 73  ransformation is
28240 20 6e 65 63 65 73 73 61 72 79 20 62 65 63 61 75   necessary becau
28250 73 65 20 74 68 65 20 6d 75 6c 74 69 53 65 6c 65  se the multiSele
28260 63 74 4f 72 64 65 72 42 79 28 29 20 72 6f 75 74  ctOrderBy() rout
28270 69 6e 65 0a 2a 2a 20 61 62 6f 76 65 20 74 68 61  ine.** above tha
28280 74 20 67 65 6e 65 72 61 74 65 73 20 74 68 65 20  t generates the 
28290 63 6f 64 65 20 66 6f 72 20 61 20 63 6f 6d 70 6f  code for a compo
282a0 75 6e 64 20 53 45 4c 45 43 54 20 77 69 74 68 20  und SELECT with 
282b0 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  an ORDER BY clau
282c0 73 65 0a 2a 2a 20 75 73 65 73 20 61 20 6d 65 72  se.** uses a mer
282d0 67 65 20 61 6c 67 6f 72 69 74 68 6d 20 74 68 61  ge algorithm tha
282e0 74 20 72 65 71 75 69 72 65 73 20 74 68 65 20 73  t requires the s
282f0 61 6d 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65  ame collating se
28300 71 75 65 6e 63 65 20 6f 6e 20 74 68 65 0a 2a 2a  quence on the.**
28310 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20   result columns 
28320 61 73 20 6f 6e 20 74 68 65 20 4f 52 44 45 52 20  as on the ORDER 
28330 42 59 20 63 6c 61 75 73 65 2e 20 20 53 65 65 20  BY clause.  See 
28340 74 69 63 6b 65 74 0a 2a 2a 20 68 74 74 70 3a 2f  ticket.** http:/
28350 2f 77 77 77 2e 73 71 6c 69 74 65 2e 6f 72 67 2f  /www.sqlite.org/
28360 73 72 63 2f 69 6e 66 6f 2f 36 37 30 39 35 37 34  src/info/6709574
28370 64 32 61 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 74  d2a.**.** This t
28380 72 61 6e 73 66 6f 72 6d 61 74 69 6f 6e 20 69 73  ransformation is
28390 20 6f 6e 6c 79 20 6e 65 65 64 65 64 20 66 6f 72   only needed for
283a0 20 45 58 43 45 50 54 2c 20 49 4e 54 45 52 53 45   EXCEPT, INTERSE
283b0 43 54 2c 20 61 6e 64 20 55 4e 49 4f 4e 2e 0a 2a  CT, and UNION..*
283c0 2a 20 54 68 65 20 55 4e 49 4f 4e 20 41 4c 4c 20  * The UNION ALL 
283d0 6f 70 65 72 61 74 6f 72 20 77 6f 72 6b 73 20 66  operator works f
283e0 69 6e 65 20 77 69 74 68 20 6d 75 6c 74 69 53 65  ine with multiSe
283f0 6c 65 63 74 4f 72 64 65 72 42 79 28 29 20 65 76  lectOrderBy() ev
28400 65 6e 20 77 68 65 6e 0a 2a 2a 20 74 68 65 72 65  en when.** there
28410 20 61 72 65 20 43 4f 4c 4c 41 54 45 20 74 65 72   are COLLATE ter
28420 6d 73 20 69 6e 20 74 68 65 20 4f 52 44 45 52 20  ms in the ORDER 
28430 42 59 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  BY..*/.static in
28440 74 20 63 6f 6e 76 65 72 74 43 6f 6d 70 6f 75 6e  t convertCompoun
28450 64 53 65 6c 65 63 74 54 6f 53 75 62 71 75 65 72  dSelectToSubquer
28460 79 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65  y(Walker *pWalke
28470 72 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20  r, Select *p){. 
28480 20 69 6e 74 20 69 3b 0a 20 20 53 65 6c 65 63 74   int i;.  Select
28490 20 2a 70 4e 65 77 3b 0a 20 20 53 65 6c 65 63 74   *pNew;.  Select
284a0 20 2a 70 58 3b 0a 20 20 73 71 6c 69 74 65 33 20   *pX;.  sqlite3 
284b0 2a 64 62 3b 0a 20 20 73 74 72 75 63 74 20 45 78  *db;.  struct Ex
284c0 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 61 3b 0a  prList_item *a;.
284d0 20 20 53 72 63 4c 69 73 74 20 2a 70 4e 65 77 53    SrcList *pNewS
284e0 72 63 3b 0a 20 20 50 61 72 73 65 20 2a 70 50 61  rc;.  Parse *pPa
284f0 72 73 65 3b 0a 20 20 54 6f 6b 65 6e 20 64 75 6d  rse;.  Token dum
28500 6d 79 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 70 50  my;..  if( p->pP
28510 72 69 6f 72 3d 3d 30 20 29 20 72 65 74 75 72 6e  rior==0 ) return
28520 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20   WRC_Continue;. 
28530 20 69 66 28 20 70 2d 3e 70 4f 72 64 65 72 42 79   if( p->pOrderBy
28540 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 57 52 43  ==0 ) return WRC
28550 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20 20 66 6f 72  _Continue;.  for
28560 28 70 58 3d 70 3b 20 70 58 20 26 26 20 28 70 58  (pX=p; pX && (pX
28570 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 7c 7c 20  ->op==TK_ALL || 
28580 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43  pX->op==TK_SELEC
28590 54 29 3b 20 70 58 3d 70 58 2d 3e 70 50 72 69 6f  T); pX=pX->pPrio
285a0 72 29 7b 7d 0a 20 20 69 66 28 20 70 58 3d 3d 30  r){}.  if( pX==0
285b0 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f   ) return WRC_Co
285c0 6e 74 69 6e 75 65 3b 0a 20 20 61 20 3d 20 70 2d  ntinue;.  a = p-
285d0 3e 70 4f 72 64 65 72 42 79 2d 3e 61 3b 0a 20 20  >pOrderBy->a;.  
285e0 66 6f 72 28 69 3d 70 2d 3e 70 4f 72 64 65 72 42  for(i=p->pOrderB
285f0 79 2d 3e 6e 45 78 70 72 2d 31 3b 20 69 3e 3d 30  y->nExpr-1; i>=0
28600 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 69 66 28 20  ; i--){.    if( 
28610 61 5b 69 5d 2e 70 45 78 70 72 2d 3e 66 6c 61 67  a[i].pExpr->flag
28620 73 20 26 20 45 50 5f 43 6f 6c 6c 61 74 65 20 29  s & EP_Collate )
28630 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 69 66   break;.  }.  if
28640 28 20 69 3c 30 20 29 20 72 65 74 75 72 6e 20 57  ( i<0 ) return W
28650 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 0a 20 20  RC_Continue;..  
28660 2f 2a 20 49 66 20 77 65 20 72 65 61 63 68 20 74  /* If we reach t
28670 68 69 73 20 70 6f 69 6e 74 2c 20 74 68 61 74 20  his point, that 
28680 6d 65 61 6e 73 20 74 68 65 20 74 72 61 6e 73 66  means the transf
28690 6f 72 6d 61 74 69 6f 6e 20 69 73 20 72 65 71 75  ormation is requ
286a0 69 72 65 64 2e 20 2a 2f 0a 0a 20 20 70 50 61 72  ired. */..  pPar
286b0 73 65 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 70 50  se = pWalker->pP
286c0 61 72 73 65 3b 0a 20 20 64 62 20 3d 20 70 50 61  arse;.  db = pPa
286d0 72 73 65 2d 3e 64 62 3b 0a 20 20 70 4e 65 77 20  rse->db;.  pNew 
286e0 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
286f0 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66  cZero(db, sizeof
28700 28 2a 70 4e 65 77 29 20 29 3b 0a 20 20 69 66 28  (*pNew) );.  if(
28710 20 70 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72   pNew==0 ) retur
28720 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 6d  n WRC_Abort;.  m
28730 65 6d 73 65 74 28 26 64 75 6d 6d 79 2c 20 30 2c  emset(&dummy, 0,
28740 20 73 69 7a 65 6f 66 28 64 75 6d 6d 79 29 29 3b   sizeof(dummy));
28750 0a 20 20 70 4e 65 77 53 72 63 20 3d 20 73 71 6c  .  pNewSrc = sql
28760 69 74 65 33 53 72 63 4c 69 73 74 41 70 70 65 6e  ite3SrcListAppen
28770 64 46 72 6f 6d 54 65 72 6d 28 70 50 61 72 73 65  dFromTerm(pParse
28780 2c 30 2c 30 2c 30 2c 26 64 75 6d 6d 79 2c 70 4e  ,0,0,0,&dummy,pN
28790 65 77 2c 30 2c 30 29 3b 0a 20 20 69 66 28 20 70  ew,0,0);.  if( p
287a0 4e 65 77 53 72 63 3d 3d 30 20 29 20 72 65 74 75  NewSrc==0 ) retu
287b0 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20  rn WRC_Abort;.  
287c0 2a 70 4e 65 77 20 3d 20 2a 70 3b 0a 20 20 70 2d  *pNew = *p;.  p-
287d0 3e 70 53 72 63 20 3d 20 70 4e 65 77 53 72 63 3b  >pSrc = pNewSrc;
287e0 0a 20 20 70 2d 3e 70 45 4c 69 73 74 20 3d 20 73  .  p->pEList = s
287f0 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70  qlite3ExprListAp
28800 70 65 6e 64 28 70 50 61 72 73 65 2c 20 30 2c 20  pend(pParse, 0, 
28810 73 71 6c 69 74 65 33 45 78 70 72 28 64 62 2c 20  sqlite3Expr(db, 
28820 54 4b 5f 41 53 54 45 52 49 53 4b 2c 20 30 29 29  TK_ASTERISK, 0))
28830 3b 0a 20 20 70 2d 3e 6f 70 20 3d 20 54 4b 5f 53  ;.  p->op = TK_S
28840 45 4c 45 43 54 3b 0a 20 20 70 2d 3e 70 57 68 65  ELECT;.  p->pWhe
28850 72 65 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e  re = 0;.  pNew->
28860 70 47 72 6f 75 70 42 79 20 3d 20 30 3b 0a 20 20  pGroupBy = 0;.  
28870 70 4e 65 77 2d 3e 70 48 61 76 69 6e 67 20 3d 20  pNew->pHaving = 
28880 30 3b 0a 20 20 70 4e 65 77 2d 3e 70 4f 72 64 65  0;.  pNew->pOrde
28890 72 42 79 20 3d 20 30 3b 0a 20 20 70 2d 3e 70 50  rBy = 0;.  p->pP
288a0 72 69 6f 72 20 3d 20 30 3b 0a 20 20 70 2d 3e 70  rior = 0;.  p->p
288b0 4e 65 78 74 20 3d 20 30 3b 0a 20 20 70 2d 3e 70  Next = 0;.  p->p
288c0 57 69 74 68 20 3d 20 30 3b 0a 20 20 70 2d 3e 73  With = 0;.  p->s
288d0 65 6c 46 6c 61 67 73 20 26 3d 20 7e 53 46 5f 43  elFlags &= ~SF_C
288e0 6f 6d 70 6f 75 6e 64 3b 0a 20 20 61 73 73 65 72  ompound;.  asser
288f0 74 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20  t( (p->selFlags 
28900 26 20 53 46 5f 43 6f 6e 76 65 72 74 65 64 29 3d  & SF_Converted)=
28910 3d 30 20 29 3b 0a 20 20 70 2d 3e 73 65 6c 46 6c  =0 );.  p->selFl
28920 61 67 73 20 7c 3d 20 53 46 5f 43 6f 6e 76 65 72  ags |= SF_Conver
28930 74 65 64 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ted;.  assert( p
28940 4e 65 77 2d 3e 70 50 72 69 6f 72 21 3d 30 20 29  New->pPrior!=0 )
28950 3b 0a 20 20 70 4e 65 77 2d 3e 70 50 72 69 6f 72  ;.  pNew->pPrior
28960 2d 3e 70 4e 65 78 74 20 3d 20 70 4e 65 77 3b 0a  ->pNext = pNew;.
28970 20 20 70 4e 65 77 2d 3e 70 4c 69 6d 69 74 20 3d    pNew->pLimit =
28980 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 57 52 43   0;.  return WRC
28990 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a  _Continue;.}../*
289a0 0a 2a 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65  .** Check to see
289b0 20 69 66 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   if the FROM cla
289c0 75 73 65 20 74 65 72 6d 20 70 46 72 6f 6d 20 68  use term pFrom h
289d0 61 73 20 74 61 62 6c 65 2d 76 61 6c 75 65 64 20  as table-valued 
289e0 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 61 72 67 75  function.** argu
289f0 6d 65 6e 74 73 2e 20 20 49 66 20 69 74 20 64 6f  ments.  If it do
28a00 65 73 2c 20 6c 65 61 76 65 20 61 6e 20 65 72 72  es, leave an err
28a10 6f 72 20 6d 65 73 73 61 67 65 20 69 6e 20 70 50  or message in pP
28a20 61 72 73 65 20 61 6e 64 20 72 65 74 75 72 6e 0a  arse and return.
28a30 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 73 69 6e  ** non-zero, sin
28a40 63 65 20 70 46 72 6f 6d 20 69 73 20 6e 6f 74 20  ce pFrom is not 
28a50 61 6c 6c 6f 77 65 64 20 74 6f 20 62 65 20 61 20  allowed to be a 
28a60 74 61 62 6c 65 2d 76 61 6c 75 65 64 20 66 75 6e  table-valued fun
28a70 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ction..*/.static
28a80 20 69 6e 74 20 63 61 6e 6e 6f 74 42 65 46 75 6e   int cannotBeFun
28a90 63 74 69 6f 6e 28 50 61 72 73 65 20 2a 70 50 61  ction(Parse *pPa
28aa0 72 73 65 2c 20 73 74 72 75 63 74 20 53 72 63 4c  rse, struct SrcL
28ab0 69 73 74 5f 69 74 65 6d 20 2a 70 46 72 6f 6d 29  ist_item *pFrom)
28ac0 7b 0a 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e 66  {.  if( pFrom->f
28ad0 67 2e 69 73 54 61 62 46 75 6e 63 20 29 7b 0a 20  g.isTabFunc ){. 
28ae0 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
28af0 73 67 28 70 50 61 72 73 65 2c 20 22 27 25 73 27  sg(pParse, "'%s'
28b00 20 69 73 20 6e 6f 74 20 61 20 66 75 6e 63 74 69   is not a functi
28b10 6f 6e 22 2c 20 70 46 72 6f 6d 2d 3e 7a 4e 61 6d  on", pFrom->zNam
28b20 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31  e);.    return 1
28b30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  ;.  }.  return 0
28b40 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  ;.}..#ifndef SQL
28b50 49 54 45 5f 4f 4d 49 54 5f 43 54 45 0a 2f 2a 0a  ITE_OMIT_CTE./*.
28b60 2a 2a 20 41 72 67 75 6d 65 6e 74 20 70 57 69 74  ** Argument pWit
28b70 68 20 28 77 68 69 63 68 20 6d 61 79 20 62 65 20  h (which may be 
28b80 4e 55 4c 4c 29 20 70 6f 69 6e 74 73 20 74 6f 20  NULL) points to 
28b90 61 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66  a linked list of
28ba0 20 6e 65 73 74 65 64 20 0a 2a 2a 20 57 49 54 48   nested .** WITH
28bb0 20 63 6f 6e 74 65 78 74 73 2c 20 66 72 6f 6d 20   contexts, from 
28bc0 69 6e 6e 65 72 20 74 6f 20 6f 75 74 65 72 6d 6f  inner to outermo
28bd0 73 74 2e 20 49 66 20 74 68 65 20 74 61 62 6c 65  st. If the table
28be0 20 69 64 65 6e 74 69 66 69 65 64 20 62 79 20 0a   identified by .
28bf0 2a 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 65  ** FROM clause e
28c00 6c 65 6d 65 6e 74 20 70 49 74 65 6d 20 69 73 20  lement pItem is 
28c10 72 65 61 6c 6c 79 20 61 20 63 6f 6d 6d 6f 6e 2d  really a common-
28c20 74 61 62 6c 65 2d 65 78 70 72 65 73 73 69 6f 6e  table-expression
28c30 20 28 43 54 45 29 20 0a 2a 2a 20 74 68 65 6e 20   (CTE) .** then 
28c40 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  return a pointer
28c50 20 74 6f 20 74 68 65 20 43 54 45 20 64 65 66 69   to the CTE defi
28c60 6e 69 74 69 6f 6e 20 66 6f 72 20 74 68 61 74 20  nition for that 
28c70 74 61 62 6c 65 2e 20 4f 74 68 65 72 77 69 73 65  table. Otherwise
28c80 0a 2a 2a 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e  .** return NULL.
28c90 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 6e 6f 6e 2d  .**.** If a non-
28ca0 4e 55 4c 4c 20 76 61 6c 75 65 20 69 73 20 72 65  NULL value is re
28cb0 74 75 72 6e 65 64 2c 20 73 65 74 20 2a 70 70 43  turned, set *ppC
28cc0 6f 6e 74 65 78 74 20 74 6f 20 70 6f 69 6e 74 20  ontext to point 
28cd0 74 6f 20 74 68 65 20 57 69 74 68 0a 2a 2a 20 6f  to the With.** o
28ce0 62 6a 65 63 74 20 74 68 61 74 20 74 68 65 20 72  bject that the r
28cf0 65 74 75 72 6e 65 64 20 43 54 45 20 62 65 6c 6f  eturned CTE belo
28d00 6e 67 73 20 74 6f 2e 0a 2a 2f 0a 73 74 61 74 69  ngs to..*/.stati
28d10 63 20 73 74 72 75 63 74 20 43 74 65 20 2a 73 65  c struct Cte *se
28d20 61 72 63 68 57 69 74 68 28 0a 20 20 57 69 74 68  archWith(.  With
28d30 20 2a 70 57 69 74 68 2c 20 20 20 20 20 20 20 20   *pWith,        
28d40 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
28d50 75 72 72 65 6e 74 20 69 6e 6e 65 72 6d 6f 73 74  urrent innermost
28d60 20 57 49 54 48 20 63 6c 61 75 73 65 20 2a 2f 0a   WITH clause */.
28d70 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
28d80 5f 69 74 65 6d 20 2a 70 49 74 65 6d 2c 20 20 20  _item *pItem,   
28d90 20 20 2f 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65    /* FROM clause
28da0 20 65 6c 65 6d 65 6e 74 20 74 6f 20 72 65 73 6f   element to reso
28db0 6c 76 65 20 2a 2f 0a 20 20 57 69 74 68 20 2a 2a  lve */.  With **
28dc0 70 70 43 6f 6e 74 65 78 74 20 20 20 20 20 20 20  ppContext       
28dd0 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a           /* OUT:
28de0 20 57 49 54 48 20 63 6c 61 75 73 65 20 72 65 74   WITH clause ret
28df0 75 72 6e 20 76 61 6c 75 65 20 62 65 6c 6f 6e 67  urn value belong
28e00 73 20 74 6f 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e  s to */.){.  con
28e10 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a  st char *zName;.
28e20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 7a 44 61    if( pItem->zDa
28e30 74 61 62 61 73 65 3d 3d 30 20 26 26 20 28 7a 4e  tabase==0 && (zN
28e40 61 6d 65 20 3d 20 70 49 74 65 6d 2d 3e 7a 4e 61  ame = pItem->zNa
28e50 6d 65 29 21 3d 30 20 29 7b 0a 20 20 20 20 57 69  me)!=0 ){.    Wi
28e60 74 68 20 2a 70 3b 0a 20 20 20 20 66 6f 72 28 70  th *p;.    for(p
28e70 3d 70 57 69 74 68 3b 20 70 3b 20 70 3d 70 2d 3e  =pWith; p; p=p->
28e80 70 4f 75 74 65 72 29 7b 0a 20 20 20 20 20 20 69  pOuter){.      i
28e90 6e 74 20 69 3b 0a 20 20 20 20 20 20 66 6f 72 28  nt i;.      for(
28ea0 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 74 65 3b 20  i=0; i<p->nCte; 
28eb0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66  i++){.        if
28ec0 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  ( sqlite3StrICmp
28ed0 28 7a 4e 61 6d 65 2c 20 70 2d 3e 61 5b 69 5d 2e  (zName, p->a[i].
28ee0 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20  zName)==0 ){.   
28ef0 20 20 20 20 20 20 20 2a 70 70 43 6f 6e 74 65 78         *ppContex
28f00 74 20 3d 20 70 3b 0a 20 20 20 20 20 20 20 20 20  t = p;.         
28f10 20 72 65 74 75 72 6e 20 26 70 2d 3e 61 5b 69 5d   return &p->a[i]
28f20 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
28f30 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
28f40 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 20  return 0;.}../* 
28f50 54 68 65 20 63 6f 64 65 20 67 65 6e 65 72 61 74  The code generat
28f60 6f 72 20 6d 61 69 6e 74 61 69 6e 73 20 61 20 73  or maintains a s
28f70 74 61 63 6b 20 6f 66 20 61 63 74 69 76 65 20 57  tack of active W
28f80 49 54 48 20 63 6c 61 75 73 65 73 0a 2a 2a 20 77  ITH clauses.** w
28f90 69 74 68 20 74 68 65 20 69 6e 6e 65 72 2d 6d 6f  ith the inner-mo
28fa0 73 74 20 57 49 54 48 20 63 6c 61 75 73 65 20 62  st WITH clause b
28fb0 65 69 6e 67 20 61 74 20 74 68 65 20 74 6f 70 20  eing at the top 
28fc0 6f 66 20 74 68 65 20 73 74 61 63 6b 2e 0a 2a 2a  of the stack..**
28fd0 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
28fe0 20 70 75 73 68 65 73 20 74 68 65 20 57 49 54 48   pushes the WITH
28ff0 20 63 6c 61 75 73 65 20 70 61 73 73 65 64 20 61   clause passed a
29000 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67  s the second arg
29010 75 6d 65 6e 74 0a 2a 2a 20 6f 6e 74 6f 20 74 68  ument.** onto th
29020 65 20 74 6f 70 20 6f 66 20 74 68 65 20 73 74 61  e top of the sta
29030 63 6b 2e 20 49 66 20 61 72 67 75 6d 65 6e 74 20  ck. If argument 
29040 62 46 72 65 65 20 69 73 20 74 72 75 65 2c 20 74  bFree is true, t
29050 68 65 6e 20 74 68 69 73 0a 2a 2a 20 57 49 54 48  hen this.** WITH
29060 20 63 6c 61 75 73 65 20 77 69 6c 6c 20 6e 65 76   clause will nev
29070 65 72 20 62 65 20 70 6f 70 70 65 64 20 66 72 6f  er be popped fro
29080 6d 20 74 68 65 20 73 74 61 63 6b 2e 20 49 6e 20  m the stack. In 
29090 74 68 69 73 20 63 61 73 65 20 69 74 0a 2a 2a 20  this case it.** 
290a0 73 68 6f 75 6c 64 20 62 65 20 66 72 65 65 64 20  should be freed 
290b0 61 6c 6f 6e 67 20 77 69 74 68 20 74 68 65 20 50  along with the P
290c0 61 72 73 65 20 6f 62 6a 65 63 74 2e 20 49 6e 20  arse object. In 
290d0 6f 74 68 65 72 20 63 61 73 65 73 2c 20 77 68 65  other cases, whe
290e0 6e 0a 2a 2a 20 62 46 72 65 65 3d 3d 30 2c 20 74  n.** bFree==0, t
290f0 68 65 20 57 69 74 68 20 6f 62 6a 65 63 74 20 77  he With object w
29100 69 6c 6c 20 62 65 20 66 72 65 65 64 20 61 6c 6f  ill be freed alo
29110 6e 67 20 77 69 74 68 20 74 68 65 20 53 45 4c 45  ng with the SELE
29120 43 54 20 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74  CT .** statement
29130 20 77 69 74 68 20 77 68 69 63 68 20 69 74 20 69   with which it i
29140 73 20 61 73 73 6f 63 69 61 74 65 64 2e 0a 2a 2f  s associated..*/
29150 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 57 69 74  .void sqlite3Wit
29160 68 50 75 73 68 28 50 61 72 73 65 20 2a 70 50 61  hPush(Parse *pPa
29170 72 73 65 2c 20 57 69 74 68 20 2a 70 57 69 74 68  rse, With *pWith
29180 2c 20 75 38 20 62 46 72 65 65 29 7b 0a 20 20 61  , u8 bFree){.  a
29190 73 73 65 72 74 28 20 62 46 72 65 65 3d 3d 30 20  ssert( bFree==0 
291a0 7c 7c 20 28 70 50 61 72 73 65 2d 3e 70 57 69 74  || (pParse->pWit
291b0 68 3d 3d 30 20 26 26 20 70 50 61 72 73 65 2d 3e  h==0 && pParse->
291c0 70 57 69 74 68 54 6f 46 72 65 65 3d 3d 30 29 20  pWithToFree==0) 
291d0 29 3b 0a 20 20 69 66 28 20 70 57 69 74 68 20 29  );.  if( pWith )
291e0 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  {.    assert( pP
291f0 61 72 73 65 2d 3e 70 57 69 74 68 21 3d 70 57 69  arse->pWith!=pWi
29200 74 68 20 29 3b 0a 20 20 20 20 70 57 69 74 68 2d  th );.    pWith-
29210 3e 70 4f 75 74 65 72 20 3d 20 70 50 61 72 73 65  >pOuter = pParse
29220 2d 3e 70 57 69 74 68 3b 0a 20 20 20 20 70 50 61  ->pWith;.    pPa
29230 72 73 65 2d 3e 70 57 69 74 68 20 3d 20 70 57 69  rse->pWith = pWi
29240 74 68 3b 0a 20 20 20 20 69 66 28 20 62 46 72 65  th;.    if( bFre
29250 65 20 29 20 70 50 61 72 73 65 2d 3e 70 57 69 74  e ) pParse->pWit
29260 68 54 6f 46 72 65 65 20 3d 20 70 57 69 74 68 3b  hToFree = pWith;
29270 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  .  }.}../*.** Th
29280 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 68 65 63  is function chec
29290 6b 73 20 69 66 20 61 72 67 75 6d 65 6e 74 20 70  ks if argument p
292a0 46 72 6f 6d 20 72 65 66 65 72 73 20 74 6f 20 61  From refers to a
292b0 20 43 54 45 20 64 65 63 6c 61 72 65 64 20 62 79   CTE declared by
292c0 20 0a 2a 2a 20 61 20 57 49 54 48 20 63 6c 61 75   .** a WITH clau
292d0 73 65 20 6f 6e 20 74 68 65 20 73 74 61 63 6b 20  se on the stack 
292e0 63 75 72 72 65 6e 74 6c 79 20 6d 61 69 6e 74 61  currently mainta
292f0 69 6e 65 64 20 62 79 20 74 68 65 20 70 61 72 73  ined by the pars
29300 65 72 2e 20 41 6e 64 2c 0a 2a 2a 20 69 66 20 63  er. And,.** if c
29310 75 72 72 65 6e 74 6c 79 20 70 72 6f 63 65 73 73  urrently process
29320 69 6e 67 20 61 20 43 54 45 20 65 78 70 72 65 73  ing a CTE expres
29330 73 69 6f 6e 2c 20 69 66 20 69 74 20 69 73 20 61  sion, if it is a
29340 20 72 65 63 75 72 73 69 76 65 0a 2a 2a 20 72 65   recursive.** re
29350 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20 63  ference to the c
29360 75 72 72 65 6e 74 20 43 54 45 2e 0a 2a 2a 0a 2a  urrent CTE..**.*
29370 2a 20 49 66 20 70 46 72 6f 6d 20 66 61 6c 6c 73  * If pFrom falls
29380 20 69 6e 74 6f 20 65 69 74 68 65 72 20 6f 66 20   into either of 
29390 74 68 65 20 74 77 6f 20 63 61 74 65 67 6f 72 69  the two categori
293a0 65 73 20 61 62 6f 76 65 2c 20 70 46 72 6f 6d 2d  es above, pFrom-
293b0 3e 70 54 61 62 0a 2a 2a 20 61 6e 64 20 6f 74 68  >pTab.** and oth
293c0 65 72 20 66 69 65 6c 64 73 20 61 72 65 20 70 6f  er fields are po
293d0 70 75 6c 61 74 65 64 20 61 63 63 6f 72 64 69 6e  pulated accordin
293e0 67 6c 79 2e 20 54 68 65 20 63 61 6c 6c 65 72 20  gly. The caller 
293f0 73 68 6f 75 6c 64 20 63 68 65 63 6b 0a 2a 2a 20  should check.** 
29400 28 70 46 72 6f 6d 2d 3e 70 54 61 62 21 3d 30 29  (pFrom->pTab!=0)
29410 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 77 68   to determine wh
29420 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 61 20 73  ether or not a s
29430 75 63 63 65 73 73 66 75 6c 20 6d 61 74 63 68 0a  uccessful match.
29440 2a 2a 20 77 61 73 20 66 6f 75 6e 64 2e 0a 2a 2a  ** was found..**
29450 0a 2a 2a 20 57 68 65 74 68 65 72 20 6f 72 20 6e  .** Whether or n
29460 6f 74 20 61 20 6d 61 74 63 68 20 69 73 20 66 6f  ot a match is fo
29470 75 6e 64 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69  und, SQLITE_OK i
29480 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 6e 6f  s returned if no
29490 20 65 72 72 6f 72 0a 2a 2a 20 6f 63 63 75 72 73   error.** occurs
294a0 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20 64 6f  . If an error do
294b0 65 73 20 6f 63 63 75 72 2c 20 61 6e 20 65 72 72  es occur, an err
294c0 6f 72 20 6d 65 73 73 61 67 65 20 69 73 20 73 74  or message is st
294d0 6f 72 65 64 20 69 6e 20 74 68 65 0a 2a 2a 20 70  ored in the.** p
294e0 61 72 73 65 72 20 61 6e 64 20 73 6f 6d 65 20 65  arser and some e
294f0 72 72 6f 72 20 63 6f 64 65 20 6f 74 68 65 72 20  rror code other 
29500 74 68 61 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 72  than SQLITE_OK r
29510 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74  eturned..*/.stat
29520 69 63 20 69 6e 74 20 77 69 74 68 45 78 70 61 6e  ic int withExpan
29530 64 28 0a 20 20 57 61 6c 6b 65 72 20 2a 70 57 61  d(.  Walker *pWa
29540 6c 6b 65 72 2c 20 0a 20 20 73 74 72 75 63 74 20  lker, .  struct 
29550 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 46  SrcList_item *pF
29560 72 6f 6d 0a 29 7b 0a 20 20 50 61 72 73 65 20 2a  rom.){.  Parse *
29570 70 50 61 72 73 65 20 3d 20 70 57 61 6c 6b 65 72  pParse = pWalker
29580 2d 3e 70 50 61 72 73 65 3b 0a 20 20 73 71 6c 69  ->pParse;.  sqli
29590 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
295a0 2d 3e 64 62 3b 0a 20 20 73 74 72 75 63 74 20 43  ->db;.  struct C
295b0 74 65 20 2a 70 43 74 65 3b 20 20 20 20 20 20 20  te *pCte;       
295c0 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 74 63 68          /* Match
295d0 65 64 20 43 54 45 20 28 6f 72 20 4e 55 4c 4c 20  ed CTE (or NULL 
295e0 69 66 20 6e 6f 20 6d 61 74 63 68 29 20 2a 2f 0a  if no match) */.
295f0 20 20 57 69 74 68 20 2a 70 57 69 74 68 3b 20 20    With *pWith;  
29600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29610 20 20 2f 2a 20 57 49 54 48 20 63 6c 61 75 73 65    /* WITH clause
29620 20 74 68 61 74 20 70 43 74 65 20 62 65 6c 6f 6e   that pCte belon
29630 67 73 20 74 6f 20 2a 2f 0a 0a 20 20 61 73 73 65  gs to */..  asse
29640 72 74 28 20 70 46 72 6f 6d 2d 3e 70 54 61 62 3d  rt( pFrom->pTab=
29650 3d 30 20 29 3b 0a 0a 20 20 70 43 74 65 20 3d 20  =0 );..  pCte = 
29660 73 65 61 72 63 68 57 69 74 68 28 70 50 61 72 73  searchWith(pPars
29670 65 2d 3e 70 57 69 74 68 2c 20 70 46 72 6f 6d 2c  e->pWith, pFrom,
29680 20 26 70 57 69 74 68 29 3b 0a 20 20 69 66 28 20   &pWith);.  if( 
29690 70 43 74 65 20 29 7b 0a 20 20 20 20 54 61 62 6c  pCte ){.    Tabl
296a0 65 20 2a 70 54 61 62 3b 0a 20 20 20 20 45 78 70  e *pTab;.    Exp
296b0 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 0a 20  rList *pEList;. 
296c0 20 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 3b     Select *pSel;
296d0 0a 20 20 20 20 53 65 6c 65 63 74 20 2a 70 4c 65  .    Select *pLe
296e0 66 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ft;             
296f0 20 20 20 2f 2a 20 4c 65 66 74 2d 6d 6f 73 74 20     /* Left-most 
29700 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
29710 20 2a 2f 0a 20 20 20 20 69 6e 74 20 62 4d 61 79   */.    int bMay
29720 52 65 63 75 72 73 69 76 65 3b 20 20 20 20 20 20  Recursive;      
29730 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
29740 20 63 6f 6d 70 6f 75 6e 64 20 6a 6f 69 6e 65 64   compound joined
29750 20 62 79 20 55 4e 49 4f 4e 20 5b 41 4c 4c 5d 20   by UNION [ALL] 
29760 2a 2f 0a 20 20 20 20 57 69 74 68 20 2a 70 53 61  */.    With *pSa
29770 76 65 64 57 69 74 68 3b 20 20 20 20 20 20 20 20  vedWith;        
29780 20 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 20       /* Initial 
29790 76 61 6c 75 65 20 6f 66 20 70 50 61 72 73 65 2d  value of pParse-
297a0 3e 70 57 69 74 68 20 2a 2f 0a 0a 20 20 20 20 2f  >pWith */..    /
297b0 2a 20 49 66 20 70 43 74 65 2d 3e 7a 43 74 65 45  * If pCte->zCteE
297c0 72 72 20 69 73 20 6e 6f 6e 2d 4e 55 4c 4c 20 61  rr is non-NULL a
297d0 74 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 74 68  t this point, th
297e0 65 6e 20 74 68 69 73 20 69 73 20 61 6e 20 69 6c  en this is an il
297f0 6c 65 67 61 6c 0a 20 20 20 20 2a 2a 20 72 65 63  legal.    ** rec
29800 75 72 73 69 76 65 20 72 65 66 65 72 65 6e 63 65  ursive reference
29810 20 74 6f 20 43 54 45 20 70 43 74 65 2e 20 4c 65   to CTE pCte. Le
29820 61 76 65 20 61 6e 20 65 72 72 6f 72 20 69 6e 20  ave an error in 
29830 70 50 61 72 73 65 20 61 6e 64 20 72 65 74 75 72  pParse and retur
29840 6e 0a 20 20 20 20 2a 2a 20 65 61 72 6c 79 2e 20  n.    ** early. 
29850 49 66 20 70 43 74 65 2d 3e 7a 43 74 65 45 72 72  If pCte->zCteErr
29860 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 74   is NULL, then t
29870 68 69 73 20 69 73 20 6e 6f 74 20 61 20 72 65 63  his is not a rec
29880 75 72 73 69 76 65 20 72 65 66 65 72 65 6e 63 65  ursive reference
29890 2e 0a 20 20 20 20 2a 2a 20 49 6e 20 74 68 69 73  ..    ** In this
298a0 20 63 61 73 65 2c 20 70 72 6f 63 65 65 64 2e 20   case, proceed. 
298b0 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 43 74 65   */.    if( pCte
298c0 2d 3e 7a 43 74 65 45 72 72 20 29 7b 0a 20 20 20  ->zCteErr ){.   
298d0 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
298e0 73 67 28 70 50 61 72 73 65 2c 20 70 43 74 65 2d  sg(pParse, pCte-
298f0 3e 7a 43 74 65 45 72 72 2c 20 70 43 74 65 2d 3e  >zCteErr, pCte->
29900 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 72 65  zName);.      re
29910 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
29920 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  R;.    }.    if(
29930 20 63 61 6e 6e 6f 74 42 65 46 75 6e 63 74 69 6f   cannotBeFunctio
29940 6e 28 70 50 61 72 73 65 2c 20 70 46 72 6f 6d 29  n(pParse, pFrom)
29950 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
29960 5f 45 52 52 4f 52 3b 0a 0a 20 20 20 20 61 73 73  _ERROR;..    ass
29970 65 72 74 28 20 70 46 72 6f 6d 2d 3e 70 54 61 62  ert( pFrom->pTab
29980 3d 3d 30 20 29 3b 0a 20 20 20 20 70 46 72 6f 6d  ==0 );.    pFrom
29990 2d 3e 70 54 61 62 20 3d 20 70 54 61 62 20 3d 20  ->pTab = pTab = 
299a0 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a  sqlite3DbMallocZ
299b0 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 54  ero(db, sizeof(T
299c0 61 62 6c 65 29 29 3b 0a 20 20 20 20 69 66 28 20  able));.    if( 
299d0 70 54 61 62 3d 3d 30 20 29 20 72 65 74 75 72 6e  pTab==0 ) return
299e0 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20   WRC_Abort;.    
299f0 70 54 61 62 2d 3e 6e 54 61 62 52 65 66 20 3d 20  pTab->nTabRef = 
29a00 31 3b 0a 20 20 20 20 70 54 61 62 2d 3e 7a 4e 61  1;.    pTab->zNa
29a10 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74  me = sqlite3DbSt
29a20 72 44 75 70 28 64 62 2c 20 70 43 74 65 2d 3e 7a  rDup(db, pCte->z
29a30 4e 61 6d 65 29 3b 0a 20 20 20 20 70 54 61 62 2d  Name);.    pTab-
29a40 3e 69 50 4b 65 79 20 3d 20 2d 31 3b 0a 20 20 20  >iPKey = -1;.   
29a50 20 70 54 61 62 2d 3e 6e 52 6f 77 4c 6f 67 45 73   pTab->nRowLogEs
29a60 74 20 3d 20 32 30 30 3b 20 61 73 73 65 72 74 28  t = 200; assert(
29a70 20 32 30 30 3d 3d 73 71 6c 69 74 65 33 4c 6f 67   200==sqlite3Log
29a80 45 73 74 28 31 30 34 38 35 37 36 29 20 29 3b 0a  Est(1048576) );.
29a90 20 20 20 20 70 54 61 62 2d 3e 74 61 62 46 6c 61      pTab->tabFla
29aa0 67 73 20 7c 3d 20 54 46 5f 45 70 68 65 6d 65 72  gs |= TF_Ephemer
29ab0 61 6c 20 7c 20 54 46 5f 4e 6f 56 69 73 69 62 6c  al | TF_NoVisibl
29ac0 65 52 6f 77 69 64 3b 0a 20 20 20 20 70 46 72 6f  eRowid;.    pFro
29ad0 6d 2d 3e 70 53 65 6c 65 63 74 20 3d 20 73 71 6c  m->pSelect = sql
29ae0 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 64 62  ite3SelectDup(db
29af0 2c 20 70 43 74 65 2d 3e 70 53 65 6c 65 63 74 2c  , pCte->pSelect,
29b00 20 30 29 3b 0a 20 20 20 20 69 66 28 20 64 62 2d   0);.    if( db-
29b10 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20  >mallocFailed ) 
29b20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
29b30 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 61 73  MEM_BKPT;.    as
29b40 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e 70 53 65  sert( pFrom->pSe
29b50 6c 65 63 74 20 29 3b 0a 0a 20 20 20 20 2f 2a 20  lect );..    /* 
29b60 43 68 65 63 6b 20 69 66 20 74 68 69 73 20 69 73  Check if this is
29b70 20 61 20 72 65 63 75 72 73 69 76 65 20 43 54 45   a recursive CTE
29b80 2e 20 2a 2f 0a 20 20 20 20 70 53 65 6c 20 3d 20  . */.    pSel = 
29b90 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a  pFrom->pSelect;.
29ba0 20 20 20 20 62 4d 61 79 52 65 63 75 72 73 69 76      bMayRecursiv
29bb0 65 20 3d 20 28 20 70 53 65 6c 2d 3e 6f 70 3d 3d  e = ( pSel->op==
29bc0 54 4b 5f 41 4c 4c 20 7c 7c 20 70 53 65 6c 2d 3e  TK_ALL || pSel->
29bd0 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29 3b 0a  op==TK_UNION );.
29be0 20 20 20 20 69 66 28 20 62 4d 61 79 52 65 63 75      if( bMayRecu
29bf0 72 73 69 76 65 20 29 7b 0a 20 20 20 20 20 20 69  rsive ){.      i
29c00 6e 74 20 69 3b 0a 20 20 20 20 20 20 53 72 63 4c  nt i;.      SrcL
29c10 69 73 74 20 2a 70 53 72 63 20 3d 20 70 46 72 6f  ist *pSrc = pFro
29c20 6d 2d 3e 70 53 65 6c 65 63 74 2d 3e 70 53 72 63  m->pSelect->pSrc
29c30 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  ;.      for(i=0;
29c40 20 69 3c 70 53 72 63 2d 3e 6e 53 72 63 3b 20 69   i<pSrc->nSrc; i
29c50 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 73 74 72  ++){.        str
29c60 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
29c70 20 2a 70 49 74 65 6d 20 3d 20 26 70 53 72 63 2d   *pItem = &pSrc-
29c80 3e 61 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 69  >a[i];.        i
29c90 66 28 20 70 49 74 65 6d 2d 3e 7a 44 61 74 61 62  f( pItem->zDatab
29ca0 61 73 65 3d 3d 30 20 0a 20 20 20 20 20 20 20 20  ase==0 .        
29cb0 20 26 26 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65   && pItem->zName
29cc0 21 3d 30 20 0a 20 20 20 20 20 20 20 20 20 26 26  !=0 .         &&
29cd0 20 30 3d 3d 73 71 6c 69 74 65 33 53 74 72 49 43   0==sqlite3StrIC
29ce0 6d 70 28 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 2c  mp(pItem->zName,
29cf0 20 70 43 74 65 2d 3e 7a 4e 61 6d 65 29 0a 20 20   pCte->zName).  
29d00 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20          ){.     
29d10 20 20 20 20 20 70 49 74 65 6d 2d 3e 70 54 61 62       pItem->pTab
29d20 20 3d 20 70 54 61 62 3b 0a 20 20 20 20 20 20 20   = pTab;.       
29d30 20 20 20 70 49 74 65 6d 2d 3e 66 67 2e 69 73 52     pItem->fg.isR
29d40 65 63 75 72 73 69 76 65 20 3d 20 31 3b 0a 20 20  ecursive = 1;.  
29d50 20 20 20 20 20 20 20 20 70 54 61 62 2d 3e 6e 54          pTab->nT
29d60 61 62 52 65 66 2b 2b 3b 0a 20 20 20 20 20 20 20  abRef++;.       
29d70 20 20 20 70 53 65 6c 2d 3e 73 65 6c 46 6c 61 67     pSel->selFlag
29d80 73 20 7c 3d 20 53 46 5f 52 65 63 75 72 73 69 76  s |= SF_Recursiv
29d90 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  e;.        }.   
29da0 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
29db0 2f 2a 20 4f 6e 6c 79 20 6f 6e 65 20 72 65 63 75  /* Only one recu
29dc0 72 73 69 76 65 20 72 65 66 65 72 65 6e 63 65 20  rsive reference 
29dd0 69 73 20 70 65 72 6d 69 74 74 65 64 2e 20 2a 2f  is permitted. */
29de0 20 0a 20 20 20 20 69 66 28 20 70 54 61 62 2d 3e   .    if( pTab->
29df0 6e 54 61 62 52 65 66 3e 32 20 29 7b 0a 20 20 20  nTabRef>2 ){.   
29e00 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
29e10 73 67 28 0a 20 20 20 20 20 20 20 20 20 20 70 50  sg(.          pP
29e20 61 72 73 65 2c 20 22 6d 75 6c 74 69 70 6c 65 20  arse, "multiple 
29e30 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 72 65  references to re
29e40 63 75 72 73 69 76 65 20 74 61 62 6c 65 3a 20 25  cursive table: %
29e50 73 22 2c 20 70 43 74 65 2d 3e 7a 4e 61 6d 65 0a  s", pCte->zName.
29e60 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 72        );.      r
29e70 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
29e80 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73  OR;.    }.    as
29e90 73 65 72 74 28 20 70 54 61 62 2d 3e 6e 54 61 62  sert( pTab->nTab
29ea0 52 65 66 3d 3d 31 20 7c 7c 20 0a 20 20 20 20 20  Ref==1 || .     
29eb0 20 20 20 20 20 20 20 28 28 70 53 65 6c 2d 3e 73         ((pSel->s
29ec0 65 6c 46 6c 61 67 73 26 53 46 5f 52 65 63 75 72  elFlags&SF_Recur
29ed0 73 69 76 65 29 20 26 26 20 70 54 61 62 2d 3e 6e  sive) && pTab->n
29ee0 54 61 62 52 65 66 3d 3d 32 20 29 29 3b 0a 0a 20  TabRef==2 ));.. 
29ef0 20 20 20 70 43 74 65 2d 3e 7a 43 74 65 45 72 72     pCte->zCteErr
29f00 20 3d 20 22 63 69 72 63 75 6c 61 72 20 72 65 66   = "circular ref
29f10 65 72 65 6e 63 65 3a 20 25 73 22 3b 0a 20 20 20  erence: %s";.   
29f20 20 70 53 61 76 65 64 57 69 74 68 20 3d 20 70 50   pSavedWith = pP
29f30 61 72 73 65 2d 3e 70 57 69 74 68 3b 0a 20 20 20  arse->pWith;.   
29f40 20 70 50 61 72 73 65 2d 3e 70 57 69 74 68 20 3d   pParse->pWith =
29f50 20 70 57 69 74 68 3b 0a 20 20 20 20 69 66 28 20   pWith;.    if( 
29f60 62 4d 61 79 52 65 63 75 72 73 69 76 65 20 29 7b  bMayRecursive ){
29f70 0a 20 20 20 20 20 20 53 65 6c 65 63 74 20 2a 70  .      Select *p
29f80 50 72 69 6f 72 20 3d 20 70 53 65 6c 2d 3e 70 50  Prior = pSel->pP
29f90 72 69 6f 72 3b 0a 20 20 20 20 20 20 61 73 73 65  rior;.      asse
29fa0 72 74 28 20 70 50 72 69 6f 72 2d 3e 70 57 69 74  rt( pPrior->pWit
29fb0 68 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 50  h==0 );.      pP
29fc0 72 69 6f 72 2d 3e 70 57 69 74 68 20 3d 20 70 53  rior->pWith = pS
29fd0 65 6c 2d 3e 70 57 69 74 68 3b 0a 20 20 20 20 20  el->pWith;.     
29fe0 20 73 71 6c 69 74 65 33 57 61 6c 6b 53 65 6c 65   sqlite3WalkSele
29ff0 63 74 28 70 57 61 6c 6b 65 72 2c 20 70 50 72 69  ct(pWalker, pPri
2a000 6f 72 29 3b 0a 20 20 20 20 20 20 70 50 72 69 6f  or);.      pPrio
2a010 72 2d 3e 70 57 69 74 68 20 3d 20 30 3b 0a 20 20  r->pWith = 0;.  
2a020 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73    }else{.      s
2a030 71 6c 69 74 65 33 57 61 6c 6b 53 65 6c 65 63 74  qlite3WalkSelect
2a040 28 70 57 61 6c 6b 65 72 2c 20 70 53 65 6c 29 3b  (pWalker, pSel);
2a050 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 72 73  .    }.    pPars
2a060 65 2d 3e 70 57 69 74 68 20 3d 20 70 57 69 74 68  e->pWith = pWith
2a070 3b 0a 0a 20 20 20 20 66 6f 72 28 70 4c 65 66 74  ;..    for(pLeft
2a080 3d 70 53 65 6c 3b 20 70 4c 65 66 74 2d 3e 70 50  =pSel; pLeft->pP
2a090 72 69 6f 72 3b 20 70 4c 65 66 74 3d 70 4c 65 66  rior; pLeft=pLef
2a0a0 74 2d 3e 70 50 72 69 6f 72 29 3b 0a 20 20 20 20  t->pPrior);.    
2a0b0 70 45 4c 69 73 74 20 3d 20 70 4c 65 66 74 2d 3e  pEList = pLeft->
2a0c0 70 45 4c 69 73 74 3b 0a 20 20 20 20 69 66 28 20  pEList;.    if( 
2a0d0 70 43 74 65 2d 3e 70 43 6f 6c 73 20 29 7b 0a 20  pCte->pCols ){. 
2a0e0 20 20 20 20 20 69 66 28 20 70 45 4c 69 73 74 20       if( pEList 
2a0f0 26 26 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  && pEList->nExpr
2a100 21 3d 70 43 74 65 2d 3e 70 43 6f 6c 73 2d 3e 6e  !=pCte->pCols->n
2a110 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20 20 20  Expr ){.        
2a120 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
2a130 70 50 61 72 73 65 2c 20 22 74 61 62 6c 65 20 25  pParse, "table %
2a140 73 20 68 61 73 20 25 64 20 76 61 6c 75 65 73 20  s has %d values 
2a150 66 6f 72 20 25 64 20 63 6f 6c 75 6d 6e 73 22 2c  for %d columns",
2a160 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 43 74  .            pCt
2a170 65 2d 3e 7a 4e 61 6d 65 2c 20 70 45 4c 69 73 74  e->zName, pEList
2a180 2d 3e 6e 45 78 70 72 2c 20 70 43 74 65 2d 3e 70  ->nExpr, pCte->p
2a190 43 6f 6c 73 2d 3e 6e 45 78 70 72 0a 20 20 20 20  Cols->nExpr.    
2a1a0 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 70      );.        p
2a1b0 50 61 72 73 65 2d 3e 70 57 69 74 68 20 3d 20 70  Parse->pWith = p
2a1c0 53 61 76 65 64 57 69 74 68 3b 0a 20 20 20 20 20  SavedWith;.     
2a1d0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
2a1e0 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a  _ERROR;.      }.
2a1f0 20 20 20 20 20 20 70 45 4c 69 73 74 20 3d 20 70        pEList = p
2a200 43 74 65 2d 3e 70 43 6f 6c 73 3b 0a 20 20 20 20  Cte->pCols;.    
2a210 7d 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 43 6f  }..    sqlite3Co
2a220 6c 75 6d 6e 73 46 72 6f 6d 45 78 70 72 4c 69 73  lumnsFromExprLis
2a230 74 28 70 50 61 72 73 65 2c 20 70 45 4c 69 73 74  t(pParse, pEList
2a240 2c 20 26 70 54 61 62 2d 3e 6e 43 6f 6c 2c 20 26  , &pTab->nCol, &
2a250 70 54 61 62 2d 3e 61 43 6f 6c 29 3b 0a 20 20 20  pTab->aCol);.   
2a260 20 69 66 28 20 62 4d 61 79 52 65 63 75 72 73 69   if( bMayRecursi
2a270 76 65 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  ve ){.      if( 
2a280 70 53 65 6c 2d 3e 73 65 6c 46 6c 61 67 73 20 26  pSel->selFlags &
2a290 20 53 46 5f 52 65 63 75 72 73 69 76 65 20 29 7b   SF_Recursive ){
2a2a0 0a 20 20 20 20 20 20 20 20 70 43 74 65 2d 3e 7a  .        pCte->z
2a2b0 43 74 65 45 72 72 20 3d 20 22 6d 75 6c 74 69 70  CteErr = "multip
2a2c0 6c 65 20 72 65 63 75 72 73 69 76 65 20 72 65 66  le recursive ref
2a2d0 65 72 65 6e 63 65 73 3a 20 25 73 22 3b 0a 20 20  erences: %s";.  
2a2e0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2a2f0 20 20 20 70 43 74 65 2d 3e 7a 43 74 65 45 72 72     pCte->zCteErr
2a300 20 3d 20 22 72 65 63 75 72 73 69 76 65 20 72 65   = "recursive re
2a310 66 65 72 65 6e 63 65 20 69 6e 20 61 20 73 75 62  ference in a sub
2a320 71 75 65 72 79 3a 20 25 73 22 3b 0a 20 20 20 20  query: %s";.    
2a330 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
2a340 33 57 61 6c 6b 53 65 6c 65 63 74 28 70 57 61 6c  3WalkSelect(pWal
2a350 6b 65 72 2c 20 70 53 65 6c 29 3b 0a 20 20 20 20  ker, pSel);.    
2a360 7d 0a 20 20 20 20 70 43 74 65 2d 3e 7a 43 74 65  }.    pCte->zCte
2a370 45 72 72 20 3d 20 30 3b 0a 20 20 20 20 70 50 61  Err = 0;.    pPa
2a380 72 73 65 2d 3e 70 57 69 74 68 20 3d 20 70 53 61  rse->pWith = pSa
2a390 76 65 64 57 69 74 68 3b 0a 20 20 7d 0a 0a 20 20  vedWith;.  }..  
2a3a0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
2a3b0 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e  ;.}.#endif..#ifn
2a3c0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
2a3d0 43 54 45 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65  CTE./*.** If the
2a3e0 20 53 45 4c 45 43 54 20 70 61 73 73 65 64 20 61   SELECT passed a
2a3f0 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67  s the second arg
2a400 75 6d 65 6e 74 20 68 61 73 20 61 6e 20 61 73 73  ument has an ass
2a410 6f 63 69 61 74 65 64 20 57 49 54 48 20 0a 2a 2a  ociated WITH .**
2a420 20 63 6c 61 75 73 65 2c 20 70 6f 70 20 69 74 20   clause, pop it 
2a430 66 72 6f 6d 20 74 68 65 20 73 74 61 63 6b 20 73  from the stack s
2a440 74 6f 72 65 64 20 61 73 20 70 61 72 74 20 6f 66  tored as part of
2a450 20 74 68 65 20 50 61 72 73 65 20 6f 62 6a 65 63   the Parse objec
2a460 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75  t..**.** This fu
2a470 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20 61  nction is used a
2a480 73 20 74 68 65 20 78 53 65 6c 65 63 74 43 61 6c  s the xSelectCal
2a490 6c 62 61 63 6b 32 28 29 20 63 61 6c 6c 62 61 63  lback2() callbac
2a4a0 6b 20 62 79 0a 2a 2a 20 73 71 6c 69 74 65 33 53  k by.** sqlite3S
2a4b0 65 6c 65 63 74 45 78 70 61 6e 64 28 29 20 77 68  electExpand() wh
2a4c0 65 6e 20 77 61 6c 6b 69 6e 67 20 61 20 53 45 4c  en walking a SEL
2a4d0 45 43 54 20 74 72 65 65 20 74 6f 20 72 65 73 6f  ECT tree to reso
2a4e0 6c 76 65 20 74 61 62 6c 65 0a 2a 2a 20 6e 61 6d  lve table.** nam
2a4f0 65 73 20 61 6e 64 20 6f 74 68 65 72 20 46 52 4f  es and other FRO
2a500 4d 20 63 6c 61 75 73 65 20 65 6c 65 6d 65 6e 74  M clause element
2a510 73 2e 20 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  s. .*/.static vo
2a520 69 64 20 73 65 6c 65 63 74 50 6f 70 57 69 74 68  id selectPopWith
2a530 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72  (Walker *pWalker
2a540 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20  , Select *p){.  
2a550 50 61 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20  Parse *pParse = 
2a560 70 57 61 6c 6b 65 72 2d 3e 70 50 61 72 73 65 3b  pWalker->pParse;
2a570 0a 20 20 69 66 28 20 4f 4b 5f 49 46 5f 41 4c 57  .  if( OK_IF_ALW
2a580 41 59 53 5f 54 52 55 45 28 70 50 61 72 73 65 2d  AYS_TRUE(pParse-
2a590 3e 70 57 69 74 68 29 20 26 26 20 70 2d 3e 70 50  >pWith) && p->pP
2a5a0 72 69 6f 72 3d 3d 30 20 29 7b 0a 20 20 20 20 57  rior==0 ){.    W
2a5b0 69 74 68 20 2a 70 57 69 74 68 20 3d 20 66 69 6e  ith *pWith = fin
2a5c0 64 52 69 67 68 74 6d 6f 73 74 28 70 29 2d 3e 70  dRightmost(p)->p
2a5d0 57 69 74 68 3b 0a 20 20 20 20 69 66 28 20 70 57  With;.    if( pW
2a5e0 69 74 68 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  ith!=0 ){.      
2a5f0 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e  assert( pParse->
2a600 70 57 69 74 68 3d 3d 70 57 69 74 68 20 29 3b 0a  pWith==pWith );.
2a610 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 70 57        pParse->pW
2a620 69 74 68 20 3d 20 70 57 69 74 68 2d 3e 70 4f 75  ith = pWith->pOu
2a630 74 65 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  ter;.    }.  }.}
2a640 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 73  .#else.#define s
2a650 65 6c 65 63 74 50 6f 70 57 69 74 68 20 30 0a 23  electPopWith 0.#
2a660 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  endif../*.** The
2a670 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 73 74   SrcList_item st
2a680 72 75 63 74 75 72 65 20 70 61 73 73 65 64 20 61  ructure passed a
2a690 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67  s the second arg
2a6a0 75 6d 65 6e 74 20 72 65 70 72 65 73 65 6e 74 73  ument represents
2a6b0 20 61 0a 2a 2a 20 73 75 62 2d 71 75 65 72 79 20   a.** sub-query 
2a6c0 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  in the FROM clau
2a6d0 73 65 20 6f 66 20 61 20 53 45 4c 45 43 54 20 73  se of a SELECT s
2a6e0 74 61 74 65 6d 65 6e 74 2e 20 54 68 69 73 20 66  tatement. This f
2a6f0 75 6e 63 74 69 6f 6e 0a 2a 2a 20 61 6c 6c 6f 63  unction.** alloc
2a700 61 74 65 73 20 61 6e 64 20 70 6f 70 75 6c 61 74  ates and populat
2a710 65 73 20 74 68 65 20 53 72 63 4c 69 73 74 5f 69  es the SrcList_i
2a720 74 65 6d 2e 70 54 61 62 20 6f 62 6a 65 63 74 2e  tem.pTab object.
2a730 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 0a   If successful,.
2a740 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  ** SQLITE_OK is 
2a750 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77  returned. Otherw
2a760 69 73 65 2c 20 69 66 20 61 6e 20 4f 4f 4d 20 65  ise, if an OOM e
2a770 72 72 6f 72 20 69 73 20 65 6e 63 6f 75 6e 74 65  rror is encounte
2a780 72 65 64 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 4e  red,.** SQLITE_N
2a790 4f 4d 45 4d 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  OMEM..*/.int sql
2a7a0 69 74 65 33 45 78 70 61 6e 64 53 75 62 71 75 65  ite3ExpandSubque
2a7b0 72 79 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ry(Parse *pParse
2a7c0 2c 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74  , struct SrcList
2a7d0 5f 69 74 65 6d 20 2a 70 46 72 6f 6d 29 7b 0a 20  _item *pFrom){. 
2a7e0 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 20 3d 20   Select *pSel = 
2a7f0 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a  pFrom->pSelect;.
2a800 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 0a    Table *pTab;..
2a810 20 20 61 73 73 65 72 74 28 20 70 53 65 6c 20 29    assert( pSel )
2a820 3b 0a 20 20 70 46 72 6f 6d 2d 3e 70 54 61 62 20  ;.  pFrom->pTab 
2a830 3d 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33  = pTab = sqlite3
2a840 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 70 50 61  DbMallocZero(pPa
2a850 72 73 65 2d 3e 64 62 2c 20 73 69 7a 65 6f 66 28  rse->db, sizeof(
2a860 54 61 62 6c 65 29 29 3b 0a 20 20 69 66 28 20 70  Table));.  if( p
2a870 54 61 62 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  Tab==0 ) return 
2a880 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
2a890 70 54 61 62 2d 3e 6e 54 61 62 52 65 66 20 3d 20  pTab->nTabRef = 
2a8a0 31 3b 0a 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e  1;.  if( pFrom->
2a8b0 7a 41 6c 69 61 73 20 29 7b 0a 20 20 20 20 70 54  zAlias ){.    pT
2a8c0 61 62 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69  ab->zName = sqli
2a8d0 74 65 33 44 62 53 74 72 44 75 70 28 70 50 61 72  te3DbStrDup(pPar
2a8e0 73 65 2d 3e 64 62 2c 20 70 46 72 6f 6d 2d 3e 7a  se->db, pFrom->z
2a8f0 41 6c 69 61 73 29 3b 0a 20 20 7d 65 6c 73 65 7b  Alias);.  }else{
2a900 0a 20 20 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  .    pTab->zName
2a910 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74   = sqlite3MPrint
2a920 66 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 22 73  f(pParse->db, "s
2a930 75 62 71 75 65 72 79 5f 25 75 22 2c 20 70 53 65  ubquery_%u", pSe
2a940 6c 2d 3e 73 65 6c 49 64 29 3b 0a 20 20 7d 0a 20  l->selId);.  }. 
2a950 20 77 68 69 6c 65 28 20 70 53 65 6c 2d 3e 70 50   while( pSel->pP
2a960 72 69 6f 72 20 29 7b 20 70 53 65 6c 20 3d 20 70  rior ){ pSel = p
2a970 53 65 6c 2d 3e 70 50 72 69 6f 72 3b 20 7d 0a 20  Sel->pPrior; }. 
2a980 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 73 46   sqlite3ColumnsF
2a990 72 6f 6d 45 78 70 72 4c 69 73 74 28 70 50 61 72  romExprList(pPar
2a9a0 73 65 2c 20 70 53 65 6c 2d 3e 70 45 4c 69 73 74  se, pSel->pEList
2a9b0 2c 26 70 54 61 62 2d 3e 6e 43 6f 6c 2c 26 70 54  ,&pTab->nCol,&pT
2a9c0 61 62 2d 3e 61 43 6f 6c 29 3b 0a 20 20 70 54 61  ab->aCol);.  pTa
2a9d0 62 2d 3e 69 50 4b 65 79 20 3d 20 2d 31 3b 0a 20  b->iPKey = -1;. 
2a9e0 20 70 54 61 62 2d 3e 6e 52 6f 77 4c 6f 67 45 73   pTab->nRowLogEs
2a9f0 74 20 3d 20 32 30 30 3b 20 61 73 73 65 72 74 28  t = 200; assert(
2aa00 20 32 30 30 3d 3d 73 71 6c 69 74 65 33 4c 6f 67   200==sqlite3Log
2aa10 45 73 74 28 31 30 34 38 35 37 36 29 20 29 3b 0a  Est(1048576) );.
2aa20 20 20 70 54 61 62 2d 3e 74 61 62 46 6c 61 67 73    pTab->tabFlags
2aa30 20 7c 3d 20 54 46 5f 45 70 68 65 6d 65 72 61 6c   |= TF_Ephemeral
2aa40 3b 0a 0a 20 20 72 65 74 75 72 6e 20 70 50 61 72  ;..  return pPar
2aa50 73 65 2d 3e 6e 45 72 72 20 3f 20 53 51 4c 49 54  se->nErr ? SQLIT
2aa60 45 5f 45 52 52 4f 52 20 3a 20 53 51 4c 49 54 45  E_ERROR : SQLITE
2aa70 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  _OK;.}../*.** Th
2aa80 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20  is routine is a 
2aa90 57 61 6c 6b 65 72 20 63 61 6c 6c 62 61 63 6b 20  Walker callback 
2aaa0 66 6f 72 20 22 65 78 70 61 6e 64 69 6e 67 22 20  for "expanding" 
2aab0 61 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  a SELECT stateme
2aac0 6e 74 2e 0a 2a 2a 20 22 45 78 70 61 6e 64 69 6e  nt..** "Expandin
2aad0 67 22 20 6d 65 61 6e 73 20 74 6f 20 64 6f 20 74  g" means to do t
2aae0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a  he following:.**
2aaf0 0a 2a 2a 20 20 20 20 28 31 29 20 20 4d 61 6b 65  .**    (1)  Make
2ab00 20 73 75 72 65 20 56 44 42 45 20 63 75 72 73 6f   sure VDBE curso
2ab10 72 20 6e 75 6d 62 65 72 73 20 68 61 76 65 20 62  r numbers have b
2ab20 65 65 6e 20 61 73 73 69 67 6e 65 64 20 74 6f 20  een assigned to 
2ab30 65 76 65 72 79 0a 2a 2a 20 20 20 20 20 20 20 20  every.**        
2ab40 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65 20   element of the 
2ab50 46 52 4f 4d 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a  FROM clause..**.
2ab60 2a 2a 20 20 20 20 28 32 29 20 20 46 69 6c 6c 20  **    (2)  Fill 
2ab70 69 6e 20 74 68 65 20 70 54 61 62 4c 69 73 74 2d  in the pTabList-
2ab80 3e 61 5b 5d 2e 70 54 61 62 20 66 69 65 6c 64 73  >a[].pTab fields
2ab90 20 69 6e 20 74 68 65 20 53 72 63 4c 69 73 74 20   in the SrcList 
2aba0 74 68 61 74 20 0a 2a 2a 20 20 20 20 20 20 20 20  that .**        
2abb0 20 64 65 66 69 6e 65 73 20 46 52 4f 4d 20 63 6c   defines FROM cl
2abc0 61 75 73 65 2e 20 20 57 68 65 6e 20 76 69 65 77  ause.  When view
2abd0 73 20 61 70 70 65 61 72 20 69 6e 20 74 68 65 20  s appear in the 
2abe0 46 52 4f 4d 20 63 6c 61 75 73 65 2c 0a 2a 2a 20  FROM clause,.** 
2abf0 20 20 20 20 20 20 20 20 66 69 6c 6c 20 70 54 61          fill pTa
2ac00 62 4c 69 73 74 2d 3e 61 5b 5d 2e 70 53 65 6c 65  bList->a[].pSele
2ac10 63 74 20 77 69 74 68 20 61 20 63 6f 70 79 20 6f  ct with a copy o
2ac20 66 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61  f the SELECT sta
2ac30 74 65 6d 65 6e 74 0a 2a 2a 20 20 20 20 20 20 20  tement.**       
2ac40 20 20 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74    that implement
2ac50 73 20 74 68 65 20 76 69 65 77 2e 20 20 41 20 63  s the view.  A c
2ac60 6f 70 79 20 69 73 20 6d 61 64 65 20 6f 66 20 74  opy is made of t
2ac70 68 65 20 76 69 65 77 27 73 20 53 45 4c 45 43 54  he view's SELECT
2ac80 0a 2a 2a 20 20 20 20 20 20 20 20 20 73 74 61 74  .**         stat
2ac90 65 6d 65 6e 74 20 73 6f 20 74 68 61 74 20 77 65  ement so that we
2aca0 20 63 61 6e 20 66 72 65 65 6c 79 20 6d 6f 64 69   can freely modi
2acb0 66 79 20 6f 72 20 64 65 6c 65 74 65 20 74 68 61  fy or delete tha
2acc0 74 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 20  t statement.**  
2acd0 20 20 20 20 20 20 20 77 69 74 68 6f 75 74 20 77         without w
2ace0 6f 72 72 79 69 6e 67 20 61 62 6f 75 74 20 6d 65  orrying about me
2acf0 73 73 69 6e 67 20 75 70 20 74 68 65 20 70 65 72  ssing up the per
2ad00 73 69 73 74 65 6e 74 20 72 65 70 72 65 73 65 6e  sistent represen
2ad10 74 61 74 69 6f 6e 0a 2a 2a 20 20 20 20 20 20 20  tation.**       
2ad20 20 20 6f 66 20 74 68 65 20 76 69 65 77 2e 0a 2a    of the view..*
2ad30 2a 0a 2a 2a 20 20 20 20 28 33 29 20 20 41 64 64  *.**    (3)  Add
2ad40 20 74 65 72 6d 73 20 74 6f 20 74 68 65 20 57 48   terms to the WH
2ad50 45 52 45 20 63 6c 61 75 73 65 20 74 6f 20 61 63  ERE clause to ac
2ad60 63 6f 6d 6d 6f 64 61 74 65 20 74 68 65 20 4e 41  commodate the NA
2ad70 54 55 52 41 4c 20 6b 65 79 77 6f 72 64 0a 2a 2a  TURAL keyword.**
2ad80 20 20 20 20 20 20 20 20 20 6f 6e 20 6a 6f 69 6e           on join
2ad90 73 20 61 6e 64 20 74 68 65 20 4f 4e 20 61 6e 64  s and the ON and
2ada0 20 55 53 49 4e 47 20 63 6c 61 75 73 65 20 6f 66   USING clause of
2adb0 20 6a 6f 69 6e 73 2e 0a 2a 2a 0a 2a 2a 20 20 20   joins..**.**   
2adc0 20 28 34 29 20 20 53 63 61 6e 20 74 68 65 20 6c   (4)  Scan the l
2add0 69 73 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69  ist of columns i
2ade0 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  n the result set
2adf0 20 28 70 45 4c 69 73 74 29 20 6c 6f 6f 6b 69 6e   (pEList) lookin
2ae00 67 0a 2a 2a 20 20 20 20 20 20 20 20 20 66 6f 72  g.**         for
2ae10 20 69 6e 73 74 61 6e 63 65 73 20 6f 66 20 74 68   instances of th
2ae20 65 20 22 2a 22 20 6f 70 65 72 61 74 6f 72 20 6f  e "*" operator o
2ae30 72 20 74 68 65 20 54 41 42 4c 45 2e 2a 20 6f 70  r the TABLE.* op
2ae40 65 72 61 74 6f 72 2e 0a 2a 2a 20 20 20 20 20 20  erator..**      
2ae50 20 20 20 49 66 20 66 6f 75 6e 64 2c 20 65 78 70     If found, exp
2ae60 61 6e 64 20 65 61 63 68 20 22 2a 22 20 74 6f 20  and each "*" to 
2ae70 62 65 20 65 76 65 72 79 20 63 6f 6c 75 6d 6e 20  be every column 
2ae80 69 6e 20 65 76 65 72 79 20 74 61 62 6c 65 0a 2a  in every table.*
2ae90 2a 20 20 20 20 20 20 20 20 20 61 6e 64 20 54 41  *         and TA
2aea0 42 4c 45 2e 2a 20 74 6f 20 62 65 20 65 76 65 72  BLE.* to be ever
2aeb0 79 20 63 6f 6c 75 6d 6e 20 69 6e 20 54 41 42 4c  y column in TABL
2aec0 45 2e 0a 2a 2a 0a 2a 2f 0a 73 74 61 74 69 63 20  E..**.*/.static 
2aed0 69 6e 74 20 73 65 6c 65 63 74 45 78 70 61 6e 64  int selectExpand
2aee0 65 72 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b  er(Walker *pWalk
2aef0 65 72 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a  er, Select *p){.
2af00 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 20    Parse *pParse 
2af10 3d 20 70 57 61 6c 6b 65 72 2d 3e 70 50 61 72 73  = pWalker->pPars
2af20 65 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 2c 20 6b  e;.  int i, j, k
2af30 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61  ;.  SrcList *pTa
2af40 62 4c 69 73 74 3b 0a 20 20 45 78 70 72 4c 69 73  bList;.  ExprLis
2af50 74 20 2a 70 45 4c 69 73 74 3b 0a 20 20 73 74 72  t *pEList;.  str
2af60 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
2af70 20 2a 70 46 72 6f 6d 3b 0a 20 20 73 71 6c 69 74   *pFrom;.  sqlit
2af80 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
2af90 3e 64 62 3b 0a 20 20 45 78 70 72 20 2a 70 45 2c  >db;.  Expr *pE,
2afa0 20 2a 70 52 69 67 68 74 2c 20 2a 70 45 78 70 72   *pRight, *pExpr
2afb0 3b 0a 20 20 75 31 36 20 73 65 6c 46 6c 61 67 73  ;.  u16 selFlags
2afc0 20 3d 20 70 2d 3e 73 65 6c 46 6c 61 67 73 3b 0a   = p->selFlags;.
2afd0 20 20 75 33 32 20 65 6c 69 73 74 46 6c 61 67 73    u32 elistFlags
2afe0 20 3d 20 30 3b 0a 0a 20 20 70 2d 3e 73 65 6c 46   = 0;..  p->selF
2aff0 6c 61 67 73 20 7c 3d 20 53 46 5f 45 78 70 61 6e  lags |= SF_Expan
2b000 64 65 64 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d  ded;.  if( db->m
2b010 61 6c 6c 6f 63 46 61 69 6c 65 64 20 20 29 7b 0a  allocFailed  ){.
2b020 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41      return WRC_A
2b030 62 6f 72 74 3b 0a 20 20 7d 0a 20 20 61 73 73 65  bort;.  }.  asse
2b040 72 74 28 20 70 2d 3e 70 53 72 63 21 3d 30 20 29  rt( p->pSrc!=0 )
2b050 3b 0a 20 20 69 66 28 20 28 73 65 6c 46 6c 61 67  ;.  if( (selFlag
2b060 73 20 26 20 53 46 5f 45 78 70 61 6e 64 65 64 29  s & SF_Expanded)
2b070 21 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  !=0 ){.    retur
2b080 6e 20 57 52 43 5f 50 72 75 6e 65 3b 0a 20 20 7d  n WRC_Prune;.  }
2b090 0a 20 20 69 66 28 20 70 57 61 6c 6b 65 72 2d 3e  .  if( pWalker->
2b0a0 65 43 6f 64 65 20 29 7b 0a 20 20 20 20 2f 2a 20  eCode ){.    /* 
2b0b0 52 65 6e 75 6d 62 65 72 20 73 65 6c 49 64 20 62  Renumber selId b
2b0c0 65 63 61 75 73 65 20 69 74 20 68 61 73 20 62 65  ecause it has be
2b0d0 65 6e 20 63 6f 70 69 65 64 20 66 72 6f 6d 20 61  en copied from a
2b0e0 20 76 69 65 77 20 2a 2f 0a 20 20 20 20 70 2d 3e   view */.    p->
2b0f0 73 65 6c 49 64 20 3d 20 2b 2b 70 50 61 72 73 65  selId = ++pParse
2b100 2d 3e 6e 53 65 6c 65 63 74 3b 0a 20 20 7d 0a 20  ->nSelect;.  }. 
2b110 20 70 54 61 62 4c 69 73 74 20 3d 20 70 2d 3e 70   pTabList = p->p
2b120 53 72 63 3b 0a 20 20 70 45 4c 69 73 74 20 3d 20  Src;.  pEList = 
2b130 70 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 73 71 6c  p->pEList;.  sql
2b140 69 74 65 33 57 69 74 68 50 75 73 68 28 70 50 61  ite3WithPush(pPa
2b150 72 73 65 2c 20 70 2d 3e 70 57 69 74 68 2c 20 30  rse, p->pWith, 0
2b160 29 3b 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75  );..  /* Make su
2b170 72 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72  re cursor number
2b180 73 20 68 61 76 65 20 62 65 65 6e 20 61 73 73 69  s have been assi
2b190 67 6e 65 64 20 74 6f 20 61 6c 6c 20 65 6e 74 72  gned to all entr
2b1a0 69 65 73 20 69 6e 0a 20 20 2a 2a 20 74 68 65 20  ies in.  ** the 
2b1b0 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74  FROM clause of t
2b1c0 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  he SELECT statem
2b1d0 65 6e 74 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69  ent..  */.  sqli
2b1e0 74 65 33 53 72 63 4c 69 73 74 41 73 73 69 67 6e  te3SrcListAssign
2b1f0 43 75 72 73 6f 72 73 28 70 50 61 72 73 65 2c 20  Cursors(pParse, 
2b200 70 54 61 62 4c 69 73 74 29 3b 0a 0a 20 20 2f 2a  pTabList);..  /*
2b210 20 4c 6f 6f 6b 20 75 70 20 65 76 65 72 79 20 74   Look up every t
2b220 61 62 6c 65 20 6e 61 6d 65 64 20 69 6e 20 74 68  able named in th
2b230 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66  e FROM clause of
2b240 20 74 68 65 20 73 65 6c 65 63 74 2e 20 20 49 66   the select.  If
2b250 0a 20 20 2a 2a 20 61 6e 20 65 6e 74 72 79 20 6f  .  ** an entry o
2b260 66 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  f the FROM claus
2b270 65 20 69 73 20 61 20 73 75 62 71 75 65 72 79 20  e is a subquery 
2b280 69 6e 73 74 65 61 64 20 6f 66 20 61 20 74 61 62  instead of a tab
2b290 6c 65 20 6f 72 20 76 69 65 77 2c 0a 20 20 2a 2a  le or view,.  **
2b2a0 20 74 68 65 6e 20 63 72 65 61 74 65 20 61 20 74   then create a t
2b2b0 72 61 6e 73 69 65 6e 74 20 74 61 62 6c 65 20 73  ransient table s
2b2c0 74 72 75 63 74 75 72 65 20 74 6f 20 64 65 73 63  tructure to desc
2b2d0 72 69 62 65 20 74 68 65 20 73 75 62 71 75 65 72  ribe the subquer
2b2e0 79 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d  y..  */.  for(i=
2b2f0 30 2c 20 70 46 72 6f 6d 3d 70 54 61 62 4c 69 73  0, pFrom=pTabLis
2b300 74 2d 3e 61 3b 20 69 3c 70 54 61 62 4c 69 73 74  t->a; i<pTabList
2b310 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 46 72  ->nSrc; i++, pFr
2b320 6f 6d 2b 2b 29 7b 0a 20 20 20 20 54 61 62 6c 65  om++){.    Table
2b330 20 2a 70 54 61 62 3b 0a 20 20 20 20 61 73 73 65   *pTab;.    asse
2b340 72 74 28 20 70 46 72 6f 6d 2d 3e 66 67 2e 69 73  rt( pFrom->fg.is
2b350 52 65 63 75 72 73 69 76 65 3d 3d 30 20 7c 7c 20  Recursive==0 || 
2b360 70 46 72 6f 6d 2d 3e 70 54 61 62 21 3d 30 20 29  pFrom->pTab!=0 )
2b370 3b 0a 20 20 20 20 69 66 28 20 70 46 72 6f 6d 2d  ;.    if( pFrom-
2b380 3e 66 67 2e 69 73 52 65 63 75 72 73 69 76 65 20  >fg.isRecursive 
2b390 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
2b3a0 61 73 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e 70  assert( pFrom->p
2b3b0 54 61 62 3d 3d 30 20 29 3b 0a 23 69 66 6e 64 65  Tab==0 );.#ifnde
2b3c0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 54  f SQLITE_OMIT_CT
2b3d0 45 0a 20 20 20 20 69 66 28 20 77 69 74 68 45 78  E.    if( withEx
2b3e0 70 61 6e 64 28 70 57 61 6c 6b 65 72 2c 20 70 46  pand(pWalker, pF
2b3f0 72 6f 6d 29 20 29 20 72 65 74 75 72 6e 20 57 52  rom) ) return WR
2b400 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 69 66 28  C_Abort;.    if(
2b410 20 70 46 72 6f 6d 2d 3e 70 54 61 62 20 29 20 7b   pFrom->pTab ) {
2b420 7d 20 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20  } else.#endif.  
2b430 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e 7a 4e 61    if( pFrom->zNa
2b440 6d 65 3d 3d 30 20 29 7b 0a 23 69 66 6e 64 65 66  me==0 ){.#ifndef
2b450 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42   SQLITE_OMIT_SUB
2b460 51 55 45 52 59 0a 20 20 20 20 20 20 53 65 6c 65  QUERY.      Sele
2b470 63 74 20 2a 70 53 65 6c 20 3d 20 70 46 72 6f 6d  ct *pSel = pFrom
2b480 2d 3e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 20  ->pSelect;.     
2b490 20 2f 2a 20 41 20 73 75 62 2d 71 75 65 72 79 20   /* A sub-query 
2b4a0 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  in the FROM clau
2b4b0 73 65 20 6f 66 20 61 20 53 45 4c 45 43 54 20 2a  se of a SELECT *
2b4c0 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  /.      assert( 
2b4d0 70 53 65 6c 21 3d 30 20 29 3b 0a 20 20 20 20 20  pSel!=0 );.     
2b4e0 20 61 73 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e   assert( pFrom->
2b4f0 70 54 61 62 3d 3d 30 20 29 3b 0a 20 20 20 20 20  pTab==0 );.     
2b500 20 69 66 28 20 73 71 6c 69 74 65 33 57 61 6c 6b   if( sqlite3Walk
2b510 53 65 6c 65 63 74 28 70 57 61 6c 6b 65 72 2c 20  Select(pWalker, 
2b520 70 53 65 6c 29 20 29 20 72 65 74 75 72 6e 20 57  pSel) ) return W
2b530 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 20 20  RC_Abort;.      
2b540 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 61 6e  if( sqlite3Expan
2b550 64 53 75 62 71 75 65 72 79 28 70 50 61 72 73 65  dSubquery(pParse
2b560 2c 20 70 46 72 6f 6d 29 20 29 20 72 65 74 75 72  , pFrom) ) retur
2b570 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 23 65 6e  n WRC_Abort;.#en
2b580 64 69 66 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  dif.    }else{. 
2b590 20 20 20 20 20 2f 2a 20 41 6e 20 6f 72 64 69 6e       /* An ordin
2b5a0 61 72 79 20 74 61 62 6c 65 20 6f 72 20 76 69 65  ary table or vie
2b5b0 77 20 6e 61 6d 65 20 69 6e 20 74 68 65 20 46 52  w name in the FR
2b5c0 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20  OM clause */.   
2b5d0 20 20 20 61 73 73 65 72 74 28 20 70 46 72 6f 6d     assert( pFrom
2b5e0 2d 3e 70 54 61 62 3d 3d 30 20 29 3b 0a 20 20 20  ->pTab==0 );.   
2b5f0 20 20 20 70 46 72 6f 6d 2d 3e 70 54 61 62 20 3d     pFrom->pTab =
2b600 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33 4c   pTab = sqlite3L
2b610 6f 63 61 74 65 54 61 62 6c 65 49 74 65 6d 28 70  ocateTableItem(p
2b620 50 61 72 73 65 2c 20 30 2c 20 70 46 72 6f 6d 29  Parse, 0, pFrom)
2b630 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54 61 62  ;.      if( pTab
2b640 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 57 52 43  ==0 ) return WRC
2b650 5f 41 62 6f 72 74 3b 0a 20 20 20 20 20 20 69 66  _Abort;.      if
2b660 28 20 70 54 61 62 2d 3e 6e 54 61 62 52 65 66 3e  ( pTab->nTabRef>
2b670 3d 30 78 66 66 66 66 20 29 7b 0a 20 20 20 20 20  =0xffff ){.     
2b680 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
2b690 73 67 28 70 50 61 72 73 65 2c 20 22 74 6f 6f 20  sg(pParse, "too 
2b6a0 6d 61 6e 79 20 72 65 66 65 72 65 6e 63 65 73 20  many references 
2b6b0 74 6f 20 5c 22 25 73 5c 22 3a 20 6d 61 78 20 36  to \"%s\": max 6
2b6c0 35 35 33 35 22 2c 0a 20 20 20 20 20 20 20 20 20  5535",.         
2b6d0 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a    pTab->zName);.
2b6e0 20 20 20 20 20 20 20 20 70 46 72 6f 6d 2d 3e 70          pFrom->p
2b6f0 54 61 62 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  Tab = 0;.       
2b700 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72   return WRC_Abor
2b710 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  t;.      }.     
2b720 20 70 54 61 62 2d 3e 6e 54 61 62 52 65 66 2b 2b   pTab->nTabRef++
2b730 3b 0a 20 20 20 20 20 20 69 66 28 20 21 49 73 56  ;.      if( !IsV
2b740 69 72 74 75 61 6c 28 70 54 61 62 29 20 26 26 20  irtual(pTab) && 
2b750 63 61 6e 6e 6f 74 42 65 46 75 6e 63 74 69 6f 6e  cannotBeFunction
2b760 28 70 50 61 72 73 65 2c 20 70 46 72 6f 6d 29 20  (pParse, pFrom) 
2b770 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
2b780 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20  n WRC_Abort;.   
2b790 20 20 20 7d 0a 23 69 66 20 21 64 65 66 69 6e 65     }.#if !define
2b7a0 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  d(SQLITE_OMIT_VI
2b7b0 45 57 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 20  EW) || !defined 
2b7c0 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52  (SQLITE_OMIT_VIR
2b7d0 54 55 41 4c 54 41 42 4c 45 29 0a 20 20 20 20 20  TUALTABLE).     
2b7e0 20 69 66 28 20 49 73 56 69 72 74 75 61 6c 28 70   if( IsVirtual(p
2b7f0 54 61 62 29 20 7c 7c 20 70 54 61 62 2d 3e 70 53  Tab) || pTab->pS
2b800 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20 20  elect ){.       
2b810 20 69 31 36 20 6e 43 6f 6c 3b 0a 20 20 20 20 20   i16 nCol;.     
2b820 20 20 20 75 38 20 65 43 6f 64 65 4f 72 69 67 20     u8 eCodeOrig 
2b830 3d 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65  = pWalker->eCode
2b840 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71  ;.        if( sq
2b850 6c 69 74 65 33 56 69 65 77 47 65 74 43 6f 6c 75  lite3ViewGetColu
2b860 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73 65 2c 20  mnNames(pParse, 
2b870 70 54 61 62 29 20 29 20 72 65 74 75 72 6e 20 57  pTab) ) return W
2b880 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 20 20  RC_Abort;.      
2b890 20 20 61 73 73 65 72 74 28 20 70 46 72 6f 6d 2d    assert( pFrom-
2b8a0 3e 70 53 65 6c 65 63 74 3d 3d 30 20 29 3b 0a 20  >pSelect==0 );. 
2b8b0 20 20 20 20 20 20 20 69 66 28 20 70 54 61 62 2d         if( pTab-
2b8c0 3e 70 53 65 6c 65 63 74 20 26 26 20 28 64 62 2d  >pSelect && (db-
2b8d0 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  >flags & SQLITE_
2b8e0 45 6e 61 62 6c 65 56 69 65 77 29 3d 3d 30 20 29  EnableView)==0 )
2b8f0 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
2b900 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
2b910 73 65 2c 20 22 61 63 63 65 73 73 20 74 6f 20 76  se, "access to v
2b920 69 65 77 20 5c 22 25 73 5c 22 20 70 72 6f 68 69  iew \"%s\" prohi
2b930 62 69 74 65 64 22 2c 0a 20 20 20 20 20 20 20 20  bited",.        
2b940 20 20 20 20 20 20 70 54 61 62 2d 3e 7a 4e 61 6d        pTab->zNam
2b950 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  e);.        }.  
2b960 20 20 20 20 20 20 70 46 72 6f 6d 2d 3e 70 53 65        pFrom->pSe
2b970 6c 65 63 74 20 3d 20 73 71 6c 69 74 65 33 53 65  lect = sqlite3Se
2b980 6c 65 63 74 44 75 70 28 64 62 2c 20 70 54 61 62  lectDup(db, pTab
2b990 2d 3e 70 53 65 6c 65 63 74 2c 20 30 29 3b 0a 20  ->pSelect, 0);. 
2b9a0 20 20 20 20 20 20 20 6e 43 6f 6c 20 3d 20 70 54         nCol = pT
2b9b0 61 62 2d 3e 6e 43 6f 6c 3b 0a 20 20 20 20 20 20  ab->nCol;.      
2b9c0 20 20 70 54 61 62 2d 3e 6e 43 6f 6c 20 3d 20 2d    pTab->nCol = -
2b9d0 31 3b 0a 20 20 20 20 20 20 20 20 70 57 61 6c 6b  1;.        pWalk
2b9e0 65 72 2d 3e 65 43 6f 64 65 20 3d 20 31 3b 20 20  er->eCode = 1;  
2b9f0 2f 2a 20 54 75 72 6e 20 6f 6e 20 53 65 6c 65 63  /* Turn on Selec
2ba00 74 2e 73 65 6c 49 64 20 72 65 6e 75 6d 62 65 72  t.selId renumber
2ba10 69 6e 67 20 2a 2f 0a 20 20 20 20 20 20 20 20 73  ing */.        s
2ba20 71 6c 69 74 65 33 57 61 6c 6b 53 65 6c 65 63 74  qlite3WalkSelect
2ba30 28 70 57 61 6c 6b 65 72 2c 20 70 46 72 6f 6d 2d  (pWalker, pFrom-
2ba40 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 20  >pSelect);.     
2ba50 20 20 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64     pWalker->eCod
2ba60 65 20 3d 20 65 43 6f 64 65 4f 72 69 67 3b 0a 20  e = eCodeOrig;. 
2ba70 20 20 20 20 20 20 20 70 54 61 62 2d 3e 6e 43 6f         pTab->nCo
2ba80 6c 20 3d 20 6e 43 6f 6c 3b 0a 20 20 20 20 20 20  l = nCol;.      
2ba90 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 0a  }.#endif.    }..
2baa0 20 20 20 20 2f 2a 20 4c 6f 63 61 74 65 20 74 68      /* Locate th
2bab0 65 20 69 6e 64 65 78 20 6e 61 6d 65 64 20 62 79  e index named by
2bac0 20 74 68 65 20 49 4e 44 45 58 45 44 20 42 59 20   the INDEXED BY 
2bad0 63 6c 61 75 73 65 2c 20 69 66 20 61 6e 79 2e 20  clause, if any. 
2bae0 2a 2f 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  */.    if( sqlit
2baf0 65 33 49 6e 64 65 78 65 64 42 79 4c 6f 6f 6b 75  e3IndexedByLooku
2bb00 70 28 70 50 61 72 73 65 2c 20 70 46 72 6f 6d 29  p(pParse, pFrom)
2bb10 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
2bb20 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20   WRC_Abort;.    
2bb30 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 50 72 6f 63  }.  }..  /* Proc
2bb40 65 73 73 20 4e 41 54 55 52 41 4c 20 6b 65 79 77  ess NATURAL keyw
2bb50 6f 72 64 73 2c 20 61 6e 64 20 4f 4e 20 61 6e 64  ords, and ON and
2bb60 20 55 53 49 4e 47 20 63 6c 61 75 73 65 73 20 6f   USING clauses o
2bb70 66 20 6a 6f 69 6e 73 2e 0a 20 20 2a 2f 0a 20 20  f joins..  */.  
2bb80 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
2bb90 69 6c 65 64 20 7c 7c 20 73 71 6c 69 74 65 50 72  iled || sqlitePr
2bba0 6f 63 65 73 73 4a 6f 69 6e 28 70 50 61 72 73 65  ocessJoin(pParse
2bbb0 2c 20 70 29 20 29 7b 0a 20 20 20 20 72 65 74 75  , p) ){.    retu
2bbc0 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20  rn WRC_Abort;.  
2bbd0 7d 0a 0a 20 20 2f 2a 20 46 6f 72 20 65 76 65 72  }..  /* For ever
2bbe0 79 20 22 2a 22 20 74 68 61 74 20 6f 63 63 75 72  y "*" that occur
2bbf0 73 20 69 6e 20 74 68 65 20 63 6f 6c 75 6d 6e 20  s in the column 
2bc00 6c 69 73 74 2c 20 69 6e 73 65 72 74 20 74 68 65  list, insert the
2bc10 20 6e 61 6d 65 73 20 6f 66 0a 20 20 2a 2a 20 61   names of.  ** a
2bc20 6c 6c 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 61 6c  ll columns in al
2bc30 6c 20 74 61 62 6c 65 73 2e 20 20 41 6e 64 20 66  l tables.  And f
2bc40 6f 72 20 65 76 65 72 79 20 54 41 42 4c 45 2e 2a  or every TABLE.*
2bc50 20 69 6e 73 65 72 74 20 74 68 65 20 6e 61 6d 65   insert the name
2bc60 73 0a 20 20 2a 2a 20 6f 66 20 61 6c 6c 20 63 6f  s.  ** of all co
2bc70 6c 75 6d 6e 73 20 69 6e 20 54 41 42 4c 45 2e 20  lumns in TABLE. 
2bc80 20 54 68 65 20 70 61 72 73 65 72 20 69 6e 73 65   The parser inse
2bc90 72 74 65 64 20 61 20 73 70 65 63 69 61 6c 20 65  rted a special e
2bca0 78 70 72 65 73 73 69 6f 6e 0a 20 20 2a 2a 20 77  xpression.  ** w
2bcb0 69 74 68 20 74 68 65 20 54 4b 5f 41 53 54 45 52  ith the TK_ASTER
2bcc0 49 53 4b 20 6f 70 65 72 61 74 6f 72 20 66 6f 72  ISK operator for
2bcd0 20 65 61 63 68 20 22 2a 22 20 74 68 61 74 20 69   each "*" that i
2bce0 74 20 66 6f 75 6e 64 20 69 6e 20 74 68 65 20 63  t found in the c
2bcf0 6f 6c 75 6d 6e 0a 20 20 2a 2a 20 6c 69 73 74 2e  olumn.  ** list.
2bd00 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20    The following 
2bd10 63 6f 64 65 20 6a 75 73 74 20 68 61 73 20 74 6f  code just has to
2bd20 20 6c 6f 63 61 74 65 20 74 68 65 20 54 4b 5f 41   locate the TK_A
2bd30 53 54 45 52 49 53 4b 0a 20 20 2a 2a 20 65 78 70  STERISK.  ** exp
2bd40 72 65 73 73 69 6f 6e 73 20 61 6e 64 20 65 78 70  ressions and exp
2bd50 61 6e 64 20 65 61 63 68 20 6f 6e 65 20 74 6f 20  and each one to 
2bd60 74 68 65 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20  the list of all 
2bd70 63 6f 6c 75 6d 6e 73 20 69 6e 0a 20 20 2a 2a 20  columns in.  ** 
2bd80 61 6c 6c 20 74 61 62 6c 65 73 2e 0a 20 20 2a 2a  all tables..  **
2bd90 0a 20 20 2a 2a 20 54 68 65 20 66 69 72 73 74 20  .  ** The first 
2bda0 6c 6f 6f 70 20 6a 75 73 74 20 63 68 65 63 6b 73  loop just checks
2bdb0 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 72 65   to see if there
2bdc0 20 61 72 65 20 61 6e 79 20 22 2a 22 20 6f 70 65   are any "*" ope
2bdd0 72 61 74 6f 72 73 0a 20 20 2a 2a 20 74 68 61 74  rators.  ** that
2bde0 20 6e 65 65 64 20 65 78 70 61 6e 64 69 6e 67 2e   need expanding.
2bdf0 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 6b 3d 30 3b  .  */.  for(k=0;
2be00 20 6b 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72   k<pEList->nExpr
2be10 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 70 45 20 3d  ; k++){.    pE =
2be20 20 70 45 4c 69 73 74 2d 3e 61 5b 6b 5d 2e 70 45   pEList->a[k].pE
2be30 78 70 72 3b 0a 20 20 20 20 69 66 28 20 70 45 2d  xpr;.    if( pE-
2be40 3e 6f 70 3d 3d 54 4b 5f 41 53 54 45 52 49 53 4b  >op==TK_ASTERISK
2be50 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 61 73   ) break;.    as
2be60 73 65 72 74 28 20 70 45 2d 3e 6f 70 21 3d 54 4b  sert( pE->op!=TK
2be70 5f 44 4f 54 20 7c 7c 20 70 45 2d 3e 70 52 69 67  _DOT || pE->pRig
2be80 68 74 21 3d 30 20 29 3b 0a 20 20 20 20 61 73 73  ht!=0 );.    ass
2be90 65 72 74 28 20 70 45 2d 3e 6f 70 21 3d 54 4b 5f  ert( pE->op!=TK_
2bea0 44 4f 54 20 7c 7c 20 28 70 45 2d 3e 70 4c 65 66  DOT || (pE->pLef
2beb0 74 21 3d 30 20 26 26 20 70 45 2d 3e 70 4c 65 66  t!=0 && pE->pLef
2bec0 74 2d 3e 6f 70 3d 3d 54 4b 5f 49 44 29 20 29 3b  t->op==TK_ID) );
2bed0 0a 20 20 20 20 69 66 28 20 70 45 2d 3e 6f 70 3d  .    if( pE->op=
2bee0 3d 54 4b 5f 44 4f 54 20 26 26 20 70 45 2d 3e 70  =TK_DOT && pE->p
2bef0 52 69 67 68 74 2d 3e 6f 70 3d 3d 54 4b 5f 41 53  Right->op==TK_AS
2bf00 54 45 52 49 53 4b 20 29 20 62 72 65 61 6b 3b 0a  TERISK ) break;.
2bf10 20 20 20 20 65 6c 69 73 74 46 6c 61 67 73 20 7c      elistFlags |
2bf20 3d 20 70 45 2d 3e 66 6c 61 67 73 3b 0a 20 20 7d  = pE->flags;.  }
2bf30 0a 20 20 69 66 28 20 6b 3c 70 45 4c 69 73 74 2d  .  if( k<pEList-
2bf40 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 2f 2a  >nExpr ){.    /*
2bf50 0a 20 20 20 20 2a 2a 20 49 66 20 77 65 20 67 65  .    ** If we ge
2bf60 74 20 68 65 72 65 20 69 74 20 6d 65 61 6e 73 20  t here it means 
2bf70 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 63  the result set c
2bf80 6f 6e 74 61 69 6e 73 20 6f 6e 65 20 6f 72 20 6d  ontains one or m
2bf90 6f 72 65 20 22 2a 22 0a 20 20 20 20 2a 2a 20 6f  ore "*".    ** o
2bfa0 70 65 72 61 74 6f 72 73 20 74 68 61 74 20 6e 65  perators that ne
2bfb0 65 64 20 74 6f 20 62 65 20 65 78 70 61 6e 64 65  ed to be expande
2bfc0 64 2e 20 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68  d.  Loop through
2bfd0 20 65 61 63 68 20 65 78 70 72 65 73 73 69 6f 6e   each expression
2bfe0 0a 20 20 20 20 2a 2a 20 69 6e 20 74 68 65 20 72  .    ** in the r
2bff0 65 73 75 6c 74 20 73 65 74 20 61 6e 64 20 65 78  esult set and ex
2c000 70 61 6e 64 20 74 68 65 6d 20 6f 6e 65 20 62 79  pand them one by
2c010 20 6f 6e 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20   one..    */.   
2c020 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74   struct ExprList
2c030 5f 69 74 65 6d 20 2a 61 20 3d 20 70 45 4c 69 73  _item *a = pELis
2c040 74 2d 3e 61 3b 0a 20 20 20 20 45 78 70 72 4c 69  t->a;.    ExprLi
2c050 73 74 20 2a 70 4e 65 77 20 3d 20 30 3b 0a 20 20  st *pNew = 0;.  
2c060 20 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 70 50    int flags = pP
2c070 61 72 73 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 3b  arse->db->flags;
2c080 0a 20 20 20 20 69 6e 74 20 6c 6f 6e 67 4e 61 6d  .    int longNam
2c090 65 73 20 3d 20 28 66 6c 61 67 73 20 26 20 53 51  es = (flags & SQ
2c0a0 4c 49 54 45 5f 46 75 6c 6c 43 6f 6c 4e 61 6d 65  LITE_FullColName
2c0b0 73 29 21 3d 30 0a 20 20 20 20 20 20 20 20 20 20  s)!=0.          
2c0c0 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20 28              && (
2c0d0 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 53  flags & SQLITE_S
2c0e0 68 6f 72 74 43 6f 6c 4e 61 6d 65 73 29 3d 3d 30  hortColNames)==0
2c0f0 3b 0a 0a 20 20 20 20 66 6f 72 28 6b 3d 30 3b 20  ;..    for(k=0; 
2c100 6b 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b  k<pEList->nExpr;
2c110 20 6b 2b 2b 29 7b 0a 20 20 20 20 20 20 70 45 20   k++){.      pE 
2c120 3d 20 61 5b 6b 5d 2e 70 45 78 70 72 3b 0a 20 20  = a[k].pExpr;.  
2c130 20 20 20 20 65 6c 69 73 74 46 6c 61 67 73 20 7c      elistFlags |
2c140 3d 20 70 45 2d 3e 66 6c 61 67 73 3b 0a 20 20 20  = pE->flags;.   
2c150 20 20 20 70 52 69 67 68 74 20 3d 20 70 45 2d 3e     pRight = pE->
2c160 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20 61 73  pRight;.      as
2c170 73 65 72 74 28 20 70 45 2d 3e 6f 70 21 3d 54 4b  sert( pE->op!=TK
2c180 5f 44 4f 54 20 7c 7c 20 70 52 69 67 68 74 21 3d  _DOT || pRight!=
2c190 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  0 );.      if( p
2c1a0 45 2d 3e 6f 70 21 3d 54 4b 5f 41 53 54 45 52 49  E->op!=TK_ASTERI
2c1b0 53 4b 0a 20 20 20 20 20 20 20 26 26 20 28 70 45  SK.       && (pE
2c1c0 2d 3e 6f 70 21 3d 54 4b 5f 44 4f 54 20 7c 7c 20  ->op!=TK_DOT || 
2c1d0 70 52 69 67 68 74 2d 3e 6f 70 21 3d 54 4b 5f 41  pRight->op!=TK_A
2c1e0 53 54 45 52 49 53 4b 29 0a 20 20 20 20 20 20 29  STERISK).      )
2c1f0 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69  {.        /* Thi
2c200 73 20 70 61 72 74 69 63 75 6c 61 72 20 65 78 70  s particular exp
2c210 72 65 73 73 69 6f 6e 20 64 6f 65 73 20 6e 6f 74  ression does not
2c220 20 6e 65 65 64 20 74 6f 20 62 65 20 65 78 70 61   need to be expa
2c230 6e 64 65 64 2e 0a 20 20 20 20 20 20 20 20 2a 2f  nded..        */
2c240 0a 20 20 20 20 20 20 20 20 70 4e 65 77 20 3d 20  .        pNew = 
2c250 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41  sqlite3ExprListA
2c260 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20 70 4e  ppend(pParse, pN
2c270 65 77 2c 20 61 5b 6b 5d 2e 70 45 78 70 72 29 3b  ew, a[k].pExpr);
2c280 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4e 65  .        if( pNe
2c290 77 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  w ){.          p
2c2a0 4e 65 77 2d 3e 61 5b 70 4e 65 77 2d 3e 6e 45 78  New->a[pNew->nEx
2c2b0 70 72 2d 31 5d 2e 7a 4e 61 6d 65 20 3d 20 61 5b  pr-1].zName = a[
2c2c0 6b 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20  k].zName;.      
2c2d0 20 20 20 20 70 4e 65 77 2d 3e 61 5b 70 4e 65 77      pNew->a[pNew
2c2e0 2d 3e 6e 45 78 70 72 2d 31 5d 2e 7a 53 70 61 6e  ->nExpr-1].zSpan
2c2f0 20 3d 20 61 5b 6b 5d 2e 7a 53 70 61 6e 3b 0a 20   = a[k].zSpan;. 
2c300 20 20 20 20 20 20 20 20 20 61 5b 6b 5d 2e 7a 4e           a[k].zN
2c310 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ame = 0;.       
2c320 20 20 20 61 5b 6b 5d 2e 7a 53 70 61 6e 20 3d 20     a[k].zSpan = 
2c330 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  0;.        }.   
2c340 20 20 20 20 20 61 5b 6b 5d 2e 70 45 78 70 72 20       a[k].pExpr 
2c350 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  = 0;.      }else
2c360 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69  {.        /* Thi
2c370 73 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  s expression is 
2c380 61 20 22 2a 22 20 6f 72 20 61 20 22 54 41 42 4c  a "*" or a "TABL
2c390 45 2e 2a 22 20 61 6e 64 20 6e 65 65 64 73 20 74  E.*" and needs t
2c3a0 6f 20 62 65 0a 20 20 20 20 20 20 20 20 2a 2a 20  o be.        ** 
2c3b0 65 78 70 61 6e 64 65 64 2e 20 2a 2f 0a 20 20 20  expanded. */.   
2c3c0 20 20 20 20 20 69 6e 74 20 74 61 62 6c 65 53 65       int tableSe
2c3d0 65 6e 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20  en = 0;      /* 
2c3e0 53 65 74 20 74 6f 20 31 20 77 68 65 6e 20 54 41  Set to 1 when TA
2c3f0 42 4c 45 20 6d 61 74 63 68 65 73 20 2a 2f 0a 20  BLE matches */. 
2c400 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 54 4e         char *zTN
2c410 61 6d 65 20 3d 20 30 3b 20 20 20 20 20 20 20 2f  ame = 0;       /
2c420 2a 20 74 65 78 74 20 6f 66 20 6e 61 6d 65 20 6f  * text of name o
2c430 66 20 54 41 42 4c 45 20 2a 2f 0a 20 20 20 20 20  f TABLE */.     
2c440 20 20 20 69 66 28 20 70 45 2d 3e 6f 70 3d 3d 54     if( pE->op==T
2c450 4b 5f 44 4f 54 20 29 7b 0a 20 20 20 20 20 20 20  K_DOT ){.       
2c460 20 20 20 61 73 73 65 72 74 28 20 70 45 2d 3e 70     assert( pE->p
2c470 4c 65 66 74 21 3d 30 20 29 3b 0a 20 20 20 20 20  Left!=0 );.     
2c480 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78       assert( !Ex
2c490 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
2c4a0 2d 3e 70 4c 65 66 74 2c 20 45 50 5f 49 6e 74 56  ->pLeft, EP_IntV
2c4b0 61 6c 75 65 29 20 29 3b 0a 20 20 20 20 20 20 20  alue) );.       
2c4c0 20 20 20 7a 54 4e 61 6d 65 20 3d 20 70 45 2d 3e     zTName = pE->
2c4d0 70 4c 65 66 74 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b  pLeft->u.zToken;
2c4e0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
2c4f0 20 20 20 66 6f 72 28 69 3d 30 2c 20 70 46 72 6f     for(i=0, pFro
2c500 6d 3d 70 54 61 62 4c 69 73 74 2d 3e 61 3b 20 69  m=pTabList->a; i
2c510 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b  <pTabList->nSrc;
2c520 20 69 2b 2b 2c 20 70 46 72 6f 6d 2b 2b 29 7b 0a   i++, pFrom++){.
2c530 20 20 20 20 20 20 20 20 20 20 54 61 62 6c 65 20            Table 
2c540 2a 70 54 61 62 20 3d 20 70 46 72 6f 6d 2d 3e 70  *pTab = pFrom->p
2c550 54 61 62 3b 0a 20 20 20 20 20 20 20 20 20 20 53  Tab;.          S
2c560 65 6c 65 63 74 20 2a 70 53 75 62 20 3d 20 70 46  elect *pSub = pF
2c570 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a 20 20  rom->pSelect;.  
2c580 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 54          char *zT
2c590 61 62 4e 61 6d 65 20 3d 20 70 46 72 6f 6d 2d 3e  abName = pFrom->
2c5a0 7a 41 6c 69 61 73 3b 0a 20 20 20 20 20 20 20 20  zAlias;.        
2c5b0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53    const char *zS
2c5c0 63 68 65 6d 61 4e 61 6d 65 20 3d 20 30 3b 0a 20  chemaName = 0;. 
2c5d0 20 20 20 20 20 20 20 20 20 69 6e 74 20 69 44 62           int iDb
2c5e0 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
2c5f0 7a 54 61 62 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20  zTabName==0 ){. 
2c600 20 20 20 20 20 20 20 20 20 20 20 7a 54 61 62 4e             zTabN
2c610 61 6d 65 20 3d 20 70 54 61 62 2d 3e 7a 4e 61 6d  ame = pTab->zNam
2c620 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  e;.          }. 
2c630 20 20 20 20 20 20 20 20 20 69 66 28 20 64 62 2d           if( db-
2c640 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20  >mallocFailed ) 
2c650 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20  break;.         
2c660 20 69 66 28 20 70 53 75 62 3d 3d 30 20 7c 7c 20   if( pSub==0 || 
2c670 28 70 53 75 62 2d 3e 73 65 6c 46 6c 61 67 73 20  (pSub->selFlags 
2c680 26 20 53 46 5f 4e 65 73 74 65 64 46 72 6f 6d 29  & SF_NestedFrom)
2c690 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
2c6a0 20 20 20 70 53 75 62 20 3d 20 30 3b 0a 20 20 20     pSub = 0;.   
2c6b0 20 20 20 20 20 20 20 20 20 69 66 28 20 7a 54 4e           if( zTN
2c6c0 61 6d 65 20 26 26 20 73 71 6c 69 74 65 33 53 74  ame && sqlite3St
2c6d0 72 49 43 6d 70 28 7a 54 4e 61 6d 65 2c 20 7a 54  rICmp(zTName, zT
2c6e0 61 62 4e 61 6d 65 29 21 3d 30 20 29 7b 0a 20 20  abName)!=0 ){.  
2c6f0 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74              cont
2c700 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20  inue;.          
2c710 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
2c720 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68  iDb = sqlite3Sch
2c730 65 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c 20 70  emaToIndex(db, p
2c740 54 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20  Tab->pSchema);. 
2c750 20 20 20 20 20 20 20 20 20 20 20 7a 53 63 68 65             zSche
2c760 6d 61 4e 61 6d 65 20 3d 20 69 44 62 3e 3d 30 20  maName = iDb>=0 
2c770 3f 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a  ? db->aDb[iDb].z
2c780 44 62 53 4e 61 6d 65 20 3a 20 22 2a 22 3b 0a 20  DbSName : "*";. 
2c790 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
2c7a0 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c       for(j=0; j<
2c7b0 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29  pTab->nCol; j++)
2c7c0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 68  {.            ch
2c7d0 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 70 54 61 62  ar *zName = pTab
2c7e0 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 3b  ->aCol[j].zName;
2c7f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 68 61  .            cha
2c800 72 20 2a 7a 43 6f 6c 6e 61 6d 65 3b 20 20 2f 2a  r *zColname;  /*
2c810 20 54 68 65 20 63 6f 6d 70 75 74 65 64 20 63 6f   The computed co
2c820 6c 75 6d 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 20  lumn name */.   
2c830 20 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a           char *z
2c840 54 6f 46 72 65 65 3b 20 20 20 2f 2a 20 4d 61 6c  ToFree;   /* Mal
2c850 6c 6f 63 65 64 20 73 74 72 69 6e 67 20 74 68 61  loced string tha
2c860 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20 66 72  t needs to be fr
2c870 65 65 64 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  eed */.         
2c880 20 20 20 54 6f 6b 65 6e 20 73 43 6f 6c 6e 61 6d     Token sColnam
2c890 65 3b 20 20 2f 2a 20 43 6f 6d 70 75 74 65 64 20  e;  /* Computed 
2c8a0 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 61 73 20 61  column name as a
2c8b0 20 74 6f 6b 65 6e 20 2a 2f 0a 0a 20 20 20 20 20   token */..     
2c8c0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 7a         assert( z
2c8d0 4e 61 6d 65 20 29 3b 0a 20 20 20 20 20 20 20 20  Name );.        
2c8e0 20 20 20 20 69 66 28 20 7a 54 4e 61 6d 65 20 26      if( zTName &
2c8f0 26 20 70 53 75 62 0a 20 20 20 20 20 20 20 20 20  & pSub.         
2c900 20 20 20 20 26 26 20 73 71 6c 69 74 65 33 4d 61      && sqlite3Ma
2c910 74 63 68 53 70 61 6e 4e 61 6d 65 28 70 53 75 62  tchSpanName(pSub
2c920 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 7a  ->pEList->a[j].z
2c930 53 70 61 6e 2c 20 30 2c 20 7a 54 4e 61 6d 65 2c  Span, 0, zTName,
2c940 20 30 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 20   0)==0.         
2c950 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20     ){.          
2c960 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
2c970 20 20 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20            }..   
2c980 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 61           /* If a
2c990 20 63 6f 6c 75 6d 6e 20 69 73 20 6d 61 72 6b 65   column is marke
2c9a0 64 20 61 73 20 27 68 69 64 64 65 6e 27 2c 20 6f  d as 'hidden', o
2c9b0 6d 69 74 20 69 74 20 66 72 6f 6d 20 74 68 65 20  mit it from the 
2c9c0 65 78 70 61 6e 64 65 64 0a 20 20 20 20 20 20 20  expanded.       
2c9d0 20 20 20 20 20 2a 2a 20 72 65 73 75 6c 74 2d 73       ** result-s
2c9e0 65 74 20 6c 69 73 74 20 75 6e 6c 65 73 73 20 74  et list unless t
2c9f0 68 65 20 53 45 4c 45 43 54 20 68 61 73 20 74 68  he SELECT has th
2ca00 65 20 53 46 5f 49 6e 63 6c 75 64 65 48 69 64 64  e SF_IncludeHidd
2ca10 65 6e 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  en.            *
2ca20 2a 20 62 69 74 20 73 65 74 2e 0a 20 20 20 20 20  * bit set..     
2ca30 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
2ca40 20 20 20 20 20 20 69 66 28 20 28 70 2d 3e 73 65        if( (p->se
2ca50 6c 46 6c 61 67 73 20 26 20 53 46 5f 49 6e 63 6c  lFlags & SF_Incl
2ca60 75 64 65 48 69 64 64 65 6e 29 3d 3d 30 0a 20 20  udeHidden)==0.  
2ca70 20 20 20 20 20 20 20 20 20 20 20 26 26 20 49 73             && Is
2ca80 48 69 64 64 65 6e 43 6f 6c 75 6d 6e 28 26 70 54  HiddenColumn(&pT
2ca90 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 29 20 0a 20 20  ab->aCol[j]) .  
2caa0 20 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20            ){.   
2cab0 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69             conti
2cac0 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20  nue;.           
2cad0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74   }.            t
2cae0 61 62 6c 65 53 65 65 6e 20 3d 20 31 3b 0a 0a 20  ableSeen = 1;.. 
2caf0 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69             if( i
2cb00 3e 30 20 26 26 20 7a 54 4e 61 6d 65 3d 3d 30 20  >0 && zTName==0 
2cb10 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
2cb20 20 69 66 28 20 28 70 46 72 6f 6d 2d 3e 66 67 2e   if( (pFrom->fg.
2cb30 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 4e 41  jointype & JT_NA
2cb40 54 55 52 41 4c 29 21 3d 30 0a 20 20 20 20 20 20  TURAL)!=0.      
2cb50 20 20 20 20 20 20 20 20 20 20 26 26 20 74 61 62            && tab
2cb60 6c 65 41 6e 64 43 6f 6c 75 6d 6e 49 6e 64 65 78  leAndColumnIndex
2cb70 28 70 54 61 62 4c 69 73 74 2c 20 69 2c 20 7a 4e  (pTabList, i, zN
2cb80 61 6d 65 2c 20 30 2c 20 30 29 0a 20 20 20 20 20  ame, 0, 0).     
2cb90 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20           ){.    
2cba0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
2cbb0 6e 20 61 20 4e 41 54 55 52 41 4c 20 6a 6f 69 6e  n a NATURAL join
2cbc0 2c 20 6f 6d 69 74 20 74 68 65 20 6a 6f 69 6e 20  , omit the join 
2cbd0 63 6f 6c 75 6d 6e 73 20 66 72 6f 6d 20 74 68 65  columns from the
2cbe0 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
2cbf0 20 20 2a 2a 20 74 61 62 6c 65 20 74 6f 20 74 68    ** table to th
2cc00 65 20 72 69 67 68 74 20 6f 66 20 74 68 65 20 6a  e right of the j
2cc10 6f 69 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  oin */.         
2cc20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b         continue;
2cc30 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  .              }
2cc40 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
2cc50 66 28 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74  f( sqlite3IdList
2cc60 49 6e 64 65 78 28 70 46 72 6f 6d 2d 3e 70 55 73  Index(pFrom->pUs
2cc70 69 6e 67 2c 20 7a 4e 61 6d 65 29 3e 3d 30 20 29  ing, zName)>=0 )
2cc80 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
2cc90 20 20 2f 2a 20 49 6e 20 61 20 6a 6f 69 6e 20 77    /* In a join w
2cca0 69 74 68 20 61 20 55 53 49 4e 47 20 63 6c 61 75  ith a USING clau
2ccb0 73 65 2c 20 6f 6d 69 74 20 63 6f 6c 75 6d 6e 73  se, omit columns
2ccc0 20 69 6e 20 74 68 65 0a 20 20 20 20 20 20 20 20   in the.        
2ccd0 20 20 20 20 20 20 20 20 2a 2a 20 75 73 69 6e 67          ** using
2cce0 20 63 6c 61 75 73 65 20 66 72 6f 6d 20 74 68 65   clause from the
2ccf0 20 74 61 62 6c 65 20 6f 6e 20 74 68 65 20 72 69   table on the ri
2cd00 67 68 74 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  ght. */.        
2cd10 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65          continue
2cd20 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
2cd30 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  }.            }.
2cd40 20 20 20 20 20 20 20 20 20 20 20 20 70 52 69 67              pRig
2cd50 68 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ht = sqlite3Expr
2cd60 28 64 62 2c 20 54 4b 5f 49 44 2c 20 7a 4e 61 6d  (db, TK_ID, zNam
2cd70 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  e);.            
2cd80 7a 43 6f 6c 6e 61 6d 65 20 3d 20 7a 4e 61 6d 65  zColname = zName
2cd90 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a 54  ;.            zT
2cda0 6f 46 72 65 65 20 3d 20 30 3b 0a 20 20 20 20 20  oFree = 0;.     
2cdb0 20 20 20 20 20 20 20 69 66 28 20 6c 6f 6e 67 4e         if( longN
2cdc0 61 6d 65 73 20 7c 7c 20 70 54 61 62 4c 69 73 74  ames || pTabList
2cdd0 2d 3e 6e 53 72 63 3e 31 20 29 7b 0a 20 20 20 20  ->nSrc>1 ){.    
2cde0 20 20 20 20 20 20 20 20 20 20 45 78 70 72 20 2a            Expr *
2cdf0 70 4c 65 66 74 3b 0a 20 20 20 20 20 20 20 20 20  pLeft;.         
2ce00 20 20 20 20 20 70 4c 65 66 74 20 3d 20 73 71 6c       pLeft = sql
2ce10 69 74 65 33 45 78 70 72 28 64 62 2c 20 54 4b 5f  ite3Expr(db, TK_
2ce20 49 44 2c 20 7a 54 61 62 4e 61 6d 65 29 3b 0a 20  ID, zTabName);. 
2ce30 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78               pEx
2ce40 70 72 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70  pr = sqlite3PExp
2ce50 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 44 4f 54  r(pParse, TK_DOT
2ce60 2c 20 70 4c 65 66 74 2c 20 70 52 69 67 68 74 29  , pLeft, pRight)
2ce70 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
2ce80 69 66 28 20 7a 53 63 68 65 6d 61 4e 61 6d 65 20  if( zSchemaName 
2ce90 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
2cea0 20 20 20 70 4c 65 66 74 20 3d 20 73 71 6c 69 74     pLeft = sqlit
2ceb0 65 33 45 78 70 72 28 64 62 2c 20 54 4b 5f 49 44  e3Expr(db, TK_ID
2cec0 2c 20 7a 53 63 68 65 6d 61 4e 61 6d 65 29 3b 0a  , zSchemaName);.
2ced0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cee0 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 50  pExpr = sqlite3P
2cef0 45 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f  Expr(pParse, TK_
2cf00 44 4f 54 2c 20 70 4c 65 66 74 2c 20 70 45 78 70  DOT, pLeft, pExp
2cf10 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  r);.            
2cf20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
2cf30 20 20 69 66 28 20 6c 6f 6e 67 4e 61 6d 65 73 20    if( longNames 
2cf40 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
2cf50 20 20 20 7a 43 6f 6c 6e 61 6d 65 20 3d 20 73 71     zColname = sq
2cf60 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c  lite3MPrintf(db,
2cf70 20 22 25 73 2e 25 73 22 2c 20 7a 54 61 62 4e 61   "%s.%s", zTabNa
2cf80 6d 65 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  me, zName);.    
2cf90 20 20 20 20 20 20 20 20 20 20 20 20 7a 54 6f 46              zToF
2cfa0 72 65 65 20 3d 20 7a 43 6f 6c 6e 61 6d 65 3b 0a  ree = zColname;.
2cfb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a                }.
2cfc0 20 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73              }els
2cfd0 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e{.             
2cfe0 20 70 45 78 70 72 20 3d 20 70 52 69 67 68 74 3b   pExpr = pRight;
2cff0 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
2d000 20 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 20             pNew 
2d010 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  = sqlite3ExprLis
2d020 74 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20  tAppend(pParse, 
2d030 70 4e 65 77 2c 20 70 45 78 70 72 29 3b 0a 20 20  pNew, pExpr);.  
2d040 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
2d050 33 54 6f 6b 65 6e 49 6e 69 74 28 26 73 43 6f 6c  3TokenInit(&sCol
2d060 6e 61 6d 65 2c 20 7a 43 6f 6c 6e 61 6d 65 29 3b  name, zColname);
2d070 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
2d080 69 74 65 33 45 78 70 72 4c 69 73 74 53 65 74 4e  ite3ExprListSetN
2d090 61 6d 65 28 70 50 61 72 73 65 2c 20 70 4e 65 77  ame(pParse, pNew
2d0a0 2c 20 26 73 43 6f 6c 6e 61 6d 65 2c 20 30 29 3b  , &sColname, 0);
2d0b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
2d0c0 20 70 4e 65 77 20 26 26 20 28 70 2d 3e 73 65 6c   pNew && (p->sel
2d0d0 46 6c 61 67 73 20 26 20 53 46 5f 4e 65 73 74 65  Flags & SF_Neste
2d0e0 64 46 72 6f 6d 29 21 3d 30 20 29 7b 0a 20 20 20  dFrom)!=0 ){.   
2d0f0 20 20 20 20 20 20 20 20 20 20 20 73 74 72 75 63             struc
2d100 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20  t ExprList_item 
2d110 2a 70 58 20 3d 20 26 70 4e 65 77 2d 3e 61 5b 70  *pX = &pNew->a[p
2d120 4e 65 77 2d 3e 6e 45 78 70 72 2d 31 5d 3b 0a 20  New->nExpr-1];. 
2d130 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28               if(
2d140 20 70 53 75 62 20 29 7b 0a 20 20 20 20 20 20 20   pSub ){.       
2d150 20 20 20 20 20 20 20 20 20 70 58 2d 3e 7a 53 70           pX->zSp
2d160 61 6e 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74  an = sqlite3DbSt
2d170 72 44 75 70 28 64 62 2c 20 70 53 75 62 2d 3e 70  rDup(db, pSub->p
2d180 45 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 7a 53 70 61  EList->a[j].zSpa
2d190 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  n);.            
2d1a0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 58      testcase( pX
2d1b0 2d 3e 7a 53 70 61 6e 3d 3d 30 20 29 3b 0a 20 20  ->zSpan==0 );.  
2d1c0 20 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73              }els
2d1d0 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e{.             
2d1e0 20 20 20 70 58 2d 3e 7a 53 70 61 6e 20 3d 20 73     pX->zSpan = s
2d1f0 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62  qlite3MPrintf(db
2d200 2c 20 22 25 73 2e 25 73 2e 25 73 22 2c 0a 20 20  , "%s.%s.%s",.  
2d210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d230 20 20 20 20 20 20 20 20 20 7a 53 63 68 65 6d 61           zSchema
2d240 4e 61 6d 65 2c 20 7a 54 61 62 4e 61 6d 65 2c 20  Name, zTabName, 
2d250 7a 43 6f 6c 6e 61 6d 65 29 3b 0a 20 20 20 20 20  zColname);.     
2d260 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63             testc
2d270 61 73 65 28 20 70 58 2d 3e 7a 53 70 61 6e 3d 3d  ase( pX->zSpan==
2d280 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  0 );.           
2d290 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
2d2a0 20 20 20 70 58 2d 3e 62 53 70 61 6e 49 73 54 61     pX->bSpanIsTa
2d2b0 62 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20  b = 1;.         
2d2c0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
2d2d0 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
2d2e0 62 2c 20 7a 54 6f 46 72 65 65 29 3b 0a 20 20 20  b, zToFree);.   
2d2f0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2d300 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 21   }.        if( !
2d310 74 61 62 6c 65 53 65 65 6e 20 29 7b 0a 20 20 20  tableSeen ){.   
2d320 20 20 20 20 20 20 20 69 66 28 20 7a 54 4e 61 6d         if( zTNam
2d330 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  e ){.           
2d340 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
2d350 28 70 50 61 72 73 65 2c 20 22 6e 6f 20 73 75 63  (pParse, "no suc
2d360 68 20 74 61 62 6c 65 3a 20 25 73 22 2c 20 7a 54  h table: %s", zT
2d370 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Name);.         
2d380 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
2d390 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
2d3a0 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6e 6f 20  Msg(pParse, "no 
2d3b0 74 61 62 6c 65 73 20 73 70 65 63 69 66 69 65 64  tables specified
2d3c0 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ");.          }.
2d3d0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2d3e0 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  }.    }.    sqli
2d3f0 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74  te3ExprListDelet
2d400 65 28 64 62 2c 20 70 45 4c 69 73 74 29 3b 0a 20  e(db, pEList);. 
2d410 20 20 20 70 2d 3e 70 45 4c 69 73 74 20 3d 20 70     p->pEList = p
2d420 4e 65 77 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  New;.  }.  if( p
2d430 2d 3e 70 45 4c 69 73 74 20 29 7b 0a 20 20 20 20  ->pEList ){.    
2d440 69 66 28 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e  if( p->pEList->n
2d450 45 78 70 72 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b  Expr>db->aLimit[
2d460 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 43 4f 4c  SQLITE_LIMIT_COL
2d470 55 4d 4e 5d 20 29 7b 0a 20 20 20 20 20 20 73 71  UMN] ){.      sq
2d480 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
2d490 61 72 73 65 2c 20 22 74 6f 6f 20 6d 61 6e 79 20  arse, "too many 
2d4a0 63 6f 6c 75 6d 6e 73 20 69 6e 20 72 65 73 75 6c  columns in resul
2d4b0 74 20 73 65 74 22 29 3b 0a 20 20 20 20 20 20 72  t set");.      r
2d4c0 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b  eturn WRC_Abort;
2d4d0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 28  .    }.    if( (
2d4e0 65 6c 69 73 74 46 6c 61 67 73 20 26 20 28 45 50  elistFlags & (EP
2d4f0 5f 48 61 73 46 75 6e 63 7c 45 50 5f 53 75 62 71  _HasFunc|EP_Subq
2d500 75 65 72 79 29 29 21 3d 30 20 29 7b 0a 20 20 20  uery))!=0 ){.   
2d510 20 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 7c     p->selFlags |
2d520 3d 20 53 46 5f 43 6f 6d 70 6c 65 78 52 65 73 75  = SF_ComplexResu
2d530 6c 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  lt;.    }.  }.  
2d540 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69  return WRC_Conti
2d550 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4e 6f  nue;.}../*.** No
2d560 2d 6f 70 20 72 6f 75 74 69 6e 65 20 66 6f 72 20  -op routine for 
2d570 74 68 65 20 70 61 72 73 65 2d 74 72 65 65 20 77  the parse-tree w
2d580 61 6c 6b 65 72 2e 0a 2a 2a 0a 2a 2a 20 57 68 65  alker..**.** Whe
2d590 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  n this routine i
2d5a0 73 20 74 68 65 20 57 61 6c 6b 65 72 2e 78 45 78  s the Walker.xEx
2d5b0 70 72 43 61 6c 6c 62 61 63 6b 20 74 68 65 6e 20  prCallback then 
2d5c0 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 73  expression trees
2d5d0 0a 2a 2a 20 61 72 65 20 77 61 6c 6b 65 64 20 77  .** are walked w
2d5e0 69 74 68 6f 75 74 20 61 6e 79 20 61 63 74 69 6f  ithout any actio
2d5f0 6e 73 20 62 65 69 6e 67 20 74 61 6b 65 6e 20 61  ns being taken a
2d600 74 20 65 61 63 68 20 6e 6f 64 65 2e 20 20 50 72  t each node.  Pr
2d610 65 73 75 6d 61 62 6c 79 2c 0a 2a 2a 20 77 68 65  esumably,.** whe
2d620 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  n this routine i
2d630 73 20 75 73 65 64 20 66 6f 72 20 57 61 6c 6b 65  s used for Walke
2d640 72 2e 78 45 78 70 72 43 61 6c 6c 62 61 63 6b 20  r.xExprCallback 
2d650 74 68 65 6e 20 0a 2a 2a 20 57 61 6c 6b 65 72 2e  then .** Walker.
2d660 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20  xSelectCallback 
2d670 69 73 20 73 65 74 20 74 6f 20 64 6f 20 73 6f 6d  is set to do som
2d680 65 74 68 69 6e 67 20 75 73 65 66 75 6c 20 66 6f  ething useful fo
2d690 72 20 65 76 65 72 79 20 0a 2a 2a 20 73 75 62 71  r every .** subq
2d6a0 75 65 72 79 20 69 6e 20 74 68 65 20 70 61 72 73  uery in the pars
2d6b0 65 72 20 74 72 65 65 2e 0a 2a 2f 0a 69 6e 74 20  er tree..*/.int 
2d6c0 73 71 6c 69 74 65 33 45 78 70 72 57 61 6c 6b 4e  sqlite3ExprWalkN
2d6d0 6f 6f 70 28 57 61 6c 6b 65 72 20 2a 4e 6f 74 55  oop(Walker *NotU
2d6e0 73 65 64 2c 20 45 78 70 72 20 2a 4e 6f 74 55 73  sed, Expr *NotUs
2d6f0 65 64 32 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50  ed2){.  UNUSED_P
2d700 41 52 41 4d 45 54 45 52 32 28 4e 6f 74 55 73 65  ARAMETER2(NotUse
2d710 64 2c 20 4e 6f 74 55 73 65 64 32 29 3b 0a 20 20  d, NotUsed2);.  
2d720 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69  return WRC_Conti
2d730 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4e 6f  nue;.}../*.** No
2d740 2d 6f 70 20 72 6f 75 74 69 6e 65 20 66 6f 72 20  -op routine for 
2d750 74 68 65 20 70 61 72 73 65 2d 74 72 65 65 20 77  the parse-tree w
2d760 61 6c 6b 65 72 20 66 6f 72 20 53 45 4c 45 43 54  alker for SELECT
2d770 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 2a 2a 20   statements..** 
2d780 73 75 62 71 75 65 72 79 20 69 6e 20 74 68 65 20  subquery in the 
2d790 70 61 72 73 65 72 20 74 72 65 65 2e 0a 2a 2f 0a  parser tree..*/.
2d7a0 69 6e 74 20 73 71 6c 69 74 65 33 53 65 6c 65 63  int sqlite3Selec
2d7b0 74 57 61 6c 6b 4e 6f 6f 70 28 57 61 6c 6b 65 72  tWalkNoop(Walker
2d7c0 20 2a 4e 6f 74 55 73 65 64 2c 20 53 65 6c 65 63   *NotUsed, Selec
2d7d0 74 20 2a 4e 6f 74 55 73 65 64 32 29 7b 0a 20 20  t *NotUsed2){.  
2d7e0 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
2d7f0 32 28 4e 6f 74 55 73 65 64 2c 20 4e 6f 74 55 73  2(NotUsed, NotUs
2d800 65 64 32 29 3b 0a 20 20 72 65 74 75 72 6e 20 57  ed2);.  return W
2d810 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a  RC_Continue;.}..
2d820 23 69 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  #if SQLITE_DEBUG
2d830 0a 2f 2a 0a 2a 2a 20 41 6c 77 61 79 73 20 61 73  ./*.** Always as
2d840 73 65 72 74 2e 20 20 54 68 69 73 20 78 53 65 6c  sert.  This xSel
2d850 65 63 74 43 61 6c 6c 62 61 63 6b 32 20 69 6d 70  ectCallback2 imp
2d860 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 70 72 6f 76  lementation prov
2d870 65 73 20 74 68 61 74 20 74 68 65 0a 2a 2a 20 78  es that the.** x
2d880 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 32 20  SelectCallback2 
2d890 69 73 20 6e 65 76 65 72 20 69 6e 76 6f 6b 65 64  is never invoked
2d8a0 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
2d8b0 33 53 65 6c 65 63 74 57 61 6c 6b 41 73 73 65 72  3SelectWalkAsser
2d8c0 74 32 28 57 61 6c 6b 65 72 20 2a 4e 6f 74 55 73  t2(Walker *NotUs
2d8d0 65 64 2c 20 53 65 6c 65 63 74 20 2a 4e 6f 74 55  ed, Select *NotU
2d8e0 73 65 64 32 29 7b 0a 20 20 55 4e 55 53 45 44 5f  sed2){.  UNUSED_
2d8f0 50 41 52 41 4d 45 54 45 52 32 28 4e 6f 74 55 73  PARAMETER2(NotUs
2d900 65 64 2c 20 4e 6f 74 55 73 65 64 32 29 3b 0a 20  ed, NotUsed2);. 
2d910 20 61 73 73 65 72 74 28 20 30 20 29 3b 0a 7d 0a   assert( 0 );.}.
2d920 23 65 6e 64 69 66 0a 2f 2a 0a 2a 2a 20 54 68 69  #endif./*.** Thi
2d930 73 20 72 6f 75 74 69 6e 65 20 22 65 78 70 61 6e  s routine "expan
2d940 64 73 22 20 61 20 53 45 4c 45 43 54 20 73 74 61  ds" a SELECT sta
2d950 74 65 6d 65 6e 74 20 61 6e 64 20 61 6c 6c 20 6f  tement and all o
2d960 66 20 69 74 73 20 73 75 62 71 75 65 72 69 65 73  f its subqueries
2d970 2e 0a 2a 2a 20 46 6f 72 20 61 64 64 69 74 69 6f  ..** For additio
2d980 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  nal information 
2d990 6f 6e 20 77 68 61 74 20 69 74 20 6d 65 61 6e 73  on what it means
2d9a0 20 74 6f 20 22 65 78 70 61 6e 64 22 20 61 20 53   to "expand" a S
2d9b0 45 4c 45 43 54 0a 2a 2a 20 73 74 61 74 65 6d 65  ELECT.** stateme
2d9c0 6e 74 2c 20 73 65 65 20 74 68 65 20 63 6f 6d 6d  nt, see the comm
2d9d0 65 6e 74 20 6f 6e 20 74 68 65 20 73 65 6c 65 63  ent on the selec
2d9e0 74 45 78 70 61 6e 64 20 77 6f 72 6b 65 72 20 63  tExpand worker c
2d9f0 61 6c 6c 62 61 63 6b 20 61 62 6f 76 65 2e 0a 2a  allback above..*
2da00 2a 0a 2a 2a 20 45 78 70 61 6e 64 69 6e 67 20 61  *.** Expanding a
2da10 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
2da20 74 20 69 73 20 74 68 65 20 66 69 72 73 74 20 73  t is the first s
2da30 74 65 70 20 69 6e 20 70 72 6f 63 65 73 73 69 6e  tep in processin
2da40 67 20 61 0a 2a 2a 20 53 45 4c 45 43 54 20 73 74  g a.** SELECT st
2da50 61 74 65 6d 65 6e 74 2e 20 20 54 68 65 20 53 45  atement.  The SE
2da60 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 6d  LECT statement m
2da70 75 73 74 20 62 65 20 65 78 70 61 6e 64 65 64 20  ust be expanded 
2da80 62 65 66 6f 72 65 0a 2a 2a 20 6e 61 6d 65 20 72  before.** name r
2da90 65 73 6f 6c 75 74 69 6f 6e 20 69 73 20 70 65 72  esolution is per
2daa0 66 6f 72 6d 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  formed..**.** If
2dab0 20 61 6e 79 74 68 69 6e 67 20 67 6f 65 73 20 77   anything goes w
2dac0 72 6f 6e 67 2c 20 61 6e 20 65 72 72 6f 72 20 6d  rong, an error m
2dad0 65 73 73 61 67 65 20 69 73 20 77 72 69 74 74 65  essage is writte
2dae0 6e 20 69 6e 74 6f 20 70 50 61 72 73 65 2e 0a 2a  n into pParse..*
2daf0 2a 20 54 68 65 20 63 61 6c 6c 69 6e 67 20 66 75  * The calling fu
2db00 6e 63 74 69 6f 6e 20 63 61 6e 20 64 65 74 65 63  nction can detec
2db10 74 20 74 68 65 20 70 72 6f 62 6c 65 6d 20 62 79  t the problem by
2db20 20 6c 6f 6f 6b 69 6e 67 20 61 74 20 70 50 61 72   looking at pPar
2db30 73 65 2d 3e 6e 45 72 72 0a 2a 2a 20 61 6e 64 2f  se->nErr.** and/
2db40 6f 72 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d  or pParse->db->m
2db50 61 6c 6c 6f 63 46 61 69 6c 65 64 2e 0a 2a 2f 0a  allocFailed..*/.
2db60 73 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69  static void sqli
2db70 74 65 33 53 65 6c 65 63 74 45 78 70 61 6e 64 28  te3SelectExpand(
2db80 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53  Parse *pParse, S
2db90 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 29 7b  elect *pSelect){
2dba0 0a 20 20 57 61 6c 6b 65 72 20 77 3b 0a 20 20 77  .  Walker w;.  w
2dbb0 2e 78 45 78 70 72 43 61 6c 6c 62 61 63 6b 20 3d  .xExprCallback =
2dbc0 20 73 71 6c 69 74 65 33 45 78 70 72 57 61 6c 6b   sqlite3ExprWalk
2dbd0 4e 6f 6f 70 3b 0a 20 20 77 2e 70 50 61 72 73 65  Noop;.  w.pParse
2dbe0 20 3d 20 70 50 61 72 73 65 3b 0a 20 20 69 66 28   = pParse;.  if(
2dbf0 20 4f 4b 5f 49 46 5f 41 4c 57 41 59 53 5f 54 52   OK_IF_ALWAYS_TR
2dc00 55 45 28 70 50 61 72 73 65 2d 3e 68 61 73 43 6f  UE(pParse->hasCo
2dc10 6d 70 6f 75 6e 64 29 20 29 7b 0a 20 20 20 20 77  mpound) ){.    w
2dc20 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b  .xSelectCallback
2dc30 20 3d 20 63 6f 6e 76 65 72 74 43 6f 6d 70 6f 75   = convertCompou
2dc40 6e 64 53 65 6c 65 63 74 54 6f 53 75 62 71 75 65  ndSelectToSubque
2dc50 72 79 3b 0a 20 20 20 20 77 2e 78 53 65 6c 65 63  ry;.    w.xSelec
2dc60 74 43 61 6c 6c 62 61 63 6b 32 20 3d 20 30 3b 0a  tCallback2 = 0;.
2dc70 20 20 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 53      sqlite3WalkS
2dc80 65 6c 65 63 74 28 26 77 2c 20 70 53 65 6c 65 63  elect(&w, pSelec
2dc90 74 29 3b 0a 20 20 7d 0a 20 20 77 2e 78 53 65 6c  t);.  }.  w.xSel
2dca0 65 63 74 43 61 6c 6c 62 61 63 6b 20 3d 20 73 65  ectCallback = se
2dcb0 6c 65 63 74 45 78 70 61 6e 64 65 72 3b 0a 20 20  lectExpander;.  
2dcc0 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63  w.xSelectCallbac
2dcd0 6b 32 20 3d 20 73 65 6c 65 63 74 50 6f 70 57 69  k2 = selectPopWi
2dce0 74 68 3b 0a 20 20 77 2e 65 43 6f 64 65 20 3d 20  th;.  w.eCode = 
2dcf0 30 3b 0a 20 20 73 71 6c 69 74 65 33 57 61 6c 6b  0;.  sqlite3Walk
2dd00 53 65 6c 65 63 74 28 26 77 2c 20 70 53 65 6c 65  Select(&w, pSele
2dd10 63 74 29 3b 0a 7d 0a 0a 0a 23 69 66 6e 64 65 66  ct);.}...#ifndef
2dd20 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42   SQLITE_OMIT_SUB
2dd30 51 55 45 52 59 0a 2f 2a 0a 2a 2a 20 54 68 69 73  QUERY./*.** This
2dd40 20 69 73 20 61 20 57 61 6c 6b 65 72 2e 78 53 65   is a Walker.xSe
2dd50 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20 63 61 6c  lectCallback cal
2dd60 6c 62 61 63 6b 20 66 6f 72 20 74 68 65 20 73 71  lback for the sq
2dd70 6c 69 74 65 33 53 65 6c 65 63 74 54 79 70 65 49  lite3SelectTypeI
2dd80 6e 66 6f 28 29 0a 2a 2a 20 69 6e 74 65 72 66 61  nfo().** interfa
2dd90 63 65 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65 61  ce..**.** For ea
2dda0 63 68 20 46 52 4f 4d 2d 63 6c 61 75 73 65 20 73  ch FROM-clause s
2ddb0 75 62 71 75 65 72 79 2c 20 61 64 64 20 43 6f 6c  ubquery, add Col
2ddc0 75 6d 6e 2e 7a 54 79 70 65 20 61 6e 64 20 43 6f  umn.zType and Co
2ddd0 6c 75 6d 6e 2e 7a 43 6f 6c 6c 0a 2a 2a 20 69 6e  lumn.zColl.** in
2dde0 66 6f 72 6d 61 74 69 6f 6e 20 74 6f 20 74 68 65  formation to the
2ddf0 20 54 61 62 6c 65 20 73 74 72 75 63 74 75 72 65   Table structure
2de00 20 74 68 61 74 20 72 65 70 72 65 73 65 6e 74 73   that represents
2de10 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 0a   the result set.
2de20 2a 2a 20 6f 66 20 74 68 61 74 20 73 75 62 71 75  ** of that subqu
2de30 65 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 54  ery..**.** The T
2de40 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 20 74  able structure t
2de50 68 61 74 20 72 65 70 72 65 73 65 6e 74 73 20 74  hat represents t
2de60 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 77 61  he result set wa
2de70 73 20 63 6f 6e 73 74 72 75 63 74 65 64 0a 2a 2a  s constructed.**
2de80 20 62 79 20 73 65 6c 65 63 74 45 78 70 61 6e 64   by selectExpand
2de90 65 72 28 29 20 62 75 74 20 74 68 65 20 74 79 70  er() but the typ
2dea0 65 20 61 6e 64 20 63 6f 6c 6c 61 74 69 6f 6e 20  e and collation 
2deb0 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 77 61 73 20  information was 
2dec0 6f 6d 69 74 74 65 64 0a 2a 2a 20 61 74 20 74 68  omitted.** at th
2ded0 61 74 20 70 6f 69 6e 74 20 62 65 63 61 75 73 65  at point because
2dee0 20 69 64 65 6e 74 69 66 69 65 72 73 20 68 61 64   identifiers had
2def0 20 6e 6f 74 20 79 65 74 20 62 65 65 6e 20 72 65   not yet been re
2df00 73 6f 6c 76 65 64 2e 20 20 54 68 69 73 0a 2a 2a  solved.  This.**
2df10 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
2df20 65 64 20 61 66 74 65 72 20 69 64 65 6e 74 69 66  ed after identif
2df30 69 65 72 20 72 65 73 6f 6c 75 74 69 6f 6e 2e 0a  ier resolution..
2df40 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  */.static void s
2df50 65 6c 65 63 74 41 64 64 53 75 62 71 75 65 72 79  electAddSubquery
2df60 54 79 70 65 49 6e 66 6f 28 57 61 6c 6b 65 72 20  TypeInfo(Walker 
2df70 2a 70 57 61 6c 6b 65 72 2c 20 53 65 6c 65 63 74  *pWalker, Select
2df80 20 2a 70 29 7b 0a 20 20 50 61 72 73 65 20 2a 70   *p){.  Parse *p
2df90 50 61 72 73 65 3b 0a 20 20 69 6e 74 20 69 3b 0a  Parse;.  int i;.
2dfa0 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c    SrcList *pTabL
2dfb0 69 73 74 3b 0a 20 20 73 74 72 75 63 74 20 53 72  ist;.  struct Sr
2dfc0 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 46 72 6f  cList_item *pFro
2dfd0 6d 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 2d  m;..  assert( p-
2dfe0 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 52  >selFlags & SF_R
2dff0 65 73 6f 6c 76 65 64 20 29 3b 0a 20 20 69 66 28  esolved );.  if(
2e000 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53   p->selFlags & S
2e010 46 5f 48 61 73 54 79 70 65 49 6e 66 6f 20 29 20  F_HasTypeInfo ) 
2e020 72 65 74 75 72 6e 3b 0a 20 20 70 2d 3e 73 65 6c  return;.  p->sel
2e030 46 6c 61 67 73 20 7c 3d 20 53 46 5f 48 61 73 54  Flags |= SF_HasT
2e040 79 70 65 49 6e 66 6f 3b 0a 20 20 70 50 61 72 73  ypeInfo;.  pPars
2e050 65 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 70 50 61  e = pWalker->pPa
2e060 72 73 65 3b 0a 20 20 70 54 61 62 4c 69 73 74 20  rse;.  pTabList 
2e070 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 66 6f 72  = p->pSrc;.  for
2e080 28 69 3d 30 2c 20 70 46 72 6f 6d 3d 70 54 61 62  (i=0, pFrom=pTab
2e090 4c 69 73 74 2d 3e 61 3b 20 69 3c 70 54 61 62 4c  List->a; i<pTabL
2e0a0 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20  ist->nSrc; i++, 
2e0b0 70 46 72 6f 6d 2b 2b 29 7b 0a 20 20 20 20 54 61  pFrom++){.    Ta
2e0c0 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 46 72 6f  ble *pTab = pFro
2e0d0 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20 61 73 73  m->pTab;.    ass
2e0e0 65 72 74 28 20 70 54 61 62 21 3d 30 20 29 3b 0a  ert( pTab!=0 );.
2e0f0 20 20 20 20 69 66 28 20 28 70 54 61 62 2d 3e 74      if( (pTab->t
2e100 61 62 46 6c 61 67 73 20 26 20 54 46 5f 45 70 68  abFlags & TF_Eph
2e110 65 6d 65 72 61 6c 29 21 3d 30 20 29 7b 0a 20 20  emeral)!=0 ){.  
2e120 20 20 20 20 2f 2a 20 41 20 73 75 62 2d 71 75 65      /* A sub-que
2e130 72 79 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63  ry in the FROM c
2e140 6c 61 75 73 65 20 6f 66 20 61 20 53 45 4c 45 43  lause of a SELEC
2e150 54 20 2a 2f 0a 20 20 20 20 20 20 53 65 6c 65 63  T */.      Selec
2e160 74 20 2a 70 53 65 6c 20 3d 20 70 46 72 6f 6d 2d  t *pSel = pFrom-
2e170 3e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 20 20  >pSelect;.      
2e180 69 66 28 20 70 53 65 6c 20 29 7b 0a 20 20 20 20  if( pSel ){.    
2e190 20 20 20 20 77 68 69 6c 65 28 20 70 53 65 6c 2d      while( pSel-
2e1a0 3e 70 50 72 69 6f 72 20 29 20 70 53 65 6c 20 3d  >pPrior ) pSel =
2e1b0 20 70 53 65 6c 2d 3e 70 50 72 69 6f 72 3b 0a 20   pSel->pPrior;. 
2e1c0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65         sqlite3Se
2e1d0 6c 65 63 74 41 64 64 43 6f 6c 75 6d 6e 54 79 70  lectAddColumnTyp
2e1e0 65 41 6e 64 43 6f 6c 6c 61 74 69 6f 6e 28 70 50  eAndCollation(pP
2e1f0 61 72 73 65 2c 20 70 54 61 62 2c 20 70 53 65 6c  arse, pTab, pSel
2e200 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
2e210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e230 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45   SQLITE_AFF_NONE
2e240 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
2e250 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a  .  }.}.#endif...
2e260 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
2e270 6e 65 20 61 64 64 73 20 64 61 74 61 74 79 70 65  ne adds datatype
2e280 20 61 6e 64 20 63 6f 6c 6c 61 74 69 6e 67 20 73   and collating s
2e290 65 71 75 65 6e 63 65 20 69 6e 66 6f 72 6d 61 74  equence informat
2e2a0 69 6f 6e 20 74 6f 0a 2a 2a 20 74 68 65 20 54 61  ion to.** the Ta
2e2b0 62 6c 65 20 73 74 72 75 63 74 75 72 65 73 20 6f  ble structures o
2e2c0 66 20 61 6c 6c 20 46 52 4f 4d 2d 63 6c 61 75 73  f all FROM-claus
2e2d0 65 20 73 75 62 71 75 65 72 69 65 73 20 69 6e 20  e subqueries in 
2e2e0 61 0a 2a 2a 20 53 45 4c 45 43 54 20 73 74 61 74  a.** SELECT stat
2e2f0 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 55 73 65  ement..**.** Use
2e300 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 61 66   this routine af
2e310 74 65 72 20 6e 61 6d 65 20 72 65 73 6f 6c 75 74  ter name resolut
2e320 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ion..*/.static v
2e330 6f 69 64 20 73 71 6c 69 74 65 33 53 65 6c 65 63  oid sqlite3Selec
2e340 74 41 64 64 54 79 70 65 49 6e 66 6f 28 50 61 72  tAddTypeInfo(Par
2e350 73 65 20 2a 70 50 61 72 73 65 2c 20 53 65 6c 65  se *pParse, Sele
2e360 63 74 20 2a 70 53 65 6c 65 63 74 29 7b 0a 23 69  ct *pSelect){.#i
2e370 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
2e380 54 5f 53 55 42 51 55 45 52 59 0a 20 20 57 61 6c  T_SUBQUERY.  Wal
2e390 6b 65 72 20 77 3b 0a 20 20 77 2e 78 53 65 6c 65  ker w;.  w.xSele
2e3a0 63 74 43 61 6c 6c 62 61 63 6b 20 3d 20 73 71 6c  ctCallback = sql
2e3b0 69 74 65 33 53 65 6c 65 63 74 57 61 6c 6b 4e 6f  ite3SelectWalkNo
2e3c0 6f 70 3b 0a 20 20 77 2e 78 53 65 6c 65 63 74 43  op;.  w.xSelectC
2e3d0 61 6c 6c 62 61 63 6b 32 20 3d 20 73 65 6c 65 63  allback2 = selec
2e3e0 74 41 64 64 53 75 62 71 75 65 72 79 54 79 70 65  tAddSubqueryType
2e3f0 49 6e 66 6f 3b 0a 20 20 77 2e 78 45 78 70 72 43  Info;.  w.xExprC
2e400 61 6c 6c 62 61 63 6b 20 3d 20 73 71 6c 69 74 65  allback = sqlite
2e410 33 45 78 70 72 57 61 6c 6b 4e 6f 6f 70 3b 0a 20  3ExprWalkNoop;. 
2e420 20 77 2e 70 50 61 72 73 65 20 3d 20 70 50 61 72   w.pParse = pPar
2e430 73 65 3b 0a 20 20 73 71 6c 69 74 65 33 57 61 6c  se;.  sqlite3Wal
2e440 6b 53 65 6c 65 63 74 28 26 77 2c 20 70 53 65 6c  kSelect(&w, pSel
2e450 65 63 74 29 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a  ect);.#endif.}..
2e460 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
2e470 69 6e 65 20 73 65 74 73 20 75 70 20 61 20 53 45  ine sets up a SE
2e480 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 66  LECT statement f
2e490 6f 72 20 70 72 6f 63 65 73 73 69 6e 67 2e 20 20  or processing.  
2e4a0 54 68 65 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67  The.** following
2e4b0 20 69 73 20 61 63 63 6f 6d 70 6c 69 73 68 65 64   is accomplished
2e4c0 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 20 20 56  :.**.**     *  V
2e4d0 44 42 45 20 43 75 72 73 6f 72 20 6e 75 6d 62 65  DBE Cursor numbe
2e4e0 72 73 20 61 72 65 20 61 73 73 69 67 6e 65 64 20  rs are assigned 
2e4f0 74 6f 20 61 6c 6c 20 46 52 4f 4d 2d 63 6c 61 75  to all FROM-clau
2e500 73 65 20 74 65 72 6d 73 2e 0a 2a 2a 20 20 20 20  se terms..**    
2e510 20 2a 20 20 45 70 68 65 6d 65 72 61 6c 20 54 61   *  Ephemeral Ta
2e520 62 6c 65 20 6f 62 6a 65 63 74 73 20 61 72 65 20  ble objects are 
2e530 63 72 65 61 74 65 64 20 66 6f 72 20 61 6c 6c 20  created for all 
2e540 46 52 4f 4d 2d 63 6c 61 75 73 65 20 73 75 62 71  FROM-clause subq
2e550 75 65 72 69 65 73 2e 0a 2a 2a 20 20 20 20 20 2a  ueries..**     *
2e560 20 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20 63    ON and USING c
2e570 6c 61 75 73 65 73 20 61 72 65 20 73 68 69 66 74  lauses are shift
2e580 65 64 20 69 6e 74 6f 20 57 48 45 52 45 20 73 74  ed into WHERE st
2e590 61 74 65 6d 65 6e 74 73 0a 2a 2a 20 20 20 20 20  atements.**     
2e5a0 2a 20 20 57 69 6c 64 63 61 72 64 73 20 22 2a 22  *  Wildcards "*"
2e5b0 20 61 6e 64 20 22 54 41 42 4c 45 2e 2a 22 20 69   and "TABLE.*" i
2e5c0 6e 20 72 65 73 75 6c 74 20 73 65 74 73 20 61 72  n result sets ar
2e5d0 65 20 65 78 70 61 6e 64 65 64 2e 0a 2a 2a 20 20  e expanded..**  
2e5e0 20 20 20 2a 20 20 49 64 65 6e 74 69 66 69 65 72     *  Identifier
2e5f0 73 20 69 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  s in expression 
2e600 61 72 65 20 6d 61 74 63 68 65 64 20 74 6f 20 74  are matched to t
2e610 61 62 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  ables..**.** Thi
2e620 73 20 72 6f 75 74 69 6e 65 20 61 63 74 73 20 72  s routine acts r
2e630 65 63 75 72 73 69 76 65 6c 79 20 6f 6e 20 61 6c  ecursively on al
2e640 6c 20 73 75 62 71 75 65 72 69 65 73 20 77 69 74  l subqueries wit
2e650 68 69 6e 20 74 68 65 20 53 45 4c 45 43 54 2e 0a  hin the SELECT..
2e660 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53  */.void sqlite3S
2e670 65 6c 65 63 74 50 72 65 70 28 0a 20 20 50 61 72  electPrep(.  Par
2e680 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
2e690 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 65      /* The parse
2e6a0 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53  r context */.  S
2e6b0 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20  elect *p,       
2e6c0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 53 45 4c        /* The SEL
2e6d0 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 62 65  ECT statement be
2e6e0 69 6e 67 20 63 6f 64 65 64 2e 20 2a 2f 0a 20 20  ing coded. */.  
2e6f0 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4f 75  NameContext *pOu
2e700 74 65 72 4e 43 20 20 2f 2a 20 4e 61 6d 65 20 63  terNC  /* Name c
2e710 6f 6e 74 65 78 74 20 66 6f 72 20 63 6f 6e 74 61  ontext for conta
2e720 69 6e 65 72 20 2a 2f 0a 29 7b 0a 20 20 61 73 73  iner */.){.  ass
2e730 65 72 74 28 20 70 21 3d 30 20 7c 7c 20 70 50 61  ert( p!=0 || pPa
2e740 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  rse->db->mallocF
2e750 61 69 6c 65 64 20 29 3b 0a 20 20 69 66 28 20 70  ailed );.  if( p
2e760 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  Parse->db->mallo
2e770 63 46 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e  cFailed ) return
2e780 3b 0a 20 20 69 66 28 20 70 2d 3e 73 65 6c 46 6c  ;.  if( p->selFl
2e790 61 67 73 20 26 20 53 46 5f 48 61 73 54 79 70 65  ags & SF_HasType
2e7a0 49 6e 66 6f 20 29 20 72 65 74 75 72 6e 3b 0a 20  Info ) return;. 
2e7b0 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 45 78   sqlite3SelectEx
2e7c0 70 61 6e 64 28 70 50 61 72 73 65 2c 20 70 29 3b  pand(pParse, p);
2e7d0 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e  .  if( pParse->n
2e7e0 45 72 72 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64  Err || pParse->d
2e7f0 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
2e800 29 20 72 65 74 75 72 6e 3b 0a 20 20 73 71 6c 69  ) return;.  sqli
2e810 74 65 33 52 65 73 6f 6c 76 65 53 65 6c 65 63 74  te3ResolveSelect
2e820 4e 61 6d 65 73 28 70 50 61 72 73 65 2c 20 70 2c  Names(pParse, p,
2e830 20 70 4f 75 74 65 72 4e 43 29 3b 0a 20 20 69 66   pOuterNC);.  if
2e840 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c  ( pParse->nErr |
2e850 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61  | pParse->db->ma
2e860 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74  llocFailed ) ret
2e870 75 72 6e 3b 0a 20 20 73 71 6c 69 74 65 33 53 65  urn;.  sqlite3Se
2e880 6c 65 63 74 41 64 64 54 79 70 65 49 6e 66 6f 28  lectAddTypeInfo(
2e890 70 50 61 72 73 65 2c 20 70 29 3b 0a 7d 0a 0a 2f  pParse, p);.}../
2e8a0 2a 0a 2a 2a 20 52 65 73 65 74 20 74 68 65 20 61  *.** Reset the a
2e8b0 67 67 72 65 67 61 74 65 20 61 63 63 75 6d 75 6c  ggregate accumul
2e8c0 61 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ator..**.** The 
2e8d0 61 67 67 72 65 67 61 74 65 20 61 63 63 75 6d 75  aggregate accumu
2e8e0 6c 61 74 6f 72 20 69 73 20 61 20 73 65 74 20 6f  lator is a set o
2e8f0 66 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20 74  f memory cells t
2e900 68 61 74 20 68 6f 6c 64 0a 2a 2a 20 69 6e 74 65  hat hold.** inte
2e910 72 6d 65 64 69 61 74 65 20 72 65 73 75 6c 74 73  rmediate results
2e920 20 77 68 69 6c 65 20 63 61 6c 63 75 6c 61 74 69   while calculati
2e930 6e 67 20 61 6e 20 61 67 67 72 65 67 61 74 65 2e  ng an aggregate.
2e940 20 20 54 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e    This.** routin
2e950 65 20 67 65 6e 65 72 61 74 65 73 20 63 6f 64 65  e generates code
2e960 20 74 68 61 74 20 73 74 6f 72 65 73 20 4e 55 4c   that stores NUL
2e970 4c 73 20 69 6e 20 61 6c 6c 20 6f 66 20 74 68 6f  Ls in all of tho
2e980 73 65 20 6d 65 6d 6f 72 79 0a 2a 2a 20 63 65 6c  se memory.** cel
2e990 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ls..*/.static vo
2e9a0 69 64 20 72 65 73 65 74 41 63 63 75 6d 75 6c 61  id resetAccumula
2e9b0 74 6f 72 28 50 61 72 73 65 20 2a 70 50 61 72 73  tor(Parse *pPars
2e9c0 65 2c 20 41 67 67 49 6e 66 6f 20 2a 70 41 67 67  e, AggInfo *pAgg
2e9d0 49 6e 66 6f 29 7b 0a 20 20 56 64 62 65 20 2a 76  Info){.  Vdbe *v
2e9e0 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
2e9f0 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72  ;.  int i;.  str
2ea00 75 63 74 20 41 67 67 49 6e 66 6f 5f 66 75 6e 63  uct AggInfo_func
2ea10 20 2a 70 46 75 6e 63 3b 0a 20 20 69 6e 74 20 6e   *pFunc;.  int n
2ea20 52 65 67 20 3d 20 70 41 67 67 49 6e 66 6f 2d 3e  Reg = pAggInfo->
2ea30 6e 46 75 6e 63 20 2b 20 70 41 67 67 49 6e 66 6f  nFunc + pAggInfo
2ea40 2d 3e 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 69 66 28  ->nColumn;.  if(
2ea50 20 6e 52 65 67 3d 3d 30 20 29 20 72 65 74 75 72   nReg==0 ) retur
2ea60 6e 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  n;.#ifdef SQLITE
2ea70 5f 44 45 42 55 47 0a 20 20 2f 2a 20 56 65 72 69  _DEBUG.  /* Veri
2ea80 66 79 20 74 68 61 74 20 61 6c 6c 20 41 67 67 49  fy that all AggI
2ea90 6e 66 6f 20 72 65 67 69 73 74 65 72 73 20 61 72  nfo registers ar
2eaa0 65 20 77 69 74 68 69 6e 20 74 68 65 20 72 61 6e  e within the ran
2eab0 67 65 20 73 70 65 63 69 66 69 65 64 20 62 79 0a  ge specified by.
2eac0 20 20 2a 2a 20 41 67 67 49 6e 66 6f 2e 6d 6e 52    ** AggInfo.mnR
2ead0 65 67 2e 2e 41 67 67 49 6e 66 6f 2e 6d 78 52 65  eg..AggInfo.mxRe
2eae0 67 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 6e  g */.  assert( n
2eaf0 52 65 67 3d 3d 70 41 67 67 49 6e 66 6f 2d 3e 6d  Reg==pAggInfo->m
2eb00 78 52 65 67 2d 70 41 67 67 49 6e 66 6f 2d 3e 6d  xReg-pAggInfo->m
2eb10 6e 52 65 67 2b 31 20 29 3b 0a 20 20 66 6f 72 28  nReg+1 );.  for(
2eb20 69 3d 30 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d  i=0; i<pAggInfo-
2eb30 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a  >nColumn; i++){.
2eb40 20 20 20 20 61 73 73 65 72 74 28 20 70 41 67 67      assert( pAgg
2eb50 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 69 5d 2e 69 4d  Info->aCol[i].iM
2eb60 65 6d 3e 3d 70 41 67 67 49 6e 66 6f 2d 3e 6d 6e  em>=pAggInfo->mn
2eb70 52 65 67 0a 20 20 20 20 20 20 20 20 20 26 26 20  Reg.         && 
2eb80 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 69  pAggInfo->aCol[i
2eb90 5d 2e 69 4d 65 6d 3c 3d 70 41 67 67 49 6e 66 6f  ].iMem<=pAggInfo
2eba0 2d 3e 6d 78 52 65 67 20 29 3b 0a 20 20 7d 0a 20  ->mxReg );.  }. 
2ebb0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 41 67 67   for(i=0; i<pAgg
2ebc0 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3b 20 69 2b 2b  Info->nFunc; i++
2ebd0 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
2ebe0 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 69  AggInfo->aFunc[i
2ebf0 5d 2e 69 4d 65 6d 3e 3d 70 41 67 67 49 6e 66 6f  ].iMem>=pAggInfo
2ec00 2d 3e 6d 6e 52 65 67 0a 20 20 20 20 20 20 20 20  ->mnReg.        
2ec10 20 26 26 20 70 41 67 67 49 6e 66 6f 2d 3e 61 46   && pAggInfo->aF
2ec20 75 6e 63 5b 69 5d 2e 69 4d 65 6d 3c 3d 70 41 67  unc[i].iMem<=pAg
2ec30 67 49 6e 66 6f 2d 3e 6d 78 52 65 67 20 29 3b 0a  gInfo->mxReg );.
2ec40 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c    }.#endif.  sql
2ec50 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
2ec60 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 70 41  , OP_Null, 0, pA
2ec70 67 67 49 6e 66 6f 2d 3e 6d 6e 52 65 67 2c 20 70  ggInfo->mnReg, p
2ec80 41 67 67 49 6e 66 6f 2d 3e 6d 78 52 65 67 29 3b  AggInfo->mxReg);
2ec90 0a 20 20 66 6f 72 28 70 46 75 6e 63 3d 70 41 67  .  for(pFunc=pAg
2eca0 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 2c 20 69 3d  gInfo->aFunc, i=
2ecb0 30 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e  0; i<pAggInfo->n
2ecc0 46 75 6e 63 3b 20 69 2b 2b 2c 20 70 46 75 6e 63  Func; i++, pFunc
2ecd0 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 46 75  ++){.    if( pFu
2ece0 6e 63 2d 3e 69 44 69 73 74 69 6e 63 74 3e 3d 30  nc->iDistinct>=0
2ecf0 20 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a   ){.      Expr *
2ed00 70 45 20 3d 20 70 46 75 6e 63 2d 3e 70 45 78 70  pE = pFunc->pExp
2ed10 72 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  r;.      assert(
2ed20 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
2ed30 79 28 70 45 2c 20 45 50 5f 78 49 73 53 65 6c 65  y(pE, EP_xIsSele
2ed40 63 74 29 20 29 3b 0a 20 20 20 20 20 20 69 66 28  ct) );.      if(
2ed50 20 70 45 2d 3e 78 2e 70 4c 69 73 74 3d 3d 30 20   pE->x.pList==0 
2ed60 7c 7c 20 70 45 2d 3e 78 2e 70 4c 69 73 74 2d 3e  || pE->x.pList->
2ed70 6e 45 78 70 72 21 3d 31 20 29 7b 0a 20 20 20 20  nExpr!=1 ){.    
2ed80 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
2ed90 4d 73 67 28 70 50 61 72 73 65 2c 20 22 44 49 53  Msg(pParse, "DIS
2eda0 54 49 4e 43 54 20 61 67 67 72 65 67 61 74 65 73  TINCT aggregates
2edb0 20 6d 75 73 74 20 68 61 76 65 20 65 78 61 63 74   must have exact
2edc0 6c 79 20 6f 6e 65 20 22 0a 20 20 20 20 20 20 20  ly one ".       
2edd0 20 20 20 20 22 61 72 67 75 6d 65 6e 74 22 29 3b      "argument");
2ede0 0a 20 20 20 20 20 20 20 20 70 46 75 6e 63 2d 3e  .        pFunc->
2edf0 69 44 69 73 74 69 6e 63 74 20 3d 20 2d 31 3b 0a  iDistinct = -1;.
2ee00 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
2ee10 20 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b       KeyInfo *pK
2ee20 65 79 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33  eyInfo = sqlite3
2ee30 4b 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c  KeyInfoFromExprL
2ee40 69 73 74 28 70 50 61 72 73 65 2c 20 70 45 2d 3e  ist(pParse, pE->
2ee50 78 2e 70 4c 69 73 74 2c 30 2c 30 29 3b 0a 20 20  x.pList,0,0);.  
2ee60 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
2ee70 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4f 70  eAddOp4(v, OP_Op
2ee80 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 70 46 75  enEphemeral, pFu
2ee90 6e 63 2d 3e 69 44 69 73 74 69 6e 63 74 2c 20 30  nc->iDistinct, 0
2eea0 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20  , 0,.           
2eeb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
2eec0 63 68 61 72 2a 29 70 4b 65 79 49 6e 66 6f 2c 20  char*)pKeyInfo, 
2eed0 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 20  P4_KEYINFO);.   
2eee0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d     }.    }.  }.}
2eef0 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20 74  ../*.** Invoke t
2ef00 68 65 20 4f 50 5f 41 67 67 46 69 6e 61 6c 69 7a  he OP_AggFinaliz
2ef10 65 20 6f 70 63 6f 64 65 20 66 6f 72 20 65 76 65  e opcode for eve
2ef20 72 79 20 61 67 67 72 65 67 61 74 65 20 66 75 6e  ry aggregate fun
2ef30 63 74 69 6f 6e 0a 2a 2a 20 69 6e 20 74 68 65 20  ction.** in the 
2ef40 41 67 67 49 6e 66 6f 20 73 74 72 75 63 74 75 72  AggInfo structur
2ef50 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  e..*/.static voi
2ef60 64 20 66 69 6e 61 6c 69 7a 65 41 67 67 46 75 6e  d finalizeAggFun
2ef70 63 74 69 6f 6e 73 28 50 61 72 73 65 20 2a 70 50  ctions(Parse *pP
2ef80 61 72 73 65 2c 20 41 67 67 49 6e 66 6f 20 2a 70  arse, AggInfo *p
2ef90 41 67 67 49 6e 66 6f 29 7b 0a 20 20 56 64 62 65  AggInfo){.  Vdbe
2efa0 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56   *v = pParse->pV
2efb0 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  dbe;.  int i;.  
2efc0 73 74 72 75 63 74 20 41 67 67 49 6e 66 6f 5f 66  struct AggInfo_f
2efd0 75 6e 63 20 2a 70 46 3b 0a 20 20 66 6f 72 28 69  unc *pF;.  for(i
2efe0 3d 30 2c 20 70 46 3d 70 41 67 67 49 6e 66 6f 2d  =0, pF=pAggInfo-
2eff0 3e 61 46 75 6e 63 3b 20 69 3c 70 41 67 67 49 6e  >aFunc; i<pAggIn
2f000 66 6f 2d 3e 6e 46 75 6e 63 3b 20 69 2b 2b 2c 20  fo->nFunc; i++, 
2f010 70 46 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 4c  pF++){.    ExprL
2f020 69 73 74 20 2a 70 4c 69 73 74 20 3d 20 70 46 2d  ist *pList = pF-
2f030 3e 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b  >pExpr->x.pList;
2f040 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78  .    assert( !Ex
2f050 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 46  prHasProperty(pF
2f060 2d 3e 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53  ->pExpr, EP_xIsS
2f070 65 6c 65 63 74 29 20 29 3b 0a 20 20 20 20 73 71  elect) );.    sq
2f080 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
2f090 76 2c 20 4f 50 5f 41 67 67 46 69 6e 61 6c 2c 20  v, OP_AggFinal, 
2f0a0 70 46 2d 3e 69 4d 65 6d 2c 20 70 4c 69 73 74 20  pF->iMem, pList 
2f0b0 3f 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 3a  ? pList->nExpr :
2f0c0 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
2f0d0 56 64 62 65 41 70 70 65 6e 64 50 34 28 76 2c 20  VdbeAppendP4(v, 
2f0e0 70 46 2d 3e 70 46 75 6e 63 2c 20 50 34 5f 46 55  pF->pFunc, P4_FU
2f0f0 4e 43 44 45 46 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a  NCDEF);.  }.}...
2f100 2f 2a 0a 2a 2a 20 55 70 64 61 74 65 20 74 68 65  /*.** Update the
2f110 20 61 63 63 75 6d 75 6c 61 74 6f 72 20 6d 65 6d   accumulator mem
2f120 6f 72 79 20 63 65 6c 6c 73 20 66 6f 72 20 61 6e  ory cells for an
2f130 20 61 67 67 72 65 67 61 74 65 20 62 61 73 65 64   aggregate based
2f140 20 6f 6e 0a 2a 2a 20 74 68 65 20 63 75 72 72 65   on.** the curre
2f150 6e 74 20 63 75 72 73 6f 72 20 70 6f 73 69 74 69  nt cursor positi
2f160 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 72 65 67  on..**.** If reg
2f170 41 63 63 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 20  Acc is non-zero 
2f180 61 6e 64 20 74 68 65 72 65 20 61 72 65 20 6e 6f  and there are no
2f190 20 6d 69 6e 28 29 20 6f 72 20 6d 61 78 28 29 20   min() or max() 
2f1a0 61 67 67 72 65 67 61 74 65 73 0a 2a 2a 20 69 6e  aggregates.** in
2f1b0 20 70 41 67 67 49 6e 66 6f 2c 20 74 68 65 6e 20   pAggInfo, then 
2f1c0 6f 6e 6c 79 20 70 6f 70 75 6c 61 74 65 20 74 68  only populate th
2f1d0 65 20 70 41 67 67 49 6e 66 6f 2d 3e 6e 41 63 63  e pAggInfo->nAcc
2f1e0 75 6d 75 6c 61 74 6f 72 20 61 63 63 75 6d 75 6c  umulator accumul
2f1f0 61 74 6f 72 0a 2a 2a 20 72 65 67 69 73 74 65 72  ator.** register
2f200 73 20 69 66 20 72 65 67 69 73 74 65 72 20 72 65  s if register re
2f210 67 41 63 63 20 63 6f 6e 74 61 69 6e 73 20 30 2e  gAcc contains 0.
2f220 20 54 68 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c   The caller will
2f230 20 74 61 6b 65 20 63 61 72 65 0a 2a 2a 20 6f 66   take care.** of
2f240 20 73 65 74 74 69 6e 67 20 61 6e 64 20 63 6c 65   setting and cle
2f250 61 72 69 6e 67 20 72 65 67 41 63 63 2e 0a 2a 2f  aring regAcc..*/
2f260 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75 70 64  .static void upd
2f270 61 74 65 41 63 63 75 6d 75 6c 61 74 6f 72 28 50  ateAccumulator(P
2f280 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e  arse *pParse, in
2f290 74 20 72 65 67 41 63 63 2c 20 41 67 67 49 6e 66  t regAcc, AggInf
2f2a0 6f 20 2a 70 41 67 67 49 6e 66 6f 29 7b 0a 20 20  o *pAggInfo){.  
2f2b0 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65  Vdbe *v = pParse
2f2c0 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69  ->pVdbe;.  int i
2f2d0 3b 0a 20 20 69 6e 74 20 72 65 67 48 69 74 20 3d  ;.  int regHit =
2f2e0 20 30 3b 0a 20 20 69 6e 74 20 61 64 64 72 48 69   0;.  int addrHi
2f2f0 74 54 65 73 74 20 3d 20 30 3b 0a 20 20 73 74 72  tTest = 0;.  str
2f300 75 63 74 20 41 67 67 49 6e 66 6f 5f 66 75 6e 63  uct AggInfo_func
2f310 20 2a 70 46 3b 0a 20 20 73 74 72 75 63 74 20 41   *pF;.  struct A
2f320 67 67 49 6e 66 6f 5f 63 6f 6c 20 2a 70 43 3b 0a  ggInfo_col *pC;.
2f330 0a 20 20 70 41 67 67 49 6e 66 6f 2d 3e 64 69 72  .  pAggInfo->dir
2f340 65 63 74 4d 6f 64 65 20 3d 20 31 3b 0a 20 20 66  ectMode = 1;.  f
2f350 6f 72 28 69 3d 30 2c 20 70 46 3d 70 41 67 67 49  or(i=0, pF=pAggI
2f360 6e 66 6f 2d 3e 61 46 75 6e 63 3b 20 69 3c 70 41  nfo->aFunc; i<pA
2f370 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3b 20 69  ggInfo->nFunc; i
2f380 2b 2b 2c 20 70 46 2b 2b 29 7b 0a 20 20 20 20 69  ++, pF++){.    i
2f390 6e 74 20 6e 41 72 67 3b 0a 20 20 20 20 69 6e 74  nt nArg;.    int
2f3a0 20 61 64 64 72 4e 65 78 74 20 3d 20 30 3b 0a 20   addrNext = 0;. 
2f3b0 20 20 20 69 6e 74 20 72 65 67 41 67 67 3b 0a 20     int regAgg;. 
2f3c0 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69     ExprList *pLi
2f3d0 73 74 20 3d 20 70 46 2d 3e 70 45 78 70 72 2d 3e  st = pF->pExpr->
2f3e0 78 2e 70 4c 69 73 74 3b 0a 20 20 20 20 61 73 73  x.pList;.    ass
2f3f0 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f  ert( !ExprHasPro
2f400 70 65 72 74 79 28 70 46 2d 3e 70 45 78 70 72 2c  perty(pF->pExpr,
2f410 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29   EP_xIsSelect) )
2f420 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 49  ;.    assert( !I
2f430 73 57 69 6e 64 6f 77 46 75 6e 63 28 70 46 2d 3e  sWindowFunc(pF->
2f440 70 45 78 70 72 29 20 29 3b 0a 20 20 20 20 69 66  pExpr) );.    if
2f450 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  ( ExprHasPropert
2f460 79 28 70 46 2d 3e 70 45 78 70 72 2c 20 45 50 5f  y(pF->pExpr, EP_
2f470 57 69 6e 46 75 6e 63 29 20 29 7b 0a 20 20 20 20  WinFunc) ){.    
2f480 20 20 45 78 70 72 20 2a 70 46 69 6c 74 65 72 20    Expr *pFilter 
2f490 3d 20 70 46 2d 3e 70 45 78 70 72 2d 3e 79 2e 70  = pF->pExpr->y.p
2f4a0 57 69 6e 2d 3e 70 46 69 6c 74 65 72 3b 0a 20 20  Win->pFilter;.  
2f4b0 20 20 20 20 69 66 28 20 70 41 67 67 49 6e 66 6f      if( pAggInfo
2f4c0 2d 3e 6e 41 63 63 75 6d 75 6c 61 74 6f 72 20 0a  ->nAccumulator .
2f4d0 20 20 20 20 20 20 20 26 26 20 28 70 46 2d 3e 70         && (pF->p
2f4e0 46 75 6e 63 2d 3e 66 75 6e 63 46 6c 61 67 73 20  Func->funcFlags 
2f4f0 26 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4e 45  & SQLITE_FUNC_NE
2f500 45 44 43 4f 4c 4c 29 20 0a 20 20 20 20 20 20 29  EDCOLL) .      )
2f510 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 65  {.        if( re
2f520 67 48 69 74 3d 3d 30 20 29 20 72 65 67 48 69 74  gHit==0 ) regHit
2f530 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
2f540 6d 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66  m;.        /* If
2f550 20 74 68 69 73 20 69 73 20 74 68 65 20 66 69 72   this is the fir
2f560 73 74 20 72 6f 77 20 6f 66 20 74 68 65 20 67 72  st row of the gr
2f570 6f 75 70 20 28 72 65 67 41 63 63 3d 3d 30 29 2c  oup (regAcc==0),
2f580 20 63 6c 65 61 72 20 74 68 65 0a 20 20 20 20 20   clear the.     
2f590 20 20 20 2a 2a 20 22 6d 61 67 6e 65 74 22 20 72     ** "magnet" r
2f5a0 65 67 69 73 74 65 72 20 72 65 67 48 69 74 20 73  egister regHit s
2f5b0 6f 20 74 68 61 74 20 74 68 65 20 61 63 63 75 6d  o that the accum
2f5c0 75 6c 61 74 6f 72 20 72 65 67 69 73 74 65 72 73  ulator registers
2f5d0 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 72 65 20  .        ** are 
2f5e0 70 6f 70 75 6c 61 74 65 64 20 69 66 20 74 68 65  populated if the
2f5f0 20 46 49 4c 54 45 52 20 63 6c 61 75 73 65 20 6a   FILTER clause j
2f600 75 6d 70 73 20 6f 76 65 72 20 74 68 65 20 74 68  umps over the th
2f610 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 6e  e .        ** in
2f620 76 6f 63 61 74 69 6f 6e 20 6f 66 20 6d 69 6e 28  vocation of min(
2f630 29 20 6f 72 20 6d 61 78 28 29 20 61 6c 74 6f 67  ) or max() altog
2f640 65 74 68 65 72 2e 20 4f 72 2c 20 69 66 20 74 68  ether. Or, if th
2f650 69 73 20 69 73 20 6e 6f 74 0a 20 20 20 20 20 20  is is not.      
2f660 20 20 2a 2a 20 74 68 65 20 66 69 72 73 74 20 72    ** the first r
2f670 6f 77 20 28 72 65 67 41 63 63 3d 3d 31 29 2c 20  ow (regAcc==1), 
2f680 73 65 74 20 74 68 65 20 6d 61 67 6e 65 74 20 72  set the magnet r
2f690 65 67 69 73 74 65 72 20 73 6f 20 74 68 61 74 20  egister so that 
2f6a0 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 61  the.        ** a
2f6b0 63 63 75 6d 75 6c 61 74 6f 72 73 20 61 72 65 20  ccumulators are 
2f6c0 6e 6f 74 20 70 6f 70 75 6c 61 74 65 64 20 75 6e  not populated un
2f6d0 6c 65 73 73 20 74 68 65 20 6d 69 6e 28 29 2f 6d  less the min()/m
2f6e0 61 78 28 29 20 69 73 20 69 6e 76 6f 6b 65 64 20  ax() is invoked 
2f6f0 61 6e 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 69  and.        ** i
2f700 6e 64 69 63 61 74 65 73 20 74 68 61 74 20 74 68  ndicates that th
2f710 65 79 20 73 68 6f 75 6c 64 20 62 65 2e 20 20 2a  ey should be.  *
2f720 2f 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  /.        sqlite
2f730 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
2f740 50 5f 43 6f 70 79 2c 20 72 65 67 41 63 63 2c 20  P_Copy, regAcc, 
2f750 72 65 67 48 69 74 29 3b 0a 20 20 20 20 20 20 7d  regHit);.      }
2f760 0a 20 20 20 20 20 20 61 64 64 72 4e 65 78 74 20  .      addrNext 
2f770 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
2f780 65 4c 61 62 65 6c 28 70 50 61 72 73 65 29 3b 0a  eLabel(pParse);.
2f790 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
2f7a0 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c  rIfFalse(pParse,
2f7b0 20 70 46 69 6c 74 65 72 2c 20 61 64 64 72 4e 65   pFilter, addrNe
2f7c0 78 74 2c 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49  xt, SQLITE_JUMPI
2f7d0 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 7d 0a 20 20  FNULL);.    }.  
2f7e0 20 20 69 66 28 20 70 4c 69 73 74 20 29 7b 0a 20    if( pList ){. 
2f7f0 20 20 20 20 20 6e 41 72 67 20 3d 20 70 4c 69 73       nArg = pLis
2f800 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20  t->nExpr;.      
2f810 72 65 67 41 67 67 20 3d 20 73 71 6c 69 74 65 33  regAgg = sqlite3
2f820 47 65 74 54 65 6d 70 52 61 6e 67 65 28 70 50 61  GetTempRange(pPa
2f830 72 73 65 2c 20 6e 41 72 67 29 3b 0a 20 20 20 20  rse, nArg);.    
2f840 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
2f850 65 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65  eExprList(pParse
2f860 2c 20 70 4c 69 73 74 2c 20 72 65 67 41 67 67 2c  , pList, regAgg,
2f870 20 30 2c 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f   0, SQLITE_ECEL_
2f880 44 55 50 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  DUP);.    }else{
2f890 0a 20 20 20 20 20 20 6e 41 72 67 20 3d 20 30 3b  .      nArg = 0;
2f8a0 0a 20 20 20 20 20 20 72 65 67 41 67 67 20 3d 20  .      regAgg = 
2f8b0 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  0;.    }.    if(
2f8c0 20 70 46 2d 3e 69 44 69 73 74 69 6e 63 74 3e 3d   pF->iDistinct>=
2f8d0 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 61  0 ){.      if( a
2f8e0 64 64 72 4e 65 78 74 3d 3d 30 20 29 7b 20 0a 20  ddrNext==0 ){ . 
2f8f0 20 20 20 20 20 20 20 61 64 64 72 4e 65 78 74 20         addrNext 
2f900 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
2f910 65 4c 61 62 65 6c 28 70 50 61 72 73 65 29 3b 0a  eLabel(pParse);.
2f920 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 74 65        }.      te
2f930 73 74 63 61 73 65 28 20 6e 41 72 67 3d 3d 30 20  stcase( nArg==0 
2f940 29 3b 20 20 2f 2a 20 45 72 72 6f 72 20 63 6f 6e  );  /* Error con
2f950 64 69 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20  dition */.      
2f960 74 65 73 74 63 61 73 65 28 20 6e 41 72 67 3e 31  testcase( nArg>1
2f970 20 29 3b 20 20 20 2f 2a 20 41 6c 73 6f 20 61 6e   );   /* Also an
2f980 20 65 72 72 6f 72 20 2a 2f 0a 20 20 20 20 20 20   error */.      
2f990 63 6f 64 65 44 69 73 74 69 6e 63 74 28 70 50 61  codeDistinct(pPa
2f9a0 72 73 65 2c 20 70 46 2d 3e 69 44 69 73 74 69 6e  rse, pF->iDistin
2f9b0 63 74 2c 20 61 64 64 72 4e 65 78 74 2c 20 31 2c  ct, addrNext, 1,
2f9c0 20 72 65 67 41 67 67 29 3b 0a 20 20 20 20 7d 0a   regAgg);.    }.
2f9d0 20 20 20 20 69 66 28 20 70 46 2d 3e 70 46 75 6e      if( pF->pFun
2f9e0 63 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20 53  c->funcFlags & S
2f9f0 51 4c 49 54 45 5f 46 55 4e 43 5f 4e 45 45 44 43  QLITE_FUNC_NEEDC
2fa00 4f 4c 4c 20 29 7b 0a 20 20 20 20 20 20 43 6f 6c  OLL ){.      Col
2fa10 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 30 3b  lSeq *pColl = 0;
2fa20 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 45 78  .      struct Ex
2fa30 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  prList_item *pIt
2fa40 65 6d 3b 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b  em;.      int j;
2fa50 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
2fa60 4c 69 73 74 21 3d 30 20 29 3b 20 20 2f 2a 20 70  List!=0 );  /* p
2fa70 4c 69 73 74 21 3d 30 20 69 66 20 70 46 2d 3e 70  List!=0 if pF->p
2fa80 46 75 6e 63 20 68 61 73 20 4e 45 45 44 43 4f 4c  Func has NEEDCOL
2fa90 4c 20 2a 2f 0a 20 20 20 20 20 20 66 6f 72 28 6a  L */.      for(j
2faa0 3d 30 2c 20 70 49 74 65 6d 3d 70 4c 69 73 74 2d  =0, pItem=pList-
2fab0 3e 61 3b 20 21 70 43 6f 6c 6c 20 26 26 20 6a 3c  >a; !pColl && j<
2fac0 6e 41 72 67 3b 20 6a 2b 2b 2c 20 70 49 74 65 6d  nArg; j++, pItem
2fad0 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 70 43 6f  ++){.        pCo
2fae0 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ll = sqlite3Expr
2faf0 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
2fb00 70 49 74 65 6d 2d 3e 70 45 78 70 72 29 3b 0a 20  pItem->pExpr);. 
2fb10 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
2fb20 20 21 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20   !pColl ){.     
2fb30 20 20 20 70 43 6f 6c 6c 20 3d 20 70 50 61 72 73     pColl = pPars
2fb40 65 2d 3e 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c  e->db->pDfltColl
2fb50 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
2fb60 69 66 28 20 72 65 67 48 69 74 3d 3d 30 20 26 26  if( regHit==0 &&
2fb70 20 70 41 67 67 49 6e 66 6f 2d 3e 6e 41 63 63 75   pAggInfo->nAccu
2fb80 6d 75 6c 61 74 6f 72 20 29 20 72 65 67 48 69 74  mulator ) regHit
2fb90 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
2fba0 6d 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  m;.      sqlite3
2fbb0 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
2fbc0 5f 43 6f 6c 6c 53 65 71 2c 20 72 65 67 48 69 74  _CollSeq, regHit
2fbd0 2c 20 30 2c 20 30 2c 20 28 63 68 61 72 20 2a 29  , 0, 0, (char *)
2fbe0 70 43 6f 6c 6c 2c 20 50 34 5f 43 4f 4c 4c 53 45  pColl, P4_COLLSE
2fbf0 51 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  Q);.    }.    sq
2fc00 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
2fc10 76 2c 20 4f 50 5f 41 67 67 53 74 65 70 2c 20 30  v, OP_AggStep, 0
2fc20 2c 20 72 65 67 41 67 67 2c 20 70 46 2d 3e 69 4d  , regAgg, pF->iM
2fc30 65 6d 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  em);.    sqlite3
2fc40 56 64 62 65 41 70 70 65 6e 64 50 34 28 76 2c 20  VdbeAppendP4(v, 
2fc50 70 46 2d 3e 70 46 75 6e 63 2c 20 50 34 5f 46 55  pF->pFunc, P4_FU
2fc60 4e 43 44 45 46 29 3b 0a 20 20 20 20 73 71 6c 69  NCDEF);.    sqli
2fc70 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28  te3VdbeChangeP5(
2fc80 76 2c 20 28 75 38 29 6e 41 72 67 29 3b 0a 20 20  v, (u8)nArg);.  
2fc90 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
2fca0 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65  TempRange(pParse
2fcb0 2c 20 72 65 67 41 67 67 2c 20 6e 41 72 67 29 3b  , regAgg, nArg);
2fcc0 0a 20 20 20 20 69 66 28 20 61 64 64 72 4e 65 78  .    if( addrNex
2fcd0 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  t ){.      sqlit
2fce0 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
2fcf0 65 6c 28 76 2c 20 61 64 64 72 4e 65 78 74 29 3b  el(v, addrNext);
2fd00 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
2fd10 20 72 65 67 48 69 74 3d 3d 30 20 26 26 20 70 41   regHit==0 && pA
2fd20 67 67 49 6e 66 6f 2d 3e 6e 41 63 63 75 6d 75 6c  ggInfo->nAccumul
2fd30 61 74 6f 72 20 29 7b 0a 20 20 20 20 72 65 67 48  ator ){.    regH
2fd40 69 74 20 3d 20 72 65 67 41 63 63 3b 0a 20 20 7d  it = regAcc;.  }
2fd50 0a 20 20 69 66 28 20 72 65 67 48 69 74 20 29 7b  .  if( regHit ){
2fd60 0a 20 20 20 20 61 64 64 72 48 69 74 54 65 73 74  .    addrHitTest
2fd70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
2fd80 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66 2c 20 72  dOp1(v, OP_If, r
2fd90 65 67 48 69 74 29 3b 20 56 64 62 65 43 6f 76 65  egHit); VdbeCove
2fda0 72 61 67 65 28 76 29 3b 0a 20 20 7d 0a 20 20 66  rage(v);.  }.  f
2fdb0 6f 72 28 69 3d 30 2c 20 70 43 3d 70 41 67 67 49  or(i=0, pC=pAggI
2fdc0 6e 66 6f 2d 3e 61 43 6f 6c 3b 20 69 3c 70 41 67  nfo->aCol; i<pAg
2fdd0 67 49 6e 66 6f 2d 3e 6e 41 63 63 75 6d 75 6c 61  gInfo->nAccumula
2fde0 74 6f 72 3b 20 69 2b 2b 2c 20 70 43 2b 2b 29 7b  tor; i++, pC++){
2fdf0 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
2fe00 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 43 2d  Code(pParse, pC-
2fe10 3e 70 45 78 70 72 2c 20 70 43 2d 3e 69 4d 65 6d  >pExpr, pC->iMem
2fe20 29 3b 0a 20 20 7d 0a 0a 20 20 70 41 67 67 49 6e  );.  }..  pAggIn
2fe30 66 6f 2d 3e 64 69 72 65 63 74 4d 6f 64 65 20 3d  fo->directMode =
2fe40 20 30 3b 0a 20 20 69 66 28 20 61 64 64 72 48 69   0;.  if( addrHi
2fe50 74 54 65 73 74 20 29 7b 0a 20 20 20 20 73 71 6c  tTest ){.    sql
2fe60 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
2fe70 28 76 2c 20 61 64 64 72 48 69 74 54 65 73 74 29  (v, addrHitTest)
2fe80 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  ;.  }.}../*.** A
2fe90 64 64 20 61 20 73 69 6e 67 6c 65 20 4f 50 5f 45  dd a single OP_E
2fea0 78 70 6c 61 69 6e 20 69 6e 73 74 72 75 63 74 69  xplain instructi
2feb0 6f 6e 20 74 6f 20 74 68 65 20 56 44 42 45 20 74  on to the VDBE t
2fec0 6f 20 65 78 70 6c 61 69 6e 20 61 20 73 69 6d 70  o explain a simp
2fed0 6c 65 0a 2a 2a 20 63 6f 75 6e 74 28 2a 29 20 71  le.** count(*) q
2fee0 75 65 72 79 20 28 22 53 45 4c 45 43 54 20 63 6f  uery ("SELECT co
2fef0 75 6e 74 28 2a 29 20 46 52 4f 4d 20 70 54 61 62  unt(*) FROM pTab
2ff00 22 29 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53  ")..*/.#ifndef S
2ff10 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41  QLITE_OMIT_EXPLA
2ff20 49 4e 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65  IN.static void e
2ff30 78 70 6c 61 69 6e 53 69 6d 70 6c 65 43 6f 75 6e  xplainSimpleCoun
2ff40 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  t(.  Parse *pPar
2ff50 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  se,             
2ff60 20 20 20 20 20 2f 2a 20 50 61 72 73 65 20 63 6f       /* Parse co
2ff70 6e 74 65 78 74 20 2a 2f 0a 20 20 54 61 62 6c 65  ntext */.  Table
2ff80 20 2a 70 54 61 62 2c 20 20 20 20 20 20 20 20 20   *pTab,         
2ff90 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61             /* Ta
2ffa0 62 6c 65 20 62 65 69 6e 67 20 71 75 65 72 69 65  ble being querie
2ffb0 64 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49  d */.  Index *pI
2ffc0 64 78 20 20 20 20 20 20 20 20 20 20 20 20 20 20  dx              
2ffd0 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
2ffe0 75 73 65 64 20 74 6f 20 6f 70 74 69 6d 69 7a 65  used to optimize
2fff0 20 73 63 61 6e 2c 20 6f 72 20 4e 55 4c 4c 20 2a   scan, or NULL *
30000 2f 0a 29 7b 0a 20 20 69 66 28 20 70 50 61 72 73  /.){.  if( pPars
30010 65 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32 20 29 7b  e->explain==2 ){
30020 0a 20 20 20 20 69 6e 74 20 62 43 6f 76 65 72 20  .    int bCover 
30030 3d 20 28 70 49 64 78 21 3d 30 20 26 26 20 28 48  = (pIdx!=0 && (H
30040 61 73 52 6f 77 69 64 28 70 54 61 62 29 20 7c 7c  asRowid(pTab) ||
30050 20 21 49 73 50 72 69 6d 61 72 79 4b 65 79 49 6e   !IsPrimaryKeyIn
30060 64 65 78 28 70 49 64 78 29 29 29 3b 0a 20 20 20  dex(pIdx)));.   
30070 20 73 71 6c 69 74 65 33 56 64 62 65 45 78 70 6c   sqlite3VdbeExpl
30080 61 69 6e 28 70 50 61 72 73 65 2c 20 30 2c 20 22  ain(pParse, 0, "
30090 53 43 41 4e 20 54 41 42 4c 45 20 25 73 25 73 25  SCAN TABLE %s%s%
300a0 73 22 2c 0a 20 20 20 20 20 20 20 20 70 54 61 62  s",.        pTab
300b0 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20  ->zName,.       
300c0 20 62 43 6f 76 65 72 20 3f 20 22 20 55 53 49 4e   bCover ? " USIN
300d0 47 20 43 4f 56 45 52 49 4e 47 20 49 4e 44 45 58  G COVERING INDEX
300e0 20 22 20 3a 20 22 22 2c 0a 20 20 20 20 20 20 20   " : "",.       
300f0 20 62 43 6f 76 65 72 20 3f 20 70 49 64 78 2d 3e   bCover ? pIdx->
30100 7a 4e 61 6d 65 20 3a 20 22 22 0a 20 20 20 20 29  zName : "".    )
30110 3b 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23 20  ;.  }.}.#else.# 
30120 64 65 66 69 6e 65 20 65 78 70 6c 61 69 6e 53 69  define explainSi
30130 6d 70 6c 65 43 6f 75 6e 74 28 61 2c 62 2c 63 29  mpleCount(a,b,c)
30140 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 73  .#endif../*.** s
30150 71 6c 69 74 65 33 57 61 6c 6b 45 78 70 72 28 29  qlite3WalkExpr()
30160 20 63 61 6c 6c 62 61 63 6b 20 75 73 65 64 20 62   callback used b
30170 79 20 68 61 76 69 6e 67 54 6f 57 68 65 72 65 28  y havingToWhere(
30180 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  )..**.** If the 
30190 6e 6f 64 65 20 70 61 73 73 65 64 20 74 6f 20 74  node passed to t
301a0 68 65 20 63 61 6c 6c 62 61 63 6b 20 69 73 20 61  he callback is a
301b0 20 54 4b 5f 41 4e 44 20 6e 6f 64 65 2c 20 72 65   TK_AND node, re
301c0 74 75 72 6e 20 0a 2a 2a 20 57 52 43 5f 43 6f 6e  turn .** WRC_Con
301d0 74 69 6e 75 65 20 74 6f 20 74 65 6c 6c 20 73 71  tinue to tell sq
301e0 6c 69 74 65 33 57 61 6c 6b 45 78 70 72 28 29 20  lite3WalkExpr() 
301f0 74 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f 75  to iterate throu
30200 67 68 20 63 68 69 6c 64 20 6e 6f 64 65 73 2e 0a  gh child nodes..
30210 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c  **.** Otherwise,
30220 20 72 65 74 75 72 6e 20 57 52 43 5f 50 72 75 6e   return WRC_Prun
30230 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c  e. In this case,
30240 20 61 6c 73 6f 20 63 68 65 63 6b 20 69 66 20 74   also check if t
30250 68 65 20 0a 2a 2a 20 73 75 62 2d 65 78 70 72 65  he .** sub-expre
30260 73 73 69 6f 6e 20 6d 61 74 63 68 65 73 20 74 68  ssion matches th
30270 65 20 63 72 69 74 65 72 69 61 20 66 6f 72 20 62  e criteria for b
30280 65 69 6e 67 20 6d 6f 76 65 64 20 74 6f 20 74 68  eing moved to th
30290 65 20 57 48 45 52 45 0a 2a 2a 20 63 6c 61 75 73  e WHERE.** claus
302a0 65 2e 20 49 66 20 73 6f 2c 20 61 64 64 20 69 74  e. If so, add it
302b0 20 74 6f 20 74 68 65 20 57 48 45 52 45 20 63 6c   to the WHERE cl
302c0 61 75 73 65 20 61 6e 64 20 72 65 70 6c 61 63 65  ause and replace
302d0 20 74 68 65 20 73 75 62 2d 65 78 70 72 65 73 73   the sub-express
302e0 69 6f 6e 0a 2a 2a 20 77 69 74 68 69 6e 20 74 68  ion.** within th
302f0 65 20 48 41 56 49 4e 47 20 65 78 70 72 65 73 73  e HAVING express
30300 69 6f 6e 20 77 69 74 68 20 61 20 63 6f 6e 73 74  ion with a const
30310 61 6e 74 20 22 31 22 2e 0a 2a 2f 0a 73 74 61 74  ant "1"..*/.stat
30320 69 63 20 69 6e 74 20 68 61 76 69 6e 67 54 6f 57  ic int havingToW
30330 68 65 72 65 45 78 70 72 43 62 28 57 61 6c 6b 65  hereExprCb(Walke
30340 72 20 2a 70 57 61 6c 6b 65 72 2c 20 45 78 70 72  r *pWalker, Expr
30350 20 2a 70 45 78 70 72 29 7b 0a 20 20 69 66 28 20   *pExpr){.  if( 
30360 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 41 4e  pExpr->op!=TK_AN
30370 44 20 29 7b 0a 20 20 20 20 53 65 6c 65 63 74 20  D ){.    Select 
30380 2a 70 53 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 75  *pS = pWalker->u
30390 2e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 69 66  .pSelect;.    if
303a0 28 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 43  ( sqlite3ExprIsC
303b0 6f 6e 73 74 61 6e 74 4f 72 47 72 6f 75 70 42 79  onstantOrGroupBy
303c0 28 70 57 61 6c 6b 65 72 2d 3e 70 50 61 72 73 65  (pWalker->pParse
303d0 2c 20 70 45 78 70 72 2c 20 70 53 2d 3e 70 47 72  , pExpr, pS->pGr
303e0 6f 75 70 42 79 29 20 29 7b 0a 20 20 20 20 20 20  oupBy) ){.      
303f0 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 57  sqlite3 *db = pW
30400 61 6c 6b 65 72 2d 3e 70 50 61 72 73 65 2d 3e 64  alker->pParse->d
30410 62 3b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70  b;.      Expr *p
30420 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 45 78 70  New = sqlite3Exp
30430 72 28 64 62 2c 20 54 4b 5f 49 4e 54 45 47 45 52  r(db, TK_INTEGER
30440 2c 20 22 31 22 29 3b 0a 20 20 20 20 20 20 69 66  , "1");.      if
30450 28 20 70 4e 65 77 20 29 7b 0a 20 20 20 20 20 20  ( pNew ){.      
30460 20 20 45 78 70 72 20 2a 70 57 68 65 72 65 20 3d    Expr *pWhere =
30470 20 70 53 2d 3e 70 57 68 65 72 65 3b 0a 20 20 20   pS->pWhere;.   
30480 20 20 20 20 20 53 57 41 50 28 45 78 70 72 2c 20       SWAP(Expr, 
30490 2a 70 4e 65 77 2c 20 2a 70 45 78 70 72 29 3b 0a  *pNew, *pExpr);.
304a0 20 20 20 20 20 20 20 20 70 4e 65 77 20 3d 20 73          pNew = s
304b0 71 6c 69 74 65 33 45 78 70 72 41 6e 64 28 70 57  qlite3ExprAnd(pW
304c0 61 6c 6b 65 72 2d 3e 70 50 61 72 73 65 2c 20 70  alker->pParse, p
304d0 57 68 65 72 65 2c 20 70 4e 65 77 29 3b 0a 20 20  Where, pNew);.  
304e0 20 20 20 20 20 20 70 53 2d 3e 70 57 68 65 72 65        pS->pWhere
304f0 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 20 20 20   = pNew;.       
30500 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 20   pWalker->eCode 
30510 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 1;.      }.   
30520 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 57 52   }.    return WR
30530 43 5f 50 72 75 6e 65 3b 0a 20 20 7d 0a 20 20 72  C_Prune;.  }.  r
30540 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e  eturn WRC_Contin
30550 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 61  ue;.}../*.** Tra
30560 6e 73 66 65 72 20 65 6c 69 67 69 62 6c 65 20 74  nsfer eligible t
30570 65 72 6d 73 20 66 72 6f 6d 20 74 68 65 20 48 41  erms from the HA
30580 56 49 4e 47 20 63 6c 61 75 73 65 20 6f 66 20 61  VING clause of a
30590 20 71 75 65 72 79 2c 20 77 68 69 63 68 20 69 73   query, which is
305a0 0a 2a 2a 20 70 72 6f 63 65 73 73 65 64 20 61 66  .** processed af
305b0 74 65 72 20 67 72 6f 75 70 69 6e 67 2c 20 74 6f  ter grouping, to
305c0 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
305d0 65 2c 20 77 68 69 63 68 20 69 73 20 70 72 6f 63  e, which is proc
305e0 65 73 73 65 64 20 62 65 66 6f 72 65 0a 2a 2a 20  essed before.** 
305f0 67 72 6f 75 70 69 6e 67 2e 20 46 6f 72 20 65 78  grouping. For ex
30600 61 6d 70 6c 65 2c 20 74 68 65 20 71 75 65 72 79  ample, the query
30610 3a 0a 2a 2a 0a 2a 2a 20 20 20 53 45 4c 45 43 54  :.**.**   SELECT
30620 20 2a 20 46 52 4f 4d 20 3c 74 61 62 6c 65 73 3e   * FROM <tables>
30630 20 57 48 45 52 45 20 61 3d 3f 20 47 52 4f 55 50   WHERE a=? GROUP
30640 20 42 59 20 62 20 48 41 56 49 4e 47 20 62 3d 3f   BY b HAVING b=?
30650 20 41 4e 44 20 63 3d 3f 0a 2a 2a 0a 2a 2a 20 63   AND c=?.**.** c
30660 61 6e 20 62 65 20 72 65 77 72 69 74 74 65 6e 20  an be rewritten 
30670 61 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 53 45 4c 45  as:.**.**   SELE
30680 43 54 20 2a 20 46 52 4f 4d 20 3c 74 61 62 6c 65  CT * FROM <table
30690 73 3e 20 57 48 45 52 45 20 61 3d 3f 20 41 4e 44  s> WHERE a=? AND
306a0 20 62 3d 3f 20 47 52 4f 55 50 20 42 59 20 62 20   b=? GROUP BY b 
306b0 48 41 56 49 4e 47 20 63 3d 3f 0a 2a 2a 0a 2a 2a  HAVING c=?.**.**
306c0 20 41 20 74 65 72 6d 20 6f 66 20 74 68 65 20 48   A term of the H
306d0 41 56 49 4e 47 20 65 78 70 72 65 73 73 69 6f 6e  AVING expression
306e0 20 69 73 20 65 6c 69 67 69 62 6c 65 20 66 6f 72   is eligible for
306f0 20 74 72 61 6e 73 66 65 72 20 69 66 20 69 74 20   transfer if it 
30700 63 6f 6e 73 69 73 74 73 0a 2a 2a 20 65 6e 74 69  consists.** enti
30710 72 65 6c 79 20 6f 66 20 63 6f 6e 73 74 61 6e 74  rely of constant
30720 73 20 61 6e 64 20 65 78 70 72 65 73 73 69 6f 6e  s and expression
30730 73 20 74 68 61 74 20 61 72 65 20 61 6c 73 6f 20  s that are also 
30740 47 52 4f 55 50 20 42 59 20 74 65 72 6d 73 20 74  GROUP BY terms t
30750 68 61 74 0a 2a 2a 20 75 73 65 20 74 68 65 20 22  hat.** use the "
30760 42 49 4e 41 52 59 22 20 63 6f 6c 6c 61 74 69 6f  BINARY" collatio
30770 6e 20 73 65 71 75 65 6e 63 65 2e 0a 2a 2f 0a 73  n sequence..*/.s
30780 74 61 74 69 63 20 76 6f 69 64 20 68 61 76 69 6e  tatic void havin
30790 67 54 6f 57 68 65 72 65 28 50 61 72 73 65 20 2a  gToWhere(Parse *
307a0 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a  pParse, Select *
307b0 70 29 7b 0a 20 20 57 61 6c 6b 65 72 20 73 57 61  p){.  Walker sWa
307c0 6c 6b 65 72 3b 0a 20 20 6d 65 6d 73 65 74 28 26  lker;.  memset(&
307d0 73 57 61 6c 6b 65 72 2c 20 30 2c 20 73 69 7a 65  sWalker, 0, size
307e0 6f 66 28 73 57 61 6c 6b 65 72 29 29 3b 0a 20 20  of(sWalker));.  
307f0 73 57 61 6c 6b 65 72 2e 70 50 61 72 73 65 20 3d  sWalker.pParse =
30800 20 70 50 61 72 73 65 3b 0a 20 20 73 57 61 6c 6b   pParse;.  sWalk
30810 65 72 2e 78 45 78 70 72 43 61 6c 6c 62 61 63 6b  er.xExprCallback
30820 20 3d 20 68 61 76 69 6e 67 54 6f 57 68 65 72 65   = havingToWhere
30830 45 78 70 72 43 62 3b 0a 20 20 73 57 61 6c 6b 65  ExprCb;.  sWalke
30840 72 2e 75 2e 70 53 65 6c 65 63 74 20 3d 20 70 3b  r.u.pSelect = p;
30850 0a 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 45 78  .  sqlite3WalkEx
30860 70 72 28 26 73 57 61 6c 6b 65 72 2c 20 70 2d 3e  pr(&sWalker, p->
30870 70 48 61 76 69 6e 67 29 3b 0a 23 69 66 20 53 45  pHaving);.#if SE
30880 4c 45 43 54 54 52 41 43 45 5f 45 4e 41 42 4c 45  LECTTRACE_ENABLE
30890 44 0a 20 20 69 66 28 20 73 57 61 6c 6b 65 72 2e  D.  if( sWalker.
308a0 65 43 6f 64 65 20 26 26 20 28 73 71 6c 69 74 65  eCode && (sqlite
308b0 33 53 65 6c 65 63 74 54 72 61 63 65 20 26 20 30  3SelectTrace & 0
308c0 78 31 30 30 29 21 3d 30 20 29 7b 0a 20 20 20 20  x100)!=0 ){.    
308d0 53 45 4c 45 43 54 54 52 41 43 45 28 30 78 31 30  SELECTTRACE(0x10
308e0 30 2c 70 50 61 72 73 65 2c 70 2c 28 22 4d 6f 76  0,pParse,p,("Mov
308f0 65 20 48 41 56 49 4e 47 20 74 65 72 6d 73 20 69  e HAVING terms i
30900 6e 74 6f 20 57 48 45 52 45 3a 5c 6e 22 29 29 3b  nto WHERE:\n"));
30910 0a 20 20 20 20 73 71 6c 69 74 65 33 54 72 65 65  .    sqlite3Tree
30920 56 69 65 77 53 65 6c 65 63 74 28 30 2c 20 70 2c  ViewSelect(0, p,
30930 20 30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a   0);.  }.#endif.
30940 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74  }../*.** Check t
30950 6f 20 73 65 65 20 69 66 20 74 68 65 20 70 54 68  o see if the pTh
30960 69 73 20 65 6e 74 72 79 20 6f 66 20 70 54 61 62  is entry of pTab
30970 4c 69 73 74 20 69 73 20 61 20 73 65 6c 66 2d 6a  List is a self-j
30980 6f 69 6e 20 6f 66 20 61 20 70 72 69 6f 72 20 76  oin of a prior v
30990 69 65 77 2e 0a 2a 2a 20 49 66 20 69 74 20 69 73  iew..** If it is
309a0 2c 20 74 68 65 6e 20 72 65 74 75 72 6e 20 74 68  , then return th
309b0 65 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 66  e SrcList_item f
309c0 6f 72 20 74 68 65 20 70 72 69 6f 72 20 76 69 65  or the prior vie
309d0 77 2e 20 20 49 66 20 69 74 20 69 73 20 6e 6f 74  w.  If it is not
309e0 2c 0a 2a 2a 20 74 68 65 6e 20 72 65 74 75 72 6e  ,.** then return
309f0 20 30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 73 74   0..*/.static st
30a00 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
30a10 6d 20 2a 69 73 53 65 6c 66 4a 6f 69 6e 56 69 65  m *isSelfJoinVie
30a20 77 28 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54  w(.  SrcList *pT
30a30 61 62 4c 69 73 74 2c 20 20 20 20 20 20 20 20 20  abList,         
30a40 20 20 2f 2a 20 53 65 61 72 63 68 20 66 6f 72 20    /* Search for 
30a50 73 65 6c 66 2d 6a 6f 69 6e 73 20 69 6e 20 74 68  self-joins in th
30a60 69 73 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a  is FROM clause *
30a70 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69  /.  struct SrcLi
30a80 73 74 5f 69 74 65 6d 20 2a 70 54 68 69 73 20 20  st_item *pThis  
30a90 20 2f 2a 20 53 65 61 72 63 68 20 66 6f 72 20 70   /* Search for p
30aa0 72 69 6f 72 20 72 65 66 65 72 65 6e 63 65 20 74  rior reference t
30ab0 6f 20 74 68 69 73 20 73 75 62 71 75 65 72 79 20  o this subquery 
30ac0 2a 2f 0a 29 7b 0a 20 20 73 74 72 75 63 74 20 53  */.){.  struct S
30ad0 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  rcList_item *pIt
30ae0 65 6d 3b 0a 20 20 66 6f 72 28 70 49 74 65 6d 20  em;.  for(pItem 
30af0 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61 3b 20 70  = pTabList->a; p
30b00 49 74 65 6d 3c 70 54 68 69 73 3b 20 70 49 74 65  Item<pThis; pIte
30b10 6d 2b 2b 29 7b 0a 20 20 20 20 53 65 6c 65 63 74  m++){.    Select
30b20 20 2a 70 53 31 3b 0a 20 20 20 20 69 66 28 20 70   *pS1;.    if( p
30b30 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 3d 3d 30  Item->pSelect==0
30b40 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
30b50 20 69 66 28 20 70 49 74 65 6d 2d 3e 66 67 2e 76   if( pItem->fg.v
30b60 69 61 43 6f 72 6f 75 74 69 6e 65 20 29 20 63 6f  iaCoroutine ) co
30b70 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20  ntinue;.    if( 
30b80 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 3d 3d 30 20  pItem->zName==0 
30b90 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
30ba0 61 73 73 65 72 74 28 20 70 49 74 65 6d 2d 3e 70  assert( pItem->p
30bb0 54 61 62 21 3d 30 20 29 3b 0a 20 20 20 20 61 73  Tab!=0 );.    as
30bc0 73 65 72 74 28 20 70 54 68 69 73 2d 3e 70 54 61  sert( pThis->pTa
30bd0 62 21 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20  b!=0 );.    if( 
30be0 70 49 74 65 6d 2d 3e 70 54 61 62 2d 3e 70 53 63  pItem->pTab->pSc
30bf0 68 65 6d 61 21 3d 70 54 68 69 73 2d 3e 70 54 61  hema!=pThis->pTa
30c00 62 2d 3e 70 53 63 68 65 6d 61 20 29 20 63 6f 6e  b->pSchema ) con
30c10 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 73  tinue;.    if( s
30c20 71 6c 69 74 65 33 5f 73 74 72 69 63 6d 70 28 70  qlite3_stricmp(p
30c30 49 74 65 6d 2d 3e 7a 4e 61 6d 65 2c 20 70 54 68  Item->zName, pTh
30c40 69 73 2d 3e 7a 4e 61 6d 65 29 21 3d 30 20 29 20  is->zName)!=0 ) 
30c50 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 70 53  continue;.    pS
30c60 31 20 3d 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65  1 = pItem->pSele
30c70 63 74 3b 0a 20 20 20 20 69 66 28 20 70 49 74 65  ct;.    if( pIte
30c80 6d 2d 3e 70 54 61 62 2d 3e 70 53 63 68 65 6d 61  m->pTab->pSchema
30c90 3d 3d 30 20 26 26 20 70 54 68 69 73 2d 3e 70 53  ==0 && pThis->pS
30ca0 65 6c 65 63 74 2d 3e 73 65 6c 49 64 21 3d 70 53  elect->selId!=pS
30cb0 31 2d 3e 73 65 6c 49 64 20 29 7b 0a 20 20 20 20  1->selId ){.    
30cc0 20 20 2f 2a 20 54 68 65 20 71 75 65 72 79 20 66    /* The query f
30cd0 6c 61 74 74 65 6e 65 72 20 6c 65 66 74 20 74 77  lattener left tw
30ce0 6f 20 64 69 66 66 65 72 65 6e 74 20 43 54 45 20  o different CTE 
30cf0 74 61 62 6c 65 73 20 77 69 74 68 20 69 64 65 6e  tables with iden
30d00 74 69 63 61 6c 0a 20 20 20 20 20 20 2a 2a 20 6e  tical.      ** n
30d10 61 6d 65 73 20 69 6e 20 74 68 65 20 73 61 6d 65  ames in the same
30d20 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20 2a 2f   FROM clause. */
30d30 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b  .      continue;
30d40 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73  .    }.    if( s
30d50 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72  qlite3ExprCompar
30d60 65 28 30 2c 20 70 54 68 69 73 2d 3e 70 53 65 6c  e(0, pThis->pSel
30d70 65 63 74 2d 3e 70 57 68 65 72 65 2c 20 70 53 31  ect->pWhere, pS1
30d80 2d 3e 70 57 68 65 72 65 2c 20 2d 31 29 0a 20 20  ->pWhere, -1).  
30d90 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 45 78 70     || sqlite3Exp
30da0 72 43 6f 6d 70 61 72 65 28 30 2c 20 70 54 68 69  rCompare(0, pThi
30db0 73 2d 3e 70 53 65 6c 65 63 74 2d 3e 70 48 61 76  s->pSelect->pHav
30dc0 69 6e 67 2c 20 70 53 31 2d 3e 70 48 61 76 69 6e  ing, pS1->pHavin
30dd0 67 2c 20 2d 31 29 20 0a 20 20 20 20 29 7b 0a 20  g, -1) .    ){. 
30de0 20 20 20 20 20 2f 2a 20 54 68 65 20 76 69 65 77       /* The view
30df0 20 77 61 73 20 6d 6f 64 69 66 69 65 64 20 62 79   was modified by
30e00 20 73 6f 6d 65 20 6f 74 68 65 72 20 6f 70 74 69   some other opti
30e10 6d 69 7a 61 74 69 6f 6e 20 73 75 63 68 20 61 73  mization such as
30e20 0a 20 20 20 20 20 20 2a 2a 20 70 75 73 68 44 6f  .      ** pushDo
30e30 77 6e 57 68 65 72 65 54 65 72 6d 73 28 29 20 2a  wnWhereTerms() *
30e40 2f 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65  /.      continue
30e50 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75  ;.    }.    retu
30e60 72 6e 20 70 49 74 65 6d 3b 0a 20 20 7d 0a 20 20  rn pItem;.  }.  
30e70 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 23 69 66  return 0;.}..#if
30e80 64 65 66 20 53 51 4c 49 54 45 5f 43 4f 55 4e 54  def SQLITE_COUNT
30e90 4f 46 56 49 45 57 5f 4f 50 54 49 4d 49 5a 41 54  OFVIEW_OPTIMIZAT
30ea0 49 4f 4e 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70  ION./*.** Attemp
30eb0 74 20 74 6f 20 74 72 61 6e 73 66 6f 72 6d 20 61  t to transform a
30ec0 20 71 75 65 72 79 20 6f 66 20 74 68 65 20 66 6f   query of the fo
30ed0 72 6d 0a 2a 2a 0a 2a 2a 20 20 20 20 53 45 4c 45  rm.**.**    SELE
30ee0 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d  CT count(*) FROM
30ef0 20 28 53 45 4c 45 43 54 20 78 20 46 52 4f 4d 20   (SELECT x FROM 
30f00 74 31 20 55 4e 49 4f 4e 20 41 4c 4c 20 53 45 4c  t1 UNION ALL SEL
30f10 45 43 54 20 79 20 46 52 4f 4d 20 74 32 29 0a 2a  ECT y FROM t2).*
30f20 2a 0a 2a 2a 20 49 6e 74 6f 20 74 68 69 73 3a 0a  *.** Into this:.
30f30 2a 2a 0a 2a 2a 20 20 20 20 53 45 4c 45 43 54 20  **.**    SELECT 
30f40 28 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29  (SELECT count(*)
30f50 20 46 52 4f 4d 20 74 31 29 2b 28 53 45 4c 45 43   FROM t1)+(SELEC
30f60 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20  T count(*) FROM 
30f70 74 32 29 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 72  t2).**.** The tr
30f80 61 6e 73 66 6f 72 6d 61 74 69 6f 6e 20 6f 6e 6c  ansformation onl
30f90 79 20 77 6f 72 6b 73 20 69 66 20 61 6c 6c 20 6f  y works if all o
30fa0 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
30fb0 61 72 65 20 74 72 75 65 3a 0a 2a 2a 0a 2a 2a 20  are true:.**.** 
30fc0 20 20 2a 20 20 54 68 65 20 73 75 62 71 75 65 72    *  The subquer
30fd0 79 20 69 73 20 61 20 55 4e 49 4f 4e 20 41 4c 4c  y is a UNION ALL
30fe0 20 6f 66 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20   of two or more 
30ff0 74 65 72 6d 73 0a 2a 2a 20 20 20 2a 20 20 54 68  terms.**   *  Th
31000 65 20 73 75 62 71 75 65 72 79 20 64 6f 65 73 20  e subquery does 
31010 6e 6f 74 20 68 61 76 65 20 61 20 4c 49 4d 49 54  not have a LIMIT
31020 20 63 6c 61 75 73 65 0a 2a 2a 20 20 20 2a 20 20   clause.**   *  
31030 54 68 65 72 65 20 69 73 20 6e 6f 20 57 48 45 52  There is no WHER
31040 45 20 6f 72 20 47 52 4f 55 50 20 42 59 20 6f 72  E or GROUP BY or
31050 20 48 41 56 49 4e 47 20 63 6c 61 75 73 65 73 20   HAVING clauses 
31060 6f 6e 20 74 68 65 20 73 75 62 71 75 65 72 69 65  on the subquerie
31070 73 0a 2a 2a 20 20 20 2a 20 20 54 68 65 20 6f 75  s.**   *  The ou
31080 74 65 72 20 71 75 65 72 79 20 69 73 20 61 20 73  ter query is a s
31090 69 6d 70 6c 65 20 63 6f 75 6e 74 28 2a 29 20 77  imple count(*) w
310a0 69 74 68 20 6e 6f 20 57 48 45 52 45 20 63 6c 61  ith no WHERE cla
310b0 75 73 65 20 6f 72 20 6f 74 68 65 72 0a 2a 2a 20  use or other.** 
310c0 20 20 20 20 20 65 78 74 72 61 6e 65 6f 75 73 20       extraneous 
310d0 73 79 6e 74 61 78 2e 0a 2a 2a 0a 2a 2a 20 52 65  syntax..**.** Re
310e0 74 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 65  turn TRUE if the
310f0 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69 73   optimization is
31100 20 75 6e 64 65 72 74 61 6b 65 6e 2e 0a 2a 2f 0a   undertaken..*/.
31110 73 74 61 74 69 63 20 69 6e 74 20 63 6f 75 6e 74  static int count
31120 4f 66 56 69 65 77 4f 70 74 69 6d 69 7a 61 74 69  OfViewOptimizati
31130 6f 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  on(Parse *pParse
31140 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20  , Select *p){.  
31150 53 65 6c 65 63 74 20 2a 70 53 75 62 2c 20 2a 70  Select *pSub, *p
31160 50 72 69 6f 72 3b 0a 20 20 45 78 70 72 20 2a 70  Prior;.  Expr *p
31170 45 78 70 72 3b 0a 20 20 45 78 70 72 20 2a 70 43  Expr;.  Expr *pC
31180 6f 75 6e 74 3b 0a 20 20 73 71 6c 69 74 65 33 20  ount;.  sqlite3 
31190 2a 64 62 3b 0a 20 20 69 66 28 20 28 70 2d 3e 73  *db;.  if( (p->s
311a0 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 41 67 67  elFlags & SF_Agg
311b0 72 65 67 61 74 65 29 3d 3d 30 20 29 20 72 65 74  regate)==0 ) ret
311c0 75 72 6e 20 30 3b 20 20 20 2f 2a 20 54 68 69 73  urn 0;   /* This
311d0 20 69 73 20 61 6e 20 61 67 67 72 65 67 61 74 65   is an aggregate
311e0 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 45 4c   */.  if( p->pEL
311f0 69 73 74 2d 3e 6e 45 78 70 72 21 3d 31 20 29 20  ist->nExpr!=1 ) 
31200 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20  return 0;       
31210 20 20 20 20 20 20 20 20 2f 2a 20 53 69 6e 67 6c          /* Singl
31220 65 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 20  e result column 
31230 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 57 68 65  */.  if( p->pWhe
31240 72 65 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  re ) return 0;. 
31250 20 69 66 28 20 70 2d 3e 70 47 72 6f 75 70 42 79   if( p->pGroupBy
31260 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70   ) return 0;.  p
31270 45 78 70 72 20 3d 20 70 2d 3e 70 45 4c 69 73 74  Expr = p->pEList
31280 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20  ->a[0].pExpr;.  
31290 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54  if( pExpr->op!=T
312a0 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 20 29  K_AGG_FUNCTION )
312b0 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20   return 0;      
312c0 20 20 2f 2a 20 52 65 73 75 6c 74 20 69 73 20 61    /* Result is a
312d0 6e 20 61 67 67 72 65 67 61 74 65 20 2a 2f 0a 20  n aggregate */. 
312e0 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73 74 72   if( sqlite3_str
312f0 69 63 6d 70 28 70 45 78 70 72 2d 3e 75 2e 7a 54  icmp(pExpr->u.zT
31300 6f 6b 65 6e 2c 22 63 6f 75 6e 74 22 29 20 29 20  oken,"count") ) 
31310 72 65 74 75 72 6e 20 30 3b 20 20 2f 2a 20 49 73  return 0;  /* Is
31320 20 63 6f 75 6e 74 28 29 20 2a 2f 0a 20 20 69 66   count() */.  if
31330 28 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74  ( pExpr->x.pList
31340 21 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 20  !=0 ) return 0; 
31350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31360 2f 2a 20 4d 75 73 74 20 62 65 20 63 6f 75 6e 74  /* Must be count
31370 28 2a 29 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e  (*) */.  if( p->
31380 70 53 72 63 2d 3e 6e 53 72 63 21 3d 31 20 29 20  pSrc->nSrc!=1 ) 
31390 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20  return 0;       
313a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e             /* On
313b0 65 20 74 61 62 6c 65 20 69 6e 20 46 52 4f 4d 20  e table in FROM 
313c0 20 2a 2f 0a 20 20 70 53 75 62 20 3d 20 70 2d 3e   */.  pSub = p->
313d0 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 53 65 6c 65  pSrc->a[0].pSele
313e0 63 74 3b 0a 20 20 69 66 28 20 70 53 75 62 3d 3d  ct;.  if( pSub==
313f0 30 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20  0 ) return 0;   
31400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31410 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 46          /* The F
31420 52 4f 4d 20 69 73 20 61 20 73 75 62 71 75 65 72  ROM is a subquer
31430 79 20 2a 2f 0a 20 20 69 66 28 20 70 53 75 62 2d  y */.  if( pSub-
31440 3e 70 50 72 69 6f 72 3d 3d 30 20 29 20 72 65 74  >pPrior==0 ) ret
31450 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20  urn 0;          
31460 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 75 73 74           /* Must
31470 20 62 65 20 61 20 63 6f 6d 70 6f 75 6e 64 20 72   be a compound r
31480 79 20 2a 2f 0a 20 20 64 6f 7b 0a 20 20 20 20 69  y */.  do{.    i
31490 66 28 20 70 53 75 62 2d 3e 6f 70 21 3d 54 4b 5f  f( pSub->op!=TK_
314a0 41 4c 4c 20 26 26 20 70 53 75 62 2d 3e 70 50 72  ALL && pSub->pPr
314b0 69 6f 72 20 29 20 72 65 74 75 72 6e 20 30 3b 20  ior ) return 0; 
314c0 20 2f 2a 20 4d 75 73 74 20 62 65 20 55 4e 49 4f   /* Must be UNIO
314d0 4e 20 41 4c 4c 20 2a 2f 0a 20 20 20 20 69 66 28  N ALL */.    if(
314e0 20 70 53 75 62 2d 3e 70 57 68 65 72 65 20 29 20   pSub->pWhere ) 
314f0 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20  return 0;       
31500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
31510 2a 20 4e 6f 20 57 48 45 52 45 20 63 6c 61 75 73  * No WHERE claus
31520 65 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 53 75  e */.    if( pSu
31530 62 2d 3e 70 4c 69 6d 69 74 20 29 20 72 65 74 75  b->pLimit ) retu
31540 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20  rn 0;           
31550 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f             /* No
31560 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 20 2a 2f   LIMIT clause */
31570 0a 20 20 20 20 69 66 28 20 70 53 75 62 2d 3e 73  .    if( pSub->s
31580 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 41 67 67  elFlags & SF_Agg
31590 72 65 67 61 74 65 20 29 20 72 65 74 75 72 6e 20  regate ) return 
315a0 30 3b 20 20 20 20 20 2f 2a 20 4e 6f 74 20 61 6e  0;     /* Not an
315b0 20 61 67 67 72 65 67 61 74 65 20 2a 2f 0a 20 20   aggregate */.  
315c0 20 20 70 53 75 62 20 3d 20 70 53 75 62 2d 3e 70    pSub = pSub->p
315d0 50 72 69 6f 72 3b 20 20 20 20 20 20 20 20 20 20  Prior;          
315e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
315f0 20 20 20 20 2f 2a 20 52 65 70 65 61 74 20 6f 76      /* Repeat ov
31600 65 72 20 63 6f 6d 70 6f 75 6e 64 20 2a 2f 0a 20  er compound */. 
31610 20 7d 77 68 69 6c 65 28 20 70 53 75 62 20 29 3b   }while( pSub );
31620 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 72 65 61  ..  /* If we rea
31630 63 68 20 74 68 69 73 20 70 6f 69 6e 74 20 74 68  ch this point th
31640 65 6e 20 69 74 20 69 73 20 4f 4b 20 74 6f 20 70  en it is OK to p
31650 65 72 66 6f 72 6d 20 74 68 65 20 74 72 61 6e 73  erform the trans
31660 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a 0a 20 20  formation */..  
31670 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
31680 0a 20 20 70 43 6f 75 6e 74 20 3d 20 70 45 78 70  .  pCount = pExp
31690 72 3b 0a 20 20 70 45 78 70 72 20 3d 20 30 3b 0a  r;.  pExpr = 0;.
316a0 20 20 70 53 75 62 20 3d 20 70 2d 3e 70 53 72 63    pSub = p->pSrc
316b0 2d 3e 61 5b 30 5d 2e 70 53 65 6c 65 63 74 3b 0a  ->a[0].pSelect;.
316c0 20 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 30 5d 2e    p->pSrc->a[0].
316d0 70 53 65 6c 65 63 74 20 3d 20 30 3b 0a 20 20 73  pSelect = 0;.  s
316e0 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44 65 6c  qlite3SrcListDel
316f0 65 74 65 28 64 62 2c 20 70 2d 3e 70 53 72 63 29  ete(db, p->pSrc)
31700 3b 0a 20 20 70 2d 3e 70 53 72 63 20 3d 20 73 71  ;.  p->pSrc = sq
31710 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72  lite3DbMallocZer
31720 6f 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 73 69  o(pParse->db, si
31730 7a 65 6f 66 28 2a 70 2d 3e 70 53 72 63 29 29 3b  zeof(*p->pSrc));
31740 0a 20 20 77 68 69 6c 65 28 20 70 53 75 62 20 29  .  while( pSub )
31750 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 54 65 72  {.    Expr *pTer
31760 6d 3b 0a 20 20 20 20 70 50 72 69 6f 72 20 3d 20  m;.    pPrior = 
31770 70 53 75 62 2d 3e 70 50 72 69 6f 72 3b 0a 20 20  pSub->pPrior;.  
31780 20 20 70 53 75 62 2d 3e 70 50 72 69 6f 72 20 3d    pSub->pPrior =
31790 20 30 3b 0a 20 20 20 20 70 53 75 62 2d 3e 70 4e   0;.    pSub->pN
317a0 65 78 74 20 3d 20 30 3b 0a 20 20 20 20 70 53 75  ext = 0;.    pSu
317b0 62 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53  b->selFlags |= S
317c0 46 5f 41 67 67 72 65 67 61 74 65 3b 0a 20 20 20  F_Aggregate;.   
317d0 20 70 53 75 62 2d 3e 73 65 6c 46 6c 61 67 73 20   pSub->selFlags 
317e0 26 3d 20 7e 53 46 5f 43 6f 6d 70 6f 75 6e 64 3b  &= ~SF_Compound;
317f0 0a 20 20 20 20 70 53 75 62 2d 3e 6e 53 65 6c 65  .    pSub->nSele
31800 63 74 52 6f 77 20 3d 20 30 3b 0a 20 20 20 20 73  ctRow = 0;.    s
31810 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65  qlite3ExprListDe
31820 6c 65 74 65 28 64 62 2c 20 70 53 75 62 2d 3e 70  lete(db, pSub->p
31830 45 4c 69 73 74 29 3b 0a 20 20 20 20 70 54 65 72  EList);.    pTer
31840 6d 20 3d 20 70 50 72 69 6f 72 20 3f 20 73 71 6c  m = pPrior ? sql
31850 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20  ite3ExprDup(db, 
31860 70 43 6f 75 6e 74 2c 20 30 29 20 3a 20 70 43 6f  pCount, 0) : pCo
31870 75 6e 74 3b 0a 20 20 20 20 70 53 75 62 2d 3e 70  unt;.    pSub->p
31880 45 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33 45  EList = sqlite3E
31890 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70 50  xprListAppend(pP
318a0 61 72 73 65 2c 20 30 2c 20 70 54 65 72 6d 29 3b  arse, 0, pTerm);
318b0 0a 20 20 20 20 70 54 65 72 6d 20 3d 20 73 71 6c  .    pTerm = sql
318c0 69 74 65 33 50 45 78 70 72 28 70 50 61 72 73 65  ite3PExpr(pParse
318d0 2c 20 54 4b 5f 53 45 4c 45 43 54 2c 20 30 2c 20  , TK_SELECT, 0, 
318e0 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50  0);.    sqlite3P
318f0 45 78 70 72 41 64 64 53 65 6c 65 63 74 28 70 50  ExprAddSelect(pP
31900 61 72 73 65 2c 20 70 54 65 72 6d 2c 20 70 53 75  arse, pTerm, pSu
31910 62 29 3b 0a 20 20 20 20 69 66 28 20 70 45 78 70  b);.    if( pExp
31920 72 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 45  r==0 ){.      pE
31930 78 70 72 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20  xpr = pTerm;.   
31940 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 45   }else{.      pE
31950 78 70 72 20 3d 20 73 71 6c 69 74 65 33 50 45 78  xpr = sqlite3PEx
31960 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 50 4c  pr(pParse, TK_PL
31970 55 53 2c 20 70 54 65 72 6d 2c 20 70 45 78 70 72  US, pTerm, pExpr
31980 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 53 75  );.    }.    pSu
31990 62 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20 7d 0a  b = pPrior;.  }.
319a0 20 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 30    p->pEList->a[0
319b0 5d 2e 70 45 78 70 72 20 3d 20 70 45 78 70 72 3b  ].pExpr = pExpr;
319c0 0a 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26  .  p->selFlags &
319d0 3d 20 7e 53 46 5f 41 67 67 72 65 67 61 74 65 3b  = ~SF_Aggregate;
319e0 0a 0a 23 69 66 20 53 45 4c 45 43 54 54 52 41 43  ..#if SELECTTRAC
319f0 45 5f 45 4e 41 42 4c 45 44 0a 20 20 69 66 28 20  E_ENABLED.  if( 
31a00 73 71 6c 69 74 65 33 53 65 6c 65 63 74 54 72 61  sqlite3SelectTra
31a10 63 65 20 26 20 30 78 34 30 30 20 29 7b 0a 20 20  ce & 0x400 ){.  
31a20 20 20 53 45 4c 45 43 54 54 52 41 43 45 28 30 78    SELECTTRACE(0x
31a30 34 30 30 2c 70 50 61 72 73 65 2c 70 2c 28 22 41  400,pParse,p,("A
31a40 66 74 65 72 20 63 6f 75 6e 74 2d 6f 66 2d 76 69  fter count-of-vi
31a50 65 77 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 3a  ew optimization:
31a60 5c 6e 22 29 29 3b 0a 20 20 20 20 73 71 6c 69 74  \n"));.    sqlit
31a70 65 33 54 72 65 65 56 69 65 77 53 65 6c 65 63 74  e3TreeViewSelect
31a80 28 30 2c 20 70 2c 20 30 29 3b 0a 20 20 7d 0a 23  (0, p, 0);.  }.#
31a90 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 31  endif.  return 1
31aa0 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
31ab0 4c 49 54 45 5f 43 4f 55 4e 54 4f 46 56 49 45 57  LITE_COUNTOFVIEW
31ac0 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 20 2a 2f  _OPTIMIZATION */
31ad0 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
31ae0 20 63 6f 64 65 20 66 6f 72 20 74 68 65 20 53 45   code for the SE
31af0 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 67  LECT statement g
31b00 69 76 65 6e 20 69 6e 20 74 68 65 20 70 20 61 72  iven in the p ar
31b10 67 75 6d 65 6e 74 2e 20 20 0a 2a 2a 0a 2a 2a 20  gument.  .**.** 
31b20 54 68 65 20 72 65 73 75 6c 74 73 20 61 72 65 20  The results are 
31b30 72 65 74 75 72 6e 65 64 20 61 63 63 6f 72 64 69  returned accordi
31b40 6e 67 20 74 6f 20 74 68 65 20 53 65 6c 65 63 74  ng to the Select
31b50 44 65 73 74 20 73 74 72 75 63 74 75 72 65 2e 0a  Dest structure..
31b60 2a 2a 20 53 65 65 20 63 6f 6d 6d 65 6e 74 73 20  ** See comments 
31b70 69 6e 20 73 71 6c 69 74 65 49 6e 74 2e 68 20 66  in sqliteInt.h f
31b80 6f 72 20 66 75 72 74 68 65 72 20 69 6e 66 6f 72  or further infor
31b90 6d 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68  mation..**.** Th
31ba0 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72  is routine retur
31bb0 6e 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  ns the number of
31bc0 20 65 72 72 6f 72 73 2e 20 20 49 66 20 61 6e 79   errors.  If any
31bd0 20 65 72 72 6f 72 73 20 61 72 65 0a 2a 2a 20 65   errors are.** e
31be0 6e 63 6f 75 6e 74 65 72 65 64 2c 20 74 68 65 6e  ncountered, then
31bf0 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20   an appropriate 
31c00 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 73  error message is
31c10 20 6c 65 66 74 20 69 6e 0a 2a 2a 20 70 50 61 72   left in.** pPar
31c20 73 65 2d 3e 7a 45 72 72 4d 73 67 2e 0a 2a 2a 0a  se->zErrMsg..**.
31c30 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
31c40 64 6f 65 73 20 4e 4f 54 20 66 72 65 65 20 74 68  does NOT free th
31c50 65 20 53 65 6c 65 63 74 20 73 74 72 75 63 74 75  e Select structu
31c60 72 65 20 70 61 73 73 65 64 20 69 6e 2e 20 20 54  re passed in.  T
31c70 68 65 0a 2a 2a 20 63 61 6c 6c 69 6e 67 20 66 75  he.** calling fu
31c80 6e 63 74 69 6f 6e 20 6e 65 65 64 73 20 74 6f 20  nction needs to 
31c90 64 6f 20 74 68 61 74 2e 0a 2a 2f 0a 69 6e 74 20  do that..*/.int 
31ca0 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 0a 20  sqlite3Select(. 
31cb0 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
31cc0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70          /* The p
31cd0 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f  arser context */
31ce0 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20  .  Select *p,   
31cf0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
31d00 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
31d10 74 20 62 65 69 6e 67 20 63 6f 64 65 64 2e 20 2a  t being coded. *
31d20 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 2a  /.  SelectDest *
31d30 70 44 65 73 74 20 20 20 20 20 20 2f 2a 20 57 68  pDest      /* Wh
31d40 61 74 20 74 6f 20 64 6f 20 77 69 74 68 20 74 68  at to do with th
31d50 65 20 71 75 65 72 79 20 72 65 73 75 6c 74 73 20  e query results 
31d60 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a  */.){.  int i, j
31d70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
31d80 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20  * Loop counters 
31d90 2a 2f 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a  */.  WhereInfo *
31da0 70 57 49 6e 66 6f 3b 20 20 20 20 20 2f 2a 20 52  pWInfo;     /* R
31db0 65 74 75 72 6e 20 66 72 6f 6d 20 73 71 6c 69 74  eturn from sqlit
31dc0 65 33 57 68 65 72 65 42 65 67 69 6e 28 29 20 2a  e3WhereBegin() *
31dd0 2f 0a 20 20 56 64 62 65 20 2a 76 3b 20 20 20 20  /.  Vdbe *v;    
31de0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
31df0 65 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e  e virtual machin
31e00 65 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63  e under construc
31e10 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 73  tion */.  int is
31e20 41 67 67 3b 20 20 20 20 20 20 20 20 20 20 20 20  Agg;            
31e30 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 73 65 6c   /* True for sel
31e40 65 63 74 20 6c 69 73 74 73 20 6c 69 6b 65 20 22  ect lists like "
31e50 63 6f 75 6e 74 28 2a 29 22 20 2a 2f 0a 20 20 45  count(*)" */.  E
31e60 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 20  xprList *pEList 
31e70 3d 20 30 3b 20 20 2f 2a 20 4c 69 73 74 20 6f 66  = 0;  /* List of
31e80 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 65 78 74 72   columns to extr
31e90 61 63 74 2e 20 2a 2f 0a 20 20 53 72 63 4c 69 73  act. */.  SrcLis
31ea0 74 20 2a 70 54 61 62 4c 69 73 74 3b 20 20 20 20  t *pTabList;    
31eb0 20 2f 2a 20 4c 69 73 74 20 6f 66 20 74 61 62 6c   /* List of tabl
31ec0 65 73 20 74 6f 20 73 65 6c 65 63 74 20 66 72 6f  es to select fro
31ed0 6d 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 57 68  m */.  Expr *pWh
31ee0 65 72 65 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  ere;          /*
31ef0 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   The WHERE claus
31f00 65 2e 20 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20  e.  May be NULL 
31f10 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
31f20 47 72 6f 75 70 42 79 3b 20 20 20 20 2f 2a 20 54  GroupBy;    /* T
31f30 68 65 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75  he GROUP BY clau
31f40 73 65 2e 20 20 4d 61 79 20 62 65 20 4e 55 4c 4c  se.  May be NULL
31f50 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 48 61 76   */.  Expr *pHav
31f60 69 6e 67 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  ing;         /* 
31f70 54 68 65 20 48 41 56 49 4e 47 20 63 6c 61 75 73  The HAVING claus
31f80 65 2e 20 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20  e.  May be NULL 
31f90 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 31 3b  */.  int rc = 1;
31fa0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56              /* V
31fb0 61 6c 75 65 20 74 6f 20 72 65 74 75 72 6e 20 66  alue to return f
31fc0 72 6f 6d 20 74 68 69 73 20 66 75 6e 63 74 69 6f  rom this functio
31fd0 6e 20 2a 2f 0a 20 20 44 69 73 74 69 6e 63 74 43  n */.  DistinctC
31fe0 74 78 20 73 44 69 73 74 69 6e 63 74 3b 20 2f 2a  tx sDistinct; /*
31ff0 20 49 6e 66 6f 20 6f 6e 20 68 6f 77 20 74 6f 20   Info on how to 
32000 63 6f 64 65 20 74 68 65 20 44 49 53 54 49 4e 43  code the DISTINC
32010 54 20 6b 65 79 77 6f 72 64 20 2a 2f 0a 20 20 53  T keyword */.  S
32020 6f 72 74 43 74 78 20 73 53 6f 72 74 3b 20 20 20  ortCtx sSort;   
32030 20 20 20 20 20 20 2f 2a 20 49 6e 66 6f 20 6f 6e        /* Info on
32040 20 68 6f 77 20 74 6f 20 63 6f 64 65 20 74 68 65   how to code the
32050 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
32060 20 2a 2f 0a 20 20 41 67 67 49 6e 66 6f 20 73 41   */.  AggInfo sA
32070 67 67 49 6e 66 6f 3b 20 20 20 20 20 20 2f 2a 20  ggInfo;      /* 
32080 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 75 73 65 64  Information used
32090 20 62 79 20 61 67 67 72 65 67 61 74 65 20 71 75   by aggregate qu
320a0 65 72 69 65 73 20 2a 2f 0a 20 20 69 6e 74 20 69  eries */.  int i
320b0 45 6e 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  End;            
320c0 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20    /* Address of 
320d0 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 71  the end of the q
320e0 75 65 72 79 20 2a 2f 0a 20 20 73 71 6c 69 74 65  uery */.  sqlite
320f0 33 20 2a 64 62 3b 20 20 20 20 20 20 20 20 20 20  3 *db;          
32100 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65   /* The database
32110 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20   connection */. 
32120 20 45 78 70 72 4c 69 73 74 20 2a 70 4d 69 6e 4d   ExprList *pMinM
32130 61 78 4f 72 64 65 72 42 79 20 3d 20 30 3b 20 20  axOrderBy = 0;  
32140 2f 2a 20 41 64 64 65 64 20 4f 52 44 45 52 20 42  /* Added ORDER B
32150 59 20 66 6f 72 20 6d 69 6e 2f 6d 61 78 20 71 75  Y for min/max qu
32160 65 72 69 65 73 20 2a 2f 0a 20 20 75 38 20 6d 69  eries */.  u8 mi
32170 6e 4d 61 78 46 6c 61 67 3b 20 20 20 20 20 20 20  nMaxFlag;       
32180 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61            /* Fla
32190 67 20 66 6f 72 20 6d 69 6e 2f 6d 61 78 20 71 75  g for min/max qu
321a0 65 72 69 65 73 20 2a 2f 0a 0a 20 20 64 62 20 3d  eries */..  db =
321b0 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 76   pParse->db;.  v
321c0 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62   = sqlite3GetVdb
321d0 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28  e(pParse);.  if(
321e0 20 70 3d 3d 30 20 7c 7c 20 64 62 2d 3e 6d 61 6c   p==0 || db->mal
321f0 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20 70 50 61  locFailed || pPa
32200 72 73 65 2d 3e 6e 45 72 72 20 29 7b 0a 20 20 20  rse->nErr ){.   
32210 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20   return 1;.  }. 
32220 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68   if( sqlite3Auth
32230 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51  Check(pParse, SQ
32240 4c 49 54 45 5f 53 45 4c 45 43 54 2c 20 30 2c 20  LITE_SELECT, 0, 
32250 30 2c 20 30 29 20 29 20 72 65 74 75 72 6e 20 31  0, 0) ) return 1
32260 3b 0a 20 20 6d 65 6d 73 65 74 28 26 73 41 67 67  ;.  memset(&sAgg
32270 49 6e 66 6f 2c 20 30 2c 20 73 69 7a 65 6f 66 28  Info, 0, sizeof(
32280 73 41 67 67 49 6e 66 6f 29 29 3b 0a 23 69 66 20  sAggInfo));.#if 
32290 53 45 4c 45 43 54 54 52 41 43 45 5f 45 4e 41 42  SELECTTRACE_ENAB
322a0 4c 45 44 0a 20 20 53 45 4c 45 43 54 54 52 41 43  LED.  SELECTTRAC
322b0 45 28 31 2c 70 50 61 72 73 65 2c 70 2c 20 28 22  E(1,pParse,p, ("
322c0 62 65 67 69 6e 20 70 72 6f 63 65 73 73 69 6e 67  begin processing
322d0 3a 5c 6e 22 2c 20 70 50 61 72 73 65 2d 3e 61 64  :\n", pParse->ad
322e0 64 72 45 78 70 6c 61 69 6e 29 29 3b 0a 20 20 69  drExplain));.  i
322f0 66 28 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  f( sqlite3Select
32300 54 72 61 63 65 20 26 20 30 78 31 30 30 20 29 7b  Trace & 0x100 ){
32310 0a 20 20 20 20 73 71 6c 69 74 65 33 54 72 65 65  .    sqlite3Tree
32320 56 69 65 77 53 65 6c 65 63 74 28 30 2c 20 70 2c  ViewSelect(0, p,
32330 20 30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a   0);.  }.#endif.
32340 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4f  .  assert( p->pO
32350 72 64 65 72 42 79 3d 3d 30 20 7c 7c 20 70 44 65  rderBy==0 || pDe
32360 73 74 2d 3e 65 44 65 73 74 21 3d 53 52 54 5f 44  st->eDest!=SRT_D
32370 69 73 74 46 69 66 6f 20 29 3b 0a 20 20 61 73 73  istFifo );.  ass
32380 65 72 74 28 20 70 2d 3e 70 4f 72 64 65 72 42 79  ert( p->pOrderBy
32390 3d 3d 30 20 7c 7c 20 70 44 65 73 74 2d 3e 65 44  ==0 || pDest->eD
323a0 65 73 74 21 3d 53 52 54 5f 46 69 66 6f 20 29 3b  est!=SRT_Fifo );
323b0 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4f  .  assert( p->pO
323c0 72 64 65 72 42 79 3d 3d 30 20 7c 7c 20 70 44 65  rderBy==0 || pDe
323d0 73 74 2d 3e 65 44 65 73 74 21 3d 53 52 54 5f 44  st->eDest!=SRT_D
323e0 69 73 74 51 75 65 75 65 20 29 3b 0a 20 20 61 73  istQueue );.  as
323f0 73 65 72 74 28 20 70 2d 3e 70 4f 72 64 65 72 42  sert( p->pOrderB
32400 79 3d 3d 30 20 7c 7c 20 70 44 65 73 74 2d 3e 65  y==0 || pDest->e
32410 44 65 73 74 21 3d 53 52 54 5f 51 75 65 75 65 20  Dest!=SRT_Queue 
32420 29 3b 0a 20 20 69 66 28 20 49 67 6e 6f 72 61 62  );.  if( Ignorab
32430 6c 65 4f 72 64 65 72 62 79 28 70 44 65 73 74 29  leOrderby(pDest)
32440 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 70   ){.    assert(p
32450 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54  Dest->eDest==SRT
32460 5f 45 78 69 73 74 73 20 7c 7c 20 70 44 65 73 74  _Exists || pDest
32470 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 55 6e 69  ->eDest==SRT_Uni
32480 6f 6e 20 7c 7c 20 0a 20 20 20 20 20 20 20 20 20  on || .         
32490 20 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d    pDest->eDest==
324a0 53 52 54 5f 45 78 63 65 70 74 20 7c 7c 20 70 44  SRT_Except || pD
324b0 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f  est->eDest==SRT_
324c0 44 69 73 63 61 72 64 20 7c 7c 0a 20 20 20 20 20  Discard ||.     
324d0 20 20 20 20 20 20 70 44 65 73 74 2d 3e 65 44 65        pDest->eDe
324e0 73 74 3d 3d 53 52 54 5f 51 75 65 75 65 20 20 7c  st==SRT_Queue  |
324f0 7c 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d  | pDest->eDest==
32500 53 52 54 5f 44 69 73 74 46 69 66 6f 20 7c 7c 0a  SRT_DistFifo ||.
32510 20 20 20 20 20 20 20 20 20 20 20 70 44 65 73 74             pDest
32520 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 44 69 73  ->eDest==SRT_Dis
32530 74 51 75 65 75 65 20 7c 7c 20 70 44 65 73 74 2d  tQueue || pDest-
32540 3e 65 44 65 73 74 3d 3d 53 52 54 5f 46 69 66 6f  >eDest==SRT_Fifo
32550 29 3b 0a 20 20 20 20 2f 2a 20 49 66 20 4f 52 44  );.    /* If ORD
32560 45 52 20 42 59 20 6d 61 6b 65 73 20 6e 6f 20 64  ER BY makes no d
32570 69 66 66 65 72 65 6e 63 65 20 69 6e 20 74 68 65  ifference in the
32580 20 6f 75 74 70 75 74 20 74 68 65 6e 20 6e 65 69   output then nei
32590 74 68 65 72 20 64 6f 65 73 0a 20 20 20 20 2a 2a  ther does.    **
325a0 20 44 49 53 54 49 4e 43 54 20 73 6f 20 69 74 20   DISTINCT so it 
325b0 63 61 6e 20 62 65 20 72 65 6d 6f 76 65 64 20 74  can be removed t
325c0 6f 6f 2e 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74  oo. */.    sqlit
325d0 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65  e3ExprListDelete
325e0 28 64 62 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79  (db, p->pOrderBy
325f0 29 3b 0a 20 20 20 20 70 2d 3e 70 4f 72 64 65 72  );.    p->pOrder
32600 42 79 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 73  By = 0;.    p->s
32610 65 6c 46 6c 61 67 73 20 26 3d 20 7e 53 46 5f 44  elFlags &= ~SF_D
32620 69 73 74 69 6e 63 74 3b 0a 20 20 7d 0a 20 20 73  istinct;.  }.  s
32630 71 6c 69 74 65 33 53 65 6c 65 63 74 50 72 65 70  qlite3SelectPrep
32640 28 70 50 61 72 73 65 2c 20 70 2c 20 30 29 3b 0a  (pParse, p, 0);.
32650 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45    if( pParse->nE
32660 72 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63  rr || db->malloc
32670 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 67 6f  Failed ){.    go
32680 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20  to select_end;. 
32690 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e   }.  assert( p->
326a0 70 45 4c 69 73 74 21 3d 30 20 29 3b 0a 23 69 66  pEList!=0 );.#if
326b0 20 53 45 4c 45 43 54 54 52 41 43 45 5f 45 4e 41   SELECTTRACE_ENA
326c0 42 4c 45 44 0a 20 20 69 66 28 20 73 71 6c 69 74  BLED.  if( sqlit
326d0 65 33 53 65 6c 65 63 74 54 72 61 63 65 20 26 20  e3SelectTrace & 
326e0 30 78 31 30 34 20 29 7b 0a 20 20 20 20 53 45 4c  0x104 ){.    SEL
326f0 45 43 54 54 52 41 43 45 28 30 78 31 30 34 2c 70  ECTTRACE(0x104,p
32700 50 61 72 73 65 2c 70 2c 20 28 22 61 66 74 65 72  Parse,p, ("after
32710 20 6e 61 6d 65 20 72 65 73 6f 6c 75 74 69 6f 6e   name resolution
32720 3a 5c 6e 22 29 29 3b 0a 20 20 20 20 73 71 6c 69  :\n"));.    sqli
32730 74 65 33 54 72 65 65 56 69 65 77 53 65 6c 65 63  te3TreeViewSelec
32740 74 28 30 2c 20 70 2c 20 30 29 3b 0a 20 20 7d 0a  t(0, p, 0);.  }.
32750 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 70 44  #endif..  if( pD
32760 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f  est->eDest==SRT_
32770 4f 75 74 70 75 74 20 29 7b 0a 20 20 20 20 67 65  Output ){.    ge
32780 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65  nerateColumnName
32790 73 28 70 50 61 72 73 65 2c 20 70 29 3b 0a 20 20  s(pParse, p);.  
327a0 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
327b0 45 5f 4f 4d 49 54 5f 57 49 4e 44 4f 57 46 55 4e  E_OMIT_WINDOWFUN
327c0 43 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 57  C.  if( sqlite3W
327d0 69 6e 64 6f 77 52 65 77 72 69 74 65 28 70 50 61  indowRewrite(pPa
327e0 72 73 65 2c 20 70 29 20 29 7b 0a 20 20 20 20 67  rse, p) ){.    g
327f0 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  oto select_end;.
32800 20 20 7d 0a 23 69 66 20 53 45 4c 45 43 54 54 52    }.#if SELECTTR
32810 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20 69 66  ACE_ENABLED.  if
32820 28 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 54  ( sqlite3SelectT
32830 72 61 63 65 20 26 20 30 78 31 30 38 20 29 7b 0a  race & 0x108 ){.
32840 20 20 20 20 53 45 4c 45 43 54 54 52 41 43 45 28      SELECTTRACE(
32850 30 78 31 30 34 2c 70 50 61 72 73 65 2c 70 2c 20  0x104,pParse,p, 
32860 28 22 61 66 74 65 72 20 77 69 6e 64 6f 77 20 72  ("after window r
32870 65 77 72 69 74 65 3a 5c 6e 22 29 29 3b 0a 20 20  ewrite:\n"));.  
32880 20 20 73 71 6c 69 74 65 33 54 72 65 65 56 69 65    sqlite3TreeVie
32890 77 53 65 6c 65 63 74 28 30 2c 20 70 2c 20 30 29  wSelect(0, p, 0)
328a0 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 23 65 6e  ;.  }.#endif.#en
328b0 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
328c0 49 54 5f 57 49 4e 44 4f 57 46 55 4e 43 20 2a 2f  IT_WINDOWFUNC */
328d0 0a 20 20 70 54 61 62 4c 69 73 74 20 3d 20 70 2d  .  pTabList = p-
328e0 3e 70 53 72 63 3b 0a 20 20 69 73 41 67 67 20 3d  >pSrc;.  isAgg =
328f0 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20   (p->selFlags & 
32900 53 46 5f 41 67 67 72 65 67 61 74 65 29 21 3d 30  SF_Aggregate)!=0
32910 3b 0a 20 20 6d 65 6d 73 65 74 28 26 73 53 6f 72  ;.  memset(&sSor
32920 74 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 53 6f  t, 0, sizeof(sSo
32930 72 74 29 29 3b 0a 20 20 73 53 6f 72 74 2e 70 4f  rt));.  sSort.pO
32940 72 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64  rderBy = p->pOrd
32950 65 72 42 79 3b 0a 0a 20 20 2f 2a 20 54 72 79 20  erBy;..  /* Try 
32960 74 6f 20 76 61 72 69 6f 75 73 20 6f 70 74 69 6d  to various optim
32970 69 7a 61 74 69 6f 6e 73 20 28 66 6c 61 74 74 65  izations (flatte
32980 6e 69 6e 67 20 73 75 62 71 75 65 72 69 65 73 2c  ning subqueries,
32990 20 61 6e 64 20 73 74 72 65 6e 67 74 68 0a 20 20   and strength.  
329a0 2a 2a 20 72 65 64 75 63 74 69 6f 6e 20 6f 66 20  ** reduction of 
329b0 6a 6f 69 6e 20 6f 70 65 72 61 74 6f 72 73 29 20  join operators) 
329c0 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  in the FROM clau
329d0 73 65 20 75 70 20 69 6e 74 6f 20 74 68 65 20 6d  se up into the m
329e0 61 69 6e 20 71 75 65 72 79 0a 20 20 2a 2f 0a 23  ain query.  */.#
329f0 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
32a00 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
32a10 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51  ) || !defined(SQ
32a20 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 0a  LITE_OMIT_VIEW).
32a30 20 20 66 6f 72 28 69 3d 30 3b 20 21 70 2d 3e 70    for(i=0; !p->p
32a40 50 72 69 6f 72 20 26 26 20 69 3c 70 54 61 62 4c  Prior && i<pTabL
32a50 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b  ist->nSrc; i++){
32a60 0a 20 20 20 20 73 74 72 75 63 74 20 53 72 63 4c  .    struct SrcL
32a70 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20  ist_item *pItem 
32a80 3d 20 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69  = &pTabList->a[i
32a90 5d 3b 0a 20 20 20 20 53 65 6c 65 63 74 20 2a 70  ];.    Select *p
32aa0 53 75 62 20 3d 20 70 49 74 65 6d 2d 3e 70 53 65  Sub = pItem->pSe
32ab0 6c 65 63 74 3b 0a 20 20 20 20 54 61 62 6c 65 20  lect;.    Table 
32ac0 2a 70 54 61 62 20 3d 20 70 49 74 65 6d 2d 3e 70  *pTab = pItem->p
32ad0 54 61 62 3b 0a 0a 20 20 20 20 2f 2a 20 43 6f 6e  Tab;..    /* Con
32ae0 76 65 72 74 20 4c 45 46 54 20 4a 4f 49 4e 20 69  vert LEFT JOIN i
32af0 6e 74 6f 20 4a 4f 49 4e 20 69 66 20 74 68 65 72  nto JOIN if ther
32b00 65 20 61 72 65 20 74 65 72 6d 73 20 6f 66 20 74  e are terms of t
32b10 68 65 20 72 69 67 68 74 20 74 61 62 6c 65 0a 20  he right table. 
32b20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 4c 45 46     ** of the LEF
32b30 54 20 4a 4f 49 4e 20 75 73 65 64 20 69 6e 20 74  T JOIN used in t
32b40 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e  he WHERE clause.
32b50 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
32b60 28 70 49 74 65 6d 2d 3e 66 67 2e 6a 6f 69 6e 74  (pItem->fg.joint
32b70 79 70 65 20 26 20 4a 54 5f 4c 45 46 54 29 21 3d  ype & JT_LEFT)!=
32b80 30 0a 20 20 20 20 20 26 26 20 73 71 6c 69 74 65  0.     && sqlite
32b90 33 45 78 70 72 49 6d 70 6c 69 65 73 4e 6f 6e 4e  3ExprImpliesNonN
32ba0 75 6c 6c 52 6f 77 28 70 2d 3e 70 57 68 65 72 65  ullRow(p->pWhere
32bb0 2c 20 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72  , pItem->iCursor
32bc0 29 0a 20 20 20 20 20 26 26 20 4f 70 74 69 6d 69  ).     && Optimi
32bd0 7a 61 74 69 6f 6e 45 6e 61 62 6c 65 64 28 64 62  zationEnabled(db
32be0 2c 20 53 51 4c 49 54 45 5f 53 69 6d 70 6c 69 66  , SQLITE_Simplif
32bf0 79 4a 6f 69 6e 29 0a 20 20 20 20 29 7b 0a 20 20  yJoin).    ){.  
32c00 20 20 20 20 53 45 4c 45 43 54 54 52 41 43 45 28      SELECTTRACE(
32c10 30 78 31 30 30 2c 70 50 61 72 73 65 2c 70 2c 0a  0x100,pParse,p,.
32c20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32c30 28 22 4c 45 46 54 2d 4a 4f 49 4e 20 73 69 6d 70  ("LEFT-JOIN simp
32c40 6c 69 66 69 65 73 20 74 6f 20 4a 4f 49 4e 20 6f  lifies to JOIN o
32c50 6e 20 74 65 72 6d 20 25 64 5c 6e 22 2c 69 29 29  n term %d\n",i))
32c60 3b 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 66  ;.      pItem->f
32c70 67 2e 6a 6f 69 6e 74 79 70 65 20 26 3d 20 7e 28  g.jointype &= ~(
32c80 4a 54 5f 4c 45 46 54 7c 4a 54 5f 4f 55 54 45 52  JT_LEFT|JT_OUTER
32c90 29 3b 0a 20 20 20 20 20 20 75 6e 73 65 74 4a 6f  );.      unsetJo
32ca0 69 6e 45 78 70 72 28 70 2d 3e 70 57 68 65 72 65  inExpr(p->pWhere
32cb0 2c 20 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72  , pItem->iCursor
32cc0 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  );.    }..    /*
32cd0 20 4e 6f 20 66 75 74 68 65 72 20 61 63 74 69 6f   No futher actio
32ce0 6e 20 69 66 20 74 68 69 73 20 74 65 72 6d 20 6f  n if this term o
32cf0 66 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  f the FROM claus
32d00 65 20 69 73 20 6e 6f 20 61 20 73 75 62 71 75 65  e is no a subque
32d10 72 79 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 53  ry */.    if( pS
32d20 75 62 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65  ub==0 ) continue
32d30 3b 0a 0a 20 20 20 20 2f 2a 20 43 61 74 63 68 20  ;..    /* Catch 
32d40 6d 69 73 6d 61 74 63 68 20 69 6e 20 74 68 65 20  mismatch in the 
32d50 64 65 63 6c 61 72 65 64 20 63 6f 6c 75 6d 6e 73  declared columns
32d60 20 6f 66 20 61 20 76 69 65 77 20 61 6e 64 20 74   of a view and t
32d70 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 20 20 20  he number of.   
32d80 20 2a 2a 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74   ** columns in t
32d90 68 65 20 53 45 4c 45 43 54 20 6f 6e 20 74 68 65  he SELECT on the
32da0 20 52 48 53 20 2a 2f 0a 20 20 20 20 69 66 28 20   RHS */.    if( 
32db0 70 54 61 62 2d 3e 6e 43 6f 6c 21 3d 70 53 75 62  pTab->nCol!=pSub
32dc0 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20  ->pEList->nExpr 
32dd0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
32de0 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
32df0 20 22 65 78 70 65 63 74 65 64 20 25 64 20 63 6f   "expected %d co
32e00 6c 75 6d 6e 73 20 66 6f 72 20 27 25 73 27 20 62  lumns for '%s' b
32e10 75 74 20 67 6f 74 20 25 64 22 2c 0a 20 20 20 20  ut got %d",.    
32e20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32e30 20 20 70 54 61 62 2d 3e 6e 43 6f 6c 2c 20 70 54    pTab->nCol, pT
32e40 61 62 2d 3e 7a 4e 61 6d 65 2c 20 70 53 75 62 2d  ab->zName, pSub-
32e50 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b  >pEList->nExpr);
32e60 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 65 6c 65  .      goto sele
32e70 63 74 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a 0a 20  ct_end;.    }.. 
32e80 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 74 72 79     /* Do not try
32e90 20 74 6f 20 66 6c 61 74 74 65 6e 20 61 6e 20 61   to flatten an a
32ea0 67 67 72 65 67 61 74 65 20 73 75 62 71 75 65 72  ggregate subquer
32eb0 79 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  y..    **.    **
32ec0 20 46 6c 61 74 74 65 6e 69 6e 67 20 61 6e 20 61   Flattening an a
32ed0 67 67 72 65 67 61 74 65 20 73 75 62 71 75 65 72  ggregate subquer
32ee0 79 20 69 73 20 6f 6e 6c 79 20 70 6f 73 73 69 62  y is only possib
32ef0 6c 65 20 69 66 20 74 68 65 20 6f 75 74 65 72 20  le if the outer 
32f00 71 75 65 72 79 0a 20 20 20 20 2a 2a 20 69 73 20  query.    ** is 
32f10 6e 6f 74 20 61 20 6a 6f 69 6e 2e 20 20 42 75 74  not a join.  But
32f20 20 69 66 20 74 68 65 20 6f 75 74 65 72 20 71 75   if the outer qu
32f30 65 72 79 20 69 73 20 6e 6f 74 20 61 20 6a 6f 69  ery is not a joi
32f40 6e 2c 20 74 68 65 6e 20 74 68 65 20 73 75 62 71  n, then the subq
32f50 75 65 72 79 0a 20 20 20 20 2a 2a 20 77 69 6c 6c  uery.    ** will
32f60 20 62 65 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20   be implemented 
32f70 61 73 20 61 20 63 6f 2d 72 6f 75 74 69 6e 65 20  as a co-routine 
32f80 61 6e 64 20 74 68 65 72 65 20 69 73 20 6e 6f 20  and there is no 
32f90 61 64 76 61 6e 74 61 67 65 20 74 6f 0a 20 20 20  advantage to.   
32fa0 20 2a 2a 20 66 6c 61 74 74 65 6e 69 6e 67 20 69   ** flattening i
32fb0 6e 20 74 68 61 74 20 63 61 73 65 2e 0a 20 20 20  n that case..   
32fc0 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 70 53 75   */.    if( (pSu
32fd0 62 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46  b->selFlags & SF
32fe0 5f 41 67 67 72 65 67 61 74 65 29 21 3d 30 20 29  _Aggregate)!=0 )
32ff0 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 61   continue;.    a
33000 73 73 65 72 74 28 20 70 53 75 62 2d 3e 70 47 72  ssert( pSub->pGr
33010 6f 75 70 42 79 3d 3d 30 20 29 3b 0a 0a 20 20 20  oupBy==0 );..   
33020 20 2f 2a 20 49 66 20 74 68 65 20 6f 75 74 65 72   /* If the outer
33030 20 71 75 65 72 79 20 63 6f 6e 74 61 69 6e 73 20   query contains 
33040 61 20 22 63 6f 6d 70 6c 65 78 22 20 72 65 73 75  a "complex" resu
33050 6c 74 20 73 65 74 20 28 74 68 61 74 20 69 73 2c  lt set (that is,
33060 0a 20 20 20 20 2a 2a 20 69 66 20 74 68 65 20 72  .    ** if the r
33070 65 73 75 6c 74 20 73 65 74 20 6f 66 20 74 68 65  esult set of the
33080 20 6f 75 74 65 72 20 71 75 65 72 79 20 75 73 65   outer query use
33090 73 20 66 75 6e 63 74 69 6f 6e 73 20 6f 72 20 73  s functions or s
330a0 75 62 71 75 65 72 69 65 73 29 0a 20 20 20 20 2a  ubqueries).    *
330b0 2a 20 61 6e 64 20 69 66 20 74 68 65 20 73 75 62  * and if the sub
330c0 71 75 65 72 79 20 63 6f 6e 74 61 69 6e 73 20 61  query contains a
330d0 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  n ORDER BY claus
330e0 65 20 61 6e 64 20 69 66 0a 20 20 20 20 2a 2a 20  e and if.    ** 
330f0 69 74 20 77 69 6c 6c 20 62 65 20 69 6d 70 6c 65  it will be imple
33100 6d 65 6e 74 65 64 20 61 73 20 61 20 63 6f 2d 72  mented as a co-r
33110 6f 75 74 69 6e 65 2c 20 74 68 65 6e 20 64 6f 20  outine, then do 
33120 6e 6f 74 20 66 6c 61 74 74 65 6e 2e 20 20 54 68  not flatten.  Th
33130 69 73 0a 20 20 20 20 2a 2a 20 72 65 73 74 72 69  is.    ** restri
33140 63 74 69 6f 6e 20 61 6c 6c 6f 77 73 20 53 51 4c  ction allows SQL
33150 20 63 6f 6e 73 74 72 75 63 74 73 20 6c 69 6b 65   constructs like
33160 20 74 68 69 73 3a 0a 20 20 20 20 2a 2a 0a 20 20   this:.    **.  
33170 20 20 2a 2a 20 20 53 45 4c 45 43 54 20 65 78 70    **  SELECT exp
33180 65 6e 73 69 76 65 5f 66 75 6e 63 74 69 6f 6e 28  ensive_function(
33190 78 29 0a 20 20 20 20 2a 2a 20 20 20 20 46 52 4f  x).    **    FRO
331a0 4d 20 28 53 45 4c 45 43 54 20 78 20 46 52 4f 4d  M (SELECT x FROM
331b0 20 74 61 62 20 4f 52 44 45 52 20 42 59 20 79 20   tab ORDER BY y 
331c0 4c 49 4d 49 54 20 31 30 29 3b 0a 20 20 20 20 2a  LIMIT 10);.    *
331d0 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 65 78 70  *.    ** The exp
331e0 65 6e 73 69 76 65 5f 66 75 6e 63 74 69 6f 6e 28  ensive_function(
331f0 29 20 69 73 20 6f 6e 6c 79 20 63 6f 6d 70 75 74  ) is only comput
33200 65 64 20 6f 6e 20 74 68 65 20 31 30 20 72 6f 77  ed on the 10 row
33210 73 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 61 72  s that.    ** ar
33220 65 20 6f 75 74 70 75 74 2c 20 72 61 74 68 65 72  e output, rather
33230 20 74 68 61 6e 20 65 76 65 72 79 20 72 6f 77 20   than every row 
33240 6f 66 20 74 68 65 20 74 61 62 6c 65 2e 0a 20 20  of the table..  
33250 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20    **.    ** The 
33260 72 65 71 75 69 72 65 6d 65 6e 74 20 74 68 61 74  requirement that
33270 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
33280 20 68 61 76 65 20 61 20 63 6f 6d 70 6c 65 78 20   have a complex 
33290 72 65 73 75 6c 74 20 73 65 74 0a 20 20 20 20 2a  result set.    *
332a0 2a 20 6d 65 61 6e 73 20 74 68 61 74 20 66 6c 61  * means that fla
332b0 74 74 65 6e 69 6e 67 20 64 6f 65 73 20 6f 63 63  ttening does occ
332c0 75 72 20 6f 6e 20 73 69 6d 70 6c 65 72 20 53 51  ur on simpler SQ
332d0 4c 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 77 69  L constraints wi
332e0 74 68 6f 75 74 0a 20 20 20 20 2a 2a 20 74 68 65  thout.    ** the
332f0 20 65 78 70 65 6e 73 69 76 65 5f 66 75 6e 63 74   expensive_funct
33300 69 6f 6e 28 29 20 6c 69 6b 65 3a 0a 20 20 20 20  ion() like:.    
33310 2a 2a 0a 20 20 20 20 2a 2a 20 20 53 45 4c 45 43  **.    **  SELEC
33320 54 20 78 20 46 52 4f 4d 20 28 53 45 4c 45 43 54  T x FROM (SELECT
33330 20 78 20 46 52 4f 4d 20 74 61 62 20 4f 52 44 45   x FROM tab ORDE
33340 52 20 42 59 20 79 20 4c 49 4d 49 54 20 31 30 29  R BY y LIMIT 10)
33350 3b 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ;.    */.    if(
33360 20 70 53 75 62 2d 3e 70 4f 72 64 65 72 42 79 21   pSub->pOrderBy!
33370 3d 30 0a 20 20 20 20 20 26 26 20 69 3d 3d 30 0a  =0.     && i==0.
33380 20 20 20 20 20 26 26 20 28 70 2d 3e 73 65 6c 46       && (p->selF
33390 6c 61 67 73 20 26 20 53 46 5f 43 6f 6d 70 6c 65  lags & SF_Comple
333a0 78 52 65 73 75 6c 74 29 21 3d 30 0a 20 20 20 20  xResult)!=0.    
333b0 20 26 26 20 28 70 54 61 62 4c 69 73 74 2d 3e 6e   && (pTabList->n
333c0 53 72 63 3d 3d 31 0a 20 20 20 20 20 20 20 20 20  Src==1.         
333d0 7c 7c 20 28 70 54 61 62 4c 69 73 74 2d 3e 61 5b  || (pTabList->a[
333e0 31 5d 2e 66 67 2e 6a 6f 69 6e 74 79 70 65 26 28  1].fg.jointype&(
333f0 4a 54 5f 4c 45 46 54 7c 4a 54 5f 43 52 4f 53 53  JT_LEFT|JT_CROSS
33400 29 29 21 3d 30 29 0a 20 20 20 20 29 7b 0a 20 20  ))!=0).    ){.  
33410 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
33420 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 66 6c 61    }..    if( fla
33430 74 74 65 6e 53 75 62 71 75 65 72 79 28 70 50 61  ttenSubquery(pPa
33440 72 73 65 2c 20 70 2c 20 69 2c 20 69 73 41 67 67  rse, p, i, isAgg
33450 29 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  ) ){.      if( p
33460 50 61 72 73 65 2d 3e 6e 45 72 72 20 29 20 67 6f  Parse->nErr ) go
33470 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20  to select_end;. 
33480 20 20 20 20 20 2f 2a 20 54 68 69 73 20 73 75 62       /* This sub
33490 71 75 65 72 79 20 63 61 6e 20 62 65 20 61 62 73  query can be abs
334a0 6f 72 62 65 64 20 69 6e 74 6f 20 69 74 73 20 70  orbed into its p
334b0 61 72 65 6e 74 2e 20 2a 2f 0a 20 20 20 20 20 20  arent. */.      
334c0 69 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20  i = -1;.    }.  
334d0 20 20 70 54 61 62 4c 69 73 74 20 3d 20 70 2d 3e    pTabList = p->
334e0 70 53 72 63 3b 0a 20 20 20 20 69 66 28 20 64 62  pSrc;.    if( db
334f0 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
33500 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64   goto select_end
33510 3b 0a 20 20 20 20 69 66 28 20 21 49 67 6e 6f 72  ;.    if( !Ignor
33520 61 62 6c 65 4f 72 64 65 72 62 79 28 70 44 65 73  ableOrderby(pDes
33530 74 29 20 29 7b 0a 20 20 20 20 20 20 73 53 6f 72  t) ){.      sSor
33540 74 2e 70 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e  t.pOrderBy = p->
33550 70 4f 72 64 65 72 42 79 3b 0a 20 20 20 20 7d 0a  pOrderBy;.    }.
33560 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e    }.#endif..#ifn
33570 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
33580 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 0a  COMPOUND_SELECT.
33590 20 20 2f 2a 20 48 61 6e 64 6c 65 20 63 6f 6d 70    /* Handle comp
335a0 6f 75 6e 64 20 53 45 4c 45 43 54 20 73 74 61 74  ound SELECT stat
335b0 65 6d 65 6e 74 73 20 75 73 69 6e 67 20 74 68 65  ements using the
335c0 20 73 65 70 61 72 61 74 65 20 6d 75 6c 74 69 53   separate multiS
335d0 65 6c 65 63 74 28 29 0a 20 20 2a 2a 20 70 72 6f  elect().  ** pro
335e0 63 65 64 75 72 65 2e 0a 20 20 2a 2f 0a 20 20 69  cedure..  */.  i
335f0 66 28 20 70 2d 3e 70 50 72 69 6f 72 20 29 7b 0a  f( p->pPrior ){.
33600 20 20 20 20 72 63 20 3d 20 6d 75 6c 74 69 53 65      rc = multiSe
33610 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 2c 20  lect(pParse, p, 
33620 70 44 65 73 74 29 3b 0a 23 69 66 20 53 45 4c 45  pDest);.#if SELE
33630 43 54 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a  CTTRACE_ENABLED.
33640 20 20 20 20 53 45 4c 45 43 54 54 52 41 43 45 28      SELECTTRACE(
33650 30 78 31 2c 70 50 61 72 73 65 2c 70 2c 28 22 65  0x1,pParse,p,("e
33660 6e 64 20 63 6f 6d 70 6f 75 6e 64 2d 73 65 6c 65  nd compound-sele
33670 63 74 20 70 72 6f 63 65 73 73 69 6e 67 5c 6e 22  ct processing\n"
33680 29 29 3b 0a 20 20 20 20 69 66 28 20 28 73 71 6c  ));.    if( (sql
33690 69 74 65 33 53 65 6c 65 63 74 54 72 61 63 65 20  ite3SelectTrace 
336a0 26 20 30 78 32 30 30 30 29 21 3d 30 20 26 26 20  & 0x2000)!=0 && 
336b0 45 78 70 6c 61 69 6e 51 75 65 72 79 50 6c 61 6e  ExplainQueryPlan
336c0 50 61 72 65 6e 74 28 70 50 61 72 73 65 29 3d 3d  Parent(pParse)==
336d0 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
336e0 65 33 54 72 65 65 56 69 65 77 53 65 6c 65 63 74  e3TreeViewSelect
336f0 28 30 2c 20 70 2c 20 30 29 3b 0a 20 20 20 20 7d  (0, p, 0);.    }
33700 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20  .#endif.    if( 
33710 70 2d 3e 70 4e 65 78 74 3d 3d 30 20 29 20 45 78  p->pNext==0 ) Ex
33720 70 6c 61 69 6e 51 75 65 72 79 50 6c 61 6e 50 6f  plainQueryPlanPo
33730 70 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 72  p(pParse);.    r
33740 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 23 65  eturn rc;.  }.#e
33750 6e 64 69 66 0a 0a 20 20 2f 2a 20 44 6f 20 74 68  ndif..  /* Do th
33760 65 20 57 48 45 52 45 2d 63 6c 61 75 73 65 20 63  e WHERE-clause c
33770 6f 6e 73 74 61 6e 74 20 70 72 6f 70 61 67 61 74  onstant propagat
33780 69 6f 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  ion optimization
33790 20 69 66 20 74 68 69 73 20 69 73 0a 20 20 2a 2a   if this is.  **
337a0 20 61 20 6a 6f 69 6e 2e 20 20 4e 6f 20 6e 65 65   a join.  No nee
337b0 64 20 74 6f 20 73 70 65 65 64 20 74 69 6d 65 20  d to speed time 
337c0 6f 6e 20 74 68 69 73 20 6f 70 65 72 61 74 69 6f  on this operatio
337d0 6e 20 66 6f 72 20 6e 6f 6e 2d 6a 6f 69 6e 20 71  n for non-join q
337e0 75 65 72 69 65 73 0a 20 20 2a 2a 20 61 73 20 74  ueries.  ** as t
337f0 68 65 20 65 71 75 69 76 61 6c 65 6e 74 20 6f 70  he equivalent op
33800 74 69 6d 69 7a 61 74 69 6f 6e 20 77 69 6c 6c 20  timization will 
33810 62 65 20 68 61 6e 64 6c 65 64 20 62 79 20 71 75  be handled by qu
33820 65 72 79 20 70 6c 61 6e 6e 65 72 20 69 6e 0a 20  ery planner in. 
33830 20 2a 2a 20 73 71 6c 69 74 65 33 57 68 65 72 65   ** sqlite3Where
33840 42 65 67 69 6e 28 29 2e 0a 20 20 2a 2f 0a 20 20  Begin()..  */.  
33850 69 66 28 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53  if( pTabList->nS
33860 72 63 3e 31 0a 20 20 20 26 26 20 4f 70 74 69 6d  rc>1.   && Optim
33870 69 7a 61 74 69 6f 6e 45 6e 61 62 6c 65 64 28 64  izationEnabled(d
33880 62 2c 20 53 51 4c 49 54 45 5f 50 72 6f 70 61 67  b, SQLITE_Propag
33890 61 74 65 43 6f 6e 73 74 29 0a 20 20 20 26 26 20  ateConst).   && 
338a0 70 72 6f 70 61 67 61 74 65 43 6f 6e 73 74 61 6e  propagateConstan
338b0 74 73 28 70 50 61 72 73 65 2c 20 70 29 0a 20 20  ts(pParse, p).  
338c0 29 7b 0a 23 69 66 20 53 45 4c 45 43 54 54 52 41  ){.#if SELECTTRA
338d0 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20 20 20 69  CE_ENABLED.    i
338e0 66 28 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  f( sqlite3Select
338f0 54 72 61 63 65 20 26 20 30 78 31 30 30 20 29 7b  Trace & 0x100 ){
33900 0a 20 20 20 20 20 20 53 45 4c 45 43 54 54 52 41  .      SELECTTRA
33910 43 45 28 30 78 31 30 30 2c 70 50 61 72 73 65 2c  CE(0x100,pParse,
33920 70 2c 28 22 41 66 74 65 72 20 63 6f 6e 73 74 61  p,("After consta
33930 6e 74 20 70 72 6f 70 61 67 61 74 69 6f 6e 3a 5c  nt propagation:\
33940 6e 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  n"));.      sqli
33950 74 65 33 54 72 65 65 56 69 65 77 53 65 6c 65 63  te3TreeViewSelec
33960 74 28 30 2c 20 70 2c 20 30 29 3b 0a 20 20 20 20  t(0, p, 0);.    
33970 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 65 6c 73 65  }.#endif.  }else
33980 7b 0a 20 20 20 20 53 45 4c 45 43 54 54 52 41 43  {.    SELECTTRAC
33990 45 28 30 78 31 30 30 2c 70 50 61 72 73 65 2c 70  E(0x100,pParse,p
339a0 2c 28 22 43 6f 6e 73 74 61 6e 74 20 70 72 6f 70  ,("Constant prop
339b0 61 67 61 74 69 6f 6e 20 6e 6f 74 20 68 65 6c 70  agation not help
339c0 66 75 6c 5c 6e 22 29 29 3b 0a 20 20 7d 0a 0a 23  ful\n"));.  }..#
339d0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 43 4f 55  ifdef SQLITE_COU
339e0 4e 54 4f 46 56 49 45 57 5f 4f 50 54 49 4d 49 5a  NTOFVIEW_OPTIMIZ
339f0 41 54 49 4f 4e 0a 20 20 69 66 28 20 4f 70 74 69  ATION.  if( Opti
33a00 6d 69 7a 61 74 69 6f 6e 45 6e 61 62 6c 65 64 28  mizationEnabled(
33a10 64 62 2c 20 53 51 4c 49 54 45 5f 51 75 65 72 79  db, SQLITE_Query
33a20 46 6c 61 74 74 65 6e 65 72 7c 53 51 4c 49 54 45  Flattener|SQLITE
33a30 5f 43 6f 75 6e 74 4f 66 56 69 65 77 29 0a 20 20  _CountOfView).  
33a40 20 26 26 20 63 6f 75 6e 74 4f 66 56 69 65 77 4f   && countOfViewO
33a50 70 74 69 6d 69 7a 61 74 69 6f 6e 28 70 50 61 72  ptimization(pPar
33a60 73 65 2c 20 70 29 0a 20 20 29 7b 0a 20 20 20 20  se, p).  ){.    
33a70 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
33a80 69 6c 65 64 20 29 20 67 6f 74 6f 20 73 65 6c 65  iled ) goto sele
33a90 63 74 5f 65 6e 64 3b 0a 20 20 20 20 70 45 4c 69  ct_end;.    pELi
33aa0 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a  st = p->pEList;.
33ab0 20 20 20 20 70 54 61 62 4c 69 73 74 20 3d 20 70      pTabList = p
33ac0 2d 3e 70 53 72 63 3b 0a 20 20 7d 0a 23 65 6e 64  ->pSrc;.  }.#end
33ad0 69 66 0a 0a 20 20 2f 2a 20 46 6f 72 20 65 61 63  if..  /* For eac
33ae0 68 20 74 65 72 6d 20 69 6e 20 74 68 65 20 46 52  h term in the FR
33af0 4f 4d 20 63 6c 61 75 73 65 2c 20 64 6f 20 74 77  OM clause, do tw
33b00 6f 20 74 68 69 6e 67 73 3a 0a 20 20 2a 2a 20 28  o things:.  ** (
33b10 31 29 20 41 75 74 68 6f 72 69 7a 65 64 20 75 6e  1) Authorized un
33b20 72 65 66 65 72 65 6e 63 65 64 20 74 61 62 6c 65  referenced table
33b30 73 0a 20 20 2a 2a 20 28 32 29 20 47 65 6e 65 72  s.  ** (2) Gener
33b40 61 74 65 20 63 6f 64 65 20 66 6f 72 20 61 6c 6c  ate code for all
33b50 20 73 75 62 2d 71 75 65 72 69 65 73 0a 20 20 2a   sub-queries.  *
33b60 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  /.  for(i=0; i<p
33b70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69  TabList->nSrc; i
33b80 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20  ++){.    struct 
33b90 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  SrcList_item *pI
33ba0 74 65 6d 20 3d 20 26 70 54 61 62 4c 69 73 74 2d  tem = &pTabList-
33bb0 3e 61 5b 69 5d 3b 0a 20 20 20 20 53 65 6c 65 63  >a[i];.    Selec
33bc0 74 44 65 73 74 20 64 65 73 74 3b 0a 20 20 20 20  tDest dest;.    
33bd0 53 65 6c 65 63 74 20 2a 70 53 75 62 3b 0a 23 69  Select *pSub;.#i
33be0 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
33bf0 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29  E_OMIT_SUBQUERY)
33c00 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c   || !defined(SQL
33c10 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 0a 20  ITE_OMIT_VIEW). 
33c20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
33c30 53 61 76 65 64 41 75 74 68 43 6f 6e 74 65 78 74  SavedAuthContext
33c40 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a  ;.#endif..    /*
33c50 20 49 73 73 75 65 20 53 51 4c 49 54 45 5f 52 45   Issue SQLITE_RE
33c60 41 44 20 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e  AD authorization
33c70 73 20 77 69 74 68 20 61 20 66 61 6b 65 20 63 6f  s with a fake co
33c80 6c 75 6d 6e 20 6e 61 6d 65 20 66 6f 72 20 61 6e  lumn name for an
33c90 79 0a 20 20 20 20 2a 2a 20 74 61 62 6c 65 73 20  y.    ** tables 
33ca0 74 68 61 74 20 61 72 65 20 72 65 66 65 72 65 6e  that are referen
33cb0 63 65 64 20 62 75 74 20 66 72 6f 6d 20 77 68 69  ced but from whi
33cc0 63 68 20 6e 6f 20 76 61 6c 75 65 73 20 61 72 65  ch no values are
33cd0 20 65 78 74 72 61 63 74 65 64 2e 0a 20 20 20 20   extracted..    
33ce0 2a 2a 20 45 78 61 6d 70 6c 65 73 20 6f 66 20 77  ** Examples of w
33cf0 68 65 72 65 20 74 68 65 73 65 20 6b 69 6e 64 73  here these kinds
33d00 20 6f 66 20 6e 75 6c 6c 20 53 51 4c 49 54 45 5f   of null SQLITE_
33d10 52 45 41 44 20 61 75 74 68 6f 72 69 7a 61 74 69  READ authorizati
33d20 6f 6e 73 0a 20 20 20 20 2a 2a 20 77 6f 75 6c 64  ons.    ** would
33d30 20 6f 63 63 75 72 3a 0a 20 20 20 20 2a 2a 0a 20   occur:.    **. 
33d40 20 20 20 2a 2a 20 20 20 20 20 53 45 4c 45 43 54     **     SELECT
33d50 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 74   count(*) FROM t
33d60 31 3b 20 20 20 2d 2d 20 53 51 4c 49 54 45 5f 52  1;   -- SQLITE_R
33d70 45 41 44 20 74 31 2e 22 22 0a 20 20 20 20 2a 2a  EAD t1."".    **
33d80 20 20 20 20 20 53 45 4c 45 43 54 20 74 31 2e 2a       SELECT t1.*
33d90 20 46 52 4f 4d 20 74 31 2c 20 74 32 3b 20 20 20   FROM t1, t2;   
33da0 2d 2d 20 53 51 4c 49 54 45 5f 52 45 41 44 20 74  -- SQLITE_READ t
33db0 32 2e 22 22 0a 20 20 20 20 2a 2a 0a 20 20 20 20  2."".    **.    
33dc0 2a 2a 20 54 68 65 20 66 61 6b 65 20 63 6f 6c 75  ** The fake colu
33dd0 6d 6e 20 6e 61 6d 65 20 69 73 20 61 6e 20 65 6d  mn name is an em
33de0 70 74 79 20 73 74 72 69 6e 67 2e 20 20 49 74 20  pty string.  It 
33df0 69 73 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 20  is possible for 
33e00 61 20 74 61 62 6c 65 20 74 6f 0a 20 20 20 20 2a  a table to.    *
33e10 2a 20 68 61 76 65 20 61 20 63 6f 6c 75 6d 6e 20  * have a column 
33e20 6e 61 6d 65 64 20 62 79 20 74 68 65 20 65 6d 70  named by the emp
33e30 74 79 20 73 74 72 69 6e 67 2c 20 69 6e 20 77 68  ty string, in wh
33e40 69 63 68 20 63 61 73 65 20 74 68 65 72 65 20 69  ich case there i
33e50 73 20 6e 6f 20 77 61 79 20 74 6f 0a 20 20 20 20  s no way to.    
33e60 2a 2a 20 64 69 73 74 69 6e 67 75 69 73 68 20 62  ** distinguish b
33e70 65 74 77 65 65 6e 20 61 6e 20 75 6e 72 65 66 65  etween an unrefe
33e80 72 65 6e 63 65 64 20 74 61 62 6c 65 20 61 6e 64  renced table and
33e90 20 61 6e 20 61 63 74 75 61 6c 20 72 65 66 65 72   an actual refer
33ea0 65 6e 63 65 20 74 6f 20 74 68 65 0a 20 20 20 20  ence to the.    
33eb0 2a 2a 20 22 22 20 63 6f 6c 75 6d 6e 2e 20 54 68  ** "" column. Th
33ec0 65 20 6f 72 69 67 69 6e 61 6c 20 64 65 73 69 67  e original desig
33ed0 6e 20 77 61 73 20 66 6f 72 20 74 68 65 20 66 61  n was for the fa
33ee0 6b 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 74  ke column name t
33ef0 6f 20 62 65 20 61 20 4e 55 4c 4c 2c 0a 20 20 20  o be a NULL,.   
33f00 20 2a 2a 20 77 68 69 63 68 20 77 6f 75 6c 64 20   ** which would 
33f10 62 65 20 75 6e 61 6d 62 69 67 75 6f 75 73 2e 20  be unambiguous. 
33f20 20 42 75 74 20 6c 65 67 61 63 79 20 61 75 74 68   But legacy auth
33f30 6f 72 69 7a 61 74 69 6f 6e 20 63 61 6c 6c 62 61  orization callba
33f40 63 6b 73 20 6d 69 67 68 74 0a 20 20 20 20 2a 2a  cks might.    **
33f50 20 61 73 73 75 6d 65 20 74 68 65 20 63 6f 6c 75   assume the colu
33f60 6d 6e 20 6e 61 6d 65 20 69 73 20 6e 6f 6e 2d 4e  mn name is non-N
33f70 55 4c 4c 20 61 6e 64 20 73 65 67 66 61 75 6c 74  ULL and segfault
33f80 2e 20 20 54 68 65 20 75 73 65 20 6f 66 20 61 6e  .  The use of an
33f90 20 65 6d 70 74 79 0a 20 20 20 20 2a 2a 20 73 74   empty.    ** st
33fa0 72 69 6e 67 20 66 6f 72 20 74 68 65 20 66 61 6b  ring for the fak
33fb0 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 73 65  e column name se
33fc0 65 6d 73 20 73 61 66 65 72 2e 0a 20 20 20 20 2a  ems safer..    *
33fd0 2f 0a 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d  /.    if( pItem-
33fe0 3e 63 6f 6c 55 73 65 64 3d 3d 30 20 26 26 20 70  >colUsed==0 && p
33ff0 49 74 65 6d 2d 3e 7a 4e 61 6d 65 21 3d 30 20 29  Item->zName!=0 )
34000 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 41  {.      sqlite3A
34010 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c  uthCheck(pParse,
34020 20 53 51 4c 49 54 45 5f 52 45 41 44 2c 20 70 49   SQLITE_READ, pI
34030 74 65 6d 2d 3e 7a 4e 61 6d 65 2c 20 22 22 2c 20  tem->zName, "", 
34040 70 49 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65  pItem->zDatabase
34050 29 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 20 21 64  );.    }..#if !d
34060 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
34070 49 54 5f 53 55 42 51 55 45 52 59 29 20 7c 7c 20  IT_SUBQUERY) || 
34080 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
34090 4f 4d 49 54 5f 56 49 45 57 29 0a 20 20 20 20 2f  OMIT_VIEW).    /
340a0 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
340b0 66 6f 72 20 61 6c 6c 20 73 75 62 2d 71 75 65 72  for all sub-quer
340c0 69 65 73 20 69 6e 20 74 68 65 20 46 52 4f 4d 20  ies in the FROM 
340d0 63 6c 61 75 73 65 0a 20 20 20 20 2a 2f 0a 20 20  clause.    */.  
340e0 20 20 70 53 75 62 20 3d 20 70 49 74 65 6d 2d 3e    pSub = pItem->
340f0 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 69 66 28  pSelect;.    if(
34100 20 70 53 75 62 3d 3d 30 20 29 20 63 6f 6e 74 69   pSub==0 ) conti
34110 6e 75 65 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65  nue;..    /* The
34120 20 63 6f 64 65 20 66 6f 72 20 61 20 73 75 62 71   code for a subq
34130 75 65 72 79 20 73 68 6f 75 6c 64 20 6f 6e 6c 79  uery should only
34140 20 62 65 20 67 65 6e 65 72 61 74 65 64 20 6f 6e   be generated on
34150 63 65 2c 20 74 68 6f 75 67 68 20 69 74 20 69 73  ce, though it is
34160 0a 20 20 20 20 2a 2a 20 74 65 63 68 6e 69 63 61  .    ** technica
34170 6c 6c 79 20 68 61 72 6d 6c 65 73 73 20 66 6f 72  lly harmless for
34180 20 69 74 20 74 6f 20 62 65 20 67 65 6e 65 72 61   it to be genera
34190 74 65 64 20 6d 75 6c 74 69 70 6c 65 20 74 69 6d  ted multiple tim
341a0 65 73 2e 20 54 68 65 0a 20 20 20 20 2a 2a 20 66  es. The.    ** f
341b0 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 28  ollowing assert(
341c0 29 20 77 69 6c 6c 20 64 65 74 65 63 74 20 69 66  ) will detect if
341d0 20 73 6f 6d 65 74 68 69 6e 67 20 63 68 61 6e 67   something chang
341e0 65 73 20 74 6f 20 63 61 75 73 65 0a 20 20 20 20  es to cause.    
341f0 2a 2a 20 74 68 65 20 73 61 6d 65 20 73 75 62 71  ** the same subq
34200 75 65 72 79 20 74 6f 20 62 65 20 63 6f 64 65 64  uery to be coded
34210 20 6d 75 6c 74 69 70 6c 65 20 74 69 6d 65 73 2c   multiple times,
34220 20 61 73 20 61 20 73 69 67 6e 61 6c 20 74 6f 20   as a signal to 
34230 74 68 65 0a 20 20 20 20 2a 2a 20 64 65 76 65 6c  the.    ** devel
34240 6f 70 65 72 73 20 74 6f 20 74 72 79 20 74 6f 20  opers to try to 
34250 6f 70 74 69 6d 69 7a 65 20 74 68 65 20 73 69 74  optimize the sit
34260 75 61 74 69 6f 6e 2e 0a 20 20 20 20 2a 2a 0a 20  uation..    **. 
34270 20 20 20 2a 2a 20 55 70 64 61 74 65 20 32 30 31     ** Update 201
34280 39 2d 30 37 2d 32 34 3a 0a 20 20 20 20 2a 2a 20  9-07-24:.    ** 
34290 53 65 65 20 74 69 63 6b 65 74 20 68 74 74 70 73  See ticket https
342a0 3a 2f 2f 73 71 6c 69 74 65 2e 6f 72 67 2f 73 72  ://sqlite.org/sr
342b0 63 2f 74 6b 74 76 69 65 77 2f 63 35 32 62 30 39  c/tktview/c52b09
342c0 63 37 66 33 38 39 30 33 62 31 33 31 31 63 65 63  c7f38903b1311cec
342d0 34 30 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20 64  40..    ** The d
342e0 62 73 71 6c 66 75 7a 7a 20 66 75 7a 7a 65 72 20  bsqlfuzz fuzzer 
342f0 66 6f 75 6e 64 20 61 20 63 61 73 65 20 77 68 65  found a case whe
34300 72 65 20 74 68 65 20 73 61 6d 65 20 73 75 62 71  re the same subq
34310 75 65 72 79 20 67 65 74 73 0a 20 20 20 20 2a 2a  uery gets.    **
34320 20 63 6f 64 65 64 20 74 77 69 63 65 2e 20 20 53   coded twice.  S
34330 6f 20 74 68 69 73 20 61 73 73 65 72 74 28 29 20  o this assert() 
34340 6e 6f 77 20 62 65 63 6f 6d 65 73 20 61 20 74 65  now becomes a te
34350 73 74 63 61 73 65 28 29 2e 20 20 49 74 20 73 68  stcase().  It sh
34360 6f 75 6c 64 0a 20 20 20 20 2a 2a 20 62 65 20 76  ould.    ** be v
34370 65 72 79 20 72 61 72 65 2c 20 74 68 6f 75 67 68  ery rare, though
34380 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 74 65 73  ..    */.    tes
34390 74 63 61 73 65 28 20 70 49 74 65 6d 2d 3e 61 64  tcase( pItem->ad
343a0 64 72 46 69 6c 6c 53 75 62 21 3d 30 20 29 3b 0a  drFillSub!=0 );.
343b0 0a 20 20 20 20 2f 2a 20 49 6e 63 72 65 6d 65 6e  .    /* Incremen
343c0 74 20 50 61 72 73 65 2e 6e 48 65 69 67 68 74 20  t Parse.nHeight 
343d0 62 79 20 74 68 65 20 68 65 69 67 68 74 20 6f 66  by the height of
343e0 20 74 68 65 20 6c 61 72 67 65 73 74 20 65 78 70   the largest exp
343f0 72 65 73 73 69 6f 6e 0a 20 20 20 20 2a 2a 20 74  ression.    ** t
34400 72 65 65 20 72 65 66 65 72 72 65 64 20 74 6f 20  ree referred to 
34410 62 79 20 74 68 69 73 2c 20 74 68 65 20 70 61 72  by this, the par
34420 65 6e 74 20 73 65 6c 65 63 74 2e 20 54 68 65 20  ent select. The 
34430 63 68 69 6c 64 20 73 65 6c 65 63 74 0a 20 20 20  child select.   
34440 20 2a 2a 20 6d 61 79 20 63 6f 6e 74 61 69 6e 20   ** may contain 
34450 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 73  expression trees
34460 20 6f 66 20 61 74 20 6d 6f 73 74 0a 20 20 20 20   of at most.    
34470 2a 2a 20 28 53 51 4c 49 54 45 5f 4d 41 58 5f 45  ** (SQLITE_MAX_E
34480 58 50 52 5f 44 45 50 54 48 2d 50 61 72 73 65 2e  XPR_DEPTH-Parse.
34490 6e 48 65 69 67 68 74 29 20 68 65 69 67 68 74 2e  nHeight) height.
344a0 20 54 68 69 73 20 69 73 20 61 20 62 69 74 0a 20   This is a bit. 
344b0 20 20 20 2a 2a 20 6d 6f 72 65 20 63 6f 6e 73 65     ** more conse
344c0 72 76 61 74 69 76 65 20 74 68 61 6e 20 6e 65 63  rvative than nec
344d0 65 73 73 61 72 79 2c 20 62 75 74 20 6d 75 63 68  essary, but much
344e0 20 65 61 73 69 65 72 20 74 68 61 6e 20 65 6e 66   easier than enf
344f0 6f 72 63 69 6e 67 0a 20 20 20 20 2a 2a 20 61 6e  orcing.    ** an
34500 20 65 78 61 63 74 20 6c 69 6d 69 74 2e 0a 20 20   exact limit..  
34510 20 20 2a 2f 0a 20 20 20 20 70 50 61 72 73 65 2d    */.    pParse-
34520 3e 6e 48 65 69 67 68 74 20 2b 3d 20 73 71 6c 69  >nHeight += sqli
34530 74 65 33 53 65 6c 65 63 74 45 78 70 72 48 65 69  te3SelectExprHei
34540 67 68 74 28 70 29 3b 0a 0a 20 20 20 20 2f 2a 20  ght(p);..    /* 
34550 4d 61 6b 65 20 63 6f 70 69 65 73 20 6f 66 20 63  Make copies of c
34560 6f 6e 73 74 61 6e 74 20 57 48 45 52 45 2d 63 6c  onstant WHERE-cl
34570 61 75 73 65 20 74 65 72 6d 73 20 69 6e 20 74 68  ause terms in th
34580 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 64 6f  e outer query do
34590 77 6e 0a 20 20 20 20 2a 2a 20 69 6e 73 69 64 65  wn.    ** inside
345a0 20 74 68 65 20 73 75 62 71 75 65 72 79 2e 20 20   the subquery.  
345b0 54 68 69 73 20 63 61 6e 20 68 65 6c 70 20 74 68  This can help th
345c0 65 20 73 75 62 71 75 65 72 79 20 74 6f 20 72 75  e subquery to ru
345d0 6e 20 6d 6f 72 65 20 65 66 66 69 63 69 65 6e 74  n more efficient
345e0 6c 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ly..    */.    i
345f0 66 28 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 45  f( OptimizationE
34600 6e 61 62 6c 65 64 28 64 62 2c 20 53 51 4c 49 54  nabled(db, SQLIT
34610 45 5f 50 75 73 68 44 6f 77 6e 29 0a 20 20 20 20  E_PushDown).    
34620 20 26 26 20 70 75 73 68 44 6f 77 6e 57 68 65 72   && pushDownWher
34630 65 54 65 72 6d 73 28 70 50 61 72 73 65 2c 20 70  eTerms(pParse, p
34640 53 75 62 2c 20 70 2d 3e 70 57 68 65 72 65 2c 20  Sub, p->pWhere, 
34650 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 2c 0a  pItem->iCursor,.
34660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34670 20 20 20 20 20 20 20 20 20 20 20 28 70 49 74 65             (pIte
34680 6d 2d 3e 66 67 2e 6a 6f 69 6e 74 79 70 65 20 26  m->fg.jointype &
34690 20 4a 54 5f 4f 55 54 45 52 29 21 3d 30 29 0a 20   JT_OUTER)!=0). 
346a0 20 20 20 29 7b 0a 23 69 66 20 53 45 4c 45 43 54     ){.#if SELECT
346b0 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20  TRACE_ENABLED.  
346c0 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53      if( sqlite3S
346d0 65 6c 65 63 74 54 72 61 63 65 20 26 20 30 78 31  electTrace & 0x1
346e0 30 30 20 29 7b 0a 20 20 20 20 20 20 20 20 53 45  00 ){.        SE
346f0 4c 45 43 54 54 52 41 43 45 28 30 78 31 30 30 2c  LECTTRACE(0x100,
34700 70 50 61 72 73 65 2c 70 2c 0a 20 20 20 20 20 20  pParse,p,.      
34710 20 20 20 20 20 20 28 22 41 66 74 65 72 20 57 48        ("After WH
34720 45 52 45 2d 63 6c 61 75 73 65 20 70 75 73 68 2d  ERE-clause push-
34730 64 6f 77 6e 20 69 6e 74 6f 20 73 75 62 71 75 65  down into subque
34740 72 79 20 25 64 3a 5c 6e 22 2c 20 70 53 75 62 2d  ry %d:\n", pSub-
34750 3e 73 65 6c 49 64 29 29 3b 0a 20 20 20 20 20 20  >selId));.      
34760 20 20 73 71 6c 69 74 65 33 54 72 65 65 56 69 65    sqlite3TreeVie
34770 77 53 65 6c 65 63 74 28 30 2c 20 70 2c 20 30 29  wSelect(0, p, 0)
34780 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66  ;.      }.#endif
34790 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
347a0 20 20 53 45 4c 45 43 54 54 52 41 43 45 28 30 78    SELECTTRACE(0x
347b0 31 30 30 2c 70 50 61 72 73 65 2c 70 2c 28 22 50  100,pParse,p,("P
347c0 75 73 68 2d 64 6f 77 6e 20 6e 6f 74 20 70 6f 73  ush-down not pos
347d0 73 69 62 6c 65 5c 6e 22 29 29 3b 0a 20 20 20 20  sible\n"));.    
347e0 7d 0a 0a 20 20 20 20 7a 53 61 76 65 64 41 75 74  }..    zSavedAut
347f0 68 43 6f 6e 74 65 78 74 20 3d 20 70 50 61 72 73  hContext = pPars
34800 65 2d 3e 7a 41 75 74 68 43 6f 6e 74 65 78 74 3b  e->zAuthContext;
34810 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 7a 41 75  .    pParse->zAu
34820 74 68 43 6f 6e 74 65 78 74 20 3d 20 70 49 74 65  thContext = pIte
34830 6d 2d 3e 7a 4e 61 6d 65 3b 0a 0a 20 20 20 20 2f  m->zName;..    /
34840 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
34850 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65  to implement the
34860 20 73 75 62 71 75 65 72 79 0a 20 20 20 20 2a 2a   subquery.    **
34870 0a 20 20 20 20 2a 2a 20 54 68 65 20 73 75 62 71  .    ** The subq
34880 75 65 72 79 20 69 73 20 69 6d 70 6c 65 6d 65 6e  uery is implemen
34890 74 65 64 20 61 73 20 61 20 63 6f 2d 72 6f 75 74  ted as a co-rout
348a0 69 6e 65 20 69 66 20 74 68 65 20 73 75 62 71 75  ine if the subqu
348b0 65 72 79 20 69 73 0a 20 20 20 20 2a 2a 20 67 75  ery is.    ** gu
348c0 61 72 61 6e 74 65 65 64 20 74 6f 20 62 65 20 74  aranteed to be t
348d0 68 65 20 6f 75 74 65 72 20 6c 6f 6f 70 20 28 73  he outer loop (s
348e0 6f 20 74 68 61 74 20 69 74 20 64 6f 65 73 20 6e  o that it does n
348f0 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 0a 20 20  ot need to be.  
34900 20 20 2a 2a 20 63 6f 6d 70 75 74 65 64 20 6d 6f    ** computed mo
34910 72 65 20 74 68 61 6e 20 6f 6e 63 65 29 0a 20 20  re than once).  
34920 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 4f 44 4f    **.    ** TODO
34930 3a 20 41 72 65 20 74 68 65 72 65 20 6f 74 68 65  : Are there othe
34940 72 20 72 65 61 73 6f 6e 73 20 62 65 73 69 64 65  r reasons beside
34950 20 28 31 29 20 74 6f 20 75 73 65 20 61 20 63 6f   (1) to use a co
34960 2d 72 6f 75 74 69 6e 65 0a 20 20 20 20 2a 2a 20  -routine.    ** 
34970 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 3f 0a  implementation?.
34980 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 69      */.    if( i
34990 3d 3d 30 0a 20 20 20 20 20 26 26 20 28 70 54 61  ==0.     && (pTa
349a0 62 4c 69 73 74 2d 3e 6e 53 72 63 3d 3d 31 0a 20  bList->nSrc==1. 
349b0 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 28 70             || (p
349c0 54 61 62 4c 69 73 74 2d 3e 61 5b 31 5d 2e 66 67  TabList->a[1].fg
349d0 2e 6a 6f 69 6e 74 79 70 65 26 28 4a 54 5f 4c 45  .jointype&(JT_LE
349e0 46 54 7c 4a 54 5f 43 52 4f 53 53 29 29 21 3d 30  FT|JT_CROSS))!=0
349f0 29 20 20 2f 2a 20 28 31 29 20 2a 2f 0a 20 20 20  )  /* (1) */.   
34a00 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 6d 70   ){.      /* Imp
34a10 6c 65 6d 65 6e 74 20 61 20 63 6f 2d 72 6f 75 74  lement a co-rout
34a20 69 6e 65 20 74 68 61 74 20 77 69 6c 6c 20 72 65  ine that will re
34a30 74 75 72 6e 20 61 20 73 69 6e 67 6c 65 20 72 6f  turn a single ro
34a40 77 20 6f 66 20 74 68 65 20 72 65 73 75 6c 74 0a  w of the result.
34a50 20 20 20 20 20 20 2a 2a 20 73 65 74 20 6f 6e 20        ** set on 
34a60 65 61 63 68 20 69 6e 76 6f 63 61 74 69 6f 6e 2e  each invocation.
34a70 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
34a80 69 6e 74 20 61 64 64 72 54 6f 70 20 3d 20 73 71  int addrTop = sq
34a90 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
34aa0 41 64 64 72 28 76 29 2b 31 3b 0a 20 20 20 20 20  Addr(v)+1;.     
34ab0 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 72 65  .      pItem->re
34ac0 67 52 65 74 75 72 6e 20 3d 20 2b 2b 70 50 61 72  gReturn = ++pPar
34ad0 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20  se->nMem;.      
34ae0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
34af0 33 28 76 2c 20 4f 50 5f 49 6e 69 74 43 6f 72 6f  3(v, OP_InitCoro
34b00 75 74 69 6e 65 2c 20 70 49 74 65 6d 2d 3e 72 65  utine, pItem->re
34b10 67 52 65 74 75 72 6e 2c 20 30 2c 20 61 64 64 72  gReturn, 0, addr
34b20 54 6f 70 29 3b 0a 20 20 20 20 20 20 56 64 62 65  Top);.      Vdbe
34b30 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 25 73 22  Comment((v, "%s"
34b40 2c 20 70 49 74 65 6d 2d 3e 70 54 61 62 2d 3e 7a  , pItem->pTab->z
34b50 4e 61 6d 65 29 29 3b 0a 20 20 20 20 20 20 70 49  Name));.      pI
34b60 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75 62  tem->addrFillSub
34b70 20 3d 20 61 64 64 72 54 6f 70 3b 0a 20 20 20 20   = addrTop;.    
34b80 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44    sqlite3SelectD
34b90 65 73 74 49 6e 69 74 28 26 64 65 73 74 2c 20 53  estInit(&dest, S
34ba0 52 54 5f 43 6f 72 6f 75 74 69 6e 65 2c 20 70 49  RT_Coroutine, pI
34bb0 74 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e 29 3b  tem->regReturn);
34bc0 0a 20 20 20 20 20 20 45 78 70 6c 61 69 6e 51 75  .      ExplainQu
34bd0 65 72 79 50 6c 61 6e 28 28 70 50 61 72 73 65 2c  eryPlan((pParse,
34be0 20 31 2c 20 22 43 4f 2d 52 4f 55 54 49 4e 45 20   1, "CO-ROUTINE 
34bf0 25 75 22 2c 20 70 53 75 62 2d 3e 73 65 6c 49 64  %u", pSub->selId
34c00 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ));.      sqlite
34c10 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20  3Select(pParse, 
34c20 70 53 75 62 2c 20 26 64 65 73 74 29 3b 0a 20 20  pSub, &dest);.  
34c30 20 20 20 20 70 49 74 65 6d 2d 3e 70 54 61 62 2d      pItem->pTab-
34c40 3e 6e 52 6f 77 4c 6f 67 45 73 74 20 3d 20 70 53  >nRowLogEst = pS
34c50 75 62 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 3b 0a  ub->nSelectRow;.
34c60 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 66 67 2e        pItem->fg.
34c70 76 69 61 43 6f 72 6f 75 74 69 6e 65 20 3d 20 31  viaCoroutine = 1
34c80 3b 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 72  ;.      pItem->r
34c90 65 67 52 65 73 75 6c 74 20 3d 20 64 65 73 74 2e  egResult = dest.
34ca0 69 53 64 73 74 3b 0a 20 20 20 20 20 20 73 71 6c  iSdst;.      sql
34cb0 69 74 65 33 56 64 62 65 45 6e 64 43 6f 72 6f 75  ite3VdbeEndCorou
34cc0 74 69 6e 65 28 76 2c 20 70 49 74 65 6d 2d 3e 72  tine(v, pItem->r
34cd0 65 67 52 65 74 75 72 6e 29 3b 0a 20 20 20 20 20  egReturn);.     
34ce0 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
34cf0 48 65 72 65 28 76 2c 20 61 64 64 72 54 6f 70 2d  Here(v, addrTop-
34d00 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  1);.      sqlite
34d10 33 43 6c 65 61 72 54 65 6d 70 52 65 67 43 61 63  3ClearTempRegCac
34d20 68 65 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  he(pParse);.    
34d30 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20  }else{.      /* 
34d40 47 65 6e 65 72 61 74 65 20 61 20 73 75 62 72 6f  Generate a subro
34d50 75 74 69 6e 65 20 74 68 61 74 20 77 69 6c 6c 20  utine that will 
34d60 66 69 6c 6c 20 61 6e 20 65 70 68 65 6d 65 72 61  fill an ephemera
34d70 6c 20 74 61 62 6c 65 20 77 69 74 68 0a 20 20 20  l table with.   
34d80 20 20 20 2a 2a 20 74 68 65 20 63 6f 6e 74 65 6e     ** the conten
34d90 74 20 6f 66 20 74 68 69 73 20 73 75 62 71 75 65  t of this subque
34da0 72 79 2e 20 20 70 49 74 65 6d 2d 3e 61 64 64 72  ry.  pItem->addr
34db0 46 69 6c 6c 53 75 62 20 77 69 6c 6c 20 70 6f 69  FillSub will poi
34dc0 6e 74 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 74  nt.      ** to t
34dd0 68 65 20 61 64 64 72 65 73 73 20 6f 66 20 74 68  he address of th
34de0 65 20 67 65 6e 65 72 61 74 65 64 20 73 75 62 72  e generated subr
34df0 6f 75 74 69 6e 65 2e 20 20 70 49 74 65 6d 2d 3e  outine.  pItem->
34e00 72 65 67 52 65 74 75 72 6e 0a 20 20 20 20 20 20  regReturn.      
34e10 2a 2a 20 69 73 20 61 20 72 65 67 69 73 74 65 72  ** is a register
34e20 20 61 6c 6c 6f 63 61 74 65 64 20 74 6f 20 68 6f   allocated to ho
34e30 6c 64 20 74 68 65 20 73 75 62 72 6f 75 74 69 6e  ld the subroutin
34e40 65 20 72 65 74 75 72 6e 20 61 64 64 72 65 73 73  e return address
34e50 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
34e60 69 6e 74 20 74 6f 70 41 64 64 72 3b 0a 20 20 20  int topAddr;.   
34e70 20 20 20 69 6e 74 20 6f 6e 63 65 41 64 64 72 20     int onceAddr 
34e80 3d 20 30 3b 0a 20 20 20 20 20 20 69 6e 74 20 72  = 0;.      int r
34e90 65 74 41 64 64 72 3b 0a 20 20 20 20 20 20 73 74  etAddr;.      st
34ea0 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
34eb0 6d 20 2a 70 50 72 69 6f 72 3b 0a 0a 20 20 20 20  m *pPrior;..    
34ec0 20 20 74 65 73 74 63 61 73 65 28 20 70 49 74 65    testcase( pIte
34ed0 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75 62 3d 3d  m->addrFillSub==
34ee0 30 20 29 3b 20 2f 2a 20 54 69 63 6b 65 74 20 63  0 ); /* Ticket c
34ef0 35 32 62 30 39 63 37 66 33 38 39 30 33 62 31 33  52b09c7f38903b13
34f00 31 31 20 2a 2f 0a 20 20 20 20 20 20 70 49 74 65  11 */.      pIte
34f10 6d 2d 3e 72 65 67 52 65 74 75 72 6e 20 3d 20 2b  m->regReturn = +
34f20 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
34f30 20 20 20 20 20 74 6f 70 41 64 64 72 20 3d 20 73       topAddr = s
34f40 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
34f50 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
34f60 30 2c 20 70 49 74 65 6d 2d 3e 72 65 67 52 65 74  0, pItem->regRet
34f70 75 72 6e 29 3b 0a 20 20 20 20 20 20 70 49 74 65  urn);.      pIte
34f80 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75 62 20 3d  m->addrFillSub =
34f90 20 74 6f 70 41 64 64 72 2b 31 3b 0a 20 20 20 20   topAddr+1;.    
34fa0 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 66 67 2e    if( pItem->fg.
34fb0 69 73 43 6f 72 72 65 6c 61 74 65 64 3d 3d 30 20  isCorrelated==0 
34fc0 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66  ){.        /* If
34fd0 20 74 68 65 20 73 75 62 71 75 65 72 79 20 69 73   the subquery is
34fe0 20 6e 6f 74 20 63 6f 72 72 65 6c 61 74 65 64 20   not correlated 
34ff0 61 6e 64 20 69 66 20 77 65 20 61 72 65 20 6e 6f  and if we are no
35000 74 20 69 6e 73 69 64 65 20 6f 66 0a 20 20 20 20  t inside of.    
35010 20 20 20 20 2a 2a 20 61 20 74 72 69 67 67 65 72      ** a trigger
35020 2c 20 74 68 65 6e 20 77 65 20 6f 6e 6c 79 20 6e  , then we only n
35030 65 65 64 20 74 6f 20 63 6f 6d 70 75 74 65 20 74  eed to compute t
35040 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  he value of the 
35050 73 75 62 71 75 65 72 79 0a 20 20 20 20 20 20 20  subquery.       
35060 20 2a 2a 20 6f 6e 63 65 2e 20 2a 2f 0a 20 20 20   ** once. */.   
35070 20 20 20 20 20 6f 6e 63 65 41 64 64 72 20 3d 20       onceAddr = 
35080 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
35090 30 28 76 2c 20 4f 50 5f 4f 6e 63 65 29 3b 20 56  0(v, OP_Once); V
350a0 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
350b0 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d          VdbeComm
350c0 65 6e 74 28 28 76 2c 20 22 6d 61 74 65 72 69 61  ent((v, "materia
350d0 6c 69 7a 65 20 5c 22 25 73 5c 22 22 2c 20 70 49  lize \"%s\"", pI
350e0 74 65 6d 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65  tem->pTab->zName
350f0 29 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  ));.      }else{
35100 0a 20 20 20 20 20 20 20 20 56 64 62 65 4e 6f 6f  .        VdbeNoo
35110 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 6d 61  pComment((v, "ma
35120 74 65 72 69 61 6c 69 7a 65 20 5c 22 25 73 5c 22  terialize \"%s\"
35130 22 2c 20 70 49 74 65 6d 2d 3e 70 54 61 62 2d 3e  ", pItem->pTab->
35140 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 20 20 7d  zName));.      }
35150 0a 20 20 20 20 20 20 70 50 72 69 6f 72 20 3d 20  .      pPrior = 
35160 69 73 53 65 6c 66 4a 6f 69 6e 56 69 65 77 28 70  isSelfJoinView(p
35170 54 61 62 4c 69 73 74 2c 20 70 49 74 65 6d 29 3b  TabList, pItem);
35180 0a 20 20 20 20 20 20 69 66 28 20 70 50 72 69 6f  .      if( pPrio
35190 72 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  r ){.        sql
351a0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
351b0 2c 20 4f 50 5f 4f 70 65 6e 44 75 70 2c 20 70 49  , OP_OpenDup, pI
351c0 74 65 6d 2d 3e 69 43 75 72 73 6f 72 2c 20 70 50  tem->iCursor, pP
351d0 72 69 6f 72 2d 3e 69 43 75 72 73 6f 72 29 3b 0a  rior->iCursor);.
351e0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
351f0 70 50 72 69 6f 72 2d 3e 70 53 65 6c 65 63 74 21  pPrior->pSelect!
35200 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 70 53  =0 );.        pS
35210 75 62 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d  ub->nSelectRow =
35220 20 70 50 72 69 6f 72 2d 3e 70 53 65 6c 65 63 74   pPrior->pSelect
35230 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 3b 0a 20 20  ->nSelectRow;.  
35240 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
35250 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74     sqlite3Select
35260 44 65 73 74 49 6e 69 74 28 26 64 65 73 74 2c 20  DestInit(&dest, 
35270 53 52 54 5f 45 70 68 65 6d 54 61 62 2c 20 70 49  SRT_EphemTab, pI
35280 74 65 6d 2d 3e 69 43 75 72 73 6f 72 29 3b 0a 20  tem->iCursor);. 
35290 20 20 20 20 20 20 20 45 78 70 6c 61 69 6e 51 75         ExplainQu
352a0 65 72 79 50 6c 61 6e 28 28 70 50 61 72 73 65 2c  eryPlan((pParse,
352b0 20 31 2c 20 22 4d 41 54 45 52 49 41 4c 49 5a 45   1, "MATERIALIZE
352c0 20 25 75 22 2c 20 70 53 75 62 2d 3e 73 65 6c 49   %u", pSub->selI
352d0 64 29 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  d));.        sql
352e0 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73  ite3Select(pPars
352f0 65 2c 20 70 53 75 62 2c 20 26 64 65 73 74 29 3b  e, pSub, &dest);
35300 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
35310 49 74 65 6d 2d 3e 70 54 61 62 2d 3e 6e 52 6f 77  Item->pTab->nRow
35320 4c 6f 67 45 73 74 20 3d 20 70 53 75 62 2d 3e 6e  LogEst = pSub->n
35330 53 65 6c 65 63 74 52 6f 77 3b 0a 20 20 20 20 20  SelectRow;.     
35340 20 69 66 28 20 6f 6e 63 65 41 64 64 72 20 29 20   if( onceAddr ) 
35350 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
35360 65 72 65 28 76 2c 20 6f 6e 63 65 41 64 64 72 29  ere(v, onceAddr)
35370 3b 0a 20 20 20 20 20 20 72 65 74 41 64 64 72 20  ;.      retAddr 
35380 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
35390 4f 70 31 28 76 2c 20 4f 50 5f 52 65 74 75 72 6e  Op1(v, OP_Return
353a0 2c 20 70 49 74 65 6d 2d 3e 72 65 67 52 65 74 75  , pItem->regRetu
353b0 72 6e 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  rn);.      VdbeC
353c0 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 65 6e 64 20  omment((v, "end 
353d0 25 73 22 2c 20 70 49 74 65 6d 2d 3e 70 54 61 62  %s", pItem->pTab
353e0 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 20  ->zName));.     
353f0 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
35400 67 65 50 31 28 76 2c 20 74 6f 70 41 64 64 72 2c  geP1(v, topAddr,
35410 20 72 65 74 41 64 64 72 29 3b 0a 20 20 20 20 20   retAddr);.     
35420 20 73 71 6c 69 74 65 33 43 6c 65 61 72 54 65 6d   sqlite3ClearTem
35430 70 52 65 67 43 61 63 68 65 28 70 50 61 72 73 65  pRegCache(pParse
35440 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
35450 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
35460 64 20 29 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f  d ) goto select_
35470 65 6e 64 3b 0a 20 20 20 20 70 50 61 72 73 65 2d  end;.    pParse-
35480 3e 6e 48 65 69 67 68 74 20 2d 3d 20 73 71 6c 69  >nHeight -= sqli
35490 74 65 33 53 65 6c 65 63 74 45 78 70 72 48 65 69  te3SelectExprHei
354a0 67 68 74 28 70 29 3b 0a 20 20 20 20 70 50 61 72  ght(p);.    pPar
354b0 73 65 2d 3e 7a 41 75 74 68 43 6f 6e 74 65 78 74  se->zAuthContext
354c0 20 3d 20 7a 53 61 76 65 64 41 75 74 68 43 6f 6e   = zSavedAuthCon
354d0 74 65 78 74 3b 0a 23 65 6e 64 69 66 0a 20 20 7d  text;.#endif.  }
354e0 0a 0a 20 20 2f 2a 20 56 61 72 69 6f 75 73 20 65  ..  /* Various e
354f0 6c 65 6d 65 6e 74 73 20 6f 66 20 74 68 65 20 53  lements of the S
35500 45 4c 45 43 54 20 63 6f 70 69 65 64 20 69 6e 74  ELECT copied int
35510 6f 20 6c 6f 63 61 6c 20 76 61 72 69 61 62 6c 65  o local variable
35520 73 20 66 6f 72 0a 20 20 2a 2a 20 63 6f 6e 76 65  s for.  ** conve
35530 6e 69 65 6e 63 65 20 2a 2f 0a 20 20 70 45 4c 69  nience */.  pELi
35540 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a  st = p->pEList;.
35550 20 20 70 57 68 65 72 65 20 3d 20 70 2d 3e 70 57    pWhere = p->pW
35560 68 65 72 65 3b 0a 20 20 70 47 72 6f 75 70 42 79  here;.  pGroupBy
35570 20 3d 20 70 2d 3e 70 47 72 6f 75 70 42 79 3b 0a   = p->pGroupBy;.
35580 20 20 70 48 61 76 69 6e 67 20 3d 20 70 2d 3e 70    pHaving = p->p
35590 48 61 76 69 6e 67 3b 0a 20 20 73 44 69 73 74 69  Having;.  sDisti
355a0 6e 63 74 2e 69 73 54 6e 63 74 20 3d 20 28 70 2d  nct.isTnct = (p-
355b0 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 44  >selFlags & SF_D
355c0 69 73 74 69 6e 63 74 29 21 3d 30 3b 0a 0a 23 69  istinct)!=0;..#i
355d0 66 20 53 45 4c 45 43 54 54 52 41 43 45 5f 45 4e  f SELECTTRACE_EN
355e0 41 42 4c 45 44 0a 20 20 69 66 28 20 73 71 6c 69  ABLED.  if( sqli
355f0 74 65 33 53 65 6c 65 63 74 54 72 61 63 65 20 26  te3SelectTrace &
35600 20 30 78 34 30 30 20 29 7b 0a 20 20 20 20 53 45   0x400 ){.    SE
35610 4c 45 43 54 54 52 41 43 45 28 30 78 34 30 30 2c  LECTTRACE(0x400,
35620 70 50 61 72 73 65 2c 70 2c 28 22 41 66 74 65 72  pParse,p,("After
35630 20 61 6c 6c 20 46 52 4f 4d 2d 63 6c 61 75 73 65   all FROM-clause
35640 20 61 6e 61 6c 79 73 69 73 3a 5c 6e 22 29 29 3b   analysis:\n"));
35650 0a 20 20 20 20 73 71 6c 69 74 65 33 54 72 65 65  .    sqlite3Tree
35660 56 69 65 77 53 65 6c 65 63 74 28 30 2c 20 70 2c  ViewSelect(0, p,
35670 20 30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a   0);.  }.#endif.
35680 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 71 75 65  .  /* If the que
35690 72 79 20 69 73 20 44 49 53 54 49 4e 43 54 20 77  ry is DISTINCT w
356a0 69 74 68 20 61 6e 20 4f 52 44 45 52 20 42 59 20  ith an ORDER BY 
356b0 62 75 74 20 69 73 20 6e 6f 74 20 61 6e 20 61 67  but is not an ag
356c0 67 72 65 67 61 74 65 2c 20 61 6e 64 20 0a 20 20  gregate, and .  
356d0 2a 2a 20 69 66 20 74 68 65 20 73 65 6c 65 63 74  ** if the select
356e0 2d 6c 69 73 74 20 69 73 20 74 68 65 20 73 61 6d  -list is the sam
356f0 65 20 61 73 20 74 68 65 20 4f 52 44 45 52 20 42  e as the ORDER B
35700 59 20 6c 69 73 74 2c 20 74 68 65 6e 20 74 68 69  Y list, then thi
35710 73 20 71 75 65 72 79 0a 20 20 2a 2a 20 63 61 6e  s query.  ** can
35720 20 62 65 20 72 65 77 72 69 74 74 65 6e 20 61 73   be rewritten as
35730 20 61 20 47 52 4f 55 50 20 42 59 2e 20 49 6e 20   a GROUP BY. In 
35740 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 74 68 69  other words, thi
35750 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20  s:.  **.  **    
35760 20 53 45 4c 45 43 54 20 44 49 53 54 49 4e 43 54   SELECT DISTINCT
35770 20 78 79 7a 20 46 52 4f 4d 20 2e 2e 2e 20 4f 52   xyz FROM ... OR
35780 44 45 52 20 42 59 20 78 79 7a 0a 20 20 2a 2a 0a  DER BY xyz.  **.
35790 20 20 2a 2a 20 69 73 20 74 72 61 6e 73 66 6f 72    ** is transfor
357a0 6d 65 64 20 74 6f 3a 0a 20 20 2a 2a 0a 20 20 2a  med to:.  **.  *
357b0 2a 20 20 20 20 20 53 45 4c 45 43 54 20 78 79 7a  *     SELECT xyz
357c0 20 46 52 4f 4d 20 2e 2e 2e 20 47 52 4f 55 50 20   FROM ... GROUP 
357d0 42 59 20 78 79 7a 20 4f 52 44 45 52 20 42 59 20  BY xyz ORDER BY 
357e0 78 79 7a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  xyz.  **.  ** Th
357f0 65 20 73 65 63 6f 6e 64 20 66 6f 72 6d 20 69 73  e second form is
35800 20 70 72 65 66 65 72 72 65 64 20 61 73 20 61 20   preferred as a 
35810 73 69 6e 67 6c 65 20 69 6e 64 65 78 20 28 6f 72  single index (or
35820 20 74 65 6d 70 2d 74 61 62 6c 65 29 20 6d 61 79   temp-table) may
35830 20 62 65 20 0a 20 20 2a 2a 20 75 73 65 64 20 66   be .  ** used f
35840 6f 72 20 62 6f 74 68 20 74 68 65 20 4f 52 44 45  or both the ORDE
35850 52 20 42 59 20 61 6e 64 20 44 49 53 54 49 4e 43  R BY and DISTINC
35860 54 20 70 72 6f 63 65 73 73 69 6e 67 2e 20 41 73  T processing. As
35870 20 6f 72 69 67 69 6e 61 6c 6c 79 20 0a 20 20 2a   originally .  *
35880 2a 20 77 72 69 74 74 65 6e 20 74 68 65 20 71 75  * written the qu
35890 65 72 79 20 6d 75 73 74 20 75 73 65 20 61 20 74  ery must use a t
358a0 65 6d 70 2d 74 61 62 6c 65 20 66 6f 72 20 61 74  emp-table for at
358b0 20 6c 65 61 73 74 20 6f 6e 65 20 6f 66 20 74 68   least one of th
358c0 65 20 4f 52 44 45 52 20 0a 20 20 2a 2a 20 42 59  e ORDER .  ** BY
358d0 20 61 6e 64 20 44 49 53 54 49 4e 43 54 2c 20 61   and DISTINCT, a
358e0 6e 64 20 61 6e 20 69 6e 64 65 78 20 6f 72 20 73  nd an index or s
358f0 65 70 61 72 61 74 65 20 74 65 6d 70 2d 74 61 62  eparate temp-tab
35900 6c 65 20 66 6f 72 20 74 68 65 20 6f 74 68 65 72  le for the other
35910 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 70 2d  ..  */.  if( (p-
35920 3e 73 65 6c 46 6c 61 67 73 20 26 20 28 53 46 5f  >selFlags & (SF_
35930 44 69 73 74 69 6e 63 74 7c 53 46 5f 41 67 67 72  Distinct|SF_Aggr
35940 65 67 61 74 65 29 29 3d 3d 53 46 5f 44 69 73 74  egate))==SF_Dist
35950 69 6e 63 74 20 0a 20 20 20 26 26 20 73 71 6c 69  inct .   && sqli
35960 74 65 33 45 78 70 72 4c 69 73 74 43 6f 6d 70 61  te3ExprListCompa
35970 72 65 28 73 53 6f 72 74 2e 70 4f 72 64 65 72 42  re(sSort.pOrderB
35980 79 2c 20 70 45 4c 69 73 74 2c 20 2d 31 29 3d 3d  y, pEList, -1)==
35990 30 0a 20 20 29 7b 0a 20 20 20 20 70 2d 3e 73 65  0.  ){.    p->se
359a0 6c 46 6c 61 67 73 20 26 3d 20 7e 53 46 5f 44 69  lFlags &= ~SF_Di
359b0 73 74 69 6e 63 74 3b 0a 20 20 20 20 70 47 72 6f  stinct;.    pGro
359c0 75 70 42 79 20 3d 20 70 2d 3e 70 47 72 6f 75 70  upBy = p->pGroup
359d0 42 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  By = sqlite3Expr
359e0 4c 69 73 74 44 75 70 28 64 62 2c 20 70 45 4c 69  ListDup(db, pELi
359f0 73 74 2c 20 30 29 3b 0a 20 20 20 20 2f 2a 20 4e  st, 0);.    /* N
35a00 6f 74 69 63 65 20 74 68 61 74 20 65 76 65 6e 20  otice that even 
35a10 74 68 6f 75 67 68 74 20 53 46 5f 44 69 73 74 69  thought SF_Disti
35a20 6e 63 74 20 68 61 73 20 62 65 65 6e 20 63 6c 65  nct has been cle
35a30 61 72 65 64 20 66 72 6f 6d 20 70 2d 3e 73 65 6c  ared from p->sel
35a40 46 6c 61 67 73 2c 0a 20 20 20 20 2a 2a 20 74 68  Flags,.    ** th
35a50 65 20 73 44 69 73 74 69 6e 63 74 2e 69 73 54 6e  e sDistinct.isTn
35a60 63 74 20 69 73 20 73 74 69 6c 6c 20 73 65 74 2e  ct is still set.
35a70 20 20 48 65 6e 63 65 2c 20 69 73 54 6e 63 74 20    Hence, isTnct 
35a80 72 65 70 72 65 73 65 6e 74 73 20 74 68 65 0a 20  represents the. 
35a90 20 20 20 2a 2a 20 6f 72 69 67 69 6e 61 6c 20 73     ** original s
35aa0 65 74 74 69 6e 67 20 6f 66 20 74 68 65 20 53 46  etting of the SF
35ab0 5f 44 69 73 74 69 6e 63 74 20 66 6c 61 67 2c 20  _Distinct flag, 
35ac0 6e 6f 74 20 74 68 65 20 63 75 72 72 65 6e 74 20  not the current 
35ad0 73 65 74 74 69 6e 67 20 2a 2f 0a 20 20 20 20 61  setting */.    a
35ae0 73 73 65 72 74 28 20 73 44 69 73 74 69 6e 63 74  ssert( sDistinct
35af0 2e 69 73 54 6e 63 74 20 29 3b 0a 0a 23 69 66 20  .isTnct );..#if 
35b00 53 45 4c 45 43 54 54 52 41 43 45 5f 45 4e 41 42  SELECTTRACE_ENAB
35b10 4c 45 44 0a 20 20 20 20 69 66 28 20 73 71 6c 69  LED.    if( sqli
35b20 74 65 33 53 65 6c 65 63 74 54 72 61 63 65 20 26  te3SelectTrace &
35b30 20 30 78 34 30 30 20 29 7b 0a 20 20 20 20 20 20   0x400 ){.      
35b40 53 45 4c 45 43 54 54 52 41 43 45 28 30 78 34 30  SELECTTRACE(0x40
35b50 30 2c 70 50 61 72 73 65 2c 70 2c 28 22 54 72 61  0,pParse,p,("Tra
35b60 6e 73 66 6f 72 6d 20 44 49 53 54 49 4e 43 54 20  nsform DISTINCT 
35b70 69 6e 74 6f 20 47 52 4f 55 50 20 42 59 3a 5c 6e  into GROUP BY:\n
35b80 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  "));.      sqlit
35b90 65 33 54 72 65 65 56 69 65 77 53 65 6c 65 63 74  e3TreeViewSelect
35ba0 28 30 2c 20 70 2c 20 30 29 3b 0a 20 20 20 20 7d  (0, p, 0);.    }
35bb0 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 20 20 2f  .#endif.  }..  /
35bc0 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 61 6e  * If there is an
35bd0 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
35be0 2c 20 74 68 65 6e 20 63 72 65 61 74 65 20 61 6e  , then create an
35bf0 20 65 70 68 65 6d 65 72 61 6c 20 69 6e 64 65 78   ephemeral index
35c00 20 74 6f 0a 20 20 2a 2a 20 64 6f 20 74 68 65 20   to.  ** do the 
35c10 73 6f 72 74 69 6e 67 2e 20 20 42 75 74 20 74 68  sorting.  But th
35c20 69 73 20 73 6f 72 74 69 6e 67 20 65 70 68 65 6d  is sorting ephem
35c30 65 72 61 6c 20 69 6e 64 65 78 20 6d 69 67 68 74  eral index might
35c40 20 65 6e 64 20 75 70 0a 20 20 2a 2a 20 62 65 69   end up.  ** bei
35c50 6e 67 20 75 6e 75 73 65 64 20 69 66 20 74 68 65  ng unused if the
35c60 20 64 61 74 61 20 63 61 6e 20 62 65 20 65 78 74   data can be ext
35c70 72 61 63 74 65 64 20 69 6e 20 70 72 65 2d 73 6f  racted in pre-so
35c80 72 74 65 64 20 6f 72 64 65 72 2e 0a 20 20 2a 2a  rted order..  **
35c90 20 49 66 20 74 68 61 74 20 69 73 20 74 68 65 20   If that is the 
35ca0 63 61 73 65 2c 20 74 68 65 6e 20 74 68 65 20 4f  case, then the O
35cb0 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 20  P_OpenEphemeral 
35cc0 69 6e 73 74 72 75 63 74 69 6f 6e 20 77 69 6c 6c  instruction will
35cd0 20 62 65 0a 20 20 2a 2a 20 63 68 61 6e 67 65 64   be.  ** changed
35ce0 20 74 6f 20 61 6e 20 4f 50 5f 4e 6f 6f 70 20 6f   to an OP_Noop o
35cf0 6e 63 65 20 77 65 20 66 69 67 75 72 65 20 6f 75  nce we figure ou
35d00 74 20 74 68 61 74 20 74 68 65 20 73 6f 72 74 69  t that the sorti
35d10 6e 67 20 69 6e 64 65 78 20 69 73 0a 20 20 2a 2a  ng index is.  **
35d20 20 6e 6f 74 20 6e 65 65 64 65 64 2e 20 20 54 68   not needed.  Th
35d30 65 20 73 53 6f 72 74 2e 61 64 64 72 53 6f 72 74  e sSort.addrSort
35d40 49 6e 64 65 78 20 76 61 72 69 61 62 6c 65 20 69  Index variable i
35d50 73 20 75 73 65 64 20 74 6f 20 66 61 63 69 6c 69  s used to facili
35d60 74 61 74 65 0a 20 20 2a 2a 20 74 68 61 74 20 63  tate.  ** that c
35d70 68 61 6e 67 65 2e 0a 20 20 2a 2f 0a 20 20 69 66  hange..  */.  if
35d80 28 20 73 53 6f 72 74 2e 70 4f 72 64 65 72 42 79  ( sSort.pOrderBy
35d90 20 29 7b 0a 20 20 20 20 4b 65 79 49 6e 66 6f 20   ){.    KeyInfo 
35da0 2a 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 20 20 70  *pKeyInfo;.    p
35db0 4b 65 79 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65  KeyInfo = sqlite
35dc0 33 4b 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72  3KeyInfoFromExpr
35dd0 4c 69 73 74 28 0a 20 20 20 20 20 20 20 20 70 50  List(.        pP
35de0 61 72 73 65 2c 20 73 53 6f 72 74 2e 70 4f 72 64  arse, sSort.pOrd
35df0 65 72 42 79 2c 20 30 2c 20 70 45 4c 69 73 74 2d  erBy, 0, pEList-
35e00 3e 6e 45 78 70 72 29 3b 0a 20 20 20 20 73 53 6f  >nExpr);.    sSo
35e10 72 74 2e 69 45 43 75 72 73 6f 72 20 3d 20 70 50  rt.iECursor = pP
35e20 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20  arse->nTab++;.  
35e30 20 20 73 53 6f 72 74 2e 61 64 64 72 53 6f 72 74    sSort.addrSort
35e40 49 6e 64 65 78 20 3d 0a 20 20 20 20 20 20 73 71  Index =.      sq
35e50 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
35e60 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65  v, OP_OpenEpheme
35e70 72 61 6c 2c 0a 20 20 20 20 20 20 20 20 20 20 73  ral,.          s
35e80 53 6f 72 74 2e 69 45 43 75 72 73 6f 72 2c 20 73  Sort.iECursor, s
35e90 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 2d 3e 6e  Sort.pOrderBy->n
35ea0 45 78 70 72 2b 31 2b 70 45 4c 69 73 74 2d 3e 6e  Expr+1+pEList->n
35eb0 45 78 70 72 2c 20 30 2c 0a 20 20 20 20 20 20 20  Expr, 0,.       
35ec0 20 20 20 28 63 68 61 72 2a 29 70 4b 65 79 49 6e     (char*)pKeyIn
35ed0 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 0a 20  fo, P4_KEYINFO. 
35ee0 20 20 20 20 20 29 3b 0a 20 20 7d 65 6c 73 65 7b       );.  }else{
35ef0 0a 20 20 20 20 73 53 6f 72 74 2e 61 64 64 72 53  .    sSort.addrS
35f00 6f 72 74 49 6e 64 65 78 20 3d 20 2d 31 3b 0a 20  ortIndex = -1;. 
35f10 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20   }..  /* If the 
35f20 6f 75 74 70 75 74 20 69 73 20 64 65 73 74 69 6e  output is destin
35f30 65 64 20 66 6f 72 20 61 20 74 65 6d 70 6f 72 61  ed for a tempora
35f40 72 79 20 74 61 62 6c 65 2c 20 6f 70 65 6e 20 74  ry table, open t
35f50 68 61 74 20 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a  hat table..  */.
35f60 20 20 69 66 28 20 70 44 65 73 74 2d 3e 65 44 65    if( pDest->eDe
35f70 73 74 3d 3d 53 52 54 5f 45 70 68 65 6d 54 61 62  st==SRT_EphemTab
35f80 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
35f90 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
35fa0 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 70  OpenEphemeral, p
35fb0 44 65 73 74 2d 3e 69 53 44 50 61 72 6d 2c 20 70  Dest->iSDParm, p
35fc0 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b 0a 20  EList->nExpr);. 
35fd0 20 7d 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65   }..  /* Set the
35fe0 20 6c 69 6d 69 74 65 72 2e 0a 20 20 2a 2f 0a 20   limiter..  */. 
35ff0 20 69 45 6e 64 20 3d 20 73 71 6c 69 74 65 33 56   iEnd = sqlite3V
36000 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 70 50 61  dbeMakeLabel(pPa
36010 72 73 65 29 3b 0a 20 20 69 66 28 20 28 70 2d 3e  rse);.  if( (p->
36020 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 46 69  selFlags & SF_Fi
36030 78 65 64 4c 69 6d 69 74 29 3d 3d 30 20 29 7b 0a  xedLimit)==0 ){.
36040 20 20 20 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f      p->nSelectRo
36050 77 20 3d 20 33 32 30 3b 20 20 2f 2a 20 34 20 62  w = 320;  /* 4 b
36060 69 6c 6c 69 6f 6e 20 72 6f 77 73 20 2a 2f 0a 20  illion rows */. 
36070 20 7d 0a 20 20 63 6f 6d 70 75 74 65 4c 69 6d 69   }.  computeLimi
36080 74 52 65 67 69 73 74 65 72 73 28 70 50 61 72 73  tRegisters(pPars
36090 65 2c 20 70 2c 20 69 45 6e 64 29 3b 0a 20 20 69  e, p, iEnd);.  i
360a0 66 28 20 70 2d 3e 69 4c 69 6d 69 74 3d 3d 30 20  f( p->iLimit==0 
360b0 26 26 20 73 53 6f 72 74 2e 61 64 64 72 53 6f 72  && sSort.addrSor
360c0 74 49 6e 64 65 78 3e 3d 30 20 29 7b 0a 20 20 20  tIndex>=0 ){.   
360d0 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
360e0 67 65 4f 70 63 6f 64 65 28 76 2c 20 73 53 6f 72  geOpcode(v, sSor
360f0 74 2e 61 64 64 72 53 6f 72 74 49 6e 64 65 78 2c  t.addrSortIndex,
36100 20 4f 50 5f 53 6f 72 74 65 72 4f 70 65 6e 29 3b   OP_SorterOpen);
36110 0a 20 20 20 20 73 53 6f 72 74 2e 73 6f 72 74 46  .    sSort.sortF
36120 6c 61 67 73 20 7c 3d 20 53 4f 52 54 46 4c 41 47  lags |= SORTFLAG
36130 5f 55 73 65 53 6f 72 74 65 72 3b 0a 20 20 7d 0a  _UseSorter;.  }.
36140 0a 20 20 2f 2a 20 4f 70 65 6e 20 61 6e 20 65 70  .  /* Open an ep
36150 68 65 6d 65 72 61 6c 20 69 6e 64 65 78 20 74 6f  hemeral index to
36160 20 75 73 65 20 66 6f 72 20 74 68 65 20 64 69 73   use for the dis
36170 74 69 6e 63 74 20 73 65 74 2e 0a 20 20 2a 2f 0a  tinct set..  */.
36180 20 20 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61 67    if( p->selFlag
36190 73 20 26 20 53 46 5f 44 69 73 74 69 6e 63 74 20  s & SF_Distinct 
361a0 29 7b 0a 20 20 20 20 73 44 69 73 74 69 6e 63 74  ){.    sDistinct
361b0 2e 74 61 62 54 6e 63 74 20 3d 20 70 50 61 72 73  .tabTnct = pPars
361c0 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 73  e->nTab++;.    s
361d0 44 69 73 74 69 6e 63 74 2e 61 64 64 72 54 6e 63  Distinct.addrTnc
361e0 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  t = sqlite3VdbeA
361f0 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4f 70 65 6e  ddOp4(v, OP_Open
36200 45 70 68 65 6d 65 72 61 6c 2c 0a 20 20 20 20 20  Ephemeral,.     
36210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36220 20 20 73 44 69 73 74 69 6e 63 74 2e 74 61 62 54    sDistinct.tabT
36230 6e 63 74 2c 20 30 2c 20 30 2c 0a 20 20 20 20 20  nct, 0, 0,.     
36240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36250 20 20 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33    (char*)sqlite3
36260 4b 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c  KeyInfoFromExprL
36270 69 73 74 28 70 50 61 72 73 65 2c 20 70 2d 3e 70  ist(pParse, p->p
36280 45 4c 69 73 74 2c 30 2c 30 29 2c 0a 20 20 20 20  EList,0,0),.    
36290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
362a0 20 20 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a     P4_KEYINFO);.
362b0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
362c0 68 61 6e 67 65 50 35 28 76 2c 20 42 54 52 45 45  hangeP5(v, BTREE
362d0 5f 55 4e 4f 52 44 45 52 45 44 29 3b 0a 20 20 20  _UNORDERED);.   
362e0 20 73 44 69 73 74 69 6e 63 74 2e 65 54 6e 63 74   sDistinct.eTnct
362f0 54 79 70 65 20 3d 20 57 48 45 52 45 5f 44 49 53  Type = WHERE_DIS
36300 54 49 4e 43 54 5f 55 4e 4f 52 44 45 52 45 44 3b  TINCT_UNORDERED;
36310 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 44  .  }else{.    sD
36320 69 73 74 69 6e 63 74 2e 65 54 6e 63 74 54 79 70  istinct.eTnctTyp
36330 65 20 3d 20 57 48 45 52 45 5f 44 49 53 54 49 4e  e = WHERE_DISTIN
36340 43 54 5f 4e 4f 4f 50 3b 0a 20 20 7d 0a 0a 20 20  CT_NOOP;.  }..  
36350 69 66 28 20 21 69 73 41 67 67 20 26 26 20 70 47  if( !isAgg && pG
36360 72 6f 75 70 42 79 3d 3d 30 20 29 7b 0a 20 20 20  roupBy==0 ){.   
36370 20 2f 2a 20 4e 6f 20 61 67 67 72 65 67 61 74 65   /* No aggregate
36380 20 66 75 6e 63 74 69 6f 6e 73 20 61 6e 64 20 6e   functions and n
36390 6f 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73  o GROUP BY claus
363a0 65 20 2a 2f 0a 20 20 20 20 75 31 36 20 77 63 74  e */.    u16 wct
363b0 72 6c 46 6c 61 67 73 20 3d 20 28 73 44 69 73 74  rlFlags = (sDist
363c0 69 6e 63 74 2e 69 73 54 6e 63 74 20 3f 20 57 48  inct.isTnct ? WH
363d0 45 52 45 5f 57 41 4e 54 5f 44 49 53 54 49 4e 43  ERE_WANT_DISTINC
363e0 54 20 3a 20 30 29 0a 20 20 20 20 20 20 20 20 20  T : 0).         
363f0 20 20 20 20 20 20 20 20 20 20 7c 20 28 70 2d 3e            | (p->
36400 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 46 69  selFlags & SF_Fi
36410 78 65 64 4c 69 6d 69 74 29 3b 0a 23 69 66 6e 64  xedLimit);.#ifnd
36420 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57  ef SQLITE_OMIT_W
36430 49 4e 44 4f 57 46 55 4e 43 0a 20 20 20 20 57 69  INDOWFUNC.    Wi
36440 6e 64 6f 77 20 2a 70 57 69 6e 20 3d 20 70 2d 3e  ndow *pWin = p->
36450 70 57 69 6e 3b 20 20 20 20 20 20 2f 2a 20 4d 61  pWin;      /* Ma
36460 73 74 65 72 20 77 69 6e 64 6f 77 20 6f 62 6a 65  ster window obje
36470 63 74 20 28 6f 72 20 4e 55 4c 4c 29 20 2a 2f 0a  ct (or NULL) */.
36480 20 20 20 20 69 66 28 20 70 57 69 6e 20 29 7b 0a      if( pWin ){.
36490 20 20 20 20 20 20 73 71 6c 69 74 65 33 57 69 6e        sqlite3Win
364a0 64 6f 77 43 6f 64 65 49 6e 69 74 28 70 50 61 72  dowCodeInit(pPar
364b0 73 65 2c 20 70 57 69 6e 29 3b 0a 20 20 20 20 7d  se, pWin);.    }
364c0 0a 23 65 6e 64 69 66 0a 20 20 20 20 61 73 73 65  .#endif.    asse
364d0 72 74 28 20 57 48 45 52 45 5f 55 53 45 5f 4c 49  rt( WHERE_USE_LI
364e0 4d 49 54 3d 3d 53 46 5f 46 69 78 65 64 4c 69 6d  MIT==SF_FixedLim
364f0 69 74 20 29 3b 0a 0a 0a 20 20 20 20 2f 2a 20 42  it );...    /* B
36500 65 67 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  egin the databas
36510 65 20 73 63 61 6e 2e 20 2a 2f 0a 20 20 20 20 53  e scan. */.    S
36520 45 4c 45 43 54 54 52 41 43 45 28 31 2c 70 50 61  ELECTTRACE(1,pPa
36530 72 73 65 2c 70 2c 28 22 57 68 65 72 65 42 65 67  rse,p,("WhereBeg
36540 69 6e 5c 6e 22 29 29 3b 0a 20 20 20 20 70 57 49  in\n"));.    pWI
36550 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 57 68 65  nfo = sqlite3Whe
36560 72 65 42 65 67 69 6e 28 70 50 61 72 73 65 2c 20  reBegin(pParse, 
36570 70 54 61 62 4c 69 73 74 2c 20 70 57 68 65 72 65  pTabList, pWhere
36580 2c 20 73 53 6f 72 74 2e 70 4f 72 64 65 72 42 79  , sSort.pOrderBy
36590 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
365a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
365b0 20 70 2d 3e 70 45 4c 69 73 74 2c 20 77 63 74 72   p->pEList, wctr
365c0 6c 46 6c 61 67 73 2c 20 70 2d 3e 6e 53 65 6c 65  lFlags, p->nSele
365d0 63 74 52 6f 77 29 3b 0a 20 20 20 20 69 66 28 20  ctRow);.    if( 
365e0 70 57 49 6e 66 6f 3d 3d 30 20 29 20 67 6f 74 6f  pWInfo==0 ) goto
365f0 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20   select_end;.   
36600 20 69 66 28 20 73 71 6c 69 74 65 33 57 68 65 72   if( sqlite3Wher
36610 65 4f 75 74 70 75 74 52 6f 77 43 6f 75 6e 74 28  eOutputRowCount(
36620 70 57 49 6e 66 6f 29 20 3c 20 70 2d 3e 6e 53 65  pWInfo) < p->nSe
36630 6c 65 63 74 52 6f 77 20 29 7b 0a 20 20 20 20 20  lectRow ){.     
36640 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d   p->nSelectRow =
36650 20 73 71 6c 69 74 65 33 57 68 65 72 65 4f 75 74   sqlite3WhereOut
36660 70 75 74 52 6f 77 43 6f 75 6e 74 28 70 57 49 6e  putRowCount(pWIn
36670 66 6f 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  fo);.    }.    i
36680 66 28 20 73 44 69 73 74 69 6e 63 74 2e 69 73 54  f( sDistinct.isT
36690 6e 63 74 20 26 26 20 73 71 6c 69 74 65 33 57 68  nct && sqlite3Wh
366a0 65 72 65 49 73 44 69 73 74 69 6e 63 74 28 70 57  ereIsDistinct(pW
366b0 49 6e 66 6f 29 20 29 7b 0a 20 20 20 20 20 20 73  Info) ){.      s
366c0 44 69 73 74 69 6e 63 74 2e 65 54 6e 63 74 54 79  Distinct.eTnctTy
366d0 70 65 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72  pe = sqlite3Wher
366e0 65 49 73 44 69 73 74 69 6e 63 74 28 70 57 49 6e  eIsDistinct(pWIn
366f0 66 6f 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  fo);.    }.    i
36700 66 28 20 73 53 6f 72 74 2e 70 4f 72 64 65 72 42  f( sSort.pOrderB
36710 79 20 29 7b 0a 20 20 20 20 20 20 73 53 6f 72 74  y ){.      sSort
36720 2e 6e 4f 42 53 61 74 20 3d 20 73 71 6c 69 74 65  .nOBSat = sqlite
36730 33 57 68 65 72 65 49 73 4f 72 64 65 72 65 64 28  3WhereIsOrdered(
36740 70 57 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 73  pWInfo);.      s
36750 53 6f 72 74 2e 6c 61 62 65 6c 4f 42 4c 6f 70 74  Sort.labelOBLopt
36760 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65 4f   = sqlite3WhereO
36770 72 64 65 72 42 79 4c 69 6d 69 74 4f 70 74 4c 61  rderByLimitOptLa
36780 62 65 6c 28 70 57 49 6e 66 6f 29 3b 0a 20 20 20  bel(pWInfo);.   
36790 20 20 20 69 66 28 20 73 53 6f 72 74 2e 6e 4f 42     if( sSort.nOB
367a0 53 61 74 3d 3d 73 53 6f 72 74 2e 70 4f 72 64 65  Sat==sSort.pOrde
367b0 72 42 79 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20  rBy->nExpr ){.  
367c0 20 20 20 20 20 20 73 53 6f 72 74 2e 70 4f 72 64        sSort.pOrd
367d0 65 72 42 79 20 3d 20 30 3b 0a 20 20 20 20 20 20  erBy = 0;.      
367e0 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
367f0 49 66 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78  If sorting index
36800 20 74 68 61 74 20 77 61 73 20 63 72 65 61 74 65   that was create
36810 64 20 62 79 20 61 20 70 72 69 6f 72 20 4f 50 5f  d by a prior OP_
36820 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 0a 20  OpenEphemeral . 
36830 20 20 20 2a 2a 20 69 6e 73 74 72 75 63 74 69 6f     ** instructio
36840 6e 20 65 6e 64 65 64 20 75 70 20 6e 6f 74 20 62  n ended up not b
36850 65 69 6e 67 20 6e 65 65 64 65 64 2c 20 74 68 65  eing needed, the
36860 6e 20 63 68 61 6e 67 65 20 74 68 65 20 4f 50 5f  n change the OP_
36870 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 0a 20 20  OpenEphemeral.  
36880 20 20 2a 2a 20 69 6e 74 6f 20 61 6e 20 4f 50 5f    ** into an OP_
36890 4e 6f 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  Noop..    */.   
368a0 20 69 66 28 20 73 53 6f 72 74 2e 61 64 64 72 53   if( sSort.addrS
368b0 6f 72 74 49 6e 64 65 78 3e 3d 30 20 26 26 20 73  ortIndex>=0 && s
368c0 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 3d 3d 30  Sort.pOrderBy==0
368d0 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
368e0 33 56 64 62 65 43 68 61 6e 67 65 54 6f 4e 6f 6f  3VdbeChangeToNoo
368f0 70 28 76 2c 20 73 53 6f 72 74 2e 61 64 64 72 53  p(v, sSort.addrS
36900 6f 72 74 49 6e 64 65 78 29 3b 0a 20 20 20 20 7d  ortIndex);.    }
36910 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  ..    assert( p-
36920 3e 70 45 4c 69 73 74 3d 3d 70 45 4c 69 73 74 20  >pEList==pEList 
36930 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  );.#ifndef SQLIT
36940 45 5f 4f 4d 49 54 5f 57 49 4e 44 4f 57 46 55 4e  E_OMIT_WINDOWFUN
36950 43 0a 20 20 20 20 69 66 28 20 70 57 69 6e 20 29  C.    if( pWin )
36960 7b 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72  {.      int addr
36970 47 6f 73 75 62 20 3d 20 73 71 6c 69 74 65 33 56  Gosub = sqlite3V
36980 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 70 50 61  dbeMakeLabel(pPa
36990 72 73 65 29 3b 0a 20 20 20 20 20 20 69 6e 74 20  rse);.      int 
369a0 69 43 6f 6e 74 20 3d 20 73 71 6c 69 74 65 33 56  iCont = sqlite3V
369b0 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 70 50 61  dbeMakeLabel(pPa
369c0 72 73 65 29 3b 0a 20 20 20 20 20 20 69 6e 74 20  rse);.      int 
369d0 69 42 72 65 61 6b 20 3d 20 73 71 6c 69 74 65 33  iBreak = sqlite3
369e0 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 70 50  VdbeMakeLabel(pP
369f0 61 72 73 65 29 3b 0a 20 20 20 20 20 20 69 6e 74  arse);.      int
36a00 20 72 65 67 47 6f 73 75 62 20 3d 20 2b 2b 70 50   regGosub = ++pP
36a10 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 0a 20 20 20  arse->nMem;..   
36a20 20 20 20 73 71 6c 69 74 65 33 57 69 6e 64 6f 77     sqlite3Window
36a30 43 6f 64 65 53 74 65 70 28 70 50 61 72 73 65 2c  CodeStep(pParse,
36a40 20 70 2c 20 70 57 49 6e 66 6f 2c 20 72 65 67 47   p, pWInfo, regG
36a50 6f 73 75 62 2c 20 61 64 64 72 47 6f 73 75 62 29  osub, addrGosub)
36a60 3b 0a 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ;..      sqlite3
36a70 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
36a80 5f 47 6f 74 6f 2c 20 30 2c 20 69 42 72 65 61 6b  _Goto, 0, iBreak
36a90 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
36aa0 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
36ab0 28 76 2c 20 61 64 64 72 47 6f 73 75 62 29 3b 0a  (v, addrGosub);.
36ac0 20 20 20 20 20 20 56 64 62 65 4e 6f 6f 70 43 6f        VdbeNoopCo
36ad0 6d 6d 65 6e 74 28 28 76 2c 20 22 69 6e 6e 65 72  mment((v, "inner
36ae0 2d 6c 6f 6f 70 20 73 75 62 72 6f 75 74 69 6e 65  -loop subroutine
36af0 22 29 29 3b 0a 20 20 20 20 20 20 73 53 6f 72 74  "));.      sSort
36b00 2e 6c 61 62 65 6c 4f 42 4c 6f 70 74 20 3d 20 30  .labelOBLopt = 0
36b10 3b 0a 20 20 20 20 20 20 73 65 6c 65 63 74 49 6e  ;.      selectIn
36b20 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20  nerLoop(pParse, 
36b30 70 2c 20 2d 31 2c 20 26 73 53 6f 72 74 2c 20 26  p, -1, &sSort, &
36b40 73 44 69 73 74 69 6e 63 74 2c 20 70 44 65 73 74  sDistinct, pDest
36b50 2c 20 69 43 6f 6e 74 2c 20 69 42 72 65 61 6b 29  , iCont, iBreak)
36b60 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
36b70 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
36b80 76 2c 20 69 43 6f 6e 74 29 3b 0a 20 20 20 20 20  v, iCont);.     
36b90 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
36ba0 70 31 28 76 2c 20 4f 50 5f 52 65 74 75 72 6e 2c  p1(v, OP_Return,
36bb0 20 72 65 67 47 6f 73 75 62 29 3b 0a 20 20 20 20   regGosub);.    
36bc0 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
36bd0 2c 20 22 65 6e 64 20 69 6e 6e 65 72 2d 6c 6f 6f  , "end inner-loo
36be0 70 20 73 75 62 72 6f 75 74 69 6e 65 22 29 29 3b  p subroutine"));
36bf0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
36c00 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
36c10 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 7d  , iBreak);.    }
36c20 65 6c 73 65 0a 23 65 6e 64 69 66 20 2f 2a 20 53  else.#endif /* S
36c30 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 49 4e 44 4f  QLITE_OMIT_WINDO
36c40 57 46 55 4e 43 20 2a 2f 0a 20 20 20 20 7b 0a 20  WFUNC */.    {. 
36c50 20 20 20 20 20 2f 2a 20 55 73 65 20 74 68 65 20       /* Use the 
36c60 73 74 61 6e 64 61 72 64 20 69 6e 6e 65 72 20 6c  standard inner l
36c70 6f 6f 70 2e 20 2a 2f 0a 20 20 20 20 20 20 73 65  oop. */.      se
36c80 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50  lectInnerLoop(pP
36c90 61 72 73 65 2c 20 70 2c 20 2d 31 2c 20 26 73 53  arse, p, -1, &sS
36ca0 6f 72 74 2c 20 26 73 44 69 73 74 69 6e 63 74 2c  ort, &sDistinct,
36cb0 20 70 44 65 73 74 2c 0a 20 20 20 20 20 20 20 20   pDest,.        
36cc0 20 20 73 71 6c 69 74 65 33 57 68 65 72 65 43 6f    sqlite3WhereCo
36cd0 6e 74 69 6e 75 65 4c 61 62 65 6c 28 70 57 49 6e  ntinueLabel(pWIn
36ce0 66 6f 29 2c 0a 20 20 20 20 20 20 20 20 20 20 73  fo),.          s
36cf0 71 6c 69 74 65 33 57 68 65 72 65 42 72 65 61 6b  qlite3WhereBreak
36d00 4c 61 62 65 6c 28 70 57 49 6e 66 6f 29 29 3b 0a  Label(pWInfo));.
36d10 0a 20 20 20 20 20 20 2f 2a 20 45 6e 64 20 74 68  .      /* End th
36d20 65 20 64 61 74 61 62 61 73 65 20 73 63 61 6e 20  e database scan 
36d30 6c 6f 6f 70 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  loop..      */. 
36d40 20 20 20 20 20 73 71 6c 69 74 65 33 57 68 65 72       sqlite3Wher
36d50 65 45 6e 64 28 70 57 49 6e 66 6f 29 3b 0a 20 20  eEnd(pWInfo);.  
36d60 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20    }.  }else{.   
36d70 20 2f 2a 20 54 68 69 73 20 63 61 73 65 20 77 68   /* This case wh
36d80 65 6e 20 74 68 65 72 65 20 65 78 69 73 74 20 61  en there exist a
36d90 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f  ggregate functio
36da0 6e 73 20 6f 72 20 61 20 47 52 4f 55 50 20 42 59  ns or a GROUP BY
36db0 20 63 6c 61 75 73 65 0a 20 20 20 20 2a 2a 20 6f   clause.    ** o
36dc0 72 20 62 6f 74 68 20 2a 2f 0a 20 20 20 20 4e 61  r both */.    Na
36dd0 6d 65 43 6f 6e 74 65 78 74 20 73 4e 43 3b 20 20  meContext sNC;  
36de0 20 20 2f 2a 20 4e 61 6d 65 20 63 6f 6e 74 65 78    /* Name contex
36df0 74 20 66 6f 72 20 70 72 6f 63 65 73 73 69 6e 67  t for processing
36e00 20 61 67 67 72 65 67 61 74 65 20 69 6e 66 6f 72   aggregate infor
36e10 6d 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 69 6e  mation */.    in
36e20 74 20 69 41 4d 65 6d 3b 20 20 20 20 20 20 20 20  t iAMem;        
36e30 20 20 2f 2a 20 46 69 72 73 74 20 4d 65 6d 20 61    /* First Mem a
36e40 64 64 72 65 73 73 20 66 6f 72 20 73 74 6f 72 69  ddress for stori
36e50 6e 67 20 63 75 72 72 65 6e 74 20 47 52 4f 55 50  ng current GROUP
36e60 20 42 59 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69   BY */.    int i
36e70 42 4d 65 6d 3b 20 20 20 20 20 20 20 20 20 20 2f  BMem;          /
36e80 2a 20 46 69 72 73 74 20 4d 65 6d 20 61 64 64 72  * First Mem addr
36e90 65 73 73 20 66 6f 72 20 70 72 65 76 69 6f 75 73  ess for previous
36ea0 20 47 52 4f 55 50 20 42 59 20 2a 2f 0a 20 20 20   GROUP BY */.   
36eb0 20 69 6e 74 20 69 55 73 65 46 6c 61 67 3b 20 20   int iUseFlag;  
36ec0 20 20 20 20 20 2f 2a 20 4d 65 6d 20 61 64 64 72       /* Mem addr
36ed0 65 73 73 20 68 6f 6c 64 69 6e 67 20 66 6c 61 67  ess holding flag
36ee0 20 69 6e 64 69 63 61 74 69 6e 67 20 74 68 61 74   indicating that
36ef0 20 61 74 20 6c 65 61 73 74 0a 20 20 20 20 20 20   at least.      
36f00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36f10 20 20 2a 2a 20 6f 6e 65 20 72 6f 77 20 6f 66 20    ** one row of 
36f20 74 68 65 20 69 6e 70 75 74 20 74 6f 20 74 68 65  the input to the
36f30 20 61 67 67 72 65 67 61 74 6f 72 20 68 61 73 20   aggregator has 
36f40 62 65 65 6e 0a 20 20 20 20 20 20 20 20 20 20 20  been.           
36f50 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20               ** 
36f60 70 72 6f 63 65 73 73 65 64 20 2a 2f 0a 20 20 20  processed */.   
36f70 20 69 6e 74 20 69 41 62 6f 72 74 46 6c 61 67 3b   int iAbortFlag;
36f80 20 20 20 20 20 2f 2a 20 4d 65 6d 20 61 64 64 72       /* Mem addr
36f90 65 73 73 20 77 68 69 63 68 20 63 61 75 73 65 73  ess which causes
36fa0 20 71 75 65 72 79 20 61 62 6f 72 74 20 69 66 20   query abort if 
36fb0 70 6f 73 69 74 69 76 65 20 2a 2f 0a 20 20 20 20  positive */.    
36fc0 69 6e 74 20 67 72 6f 75 70 42 79 53 6f 72 74 3b  int groupBySort;
36fd0 20 20 20 20 2f 2a 20 52 6f 77 73 20 63 6f 6d 65      /* Rows come
36fe0 20 66 72 6f 6d 20 73 6f 75 72 63 65 20 69 6e 20   from source in 
36ff0 47 52 4f 55 50 20 42 59 20 6f 72 64 65 72 20 2a  GROUP BY order *
37000 2f 0a 20 20 20 20 69 6e 74 20 61 64 64 72 45 6e  /.    int addrEn
37010 64 3b 20 20 20 20 20 20 20 20 2f 2a 20 45 6e 64  d;        /* End
37020 20 6f 66 20 70 72 6f 63 65 73 73 69 6e 67 20 66   of processing f
37030 6f 72 20 74 68 69 73 20 53 45 4c 45 43 54 20 2a  or this SELECT *
37040 2f 0a 20 20 20 20 69 6e 74 20 73 6f 72 74 50 54  /.    int sortPT
37050 61 62 20 3d 20 30 3b 20 20 20 2f 2a 20 50 73 65  ab = 0;   /* Pse
37060 75 64 6f 74 61 62 6c 65 20 75 73 65 64 20 74 6f  udotable used to
37070 20 64 65 63 6f 64 65 20 73 6f 72 74 69 6e 67 20   decode sorting 
37080 72 65 73 75 6c 74 73 20 2a 2f 0a 20 20 20 20 69  results */.    i
37090 6e 74 20 73 6f 72 74 4f 75 74 20 3d 20 30 3b 20  nt sortOut = 0; 
370a0 20 20 20 2f 2a 20 4f 75 74 70 75 74 20 72 65 67     /* Output reg
370b0 69 73 74 65 72 20 66 72 6f 6d 20 74 68 65 20 73  ister from the s
370c0 6f 72 74 65 72 20 2a 2f 0a 20 20 20 20 69 6e 74  orter */.    int
370d0 20 6f 72 64 65 72 42 79 47 72 70 20 3d 20 30 3b   orderByGrp = 0;
370e0 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65 20   /* True if the 
370f0 47 52 4f 55 50 20 42 59 20 61 6e 64 20 4f 52 44  GROUP BY and ORD
37100 45 52 20 42 59 20 61 72 65 20 74 68 65 20 73 61  ER BY are the sa
37110 6d 65 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 52 65  me */..    /* Re
37120 6d 6f 76 65 20 61 6e 79 20 61 6e 64 20 61 6c 6c  move any and all
37130 20 61 6c 69 61 73 65 73 20 62 65 74 77 65 65 6e   aliases between
37140 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20   the result set 
37150 61 6e 64 20 74 68 65 0a 20 20 20 20 2a 2a 20 47  and the.    ** G
37160 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 2e 0a  ROUP BY clause..
37170 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
37180 47 72 6f 75 70 42 79 20 29 7b 0a 20 20 20 20 20  GroupBy ){.     
37190 20 69 6e 74 20 6b 3b 20 20 20 20 20 20 20 20 20   int k;         
371a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
371b0 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
371c0 2f 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 45  /.      struct E
371d0 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  xprList_item *pI
371e0 74 65 6d 3b 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f  tem;  /* For loo
371f0 70 69 6e 67 20 6f 76 65 72 20 65 78 70 72 65 73  ping over expres
37200 73 69 6f 6e 20 69 6e 20 61 20 6c 69 73 74 20 2a  sion in a list *
37210 2f 0a 0a 20 20 20 20 20 20 66 6f 72 28 6b 3d 70  /..      for(k=p
37220 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c  ->pEList->nExpr,
37230 20 70 49 74 65 6d 3d 70 2d 3e 70 45 4c 69 73 74   pItem=p->pEList
37240 2d 3e 61 3b 20 6b 3e 30 3b 20 6b 2d 2d 2c 20 70  ->a; k>0; k--, p
37250 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20  Item++){.       
37260 20 70 49 74 65 6d 2d 3e 75 2e 78 2e 69 41 6c 69   pItem->u.x.iAli
37270 61 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a  as = 0;.      }.
37280 20 20 20 20 20 20 66 6f 72 28 6b 3d 70 47 72 6f        for(k=pGro
37290 75 70 42 79 2d 3e 6e 45 78 70 72 2c 20 70 49 74  upBy->nExpr, pIt
372a0 65 6d 3d 70 47 72 6f 75 70 42 79 2d 3e 61 3b 20  em=pGroupBy->a; 
372b0 6b 3e 30 3b 20 6b 2d 2d 2c 20 70 49 74 65 6d 2b  k>0; k--, pItem+
372c0 2b 29 7b 0a 20 20 20 20 20 20 20 20 70 49 74 65  +){.        pIte
372d0 6d 2d 3e 75 2e 78 2e 69 41 6c 69 61 73 20 3d 20  m->u.x.iAlias = 
372e0 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  0;.      }.     
372f0 20 61 73 73 65 72 74 28 20 36 36 3d 3d 73 71 6c   assert( 66==sql
37300 69 74 65 33 4c 6f 67 45 73 74 28 31 30 30 29 20  ite3LogEst(100) 
37310 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e  );.      if( p->
37320 6e 53 65 6c 65 63 74 52 6f 77 3e 36 36 20 29 20  nSelectRow>66 ) 
37330 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20  p->nSelectRow = 
37340 36 36 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66  66;..      /* If
37350 20 74 68 65 72 65 20 69 73 20 62 6f 74 68 20 61   there is both a
37360 20 47 52 4f 55 50 20 42 59 20 61 6e 64 20 61 6e   GROUP BY and an
37370 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
37380 20 61 6e 64 20 74 68 65 79 20 61 72 65 0a 20 20   and they are.  
37390 20 20 20 20 2a 2a 20 69 64 65 6e 74 69 63 61 6c      ** identical
373a0 2c 20 74 68 65 6e 20 69 74 20 6d 61 79 20 62 65  , then it may be
373b0 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 64 69 73   possible to dis
373c0 61 62 6c 65 20 74 68 65 20 4f 52 44 45 52 20 42  able the ORDER B
373d0 59 20 63 6c 61 75 73 65 20 0a 20 20 20 20 20 20  Y clause .      
373e0 2a 2a 20 6f 6e 20 74 68 65 20 67 72 6f 75 6e 64  ** on the ground
373f0 73 20 74 68 61 74 20 74 68 65 20 47 52 4f 55 50  s that the GROUP
37400 20 42 59 20 77 69 6c 6c 20 63 61 75 73 65 20 65   BY will cause e
37410 6c 65 6d 65 6e 74 73 20 74 6f 20 63 6f 6d 65 20  lements to come 
37420 6f 75 74 20 0a 20 20 20 20 20 20 2a 2a 20 69 6e  out .      ** in
37430 20 74 68 65 20 63 6f 72 72 65 63 74 20 6f 72 64   the correct ord
37440 65 72 2e 20 49 74 20 61 6c 73 6f 20 6d 61 79 20  er. It also may 
37450 6e 6f 74 20 2d 20 74 68 65 20 47 52 4f 55 50 20  not - the GROUP 
37460 42 59 20 6d 69 67 68 74 20 75 73 65 20 61 0a 20  BY might use a. 
37470 20 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65       ** database
37480 20 69 6e 64 65 78 20 74 68 61 74 20 63 61 75 73   index that caus
37490 65 73 20 72 6f 77 73 20 74 6f 20 62 65 20 67 72  es rows to be gr
374a0 6f 75 70 65 64 20 74 6f 67 65 74 68 65 72 20 61  ouped together a
374b0 73 20 72 65 71 75 69 72 65 64 0a 20 20 20 20 20  s required.     
374c0 20 2a 2a 20 62 75 74 20 6e 6f 74 20 61 63 74 75   ** but not actu
374d0 61 6c 6c 79 20 73 6f 72 74 65 64 2e 20 45 69 74  ally sorted. Eit
374e0 68 65 72 20 77 61 79 2c 20 72 65 63 6f 72 64 20  her way, record 
374f0 74 68 65 20 66 61 63 74 20 74 68 61 74 20 74 68  the fact that th
37500 65 0a 20 20 20 20 20 20 2a 2a 20 4f 52 44 45 52  e.      ** ORDER
37510 20 42 59 20 61 6e 64 20 47 52 4f 55 50 20 42 59   BY and GROUP BY
37520 20 63 6c 61 75 73 65 73 20 61 72 65 20 74 68 65   clauses are the
37530 20 73 61 6d 65 20 62 79 20 73 65 74 74 69 6e 67   same by setting
37540 20 74 68 65 20 6f 72 64 65 72 42 79 47 72 70 0a   the orderByGrp.
37550 20 20 20 20 20 20 2a 2a 20 76 61 72 69 61 62 6c        ** variabl
37560 65 2e 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  e.  */.      if(
37570 20 73 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 20   sSort.pOrderBy 
37580 26 26 20 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78  && pGroupBy->nEx
37590 70 72 3d 3d 73 53 6f 72 74 2e 70 4f 72 64 65 72  pr==sSort.pOrder
375a0 42 79 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20  By->nExpr ){.   
375b0 20 20 20 20 20 69 6e 74 20 69 69 3b 0a 20 20 20       int ii;.   
375c0 20 20 20 20 20 2f 2a 20 54 68 65 20 47 52 4f 55       /* The GROU
375d0 50 20 42 59 20 70 72 6f 63 65 73 73 69 6e 67 20  P BY processing 
375e0 64 6f 65 73 6e 27 74 20 63 61 72 65 20 77 68 65  doesn't care whe
375f0 74 68 65 72 20 72 6f 77 73 20 61 72 65 20 64 65  ther rows are de
37600 6c 69 76 65 72 65 64 20 69 6e 0a 20 20 20 20 20  livered in.     
37610 20 20 20 2a 2a 20 41 53 43 20 6f 72 20 44 45 53     ** ASC or DES
37620 43 20 6f 72 64 65 72 20 2d 20 6f 6e 6c 79 20 74  C order - only t
37630 68 61 74 20 65 61 63 68 20 67 72 6f 75 70 20 69  hat each group i
37640 73 20 72 65 74 75 72 6e 65 64 20 63 6f 6e 74 69  s returned conti
37650 67 75 6f 75 73 6c 79 2e 0a 20 20 20 20 20 20 20  guously..       
37660 20 2a 2a 20 53 6f 20 73 65 74 20 74 68 65 20 41   ** So set the A
37670 53 43 2f 44 45 53 43 20 66 6c 61 67 73 20 69 6e  SC/DESC flags in
37680 20 74 68 65 20 47 52 4f 55 50 20 42 59 20 74 6f   the GROUP BY to
37690 20 6d 61 74 63 68 20 74 68 6f 73 65 20 69 6e 20   match those in 
376a0 74 68 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  the .        ** 
376b0 4f 52 44 45 52 20 42 59 20 74 6f 20 6d 61 78 69  ORDER BY to maxi
376c0 6d 69 7a 65 20 74 68 65 20 63 68 61 6e 63 65 73  mize the chances
376d0 20 6f 66 20 72 6f 77 73 20 62 65 69 6e 67 20 64   of rows being d
376e0 65 6c 69 76 65 72 65 64 20 69 6e 20 61 6e 20 0a  elivered in an .
376f0 20 20 20 20 20 20 20 20 2a 2a 20 6f 72 64 65 72          ** order
37700 20 74 68 61 74 20 6d 61 6b 65 73 20 74 68 65 20   that makes the 
37710 4f 52 44 45 52 20 42 59 20 72 65 64 75 6e 64 61  ORDER BY redunda
37720 6e 74 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20  nt.  */.        
37730 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 47 72  for(ii=0; ii<pGr
37740 6f 75 70 42 79 2d 3e 6e 45 78 70 72 3b 20 69 69  oupBy->nExpr; ii
37750 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 75  ++){.          u
37760 38 20 73 6f 72 74 46 6c 61 67 73 20 3d 20 73 53  8 sortFlags = sS
37770 6f 72 74 2e 70 4f 72 64 65 72 42 79 2d 3e 61 5b  ort.pOrderBy->a[
37780 69 69 5d 2e 73 6f 72 74 46 6c 61 67 73 20 26 20  ii].sortFlags & 
37790 4b 45 59 49 4e 46 4f 5f 4f 52 44 45 52 5f 44 45  KEYINFO_ORDER_DE
377a0 53 43 3b 0a 20 20 20 20 20 20 20 20 20 20 70 47  SC;.          pG
377b0 72 6f 75 70 42 79 2d 3e 61 5b 69 69 5d 2e 73 6f  roupBy->a[ii].so
377c0 72 74 46 6c 61 67 73 20 3d 20 73 6f 72 74 46 6c  rtFlags = sortFl
377d0 61 67 73 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ags;.        }. 
377e0 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74         if( sqlit
377f0 65 33 45 78 70 72 4c 69 73 74 43 6f 6d 70 61 72  e3ExprListCompar
37800 65 28 70 47 72 6f 75 70 42 79 2c 20 73 53 6f 72  e(pGroupBy, sSor
37810 74 2e 70 4f 72 64 65 72 42 79 2c 20 2d 31 29 3d  t.pOrderBy, -1)=
37820 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
37830 6f 72 64 65 72 42 79 47 72 70 20 3d 20 31 3b 0a  orderByGrp = 1;.
37840 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
37850 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  }.    }else{.   
37860 20 20 20 61 73 73 65 72 74 28 20 30 3d 3d 73 71     assert( 0==sq
37870 6c 69 74 65 33 4c 6f 67 45 73 74 28 31 29 20 29  lite3LogEst(1) )
37880 3b 0a 20 20 20 20 20 20 70 2d 3e 6e 53 65 6c 65  ;.      p->nSele
37890 63 74 52 6f 77 20 3d 20 30 3b 0a 20 20 20 20 7d  ctRow = 0;.    }
378a0 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20  ..    /* Create 
378b0 61 20 6c 61 62 65 6c 20 74 6f 20 6a 75 6d 70 20  a label to jump 
378c0 74 6f 20 77 68 65 6e 20 77 65 20 77 61 6e 74 20  to when we want 
378d0 74 6f 20 61 62 6f 72 74 20 74 68 65 20 71 75 65  to abort the que
378e0 72 79 20 2a 2f 0a 20 20 20 20 61 64 64 72 45 6e  ry */.    addrEn
378f0 64 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  d = sqlite3VdbeM
37900 61 6b 65 4c 61 62 65 6c 28 70 50 61 72 73 65 29  akeLabel(pParse)
37910 3b 0a 0a 20 20 20 20 2f 2a 20 43 6f 6e 76 65 72  ;..    /* Conver
37920 74 20 54 4b 5f 43 4f 4c 55 4d 4e 20 6e 6f 64 65  t TK_COLUMN node
37930 73 20 69 6e 74 6f 20 54 4b 5f 41 47 47 5f 43 4f  s into TK_AGG_CO
37940 4c 55 4d 4e 20 61 6e 64 20 6d 61 6b 65 20 65 6e  LUMN and make en
37950 74 72 69 65 73 20 69 6e 0a 20 20 20 20 2a 2a 20  tries in.    ** 
37960 73 41 67 67 49 6e 66 6f 20 66 6f 72 20 61 6c 6c  sAggInfo for all
37970 20 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e   TK_AGG_FUNCTION
37980 20 6e 6f 64 65 73 20 69 6e 20 65 78 70 72 65 73   nodes in expres
37990 73 69 6f 6e 73 20 6f 66 20 74 68 65 0a 20 20 20  sions of the.   
379a0 20 2a 2a 20 53 45 4c 45 43 54 20 73 74 61 74 65   ** SELECT state
379b0 6d 65 6e 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ment..    */.   
379c0 20 6d 65 6d 73 65 74 28 26 73 4e 43 2c 20 30 2c   memset(&sNC, 0,
379d0 20 73 69 7a 65 6f 66 28 73 4e 43 29 29 3b 0a 20   sizeof(sNC));. 
379e0 20 20 20 73 4e 43 2e 70 50 61 72 73 65 20 3d 20     sNC.pParse = 
379f0 70 50 61 72 73 65 3b 0a 20 20 20 20 73 4e 43 2e  pParse;.    sNC.
37a00 70 53 72 63 4c 69 73 74 20 3d 20 70 54 61 62 4c  pSrcList = pTabL
37a10 69 73 74 3b 0a 20 20 20 20 73 4e 43 2e 75 4e 43  ist;.    sNC.uNC
37a20 2e 70 41 67 67 49 6e 66 6f 20 3d 20 26 73 41 67  .pAggInfo = &sAg
37a30 67 49 6e 66 6f 3b 0a 20 20 20 20 56 56 41 5f 4f  gInfo;.    VVA_O
37a40 4e 4c 59 28 20 73 4e 43 2e 6e 63 46 6c 61 67 73  NLY( sNC.ncFlags
37a50 20 3d 20 4e 43 5f 55 41 67 67 49 6e 66 6f 3b 20   = NC_UAggInfo; 
37a60 29 0a 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 6d  ).    sAggInfo.m
37a70 6e 52 65 67 20 3d 20 70 50 61 72 73 65 2d 3e 6e  nReg = pParse->n
37a80 4d 65 6d 2b 31 3b 0a 20 20 20 20 73 41 67 67 49  Mem+1;.    sAggI
37a90 6e 66 6f 2e 6e 53 6f 72 74 69 6e 67 43 6f 6c 75  nfo.nSortingColu
37aa0 6d 6e 20 3d 20 70 47 72 6f 75 70 42 79 20 3f 20  mn = pGroupBy ? 
37ab0 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 20  pGroupBy->nExpr 
37ac0 3a 20 30 3b 0a 20 20 20 20 73 41 67 67 49 6e 66  : 0;.    sAggInf
37ad0 6f 2e 70 47 72 6f 75 70 42 79 20 3d 20 70 47 72  o.pGroupBy = pGr
37ae0 6f 75 70 42 79 3b 0a 20 20 20 20 73 71 6c 69 74  oupBy;.    sqlit
37af0 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67  e3ExprAnalyzeAgg
37b00 4c 69 73 74 28 26 73 4e 43 2c 20 70 45 4c 69 73  List(&sNC, pELis
37b10 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  t);.    sqlite3E
37b20 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 4c 69 73  xprAnalyzeAggLis
37b30 74 28 26 73 4e 43 2c 20 73 53 6f 72 74 2e 70 4f  t(&sNC, sSort.pO
37b40 72 64 65 72 42 79 29 3b 0a 20 20 20 20 69 66 28  rderBy);.    if(
37b50 20 70 48 61 76 69 6e 67 20 29 7b 0a 20 20 20 20   pHaving ){.    
37b60 20 20 69 66 28 20 70 47 72 6f 75 70 42 79 20 29    if( pGroupBy )
37b70 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
37b80 28 20 70 57 68 65 72 65 3d 3d 70 2d 3e 70 57 68  ( pWhere==p->pWh
37b90 65 72 65 20 29 3b 0a 20 20 20 20 20 20 20 20 61  ere );.        a
37ba0 73 73 65 72 74 28 20 70 48 61 76 69 6e 67 3d 3d  ssert( pHaving==
37bb0 70 2d 3e 70 48 61 76 69 6e 67 20 29 3b 0a 20 20  p->pHaving );.  
37bc0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 47        assert( pG
37bd0 72 6f 75 70 42 79 3d 3d 70 2d 3e 70 47 72 6f 75  roupBy==p->pGrou
37be0 70 42 79 20 29 3b 0a 20 20 20 20 20 20 20 20 68  pBy );.        h
37bf0 61 76 69 6e 67 54 6f 57 68 65 72 65 28 70 50 61  avingToWhere(pPa
37c00 72 73 65 2c 20 70 29 3b 0a 20 20 20 20 20 20 20  rse, p);.       
37c10 20 70 57 68 65 72 65 20 3d 20 70 2d 3e 70 57 68   pWhere = p->pWh
37c20 65 72 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ere;.      }.   
37c30 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e     sqlite3ExprAn
37c40 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73 28  alyzeAggregates(
37c50 26 73 4e 43 2c 20 70 48 61 76 69 6e 67 29 3b 0a  &sNC, pHaving);.
37c60 20 20 20 20 7d 0a 20 20 20 20 73 41 67 67 49 6e      }.    sAggIn
37c70 66 6f 2e 6e 41 63 63 75 6d 75 6c 61 74 6f 72 20  fo.nAccumulator 
37c80 3d 20 73 41 67 67 49 6e 66 6f 2e 6e 43 6f 6c 75  = sAggInfo.nColu
37c90 6d 6e 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 70  mn;.    if( p->p
37ca0 47 72 6f 75 70 42 79 3d 3d 30 20 26 26 20 70 2d  GroupBy==0 && p-
37cb0 3e 70 48 61 76 69 6e 67 3d 3d 30 20 26 26 20 73  >pHaving==0 && s
37cc0 41 67 67 49 6e 66 6f 2e 6e 46 75 6e 63 3d 3d 31  AggInfo.nFunc==1
37cd0 20 29 7b 0a 20 20 20 20 20 20 6d 69 6e 4d 61 78   ){.      minMax
37ce0 46 6c 61 67 20 3d 20 6d 69 6e 4d 61 78 51 75 65  Flag = minMaxQue
37cf0 72 79 28 64 62 2c 20 73 41 67 67 49 6e 66 6f 2e  ry(db, sAggInfo.
37d00 61 46 75 6e 63 5b 30 5d 2e 70 45 78 70 72 2c 20  aFunc[0].pExpr, 
37d10 26 70 4d 69 6e 4d 61 78 4f 72 64 65 72 42 79 29  &pMinMaxOrderBy)
37d20 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
37d30 20 20 20 6d 69 6e 4d 61 78 46 6c 61 67 20 3d 20     minMaxFlag = 
37d40 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4e 4f  WHERE_ORDERBY_NO
37d50 52 4d 41 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 20  RMAL;.    }.    
37d60 66 6f 72 28 69 3d 30 3b 20 69 3c 73 41 67 67 49  for(i=0; i<sAggI
37d70 6e 66 6f 2e 6e 46 75 6e 63 3b 20 69 2b 2b 29 7b  nfo.nFunc; i++){
37d80 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 45 78  .      Expr *pEx
37d90 70 72 20 3d 20 73 41 67 67 49 6e 66 6f 2e 61 46  pr = sAggInfo.aF
37da0 75 6e 63 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20  unc[i].pExpr;.  
37db0 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70      assert( !Exp
37dc0 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
37dd0 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74  pr, EP_xIsSelect
37de0 29 20 29 3b 0a 20 20 20 20 20 20 73 4e 43 2e 6e  ) );.      sNC.n
37df0 63 46 6c 61 67 73 20 7c 3d 20 4e 43 5f 49 6e 41  cFlags |= NC_InA
37e00 67 67 46 75 6e 63 3b 0a 20 20 20 20 20 20 73 71  ggFunc;.      sq
37e10 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65  lite3ExprAnalyze
37e20 41 67 67 4c 69 73 74 28 26 73 4e 43 2c 20 70 45  AggList(&sNC, pE
37e30 78 70 72 2d 3e 78 2e 70 4c 69 73 74 29 3b 0a 23  xpr->x.pList);.#
37e40 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
37e50 49 54 5f 57 49 4e 44 4f 57 46 55 4e 43 0a 20 20  IT_WINDOWFUNC.  
37e60 20 20 20 20 61 73 73 65 72 74 28 20 21 49 73 57      assert( !IsW
37e70 69 6e 64 6f 77 46 75 6e 63 28 70 45 78 70 72 29  indowFunc(pExpr)
37e80 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 45 78   );.      if( Ex
37e90 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
37ea0 78 70 72 2c 20 45 50 5f 57 69 6e 46 75 6e 63 29  xpr, EP_WinFunc)
37eb0 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
37ec0 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67  te3ExprAnalyzeAg
37ed0 67 72 65 67 61 74 65 73 28 26 73 4e 43 2c 20 70  gregates(&sNC, p
37ee0 45 78 70 72 2d 3e 79 2e 70 57 69 6e 2d 3e 70 46  Expr->y.pWin->pF
37ef0 69 6c 74 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a  ilter);.      }.
37f00 23 65 6e 64 69 66 0a 20 20 20 20 20 20 73 4e 43  #endif.      sNC
37f10 2e 6e 63 46 6c 61 67 73 20 26 3d 20 7e 4e 43 5f  .ncFlags &= ~NC_
37f20 49 6e 41 67 67 46 75 6e 63 3b 0a 20 20 20 20 7d  InAggFunc;.    }
37f30 0a 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 6d 78  .    sAggInfo.mx
37f40 52 65 67 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d  Reg = pParse->nM
37f50 65 6d 3b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e  em;.    if( db->
37f60 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 67  mallocFailed ) g
37f70 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  oto select_end;.
37f80 23 69 66 20 53 45 4c 45 43 54 54 52 41 43 45 5f  #if SELECTTRACE_
37f90 45 4e 41 42 4c 45 44 0a 20 20 20 20 69 66 28 20  ENABLED.    if( 
37fa0 73 71 6c 69 74 65 33 53 65 6c 65 63 74 54 72 61  sqlite3SelectTra
37fb0 63 65 20 26 20 30 78 34 30 30 20 29 7b 0a 20 20  ce & 0x400 ){.  
37fc0 20 20 20 20 69 6e 74 20 69 69 3b 0a 20 20 20 20      int ii;.    
37fd0 20 20 53 45 4c 45 43 54 54 52 41 43 45 28 30 78    SELECTTRACE(0x
37fe0 34 30 30 2c 70 50 61 72 73 65 2c 70 2c 28 22 41  400,pParse,p,("A
37ff0 66 74 65 72 20 61 67 67 72 65 67 61 74 65 20 61  fter aggregate a
38000 6e 61 6c 79 73 69 73 3a 5c 6e 22 29 29 3b 0a 20  nalysis:\n"));. 
38010 20 20 20 20 20 73 71 6c 69 74 65 33 54 72 65 65       sqlite3Tree
38020 56 69 65 77 53 65 6c 65 63 74 28 30 2c 20 70 2c  ViewSelect(0, p,
38030 20 30 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69   0);.      for(i
38040 69 3d 30 3b 20 69 69 3c 73 41 67 67 49 6e 66 6f  i=0; ii<sAggInfo
38050 2e 6e 43 6f 6c 75 6d 6e 3b 20 69 69 2b 2b 29 7b  .nColumn; ii++){
38060 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
38070 44 65 62 75 67 50 72 69 6e 74 66 28 22 61 67 67  DebugPrintf("agg
38080 2d 63 6f 6c 75 6d 6e 5b 25 64 5d 20 69 4d 65 6d  -column[%d] iMem
38090 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  =%d\n",.        
380a0 20 20 20 20 69 69 2c 20 73 41 67 67 49 6e 66 6f      ii, sAggInfo
380b0 2e 61 43 6f 6c 5b 69 69 5d 2e 69 4d 65 6d 29 3b  .aCol[ii].iMem);
380c0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
380d0 54 72 65 65 56 69 65 77 45 78 70 72 28 30 2c 20  TreeViewExpr(0, 
380e0 73 41 67 67 49 6e 66 6f 2e 61 43 6f 6c 5b 69 69  sAggInfo.aCol[ii
380f0 5d 2e 70 45 78 70 72 2c 20 30 29 3b 0a 20 20 20  ].pExpr, 0);.   
38100 20 20 20 7d 0a 20 20 20 20 20 20 66 6f 72 28 69     }.      for(i
38110 69 3d 30 3b 20 69 69 3c 73 41 67 67 49 6e 66 6f  i=0; ii<sAggInfo
38120 2e 6e 46 75 6e 63 3b 20 69 69 2b 2b 29 7b 0a 20  .nFunc; ii++){. 
38130 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65         sqlite3De
38140 62 75 67 50 72 69 6e 74 66 28 22 61 67 67 2d 66  bugPrintf("agg-f
38150 75 6e 63 5b 25 64 5d 3a 20 69 4d 65 6d 3d 25 64  unc[%d]: iMem=%d
38160 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
38170 20 69 69 2c 20 73 41 67 67 49 6e 66 6f 2e 61 46   ii, sAggInfo.aF
38180 75 6e 63 5b 69 69 5d 2e 69 4d 65 6d 29 3b 0a 20  unc[ii].iMem);. 
38190 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 54 72         sqlite3Tr
381a0 65 65 56 69 65 77 45 78 70 72 28 30 2c 20 73 41  eeViewExpr(0, sA
381b0 67 67 49 6e 66 6f 2e 61 46 75 6e 63 5b 69 69 5d  ggInfo.aFunc[ii]
381c0 2e 70 45 78 70 72 2c 20 30 29 3b 0a 20 20 20 20  .pExpr, 0);.    
381d0 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66    }.    }.#endif
381e0 0a 0a 0a 20 20 20 20 2f 2a 20 50 72 6f 63 65 73  ...    /* Proces
381f0 73 69 6e 67 20 66 6f 72 20 61 67 67 72 65 67 61  sing for aggrega
38200 74 65 73 20 77 69 74 68 20 47 52 4f 55 50 20 42  tes with GROUP B
38210 59 20 69 73 20 76 65 72 79 20 64 69 66 66 65 72  Y is very differ
38220 65 6e 74 20 61 6e 64 0a 20 20 20 20 2a 2a 20 6d  ent and.    ** m
38230 75 63 68 20 6d 6f 72 65 20 63 6f 6d 70 6c 65 78  uch more complex
38240 20 74 68 61 6e 20 61 67 67 72 65 67 61 74 65 73   than aggregates
38250 20 77 69 74 68 6f 75 74 20 61 20 47 52 4f 55 50   without a GROUP
38260 20 42 59 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20   BY..    */.    
38270 69 66 28 20 70 47 72 6f 75 70 42 79 20 29 7b 0a  if( pGroupBy ){.
38280 20 20 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70        KeyInfo *p
38290 4b 65 79 49 6e 66 6f 3b 20 20 2f 2a 20 4b 65 79  KeyInfo;  /* Key
382a0 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ing information 
382b0 66 6f 72 20 74 68 65 20 67 72 6f 75 70 20 62 79  for the group by
382c0 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20 20   clause */.     
382d0 20 69 6e 74 20 61 64 64 72 31 3b 20 20 20 20 20   int addr1;     
382e0 20 20 20 20 20 2f 2a 20 41 2d 76 73 2d 42 20 63       /* A-vs-B c
382f0 6f 6d 70 61 72 69 73 69 6f 6e 20 6a 75 6d 70 20  omparision jump 
38300 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64  */.      int add
38310 72 4f 75 74 70 75 74 52 6f 77 3b 20 20 2f 2a 20  rOutputRow;  /* 
38320 53 74 61 72 74 20 6f 66 20 73 75 62 72 6f 75 74  Start of subrout
38330 69 6e 65 20 74 68 61 74 20 6f 75 74 70 75 74 73  ine that outputs
38340 20 61 20 72 65 73 75 6c 74 20 72 6f 77 20 2a 2f   a result row */
38350 0a 20 20 20 20 20 20 69 6e 74 20 72 65 67 4f 75  .      int regOu
38360 74 70 75 74 52 6f 77 3b 20 20 20 2f 2a 20 52 65  tputRow;   /* Re
38370 74 75 72 6e 20 61 64 64 72 65 73 73 20 72 65 67  turn address reg
38380 69 73 74 65 72 20 66 6f 72 20 6f 75 74 70 75 74  ister for output
38390 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20   subroutine */. 
383a0 20 20 20 20 20 69 6e 74 20 61 64 64 72 53 65 74       int addrSet
383b0 41 62 6f 72 74 3b 20 20 20 2f