/ Hex Artifact Content
Login

Artifact 2890d92d5d8a4b00092a34dfe03d0acf752972c2ec3443ee519d54f3b18e286b:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ******.** This f
0180: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 43 20 63  ile contains C c
0190: 6f 64 65 20 72 6f 75 74 69 6e 65 73 20 74 68 61  ode routines tha
01a0: 74 20 61 72 65 20 63 61 6c 6c 65 64 20 62 79 20  t are called by 
01b0: 74 68 65 20 70 61 72 73 65 72 0a 2a 2a 20 74 6f  the parser.** to
01c0: 20 68 61 6e 64 6c 65 20 53 45 4c 45 43 54 20 73   handle SELECT s
01d0: 74 61 74 65 6d 65 6e 74 73 20 69 6e 20 53 51 4c  tatements in SQL
01e0: 69 74 65 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65  ite..*/.#include
01f0: 20 22 73 71 6c 69 74 65 49 6e 74 2e 68 22 0a 0a   "sqliteInt.h"..
0200: 2f 2a 0a 2a 2a 20 54 72 61 63 65 20 6f 75 74 70  /*.** Trace outp
0210: 75 74 20 6d 61 63 72 6f 73 0a 2a 2f 0a 23 69 66  ut macros.*/.#if
0220: 20 53 45 4c 45 43 54 54 52 41 43 45 5f 45 4e 41   SELECTTRACE_ENA
0230: 42 4c 45 44 0a 2f 2a 2a 2a 2f 20 69 6e 74 20 73  BLED./***/ int s
0240: 71 6c 69 74 65 33 53 65 6c 65 63 74 54 72 61 63  qlite3SelectTrac
0250: 65 20 3d 20 30 3b 0a 23 20 64 65 66 69 6e 65 20  e = 0;.# define 
0260: 53 45 4c 45 43 54 54 52 41 43 45 28 4b 2c 50 2c  SELECTTRACE(K,P,
0270: 53 2c 58 29 20 20 5c 0a 20 20 69 66 28 73 71 6c  S,X)  \.  if(sql
0280: 69 74 65 33 53 65 6c 65 63 74 54 72 61 63 65 26  ite3SelectTrace&
0290: 28 4b 29 29 20 20 20 5c 0a 20 20 20 20 73 71 6c  (K))   \.    sql
02a0: 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
02b0: 22 25 75 2f 25 64 2f 25 70 3a 20 22 2c 28 53 29  "%u/%d/%p: ",(S)
02c0: 2d 3e 73 65 6c 49 64 2c 28 50 29 2d 3e 61 64 64  ->selId,(P)->add
02d0: 72 45 78 70 6c 61 69 6e 2c 28 53 29 29 2c 5c 0a  rExplain,(S)),\.
02e0: 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
02f0: 50 72 69 6e 74 66 20 58 0a 23 65 6c 73 65 0a 23  Printf X.#else.#
0300: 20 64 65 66 69 6e 65 20 53 45 4c 45 43 54 54 52   define SELECTTR
0310: 41 43 45 28 4b 2c 50 2c 53 2c 58 29 0a 23 65 6e  ACE(K,P,S,X).#en
0320: 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69  dif.../*.** An i
0330: 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66  nstance of the f
0340: 6f 6c 6c 6f 77 69 6e 67 20 6f 62 6a 65 63 74 20  ollowing object 
0350: 69 73 20 75 73 65 64 20 74 6f 20 72 65 63 6f 72  is used to recor
0360: 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62  d information ab
0370: 6f 75 74 0a 2a 2a 20 68 6f 77 20 74 6f 20 70 72  out.** how to pr
0380: 6f 63 65 73 73 20 74 68 65 20 44 49 53 54 49 4e  ocess the DISTIN
0390: 43 54 20 6b 65 79 77 6f 72 64 2c 20 74 6f 20 73  CT keyword, to s
03a0: 69 6d 70 6c 69 66 79 20 70 61 73 73 69 6e 67 20  implify passing 
03b0: 74 68 61 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  that information
03c0: 0a 2a 2a 20 69 6e 74 6f 20 74 68 65 20 73 65 6c  .** into the sel
03d0: 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 29 20 72  ectInnerLoop() r
03e0: 6f 75 74 69 6e 65 2e 0a 2a 2f 0a 74 79 70 65 64  outine..*/.typed
03f0: 65 66 20 73 74 72 75 63 74 20 44 69 73 74 69 6e  ef struct Distin
0400: 63 74 43 74 78 20 44 69 73 74 69 6e 63 74 43 74  ctCtx DistinctCt
0410: 78 3b 0a 73 74 72 75 63 74 20 44 69 73 74 69 6e  x;.struct Distin
0420: 63 74 43 74 78 20 7b 0a 20 20 75 38 20 69 73 54  ctCtx {.  u8 isT
0430: 6e 63 74 3b 20 20 20 20 20 20 2f 2a 20 54 72 75  nct;      /* Tru
0440: 65 20 69 66 20 74 68 65 20 44 49 53 54 49 4e 43  e if the DISTINC
0450: 54 20 6b 65 79 77 6f 72 64 20 69 73 20 70 72 65  T keyword is pre
0460: 73 65 6e 74 20 2a 2f 0a 20 20 75 38 20 65 54 6e  sent */.  u8 eTn
0470: 63 74 54 79 70 65 3b 20 20 20 2f 2a 20 4f 6e 65  ctType;   /* One
0480: 20 6f 66 20 74 68 65 20 57 48 45 52 45 5f 44 49   of the WHERE_DI
0490: 53 54 49 4e 43 54 5f 2a 20 6f 70 65 72 61 74 6f  STINCT_* operato
04a0: 72 73 20 2a 2f 0a 20 20 69 6e 74 20 74 61 62 54  rs */.  int tabT
04b0: 6e 63 74 3b 20 20 20 20 2f 2a 20 45 70 68 65 6d  nct;    /* Ephem
04c0: 65 72 61 6c 20 74 61 62 6c 65 20 75 73 65 64 20  eral table used 
04d0: 66 6f 72 20 44 49 53 54 49 4e 43 54 20 70 72 6f  for DISTINCT pro
04e0: 63 65 73 73 69 6e 67 20 2a 2f 0a 20 20 69 6e 74  cessing */.  int
04f0: 20 61 64 64 72 54 6e 63 74 3b 20 20 20 2f 2a 20   addrTnct;   /* 
0500: 41 64 64 72 65 73 73 20 6f 66 20 4f 50 5f 4f 70  Address of OP_Op
0510: 65 6e 45 70 68 65 6d 65 72 61 6c 20 6f 70 63 6f  enEphemeral opco
0520: 64 65 20 66 6f 72 20 74 61 62 54 6e 63 74 20 2a  de for tabTnct *
0530: 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69  /.};../*.** An i
0540: 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66  nstance of the f
0550: 6f 6c 6c 6f 77 69 6e 67 20 6f 62 6a 65 63 74 20  ollowing object 
0560: 69 73 20 75 73 65 64 20 74 6f 20 72 65 63 6f 72  is used to recor
0570: 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62  d information ab
0580: 6f 75 74 0a 2a 2a 20 74 68 65 20 4f 52 44 45 52  out.** the ORDER
0590: 20 42 59 20 28 6f 72 20 47 52 4f 55 50 20 42 59   BY (or GROUP BY
05a0: 29 20 63 6c 61 75 73 65 20 6f 66 20 71 75 65 72  ) clause of quer
05b0: 79 20 69 73 20 62 65 69 6e 67 20 63 6f 64 65 64  y is being coded
05c0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 44 65 66  ..**.** The aDef
05d0: 65 72 5b 5d 20 61 72 72 61 79 20 69 73 20 75 73  er[] array is us
05e0: 65 64 20 62 79 20 74 68 65 20 73 6f 72 74 65 72  ed by the sorter
05f0: 2d 72 65 66 65 72 65 6e 63 65 73 20 6f 70 74 69  -references opti
0600: 6d 69 7a 61 74 69 6f 6e 2e 20 46 6f 72 0a 2a 2a  mization. For.**
0610: 20 65 78 61 6d 70 6c 65 2c 20 61 73 73 75 6d 69   example, assumi
0620: 6e 67 20 74 68 65 72 65 20 69 73 20 6e 6f 20 69  ng there is no i
0630: 6e 64 65 78 20 74 68 61 74 20 63 61 6e 20 62 65  ndex that can be
0640: 20 75 73 65 64 20 66 6f 72 20 74 68 65 20 4f 52   used for the OR
0650: 44 45 52 20 42 59 2c 0a 2a 2a 20 66 6f 72 20 74  DER BY,.** for t
0660: 68 65 20 71 75 65 72 79 3a 0a 2a 2a 0a 2a 2a 20  he query:.**.** 
0670: 20 20 20 20 53 45 4c 45 43 54 20 61 2c 20 62 69      SELECT a, bi
0680: 67 62 6c 6f 62 20 46 52 4f 4d 20 74 31 20 4f 52  gblob FROM t1 OR
0690: 44 45 52 20 42 59 20 61 20 4c 49 4d 49 54 20 31  DER BY a LIMIT 1
06a0: 30 3b 0a 2a 2a 0a 2a 2a 20 69 74 20 6d 61 79 20  0;.**.** it may 
06b0: 62 65 20 6d 6f 72 65 20 65 66 66 69 63 69 65 6e  be more efficien
06c0: 74 20 74 6f 20 61 64 64 20 6a 75 73 74 20 74 68  t to add just th
06d0: 65 20 22 61 22 20 76 61 6c 75 65 73 20 74 6f 20  e "a" values to 
06e0: 74 68 65 20 73 6f 72 74 65 72 2c 20 61 6e 64 0a  the sorter, and.
06f0: 2a 2a 20 72 65 74 72 69 65 76 65 20 74 68 65 20  ** retrieve the 
0700: 61 73 73 6f 63 69 61 74 65 64 20 22 62 69 67 62  associated "bigb
0710: 6c 6f 62 22 20 76 61 6c 75 65 73 20 64 69 72 65  lob" values dire
0720: 63 74 6c 79 20 66 72 6f 6d 20 74 61 62 6c 65 20  ctly from table 
0730: 74 31 20 61 73 20 74 68 65 0a 2a 2a 20 31 30 20  t1 as the.** 10 
0740: 73 6d 61 6c 6c 65 73 74 20 22 61 22 20 76 61 6c  smallest "a" val
0750: 75 65 73 20 61 72 65 20 65 78 74 72 61 63 74 65  ues are extracte
0760: 64 20 66 72 6f 6d 20 74 68 65 20 73 6f 72 74 65  d from the sorte
0770: 72 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68  r..**.** When th
0780: 65 20 73 6f 72 74 65 72 2d 72 65 66 65 72 65 6e  e sorter-referen
0790: 63 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20  ce optimization 
07a0: 69 73 20 75 73 65 64 2c 20 74 68 65 72 65 20 69  is used, there i
07b0: 73 20 6f 6e 65 20 65 6e 74 72 79 20 69 6e 20 74  s one entry in t
07c0: 68 65 0a 2a 2a 20 61 44 65 66 65 72 5b 5d 20 61  he.** aDefer[] a
07d0: 72 72 61 79 20 66 6f 72 20 65 61 63 68 20 64 61  rray for each da
07e0: 74 61 62 61 73 65 20 74 61 62 6c 65 20 74 68 61  tabase table tha
07f0: 74 20 6d 61 79 20 62 65 20 72 65 61 64 20 61 73  t may be read as
0800: 20 76 61 6c 75 65 73 20 61 72 65 0a 2a 2a 20 65   values are.** e
0810: 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20 74 68  xtracted from th
0820: 65 20 73 6f 72 74 65 72 2e 0a 2a 2f 0a 74 79 70  e sorter..*/.typ
0830: 65 64 65 66 20 73 74 72 75 63 74 20 53 6f 72 74  edef struct Sort
0840: 43 74 78 20 53 6f 72 74 43 74 78 3b 0a 73 74 72  Ctx SortCtx;.str
0850: 75 63 74 20 53 6f 72 74 43 74 78 20 7b 0a 20 20  uct SortCtx {.  
0860: 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72  ExprList *pOrder
0870: 42 79 3b 20 20 20 2f 2a 20 54 68 65 20 4f 52 44  By;   /* The ORD
0880: 45 52 20 42 59 20 28 6f 72 20 47 52 4f 55 50 20  ER BY (or GROUP 
0890: 42 59 20 63 6c 61 75 73 65 29 20 2a 2f 0a 20 20  BY clause) */.  
08a0: 69 6e 74 20 6e 4f 42 53 61 74 3b 20 20 20 20 20  int nOBSat;     
08b0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
08c0: 6f 66 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d  of ORDER BY term
08d0: 73 20 73 61 74 69 73 66 69 65 64 20 62 79 20 69  s satisfied by i
08e0: 6e 64 69 63 65 73 20 2a 2f 0a 20 20 69 6e 74 20  ndices */.  int 
08f0: 69 45 43 75 72 73 6f 72 3b 20 20 20 20 20 20 20  iECursor;       
0900: 20 20 2f 2a 20 43 75 72 73 6f 72 20 6e 75 6d 62    /* Cursor numb
0910: 65 72 20 66 6f 72 20 74 68 65 20 73 6f 72 74 65  er for the sorte
0920: 72 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 52 65  r */.  int regRe
0930: 74 75 72 6e 3b 20 20 20 20 20 20 20 20 2f 2a 20  turn;        /* 
0940: 52 65 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67  Register holding
0950: 20 62 6c 6f 63 6b 2d 6f 75 74 70 75 74 20 72 65   block-output re
0960: 74 75 72 6e 20 61 64 64 72 65 73 73 20 2a 2f 0a  turn address */.
0970: 20 20 69 6e 74 20 6c 61 62 65 6c 42 6b 4f 75 74    int labelBkOut
0980: 3b 20 20 20 20 20 20 20 2f 2a 20 53 74 61 72 74  ;       /* Start
0990: 20 6c 61 62 65 6c 20 66 6f 72 20 74 68 65 20 62   label for the b
09a0: 6c 6f 63 6b 2d 6f 75 74 70 75 74 20 73 75 62 72  lock-output subr
09b0: 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20  outine */.  int 
09c0: 61 64 64 72 53 6f 72 74 49 6e 64 65 78 3b 20 20  addrSortIndex;  
09d0: 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20    /* Address of 
09e0: 74 68 65 20 4f 50 5f 53 6f 72 74 65 72 4f 70 65  the OP_SorterOpe
09f0: 6e 20 6f 72 20 4f 50 5f 4f 70 65 6e 45 70 68 65  n or OP_OpenEphe
0a00: 6d 65 72 61 6c 20 2a 2f 0a 20 20 69 6e 74 20 6c  meral */.  int l
0a10: 61 62 65 6c 44 6f 6e 65 3b 20 20 20 20 20 20 20  abelDone;       
0a20: 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 77 68   /* Jump here wh
0a30: 65 6e 20 64 6f 6e 65 2c 20 65 78 3a 20 4c 49 4d  en done, ex: LIM
0a40: 49 54 20 72 65 61 63 68 65 64 20 2a 2f 0a 20 20  IT reached */.  
0a50: 69 6e 74 20 6c 61 62 65 6c 4f 42 4c 6f 70 74 3b  int labelOBLopt;
0a60: 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65        /* Jump he
0a70: 72 65 20 77 68 65 6e 20 73 6f 72 74 65 72 20 69  re when sorter i
0a80: 73 20 66 75 6c 6c 20 2a 2f 0a 20 20 75 38 20 73  s full */.  u8 s
0a90: 6f 72 74 46 6c 61 67 73 3b 20 20 20 20 20 20 20  ortFlags;       
0aa0: 20 20 2f 2a 20 5a 65 72 6f 20 6f 72 20 6d 6f 72    /* Zero or mor
0ab0: 65 20 53 4f 52 54 46 4c 41 47 5f 2a 20 62 69 74  e SORTFLAG_* bit
0ac0: 73 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  s */.#ifdef SQLI
0ad0: 54 45 5f 45 4e 41 42 4c 45 5f 53 4f 52 54 45 52  TE_ENABLE_SORTER
0ae0: 5f 52 45 46 45 52 45 4e 43 45 53 0a 20 20 75 38  _REFERENCES.  u8
0af0: 20 6e 44 65 66 65 72 3b 20 20 20 20 20 20 20 20   nDefer;        
0b00: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
0b10: 20 76 61 6c 69 64 20 65 6e 74 72 69 65 73 20 69   valid entries i
0b20: 6e 20 61 44 65 66 65 72 5b 5d 20 2a 2f 0a 20 20  n aDefer[] */.  
0b30: 73 74 72 75 63 74 20 44 65 66 65 72 72 65 64 43  struct DeferredC
0b40: 73 72 20 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a  sr {.    Table *
0b50: 70 54 61 62 3b 20 20 20 20 20 20 20 20 2f 2a 20  pTab;        /* 
0b60: 54 61 62 6c 65 20 64 65 66 69 6e 69 74 69 6f 6e  Table definition
0b70: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 43 73 72   */.    int iCsr
0b80: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43  ;           /* C
0b90: 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 66 6f 72  ursor number for
0ba0: 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 69 6e   table */.    in
0bb0: 74 20 6e 4b 65 79 3b 20 20 20 20 20 20 20 20 20  t nKey;         
0bc0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 50    /* Number of P
0bd0: 4b 20 63 6f 6c 75 6d 6e 73 20 66 6f 72 20 74 61  K columns for ta
0be0: 62 6c 65 20 70 54 61 62 20 28 3e 3d 31 29 20 2a  ble pTab (>=1) *
0bf0: 2f 0a 20 20 7d 20 61 44 65 66 65 72 5b 34 5d 3b  /.  } aDefer[4];
0c00: 0a 23 65 6e 64 69 66 0a 20 20 73 74 72 75 63 74  .#endif.  struct
0c10: 20 52 6f 77 4c 6f 61 64 49 6e 66 6f 20 2a 70 44   RowLoadInfo *pD
0c20: 65 66 65 72 72 65 64 52 6f 77 4c 6f 61 64 3b 20  eferredRowLoad; 
0c30: 20 2f 2a 20 44 65 66 65 72 72 65 64 20 72 6f 77   /* Deferred row
0c40: 20 6c 6f 61 64 69 6e 67 20 69 6e 66 6f 20 6f 72   loading info or
0c50: 20 4e 55 4c 4c 20 2a 2f 0a 7d 3b 0a 23 64 65 66   NULL */.};.#def
0c60: 69 6e 65 20 53 4f 52 54 46 4c 41 47 5f 55 73 65  ine SORTFLAG_Use
0c70: 53 6f 72 74 65 72 20 20 30 78 30 31 20 20 20 2f  Sorter  0x01   /
0c80: 2a 20 55 73 65 20 53 6f 72 74 65 72 4f 70 65 6e  * Use SorterOpen
0c90: 20 69 6e 73 74 65 61 64 20 6f 66 20 4f 70 65 6e   instead of Open
0ca0: 45 70 68 65 6d 65 72 61 6c 20 2a 2f 0a 0a 2f 2a  Ephemeral */../*
0cb0: 0a 2a 2a 20 44 65 6c 65 74 65 20 61 6c 6c 20 74  .** Delete all t
0cc0: 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 20  he content of a 
0cd0: 53 65 6c 65 63 74 20 73 74 72 75 63 74 75 72 65  Select structure
0ce0: 2e 20 20 44 65 61 6c 6c 6f 63 61 74 65 20 74 68  .  Deallocate th
0cf0: 65 20 73 74 72 75 63 74 75 72 65 0a 2a 2a 20 69  e structure.** i
0d00: 74 73 65 6c 66 20 6f 6e 6c 79 20 69 66 20 62 46  tself only if bF
0d10: 72 65 65 20 69 73 20 74 72 75 65 2e 0a 2a 2f 0a  ree is true..*/.
0d20: 73 74 61 74 69 63 20 76 6f 69 64 20 63 6c 65 61  static void clea
0d30: 72 53 65 6c 65 63 74 28 73 71 6c 69 74 65 33 20  rSelect(sqlite3 
0d40: 2a 64 62 2c 20 53 65 6c 65 63 74 20 2a 70 2c 20  *db, Select *p, 
0d50: 69 6e 74 20 62 46 72 65 65 29 7b 0a 20 20 77 68  int bFree){.  wh
0d60: 69 6c 65 28 20 70 20 29 7b 0a 20 20 20 20 53 65  ile( p ){.    Se
0d70: 6c 65 63 74 20 2a 70 50 72 69 6f 72 20 3d 20 70  lect *pPrior = p
0d80: 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 73 71  ->pPrior;.    sq
0d90: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c  lite3ExprListDel
0da0: 65 74 65 28 64 62 2c 20 70 2d 3e 70 45 4c 69 73  ete(db, p->pELis
0db0: 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 53  t);.    sqlite3S
0dc0: 72 63 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c  rcListDelete(db,
0dd0: 20 70 2d 3e 70 53 72 63 29 3b 0a 20 20 20 20 73   p->pSrc);.    s
0de0: 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
0df0: 28 64 62 2c 20 70 2d 3e 70 57 68 65 72 65 29 3b  (db, p->pWhere);
0e00: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
0e10: 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70  ListDelete(db, p
0e20: 2d 3e 70 47 72 6f 75 70 42 79 29 3b 0a 20 20 20  ->pGroupBy);.   
0e30: 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
0e40: 74 65 28 64 62 2c 20 70 2d 3e 70 48 61 76 69 6e  te(db, p->pHavin
0e50: 67 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  g);.    sqlite3E
0e60: 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62  xprListDelete(db
0e70: 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79 29 3b 0a  , p->pOrderBy);.
0e80: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44      sqlite3ExprD
0e90: 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 4c 69  elete(db, p->pLi
0ea0: 6d 69 74 29 3b 0a 23 69 66 6e 64 65 66 20 53 51  mit);.#ifndef SQ
0eb0: 4c 49 54 45 5f 4f 4d 49 54 5f 57 49 4e 44 4f 57  LITE_OMIT_WINDOW
0ec0: 46 55 4e 43 0a 20 20 20 20 69 66 28 20 4f 4b 5f  FUNC.    if( OK_
0ed0: 49 46 5f 41 4c 57 41 59 53 5f 54 52 55 45 28 70  IF_ALWAYS_TRUE(p
0ee0: 2d 3e 70 57 69 6e 44 65 66 6e 29 20 29 7b 0a 20  ->pWinDefn) ){. 
0ef0: 20 20 20 20 20 73 71 6c 69 74 65 33 57 69 6e 64       sqlite3Wind
0f00: 6f 77 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c  owListDelete(db,
0f10: 20 70 2d 3e 70 57 69 6e 44 65 66 6e 29 3b 0a 20   p->pWinDefn);. 
0f20: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
0f30: 69 66 28 20 4f 4b 5f 49 46 5f 41 4c 57 41 59 53  if( OK_IF_ALWAYS
0f40: 5f 54 52 55 45 28 70 2d 3e 70 57 69 74 68 29 20  _TRUE(p->pWith) 
0f50: 29 20 73 71 6c 69 74 65 33 57 69 74 68 44 65 6c  ) sqlite3WithDel
0f60: 65 74 65 28 64 62 2c 20 70 2d 3e 70 57 69 74 68  ete(db, p->pWith
0f70: 29 3b 0a 20 20 20 20 69 66 28 20 62 46 72 65 65  );.    if( bFree
0f80: 20 29 20 73 71 6c 69 74 65 33 44 62 46 72 65 65   ) sqlite3DbFree
0f90: 4e 4e 28 64 62 2c 20 70 29 3b 0a 20 20 20 20 70  NN(db, p);.    p
0fa0: 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20 20 62   = pPrior;.    b
0fb0: 46 72 65 65 20 3d 20 31 3b 0a 20 20 7d 0a 7d 0a  Free = 1;.  }.}.
0fc0: 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a  ./*.** Initializ
0fd0: 65 20 61 20 53 65 6c 65 63 74 44 65 73 74 20 73  e a SelectDest s
0fe0: 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 76 6f 69  tructure..*/.voi
0ff0: 64 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44  d sqlite3SelectD
1000: 65 73 74 49 6e 69 74 28 53 65 6c 65 63 74 44 65  estInit(SelectDe
1010: 73 74 20 2a 70 44 65 73 74 2c 20 69 6e 74 20 65  st *pDest, int e
1020: 44 65 73 74 2c 20 69 6e 74 20 69 50 61 72 6d 29  Dest, int iParm)
1030: 7b 0a 20 20 70 44 65 73 74 2d 3e 65 44 65 73 74  {.  pDest->eDest
1040: 20 3d 20 28 75 38 29 65 44 65 73 74 3b 0a 20 20   = (u8)eDest;.  
1050: 70 44 65 73 74 2d 3e 69 53 44 50 61 72 6d 20 3d  pDest->iSDParm =
1060: 20 69 50 61 72 6d 3b 0a 20 20 70 44 65 73 74 2d   iParm;.  pDest-
1070: 3e 7a 41 66 66 53 64 73 74 20 3d 20 30 3b 0a 20  >zAffSdst = 0;. 
1080: 20 70 44 65 73 74 2d 3e 69 53 64 73 74 20 3d 20   pDest->iSdst = 
1090: 30 3b 0a 20 20 70 44 65 73 74 2d 3e 6e 53 64 73  0;.  pDest->nSds
10a0: 74 20 3d 20 30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  t = 0;.}.../*.**
10b0: 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20   Allocate a new 
10c0: 53 65 6c 65 63 74 20 73 74 72 75 63 74 75 72 65  Select structure
10d0: 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20 70 6f   and return a po
10e0: 69 6e 74 65 72 20 74 6f 20 74 68 61 74 0a 2a 2a  inter to that.**
10f0: 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 53   structure..*/.S
1100: 65 6c 65 63 74 20 2a 73 71 6c 69 74 65 33 53 65  elect *sqlite3Se
1110: 6c 65 63 74 4e 65 77 28 0a 20 20 50 61 72 73 65  lectNew(.  Parse
1120: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
1130: 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
1140: 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  ext */.  ExprLis
1150: 74 20 2a 70 45 4c 69 73 74 2c 20 20 20 20 20 2f  t *pEList,     /
1160: 2a 20 77 68 69 63 68 20 63 6f 6c 75 6d 6e 73 20  * which columns 
1170: 74 6f 20 69 6e 63 6c 75 64 65 20 69 6e 20 74 68  to include in th
1180: 65 20 72 65 73 75 6c 74 20 2a 2f 0a 20 20 53 72  e result */.  Sr
1190: 63 4c 69 73 74 20 2a 70 53 72 63 2c 20 20 20 20  cList *pSrc,    
11a0: 20 20 20 20 2f 2a 20 74 68 65 20 46 52 4f 4d 20      /* the FROM 
11b0: 63 6c 61 75 73 65 20 2d 2d 20 77 68 69 63 68 20  clause -- which 
11c0: 74 61 62 6c 65 73 20 74 6f 20 73 63 61 6e 20 2a  tables to scan *
11d0: 2f 0a 20 20 45 78 70 72 20 2a 70 57 68 65 72 65  /.  Expr *pWhere
11e0: 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 74 68 65  ,         /* the
11f0: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f   WHERE clause */
1200: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 47 72  .  ExprList *pGr
1210: 6f 75 70 42 79 2c 20 20 20 2f 2a 20 74 68 65 20  oupBy,   /* the 
1220: 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 20  GROUP BY clause 
1230: 2a 2f 0a 20 20 45 78 70 72 20 2a 70 48 61 76 69  */.  Expr *pHavi
1240: 6e 67 2c 20 20 20 20 20 20 20 20 2f 2a 20 74 68  ng,        /* th
1250: 65 20 48 41 56 49 4e 47 20 63 6c 61 75 73 65 20  e HAVING clause 
1260: 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
1270: 4f 72 64 65 72 42 79 2c 20 20 20 2f 2a 20 74 68  OrderBy,   /* th
1280: 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
1290: 65 20 2a 2f 0a 20 20 75 33 32 20 73 65 6c 46 6c  e */.  u32 selFl
12a0: 61 67 73 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  ags,         /* 
12b0: 46 6c 61 67 20 70 61 72 61 6d 65 74 65 72 73 2c  Flag parameters,
12c0: 20 73 75 63 68 20 61 73 20 53 46 5f 44 69 73 74   such as SF_Dist
12d0: 69 6e 63 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a  inct */.  Expr *
12e0: 70 4c 69 6d 69 74 20 20 20 20 20 20 20 20 20 20  pLimit          
12f0: 2f 2a 20 4c 49 4d 49 54 20 76 61 6c 75 65 2e 20  /* LIMIT value. 
1300: 20 4e 55 4c 4c 20 6d 65 61 6e 73 20 6e 6f 74 20   NULL means not 
1310: 75 73 65 64 20 2a 2f 0a 29 7b 0a 20 20 53 65 6c  used */.){.  Sel
1320: 65 63 74 20 2a 70 4e 65 77 3b 0a 20 20 53 65 6c  ect *pNew;.  Sel
1330: 65 63 74 20 73 74 61 6e 64 69 6e 3b 0a 20 20 70  ect standin;.  p
1340: 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  New = sqlite3DbM
1350: 61 6c 6c 6f 63 52 61 77 4e 4e 28 70 50 61 72 73  allocRawNN(pPars
1360: 65 2d 3e 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70  e->db, sizeof(*p
1370: 4e 65 77 29 20 29 3b 0a 20 20 69 66 28 20 70 4e  New) );.  if( pN
1380: 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73 73  ew==0 ){.    ass
1390: 65 72 74 28 20 70 50 61 72 73 65 2d 3e 64 62 2d  ert( pParse->db-
13a0: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b  >mallocFailed );
13b0: 0a 20 20 20 20 70 4e 65 77 20 3d 20 26 73 74 61  .    pNew = &sta
13c0: 6e 64 69 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20  ndin;.  }.  if( 
13d0: 70 45 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20  pEList==0 ){.   
13e0: 20 70 45 4c 69 73 74 20 3d 20 73 71 6c 69 74 65   pEList = sqlite
13f0: 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28  3ExprListAppend(
1400: 70 50 61 72 73 65 2c 20 30 2c 0a 20 20 20 20 20  pParse, 0,.     
1410: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1420: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
1430: 6c 69 74 65 33 45 78 70 72 28 70 50 61 72 73 65  lite3Expr(pParse
1440: 2d 3e 64 62 2c 54 4b 5f 41 53 54 45 52 49 53 4b  ->db,TK_ASTERISK
1450: 2c 30 29 29 3b 0a 20 20 7d 0a 20 20 70 4e 65 77  ,0));.  }.  pNew
1460: 2d 3e 70 45 4c 69 73 74 20 3d 20 70 45 4c 69 73  ->pEList = pELis
1470: 74 3b 0a 20 20 70 4e 65 77 2d 3e 6f 70 20 3d 20  t;.  pNew->op = 
1480: 54 4b 5f 53 45 4c 45 43 54 3b 0a 20 20 70 4e 65  TK_SELECT;.  pNe
1490: 77 2d 3e 73 65 6c 46 6c 61 67 73 20 3d 20 73 65  w->selFlags = se
14a0: 6c 46 6c 61 67 73 3b 0a 20 20 70 4e 65 77 2d 3e  lFlags;.  pNew->
14b0: 69 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 70 4e  iLimit = 0;.  pN
14c0: 65 77 2d 3e 69 4f 66 66 73 65 74 20 3d 20 30 3b  ew->iOffset = 0;
14d0: 0a 20 20 70 4e 65 77 2d 3e 73 65 6c 49 64 20 3d  .  pNew->selId =
14e0: 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 53 65 6c 65   ++pParse->nSele
14f0: 63 74 3b 0a 20 20 70 4e 65 77 2d 3e 61 64 64 72  ct;.  pNew->addr
1500: 4f 70 65 6e 45 70 68 6d 5b 30 5d 20 3d 20 2d 31  OpenEphm[0] = -1
1510: 3b 0a 20 20 70 4e 65 77 2d 3e 61 64 64 72 4f 70  ;.  pNew->addrOp
1520: 65 6e 45 70 68 6d 5b 31 5d 20 3d 20 2d 31 3b 0a  enEphm[1] = -1;.
1530: 20 20 70 4e 65 77 2d 3e 6e 53 65 6c 65 63 74 52    pNew->nSelectR
1540: 6f 77 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 53  ow = 0;.  if( pS
1550: 72 63 3d 3d 30 20 29 20 70 53 72 63 20 3d 20 73  rc==0 ) pSrc = s
1560: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65  qlite3DbMallocZe
1570: 72 6f 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 73  ro(pParse->db, s
1580: 69 7a 65 6f 66 28 2a 70 53 72 63 29 29 3b 0a 20  izeof(*pSrc));. 
1590: 20 70 4e 65 77 2d 3e 70 53 72 63 20 3d 20 70 53   pNew->pSrc = pS
15a0: 72 63 3b 0a 20 20 70 4e 65 77 2d 3e 70 57 68 65  rc;.  pNew->pWhe
15b0: 72 65 20 3d 20 70 57 68 65 72 65 3b 0a 20 20 70  re = pWhere;.  p
15c0: 4e 65 77 2d 3e 70 47 72 6f 75 70 42 79 20 3d 20  New->pGroupBy = 
15d0: 70 47 72 6f 75 70 42 79 3b 0a 20 20 70 4e 65 77  pGroupBy;.  pNew
15e0: 2d 3e 70 48 61 76 69 6e 67 20 3d 20 70 48 61 76  ->pHaving = pHav
15f0: 69 6e 67 3b 0a 20 20 70 4e 65 77 2d 3e 70 4f 72  ing;.  pNew->pOr
1600: 64 65 72 42 79 20 3d 20 70 4f 72 64 65 72 42 79  derBy = pOrderBy
1610: 3b 0a 20 20 70 4e 65 77 2d 3e 70 50 72 69 6f 72  ;.  pNew->pPrior
1620: 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 70 4e   = 0;.  pNew->pN
1630: 65 78 74 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d  ext = 0;.  pNew-
1640: 3e 70 4c 69 6d 69 74 20 3d 20 70 4c 69 6d 69 74  >pLimit = pLimit
1650: 3b 0a 20 20 70 4e 65 77 2d 3e 70 57 69 74 68 20  ;.  pNew->pWith 
1660: 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  = 0;.#ifndef SQL
1670: 49 54 45 5f 4f 4d 49 54 5f 57 49 4e 44 4f 57 46  ITE_OMIT_WINDOWF
1680: 55 4e 43 0a 20 20 70 4e 65 77 2d 3e 70 57 69 6e  UNC.  pNew->pWin
1690: 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 70 57   = 0;.  pNew->pW
16a0: 69 6e 44 65 66 6e 20 3d 20 30 3b 0a 23 65 6e 64  inDefn = 0;.#end
16b0: 69 66 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  if.  if( pParse-
16c0: 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
16d0: 64 20 29 20 7b 0a 20 20 20 20 63 6c 65 61 72 53  d ) {.    clearS
16e0: 65 6c 65 63 74 28 70 50 61 72 73 65 2d 3e 64 62  elect(pParse->db
16f0: 2c 20 70 4e 65 77 2c 20 70 4e 65 77 21 3d 26 73  , pNew, pNew!=&s
1700: 74 61 6e 64 69 6e 29 3b 0a 20 20 20 20 70 4e 65  tandin);.    pNe
1710: 77 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a  w = 0;.  }else{.
1720: 20 20 20 20 61 73 73 65 72 74 28 20 70 4e 65 77      assert( pNew
1730: 2d 3e 70 53 72 63 21 3d 30 20 7c 7c 20 70 50 61  ->pSrc!=0 || pPa
1740: 72 73 65 2d 3e 6e 45 72 72 3e 30 20 29 3b 0a 20  rse->nErr>0 );. 
1750: 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 4e 65   }.  assert( pNe
1760: 77 21 3d 26 73 74 61 6e 64 69 6e 20 29 3b 0a 20  w!=&standin );. 
1770: 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a   return pNew;.}.
1780: 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 74  ../*.** Delete t
1790: 68 65 20 67 69 76 65 6e 20 53 65 6c 65 63 74 20  he given Select 
17a0: 73 74 72 75 63 74 75 72 65 20 61 6e 64 20 61 6c  structure and al
17b0: 6c 20 6f 66 20 69 74 73 20 73 75 62 73 74 72 75  l of its substru
17c0: 63 74 75 72 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20  ctures..*/.void 
17d0: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c  sqlite3SelectDel
17e0: 65 74 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  ete(sqlite3 *db,
17f0: 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 69   Select *p){.  i
1800: 66 28 20 4f 4b 5f 49 46 5f 41 4c 57 41 59 53 5f  f( OK_IF_ALWAYS_
1810: 54 52 55 45 28 70 29 20 29 20 63 6c 65 61 72 53  TRUE(p) ) clearS
1820: 65 6c 65 63 74 28 64 62 2c 20 70 2c 20 31 29 3b  elect(db, p, 1);
1830: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
1840: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
1850: 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 53 45 4c  e right-most SEL
1860: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 69 6e  ECT statement in
1870: 20 61 20 63 6f 6d 70 6f 75 6e 64 2e 0a 2a 2f 0a   a compound..*/.
1880: 73 74 61 74 69 63 20 53 65 6c 65 63 74 20 2a 66  static Select *f
1890: 69 6e 64 52 69 67 68 74 6d 6f 73 74 28 53 65 6c  indRightmost(Sel
18a0: 65 63 74 20 2a 70 29 7b 0a 20 20 77 68 69 6c 65  ect *p){.  while
18b0: 28 20 70 2d 3e 70 4e 65 78 74 20 29 20 70 20 3d  ( p->pNext ) p =
18c0: 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 72 65 74   p->pNext;.  ret
18d0: 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn p;.}../*.** 
18e0: 47 69 76 65 6e 20 31 20 74 6f 20 33 20 69 64 65  Given 1 to 3 ide
18f0: 6e 74 69 66 69 65 72 73 20 70 72 65 63 65 64 69  ntifiers precedi
1900: 6e 67 20 74 68 65 20 4a 4f 49 4e 20 6b 65 79 77  ng the JOIN keyw
1910: 6f 72 64 2c 20 64 65 74 65 72 6d 69 6e 65 20 74  ord, determine t
1920: 68 65 0a 2a 2a 20 74 79 70 65 20 6f 66 20 6a 6f  he.** type of jo
1930: 69 6e 2e 20 20 52 65 74 75 72 6e 20 61 6e 20 69  in.  Return an i
1940: 6e 74 65 67 65 72 20 63 6f 6e 73 74 61 6e 74 20  nteger constant 
1950: 74 68 61 74 20 65 78 70 72 65 73 73 65 73 20 74  that expresses t
1960: 68 61 74 20 74 79 70 65 0a 2a 2a 20 69 6e 20 74  hat type.** in t
1970: 65 72 6d 73 20 6f 66 20 74 68 65 20 66 6f 6c 6c  erms of the foll
1980: 6f 77 69 6e 67 20 62 69 74 20 76 61 6c 75 65 73  owing bit values
1990: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 4a 54 5f 49  :.**.**     JT_I
19a0: 4e 4e 45 52 0a 2a 2a 20 20 20 20 20 4a 54 5f 43  NNER.**     JT_C
19b0: 52 4f 53 53 0a 2a 2a 20 20 20 20 20 4a 54 5f 4f  ROSS.**     JT_O
19c0: 55 54 45 52 0a 2a 2a 20 20 20 20 20 4a 54 5f 4e  UTER.**     JT_N
19d0: 41 54 55 52 41 4c 0a 2a 2a 20 20 20 20 20 4a 54  ATURAL.**     JT
19e0: 5f 4c 45 46 54 0a 2a 2a 20 20 20 20 20 4a 54 5f  _LEFT.**     JT_
19f0: 52 49 47 48 54 0a 2a 2a 0a 2a 2a 20 41 20 66 75  RIGHT.**.** A fu
1a00: 6c 6c 20 6f 75 74 65 72 20 6a 6f 69 6e 20 69 73  ll outer join is
1a10: 20 74 68 65 20 63 6f 6d 62 69 6e 61 74 69 6f 6e   the combination
1a20: 20 6f 66 20 4a 54 5f 4c 45 46 54 20 61 6e 64 20   of JT_LEFT and 
1a30: 4a 54 5f 52 49 47 48 54 2e 0a 2a 2a 0a 2a 2a 20  JT_RIGHT..**.** 
1a40: 49 66 20 61 6e 20 69 6c 6c 65 67 61 6c 20 6f 72  If an illegal or
1a50: 20 75 6e 73 75 70 70 6f 72 74 65 64 20 6a 6f 69   unsupported joi
1a60: 6e 20 74 79 70 65 20 69 73 20 73 65 65 6e 2c 20  n type is seen, 
1a70: 74 68 65 6e 20 73 74 69 6c 6c 20 72 65 74 75 72  then still retur
1a80: 6e 0a 2a 2a 20 61 20 6a 6f 69 6e 20 74 79 70 65  n.** a join type
1a90: 2c 20 62 75 74 20 70 75 74 20 61 6e 20 65 72 72  , but put an err
1aa0: 6f 72 20 69 6e 20 74 68 65 20 70 50 61 72 73 65  or in the pParse
1ab0: 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 69   structure..*/.i
1ac0: 6e 74 20 73 71 6c 69 74 65 33 4a 6f 69 6e 54 79  nt sqlite3JoinTy
1ad0: 70 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  pe(Parse *pParse
1ae0: 2c 20 54 6f 6b 65 6e 20 2a 70 41 2c 20 54 6f 6b  , Token *pA, Tok
1af0: 65 6e 20 2a 70 42 2c 20 54 6f 6b 65 6e 20 2a 70  en *pB, Token *p
1b00: 43 29 7b 0a 20 20 69 6e 74 20 6a 6f 69 6e 74 79  C){.  int jointy
1b10: 70 65 20 3d 20 30 3b 0a 20 20 54 6f 6b 65 6e 20  pe = 0;.  Token 
1b20: 2a 61 70 41 6c 6c 5b 33 5d 3b 0a 20 20 54 6f 6b  *apAll[3];.  Tok
1b30: 65 6e 20 2a 70 3b 0a 20 20 20 20 20 20 20 20 20  en *p;.         
1b40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b50: 20 20 20 20 2f 2a 20 20 20 30 31 32 33 34 35 36      /*   0123456
1b60: 37 38 39 20 31 32 33 34 35 36 37 38 39 20 31 32  789 123456789 12
1b70: 33 34 35 36 37 38 39 20 31 32 33 20 2a 2f 0a 20  3456789 123 */. 
1b80: 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68   static const ch
1b90: 61 72 20 7a 4b 65 79 54 65 78 74 5b 5d 20 3d 20  ar zKeyText[] = 
1ba0: 22 6e 61 74 75 72 61 6c 65 66 74 6f 75 74 65 72  "naturaleftouter
1bb0: 69 67 68 74 66 75 6c 6c 69 6e 6e 65 72 63 72 6f  ightfullinnercro
1bc0: 73 73 22 3b 0a 20 20 73 74 61 74 69 63 20 63 6f  ss";.  static co
1bd0: 6e 73 74 20 73 74 72 75 63 74 20 7b 0a 20 20 20  nst struct {.   
1be0: 20 75 38 20 69 3b 20 20 20 20 20 20 20 20 2f 2a   u8 i;        /*
1bf0: 20 42 65 67 69 6e 6e 69 6e 67 20 6f 66 20 6b 65   Beginning of ke
1c00: 79 77 6f 72 64 20 74 65 78 74 20 69 6e 20 7a 4b  yword text in zK
1c10: 65 79 54 65 78 74 5b 5d 20 2a 2f 0a 20 20 20 20  eyText[] */.    
1c20: 75 38 20 6e 43 68 61 72 3b 20 20 20 20 2f 2a 20  u8 nChar;    /* 
1c30: 4c 65 6e 67 74 68 20 6f 66 20 74 68 65 20 6b 65  Length of the ke
1c40: 79 77 6f 72 64 20 69 6e 20 63 68 61 72 61 63 74  yword in charact
1c50: 65 72 73 20 2a 2f 0a 20 20 20 20 75 38 20 63 6f  ers */.    u8 co
1c60: 64 65 3b 20 20 20 20 20 2f 2a 20 4a 6f 69 6e 20  de;     /* Join 
1c70: 74 79 70 65 20 6d 61 73 6b 20 2a 2f 0a 20 20 7d  type mask */.  }
1c80: 20 61 4b 65 79 77 6f 72 64 5b 5d 20 3d 20 7b 0a   aKeyword[] = {.
1c90: 20 20 20 20 2f 2a 20 6e 61 74 75 72 61 6c 20 2a      /* natural *
1ca0: 2f 20 7b 20 30 2c 20 20 37 2c 20 4a 54 5f 4e 41  / { 0,  7, JT_NA
1cb0: 54 55 52 41 4c 20 20 20 20 20 20 20 20 20 20 20  TURAL           
1cc0: 20 20 20 20 20 7d 2c 0a 20 20 20 20 2f 2a 20 6c       },.    /* l
1cd0: 65 66 74 20 20 20 20 2a 2f 20 7b 20 36 2c 20 20  eft    */ { 6,  
1ce0: 34 2c 20 4a 54 5f 4c 45 46 54 7c 4a 54 5f 4f 55  4, JT_LEFT|JT_OU
1cf0: 54 45 52 20 20 20 20 20 20 20 20 20 20 7d 2c 0a  TER          },.
1d00: 20 20 20 20 2f 2a 20 6f 75 74 65 72 20 20 20 2a      /* outer   *
1d10: 2f 20 7b 20 31 30 2c 20 35 2c 20 4a 54 5f 4f 55  / { 10, 5, JT_OU
1d20: 54 45 52 20 20 20 20 20 20 20 20 20 20 20 20 20  TER             
1d30: 20 20 20 20 20 7d 2c 0a 20 20 20 20 2f 2a 20 72       },.    /* r
1d40: 69 67 68 74 20 20 20 2a 2f 20 7b 20 31 34 2c 20  ight   */ { 14, 
1d50: 35 2c 20 4a 54 5f 52 49 47 48 54 7c 4a 54 5f 4f  5, JT_RIGHT|JT_O
1d60: 55 54 45 52 20 20 20 20 20 20 20 20 20 7d 2c 0a  UTER         },.
1d70: 20 20 20 20 2f 2a 20 66 75 6c 6c 20 20 20 20 2a      /* full    *
1d80: 2f 20 7b 20 31 39 2c 20 34 2c 20 4a 54 5f 4c 45  / { 19, 4, JT_LE
1d90: 46 54 7c 4a 54 5f 52 49 47 48 54 7c 4a 54 5f 4f  FT|JT_RIGHT|JT_O
1da0: 55 54 45 52 20 7d 2c 0a 20 20 20 20 2f 2a 20 69  UTER },.    /* i
1db0: 6e 6e 65 72 20 20 20 2a 2f 20 7b 20 32 33 2c 20  nner   */ { 23, 
1dc0: 35 2c 20 4a 54 5f 49 4e 4e 45 52 20 20 20 20 20  5, JT_INNER     
1dd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a               },.
1de0: 20 20 20 20 2f 2a 20 63 72 6f 73 73 20 20 20 2a      /* cross   *
1df0: 2f 20 7b 20 32 38 2c 20 35 2c 20 4a 54 5f 49 4e  / { 28, 5, JT_IN
1e00: 4e 45 52 7c 4a 54 5f 43 52 4f 53 53 20 20 20 20  NER|JT_CROSS    
1e10: 20 20 20 20 20 7d 2c 0a 20 20 7d 3b 0a 20 20 69       },.  };.  i
1e20: 6e 74 20 69 2c 20 6a 3b 0a 20 20 61 70 41 6c 6c  nt i, j;.  apAll
1e30: 5b 30 5d 20 3d 20 70 41 3b 0a 20 20 61 70 41 6c  [0] = pA;.  apAl
1e40: 6c 5b 31 5d 20 3d 20 70 42 3b 0a 20 20 61 70 41  l[1] = pB;.  apA
1e50: 6c 6c 5b 32 5d 20 3d 20 70 43 3b 0a 20 20 66 6f  ll[2] = pC;.  fo
1e60: 72 28 69 3d 30 3b 20 69 3c 33 20 26 26 20 61 70  r(i=0; i<3 && ap
1e70: 41 6c 6c 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20  All[i]; i++){.  
1e80: 20 20 70 20 3d 20 61 70 41 6c 6c 5b 69 5d 3b 0a    p = apAll[i];.
1e90: 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 41      for(j=0; j<A
1ea0: 72 72 61 79 53 69 7a 65 28 61 4b 65 79 77 6f 72  rraySize(aKeywor
1eb0: 64 29 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  d); j++){.      
1ec0: 69 66 28 20 70 2d 3e 6e 3d 3d 61 4b 65 79 77 6f  if( p->n==aKeywo
1ed0: 72 64 5b 6a 5d 2e 6e 43 68 61 72 20 0a 20 20 20  rd[j].nChar .   
1ee0: 20 20 20 20 20 20 20 26 26 20 73 71 6c 69 74 65         && sqlite
1ef0: 33 53 74 72 4e 49 43 6d 70 28 28 63 68 61 72 2a  3StrNICmp((char*
1f00: 29 70 2d 3e 7a 2c 20 26 7a 4b 65 79 54 65 78 74  )p->z, &zKeyText
1f10: 5b 61 4b 65 79 77 6f 72 64 5b 6a 5d 2e 69 5d 2c  [aKeyword[j].i],
1f20: 20 70 2d 3e 6e 29 3d 3d 30 20 29 7b 0a 20 20 20   p->n)==0 ){.   
1f30: 20 20 20 20 20 6a 6f 69 6e 74 79 70 65 20 7c 3d       jointype |=
1f40: 20 61 4b 65 79 77 6f 72 64 5b 6a 5d 2e 63 6f 64   aKeyword[j].cod
1f50: 65 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  e;.        break
1f60: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1f70: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 3d      testcase( j=
1f80: 3d 30 20 7c 7c 20 6a 3d 3d 31 20 7c 7c 20 6a 3d  =0 || j==1 || j=
1f90: 3d 32 20 7c 7c 20 6a 3d 3d 33 20 7c 7c 20 6a 3d  =2 || j==3 || j=
1fa0: 3d 34 20 7c 7c 20 6a 3d 3d 35 20 7c 7c 20 6a 3d  =4 || j==5 || j=
1fb0: 3d 36 20 29 3b 0a 20 20 20 20 69 66 28 20 6a 3e  =6 );.    if( j>
1fc0: 3d 41 72 72 61 79 53 69 7a 65 28 61 4b 65 79 77  =ArraySize(aKeyw
1fd0: 6f 72 64 29 20 29 7b 0a 20 20 20 20 20 20 6a 6f  ord) ){.      jo
1fe0: 69 6e 74 79 70 65 20 7c 3d 20 4a 54 5f 45 52 52  intype |= JT_ERR
1ff0: 4f 52 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  OR;.      break;
2000: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
2010: 0a 20 20 20 20 20 28 6a 6f 69 6e 74 79 70 65 20  .     (jointype 
2020: 26 20 28 4a 54 5f 49 4e 4e 45 52 7c 4a 54 5f 4f  & (JT_INNER|JT_O
2030: 55 54 45 52 29 29 3d 3d 28 4a 54 5f 49 4e 4e 45  UTER))==(JT_INNE
2040: 52 7c 4a 54 5f 4f 55 54 45 52 29 20 7c 7c 0a 20  R|JT_OUTER) ||. 
2050: 20 20 20 20 28 6a 6f 69 6e 74 79 70 65 20 26 20      (jointype & 
2060: 4a 54 5f 45 52 52 4f 52 29 21 3d 30 0a 20 20 29  JT_ERROR)!=0.  )
2070: 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  {.    const char
2080: 20 2a 7a 53 70 20 3d 20 22 20 22 3b 0a 20 20 20   *zSp = " ";.   
2090: 20 61 73 73 65 72 74 28 20 70 42 21 3d 30 20 29   assert( pB!=0 )
20a0: 3b 0a 20 20 20 20 69 66 28 20 70 43 3d 3d 30 20  ;.    if( pC==0 
20b0: 29 7b 20 7a 53 70 2b 2b 3b 20 7d 0a 20 20 20 20  ){ zSp++; }.    
20c0: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
20d0: 70 50 61 72 73 65 2c 20 22 75 6e 6b 6e 6f 77 6e  pParse, "unknown
20e0: 20 6f 72 20 75 6e 73 75 70 70 6f 72 74 65 64 20   or unsupported 
20f0: 6a 6f 69 6e 20 74 79 70 65 3a 20 22 0a 20 20 20  join type: ".   
2100: 20 20 20 20 22 25 54 20 25 54 25 73 25 54 22 2c      "%T %T%s%T",
2110: 20 70 41 2c 20 70 42 2c 20 7a 53 70 2c 20 70 43   pA, pB, zSp, pC
2120: 29 3b 0a 20 20 20 20 6a 6f 69 6e 74 79 70 65 20  );.    jointype 
2130: 3d 20 4a 54 5f 49 4e 4e 45 52 3b 0a 20 20 7d 65  = JT_INNER;.  }e
2140: 6c 73 65 20 69 66 28 20 28 6a 6f 69 6e 74 79 70  lse if( (jointyp
2150: 65 20 26 20 4a 54 5f 4f 55 54 45 52 29 21 3d 30  e & JT_OUTER)!=0
2160: 20 0a 20 20 20 20 20 20 20 20 20 26 26 20 28 6a   .         && (j
2170: 6f 69 6e 74 79 70 65 20 26 20 28 4a 54 5f 4c 45  ointype & (JT_LE
2180: 46 54 7c 4a 54 5f 52 49 47 48 54 29 29 21 3d 4a  FT|JT_RIGHT))!=J
2190: 54 5f 4c 45 46 54 20 29 7b 0a 20 20 20 20 73 71  T_LEFT ){.    sq
21a0: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
21b0: 61 72 73 65 2c 20 0a 20 20 20 20 20 20 22 52 49  arse, .      "RI
21c0: 47 48 54 20 61 6e 64 20 46 55 4c 4c 20 4f 55 54  GHT and FULL OUT
21d0: 45 52 20 4a 4f 49 4e 73 20 61 72 65 20 6e 6f 74  ER JOINs are not
21e0: 20 63 75 72 72 65 6e 74 6c 79 20 73 75 70 70 6f   currently suppo
21f0: 72 74 65 64 22 29 3b 0a 20 20 20 20 6a 6f 69 6e  rted");.    join
2200: 74 79 70 65 20 3d 20 4a 54 5f 49 4e 4e 45 52 3b  type = JT_INNER;
2210: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6a 6f  .  }.  return jo
2220: 69 6e 74 79 70 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  intype;.}../*.**
2230: 20 52 65 74 75 72 6e 20 74 68 65 20 69 6e 64 65   Return the inde
2240: 78 20 6f 66 20 61 20 63 6f 6c 75 6d 6e 20 69 6e  x of a column in
2250: 20 61 20 74 61 62 6c 65 2e 20 20 52 65 74 75 72   a table.  Retur
2260: 6e 20 2d 31 20 69 66 20 74 68 65 20 63 6f 6c 75  n -1 if the colu
2270: 6d 6e 0a 2a 2a 20 69 73 20 6e 6f 74 20 63 6f 6e  mn.** is not con
2280: 74 61 69 6e 65 64 20 69 6e 20 74 68 65 20 74 61  tained in the ta
2290: 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ble..*/.static i
22a0: 6e 74 20 63 6f 6c 75 6d 6e 49 6e 64 65 78 28 54  nt columnIndex(T
22b0: 61 62 6c 65 20 2a 70 54 61 62 2c 20 63 6f 6e 73  able *pTab, cons
22c0: 74 20 63 68 61 72 20 2a 7a 43 6f 6c 29 7b 0a 20  t char *zCol){. 
22d0: 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d   int i;.  for(i=
22e0: 30 3b 20 69 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b  0; i<pTab->nCol;
22f0: 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 73   i++){.    if( s
2300: 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 54  qlite3StrICmp(pT
2310: 61 62 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 4e 61 6d  ab->aCol[i].zNam
2320: 65 2c 20 7a 43 6f 6c 29 3d 3d 30 20 29 20 72 65  e, zCol)==0 ) re
2330: 74 75 72 6e 20 69 3b 0a 20 20 7d 0a 20 20 72 65  turn i;.  }.  re
2340: 74 75 72 6e 20 2d 31 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn -1;.}../*.*
2350: 2a 20 53 65 61 72 63 68 20 74 68 65 20 66 69 72  * Search the fir
2360: 73 74 20 4e 20 74 61 62 6c 65 73 20 69 6e 20 70  st N tables in p
2370: 53 72 63 2c 20 66 72 6f 6d 20 6c 65 66 74 20 74  Src, from left t
2380: 6f 20 72 69 67 68 74 2c 20 6c 6f 6f 6b 69 6e 67  o right, looking
2390: 20 66 6f 72 20 61 0a 2a 2a 20 74 61 62 6c 65 20   for a.** table 
23a0: 74 68 61 74 20 68 61 73 20 61 20 63 6f 6c 75 6d  that has a colum
23b0: 6e 20 6e 61 6d 65 64 20 7a 43 6f 6c 2e 20 20 0a  n named zCol.  .
23c0: 2a 2a 0a 2a 2a 20 57 68 65 6e 20 66 6f 75 6e 64  **.** When found
23d0: 2c 20 73 65 74 20 2a 70 69 54 61 62 20 61 6e 64  , set *piTab and
23e0: 20 2a 70 69 43 6f 6c 20 74 6f 20 74 68 65 20 74   *piCol to the t
23f0: 61 62 6c 65 20 69 6e 64 65 78 20 61 6e 64 20 63  able index and c
2400: 6f 6c 75 6d 6e 20 69 6e 64 65 78 0a 2a 2a 20 6f  olumn index.** o
2410: 66 20 74 68 65 20 6d 61 74 63 68 69 6e 67 20 63  f the matching c
2420: 6f 6c 75 6d 6e 20 61 6e 64 20 72 65 74 75 72 6e  olumn and return
2430: 20 54 52 55 45 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   TRUE..**.** If 
2440: 6e 6f 74 20 66 6f 75 6e 64 2c 20 72 65 74 75 72  not found, retur
2450: 6e 20 46 41 4c 53 45 2e 0a 2a 2f 0a 73 74 61 74  n FALSE..*/.stat
2460: 69 63 20 69 6e 74 20 74 61 62 6c 65 41 6e 64 43  ic int tableAndC
2470: 6f 6c 75 6d 6e 49 6e 64 65 78 28 0a 20 20 53 72  olumnIndex(.  Sr
2480: 63 4c 69 73 74 20 2a 70 53 72 63 2c 20 20 20 20  cList *pSrc,    
2490: 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 74     /* Array of t
24a0: 61 62 6c 65 73 20 74 6f 20 73 65 61 72 63 68 20  ables to search 
24b0: 2a 2f 0a 20 20 69 6e 74 20 4e 2c 20 20 20 20 20  */.  int N,     
24c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
24d0: 62 65 72 20 6f 66 20 74 61 62 6c 65 73 20 69 6e  ber of tables in
24e0: 20 70 53 72 63 2d 3e 61 5b 5d 20 74 6f 20 73 65   pSrc->a[] to se
24f0: 61 72 63 68 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  arch */.  const 
2500: 63 68 61 72 20 2a 7a 43 6f 6c 2c 20 20 20 20 2f  char *zCol,    /
2510: 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 63 6f  * Name of the co
2520: 6c 75 6d 6e 20 77 65 20 61 72 65 20 6c 6f 6f 6b  lumn we are look
2530: 69 6e 67 20 66 6f 72 20 2a 2f 0a 20 20 69 6e 74  ing for */.  int
2540: 20 2a 70 69 54 61 62 2c 20 20 20 20 20 20 20 20   *piTab,        
2550: 20 20 2f 2a 20 57 72 69 74 65 20 69 6e 64 65 78    /* Write index
2560: 20 6f 66 20 70 53 72 63 2d 3e 61 5b 5d 20 68 65   of pSrc->a[] he
2570: 72 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 69 43  re */.  int *piC
2580: 6f 6c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ol           /* 
2590: 57 72 69 74 65 20 69 6e 64 65 78 20 6f 66 20 70  Write index of p
25a0: 53 72 63 2d 3e 61 5b 2a 70 69 54 61 62 5d 2e 70  Src->a[*piTab].p
25b0: 54 61 62 2d 3e 61 43 6f 6c 5b 5d 20 68 65 72 65  Tab->aCol[] here
25c0: 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 20   */.){.  int i; 
25d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
25e0: 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65   For looping ove
25f0: 72 20 74 61 62 6c 65 73 20 69 6e 20 70 53 72 63  r tables in pSrc
2600: 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 3b 20   */.  int iCol; 
2610: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
2620: 64 65 78 20 6f 66 20 63 6f 6c 75 6d 6e 20 6d 61  dex of column ma
2630: 74 63 68 69 6e 67 20 7a 43 6f 6c 20 2a 2f 0a 0a  tching zCol */..
2640: 20 20 61 73 73 65 72 74 28 20 28 70 69 54 61 62    assert( (piTab
2650: 3d 3d 30 29 3d 3d 28 70 69 43 6f 6c 3d 3d 30 29  ==0)==(piCol==0)
2660: 20 29 3b 20 20 2f 2a 20 42 6f 74 68 20 6f 72 20   );  /* Both or 
2670: 6e 65 69 74 68 65 72 20 61 72 65 20 4e 55 4c 4c  neither are NULL
2680: 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   */.  for(i=0; i
2690: 3c 4e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 43  <N; i++){.    iC
26a0: 6f 6c 20 3d 20 63 6f 6c 75 6d 6e 49 6e 64 65 78  ol = columnIndex
26b0: 28 70 53 72 63 2d 3e 61 5b 69 5d 2e 70 54 61 62  (pSrc->a[i].pTab
26c0: 2c 20 7a 43 6f 6c 29 3b 0a 20 20 20 20 69 66 28  , zCol);.    if(
26d0: 20 69 43 6f 6c 3e 3d 30 20 29 7b 0a 20 20 20 20   iCol>=0 ){.    
26e0: 20 20 69 66 28 20 70 69 54 61 62 20 29 7b 0a 20    if( piTab ){. 
26f0: 20 20 20 20 20 20 20 2a 70 69 54 61 62 20 3d 20         *piTab = 
2700: 69 3b 0a 20 20 20 20 20 20 20 20 2a 70 69 43 6f  i;.        *piCo
2710: 6c 20 3d 20 69 43 6f 6c 3b 0a 20 20 20 20 20 20  l = iCol;.      
2720: 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31  }.      return 1
2730: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
2740: 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
2750: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
2760: 73 20 75 73 65 64 20 74 6f 20 61 64 64 20 74 65  s used to add te
2770: 72 6d 73 20 69 6d 70 6c 69 65 64 20 62 79 20 4a  rms implied by J
2780: 4f 49 4e 20 73 79 6e 74 61 78 20 74 6f 20 74 68  OIN syntax to th
2790: 65 0a 2a 2a 20 57 48 45 52 45 20 63 6c 61 75 73  e.** WHERE claus
27a0: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6f 66 20  e expression of 
27b0: 61 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  a SELECT stateme
27c0: 6e 74 2e 20 54 68 65 20 6e 65 77 20 74 65 72 6d  nt. The new term
27d0: 2c 20 77 68 69 63 68 0a 2a 2a 20 69 73 20 41 4e  , which.** is AN
27e0: 44 65 64 20 77 69 74 68 20 74 68 65 20 65 78 69  Ded with the exi
27f0: 73 74 69 6e 67 20 57 48 45 52 45 20 63 6c 61 75  sting WHERE clau
2800: 73 65 2c 20 69 73 20 6f 66 20 74 68 65 20 66 6f  se, is of the fo
2810: 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 28 74 61  rm:.**.**    (ta
2820: 62 31 2e 63 6f 6c 31 20 3d 20 74 61 62 32 2e 63  b1.col1 = tab2.c
2830: 6f 6c 32 29 0a 2a 2a 0a 2a 2a 20 77 68 65 72 65  ol2).**.** where
2840: 20 74 61 62 31 20 69 73 20 74 68 65 20 69 53 72   tab1 is the iSr
2850: 63 27 74 68 20 74 61 62 6c 65 20 69 6e 20 53 72  c'th table in Sr
2860: 63 4c 69 73 74 20 70 53 72 63 20 61 6e 64 20 74  cList pSrc and t
2870: 61 62 32 20 69 73 20 74 68 65 20 0a 2a 2a 20 28  ab2 is the .** (
2880: 69 53 72 63 2b 31 29 27 74 68 2e 20 43 6f 6c 75  iSrc+1)'th. Colu
2890: 6d 6e 20 63 6f 6c 31 20 69 73 20 63 6f 6c 75 6d  mn col1 is colum
28a0: 6e 20 69 43 6f 6c 4c 65 66 74 20 6f 66 20 74 61  n iColLeft of ta
28b0: 62 31 2c 20 61 6e 64 20 63 6f 6c 32 20 69 73 0a  b1, and col2 is.
28c0: 2a 2a 20 63 6f 6c 75 6d 6e 20 69 43 6f 6c 52 69  ** column iColRi
28d0: 67 68 74 20 6f 66 20 74 61 62 32 2e 0a 2a 2f 0a  ght of tab2..*/.
28e0: 73 74 61 74 69 63 20 76 6f 69 64 20 61 64 64 57  static void addW
28f0: 68 65 72 65 54 65 72 6d 28 0a 20 20 50 61 72 73  hereTerm(.  Pars
2900: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
2910: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
2920: 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
2930: 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72  /.  SrcList *pSr
2940: 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
2950: 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 74      /* List of t
2960: 61 62 6c 65 73 20 69 6e 20 46 52 4f 4d 20 63 6c  ables in FROM cl
2970: 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69 4c  ause */.  int iL
2980: 65 66 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  eft,            
2990: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
29a0: 65 78 20 6f 66 20 66 69 72 73 74 20 74 61 62 6c  ex of first tabl
29b0: 65 20 74 6f 20 6a 6f 69 6e 20 69 6e 20 70 53 72  e to join in pSr
29c0: 63 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 4c  c */.  int iColL
29d0: 65 66 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  eft,            
29e0: 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
29f0: 6f 66 20 63 6f 6c 75 6d 6e 20 69 6e 20 66 69 72  of column in fir
2a00: 73 74 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e  st table */.  in
2a10: 74 20 69 52 69 67 68 74 2c 20 20 20 20 20 20 20  t iRight,       
2a20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2a30: 20 49 6e 64 65 78 20 6f 66 20 73 65 63 6f 6e 64   Index of second
2a40: 20 74 61 62 6c 65 20 69 6e 20 70 53 72 63 20 2a   table in pSrc *
2a50: 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 52 69 67 68  /.  int iColRigh
2a60: 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t,              
2a70: 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20      /* Index of 
2a80: 63 6f 6c 75 6d 6e 20 69 6e 20 73 65 63 6f 6e 64  column in second
2a90: 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20   table */.  int 
2aa0: 69 73 4f 75 74 65 72 4a 6f 69 6e 2c 20 20 20 20  isOuterJoin,    
2ab0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
2ac0: 72 75 65 20 69 66 20 74 68 69 73 20 69 73 20 61  rue if this is a
2ad0: 6e 20 4f 55 54 45 52 20 6a 6f 69 6e 20 2a 2f 0a  n OUTER join */.
2ae0: 20 20 45 78 70 72 20 2a 2a 70 70 57 68 65 72 65    Expr **ppWhere
2af0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b00: 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 54 68 65    /* IN/OUT: The
2b10: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 6f   WHERE clause to
2b20: 20 61 64 64 20 74 6f 20 2a 2f 0a 29 7b 0a 20 20   add to */.){.  
2b30: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
2b40: 61 72 73 65 2d 3e 64 62 3b 0a 20 20 45 78 70 72  arse->db;.  Expr
2b50: 20 2a 70 45 31 3b 0a 20 20 45 78 70 72 20 2a 70   *pE1;.  Expr *p
2b60: 45 32 3b 0a 20 20 45 78 70 72 20 2a 70 45 71 3b  E2;.  Expr *pEq;
2b70: 0a 0a 20 20 61 73 73 65 72 74 28 20 69 4c 65 66  ..  assert( iLef
2b80: 74 3c 69 52 69 67 68 74 20 29 3b 0a 20 20 61 73  t<iRight );.  as
2b90: 73 65 72 74 28 20 70 53 72 63 2d 3e 6e 53 72 63  sert( pSrc->nSrc
2ba0: 3e 69 52 69 67 68 74 20 29 3b 0a 20 20 61 73 73  >iRight );.  ass
2bb0: 65 72 74 28 20 70 53 72 63 2d 3e 61 5b 69 4c 65  ert( pSrc->a[iLe
2bc0: 66 74 5d 2e 70 54 61 62 20 29 3b 0a 20 20 61 73  ft].pTab );.  as
2bd0: 73 65 72 74 28 20 70 53 72 63 2d 3e 61 5b 69 52  sert( pSrc->a[iR
2be0: 69 67 68 74 5d 2e 70 54 61 62 20 29 3b 0a 0a 20  ight].pTab );.. 
2bf0: 20 70 45 31 20 3d 20 73 71 6c 69 74 65 33 43 72   pE1 = sqlite3Cr
2c00: 65 61 74 65 43 6f 6c 75 6d 6e 45 78 70 72 28 64  eateColumnExpr(d
2c10: 62 2c 20 70 53 72 63 2c 20 69 4c 65 66 74 2c 20  b, pSrc, iLeft, 
2c20: 69 43 6f 6c 4c 65 66 74 29 3b 0a 20 20 70 45 32  iColLeft);.  pE2
2c30: 20 3d 20 73 71 6c 69 74 65 33 43 72 65 61 74 65   = sqlite3Create
2c40: 43 6f 6c 75 6d 6e 45 78 70 72 28 64 62 2c 20 70  ColumnExpr(db, p
2c50: 53 72 63 2c 20 69 52 69 67 68 74 2c 20 69 43 6f  Src, iRight, iCo
2c60: 6c 52 69 67 68 74 29 3b 0a 0a 20 20 70 45 71 20  lRight);..  pEq 
2c70: 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70  = sqlite3PExpr(p
2c80: 50 61 72 73 65 2c 20 54 4b 5f 45 51 2c 20 70 45  Parse, TK_EQ, pE
2c90: 31 2c 20 70 45 32 29 3b 0a 20 20 69 66 28 20 70  1, pE2);.  if( p
2ca0: 45 71 20 26 26 20 69 73 4f 75 74 65 72 4a 6f 69  Eq && isOuterJoi
2cb0: 6e 20 29 7b 0a 20 20 20 20 45 78 70 72 53 65 74  n ){.    ExprSet
2cc0: 50 72 6f 70 65 72 74 79 28 70 45 71 2c 20 45 50  Property(pEq, EP
2cd0: 5f 46 72 6f 6d 4a 6f 69 6e 29 3b 0a 20 20 20 20  _FromJoin);.    
2ce0: 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73  assert( !ExprHas
2cf0: 50 72 6f 70 65 72 74 79 28 70 45 71 2c 20 45 50  Property(pEq, EP
2d00: 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 52 65  _TokenOnly|EP_Re
2d10: 64 75 63 65 64 29 20 29 3b 0a 20 20 20 20 45 78  duced) );.    Ex
2d20: 70 72 53 65 74 56 56 41 50 72 6f 70 65 72 74 79  prSetVVAProperty
2d30: 28 70 45 71 2c 20 45 50 5f 4e 6f 52 65 64 75 63  (pEq, EP_NoReduc
2d40: 65 29 3b 0a 20 20 20 20 70 45 71 2d 3e 69 52 69  e);.    pEq->iRi
2d50: 67 68 74 4a 6f 69 6e 54 61 62 6c 65 20 3d 20 28  ghtJoinTable = (
2d60: 69 31 36 29 70 45 32 2d 3e 69 54 61 62 6c 65 3b  i16)pE2->iTable;
2d70: 0a 20 20 7d 0a 20 20 2a 70 70 57 68 65 72 65 20  .  }.  *ppWhere 
2d80: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 64  = sqlite3ExprAnd
2d90: 28 70 50 61 72 73 65 2c 20 2a 70 70 57 68 65 72  (pParse, *ppWher
2da0: 65 2c 20 70 45 71 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  e, pEq);.}../*.*
2db0: 2a 20 53 65 74 20 74 68 65 20 45 50 5f 46 72 6f  * Set the EP_Fro
2dc0: 6d 4a 6f 69 6e 20 70 72 6f 70 65 72 74 79 20 6f  mJoin property o
2dd0: 6e 20 61 6c 6c 20 74 65 72 6d 73 20 6f 66 20 74  n all terms of t
2de0: 68 65 20 67 69 76 65 6e 20 65 78 70 72 65 73 73  he given express
2df0: 69 6f 6e 2e 0a 2a 2a 20 41 6e 64 20 73 65 74 20  ion..** And set 
2e00: 74 68 65 20 45 78 70 72 2e 69 52 69 67 68 74 4a  the Expr.iRightJ
2e10: 6f 69 6e 54 61 62 6c 65 20 74 6f 20 69 54 61 62  oinTable to iTab
2e20: 6c 65 20 66 6f 72 20 65 76 65 72 79 20 74 65 72  le for every ter
2e30: 6d 20 69 6e 20 74 68 65 0a 2a 2a 20 65 78 70 72  m in the.** expr
2e40: 65 73 73 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68  ession..**.** Th
2e50: 65 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 20 70 72  e EP_FromJoin pr
2e60: 6f 70 65 72 74 79 20 69 73 20 75 73 65 64 20 6f  operty is used o
2e70: 6e 20 74 65 72 6d 73 20 6f 66 20 61 6e 20 65 78  n terms of an ex
2e80: 70 72 65 73 73 69 6f 6e 20 74 6f 20 74 65 6c 6c  pression to tell
2e90: 0a 2a 2a 20 74 68 65 20 4c 45 46 54 20 4f 55 54  .** the LEFT OUT
2ea0: 45 52 20 4a 4f 49 4e 20 70 72 6f 63 65 73 73 69  ER JOIN processi
2eb0: 6e 67 20 6c 6f 67 69 63 20 74 68 61 74 20 74 68  ng logic that th
2ec0: 69 73 20 74 65 72 6d 20 69 73 20 70 61 72 74 20  is term is part 
2ed0: 6f 66 20 74 68 65 0a 2a 2a 20 6a 6f 69 6e 20 72  of the.** join r
2ee0: 65 73 74 72 69 63 74 69 6f 6e 20 73 70 65 63 69  estriction speci
2ef0: 66 69 65 64 20 69 6e 20 74 68 65 20 4f 4e 20 6f  fied in the ON o
2f00: 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65 20 61  r USING clause a
2f10: 6e 64 20 6e 6f 74 20 61 20 70 61 72 74 0a 2a 2a  nd not a part.**
2f20: 20 6f 66 20 74 68 65 20 6d 6f 72 65 20 67 65 6e   of the more gen
2f30: 65 72 61 6c 20 57 48 45 52 45 20 63 6c 61 75 73  eral WHERE claus
2f40: 65 2e 20 20 54 68 65 73 65 20 74 65 72 6d 73 20  e.  These terms 
2f50: 61 72 65 20 6d 6f 76 65 64 20 6f 76 65 72 20 74  are moved over t
2f60: 6f 20 74 68 65 0a 2a 2a 20 57 48 45 52 45 20 63  o the.** WHERE c
2f70: 6c 61 75 73 65 20 64 75 72 69 6e 67 20 6a 6f 69  lause during joi
2f80: 6e 20 70 72 6f 63 65 73 73 69 6e 67 20 62 75 74  n processing but
2f90: 20 77 65 20 6e 65 65 64 20 74 6f 20 72 65 6d 65   we need to reme
2fa0: 6d 62 65 72 20 74 68 61 74 20 74 68 65 79 0a 2a  mber that they.*
2fb0: 2a 20 6f 72 69 67 69 6e 61 74 65 64 20 69 6e 20  * originated in 
2fc0: 74 68 65 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20  the ON or USING 
2fd0: 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  clause..**.** Th
2fe0: 65 20 45 78 70 72 2e 69 52 69 67 68 74 4a 6f 69  e Expr.iRightJoi
2ff0: 6e 54 61 62 6c 65 20 74 65 6c 6c 73 20 74 68 65  nTable tells the
3000: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 70 72   WHERE clause pr
3010: 6f 63 65 73 73 69 6e 67 20 74 68 61 74 20 74 68  ocessing that th
3020: 65 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20  e.** expression 
3030: 64 65 70 65 6e 64 73 20 6f 6e 20 74 61 62 6c 65  depends on table
3040: 20 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65   iRightJoinTable
3050: 20 65 76 65 6e 20 69 66 20 74 68 61 74 20 74 61   even if that ta
3060: 62 6c 65 20 69 73 20 6e 6f 74 0a 2a 2a 20 65 78  ble is not.** ex
3070: 70 6c 69 63 69 74 6c 79 20 6d 65 6e 74 69 6f 6e  plicitly mention
3080: 65 64 20 69 6e 20 74 68 65 20 65 78 70 72 65 73  ed in the expres
3090: 73 69 6f 6e 2e 20 20 54 68 61 74 20 69 6e 66 6f  sion.  That info
30a0: 72 6d 61 74 69 6f 6e 20 69 73 20 6e 65 65 64 65  rmation is neede
30b0: 64 0a 2a 2a 20 66 6f 72 20 63 61 73 65 73 20 6c  d.** for cases l
30c0: 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20  ike this:.**.** 
30d0: 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d     SELECT * FROM
30e0: 20 74 31 20 4c 45 46 54 20 4a 4f 49 4e 20 74 32   t1 LEFT JOIN t2
30f0: 20 4f 4e 20 74 31 2e 61 3d 74 32 2e 62 20 41 4e   ON t1.a=t2.b AN
3100: 44 20 74 31 2e 78 3d 35 0a 2a 2a 0a 2a 2a 20 54  D t1.x=5.**.** T
3110: 68 65 20 77 68 65 72 65 20 63 6c 61 75 73 65 20  he where clause 
3120: 6e 65 65 64 73 20 74 6f 20 64 65 66 65 72 20 74  needs to defer t
3130: 68 65 20 68 61 6e 64 6c 69 6e 67 20 6f 66 20 74  he handling of t
3140: 68 65 20 74 31 2e 78 3d 35 0a 2a 2a 20 74 65 72  he t1.x=5.** ter
3150: 6d 20 75 6e 74 69 6c 20 61 66 74 65 72 20 74 68  m until after th
3160: 65 20 74 32 20 6c 6f 6f 70 20 6f 66 20 74 68 65  e t2 loop of the
3170: 20 6a 6f 69 6e 2e 20 20 49 6e 20 74 68 61 74 20   join.  In that 
3180: 77 61 79 2c 20 61 0a 2a 2a 20 4e 55 4c 4c 20 74  way, a.** NULL t
3190: 32 20 72 6f 77 20 77 69 6c 6c 20 62 65 20 69 6e  2 row will be in
31a0: 73 65 72 74 65 64 20 77 68 65 6e 65 76 65 72 20  serted whenever 
31b0: 74 31 2e 78 21 3d 35 2e 20 20 49 66 20 77 65 20  t1.x!=5.  If we 
31c0: 64 6f 20 6e 6f 74 0a 2a 2a 20 64 65 66 65 72 20  do not.** defer 
31d0: 74 68 65 20 68 61 6e 64 6c 69 6e 67 20 6f 66 20  the handling of 
31e0: 74 31 2e 78 3d 35 2c 20 69 74 20 77 69 6c 6c 20  t1.x=5, it will 
31f0: 62 65 20 70 72 6f 63 65 73 73 65 64 20 69 6d 6d  be processed imm
3200: 65 64 69 61 74 65 6c 79 0a 2a 2a 20 61 66 74 65  ediately.** afte
3210: 72 20 74 68 65 20 74 31 20 6c 6f 6f 70 20 61 6e  r the t1 loop an
3220: 64 20 72 6f 77 73 20 77 69 74 68 20 74 31 2e 78  d rows with t1.x
3230: 21 3d 35 20 77 69 6c 6c 20 6e 65 76 65 72 20 61  !=5 will never a
3240: 70 70 65 61 72 20 69 6e 0a 2a 2a 20 74 68 65 20  ppear in.** the 
3250: 6f 75 74 70 75 74 2c 20 77 68 69 63 68 20 69 73  output, which is
3260: 20 69 6e 63 6f 72 72 65 63 74 2e 0a 2a 2f 0a 73   incorrect..*/.s
3270: 74 61 74 69 63 20 76 6f 69 64 20 73 65 74 4a 6f  tatic void setJo
3280: 69 6e 45 78 70 72 28 45 78 70 72 20 2a 70 2c 20  inExpr(Expr *p, 
3290: 69 6e 74 20 69 54 61 62 6c 65 29 7b 0a 20 20 77  int iTable){.  w
32a0: 68 69 6c 65 28 20 70 20 29 7b 0a 20 20 20 20 45  hile( p ){.    E
32b0: 78 70 72 53 65 74 50 72 6f 70 65 72 74 79 28 70  xprSetProperty(p
32c0: 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 3b 0a  , EP_FromJoin);.
32d0: 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70      assert( !Exp
32e0: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20  rHasProperty(p, 
32f0: 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f  EP_TokenOnly|EP_
3300: 52 65 64 75 63 65 64 29 20 29 3b 0a 20 20 20 20  Reduced) );.    
3310: 45 78 70 72 53 65 74 56 56 41 50 72 6f 70 65 72  ExprSetVVAProper
3320: 74 79 28 70 2c 20 45 50 5f 4e 6f 52 65 64 75 63  ty(p, EP_NoReduc
3330: 65 29 3b 0a 20 20 20 20 70 2d 3e 69 52 69 67 68  e);.    p->iRigh
3340: 74 4a 6f 69 6e 54 61 62 6c 65 20 3d 20 28 69 31  tJoinTable = (i1
3350: 36 29 69 54 61 62 6c 65 3b 0a 20 20 20 20 69 66  6)iTable;.    if
3360: 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 46 55 4e 43  ( p->op==TK_FUNC
3370: 54 49 4f 4e 20 26 26 20 70 2d 3e 78 2e 70 4c 69  TION && p->x.pLi
3380: 73 74 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  st ){.      int 
3390: 69 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  i;.      for(i=0
33a0: 3b 20 69 3c 70 2d 3e 78 2e 70 4c 69 73 74 2d 3e  ; i<p->x.pList->
33b0: 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
33c0: 20 20 20 20 20 73 65 74 4a 6f 69 6e 45 78 70 72       setJoinExpr
33d0: 28 70 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 69  (p->x.pList->a[i
33e0: 5d 2e 70 45 78 70 72 2c 20 69 54 61 62 6c 65 29  ].pExpr, iTable)
33f0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
3400: 20 20 20 20 73 65 74 4a 6f 69 6e 45 78 70 72 28      setJoinExpr(
3410: 70 2d 3e 70 4c 65 66 74 2c 20 69 54 61 62 6c 65  p->pLeft, iTable
3420: 29 3b 0a 20 20 20 20 70 20 3d 20 70 2d 3e 70 52  );.    p = p->pR
3430: 69 67 68 74 3b 0a 20 20 7d 20 0a 7d 0a 0a 2f 2a  ight;.  } .}../*
3440: 20 55 6e 64 6f 20 74 68 65 20 77 6f 72 6b 20 6f   Undo the work o
3450: 66 20 73 65 74 4a 6f 69 6e 45 78 70 72 28 29 2e  f setJoinExpr().
3460: 20 20 49 6e 20 74 68 65 20 65 78 70 72 65 73 73    In the express
3470: 69 6f 6e 20 74 72 65 65 20 70 2c 20 63 6f 6e 76  ion tree p, conv
3480: 65 72 74 20 65 76 65 72 79 0a 2a 2a 20 74 65 72  ert every.** ter
3490: 6d 20 74 68 61 74 20 69 73 20 6d 61 72 6b 65 64  m that is marked
34a0: 20 77 69 74 68 20 45 50 5f 46 72 6f 6d 4a 6f 69   with EP_FromJoi
34b0: 6e 20 61 6e 64 20 69 52 69 67 68 74 4a 6f 69 6e  n and iRightJoin
34c0: 54 61 62 6c 65 3d 3d 69 54 61 62 6c 65 20 69 6e  Table==iTable in
34d0: 74 6f 0a 2a 2a 20 61 6e 20 6f 72 64 69 6e 61 72  to.** an ordinar
34e0: 79 20 74 65 72 6d 20 74 68 61 74 20 6f 6d 69 74  y term that omit
34f0: 73 20 74 68 65 20 45 50 5f 46 72 6f 6d 4a 6f 69  s the EP_FromJoi
3500: 6e 20 6d 61 72 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68  n mark..**.** Th
3510: 69 73 20 68 61 70 70 65 6e 73 20 77 68 65 6e 20  is happens when 
3520: 61 20 4c 45 46 54 20 4a 4f 49 4e 20 69 73 20 73  a LEFT JOIN is s
3530: 69 6d 70 6c 69 66 69 65 64 20 69 6e 74 6f 20 61  implified into a
3540: 6e 20 6f 72 64 69 6e 61 72 79 20 4a 4f 49 4e 2e  n ordinary JOIN.
3550: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
3560: 75 6e 73 65 74 4a 6f 69 6e 45 78 70 72 28 45 78  unsetJoinExpr(Ex
3570: 70 72 20 2a 70 2c 20 69 6e 74 20 69 54 61 62 6c  pr *p, int iTabl
3580: 65 29 7b 0a 20 20 77 68 69 6c 65 28 20 70 20 29  e){.  while( p )
3590: 7b 0a 20 20 20 20 69 66 28 20 45 78 70 72 48 61  {.    if( ExprHa
35a0: 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f  sProperty(p, EP_
35b0: 46 72 6f 6d 4a 6f 69 6e 29 0a 20 20 20 20 20 26  FromJoin).     &
35c0: 26 20 28 69 54 61 62 6c 65 3c 30 20 7c 7c 20 70  & (iTable<0 || p
35d0: 2d 3e 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c  ->iRightJoinTabl
35e0: 65 3d 3d 69 54 61 62 6c 65 29 20 29 7b 0a 20 20  e==iTable) ){.  
35f0: 20 20 20 20 45 78 70 72 43 6c 65 61 72 50 72 6f      ExprClearPro
3600: 70 65 72 74 79 28 70 2c 20 45 50 5f 46 72 6f 6d  perty(p, EP_From
3610: 4a 6f 69 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Join);.    }.   
3620: 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 46   if( p->op==TK_F
3630: 55 4e 43 54 49 4f 4e 20 26 26 20 70 2d 3e 78 2e  UNCTION && p->x.
3640: 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20 69  pList ){.      i
3650: 6e 74 20 69 3b 0a 20 20 20 20 20 20 66 6f 72 28  nt i;.      for(
3660: 69 3d 30 3b 20 69 3c 70 2d 3e 78 2e 70 4c 69 73  i=0; i<p->x.pLis
3670: 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a  t->nExpr; i++){.
3680: 20 20 20 20 20 20 20 20 75 6e 73 65 74 4a 6f 69          unsetJoi
3690: 6e 45 78 70 72 28 70 2d 3e 78 2e 70 4c 69 73 74  nExpr(p->x.pList
36a0: 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20 69 54  ->a[i].pExpr, iT
36b0: 61 62 6c 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20  able);.      }. 
36c0: 20 20 20 7d 0a 20 20 20 20 75 6e 73 65 74 4a 6f     }.    unsetJo
36d0: 69 6e 45 78 70 72 28 70 2d 3e 70 4c 65 66 74 2c  inExpr(p->pLeft,
36e0: 20 69 54 61 62 6c 65 29 3b 0a 20 20 20 20 70 20   iTable);.    p 
36f0: 3d 20 70 2d 3e 70 52 69 67 68 74 3b 0a 20 20 7d  = p->pRight;.  }
3700: 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20   .}../*.** This 
3710: 72 6f 75 74 69 6e 65 20 70 72 6f 63 65 73 73 65  routine processe
3720: 73 20 74 68 65 20 6a 6f 69 6e 20 69 6e 66 6f 72  s the join infor
3730: 6d 61 74 69 6f 6e 20 66 6f 72 20 61 20 53 45 4c  mation for a SEL
3740: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a  ECT statement..*
3750: 2a 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20 63  * ON and USING c
3760: 6c 61 75 73 65 73 20 61 72 65 20 63 6f 6e 76 65  lauses are conve
3770: 72 74 65 64 20 69 6e 74 6f 20 65 78 74 72 61 20  rted into extra 
3780: 74 65 72 6d 73 20 6f 66 20 74 68 65 20 57 48 45  terms of the WHE
3790: 52 45 20 63 6c 61 75 73 65 2e 0a 2a 2a 20 4e 41  RE clause..** NA
37a0: 54 55 52 41 4c 20 6a 6f 69 6e 73 20 61 6c 73 6f  TURAL joins also
37b0: 20 63 72 65 61 74 65 20 65 78 74 72 61 20 57 48   create extra WH
37c0: 45 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d 73  ERE clause terms
37d0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 65 72 6d  ..**.** The term
37e0: 73 20 6f 66 20 61 20 46 52 4f 4d 20 63 6c 61 75  s of a FROM clau
37f0: 73 65 20 61 72 65 20 63 6f 6e 74 61 69 6e 65 64  se are contained
3800: 20 69 6e 20 74 68 65 20 53 65 6c 65 63 74 2e 70   in the Select.p
3810: 53 72 63 20 73 74 72 75 63 74 75 72 65 2e 0a 2a  Src structure..*
3820: 2a 20 54 68 65 20 6c 65 66 74 20 6d 6f 73 74 20  * The left most 
3830: 74 61 62 6c 65 20 69 73 20 74 68 65 20 66 69 72  table is the fir
3840: 73 74 20 65 6e 74 72 79 20 69 6e 20 53 65 6c 65  st entry in Sele
3850: 63 74 2e 70 53 72 63 2e 20 20 54 68 65 20 72 69  ct.pSrc.  The ri
3860: 67 68 74 2d 6d 6f 73 74 0a 2a 2a 20 74 61 62 6c  ght-most.** tabl
3870: 65 20 69 73 20 74 68 65 20 6c 61 73 74 20 65 6e  e is the last en
3880: 74 72 79 2e 20 20 54 68 65 20 6a 6f 69 6e 20 6f  try.  The join o
3890: 70 65 72 61 74 6f 72 20 69 73 20 68 65 6c 64 20  perator is held 
38a0: 69 6e 20 74 68 65 20 65 6e 74 72 79 20 74 6f 0a  in the entry to.
38b0: 2a 2a 20 74 68 65 20 6c 65 66 74 2e 20 20 54 68  ** the left.  Th
38c0: 75 73 20 65 6e 74 72 79 20 30 20 63 6f 6e 74 61  us entry 0 conta
38d0: 69 6e 73 20 74 68 65 20 6a 6f 69 6e 20 6f 70 65  ins the join ope
38e0: 72 61 74 6f 72 20 66 6f 72 20 74 68 65 20 6a 6f  rator for the jo
38f0: 69 6e 20 62 65 74 77 65 65 6e 0a 2a 2a 20 65 6e  in between.** en
3900: 74 72 69 65 73 20 30 20 61 6e 64 20 31 2e 20 20  tries 0 and 1.  
3910: 41 6e 79 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20  Any ON or USING 
3920: 63 6c 61 75 73 65 73 20 61 73 73 6f 63 69 61 74  clauses associat
3930: 65 64 20 77 69 74 68 20 74 68 65 20 6a 6f 69 6e  ed with the join
3940: 20 61 72 65 0a 2a 2a 20 61 6c 73 6f 20 61 74 74   are.** also att
3950: 61 63 68 65 64 20 74 6f 20 74 68 65 20 6c 65 66  ached to the lef
3960: 74 20 65 6e 74 72 79 2e 0a 2a 2a 0a 2a 2a 20 54  t entry..**.** T
3970: 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75  his routine retu
3980: 72 6e 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  rns the number o
3990: 66 20 65 72 72 6f 72 73 20 65 6e 63 6f 75 6e 74  f errors encount
39a0: 65 72 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ered..*/.static 
39b0: 69 6e 74 20 73 71 6c 69 74 65 50 72 6f 63 65 73  int sqliteProces
39c0: 73 4a 6f 69 6e 28 50 61 72 73 65 20 2a 70 50 61  sJoin(Parse *pPa
39d0: 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b  rse, Select *p){
39e0: 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63  .  SrcList *pSrc
39f0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
3a00: 20 20 20 2f 2a 20 41 6c 6c 20 74 61 62 6c 65 73     /* All tables
3a10: 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   in the FROM cla
3a20: 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69 2c 20  use */.  int i, 
3a30: 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  j;              
3a40: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
3a50: 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 73   counters */.  s
3a60: 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
3a70: 65 6d 20 2a 70 4c 65 66 74 3b 20 20 20 20 20 2f  em *pLeft;     /
3a80: 2a 20 4c 65 66 74 20 74 61 62 6c 65 20 62 65 69  * Left table bei
3a90: 6e 67 20 6a 6f 69 6e 65 64 20 2a 2f 0a 20 20 73  ng joined */.  s
3aa0: 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
3ab0: 65 6d 20 2a 70 52 69 67 68 74 3b 20 20 20 20 2f  em *pRight;    /
3ac0: 2a 20 52 69 67 68 74 20 74 61 62 6c 65 20 62 65  * Right table be
3ad0: 69 6e 67 20 6a 6f 69 6e 65 64 20 2a 2f 0a 0a 20  ing joined */.. 
3ae0: 20 70 53 72 63 20 3d 20 70 2d 3e 70 53 72 63 3b   pSrc = p->pSrc;
3af0: 0a 20 20 70 4c 65 66 74 20 3d 20 26 70 53 72 63  .  pLeft = &pSrc
3b00: 2d 3e 61 5b 30 5d 3b 0a 20 20 70 52 69 67 68 74  ->a[0];.  pRight
3b10: 20 3d 20 26 70 4c 65 66 74 5b 31 5d 3b 0a 20 20   = &pLeft[1];.  
3b20: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 53 72 63 2d  for(i=0; i<pSrc-
3b30: 3e 6e 53 72 63 2d 31 3b 20 69 2b 2b 2c 20 70 52  >nSrc-1; i++, pR
3b40: 69 67 68 74 2b 2b 2c 20 70 4c 65 66 74 2b 2b 29  ight++, pLeft++)
3b50: 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 52 69  {.    Table *pRi
3b60: 67 68 74 54 61 62 20 3d 20 70 52 69 67 68 74 2d  ghtTab = pRight-
3b70: 3e 70 54 61 62 3b 0a 20 20 20 20 69 6e 74 20 69  >pTab;.    int i
3b80: 73 4f 75 74 65 72 3b 0a 0a 20 20 20 20 69 66 28  sOuter;..    if(
3b90: 20 4e 45 56 45 52 28 70 4c 65 66 74 2d 3e 70 54   NEVER(pLeft->pT
3ba0: 61 62 3d 3d 30 20 7c 7c 20 70 52 69 67 68 74 54  ab==0 || pRightT
3bb0: 61 62 3d 3d 30 29 20 29 20 63 6f 6e 74 69 6e 75  ab==0) ) continu
3bc0: 65 3b 0a 20 20 20 20 69 73 4f 75 74 65 72 20 3d  e;.    isOuter =
3bd0: 20 28 70 52 69 67 68 74 2d 3e 66 67 2e 6a 6f 69   (pRight->fg.joi
3be0: 6e 74 79 70 65 20 26 20 4a 54 5f 4f 55 54 45 52  ntype & JT_OUTER
3bf0: 29 21 3d 30 3b 0a 0a 20 20 20 20 2f 2a 20 57 68  )!=0;..    /* Wh
3c00: 65 6e 20 74 68 65 20 4e 41 54 55 52 41 4c 20 6b  en the NATURAL k
3c10: 65 79 77 6f 72 64 20 69 73 20 70 72 65 73 65 6e  eyword is presen
3c20: 74 2c 20 61 64 64 20 57 48 45 52 45 20 63 6c 61  t, add WHERE cla
3c30: 75 73 65 20 74 65 72 6d 73 20 66 6f 72 0a 20 20  use terms for.  
3c40: 20 20 2a 2a 20 65 76 65 72 79 20 63 6f 6c 75 6d    ** every colum
3c50: 6e 20 74 68 61 74 20 74 68 65 20 74 77 6f 20 74  n that the two t
3c60: 61 62 6c 65 73 20 68 61 76 65 20 69 6e 20 63 6f  ables have in co
3c70: 6d 6d 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  mmon..    */.   
3c80: 20 69 66 28 20 70 52 69 67 68 74 2d 3e 66 67 2e   if( pRight->fg.
3c90: 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 4e 41  jointype & JT_NA
3ca0: 54 55 52 41 4c 20 29 7b 0a 20 20 20 20 20 20 69  TURAL ){.      i
3cb0: 66 28 20 70 52 69 67 68 74 2d 3e 70 4f 6e 20 7c  f( pRight->pOn |
3cc0: 7c 20 70 52 69 67 68 74 2d 3e 70 55 73 69 6e 67  | pRight->pUsing
3cd0: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
3ce0: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
3cf0: 73 65 2c 20 22 61 20 4e 41 54 55 52 41 4c 20 6a  se, "a NATURAL j
3d00: 6f 69 6e 20 6d 61 79 20 6e 6f 74 20 68 61 76 65  oin may not have
3d10: 20 22 0a 20 20 20 20 20 20 20 20 20 20 20 22 61   ".           "a
3d20: 6e 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c  n ON or USING cl
3d30: 61 75 73 65 22 2c 20 30 29 3b 0a 20 20 20 20 20  ause", 0);.     
3d40: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
3d50: 20 20 20 7d 0a 20 20 20 20 20 20 66 6f 72 28 6a     }.      for(j
3d60: 3d 30 3b 20 6a 3c 70 52 69 67 68 74 54 61 62 2d  =0; j<pRightTab-
3d70: 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20  >nCol; j++){.   
3d80: 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65       char *zName
3d90: 3b 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 63  ;   /* Name of c
3da0: 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20 72 69 67  olumn in the rig
3db0: 68 74 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20  ht table */.    
3dc0: 20 20 20 20 69 6e 74 20 69 4c 65 66 74 3b 20 20      int iLeft;  
3dd0: 20 20 20 2f 2a 20 4d 61 74 63 68 69 6e 67 20 6c     /* Matching l
3de0: 65 66 74 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20  eft table */.   
3df0: 20 20 20 20 20 69 6e 74 20 69 4c 65 66 74 43 6f       int iLeftCo
3e00: 6c 3b 20 20 2f 2a 20 4d 61 74 63 68 69 6e 67 20  l;  /* Matching 
3e10: 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20 6c 65  column in the le
3e20: 66 74 20 74 61 62 6c 65 20 2a 2f 0a 0a 20 20 20  ft table */..   
3e30: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 70 52 69       zName = pRi
3e40: 67 68 74 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e  ghtTab->aCol[j].
3e50: 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 69  zName;.        i
3e60: 66 28 20 74 61 62 6c 65 41 6e 64 43 6f 6c 75 6d  f( tableAndColum
3e70: 6e 49 6e 64 65 78 28 70 53 72 63 2c 20 69 2b 31  nIndex(pSrc, i+1
3e80: 2c 20 7a 4e 61 6d 65 2c 20 26 69 4c 65 66 74 2c  , zName, &iLeft,
3e90: 20 26 69 4c 65 66 74 43 6f 6c 29 20 29 7b 0a 20   &iLeftCol) ){. 
3ea0: 20 20 20 20 20 20 20 20 20 61 64 64 57 68 65 72           addWher
3eb0: 65 54 65 72 6d 28 70 50 61 72 73 65 2c 20 70 53  eTerm(pParse, pS
3ec0: 72 63 2c 20 69 4c 65 66 74 2c 20 69 4c 65 66 74  rc, iLeft, iLeft
3ed0: 43 6f 6c 2c 20 69 2b 31 2c 20 6a 2c 0a 20 20 20  Col, i+1, j,.   
3ee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3ef0: 20 20 20 20 69 73 4f 75 74 65 72 2c 20 26 70 2d      isOuter, &p-
3f00: 3e 70 57 68 65 72 65 29 3b 0a 20 20 20 20 20 20  >pWhere);.      
3f10: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
3f20: 7d 0a 0a 20 20 20 20 2f 2a 20 44 69 73 61 6c 6c  }..    /* Disall
3f30: 6f 77 20 62 6f 74 68 20 4f 4e 20 61 6e 64 20 55  ow both ON and U
3f40: 53 49 4e 47 20 63 6c 61 75 73 65 73 20 69 6e 20  SING clauses in 
3f50: 74 68 65 20 73 61 6d 65 20 6a 6f 69 6e 0a 20 20  the same join.  
3f60: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 52 69    */.    if( pRi
3f70: 67 68 74 2d 3e 70 4f 6e 20 26 26 20 70 52 69 67  ght->pOn && pRig
3f80: 68 74 2d 3e 70 55 73 69 6e 67 20 29 7b 0a 20 20  ht->pUsing ){.  
3f90: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
3fa0: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 63 61 6e  Msg(pParse, "can
3fb0: 6e 6f 74 20 68 61 76 65 20 62 6f 74 68 20 4f 4e  not have both ON
3fc0: 20 61 6e 64 20 55 53 49 4e 47 20 22 0a 20 20 20   and USING ".   
3fd0: 20 20 20 20 20 22 63 6c 61 75 73 65 73 20 69 6e       "clauses in
3fe0: 20 74 68 65 20 73 61 6d 65 20 6a 6f 69 6e 22 29   the same join")
3ff0: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31  ;.      return 1
4000: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
4010: 41 64 64 20 74 68 65 20 4f 4e 20 63 6c 61 75 73  Add the ON claus
4020: 65 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20  e to the end of 
4030: 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
4040: 2c 20 63 6f 6e 6e 65 63 74 65 64 20 62 79 0a 20  , connected by. 
4050: 20 20 20 2a 2a 20 61 6e 20 41 4e 44 20 6f 70 65     ** an AND ope
4060: 72 61 74 6f 72 2e 0a 20 20 20 20 2a 2f 0a 20 20  rator..    */.  
4070: 20 20 69 66 28 20 70 52 69 67 68 74 2d 3e 70 4f    if( pRight->pO
4080: 6e 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 69  n ){.      if( i
4090: 73 4f 75 74 65 72 20 29 20 73 65 74 4a 6f 69 6e  sOuter ) setJoin
40a0: 45 78 70 72 28 70 52 69 67 68 74 2d 3e 70 4f 6e  Expr(pRight->pOn
40b0: 2c 20 70 52 69 67 68 74 2d 3e 69 43 75 72 73 6f  , pRight->iCurso
40c0: 72 29 3b 0a 20 20 20 20 20 20 70 2d 3e 70 57 68  r);.      p->pWh
40d0: 65 72 65 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ere = sqlite3Exp
40e0: 72 41 6e 64 28 70 50 61 72 73 65 2c 20 70 2d 3e  rAnd(pParse, p->
40f0: 70 57 68 65 72 65 2c 20 70 52 69 67 68 74 2d 3e  pWhere, pRight->
4100: 70 4f 6e 29 3b 0a 20 20 20 20 20 20 70 52 69 67  pOn);.      pRig
4110: 68 74 2d 3e 70 4f 6e 20 3d 20 30 3b 0a 20 20 20  ht->pOn = 0;.   
4120: 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61 74   }..    /* Creat
4130: 65 20 65 78 74 72 61 20 74 65 72 6d 73 20 6f 6e  e extra terms on
4140: 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
4150: 65 20 66 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d  e for each colum
4160: 6e 20 6e 61 6d 65 64 0a 20 20 20 20 2a 2a 20 69  n named.    ** i
4170: 6e 20 74 68 65 20 55 53 49 4e 47 20 63 6c 61 75  n the USING clau
4180: 73 65 2e 20 20 45 78 61 6d 70 6c 65 3a 20 49 66  se.  Example: If
4190: 20 74 68 65 20 74 77 6f 20 74 61 62 6c 65 73 20   the two tables 
41a0: 74 6f 20 62 65 20 6a 6f 69 6e 65 64 20 61 72 65  to be joined are
41b0: 20 0a 20 20 20 20 2a 2a 20 41 20 61 6e 64 20 42   .    ** A and B
41c0: 20 61 6e 64 20 74 68 65 20 55 53 49 4e 47 20 63   and the USING c
41d0: 6c 61 75 73 65 20 6e 61 6d 65 73 20 58 2c 20 59  lause names X, Y
41e0: 2c 20 61 6e 64 20 5a 2c 20 74 68 65 6e 20 61 64  , and Z, then ad
41f0: 64 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 74 6f  d this.    ** to
4200: 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
4210: 65 3a 20 20 20 20 41 2e 58 3d 42 2e 58 20 41 4e  e:    A.X=B.X AN
4220: 44 20 41 2e 59 3d 42 2e 59 20 41 4e 44 20 41 2e  D A.Y=B.Y AND A.
4230: 5a 3d 42 2e 5a 0a 20 20 20 20 2a 2a 20 52 65 70  Z=B.Z.    ** Rep
4240: 6f 72 74 20 61 6e 20 65 72 72 6f 72 20 69 66 20  ort an error if 
4250: 61 6e 79 20 63 6f 6c 75 6d 6e 20 6d 65 6e 74 69  any column menti
4260: 6f 6e 65 64 20 69 6e 20 74 68 65 20 55 53 49 4e  oned in the USIN
4270: 47 20 63 6c 61 75 73 65 20 69 73 0a 20 20 20 20  G clause is.    
4280: 2a 2a 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 65 64  ** not contained
4290: 20 69 6e 20 62 6f 74 68 20 74 61 62 6c 65 73 20   in both tables 
42a0: 74 6f 20 62 65 20 6a 6f 69 6e 65 64 2e 0a 20 20  to be joined..  
42b0: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 52 69    */.    if( pRi
42c0: 67 68 74 2d 3e 70 55 73 69 6e 67 20 29 7b 0a 20  ght->pUsing ){. 
42d0: 20 20 20 20 20 49 64 4c 69 73 74 20 2a 70 4c 69       IdList *pLi
42e0: 73 74 20 3d 20 70 52 69 67 68 74 2d 3e 70 55 73  st = pRight->pUs
42f0: 69 6e 67 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a  ing;.      for(j
4300: 3d 30 3b 20 6a 3c 70 4c 69 73 74 2d 3e 6e 49 64  =0; j<pList->nId
4310: 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; j++){.        
4320: 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 20 20 20 20  char *zName;    
4330: 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
4340: 74 65 72 6d 20 69 6e 20 74 68 65 20 55 53 49 4e  term in the USIN
4350: 47 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20  G clause */.    
4360: 20 20 20 20 69 6e 74 20 69 4c 65 66 74 3b 20 20      int iLeft;  
4370: 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 6f 6e       /* Table on
4380: 20 74 68 65 20 6c 65 66 74 20 77 69 74 68 20 6d   the left with m
4390: 61 74 63 68 69 6e 67 20 63 6f 6c 75 6d 6e 20 6e  atching column n
43a0: 61 6d 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 69  ame */.        i
43b0: 6e 74 20 69 4c 65 66 74 43 6f 6c 3b 20 20 20 20  nt iLeftCol;    
43c0: 2f 2a 20 43 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72  /* Column number
43d0: 20 6f 66 20 6d 61 74 63 68 69 6e 67 20 63 6f 6c   of matching col
43e0: 75 6d 6e 20 6f 6e 20 74 68 65 20 6c 65 66 74 20  umn on the left 
43f0: 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69  */.        int i
4400: 52 69 67 68 74 43 6f 6c 3b 20 20 20 2f 2a 20 43  RightCol;   /* C
4410: 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 6f 66 20  olumn number of 
4420: 6d 61 74 63 68 69 6e 67 20 63 6f 6c 75 6d 6e 20  matching column 
4430: 6f 6e 20 74 68 65 20 72 69 67 68 74 20 2a 2f 0a  on the right */.
4440: 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d  .        zName =
4450: 20 70 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 7a 4e 61   pList->a[j].zNa
4460: 6d 65 3b 0a 20 20 20 20 20 20 20 20 69 52 69 67  me;.        iRig
4470: 68 74 43 6f 6c 20 3d 20 63 6f 6c 75 6d 6e 49 6e  htCol = columnIn
4480: 64 65 78 28 70 52 69 67 68 74 54 61 62 2c 20 7a  dex(pRightTab, z
4490: 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 69  Name);.        i
44a0: 66 28 20 69 52 69 67 68 74 43 6f 6c 3c 30 0a 20  f( iRightCol<0. 
44b0: 20 20 20 20 20 20 20 20 7c 7c 20 21 74 61 62 6c          || !tabl
44c0: 65 41 6e 64 43 6f 6c 75 6d 6e 49 6e 64 65 78 28  eAndColumnIndex(
44d0: 70 53 72 63 2c 20 69 2b 31 2c 20 7a 4e 61 6d 65  pSrc, i+1, zName
44e0: 2c 20 26 69 4c 65 66 74 2c 20 26 69 4c 65 66 74  , &iLeft, &iLeft
44f0: 43 6f 6c 29 0a 20 20 20 20 20 20 20 20 29 7b 0a  Col).        ){.
4500: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
4510: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
4520: 2c 20 22 63 61 6e 6e 6f 74 20 6a 6f 69 6e 20 75  , "cannot join u
4530: 73 69 6e 67 20 63 6f 6c 75 6d 6e 20 25 73 20 2d  sing column %s -
4540: 20 63 6f 6c 75 6d 6e 20 22 0a 20 20 20 20 20 20   column ".      
4550: 20 20 20 20 20 20 22 6e 6f 74 20 70 72 65 73 65        "not prese
4560: 6e 74 20 69 6e 20 62 6f 74 68 20 74 61 62 6c 65  nt in both table
4570: 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  s", zName);.    
4580: 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
4590: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
45a0: 20 20 61 64 64 57 68 65 72 65 54 65 72 6d 28 70    addWhereTerm(p
45b0: 50 61 72 73 65 2c 20 70 53 72 63 2c 20 69 4c 65  Parse, pSrc, iLe
45c0: 66 74 2c 20 69 4c 65 66 74 43 6f 6c 2c 20 69 2b  ft, iLeftCol, i+
45d0: 31 2c 20 69 52 69 67 68 74 43 6f 6c 2c 0a 20 20  1, iRightCol,.  
45e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
45f0: 20 20 20 69 73 4f 75 74 65 72 2c 20 26 70 2d 3e     isOuter, &p->
4600: 70 57 68 65 72 65 29 3b 0a 20 20 20 20 20 20 7d  pWhere);.      }
4610: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
4620: 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
4630: 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74  An instance of t
4640: 68 69 73 20 6f 62 6a 65 63 74 20 68 6f 6c 64 73  his object holds
4650: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 28 62 65   information (be
4660: 79 6f 6e 64 20 70 50 61 72 73 65 20 61 6e 64 20  yond pParse and 
4670: 70 53 65 6c 65 63 74 29 0a 2a 2a 20 6e 65 65 64  pSelect).** need
4680: 65 64 20 74 6f 20 6c 6f 61 64 20 74 68 65 20 6e  ed to load the n
4690: 65 78 74 20 72 65 73 75 6c 74 20 72 6f 77 20 74  ext result row t
46a0: 68 61 74 20 69 73 20 74 6f 20 62 65 20 61 64 64  hat is to be add
46b0: 65 64 20 74 6f 20 74 68 65 20 73 6f 72 74 65 72  ed to the sorter
46c0: 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72  ..*/.typedef str
46d0: 75 63 74 20 52 6f 77 4c 6f 61 64 49 6e 66 6f 20  uct RowLoadInfo 
46e0: 52 6f 77 4c 6f 61 64 49 6e 66 6f 3b 0a 73 74 72  RowLoadInfo;.str
46f0: 75 63 74 20 52 6f 77 4c 6f 61 64 49 6e 66 6f 20  uct RowLoadInfo 
4700: 7b 0a 20 20 69 6e 74 20 72 65 67 52 65 73 75 6c  {.  int regResul
4710: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
4720: 20 2f 2a 20 53 74 6f 72 65 20 72 65 73 75 6c 74   /* Store result
4730: 73 20 69 6e 20 61 72 72 61 79 20 6f 66 20 72 65  s in array of re
4740: 67 69 73 74 65 72 73 20 68 65 72 65 20 2a 2f 0a  gisters here */.
4750: 20 20 75 38 20 65 63 65 6c 46 6c 61 67 73 3b 20    u8 ecelFlags; 
4760: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
4770: 2a 20 46 6c 61 67 20 61 72 67 75 6d 65 6e 74 20  * Flag argument 
4780: 74 6f 20 45 78 70 72 43 6f 64 65 45 78 70 72 4c  to ExprCodeExprL
4790: 69 73 74 28 29 20 2a 2f 0a 23 69 66 64 65 66 20  ist() */.#ifdef 
47a0: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 4f  SQLITE_ENABLE_SO
47b0: 52 54 45 52 5f 52 45 46 45 52 45 4e 43 45 53 0a  RTER_REFERENCES.
47c0: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 78 74    ExprList *pExt
47d0: 72 61 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  ra;            /
47e0: 2a 20 45 78 74 72 61 20 63 6f 6c 75 6d 6e 73 20  * Extra columns 
47f0: 6e 65 65 64 65 64 20 62 79 20 73 6f 72 74 65 72  needed by sorter
4800: 20 72 65 66 73 20 2a 2f 0a 20 20 69 6e 74 20 72   refs */.  int r
4810: 65 67 45 78 74 72 61 52 65 73 75 6c 74 3b 20 20  egExtraResult;  
4820: 20 20 20 20 20 20 20 20 2f 2a 20 57 68 65 72 65          /* Where
4830: 20 74 6f 20 6c 6f 61 64 20 74 68 65 20 65 78 74   to load the ext
4840: 72 61 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 23 65  ra columns */.#e
4850: 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54  ndif.};../*.** T
4860: 68 69 73 20 72 6f 75 74 69 6e 65 20 64 6f 65 73  his routine does
4870: 20 74 68 65 20 77 6f 72 6b 20 6f 66 20 6c 6f 61   the work of loa
4880: 64 69 6e 67 20 71 75 65 72 79 20 64 61 74 61 20  ding query data 
4890: 69 6e 74 6f 20 61 6e 20 61 72 72 61 79 20 6f 66  into an array of
48a0: 0a 2a 2a 20 72 65 67 69 73 74 65 72 73 20 73 6f  .** registers so
48b0: 20 74 68 61 74 20 69 74 20 63 61 6e 20 62 65 20   that it can be 
48c0: 61 64 64 65 64 20 74 6f 20 74 68 65 20 73 6f 72  added to the sor
48d0: 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ter..*/.static v
48e0: 6f 69 64 20 69 6e 6e 65 72 4c 6f 6f 70 4c 6f 61  oid innerLoopLoa
48f0: 64 52 6f 77 28 0a 20 20 50 61 72 73 65 20 2a 70  dRow(.  Parse *p
4900: 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20  Parse,          
4910: 20 20 20 2f 2a 20 53 74 61 74 65 6d 65 6e 74 20     /* Statement 
4920: 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69  under constructi
4930: 6f 6e 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  on */.  Select *
4940: 70 53 65 6c 65 63 74 2c 20 20 20 20 20 20 20 20  pSelect,        
4950: 20 20 20 2f 2a 20 54 68 65 20 71 75 65 72 79 20     /* The query 
4960: 62 65 69 6e 67 20 63 6f 64 65 64 20 2a 2f 0a 20  being coded */. 
4970: 20 52 6f 77 4c 6f 61 64 49 6e 66 6f 20 2a 70 49   RowLoadInfo *pI
4980: 6e 66 6f 20 20 20 20 20 20 20 20 20 2f 2a 20 49  nfo         /* I
4990: 6e 66 6f 20 6e 65 65 64 65 64 20 74 6f 20 63 6f  nfo needed to co
49a0: 6d 70 6c 65 74 65 20 74 68 65 20 72 6f 77 20 6c  mplete the row l
49b0: 6f 61 64 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69  oad */.){.  sqli
49c0: 74 65 33 45 78 70 72 43 6f 64 65 45 78 70 72 4c  te3ExprCodeExprL
49d0: 69 73 74 28 70 50 61 72 73 65 2c 20 70 53 65 6c  ist(pParse, pSel
49e0: 65 63 74 2d 3e 70 45 4c 69 73 74 2c 20 70 49 6e  ect->pEList, pIn
49f0: 66 6f 2d 3e 72 65 67 52 65 73 75 6c 74 2c 0a 20  fo->regResult,. 
4a00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4a10: 20 20 20 20 20 20 20 20 20 30 2c 20 70 49 6e 66           0, pInf
4a20: 6f 2d 3e 65 63 65 6c 46 6c 61 67 73 29 3b 0a 23  o->ecelFlags);.#
4a30: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
4a40: 42 4c 45 5f 53 4f 52 54 45 52 5f 52 45 46 45 52  BLE_SORTER_REFER
4a50: 45 4e 43 45 53 0a 20 20 69 66 28 20 70 49 6e 66  ENCES.  if( pInf
4a60: 6f 2d 3e 70 45 78 74 72 61 20 29 7b 0a 20 20 20  o->pExtra ){.   
4a70: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
4a80: 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c  ExprList(pParse,
4a90: 20 70 49 6e 66 6f 2d 3e 70 45 78 74 72 61 2c 20   pInfo->pExtra, 
4aa0: 70 49 6e 66 6f 2d 3e 72 65 67 45 78 74 72 61 52  pInfo->regExtraR
4ab0: 65 73 75 6c 74 2c 20 30 2c 20 30 29 3b 0a 20 20  esult, 0, 0);.  
4ac0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73    sqlite3ExprLis
4ad0: 74 44 65 6c 65 74 65 28 70 50 61 72 73 65 2d 3e  tDelete(pParse->
4ae0: 64 62 2c 20 70 49 6e 66 6f 2d 3e 70 45 78 74 72  db, pInfo->pExtr
4af0: 61 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d  a);.  }.#endif.}
4b00: 0a 0a 2f 2a 0a 2a 2a 20 43 6f 64 65 20 74 68 65  ../*.** Code the
4b10: 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 20 69   OP_MakeRecord i
4b20: 6e 73 74 72 75 63 74 69 6f 6e 20 74 68 61 74 20  nstruction that 
4b30: 67 65 6e 65 72 61 74 65 73 20 74 68 65 20 65 6e  generates the en
4b40: 74 72 79 20 74 6f 20 62 65 0a 2a 2a 20 61 64 64  try to be.** add
4b50: 65 64 20 69 6e 74 6f 20 74 68 65 20 73 6f 72 74  ed into the sort
4b60: 65 72 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  er..**.** Return
4b70: 20 74 68 65 20 72 65 67 69 73 74 65 72 20 69 6e   the register in
4b80: 20 77 68 69 63 68 20 74 68 65 20 72 65 73 75 6c   which the resul
4b90: 74 20 69 73 20 73 74 6f 72 65 64 2e 0a 2a 2f 0a  t is stored..*/.
4ba0: 73 74 61 74 69 63 20 69 6e 74 20 6d 61 6b 65 53  static int makeS
4bb0: 6f 72 74 65 72 52 65 63 6f 72 64 28 0a 20 20 50  orterRecord(.  P
4bc0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 0a 20 20  arse *pParse,.  
4bd0: 53 6f 72 74 43 74 78 20 2a 70 53 6f 72 74 2c 0a  SortCtx *pSort,.
4be0: 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63    Select *pSelec
4bf0: 74 2c 0a 20 20 69 6e 74 20 72 65 67 42 61 73 65  t,.  int regBase
4c00: 2c 0a 20 20 69 6e 74 20 6e 42 61 73 65 0a 29 7b  ,.  int nBase.){
4c10: 0a 20 20 69 6e 74 20 6e 4f 42 53 61 74 20 3d 20  .  int nOBSat = 
4c20: 70 53 6f 72 74 2d 3e 6e 4f 42 53 61 74 3b 0a 20  pSort->nOBSat;. 
4c30: 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
4c40: 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20  e->pVdbe;.  int 
4c50: 72 65 67 4f 75 74 20 3d 20 2b 2b 70 50 61 72 73  regOut = ++pPars
4c60: 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 69 66 28 20 70  e->nMem;.  if( p
4c70: 53 6f 72 74 2d 3e 70 44 65 66 65 72 72 65 64 52  Sort->pDeferredR
4c80: 6f 77 4c 6f 61 64 20 29 7b 0a 20 20 20 20 69 6e  owLoad ){.    in
4c90: 6e 65 72 4c 6f 6f 70 4c 6f 61 64 52 6f 77 28 70  nerLoopLoadRow(p
4ca0: 50 61 72 73 65 2c 20 70 53 65 6c 65 63 74 2c 20  Parse, pSelect, 
4cb0: 70 53 6f 72 74 2d 3e 70 44 65 66 65 72 72 65 64  pSort->pDeferred
4cc0: 52 6f 77 4c 6f 61 64 29 3b 0a 20 20 7d 0a 20 20  RowLoad);.  }.  
4cd0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
4ce0: 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f  3(v, OP_MakeReco
4cf0: 72 64 2c 20 72 65 67 42 61 73 65 2b 6e 4f 42 53  rd, regBase+nOBS
4d00: 61 74 2c 20 6e 42 61 73 65 2d 6e 4f 42 53 61 74  at, nBase-nOBSat
4d10: 2c 20 72 65 67 4f 75 74 29 3b 0a 20 20 72 65 74  , regOut);.  ret
4d20: 75 72 6e 20 72 65 67 4f 75 74 3b 0a 7d 0a 0a 2f  urn regOut;.}../
4d30: 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  *.** Generate co
4d40: 64 65 20 74 68 61 74 20 77 69 6c 6c 20 70 75 73  de that will pus
4d50: 68 20 74 68 65 20 72 65 63 6f 72 64 20 69 6e 20  h the record in 
4d60: 72 65 67 69 73 74 65 72 73 20 72 65 67 44 61 74  registers regDat
4d70: 61 0a 2a 2a 20 74 68 72 6f 75 67 68 20 72 65 67  a.** through reg
4d80: 44 61 74 61 2b 6e 44 61 74 61 2d 31 20 6f 6e 74  Data+nData-1 ont
4d90: 6f 20 74 68 65 20 73 6f 72 74 65 72 2e 0a 2a 2f  o the sorter..*/
4da0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 75 73  .static void pus
4db0: 68 4f 6e 74 6f 53 6f 72 74 65 72 28 0a 20 20 50  hOntoSorter(.  P
4dc0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
4dd0: 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65 72 20        /* Parser 
4de0: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 6f 72  context */.  Sor
4df0: 74 43 74 78 20 2a 70 53 6f 72 74 2c 20 20 20 20  tCtx *pSort,    
4e00: 20 20 20 20 2f 2a 20 49 6e 66 6f 72 6d 61 74 69      /* Informati
4e10: 6f 6e 20 61 62 6f 75 74 20 74 68 65 20 4f 52 44  on about the ORD
4e20: 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a  ER BY clause */.
4e30: 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63    Select *pSelec
4e40: 74 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  t,       /* The 
4e50: 77 68 6f 6c 65 20 53 45 4c 45 43 54 20 73 74 61  whole SELECT sta
4e60: 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20  tement */.  int 
4e70: 72 65 67 44 61 74 61 2c 20 20 20 20 20 20 20 20  regData,        
4e80: 20 20 20 2f 2a 20 46 69 72 73 74 20 72 65 67 69     /* First regi
4e90: 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 64 61 74  ster holding dat
4ea0: 61 20 74 6f 20 62 65 20 73 6f 72 74 65 64 20 2a  a to be sorted *
4eb0: 2f 0a 20 20 69 6e 74 20 72 65 67 4f 72 69 67 44  /.  int regOrigD
4ec0: 61 74 61 2c 20 20 20 20 20 20 20 2f 2a 20 46 69  ata,       /* Fi
4ed0: 72 73 74 20 72 65 67 69 73 74 65 72 20 68 6f 6c  rst register hol
4ee0: 64 69 6e 67 20 64 61 74 61 20 62 65 66 6f 72 65  ding data before
4ef0: 20 70 61 63 6b 69 6e 67 20 2a 2f 0a 20 20 69 6e   packing */.  in
4f00: 74 20 6e 44 61 74 61 2c 20 20 20 20 20 20 20 20  t nData,        
4f10: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
4f20: 66 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20 74 68  f elements in th
4f30: 65 20 72 65 67 44 61 74 61 20 64 61 74 61 20 61  e regData data a
4f40: 72 72 61 79 20 2a 2f 0a 20 20 69 6e 74 20 6e 50  rray */.  int nP
4f50: 72 65 66 69 78 52 65 67 20 20 20 20 20 20 20 20  refixReg        
4f60: 20 2f 2a 20 4e 6f 2e 20 6f 66 20 72 65 67 20 70   /* No. of reg p
4f70: 72 69 6f 72 20 74 6f 20 72 65 67 44 61 74 61 20  rior to regData 
4f80: 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 75 73  available for us
4f90: 65 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a  e */.){.  Vdbe *
4fa0: 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
4fb0: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
4fc0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74             /* St
4fd0: 6d 74 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75  mt under constru
4fe0: 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 62  ction */.  int b
4ff0: 53 65 71 20 3d 20 28 28 70 53 6f 72 74 2d 3e 73  Seq = ((pSort->s
5000: 6f 72 74 46 6c 61 67 73 20 26 20 53 4f 52 54 46  ortFlags & SORTF
5010: 4c 41 47 5f 55 73 65 53 6f 72 74 65 72 29 3d 3d  LAG_UseSorter)==
5020: 30 29 3b 0a 20 20 69 6e 74 20 6e 45 78 70 72 20  0);.  int nExpr 
5030: 3d 20 70 53 6f 72 74 2d 3e 70 4f 72 64 65 72 42  = pSort->pOrderB
5040: 79 2d 3e 6e 45 78 70 72 3b 20 20 20 20 20 20 20  y->nExpr;       
5050: 20 20 20 20 20 20 20 2f 2a 20 4e 6f 2e 20 6f 66         /* No. of
5060: 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d 73 20   ORDER BY terms 
5070: 2a 2f 0a 20 20 69 6e 74 20 6e 42 61 73 65 20 3d  */.  int nBase =
5080: 20 6e 45 78 70 72 20 2b 20 62 53 65 71 20 2b 20   nExpr + bSeq + 
5090: 6e 44 61 74 61 3b 20 20 20 20 20 20 20 20 20 20  nData;          
50a0: 20 20 20 20 20 20 2f 2a 20 46 69 65 6c 64 73 20        /* Fields 
50b0: 69 6e 20 73 6f 72 74 65 72 20 72 65 63 6f 72 64  in sorter record
50c0: 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 42 61 73   */.  int regBas
50d0: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
50e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
50f0: 20 20 20 20 20 20 20 2f 2a 20 52 65 67 73 20 66         /* Regs f
5100: 6f 72 20 73 6f 72 74 65 72 20 72 65 63 6f 72 64  or sorter record
5110: 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 52 65 63   */.  int regRec
5120: 6f 72 64 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ord = 0;        
5130: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5140: 20 20 20 20 20 20 20 2f 2a 20 41 73 73 65 6d 62         /* Assemb
5150: 6c 65 64 20 73 6f 72 74 65 72 20 72 65 63 6f 72  led sorter recor
5160: 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f 42 53 61  d */.  int nOBSa
5170: 74 20 3d 20 70 53 6f 72 74 2d 3e 6e 4f 42 53 61  t = pSort->nOBSa
5180: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
5190: 20 20 20 20 20 20 20 20 2f 2a 20 4f 52 44 45 52          /* ORDER
51a0: 20 42 59 20 74 65 72 6d 73 20 74 6f 20 73 6b 69   BY terms to ski
51b0: 70 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 3b 20 20  p */.  int op;  
51c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
51d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 63            /* Opc
51e0: 6f 64 65 20 74 6f 20 61 64 64 20 73 6f 72 74 65  ode to add sorte
51f0: 72 20 72 65 63 6f 72 64 20 74 6f 20 73 6f 72 74  r record to sort
5200: 65 72 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 69 6d  er */.  int iLim
5210: 69 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  it;             
5220: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 49             /* LI
5230: 4d 49 54 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  MIT counter */. 
5240: 20 69 6e 74 20 69 53 6b 69 70 20 3d 20 30 3b 20   int iSkip = 0; 
5250: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5260: 20 20 20 20 2f 2a 20 45 6e 64 20 6f 66 20 74 68      /* End of th
5270: 65 20 73 6f 72 74 65 72 20 69 6e 73 65 72 74 20  e sorter insert 
5280: 6c 6f 6f 70 20 2a 2f 0a 0a 20 20 61 73 73 65 72  loop */..  asser
5290: 74 28 20 62 53 65 71 3d 3d 30 20 7c 7c 20 62 53  t( bSeq==0 || bS
52a0: 65 71 3d 3d 31 20 29 3b 0a 0a 20 20 2f 2a 20 54  eq==1 );..  /* T
52b0: 68 72 65 65 20 63 61 73 65 73 3a 0a 20 20 2a 2a  hree cases:.  **
52c0: 20 20 20 28 31 29 20 54 68 65 20 64 61 74 61 20     (1) The data 
52d0: 74 6f 20 62 65 20 73 6f 72 74 65 64 20 68 61 73  to be sorted has
52e0: 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 70 61   already been pa
52f0: 63 6b 65 64 20 69 6e 74 6f 20 61 20 52 65 63 6f  cked into a Reco
5300: 72 64 0a 20 20 2a 2a 20 20 20 20 20 20 20 62 79  rd.  **       by
5310: 20 61 20 70 72 69 6f 72 20 4f 50 5f 4d 61 6b 65   a prior OP_Make
5320: 52 65 63 6f 72 64 2e 20 20 49 6e 20 74 68 69 73  Record.  In this
5330: 20 63 61 73 65 20 6e 44 61 74 61 3d 3d 31 20 61   case nData==1 a
5340: 6e 64 20 72 65 67 44 61 74 61 0a 20 20 2a 2a 20  nd regData.  ** 
5350: 20 20 20 20 20 20 77 69 6c 6c 20 62 65 20 63 6f        will be co
5360: 6d 70 6c 65 74 65 6c 79 20 75 6e 72 65 6c 61 74  mpletely unrelat
5370: 65 64 20 74 6f 20 72 65 67 4f 72 69 67 44 61 74  ed to regOrigDat
5380: 61 2e 0a 20 20 2a 2a 20 20 20 28 32 29 20 41 6c  a..  **   (2) Al
5390: 6c 20 6f 75 74 70 75 74 20 63 6f 6c 75 6d 6e 73  l output columns
53a0: 20 61 72 65 20 69 6e 63 6c 75 64 65 64 20 69 6e   are included in
53b0: 20 74 68 65 20 73 6f 72 74 20 72 65 63 6f 72 64   the sort record
53c0: 2e 20 20 49 6e 20 74 68 61 74 0a 20 20 2a 2a 20  .  In that.  ** 
53d0: 20 20 20 20 20 20 63 61 73 65 20 72 65 67 44 61        case regDa
53e0: 74 61 3d 3d 72 65 67 4f 72 69 67 44 61 74 61 2e  ta==regOrigData.
53f0: 0a 20 20 2a 2a 20 20 20 28 33 29 20 53 6f 6d 65  .  **   (3) Some
5400: 20 6f 75 74 70 75 74 20 63 6f 6c 75 6d 6e 73 20   output columns 
5410: 61 72 65 20 6f 6d 69 74 74 65 64 20 66 72 6f 6d  are omitted from
5420: 20 74 68 65 20 73 6f 72 74 20 72 65 63 6f 72 64   the sort record
5430: 20 64 75 65 20 74 6f 0a 20 20 2a 2a 20 20 20 20   due to.  **    
5440: 20 20 20 74 68 65 20 53 51 4c 49 54 45 5f 45 4e     the SQLITE_EN
5450: 41 42 4c 45 5f 53 4f 52 54 45 52 5f 52 45 46 45  ABLE_SORTER_REFE
5460: 52 45 4e 43 45 20 6f 70 74 69 6d 69 7a 61 74 69  RENCE optimizati
5470: 6f 6e 2c 20 6f 72 20 64 75 65 20 74 6f 20 74 68  on, or due to th
5480: 65 0a 20 20 2a 2a 20 20 20 20 20 20 20 53 51 4c  e.  **       SQL
5490: 49 54 45 5f 45 43 45 4c 5f 4f 4d 49 54 52 45 46  ITE_ECEL_OMITREF
54a0: 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2c 20 6f   optimization, o
54b0: 72 20 64 75 65 20 74 6f 20 74 68 65 20 0a 20 20  r due to the .  
54c0: 2a 2a 20 20 20 20 20 20 20 53 6f 72 74 43 74 78  **       SortCtx
54d0: 2e 70 44 65 66 65 72 72 65 64 52 6f 77 4c 6f 61  .pDeferredRowLoa
54e0: 64 20 6f 70 74 69 6d 69 61 74 69 6f 6e 2e 20 20  d optimiation.  
54f0: 49 6e 20 61 6e 79 20 6f 66 20 74 68 65 73 65 20  In any of these 
5500: 63 61 73 65 73 0a 20 20 2a 2a 20 20 20 20 20 20  cases.  **      
5510: 20 72 65 67 4f 72 69 67 44 61 74 61 20 69 73 20   regOrigData is 
5520: 30 20 74 6f 20 70 72 65 76 65 6e 74 20 74 68 69  0 to prevent thi
5530: 73 20 72 6f 75 74 69 6e 65 20 66 72 6f 6d 20 74  s routine from t
5540: 72 79 69 6e 67 20 74 6f 20 63 6f 70 79 0a 20 20  rying to copy.  
5550: 2a 2a 20 20 20 20 20 20 20 76 61 6c 75 65 73 20  **       values 
5560: 74 68 61 74 20 6d 69 67 68 74 20 6e 6f 74 20 79  that might not y
5570: 65 74 20 65 78 69 73 74 2e 0a 20 20 2a 2f 0a 20  et exist..  */. 
5580: 20 61 73 73 65 72 74 28 20 6e 44 61 74 61 3d 3d   assert( nData==
5590: 31 20 7c 7c 20 72 65 67 44 61 74 61 3d 3d 72 65  1 || regData==re
55a0: 67 4f 72 69 67 44 61 74 61 20 7c 7c 20 72 65 67  gOrigData || reg
55b0: 4f 72 69 67 44 61 74 61 3d 3d 30 20 29 3b 0a 0a  OrigData==0 );..
55c0: 20 20 69 66 28 20 6e 50 72 65 66 69 78 52 65 67    if( nPrefixReg
55d0: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
55e0: 6e 50 72 65 66 69 78 52 65 67 3d 3d 6e 45 78 70  nPrefixReg==nExp
55f0: 72 2b 62 53 65 71 20 29 3b 0a 20 20 20 20 72 65  r+bSeq );.    re
5600: 67 42 61 73 65 20 3d 20 72 65 67 44 61 74 61 20  gBase = regData 
5610: 2d 20 6e 50 72 65 66 69 78 52 65 67 3b 0a 20 20  - nPrefixReg;.  
5620: 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 67 42 61  }else{.    regBa
5630: 73 65 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65  se = pParse->nMe
5640: 6d 20 2b 20 31 3b 0a 20 20 20 20 70 50 61 72 73  m + 1;.    pPars
5650: 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 42 61 73 65  e->nMem += nBase
5660: 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
5670: 70 53 65 6c 65 63 74 2d 3e 69 4f 66 66 73 65 74  pSelect->iOffset
5680: 3d 3d 30 20 7c 7c 20 70 53 65 6c 65 63 74 2d 3e  ==0 || pSelect->
5690: 69 4c 69 6d 69 74 21 3d 30 20 29 3b 0a 20 20 69  iLimit!=0 );.  i
56a0: 4c 69 6d 69 74 20 3d 20 70 53 65 6c 65 63 74 2d  Limit = pSelect-
56b0: 3e 69 4f 66 66 73 65 74 20 3f 20 70 53 65 6c 65  >iOffset ? pSele
56c0: 63 74 2d 3e 69 4f 66 66 73 65 74 2b 31 20 3a 20  ct->iOffset+1 : 
56d0: 70 53 65 6c 65 63 74 2d 3e 69 4c 69 6d 69 74 3b  pSelect->iLimit;
56e0: 0a 20 20 70 53 6f 72 74 2d 3e 6c 61 62 65 6c 44  .  pSort->labelD
56f0: 6f 6e 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62  one = sqlite3Vdb
5700: 65 4d 61 6b 65 4c 61 62 65 6c 28 70 50 61 72 73  eMakeLabel(pPars
5710: 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70  e);.  sqlite3Exp
5720: 72 43 6f 64 65 45 78 70 72 4c 69 73 74 28 70 50  rCodeExprList(pP
5730: 61 72 73 65 2c 20 70 53 6f 72 74 2d 3e 70 4f 72  arse, pSort->pOr
5740: 64 65 72 42 79 2c 20 72 65 67 42 61 73 65 2c 20  derBy, regBase, 
5750: 72 65 67 4f 72 69 67 44 61 74 61 2c 0a 20 20 20  regOrigData,.   
5760: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5770: 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 45 43         SQLITE_EC
5780: 45 4c 5f 44 55 50 20 7c 20 28 72 65 67 4f 72 69  EL_DUP | (regOri
5790: 67 44 61 74 61 3f 20 53 51 4c 49 54 45 5f 45 43  gData? SQLITE_EC
57a0: 45 4c 5f 52 45 46 20 3a 20 30 29 29 3b 0a 20 20  EL_REF : 0));.  
57b0: 69 66 28 20 62 53 65 71 20 29 7b 0a 20 20 20 20  if( bSeq ){.    
57c0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
57d0: 32 28 76 2c 20 4f 50 5f 53 65 71 75 65 6e 63 65  2(v, OP_Sequence
57e0: 2c 20 70 53 6f 72 74 2d 3e 69 45 43 75 72 73 6f  , pSort->iECurso
57f0: 72 2c 20 72 65 67 42 61 73 65 2b 6e 45 78 70 72  r, regBase+nExpr
5800: 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 50 72  );.  }.  if( nPr
5810: 65 66 69 78 52 65 67 3d 3d 30 20 26 26 20 6e 44  efixReg==0 && nD
5820: 61 74 61 3e 30 20 29 7b 0a 20 20 20 20 73 71 6c  ata>0 ){.    sql
5830: 69 74 65 33 45 78 70 72 43 6f 64 65 4d 6f 76 65  ite3ExprCodeMove
5840: 28 70 50 61 72 73 65 2c 20 72 65 67 44 61 74 61  (pParse, regData
5850: 2c 20 72 65 67 42 61 73 65 2b 6e 45 78 70 72 2b  , regBase+nExpr+
5860: 62 53 65 71 2c 20 6e 44 61 74 61 29 3b 0a 20 20  bSeq, nData);.  
5870: 7d 0a 20 20 69 66 28 20 6e 4f 42 53 61 74 3e 30  }.  if( nOBSat>0
5880: 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 65 67 50   ){.    int regP
5890: 72 65 76 4b 65 79 3b 20 20 20 2f 2a 20 54 68 65  revKey;   /* The
58a0: 20 66 69 72 73 74 20 6e 4f 42 53 61 74 20 63 6f   first nOBSat co
58b0: 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20 70 72 65  lumns of the pre
58c0: 76 69 6f 75 73 20 72 6f 77 20 2a 2f 0a 20 20 20  vious row */.   
58d0: 20 69 6e 74 20 61 64 64 72 46 69 72 73 74 3b 20   int addrFirst; 
58e0: 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66     /* Address of
58f0: 20 74 68 65 20 4f 50 5f 49 66 4e 6f 74 20 6f 70   the OP_IfNot op
5900: 63 6f 64 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20  code */.    int 
5910: 61 64 64 72 4a 6d 70 3b 20 20 20 20 20 20 2f 2a  addrJmp;      /*
5920: 20 41 64 64 72 65 73 73 20 6f 66 20 74 68 65 20   Address of the 
5930: 4f 50 5f 4a 75 6d 70 20 6f 70 63 6f 64 65 20 2a  OP_Jump opcode *
5940: 2f 0a 20 20 20 20 56 64 62 65 4f 70 20 2a 70 4f  /.    VdbeOp *pO
5950: 70 3b 20 20 20 20 20 20 2f 2a 20 4f 70 63 6f 64  p;      /* Opcod
5960: 65 20 74 68 61 74 20 6f 70 65 6e 73 20 74 68 65  e that opens the
5970: 20 73 6f 72 74 65 72 20 2a 2f 0a 20 20 20 20 69   sorter */.    i
5980: 6e 74 20 6e 4b 65 79 3b 20 20 20 20 20 20 20 20  nt nKey;        
5990: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 73 6f   /* Number of so
59a0: 72 74 69 6e 67 20 6b 65 79 20 63 6f 6c 75 6d 6e  rting key column
59b0: 73 2c 20 69 6e 63 6c 75 64 69 6e 67 20 4f 50 5f  s, including OP_
59c0: 53 65 71 75 65 6e 63 65 20 2a 2f 0a 20 20 20 20  Sequence */.    
59d0: 4b 65 79 49 6e 66 6f 20 2a 70 4b 49 3b 20 20 20  KeyInfo *pKI;   
59e0: 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 4b 65    /* Original Ke
59f0: 79 49 6e 66 6f 20 6f 6e 20 74 68 65 20 73 6f 72  yInfo on the sor
5a00: 74 65 72 20 74 61 62 6c 65 20 2a 2f 0a 0a 20 20  ter table */..  
5a10: 20 20 72 65 67 52 65 63 6f 72 64 20 3d 20 6d 61    regRecord = ma
5a20: 6b 65 53 6f 72 74 65 72 52 65 63 6f 72 64 28 70  keSorterRecord(p
5a30: 50 61 72 73 65 2c 20 70 53 6f 72 74 2c 20 70 53  Parse, pSort, pS
5a40: 65 6c 65 63 74 2c 20 72 65 67 42 61 73 65 2c 20  elect, regBase, 
5a50: 6e 42 61 73 65 29 3b 0a 20 20 20 20 72 65 67 50  nBase);.    regP
5a60: 72 65 76 4b 65 79 20 3d 20 70 50 61 72 73 65 2d  revKey = pParse-
5a70: 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20 70 50 61  >nMem+1;.    pPa
5a80: 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 70 53 6f  rse->nMem += pSo
5a90: 72 74 2d 3e 6e 4f 42 53 61 74 3b 0a 20 20 20 20  rt->nOBSat;.    
5aa0: 6e 4b 65 79 20 3d 20 6e 45 78 70 72 20 2d 20 70  nKey = nExpr - p
5ab0: 53 6f 72 74 2d 3e 6e 4f 42 53 61 74 20 2b 20 62  Sort->nOBSat + b
5ac0: 53 65 71 3b 0a 20 20 20 20 69 66 28 20 62 53 65  Seq;.    if( bSe
5ad0: 71 20 29 7b 0a 20 20 20 20 20 20 61 64 64 72 46  q ){.      addrF
5ae0: 69 72 73 74 20 3d 20 73 71 6c 69 74 65 33 56 64  irst = sqlite3Vd
5af0: 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49  beAddOp1(v, OP_I
5b00: 66 4e 6f 74 2c 20 72 65 67 42 61 73 65 2b 6e 45  fNot, regBase+nE
5b10: 78 70 72 29 3b 20 0a 20 20 20 20 7d 65 6c 73 65  xpr); .    }else
5b20: 7b 0a 20 20 20 20 20 20 61 64 64 72 46 69 72 73  {.      addrFirs
5b30: 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  t = sqlite3VdbeA
5b40: 64 64 4f 70 31 28 76 2c 20 4f 50 5f 53 65 71 75  ddOp1(v, OP_Sequ
5b50: 65 6e 63 65 54 65 73 74 2c 20 70 53 6f 72 74 2d  enceTest, pSort-
5b60: 3e 69 45 43 75 72 73 6f 72 29 3b 0a 20 20 20 20  >iECursor);.    
5b70: 7d 0a 20 20 20 20 56 64 62 65 43 6f 76 65 72 61  }.    VdbeCovera
5b80: 67 65 28 76 29 3b 0a 20 20 20 20 73 71 6c 69 74  ge(v);.    sqlit
5b90: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
5ba0: 4f 50 5f 43 6f 6d 70 61 72 65 2c 20 72 65 67 50  OP_Compare, regP
5bb0: 72 65 76 4b 65 79 2c 20 72 65 67 42 61 73 65 2c  revKey, regBase,
5bc0: 20 70 53 6f 72 74 2d 3e 6e 4f 42 53 61 74 29 3b   pSort->nOBSat);
5bd0: 0a 20 20 20 20 70 4f 70 20 3d 20 73 71 6c 69 74  .    pOp = sqlit
5be0: 65 33 56 64 62 65 47 65 74 4f 70 28 76 2c 20 70  e3VdbeGetOp(v, p
5bf0: 53 6f 72 74 2d 3e 61 64 64 72 53 6f 72 74 49 6e  Sort->addrSortIn
5c00: 64 65 78 29 3b 0a 20 20 20 20 69 66 28 20 70 50  dex);.    if( pP
5c10: 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  arse->db->malloc
5c20: 46 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b  Failed ) return;
5c30: 0a 20 20 20 20 70 4f 70 2d 3e 70 32 20 3d 20 6e  .    pOp->p2 = n
5c40: 4b 65 79 20 2b 20 6e 44 61 74 61 3b 0a 20 20 20  Key + nData;.   
5c50: 20 70 4b 49 20 3d 20 70 4f 70 2d 3e 70 34 2e 70   pKI = pOp->p4.p
5c60: 4b 65 79 49 6e 66 6f 3b 0a 20 20 20 20 6d 65 6d  KeyInfo;.    mem
5c70: 73 65 74 28 70 4b 49 2d 3e 61 53 6f 72 74 4f 72  set(pKI->aSortOr
5c80: 64 65 72 2c 20 30 2c 20 70 4b 49 2d 3e 6e 4b 65  der, 0, pKI->nKe
5c90: 79 46 69 65 6c 64 29 3b 20 2f 2a 20 4d 61 6b 65  yField); /* Make
5ca0: 73 20 4f 50 5f 4a 75 6d 70 20 74 65 73 74 61 62  s OP_Jump testab
5cb0: 6c 65 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65  le */.    sqlite
5cc0: 33 56 64 62 65 43 68 61 6e 67 65 50 34 28 76 2c  3VdbeChangeP4(v,
5cd0: 20 2d 31 2c 20 28 63 68 61 72 2a 29 70 4b 49 2c   -1, (char*)pKI,
5ce0: 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20   P4_KEYINFO);.  
5cf0: 20 20 74 65 73 74 63 61 73 65 28 20 70 4b 49 2d    testcase( pKI-
5d00: 3e 6e 41 6c 6c 46 69 65 6c 64 20 3e 20 70 4b 49  >nAllField > pKI
5d10: 2d 3e 6e 4b 65 79 46 69 65 6c 64 2b 32 20 29 3b  ->nKeyField+2 );
5d20: 0a 20 20 20 20 70 4f 70 2d 3e 70 34 2e 70 4b 65  .    pOp->p4.pKe
5d30: 79 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 4b  yInfo = sqlite3K
5d40: 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69  eyInfoFromExprLi
5d50: 73 74 28 70 50 61 72 73 65 2c 70 53 6f 72 74 2d  st(pParse,pSort-
5d60: 3e 70 4f 72 64 65 72 42 79 2c 6e 4f 42 53 61 74  >pOrderBy,nOBSat
5d70: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
5d80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5d90: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 4b 49               pKI
5da0: 2d 3e 6e 41 6c 6c 46 69 65 6c 64 2d 70 4b 49 2d  ->nAllField-pKI-
5db0: 3e 6e 4b 65 79 46 69 65 6c 64 2d 31 29 3b 0a 20  >nKeyField-1);. 
5dc0: 20 20 20 61 64 64 72 4a 6d 70 20 3d 20 73 71 6c     addrJmp = sql
5dd0: 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
5de0: 64 64 72 28 76 29 3b 0a 20 20 20 20 73 71 6c 69  ddr(v);.    sqli
5df0: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
5e00: 20 4f 50 5f 4a 75 6d 70 2c 20 61 64 64 72 4a 6d   OP_Jump, addrJm
5e10: 70 2b 31 2c 20 30 2c 20 61 64 64 72 4a 6d 70 2b  p+1, 0, addrJmp+
5e20: 31 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  1); VdbeCoverage
5e30: 28 76 29 3b 0a 20 20 20 20 70 53 6f 72 74 2d 3e  (v);.    pSort->
5e40: 6c 61 62 65 6c 42 6b 4f 75 74 20 3d 20 73 71 6c  labelBkOut = sql
5e50: 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
5e60: 6c 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 70  l(pParse);.    p
5e70: 53 6f 72 74 2d 3e 72 65 67 52 65 74 75 72 6e 20  Sort->regReturn 
5e80: 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
5e90: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
5ea0: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f  eAddOp2(v, OP_Go
5eb0: 73 75 62 2c 20 70 53 6f 72 74 2d 3e 72 65 67 52  sub, pSort->regR
5ec0: 65 74 75 72 6e 2c 20 70 53 6f 72 74 2d 3e 6c 61  eturn, pSort->la
5ed0: 62 65 6c 42 6b 4f 75 74 29 3b 0a 20 20 20 20 73  belBkOut);.    s
5ee0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
5ef0: 28 76 2c 20 4f 50 5f 52 65 73 65 74 53 6f 72 74  (v, OP_ResetSort
5f00: 65 72 2c 20 70 53 6f 72 74 2d 3e 69 45 43 75 72  er, pSort->iECur
5f10: 73 6f 72 29 3b 0a 20 20 20 20 69 66 28 20 69 4c  sor);.    if( iL
5f20: 69 6d 69 74 20 29 7b 0a 20 20 20 20 20 20 73 71  imit ){.      sq
5f30: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
5f40: 76 2c 20 4f 50 5f 49 66 4e 6f 74 2c 20 69 4c 69  v, OP_IfNot, iLi
5f50: 6d 69 74 2c 20 70 53 6f 72 74 2d 3e 6c 61 62 65  mit, pSort->labe
5f60: 6c 44 6f 6e 65 29 3b 0a 20 20 20 20 20 20 56 64  lDone);.      Vd
5f70: 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
5f80: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
5f90: 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
5fa0: 61 64 64 72 46 69 72 73 74 29 3b 0a 20 20 20 20  addrFirst);.    
5fb0: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 4d  sqlite3ExprCodeM
5fc0: 6f 76 65 28 70 50 61 72 73 65 2c 20 72 65 67 42  ove(pParse, regB
5fd0: 61 73 65 2c 20 72 65 67 50 72 65 76 4b 65 79 2c  ase, regPrevKey,
5fe0: 20 70 53 6f 72 74 2d 3e 6e 4f 42 53 61 74 29 3b   pSort->nOBSat);
5ff0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
6000: 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72  JumpHere(v, addr
6010: 4a 6d 70 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  Jmp);.  }.  if( 
6020: 69 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 2f 2a  iLimit ){.    /*
6030: 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 20 74   At this point t
6040: 68 65 20 76 61 6c 75 65 73 20 66 6f 72 20 74 68  he values for th
6050: 65 20 6e 65 77 20 73 6f 72 74 65 72 20 65 6e 74  e new sorter ent
6060: 72 79 20 61 72 65 20 73 74 6f 72 65 64 0a 20 20  ry are stored.  
6070: 20 20 2a 2a 20 69 6e 20 61 6e 20 61 72 72 61 79    ** in an array
6080: 20 6f 66 20 72 65 67 69 73 74 65 72 73 2e 20 54   of registers. T
6090: 68 65 79 20 6e 65 65 64 20 74 6f 20 62 65 20 63  hey need to be c
60a0: 6f 6d 70 6f 73 65 64 20 69 6e 74 6f 20 61 20 72  omposed into a r
60b0: 65 63 6f 72 64 0a 20 20 20 20 2a 2a 20 61 6e 64  ecord.    ** and
60c0: 20 69 6e 73 65 72 74 65 64 20 69 6e 74 6f 20 74   inserted into t
60d0: 68 65 20 73 6f 72 74 65 72 20 69 66 20 65 69 74  he sorter if eit
60e0: 68 65 72 20 28 61 29 20 74 68 65 72 65 20 61 72  her (a) there ar
60f0: 65 20 63 75 72 72 65 6e 74 6c 79 0a 20 20 20 20  e currently.    
6100: 2a 2a 20 6c 65 73 73 20 74 68 61 6e 20 4c 49 4d  ** less than LIM
6110: 49 54 2b 4f 46 46 53 45 54 20 69 74 65 6d 73 20  IT+OFFSET items 
6120: 6f 72 20 28 62 29 20 74 68 65 20 6e 65 77 20 72  or (b) the new r
6130: 65 63 6f 72 64 20 69 73 20 73 6d 61 6c 6c 65 72  ecord is smaller
6140: 20 74 68 61 6e 20 0a 20 20 20 20 2a 2a 20 74 68   than .    ** th
6150: 65 20 6c 61 72 67 65 73 74 20 72 65 63 6f 72 64  e largest record
6160: 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 74 68   currently in th
6170: 65 20 73 6f 72 74 65 72 2e 20 49 66 20 28 62 29  e sorter. If (b)
6180: 20 69 73 20 74 72 75 65 20 61 6e 64 20 74 68 65   is true and the
6190: 72 65 0a 20 20 20 20 2a 2a 20 61 72 65 20 61 6c  re.    ** are al
61a0: 72 65 61 64 79 20 4c 49 4d 49 54 2b 4f 46 46 53  ready LIMIT+OFFS
61b0: 45 54 20 69 74 65 6d 73 20 69 6e 20 74 68 65 20  ET items in the 
61c0: 73 6f 72 74 65 72 2c 20 64 65 6c 65 74 65 20 74  sorter, delete t
61d0: 68 65 20 6c 61 72 67 65 73 74 0a 20 20 20 20 2a  he largest.    *
61e0: 2a 20 65 6e 74 72 79 20 62 65 66 6f 72 65 20 69  * entry before i
61f0: 6e 73 65 72 74 69 6e 67 20 74 68 65 20 6e 65 77  nserting the new
6200: 20 6f 6e 65 2e 20 54 68 69 73 20 77 61 79 20 74   one. This way t
6210: 68 65 72 65 20 61 72 65 20 6e 65 76 65 72 20 6d  here are never m
6220: 6f 72 65 20 0a 20 20 20 20 2a 2a 20 74 68 61 6e  ore .    ** than
6230: 20 4c 49 4d 49 54 2b 4f 46 46 53 45 54 20 69 74   LIMIT+OFFSET it
6240: 65 6d 73 20 69 6e 20 74 68 65 20 73 6f 72 74 65  ems in the sorte
6250: 72 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  r..    **.    **
6260: 20 49 66 20 74 68 65 20 6e 65 77 20 72 65 63 6f   If the new reco
6270: 72 64 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64  rd does not need
6280: 20 74 6f 20 62 65 20 69 6e 73 65 72 74 65 64 20   to be inserted 
6290: 69 6e 74 6f 20 74 68 65 20 73 6f 72 74 65 72 2c  into the sorter,
62a0: 0a 20 20 20 20 2a 2a 20 6a 75 6d 70 20 74 6f 20  .    ** jump to 
62b0: 74 68 65 20 6e 65 78 74 20 69 74 65 72 61 74 69  the next iterati
62c0: 6f 6e 20 6f 66 20 74 68 65 20 6c 6f 6f 70 2e 20  on of the loop. 
62d0: 49 66 20 74 68 65 20 70 53 6f 72 74 2d 3e 6c 61  If the pSort->la
62e0: 62 65 6c 4f 42 4c 6f 70 74 0a 20 20 20 20 2a 2a  belOBLopt.    **
62f0: 20 76 61 6c 75 65 20 69 73 20 6e 6f 74 20 7a 65   value is not ze
6300: 72 6f 2c 20 74 68 65 6e 20 69 74 20 69 73 20 61  ro, then it is a
6310: 20 6c 61 62 65 6c 20 6f 66 20 77 68 65 72 65 20   label of where 
6320: 74 6f 20 6a 75 6d 70 2e 20 20 4f 74 68 65 72 77  to jump.  Otherw
6330: 69 73 65 2c 0a 20 20 20 20 2a 2a 20 6a 75 73 74  ise,.    ** just
6340: 20 62 79 70 61 73 73 20 74 68 65 20 72 6f 77 20   bypass the row 
6350: 69 6e 73 65 72 74 20 6c 6f 67 69 63 2e 20 20 53  insert logic.  S
6360: 65 65 20 74 68 65 20 68 65 61 64 65 72 20 63 6f  ee the header co
6370: 6d 6d 65 6e 74 20 6f 6e 20 74 68 65 0a 20 20 20  mment on the.   
6380: 20 2a 2a 20 73 71 6c 69 74 65 33 57 68 65 72 65   ** sqlite3Where
6390: 4f 72 64 65 72 42 79 4c 69 6d 69 74 4f 70 74 4c  OrderByLimitOptL
63a0: 61 62 65 6c 28 29 20 66 75 6e 63 74 69 6f 6e 20  abel() function 
63b0: 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69  for additional i
63c0: 6e 66 6f 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  nfo..    */.    
63d0: 69 6e 74 20 69 43 73 72 20 3d 20 70 53 6f 72 74  int iCsr = pSort
63e0: 2d 3e 69 45 43 75 72 73 6f 72 3b 0a 20 20 20 20  ->iECursor;.    
63f0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
6400: 32 28 76 2c 20 4f 50 5f 49 66 4e 6f 74 5a 65 72  2(v, OP_IfNotZer
6410: 6f 2c 20 69 4c 69 6d 69 74 2c 20 73 71 6c 69 74  o, iLimit, sqlit
6420: 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
6430: 72 28 76 29 2b 34 29 3b 0a 20 20 20 20 56 64 62  r(v)+4);.    Vdb
6440: 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
6450: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
6460: 4f 70 32 28 76 2c 20 4f 50 5f 4c 61 73 74 2c 20  Op2(v, OP_Last, 
6470: 69 43 73 72 2c 20 30 29 3b 0a 20 20 20 20 69 53  iCsr, 0);.    iS
6480: 6b 69 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62  kip = sqlite3Vdb
6490: 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50  eAddOp4Int(v, OP
64a0: 5f 49 64 78 4c 45 2c 0a 20 20 20 20 20 20 20 20  _IdxLE,.        
64b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
64c0: 20 20 20 20 20 20 20 20 20 69 43 73 72 2c 20 30           iCsr, 0
64d0: 2c 20 72 65 67 42 61 73 65 2b 6e 4f 42 53 61 74  , regBase+nOBSat
64e0: 2c 20 6e 45 78 70 72 2d 6e 4f 42 53 61 74 29 3b  , nExpr-nOBSat);
64f0: 0a 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67  .    VdbeCoverag
6500: 65 28 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  e(v);.    sqlite
6510: 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
6520: 50 5f 44 65 6c 65 74 65 2c 20 69 43 73 72 29 3b  P_Delete, iCsr);
6530: 0a 20 20 7d 0a 20 20 69 66 28 20 72 65 67 52 65  .  }.  if( regRe
6540: 63 6f 72 64 3d 3d 30 20 29 7b 0a 20 20 20 20 72  cord==0 ){.    r
6550: 65 67 52 65 63 6f 72 64 20 3d 20 6d 61 6b 65 53  egRecord = makeS
6560: 6f 72 74 65 72 52 65 63 6f 72 64 28 70 50 61 72  orterRecord(pPar
6570: 73 65 2c 20 70 53 6f 72 74 2c 20 70 53 65 6c 65  se, pSort, pSele
6580: 63 74 2c 20 72 65 67 42 61 73 65 2c 20 6e 42 61  ct, regBase, nBa
6590: 73 65 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  se);.  }.  if( p
65a0: 53 6f 72 74 2d 3e 73 6f 72 74 46 6c 61 67 73 20  Sort->sortFlags 
65b0: 26 20 53 4f 52 54 46 4c 41 47 5f 55 73 65 53 6f  & SORTFLAG_UseSo
65c0: 72 74 65 72 20 29 7b 0a 20 20 20 20 6f 70 20 3d  rter ){.    op =
65d0: 20 4f 50 5f 53 6f 72 74 65 72 49 6e 73 65 72 74   OP_SorterInsert
65e0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6f  ;.  }else{.    o
65f0: 70 20 3d 20 4f 50 5f 49 64 78 49 6e 73 65 72 74  p = OP_IdxInsert
6600: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56  ;.  }.  sqlite3V
6610: 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20  dbeAddOp4Int(v, 
6620: 6f 70 2c 20 70 53 6f 72 74 2d 3e 69 45 43 75 72  op, pSort->iECur
6630: 73 6f 72 2c 20 72 65 67 52 65 63 6f 72 64 2c 0a  sor, regRecord,.
6640: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6650: 20 20 20 20 20 20 20 72 65 67 42 61 73 65 2b 6e         regBase+n
6660: 4f 42 53 61 74 2c 20 6e 42 61 73 65 2d 6e 4f 42  OBSat, nBase-nOB
6670: 53 61 74 29 3b 0a 20 20 69 66 28 20 69 53 6b 69  Sat);.  if( iSki
6680: 70 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  p ){.    sqlite3
6690: 56 64 62 65 43 68 61 6e 67 65 50 32 28 76 2c 20  VdbeChangeP2(v, 
66a0: 69 53 6b 69 70 2c 0a 20 20 20 20 20 20 20 20 20  iSkip,.         
66b0: 70 53 6f 72 74 2d 3e 6c 61 62 65 6c 4f 42 4c 6f  pSort->labelOBLo
66c0: 70 74 20 3f 20 70 53 6f 72 74 2d 3e 6c 61 62 65  pt ? pSort->labe
66d0: 6c 4f 42 4c 6f 70 74 20 3a 20 73 71 6c 69 74 65  lOBLopt : sqlite
66e0: 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
66f0: 28 76 29 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  (v));.  }.}../*.
6700: 2a 2a 20 41 64 64 20 63 6f 64 65 20 74 6f 20 69  ** Add code to i
6710: 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 4f 46 46  mplement the OFF
6720: 53 45 54 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  SET.*/.static vo
6730: 69 64 20 63 6f 64 65 4f 66 66 73 65 74 28 0a 20  id codeOffset(. 
6740: 20 56 64 62 65 20 2a 76 2c 20 20 20 20 20 20 20   Vdbe *v,       
6750: 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63     /* Generate c
6760: 6f 64 65 20 69 6e 74 6f 20 74 68 69 73 20 56 4d  ode into this VM
6770: 20 2a 2f 0a 20 20 69 6e 74 20 69 4f 66 66 73 65   */.  int iOffse
6780: 74 2c 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73  t,      /* Regis
6790: 74 65 72 20 68 6f 6c 64 69 6e 67 20 74 68 65 20  ter holding the 
67a0: 6f 66 66 73 65 74 20 63 6f 75 6e 74 65 72 20 2a  offset counter *
67b0: 2f 0a 20 20 69 6e 74 20 69 43 6f 6e 74 69 6e 75  /.  int iContinu
67c0: 65 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65  e     /* Jump he
67d0: 72 65 20 74 6f 20 73 6b 69 70 20 74 68 65 20 63  re to skip the c
67e0: 75 72 72 65 6e 74 20 72 65 63 6f 72 64 20 2a 2f  urrent record */
67f0: 0a 29 7b 0a 20 20 69 66 28 20 69 4f 66 66 73 65  .){.  if( iOffse
6800: 74 3e 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  t>0 ){.    sqlit
6810: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
6820: 4f 50 5f 49 66 50 6f 73 2c 20 69 4f 66 66 73 65  OP_IfPos, iOffse
6830: 74 2c 20 69 43 6f 6e 74 69 6e 75 65 2c 20 31 29  t, iContinue, 1)
6840: 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
6850: 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 6d 6d 65  );.    VdbeComme
6860: 6e 74 28 28 76 2c 20 22 4f 46 46 53 45 54 22 29  nt((v, "OFFSET")
6870: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
6880: 41 64 64 20 63 6f 64 65 20 74 68 61 74 20 77 69  Add code that wi
6890: 6c 6c 20 63 68 65 63 6b 20 74 6f 20 6d 61 6b 65  ll check to make
68a0: 20 73 75 72 65 20 74 68 65 20 4e 20 72 65 67 69   sure the N regi
68b0: 73 74 65 72 73 20 73 74 61 72 74 69 6e 67 20 61  sters starting a
68c0: 74 20 69 4d 65 6d 0a 2a 2a 20 66 6f 72 6d 20 61  t iMem.** form a
68d0: 20 64 69 73 74 69 6e 63 74 20 65 6e 74 72 79 2e   distinct entry.
68e0: 20 20 69 54 61 62 20 69 73 20 61 20 73 6f 72 74    iTab is a sort
68f0: 69 6e 67 20 69 6e 64 65 78 20 74 68 61 74 20 68  ing index that h
6900: 6f 6c 64 73 20 70 72 65 76 69 6f 75 73 6c 79 0a  olds previously.
6910: 2a 2a 20 73 65 65 6e 20 63 6f 6d 62 69 6e 61 74  ** seen combinat
6920: 69 6f 6e 73 20 6f 66 20 74 68 65 20 4e 20 76 61  ions of the N va
6930: 6c 75 65 73 2e 20 20 41 20 6e 65 77 20 65 6e 74  lues.  A new ent
6940: 72 79 20 69 73 20 6d 61 64 65 20 69 6e 20 69 54  ry is made in iT
6950: 61 62 0a 2a 2a 20 69 66 20 74 68 65 20 63 75 72  ab.** if the cur
6960: 72 65 6e 74 20 4e 20 76 61 6c 75 65 73 20 61 72  rent N values ar
6970: 65 20 6e 65 77 2e 0a 2a 2a 0a 2a 2a 20 41 20 6a  e new..**.** A j
6980: 75 6d 70 20 74 6f 20 61 64 64 72 52 65 70 65 61  ump to addrRepea
6990: 74 20 69 73 20 6d 61 64 65 20 61 6e 64 20 74 68  t is made and th
69a0: 65 20 4e 2b 31 20 76 61 6c 75 65 73 20 61 72 65  e N+1 values are
69b0: 20 70 6f 70 70 65 64 20 66 72 6f 6d 20 74 68 65   popped from the
69c0: 0a 2a 2a 20 73 74 61 63 6b 20 69 66 20 74 68 65  .** stack if the
69d0: 20 74 6f 70 20 4e 20 65 6c 65 6d 65 6e 74 73 20   top N elements 
69e0: 61 72 65 20 6e 6f 74 20 64 69 73 74 69 6e 63 74  are not distinct
69f0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
6a00: 20 63 6f 64 65 44 69 73 74 69 6e 63 74 28 0a 20   codeDistinct(. 
6a10: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
6a20: 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 61      /* Parsing a
6a30: 6e 64 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69  nd code generati
6a40: 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
6a50: 69 6e 74 20 69 54 61 62 2c 20 20 20 20 20 20 20  int iTab,       
6a60: 20 20 20 2f 2a 20 41 20 73 6f 72 74 69 6e 67 20     /* A sorting 
6a70: 69 6e 64 65 78 20 75 73 65 64 20 74 6f 20 74 65  index used to te
6a80: 73 74 20 66 6f 72 20 64 69 73 74 69 6e 63 74 6e  st for distinctn
6a90: 65 73 73 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64  ess */.  int add
6aa0: 72 52 65 70 65 61 74 2c 20 20 20 20 2f 2a 20 4a  rRepeat,    /* J
6ab0: 75 6d 70 20 74 6f 20 68 65 72 65 20 69 66 20 6e  ump to here if n
6ac0: 6f 74 20 64 69 73 74 69 6e 63 74 20 2a 2f 0a 20  ot distinct */. 
6ad0: 20 69 6e 74 20 4e 2c 20 20 20 20 20 20 20 20 20   int N,         
6ae0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
6af0: 20 65 6c 65 6d 65 6e 74 73 20 2a 2f 0a 20 20 69   elements */.  i
6b00: 6e 74 20 69 4d 65 6d 20 20 20 20 20 20 20 20 20  nt iMem         
6b10: 20 20 2f 2a 20 46 69 72 73 74 20 65 6c 65 6d 65    /* First eleme
6b20: 6e 74 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20  nt */.){.  Vdbe 
6b30: 2a 76 3b 0a 20 20 69 6e 74 20 72 31 3b 0a 0a 20  *v;.  int r1;.. 
6b40: 20 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64   v = pParse->pVd
6b50: 62 65 3b 0a 20 20 72 31 20 3d 20 73 71 6c 69 74  be;.  r1 = sqlit
6b60: 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61  e3GetTempReg(pPa
6b70: 72 73 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  rse);.  sqlite3V
6b80: 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20  dbeAddOp4Int(v, 
6b90: 4f 50 5f 46 6f 75 6e 64 2c 20 69 54 61 62 2c 20  OP_Found, iTab, 
6ba0: 61 64 64 72 52 65 70 65 61 74 2c 20 69 4d 65 6d  addrRepeat, iMem
6bb0: 2c 20 4e 29 3b 20 56 64 62 65 43 6f 76 65 72 61  , N); VdbeCovera
6bc0: 67 65 28 76 29 3b 0a 20 20 73 71 6c 69 74 65 33  ge(v);.  sqlite3
6bd0: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
6be0: 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 69 4d 65  _MakeRecord, iMe
6bf0: 6d 2c 20 4e 2c 20 72 31 29 3b 0a 20 20 73 71 6c  m, N, r1);.  sql
6c00: 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e  ite3VdbeAddOp4In
6c10: 74 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72  t(v, OP_IdxInser
6c20: 74 2c 20 69 54 61 62 2c 20 72 31 2c 20 69 4d 65  t, iTab, r1, iMe
6c30: 6d 2c 20 4e 29 3b 0a 20 20 73 71 6c 69 74 65 33  m, N);.  sqlite3
6c40: 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20  VdbeChangeP5(v, 
6c50: 4f 50 46 4c 41 47 5f 55 53 45 53 45 45 4b 52 45  OPFLAG_USESEEKRE
6c60: 53 55 4c 54 29 3b 0a 20 20 73 71 6c 69 74 65 33  SULT);.  sqlite3
6c70: 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
6c80: 50 61 72 73 65 2c 20 72 31 29 3b 0a 7d 0a 0a 23  Parse, r1);.}..#
6c90: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
6ca0: 42 4c 45 5f 53 4f 52 54 45 52 5f 52 45 46 45 52  BLE_SORTER_REFER
6cb0: 45 4e 43 45 53 0a 2f 2a 0a 2a 2a 20 54 68 69 73  ENCES./*.** This
6cc0: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
6cd0: 6c 65 64 20 61 73 20 70 61 72 74 20 6f 66 20 69  led as part of i
6ce0: 6e 6e 65 72 2d 6c 6f 6f 70 20 67 65 6e 65 72 61  nner-loop genera
6cf0: 74 69 6f 6e 20 66 6f 72 20 61 20 53 45 4c 45 43  tion for a SELEC
6d00: 54 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 77  T.** statement w
6d10: 69 74 68 20 61 6e 20 4f 52 44 45 52 20 42 59 20  ith an ORDER BY 
6d20: 74 68 61 74 20 69 73 20 6e 6f 74 20 6f 70 74 69  that is not opti
6d30: 6d 69 7a 65 64 20 62 79 20 61 6e 20 69 6e 64 65  mized by an inde
6d40: 78 2e 20 49 74 20 0a 2a 2a 20 64 65 74 65 72 6d  x. It .** determ
6d50: 69 6e 65 73 20 74 68 65 20 65 78 70 72 65 73 73  ines the express
6d60: 69 6f 6e 73 2c 20 69 66 20 61 6e 79 2c 20 74 68  ions, if any, th
6d70: 61 74 20 74 68 65 20 73 6f 72 74 65 72 2d 72 65  at the sorter-re
6d80: 66 65 72 65 6e 63 65 20 0a 2a 2a 20 6f 70 74 69  ference .** opti
6d90: 6d 69 7a 61 74 69 6f 6e 20 73 68 6f 75 6c 64 20  mization should 
6da0: 62 65 20 75 73 65 64 20 66 6f 72 2e 20 54 68 65  be used for. The
6db0: 20 73 6f 72 74 65 72 2d 72 65 66 65 72 65 6e 63   sorter-referenc
6dc0: 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 0a 2a  e optimization.*
6dd0: 2a 20 69 73 20 75 73 65 64 20 66 6f 72 20 53 45  * is used for SE
6de0: 4c 45 43 54 20 71 75 65 72 69 65 73 20 6c 69 6b  LECT queries lik
6df0: 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 53 45 4c 45 43  e:.**.**   SELEC
6e00: 54 20 61 2c 20 62 69 67 62 6c 6f 62 20 46 52 4f  T a, bigblob FRO
6e10: 4d 20 74 31 20 4f 52 44 45 52 20 42 59 20 61 20  M t1 ORDER BY a 
6e20: 4c 49 4d 49 54 20 31 30 0a 2a 2a 0a 2a 2a 20 49  LIMIT 10.**.** I
6e30: 66 20 74 68 65 20 6f 70 74 69 6d 69 7a 61 74 69  f the optimizati
6e40: 6f 6e 20 69 73 20 75 73 65 64 20 66 6f 72 20 65  on is used for e
6e50: 78 70 72 65 73 73 69 6f 6e 20 22 62 69 67 62 6c  xpression "bigbl
6e60: 6f 62 22 2c 20 74 68 65 6e 20 69 6e 73 74 65 61  ob", then instea
6e70: 64 20 6f 66 0a 2a 2a 20 73 74 6f 72 69 6e 67 20  d of.** storing 
6e80: 76 61 6c 75 65 73 20 72 65 61 64 20 66 72 6f 6d  values read from
6e90: 20 74 68 61 74 20 63 6f 6c 75 6d 6e 20 69 6e 20   that column in 
6ea0: 74 68 65 20 73 6f 72 74 65 72 20 72 65 63 6f 72  the sorter recor
6eb0: 64 73 2c 20 74 68 65 20 50 4b 20 6f 66 0a 2a 2a  ds, the PK of.**
6ec0: 20 74 68 65 20 72 6f 77 20 66 72 6f 6d 20 74 61   the row from ta
6ed0: 62 6c 65 20 74 31 20 69 73 20 73 74 6f 72 65 64  ble t1 is stored
6ee0: 20 69 6e 73 74 65 61 64 2e 20 54 68 65 6e 2c 20   instead. Then, 
6ef0: 61 73 20 72 65 63 6f 72 64 73 20 61 72 65 20 65  as records are e
6f00: 78 74 72 61 63 74 65 64 20 66 72 6f 6d 0a 2a 2a  xtracted from.**
6f10: 20 74 68 65 20 73 6f 72 74 65 72 20 74 6f 20 72   the sorter to r
6f20: 65 74 75 72 6e 20 74 6f 20 74 68 65 20 75 73 65  eturn to the use
6f30: 72 2c 20 74 68 65 20 72 65 71 75 69 72 65 64 20  r, the required 
6f40: 76 61 6c 75 65 20 6f 66 20 62 69 67 62 6c 6f 62  value of bigblob
6f50: 20 69 73 0a 2a 2a 20 72 65 74 72 69 65 76 65 64   is.** retrieved
6f60: 20 64 69 72 65 63 74 6c 79 20 66 72 6f 6d 20 74   directly from t
6f70: 61 62 6c 65 20 74 31 2e 20 49 66 20 74 68 65 20  able t1. If the 
6f80: 76 61 6c 75 65 73 20 61 72 65 20 76 65 72 79 20  values are very 
6f90: 6c 61 72 67 65 2c 20 74 68 69 73 20 0a 2a 2a 20  large, this .** 
6fa0: 63 61 6e 20 62 65 20 6d 6f 72 65 20 65 66 66 69  can be more effi
6fb0: 63 69 65 6e 74 20 74 68 61 6e 20 73 74 6f 72 69  cient than stori
6fc0: 6e 67 20 74 68 65 6d 20 64 69 72 65 63 74 6c 79  ng them directly
6fd0: 20 69 6e 20 74 68 65 20 73 6f 72 74 65 72 20 72   in the sorter r
6fe0: 65 63 6f 72 64 73 2e 0a 2a 2a 0a 2a 2a 20 54 68  ecords..**.** Th
6ff0: 65 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 2e  e ExprList_item.
7000: 62 53 6f 72 74 65 72 52 65 66 20 66 6c 61 67 20  bSorterRef flag 
7010: 69 73 20 73 65 74 20 66 6f 72 20 65 61 63 68 20  is set for each 
7020: 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 70 45  expression in pE
7030: 4c 69 73 74 20 0a 2a 2a 20 66 6f 72 20 77 68 69  List .** for whi
7040: 63 68 20 74 68 65 20 73 6f 72 74 65 72 2d 72 65  ch the sorter-re
7050: 66 65 72 65 6e 63 65 20 6f 70 74 69 6d 69 7a 61  ference optimiza
7060: 74 69 6f 6e 20 73 68 6f 75 6c 64 20 62 65 20 65  tion should be e
7070: 6e 61 62 6c 65 64 2e 20 0a 2a 2a 20 41 64 64 69  nabled. .** Addi
7080: 74 69 6f 6e 61 6c 6c 79 2c 20 74 68 65 20 70 53  tionally, the pS
7090: 6f 72 74 2d 3e 61 44 65 66 65 72 5b 5d 20 61 72  ort->aDefer[] ar
70a0: 72 61 79 20 69 73 20 70 6f 70 75 6c 61 74 65 64  ray is populated
70b0: 20 77 69 74 68 20 65 6e 74 72 69 65 73 0a 2a 2a   with entries.**
70c0: 20 66 6f 72 20 61 6c 6c 20 63 75 72 73 6f 72 73   for all cursors
70d0: 20 72 65 71 75 69 72 65 64 20 74 6f 20 65 76 61   required to eva
70e0: 6c 75 61 74 65 20 61 6c 6c 20 73 65 6c 65 63 74  luate all select
70f0: 65 64 20 65 78 70 72 65 73 73 69 6f 6e 73 2e 20  ed expressions. 
7100: 46 69 6e 61 6c 6c 79 2e 0a 2a 2a 20 6f 75 74 70  Finally..** outp
7110: 75 74 20 76 61 72 69 61 62 6c 65 20 28 2a 70 70  ut variable (*pp
7120: 45 78 74 72 61 29 20 69 73 20 73 65 74 20 74 6f  Extra) is set to
7130: 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 6c   an expression l
7140: 69 73 74 20 63 6f 6e 74 61 69 6e 69 6e 67 0a 2a  ist containing.*
7150: 2a 20 65 78 70 72 65 73 73 69 6f 6e 73 20 66 6f  * expressions fo
7160: 72 20 61 6c 6c 20 65 78 74 72 61 20 50 4b 20 76  r all extra PK v
7170: 61 6c 75 65 73 20 74 68 61 74 20 73 68 6f 75 6c  alues that shoul
7180: 64 20 62 65 20 73 74 6f 72 65 64 20 69 6e 20 74  d be stored in t
7190: 68 65 0a 2a 2a 20 73 6f 72 74 65 72 20 72 65 63  he.** sorter rec
71a0: 6f 72 64 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ords..*/.static 
71b0: 76 6f 69 64 20 73 65 6c 65 63 74 45 78 70 72 44  void selectExprD
71c0: 65 66 65 72 28 0a 20 20 50 61 72 73 65 20 2a 70  efer(.  Parse *p
71d0: 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20  Parse,          
71e0: 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 61 76 65          /* Leave
71f0: 20 61 6e 79 20 65 72 72 6f 72 20 68 65 72 65 20   any error here 
7200: 2a 2f 0a 20 20 53 6f 72 74 43 74 78 20 2a 70 53  */.  SortCtx *pS
7210: 6f 72 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  ort,            
7220: 20 20 20 20 20 2f 2a 20 53 6f 72 74 65 72 20 63       /* Sorter c
7230: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72  ontext */.  Expr
7240: 4c 69 73 74 20 2a 70 45 4c 69 73 74 2c 20 20 20  List *pEList,   
7250: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45              /* E
7260: 78 70 72 65 73 73 69 6f 6e 73 20 64 65 73 74 69  xpressions desti
7270: 6e 65 64 20 66 6f 72 20 73 6f 72 74 65 72 20 2a  ned for sorter *
7280: 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 2a 70  /.  ExprList **p
7290: 70 45 78 74 72 61 20 20 20 20 20 20 20 20 20 20  pExtra          
72a0: 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f      /* Expressio
72b0: 6e 73 20 74 6f 20 61 70 70 65 6e 64 20 74 6f 20  ns to append to 
72c0: 73 6f 72 74 65 72 20 72 65 63 6f 72 64 20 2a 2f  sorter record */
72d0: 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  .){.  int i;.  i
72e0: 6e 74 20 6e 44 65 66 65 72 20 3d 20 30 3b 0a 20  nt nDefer = 0;. 
72f0: 20 45 78 70 72 4c 69 73 74 20 2a 70 45 78 74 72   ExprList *pExtr
7300: 61 20 3d 20 30 3b 0a 20 20 66 6f 72 28 69 3d 30  a = 0;.  for(i=0
7310: 3b 20 69 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70  ; i<pEList->nExp
7320: 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72  r; i++){.    str
7330: 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
7340: 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70 45 4c 69  m *pItem = &pELi
7350: 73 74 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 69 66  st->a[i];.    if
7360: 28 20 70 49 74 65 6d 2d 3e 75 2e 78 2e 69 4f 72  ( pItem->u.x.iOr
7370: 64 65 72 42 79 43 6f 6c 3d 3d 30 20 29 7b 0a 20  derByCol==0 ){. 
7380: 20 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72       Expr *pExpr
7390: 20 3d 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 3b   = pItem->pExpr;
73a0: 0a 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54  .      Table *pT
73b0: 61 62 20 3d 20 70 45 78 70 72 2d 3e 79 2e 70 54  ab = pExpr->y.pT
73c0: 61 62 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45  ab;.      if( pE
73d0: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55  xpr->op==TK_COLU
73e0: 4d 4e 20 26 26 20 70 45 78 70 72 2d 3e 69 43 6f  MN && pExpr->iCo
73f0: 6c 75 6d 6e 3e 3d 30 20 26 26 20 70 54 61 62 20  lumn>=0 && pTab 
7400: 26 26 20 21 49 73 56 69 72 74 75 61 6c 28 70 54  && !IsVirtual(pT
7410: 61 62 29 0a 20 20 20 20 20 20 20 26 26 20 28 70  ab).       && (p
7420: 54 61 62 2d 3e 61 43 6f 6c 5b 70 45 78 70 72 2d  Tab->aCol[pExpr-
7430: 3e 69 43 6f 6c 75 6d 6e 5d 2e 63 6f 6c 46 6c 61  >iColumn].colFla
7440: 67 73 20 26 20 43 4f 4c 46 4c 41 47 5f 53 4f 52  gs & COLFLAG_SOR
7450: 54 45 52 52 45 46 29 0a 20 20 20 20 20 20 29 7b  TERREF).      ){
7460: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a  .        int j;.
7470: 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b          for(j=0;
7480: 20 6a 3c 6e 44 65 66 65 72 3b 20 6a 2b 2b 29 7b   j<nDefer; j++){
7490: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
74a0: 53 6f 72 74 2d 3e 61 44 65 66 65 72 5b 6a 5d 2e  Sort->aDefer[j].
74b0: 69 43 73 72 3d 3d 70 45 78 70 72 2d 3e 69 54 61  iCsr==pExpr->iTa
74c0: 62 6c 65 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ble ) break;.   
74d0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
74e0: 66 28 20 6a 3d 3d 6e 44 65 66 65 72 20 29 7b 0a  f( j==nDefer ){.
74f0: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6e 44            if( nD
7500: 65 66 65 72 3d 3d 41 72 72 61 79 53 69 7a 65 28  efer==ArraySize(
7510: 70 53 6f 72 74 2d 3e 61 44 65 66 65 72 29 20 29  pSort->aDefer) )
7520: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 6f  {.            co
7530: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
7540: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
7550: 20 20 20 20 20 69 6e 74 20 6e 4b 65 79 20 3d 20       int nKey = 
7560: 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  1;.            i
7570: 6e 74 20 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  nt k;.          
7580: 20 20 49 6e 64 65 78 20 2a 70 50 6b 20 3d 20 30    Index *pPk = 0
7590: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
75a0: 28 20 21 48 61 73 52 6f 77 69 64 28 70 54 61 62  ( !HasRowid(pTab
75b0: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ) ){.           
75c0: 20 20 20 70 50 6b 20 3d 20 73 71 6c 69 74 65 33     pPk = sqlite3
75d0: 50 72 69 6d 61 72 79 4b 65 79 49 6e 64 65 78 28  PrimaryKeyIndex(
75e0: 70 54 61 62 29 3b 0a 20 20 20 20 20 20 20 20 20  pTab);.         
75f0: 20 20 20 20 20 6e 4b 65 79 20 3d 20 70 50 6b 2d       nKey = pPk-
7600: 3e 6e 4b 65 79 43 6f 6c 3b 0a 20 20 20 20 20 20  >nKeyCol;.      
7610: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
7620: 20 20 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 6e      for(k=0; k<n
7630: 4b 65 79 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 20  Key; k++){.     
7640: 20 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70           Expr *p
7650: 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 50 45 78  New = sqlite3PEx
7660: 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 43 4f  pr(pParse, TK_CO
7670: 4c 55 4d 4e 2c 20 30 2c 20 30 29 3b 0a 20 20 20  LUMN, 0, 0);.   
7680: 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70             if( p
7690: 4e 65 77 20 29 7b 0a 20 20 20 20 20 20 20 20 20  New ){.         
76a0: 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 69 54 61         pNew->iTa
76b0: 62 6c 65 20 3d 20 70 45 78 70 72 2d 3e 69 54 61  ble = pExpr->iTa
76c0: 62 6c 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ble;.           
76d0: 20 20 20 20 20 70 4e 65 77 2d 3e 79 2e 70 54 61       pNew->y.pTa
76e0: 62 20 3d 20 70 45 78 70 72 2d 3e 79 2e 70 54 61  b = pExpr->y.pTa
76f0: 62 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  b;.             
7700: 20 20 20 70 4e 65 77 2d 3e 69 43 6f 6c 75 6d 6e     pNew->iColumn
7710: 20 3d 20 70 50 6b 20 3f 20 70 50 6b 2d 3e 61 69   = pPk ? pPk->ai
7720: 43 6f 6c 75 6d 6e 5b 6b 5d 20 3a 20 2d 31 3b 0a  Column[k] : -1;.
7730: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7740: 70 45 78 74 72 61 20 3d 20 73 71 6c 69 74 65 33  pExtra = sqlite3
7750: 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70  ExprListAppend(p
7760: 50 61 72 73 65 2c 20 70 45 78 74 72 61 2c 20 70  Parse, pExtra, p
7770: 4e 65 77 29 3b 0a 20 20 20 20 20 20 20 20 20 20  New);.          
7780: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
7790: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
77a0: 70 53 6f 72 74 2d 3e 61 44 65 66 65 72 5b 6e 44  pSort->aDefer[nD
77b0: 65 66 65 72 5d 2e 70 54 61 62 20 3d 20 70 45 78  efer].pTab = pEx
77c0: 70 72 2d 3e 79 2e 70 54 61 62 3b 0a 20 20 20 20  pr->y.pTab;.    
77d0: 20 20 20 20 20 20 20 20 70 53 6f 72 74 2d 3e 61          pSort->a
77e0: 44 65 66 65 72 5b 6e 44 65 66 65 72 5d 2e 69 43  Defer[nDefer].iC
77f0: 73 72 20 3d 20 70 45 78 70 72 2d 3e 69 54 61 62  sr = pExpr->iTab
7800: 6c 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  le;.            
7810: 70 53 6f 72 74 2d 3e 61 44 65 66 65 72 5b 6e 44  pSort->aDefer[nD
7820: 65 66 65 72 5d 2e 6e 4b 65 79 20 3d 20 6e 4b 65  efer].nKey = nKe
7830: 79 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6e  y;.            n
7840: 44 65 66 65 72 2b 2b 3b 0a 20 20 20 20 20 20 20  Defer++;.       
7850: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
7860: 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 62 53         pItem->bS
7870: 6f 72 74 65 72 52 65 66 20 3d 20 31 3b 0a 20 20  orterRef = 1;.  
7880: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
7890: 20 20 70 53 6f 72 74 2d 3e 6e 44 65 66 65 72 20    pSort->nDefer 
78a0: 3d 20 28 75 38 29 6e 44 65 66 65 72 3b 0a 20 20  = (u8)nDefer;.  
78b0: 2a 70 70 45 78 74 72 61 20 3d 20 70 45 78 74 72  *ppExtra = pExtr
78c0: 61 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  a;.}.#endif../*.
78d0: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
78e0: 67 65 6e 65 72 61 74 65 73 20 74 68 65 20 63 6f  generates the co
78f0: 64 65 20 66 6f 72 20 74 68 65 20 69 6e 73 69 64  de for the insid
7900: 65 20 6f 66 20 74 68 65 20 69 6e 6e 65 72 20 6c  e of the inner l
7910: 6f 6f 70 0a 2a 2a 20 6f 66 20 61 20 53 45 4c 45  oop.** of a SELE
7920: 43 54 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 72 63  CT..**.** If src
7930: 54 61 62 20 69 73 20 6e 65 67 61 74 69 76 65 2c  Tab is negative,
7940: 20 74 68 65 6e 20 74 68 65 20 70 2d 3e 70 45 4c   then the p->pEL
7950: 69 73 74 20 65 78 70 72 65 73 73 69 6f 6e 73 0a  ist expressions.
7960: 2a 2a 20 61 72 65 20 65 76 61 6c 75 61 74 65 64  ** are evaluated
7970: 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 67 65 74   in order to get
7980: 20 74 68 65 20 64 61 74 61 20 66 6f 72 20 74 68   the data for th
7990: 69 73 20 72 6f 77 2e 20 20 49 66 20 73 72 63 54  is row.  If srcT
79a0: 61 62 20 69 73 0a 2a 2a 20 7a 65 72 6f 20 6f 72  ab is.** zero or
79b0: 20 6d 6f 72 65 2c 20 74 68 65 6e 20 64 61 74 61   more, then data
79c0: 20 69 73 20 70 75 6c 6c 65 64 20 66 72 6f 6d 20   is pulled from 
79d0: 73 72 63 54 61 62 20 61 6e 64 20 70 2d 3e 70 45  srcTab and p->pE
79e0: 4c 69 73 74 20 69 73 20 75 73 65 64 20 6f 6e 6c  List is used onl
79f0: 79 20 0a 2a 2a 20 74 6f 20 67 65 74 20 74 68 65  y .** to get the
7a00: 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d   number of colum
7a10: 6e 73 20 61 6e 64 20 74 68 65 20 63 6f 6c 6c 61  ns and the colla
7a20: 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 66 6f  tion sequence fo
7a30: 72 20 65 61 63 68 20 63 6f 6c 75 6d 6e 2e 0a 2a  r each column..*
7a40: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 65  /.static void se
7a50: 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 0a 20  lectInnerLoop(. 
7a60: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
7a70: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
7a80: 70 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a  parser context *
7a90: 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20  /.  Select *p,  
7aa0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
7ab0: 68 65 20 63 6f 6d 70 6c 65 74 65 20 73 65 6c 65  he complete sele
7ac0: 63 74 20 73 74 61 74 65 6d 65 6e 74 20 62 65 69  ct statement bei
7ad0: 6e 67 20 63 6f 64 65 64 20 2a 2f 0a 20 20 69 6e  ng coded */.  in
7ae0: 74 20 73 72 63 54 61 62 2c 20 20 20 20 20 20 20  t srcTab,       
7af0: 20 20 20 20 20 20 2f 2a 20 50 75 6c 6c 20 64 61        /* Pull da
7b00: 74 61 20 66 72 6f 6d 20 74 68 69 73 20 74 61 62  ta from this tab
7b10: 6c 65 20 69 66 20 6e 6f 6e 2d 6e 65 67 61 74 69  le if non-negati
7b20: 76 65 20 2a 2f 0a 20 20 53 6f 72 74 43 74 78 20  ve */.  SortCtx 
7b30: 2a 70 53 6f 72 74 2c 20 20 20 20 20 20 20 20 20  *pSort,         
7b40: 2f 2a 20 49 66 20 6e 6f 74 20 4e 55 4c 4c 2c 20  /* If not NULL, 
7b50: 69 6e 66 6f 20 6f 6e 20 68 6f 77 20 74 6f 20 70  info on how to p
7b60: 72 6f 63 65 73 73 20 4f 52 44 45 52 20 42 59 20  rocess ORDER BY 
7b70: 2a 2f 0a 20 20 44 69 73 74 69 6e 63 74 43 74 78  */.  DistinctCtx
7b80: 20 2a 70 44 69 73 74 69 6e 63 74 2c 20 2f 2a 20   *pDistinct, /* 
7b90: 49 66 20 6e 6f 74 20 4e 55 4c 4c 2c 20 69 6e 66  If not NULL, inf
7ba0: 6f 20 6f 6e 20 68 6f 77 20 74 6f 20 70 72 6f 63  o on how to proc
7bb0: 65 73 73 20 44 49 53 54 49 4e 43 54 20 2a 2f 0a  ess DISTINCT */.
7bc0: 20 20 53 65 6c 65 63 74 44 65 73 74 20 2a 70 44    SelectDest *pD
7bd0: 65 73 74 2c 20 20 20 20 20 20 2f 2a 20 48 6f 77  est,      /* How
7be0: 20 74 6f 20 64 69 73 70 6f 73 65 20 6f 66 20 74   to dispose of t
7bf0: 68 65 20 72 65 73 75 6c 74 73 20 2a 2f 0a 20 20  he results */.  
7c00: 69 6e 74 20 69 43 6f 6e 74 69 6e 75 65 2c 20 20  int iContinue,  
7c10: 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20          /* Jump 
7c20: 68 65 72 65 20 74 6f 20 63 6f 6e 74 69 6e 75 65  here to continue
7c30: 20 77 69 74 68 20 6e 65 78 74 20 72 6f 77 20 2a   with next row *
7c40: 2f 0a 20 20 69 6e 74 20 69 42 72 65 61 6b 20 20  /.  int iBreak  
7c50: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4a              /* J
7c60: 75 6d 70 20 68 65 72 65 20 74 6f 20 62 72 65 61  ump here to brea
7c70: 6b 20 6f 75 74 20 6f 66 20 74 68 65 20 69 6e 6e  k out of the inn
7c80: 65 72 20 6c 6f 6f 70 20 2a 2f 0a 29 7b 0a 20 20  er loop */.){.  
7c90: 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65  Vdbe *v = pParse
7ca0: 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69  ->pVdbe;.  int i
7cb0: 3b 0a 20 20 69 6e 74 20 68 61 73 44 69 73 74 69  ;.  int hasDisti
7cc0: 6e 63 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  nct;            
7cd0: 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65 20 44  /* True if the D
7ce0: 49 53 54 49 4e 43 54 20 6b 65 79 77 6f 72 64 20  ISTINCT keyword 
7cf0: 69 73 20 70 72 65 73 65 6e 74 20 2a 2f 0a 20 20  is present */.  
7d00: 69 6e 74 20 65 44 65 73 74 20 3d 20 70 44 65 73  int eDest = pDes
7d10: 74 2d 3e 65 44 65 73 74 3b 20 20 20 2f 2a 20 48  t->eDest;   /* H
7d20: 6f 77 20 74 6f 20 64 69 73 70 6f 73 65 20 6f 66  ow to dispose of
7d30: 20 72 65 73 75 6c 74 73 20 2a 2f 0a 20 20 69 6e   results */.  in
7d40: 74 20 69 50 61 72 6d 20 3d 20 70 44 65 73 74 2d  t iParm = pDest-
7d50: 3e 69 53 44 50 61 72 6d 3b 20 2f 2a 20 46 69 72  >iSDParm; /* Fir
7d60: 73 74 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 64  st argument to d
7d70: 69 73 70 6f 73 61 6c 20 6d 65 74 68 6f 64 20 2a  isposal method *
7d80: 2f 0a 20 20 69 6e 74 20 6e 52 65 73 75 6c 74 43  /.  int nResultC
7d90: 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ol;             
7da0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 73  /* Number of res
7db0: 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20  ult columns */. 
7dc0: 20 69 6e 74 20 6e 50 72 65 66 69 78 52 65 67 20   int nPrefixReg 
7dd0: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  = 0;         /* 
7de0: 4e 75 6d 62 65 72 20 6f 66 20 65 78 74 72 61 20  Number of extra 
7df0: 72 65 67 69 73 74 65 72 73 20 62 65 66 6f 72 65  registers before
7e00: 20 72 65 67 52 65 73 75 6c 74 20 2a 2f 0a 20 20   regResult */.  
7e10: 52 6f 77 4c 6f 61 64 49 6e 66 6f 20 73 52 6f 77  RowLoadInfo sRow
7e20: 4c 6f 61 64 49 6e 66 6f 3b 20 20 20 2f 2a 20 49  LoadInfo;   /* I
7e30: 6e 66 6f 20 66 6f 72 20 64 65 66 65 72 72 65 64  nfo for deferred
7e40: 20 72 6f 77 20 6c 6f 61 64 69 6e 67 20 2a 2f 0a   row loading */.
7e50: 0a 20 20 2f 2a 20 55 73 75 61 6c 6c 79 2c 20 72  .  /* Usually, r
7e60: 65 67 52 65 73 75 6c 74 20 69 73 20 74 68 65 20  egResult is the 
7e70: 66 69 72 73 74 20 63 65 6c 6c 20 69 6e 20 61 6e  first cell in an
7e80: 20 61 72 72 61 79 20 6f 66 20 6d 65 6d 6f 72 79   array of memory
7e90: 20 63 65 6c 6c 73 0a 20 20 2a 2a 20 63 6f 6e 74   cells.  ** cont
7ea0: 61 69 6e 69 6e 67 20 74 68 65 20 63 75 72 72 65  aining the curre
7eb0: 6e 74 20 72 65 73 75 6c 74 20 72 6f 77 2e 20 49  nt result row. I
7ec0: 6e 20 74 68 69 73 20 63 61 73 65 20 72 65 67 4f  n this case regO
7ed0: 72 69 67 20 69 73 20 73 65 74 20 74 6f 20 74 68  rig is set to th
7ee0: 65 0a 20 20 2a 2a 20 73 61 6d 65 20 76 61 6c 75  e.  ** same valu
7ef0: 65 2e 20 48 6f 77 65 76 65 72 2c 20 69 66 20 74  e. However, if t
7f00: 68 65 20 72 65 73 75 6c 74 73 20 61 72 65 20 62  he results are b
7f10: 65 69 6e 67 20 73 65 6e 74 20 74 6f 20 74 68 65  eing sent to the
7f20: 20 73 6f 72 74 65 72 2c 20 74 68 65 0a 20 20 2a   sorter, the.  *
7f30: 2a 20 76 61 6c 75 65 73 20 66 6f 72 20 61 6e 79  * values for any
7f40: 20 65 78 70 72 65 73 73 69 6f 6e 73 20 74 68 61   expressions tha
7f50: 74 20 61 72 65 20 61 6c 73 6f 20 70 61 72 74 20  t are also part 
7f60: 6f 66 20 74 68 65 20 73 6f 72 74 2d 6b 65 79 20  of the sort-key 
7f70: 61 72 65 20 6f 6d 69 74 74 65 64 0a 20 20 2a 2a  are omitted.  **
7f80: 20 66 72 6f 6d 20 74 68 69 73 20 61 72 72 61 79   from this array
7f90: 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 72  . In this case r
7fa0: 65 67 4f 72 69 67 20 69 73 20 73 65 74 20 74 6f  egOrig is set to
7fb0: 20 7a 65 72 6f 2e 20 20 2a 2f 0a 20 20 69 6e 74   zero.  */.  int
7fc0: 20 72 65 67 52 65 73 75 6c 74 3b 20 20 20 20 20   regResult;     
7fd0: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74 61 72           /* Star
7fe0: 74 20 6f 66 20 6d 65 6d 6f 72 79 20 68 6f 6c 64  t of memory hold
7ff0: 69 6e 67 20 63 75 72 72 65 6e 74 20 72 65 73 75  ing current resu
8000: 6c 74 73 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67  lts */.  int reg
8010: 4f 72 69 67 3b 20 20 20 20 20 20 20 20 20 20 20  Orig;           
8020: 20 20 20 20 20 2f 2a 20 53 74 61 72 74 20 6f 66       /* Start of
8030: 20 6d 65 6d 6f 72 79 20 68 6f 6c 64 69 6e 67 20   memory holding 
8040: 66 75 6c 6c 20 72 65 73 75 6c 74 20 28 6f 72 20  full result (or 
8050: 30 29 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  0) */..  assert(
8060: 20 76 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20   v );.  assert( 
8070: 70 2d 3e 70 45 4c 69 73 74 21 3d 30 20 29 3b 0a  p->pEList!=0 );.
8080: 20 20 68 61 73 44 69 73 74 69 6e 63 74 20 3d 20    hasDistinct = 
8090: 70 44 69 73 74 69 6e 63 74 20 3f 20 70 44 69 73  pDistinct ? pDis
80a0: 74 69 6e 63 74 2d 3e 65 54 6e 63 74 54 79 70 65  tinct->eTnctType
80b0: 20 3a 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43   : WHERE_DISTINC
80c0: 54 5f 4e 4f 4f 50 3b 0a 20 20 69 66 28 20 70 53  T_NOOP;.  if( pS
80d0: 6f 72 74 20 26 26 20 70 53 6f 72 74 2d 3e 70 4f  ort && pSort->pO
80e0: 72 64 65 72 42 79 3d 3d 30 20 29 20 70 53 6f 72  rderBy==0 ) pSor
80f0: 74 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 53 6f  t = 0;.  if( pSo
8100: 72 74 3d 3d 30 20 26 26 20 21 68 61 73 44 69 73  rt==0 && !hasDis
8110: 74 69 6e 63 74 20 29 7b 0a 20 20 20 20 61 73 73  tinct ){.    ass
8120: 65 72 74 28 20 69 43 6f 6e 74 69 6e 75 65 21 3d  ert( iContinue!=
8130: 30 20 29 3b 0a 20 20 20 20 63 6f 64 65 4f 66 66  0 );.    codeOff
8140: 73 65 74 28 76 2c 20 70 2d 3e 69 4f 66 66 73 65  set(v, p->iOffse
8150: 74 2c 20 69 43 6f 6e 74 69 6e 75 65 29 3b 0a 20  t, iContinue);. 
8160: 20 7d 0a 0a 20 20 2f 2a 20 50 75 6c 6c 20 74 68   }..  /* Pull th
8170: 65 20 72 65 71 75 65 73 74 65 64 20 63 6f 6c 75  e requested colu
8180: 6d 6e 73 2e 0a 20 20 2a 2f 0a 20 20 6e 52 65 73  mns..  */.  nRes
8190: 75 6c 74 43 6f 6c 20 3d 20 70 2d 3e 70 45 4c 69  ultCol = p->pELi
81a0: 73 74 2d 3e 6e 45 78 70 72 3b 0a 0a 20 20 69 66  st->nExpr;..  if
81b0: 28 20 70 44 65 73 74 2d 3e 69 53 64 73 74 3d 3d  ( pDest->iSdst==
81c0: 30 20 29 7b 0a 20 20 20 20 69 66 28 20 70 53 6f  0 ){.    if( pSo
81d0: 72 74 20 29 7b 0a 20 20 20 20 20 20 6e 50 72 65  rt ){.      nPre
81e0: 66 69 78 52 65 67 20 3d 20 70 53 6f 72 74 2d 3e  fixReg = pSort->
81f0: 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b  pOrderBy->nExpr;
8200: 0a 20 20 20 20 20 20 69 66 28 20 21 28 70 53 6f  .      if( !(pSo
8210: 72 74 2d 3e 73 6f 72 74 46 6c 61 67 73 20 26 20  rt->sortFlags & 
8220: 53 4f 52 54 46 4c 41 47 5f 55 73 65 53 6f 72 74  SORTFLAG_UseSort
8230: 65 72 29 20 29 20 6e 50 72 65 66 69 78 52 65 67  er) ) nPrefixReg
8240: 2b 2b 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65  ++;.      pParse
8250: 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 50 72 65 66 69  ->nMem += nPrefi
8260: 78 52 65 67 3b 0a 20 20 20 20 7d 0a 20 20 20 20  xReg;.    }.    
8270: 70 44 65 73 74 2d 3e 69 53 64 73 74 20 3d 20 70  pDest->iSdst = p
8280: 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20  Parse->nMem+1;. 
8290: 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20     pParse->nMem 
82a0: 2b 3d 20 6e 52 65 73 75 6c 74 43 6f 6c 3b 0a 20  += nResultCol;. 
82b0: 20 7d 65 6c 73 65 20 69 66 28 20 70 44 65 73 74   }else if( pDest
82c0: 2d 3e 69 53 64 73 74 2b 6e 52 65 73 75 6c 74 43  ->iSdst+nResultC
82d0: 6f 6c 20 3e 20 70 50 61 72 73 65 2d 3e 6e 4d 65  ol > pParse->nMe
82e0: 6d 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73  m ){.    /* This
82f0: 20 69 73 20 61 6e 20 65 72 72 6f 72 20 63 6f 6e   is an error con
8300: 64 69 74 69 6f 6e 20 74 68 61 74 20 63 61 6e 20  dition that can 
8310: 72 65 73 75 6c 74 2c 20 66 6f 72 20 65 78 61 6d  result, for exam
8320: 70 6c 65 2c 20 77 68 65 6e 20 61 20 53 45 4c 45  ple, when a SELE
8330: 43 54 0a 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65  CT.    ** on the
8340: 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65   right-hand side
8350: 20 6f 66 20 61 6e 20 49 4e 53 45 52 54 20 63 6f   of an INSERT co
8360: 6e 74 61 69 6e 73 20 6d 6f 72 65 20 72 65 73 75  ntains more resu
8370: 6c 74 20 63 6f 6c 75 6d 6e 73 20 74 68 61 6e 0a  lt columns than.
8380: 20 20 20 20 2a 2a 20 74 68 65 72 65 20 61 72 65      ** there are
8390: 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20   columns in the 
83a0: 74 61 62 6c 65 20 6f 6e 20 74 68 65 20 6c 65 66  table on the lef
83b0: 74 2e 20 20 54 68 65 20 65 72 72 6f 72 20 77 69  t.  The error wi
83c0: 6c 6c 20 62 65 20 63 61 75 67 68 74 0a 20 20 20  ll be caught.   
83d0: 20 2a 2a 20 61 6e 64 20 72 65 70 6f 72 74 65 64   ** and reported
83e0: 20 6c 61 74 65 72 2e 20 20 42 75 74 20 77 65 20   later.  But we 
83f0: 6e 65 65 64 20 74 6f 20 6d 61 6b 65 20 73 75 72  need to make sur
8400: 65 20 65 6e 6f 75 67 68 20 6d 65 6d 6f 72 79 20  e enough memory 
8410: 69 73 20 61 6c 6c 6f 63 61 74 65 64 0a 20 20 20  is allocated.   
8420: 20 2a 2a 20 74 6f 20 61 76 6f 69 64 20 6f 74 68   ** to avoid oth
8430: 65 72 20 73 70 75 72 69 6f 75 73 20 65 72 72 6f  er spurious erro
8440: 72 73 20 69 6e 20 74 68 65 20 6d 65 61 6e 74 69  rs in the meanti
8450: 6d 65 2e 20 2a 2f 0a 20 20 20 20 70 50 61 72 73  me. */.    pPars
8460: 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 52 65 73 75  e->nMem += nResu
8470: 6c 74 43 6f 6c 3b 0a 20 20 7d 0a 20 20 70 44 65  ltCol;.  }.  pDe
8480: 73 74 2d 3e 6e 53 64 73 74 20 3d 20 6e 52 65 73  st->nSdst = nRes
8490: 75 6c 74 43 6f 6c 3b 0a 20 20 72 65 67 4f 72 69  ultCol;.  regOri
84a0: 67 20 3d 20 72 65 67 52 65 73 75 6c 74 20 3d 20  g = regResult = 
84b0: 70 44 65 73 74 2d 3e 69 53 64 73 74 3b 0a 20 20  pDest->iSdst;.  
84c0: 69 66 28 20 73 72 63 54 61 62 3e 3d 30 20 29 7b  if( srcTab>=0 ){
84d0: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
84e0: 6e 52 65 73 75 6c 74 43 6f 6c 3b 20 69 2b 2b 29  nResultCol; i++)
84f0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
8500: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
8510: 43 6f 6c 75 6d 6e 2c 20 73 72 63 54 61 62 2c 20  Column, srcTab, 
8520: 69 2c 20 72 65 67 52 65 73 75 6c 74 2b 69 29 3b  i, regResult+i);
8530: 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65  .      VdbeComme
8540: 6e 74 28 28 76 2c 20 22 25 73 22 2c 20 70 2d 3e  nt((v, "%s", p->
8550: 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61  pEList->a[i].zNa
8560: 6d 65 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  me));.    }.  }e
8570: 6c 73 65 20 69 66 28 20 65 44 65 73 74 21 3d 53  lse if( eDest!=S
8580: 52 54 5f 45 78 69 73 74 73 20 29 7b 0a 23 69 66  RT_Exists ){.#if
8590: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
85a0: 45 5f 53 4f 52 54 45 52 5f 52 45 46 45 52 45 4e  E_SORTER_REFEREN
85b0: 43 45 53 0a 20 20 20 20 45 78 70 72 4c 69 73 74  CES.    ExprList
85c0: 20 2a 70 45 78 74 72 61 20 3d 20 30 3b 0a 23 65   *pExtra = 0;.#e
85d0: 6e 64 69 66 0a 20 20 20 20 2f 2a 20 49 66 20 74  ndif.    /* If t
85e0: 68 65 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 69  he destination i
85f0: 73 20 61 6e 20 45 58 49 53 54 53 28 2e 2e 2e 29  s an EXISTS(...)
8600: 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 74 68 65   expression, the
8610: 20 61 63 74 75 61 6c 0a 20 20 20 20 2a 2a 20 76   actual.    ** v
8620: 61 6c 75 65 73 20 72 65 74 75 72 6e 65 64 20 62  alues returned b
8630: 79 20 74 68 65 20 53 45 4c 45 43 54 20 61 72 65  y the SELECT are
8640: 20 6e 6f 74 20 72 65 71 75 69 72 65 64 2e 0a 20   not required.. 
8650: 20 20 20 2a 2f 0a 20 20 20 20 75 38 20 65 63 65     */.    u8 ece
8660: 6c 46 6c 61 67 73 3b 20 20 20 20 2f 2a 20 22 65  lFlags;    /* "e
8670: 63 65 6c 22 20 69 73 20 61 6e 20 61 62 62 72 65  cel" is an abbre
8680: 76 69 61 74 69 6f 6e 20 6f 66 20 22 45 78 70 72  viation of "Expr
8690: 43 6f 64 65 45 78 70 72 4c 69 73 74 22 20 2a 2f  CodeExprList" */
86a0: 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70  .    ExprList *p
86b0: 45 4c 69 73 74 3b 0a 20 20 20 20 69 66 28 20 65  EList;.    if( e
86c0: 44 65 73 74 3d 3d 53 52 54 5f 4d 65 6d 20 7c 7c  Dest==SRT_Mem ||
86d0: 20 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70   eDest==SRT_Outp
86e0: 75 74 20 7c 7c 20 65 44 65 73 74 3d 3d 53 52 54  ut || eDest==SRT
86f0: 5f 43 6f 72 6f 75 74 69 6e 65 20 29 7b 0a 20 20  _Coroutine ){.  
8700: 20 20 20 20 65 63 65 6c 46 6c 61 67 73 20 3d 20      ecelFlags = 
8710: 53 51 4c 49 54 45 5f 45 43 45 4c 5f 44 55 50 3b  SQLITE_ECEL_DUP;
8720: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
8730: 20 20 65 63 65 6c 46 6c 61 67 73 20 3d 20 30 3b    ecelFlags = 0;
8740: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
8750: 53 6f 72 74 20 26 26 20 68 61 73 44 69 73 74 69  Sort && hasDisti
8760: 6e 63 74 3d 3d 30 20 26 26 20 65 44 65 73 74 21  nct==0 && eDest!
8770: 3d 53 52 54 5f 45 70 68 65 6d 54 61 62 20 26 26  =SRT_EphemTab &&
8780: 20 65 44 65 73 74 21 3d 53 52 54 5f 54 61 62 6c   eDest!=SRT_Tabl
8790: 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 46 6f  e ){.      /* Fo
87a0: 72 20 65 61 63 68 20 65 78 70 72 65 73 73 69 6f  r each expressio
87b0: 6e 20 69 6e 20 70 2d 3e 70 45 4c 69 73 74 20 74  n in p->pEList t
87c0: 68 61 74 20 69 73 20 61 20 63 6f 70 79 20 6f 66  hat is a copy of
87d0: 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 69   an expression i
87e0: 6e 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 4f  n.      ** the O
87f0: 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 28  RDER BY clause (
8800: 70 53 6f 72 74 2d 3e 70 4f 72 64 65 72 42 79 29  pSort->pOrderBy)
8810: 2c 20 73 65 74 20 74 68 65 20 61 73 73 6f 63 69  , set the associ
8820: 61 74 65 64 20 0a 20 20 20 20 20 20 2a 2a 20 69  ated .      ** i
8830: 4f 72 64 65 72 42 79 43 6f 6c 20 76 61 6c 75 65  OrderByCol value
8840: 20 74 6f 20 6f 6e 65 20 6d 6f 72 65 20 74 68 61   to one more tha
8850: 6e 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74  n the index of t
8860: 68 65 20 4f 52 44 45 52 20 42 59 20 0a 20 20 20  he ORDER BY .   
8870: 20 20 20 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e     ** expression
8880: 20 77 69 74 68 69 6e 20 74 68 65 20 73 6f 72 74   within the sort
8890: 2d 6b 65 79 20 74 68 61 74 20 70 75 73 68 4f 6e  -key that pushOn
88a0: 74 6f 53 6f 72 74 65 72 28 29 20 77 69 6c 6c 20  toSorter() will 
88b0: 67 65 6e 65 72 61 74 65 2e 0a 20 20 20 20 20 20  generate..      
88c0: 2a 2a 20 54 68 69 73 20 61 6c 6c 6f 77 73 20 74  ** This allows t
88d0: 68 65 20 70 2d 3e 70 45 4c 69 73 74 20 66 69 65  he p->pEList fie
88e0: 6c 64 20 74 6f 20 62 65 20 6f 6d 69 74 74 65 64  ld to be omitted
88f0: 20 66 72 6f 6d 20 74 68 65 20 73 6f 72 74 65 64   from the sorted
8900: 20 72 65 63 6f 72 64 2c 0a 20 20 20 20 20 20 2a   record,.      *
8910: 2a 20 73 61 76 69 6e 67 20 73 70 61 63 65 20 61  * saving space a
8920: 6e 64 20 43 50 55 20 63 79 63 6c 65 73 2e 20 20  nd CPU cycles.  
8930: 2a 2f 0a 20 20 20 20 20 20 65 63 65 6c 46 6c 61  */.      ecelFla
8940: 67 73 20 7c 3d 20 28 53 51 4c 49 54 45 5f 45 43  gs |= (SQLITE_EC
8950: 45 4c 5f 4f 4d 49 54 52 45 46 7c 53 51 4c 49 54  EL_OMITREF|SQLIT
8960: 45 5f 45 43 45 4c 5f 52 45 46 29 3b 0a 0a 20 20  E_ECEL_REF);..  
8970: 20 20 20 20 66 6f 72 28 69 3d 70 53 6f 72 74 2d      for(i=pSort-
8980: 3e 6e 4f 42 53 61 74 3b 20 69 3c 70 53 6f 72 74  >nOBSat; i<pSort
8990: 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70  ->pOrderBy->nExp
89a0: 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  r; i++){.       
89b0: 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 20 20   int j;.        
89c0: 69 66 28 20 28 6a 20 3d 20 70 53 6f 72 74 2d 3e  if( (j = pSort->
89d0: 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 75  pOrderBy->a[i].u
89e0: 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 29 3e  .x.iOrderByCol)>
89f0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  0 ){.          p
8a00: 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 6a 2d 31 5d  ->pEList->a[j-1]
8a10: 2e 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c  .u.x.iOrderByCol
8a20: 20 3d 20 69 2b 31 2d 70 53 6f 72 74 2d 3e 6e 4f   = i+1-pSort->nO
8a30: 42 53 61 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a  BSat;.        }.
8a40: 20 20 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53        }.#ifdef S
8a50: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 4f 52  QLITE_ENABLE_SOR
8a60: 54 45 52 5f 52 45 46 45 52 45 4e 43 45 53 0a 20  TER_REFERENCES. 
8a70: 20 20 20 20 20 73 65 6c 65 63 74 45 78 70 72 44       selectExprD
8a80: 65 66 65 72 28 70 50 61 72 73 65 2c 20 70 53 6f  efer(pParse, pSo
8a90: 72 74 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20 26  rt, p->pEList, &
8aa0: 70 45 78 74 72 61 29 3b 0a 20 20 20 20 20 20 69  pExtra);.      i
8ab0: 66 28 20 70 45 78 74 72 61 20 26 26 20 70 50 61  f( pExtra && pPa
8ac0: 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  rse->db->mallocF
8ad0: 61 69 6c 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20  ailed==0 ){.    
8ae0: 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20      /* If there 
8af0: 61 72 65 20 61 6e 79 20 65 78 74 72 61 20 50 4b  are any extra PK
8b00: 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 61 64 64 20   columns to add 
8b10: 74 6f 20 74 68 65 20 73 6f 72 74 65 72 20 72 65  to the sorter re
8b20: 63 6f 72 64 73 2c 0a 20 20 20 20 20 20 20 20 2a  cords,.        *
8b30: 2a 20 61 6c 6c 6f 63 61 74 65 20 65 78 74 72 61  * allocate extra
8b40: 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20 61 6e   memory cells an
8b50: 64 20 61 64 6a 75 73 74 20 74 68 65 20 4f 70 65  d adjust the Ope
8b60: 6e 45 70 68 65 6d 65 72 61 6c 20 0a 20 20 20 20  nEphemeral .    
8b70: 20 20 20 20 2a 2a 20 69 6e 73 74 72 75 63 74 69      ** instructi
8b80: 6f 6e 20 74 6f 20 61 63 63 6f 75 6e 74 20 66 6f  on to account fo
8b90: 72 20 74 68 65 20 6c 61 72 67 65 72 20 72 65 63  r the larger rec
8ba0: 6f 72 64 73 2e 20 54 68 69 73 20 69 73 20 6f 6e  ords. This is on
8bb0: 6c 79 0a 20 20 20 20 20 20 20 20 2a 2a 20 72 65  ly.        ** re
8bc0: 71 75 69 72 65 64 20 69 66 20 74 68 65 72 65 20  quired if there 
8bd0: 61 72 65 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20  are one or more 
8be0: 57 49 54 48 4f 55 54 20 52 4f 57 49 44 20 74 61  WITHOUT ROWID ta
8bf0: 62 6c 65 73 20 77 69 74 68 0a 20 20 20 20 20 20  bles with.      
8c00: 20 20 2a 2a 20 63 6f 6d 70 6f 73 69 74 65 20 70    ** composite p
8c10: 72 69 6d 61 72 79 20 6b 65 79 73 20 69 6e 20 74  rimary keys in t
8c20: 68 65 20 53 6f 72 74 43 74 78 2e 61 44 65 66 65  he SortCtx.aDefe
8c30: 72 5b 5d 20 61 72 72 61 79 2e 20 20 2a 2f 0a 20  r[] array.  */. 
8c40: 20 20 20 20 20 20 20 56 64 62 65 4f 70 20 2a 70         VdbeOp *p
8c50: 4f 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  Op = sqlite3Vdbe
8c60: 47 65 74 4f 70 28 76 2c 20 70 53 6f 72 74 2d 3e  GetOp(v, pSort->
8c70: 61 64 64 72 53 6f 72 74 49 6e 64 65 78 29 3b 0a  addrSortIndex);.
8c80: 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 70 32 20          pOp->p2 
8c90: 2b 3d 20 28 70 45 78 74 72 61 2d 3e 6e 45 78 70  += (pExtra->nExp
8ca0: 72 20 2d 20 70 53 6f 72 74 2d 3e 6e 44 65 66 65  r - pSort->nDefe
8cb0: 72 29 3b 0a 20 20 20 20 20 20 20 20 70 4f 70 2d  r);.        pOp-
8cc0: 3e 70 34 2e 70 4b 65 79 49 6e 66 6f 2d 3e 6e 41  >p4.pKeyInfo->nA
8cd0: 6c 6c 46 69 65 6c 64 20 2b 3d 20 28 70 45 78 74  llField += (pExt
8ce0: 72 61 2d 3e 6e 45 78 70 72 20 2d 20 70 53 6f 72  ra->nExpr - pSor
8cf0: 74 2d 3e 6e 44 65 66 65 72 29 3b 0a 20 20 20 20  t->nDefer);.    
8d00: 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d      pParse->nMem
8d10: 20 2b 3d 20 70 45 78 74 72 61 2d 3e 6e 45 78 70   += pExtra->nExp
8d20: 72 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69  r;.      }.#endi
8d30: 66 0a 0a 20 20 20 20 20 20 2f 2a 20 41 64 6a 75  f..      /* Adju
8d40: 73 74 20 6e 52 65 73 75 6c 74 43 6f 6c 20 74 6f  st nResultCol to
8d50: 20 61 63 63 6f 75 6e 74 20 66 6f 72 20 63 6f 6c   account for col
8d60: 75 6d 6e 73 20 74 68 61 74 20 61 72 65 20 6f 6d  umns that are om
8d70: 69 74 74 65 64 0a 20 20 20 20 20 20 2a 2a 20 66  itted.      ** f
8d80: 72 6f 6d 20 74 68 65 20 73 6f 72 74 65 72 20 62  rom the sorter b
8d90: 79 20 74 68 65 20 6f 70 74 69 6d 69 7a 61 74 69  y the optimizati
8da0: 6f 6e 73 20 69 6e 20 74 68 69 73 20 62 72 61 6e  ons in this bran
8db0: 63 68 20 2a 2f 0a 20 20 20 20 20 20 70 45 4c 69  ch */.      pELi
8dc0: 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a  st = p->pEList;.
8dd0: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
8de0: 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20  <pEList->nExpr; 
8df0: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66  i++){.        if
8e00: 28 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 75  ( pEList->a[i].u
8e10: 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 3e 30  .x.iOrderByCol>0
8e20: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
8e30: 4e 41 42 4c 45 5f 53 4f 52 54 45 52 5f 52 45 46  NABLE_SORTER_REF
8e40: 45 52 45 4e 43 45 53 0a 20 20 20 20 20 20 20 20  ERENCES.        
8e50: 20 7c 7c 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d   || pEList->a[i]
8e60: 2e 62 53 6f 72 74 65 72 52 65 66 0a 23 65 6e 64  .bSorterRef.#end
8e70: 69 66 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20  if.        ){.  
8e80: 20 20 20 20 20 20 20 20 6e 52 65 73 75 6c 74 43          nResultC
8e90: 6f 6c 2d 2d 3b 0a 20 20 20 20 20 20 20 20 20 20  ol--;.          
8ea0: 72 65 67 4f 72 69 67 20 3d 20 30 3b 0a 20 20 20  regOrig = 0;.   
8eb0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a       }.      }..
8ec0: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
8ed0: 72 65 67 4f 72 69 67 20 29 3b 0a 20 20 20 20 20  regOrig );.     
8ee0: 20 74 65 73 74 63 61 73 65 28 20 65 44 65 73 74   testcase( eDest
8ef0: 3d 3d 53 52 54 5f 53 65 74 20 29 3b 0a 20 20 20  ==SRT_Set );.   
8f00: 20 20 20 74 65 73 74 63 61 73 65 28 20 65 44 65     testcase( eDe
8f10: 73 74 3d 3d 53 52 54 5f 4d 65 6d 20 29 3b 0a 20  st==SRT_Mem );. 
8f20: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 65       testcase( e
8f30: 44 65 73 74 3d 3d 53 52 54 5f 43 6f 72 6f 75 74  Dest==SRT_Corout
8f40: 69 6e 65 20 29 3b 0a 20 20 20 20 20 20 74 65 73  ine );.      tes
8f50: 74 63 61 73 65 28 20 65 44 65 73 74 3d 3d 53 52  tcase( eDest==SR
8f60: 54 5f 4f 75 74 70 75 74 20 29 3b 0a 20 20 20 20  T_Output );.    
8f70: 20 20 61 73 73 65 72 74 28 20 65 44 65 73 74 3d    assert( eDest=
8f80: 3d 53 52 54 5f 53 65 74 20 7c 7c 20 65 44 65 73  =SRT_Set || eDes
8f90: 74 3d 3d 53 52 54 5f 4d 65 6d 20 0a 20 20 20 20  t==SRT_Mem .    
8fa0: 20 20 20 20 20 20 20 7c 7c 20 65 44 65 73 74 3d         || eDest=
8fb0: 3d 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 20 7c  =SRT_Coroutine |
8fc0: 7c 20 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74  | eDest==SRT_Out
8fd0: 70 75 74 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20  put );.    }.   
8fe0: 20 73 52 6f 77 4c 6f 61 64 49 6e 66 6f 2e 72 65   sRowLoadInfo.re
8ff0: 67 52 65 73 75 6c 74 20 3d 20 72 65 67 52 65 73  gResult = regRes
9000: 75 6c 74 3b 0a 20 20 20 20 73 52 6f 77 4c 6f 61  ult;.    sRowLoa
9010: 64 49 6e 66 6f 2e 65 63 65 6c 46 6c 61 67 73 20  dInfo.ecelFlags 
9020: 3d 20 65 63 65 6c 46 6c 61 67 73 3b 0a 23 69 66  = ecelFlags;.#if
9030: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
9040: 45 5f 53 4f 52 54 45 52 5f 52 45 46 45 52 45 4e  E_SORTER_REFEREN
9050: 43 45 53 0a 20 20 20 20 73 52 6f 77 4c 6f 61 64  CES.    sRowLoad
9060: 49 6e 66 6f 2e 70 45 78 74 72 61 20 3d 20 70 45  Info.pExtra = pE
9070: 78 74 72 61 3b 0a 20 20 20 20 73 52 6f 77 4c 6f  xtra;.    sRowLo
9080: 61 64 49 6e 66 6f 2e 72 65 67 45 78 74 72 61 52  adInfo.regExtraR
9090: 65 73 75 6c 74 20 3d 20 72 65 67 52 65 73 75 6c  esult = regResul
90a0: 74 20 2b 20 6e 52 65 73 75 6c 74 43 6f 6c 3b 0a  t + nResultCol;.
90b0: 20 20 20 20 69 66 28 20 70 45 78 74 72 61 20 29      if( pExtra )
90c0: 20 6e 52 65 73 75 6c 74 43 6f 6c 20 2b 3d 20 70   nResultCol += p
90d0: 45 78 74 72 61 2d 3e 6e 45 78 70 72 3b 0a 23 65  Extra->nExpr;.#e
90e0: 6e 64 69 66 0a 20 20 20 20 69 66 28 20 70 2d 3e  ndif.    if( p->
90f0: 69 4c 69 6d 69 74 0a 20 20 20 20 20 26 26 20 28  iLimit.     && (
9100: 65 63 65 6c 46 6c 61 67 73 20 26 20 53 51 4c 49  ecelFlags & SQLI
9110: 54 45 5f 45 43 45 4c 5f 4f 4d 49 54 52 45 46 29  TE_ECEL_OMITREF)
9120: 21 3d 30 20 0a 20 20 20 20 20 26 26 20 6e 50 72  !=0 .     && nPr
9130: 65 66 69 78 52 65 67 3e 30 0a 20 20 20 20 29 7b  efixReg>0.    ){
9140: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
9150: 53 6f 72 74 21 3d 30 20 29 3b 0a 20 20 20 20 20  Sort!=0 );.     
9160: 20 61 73 73 65 72 74 28 20 68 61 73 44 69 73 74   assert( hasDist
9170: 69 6e 63 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20  inct==0 );.     
9180: 20 70 53 6f 72 74 2d 3e 70 44 65 66 65 72 72 65   pSort->pDeferre
9190: 64 52 6f 77 4c 6f 61 64 20 3d 20 26 73 52 6f 77  dRowLoad = &sRow
91a0: 4c 6f 61 64 49 6e 66 6f 3b 0a 20 20 20 20 20 20  LoadInfo;.      
91b0: 72 65 67 4f 72 69 67 20 3d 20 30 3b 0a 20 20 20  regOrig = 0;.   
91c0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e   }else{.      in
91d0: 6e 65 72 4c 6f 6f 70 4c 6f 61 64 52 6f 77 28 70  nerLoopLoadRow(p
91e0: 50 61 72 73 65 2c 20 70 2c 20 26 73 52 6f 77 4c  Parse, p, &sRowL
91f0: 6f 61 64 49 6e 66 6f 29 3b 0a 20 20 20 20 7d 0a  oadInfo);.    }.
9200: 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65    }..  /* If the
9210: 20 44 49 53 54 49 4e 43 54 20 6b 65 79 77 6f 72   DISTINCT keywor
9220: 64 20 77 61 73 20 70 72 65 73 65 6e 74 20 6f 6e  d was present on
9230: 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74   the SELECT stat
9240: 65 6d 65 6e 74 0a 20 20 2a 2a 20 61 6e 64 20 74  ement.  ** and t
9250: 68 69 73 20 72 6f 77 20 68 61 73 20 62 65 65 6e  his row has been
9260: 20 73 65 65 6e 20 62 65 66 6f 72 65 2c 20 74 68   seen before, th
9270: 65 6e 20 64 6f 20 6e 6f 74 20 6d 61 6b 65 20 74  en do not make t
9280: 68 69 73 20 72 6f 77 0a 20 20 2a 2a 20 70 61 72  his row.  ** par
9290: 74 20 6f 66 20 74 68 65 20 72 65 73 75 6c 74 2e  t of the result.
92a0: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 68 61 73 44  .  */.  if( hasD
92b0: 69 73 74 69 6e 63 74 20 29 7b 0a 20 20 20 20 73  istinct ){.    s
92c0: 77 69 74 63 68 28 20 70 44 69 73 74 69 6e 63 74  witch( pDistinct
92d0: 2d 3e 65 54 6e 63 74 54 79 70 65 20 29 7b 0a 20  ->eTnctType ){. 
92e0: 20 20 20 20 20 63 61 73 65 20 57 48 45 52 45 5f       case WHERE_
92f0: 44 49 53 54 49 4e 43 54 5f 4f 52 44 45 52 45 44  DISTINCT_ORDERED
9300: 3a 20 7b 0a 20 20 20 20 20 20 20 20 56 64 62 65  : {.        Vdbe
9310: 4f 70 20 2a 70 4f 70 3b 20 20 20 20 20 20 20 20  Op *pOp;        
9320: 20 20 20 20 2f 2a 20 4e 6f 20 6c 6f 6e 67 65 72      /* No longer
9330: 20 72 65 71 75 69 72 65 64 20 4f 70 65 6e 45 70   required OpenEp
9340: 68 65 6d 65 72 61 6c 20 69 6e 73 74 72 2e 20 2a  hemeral instr. *
9350: 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 4a  /.        int iJ
9360: 75 6d 70 3b 20 20 20 20 20 20 20 20 20 20 20 20  ump;            
9370: 20 20 2f 2a 20 4a 75 6d 70 20 64 65 73 74 69 6e    /* Jump destin
9380: 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 20  ation */.       
9390: 20 69 6e 74 20 72 65 67 50 72 65 76 3b 20 20 20   int regPrev;   
93a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72 65 76           /* Prev
93b0: 69 6f 75 73 20 72 6f 77 20 63 6f 6e 74 65 6e 74  ious row content
93c0: 20 2a 2f 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20   */..        /* 
93d0: 41 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66  Allocate space f
93e0: 6f 72 20 74 68 65 20 70 72 65 76 69 6f 75 73 20  or the previous 
93f0: 72 6f 77 20 2a 2f 0a 20 20 20 20 20 20 20 20 72  row */.        r
9400: 65 67 50 72 65 76 20 3d 20 70 50 61 72 73 65 2d  egPrev = pParse-
9410: 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20 20 20 20  >nMem+1;.       
9420: 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d   pParse->nMem +=
9430: 20 6e 52 65 73 75 6c 74 43 6f 6c 3b 0a 0a 20 20   nResultCol;..  
9440: 20 20 20 20 20 20 2f 2a 20 43 68 61 6e 67 65 20        /* Change 
9450: 74 68 65 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d  the OP_OpenEphem
9460: 65 72 61 6c 20 63 6f 64 65 64 20 65 61 72 6c 69  eral coded earli
9470: 65 72 20 74 6f 20 61 6e 20 4f 50 5f 4e 75 6c 6c  er to an OP_Null
9480: 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 65 74 73  .        ** sets
9490: 20 74 68 65 20 4d 45 4d 5f 43 6c 65 61 72 65 64   the MEM_Cleared
94a0: 20 62 69 74 20 6f 6e 20 74 68 65 20 66 69 72 73   bit on the firs
94b0: 74 20 72 65 67 69 73 74 65 72 20 6f 66 20 74 68  t register of th
94c0: 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 72 65  e.        ** pre
94d0: 76 69 6f 75 73 20 76 61 6c 75 65 2e 20 20 54 68  vious value.  Th
94e0: 69 73 20 77 69 6c 6c 20 63 61 75 73 65 20 74 68  is will cause th
94f0: 65 20 4f 50 5f 4e 65 20 62 65 6c 6f 77 20 74 6f  e OP_Ne below to
9500: 20 61 6c 77 61 79 73 0a 20 20 20 20 20 20 20 20   always.        
9510: 2a 2a 20 66 61 69 6c 20 6f 6e 20 74 68 65 20 66  ** fail on the f
9520: 69 72 73 74 20 69 74 65 72 61 74 69 6f 6e 20 6f  irst iteration o
9530: 66 20 74 68 65 20 6c 6f 6f 70 20 65 76 65 6e 20  f the loop even 
9540: 69 66 20 74 68 65 20 66 69 72 73 74 0a 20 20 20  if the first.   
9550: 20 20 20 20 20 2a 2a 20 72 6f 77 20 69 73 20 61       ** row is a
9560: 6c 6c 20 4e 55 4c 4c 73 2e 0a 20 20 20 20 20 20  ll NULLs..      
9570: 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 73 71 6c    */.        sql
9580: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 54 6f  ite3VdbeChangeTo
9590: 4e 6f 6f 70 28 76 2c 20 70 44 69 73 74 69 6e 63  Noop(v, pDistinc
95a0: 74 2d 3e 61 64 64 72 54 6e 63 74 29 3b 0a 20 20  t->addrTnct);.  
95b0: 20 20 20 20 20 20 70 4f 70 20 3d 20 73 71 6c 69        pOp = sqli
95c0: 74 65 33 56 64 62 65 47 65 74 4f 70 28 76 2c 20  te3VdbeGetOp(v, 
95d0: 70 44 69 73 74 69 6e 63 74 2d 3e 61 64 64 72 54  pDistinct->addrT
95e0: 6e 63 74 29 3b 0a 20 20 20 20 20 20 20 20 70 4f  nct);.        pO
95f0: 70 2d 3e 6f 70 63 6f 64 65 20 3d 20 4f 50 5f 4e  p->opcode = OP_N
9600: 75 6c 6c 3b 0a 20 20 20 20 20 20 20 20 70 4f 70  ull;.        pOp
9610: 2d 3e 70 31 20 3d 20 31 3b 0a 20 20 20 20 20 20  ->p1 = 1;.      
9620: 20 20 70 4f 70 2d 3e 70 32 20 3d 20 72 65 67 50    pOp->p2 = regP
9630: 72 65 76 3b 0a 0a 20 20 20 20 20 20 20 20 69 4a  rev;..        iJ
9640: 75 6d 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ump = sqlite3Vdb
9650: 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 20  eCurrentAddr(v) 
9660: 2b 20 6e 52 65 73 75 6c 74 43 6f 6c 3b 0a 20 20  + nResultCol;.  
9670: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
9680: 3c 6e 52 65 73 75 6c 74 43 6f 6c 3b 20 69 2b 2b  <nResultCol; i++
9690: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 43 6f 6c  ){.          Col
96a0: 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 73 71  lSeq *pColl = sq
96b0: 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71  lite3ExprCollSeq
96c0: 28 70 50 61 72 73 65 2c 20 70 2d 3e 70 45 4c 69  (pParse, p->pELi
96d0: 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b  st->a[i].pExpr);
96e0: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69  .          if( i
96f0: 3c 6e 52 65 73 75 6c 74 43 6f 6c 2d 31 20 29 7b  <nResultCol-1 ){
9700: 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
9710: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
9720: 2c 20 4f 50 5f 4e 65 2c 20 72 65 67 52 65 73 75  , OP_Ne, regResu
9730: 6c 74 2b 69 2c 20 69 4a 75 6d 70 2c 20 72 65 67  lt+i, iJump, reg
9740: 50 72 65 76 2b 69 29 3b 0a 20 20 20 20 20 20 20  Prev+i);.       
9750: 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
9760: 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20  e(v);.          
9770: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
9780: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
9790: 64 4f 70 33 28 76 2c 20 4f 50 5f 45 71 2c 20 72  dOp3(v, OP_Eq, r
97a0: 65 67 52 65 73 75 6c 74 2b 69 2c 20 69 43 6f 6e  egResult+i, iCon
97b0: 74 69 6e 75 65 2c 20 72 65 67 50 72 65 76 2b 69  tinue, regPrev+i
97c0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 56  );.            V
97d0: 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
97e0: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
97f0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
9800: 62 65 43 68 61 6e 67 65 50 34 28 76 2c 20 2d 31  beChangeP4(v, -1
9810: 2c 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29  , (const char *)
9820: 70 43 6f 6c 6c 2c 20 50 34 5f 43 4f 4c 4c 53 45  pColl, P4_COLLSE
9830: 51 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  Q);.          sq
9840: 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
9850: 35 28 76 2c 20 53 51 4c 49 54 45 5f 4e 55 4c 4c  5(v, SQLITE_NULL
9860: 45 51 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  EQ);.        }. 
9870: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73         assert( s
9880: 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
9890: 74 41 64 64 72 28 76 29 3d 3d 69 4a 75 6d 70 20  tAddr(v)==iJump 
98a0: 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d  || pParse->db->m
98b0: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20  allocFailed );. 
98c0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
98d0: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43  beAddOp3(v, OP_C
98e0: 6f 70 79 2c 20 72 65 67 52 65 73 75 6c 74 2c 20  opy, regResult, 
98f0: 72 65 67 50 72 65 76 2c 20 6e 52 65 73 75 6c 74  regPrev, nResult
9900: 43 6f 6c 2d 31 29 3b 0a 20 20 20 20 20 20 20 20  Col-1);.        
9910: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a  break;.      }..
9920: 20 20 20 20 20 20 63 61 73 65 20 57 48 45 52 45        case WHERE
9930: 5f 44 49 53 54 49 4e 43 54 5f 55 4e 49 51 55 45  _DISTINCT_UNIQUE
9940: 3a 20 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  : {.        sqli
9950: 74 65 33 56 64 62 65 43 68 61 6e 67 65 54 6f 4e  te3VdbeChangeToN
9960: 6f 6f 70 28 76 2c 20 70 44 69 73 74 69 6e 63 74  oop(v, pDistinct
9970: 2d 3e 61 64 64 72 54 6e 63 74 29 3b 0a 20 20 20  ->addrTnct);.   
9980: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
9990: 20 20 7d 0a 0a 20 20 20 20 20 20 64 65 66 61 75    }..      defau
99a0: 6c 74 3a 20 7b 0a 20 20 20 20 20 20 20 20 61 73  lt: {.        as
99b0: 73 65 72 74 28 20 70 44 69 73 74 69 6e 63 74 2d  sert( pDistinct-
99c0: 3e 65 54 6e 63 74 54 79 70 65 3d 3d 57 48 45 52  >eTnctType==WHER
99d0: 45 5f 44 49 53 54 49 4e 43 54 5f 55 4e 4f 52 44  E_DISTINCT_UNORD
99e0: 45 52 45 44 20 29 3b 0a 20 20 20 20 20 20 20 20  ERED );.        
99f0: 63 6f 64 65 44 69 73 74 69 6e 63 74 28 70 50 61  codeDistinct(pPa
9a00: 72 73 65 2c 20 70 44 69 73 74 69 6e 63 74 2d 3e  rse, pDistinct->
9a10: 74 61 62 54 6e 63 74 2c 20 69 43 6f 6e 74 69 6e  tabTnct, iContin
9a20: 75 65 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 2c 0a  ue, nResultCol,.
9a30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9a40: 20 20 20 20 20 72 65 67 52 65 73 75 6c 74 29 3b       regResult);
9a50: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
9a60: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
9a70: 20 20 69 66 28 20 70 53 6f 72 74 3d 3d 30 20 29    if( pSort==0 )
9a80: 7b 0a 20 20 20 20 20 20 63 6f 64 65 4f 66 66 73  {.      codeOffs
9a90: 65 74 28 76 2c 20 70 2d 3e 69 4f 66 66 73 65 74  et(v, p->iOffset
9aa0: 2c 20 69 43 6f 6e 74 69 6e 75 65 29 3b 0a 20 20  , iContinue);.  
9ab0: 20 20 7d 0a 20 20 7d 0a 0a 20 20 73 77 69 74 63    }.  }..  switc
9ac0: 68 28 20 65 44 65 73 74 20 29 7b 0a 20 20 20 20  h( eDest ){.    
9ad0: 2f 2a 20 49 6e 20 74 68 69 73 20 6d 6f 64 65 2c  /* In this mode,
9ae0: 20 77 72 69 74 65 20 65 61 63 68 20 71 75 65 72   write each quer
9af0: 79 20 72 65 73 75 6c 74 20 74 6f 20 74 68 65 20  y result to the 
9b00: 6b 65 79 20 6f 66 20 74 68 65 20 74 65 6d 70 6f  key of the tempo
9b10: 72 61 72 79 0a 20 20 20 20 2a 2a 20 74 61 62 6c  rary.    ** tabl
9b20: 65 20 69 50 61 72 6d 2e 0a 20 20 20 20 2a 2f 0a  e iParm..    */.
9b30: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
9b40: 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c  MIT_COMPOUND_SEL
9b50: 45 43 54 0a 20 20 20 20 63 61 73 65 20 53 52 54  ECT.    case SRT
9b60: 5f 55 6e 69 6f 6e 3a 20 7b 0a 20 20 20 20 20 20  _Union: {.      
9b70: 69 6e 74 20 72 31 3b 0a 20 20 20 20 20 20 72 31  int r1;.      r1
9b80: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
9b90: 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20  pReg(pParse);.  
9ba0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
9bb0: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65  ddOp3(v, OP_Make
9bc0: 52 65 63 6f 72 64 2c 20 72 65 67 52 65 73 75 6c  Record, regResul
9bd0: 74 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 2c 20 72  t, nResultCol, r
9be0: 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  1);.      sqlite
9bf0: 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76  3VdbeAddOp4Int(v
9c00: 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20  , OP_IdxInsert, 
9c10: 69 50 61 72 6d 2c 20 72 31 2c 20 72 65 67 52 65  iParm, r1, regRe
9c20: 73 75 6c 74 2c 20 6e 52 65 73 75 6c 74 43 6f 6c  sult, nResultCol
9c30: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
9c40: 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
9c50: 50 61 72 73 65 2c 20 72 31 29 3b 0a 20 20 20 20  Parse, r1);.    
9c60: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
9c70: 20 20 20 20 2f 2a 20 43 6f 6e 73 74 72 75 63 74      /* Construct
9c80: 20 61 20 72 65 63 6f 72 64 20 66 72 6f 6d 20 74   a record from t
9c90: 68 65 20 71 75 65 72 79 20 72 65 73 75 6c 74 2c  he query result,
9ca0: 20 62 75 74 20 69 6e 73 74 65 61 64 20 6f 66 0a   but instead of.
9cb0: 20 20 20 20 2a 2a 20 73 61 76 69 6e 67 20 74 68      ** saving th
9cc0: 61 74 20 72 65 63 6f 72 64 2c 20 75 73 65 20 69  at record, use i
9cd0: 74 20 61 73 20 61 20 6b 65 79 20 74 6f 20 64 65  t as a key to de
9ce0: 6c 65 74 65 20 65 6c 65 6d 65 6e 74 73 20 66 72  lete elements fr
9cf0: 6f 6d 0a 20 20 20 20 2a 2a 20 74 68 65 20 74 65  om.    ** the te
9d00: 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 69 50  mporary table iP
9d10: 61 72 6d 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  arm..    */.    
9d20: 63 61 73 65 20 53 52 54 5f 45 78 63 65 70 74 3a  case SRT_Except:
9d30: 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   {.      sqlite3
9d40: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
9d50: 5f 49 64 78 44 65 6c 65 74 65 2c 20 69 50 61 72  _IdxDelete, iPar
9d60: 6d 2c 20 72 65 67 52 65 73 75 6c 74 2c 20 6e 52  m, regResult, nR
9d70: 65 73 75 6c 74 43 6f 6c 29 3b 0a 20 20 20 20 20  esultCol);.     
9d80: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65   break;.    }.#e
9d90: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
9da0: 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c  MIT_COMPOUND_SEL
9db0: 45 43 54 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 53  ECT */..    /* S
9dc0: 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 20  tore the result 
9dd0: 61 73 20 64 61 74 61 20 75 73 69 6e 67 20 61 20  as data using a 
9de0: 75 6e 69 71 75 65 20 6b 65 79 2e 0a 20 20 20 20  unique key..    
9df0: 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f  */.    case SRT_
9e00: 46 69 66 6f 3a 0a 20 20 20 20 63 61 73 65 20 53  Fifo:.    case S
9e10: 52 54 5f 44 69 73 74 46 69 66 6f 3a 0a 20 20 20  RT_DistFifo:.   
9e20: 20 63 61 73 65 20 53 52 54 5f 54 61 62 6c 65 3a   case SRT_Table:
9e30: 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 45 70  .    case SRT_Ep
9e40: 68 65 6d 54 61 62 3a 20 7b 0a 20 20 20 20 20 20  hemTab: {.      
9e50: 69 6e 74 20 72 31 20 3d 20 73 71 6c 69 74 65 33  int r1 = sqlite3
9e60: 47 65 74 54 65 6d 70 52 61 6e 67 65 28 70 50 61  GetTempRange(pPa
9e70: 72 73 65 2c 20 6e 50 72 65 66 69 78 52 65 67 2b  rse, nPrefixReg+
9e80: 31 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  1);.      testca
9e90: 73 65 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 54  se( eDest==SRT_T
9ea0: 61 62 6c 65 20 29 3b 0a 20 20 20 20 20 20 74 65  able );.      te
9eb0: 73 74 63 61 73 65 28 20 65 44 65 73 74 3d 3d 53  stcase( eDest==S
9ec0: 52 54 5f 45 70 68 65 6d 54 61 62 20 29 3b 0a 20  RT_EphemTab );. 
9ed0: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 65       testcase( e
9ee0: 44 65 73 74 3d 3d 53 52 54 5f 46 69 66 6f 20 29  Dest==SRT_Fifo )
9ef0: 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
9f00: 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 44 69 73  ( eDest==SRT_Dis
9f10: 74 46 69 66 6f 20 29 3b 0a 20 20 20 20 20 20 73  tFifo );.      s
9f20: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
9f30: 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72  (v, OP_MakeRecor
9f40: 64 2c 20 72 65 67 52 65 73 75 6c 74 2c 20 6e 52  d, regResult, nR
9f50: 65 73 75 6c 74 43 6f 6c 2c 20 72 31 2b 6e 50 72  esultCol, r1+nPr
9f60: 65 66 69 78 52 65 67 29 3b 0a 23 69 66 6e 64 65  efixReg);.#ifnde
9f70: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 54  f SQLITE_OMIT_CT
9f80: 45 0a 20 20 20 20 20 20 69 66 28 20 65 44 65 73  E.      if( eDes
9f90: 74 3d 3d 53 52 54 5f 44 69 73 74 46 69 66 6f 20  t==SRT_DistFifo 
9fa0: 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66  ){.        /* If
9fb0: 20 74 68 65 20 64 65 73 74 69 6e 61 74 69 6f 6e   the destination
9fc0: 20 69 73 20 44 69 73 74 46 69 66 6f 2c 20 74 68   is DistFifo, th
9fd0: 65 6e 20 63 75 72 73 6f 72 20 28 69 50 61 72 6d  en cursor (iParm
9fe0: 2b 31 29 20 69 73 20 6f 70 65 6e 0a 20 20 20 20  +1) is open.    
9ff0: 20 20 20 20 2a 2a 20 6f 6e 20 61 6e 20 65 70 68      ** on an eph
a000: 65 6d 65 72 61 6c 20 69 6e 64 65 78 2e 20 49 66  emeral index. If
a010: 20 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f 77   the current row
a020: 20 69 73 20 61 6c 72 65 61 64 79 20 70 72 65 73   is already pres
a030: 65 6e 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 69  ent.        ** i
a040: 6e 20 74 68 65 20 69 6e 64 65 78 2c 20 64 6f 20  n the index, do 
a050: 6e 6f 74 20 77 72 69 74 65 20 69 74 20 74 6f 20  not write it to 
a060: 74 68 65 20 6f 75 74 70 75 74 2e 20 49 66 20 6e  the output. If n
a070: 6f 74 2c 20 61 64 64 20 74 68 65 0a 20 20 20 20  ot, add the.    
a080: 20 20 20 20 2a 2a 20 63 75 72 72 65 6e 74 20 72      ** current r
a090: 6f 77 20 74 6f 20 74 68 65 20 69 6e 64 65 78 20  ow to the index 
a0a0: 61 6e 64 20 70 72 6f 63 65 65 64 20 77 69 74 68  and proceed with
a0b0: 20 77 72 69 74 69 6e 67 20 69 74 20 74 6f 20 74   writing it to t
a0c0: 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 75  he.        ** ou
a0d0: 74 70 75 74 20 74 61 62 6c 65 20 61 73 20 77 65  tput table as we
a0e0: 6c 6c 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20  ll.  */.        
a0f0: 69 6e 74 20 61 64 64 72 20 3d 20 73 71 6c 69 74  int addr = sqlit
a100: 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
a110: 72 28 76 29 20 2b 20 34 3b 0a 20 20 20 20 20 20  r(v) + 4;.      
a120: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
a130: 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 46 6f 75  Op4Int(v, OP_Fou
a140: 6e 64 2c 20 69 50 61 72 6d 2b 31 2c 20 61 64 64  nd, iParm+1, add
a150: 72 2c 20 72 31 2c 20 30 29 3b 0a 20 20 20 20 20  r, r1, 0);.     
a160: 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28     VdbeCoverage(
a170: 76 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  v);.        sqli
a180: 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74  te3VdbeAddOp4Int
a190: 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74  (v, OP_IdxInsert
a1a0: 2c 20 69 50 61 72 6d 2b 31 2c 20 72 31 2c 72 65  , iParm+1, r1,re
a1b0: 67 52 65 73 75 6c 74 2c 6e 52 65 73 75 6c 74 43  gResult,nResultC
a1c0: 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  ol);.        ass
a1d0: 65 72 74 28 20 70 53 6f 72 74 3d 3d 30 20 29 3b  ert( pSort==0 );
a1e0: 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  .      }.#endif.
a1f0: 20 20 20 20 20 20 69 66 28 20 70 53 6f 72 74 20        if( pSort 
a200: 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ){.        asser
a210: 74 28 20 72 65 67 52 65 73 75 6c 74 3d 3d 72 65  t( regResult==re
a220: 67 4f 72 69 67 20 29 3b 0a 20 20 20 20 20 20 20  gOrig );.       
a230: 20 70 75 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28   pushOntoSorter(
a240: 70 50 61 72 73 65 2c 20 70 53 6f 72 74 2c 20 70  pParse, pSort, p
a250: 2c 20 72 31 2b 6e 50 72 65 66 69 78 52 65 67 2c  , r1+nPrefixReg,
a260: 20 72 65 67 4f 72 69 67 2c 20 31 2c 20 6e 50 72   regOrig, 1, nPr
a270: 65 66 69 78 52 65 67 29 3b 0a 20 20 20 20 20 20  efixReg);.      
a280: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69  }else{.        i
a290: 6e 74 20 72 32 20 3d 20 73 71 6c 69 74 65 33 47  nt r2 = sqlite3G
a2a0: 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  etTempReg(pParse
a2b0: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
a2c0: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
a2d0: 4f 50 5f 4e 65 77 52 6f 77 69 64 2c 20 69 50 61  OP_NewRowid, iPa
a2e0: 72 6d 2c 20 72 32 29 3b 0a 20 20 20 20 20 20 20  rm, r2);.       
a2f0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
a300: 70 33 28 76 2c 20 4f 50 5f 49 6e 73 65 72 74 2c  p3(v, OP_Insert,
a310: 20 69 50 61 72 6d 2c 20 72 31 2c 20 72 32 29 3b   iParm, r1, r2);
a320: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
a330: 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20  VdbeChangeP5(v, 
a340: 4f 50 46 4c 41 47 5f 41 50 50 45 4e 44 29 3b 0a  OPFLAG_APPEND);.
a350: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52          sqlite3R
a360: 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
a370: 61 72 73 65 2c 20 72 32 29 3b 0a 20 20 20 20 20  arse, r2);.     
a380: 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
a390: 52 65 6c 65 61 73 65 54 65 6d 70 52 61 6e 67 65  ReleaseTempRange
a3a0: 28 70 50 61 72 73 65 2c 20 72 31 2c 20 6e 50 72  (pParse, r1, nPr
a3b0: 65 66 69 78 52 65 67 2b 31 29 3b 0a 20 20 20 20  efixReg+1);.    
a3c0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
a3d0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
a3e0: 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20 20  MIT_SUBQUERY.   
a3f0: 20 2f 2a 20 49 66 20 77 65 20 61 72 65 20 63 72   /* If we are cr
a400: 65 61 74 69 6e 67 20 61 20 73 65 74 20 66 6f 72  eating a set for
a410: 20 61 6e 20 22 65 78 70 72 20 49 4e 20 28 53 45   an "expr IN (SE
a420: 4c 45 43 54 20 2e 2e 2e 29 22 20 63 6f 6e 73 74  LECT ...)" const
a430: 72 75 63 74 2c 0a 20 20 20 20 2a 2a 20 74 68 65  ruct,.    ** the
a440: 6e 20 74 68 65 72 65 20 73 68 6f 75 6c 64 20 62  n there should b
a450: 65 20 61 20 73 69 6e 67 6c 65 20 69 74 65 6d 20  e a single item 
a460: 6f 6e 20 74 68 65 20 73 74 61 63 6b 2e 20 20 57  on the stack.  W
a470: 72 69 74 65 20 74 68 69 73 0a 20 20 20 20 2a 2a  rite this.    **
a480: 20 69 74 65 6d 20 69 6e 74 6f 20 74 68 65 20 73   item into the s
a490: 65 74 20 74 61 62 6c 65 20 77 69 74 68 20 62 6f  et table with bo
a4a0: 67 75 73 20 64 61 74 61 2e 0a 20 20 20 20 2a 2f  gus data..    */
a4b0: 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 53 65  .    case SRT_Se
a4c0: 74 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 70  t: {.      if( p
a4d0: 53 6f 72 74 20 29 7b 0a 20 20 20 20 20 20 20 20  Sort ){.        
a4e0: 2f 2a 20 41 74 20 66 69 72 73 74 20 67 6c 61 6e  /* At first glan
a4f0: 63 65 20 79 6f 75 20 77 6f 75 6c 64 20 74 68 69  ce you would thi
a500: 6e 6b 20 77 65 20 63 6f 75 6c 64 20 6f 70 74 69  nk we could opti
a510: 6d 69 7a 65 20 6f 75 74 20 74 68 65 0a 20 20 20  mize out the.   
a520: 20 20 20 20 20 2a 2a 20 4f 52 44 45 52 20 42 59       ** ORDER BY
a530: 20 69 6e 20 74 68 69 73 20 63 61 73 65 20 73 69   in this case si
a540: 6e 63 65 20 74 68 65 20 6f 72 64 65 72 20 6f 66  nce the order of
a550: 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20   entries in the 
a560: 73 65 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 64  set.        ** d
a570: 6f 65 73 20 6e 6f 74 20 6d 61 74 74 65 72 2e 20  oes not matter. 
a580: 20 42 75 74 20 74 68 65 72 65 20 6d 69 67 68 74   But there might
a590: 20 62 65 20 61 20 4c 49 4d 49 54 20 63 6c 61 75   be a LIMIT clau
a5a0: 73 65 2c 20 69 6e 20 77 68 69 63 68 0a 20 20 20  se, in which.   
a5b0: 20 20 20 20 20 2a 2a 20 63 61 73 65 20 74 68 65       ** case the
a5c0: 20 6f 72 64 65 72 20 64 6f 65 73 20 6d 61 74 74   order does matt
a5d0: 65 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 75  er */.        pu
a5e0: 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28 0a 20 20  shOntoSorter(.  
a5f0: 20 20 20 20 20 20 20 20 20 20 70 50 61 72 73 65            pParse
a600: 2c 20 70 53 6f 72 74 2c 20 70 2c 20 72 65 67 52  , pSort, p, regR
a610: 65 73 75 6c 74 2c 20 72 65 67 4f 72 69 67 2c 20  esult, regOrig, 
a620: 6e 52 65 73 75 6c 74 43 6f 6c 2c 20 6e 50 72 65  nResultCol, nPre
a630: 66 69 78 52 65 67 29 3b 0a 20 20 20 20 20 20 7d  fixReg);.      }
a640: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 6e  else{.        in
a650: 74 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65  t r1 = sqlite3Ge
a660: 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29  tTempReg(pParse)
a670: 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
a680: 28 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  ( sqlite3Strlen3
a690: 30 28 70 44 65 73 74 2d 3e 7a 41 66 66 53 64 73  0(pDest->zAffSds
a6a0: 74 29 3d 3d 6e 52 65 73 75 6c 74 43 6f 6c 20 29  t)==nResultCol )
a6b0: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
a6c0: 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
a6d0: 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 65  P_MakeRecord, re
a6e0: 67 52 65 73 75 6c 74 2c 20 6e 52 65 73 75 6c 74  gResult, nResult
a6f0: 43 6f 6c 2c 20 0a 20 20 20 20 20 20 20 20 20 20  Col, .          
a700: 20 20 72 31 2c 20 70 44 65 73 74 2d 3e 7a 41 66    r1, pDest->zAf
a710: 66 53 64 73 74 2c 20 6e 52 65 73 75 6c 74 43 6f  fSdst, nResultCo
a720: 6c 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  l);.        sqli
a730: 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74  te3VdbeAddOp4Int
a740: 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74  (v, OP_IdxInsert
a750: 2c 20 69 50 61 72 6d 2c 20 72 31 2c 20 72 65 67  , iParm, r1, reg
a760: 52 65 73 75 6c 74 2c 20 6e 52 65 73 75 6c 74 43  Result, nResultC
a770: 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  ol);.        sql
a780: 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
a790: 65 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a  eg(pParse, r1);.
a7a0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
a7b0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  eak;.    }..    
a7c0: 2f 2a 20 49 66 20 61 6e 79 20 72 6f 77 20 65 78  /* If any row ex
a7d0: 69 73 74 20 69 6e 20 74 68 65 20 72 65 73 75 6c  ist in the resul
a7e0: 74 20 73 65 74 2c 20 72 65 63 6f 72 64 20 74 68  t set, record th
a7f0: 61 74 20 66 61 63 74 20 61 6e 64 20 61 62 6f 72  at fact and abor
a800: 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61  t..    */.    ca
a810: 73 65 20 53 52 54 5f 45 78 69 73 74 73 3a 20 7b  se SRT_Exists: {
a820: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
a830: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
a840: 6e 74 65 67 65 72 2c 20 31 2c 20 69 50 61 72 6d  nteger, 1, iParm
a850: 29 3b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20  );.      /* The 
a860: 4c 49 4d 49 54 20 63 6c 61 75 73 65 20 77 69 6c  LIMIT clause wil
a870: 6c 20 74 65 72 6d 69 6e 61 74 65 20 74 68 65 20  l terminate the 
a880: 6c 6f 6f 70 20 66 6f 72 20 75 73 20 2a 2f 0a 20  loop for us */. 
a890: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
a8a0: 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69  }..    /* If thi
a8b0: 73 20 69 73 20 61 20 73 63 61 6c 61 72 20 73 65  s is a scalar se
a8c0: 6c 65 63 74 20 74 68 61 74 20 69 73 20 70 61 72  lect that is par
a8d0: 74 20 6f 66 20 61 6e 20 65 78 70 72 65 73 73 69  t of an expressi
a8e0: 6f 6e 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20  on, then.    ** 
a8f0: 73 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74  store the result
a900: 73 20 69 6e 20 74 68 65 20 61 70 70 72 6f 70 72  s in the appropr
a910: 69 61 74 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c  iate memory cell
a920: 20 6f 72 20 61 72 72 61 79 20 6f 66 20 0a 20 20   or array of .  
a930: 20 20 2a 2a 20 6d 65 6d 6f 72 79 20 63 65 6c 6c    ** memory cell
a940: 73 20 61 6e 64 20 62 72 65 61 6b 20 6f 75 74 20  s and break out 
a950: 6f 66 20 74 68 65 20 73 63 61 6e 20 6c 6f 6f 70  of the scan loop
a960: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73  ..    */.    cas
a970: 65 20 53 52 54 5f 4d 65 6d 3a 20 7b 0a 20 20 20  e SRT_Mem: {.   
a980: 20 20 20 69 66 28 20 70 53 6f 72 74 20 29 7b 0a     if( pSort ){.
a990: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
a9a0: 6e 52 65 73 75 6c 74 43 6f 6c 3c 3d 70 44 65 73  nResultCol<=pDes
a9b0: 74 2d 3e 6e 53 64 73 74 20 29 3b 0a 20 20 20 20  t->nSdst );.    
a9c0: 20 20 20 20 70 75 73 68 4f 6e 74 6f 53 6f 72 74      pushOntoSort
a9d0: 65 72 28 0a 20 20 20 20 20 20 20 20 20 20 20 20  er(.            
a9e0: 70 50 61 72 73 65 2c 20 70 53 6f 72 74 2c 20 70  pParse, pSort, p
a9f0: 2c 20 72 65 67 52 65 73 75 6c 74 2c 20 72 65 67  , regResult, reg
aa00: 4f 72 69 67 2c 20 6e 52 65 73 75 6c 74 43 6f 6c  Orig, nResultCol
aa10: 2c 20 6e 50 72 65 66 69 78 52 65 67 29 3b 0a 20  , nPrefixReg);. 
aa20: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
aa30: 20 20 20 20 61 73 73 65 72 74 28 20 6e 52 65 73      assert( nRes
aa40: 75 6c 74 43 6f 6c 3d 3d 70 44 65 73 74 2d 3e 6e  ultCol==pDest->n
aa50: 53 64 73 74 20 29 3b 0a 20 20 20 20 20 20 20 20  Sdst );.        
aa60: 61 73 73 65 72 74 28 20 72 65 67 52 65 73 75 6c  assert( regResul
aa70: 74 3d 3d 69 50 61 72 6d 20 29 3b 0a 20 20 20 20  t==iParm );.    
aa80: 20 20 20 20 2f 2a 20 54 68 65 20 4c 49 4d 49 54      /* The LIMIT
aa90: 20 63 6c 61 75 73 65 20 77 69 6c 6c 20 6a 75 6d   clause will jum
aaa0: 70 20 6f 75 74 20 6f 66 20 74 68 65 20 6c 6f 6f  p out of the loo
aab0: 70 20 66 6f 72 20 75 73 20 2a 2f 0a 20 20 20 20  p for us */.    
aac0: 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
aad0: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a  .    }.#endif /*
aae0: 20 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f   #ifndef SQLITE_
aaf0: 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 20 2a 2f  OMIT_SUBQUERY */
ab00: 0a 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 43  ..    case SRT_C
ab10: 6f 72 6f 75 74 69 6e 65 3a 20 20 20 20 20 20 20  oroutine:       
ab20: 2f 2a 20 53 65 6e 64 20 64 61 74 61 20 74 6f 20  /* Send data to 
ab30: 61 20 63 6f 2d 72 6f 75 74 69 6e 65 20 2a 2f 0a  a co-routine */.
ab40: 20 20 20 20 63 61 73 65 20 53 52 54 5f 4f 75 74      case SRT_Out
ab50: 70 75 74 3a 20 7b 20 20 20 20 20 20 20 20 2f 2a  put: {        /*
ab60: 20 52 65 74 75 72 6e 20 74 68 65 20 72 65 73 75   Return the resu
ab70: 6c 74 73 20 2a 2f 0a 20 20 20 20 20 20 74 65 73  lts */.      tes
ab80: 74 63 61 73 65 28 20 65 44 65 73 74 3d 3d 53 52  tcase( eDest==SR
ab90: 54 5f 43 6f 72 6f 75 74 69 6e 65 20 29 3b 0a 20  T_Coroutine );. 
aba0: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 65       testcase( e
abb0: 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74  Dest==SRT_Output
abc0: 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 53   );.      if( pS
abd0: 6f 72 74 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ort ){.        p
abe0: 75 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28 70 50  ushOntoSorter(pP
abf0: 61 72 73 65 2c 20 70 53 6f 72 74 2c 20 70 2c 20  arse, pSort, p, 
ac00: 72 65 67 52 65 73 75 6c 74 2c 20 72 65 67 4f 72  regResult, regOr
ac10: 69 67 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 2c 0a  ig, nResultCol,.
ac20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ac30: 20 20 20 20 20 20 20 6e 50 72 65 66 69 78 52 65         nPrefixRe
ac40: 67 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  g);.      }else 
ac50: 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 43  if( eDest==SRT_C
ac60: 6f 72 6f 75 74 69 6e 65 20 29 7b 0a 20 20 20 20  oroutine ){.    
ac70: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
ac80: 64 64 4f 70 31 28 76 2c 20 4f 50 5f 59 69 65 6c  ddOp1(v, OP_Yiel
ac90: 64 2c 20 70 44 65 73 74 2d 3e 69 53 44 50 61 72  d, pDest->iSDPar
aca0: 6d 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  m);.      }else{
acb0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
acc0: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
acd0: 5f 52 65 73 75 6c 74 52 6f 77 2c 20 72 65 67 52  _ResultRow, regR
ace0: 65 73 75 6c 74 2c 20 6e 52 65 73 75 6c 74 43 6f  esult, nResultCo
acf0: 6c 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  l);.      }.    
ad00: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
ad10: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
ad20: 4d 49 54 5f 43 54 45 0a 20 20 20 20 2f 2a 20 57  MIT_CTE.    /* W
ad30: 72 69 74 65 20 74 68 65 20 72 65 73 75 6c 74 73  rite the results
ad40: 20 69 6e 74 6f 20 61 20 70 72 69 6f 72 69 74 79   into a priority
ad50: 20 71 75 65 75 65 20 74 68 61 74 20 69 73 20 6f   queue that is o
ad60: 72 64 65 72 20 61 63 63 6f 72 64 69 6e 67 20 74  rder according t
ad70: 6f 0a 20 20 20 20 2a 2a 20 70 44 65 73 74 2d 3e  o.    ** pDest->
ad80: 70 4f 72 64 65 72 42 79 20 28 69 6e 20 70 53 4f  pOrderBy (in pSO
ad90: 29 2e 20 20 70 44 65 73 74 2d 3e 69 53 44 50 61  ).  pDest->iSDPa
ada0: 72 6d 20 28 69 6e 20 69 50 61 72 6d 29 20 69 73  rm (in iParm) is
adb0: 20 74 68 65 20 63 75 72 73 6f 72 20 66 6f 72 20   the cursor for 
adc0: 61 6e 0a 20 20 20 20 2a 2a 20 69 6e 64 65 78 20  an.    ** index 
add0: 77 69 74 68 20 70 53 4f 2d 3e 6e 45 78 70 72 2b  with pSO->nExpr+
ade0: 32 20 63 6f 6c 75 6d 6e 73 2e 20 20 42 75 69 6c  2 columns.  Buil
adf0: 64 20 61 20 6b 65 79 20 75 73 69 6e 67 20 70 53  d a key using pS
ae00: 4f 20 66 6f 72 20 74 68 65 20 66 69 72 73 74 0a  O for the first.
ae10: 20 20 20 20 2a 2a 20 70 53 4f 2d 3e 6e 45 78 70      ** pSO->nExp
ae20: 72 20 63 6f 6c 75 6d 6e 73 2c 20 74 68 65 6e 20  r columns, then 
ae30: 6d 61 6b 65 20 73 75 72 65 20 61 6c 6c 20 6b 65  make sure all ke
ae40: 79 73 20 61 72 65 20 75 6e 69 71 75 65 20 62 79  ys are unique by
ae50: 20 61 64 64 69 6e 67 20 61 0a 20 20 20 20 2a 2a   adding a.    **
ae60: 20 66 69 6e 61 6c 20 4f 50 5f 53 65 71 75 65 6e   final OP_Sequen
ae70: 63 65 20 63 6f 6c 75 6d 6e 2e 20 20 54 68 65 20  ce column.  The 
ae80: 6c 61 73 74 20 63 6f 6c 75 6d 6e 20 69 73 20 74  last column is t
ae90: 68 65 20 72 65 63 6f 72 64 20 61 73 20 61 20 62  he record as a b
aea0: 6c 6f 62 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  lob..    */.    
aeb0: 63 61 73 65 20 53 52 54 5f 44 69 73 74 51 75 65  case SRT_DistQue
aec0: 75 65 3a 0a 20 20 20 20 63 61 73 65 20 53 52 54  ue:.    case SRT
aed0: 5f 51 75 65 75 65 3a 20 7b 0a 20 20 20 20 20 20  _Queue: {.      
aee0: 69 6e 74 20 6e 4b 65 79 3b 0a 20 20 20 20 20 20  int nKey;.      
aef0: 69 6e 74 20 72 31 2c 20 72 32 2c 20 72 33 3b 0a  int r1, r2, r3;.
af00: 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 54 65        int addrTe
af10: 73 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 45 78  st = 0;.      Ex
af20: 70 72 4c 69 73 74 20 2a 70 53 4f 3b 0a 20 20 20  prList *pSO;.   
af30: 20 20 20 70 53 4f 20 3d 20 70 44 65 73 74 2d 3e     pSO = pDest->
af40: 70 4f 72 64 65 72 42 79 3b 0a 20 20 20 20 20 20  pOrderBy;.      
af50: 61 73 73 65 72 74 28 20 70 53 4f 20 29 3b 0a 20  assert( pSO );. 
af60: 20 20 20 20 20 6e 4b 65 79 20 3d 20 70 53 4f 2d       nKey = pSO-
af70: 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 72 31  >nExpr;.      r1
af80: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
af90: 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20  pReg(pParse);.  
afa0: 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33      r2 = sqlite3
afb0: 47 65 74 54 65 6d 70 52 61 6e 67 65 28 70 50 61  GetTempRange(pPa
afc0: 72 73 65 2c 20 6e 4b 65 79 2b 32 29 3b 0a 20 20  rse, nKey+2);.  
afd0: 20 20 20 20 72 33 20 3d 20 72 32 2b 6e 4b 65 79      r3 = r2+nKey
afe0: 2b 31 3b 0a 20 20 20 20 20 20 69 66 28 20 65 44  +1;.      if( eD
aff0: 65 73 74 3d 3d 53 52 54 5f 44 69 73 74 51 75 65  est==SRT_DistQue
b000: 75 65 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  ue ){.        /*
b010: 20 49 66 20 74 68 65 20 64 65 73 74 69 6e 61 74   If the destinat
b020: 69 6f 6e 20 69 73 20 44 69 73 74 51 75 65 75 65  ion is DistQueue
b030: 2c 20 74 68 65 6e 20 63 75 72 73 6f 72 20 28 69  , then cursor (i
b040: 50 61 72 6d 2b 31 29 20 69 73 20 6f 70 65 6e 0a  Parm+1) is open.
b050: 20 20 20 20 20 20 20 20 2a 2a 20 6f 6e 20 61 20          ** on a 
b060: 73 65 63 6f 6e 64 20 65 70 68 65 6d 65 72 61 6c  second ephemeral
b070: 20 69 6e 64 65 78 20 74 68 61 74 20 68 6f 6c 64   index that hold
b080: 73 20 61 6c 6c 20 76 61 6c 75 65 73 20 65 76 65  s all values eve
b090: 72 79 20 70 72 65 76 69 6f 75 73 6c 79 0a 20 20  ry previously.  
b0a0: 20 20 20 20 20 20 2a 2a 20 61 64 64 65 64 20 74        ** added t
b0b0: 6f 20 74 68 65 20 71 75 65 75 65 2e 20 2a 2f 0a  o the queue. */.
b0c0: 20 20 20 20 20 20 20 20 61 64 64 72 54 65 73 74          addrTest
b0d0: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
b0e0: 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 46 6f  dOp4Int(v, OP_Fo
b0f0: 75 6e 64 2c 20 69 50 61 72 6d 2b 31 2c 20 30 2c  und, iParm+1, 0,
b100: 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
b110: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b120: 20 20 20 20 20 20 20 20 20 20 72 65 67 52 65 73            regRes
b130: 75 6c 74 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 29  ult, nResultCol)
b140: 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65 43 6f  ;.        VdbeCo
b150: 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20  verage(v);.     
b160: 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
b170: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
b180: 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 65 67  _MakeRecord, reg
b190: 52 65 73 75 6c 74 2c 20 6e 52 65 73 75 6c 74 43  Result, nResultC
b1a0: 6f 6c 2c 20 72 33 29 3b 0a 20 20 20 20 20 20 69  ol, r3);.      i
b1b0: 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 44 69  f( eDest==SRT_Di
b1c0: 73 74 51 75 65 75 65 20 29 7b 0a 20 20 20 20 20  stQueue ){.     
b1d0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
b1e0: 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78 49 6e  dOp2(v, OP_IdxIn
b1f0: 73 65 72 74 2c 20 69 50 61 72 6d 2b 31 2c 20 72  sert, iParm+1, r
b200: 33 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  3);.        sqli
b210: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28  te3VdbeChangeP5(
b220: 76 2c 20 4f 50 46 4c 41 47 5f 55 53 45 53 45 45  v, OPFLAG_USESEE
b230: 4b 52 45 53 55 4c 54 29 3b 0a 20 20 20 20 20 20  KRESULT);.      
b240: 7d 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  }.      for(i=0;
b250: 20 69 3c 6e 4b 65 79 3b 20 69 2b 2b 29 7b 0a 20   i<nKey; i++){. 
b260: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
b270: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53  beAddOp2(v, OP_S
b280: 43 6f 70 79 2c 0a 20 20 20 20 20 20 20 20 20 20  Copy,.          
b290: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b2a0: 72 65 67 52 65 73 75 6c 74 20 2b 20 70 53 4f 2d  regResult + pSO-
b2b0: 3e 61 5b 69 5d 2e 75 2e 78 2e 69 4f 72 64 65 72  >a[i].u.x.iOrder
b2c0: 42 79 43 6f 6c 20 2d 20 31 2c 0a 20 20 20 20 20  ByCol - 1,.     
b2d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b2e0: 20 20 20 20 20 72 32 2b 69 29 3b 0a 20 20 20 20       r2+i);.    
b2f0: 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
b300: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
b310: 50 5f 53 65 71 75 65 6e 63 65 2c 20 69 50 61 72  P_Sequence, iPar
b320: 6d 2c 20 72 32 2b 6e 4b 65 79 29 3b 0a 20 20 20  m, r2+nKey);.   
b330: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
b340: 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52  dOp3(v, OP_MakeR
b350: 65 63 6f 72 64 2c 20 72 32 2c 20 6e 4b 65 79 2b  ecord, r2, nKey+
b360: 32 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 73 71  2, r1);.      sq
b370: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 49  lite3VdbeAddOp4I
b380: 6e 74 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65  nt(v, OP_IdxInse
b390: 72 74 2c 20 69 50 61 72 6d 2c 20 72 31 2c 20 72  rt, iParm, r1, r
b3a0: 32 2c 20 6e 4b 65 79 2b 32 29 3b 0a 20 20 20 20  2, nKey+2);.    
b3b0: 20 20 69 66 28 20 61 64 64 72 54 65 73 74 20 29    if( addrTest )
b3c0: 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
b3d0: 48 65 72 65 28 76 2c 20 61 64 64 72 54 65 73 74  Here(v, addrTest
b3e0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
b3f0: 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
b400: 50 61 72 73 65 2c 20 72 31 29 3b 0a 20 20 20 20  Parse, r1);.    
b410: 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
b420: 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65  TempRange(pParse
b430: 2c 20 72 32 2c 20 6e 4b 65 79 2b 32 29 3b 0a 20  , r2, nKey+2);. 
b440: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
b450: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
b460: 54 45 5f 4f 4d 49 54 5f 43 54 45 20 2a 2f 0a 0a  TE_OMIT_CTE */..
b470: 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  ..#if !defined(S
b480: 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47  QLITE_OMIT_TRIGG
b490: 45 52 29 0a 20 20 20 20 2f 2a 20 44 69 73 63 61  ER).    /* Disca
b4a0: 72 64 20 74 68 65 20 72 65 73 75 6c 74 73 2e 20  rd the results. 
b4b0: 20 54 68 69 73 20 69 73 20 75 73 65 64 20 66 6f   This is used fo
b4c0: 72 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  r SELECT stateme
b4d0: 6e 74 73 20 69 6e 73 69 64 65 0a 20 20 20 20 2a  nts inside.    *
b4e0: 2a 20 74 68 65 20 62 6f 64 79 20 6f 66 20 61 20  * the body of a 
b4f0: 54 52 49 47 47 45 52 2e 20 20 54 68 65 20 70 75  TRIGGER.  The pu
b500: 72 70 6f 73 65 20 6f 66 20 73 75 63 68 20 73 65  rpose of such se
b510: 6c 65 63 74 73 20 69 73 20 74 6f 20 63 61 6c 6c  lects is to call
b520: 0a 20 20 20 20 2a 2a 20 75 73 65 72 2d 64 65 66  .    ** user-def
b530: 69 6e 65 64 20 66 75 6e 63 74 69 6f 6e 73 20 74  ined functions t
b540: 68 61 74 20 68 61 76 65 20 73 69 64 65 20 65 66  hat have side ef
b550: 66 65 63 74 73 2e 20 20 57 65 20 64 6f 20 6e 6f  fects.  We do no
b560: 74 20 63 61 72 65 0a 20 20 20 20 2a 2a 20 61 62  t care.    ** ab
b570: 6f 75 74 20 74 68 65 20 61 63 74 75 61 6c 20 72  out the actual r
b580: 65 73 75 6c 74 73 20 6f 66 20 74 68 65 20 73 65  esults of the se
b590: 6c 65 63 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  lect..    */.   
b5a0: 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20   default: {.    
b5b0: 20 20 61 73 73 65 72 74 28 20 65 44 65 73 74 3d    assert( eDest=
b5c0: 3d 53 52 54 5f 44 69 73 63 61 72 64 20 29 3b 0a  =SRT_Discard );.
b5d0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
b5e0: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 20   }.#endif.  }.. 
b5f0: 20 2f 2a 20 4a 75 6d 70 20 74 6f 20 74 68 65 20   /* Jump to the 
b600: 65 6e 64 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20  end of the loop 
b610: 69 66 20 74 68 65 20 4c 49 4d 49 54 20 69 73 20  if the LIMIT is 
b620: 72 65 61 63 68 65 64 2e 20 20 45 78 63 65 70 74  reached.  Except
b630: 2c 20 69 66 0a 20 20 2a 2a 20 74 68 65 72 65 20  , if.  ** there 
b640: 69 73 20 61 20 73 6f 72 74 65 72 2c 20 69 6e 20  is a sorter, in 
b650: 77 68 69 63 68 20 63 61 73 65 20 74 68 65 20 73  which case the s
b660: 6f 72 74 65 72 20 68 61 73 20 61 6c 72 65 61 64  orter has alread
b670: 79 20 6c 69 6d 69 74 65 64 0a 20 20 2a 2a 20 74  y limited.  ** t
b680: 68 65 20 6f 75 74 70 75 74 20 66 6f 72 20 75 73  he output for us
b690: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 53 6f  ..  */.  if( pSo
b6a0: 72 74 3d 3d 30 20 26 26 20 70 2d 3e 69 4c 69 6d  rt==0 && p->iLim
b6b0: 69 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  it ){.    sqlite
b6c0: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
b6d0: 50 5f 44 65 63 72 4a 75 6d 70 5a 65 72 6f 2c 20  P_DecrJumpZero, 
b6e0: 70 2d 3e 69 4c 69 6d 69 74 2c 20 69 42 72 65 61  p->iLimit, iBrea
b6f0: 6b 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  k); VdbeCoverage
b700: 28 76 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  (v);.  }.}../*.*
b710: 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 4b 65 79  * Allocate a Key
b720: 49 6e 66 6f 20 6f 62 6a 65 63 74 20 73 75 66 66  Info object suff
b730: 69 63 69 65 6e 74 20 66 6f 72 20 61 6e 20 69 6e  icient for an in
b740: 64 65 78 20 6f 66 20 4e 20 6b 65 79 20 63 6f 6c  dex of N key col
b750: 75 6d 6e 73 20 61 6e 64 0a 2a 2a 20 58 20 65 78  umns and.** X ex
b760: 74 72 61 20 63 6f 6c 75 6d 6e 73 2e 0a 2a 2f 0a  tra columns..*/.
b770: 4b 65 79 49 6e 66 6f 20 2a 73 71 6c 69 74 65 33  KeyInfo *sqlite3
b780: 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63 28 73 71 6c  KeyInfoAlloc(sql
b790: 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 4e 2c  ite3 *db, int N,
b7a0: 20 69 6e 74 20 58 29 7b 0a 20 20 69 6e 74 20 6e   int X){.  int n
b7b0: 45 78 74 72 61 20 3d 20 28 4e 2b 58 29 2a 28 73  Extra = (N+X)*(s
b7c0: 69 7a 65 6f 66 28 43 6f 6c 6c 53 65 71 2a 29 2b  izeof(CollSeq*)+
b7d0: 31 29 20 2d 20 73 69 7a 65 6f 66 28 43 6f 6c 6c  1) - sizeof(Coll
b7e0: 53 65 71 2a 29 3b 0a 20 20 4b 65 79 49 6e 66 6f  Seq*);.  KeyInfo
b7f0: 20 2a 70 20 3d 20 73 71 6c 69 74 65 33 44 62 4d   *p = sqlite3DbM
b800: 61 6c 6c 6f 63 52 61 77 4e 4e 28 64 62 2c 20 73  allocRawNN(db, s
b810: 69 7a 65 6f 66 28 4b 65 79 49 6e 66 6f 29 20 2b  izeof(KeyInfo) +
b820: 20 6e 45 78 74 72 61 29 3b 0a 20 20 69 66 28 20   nExtra);.  if( 
b830: 70 20 29 7b 0a 20 20 20 20 70 2d 3e 61 53 6f 72  p ){.    p->aSor
b840: 74 4f 72 64 65 72 20 3d 20 28 75 38 2a 29 26 70  tOrder = (u8*)&p
b850: 2d 3e 61 43 6f 6c 6c 5b 4e 2b 58 5d 3b 0a 20 20  ->aColl[N+X];.  
b860: 20 20 70 2d 3e 6e 4b 65 79 46 69 65 6c 64 20 3d    p->nKeyField =
b870: 20 28 75 31 36 29 4e 3b 0a 20 20 20 20 70 2d 3e   (u16)N;.    p->
b880: 6e 41 6c 6c 46 69 65 6c 64 20 3d 20 28 75 31 36  nAllField = (u16
b890: 29 28 4e 2b 58 29 3b 0a 20 20 20 20 70 2d 3e 65  )(N+X);.    p->e
b8a0: 6e 63 20 3d 20 45 4e 43 28 64 62 29 3b 0a 20 20  nc = ENC(db);.  
b8b0: 20 20 70 2d 3e 64 62 20 3d 20 64 62 3b 0a 20 20    p->db = db;.  
b8c0: 20 20 70 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20    p->nRef = 1;. 
b8d0: 20 20 20 6d 65 6d 73 65 74 28 26 70 5b 31 5d 2c     memset(&p[1],
b8e0: 20 30 2c 20 6e 45 78 74 72 61 29 3b 0a 20 20 7d   0, nExtra);.  }
b8f0: 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65  else{.    sqlite
b900: 33 4f 6f 6d 46 61 75 6c 74 28 64 62 29 3b 0a 20  3OomFault(db);. 
b910: 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d   }.  return p;.}
b920: 0a 0a 2f 2a 0a 2a 2a 20 44 65 61 6c 6c 6f 63 61  ../*.** Dealloca
b930: 74 65 20 61 20 4b 65 79 49 6e 66 6f 20 6f 62 6a  te a KeyInfo obj
b940: 65 63 74 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ect.*/.void sqli
b950: 74 65 33 4b 65 79 49 6e 66 6f 55 6e 72 65 66 28  te3KeyInfoUnref(
b960: 4b 65 79 49 6e 66 6f 20 2a 70 29 7b 0a 20 20 69  KeyInfo *p){.  i
b970: 66 28 20 70 20 29 7b 0a 20 20 20 20 61 73 73 65  f( p ){.    asse
b980: 72 74 28 20 70 2d 3e 6e 52 65 66 3e 30 20 29 3b  rt( p->nRef>0 );
b990: 0a 20 20 20 20 70 2d 3e 6e 52 65 66 2d 2d 3b 0a  .    p->nRef--;.
b9a0: 20 20 20 20 69 66 28 20 70 2d 3e 6e 52 65 66 3d      if( p->nRef=
b9b0: 3d 30 20 29 20 73 71 6c 69 74 65 33 44 62 46 72  =0 ) sqlite3DbFr
b9c0: 65 65 4e 4e 28 70 2d 3e 64 62 2c 20 70 29 3b 0a  eeNN(p->db, p);.
b9d0: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b    }.}../*.** Mak
b9e0: 65 20 61 20 6e 65 77 20 70 6f 69 6e 74 65 72 20  e a new pointer 
b9f0: 74 6f 20 61 20 4b 65 79 49 6e 66 6f 20 6f 62 6a  to a KeyInfo obj
ba00: 65 63 74 0a 2a 2f 0a 4b 65 79 49 6e 66 6f 20 2a  ect.*/.KeyInfo *
ba10: 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 52 65  sqlite3KeyInfoRe
ba20: 66 28 4b 65 79 49 6e 66 6f 20 2a 70 29 7b 0a 20  f(KeyInfo *p){. 
ba30: 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 61 73   if( p ){.    as
ba40: 73 65 72 74 28 20 70 2d 3e 6e 52 65 66 3e 30 20  sert( p->nRef>0 
ba50: 29 3b 0a 20 20 20 20 70 2d 3e 6e 52 65 66 2b 2b  );.    p->nRef++
ba60: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  ;.  }.  return p
ba70: 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  ;.}..#ifdef SQLI
ba80: 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 52  TE_DEBUG./*.** R
ba90: 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 61 20  eturn TRUE if a 
baa0: 4b 65 79 49 6e 66 6f 20 6f 62 6a 65 63 74 20 63  KeyInfo object c
bab0: 61 6e 20 62 65 20 63 68 61 6e 67 65 2e 20 20 54  an be change.  T
bac0: 68 65 20 4b 65 79 49 6e 66 6f 20 6f 62 6a 65 63  he KeyInfo objec
bad0: 74 0a 2a 2a 20 63 61 6e 20 6f 6e 6c 79 20 62 65  t.** can only be
bae0: 20 63 68 61 6e 67 65 64 20 69 66 20 74 68 69 73   changed if this
baf0: 20 69 73 20 6a 75 73 74 20 61 20 73 69 6e 67 6c   is just a singl
bb00: 65 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74  e reference to t
bb10: 68 65 20 6f 62 6a 65 63 74 2e 0a 2a 2a 0a 2a 2a  he object..**.**
bb20: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
bb30: 20 75 73 65 64 20 6f 6e 6c 79 20 69 6e 73 69 64   used only insid
bb40: 65 20 6f 66 20 61 73 73 65 72 74 28 29 20 73 74  e of assert() st
bb50: 61 74 65 6d 65 6e 74 73 2e 0a 2a 2f 0a 69 6e 74  atements..*/.int
bb60: 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 49   sqlite3KeyInfoI
bb70: 73 57 72 69 74 65 61 62 6c 65 28 4b 65 79 49 6e  sWriteable(KeyIn
bb80: 66 6f 20 2a 70 29 7b 20 72 65 74 75 72 6e 20 70  fo *p){ return p
bb90: 2d 3e 6e 52 65 66 3d 3d 31 3b 20 7d 0a 23 65 6e  ->nRef==1; }.#en
bba0: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 44 45  dif /* SQLITE_DE
bbb0: 42 55 47 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 47 69  BUG */../*.** Gi
bbc0: 76 65 6e 20 61 6e 20 65 78 70 72 65 73 73 69 6f  ven an expressio
bbd0: 6e 20 6c 69 73 74 2c 20 67 65 6e 65 72 61 74 65  n list, generate
bbe0: 20 61 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63   a KeyInfo struc
bbf0: 74 75 72 65 20 74 68 61 74 20 72 65 63 6f 72 64  ture that record
bc00: 73 0a 2a 2a 20 74 68 65 20 63 6f 6c 6c 61 74 69  s.** the collati
bc10: 6e 67 20 73 65 71 75 65 6e 63 65 20 66 6f 72 20  ng sequence for 
bc20: 65 61 63 68 20 65 78 70 72 65 73 73 69 6f 6e 20  each expression 
bc30: 69 6e 20 74 68 61 74 20 65 78 70 72 65 73 73 69  in that expressi
bc40: 6f 6e 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 49  on list..**.** I
bc50: 66 20 74 68 65 20 45 78 70 72 4c 69 73 74 20 69  f the ExprList i
bc60: 73 20 61 6e 20 4f 52 44 45 52 20 42 59 20 6f 72  s an ORDER BY or
bc70: 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65   GROUP BY clause
bc80: 20 74 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74   then the result
bc90: 69 6e 67 0a 2a 2a 20 4b 65 79 49 6e 66 6f 20 73  ing.** KeyInfo s
bca0: 74 72 75 63 74 75 72 65 20 69 73 20 61 70 70 72  tructure is appr
bcb0: 6f 70 72 69 61 74 65 20 66 6f 72 20 69 6e 69 74  opriate for init
bcc0: 69 61 6c 69 7a 69 6e 67 20 61 20 76 69 72 74 75  ializing a virtu
bcd0: 61 6c 20 69 6e 64 65 78 20 74 6f 0a 2a 2a 20 69  al index to.** i
bce0: 6d 70 6c 65 6d 65 6e 74 20 74 68 61 74 20 63 6c  mplement that cl
bcf0: 61 75 73 65 2e 20 20 49 66 20 74 68 65 20 45 78  ause.  If the Ex
bd00: 70 72 4c 69 73 74 20 69 73 20 74 68 65 20 72 65  prList is the re
bd10: 73 75 6c 74 20 73 65 74 20 6f 66 20 61 20 53 45  sult set of a SE
bd20: 4c 45 43 54 0a 2a 2a 20 74 68 65 6e 20 74 68 65  LECT.** then the
bd30: 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75   KeyInfo structu
bd40: 72 65 20 69 73 20 61 70 70 72 6f 70 72 69 61 74  re is appropriat
bd50: 65 20 66 6f 72 20 69 6e 69 74 69 61 6c 69 7a 69  e for initializi
bd60: 6e 67 20 61 20 76 69 72 74 75 61 6c 0a 2a 2a 20  ng a virtual.** 
bd70: 69 6e 64 65 78 20 74 6f 20 69 6d 70 6c 65 6d 65  index to impleme
bd80: 6e 74 20 61 20 44 49 53 54 49 4e 43 54 20 74 65  nt a DISTINCT te
bd90: 73 74 2e 0a 2a 2a 0a 2a 2a 20 53 70 61 63 65 20  st..**.** Space 
bda0: 74 6f 20 68 6f 6c 64 20 74 68 65 20 4b 65 79 49  to hold the KeyI
bdb0: 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 69 73  nfo structure is
bdc0: 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 6d   obtained from m
bdd0: 61 6c 6c 6f 63 2e 20 20 54 68 65 20 63 61 6c 6c  alloc.  The call
bde0: 69 6e 67 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20  ing.** function 
bdf0: 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66  is responsible f
be00: 6f 72 20 73 65 65 69 6e 67 20 74 68 61 74 20 74  or seeing that t
be10: 68 69 73 20 73 74 72 75 63 74 75 72 65 20 69 73  his structure is
be20: 20 65 76 65 6e 74 75 61 6c 6c 79 0a 2a 2a 20 66   eventually.** f
be30: 72 65 65 64 2e 0a 2a 2f 0a 4b 65 79 49 6e 66 6f  reed..*/.KeyInfo
be40: 20 2a 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f   *sqlite3KeyInfo
be50: 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 0a 20 20  FromExprList(.  
be60: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
be70: 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
be80: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70  context */.  Exp
be90: 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20  rList *pList,   
bea0: 20 20 2f 2a 20 46 6f 72 6d 20 74 68 65 20 4b 65    /* Form the Ke
beb0: 79 49 6e 66 6f 20 6f 62 6a 65 63 74 20 66 72 6f  yInfo object fro
bec0: 6d 20 74 68 69 73 20 45 78 70 72 4c 69 73 74 20  m this ExprList 
bed0: 2a 2f 0a 20 20 69 6e 74 20 69 53 74 61 72 74 2c  */.  int iStart,
bee0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 65 67            /* Beg
bef0: 69 6e 20 77 69 74 68 20 74 68 69 73 20 63 6f 6c  in with this col
bf00: 75 6d 6e 20 6f 66 20 70 4c 69 73 74 20 2a 2f 0a  umn of pList */.
bf10: 20 20 69 6e 74 20 6e 45 78 74 72 61 20 20 20 20    int nExtra    
bf20: 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20 74 68         /* Add th
bf30: 69 73 20 6d 61 6e 79 20 65 78 74 72 61 20 63 6f  is many extra co
bf40: 6c 75 6d 6e 73 20 74 6f 20 74 68 65 20 65 6e 64  lumns to the end
bf50: 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 45 78   */.){.  int nEx
bf60: 70 72 3b 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70  pr;.  KeyInfo *p
bf70: 49 6e 66 6f 3b 0a 20 20 73 74 72 75 63 74 20 45  Info;.  struct E
bf80: 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  xprList_item *pI
bf90: 74 65 6d 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a  tem;.  sqlite3 *
bfa0: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
bfb0: 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 6e 45 78  .  int i;..  nEx
bfc0: 70 72 20 3d 20 70 4c 69 73 74 2d 3e 6e 45 78 70  pr = pList->nExp
bfd0: 72 3b 0a 20 20 70 49 6e 66 6f 20 3d 20 73 71 6c  r;.  pInfo = sql
bfe0: 69 74 65 33 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63  ite3KeyInfoAlloc
bff0: 28 64 62 2c 20 6e 45 78 70 72 2d 69 53 74 61 72  (db, nExpr-iStar
c000: 74 2c 20 6e 45 78 74 72 61 2b 31 29 3b 0a 20 20  t, nExtra+1);.  
c010: 69 66 28 20 70 49 6e 66 6f 20 29 7b 0a 20 20 20  if( pInfo ){.   
c020: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
c030: 4b 65 79 49 6e 66 6f 49 73 57 72 69 74 65 61 62  KeyInfoIsWriteab
c040: 6c 65 28 70 49 6e 66 6f 29 20 29 3b 0a 20 20 20  le(pInfo) );.   
c050: 20 66 6f 72 28 69 3d 69 53 74 61 72 74 2c 20 70   for(i=iStart, p
c060: 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 2b 69 53  Item=pList->a+iS
c070: 74 61 72 74 3b 20 69 3c 6e 45 78 70 72 3b 20 69  tart; i<nExpr; i
c080: 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20  ++, pItem++){.  
c090: 20 20 20 20 70 49 6e 66 6f 2d 3e 61 43 6f 6c 6c      pInfo->aColl
c0a0: 5b 69 2d 69 53 74 61 72 74 5d 20 3d 20 73 71 6c  [i-iStart] = sql
c0b0: 69 74 65 33 45 78 70 72 4e 4e 43 6f 6c 6c 53 65  ite3ExprNNCollSe
c0c0: 71 28 70 50 61 72 73 65 2c 20 70 49 74 65 6d 2d  q(pParse, pItem-
c0d0: 3e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 70  >pExpr);.      p
c0e0: 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72  Info->aSortOrder
c0f0: 5b 69 2d 69 53 74 61 72 74 5d 20 3d 20 70 49 74  [i-iStart] = pIt
c100: 65 6d 2d 3e 73 6f 72 74 4f 72 64 65 72 3b 0a 20  em->sortOrder;. 
c110: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
c120: 6e 20 70 49 6e 66 6f 3b 0a 7d 0a 0a 2f 2a 0a 2a  n pInfo;.}../*.*
c130: 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 63 6f  * Name of the co
c140: 6e 6e 65 63 74 69 6f 6e 20 6f 70 65 72 61 74 6f  nnection operato
c150: 72 2c 20 75 73 65 64 20 66 6f 72 20 65 72 72 6f  r, used for erro
c160: 72 20 6d 65 73 73 61 67 65 73 2e 0a 2a 2f 0a 73  r messages..*/.s
c170: 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72  tatic const char
c180: 20 2a 73 65 6c 65 63 74 4f 70 4e 61 6d 65 28 69   *selectOpName(i
c190: 6e 74 20 69 64 29 7b 0a 20 20 63 68 61 72 20 2a  nt id){.  char *
c1a0: 7a 3b 0a 20 20 73 77 69 74 63 68 28 20 69 64 20  z;.  switch( id 
c1b0: 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41  ){.    case TK_A
c1c0: 4c 4c 3a 20 20 20 20 20 20 20 7a 20 3d 20 22 55  LL:       z = "U
c1d0: 4e 49 4f 4e 20 41 4c 4c 22 3b 20 20 20 62 72 65  NION ALL";   bre
c1e0: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ak;.    case TK_
c1f0: 49 4e 54 45 52 53 45 43 54 3a 20 7a 20 3d 20 22  INTERSECT: z = "
c200: 49 4e 54 45 52 53 45 43 54 22 3b 20 20 20 62 72  INTERSECT";   br
c210: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b  eak;.    case TK
c220: 5f 45 58 43 45 50 54 3a 20 20 20 20 7a 20 3d 20  _EXCEPT:    z = 
c230: 22 45 58 43 45 50 54 22 3b 20 20 20 20 20 20 62  "EXCEPT";      b
c240: 72 65 61 6b 3b 0a 20 20 20 20 64 65 66 61 75 6c  reak;.    defaul
c250: 74 3a 20 20 20 20 20 20 20 20 20 20 20 7a 20 3d  t:           z =
c260: 20 22 55 4e 49 4f 4e 22 3b 20 20 20 20 20 20 20   "UNION";       
c270: 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 65 74  break;.  }.  ret
c280: 75 72 6e 20 7a 3b 0a 7d 0a 0a 23 69 66 6e 64 65  urn z;.}..#ifnde
c290: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58  f SQLITE_OMIT_EX
c2a0: 50 4c 41 49 4e 0a 2f 2a 0a 2a 2a 20 55 6e 6c 65  PLAIN./*.** Unle
c2b0: 73 73 20 61 6e 20 22 45 58 50 4c 41 49 4e 20 51  ss an "EXPLAIN Q
c2c0: 55 45 52 59 20 50 4c 41 4e 22 20 63 6f 6d 6d 61  UERY PLAN" comma
c2d0: 6e 64 20 69 73 20 62 65 69 6e 67 20 70 72 6f 63  nd is being proc
c2e0: 65 73 73 65 64 2c 20 74 68 69 73 20 66 75 6e 63  essed, this func
c2f0: 74 69 6f 6e 0a 2a 2a 20 69 73 20 61 20 6e 6f 2d  tion.** is a no-
c300: 6f 70 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69  op. Otherwise, i
c310: 74 20 61 64 64 73 20 61 20 73 69 6e 67 6c 65 20  t adds a single 
c320: 72 6f 77 20 6f 66 20 6f 75 74 70 75 74 20 74 6f  row of output to
c330: 20 74 68 65 20 45 51 50 20 72 65 73 75 6c 74 2c   the EQP result,
c340: 0a 2a 2a 20 77 68 65 72 65 20 74 68 65 20 63 61  .** where the ca
c350: 70 74 69 6f 6e 20 69 73 20 6f 66 20 74 68 65 20  ption is of the 
c360: 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 22 55  form:.**.**   "U
c370: 53 45 20 54 45 4d 50 20 42 2d 54 52 45 45 20 46  SE TEMP B-TREE F
c380: 4f 52 20 78 78 78 22 0a 2a 2a 0a 2a 2a 20 77 68  OR xxx".**.** wh
c390: 65 72 65 20 78 78 78 20 69 73 20 6f 6e 65 20 6f  ere xxx is one o
c3a0: 66 20 22 44 49 53 54 49 4e 43 54 22 2c 20 22 4f  f "DISTINCT", "O
c3b0: 52 44 45 52 20 42 59 22 20 6f 72 20 22 47 52 4f  RDER BY" or "GRO
c3c0: 55 50 20 42 59 22 2e 20 45 78 61 63 74 6c 79 20  UP BY". Exactly 
c3d0: 77 68 69 63 68 0a 2a 2a 20 69 73 20 64 65 74 65  which.** is dete
c3e0: 72 6d 69 6e 65 64 20 62 79 20 74 68 65 20 7a 55  rmined by the zU
c3f0: 73 61 67 65 20 61 72 67 75 6d 65 6e 74 2e 0a 2a  sage argument..*
c400: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65 78  /.static void ex
c410: 70 6c 61 69 6e 54 65 6d 70 54 61 62 6c 65 28 50  plainTempTable(P
c420: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 63 6f  arse *pParse, co
c430: 6e 73 74 20 63 68 61 72 20 2a 7a 55 73 61 67 65  nst char *zUsage
c440: 29 7b 0a 20 20 45 78 70 6c 61 69 6e 51 75 65 72  ){.  ExplainQuer
c450: 79 50 6c 61 6e 28 28 70 50 61 72 73 65 2c 20 30  yPlan((pParse, 0
c460: 2c 20 22 55 53 45 20 54 45 4d 50 20 42 2d 54 52  , "USE TEMP B-TR
c470: 45 45 20 46 4f 52 20 25 73 22 2c 20 7a 55 73 61  EE FOR %s", zUsa
c480: 67 65 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  ge));.}../*.** A
c490: 73 73 69 67 6e 20 65 78 70 72 65 73 73 69 6f 6e  ssign expression
c4a0: 20 62 20 74 6f 20 6c 76 61 6c 75 65 20 61 2e 20   b to lvalue a. 
c4b0: 41 20 73 65 63 6f 6e 64 2c 20 6e 6f 2d 6f 70 2c  A second, no-op,
c4c0: 20 76 65 72 73 69 6f 6e 20 6f 66 20 74 68 69 73   version of this
c4d0: 20 6d 61 63 72 6f 0a 2a 2a 20 69 73 20 70 72 6f   macro.** is pro
c4e0: 76 69 64 65 64 20 77 68 65 6e 20 53 51 4c 49 54  vided when SQLIT
c4f0: 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 20 69  E_OMIT_EXPLAIN i
c500: 73 20 64 65 66 69 6e 65 64 2e 20 54 68 69 73 20  s defined. This 
c510: 61 6c 6c 6f 77 73 20 74 68 65 20 63 6f 64 65 0a  allows the code.
c520: 2a 2a 20 69 6e 20 73 71 6c 69 74 65 33 53 65 6c  ** in sqlite3Sel
c530: 65 63 74 28 29 20 74 6f 20 61 73 73 69 67 6e 20  ect() to assign 
c540: 76 61 6c 75 65 73 20 74 6f 20 73 74 72 75 63 74  values to struct
c550: 75 72 65 20 6d 65 6d 62 65 72 20 76 61 72 69 61  ure member varia
c560: 62 6c 65 73 20 74 68 61 74 0a 2a 2a 20 6f 6e 6c  bles that.** onl
c570: 79 20 65 78 69 73 74 20 69 66 20 53 51 4c 49 54  y exist if SQLIT
c580: 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 20 69  E_OMIT_EXPLAIN i
c590: 73 20 6e 6f 74 20 64 65 66 69 6e 65 64 20 77 69  s not defined wi
c5a0: 74 68 6f 75 74 20 70 6f 6c 6c 75 74 69 6e 67 20  thout polluting 
c5b0: 74 68 65 0a 2a 2a 20 63 6f 64 65 20 77 69 74 68  the.** code with
c5c0: 20 23 69 66 6e 64 65 66 20 64 69 72 65 63 74 69   #ifndef directi
c5d0: 76 65 73 2e 0a 2a 2f 0a 23 20 64 65 66 69 6e 65  ves..*/.# define
c5e0: 20 65 78 70 6c 61 69 6e 53 65 74 49 6e 74 65 67   explainSetInteg
c5f0: 65 72 28 61 2c 20 62 29 20 61 20 3d 20 62 0a 0a  er(a, b) a = b..
c600: 23 65 6c 73 65 0a 2f 2a 20 4e 6f 2d 6f 70 20 76  #else./* No-op v
c610: 65 72 73 69 6f 6e 73 20 6f 66 20 74 68 65 20 65  ersions of the e
c620: 78 70 6c 61 69 6e 58 58 58 28 29 20 66 75 6e 63  xplainXXX() func
c630: 74 69 6f 6e 73 20 61 6e 64 20 6d 61 63 72 6f 73  tions and macros
c640: 2e 20 2a 2f 0a 23 20 64 65 66 69 6e 65 20 65 78  . */.# define ex
c650: 70 6c 61 69 6e 54 65 6d 70 54 61 62 6c 65 28 79  plainTempTable(y
c660: 2c 7a 29 0a 23 20 64 65 66 69 6e 65 20 65 78 70  ,z).# define exp
c670: 6c 61 69 6e 53 65 74 49 6e 74 65 67 65 72 28 79  lainSetInteger(y
c680: 2c 7a 29 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a  ,z).#endif.../*.
c690: 2a 2a 20 49 66 20 74 68 65 20 69 6e 6e 65 72 20  ** If the inner 
c6a0: 6c 6f 6f 70 20 77 61 73 20 67 65 6e 65 72 61 74  loop was generat
c6b0: 65 64 20 75 73 69 6e 67 20 61 20 6e 6f 6e 2d 6e  ed using a non-n
c6c0: 75 6c 6c 20 70 4f 72 64 65 72 42 79 20 61 72 67  ull pOrderBy arg
c6d0: 75 6d 65 6e 74 2c 0a 2a 2a 20 74 68 65 6e 20 74  ument,.** then t
c6e0: 68 65 20 72 65 73 75 6c 74 73 20 77 65 72 65 20  he results were 
c6f0: 70 6c 61 63 65 64 20 69 6e 20 61 20 73 6f 72 74  placed in a sort
c700: 65 72 2e 20 20 41 66 74 65 72 20 74 68 65 20 6c  er.  After the l
c710: 6f 6f 70 20 69 73 20 74 65 72 6d 69 6e 61 74 65  oop is terminate
c720: 64 0a 2a 2a 20 77 65 20 6e 65 65 64 20 74 6f 20  d.** we need to 
c730: 72 75 6e 20 74 68 65 20 73 6f 72 74 65 72 20 61  run the sorter a
c740: 6e 64 20 6f 75 74 70 75 74 20 74 68 65 20 72 65  nd output the re
c750: 73 75 6c 74 73 2e 20 20 54 68 65 20 66 6f 6c 6c  sults.  The foll
c760: 6f 77 69 6e 67 0a 2a 2a 20 72 6f 75 74 69 6e 65  owing.** routine
c770: 20 67 65 6e 65 72 61 74 65 73 20 74 68 65 20 63   generates the c
c780: 6f 64 65 20 6e 65 65 64 65 64 20 74 6f 20 64 6f  ode needed to do
c790: 20 74 68 61 74 2e 0a 2a 2f 0a 73 74 61 74 69 63   that..*/.static
c7a0: 20 76 6f 69 64 20 67 65 6e 65 72 61 74 65 53 6f   void generateSo
c7b0: 72 74 54 61 69 6c 28 0a 20 20 50 61 72 73 65 20  rtTail(.  Parse 
c7c0: 2a 70 50 61 72 73 65 2c 20 20 20 20 2f 2a 20 50  *pParse,    /* P
c7d0: 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
c7e0: 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20  /.  Select *p,  
c7f0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 53 45 4c        /* The SEL
c800: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f  ECT statement */
c810: 0a 20 20 53 6f 72 74 43 74 78 20 2a 70 53 6f 72  .  SortCtx *pSor
c820: 74 2c 20 20 20 2f 2a 20 49 6e 66 6f 72 6d 61 74  t,   /* Informat
c830: 69 6f 6e 20 6f 6e 20 74 68 65 20 4f 52 44 45 52  ion on the ORDER
c840: 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20   BY clause */.  
c850: 69 6e 74 20 6e 43 6f 6c 75 6d 6e 2c 20 20 20 20  int nColumn,    
c860: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63    /* Number of c
c870: 6f 6c 75 6d 6e 73 20 6f 66 20 64 61 74 61 20 2a  olumns of data *
c880: 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 2a  /.  SelectDest *
c890: 70 44 65 73 74 20 2f 2a 20 57 72 69 74 65 20 74  pDest /* Write t
c8a0: 68 65 20 73 6f 72 74 65 64 20 72 65 73 75 6c 74  he sorted result
c8b0: 73 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 56  s here */.){.  V
c8c0: 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
c8d0: 3e 70 56 64 62 65 3b 20 20 20 20 20 20 20 20 20  >pVdbe;         
c8e0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
c8f0: 68 65 20 70 72 65 70 61 72 65 64 20 73 74 61 74  he prepared stat
c900: 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 61  ement */.  int a
c910: 64 64 72 42 72 65 61 6b 20 3d 20 70 53 6f 72 74  ddrBreak = pSort
c920: 2d 3e 6c 61 62 65 6c 44 6f 6e 65 3b 20 20 20 20  ->labelDone;    
c930: 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20          /* Jump 
c940: 68 65 72 65 20 74 6f 20 65 78 69 74 20 6c 6f 6f  here to exit loo
c950: 70 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 43  p */.  int addrC
c960: 6f 6e 74 69 6e 75 65 20 3d 20 73 71 6c 69 74 65  ontinue = sqlite
c970: 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 70  3VdbeMakeLabel(p
c980: 50 61 72 73 65 29 3b 2f 2a 20 4a 75 6d 70 20 68  Parse);/* Jump h
c990: 65 72 65 20 66 6f 72 20 6e 65 78 74 20 63 79 63  ere for next cyc
c9a0: 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72  le */.  int addr
c9b0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
c9c0: 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 70 20 6f          /* Top o
c9d0: 66 20 6f 75 74 70 75 74 20 6c 6f 6f 70 2e 20 4a  f output loop. J
c9e0: 75 6d 70 20 66 6f 72 20 4e 65 78 74 2e 20 2a 2f  ump for Next. */
c9f0: 0a 20 20 69 6e 74 20 61 64 64 72 4f 6e 63 65 20  .  int addrOnce 
ca00: 3d 20 30 3b 0a 20 20 69 6e 74 20 69 54 61 62 3b  = 0;.  int iTab;
ca10: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72  .  ExprList *pOr
ca20: 64 65 72 42 79 20 3d 20 70 53 6f 72 74 2d 3e 70  derBy = pSort->p
ca30: 4f 72 64 65 72 42 79 3b 0a 20 20 69 6e 74 20 65  OrderBy;.  int e
ca40: 44 65 73 74 20 3d 20 70 44 65 73 74 2d 3e 65 44  Dest = pDest->eD
ca50: 65 73 74 3b 0a 20 20 69 6e 74 20 69 50 61 72 6d  est;.  int iParm
ca60: 20 3d 20 70 44 65 73 74 2d 3e 69 53 44 50 61 72   = pDest->iSDPar
ca70: 6d 3b 0a 20 20 69 6e 74 20 72 65 67 52 6f 77 3b  m;.  int regRow;
ca80: 0a 20 20 69 6e 74 20 72 65 67 52 6f 77 69 64 3b  .  int regRowid;
ca90: 0a 20 20 69 6e 74 20 69 43 6f 6c 3b 0a 20 20 69  .  int iCol;.  i
caa0: 6e 74 20 6e 4b 65 79 3b 20 20 20 20 20 20 20 20  nt nKey;        
cab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
cac0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6b 65 79 20  * Number of key 
cad0: 63 6f 6c 75 6d 6e 73 20 69 6e 20 73 6f 72 74 65  columns in sorte
cae0: 72 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 69 6e  r record */.  in
caf0: 74 20 69 53 6f 72 74 54 61 62 3b 20 20 20 20 20  t iSortTab;     
cb00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
cb10: 20 53 6f 72 74 65 72 20 63 75 72 73 6f 72 20 74   Sorter cursor t
cb20: 6f 20 72 65 61 64 20 66 72 6f 6d 20 2a 2f 0a 20  o read from */. 
cb30: 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 62 53   int i;.  int bS
cb40: 65 71 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  eq;             
cb50: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
cb60: 65 20 69 66 20 73 6f 72 74 65 72 20 72 65 63 6f  e if sorter reco
cb70: 72 64 20 69 6e 63 6c 75 64 65 73 20 73 65 71 2e  rd includes seq.
cb80: 20 6e 6f 2e 20 2a 2f 0a 20 20 69 6e 74 20 6e 52   no. */.  int nR
cb90: 65 66 4b 65 79 20 3d 20 30 3b 0a 20 20 73 74 72  efKey = 0;.  str
cba0: 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
cbb0: 6d 20 2a 61 4f 75 74 45 78 20 3d 20 70 2d 3e 70  m *aOutEx = p->p
cbc0: 45 4c 69 73 74 2d 3e 61 3b 0a 0a 20 20 61 73 73  EList->a;..  ass
cbd0: 65 72 74 28 20 61 64 64 72 42 72 65 61 6b 3c 30  ert( addrBreak<0
cbe0: 20 29 3b 0a 20 20 69 66 28 20 70 53 6f 72 74 2d   );.  if( pSort-
cbf0: 3e 6c 61 62 65 6c 42 6b 4f 75 74 20 29 7b 0a 20  >labelBkOut ){. 
cc00: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
cc10: 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62  dOp2(v, OP_Gosub
cc20: 2c 20 70 53 6f 72 74 2d 3e 72 65 67 52 65 74 75  , pSort->regRetu
cc30: 72 6e 2c 20 70 53 6f 72 74 2d 3e 6c 61 62 65 6c  rn, pSort->label
cc40: 42 6b 4f 75 74 29 3b 0a 20 20 20 20 73 71 6c 69  BkOut);.    sqli
cc50: 74 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 61  te3VdbeGoto(v, a
cc60: 64 64 72 42 72 65 61 6b 29 3b 0a 20 20 20 20 73  ddrBreak);.    s
cc70: 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
cc80: 65 4c 61 62 65 6c 28 76 2c 20 70 53 6f 72 74 2d  eLabel(v, pSort-
cc90: 3e 6c 61 62 65 6c 42 6b 4f 75 74 29 3b 0a 20 20  >labelBkOut);.  
cca0: 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  }..#ifdef SQLITE
ccb0: 5f 45 4e 41 42 4c 45 5f 53 4f 52 54 45 52 5f 52  _ENABLE_SORTER_R
ccc0: 45 46 45 52 45 4e 43 45 53 0a 20 20 2f 2a 20 4f  EFERENCES.  /* O
ccd0: 70 65 6e 20 61 6e 79 20 63 75 72 73 6f 72 73 20  pen any cursors 
cce0: 6e 65 65 64 65 64 20 66 6f 72 20 73 6f 72 74 65  needed for sorte
ccf0: 72 2d 72 65 66 65 72 65 6e 63 65 20 65 78 70 72  r-reference expr
cd00: 65 73 73 69 6f 6e 73 20 2a 2f 0a 20 20 66 6f 72  essions */.  for
cd10: 28 69 3d 30 3b 20 69 3c 70 53 6f 72 74 2d 3e 6e  (i=0; i<pSort->n
cd20: 44 65 66 65 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  Defer; i++){.   
cd30: 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70   Table *pTab = p
cd40: 53 6f 72 74 2d 3e 61 44 65 66 65 72 5b 69 5d 2e  Sort->aDefer[i].
cd50: 70 54 61 62 3b 0a 20 20 20 20 69 6e 74 20 69 44  pTab;.    int iD
cd60: 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d  b = sqlite3Schem
cd70: 61 54 6f 49 6e 64 65 78 28 70 50 61 72 73 65 2d  aToIndex(pParse-
cd80: 3e 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68 65  >db, pTab->pSche
cd90: 6d 61 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ma);.    sqlite3
cda0: 4f 70 65 6e 54 61 62 6c 65 28 70 50 61 72 73 65  OpenTable(pParse
cdb0: 2c 20 70 53 6f 72 74 2d 3e 61 44 65 66 65 72 5b  , pSort->aDefer[
cdc0: 69 5d 2e 69 43 73 72 2c 20 69 44 62 2c 20 70 54  i].iCsr, iDb, pT
cdd0: 61 62 2c 20 4f 50 5f 4f 70 65 6e 52 65 61 64 29  ab, OP_OpenRead)
cde0: 3b 0a 20 20 20 20 6e 52 65 66 4b 65 79 20 3d 20  ;.    nRefKey = 
cdf0: 4d 41 58 28 6e 52 65 66 4b 65 79 2c 20 70 53 6f  MAX(nRefKey, pSo
ce00: 72 74 2d 3e 61 44 65 66 65 72 5b 69 5d 2e 6e 4b  rt->aDefer[i].nK
ce10: 65 79 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  ey);.  }.#endif.
ce20: 0a 20 20 69 54 61 62 20 3d 20 70 53 6f 72 74 2d  .  iTab = pSort-
ce30: 3e 69 45 43 75 72 73 6f 72 3b 0a 20 20 69 66 28  >iECursor;.  if(
ce40: 20 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70   eDest==SRT_Outp
ce50: 75 74 20 7c 7c 20 65 44 65 73 74 3d 3d 53 52 54  ut || eDest==SRT
ce60: 5f 43 6f 72 6f 75 74 69 6e 65 20 7c 7c 20 65 44  _Coroutine || eD
ce70: 65 73 74 3d 3d 53 52 54 5f 4d 65 6d 20 29 7b 0a  est==SRT_Mem ){.
ce80: 20 20 20 20 72 65 67 52 6f 77 69 64 20 3d 20 30      regRowid = 0
ce90: 3b 0a 20 20 20 20 72 65 67 52 6f 77 20 3d 20 70  ;.    regRow = p
cea0: 44 65 73 74 2d 3e 69 53 64 73 74 3b 0a 20 20 7d  Dest->iSdst;.  }
ceb0: 65 6c 73 65 7b 0a 20 20 20 20 72 65 67 52 6f 77  else{.    regRow
cec0: 69 64 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  id = sqlite3GetT
ced0: 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a  empReg(pParse);.
cee0: 20 20 20 20 69 66 28 20 65 44 65 73 74 3d 3d 53      if( eDest==S
cef0: 52 54 5f 45 70 68 65 6d 54 61 62 20 7c 7c 20 65  RT_EphemTab || e
cf00: 44 65 73 74 3d 3d 53 52 54 5f 54 61 62 6c 65 20  Dest==SRT_Table 
cf10: 29 7b 0a 20 20 20 20 20 20 72 65 67 52 6f 77 20  ){.      regRow 
cf20: 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
cf30: 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20  Reg(pParse);.   
cf40: 20 20 20 6e 43 6f 6c 75 6d 6e 20 3d 20 30 3b 0a     nColumn = 0;.
cf50: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
cf60: 20 72 65 67 52 6f 77 20 3d 20 73 71 6c 69 74 65   regRow = sqlite
cf70: 33 47 65 74 54 65 6d 70 52 61 6e 67 65 28 70 50  3GetTempRange(pP
cf80: 61 72 73 65 2c 20 6e 43 6f 6c 75 6d 6e 29 3b 0a  arse, nColumn);.
cf90: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 6e 4b 65 79      }.  }.  nKey
cfa0: 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78   = pOrderBy->nEx
cfb0: 70 72 20 2d 20 70 53 6f 72 74 2d 3e 6e 4f 42 53  pr - pSort->nOBS
cfc0: 61 74 3b 0a 20 20 69 66 28 20 70 53 6f 72 74 2d  at;.  if( pSort-
cfd0: 3e 73 6f 72 74 46 6c 61 67 73 20 26 20 53 4f 52  >sortFlags & SOR
cfe0: 54 46 4c 41 47 5f 55 73 65 53 6f 72 74 65 72 20  TFLAG_UseSorter 
cff0: 29 7b 0a 20 20 20 20 69 6e 74 20 72 65 67 53 6f  ){.    int regSo
d000: 72 74 4f 75 74 20 3d 20 2b 2b 70 50 61 72 73 65  rtOut = ++pParse
d010: 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 69 53 6f 72  ->nMem;.    iSor
d020: 74 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 6e  tTab = pParse->n
d030: 54 61 62 2b 2b 3b 0a 20 20 20 20 69 66 28 20 70  Tab++;.    if( p
d040: 53 6f 72 74 2d 3e 6c 61 62 65 6c 42 6b 4f 75 74  Sort->labelBkOut
d050: 20 29 7b 0a 20 20 20 20 20 20 61 64 64 72 4f 6e   ){.      addrOn
d060: 63 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  ce = sqlite3Vdbe
d070: 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f 4f 6e 63  AddOp0(v, OP_Onc
d080: 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  e); VdbeCoverage
d090: 28 76 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  (v);.    }.    s
d0a0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
d0b0: 28 76 2c 20 4f 50 5f 4f 70 65 6e 50 73 65 75 64  (v, OP_OpenPseud
d0c0: 6f 2c 20 69 53 6f 72 74 54 61 62 2c 20 72 65 67  o, iSortTab, reg
d0d0: 53 6f 72 74 4f 75 74 2c 20 0a 20 20 20 20 20 20  SortOut, .      
d0e0: 20 20 6e 4b 65 79 2b 31 2b 6e 43 6f 6c 75 6d 6e    nKey+1+nColumn
d0f0: 2b 6e 52 65 66 4b 65 79 29 3b 0a 20 20 20 20 69  +nRefKey);.    i
d100: 66 28 20 61 64 64 72 4f 6e 63 65 20 29 20 73 71  f( addrOnce ) sq
d110: 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
d120: 65 28 76 2c 20 61 64 64 72 4f 6e 63 65 29 3b 0a  e(v, addrOnce);.
d130: 20 20 20 20 61 64 64 72 20 3d 20 31 20 2b 20 73      addr = 1 + s
d140: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
d150: 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72 53 6f 72  (v, OP_SorterSor
d160: 74 2c 20 69 54 61 62 2c 20 61 64 64 72 42 72 65  t, iTab, addrBre
d170: 61 6b 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 76  ak);.    VdbeCov
d180: 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 63 6f  erage(v);.    co
d190: 64 65 4f 66 66 73 65 74 28 76 2c 20 70 2d 3e 69  deOffset(v, p->i
d1a0: 4f 66 66 73 65 74 2c 20 61 64 64 72 43 6f 6e 74  Offset, addrCont
d1b0: 69 6e 75 65 29 3b 0a 20 20 20 20 73 71 6c 69 74  inue);.    sqlit
d1c0: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
d1d0: 4f 50 5f 53 6f 72 74 65 72 44 61 74 61 2c 20 69  OP_SorterData, i
d1e0: 54 61 62 2c 20 72 65 67 53 6f 72 74 4f 75 74 2c  Tab, regSortOut,
d1f0: 20 69 53 6f 72 74 54 61 62 29 3b 0a 20 20 20 20   iSortTab);.    
d200: 62 53 65 71 20 3d 20 30 3b 0a 20 20 7d 65 6c 73  bSeq = 0;.  }els
d210: 65 7b 0a 20 20 20 20 61 64 64 72 20 3d 20 31 20  e{.    addr = 1 
d220: 2b 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  + sqlite3VdbeAdd
d230: 4f 70 32 28 76 2c 20 4f 50 5f 53 6f 72 74 2c 20  Op2(v, OP_Sort, 
d240: 69 54 61 62 2c 20 61 64 64 72 42 72 65 61 6b 29  iTab, addrBreak)
d250: 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
d260: 29 3b 0a 20 20 20 20 63 6f 64 65 4f 66 66 73 65  );.    codeOffse
d270: 74 28 76 2c 20 70 2d 3e 69 4f 66 66 73 65 74 2c  t(v, p->iOffset,
d280: 20 61 64 64 72 43 6f 6e 74 69 6e 75 65 29 3b 0a   addrContinue);.
d290: 20 20 20 20 69 53 6f 72 74 54 61 62 20 3d 20 69      iSortTab = i
d2a0: 54 61 62 3b 0a 20 20 20 20 62 53 65 71 20 3d 20  Tab;.    bSeq = 
d2b0: 31 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30  1;.  }.  for(i=0
d2c0: 2c 20 69 43 6f 6c 3d 6e 4b 65 79 2b 62 53 65 71  , iCol=nKey+bSeq
d2d0: 2d 31 3b 20 69 3c 6e 43 6f 6c 75 6d 6e 3b 20 69  -1; i<nColumn; i
d2e0: 2b 2b 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49  ++){.#ifdef SQLI
d2f0: 54 45 5f 45 4e 41 42 4c 45 5f 53 4f 52 54 45 52  TE_ENABLE_SORTER
d300: 5f 52 45 46 45 52 45 4e 43 45 53 0a 20 20 20 20  _REFERENCES.    
d310: 69 66 28 20 61 4f 75 74 45 78 5b 69 5d 2e 62 53  if( aOutEx[i].bS
d320: 6f 72 74 65 72 52 65 66 20 29 20 63 6f 6e 74 69  orterRef ) conti
d330: 6e 75 65 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  nue;.#endif.    
d340: 69 66 28 20 61 4f 75 74 45 78 5b 69 5d 2e 75 2e  if( aOutEx[i].u.
d350: 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 3d 3d 30  x.iOrderByCol==0
d360: 20 29 20 69 43 6f 6c 2b 2b 3b 0a 20 20 7d 0a 23   ) iCol++;.  }.#
d370: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
d380: 42 4c 45 5f 53 4f 52 54 45 52 5f 52 45 46 45 52  BLE_SORTER_REFER
d390: 45 4e 43 45 53 0a 20 20 69 66 28 20 70 53 6f 72  ENCES.  if( pSor
d3a0: 74 2d 3e 6e 44 65 66 65 72 20 29 7b 0a 20 20 20  t->nDefer ){.   
d3b0: 20 69 6e 74 20 69 4b 65 79 20 3d 20 69 43 6f 6c   int iKey = iCol
d3c0: 2b 31 3b 0a 20 20 20 20 69 6e 74 20 72 65 67 4b  +1;.    int regK
d3d0: 65 79 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  ey = sqlite3GetT
d3e0: 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c  empRange(pParse,
d3f0: 20 6e 52 65 66 4b 65 79 29 3b 0a 0a 20 20 20 20   nRefKey);..    
d400: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 53 6f 72 74  for(i=0; i<pSort
d410: 2d 3e 6e 44 65 66 65 72 3b 20 69 2b 2b 29 7b 0a  ->nDefer; i++){.
d420: 20 20 20 20 20 20 69 6e 74 20 69 43 73 72 20 3d        int iCsr =
d430: 20 70 53 6f 72 74 2d 3e 61 44 65 66 65 72 5b 69   pSort->aDefer[i
d440: 5d 2e 69 43 73 72 3b 0a 20 20 20 20 20 20 54 61  ].iCsr;.      Ta
d450: 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 53 6f 72  ble *pTab = pSor
d460: 74 2d 3e 61 44 65 66 65 72 5b 69 5d 2e 70 54 61  t->aDefer[i].pTa
d470: 62 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 4b 65  b;.      int nKe
d480: 79 20 3d 20 70 53 6f 72 74 2d 3e 61 44 65 66 65  y = pSort->aDefe
d490: 72 5b 69 5d 2e 6e 4b 65 79 3b 0a 0a 20 20 20 20  r[i].nKey;..    
d4a0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
d4b0: 4f 70 31 28 76 2c 20 4f 50 5f 4e 75 6c 6c 52 6f  Op1(v, OP_NullRo
d4c0: 77 2c 20 69 43 73 72 29 3b 0a 20 20 20 20 20 20  w, iCsr);.      
d4d0: 69 66 28 20 48 61 73 52 6f 77 69 64 28 70 54 61  if( HasRowid(pTa
d4e0: 62 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  b) ){.        sq
d4f0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
d500: 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69 53  v, OP_Column, iS
d510: 6f 72 74 54 61 62 2c 20 69 4b 65 79 2b 2b 2c 20  ortTab, iKey++, 
d520: 72 65 67 4b 65 79 29 3b 0a 20 20 20 20 20 20 20  regKey);.       
d530: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
d540: 70 33 28 76 2c 20 4f 50 5f 53 65 65 6b 52 6f 77  p3(v, OP_SeekRow
d550: 69 64 2c 20 69 43 73 72 2c 20 0a 20 20 20 20 20  id, iCsr, .     
d560: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
d570: 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
d580: 2b 31 2c 20 72 65 67 4b 65 79 29 3b 0a 20 20 20  +1, regKey);.   
d590: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
d5a0: 20 20 69 6e 74 20 6b 3b 0a 20 20 20 20 20 20 20    int k;.       
d5b0: 20 69 6e 74 20 69 4a 6d 70 3b 0a 20 20 20 20 20   int iJmp;.     
d5c0: 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
d5d0: 65 33 50 72 69 6d 61 72 79 4b 65 79 49 6e 64 65  e3PrimaryKeyInde
d5e0: 78 28 70 54 61 62 29 2d 3e 6e 4b 65 79 43 6f 6c  x(pTab)->nKeyCol
d5f0: 3d 3d 6e 4b 65 79 20 29 3b 0a 20 20 20 20 20 20  ==nKey );.      
d600: 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 6e 4b 65    for(k=0; k<nKe
d610: 79 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 20 20 20  y; k++){.       
d620: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
d630: 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d  dOp3(v, OP_Colum
d640: 6e 2c 20 69 53 6f 72 74 54 61 62 2c 20 69 4b 65  n, iSortTab, iKe
d650: 79 2b 2b 2c 20 72 65 67 4b 65 79 2b 6b 29 3b 0a  y++, regKey+k);.
d660: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
d670: 20 20 69 4a 6d 70 20 3d 20 73 71 6c 69 74 65 33    iJmp = sqlite3
d680: 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
d690: 76 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  v);.        sqli
d6a0: 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74  te3VdbeAddOp4Int
d6b0: 28 76 2c 20 4f 50 5f 53 65 65 6b 47 45 2c 20 69  (v, OP_SeekGE, i
d6c0: 43 73 72 2c 20 69 4a 6d 70 2b 32 2c 20 72 65 67  Csr, iJmp+2, reg
d6d0: 4b 65 79 2c 20 6e 4b 65 79 29 3b 0a 20 20 20 20  Key, nKey);.    
d6e0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
d6f0: 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 49  ddOp4Int(v, OP_I
d700: 64 78 4c 45 2c 20 69 43 73 72 2c 20 69 4a 6d 70  dxLE, iCsr, iJmp
d710: 2b 33 2c 20 72 65 67 4b 65 79 2c 20 6e 4b 65 79  +3, regKey, nKey
d720: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
d730: 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
d740: 4f 50 5f 4e 75 6c 6c 52 6f 77 2c 20 69 43 73 72  OP_NullRow, iCsr
d750: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
d760: 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65  .    sqlite3Rele
d770: 61 73 65 54 65 6d 70 52 61 6e 67 65 28 70 50 61  aseTempRange(pPa
d780: 72 73 65 2c 20 72 65 67 4b 65 79 2c 20 6e 52 65  rse, regKey, nRe
d790: 66 4b 65 79 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  fKey);.  }.#endi
d7a0: 66 0a 20 20 66 6f 72 28 69 3d 6e 43 6f 6c 75 6d  f.  for(i=nColum
d7b0: 6e 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b  n-1; i>=0; i--){
d7c0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
d7d0: 4e 41 42 4c 45 5f 53 4f 52 54 45 52 5f 52 45 46  NABLE_SORTER_REF
d7e0: 45 52 45 4e 43 45 53 0a 20 20 20 20 69 66 28 20  ERENCES.    if( 
d7f0: 61 4f 75 74 45 78 5b 69 5d 2e 62 53 6f 72 74 65  aOutEx[i].bSorte
d800: 72 52 65 66 20 29 7b 0a 20 20 20 20 20 20 73 71  rRef ){.      sq
d810: 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50  lite3ExprCode(pP
d820: 61 72 73 65 2c 20 61 4f 75 74 45 78 5b 69 5d 2e  arse, aOutEx[i].
d830: 70 45 78 70 72 2c 20 72 65 67 52 6f 77 2b 69 29  pExpr, regRow+i)
d840: 3b 0a 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64  ;.    }else.#end
d850: 69 66 0a 20 20 20 20 7b 0a 20 20 20 20 20 20 69  if.    {.      i
d860: 6e 74 20 69 52 65 61 64 3b 0a 20 20 20 20 20 20  nt iRead;.      
d870: 69 66 28 20 61 4f 75 74 45 78 5b 69 5d 2e 75 2e  if( aOutEx[i].u.
d880: 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 20 29 7b  x.iOrderByCol ){
d890: 0a 20 20 20 20 20 20 20 20 69 52 65 61 64 20 3d  .        iRead =
d8a0: 20 61 4f 75 74 45 78 5b 69 5d 2e 75 2e 78 2e 69   aOutEx[i].u.x.i
d8b0: 4f 72 64 65 72 42 79 43 6f 6c 2d 31 3b 0a 20 20  OrderByCol-1;.  
d8c0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
d8d0: 20 20 20 69 52 65 61 64 20 3d 20 69 43 6f 6c 2d     iRead = iCol-
d8e0: 2d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  -;.      }.     
d8f0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
d900: 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c  p3(v, OP_Column,
d910: 20 69 53 6f 72 74 54 61 62 2c 20 69 52 65 61 64   iSortTab, iRead
d920: 2c 20 72 65 67 52 6f 77 2b 69 29 3b 0a 20 20 20  , regRow+i);.   
d930: 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
d940: 76 2c 20 22 25 73 22 2c 20 61 4f 75 74 45 78 5b  v, "%s", aOutEx[
d950: 69 5d 2e 7a 4e 61 6d 65 3f 61 4f 75 74 45 78 5b  i].zName?aOutEx[
d960: 69 5d 2e 7a 4e 61 6d 65 20 3a 20 61 4f 75 74 45  i].zName : aOutE
d970: 78 5b 69 5d 2e 7a 53 70 61 6e 29 29 3b 0a 20 20  x[i].zSpan));.  
d980: 20 20 7d 0a 20 20 7d 0a 20 20 73 77 69 74 63 68    }.  }.  switch
d990: 28 20 65 44 65 73 74 20 29 7b 0a 20 20 20 20 63  ( eDest ){.    c
d9a0: 61 73 65 20 53 52 54 5f 54 61 62 6c 65 3a 0a 20  ase SRT_Table:. 
d9b0: 20 20 20 63 61 73 65 20 53 52 54 5f 45 70 68 65     case SRT_Ephe
d9c0: 6d 54 61 62 3a 20 7b 0a 20 20 20 20 20 20 73 71  mTab: {.      sq
d9d0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
d9e0: 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69 53  v, OP_Column, iS
d9f0: 6f 72 74 54 61 62 2c 20 6e 4b 65 79 2b 62 53 65  ortTab, nKey+bSe
da00: 71 2c 20 72 65 67 52 6f 77 29 3b 0a 20 20 20 20  q, regRow);.    
da10: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
da20: 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 77 52 6f 77  Op2(v, OP_NewRow
da30: 69 64 2c 20 69 50 61 72 6d 2c 20 72 65 67 52 6f  id, iParm, regRo
da40: 77 69 64 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  wid);.      sqli
da50: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
da60: 20 4f 50 5f 49 6e 73 65 72 74 2c 20 69 50 61 72   OP_Insert, iPar
da70: 6d 2c 20 72 65 67 52 6f 77 2c 20 72 65 67 52 6f  m, regRow, regRo
da80: 77 69 64 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  wid);.      sqli
da90: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28  te3VdbeChangeP5(
daa0: 76 2c 20 4f 50 46 4c 41 47 5f 41 50 50 45 4e 44  v, OPFLAG_APPEND
dab0: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
dac0: 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51      }.#ifndef SQ
dad0: 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
dae0: 52 59 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f  RY.    case SRT_
daf0: 53 65 74 3a 20 7b 0a 20 20 20 20 20 20 61 73 73  Set: {.      ass
db00: 65 72 74 28 20 6e 43 6f 6c 75 6d 6e 3d 3d 73 71  ert( nColumn==sq
db10: 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70 44  lite3Strlen30(pD
db20: 65 73 74 2d 3e 7a 41 66 66 53 64 73 74 29 20 29  est->zAffSdst) )
db30: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
db40: 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
db50: 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 65 67 52  MakeRecord, regR
db60: 6f 77 2c 20 6e 43 6f 6c 75 6d 6e 2c 20 72 65 67  ow, nColumn, reg
db70: 52 6f 77 69 64 2c 0a 20 20 20 20 20 20 20 20 20  Rowid,.         
db80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
db90: 44 65 73 74 2d 3e 7a 41 66 66 53 64 73 74 2c 20  Dest->zAffSdst, 
dba0: 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20  nColumn);.      
dbb0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
dbc0: 34 49 6e 74 28 76 2c 20 4f 50 5f 49 64 78 49 6e  4Int(v, OP_IdxIn
dbd0: 73 65 72 74 2c 20 69 50 61 72 6d 2c 20 72 65 67  sert, iParm, reg
dbe0: 52 6f 77 69 64 2c 20 72 65 67 52 6f 77 2c 20 6e  Rowid, regRow, n
dbf0: 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20 62  Column);.      b
dc00: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
dc10: 63 61 73 65 20 53 52 54 5f 4d 65 6d 3a 20 7b 0a  case SRT_Mem: {.
dc20: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 4c 49 4d        /* The LIM
dc30: 49 54 20 63 6c 61 75 73 65 20 77 69 6c 6c 20 74  IT clause will t
dc40: 65 72 6d 69 6e 61 74 65 20 74 68 65 20 6c 6f 6f  erminate the loo
dc50: 70 20 66 6f 72 20 75 73 20 2a 2f 0a 20 20 20 20  p for us */.    
dc60: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
dc70: 65 6e 64 69 66 0a 20 20 20 20 64 65 66 61 75 6c  endif.    defaul
dc80: 74 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72  t: {.      asser
dc90: 74 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75  t( eDest==SRT_Ou
dca0: 74 70 75 74 20 7c 7c 20 65 44 65 73 74 3d 3d 53  tput || eDest==S
dcb0: 52 54 5f 43 6f 72 6f 75 74 69 6e 65 20 29 3b 20  RT_Coroutine ); 
dcc0: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
dcd0: 20 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70   eDest==SRT_Outp
dce0: 75 74 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  ut );.      test
dcf0: 63 61 73 65 28 20 65 44 65 73 74 3d 3d 53 52 54  case( eDest==SRT
dd00: 5f 43 6f 72 6f 75 74 69 6e 65 20 29 3b 0a 20 20  _Coroutine );.  
dd10: 20 20 20 20 69 66 28 20 65 44 65 73 74 3d 3d 53      if( eDest==S
dd20: 52 54 5f 4f 75 74 70 75 74 20 29 7b 0a 20 20 20  RT_Output ){.   
dd30: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
dd40: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 73  AddOp2(v, OP_Res
dd50: 75 6c 74 52 6f 77 2c 20 70 44 65 73 74 2d 3e 69  ultRow, pDest->i
dd60: 53 64 73 74 2c 20 6e 43 6f 6c 75 6d 6e 29 3b 0a  Sdst, nColumn);.
dd70: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
dd80: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
dd90: 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 59 69 65  AddOp1(v, OP_Yie
dda0: 6c 64 2c 20 70 44 65 73 74 2d 3e 69 53 44 50 61  ld, pDest->iSDPa
ddb0: 72 6d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  rm);.      }.   
ddc0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
ddd0: 20 20 7d 0a 20 20 69 66 28 20 72 65 67 52 6f 77    }.  if( regRow
dde0: 69 64 20 29 7b 0a 20 20 20 20 69 66 28 20 65 44  id ){.    if( eD
ddf0: 65 73 74 3d 3d 53 52 54 5f 53 65 74 20 29 7b 0a  est==SRT_Set ){.
de00: 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c        sqlite3Rel
de10: 65 61 73 65 54 65 6d 70 52 61 6e 67 65 28 70 50  easeTempRange(pP
de20: 61 72 73 65 2c 20 72 65 67 52 6f 77 2c 20 6e 43  arse, regRow, nC
de30: 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 7d 65 6c 73  olumn);.    }els
de40: 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  e{.      sqlite3
de50: 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
de60: 50 61 72 73 65 2c 20 72 65 67 52 6f 77 29 3b 0a  Parse, regRow);.
de70: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
de80: 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
de90: 70 50 61 72 73 65 2c 20 72 65 67 52 6f 77 69 64  pParse, regRowid
dea0: 29 3b 0a 20 20 7d 0a 20 20 2f 2a 20 54 68 65 20  );.  }.  /* The 
deb0: 62 6f 74 74 6f 6d 20 6f 66 20 74 68 65 20 6c 6f  bottom of the lo
dec0: 6f 70 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65  op.  */.  sqlite
ded0: 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
dee0: 6c 28 76 2c 20 61 64 64 72 43 6f 6e 74 69 6e 75  l(v, addrContinu
def0: 65 29 3b 0a 20 20 69 66 28 20 70 53 6f 72 74 2d  e);.  if( pSort-
df00: 3e 73 6f 72 74 46 6c 61 67 73 20 26 20 53 4f 52  >sortFlags & SOR
df10: 54 46 4c 41 47 5f 55 73 65 53 6f 72 74 65 72 20  TFLAG_UseSorter 
df20: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
df30: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53  beAddOp2(v, OP_S
df40: 6f 72 74 65 72 4e 65 78 74 2c 20 69 54 61 62 2c  orterNext, iTab,
df50: 20 61 64 64 72 29 3b 20 56 64 62 65 43 6f 76 65   addr); VdbeCove
df60: 72 61 67 65 28 76 29 3b 0a 20 20 7d 65 6c 73 65  rage(v);.  }else
df70: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
df80: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65  eAddOp2(v, OP_Ne
df90: 78 74 2c 20 69 54 61 62 2c 20 61 64 64 72 29 3b  xt, iTab, addr);
dfa0: 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
dfb0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 53 6f 72  ;.  }.  if( pSor
dfc0: 74 2d 3e 72 65 67 52 65 74 75 72 6e 20 29 20 73  t->regReturn ) s
dfd0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
dfe0: 28 76 2c 20 4f 50 5f 52 65 74 75 72 6e 2c 20 70  (v, OP_Return, p
dff0: 53 6f 72 74 2d 3e 72 65 67 52 65 74 75 72 6e 29  Sort->regReturn)
e000: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 52  ;.  sqlite3VdbeR
e010: 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61  esolveLabel(v, a
e020: 64 64 72 42 72 65 61 6b 29 3b 0a 7d 0a 0a 2f 2a  ddrBreak);.}../*
e030: 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69  .** Return a poi
e040: 6e 74 65 72 20 74 6f 20 61 20 73 74 72 69 6e 67  nter to a string
e050: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20   containing the 
e060: 27 64 65 63 6c 61 72 61 74 69 6f 6e 20 74 79 70  'declaration typ
e070: 65 27 20 6f 66 20 74 68 65 0a 2a 2a 20 65 78 70  e' of the.** exp
e080: 72 65 73 73 69 6f 6e 20 70 45 78 70 72 2e 20 54  ression pExpr. T
e090: 68 65 20 73 74 72 69 6e 67 20 6d 61 79 20 62 65  he string may be
e0a0: 20 74 72 65 61 74 65 64 20 61 73 20 73 74 61 74   treated as stat
e0b0: 69 63 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72  ic by the caller
e0c0: 2e 0a 2a 2a 0a 2a 2a 20 41 6c 73 6f 20 74 72 79  ..**.** Also try
e0d0: 20 74 6f 20 65 73 74 69 6d 61 74 65 20 74 68 65   to estimate the
e0e0: 20 73 69 7a 65 20 6f 66 20 74 68 65 20 72 65 74   size of the ret
e0f0: 75 72 6e 65 64 20 76 61 6c 75 65 20 61 6e 64 20  urned value and 
e100: 72 65 74 75 72 6e 20 74 68 61 74 0a 2a 2a 20 72  return that.** r
e110: 65 73 75 6c 74 20 69 6e 20 2a 70 45 73 74 57 69  esult in *pEstWi
e120: 64 74 68 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64  dth..**.** The d
e130: 65 63 6c 61 72 61 74 69 6f 6e 20 74 79 70 65 20  eclaration type 
e140: 69 73 20 74 68 65 20 65 78 61 63 74 20 64 61 74  is the exact dat
e150: 61 74 79 70 65 20 64 65 66 69 6e 69 74 69 6f 6e  atype definition
e160: 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20   extracted from 
e170: 74 68 65 0a 2a 2a 20 6f 72 69 67 69 6e 61 6c 20  the.** original 
e180: 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61  CREATE TABLE sta
e190: 74 65 6d 65 6e 74 20 69 66 20 74 68 65 20 65 78  tement if the ex
e1a0: 70 72 65 73 73 69 6f 6e 20 69 73 20 61 20 63 6f  pression is a co
e1b0: 6c 75 6d 6e 2e 20 54 68 65 0a 2a 2a 20 64 65 63  lumn. The.** dec
e1c0: 6c 61 72 61 74 69 6f 6e 20 74 79 70 65 20 66 6f  laration type fo
e1d0: 72 20 61 20 52 4f 57 49 44 20 66 69 65 6c 64 20  r a ROWID field 
e1e0: 69 73 20 49 4e 54 45 47 45 52 2e 20 45 78 61 63  is INTEGER. Exac
e1f0: 74 6c 79 20 77 68 65 6e 20 61 6e 20 65 78 70 72  tly when an expr
e200: 65 73 73 69 6f 6e 0a 2a 2a 20 69 73 20 63 6f 6e  ession.** is con
e210: 73 69 64 65 72 65 64 20 61 20 63 6f 6c 75 6d 6e  sidered a column
e220: 20 63 61 6e 20 62 65 20 63 6f 6d 70 6c 65 78 20   can be complex 
e230: 69 6e 20 74 68 65 20 70 72 65 73 65 6e 63 65 20  in the presence 
e240: 6f 66 20 73 75 62 71 75 65 72 69 65 73 2e 20 54  of subqueries. T
e250: 68 65 0a 2a 2a 20 72 65 73 75 6c 74 2d 73 65 74  he.** result-set
e260: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 61   expression in a
e270: 6c 6c 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ll of the follow
e280: 69 6e 67 20 53 45 4c 45 43 54 20 73 74 61 74 65  ing SELECT state
e290: 6d 65 6e 74 73 20 69 73 20 0a 2a 2a 20 63 6f 6e  ments is .** con
e2a0: 73 69 64 65 72 65 64 20 61 20 63 6f 6c 75 6d 6e  sidered a column
e2b0: 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f   by this functio
e2c0: 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 53 45 4c 45 43  n..**.**   SELEC
e2d0: 54 20 63 6f 6c 20 46 52 4f 4d 20 74 62 6c 3b 0a  T col FROM tbl;.
e2e0: 2a 2a 20 20 20 53 45 4c 45 43 54 20 28 53 45 4c  **   SELECT (SEL
e2f0: 45 43 54 20 63 6f 6c 20 46 52 4f 4d 20 74 62 6c  ECT col FROM tbl
e300: 3b 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20 28 53  ;.**   SELECT (S
e310: 45 4c 45 43 54 20 63 6f 6c 20 46 52 4f 4d 20 74  ELECT col FROM t
e320: 62 6c 29 3b 0a 2a 2a 20 20 20 53 45 4c 45 43 54  bl);.**   SELECT
e330: 20 61 62 63 20 46 52 4f 4d 20 28 53 45 4c 45 43   abc FROM (SELEC
e340: 54 20 63 6f 6c 20 41 53 20 61 62 63 20 46 52 4f  T col AS abc FRO
e350: 4d 20 74 62 6c 29 3b 0a 2a 2a 20 0a 2a 2a 20 54  M tbl);.** .** T
e360: 68 65 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 74  he declaration t
e370: 79 70 65 20 66 6f 72 20 61 6e 79 20 65 78 70 72  ype for any expr
e380: 65 73 73 69 6f 6e 20 6f 74 68 65 72 20 74 68 61  ession other tha
e390: 6e 20 61 20 63 6f 6c 75 6d 6e 20 69 73 20 4e 55  n a column is NU
e3a0: 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  LL..**.** This r
e3b0: 6f 75 74 69 6e 65 20 68 61 73 20 65 69 74 68 65  outine has eithe
e3c0: 72 20 33 20 6f 72 20 36 20 70 61 72 61 6d 65 74  r 3 or 6 paramet
e3d0: 65 72 73 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e  ers depending on
e3e0: 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 0a   whether or not.
e3f0: 2a 2a 20 74 68 65 20 53 51 4c 49 54 45 5f 45 4e  ** the SQLITE_EN
e400: 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41  ABLE_COLUMN_META
e410: 44 41 54 41 20 63 6f 6d 70 69 6c 65 2d 74 69 6d  DATA compile-tim
e420: 65 20 6f 70 74 69 6f 6e 20 69 73 20 75 73 65 64  e option is used
e430: 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  ..*/.#ifdef SQLI
e440: 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e  TE_ENABLE_COLUMN
e450: 5f 4d 45 54 41 44 41 54 41 0a 23 20 64 65 66 69  _METADATA.# defi
e460: 6e 65 20 63 6f 6c 75 6d 6e 54 79 70 65 28 41 2c  ne columnType(A,
e470: 42 2c 43 2c 44 2c 45 29 20 63 6f 6c 75 6d 6e 54  B,C,D,E) columnT
e480: 79 70 65 49 6d 70 6c 28 41 2c 42 2c 43 2c 44 2c  ypeImpl(A,B,C,D,
e490: 45 29 0a 23 65 6c 73 65 20 2f 2a 20 69 66 20 21  E).#else /* if !
e4a0: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45  defined(SQLITE_E
e4b0: 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54  NABLE_COLUMN_MET
e4c0: 41 44 41 54 41 29 20 2a 2f 0a 23 20 64 65 66 69  ADATA) */.# defi
e4d0: 6e 65 20 63 6f 6c 75 6d 6e 54 79 70 65 28 41 2c  ne columnType(A,
e4e0: 42 2c 43 2c 44 2c 45 29 20 63 6f 6c 75 6d 6e 54  B,C,D,E) columnT
e4f0: 79 70 65 49 6d 70 6c 28 41 2c 42 29 0a 23 65 6e  ypeImpl(A,B).#en
e500: 64 69 66 0a 73 74 61 74 69 63 20 63 6f 6e 73 74  dif.static const
e510: 20 63 68 61 72 20 2a 63 6f 6c 75 6d 6e 54 79 70   char *columnTyp
e520: 65 49 6d 70 6c 28 0a 20 20 4e 61 6d 65 43 6f 6e  eImpl(.  NameCon
e530: 74 65 78 74 20 2a 70 4e 43 2c 20 0a 23 69 66 6e  text *pNC, .#ifn
e540: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
e550: 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41 54  E_COLUMN_METADAT
e560: 41 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 0a  A.  Expr *pExpr.
e570: 23 65 6c 73 65 0a 20 20 45 78 70 72 20 2a 70 45  #else.  Expr *pE
e580: 78 70 72 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61  xpr,.  const cha
e590: 72 20 2a 2a 70 7a 4f 72 69 67 44 62 2c 0a 20 20  r **pzOrigDb,.  
e5a0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a 70 7a 4f  const char **pzO
e5b0: 72 69 67 54 61 62 2c 0a 20 20 63 6f 6e 73 74 20  rigTab,.  const 
e5c0: 63 68 61 72 20 2a 2a 70 7a 4f 72 69 67 43 6f 6c  char **pzOrigCol
e5d0: 0a 23 65 6e 64 69 66 0a 29 7b 0a 20 20 63 68 61  .#endif.){.  cha
e5e0: 72 20 63 6f 6e 73 74 20 2a 7a 54 79 70 65 20 3d  r const *zType =
e5f0: 20 30 3b 0a 20 20 69 6e 74 20 6a 3b 0a 23 69 66   0;.  int j;.#if
e600: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
e610: 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41 54  E_COLUMN_METADAT
e620: 41 0a 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a  A.  char const *
e630: 7a 4f 72 69 67 44 62 20 3d 20 30 3b 0a 20 20 63  zOrigDb = 0;.  c
e640: 68 61 72 20 63 6f 6e 73 74 20 2a 7a 4f 72 69 67  har const *zOrig
e650: 54 61 62 20 3d 20 30 3b 0a 20 20 63 68 61 72 20  Tab = 0;.  char 
e660: 63 6f 6e 73 74 20 2a 7a 4f 72 69 67 43 6f 6c 20  const *zOrigCol 
e670: 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 61  = 0;.#endif..  a
e680: 73 73 65 72 74 28 20 70 45 78 70 72 21 3d 30 20  ssert( pExpr!=0 
e690: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4e 43  );.  assert( pNC
e6a0: 2d 3e 70 53 72 63 4c 69 73 74 21 3d 30 20 29 3b  ->pSrcList!=0 );
e6b0: 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72  .  assert( pExpr
e6c0: 2d 3e 6f 70 21 3d 54 4b 5f 41 47 47 5f 43 4f 4c  ->op!=TK_AGG_COL
e6d0: 55 4d 4e 20 29 3b 20 20 2f 2a 20 54 68 69 73 20  UMN );  /* This 
e6e0: 72 6f 75 74 69 6e 65 20 72 75 6e 65 73 20 62 65  routine runes be
e6f0: 66 6f 72 65 20 61 67 67 72 65 67 61 74 65 73 0a  fore aggregates.
e700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e710: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e720: 20 20 20 20 20 20 20 2a 2a 20 61 72 65 20 70 72         ** are pr
e730: 6f 63 65 73 73 65 64 20 2a 2f 0a 20 20 73 77 69  ocessed */.  swi
e740: 74 63 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29  tch( pExpr->op )
e750: 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f  {.    case TK_CO
e760: 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20 20 20 2f 2a  LUMN: {.      /*
e770: 20 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   The expression 
e780: 69 73 20 61 20 63 6f 6c 75 6d 6e 2e 20 4c 6f 63  is a column. Loc
e790: 61 74 65 20 74 68 65 20 74 61 62 6c 65 20 74 68  ate the table th
e7a0: 65 20 63 6f 6c 75 6d 6e 20 69 73 20 62 65 69 6e  e column is bein
e7b0: 67 0a 20 20 20 20 20 20 2a 2a 20 65 78 74 72 61  g.      ** extra
e7c0: 63 74 65 64 20 66 72 6f 6d 20 69 6e 20 4e 61 6d  cted from in Nam
e7d0: 65 43 6f 6e 74 65 78 74 2e 70 53 72 63 4c 69 73  eContext.pSrcLis
e7e0: 74 2e 20 54 68 69 73 20 74 61 62 6c 65 20 6d 61  t. This table ma
e7f0: 79 20 62 65 20 72 65 61 6c 0a 20 20 20 20 20 20  y be real.      
e800: 2a 2a 20 64 61 74 61 62 61 73 65 20 74 61 62 6c  ** database tabl
e810: 65 20 6f 72 20 61 20 73 75 62 71 75 65 72 79 2e  e or a subquery.
e820: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
e830: 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 30 3b  Table *pTab = 0;
e840: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
e850: 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 20 63  able structure c
e860: 6f 6c 75 6d 6e 20 69 73 20 65 78 74 72 61 63 74  olumn is extract
e870: 65 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 20 20 20  ed from */.     
e880: 20 53 65 6c 65 63 74 20 2a 70 53 20 3d 20 30 3b   Select *pS = 0;
e890: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
e8a0: 53 65 6c 65 63 74 20 74 68 65 20 63 6f 6c 75 6d  Select the colum
e8b0: 6e 20 69 73 20 65 78 74 72 61 63 74 65 64 20 66  n is extracted f
e8c0: 72 6f 6d 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  rom */.      int
e8d0: 20 69 43 6f 6c 20 3d 20 70 45 78 70 72 2d 3e 69   iCol = pExpr->i
e8e0: 43 6f 6c 75 6d 6e 3b 20 20 2f 2a 20 49 6e 64 65  Column;  /* Inde
e8f0: 78 20 6f 66 20 63 6f 6c 75 6d 6e 20 69 6e 20 70  x of column in p
e900: 54 61 62 20 2a 2f 0a 20 20 20 20 20 20 77 68 69  Tab */.      whi
e910: 6c 65 28 20 70 4e 43 20 26 26 20 21 70 54 61 62  le( pNC && !pTab
e920: 20 29 7b 0a 20 20 20 20 20 20 20 20 53 72 63 4c   ){.        SrcL
e930: 69 73 74 20 2a 70 54 61 62 4c 69 73 74 20 3d 20  ist *pTabList = 
e940: 70 4e 43 2d 3e 70 53 72 63 4c 69 73 74 3b 0a 20  pNC->pSrcList;. 
e950: 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 6a         for(j=0;j
e960: 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 20  <pTabList->nSrc 
e970: 26 26 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 6a  && pTabList->a[j
e980: 5d 2e 69 43 75 72 73 6f 72 21 3d 70 45 78 70 72  ].iCursor!=pExpr
e990: 2d 3e 69 54 61 62 6c 65 3b 6a 2b 2b 29 3b 0a 20  ->iTable;j++);. 
e9a0: 20 20 20 20 20 20 20 69 66 28 20 6a 3c 70 54 61         if( j<pTa
e9b0: 62 4c 69 73 74 2d 3e 6e 53 72 63 20 29 7b 0a 20  bList->nSrc ){. 
e9c0: 20 20 20 20 20 20 20 20 20 70 54 61 62 20 3d 20           pTab = 
e9d0: 70 54 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 70  pTabList->a[j].p
e9e0: 54 61 62 3b 0a 20 20 20 20 20 20 20 20 20 20 70  Tab;.          p
e9f0: 53 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b  S = pTabList->a[
ea00: 6a 5d 2e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20  j].pSelect;.    
ea10: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
ea20: 20 20 20 20 20 70 4e 43 20 3d 20 70 4e 43 2d 3e       pNC = pNC->
ea30: 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 20 20 7d  pNext;.        }
ea40: 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
ea50: 69 66 28 20 70 54 61 62 3d 3d 30 20 29 7b 0a 20  if( pTab==0 ){. 
ea60: 20 20 20 20 20 20 20 2f 2a 20 41 74 20 6f 6e 65         /* At one
ea70: 20 74 69 6d 65 2c 20 63 6f 64 65 20 73 75 63 68   time, code such
ea80: 20 61 73 20 22 53 45 4c 45 43 54 20 6e 65 77 2e   as "SELECT new.
ea90: 78 22 20 77 69 74 68 69 6e 20 61 20 74 72 69 67  x" within a trig
eaa0: 67 65 72 20 77 6f 75 6c 64 0a 20 20 20 20 20 20  ger would.      
eab0: 20 20 2a 2a 20 63 61 75 73 65 20 74 68 69 73 20    ** cause this 
eac0: 63 6f 6e 64 69 74 69 6f 6e 20 74 6f 20 72 75 6e  condition to run
ead0: 2e 20 20 53 69 6e 63 65 20 74 68 65 6e 2c 20 77  .  Since then, w
eae0: 65 20 68 61 76 65 20 72 65 73 74 72 75 63 74 75  e have restructu
eaf0: 72 65 64 20 68 6f 77 0a 20 20 20 20 20 20 20 20  red how.        
eb00: 2a 2a 20 74 72 69 67 67 65 72 20 63 6f 64 65 20  ** trigger code 
eb10: 69 73 20 67 65 6e 65 72 61 74 65 64 20 61 6e 64  is generated and
eb20: 20 73 6f 20 74 68 69 73 20 63 6f 6e 64 69 74 69   so this conditi
eb30: 6f 6e 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20  on is no longer 
eb40: 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 6f 73 73  .        ** poss
eb50: 69 62 6c 65 2e 20 48 6f 77 65 76 65 72 2c 20 69  ible. However, i
eb60: 74 20 63 61 6e 20 73 74 69 6c 6c 20 62 65 20 74  t can still be t
eb70: 72 75 65 20 66 6f 72 20 73 74 61 74 65 6d 65 6e  rue for statemen
eb80: 74 73 20 6c 69 6b 65 0a 20 20 20 20 20 20 20 20  ts like.        
eb90: 2a 2a 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** the following
eba0: 3a 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20  :.        **.   
ebb0: 20 20 20 20 20 2a 2a 20 20 20 43 52 45 41 54 45       **   CREATE
ebc0: 20 54 41 42 4c 45 20 74 31 28 63 6f 6c 20 49 4e   TABLE t1(col IN
ebd0: 54 45 47 45 52 29 3b 0a 20 20 20 20 20 20 20 20  TEGER);.        
ebe0: 2a 2a 20 20 20 53 45 4c 45 43 54 20 28 53 45 4c  **   SELECT (SEL
ebf0: 45 43 54 20 74 31 2e 63 6f 6c 29 20 46 52 4f 4d  ECT t1.col) FROM
ec00: 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 20 20   FROM t1;.      
ec10: 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20    **.        ** 
ec20: 77 68 65 6e 20 63 6f 6c 75 6d 6e 54 79 70 65 28  when columnType(
ec30: 29 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e 20 74  ) is called on t
ec40: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 22 74  he expression "t
ec50: 31 2e 63 6f 6c 22 20 69 6e 20 74 68 65 20 0a 20  1.col" in the . 
ec60: 20 20 20 20 20 20 20 2a 2a 20 73 75 62 2d 73 65         ** sub-se
ec70: 6c 65 63 74 2e 20 49 6e 20 74 68 69 73 20 63 61  lect. In this ca
ec80: 73 65 2c 20 73 65 74 20 74 68 65 20 63 6f 6c 75  se, set the colu
ec90: 6d 6e 20 74 79 70 65 20 74 6f 20 4e 55 4c 4c 2c  mn type to NULL,
eca0: 20 65 76 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a   even.        **
ecb0: 20 74 68 6f 75 67 68 20 69 74 20 73 68 6f 75 6c   though it shoul
ecc0: 64 20 72 65 61 6c 6c 79 20 62 65 20 22 49 4e 54  d really be "INT
ecd0: 45 47 45 52 22 2e 0a 20 20 20 20 20 20 20 20 2a  EGER"..        *
ece0: 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 54 68 69  *.        ** Thi
ecf0: 73 20 69 73 20 6e 6f 74 20 61 20 70 72 6f 62 6c  s is not a probl
ed00: 65 6d 2c 20 61 73 20 74 68 65 20 63 6f 6c 75 6d  em, as the colum
ed10: 6e 20 74 79 70 65 20 6f 66 20 22 74 31 2e 63 6f  n type of "t1.co
ed20: 6c 22 20 69 73 20 6e 65 76 65 72 0a 20 20 20 20  l" is never.    
ed30: 20 20 20 20 2a 2a 20 75 73 65 64 2e 20 57 68 65      ** used. Whe
ed40: 6e 20 63 6f 6c 75 6d 6e 54 79 70 65 28 29 20 69  n columnType() i
ed50: 73 20 63 61 6c 6c 65 64 20 6f 6e 20 74 68 65 20  s called on the 
ed60: 65 78 70 72 65 73 73 69 6f 6e 20 0a 20 20 20 20  expression .    
ed70: 20 20 20 20 2a 2a 20 22 28 53 45 4c 45 43 54 20      ** "(SELECT 
ed80: 74 31 2e 63 6f 6c 29 22 2c 20 74 68 65 20 63 6f  t1.col)", the co
ed90: 72 72 65 63 74 20 74 79 70 65 20 69 73 20 72 65  rrect type is re
eda0: 74 75 72 6e 65 64 20 28 73 65 65 20 74 68 65 20  turned (see the 
edb0: 54 4b 5f 53 45 4c 45 43 54 0a 20 20 20 20 20 20  TK_SELECT.      
edc0: 20 20 2a 2a 20 62 72 61 6e 63 68 20 62 65 6c 6f    ** branch belo
edd0: 77 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 62  w.  */.        b
ede0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  reak;.      }.. 
edf0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54 61       assert( pTa
ee00: 62 20 26 26 20 70 45 78 70 72 2d 3e 79 2e 70 54  b && pExpr->y.pT
ee10: 61 62 3d 3d 70 54 61 62 20 29 3b 0a 20 20 20 20  ab==pTab );.    
ee20: 20 20 69 66 28 20 70 53 20 29 7b 0a 20 20 20 20    if( pS ){.    
ee30: 20 20 20 20 2f 2a 20 54 68 65 20 22 74 61 62 6c      /* The "tabl
ee40: 65 22 20 69 73 20 61 63 74 75 61 6c 6c 79 20 61  e" is actually a
ee50: 20 73 75 62 2d 73 65 6c 65 63 74 20 6f 72 20 61   sub-select or a
ee60: 20 76 69 65 77 20 69 6e 20 74 68 65 20 46 52 4f   view in the FRO
ee70: 4d 20 63 6c 61 75 73 65 0a 20 20 20 20 20 20 20  M clause.       
ee80: 20 2a 2a 20 6f 66 20 74 68 65 20 53 45 4c 45 43   ** of the SELEC
ee90: 54 20 73 74 61 74 65 6d 65 6e 74 2e 20 52 65 74  T statement. Ret
eea0: 75 72 6e 20 74 68 65 20 64 65 63 6c 61 72 61 74  urn the declarat
eeb0: 69 6f 6e 20 74 79 70 65 20 61 6e 64 20 6f 72 69  ion type and ori
eec0: 67 69 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 64  gin.        ** d
eed0: 61 74 61 20 66 6f 72 20 74 68 65 20 72 65 73 75  ata for the resu
eee0: 6c 74 2d 73 65 74 20 63 6f 6c 75 6d 6e 20 6f 66  lt-set column of
eef0: 20 74 68 65 20 73 75 62 2d 73 65 6c 65 63 74 2e   the sub-select.
ef00: 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
ef10: 20 20 20 20 69 66 28 20 69 43 6f 6c 3e 3d 30 20      if( iCol>=0 
ef20: 26 26 20 69 43 6f 6c 3c 70 53 2d 3e 70 45 4c 69  && iCol<pS->pELi
ef30: 73 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20  st->nExpr ){.   
ef40: 20 20 20 20 20 20 20 2f 2a 20 49 66 20 69 43 6f         /* If iCo
ef50: 6c 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 7a  l is less than z
ef60: 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 65 78  ero, then the ex
ef70: 70 72 65 73 73 69 6f 6e 20 72 65 71 75 65 73 74  pression request
ef80: 73 20 74 68 65 0a 20 20 20 20 20 20 20 20 20 20  s the.          
ef90: 2a 2a 20 72 6f 77 69 64 20 6f 66 20 74 68 65 20  ** rowid of the 
efa0: 73 75 62 2d 73 65 6c 65 63 74 20 6f 72 20 76 69  sub-select or vi
efb0: 65 77 2e 20 54 68 69 73 20 65 78 70 72 65 73 73  ew. This express
efc0: 69 6f 6e 20 69 73 20 6c 65 67 61 6c 20 28 73 65  ion is legal (se
efd0: 65 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  e .          ** 
efe0: 74 65 73 74 20 63 61 73 65 20 6d 69 73 63 32 2e  test case misc2.
eff0: 32 2e 32 29 20 2d 20 69 74 20 61 6c 77 61 79 73  2.2) - it always
f000: 20 65 76 61 6c 75 61 74 65 73 20 74 6f 20 4e 55   evaluates to NU
f010: 4c 4c 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f  LL..          */
f020: 0a 20 20 20 20 20 20 20 20 20 20 4e 61 6d 65 43  .          NameC
f030: 6f 6e 74 65 78 74 20 73 4e 43 3b 0a 20 20 20 20  ontext sNC;.    
f040: 20 20 20 20 20 20 45 78 70 72 20 2a 70 20 3d 20        Expr *p = 
f050: 70 53 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 69 43  pS->pEList->a[iC
f060: 6f 6c 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20  ol].pExpr;.     
f070: 20 20 20 20 20 73 4e 43 2e 70 53 72 63 4c 69 73       sNC.pSrcLis
f080: 74 20 3d 20 70 53 2d 3e 70 53 72 63 3b 0a 20 20  t = pS->pSrc;.  
f090: 20 20 20 20 20 20 20 20 73 4e 43 2e 70 4e 65 78          sNC.pNex
f0a0: 74 20 3d 20 70 4e 43 3b 0a 20 20 20 20 20 20 20  t = pNC;.       
f0b0: 20 20 20 73 4e 43 2e 70 50 61 72 73 65 20 3d 20     sNC.pParse = 
f0c0: 70 4e 43 2d 3e 70 50 61 72 73 65 3b 0a 20 20 20  pNC->pParse;.   
f0d0: 20 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20 63         zType = c
f0e0: 6f 6c 75 6d 6e 54 79 70 65 28 26 73 4e 43 2c 20  olumnType(&sNC, 
f0f0: 70 2c 26 7a 4f 72 69 67 44 62 2c 26 7a 4f 72 69  p,&zOrigDb,&zOri
f100: 67 54 61 62 2c 26 7a 4f 72 69 67 43 6f 6c 29 3b  gTab,&zOrigCol);
f110: 20 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20   .        }.    
f120: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
f130: 20 2f 2a 20 41 20 72 65 61 6c 20 74 61 62 6c 65   /* A real table
f140: 20 6f 72 20 61 20 43 54 45 20 74 61 62 6c 65 20   or a CTE table 
f150: 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  */.        asser
f160: 74 28 20 21 70 53 20 29 3b 0a 23 69 66 64 65 66  t( !pS );.#ifdef
f170: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43   SQLITE_ENABLE_C
f180: 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41 54 41 0a 20  OLUMN_METADATA. 
f190: 20 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3c         if( iCol<
f1a0: 30 20 29 20 69 43 6f 6c 20 3d 20 70 54 61 62 2d  0 ) iCol = pTab-
f1b0: 3e 69 50 4b 65 79 3b 0a 20 20 20 20 20 20 20 20  >iPKey;.        
f1c0: 61 73 73 65 72 74 28 20 69 43 6f 6c 3d 3d 58 4e  assert( iCol==XN
f1d0: 5f 52 4f 57 49 44 20 7c 7c 20 28 69 43 6f 6c 3e  _ROWID || (iCol>
f1e0: 3d 30 20 26 26 20 69 43 6f 6c 3c 70 54 61 62 2d  =0 && iCol<pTab-
f1f0: 3e 6e 43 6f 6c 29 20 29 3b 0a 20 20 20 20 20 20  >nCol) );.      
f200: 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 29 7b 0a    if( iCol<0 ){.
f210: 20 20 20 20 20 20 20 20 20 20 7a 54 79 70 65 20            zType 
f220: 3d 20 22 49 4e 54 45 47 45 52 22 3b 0a 20 20 20  = "INTEGER";.   
f230: 20 20 20 20 20 20 20 7a 4f 72 69 67 43 6f 6c 20         zOrigCol 
f240: 3d 20 22 72 6f 77 69 64 22 3b 0a 20 20 20 20 20  = "rowid";.     
f250: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
f260: 20 20 20 20 7a 4f 72 69 67 43 6f 6c 20 3d 20 70      zOrigCol = p
f270: 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e  Tab->aCol[iCol].
f280: 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 20  zName;.         
f290: 20 7a 54 79 70 65 20 3d 20 73 71 6c 69 74 65 33   zType = sqlite3
f2a0: 43 6f 6c 75 6d 6e 54 79 70 65 28 26 70 54 61 62  ColumnType(&pTab
f2b0: 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2c 30 29 3b  ->aCol[iCol],0);
f2c0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
f2d0: 20 20 20 7a 4f 72 69 67 54 61 62 20 3d 20 70 54     zOrigTab = pT
f2e0: 61 62 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20  ab->zName;.     
f2f0: 20 20 20 69 66 28 20 70 4e 43 2d 3e 70 50 61 72     if( pNC->pPar
f300: 73 65 20 26 26 20 70 54 61 62 2d 3e 70 53 63 68  se && pTab->pSch
f310: 65 6d 61 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ema ){.         
f320: 20 69 6e 74 20 69 44 62 20 3d 20 73 71 6c 69 74   int iDb = sqlit
f330: 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28  e3SchemaToIndex(
f340: 70 4e 43 2d 3e 70 50 61 72 73 65 2d 3e 64 62 2c  pNC->pParse->db,
f350: 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b   pTab->pSchema);
f360: 0a 20 20 20 20 20 20 20 20 20 20 7a 4f 72 69 67  .          zOrig
f370: 44 62 20 3d 20 70 4e 43 2d 3e 70 50 61 72 73 65  Db = pNC->pParse
f380: 2d 3e 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a  ->db->aDb[iDb].z
f390: 44 62 53 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20  DbSName;.       
f3a0: 20 7d 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 20   }.#else.       
f3b0: 20 61 73 73 65 72 74 28 20 69 43 6f 6c 3d 3d 58   assert( iCol==X
f3c0: 4e 5f 52 4f 57 49 44 20 7c 7c 20 28 69 43 6f 6c  N_ROWID || (iCol
f3d0: 3e 3d 30 20 26 26 20 69 43 6f 6c 3c 70 54 61 62  >=0 && iCol<pTab
f3e0: 2d 3e 6e 43 6f 6c 29 20 29 3b 0a 20 20 20 20 20  ->nCol) );.     
f3f0: 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 29 7b     if( iCol<0 ){
f400: 0a 20 20 20 20 20 20 20 20 20 20 7a 54 79 70 65  .          zType
f410: 20 3d 20 22 49 4e 54 45 47 45 52 22 3b 0a 20 20   = "INTEGER";.  
f420: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
f430: 20 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20 73         zType = s
f440: 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 54 79 70 65  qlite3ColumnType
f450: 28 26 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f  (&pTab->aCol[iCo
f460: 6c 5d 2c 30 29 3b 0a 20 20 20 20 20 20 20 20 7d  l],0);.        }
f470: 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 7d 0a  .#endif.      }.
f480: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
f490: 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54   }.#ifndef SQLIT
f4a0: 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a  E_OMIT_SUBQUERY.
f4b0: 20 20 20 20 63 61 73 65 20 54 4b 5f 53 45 4c 45      case TK_SELE
f4c0: 43 54 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 54  CT: {.      /* T
f4d0: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  he expression is
f4e0: 20 61 20 73 75 62 2d 73 65 6c 65 63 74 2e 20 52   a sub-select. R
f4f0: 65 74 75 72 6e 20 74 68 65 20 64 65 63 6c 61 72  eturn the declar
f500: 61 74 69 6f 6e 20 74 79 70 65 20 61 6e 64 0a 20  ation type and. 
f510: 20 20 20 20 20 2a 2a 20 6f 72 69 67 69 6e 20 69       ** origin i
f520: 6e 66 6f 20 66 6f 72 20 74 68 65 20 73 69 6e 67  nfo for the sing
f530: 6c 65 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65  le column in the
f540: 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20 74   result set of t
f550: 68 65 20 53 45 4c 45 43 54 0a 20 20 20 20 20 20  he SELECT.      
f560: 2a 2a 20 73 74 61 74 65 6d 65 6e 74 2e 0a 20 20  ** statement..  
f570: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 4e 61 6d      */.      Nam
f580: 65 43 6f 6e 74 65 78 74 20 73 4e 43 3b 0a 20 20  eContext sNC;.  
f590: 20 20 20 20 53 65 6c 65 63 74 20 2a 70 53 20 3d      Select *pS =
f5a0: 20 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63   pExpr->x.pSelec
f5b0: 74 3b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70  t;.      Expr *p
f5c0: 20 3d 20 70 53 2d 3e 70 45 4c 69 73 74 2d 3e 61   = pS->pEList->a
f5d0: 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20  [0].pExpr;.     
f5e0: 20 61 73 73 65 72 74 28 20 45 78 70 72 48 61 73   assert( ExprHas
f5f0: 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
f600: 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b  EP_xIsSelect) );
f610: 0a 20 20 20 20 20 20 73 4e 43 2e 70 53 72 63 4c  .      sNC.pSrcL
f620: 69 73 74 20 3d 20 70 53 2d 3e 70 53 72 63 3b 0a  ist = pS->pSrc;.
f630: 20 20 20 20 20 20 73 4e 43 2e 70 4e 65 78 74 20        sNC.pNext 
f640: 3d 20 70 4e 43 3b 0a 20 20 20 20 20 20 73 4e 43  = pNC;.      sNC
f650: 2e 70 50 61 72 73 65 20 3d 20 70 4e 43 2d 3e 70  .pParse = pNC->p
f660: 50 61 72 73 65 3b 0a 20 20 20 20 20 20 7a 54 79  Parse;.      zTy
f670: 70 65 20 3d 20 63 6f 6c 75 6d 6e 54 79 70 65 28  pe = columnType(
f680: 26 73 4e 43 2c 20 70 2c 20 26 7a 4f 72 69 67 44  &sNC, p, &zOrigD
f690: 62 2c 20 26 7a 4f 72 69 67 54 61 62 2c 20 26 7a  b, &zOrigTab, &z
f6a0: 4f 72 69 67 43 6f 6c 29 3b 20 0a 20 20 20 20 20  OrigCol); .     
f6b0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65   break;.    }.#e
f6c0: 6e 64 69 66 0a 20 20 7d 0a 0a 23 69 66 64 65 66  ndif.  }..#ifdef
f6d0: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43   SQLITE_ENABLE_C
f6e0: 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41 54 41 20 20  OLUMN_METADATA  
f6f0: 0a 20 20 69 66 28 20 70 7a 4f 72 69 67 44 62 20  .  if( pzOrigDb 
f700: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
f710: 7a 4f 72 69 67 54 61 62 20 26 26 20 70 7a 4f 72  zOrigTab && pzOr
f720: 69 67 43 6f 6c 20 29 3b 0a 20 20 20 20 2a 70 7a  igCol );.    *pz
f730: 4f 72 69 67 44 62 20 3d 20 7a 4f 72 69 67 44 62  OrigDb = zOrigDb
f740: 3b 0a 20 20 20 20 2a 70 7a 4f 72 69 67 54 61 62  ;.    *pzOrigTab
f750: 20 3d 20 7a 4f 72 69 67 54 61 62 3b 0a 20 20 20   = zOrigTab;.   
f760: 20 2a 70 7a 4f 72 69 67 43 6f 6c 20 3d 20 7a 4f   *pzOrigCol = zO
f770: 72 69 67 43 6f 6c 3b 0a 20 20 7d 0a 23 65 6e 64  rigCol;.  }.#end
f780: 69 66 0a 20 20 72 65 74 75 72 6e 20 7a 54 79 70  if.  return zTyp
f790: 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  e;.}../*.** Gene
f7a0: 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 77  rate code that w
f7b0: 69 6c 6c 20 74 65 6c 6c 20 74 68 65 20 56 44 42  ill tell the VDB
f7c0: 45 20 74 68 65 20 64 65 63 6c 61 72 61 74 69 6f  E the declaratio
f7d0: 6e 20 74 79 70 65 73 20 6f 66 20 63 6f 6c 75 6d  n types of colum
f7e0: 6e 73 0a 2a 2a 20 69 6e 20 74 68 65 20 72 65 73  ns.** in the res
f7f0: 75 6c 74 20 73 65 74 2e 0a 2a 2f 0a 73 74 61 74  ult set..*/.stat
f800: 69 63 20 76 6f 69 64 20 67 65 6e 65 72 61 74 65  ic void generate
f810: 43 6f 6c 75 6d 6e 54 79 70 65 73 28 0a 20 20 50  ColumnTypes(.  P
f820: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
f830: 20 20 20 2f 2a 20 50 61 72 73 65 72 20 63 6f 6e     /* Parser con
f840: 74 65 78 74 20 2a 2f 0a 20 20 53 72 63 4c 69 73  text */.  SrcLis
f850: 74 20 2a 70 54 61 62 4c 69 73 74 2c 20 20 2f 2a  t *pTabList,  /*
f860: 20 4c 69 73 74 20 6f 66 20 74 61 62 6c 65 73 20   List of tables 
f870: 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
f880: 45 4c 69 73 74 20 20 20 20 2f 2a 20 45 78 70 72  EList    /* Expr
f890: 65 73 73 69 6f 6e 73 20 64 65 66 69 6e 69 6e 67  essions defining
f8a0: 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20   the result set 
f8b0: 2a 2f 0a 29 7b 0a 23 69 66 6e 64 65 66 20 53 51  */.){.#ifndef SQ
f8c0: 4c 49 54 45 5f 4f 4d 49 54 5f 44 45 43 4c 54 59  LITE_OMIT_DECLTY
f8d0: 50 45 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  PE.  Vdbe *v = p
f8e0: 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
f8f0: 69 6e 74 20 69 3b 0a 20 20 4e 61 6d 65 43 6f 6e  int i;.  NameCon
f900: 74 65 78 74 20 73 4e 43 3b 0a 20 20 73 4e 43 2e  text sNC;.  sNC.
f910: 70 53 72 63 4c 69 73 74 20 3d 20 70 54 61 62 4c  pSrcList = pTabL
f920: 69 73 74 3b 0a 20 20 73 4e 43 2e 70 50 61 72 73  ist;.  sNC.pPars
f930: 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20 73 4e  e = pParse;.  sN
f940: 43 2e 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 66  C.pNext = 0;.  f
f950: 6f 72 28 69 3d 30 3b 20 69 3c 70 45 4c 69 73 74  or(i=0; i<pEList
f960: 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20  ->nExpr; i++){. 
f970: 20 20 20 45 78 70 72 20 2a 70 20 3d 20 70 45 4c     Expr *p = pEL
f980: 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b  ist->a[i].pExpr;
f990: 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
f9a0: 2a 7a 54 79 70 65 3b 0a 23 69 66 64 65 66 20 53  *zType;.#ifdef S
f9b0: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c  QLITE_ENABLE_COL
f9c0: 55 4d 4e 5f 4d 45 54 41 44 41 54 41 0a 20 20 20  UMN_METADATA.   
f9d0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f 72   const char *zOr
f9e0: 69 67 44 62 20 3d 20 30 3b 0a 20 20 20 20 63 6f  igDb = 0;.    co
f9f0: 6e 73 74 20 63 68 61 72 20 2a 7a 4f 72 69 67 54  nst char *zOrigT
fa00: 61 62 20 3d 20 30 3b 0a 20 20 20 20 63 6f 6e 73  ab = 0;.    cons
fa10: 74 20 63 68 61 72 20 2a 7a 4f 72 69 67 43 6f 6c  t char *zOrigCol
fa20: 20 3d 20 30 3b 0a 20 20 20 20 7a 54 79 70 65 20   = 0;.    zType 
fa30: 3d 20 63 6f 6c 75 6d 6e 54 79 70 65 28 26 73 4e  = columnType(&sN
fa40: 43 2c 20 70 2c 20 26 7a 4f 72 69 67 44 62 2c 20  C, p, &zOrigDb, 
fa50: 26 7a 4f 72 69 67 54 61 62 2c 20 26 7a 4f 72 69  &zOrigTab, &zOri
fa60: 67 43 6f 6c 29 3b 0a 0a 20 20 20 20 2f 2a 20 54  gCol);..    /* T
fa70: 68 65 20 76 64 62 65 20 6d 75 73 74 20 6d 61 6b  he vdbe must mak
fa80: 65 20 69 74 73 20 6f 77 6e 20 63 6f 70 79 20 6f  e its own copy o
fa90: 66 20 74 68 65 20 63 6f 6c 75 6d 6e 2d 74 79 70  f the column-typ
faa0: 65 20 61 6e 64 20 6f 74 68 65 72 20 0a 20 20 20  e and other .   
fab0: 20 2a 2a 20 63 6f 6c 75 6d 6e 20 73 70 65 63 69   ** column speci
fac0: 66 69 63 20 73 74 72 69 6e 67 73 2c 20 69 6e 20  fic strings, in 
fad0: 63 61 73 65 20 74 68 65 20 73 63 68 65 6d 61 20  case the schema 
fae0: 69 73 20 72 65 73 65 74 20 62 65 66 6f 72 65 20  is reset before 
faf0: 74 68 69 73 0a 20 20 20 20 2a 2a 20 76 69 72 74  this.    ** virt
fb00: 75 61 6c 20 6d 61 63 68 69 6e 65 20 69 73 20 64  ual machine is d
fb10: 65 6c 65 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20  eleted..    */. 
fb20: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65     sqlite3VdbeSe
fb30: 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43  tColName(v, i, C
fb40: 4f 4c 4e 41 4d 45 5f 44 41 54 41 42 41 53 45 2c  OLNAME_DATABASE,
fb50: 20 7a 4f 72 69 67 44 62 2c 20 53 51 4c 49 54 45   zOrigDb, SQLITE
fb60: 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20  _TRANSIENT);.   
fb70: 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43   sqlite3VdbeSetC
fb80: 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c  olName(v, i, COL
fb90: 4e 41 4d 45 5f 54 41 42 4c 45 2c 20 7a 4f 72 69  NAME_TABLE, zOri
fba0: 67 54 61 62 2c 20 53 51 4c 49 54 45 5f 54 52 41  gTab, SQLITE_TRA
fbb0: 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20 73 71 6c  NSIENT);.    sql
fbc0: 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61  ite3VdbeSetColNa
fbd0: 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45  me(v, i, COLNAME
fbe0: 5f 43 4f 4c 55 4d 4e 2c 20 7a 4f 72 69 67 43 6f  _COLUMN, zOrigCo
fbf0: 6c 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49  l, SQLITE_TRANSI
fc00: 45 4e 54 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20  ENT);.#else.    
fc10: 7a 54 79 70 65 20 3d 20 63 6f 6c 75 6d 6e 54 79  zType = columnTy
fc20: 70 65 28 26 73 4e 43 2c 20 70 2c 20 30 2c 20 30  pe(&sNC, p, 0, 0
fc30: 2c 20 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  , 0);.#endif.   
fc40: 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43   sqlite3VdbeSetC
fc50: 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c  olName(v, i, COL
fc60: 4e 41 4d 45 5f 44 45 43 4c 54 59 50 45 2c 20 7a  NAME_DECLTYPE, z
fc70: 54 79 70 65 2c 20 53 51 4c 49 54 45 5f 54 52 41  Type, SQLITE_TRA
fc80: 4e 53 49 45 4e 54 29 3b 0a 20 20 7d 0a 23 65 6e  NSIENT);.  }.#en
fc90: 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28  dif /* !defined(
fca0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 45 43 4c  SQLITE_OMIT_DECL
fcb0: 54 59 50 45 29 20 2a 2f 0a 7d 0a 0a 0a 2f 2a 0a  TYPE) */.}.../*.
fcc0: 2a 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20 63  ** Compute the c
fcd0: 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 66 6f 72 20  olumn names for 
fce0: 61 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  a SELECT stateme
fcf0: 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 6e  nt..**.** The on
fd00: 6c 79 20 67 75 61 72 61 6e 74 65 65 20 74 68 61  ly guarantee tha
fd10: 74 20 53 51 4c 69 74 65 20 6d 61 6b 65 73 20 61  t SQLite makes a
fd20: 62 6f 75 74 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65  bout column name
fd30: 73 20 69 73 20 74 68 61 74 20 69 66 20 74 68 65  s is that if the
fd40: 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 68 61 73 20 61  .** column has a
fd50: 6e 20 41 53 20 63 6c 61 75 73 65 20 61 73 73 69  n AS clause assi
fd60: 67 6e 69 6e 67 20 69 74 20 61 20 6e 61 6d 65 2c  gning it a name,
fd70: 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20 74 68   that will be th
fd80: 65 20 6e 61 6d 65 20 75 73 65 64 2e 0a 2a 2a 20  e name used..** 
fd90: 54 68 61 74 20 69 73 20 74 68 65 20 6f 6e 6c 79  That is the only
fda0: 20 64 6f 63 75 6d 65 6e 74 65 64 20 67 75 61 72   documented guar
fdb0: 61 6e 74 65 65 2e 20 20 48 6f 77 65 76 65 72 2c  antee.  However,
fdc0: 20 63 6f 75 6e 74 6c 65 73 73 20 61 70 70 6c 69   countless appli
fdd0: 63 61 74 69 6f 6e 73 0a 2a 2a 20 64 65 76 65 6c  cations.** devel
fde0: 6f 70 65 64 20 6f 76 65 72 20 74 68 65 20 79 65  oped over the ye
fdf0: 61 72 73 20 68 61 76 65 20 6d 61 64 65 20 62 61  ars have made ba
fe00: 73 65 6c 65 73 73 20 61 73 73 75 6d 70 74 69 6f  seless assumptio
fe10: 6e 73 20 61 62 6f 75 74 20 63 6f 6c 75 6d 6e 20  ns about column 
fe20: 6e 61 6d 65 73 0a 2a 2a 20 61 6e 64 20 77 69 6c  names.** and wil
fe30: 6c 20 62 72 65 61 6b 20 69 66 20 74 68 6f 73 65  l break if those
fe40: 20 61 73 73 75 6d 70 74 69 6f 6e 73 20 63 68 61   assumptions cha
fe50: 6e 67 65 73 2e 20 20 48 65 6e 63 65 2c 20 75 73  nges.  Hence, us
fe60: 65 20 65 78 74 72 65 6d 65 20 63 61 75 74 69 6f  e extreme cautio
fe70: 6e 0a 2a 2a 20 77 68 65 6e 20 6d 6f 64 69 66 79  n.** when modify
fe80: 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ing this routine
fe90: 20 74 6f 20 61 76 6f 69 64 20 62 72 65 61 6b 69   to avoid breaki
fea0: 6e 67 20 6c 65 67 61 63 79 2e 0a 2a 2a 0a 2a 2a  ng legacy..**.**
feb0: 20 53 65 65 20 41 6c 73 6f 3a 20 73 71 6c 69 74   See Also: sqlit
fec0: 65 33 43 6f 6c 75 6d 6e 73 46 72 6f 6d 45 78 70  e3ColumnsFromExp
fed0: 72 4c 69 73 74 28 29 0a 2a 2a 0a 2a 2a 20 54 68  rList().**.** Th
fee0: 65 20 50 52 41 47 4d 41 20 73 68 6f 72 74 5f 63  e PRAGMA short_c
fef0: 6f 6c 75 6d 6e 5f 6e 61 6d 65 73 20 61 6e 64 20  olumn_names and 
ff00: 50 52 41 47 4d 41 20 66 75 6c 6c 5f 63 6f 6c 75  PRAGMA full_colu
ff10: 6d 6e 5f 6e 61 6d 65 73 20 73 65 74 74 69 6e 67  mn_names setting
ff20: 73 20 61 72 65 0a 2a 2a 20 64 65 70 72 65 63 61  s are.** depreca
ff30: 74 65 64 2e 20 20 54 68 65 20 64 65 66 61 75 6c  ted.  The defaul
ff40: 74 20 73 65 74 74 69 6e 67 20 69 73 20 73 68 6f  t setting is sho
ff50: 72 74 3d 4f 4e 2c 20 66 75 6c 6c 3d 4f 46 46 2e  rt=ON, full=OFF.
ff60: 20 20 39 39 2e 39 25 20 6f 66 20 61 6c 6c 0a 2a    99.9% of all.*
ff70: 2a 20 61 70 70 6c 69 63 61 74 69 6f 6e 73 20 73  * applications s
ff80: 68 6f 75 6c 64 20 6f 70 65 72 61 74 65 20 74 68  hould operate th
ff90: 69 73 20 77 61 79 2e 20 20 4e 65 76 65 72 74 68  is way.  Neverth
ffa0: 65 6c 65 73 73 2c 20 77 65 20 6e 65 65 64 20 74  eless, we need t
ffb0: 6f 20 73 75 70 70 6f 72 74 20 74 68 65 0a 2a 2a  o support the.**
ffc0: 20 6f 74 68 65 72 20 6d 6f 64 65 73 20 66 6f 72   other modes for
ffd0: 20 6c 65 67 61 63 79 3a 0a 2a 2a 0a 2a 2a 20 20   legacy:.**.**  
ffe0: 20 20 73 68 6f 72 74 3d 4f 46 46 2c 20 66 75 6c    short=OFF, ful
fff0: 6c 3d 4f 46 46 3a 20 20 20 20 20 20 43 6f 6c 75  l=OFF:      Colu
10000 6d 6e 20 6e 61 6d 65 20 69 73 20 74 68 65 20 74  mn name is the t
10010 65 78 74 20 6f 66 20 74 68 65 20 65 78 70 72 65  ext of the expre
10020 73 73 69 6f 6e 20 68 61 73 20 69 74 0a 2a 2a 20  ssion has it.** 
10030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10040 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 72 69               ori
10050 67 69 6e 61 6c 6c 79 20 61 70 70 65 61 72 73 20  ginally appears 
10060 69 6e 20 74 68 65 20 53 45 4c 45 43 54 20 73 74  in the SELECT st
10070 61 74 65 6d 65 6e 74 2e 20 20 49 6e 0a 2a 2a 20  atement.  In.** 
10080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10090 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 74 68               oth
100a0 65 72 20 77 6f 72 64 73 2c 20 74 68 65 20 7a 53  er words, the zS
100b0 70 61 6e 20 6f 66 20 74 68 65 20 72 65 73 75 6c  pan of the resul
100c0 74 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a  t expression..**
100d0 0a 2a 2a 20 20 20 20 73 68 6f 72 74 3d 4f 4e 2c  .**    short=ON,
100e0 20 66 75 6c 6c 3d 4f 46 46 3a 20 20 20 20 20 20   full=OFF:      
100f0 20 28 54 68 69 73 20 69 73 20 74 68 65 20 64 65   (This is the de
10100 66 61 75 6c 74 20 73 65 74 74 69 6e 67 29 2e 20  fault setting). 
10110 20 49 66 20 74 68 65 20 72 65 73 75 6c 74 0a 2a   If the result.*
10120 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
10130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
10140 65 66 65 72 73 20 64 69 72 65 63 74 6c 79 20 74  efers directly t
10150 6f 20 61 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e  o a table column
10160 2c 20 74 68 65 6e 20 74 68 65 0a 2a 2a 20 20 20  , then the.**   
10170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10180 20 20 20 20 20 20 20 20 20 20 20 72 65 73 75 6c             resul
10190 74 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 69 73  t column name is
101a0 20 6a 75 73 74 20 74 68 65 20 74 61 62 6c 65 20   just the table 
101b0 63 6f 6c 75 6d 6e 0a 2a 2a 20 20 20 20 20 20 20  column.**       
101c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
101d0 20 20 20 20 20 20 20 6e 61 6d 65 3a 20 43 4f 4c         name: COL
101e0 55 4d 4e 2e 20 20 4f 74 68 65 72 77 69 73 65 20  UMN.  Otherwise 
101f0 75 73 65 20 7a 53 70 61 6e 2e 0a 2a 2a 0a 2a 2a  use zSpan..**.**
10200 20 20 20 20 66 75 6c 6c 3d 4f 4e 2c 20 73 68 6f      full=ON, sho
10210 72 74 3d 41 4e 59 3a 20 20 20 20 20 20 20 49 66  rt=ANY:       If
10220 20 74 68 65 20 72 65 73 75 6c 74 20 72 65 66 65   the result refe
10230 72 73 20 64 69 72 65 63 74 6c 79 20 74 6f 20 61  rs directly to a
10240 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 2c 0a 2a   table column,.*
10250 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
10260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74                 t
10270 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74 20 63  hen the result c
10280 6f 6c 75 6d 6e 20 6e 61 6d 65 20 77 69 74 68 20  olumn name with 
10290 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 0a 2a  the table name.*
102a0 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
102b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
102c0 72 65 66 69 78 2c 20 65 78 3a 20 54 41 42 4c 45  refix, ex: TABLE
102d0 2e 43 4f 4c 55 4d 4e 2e 20 20 4f 74 68 65 72 77  .COLUMN.  Otherw
102e0 69 73 65 20 75 73 65 20 7a 53 70 61 6e 2e 0a 2a  ise use zSpan..*
102f0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 67 65  /.static void ge
10300 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65  nerateColumnName
10310 73 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  s(.  Parse *pPar
10320 73 65 2c 20 20 20 20 20 20 2f 2a 20 50 61 72 73  se,      /* Pars
10330 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  er context */.  
10340 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 20  Select *pSelect 
10350 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20      /* Generate 
10360 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 66 6f 72  column names for
10370 20 74 68 69 73 20 53 45 4c 45 43 54 20 73 74 61   this SELECT sta
10380 74 65 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 56  tement */.){.  V
10390 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
103a0 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b  >pVdbe;.  int i;
103b0 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a  .  Table *pTab;.
103c0 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c    SrcList *pTabL
103d0 69 73 74 3b 0a 20 20 45 78 70 72 4c 69 73 74 20  ist;.  ExprList 
103e0 2a 70 45 4c 69 73 74 3b 0a 20 20 73 71 6c 69 74  *pEList;.  sqlit
103f0 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
10400 3e 64 62 3b 0a 20 20 69 6e 74 20 66 75 6c 6c 4e  >db;.  int fullN
10410 61 6d 65 3b 20 20 20 20 2f 2a 20 54 41 42 4c 45  ame;    /* TABLE
10420 2e 43 4f 4c 55 4d 4e 20 69 66 20 6e 6f 20 41 53  .COLUMN if no AS
10430 20 63 6c 61 75 73 65 20 61 6e 64 20 69 73 20 61   clause and is a
10440 20 64 69 72 65 63 74 20 74 61 62 6c 65 20 72 65   direct table re
10450 66 20 2a 2f 0a 20 20 69 6e 74 20 73 72 63 4e 61  f */.  int srcNa
10460 6d 65 3b 20 20 20 20 20 2f 2a 20 43 4f 4c 55 4d  me;     /* COLUM
10470 4e 20 6f 72 20 54 41 42 4c 45 2e 43 4f 4c 55 4d  N or TABLE.COLUM
10480 4e 20 69 66 20 6e 6f 20 41 53 20 63 6c 61 75 73  N if no AS claus
10490 65 20 61 6e 64 20 69 73 20 64 69 72 65 63 74 20  e and is direct 
104a0 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  */..#ifndef SQLI
104b0 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a  TE_OMIT_EXPLAIN.
104c0 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20    /* If this is 
104d0 61 6e 20 45 58 50 4c 41 49 4e 2c 20 73 6b 69 70  an EXPLAIN, skip
104e0 20 74 68 69 73 20 73 74 65 70 20 2a 2f 0a 20 20   this step */.  
104f0 69 66 28 20 70 50 61 72 73 65 2d 3e 65 78 70 6c  if( pParse->expl
10500 61 69 6e 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ain ){.    retur
10510 6e 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  n;.  }.#endif.. 
10520 20 69 66 28 20 70 50 61 72 73 65 2d 3e 63 6f 6c   if( pParse->col
10530 4e 61 6d 65 73 53 65 74 20 29 20 72 65 74 75 72  NamesSet ) retur
10540 6e 3b 0a 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 6e  n;.  /* Column n
10550 61 6d 65 73 20 61 72 65 20 64 65 74 65 72 6d 69  ames are determi
10560 6e 65 64 20 62 79 20 74 68 65 20 6c 65 66 74 2d  ned by the left-
10570 6d 6f 73 74 20 74 65 72 6d 20 6f 66 20 61 20 63  most term of a c
10580 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 20 2a  ompound select *
10590 2f 0a 20 20 77 68 69 6c 65 28 20 70 53 65 6c 65  /.  while( pSele
105a0 63 74 2d 3e 70 50 72 69 6f 72 20 29 20 70 53 65  ct->pPrior ) pSe
105b0 6c 65 63 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e  lect = pSelect->
105c0 70 50 72 69 6f 72 3b 0a 20 20 53 45 4c 45 43 54  pPrior;.  SELECT
105d0 54 52 41 43 45 28 31 2c 70 50 61 72 73 65 2c 70  TRACE(1,pParse,p
105e0 53 65 6c 65 63 74 2c 28 22 67 65 6e 65 72 61 74  Select,("generat
105f0 69 6e 67 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73  ing column names
10600 5c 6e 22 29 29 3b 0a 20 20 70 54 61 62 4c 69 73  \n"));.  pTabLis
10610 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70 53 72  t = pSelect->pSr
10620 63 3b 0a 20 20 70 45 4c 69 73 74 20 3d 20 70 53  c;.  pEList = pS
10630 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 3b 0a 20  elect->pEList;. 
10640 20 61 73 73 65 72 74 28 20 76 21 3d 30 20 29 3b   assert( v!=0 );
10650 0a 20 20 61 73 73 65 72 74 28 20 70 54 61 62 4c  .  assert( pTabL
10660 69 73 74 21 3d 30 20 29 3b 0a 20 20 70 50 61 72  ist!=0 );.  pPar
10670 73 65 2d 3e 63 6f 6c 4e 61 6d 65 73 53 65 74 20  se->colNamesSet 
10680 3d 20 31 3b 0a 20 20 66 75 6c 6c 4e 61 6d 65 20  = 1;.  fullName 
10690 3d 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20 53  = (db->flags & S
106a0 51 4c 49 54 45 5f 46 75 6c 6c 43 6f 6c 4e 61 6d  QLITE_FullColNam
106b0 65 73 29 21 3d 30 3b 0a 20 20 73 72 63 4e 61 6d  es)!=0;.  srcNam
106c0 65 20 3d 20 28 64 62 2d 3e 66 6c 61 67 73 20 26  e = (db->flags &
106d0 20 53 51 4c 49 54 45 5f 53 68 6f 72 74 43 6f 6c   SQLITE_ShortCol
106e0 4e 61 6d 65 73 29 21 3d 30 20 7c 7c 20 66 75 6c  Names)!=0 || ful
106f0 6c 4e 61 6d 65 3b 0a 20 20 73 71 6c 69 74 65 33  lName;.  sqlite3
10700 56 64 62 65 53 65 74 4e 75 6d 43 6f 6c 73 28 76  VdbeSetNumCols(v
10710 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29  , pEList->nExpr)
10720 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
10730 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b  EList->nExpr; i+
10740 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 20  +){.    Expr *p 
10750 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70  = pEList->a[i].p
10760 45 78 70 72 3b 0a 0a 20 20 20 20 61 73 73 65 72  Expr;..    asser
10770 74 28 20 70 21 3d 30 20 29 3b 0a 20 20 20 20 61  t( p!=0 );.    a
10780 73 73 65 72 74 28 20 70 2d 3e 6f 70 21 3d 54 4b  ssert( p->op!=TK
10790 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 29 3b 20 20  _AGG_COLUMN );  
107a0 2f 2a 20 41 67 67 20 70 72 6f 63 65 73 73 69 6e  /* Agg processin
107b0 67 20 68 61 73 20 6e 6f 74 20 72 75 6e 20 79 65  g has not run ye
107c0 74 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28  t */.    assert(
107d0 20 70 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d   p->op!=TK_COLUM
107e0 4e 20 7c 7c 20 70 2d 3e 79 2e 70 54 61 62 21 3d  N || p->y.pTab!=
107f0 30 20 29 3b 20 2f 2a 20 43 6f 76 65 72 69 6e 67  0 ); /* Covering
10800 20 69 64 78 20 6e 6f 74 20 79 65 74 20 63 6f 64   idx not yet cod
10810 65 64 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 45  ed */.    if( pE
10820 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65  List->a[i].zName
10830 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 6e 20   ){.      /* An 
10840 41 53 20 63 6c 61 75 73 65 20 61 6c 77 61 79 73  AS clause always
10850 20 74 61 6b 65 73 20 66 69 72 73 74 20 70 72 69   takes first pri
10860 6f 72 69 74 79 20 2a 2f 0a 20 20 20 20 20 20 63  ority */.      c
10870 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 70 45 4c  har *zName = pEL
10880 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 3b  ist->a[i].zName;
10890 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
108a0 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20  beSetColName(v, 
108b0 69 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c  i, COLNAME_NAME,
108c0 20 7a 4e 61 6d 65 2c 20 53 51 4c 49 54 45 5f 54   zName, SQLITE_T
108d0 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20 7d  RANSIENT);.    }
108e0 65 6c 73 65 20 69 66 28 20 73 72 63 4e 61 6d 65  else if( srcName
108f0 20 26 26 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f   && p->op==TK_CO
10900 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 20 20 63 68  LUMN ){.      ch
10910 61 72 20 2a 7a 43 6f 6c 3b 0a 20 20 20 20 20 20  ar *zCol;.      
10920 69 6e 74 20 69 43 6f 6c 20 3d 20 70 2d 3e 69 43  int iCol = p->iC
10930 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 70 54 61  olumn;.      pTa
10940 62 20 3d 20 70 2d 3e 79 2e 70 54 61 62 3b 0a 20  b = p->y.pTab;. 
10950 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54 61       assert( pTa
10960 62 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66  b!=0 );.      if
10970 28 20 69 43 6f 6c 3c 30 20 29 20 69 43 6f 6c 20  ( iCol<0 ) iCol 
10980 3d 20 70 54 61 62 2d 3e 69 50 4b 65 79 3b 0a 20  = pTab->iPKey;. 
10990 20 20 20 20 20 61 73 73 65 72 74 28 20 69 43 6f       assert( iCo
109a0 6c 3d 3d 2d 31 20 7c 7c 20 28 69 43 6f 6c 3e 3d  l==-1 || (iCol>=
109b0 30 20 26 26 20 69 43 6f 6c 3c 70 54 61 62 2d 3e  0 && iCol<pTab->
109c0 6e 43 6f 6c 29 20 29 3b 0a 20 20 20 20 20 20 69  nCol) );.      i
109d0 66 28 20 69 43 6f 6c 3c 30 20 29 7b 0a 20 20 20  f( iCol<0 ){.   
109e0 20 20 20 20 20 7a 43 6f 6c 20 3d 20 22 72 6f 77       zCol = "row
109f0 69 64 22 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  id";.      }else
10a00 7b 0a 20 20 20 20 20 20 20 20 7a 43 6f 6c 20 3d  {.        zCol =
10a10 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c   pTab->aCol[iCol
10a20 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 7d  ].zName;.      }
10a30 0a 20 20 20 20 20 20 69 66 28 20 66 75 6c 6c 4e  .      if( fullN
10a40 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 20 20 63  ame ){.        c
10a50 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 30 3b 0a  har *zName = 0;.
10a60 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20          zName = 
10a70 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64  sqlite3MPrintf(d
10a80 62 2c 20 22 25 73 2e 25 73 22 2c 20 70 54 61 62  b, "%s.%s", pTab
10a90 2d 3e 7a 4e 61 6d 65 2c 20 7a 43 6f 6c 29 3b 0a  ->zName, zCol);.
10aa0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
10ab0 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c  dbeSetColName(v,
10ac0 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45   i, COLNAME_NAME
10ad0 2c 20 7a 4e 61 6d 65 2c 20 53 51 4c 49 54 45 5f  , zName, SQLITE_
10ae0 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 20 20  DYNAMIC);.      
10af0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
10b00 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c  qlite3VdbeSetCol
10b10 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41  Name(v, i, COLNA
10b20 4d 45 5f 4e 41 4d 45 2c 20 7a 43 6f 6c 2c 20 53  ME_NAME, zCol, S
10b30 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29  QLITE_TRANSIENT)
10b40 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
10b50 6c 73 65 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74  lse{.      const
10b60 20 63 68 61 72 20 2a 7a 20 3d 20 70 45 4c 69 73   char *z = pELis
10b70 74 2d 3e 61 5b 69 5d 2e 7a 53 70 61 6e 3b 0a 20  t->a[i].zSpan;. 
10b80 20 20 20 20 20 7a 20 3d 20 7a 3d 3d 30 20 3f 20       z = z==0 ? 
10b90 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64  sqlite3MPrintf(d
10ba0 62 2c 20 22 63 6f 6c 75 6d 6e 25 64 22 2c 20 69  b, "column%d", i
10bb0 2b 31 29 20 3a 20 73 71 6c 69 74 65 33 44 62 53  +1) : sqlite3DbS
10bc0 74 72 44 75 70 28 64 62 2c 20 7a 29 3b 0a 20 20  trDup(db, z);.  
10bd0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53      sqlite3VdbeS
10be0 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20  etColName(v, i, 
10bf0 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20 7a 2c  COLNAME_NAME, z,
10c00 20 53 51 4c 49 54 45 5f 44 59 4e 41 4d 49 43 29   SQLITE_DYNAMIC)
10c10 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 67 65  ;.    }.  }.  ge
10c20 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 54 79 70 65  nerateColumnType
10c30 73 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69  s(pParse, pTabLi
10c40 73 74 2c 20 70 45 4c 69 73 74 29 3b 0a 7d 0a 0a  st, pEList);.}..
10c50 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 6e 20 65  /*.** Given an e
10c60 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 20 28  xpression list (
10c70 77 68 69 63 68 20 69 73 20 72 65 61 6c 6c 79 20  which is really 
10c80 74 68 65 20 6c 69 73 74 20 6f 66 20 65 78 70 72  the list of expr
10c90 65 73 73 69 6f 6e 73 0a 2a 2a 20 74 68 61 74 20  essions.** that 
10ca0 66 6f 72 6d 20 74 68 65 20 72 65 73 75 6c 74 20  form the result 
10cb0 73 65 74 20 6f 66 20 61 20 53 45 4c 45 43 54 20  set of a SELECT 
10cc0 73 74 61 74 65 6d 65 6e 74 29 20 63 6f 6d 70 75  statement) compu
10cd0 74 65 20 61 70 70 72 6f 70 72 69 61 74 65 0a 2a  te appropriate.*
10ce0 2a 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 66  * column names f
10cf0 6f 72 20 61 20 74 61 62 6c 65 20 74 68 61 74 20  or a table that 
10d00 77 6f 75 6c 64 20 68 6f 6c 64 20 74 68 65 20 65  would hold the e
10d10 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e 0a  xpression list..
10d20 2a 2a 0a 2a 2a 20 41 6c 6c 20 63 6f 6c 75 6d 6e  **.** All column
10d30 20 6e 61 6d 65 73 20 77 69 6c 6c 20 62 65 20 75   names will be u
10d40 6e 69 71 75 65 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c  nique..**.** Onl
10d50 79 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d  y the column nam
10d60 65 73 20 61 72 65 20 63 6f 6d 70 75 74 65 64 2e  es are computed.
10d70 20 20 43 6f 6c 75 6d 6e 2e 7a 54 79 70 65 2c 20    Column.zType, 
10d80 43 6f 6c 75 6d 6e 2e 7a 43 6f 6c 6c 2c 0a 2a 2a  Column.zColl,.**
10d90 20 61 6e 64 20 6f 74 68 65 72 20 66 69 65 6c 64   and other field
10da0 73 20 6f 66 20 43 6f 6c 75 6d 6e 20 61 72 65 20  s of Column are 
10db0 7a 65 72 6f 65 64 2e 0a 2a 2a 0a 2a 2a 20 52 65  zeroed..**.** Re
10dc0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f  turn SQLITE_OK o
10dd0 6e 20 73 75 63 63 65 73 73 2e 20 20 49 66 20 61  n success.  If a
10de0 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69   memory allocati
10df0 6f 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  on error occurs,
10e00 0a 2a 2a 20 73 74 6f 72 65 20 4e 55 4c 4c 20 69  .** store NULL i
10e10 6e 20 2a 70 61 43 6f 6c 20 61 6e 64 20 30 20 69  n *paCol and 0 i
10e20 6e 20 2a 70 6e 43 6f 6c 20 61 6e 64 20 72 65 74  n *pnCol and ret
10e30 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
10e40 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 6e 6c 79  ..**.** The only
10e50 20 67 75 61 72 61 6e 74 65 65 20 74 68 61 74 20   guarantee that 
10e60 53 51 4c 69 74 65 20 6d 61 6b 65 73 20 61 62 6f  SQLite makes abo
10e70 75 74 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20  ut column names 
10e80 69 73 20 74 68 61 74 20 69 66 20 74 68 65 0a 2a  is that if the.*
10e90 2a 20 63 6f 6c 75 6d 6e 20 68 61 73 20 61 6e 20  * column has an 
10ea0 41 53 20 63 6c 61 75 73 65 20 61 73 73 69 67 6e  AS clause assign
10eb0 69 6e 67 20 69 74 20 61 20 6e 61 6d 65 2c 20 74  ing it a name, t
10ec0 68 61 74 20 77 69 6c 6c 20 62 65 20 74 68 65 20  hat will be the 
10ed0 6e 61 6d 65 20 75 73 65 64 2e 0a 2a 2a 20 54 68  name used..** Th
10ee0 61 74 20 69 73 20 74 68 65 20 6f 6e 6c 79 20 64  at is the only d
10ef0 6f 63 75 6d 65 6e 74 65 64 20 67 75 61 72 61 6e  ocumented guaran
10f00 74 65 65 2e 20 20 48 6f 77 65 76 65 72 2c 20 63  tee.  However, c
10f10 6f 75 6e 74 6c 65 73 73 20 61 70 70 6c 69 63 61  ountless applica
10f20 74 69 6f 6e 73 0a 2a 2a 20 64 65 76 65 6c 6f 70  tions.** develop
10f30 65 64 20 6f 76 65 72 20 74 68 65 20 79 65 61 72  ed over the year
10f40 73 20 68 61 76 65 20 6d 61 64 65 20 62 61 73 65  s have made base
10f50 6c 65 73 73 20 61 73 73 75 6d 70 74 69 6f 6e 73  less assumptions
10f60 20 61 62 6f 75 74 20 63 6f 6c 75 6d 6e 20 6e 61   about column na
10f70 6d 65 73 0a 2a 2a 20 61 6e 64 20 77 69 6c 6c 20  mes.** and will 
10f80 62 72 65 61 6b 20 69 66 20 74 68 6f 73 65 20 61  break if those a
10f90 73 73 75 6d 70 74 69 6f 6e 73 20 63 68 61 6e 67  ssumptions chang
10fa0 65 73 2e 20 20 48 65 6e 63 65 2c 20 75 73 65 20  es.  Hence, use 
10fb0 65 78 74 72 65 6d 65 20 63 61 75 74 69 6f 6e 0a  extreme caution.
10fc0 2a 2a 20 77 68 65 6e 20 6d 6f 64 69 66 79 69 6e  ** when modifyin
10fd0 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 74  g this routine t
10fe0 6f 20 61 76 6f 69 64 20 62 72 65 61 6b 69 6e 67  o avoid breaking
10ff0 20 6c 65 67 61 63 79 2e 0a 2a 2a 0a 2a 2a 20 53   legacy..**.** S
11000 65 65 20 41 6c 73 6f 3a 20 67 65 6e 65 72 61 74  ee Also: generat
11010 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 29 0a 2a  eColumnNames().*
11020 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 43 6f 6c  /.int sqlite3Col
11030 75 6d 6e 73 46 72 6f 6d 45 78 70 72 4c 69 73 74  umnsFromExprList
11040 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
11050 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50  e,          /* P
11060 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
11070 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45  /.  ExprList *pE
11080 4c 69 73 74 2c 20 20 20 20 20 20 20 2f 2a 20 45  List,       /* E
11090 78 70 72 20 6c 69 73 74 20 66 72 6f 6d 20 77 68  xpr list from wh
110a0 69 63 68 20 74 6f 20 64 65 72 69 76 65 20 63 6f  ich to derive co
110b0 6c 75 6d 6e 20 6e 61 6d 65 73 20 2a 2f 0a 20 20  lumn names */.  
110c0 69 31 36 20 2a 70 6e 43 6f 6c 2c 20 20 20 20 20  i16 *pnCol,     
110d0 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65          /* Write
110e0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63   the number of c
110f0 6f 6c 75 6d 6e 73 20 68 65 72 65 20 2a 2f 0a 20  olumns here */. 
11100 20 43 6f 6c 75 6d 6e 20 2a 2a 70 61 43 6f 6c 20   Column **paCol 
11110 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74           /* Writ
11120 65 20 74 68 65 20 6e 65 77 20 63 6f 6c 75 6d 6e  e the new column
11130 20 6c 69 73 74 20 68 65 72 65 20 2a 2f 0a 29 7b   list here */.){
11140 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
11150 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 20 2f   pParse->db;   /
11160 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  * Database conne
11170 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 69  ction */.  int i
11180 2c 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20  , j;            
11190 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
111a0 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 75 33 32  ounters */.  u32
111b0 20 63 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20   cnt;           
111c0 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
111d0 78 20 61 64 64 65 64 20 74 6f 20 6d 61 6b 65 20  x added to make 
111e0 74 68 65 20 6e 61 6d 65 20 75 6e 69 71 75 65 20  the name unique 
111f0 2a 2f 0a 20 20 43 6f 6c 75 6d 6e 20 2a 61 43 6f  */.  Column *aCo
11200 6c 2c 20 2a 70 43 6f 6c 3b 20 20 20 20 20 20 20  l, *pCol;       
11210 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20   /* For looping 
11220 6f 76 65 72 20 72 65 73 75 6c 74 20 63 6f 6c 75  over result colu
11230 6d 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f  mns */.  int nCo
11240 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
11250 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
11260 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65  f columns in the
11270 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 20   result set */. 
11280 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 20 20 20   char *zName;   
11290 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
112a0 43 6f 6c 75 6d 6e 20 6e 61 6d 65 20 2a 2f 0a 20  Column name */. 
112b0 20 69 6e 74 20 6e 4e 61 6d 65 3b 20 20 20 20 20   int nName;     
112c0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
112d0 53 69 7a 65 20 6f 66 20 6e 61 6d 65 20 69 6e 20  Size of name in 
112e0 7a 4e 61 6d 65 5b 5d 20 2a 2f 0a 20 20 48 61 73  zName[] */.  Has
112f0 68 20 68 74 3b 20 20 20 20 20 20 20 20 20 20 20  h ht;           
11300 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61 73 68           /* Hash
11310 20 74 61 62 6c 65 20 6f 66 20 63 6f 6c 75 6d 6e   table of column
11320 20 6e 61 6d 65 73 20 2a 2f 0a 0a 20 20 73 71 6c   names */..  sql
11330 69 74 65 33 48 61 73 68 49 6e 69 74 28 26 68 74  ite3HashInit(&ht
11340 29 3b 0a 20 20 69 66 28 20 70 45 4c 69 73 74 20  );.  if( pEList 
11350 29 7b 0a 20 20 20 20 6e 43 6f 6c 20 3d 20 70 45  ){.    nCol = pE
11360 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 20  List->nExpr;.   
11370 20 61 43 6f 6c 20 3d 20 73 71 6c 69 74 65 33 44   aCol = sqlite3D
11380 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20  bMallocZero(db, 
11390 73 69 7a 65 6f 66 28 61 43 6f 6c 5b 30 5d 29 2a  sizeof(aCol[0])*
113a0 6e 43 6f 6c 29 3b 0a 20 20 20 20 74 65 73 74 63  nCol);.    testc
113b0 61 73 65 28 20 61 43 6f 6c 3d 3d 30 20 29 3b 0a  ase( aCol==0 );.
113c0 20 20 20 20 69 66 28 20 6e 43 6f 6c 3e 33 32 37      if( nCol>327
113d0 36 37 20 29 20 6e 43 6f 6c 20 3d 20 33 32 37 36  67 ) nCol = 3276
113e0 37 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  7;.  }else{.    
113f0 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 61 43  nCol = 0;.    aC
11400 6f 6c 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 61 73  ol = 0;.  }.  as
11410 73 65 72 74 28 20 6e 43 6f 6c 3d 3d 28 69 31 36  sert( nCol==(i16
11420 29 6e 43 6f 6c 20 29 3b 0a 20 20 2a 70 6e 43 6f  )nCol );.  *pnCo
11430 6c 20 3d 20 6e 43 6f 6c 3b 0a 20 20 2a 70 61 43  l = nCol;.  *paC
11440 6f 6c 20 3d 20 61 43 6f 6c 3b 0a 0a 20 20 66 6f  ol = aCol;..  fo
11450 72 28 69 3d 30 2c 20 70 43 6f 6c 3d 61 43 6f 6c  r(i=0, pCol=aCol
11460 3b 20 69 3c 6e 43 6f 6c 20 26 26 20 21 64 62 2d  ; i<nCol && !db-
11470 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 3b 20 69  >mallocFailed; i
11480 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20  ++, pCol++){.   
11490 20 2f 2a 20 47 65 74 20 61 6e 20 61 70 70 72 6f   /* Get an appro
114a0 70 72 69 61 74 65 20 6e 61 6d 65 20 66 6f 72 20  priate name for 
114b0 74 68 65 20 63 6f 6c 75 6d 6e 0a 20 20 20 20 2a  the column.    *
114c0 2f 0a 20 20 20 20 69 66 28 20 28 7a 4e 61 6d 65  /.    if( (zName
114d0 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e   = pEList->a[i].
114e0 7a 4e 61 6d 65 29 21 3d 30 20 29 7b 0a 20 20 20  zName)!=0 ){.   
114f0 20 20 20 2f 2a 20 49 66 20 74 68 65 20 63 6f 6c     /* If the col
11500 75 6d 6e 20 63 6f 6e 74 61 69 6e 73 20 61 6e 20  umn contains an 
11510 22 41 53 20 3c 6e 61 6d 65 3e 22 20 70 68 72 61  "AS <name>" phra
11520 73 65 2c 20 75 73 65 20 3c 6e 61 6d 65 3e 20 61  se, use <name> a
11530 73 20 74 68 65 20 6e 61 6d 65 20 2a 2f 0a 20 20  s the name */.  
11540 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 45    }else{.      E
11550 78 70 72 20 2a 70 43 6f 6c 45 78 70 72 20 3d 20  xpr *pColExpr = 
11560 73 71 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43  sqlite3ExprSkipC
11570 6f 6c 6c 61 74 65 28 70 45 4c 69 73 74 2d 3e 61  ollate(pEList->a
11580 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20  [i].pExpr);.    
11590 20 20 77 68 69 6c 65 28 20 70 43 6f 6c 45 78 70    while( pColExp
115a0 72 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f 54 20 29 7b  r->op==TK_DOT ){
115b0 0a 20 20 20 20 20 20 20 20 70 43 6f 6c 45 78 70  .        pColExp
115c0 72 20 3d 20 70 43 6f 6c 45 78 70 72 2d 3e 70 52  r = pColExpr->pR
115d0 69 67 68 74 3b 0a 20 20 20 20 20 20 20 20 61 73  ight;.        as
115e0 73 65 72 74 28 20 70 43 6f 6c 45 78 70 72 21 3d  sert( pColExpr!=
115f0 30 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  0 );.      }.   
11600 20 20 20 61 73 73 65 72 74 28 20 70 43 6f 6c 45     assert( pColE
11610 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 41 47 47 5f  xpr->op!=TK_AGG_
11620 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20  COLUMN );.      
11630 69 66 28 20 70 43 6f 6c 45 78 70 72 2d 3e 6f 70  if( pColExpr->op
11640 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20  ==TK_COLUMN ){. 
11650 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 63 6f         /* For co
11660 6c 75 6d 6e 73 20 75 73 65 20 74 68 65 20 63 6f  lumns use the co
11670 6c 75 6d 6e 20 6e 61 6d 65 20 6e 61 6d 65 20 2a  lumn name name *
11680 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 43  /.        int iC
11690 6f 6c 20 3d 20 70 43 6f 6c 45 78 70 72 2d 3e 69  ol = pColExpr->i
116a0 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 20 20  Column;.        
116b0 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 43  Table *pTab = pC
116c0 6f 6c 45 78 70 72 2d 3e 79 2e 70 54 61 62 3b 0a  olExpr->y.pTab;.
116d0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
116e0 70 54 61 62 21 3d 30 20 29 3b 0a 20 20 20 20 20  pTab!=0 );.     
116f0 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 29 20     if( iCol<0 ) 
11700 69 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 69 50 4b  iCol = pTab->iPK
11710 65 79 3b 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d  ey;.        zNam
11720 65 20 3d 20 69 43 6f 6c 3e 3d 30 20 3f 20 70 54  e = iCol>=0 ? pT
11730 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a  ab->aCol[iCol].z
11740 4e 61 6d 65 20 3a 20 22 72 6f 77 69 64 22 3b 0a  Name : "rowid";.
11750 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
11760 70 43 6f 6c 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  pColExpr->op==TK
11770 5f 49 44 20 29 7b 0a 20 20 20 20 20 20 20 20 61  _ID ){.        a
11780 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50  ssert( !ExprHasP
11790 72 6f 70 65 72 74 79 28 70 43 6f 6c 45 78 70 72  roperty(pColExpr
117a0 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29  , EP_IntValue) )
117b0 3b 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20  ;.        zName 
117c0 3d 20 70 43 6f 6c 45 78 70 72 2d 3e 75 2e 7a 54  = pColExpr->u.zT
117d0 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 7d 65 6c 73  oken;.      }els
117e0 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 55 73  e{.        /* Us
117f0 65 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 74  e the original t
11800 65 78 74 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d  ext of the colum
11810 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 61 73 20  n expression as 
11820 69 74 73 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20  its name */.    
11830 20 20 20 20 7a 4e 61 6d 65 20 3d 20 70 45 4c 69      zName = pELi
11840 73 74 2d 3e 61 5b 69 5d 2e 7a 53 70 61 6e 3b 0a  st->a[i].zSpan;.
11850 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
11860 20 20 69 66 28 20 7a 4e 61 6d 65 20 29 7b 0a 20    if( zName ){. 
11870 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c       zName = sql
11880 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c  ite3DbStrDup(db,
11890 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 65 6c   zName);.    }el
118a0 73 65 7b 0a 20 20 20 20 20 20 7a 4e 61 6d 65 20  se{.      zName 
118b0 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66  = sqlite3MPrintf
118c0 28 64 62 2c 22 63 6f 6c 75 6d 6e 25 64 22 2c 69  (db,"column%d",i
118d0 2b 31 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  +1);.    }..    
118e0 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65  /* Make sure the
118f0 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 69 73 20   column name is 
11900 75 6e 69 71 75 65 2e 20 20 49 66 20 74 68 65 20  unique.  If the 
11910 6e 61 6d 65 20 69 73 20 6e 6f 74 20 75 6e 69 71  name is not uniq
11920 75 65 2c 0a 20 20 20 20 2a 2a 20 61 70 70 65 6e  ue,.    ** appen
11930 64 20 61 6e 20 69 6e 74 65 67 65 72 20 74 6f 20  d an integer to 
11940 74 68 65 20 6e 61 6d 65 20 73 6f 20 74 68 61 74  the name so that
11950 20 69 74 20 62 65 63 6f 6d 65 73 20 75 6e 69 71   it becomes uniq
11960 75 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63  ue..    */.    c
11970 6e 74 20 3d 20 30 3b 0a 20 20 20 20 77 68 69 6c  nt = 0;.    whil
11980 65 28 20 7a 4e 61 6d 65 20 26 26 20 73 71 6c 69  e( zName && sqli
11990 74 65 33 48 61 73 68 46 69 6e 64 28 26 68 74 2c  te3HashFind(&ht,
119a0 20 7a 4e 61 6d 65 29 21 3d 30 20 29 7b 0a 20 20   zName)!=0 ){.  
119b0 20 20 20 20 6e 4e 61 6d 65 20 3d 20 73 71 6c 69      nName = sqli
119c0 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 4e 61 6d  te3Strlen30(zNam
119d0 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 4e  e);.      if( nN
119e0 61 6d 65 3e 30 20 29 7b 0a 20 20 20 20 20 20 20  ame>0 ){.       
119f0 20 66 6f 72 28 6a 3d 6e 4e 61 6d 65 2d 31 3b 20   for(j=nName-1; 
11a00 6a 3e 30 20 26 26 20 73 71 6c 69 74 65 33 49 73  j>0 && sqlite3Is
11a10 64 69 67 69 74 28 7a 4e 61 6d 65 5b 6a 5d 29 3b  digit(zName[j]);
11a20 20 6a 2d 2d 29 7b 7d 0a 20 20 20 20 20 20 20 20   j--){}.        
11a30 69 66 28 20 7a 4e 61 6d 65 5b 6a 5d 3d 3d 27 3a  if( zName[j]==':
11a40 27 20 29 20 6e 4e 61 6d 65 20 3d 20 6a 3b 0a 20  ' ) nName = j;. 
11a50 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 4e 61       }.      zNa
11a60 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69  me = sqlite3MPri
11a70 6e 74 66 28 64 62 2c 20 22 25 2e 2a 7a 3a 25 75  ntf(db, "%.*z:%u
11a80 22 2c 20 6e 4e 61 6d 65 2c 20 7a 4e 61 6d 65 2c  ", nName, zName,
11a90 20 2b 2b 63 6e 74 29 3b 0a 20 20 20 20 20 20 69   ++cnt);.      i
11aa0 66 28 20 63 6e 74 3e 33 20 29 20 73 71 6c 69 74  f( cnt>3 ) sqlit
11ab0 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 73 69  e3_randomness(si
11ac0 7a 65 6f 66 28 63 6e 74 29 2c 20 26 63 6e 74 29  zeof(cnt), &cnt)
11ad0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 43 6f 6c  ;.    }.    pCol
11ae0 2d 3e 7a 4e 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b  ->zName = zName;
11af0 0a 20 20 20 20 73 71 6c 69 74 65 33 43 6f 6c 75  .    sqlite3Colu
11b00 6d 6e 50 72 6f 70 65 72 74 69 65 73 46 72 6f 6d  mnPropertiesFrom
11b10 4e 61 6d 65 28 30 2c 20 70 43 6f 6c 29 3b 0a 20  Name(0, pCol);. 
11b20 20 20 20 69 66 28 20 7a 4e 61 6d 65 20 26 26 20     if( zName && 
11b30 73 71 6c 69 74 65 33 48 61 73 68 49 6e 73 65 72  sqlite3HashInser
11b40 74 28 26 68 74 2c 20 7a 4e 61 6d 65 2c 20 70 43  t(&ht, zName, pC
11b50 6f 6c 29 3d 3d 70 43 6f 6c 20 29 7b 0a 20 20 20  ol)==pCol ){.   
11b60 20 20 20 73 71 6c 69 74 65 33 4f 6f 6d 46 61 75     sqlite3OomFau
11b70 6c 74 28 64 62 29 3b 0a 20 20 20 20 7d 0a 20 20  lt(db);.    }.  
11b80 7d 0a 20 20 73 71 6c 69 74 65 33 48 61 73 68 43  }.  sqlite3HashC
11b90 6c 65 61 72 28 26 68 74 29 3b 0a 20 20 69 66 28  lear(&ht);.  if(
11ba0 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
11bb0 64 20 29 7b 0a 20 20 20 20 66 6f 72 28 6a 3d 30  d ){.    for(j=0
11bc0 3b 20 6a 3c 69 3b 20 6a 2b 2b 29 7b 0a 20 20 20  ; j<i; j++){.   
11bd0 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
11be0 28 64 62 2c 20 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61  (db, aCol[j].zNa
11bf0 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  me);.    }.    s
11c00 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
11c10 20 61 43 6f 6c 29 3b 0a 20 20 20 20 2a 70 61 43   aCol);.    *paC
11c20 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 2a 70 6e 43  ol = 0;.    *pnC
11c30 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 72 65 74 75  ol = 0;.    retu
11c40 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f  rn SQLITE_NOMEM_
11c50 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 72 65 74 75  BKPT;.  }.  retu
11c60 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
11c70 0a 2f 2a 0a 2a 2a 20 41 64 64 20 74 79 70 65 20  ./*.** Add type 
11c80 61 6e 64 20 63 6f 6c 6c 61 74 69 6f 6e 20 69 6e  and collation in
11c90 66 6f 72 6d 61 74 69 6f 6e 20 74 6f 20 61 20 63  formation to a c
11ca0 6f 6c 75 6d 6e 20 6c 69 73 74 20 62 61 73 65 64  olumn list based
11cb0 20 6f 6e 0a 2a 2a 20 61 20 53 45 4c 45 43 54 20   on.** a SELECT 
11cc0 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 0a 2a  statement..** .*
11cd0 2a 20 54 68 65 20 63 6f 6c 75 6d 6e 20 6c 69 73  * The column lis
11ce0 74 20 70 72 65 73 75 6d 61 62 6c 79 20 63 61 6d  t presumably cam
11cf0 65 20 66 72 6f 6d 20 73 65 6c 65 63 74 43 6f 6c  e from selectCol
11d00 75 6d 6e 4e 61 6d 65 73 46 72 6f 6d 45 78 70 72  umnNamesFromExpr
11d10 4c 69 73 74 28 29 2e 0a 2a 2a 20 54 68 65 20 63  List()..** The c
11d20 6f 6c 75 6d 6e 20 6c 69 73 74 20 68 61 73 20 6f  olumn list has o
11d30 6e 6c 79 20 6e 61 6d 65 73 2c 20 6e 6f 74 20 74  nly names, not t
11d40 79 70 65 73 20 6f 72 20 63 6f 6c 6c 61 74 69 6f  ypes or collatio
11d50 6e 73 2e 20 20 54 68 69 73 0a 2a 2a 20 72 6f 75  ns.  This.** rou
11d60 74 69 6e 65 20 67 6f 65 73 20 74 68 72 6f 75 67  tine goes throug
11d70 68 20 61 6e 64 20 61 64 64 73 20 74 68 65 20 74  h and adds the t
11d80 79 70 65 73 20 61 6e 64 20 63 6f 6c 6c 61 74 69  ypes and collati
11d90 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ons..**.** This 
11da0 72 6f 75 74 69 6e 65 20 72 65 71 75 69 72 65 73  routine requires
11db0 20 74 68 61 74 20 61 6c 6c 20 69 64 65 6e 74 69   that all identi
11dc0 66 69 65 72 73 20 69 6e 20 74 68 65 20 53 45 4c  fiers in the SEL
11dd0 45 43 54 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74  ECT.** statement
11de0 20 62 65 20 72 65 73 6f 6c 76 65 64 2e 0a 2a 2f   be resolved..*/
11df0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53 65 6c  .void sqlite3Sel
11e00 65 63 74 41 64 64 43 6f 6c 75 6d 6e 54 79 70 65  ectAddColumnType
11e10 41 6e 64 43 6f 6c 6c 61 74 69 6f 6e 28 0a 20 20  AndCollation(.  
11e20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
11e30 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
11e40 20 63 6f 6e 74 65 78 74 73 20 2a 2f 0a 20 20 54   contexts */.  T
11e50 61 62 6c 65 20 2a 70 54 61 62 2c 20 20 20 20 20  able *pTab,     
11e60 20 20 20 20 20 2f 2a 20 41 64 64 20 63 6f 6c 75       /* Add colu
11e70 6d 6e 20 74 79 70 65 20 69 6e 66 6f 72 6d 61 74  mn type informat
11e80 69 6f 6e 20 74 6f 20 74 68 69 73 20 74 61 62 6c  ion to this tabl
11e90 65 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70  e */.  Select *p
11ea0 53 65 6c 65 63 74 20 20 20 20 20 20 20 2f 2a 20  Select       /* 
11eb0 53 45 4c 45 43 54 20 75 73 65 64 20 74 6f 20 64  SELECT used to d
11ec0 65 74 65 72 6d 69 6e 65 20 74 79 70 65 73 20 61  etermine types a
11ed0 6e 64 20 63 6f 6c 6c 61 74 69 6f 6e 73 20 2a 2f  nd collations */
11ee0 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  .){.  sqlite3 *d
11ef0 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
11f00 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 73 4e    NameContext sN
11f10 43 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f  C;.  Column *pCo
11f20 6c 3b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43  l;.  CollSeq *pC
11f30 6f 6c 6c 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  oll;.  int i;.  
11f40 45 78 70 72 20 2a 70 3b 0a 20 20 73 74 72 75 63  Expr *p;.  struc
11f50 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20  t ExprList_item 
11f60 2a 61 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  *a;..  assert( p
11f70 53 65 6c 65 63 74 21 3d 30 20 29 3b 0a 20 20 61  Select!=0 );.  a
11f80 73 73 65 72 74 28 20 28 70 53 65 6c 65 63 74 2d  ssert( (pSelect-
11f90 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 52  >selFlags & SF_R
11fa0 65 73 6f 6c 76 65 64 29 21 3d 30 20 29 3b 0a 20  esolved)!=0 );. 
11fb0 20 61 73 73 65 72 74 28 20 70 54 61 62 2d 3e 6e   assert( pTab->n
11fc0 43 6f 6c 3d 3d 70 53 65 6c 65 63 74 2d 3e 70 45  Col==pSelect->pE
11fd0 4c 69 73 74 2d 3e 6e 45 78 70 72 20 7c 7c 20 64  List->nExpr || d
11fe0 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
11ff0 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c  );.  if( db->mal
12000 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74 75  locFailed ) retu
12010 72 6e 3b 0a 20 20 6d 65 6d 73 65 74 28 26 73 4e  rn;.  memset(&sN
12020 43 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 4e 43  C, 0, sizeof(sNC
12030 29 29 3b 0a 20 20 73 4e 43 2e 70 53 72 63 4c 69  ));.  sNC.pSrcLi
12040 73 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70 53  st = pSelect->pS
12050 72 63 3b 0a 20 20 61 20 3d 20 70 53 65 6c 65 63  rc;.  a = pSelec
12060 74 2d 3e 70 45 4c 69 73 74 2d 3e 61 3b 0a 20 20  t->pEList->a;.  
12070 66 6f 72 28 69 3d 30 2c 20 70 43 6f 6c 3d 70 54  for(i=0, pCol=pT
12080 61 62 2d 3e 61 43 6f 6c 3b 20 69 3c 70 54 61 62  ab->aCol; i<pTab
12090 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 70 43 6f  ->nCol; i++, pCo
120a0 6c 2b 2b 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20  l++){.    const 
120b0 63 68 61 72 20 2a 7a 54 79 70 65 3b 0a 20 20 20  char *zType;.   
120c0 20 69 6e 74 20 6e 2c 20 6d 3b 0a 20 20 20 20 70   int n, m;.    p
120d0 20 3d 20 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20   = a[i].pExpr;. 
120e0 20 20 20 7a 54 79 70 65 20 3d 20 63 6f 6c 75 6d     zType = colum
120f0 6e 54 79 70 65 28 26 73 4e 43 2c 20 70 2c 20 30  nType(&sNC, p, 0
12100 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 2f 2a 20  , 0, 0);.    /* 
12110 70 43 6f 6c 2d 3e 73 7a 45 73 74 20 3d 20 2e 2e  pCol->szEst = ..
12120 2e 20 2f 2f 20 43 6f 6c 75 6d 6e 20 73 69 7a 65  . // Column size
12130 20 65 73 74 20 66 6f 72 20 53 45 4c 45 43 54 20   est for SELECT 
12140 74 61 62 6c 65 73 20 6e 65 76 65 72 20 75 73 65  tables never use
12150 64 20 2a 2f 0a 20 20 20 20 70 43 6f 6c 2d 3e 61  d */.    pCol->a
12160 66 66 69 6e 69 74 79 20 3d 20 73 71 6c 69 74 65  ffinity = sqlite
12170 33 45 78 70 72 41 66 66 69 6e 69 74 79 28 70 29  3ExprAffinity(p)
12180 3b 0a 20 20 20 20 69 66 28 20 7a 54 79 70 65 20  ;.    if( zType 
12190 29 7b 0a 20 20 20 20 20 20 6d 20 3d 20 73 71 6c  ){.      m = sql
121a0 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 54 79  ite3Strlen30(zTy
121b0 70 65 29 3b 0a 20 20 20 20 20 20 6e 20 3d 20 73  pe);.      n = s
121c0 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70  qlite3Strlen30(p
121d0 43 6f 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  Col->zName);.   
121e0 20 20 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 20 3d     pCol->zName =
121f0 20 73 71 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f   sqlite3DbReallo
12200 63 4f 72 46 72 65 65 28 64 62 2c 20 70 43 6f 6c  cOrFree(db, pCol
12210 2d 3e 7a 4e 61 6d 65 2c 20 6e 2b 6d 2b 32 29 3b  ->zName, n+m+2);
12220 0a 20 20 20 20 20 20 69 66 28 20 70 43 6f 6c 2d  .      if( pCol-
12230 3e 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20  >zName ){.      
12240 20 20 6d 65 6d 63 70 79 28 26 70 43 6f 6c 2d 3e    memcpy(&pCol->
12250 7a 4e 61 6d 65 5b 6e 2b 31 5d 2c 20 7a 54 79 70  zName[n+1], zTyp
12260 65 2c 20 6d 2b 31 29 3b 0a 20 20 20 20 20 20 20  e, m+1);.       
12270 20 70 43 6f 6c 2d 3e 63 6f 6c 46 6c 61 67 73 20   pCol->colFlags 
12280 7c 3d 20 43 4f 4c 46 4c 41 47 5f 48 41 53 54 59  |= COLFLAG_HASTY
12290 50 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  PE;.      }.    
122a0 7d 0a 20 20 20 20 69 66 28 20 70 43 6f 6c 2d 3e  }.    if( pCol->
122b0 61 66 66 69 6e 69 74 79 3d 3d 30 20 29 20 70 43  affinity==0 ) pC
122c0 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 20 3d 20 53  ol->affinity = S
122d0 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42 3b 0a  QLITE_AFF_BLOB;.
122e0 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69      pColl = sqli
122f0 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70  te3ExprCollSeq(p
12300 50 61 72 73 65 2c 20 70 29 3b 0a 20 20 20 20 69  Parse, p);.    i
12310 66 28 20 70 43 6f 6c 6c 20 26 26 20 70 43 6f 6c  f( pColl && pCol
12320 2d 3e 7a 43 6f 6c 6c 3d 3d 30 20 29 7b 0a 20 20  ->zColl==0 ){.  
12330 20 20 20 20 70 43 6f 6c 2d 3e 7a 43 6f 6c 6c 20      pCol->zColl 
12340 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75  = sqlite3DbStrDu
12350 70 28 64 62 2c 20 70 43 6f 6c 6c 2d 3e 7a 4e 61  p(db, pColl->zNa
12360 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  me);.    }.  }. 
12370 20 70 54 61 62 2d 3e 73 7a 54 61 62 52 6f 77 20   pTab->szTabRow 
12380 3d 20 31 3b 20 2f 2a 20 41 6e 79 20 6e 6f 6e 2d  = 1; /* Any non-
12390 7a 65 72 6f 20 76 61 6c 75 65 20 77 6f 72 6b 73  zero value works
123a0 20 2a 2f 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76   */.}../*.** Giv
123b0 65 6e 20 61 20 53 45 4c 45 43 54 20 73 74 61 74  en a SELECT stat
123c0 65 6d 65 6e 74 2c 20 67 65 6e 65 72 61 74 65 20  ement, generate 
123d0 61 20 54 61 62 6c 65 20 73 74 72 75 63 74 75 72  a Table structur
123e0 65 20 74 68 61 74 20 64 65 73 63 72 69 62 65 73  e that describes
123f0 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 20 73  .** the result s
12400 65 74 20 6f 66 20 74 68 61 74 20 53 45 4c 45 43  et of that SELEC
12410 54 2e 0a 2a 2f 0a 54 61 62 6c 65 20 2a 73 71 6c  T..*/.Table *sql
12420 69 74 65 33 52 65 73 75 6c 74 53 65 74 4f 66 53  ite3ResultSetOfS
12430 65 6c 65 63 74 28 50 61 72 73 65 20 2a 70 50 61  elect(Parse *pPa
12440 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 53 65  rse, Select *pSe
12450 6c 65 63 74 29 7b 0a 20 20 54 61 62 6c 65 20 2a  lect){.  Table *
12460 70 54 61 62 3b 0a 20 20 73 71 6c 69 74 65 33 20  pTab;.  sqlite3 
12470 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
12480 3b 0a 20 20 75 36 34 20 73 61 76 65 64 46 6c 61  ;.  u64 savedFla
12490 67 73 3b 0a 0a 20 20 73 61 76 65 64 46 6c 61 67  gs;..  savedFlag
124a0 73 20 3d 20 64 62 2d 3e 66 6c 61 67 73 3b 0a 20  s = db->flags;. 
124b0 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 28   db->flags &= ~(
124c0 75 36 34 29 53 51 4c 49 54 45 5f 46 75 6c 6c 43  u64)SQLITE_FullC
124d0 6f 6c 4e 61 6d 65 73 3b 0a 20 20 64 62 2d 3e 66  olNames;.  db->f
124e0 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 53  lags |= SQLITE_S
124f0 68 6f 72 74 43 6f 6c 4e 61 6d 65 73 3b 0a 20 20  hortColNames;.  
12500 73 71 6c 69 74 65 33 53 65 6c 65 63 74 50 72 65  sqlite3SelectPre
12510 70 28 70 50 61 72 73 65 2c 20 70 53 65 6c 65 63  p(pParse, pSelec
12520 74 2c 20 30 29 3b 0a 20 20 64 62 2d 3e 66 6c 61  t, 0);.  db->fla
12530 67 73 20 3d 20 73 61 76 65 64 46 6c 61 67 73 3b  gs = savedFlags;
12540 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e  .  if( pParse->n
12550 45 72 72 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  Err ) return 0;.
12560 20 20 77 68 69 6c 65 28 20 70 53 65 6c 65 63 74    while( pSelect
12570 2d 3e 70 50 72 69 6f 72 20 29 20 70 53 65 6c 65  ->pPrior ) pSele
12580 63 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70 50  ct = pSelect->pP
12590 72 69 6f 72 3b 0a 20 20 70 54 61 62 20 3d 20 73  rior;.  pTab = s
125a0 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65  qlite3DbMallocZe
125b0 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 54 61  ro(db, sizeof(Ta
125c0 62 6c 65 29 20 29 3b 0a 20 20 69 66 28 20 70 54  ble) );.  if( pT
125d0 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  ab==0 ){.    ret
125e0 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 54 61  urn 0;.  }.  pTa
125f0 62 2d 3e 6e 54 61 62 52 65 66 20 3d 20 31 3b 0a  b->nTabRef = 1;.
12600 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 20 3d 20    pTab->zName = 
12610 30 3b 0a 20 20 70 54 61 62 2d 3e 6e 52 6f 77 4c  0;.  pTab->nRowL
12620 6f 67 45 73 74 20 3d 20 32 30 30 3b 20 61 73 73  ogEst = 200; ass
12630 65 72 74 28 20 32 30 30 3d 3d 73 71 6c 69 74 65  ert( 200==sqlite
12640 33 4c 6f 67 45 73 74 28 31 30 34 38 35 37 36 29  3LogEst(1048576)
12650 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 43 6f 6c   );.  sqlite3Col
12660 75 6d 6e 73 46 72 6f 6d 45 78 70 72 4c 69 73 74  umnsFromExprList
12670 28 70 50 61 72 73 65 2c 20 70 53 65 6c 65 63 74  (pParse, pSelect
12680 2d 3e 70 45 4c 69 73 74 2c 20 26 70 54 61 62 2d  ->pEList, &pTab-
12690 3e 6e 43 6f 6c 2c 20 26 70 54 61 62 2d 3e 61 43  >nCol, &pTab->aC
126a0 6f 6c 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 65  ol);.  sqlite3Se
126b0 6c 65 63 74 41 64 64 43 6f 6c 75 6d 6e 54 79 70  lectAddColumnTyp
126c0 65 41 6e 64 43 6f 6c 6c 61 74 69 6f 6e 28 70 50  eAndCollation(pP
126d0 61 72 73 65 2c 20 70 54 61 62 2c 20 70 53 65 6c  arse, pTab, pSel
126e0 65 63 74 29 3b 0a 20 20 70 54 61 62 2d 3e 69 50  ect);.  pTab->iP
126f0 4b 65 79 20 3d 20 2d 31 3b 0a 20 20 69 66 28 20  Key = -1;.  if( 
12700 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
12710 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44   ){.    sqlite3D
12720 65 6c 65 74 65 54 61 62 6c 65 28 64 62 2c 20 70  eleteTable(db, p
12730 54 61 62 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  Tab);.    return
12740 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   0;.  }.  return
12750 20 70 54 61 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   pTab;.}../*.** 
12760 47 65 74 20 61 20 56 44 42 45 20 66 6f 72 20 74  Get a VDBE for t
12770 68 65 20 67 69 76 65 6e 20 70 61 72 73 65 72 20  he given parser 
12780 63 6f 6e 74 65 78 74 2e 20 20 43 72 65 61 74 65  context.  Create
12790 20 61 20 6e 65 77 20 6f 6e 65 20 69 66 20 6e 65   a new one if ne
127a0 63 65 73 73 61 72 79 2e 0a 2a 2a 20 49 66 20 61  cessary..** If a
127b0 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  n error occurs, 
127c0 72 65 74 75 72 6e 20 4e 55 4c 4c 20 61 6e 64 20  return NULL and 
127d0 6c 65 61 76 65 20 61 20 6d 65 73 73 61 67 65 20  leave a message 
127e0 69 6e 20 70 50 61 72 73 65 2e 0a 2a 2f 0a 56 64  in pParse..*/.Vd
127f0 62 65 20 2a 73 71 6c 69 74 65 33 47 65 74 56 64  be *sqlite3GetVd
12800 62 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  be(Parse *pParse
12810 29 7b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  ){.  if( pParse-
12820 3e 70 56 64 62 65 20 29 7b 0a 20 20 20 20 72 65  >pVdbe ){.    re
12830 74 75 72 6e 20 70 50 61 72 73 65 2d 3e 70 56 64  turn pParse->pVd
12840 62 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50  be;.  }.  if( pP
12850 61 72 73 65 2d 3e 70 54 6f 70 6c 65 76 65 6c 3d  arse->pToplevel=
12860 3d 30 0a 20 20 20 26 26 20 4f 70 74 69 6d 69 7a  =0.   && Optimiz
12870 61 74 69 6f 6e 45 6e 61 62 6c 65 64 28 70 50 61  ationEnabled(pPa
12880 72 73 65 2d 3e 64 62 2c 53 51 4c 49 54 45 5f 46  rse->db,SQLITE_F
12890 61 63 74 6f 72 4f 75 74 43 6f 6e 73 74 29 0a 20  actorOutConst). 
128a0 20 29 7b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e   ){.    pParse->
128b0 6f 6b 43 6f 6e 73 74 46 61 63 74 6f 72 20 3d 20  okConstFactor = 
128c0 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  1;.  }.  return 
128d0 73 71 6c 69 74 65 33 56 64 62 65 43 72 65 61 74  sqlite3VdbeCreat
128e0 65 28 70 50 61 72 73 65 29 3b 0a 7d 0a 0a 0a 2f  e(pParse);.}.../
128f0 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 74 68 65  *.** Compute the
12900 20 69 4c 69 6d 69 74 20 61 6e 64 20 69 4f 66 66   iLimit and iOff
12910 73 65 74 20 66 69 65 6c 64 73 20 6f 66 20 74 68  set fields of th
12920 65 20 53 45 4c 45 43 54 20 62 61 73 65 64 20 6f  e SELECT based o
12930 6e 20 74 68 65 0a 2a 2a 20 70 4c 69 6d 69 74 20  n the.** pLimit 
12940 65 78 70 72 65 73 73 69 6f 6e 73 2e 20 20 70 4c  expressions.  pL
12950 69 6d 69 74 2d 3e 70 4c 65 66 74 20 61 6e 64 20  imit->pLeft and 
12960 70 4c 69 6d 69 74 2d 3e 70 52 69 67 68 74 20 68  pLimit->pRight h
12970 6f 6c 64 20 74 68 65 20 65 78 70 72 65 73 73 69  old the expressi
12980 6f 6e 73 0a 2a 2a 20 74 68 61 74 20 61 70 70 65  ons.** that appe
12990 61 72 20 69 6e 20 74 68 65 20 6f 72 69 67 69 6e  ar in the origin
129a0 61 6c 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74  al SQL statement
129b0 20 61 66 74 65 72 20 74 68 65 20 4c 49 4d 49 54   after the LIMIT
129c0 20 61 6e 64 20 4f 46 46 53 45 54 0a 2a 2a 20 6b   and OFFSET.** k
129d0 65 79 77 6f 72 64 73 2e 20 20 4f 72 20 4e 55 4c  eywords.  Or NUL
129e0 4c 20 69 66 20 74 68 6f 73 65 20 6b 65 79 77 6f  L if those keywo
129f0 72 64 73 20 61 72 65 20 6f 6d 69 74 74 65 64 2e  rds are omitted.
12a00 20 69 4c 69 6d 69 74 20 61 6e 64 20 69 4f 66 66   iLimit and iOff
12a10 73 65 74 20 0a 2a 2a 20 61 72 65 20 74 68 65 20  set .** are the 
12a20 69 6e 74 65 67 65 72 20 6d 65 6d 6f 72 79 20 72  integer memory r
12a30 65 67 69 73 74 65 72 20 6e 75 6d 62 65 72 73 20  egister numbers 
12a40 66 6f 72 20 63 6f 75 6e 74 65 72 73 20 75 73 65  for counters use
12a50 64 20 74 6f 20 63 6f 6d 70 75 74 65 20 0a 2a 2a  d to compute .**
12a60 20 74 68 65 20 6c 69 6d 69 74 20 61 6e 64 20 6f   the limit and o
12a70 66 66 73 65 74 2e 20 20 49 66 20 74 68 65 72 65  ffset.  If there
12a80 20 69 73 20 6e 6f 20 6c 69 6d 69 74 20 61 6e 64   is no limit and
12a90 2f 6f 72 20 6f 66 66 73 65 74 2c 20 74 68 65 6e  /or offset, then
12aa0 20 0a 2a 2a 20 69 4c 69 6d 69 74 20 61 6e 64 20   .** iLimit and 
12ab0 69 4f 66 66 73 65 74 20 61 72 65 20 6e 65 67 61  iOffset are nega
12ac0 74 69 76 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  tive..**.** This
12ad0 20 72 6f 75 74 69 6e 65 20 63 68 61 6e 67 65 73   routine changes
12ae0 20 74 68 65 20 76 61 6c 75 65 73 20 6f 66 20 69   the values of i
12af0 4c 69 6d 69 74 20 61 6e 64 20 69 4f 66 66 73 65  Limit and iOffse
12b00 74 20 6f 6e 6c 79 20 69 66 0a 2a 2a 20 61 20 6c  t only if.** a l
12b10 69 6d 69 74 20 6f 72 20 6f 66 66 73 65 74 20 69  imit or offset i
12b20 73 20 64 65 66 69 6e 65 64 20 62 79 20 70 4c 69  s defined by pLi
12b30 6d 69 74 2d 3e 70 4c 65 66 74 20 61 6e 64 20 70  mit->pLeft and p
12b40 4c 69 6d 69 74 2d 3e 70 52 69 67 68 74 2e 20 20  Limit->pRight.  
12b50 69 4c 69 6d 69 74 0a 2a 2a 20 61 6e 64 20 69 4f  iLimit.** and iO
12b60 66 66 73 65 74 20 73 68 6f 75 6c 64 20 68 61 76  ffset should hav
12b70 65 20 62 65 65 6e 20 70 72 65 73 65 74 20 74 6f  e been preset to
12b80 20 61 70 70 72 6f 70 72 69 61 74 65 20 64 65 66   appropriate def
12b90 61 75 6c 74 20 76 61 6c 75 65 73 20 28 7a 65 72  ault values (zer
12ba0 6f 29 0a 2a 2a 20 70 72 69 6f 72 20 74 6f 20 63  o).** prior to c
12bb0 61 6c 6c 69 6e 67 20 74 68 69 73 20 72 6f 75 74  alling this rout
12bc0 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69  ine..**.** The i
12bd0 4f 66 66 73 65 74 20 72 65 67 69 73 74 65 72 20  Offset register 
12be0 28 69 66 20 69 74 20 65 78 69 73 74 73 29 20 69  (if it exists) i
12bf0 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f  s initialized to
12c00 20 74 68 65 20 76 61 6c 75 65 0a 2a 2a 20 6f 66   the value.** of
12c10 20 74 68 65 20 4f 46 46 53 45 54 2e 20 20 54 68   the OFFSET.  Th
12c20 65 20 69 4c 69 6d 69 74 20 72 65 67 69 73 74 65  e iLimit registe
12c30 72 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64  r is initialized
12c40 20 74 6f 20 4c 49 4d 49 54 2e 20 20 52 65 67 69   to LIMIT.  Regi
12c50 73 74 65 72 0a 2a 2a 20 69 4f 66 66 73 65 74 2b  ster.** iOffset+
12c60 31 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64  1 is initialized
12c70 20 74 6f 20 4c 49 4d 49 54 2b 4f 46 46 53 45 54   to LIMIT+OFFSET
12c80 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20 69 66 20  ..**.** Only if 
12c90 70 4c 69 6d 69 74 2d 3e 70 4c 65 66 74 21 3d 30  pLimit->pLeft!=0
12ca0 20 64 6f 20 74 68 65 20 6c 69 6d 69 74 20 72 65   do the limit re
12cb0 67 69 73 74 65 72 73 20 67 65 74 0a 2a 2a 20 72  gisters get.** r
12cc0 65 64 65 66 69 6e 65 64 2e 20 20 54 68 65 20 55  edefined.  The U
12cd0 4e 49 4f 4e 20 41 4c 4c 20 6f 70 65 72 61 74 6f  NION ALL operato
12ce0 72 20 75 73 65 73 20 74 68 69 73 20 70 72 6f 70  r uses this prop
12cf0 65 72 74 79 20 74 6f 20 66 6f 72 63 65 0a 2a 2a  erty to force.**
12d00 20 74 68 65 20 72 65 75 73 65 20 6f 66 20 74 68   the reuse of th
12d10 65 20 73 61 6d 65 20 6c 69 6d 69 74 20 61 6e 64  e same limit and
12d20 20 6f 66 66 73 65 74 20 72 65 67 69 73 74 65 72   offset register
12d30 73 20 61 63 72 6f 73 73 20 6d 75 6c 74 69 70 6c  s across multipl
12d40 65 0a 2a 2a 20 53 45 4c 45 43 54 20 73 74 61 74  e.** SELECT stat
12d50 65 6d 65 6e 74 73 2e 0a 2a 2f 0a 73 74 61 74 69  ements..*/.stati
12d60 63 20 76 6f 69 64 20 63 6f 6d 70 75 74 65 4c 69  c void computeLi
12d70 6d 69 74 52 65 67 69 73 74 65 72 73 28 50 61 72  mitRegisters(Par
12d80 73 65 20 2a 70 50 61 72 73 65 2c 20 53 65 6c 65  se *pParse, Sele
12d90 63 74 20 2a 70 2c 20 69 6e 74 20 69 42 72 65 61  ct *p, int iBrea
12da0 6b 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  k){.  Vdbe *v = 
12db0 30 3b 0a 20 20 69 6e 74 20 69 4c 69 6d 69 74 20  0;.  int iLimit 
12dc0 3d 20 30 3b 0a 20 20 69 6e 74 20 69 4f 66 66 73  = 0;.  int iOffs
12dd0 65 74 3b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 45  et;.  int n;.  E
12de0 78 70 72 20 2a 70 4c 69 6d 69 74 20 3d 20 70 2d  xpr *pLimit = p-
12df0 3e 70 4c 69 6d 69 74 3b 0a 0a 20 20 69 66 28 20  >pLimit;..  if( 
12e00 70 2d 3e 69 4c 69 6d 69 74 20 29 20 72 65 74 75  p->iLimit ) retu
12e10 72 6e 3b 0a 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20  rn;..  /* .  ** 
12e20 22 4c 49 4d 49 54 20 2d 31 22 20 61 6c 77 61 79  "LIMIT -1" alway
12e30 73 20 73 68 6f 77 73 20 61 6c 6c 20 72 6f 77 73  s shows all rows
12e40 2e 20 20 54 68 65 72 65 20 69 73 20 73 6f 6d 65  .  There is some
12e50 0a 20 20 2a 2a 20 63 6f 6e 74 72 6f 76 65 72 73  .  ** controvers
12e60 79 20 61 62 6f 75 74 20 77 68 61 74 20 74 68 65  y about what the
12e70 20 63 6f 72 72 65 63 74 20 62 65 68 61 76 69 6f   correct behavio
12e80 72 20 73 68 6f 75 6c 64 20 62 65 2e 0a 20 20 2a  r should be..  *
12e90 2a 20 54 68 65 20 63 75 72 72 65 6e 74 20 69 6d  * The current im
12ea0 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 69 6e 74  plementation int
12eb0 65 72 70 72 65 74 73 20 22 4c 49 4d 49 54 20 30  erprets "LIMIT 0
12ec0 22 20 74 6f 20 6d 65 61 6e 0a 20 20 2a 2a 20 6e  " to mean.  ** n
12ed0 6f 20 72 6f 77 73 2e 0a 20 20 2a 2f 0a 20 20 69  o rows..  */.  i
12ee0 66 28 20 70 4c 69 6d 69 74 20 29 7b 0a 20 20 20  f( pLimit ){.   
12ef0 20 61 73 73 65 72 74 28 20 70 4c 69 6d 69 74 2d   assert( pLimit-
12f00 3e 6f 70 3d 3d 54 4b 5f 4c 49 4d 49 54 20 29 3b  >op==TK_LIMIT );
12f10 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 69  .    assert( pLi
12f20 6d 69 74 2d 3e 70 4c 65 66 74 21 3d 30 20 29 3b  mit->pLeft!=0 );
12f30 0a 20 20 20 20 70 2d 3e 69 4c 69 6d 69 74 20 3d  .    p->iLimit =
12f40 20 69 4c 69 6d 69 74 20 3d 20 2b 2b 70 50 61 72   iLimit = ++pPar
12f50 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 76 20  se->nMem;.    v 
12f60 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  = sqlite3GetVdbe
12f70 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 61 73  (pParse);.    as
12f80 73 65 72 74 28 20 76 21 3d 30 20 29 3b 0a 20 20  sert( v!=0 );.  
12f90 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70    if( sqlite3Exp
12fa0 72 49 73 49 6e 74 65 67 65 72 28 70 4c 69 6d 69  rIsInteger(pLimi
12fb0 74 2d 3e 70 4c 65 66 74 2c 20 26 6e 29 20 29 7b  t->pLeft, &n) ){
12fc0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
12fd0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
12fe0 6e 74 65 67 65 72 2c 20 6e 2c 20 69 4c 69 6d 69  nteger, n, iLimi
12ff0 74 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  t);.      VdbeCo
13000 6d 6d 65 6e 74 28 28 76 2c 20 22 4c 49 4d 49 54  mment((v, "LIMIT
13010 20 63 6f 75 6e 74 65 72 22 29 29 3b 0a 20 20 20   counter"));.   
13020 20 20 20 69 66 28 20 6e 3d 3d 30 20 29 7b 0a 20     if( n==0 ){. 
13030 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
13040 62 65 47 6f 74 6f 28 76 2c 20 69 42 72 65 61 6b  beGoto(v, iBreak
13050 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  );.      }else i
13060 66 28 20 6e 3e 3d 30 20 26 26 20 70 2d 3e 6e 53  f( n>=0 && p->nS
13070 65 6c 65 63 74 52 6f 77 3e 73 71 6c 69 74 65 33  electRow>sqlite3
13080 4c 6f 67 45 73 74 28 28 75 36 34 29 6e 29 20 29  LogEst((u64)n) )
13090 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 6e 53 65  {.        p->nSe
130a0 6c 65 63 74 52 6f 77 20 3d 20 73 71 6c 69 74 65  lectRow = sqlite
130b0 33 4c 6f 67 45 73 74 28 28 75 36 34 29 6e 29 3b  3LogEst((u64)n);
130c0 0a 20 20 20 20 20 20 20 20 70 2d 3e 73 65 6c 46  .        p->selF
130d0 6c 61 67 73 20 7c 3d 20 53 46 5f 46 69 78 65 64  lags |= SF_Fixed
130e0 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 7d 0a 20  Limit;.      }. 
130f0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
13100 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
13110 70 50 61 72 73 65 2c 20 70 4c 69 6d 69 74 2d 3e  pParse, pLimit->
13120 70 4c 65 66 74 2c 20 69 4c 69 6d 69 74 29 3b 0a  pLeft, iLimit);.
13130 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
13140 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4d 75  eAddOp1(v, OP_Mu
13150 73 74 42 65 49 6e 74 2c 20 69 4c 69 6d 69 74 29  stBeInt, iLimit)
13160 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
13170 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d  );.      VdbeCom
13180 6d 65 6e 74 28 28 76 2c 20 22 4c 49 4d 49 54 20  ment((v, "LIMIT 
13190 63 6f 75 6e 74 65 72 22 29 29 3b 0a 20 20 20 20  counter"));.    
131a0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
131b0 4f 70 32 28 76 2c 20 4f 50 5f 49 66 4e 6f 74 2c  Op2(v, OP_IfNot,
131c0 20 69 4c 69 6d 69 74 2c 20 69 42 72 65 61 6b 29   iLimit, iBreak)
131d0 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
131e0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
131f0 20 70 4c 69 6d 69 74 2d 3e 70 52 69 67 68 74 20   pLimit->pRight 
13200 29 7b 0a 20 20 20 20 20 20 70 2d 3e 69 4f 66 66  ){.      p->iOff
13210 73 65 74 20 3d 20 69 4f 66 66 73 65 74 20 3d 20  set = iOffset = 
13220 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
13230 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d        pParse->nM
13240 65 6d 2b 2b 3b 20 20 20 2f 2a 20 41 6c 6c 6f 63  em++;   /* Alloc
13250 61 74 65 20 61 6e 20 65 78 74 72 61 20 72 65 67  ate an extra reg
13260 69 73 74 65 72 20 66 6f 72 20 6c 69 6d 69 74 2b  ister for limit+
13270 6f 66 66 73 65 74 20 2a 2f 0a 20 20 20 20 20 20  offset */.      
13280 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
13290 70 50 61 72 73 65 2c 20 70 4c 69 6d 69 74 2d 3e  pParse, pLimit->
132a0 70 52 69 67 68 74 2c 20 69 4f 66 66 73 65 74 29  pRight, iOffset)
132b0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
132c0 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
132d0 4d 75 73 74 42 65 49 6e 74 2c 20 69 4f 66 66 73  MustBeInt, iOffs
132e0 65 74 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  et); VdbeCoverag
132f0 65 28 76 29 3b 0a 20 20 20 20 20 20 56 64 62 65  e(v);.      Vdbe
13300 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4f 46 46  Comment((v, "OFF
13310 53 45 54 20 63 6f 75 6e 74 65 72 22 29 29 3b 0a  SET counter"));.
13320 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
13330 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4f 66  eAddOp3(v, OP_Of
13340 66 73 65 74 4c 69 6d 69 74 2c 20 69 4c 69 6d 69  fsetLimit, iLimi
13350 74 2c 20 69 4f 66 66 73 65 74 2b 31 2c 20 69 4f  t, iOffset+1, iO
13360 66 66 73 65 74 29 3b 0a 20 20 20 20 20 20 56 64  ffset);.      Vd
13370 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4c  beComment((v, "L
13380 49 4d 49 54 2b 4f 46 46 53 45 54 22 29 29 3b 0a  IMIT+OFFSET"));.
13390 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 23 69 66      }.  }.}..#if
133a0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
133b0 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54  _COMPOUND_SELECT
133c0 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
133d0 65 20 61 70 70 72 6f 70 72 69 61 74 65 20 63 6f  e appropriate co
133e0 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
133f0 20 66 6f 72 20 74 68 65 20 69 43 6f 6c 2d 74 68   for the iCol-th
13400 20 63 6f 6c 75 6d 6e 20 6f 66 0a 2a 2a 20 74 68   column of.** th
13410 65 20 72 65 73 75 6c 74 20 73 65 74 20 66 6f 72  e result set for
13420 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 2d 73 65   the compound-se
13430 6c 65 63 74 20 73 74 61 74 65 6d 65 6e 74 20 22  lect statement "
13440 70 22 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c  p".  Return NULL
13450 20 69 66 0a 2a 2a 20 74 68 65 20 63 6f 6c 75 6d   if.** the colum
13460 6e 20 68 61 73 20 6e 6f 20 64 65 66 61 75 6c 74  n has no default
13470 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
13480 6e 63 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63  nce..**.** The c
13490 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
134a0 65 20 66 6f 72 20 74 68 65 20 63 6f 6d 70 6f 75  e for the compou
134b0 6e 64 20 73 65 6c 65 63 74 20 69 73 20 74 61 6b  nd select is tak
134c0 65 6e 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20 6c  en from the.** l
134d0 65 66 74 2d 6d 6f 73 74 20 74 65 72 6d 20 6f 66  eft-most term of
134e0 20 74 68 65 20 73 65 6c 65 63 74 20 74 68 61 74   the select that
134f0 20 68 61 73 20 61 20 63 6f 6c 6c 61 74 69 6e 67   has a collating
13500 20 73 65 71 75 65 6e 63 65 2e 0a 2a 2f 0a 73 74   sequence..*/.st
13510 61 74 69 63 20 43 6f 6c 6c 53 65 71 20 2a 6d 75  atic CollSeq *mu
13520 6c 74 69 53 65 6c 65 63 74 43 6f 6c 6c 53 65 71  ltiSelectCollSeq
13530 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
13540 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20 69  Select *p, int i
13550 43 6f 6c 29 7b 0a 20 20 43 6f 6c 6c 53 65 71 20  Col){.  CollSeq 
13560 2a 70 52 65 74 3b 0a 20 20 69 66 28 20 70 2d 3e  *pRet;.  if( p->
13570 70 50 72 69 6f 72 20 29 7b 0a 20 20 20 20 70 52  pPrior ){.    pR
13580 65 74 20 3d 20 6d 75 6c 74 69 53 65 6c 65 63 74  et = multiSelect
13590 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
135a0 70 2d 3e 70 50 72 69 6f 72 2c 20 69 43 6f 6c 29  p->pPrior, iCol)
135b0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
135c0 52 65 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 61  Ret = 0;.  }.  a
135d0 73 73 65 72 74 28 20 69 43 6f 6c 3e 3d 30 20 29  ssert( iCol>=0 )
135e0 3b 0a 20 20 2f 2a 20 69 43 6f 6c 20 6d 75 73 74  ;.  /* iCol must
135f0 20 62 65 20 6c 65 73 73 20 74 68 61 6e 20 70 2d   be less than p-
13600 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2e 20  >pEList->nExpr. 
13610 20 4f 74 68 65 72 77 69 73 65 20 61 6e 20 65 72   Otherwise an er
13620 72 6f 72 20 77 6f 75 6c 64 0a 20 20 2a 2a 20 68  ror would.  ** h
13630 61 76 65 20 62 65 65 6e 20 74 68 72 6f 77 6e 20  ave been thrown 
13640 64 75 72 69 6e 67 20 6e 61 6d 65 20 72 65 73 6f  during name reso
13650 6c 75 74 69 6f 6e 20 61 6e 64 20 77 65 20 77 6f  lution and we wo
13660 75 6c 64 20 6e 6f 74 20 68 61 76 65 20 67 6f 74  uld not have got
13670 74 65 6e 0a 20 20 2a 2a 20 74 68 69 73 20 66 61  ten.  ** this fa
13680 72 20 2a 2f 0a 20 20 69 66 28 20 70 52 65 74 3d  r */.  if( pRet=
13690 3d 30 20 26 26 20 41 4c 57 41 59 53 28 69 43 6f  =0 && ALWAYS(iCo
136a0 6c 3c 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78  l<p->pEList->nEx
136b0 70 72 29 20 29 7b 0a 20 20 20 20 70 52 65 74 20  pr) ){.    pRet 
136c0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c  = sqlite3ExprCol
136d0 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 2d 3e  lSeq(pParse, p->
136e0 70 45 4c 69 73 74 2d 3e 61 5b 69 43 6f 6c 5d 2e  pEList->a[iCol].
136f0 70 45 78 70 72 29 3b 0a 20 20 7d 0a 20 20 72 65  pExpr);.  }.  re
13700 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 0a 2f 2a  turn pRet;.}../*
13710 0a 2a 2a 20 54 68 65 20 73 65 6c 65 63 74 20 73  .** The select s
13720 74 61 74 65 6d 65 6e 74 20 70 61 73 73 65 64 20  tatement passed 
13730 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 70 61  as the second pa
13740 72 61 6d 65 74 65 72 20 69 73 20 61 20 63 6f 6d  rameter is a com
13750 70 6f 75 6e 64 20 53 45 4c 45 43 54 0a 2a 2a 20  pound SELECT.** 
13760 77 69 74 68 20 61 6e 20 4f 52 44 45 52 20 42 59  with an ORDER BY
13770 20 63 6c 61 75 73 65 2e 20 54 68 69 73 20 66 75   clause. This fu
13780 6e 63 74 69 6f 6e 20 61 6c 6c 6f 63 61 74 65 73  nction allocates
13790 20 61 6e 64 20 72 65 74 75 72 6e 73 20 61 20 4b   and returns a K
137a0 65 79 49 6e 66 6f 0a 2a 2a 20 73 74 72 75 63 74  eyInfo.** struct
137b0 75 72 65 20 73 75 69 74 61 62 6c 65 20 66 6f 72  ure suitable for
137c0 20 69 6d 70 6c 65 6d 65 6e 74 69 6e 67 20 74 68   implementing th
137d0 65 20 4f 52 44 45 52 20 42 59 2e 0a 2a 2a 0a 2a  e ORDER BY..**.*
137e0 2a 20 53 70 61 63 65 20 74 6f 20 68 6f 6c 64 20  * Space to hold 
137f0 74 68 65 20 4b 65 79 49 6e 66 6f 20 73 74 72 75  the KeyInfo stru
13800 63 74 75 72 65 20 69 73 20 6f 62 74 61 69 6e 65  cture is obtaine
13810 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 2e 20 54  d from malloc. T
13820 68 65 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 66 75  he calling.** fu
13830 6e 63 74 69 6f 6e 20 69 73 20 72 65 73 70 6f 6e  nction is respon
13840 73 69 62 6c 65 20 66 6f 72 20 65 6e 73 75 72 69  sible for ensuri
13850 6e 67 20 74 68 61 74 20 74 68 69 73 20 73 74 72  ng that this str
13860 75 63 74 75 72 65 20 69 73 20 65 76 65 6e 74 75  ucture is eventu
13870 61 6c 6c 79 0a 2a 2a 20 66 72 65 65 64 2e 0a 2a  ally.** freed..*
13880 2f 0a 73 74 61 74 69 63 20 4b 65 79 49 6e 66 6f  /.static KeyInfo
13890 20 2a 6d 75 6c 74 69 53 65 6c 65 63 74 4f 72 64   *multiSelectOrd
138a0 65 72 42 79 4b 65 79 49 6e 66 6f 28 50 61 72 73  erByKeyInfo(Pars
138b0 65 20 2a 70 50 61 72 73 65 2c 20 53 65 6c 65 63  e *pParse, Selec
138c0 74 20 2a 70 2c 20 69 6e 74 20 6e 45 78 74 72 61  t *p, int nExtra
138d0 29 7b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  ){.  ExprList *p
138e0 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72  OrderBy = p->pOr
138f0 64 65 72 42 79 3b 0a 20 20 69 6e 74 20 6e 4f 72  derBy;.  int nOr
13900 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65  derBy = p->pOrde
13910 72 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 73 71  rBy->nExpr;.  sq
13920 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
13930 73 65 2d 3e 64 62 3b 0a 20 20 4b 65 79 49 6e 66  se->db;.  KeyInf
13940 6f 20 2a 70 52 65 74 20 3d 20 73 71 6c 69 74 65  o *pRet = sqlite
13950 33 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63 28 64 62  3KeyInfoAlloc(db
13960 2c 20 6e 4f 72 64 65 72 42 79 2b 6e 45 78 74 72  , nOrderBy+nExtr
13970 61 2c 20 31 29 3b 0a 20 20 69 66 28 20 70 52 65  a, 1);.  if( pRe
13980 74 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  t ){.    int i;.
13990 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
139a0 4f 72 64 65 72 42 79 3b 20 69 2b 2b 29 7b 0a 20  OrderBy; i++){. 
139b0 20 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72       struct Expr
139c0 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
139d0 20 3d 20 26 70 4f 72 64 65 72 42 79 2d 3e 61 5b   = &pOrderBy->a[
139e0 69 5d 3b 0a 20 20 20 20 20 20 45 78 70 72 20 2a  i];.      Expr *
139f0 70 54 65 72 6d 20 3d 20 70 49 74 65 6d 2d 3e 70  pTerm = pItem->p
13a00 45 78 70 72 3b 0a 20 20 20 20 20 20 43 6f 6c 6c  Expr;.      Coll
13a10 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 0a 20 20 20  Seq *pColl;..   
13a20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 66 6c     if( pTerm->fl
13a30 61 67 73 20 26 20 45 50 5f 43 6f 6c 6c 61 74 65  ags & EP_Collate
13a40 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43 6f 6c   ){.        pCol
13a50 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  l = sqlite3ExprC
13a60 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70  ollSeq(pParse, p
13a70 54 65 72 6d 29 3b 0a 20 20 20 20 20 20 7d 65 6c  Term);.      }el
13a80 73 65 7b 0a 20 20 20 20 20 20 20 20 70 43 6f 6c  se{.        pCol
13a90 6c 20 3d 20 6d 75 6c 74 69 53 65 6c 65 63 74 43  l = multiSelectC
13aa0 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70  ollSeq(pParse, p
13ab0 2c 20 70 49 74 65 6d 2d 3e 75 2e 78 2e 69 4f 72  , pItem->u.x.iOr
13ac0 64 65 72 42 79 43 6f 6c 2d 31 29 3b 0a 20 20 20  derByCol-1);.   
13ad0 20 20 20 20 20 69 66 28 20 70 43 6f 6c 6c 3d 3d       if( pColl==
13ae0 30 20 29 20 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e  0 ) pColl = db->
13af0 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20  pDfltColl;.     
13b00 20 20 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69     pOrderBy->a[i
13b10 5d 2e 70 45 78 70 72 20 3d 0a 20 20 20 20 20 20  ].pExpr =.      
13b20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 41      sqlite3ExprA
13b30 64 64 43 6f 6c 6c 61 74 65 53 74 72 69 6e 67 28  ddCollateString(
13b40 70 50 61 72 73 65 2c 20 70 54 65 72 6d 2c 20 70  pParse, pTerm, p
13b50 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  Coll->zName);.  
13b60 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65      }.      asse
13b70 72 74 28 20 73 71 6c 69 74 65 33 4b 65 79 49 6e  rt( sqlite3KeyIn
13b80 66 6f 49 73 57 72 69 74 65 61 62 6c 65 28 70 52  foIsWriteable(pR
13b90 65 74 29 20 29 3b 0a 20 20 20 20 20 20 70 52 65  et) );.      pRe
13ba0 74 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 3d 20 70 43  t->aColl[i] = pC
13bb0 6f 6c 6c 3b 0a 20 20 20 20 20 20 70 52 65 74 2d  oll;.      pRet-
13bc0 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d 20 3d  >aSortOrder[i] =
13bd0 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e   pOrderBy->a[i].
13be0 73 6f 72 74 4f 72 64 65 72 3b 0a 20 20 20 20 7d  sortOrder;.    }
13bf0 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70  .  }..  return p
13c00 52 65 74 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20  Ret;.}..#ifndef 
13c10 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 54 45 0a  SQLITE_OMIT_CTE.
13c20 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
13c30 6e 65 20 67 65 6e 65 72 61 74 65 73 20 56 44 42  ne generates VDB
13c40 45 20 63 6f 64 65 20 74 6f 20 63 6f 6d 70 75 74  E code to comput
13c50 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66  e the content of
13c60 20 61 20 57 49 54 48 20 52 45 43 55 52 53 49 56   a WITH RECURSIV
13c70 45 0a 2a 2a 20 71 75 65 72 79 20 6f 66 20 74 68  E.** query of th
13c80 65 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20  e form:.**.**   
13c90 3c 72 65 63 75 72 73 69 76 65 2d 74 61 62 6c 65  <recursive-table
13ca0 3e 20 41 53 20 28 3c 73 65 74 75 70 2d 71 75 65  > AS (<setup-que
13cb0 72 79 3e 20 55 4e 49 4f 4e 20 5b 41 4c 4c 5d 20  ry> UNION [ALL] 
13cc0 3c 72 65 63 75 72 73 69 76 65 2d 71 75 65 72 79  <recursive-query
13cd0 3e 29 0a 2a 2a 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 5c 5f                \_
13cf0 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 20 20 20 20 20  __________/     
13d00 20 20 20 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f          \_______
13d10 5f 5f 5f 5f 5f 5f 5f 5f 2f 0a 2a 2a 20 20 20 20  ________/.**    
13d20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13d30 20 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72         p->pPrior
13d40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13d50 20 20 20 20 20 20 70 0a 2a 2a 0a 2a 2a 0a 2a 2a        p.**.**.**
13d60 20 54 68 65 72 65 20 69 73 20 65 78 61 63 74 6c   There is exactl
13d70 79 20 6f 6e 65 20 72 65 66 65 72 65 6e 63 65 20  y one reference 
13d80 74 6f 20 74 68 65 20 72 65 63 75 72 73 69 76 65  to the recursive
13d90 2d 74 61 62 6c 65 20 69 6e 20 74 68 65 20 46 52  -table in the FR
13da0 4f 4d 20 63 6c 61 75 73 65 0a 2a 2a 20 6f 66 20  OM clause.** of 
13db0 72 65 63 75 72 73 69 76 65 2d 71 75 65 72 79 2c  recursive-query,
13dc0 20 6d 61 72 6b 65 64 20 77 69 74 68 20 74 68 65   marked with the
13dd0 20 53 72 63 4c 69 73 74 2d 3e 61 5b 5d 2e 66 67   SrcList->a[].fg
13de0 2e 69 73 52 65 63 75 72 73 69 76 65 20 66 6c 61  .isRecursive fla
13df0 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 65 74  g..**.** The set
13e00 75 70 2d 71 75 65 72 79 20 72 75 6e 73 20 6f 6e  up-query runs on
13e10 63 65 20 74 6f 20 67 65 6e 65 72 61 74 65 20 61  ce to generate a
13e20 6e 20 69 6e 69 74 69 61 6c 20 73 65 74 20 6f 66  n initial set of
13e30 20 72 6f 77 73 20 74 68 61 74 20 67 6f 0a 2a 2a   rows that go.**
13e40 20 69 6e 74 6f 20 61 20 51 75 65 75 65 20 74 61   into a Queue ta
13e50 62 6c 65 2e 20 20 52 6f 77 73 20 61 72 65 20 65  ble.  Rows are e
13e60 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20 74 68  xtracted from th
13e70 65 20 51 75 65 75 65 20 74 61 62 6c 65 20 6f 6e  e Queue table on
13e80 65 20 62 79 0a 2a 2a 20 6f 6e 65 2e 20 20 45 61  e by.** one.  Ea
13e90 63 68 20 72 6f 77 20 65 78 74 72 61 63 74 65 64  ch row extracted
13ea0 20 66 72 6f 6d 20 51 75 65 75 65 20 69 73 20 6f   from Queue is o
13eb0 75 74 70 75 74 20 74 6f 20 70 44 65 73 74 2e 20  utput to pDest. 
13ec0 20 54 68 65 6e 20 74 68 65 20 73 69 6e 67 6c 65   Then the single
13ed0 0a 2a 2a 20 65 78 74 72 61 63 74 65 64 20 72 6f  .** extracted ro
13ee0 77 20 28 6e 6f 77 20 69 6e 20 74 68 65 20 69 43  w (now in the iC
13ef0 75 72 72 65 6e 74 20 74 61 62 6c 65 29 20 62 65  urrent table) be
13f00 63 6f 6d 65 73 20 74 68 65 20 63 6f 6e 74 65 6e  comes the conten
13f10 74 20 6f 66 20 74 68 65 0a 2a 2a 20 72 65 63 75  t of the.** recu
13f20 72 73 69 76 65 2d 74 61 62 6c 65 20 66 6f 72 20  rsive-table for 
13f30 61 20 72 65 63 75 72 73 69 76 65 2d 71 75 65 72  a recursive-quer
13f40 79 20 72 75 6e 2e 20 20 54 68 65 20 6f 75 74 70  y run.  The outp
13f50 75 74 20 6f 66 20 74 68 65 20 72 65 63 75 72 73  ut of the recurs
13f60 69 76 65 2d 71 75 65 72 79 0a 2a 2a 20 69 73 20  ive-query.** is 
13f70 61 64 64 65 64 20 62 61 63 6b 20 69 6e 74 6f 20  added back into 
13f80 74 68 65 20 51 75 65 75 65 20 74 61 62 6c 65 2e  the Queue table.
13f90 20 20 54 68 65 6e 20 61 6e 6f 74 68 65 72 20 72    Then another r
13fa0 6f 77 20 69 73 20 65 78 74 72 61 63 74 65 64 20  ow is extracted 
13fb0 66 72 6f 6d 20 51 75 65 75 65 0a 2a 2a 20 61 6e  from Queue.** an
13fc0 64 20 74 68 65 20 69 74 65 72 61 74 69 6f 6e 20  d the iteration 
13fd0 63 6f 6e 74 69 6e 75 65 73 20 75 6e 74 69 6c 20  continues until 
13fe0 74 68 65 20 51 75 65 75 65 20 74 61 62 6c 65 20  the Queue table 
13ff0 69 73 20 65 6d 70 74 79 2e 0a 2a 2a 0a 2a 2a 20  is empty..**.** 
14000 49 66 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20  If the compound 
14010 71 75 65 72 79 20 6f 70 65 72 61 74 6f 72 20 69  query operator i
14020 73 20 55 4e 49 4f 4e 20 74 68 65 6e 20 6e 6f 20  s UNION then no 
14030 64 75 70 6c 69 63 61 74 65 20 72 6f 77 73 20 61  duplicate rows a
14040 72 65 20 65 76 65 72 0a 2a 2a 20 69 6e 73 65 72  re ever.** inser
14050 74 65 64 20 69 6e 74 6f 20 74 68 65 20 51 75 65  ted into the Que
14060 75 65 20 74 61 62 6c 65 2e 20 20 54 68 65 20 69  ue table.  The i
14070 44 69 73 74 69 6e 63 74 20 74 61 62 6c 65 20 6b  Distinct table k
14080 65 65 70 73 20 61 20 63 6f 70 79 20 6f 66 20 61  eeps a copy of a
14090 6c 6c 20 72 6f 77 73 0a 2a 2a 20 74 68 61 74 20  ll rows.** that 
140a0 68 61 76 65 20 65 76 65 72 20 62 65 65 6e 20 69  have ever been i
140b0 6e 73 65 72 74 65 64 20 69 6e 74 6f 20 51 75 65  nserted into Que
140c0 75 65 20 61 6e 64 20 63 61 75 73 65 73 20 64 75  ue and causes du
140d0 70 6c 69 63 61 74 65 73 20 74 6f 20 62 65 0a 2a  plicates to be.*
140e0 2a 20 64 69 73 63 61 72 64 65 64 2e 20 20 49 66  * discarded.  If
140f0 20 74 68 65 20 6f 70 65 72 61 74 6f 72 20 69 73   the operator is
14100 20 55 4e 49 4f 4e 20 41 4c 4c 2c 20 74 68 65 6e   UNION ALL, then
14110 20 64 75 70 6c 69 63 61 74 65 73 20 61 72 65 20   duplicates are 
14120 61 6c 6c 6f 77 65 64 2e 0a 2a 2a 20 0a 2a 2a 20  allowed..** .** 
14130 49 66 20 74 68 65 20 71 75 65 72 79 20 68 61 73  If the query has
14140 20 61 6e 20 4f 52 44 45 52 20 42 59 2c 20 74 68   an ORDER BY, th
14150 65 6e 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68  en entries in th
14160 65 20 51 75 65 75 65 20 74 61 62 6c 65 20 61 72  e Queue table ar
14170 65 20 6b 65 70 74 20 69 6e 0a 2a 2a 20 4f 52 44  e kept in.** ORD
14180 45 52 20 42 59 20 6f 72 64 65 72 20 61 6e 64 20  ER BY order and 
14190 74 68 65 20 66 69 72 73 74 20 65 6e 74 72 79 20  the first entry 
141a0 69 73 20 65 78 74 72 61 63 74 65 64 20 66 6f 72  is extracted for
141b0 20 65 61 63 68 20 63 79 63 6c 65 2e 20 20 57 69   each cycle.  Wi
141c0 74 68 6f 75 74 0a 2a 2a 20 61 6e 20 4f 52 44 45  thout.** an ORDE
141d0 52 20 42 59 2c 20 74 68 65 20 51 75 65 75 65 20  R BY, the Queue 
141e0 74 61 62 6c 65 20 69 73 20 6a 75 73 74 20 61 20  table is just a 
141f0 46 49 46 4f 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  FIFO..**.** If a
14200 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 20 69 73   LIMIT clause is
14210 20 70 72 6f 76 69 64 65 64 2c 20 74 68 65 6e 20   provided, then 
14220 74 68 65 20 69 74 65 72 61 74 69 6f 6e 20 73 74  the iteration st
14230 6f 70 73 20 61 66 74 65 72 20 4c 49 4d 49 54 20  ops after LIMIT 
14240 72 6f 77 73 0a 2a 2a 20 68 61 76 65 20 62 65 65  rows.** have bee
14250 6e 20 6f 75 74 70 75 74 20 74 6f 20 70 44 65 73  n output to pDes
14260 74 2e 20 20 41 20 4c 49 4d 49 54 20 6f 66 20 7a  t.  A LIMIT of z
14270 65 72 6f 20 6d 65 61 6e 73 20 74 6f 20 6f 75 74  ero means to out
14280 70 75 74 20 6e 6f 20 72 6f 77 73 20 61 6e 64 20  put no rows and 
14290 61 0a 2a 2a 20 6e 65 67 61 74 69 76 65 20 4c 49  a.** negative LI
142a0 4d 49 54 20 6d 65 61 6e 73 20 74 6f 20 6f 75 74  MIT means to out
142b0 70 75 74 20 61 6c 6c 20 72 6f 77 73 2e 20 20 49  put all rows.  I
142c0 66 20 74 68 65 72 65 20 69 73 20 61 6c 73 6f 20  f there is also 
142d0 61 6e 20 4f 46 46 53 45 54 20 63 6c 61 75 73 65  an OFFSET clause
142e0 0a 2a 2a 20 77 69 74 68 20 61 20 70 6f 73 69 74  .** with a posit
142f0 69 76 65 20 76 61 6c 75 65 2c 20 74 68 65 6e 20  ive value, then 
14300 74 68 65 20 66 69 72 73 74 20 4f 46 46 53 45 54  the first OFFSET
14310 20 6f 75 74 70 75 74 73 20 61 72 65 20 64 69 73   outputs are dis
14320 63 61 72 64 65 64 20 72 61 74 68 65 72 0a 2a 2a  carded rather.**
14330 20 74 68 61 6e 20 62 65 69 6e 67 20 73 65 6e 74   than being sent
14340 20 74 6f 20 70 44 65 73 74 2e 20 20 54 68 65 20   to pDest.  The 
14350 4c 49 4d 49 54 20 63 6f 75 6e 74 20 64 6f 65 73  LIMIT count does
14360 20 6e 6f 74 20 62 65 67 69 6e 20 75 6e 74 69 6c   not begin until
14370 20 61 66 74 65 72 20 4f 46 46 53 45 54 0a 2a 2a   after OFFSET.**
14380 20 72 6f 77 73 20 68 61 76 65 20 62 65 65 6e 20   rows have been 
14390 73 6b 69 70 70 65 64 2e 0a 2a 2f 0a 73 74 61 74  skipped..*/.stat
143a0 69 63 20 76 6f 69 64 20 67 65 6e 65 72 61 74 65  ic void generate
143b0 57 69 74 68 52 65 63 75 72 73 69 76 65 51 75 65  WithRecursiveQue
143c0 72 79 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  ry(.  Parse *pPa
143d0 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50  rse,        /* P
143e0 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
143f0 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20  /.  Select *p,  
14400 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
14410 20 72 65 63 75 72 73 69 76 65 20 53 45 4c 45 43   recursive SELEC
14420 54 20 74 6f 20 62 65 20 63 6f 64 65 64 20 2a 2f  T to be coded */
14430 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 2a 70  .  SelectDest *p
14440 44 65 73 74 20 20 20 20 20 2f 2a 20 57 68 61 74  Dest     /* What
14450 20 74 6f 20 64 6f 20 77 69 74 68 20 71 75 65 72   to do with quer
14460 79 20 72 65 73 75 6c 74 73 20 2a 2f 0a 29 7b 0a  y results */.){.
14470 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63 20    SrcList *pSrc 
14480 3d 20 70 2d 3e 70 53 72 63 3b 20 20 20 20 20 20  = p->pSrc;      
14490 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c 61 75  /* The FROM clau
144a0 73 65 20 6f 66 20 74 68 65 20 72 65 63 75 72 73  se of the recurs
144b0 69 76 65 20 71 75 65 72 79 20 2a 2f 0a 20 20 69  ive query */.  i
144c0 6e 74 20 6e 43 6f 6c 20 3d 20 70 2d 3e 70 45 4c  nt nCol = p->pEL
144d0 69 73 74 2d 3e 6e 45 78 70 72 3b 20 20 2f 2a 20  ist->nExpr;  /* 
144e0 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e  Number of column
144f0 73 20 69 6e 20 74 68 65 20 72 65 63 75 72 73 69  s in the recursi
14500 76 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 56 64  ve table */.  Vd
14510 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
14520 70 56 64 62 65 3b 20 20 20 20 20 20 2f 2a 20 54  pVdbe;      /* T
14530 68 65 20 70 72 65 70 61 72 65 64 20 73 74 61 74  he prepared stat
14540 65 6d 65 6e 74 20 75 6e 64 65 72 20 63 6f 6e 73  ement under cons
14550 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 53 65  truction */.  Se
14560 6c 65 63 74 20 2a 70 53 65 74 75 70 20 3d 20 70  lect *pSetup = p
14570 2d 3e 70 50 72 69 6f 72 3b 20 20 20 2f 2a 20 54  ->pPrior;   /* T
14580 68 65 20 73 65 74 75 70 20 71 75 65 72 79 20 2a  he setup query *
14590 2f 0a 20 20 69 6e 74 20 61 64 64 72 54 6f 70 3b  /.  int addrTop;
145a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
145b0 20 20 2f 2a 20 54 6f 70 20 6f 66 20 74 68 65 20    /* Top of the 
145c0 6c 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74 20 61 64  loop */.  int ad
145d0 64 72 43 6f 6e 74 2c 20 61 64 64 72 42 72 65 61  drCont, addrBrea
145e0 6b 3b 20 20 20 20 20 20 2f 2a 20 43 4f 4e 54 49  k;      /* CONTI
145f0 4e 55 45 20 61 6e 64 20 42 52 45 41 4b 20 61 64  NUE and BREAK ad
14600 64 72 65 73 73 65 73 20 2a 2f 0a 20 20 69 6e 74  dresses */.  int
14610 20 69 43 75 72 72 65 6e 74 20 3d 20 30 3b 20 20   iCurrent = 0;  
14620 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
14630 65 20 43 75 72 72 65 6e 74 20 74 61 62 6c 65 20  e Current table 
14640 2a 2f 0a 20 20 69 6e 74 20 72 65 67 43 75 72 72  */.  int regCurr
14650 65 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  ent;            
14660 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 68     /* Register h
14670 6f 6c 64 69 6e 67 20 43 75 72 72 65 6e 74 20 74  olding Current t
14680 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 51  able */.  int iQ
14690 75 65 75 65 3b 20 20 20 20 20 20 20 20 20 20 20  ueue;           
146a0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 51          /* The Q
146b0 75 65 75 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20  ueue table */.  
146c0 69 6e 74 20 69 44 69 73 74 69 6e 63 74 20 3d 20  int iDistinct = 
146d0 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  0;            /*
146e0 20 54 6f 20 65 6e 73 75 72 65 20 75 6e 69 71 75   To ensure uniqu
146f0 65 20 72 65 73 75 6c 74 73 20 69 66 20 55 4e 49  e results if UNI
14700 4f 4e 20 2a 2f 0a 20 20 69 6e 74 20 65 44 65 73  ON */.  int eDes
14710 74 20 3d 20 53 52 54 5f 46 69 66 6f 3b 20 20 20  t = SRT_Fifo;   
14720 20 20 20 20 20 20 2f 2a 20 48 6f 77 20 74 6f 20        /* How to 
14730 77 72 69 74 65 20 74 6f 20 51 75 65 75 65 20 2a  write to Queue *
14740 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 64  /.  SelectDest d
14750 65 73 74 51 75 65 75 65 3b 20 20 20 20 20 20 20  estQueue;       
14760 20 20 2f 2a 20 53 65 6c 65 63 74 44 65 73 74 20    /* SelectDest 
14770 74 61 72 67 65 74 74 69 6e 67 20 74 68 65 20 51  targetting the Q
14780 75 65 75 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20  ueue table */.  
14790 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20  int i;          
147a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
147b0 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   Loop counter */
147c0 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
147d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
147e0 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20   /* Result code 
147f0 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
14800 4f 72 64 65 72 42 79 3b 20 20 20 20 20 20 20 20  OrderBy;        
14810 20 20 20 2f 2a 20 54 68 65 20 4f 52 44 45 52 20     /* The ORDER 
14820 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45  BY clause */.  E
14830 78 70 72 20 2a 70 4c 69 6d 69 74 3b 20 20 20 20  xpr *pLimit;    
14840 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
14850 53 61 76 65 64 20 4c 49 4d 49 54 20 61 6e 64 20  Saved LIMIT and 
14860 4f 46 46 53 45 54 20 2a 2f 0a 20 20 69 6e 74 20  OFFSET */.  int 
14870 72 65 67 4c 69 6d 69 74 2c 20 72 65 67 4f 66 66  regLimit, regOff
14880 73 65 74 3b 20 20 20 20 20 20 2f 2a 20 52 65 67  set;      /* Reg
14890 69 73 74 65 72 73 20 75 73 65 64 20 62 79 20 4c  isters used by L
148a0 49 4d 49 54 20 61 6e 64 20 4f 46 46 53 45 54 20  IMIT and OFFSET 
148b0 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  */..#ifndef SQLI
148c0 54 45 5f 4f 4d 49 54 5f 57 49 4e 44 4f 57 46 55  TE_OMIT_WINDOWFU
148d0 4e 43 0a 20 20 69 66 28 20 70 2d 3e 70 57 69 6e  NC.  if( p->pWin
148e0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
148f0 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
14900 22 63 61 6e 6e 6f 74 20 75 73 65 20 77 69 6e 64  "cannot use wind
14910 6f 77 20 66 75 6e 63 74 69 6f 6e 73 20 69 6e 20  ow functions in 
14920 72 65 63 75 72 73 69 76 65 20 71 75 65 72 69 65  recursive querie
14930 73 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b  s");.    return;
14940 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  .  }.#endif..  /
14950 2a 20 4f 62 74 61 69 6e 20 61 75 74 68 6f 72 69  * Obtain authori
14960 7a 61 74 69 6f 6e 20 74 6f 20 64 6f 20 61 20 72  zation to do a r
14970 65 63 75 72 73 69 76 65 20 71 75 65 72 79 20 2a  ecursive query *
14980 2f 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 41  /.  if( sqlite3A
14990 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c  uthCheck(pParse,
149a0 20 53 51 4c 49 54 45 5f 52 45 43 55 52 53 49 56   SQLITE_RECURSIV
149b0 45 2c 20 30 2c 20 30 2c 20 30 29 20 29 20 72 65  E, 0, 0, 0) ) re
149c0 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20 50 72 6f 63  turn;..  /* Proc
149d0 65 73 73 20 74 68 65 20 4c 49 4d 49 54 20 61 6e  ess the LIMIT an
149e0 64 20 4f 46 46 53 45 54 20 63 6c 61 75 73 65 73  d OFFSET clauses
149f0 2c 20 69 66 20 74 68 65 79 20 65 78 69 73 74 20  , if they exist 
14a00 2a 2f 0a 20 20 61 64 64 72 42 72 65 61 6b 20 3d  */.  addrBreak =
14a10 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
14a20 4c 61 62 65 6c 28 70 50 61 72 73 65 29 3b 0a 20  Label(pParse);. 
14a30 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d   p->nSelectRow =
14a40 20 33 32 30 3b 20 20 2f 2a 20 34 20 62 69 6c 6c   320;  /* 4 bill
14a50 69 6f 6e 20 72 6f 77 73 20 2a 2f 0a 20 20 63 6f  ion rows */.  co
14a60 6d 70 75 74 65 4c 69 6d 69 74 52 65 67 69 73 74  mputeLimitRegist
14a70 65 72 73 28 70 50 61 72 73 65 2c 20 70 2c 20 61  ers(pParse, p, a
14a80 64 64 72 42 72 65 61 6b 29 3b 0a 20 20 70 4c 69  ddrBreak);.  pLi
14a90 6d 69 74 20 3d 20 70 2d 3e 70 4c 69 6d 69 74 3b  mit = p->pLimit;
14aa0 0a 20 20 72 65 67 4c 69 6d 69 74 20 3d 20 70 2d  .  regLimit = p-
14ab0 3e 69 4c 69 6d 69 74 3b 0a 20 20 72 65 67 4f 66  >iLimit;.  regOf
14ac0 66 73 65 74 20 3d 20 70 2d 3e 69 4f 66 66 73 65  fset = p->iOffse
14ad0 74 3b 0a 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d  t;.  p->pLimit =
14ae0 20 30 3b 0a 20 20 70 2d 3e 69 4c 69 6d 69 74 20   0;.  p->iLimit 
14af0 3d 20 70 2d 3e 69 4f 66 66 73 65 74 20 3d 20 30  = p->iOffset = 0
14b00 3b 0a 20 20 70 4f 72 64 65 72 42 79 20 3d 20 70  ;.  pOrderBy = p
14b10 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 0a 20 20 2f  ->pOrderBy;..  /
14b20 2a 20 4c 6f 63 61 74 65 20 74 68 65 20 63 75 72  * Locate the cur
14b30 73 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20 74 68  sor number of th
14b40 65 20 43 75 72 72 65 6e 74 20 74 61 62 6c 65 20  e Current table 
14b50 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 41 4c  */.  for(i=0; AL
14b60 57 41 59 53 28 69 3c 70 53 72 63 2d 3e 6e 53 72  WAYS(i<pSrc->nSr
14b70 63 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  c); i++){.    if
14b80 28 20 70 53 72 63 2d 3e 61 5b 69 5d 2e 66 67 2e  ( pSrc->a[i].fg.
14b90 69 73 52 65 63 75 72 73 69 76 65 20 29 7b 0a 20  isRecursive ){. 
14ba0 20 20 20 20 20 69 43 75 72 72 65 6e 74 20 3d 20       iCurrent = 
14bb0 70 53 72 63 2d 3e 61 5b 69 5d 2e 69 43 75 72 73  pSrc->a[i].iCurs
14bc0 6f 72 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  or;.      break;
14bd0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
14be0 20 41 6c 6c 6f 63 61 74 65 20 63 75 72 73 6f 72   Allocate cursor
14bf0 73 20 6e 75 6d 62 65 72 73 20 66 6f 72 20 51 75  s numbers for Qu
14c00 65 75 65 20 61 6e 64 20 44 69 73 74 69 6e 63 74  eue and Distinct
14c10 2e 20 20 54 68 65 20 63 75 72 73 6f 72 20 6e 75  .  The cursor nu
14c20 6d 62 65 72 20 66 6f 72 0a 20 20 2a 2a 20 74 68  mber for.  ** th
14c30 65 20 44 69 73 74 69 6e 63 74 20 74 61 62 6c 65  e Distinct table
14c40 20 6d 75 73 74 20 62 65 20 65 78 61 63 74 6c 79   must be exactly
14c50 20 6f 6e 65 20 67 72 65 61 74 65 72 20 74 68 61   one greater tha
14c60 6e 20 51 75 65 75 65 20 69 6e 20 6f 72 64 65 72  n Queue in order
14c70 0a 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 53 52  .  ** for the SR
14c80 54 5f 44 69 73 74 46 69 66 6f 20 61 6e 64 20 53  T_DistFifo and S
14c90 52 54 5f 44 69 73 74 51 75 65 75 65 20 64 65 73  RT_DistQueue des
14ca0 74 69 6e 61 74 69 6f 6e 73 20 74 6f 20 77 6f 72  tinations to wor
14cb0 6b 2e 20 2a 2f 0a 20 20 69 51 75 65 75 65 20 3d  k. */.  iQueue =
14cc0 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b   pParse->nTab++;
14cd0 0a 20 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b  .  if( p->op==TK
14ce0 5f 55 4e 49 4f 4e 20 29 7b 0a 20 20 20 20 65 44  _UNION ){.    eD
14cf0 65 73 74 20 3d 20 70 4f 72 64 65 72 42 79 20 3f  est = pOrderBy ?
14d00 20 53 52 54 5f 44 69 73 74 51 75 65 75 65 20 3a   SRT_DistQueue :
14d10 20 53 52 54 5f 44 69 73 74 46 69 66 6f 3b 0a 20   SRT_DistFifo;. 
14d20 20 20 20 69 44 69 73 74 69 6e 63 74 20 3d 20 70     iDistinct = p
14d30 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20  Parse->nTab++;. 
14d40 20 7d 65 6c 73 65 7b 0a 20 20 20 20 65 44 65 73   }else{.    eDes
14d50 74 20 3d 20 70 4f 72 64 65 72 42 79 20 3f 20 53  t = pOrderBy ? S
14d60 52 54 5f 51 75 65 75 65 20 3a 20 53 52 54 5f 46  RT_Queue : SRT_F
14d70 69 66 6f 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  ifo;.  }.  sqlit
14d80 65 33 53 65 6c 65 63 74 44 65 73 74 49 6e 69 74  e3SelectDestInit
14d90 28 26 64 65 73 74 51 75 65 75 65 2c 20 65 44 65  (&destQueue, eDe
14da0 73 74 2c 20 69 51 75 65 75 65 29 3b 0a 0a 20 20  st, iQueue);..  
14db0 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 63 75 72 73  /* Allocate curs
14dc0 6f 72 73 20 66 6f 72 20 43 75 72 72 65 6e 74 2c  ors for Current,
14dd0 20 51 75 65 75 65 2c 20 61 6e 64 20 44 69 73 74   Queue, and Dist
14de0 69 6e 63 74 2e 20 2a 2f 0a 20 20 72 65 67 43 75  inct. */.  regCu
14df0 72 72 65 6e 74 20 3d 20 2b 2b 70 50 61 72 73 65  rrent = ++pParse
14e00 2d 3e 6e 4d 65 6d 3b 0a 20 20 73 71 6c 69 74 65  ->nMem;.  sqlite
14e10 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
14e20 50 5f 4f 70 65 6e 50 73 65 75 64 6f 2c 20 69 43  P_OpenPseudo, iC
14e30 75 72 72 65 6e 74 2c 20 72 65 67 43 75 72 72 65  urrent, regCurre
14e40 6e 74 2c 20 6e 43 6f 6c 29 3b 0a 20 20 69 66 28  nt, nCol);.  if(
14e50 20 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20   pOrderBy ){.   
14e60 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e   KeyInfo *pKeyIn
14e70 66 6f 20 3d 20 6d 75 6c 74 69 53 65 6c 65 63 74  fo = multiSelect
14e80 4f 72 64 65 72 42 79 4b 65 79 49 6e 66 6f 28 70  OrderByKeyInfo(p
14e90 50 61 72 73 65 2c 20 70 2c 20 31 29 3b 0a 20 20  Parse, p, 1);.  
14ea0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
14eb0 4f 70 34 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70  Op4(v, OP_OpenEp
14ec0 68 65 6d 65 72 61 6c 2c 20 69 51 75 65 75 65 2c  hemeral, iQueue,
14ed0 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72   pOrderBy->nExpr
14ee0 2b 32 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20  +2, 0,.         
14ef0 20 20 20 20 20 20 20 20 20 20 20 20 20 28 63 68               (ch
14f00 61 72 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50 34  ar*)pKeyInfo, P4
14f10 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 20 20 64  _KEYINFO);.    d
14f20 65 73 74 51 75 65 75 65 2e 70 4f 72 64 65 72 42  estQueue.pOrderB
14f30 79 20 3d 20 70 4f 72 64 65 72 42 79 3b 0a 20 20  y = pOrderBy;.  
14f40 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74  }else{.    sqlit
14f50 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
14f60 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c  OP_OpenEphemeral
14f70 2c 20 69 51 75 65 75 65 2c 20 6e 43 6f 6c 29 3b  , iQueue, nCol);
14f80 0a 20 20 7d 0a 20 20 56 64 62 65 43 6f 6d 6d 65  .  }.  VdbeComme
14f90 6e 74 28 28 76 2c 20 22 51 75 65 75 65 20 74 61  nt((v, "Queue ta
14fa0 62 6c 65 22 29 29 3b 0a 20 20 69 66 28 20 69 44  ble"));.  if( iD
14fb0 69 73 74 69 6e 63 74 20 29 7b 0a 20 20 20 20 70  istinct ){.    p
14fc0 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 30  ->addrOpenEphm[0
14fd0 5d 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  ] = sqlite3VdbeA
14fe0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e  ddOp2(v, OP_Open
14ff0 45 70 68 65 6d 65 72 61 6c 2c 20 69 44 69 73 74  Ephemeral, iDist
15000 69 6e 63 74 2c 20 30 29 3b 0a 20 20 20 20 70 2d  inct, 0);.    p-
15010 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f  >selFlags |= SF_
15020 55 73 65 73 45 70 68 65 6d 65 72 61 6c 3b 0a 20  UsesEphemeral;. 
15030 20 7d 0a 0a 20 20 2f 2a 20 44 65 74 61 63 68 20   }..  /* Detach 
15040 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
15050 75 73 65 20 66 72 6f 6d 20 74 68 65 20 63 6f 6d  use from the com
15060 70 6f 75 6e 64 20 53 45 4c 45 43 54 20 2a 2f 0a  pound SELECT */.
15070 20 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20    p->pOrderBy = 
15080 30 3b 0a 0a 20 20 2f 2a 20 53 74 6f 72 65 20 74  0;..  /* Store t
15090 68 65 20 72 65 73 75 6c 74 73 20 6f 66 20 74 68  he results of th
150a0 65 20 73 65 74 75 70 2d 71 75 65 72 79 20 69 6e  e setup-query in
150b0 20 51 75 65 75 65 2e 20 2a 2f 0a 20 20 70 53 65   Queue. */.  pSe
150c0 74 75 70 2d 3e 70 4e 65 78 74 20 3d 20 30 3b 0a  tup->pNext = 0;.
150d0 20 20 45 78 70 6c 61 69 6e 51 75 65 72 79 50 6c    ExplainQueryPl
150e0 61 6e 28 28 70 50 61 72 73 65 2c 20 31 2c 20 22  an((pParse, 1, "
150f0 53 45 54 55 50 22 29 29 3b 0a 20 20 72 63 20 3d  SETUP"));.  rc =
15100 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70   sqlite3Select(p
15110 50 61 72 73 65 2c 20 70 53 65 74 75 70 2c 20 26  Parse, pSetup, &
15120 64 65 73 74 51 75 65 75 65 29 3b 0a 20 20 70 53  destQueue);.  pS
15130 65 74 75 70 2d 3e 70 4e 65 78 74 20 3d 20 70 3b  etup->pNext = p;
15140 0a 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f  .  if( rc ) goto
15150 20 65 6e 64 5f 6f 66 5f 72 65 63 75 72 73 69 76   end_of_recursiv
15160 65 5f 71 75 65 72 79 3b 0a 0a 20 20 2f 2a 20 46  e_query;..  /* F
15170 69 6e 64 20 74 68 65 20 6e 65 78 74 20 72 6f 77  ind the next row
15180 20 69 6e 20 74 68 65 20 51 75 65 75 65 20 61 6e   in the Queue an
15190 64 20 6f 75 74 70 75 74 20 74 68 61 74 20 72 6f  d output that ro
151a0 77 20 2a 2f 0a 20 20 61 64 64 72 54 6f 70 20 3d  w */.  addrTop =
151b0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
151c0 70 32 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c  p2(v, OP_Rewind,
151d0 20 69 51 75 65 75 65 2c 20 61 64 64 72 42 72 65   iQueue, addrBre
151e0 61 6b 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  ak); VdbeCoverag
151f0 65 28 76 29 3b 0a 0a 20 20 2f 2a 20 54 72 61 6e  e(v);..  /* Tran
15200 73 66 65 72 20 74 68 65 20 6e 65 78 74 20 72 6f  sfer the next ro
15210 77 20 69 6e 20 51 75 65 75 65 20 6f 76 65 72 20  w in Queue over 
15220 74 6f 20 43 75 72 72 65 6e 74 20 2a 2f 0a 20 20  to Current */.  
15230 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
15240 31 28 76 2c 20 4f 50 5f 4e 75 6c 6c 52 6f 77 2c  1(v, OP_NullRow,
15250 20 69 43 75 72 72 65 6e 74 29 3b 20 2f 2a 20 54   iCurrent); /* T
15260 6f 20 72 65 73 65 74 20 63 6f 6c 75 6d 6e 20 63  o reset column c
15270 61 63 68 65 20 2a 2f 0a 20 20 69 66 28 20 70 4f  ache */.  if( pO
15280 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 73 71  rderBy ){.    sq
15290 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
152a0 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69 51  v, OP_Column, iQ
152b0 75 65 75 65 2c 20 70 4f 72 64 65 72 42 79 2d 3e  ueue, pOrderBy->
152c0 6e 45 78 70 72 2b 31 2c 20 72 65 67 43 75 72 72  nExpr+1, regCurr
152d0 65 6e 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ent);.  }else{. 
152e0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
152f0 64 4f 70 32 28 76 2c 20 4f 50 5f 52 6f 77 44 61  dOp2(v, OP_RowDa
15300 74 61 2c 20 69 51 75 65 75 65 2c 20 72 65 67 43  ta, iQueue, regC
15310 75 72 72 65 6e 74 29 3b 0a 20 20 7d 0a 20 20 73  urrent);.  }.  s
15320 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
15330 28 76 2c 20 4f 50 5f 44 65 6c 65 74 65 2c 20 69  (v, OP_Delete, i
15340 51 75 65 75 65 29 3b 0a 0a 20 20 2f 2a 20 4f 75  Queue);..  /* Ou
15350 74 70 75 74 20 74 68 65 20 73 69 6e 67 6c 65 20  tput the single 
15360 72 6f 77 20 69 6e 20 43 75 72 72 65 6e 74 20 2a  row in Current *
15370 2f 0a 20 20 61 64 64 72 43 6f 6e 74 20 3d 20 73  /.  addrCont = s
15380 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
15390 62 65 6c 28 70 50 61 72 73 65 29 3b 0a 20 20 63  bel(pParse);.  c
153a0 6f 64 65 4f 66 66 73 65 74 28 76 2c 20 72 65 67  odeOffset(v, reg
153b0 4f 66 66 73 65 74 2c 20 61 64 64 72 43 6f 6e 74  Offset, addrCont
153c0 29 3b 0a 20 20 73 65 6c 65 63 74 49 6e 6e 65 72  );.  selectInner
153d0 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20 70 2c 20  Loop(pParse, p, 
153e0 69 43 75 72 72 65 6e 74 2c 0a 20 20 20 20 20 20  iCurrent,.      
153f0 30 2c 20 30 2c 20 70 44 65 73 74 2c 20 61 64 64  0, 0, pDest, add
15400 72 43 6f 6e 74 2c 20 61 64 64 72 42 72 65 61 6b  rCont, addrBreak
15410 29 3b 0a 20 20 69 66 28 20 72 65 67 4c 69 6d 69  );.  if( regLimi
15420 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  t ){.    sqlite3
15430 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
15440 5f 44 65 63 72 4a 75 6d 70 5a 65 72 6f 2c 20 72  _DecrJumpZero, r
15450 65 67 4c 69 6d 69 74 2c 20 61 64 64 72 42 72 65  egLimit, addrBre
15460 61 6b 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 76  ak);.    VdbeCov
15470 65 72 61 67 65 28 76 29 3b 0a 20 20 7d 0a 20 20  erage(v);.  }.  
15480 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
15490 76 65 4c 61 62 65 6c 28 76 2c 20 61 64 64 72 43  veLabel(v, addrC
154a0 6f 6e 74 29 3b 0a 0a 20 20 2f 2a 20 45 78 65 63  ont);..  /* Exec
154b0 75 74 65 20 74 68 65 20 72 65 63 75 72 73 69 76  ute the recursiv
154c0 65 20 53 45 4c 45 43 54 20 74 61 6b 69 6e 67 20  e SELECT taking 
154d0 74 68 65 20 73 69 6e 67 6c 65 20 72 6f 77 20 69  the single row i
154e0 6e 20 43 75 72 72 65 6e 74 20 61 73 0a 20 20 2a  n Current as.  *
154f0 2a 20 74 68 65 20 76 61 6c 75 65 20 66 6f 72 20  * the value for 
15500 74 68 65 20 72 65 63 75 72 73 69 76 65 2d 74 61  the recursive-ta
15510 62 6c 65 2e 20 53 74 6f 72 65 20 74 68 65 20 72  ble. Store the r
15520 65 73 75 6c 74 73 20 69 6e 20 74 68 65 20 51 75  esults in the Qu
15530 65 75 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  eue..  */.  if( 
15540 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46  p->selFlags & SF
15550 5f 41 67 67 72 65 67 61 74 65 20 29 7b 0a 20 20  _Aggregate ){.  
15560 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
15570 67 28 70 50 61 72 73 65 2c 20 22 72 65 63 75 72  g(pParse, "recur
15580 73 69 76 65 20 61 67 67 72 65 67 61 74 65 20 71  sive aggregate q
15590 75 65 72 69 65 73 20 6e 6f 74 20 73 75 70 70 6f  ueries not suppo
155a0 72 74 65 64 22 29 3b 0a 20 20 7d 65 6c 73 65 7b  rted");.  }else{
155b0 0a 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d  .    p->pPrior =
155c0 20 30 3b 0a 20 20 20 20 45 78 70 6c 61 69 6e 51   0;.    ExplainQ
155d0 75 65 72 79 50 6c 61 6e 28 28 70 50 61 72 73 65  ueryPlan((pParse
155e0 2c 20 31 2c 20 22 52 45 43 55 52 53 49 56 45 20  , 1, "RECURSIVE 
155f0 53 54 45 50 22 29 29 3b 0a 20 20 20 20 73 71 6c  STEP"));.    sql
15600 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73  ite3Select(pPars
15610 65 2c 20 70 2c 20 26 64 65 73 74 51 75 65 75 65  e, p, &destQueue
15620 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
15630 2d 3e 70 50 72 69 6f 72 3d 3d 30 20 29 3b 0a 20  ->pPrior==0 );. 
15640 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70     p->pPrior = p
15650 53 65 74 75 70 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  Setup;.  }..  /*
15660 20 4b 65 65 70 20 72 75 6e 6e 69 6e 67 20 74 68   Keep running th
15670 65 20 6c 6f 6f 70 20 75 6e 74 69 6c 20 74 68 65  e loop until the
15680 20 51 75 65 75 65 20 69 73 20 65 6d 70 74 79 20   Queue is empty 
15690 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  */.  sqlite3Vdbe
156a0 47 6f 74 6f 28 76 2c 20 61 64 64 72 54 6f 70 29  Goto(v, addrTop)
156b0 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 52  ;.  sqlite3VdbeR
156c0 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61  esolveLabel(v, a
156d0 64 64 72 42 72 65 61 6b 29 3b 0a 0a 65 6e 64 5f  ddrBreak);..end_
156e0 6f 66 5f 72 65 63 75 72 73 69 76 65 5f 71 75 65  of_recursive_que
156f0 72 79 3a 0a 20 20 73 71 6c 69 74 65 33 45 78 70  ry:.  sqlite3Exp
15700 72 4c 69 73 74 44 65 6c 65 74 65 28 70 50 61 72  rListDelete(pPar
15710 73 65 2d 3e 64 62 2c 20 70 2d 3e 70 4f 72 64 65  se->db, p->pOrde
15720 72 42 79 29 3b 0a 20 20 70 2d 3e 70 4f 72 64 65  rBy);.  p->pOrde
15730 72 42 79 20 3d 20 70 4f 72 64 65 72 42 79 3b 0a  rBy = pOrderBy;.
15740 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 70 4c    p->pLimit = pL
15750 69 6d 69 74 3b 0a 20 20 72 65 74 75 72 6e 3b 0a  imit;.  return;.
15760 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
15770 54 45 5f 4f 4d 49 54 5f 43 54 45 20 2a 2f 0a 0a  TE_OMIT_CTE */..
15780 2f 2a 20 46 6f 72 77 61 72 64 20 72 65 66 65 72  /* Forward refer
15790 65 6e 63 65 73 20 2a 2f 0a 73 74 61 74 69 63 20  ences */.static 
157a0 69 6e 74 20 6d 75 6c 74 69 53 65 6c 65 63 74 4f  int multiSelectO
157b0 72 64 65 72 42 79 28 0a 20 20 50 61 72 73 65 20  rderBy(.  Parse 
157c0 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
157d0 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
157e0 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  xt */.  Select *
157f0 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  p,            /*
15800 20 54 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20   The right-most 
15810 6f 66 20 53 45 4c 45 43 54 73 20 74 6f 20 62 65  of SELECTs to be
15820 20 63 6f 64 65 64 20 2a 2f 0a 20 20 53 65 6c 65   coded */.  Sele
15830 63 74 44 65 73 74 20 2a 70 44 65 73 74 20 20 20  ctDest *pDest   
15840 20 20 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f 20    /* What to do 
15850 77 69 74 68 20 71 75 65 72 79 20 72 65 73 75 6c  with query resul
15860 74 73 20 2a 2f 0a 29 3b 0a 0a 2f 2a 0a 2a 2a 20  ts */.);../*.** 
15870 48 61 6e 64 6c 65 20 74 68 65 20 73 70 65 63 69  Handle the speci
15880 61 6c 20 63 61 73 65 20 6f 66 20 61 20 63 6f 6d  al case of a com
15890 70 6f 75 6e 64 2d 73 65 6c 65 63 74 20 74 68 61  pound-select tha
158a0 74 20 6f 72 69 67 69 6e 61 74 65 73 20 66 72 6f  t originates fro
158b0 6d 20 61 0a 2a 2a 20 56 41 4c 55 45 53 20 63 6c  m a.** VALUES cl
158c0 61 75 73 65 2e 20 20 42 79 20 68 61 6e 64 6c 69  ause.  By handli
158d0 6e 67 20 74 68 69 73 20 61 73 20 61 20 73 70 65  ng this as a spe
158e0 63 69 61 6c 20 63 61 73 65 2c 20 77 65 20 61 76  cial case, we av
158f0 6f 69 64 20 64 65 65 70 0a 2a 2a 20 72 65 63 75  oid deep.** recu
15900 72 73 69 6f 6e 2c 20 61 6e 64 20 74 68 75 73 20  rsion, and thus 
15910 64 6f 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 65  do not need to e
15920 6e 66 6f 72 63 65 20 74 68 65 20 53 51 4c 49 54  nforce the SQLIT
15930 45 5f 4c 49 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44  E_LIMIT_COMPOUND
15940 5f 53 45 4c 45 43 54 0a 2a 2a 20 6f 6e 20 61 20  _SELECT.** on a 
15950 56 41 4c 55 45 53 20 63 6c 61 75 73 65 2e 0a 2a  VALUES clause..*
15960 2a 0a 2a 2a 20 42 65 63 61 75 73 65 20 74 68 65  *.** Because the
15970 20 53 65 6c 65 63 74 20 6f 62 6a 65 63 74 20 6f   Select object o
15980 72 69 67 69 6e 61 74 65 73 20 66 72 6f 6d 20 61  riginates from a
15990 20 56 41 4c 55 45 53 20 63 6c 61 75 73 65 3a 0a   VALUES clause:.
159a0 2a 2a 20 20 20 28 31 29 20 54 68 65 72 65 20 69  **   (1) There i
159b0 73 20 6e 6f 20 4c 49 4d 49 54 20 6f 72 20 4f 46  s no LIMIT or OF
159c0 46 53 45 54 20 6f 72 20 65 6c 73 65 20 74 68 65  FSET or else the
159d0 72 65 20 69 73 20 61 20 4c 49 4d 49 54 20 6f 66  re is a LIMIT of
159e0 20 65 78 61 63 74 6c 79 20 31 0a 2a 2a 20 20 20   exactly 1.**   
159f0 28 32 29 20 41 6c 6c 20 74 65 72 6d 73 20 61 72  (2) All terms ar
15a00 65 20 55 4e 49 4f 4e 20 41 4c 4c 0a 2a 2a 20 20  e UNION ALL.**  
15a10 20 28 33 29 20 54 68 65 72 65 20 69 73 20 6e 6f   (3) There is no
15a20 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
15a30 0a 2a 2a 0a 2a 2a 20 54 68 65 20 22 4c 49 4d 49  .**.** The "LIMI
15a40 54 20 6f 66 20 65 78 61 63 74 6c 79 20 31 22 20  T of exactly 1" 
15a50 63 61 73 65 20 6f 66 20 63 6f 6e 64 69 74 69 6f  case of conditio
15a60 6e 20 28 31 29 20 63 6f 6d 65 73 20 61 62 6f 75  n (1) comes abou
15a70 74 20 77 68 65 6e 20 61 20 56 41 4c 55 45 53 0a  t when a VALUES.
15a80 2a 2a 20 63 6c 61 75 73 65 20 6f 63 63 75 72 73  ** clause occurs
15a90 20 77 69 74 68 69 6e 20 73 63 61 6c 61 72 20 65   within scalar e
15aa0 78 70 72 65 73 73 69 6f 6e 20 28 65 78 3a 20 22  xpression (ex: "
15ab0 53 45 4c 45 43 54 20 28 56 41 4c 55 45 53 28 31  SELECT (VALUES(1
15ac0 29 2c 28 32 29 2c 28 33 29 29 22 29 2e 0a 2a 2a  ),(2),(3))")..**
15ad0 20 54 68 65 20 73 71 6c 69 74 65 33 43 6f 64 65   The sqlite3Code
15ae0 53 75 62 73 65 6c 65 63 74 20 77 69 6c 6c 20 68  Subselect will h
15af0 61 76 65 20 61 64 64 65 64 20 74 68 65 20 4c 49  ave added the LI
15b00 4d 49 54 20 31 20 63 6c 61 75 73 65 20 69 6e 20  MIT 1 clause in 
15b10 74 68 74 20 63 61 73 65 2e 0a 2a 2a 20 53 69 6e  tht case..** Sin
15b20 63 65 20 74 68 65 20 6c 69 6d 69 74 20 69 73 20  ce the limit is 
15b30 65 78 61 63 74 6c 79 20 31 2c 20 77 65 20 6f 6e  exactly 1, we on
15b40 6c 79 20 6e 65 65 64 20 74 6f 20 65 76 61 6c 75  ly need to evalu
15b50 74 65 73 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73  tes the left-mos
15b60 74 20 56 41 4c 55 45 53 2e 0a 2a 2f 0a 73 74 61  t VALUES..*/.sta
15b70 74 69 63 20 69 6e 74 20 6d 75 6c 74 69 53 65 6c  tic int multiSel
15b80 65 63 74 56 61 6c 75 65 73 28 0a 20 20 50 61 72  ectValues(.  Par
15b90 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
15ba0 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
15bb0 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63  ntext */.  Selec
15bc0 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  t *p,           
15bd0 20 2f 2a 20 54 68 65 20 72 69 67 68 74 2d 6d 6f   /* The right-mo
15be0 73 74 20 6f 66 20 53 45 4c 45 43 54 73 20 74 6f  st of SELECTs to
15bf0 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20 53   be coded */.  S
15c00 65 6c 65 63 74 44 65 73 74 20 2a 70 44 65 73 74  electDest *pDest
15c10 20 20 20 20 20 2f 2a 20 57 68 61 74 20 74 6f 20       /* What to 
15c20 64 6f 20 77 69 74 68 20 71 75 65 72 79 20 72 65  do with query re
15c30 73 75 6c 74 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e  sults */.){.  in
15c40 74 20 6e 52 6f 77 20 3d 20 31 3b 0a 20 20 69 6e  t nRow = 1;.  in
15c50 74 20 72 63 20 3d 20 30 3b 0a 20 20 69 6e 74 20  t rc = 0;.  int 
15c60 62 53 68 6f 77 41 6c 6c 20 3d 20 70 2d 3e 70 4c  bShowAll = p->pL
15c70 69 6d 69 74 3d 3d 30 3b 0a 20 20 61 73 73 65 72  imit==0;.  asser
15c80 74 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26  t( p->selFlags &
15c90 20 53 46 5f 4d 75 6c 74 69 56 61 6c 75 65 20 29   SF_MultiValue )
15ca0 3b 0a 20 20 64 6f 7b 0a 20 20 20 20 61 73 73 65  ;.  do{.    asse
15cb0 72 74 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20  rt( p->selFlags 
15cc0 26 20 53 46 5f 56 61 6c 75 65 73 20 29 3b 0a 20  & SF_Values );. 
15cd0 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6f 70     assert( p->op
15ce0 3d 3d 54 4b 5f 41 4c 4c 20 7c 7c 20 28 70 2d 3e  ==TK_ALL || (p->
15cf0 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 26 26  op==TK_SELECT &&
15d00 20 70 2d 3e 70 50 72 69 6f 72 3d 3d 30 29 20 29   p->pPrior==0) )
15d10 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  ;.    assert( p-
15d20 3e 70 4e 65 78 74 3d 3d 30 20 7c 7c 20 70 2d 3e  >pNext==0 || p->
15d30 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 70  pEList->nExpr==p
15d40 2d 3e 70 4e 65 78 74 2d 3e 70 45 4c 69 73 74 2d  ->pNext->pEList-
15d50 3e 6e 45 78 70 72 20 29 3b 0a 20 20 20 20 69 66  >nExpr );.    if
15d60 28 20 70 2d 3e 70 50 72 69 6f 72 3d 3d 30 20 29  ( p->pPrior==0 )
15d70 20 62 72 65 61 6b 3b 0a 20 20 20 20 61 73 73 65   break;.    asse
15d80 72 74 28 20 70 2d 3e 70 50 72 69 6f 72 2d 3e 70  rt( p->pPrior->p
15d90 4e 65 78 74 3d 3d 70 20 29 3b 0a 20 20 20 20 70  Next==p );.    p
15da0 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20   = p->pPrior;.  
15db0 20 20 6e 52 6f 77 20 2b 3d 20 62 53 68 6f 77 41    nRow += bShowA
15dc0 6c 6c 3b 0a 20 20 7d 77 68 69 6c 65 28 31 29 3b  ll;.  }while(1);
15dd0 0a 20 20 45 78 70 6c 61 69 6e 51 75 65 72 79 50  .  ExplainQueryP
15de0 6c 61 6e 28 28 70 50 61 72 73 65 2c 20 30 2c 20  lan((pParse, 0, 
15df0 22 53 43 41 4e 20 25 64 20 43 4f 4e 53 54 41 4e  "SCAN %d CONSTAN
15e00 54 20 52 4f 57 25 73 22 2c 20 6e 52 6f 77 2c 0a  T ROW%s", nRow,.
15e10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15e20 20 20 20 20 6e 52 6f 77 3d 3d 31 20 3f 20 22 22      nRow==1 ? ""
15e30 20 3a 20 22 53 22 29 29 3b 0a 20 20 77 68 69 6c   : "S"));.  whil
15e40 65 28 20 70 20 29 7b 0a 20 20 20 20 73 65 6c 65  e( p ){.    sele
15e50 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72  ctInnerLoop(pPar
15e60 73 65 2c 20 70 2c 20 2d 31 2c 20 30 2c 20 30 2c  se, p, -1, 0, 0,
15e70 20 70 44 65 73 74 2c 20 31 2c 20 31 29 3b 0a 20   pDest, 1, 1);. 
15e80 20 20 20 69 66 28 20 21 62 53 68 6f 77 41 6c 6c     if( !bShowAll
15e90 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 70 2d   ) break;.    p-
15ea0 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 6e 52  >nSelectRow = nR
15eb0 6f 77 3b 0a 20 20 20 20 70 20 3d 20 70 2d 3e 70  ow;.    p = p->p
15ec0 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 72 65 74 75  Next;.  }.  retu
15ed0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
15ee0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
15ef0 63 61 6c 6c 65 64 20 74 6f 20 70 72 6f 63 65 73  called to proces
15f00 73 20 61 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65  s a compound que
15f10 72 79 20 66 6f 72 6d 20 66 72 6f 6d 0a 2a 2a 20  ry form from.** 
15f20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 73 65 70 61  two or more sepa
15f30 72 61 74 65 20 71 75 65 72 69 65 73 20 75 73 69  rate queries usi
15f40 6e 67 20 55 4e 49 4f 4e 2c 20 55 4e 49 4f 4e 20  ng UNION, UNION 
15f50 41 4c 4c 2c 20 45 58 43 45 50 54 2c 20 6f 72 0a  ALL, EXCEPT, or.
15f60 2a 2a 20 49 4e 54 45 52 53 45 43 54 0a 2a 2a 0a  ** INTERSECT.**.
15f70 2a 2a 20 22 70 22 20 70 6f 69 6e 74 73 20 74 6f  ** "p" points to
15f80 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20   the right-most 
15f90 6f 66 20 74 68 65 20 74 77 6f 20 71 75 65 72 69  of the two queri
15fa0 65 73 2e 20 20 74 68 65 20 71 75 65 72 79 20 6f  es.  the query o
15fb0 6e 20 74 68 65 0a 2a 2a 20 6c 65 66 74 20 69 73  n the.** left is
15fc0 20 70 2d 3e 70 50 72 69 6f 72 2e 20 20 54 68 65   p->pPrior.  The
15fd0 20 6c 65 66 74 20 71 75 65 72 79 20 63 6f 75 6c   left query coul
15fe0 64 20 61 6c 73 6f 20 62 65 20 61 20 63 6f 6d 70  d also be a comp
15ff0 6f 75 6e 64 20 71 75 65 72 79 0a 2a 2a 20 69 6e  ound query.** in
16000 20 77 68 69 63 68 20 63 61 73 65 20 74 68 69 73   which case this
16010 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 62 65   routine will be
16020 20 63 61 6c 6c 65 64 20 72 65 63 75 72 73 69 76   called recursiv
16030 65 6c 79 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ely. .**.** The 
16040 72 65 73 75 6c 74 73 20 6f 66 20 74 68 65 20 74  results of the t
16050 6f 74 61 6c 20 71 75 65 72 79 20 61 72 65 20 74  otal query are t
16060 6f 20 62 65 20 77 72 69 74 74 65 6e 20 69 6e 74  o be written int
16070 6f 20 61 20 64 65 73 74 69 6e 61 74 69 6f 6e 0a  o a destination.
16080 2a 2a 20 6f 66 20 74 79 70 65 20 65 44 65 73 74  ** of type eDest
16090 20 77 69 74 68 20 70 61 72 61 6d 65 74 65 72 20   with parameter 
160a0 69 50 61 72 6d 2e 0a 2a 2a 0a 2a 2a 20 45 78 61  iParm..**.** Exa
160b0 6d 70 6c 65 20 31 3a 20 20 43 6f 6e 73 69 64 65  mple 1:  Conside
160c0 72 20 61 20 74 68 72 65 65 2d 77 61 79 20 63 6f  r a three-way co
160d0 6d 70 6f 75 6e 64 20 53 51 4c 20 73 74 61 74 65  mpound SQL state
160e0 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20  ment..**.**     
160f0 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 74 31  SELECT a FROM t1
16100 20 55 4e 49 4f 4e 20 53 45 4c 45 43 54 20 62 20   UNION SELECT b 
16110 46 52 4f 4d 20 74 32 20 55 4e 49 4f 4e 20 53 45  FROM t2 UNION SE
16120 4c 45 43 54 20 63 20 46 52 4f 4d 20 74 33 0a 2a  LECT c FROM t3.*
16130 2a 0a 2a 2a 20 54 68 69 73 20 73 74 61 74 65 6d  *.** This statem
16140 65 6e 74 20 69 73 20 70 61 72 73 65 64 20 75 70  ent is parsed up
16150 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a   as follows:.**.
16160 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 63 20  **     SELECT c 
16170 46 52 4f 4d 20 74 33 0a 2a 2a 20 20 20 20 20 20  FROM t3.**      
16180 7c 0a 2a 2a 20 20 20 20 20 20 60 2d 2d 2d 2d 2d  |.**      `-----
16190 3e 20 20 53 45 4c 45 43 54 20 62 20 46 52 4f 4d  >  SELECT b FROM
161a0 20 74 32 0a 2a 2a 20 20 20 20 20 20 20 20 20 20   t2.**          
161b0 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20        |.**      
161c0 20 20 20 20 20 20 20 20 20 20 60 2d 2d 2d 2d 2d            `-----
161d0 2d 3e 20 20 53 45 4c 45 43 54 20 61 20 46 52 4f  ->  SELECT a FRO
161e0 4d 20 74 31 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61  M t1.**.** The a
161f0 72 72 6f 77 73 20 69 6e 20 74 68 65 20 64 69 61  rrows in the dia
16200 67 72 61 6d 20 61 62 6f 76 65 20 72 65 70 72 65  gram above repre
16210 73 65 6e 74 20 74 68 65 20 53 65 6c 65 63 74 2e  sent the Select.
16220 70 50 72 69 6f 72 20 70 6f 69 6e 74 65 72 2e 0a  pPrior pointer..
16230 2a 2a 20 53 6f 20 69 66 20 74 68 69 73 20 72 6f  ** So if this ro
16240 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
16250 77 69 74 68 20 70 20 65 71 75 61 6c 20 74 6f 20  with p equal to 
16260 74 68 65 20 74 33 20 71 75 65 72 79 2c 20 74 68  the t3 query, th
16270 65 6e 0a 2a 2a 20 70 50 72 69 6f 72 20 77 69 6c  en.** pPrior wil
16280 6c 20 62 65 20 74 68 65 20 74 32 20 71 75 65 72  l be the t2 quer
16290 79 2e 20 20 70 2d 3e 6f 70 20 77 69 6c 6c 20 62  y.  p->op will b
162a0 65 20 54 4b 5f 55 4e 49 4f 4e 20 69 6e 20 74 68  e TK_UNION in th
162b0 69 73 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 4e  is case..**.** N
162c0 6f 74 69 63 65 20 74 68 61 74 20 62 65 63 61 75  otice that becau
162d0 73 65 20 6f 66 20 74 68 65 20 77 61 79 20 53 51  se of the way SQ
162e0 4c 69 74 65 20 70 61 72 73 65 73 20 63 6f 6d 70  Lite parses comp
162f0 6f 75 6e 64 20 53 45 4c 45 43 54 73 2c 20 74 68  ound SELECTs, th
16300 65 0a 2a 2a 20 69 6e 64 69 76 69 64 75 61 6c 20  e.** individual 
16310 73 65 6c 65 63 74 73 20 61 6c 77 61 79 73 20 67  selects always g
16320 72 6f 75 70 20 66 72 6f 6d 20 6c 65 66 74 20 74  roup from left t
16330 6f 20 72 69 67 68 74 2e 0a 2a 2f 0a 73 74 61 74  o right..*/.stat
16340 69 63 20 69 6e 74 20 6d 75 6c 74 69 53 65 6c 65  ic int multiSele
16350 63 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  ct(.  Parse *pPa
16360 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50  rse,        /* P
16370 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
16380 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20  /.  Select *p,  
16390 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
163a0 20 72 69 67 68 74 2d 6d 6f 73 74 20 6f 66 20 53   right-most of S
163b0 45 4c 45 43 54 73 20 74 6f 20 62 65 20 63 6f 64  ELECTs to be cod
163c0 65 64 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65  ed */.  SelectDe
163d0 73 74 20 2a 70 44 65 73 74 20 20 20 20 20 2f 2a  st *pDest     /*
163e0 20 57 68 61 74 20 74 6f 20 64 6f 20 77 69 74 68   What to do with
163f0 20 71 75 65 72 79 20 72 65 73 75 6c 74 73 20 2a   query results *
16400 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  /.){.  int rc = 
16410 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 2f 2a 20  SQLITE_OK;   /* 
16420 53 75 63 63 65 73 73 20 63 6f 64 65 20 66 72 6f  Success code fro
16430 6d 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20 2a  m a subroutine *
16440 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 50 72 69  /.  Select *pPri
16450 6f 72 3b 20 20 20 20 20 20 20 2f 2a 20 41 6e 6f  or;       /* Ano
16460 74 68 65 72 20 53 45 4c 45 43 54 20 69 6d 6d 65  ther SELECT imme
16470 64 69 61 74 65 6c 79 20 74 6f 20 6f 75 72 20 6c  diately to our l
16480 65 66 74 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76  eft */.  Vdbe *v
16490 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
164a0 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
164b0 74 6f 20 74 68 69 73 20 56 44 42 45 20 2a 2f 0a  to this VDBE */.
164c0 20 20 53 65 6c 65 63 74 44 65 73 74 20 64 65 73    SelectDest des
164d0 74 3b 20 20 20 20 20 20 2f 2a 20 41 6c 74 65 72  t;      /* Alter
164e0 6e 61 74 69 76 65 20 64 61 74 61 20 64 65 73 74  native data dest
164f0 69 6e 61 74 69 6f 6e 20 2a 2f 0a 20 20 53 65 6c  ination */.  Sel
16500 65 63 74 20 2a 70 44 65 6c 65 74 65 20 3d 20 30  ect *pDelete = 0
16510 3b 20 20 2f 2a 20 43 68 61 69 6e 20 6f 66 20 73  ;  /* Chain of s
16520 69 6d 70 6c 65 20 73 65 6c 65 63 74 73 20 74 6f  imple selects to
16530 20 64 65 6c 65 74 65 20 2a 2f 0a 20 20 73 71 6c   delete */.  sql
16540 69 74 65 33 20 2a 64 62 3b 20 20 20 20 20 20 20  ite3 *db;       
16550 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63     /* Database c
16560 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 0a 20 20  onnection */..  
16570 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65  /* Make sure the
16580 72 65 20 69 73 20 6e 6f 20 4f 52 44 45 52 20 42  re is no ORDER B
16590 59 20 6f 72 20 4c 49 4d 49 54 20 63 6c 61 75 73  Y or LIMIT claus
165a0 65 20 6f 6e 20 70 72 69 6f 72 20 53 45 4c 45 43  e on prior SELEC
165b0 54 73 2e 20 20 4f 6e 6c 79 0a 20 20 2a 2a 20 74  Ts.  Only.  ** t
165c0 68 65 20 6c 61 73 74 20 28 72 69 67 68 74 2d 6d  he last (right-m
165d0 6f 73 74 29 20 53 45 4c 45 43 54 20 69 6e 20 74  ost) SELECT in t
165e0 68 65 20 73 65 72 69 65 73 20 6d 61 79 20 68 61  he series may ha
165f0 76 65 20 61 6e 20 4f 52 44 45 52 20 42 59 20 6f  ve an ORDER BY o
16600 72 20 4c 49 4d 49 54 2e 0a 20 20 2a 2f 0a 20 20  r LIMIT..  */.  
16610 61 73 73 65 72 74 28 20 70 20 26 26 20 70 2d 3e  assert( p && p->
16620 70 50 72 69 6f 72 20 29 3b 20 20 2f 2a 20 43 61  pPrior );  /* Ca
16630 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 67  lling function g
16640 75 61 72 61 6e 74 65 65 73 20 74 68 69 73 20 6d  uarantees this m
16650 75 63 68 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  uch */.  assert(
16660 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20   (p->selFlags & 
16670 53 46 5f 52 65 63 75 72 73 69 76 65 29 3d 3d 30  SF_Recursive)==0
16680 20 7c 7c 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c   || p->op==TK_AL
16690 4c 20 7c 7c 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55  L || p->op==TK_U
166a0 4e 49 4f 4e 20 29 3b 0a 20 20 61 73 73 65 72 74  NION );.  assert
166b0 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20  ( p->selFlags & 
166c0 53 46 5f 43 6f 6d 70 6f 75 6e 64 20 29 3b 0a 20  SF_Compound );. 
166d0 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62   db = pParse->db
166e0 3b 0a 20 20 70 50 72 69 6f 72 20 3d 20 70 2d 3e  ;.  pPrior = p->
166f0 70 50 72 69 6f 72 3b 0a 20 20 64 65 73 74 20 3d  pPrior;.  dest =
16700 20 2a 70 44 65 73 74 3b 0a 20 20 69 66 28 20 70   *pDest;.  if( p
16710 50 72 69 6f 72 2d 3e 70 4f 72 64 65 72 42 79 20  Prior->pOrderBy 
16720 7c 7c 20 70 50 72 69 6f 72 2d 3e 70 4c 69 6d 69  || pPrior->pLimi
16730 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  t ){.    sqlite3
16740 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
16750 22 25 73 20 63 6c 61 75 73 65 20 73 68 6f 75 6c  "%s clause shoul
16760 64 20 63 6f 6d 65 20 61 66 74 65 72 20 25 73 20  d come after %s 
16770 6e 6f 74 20 62 65 66 6f 72 65 22 2c 0a 20 20 20  not before",.   
16780 20 20 20 70 50 72 69 6f 72 2d 3e 70 4f 72 64 65     pPrior->pOrde
16790 72 42 79 21 3d 30 20 3f 20 22 4f 52 44 45 52 20  rBy!=0 ? "ORDER 
167a0 42 59 22 20 3a 20 22 4c 49 4d 49 54 22 2c 20 73  BY" : "LIMIT", s
167b0 65 6c 65 63 74 4f 70 4e 61 6d 65 28 70 2d 3e 6f  electOpName(p->o
167c0 70 29 29 3b 0a 20 20 20 20 72 63 20 3d 20 31 3b  p));.    rc = 1;
167d0 0a 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f  .    goto multi_
167e0 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a  select_end;.  }.
167f0 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65  .  v = sqlite3Ge
16800 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20  tVdbe(pParse);. 
16810 20 61 73 73 65 72 74 28 20 76 21 3d 30 20 29 3b   assert( v!=0 );
16820 20 20 2f 2a 20 54 68 65 20 56 44 42 45 20 61 6c    /* The VDBE al
16830 72 65 61 64 79 20 63 72 65 61 74 65 64 20 62 79  ready created by
16840 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f   calling functio
16850 6e 20 2a 2f 0a 0a 20 20 2f 2a 20 43 72 65 61 74  n */..  /* Creat
16860 65 20 74 68 65 20 64 65 73 74 69 6e 61 74 69 6f  e the destinatio
16870 6e 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  n temporary tabl
16880 65 20 69 66 20 6e 65 63 65 73 73 61 72 79 0a 20  e if necessary. 
16890 20 2a 2f 0a 20 20 69 66 28 20 64 65 73 74 2e 65   */.  if( dest.e
168a0 44 65 73 74 3d 3d 53 52 54 5f 45 70 68 65 6d 54  Dest==SRT_EphemT
168b0 61 62 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  ab ){.    assert
168c0 28 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20  ( p->pEList );. 
168d0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
168e0 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45  dOp2(v, OP_OpenE
168f0 70 68 65 6d 65 72 61 6c 2c 20 64 65 73 74 2e 69  phemeral, dest.i
16900 53 44 50 61 72 6d 2c 20 70 2d 3e 70 45 4c 69 73  SDParm, p->pELis
16910 74 2d 3e 6e 45 78 70 72 29 3b 0a 20 20 20 20 64  t->nExpr);.    d
16920 65 73 74 2e 65 44 65 73 74 20 3d 20 53 52 54 5f  est.eDest = SRT_
16930 54 61 62 6c 65 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  Table;.  }..  /*
16940 20 53 70 65 63 69 61 6c 20 68 61 6e 64 6c 69 6e   Special handlin
16950 67 20 66 6f 72 20 61 20 63 6f 6d 70 6f 75 6e 64  g for a compound
16960 2d 73 65 6c 65 63 74 20 74 68 61 74 20 6f 72 69  -select that ori
16970 67 69 6e 61 74 65 73 20 61 73 20 61 20 56 41 4c  ginates as a VAL
16980 55 45 53 20 63 6c 61 75 73 65 2e 0a 20 20 2a 2f  UES clause..  */
16990 0a 20 20 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61  .  if( p->selFla
169a0 67 73 20 26 20 53 46 5f 4d 75 6c 74 69 56 61 6c  gs & SF_MultiVal
169b0 75 65 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 6d  ue ){.    rc = m
169c0 75 6c 74 69 53 65 6c 65 63 74 56 61 6c 75 65 73  ultiSelectValues
169d0 28 70 50 61 72 73 65 2c 20 70 2c 20 26 64 65 73  (pParse, p, &des
169e0 74 29 3b 0a 20 20 20 20 67 6f 74 6f 20 6d 75 6c  t);.    goto mul
169f0 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20  ti_select_end;. 
16a00 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75   }..  /* Make su
16a10 72 65 20 61 6c 6c 20 53 45 4c 45 43 54 73 20 69  re all SELECTs i
16a20 6e 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  n the statement 
16a30 68 61 76 65 20 74 68 65 20 73 61 6d 65 20 6e 75  have the same nu
16a40 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73  mber of elements
16a50 0a 20 20 2a 2a 20 69 6e 20 74 68 65 69 72 20 72  .  ** in their r
16a60 65 73 75 6c 74 20 73 65 74 73 2e 0a 20 20 2a 2f  esult sets..  */
16a70 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45  .  assert( p->pE
16a80 4c 69 73 74 20 26 26 20 70 50 72 69 6f 72 2d 3e  List && pPrior->
16a90 70 45 4c 69 73 74 20 29 3b 0a 20 20 61 73 73 65  pEList );.  asse
16aa0 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e  rt( p->pEList->n
16ab0 45 78 70 72 3d 3d 70 50 72 69 6f 72 2d 3e 70 45  Expr==pPrior->pE
16ac0 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 3b 0a 0a  List->nExpr );..
16ad0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
16ae0 4d 49 54 5f 43 54 45 0a 20 20 69 66 28 20 70 2d  MIT_CTE.  if( p-
16af0 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 52  >selFlags & SF_R
16b00 65 63 75 72 73 69 76 65 20 29 7b 0a 20 20 20 20  ecursive ){.    
16b10 67 65 6e 65 72 61 74 65 57 69 74 68 52 65 63 75  generateWithRecu
16b20 72 73 69 76 65 51 75 65 72 79 28 70 50 61 72 73  rsiveQuery(pPars
16b30 65 2c 20 70 2c 20 26 64 65 73 74 29 3b 0a 20 20  e, p, &dest);.  
16b40 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 0a 20 20  }else.#endif..  
16b50 2f 2a 20 43 6f 6d 70 6f 75 6e 64 20 53 45 4c 45  /* Compound SELE
16b60 43 54 73 20 74 68 61 74 20 68 61 76 65 20 61 6e  CTs that have an
16b70 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
16b80 20 61 72 65 20 68 61 6e 64 6c 65 64 20 73 65 70   are handled sep
16b90 61 72 61 74 65 6c 79 2e 0a 20 20 2a 2f 0a 20 20  arately..  */.  
16ba0 69 66 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 20  if( p->pOrderBy 
16bb0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 6d 75  ){.    return mu
16bc0 6c 74 69 53 65 6c 65 63 74 4f 72 64 65 72 42 79  ltiSelectOrderBy
16bd0 28 70 50 61 72 73 65 2c 20 70 2c 20 70 44 65 73  (pParse, p, pDes
16be0 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 0a 23 69  t);.  }else{..#i
16bf0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
16c00 54 5f 45 58 50 4c 41 49 4e 0a 20 20 20 20 69 66  T_EXPLAIN.    if
16c10 28 20 70 50 72 69 6f 72 2d 3e 70 50 72 69 6f 72  ( pPrior->pPrior
16c20 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 45 78 70  ==0 ){.      Exp
16c30 6c 61 69 6e 51 75 65 72 79 50 6c 61 6e 28 28 70  lainQueryPlan((p
16c40 50 61 72 73 65 2c 20 31 2c 20 22 43 4f 4d 50 4f  Parse, 1, "COMPO
16c50 55 4e 44 20 51 55 45 52 59 22 29 29 3b 0a 20 20  UND QUERY"));.  
16c60 20 20 20 20 45 78 70 6c 61 69 6e 51 75 65 72 79      ExplainQuery
16c70 50 6c 61 6e 28 28 70 50 61 72 73 65 2c 20 31 2c  Plan((pParse, 1,
16c80 20 22 4c 45 46 54 2d 4d 4f 53 54 20 53 55 42 51   "LEFT-MOST SUBQ
16c90 55 45 52 59 22 29 29 3b 0a 20 20 20 20 7d 0a 23  UERY"));.    }.#
16ca0 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 47 65  endif..    /* Ge
16cb0 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20  nerate code for 
16cc0 74 68 65 20 6c 65 66 74 20 61 6e 64 20 72 69 67  the left and rig
16cd0 68 74 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  ht SELECT statem
16ce0 65 6e 74 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ents..    */.   
16cf0 20 73 77 69 74 63 68 28 20 70 2d 3e 6f 70 20 29   switch( p->op )
16d00 7b 0a 20 20 20 20 20 20 63 61 73 65 20 54 4b 5f  {.      case TK_
16d10 41 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 20 20 69  ALL: {.        i
16d20 6e 74 20 61 64 64 72 20 3d 20 30 3b 0a 20 20 20  nt addr = 0;.   
16d30 20 20 20 20 20 69 6e 74 20 6e 4c 69 6d 69 74 3b       int nLimit;
16d40 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
16d50 20 21 70 50 72 69 6f 72 2d 3e 70 4c 69 6d 69 74   !pPrior->pLimit
16d60 20 29 3b 0a 20 20 20 20 20 20 20 20 70 50 72 69   );.        pPri
16d70 6f 72 2d 3e 69 4c 69 6d 69 74 20 3d 20 70 2d 3e  or->iLimit = p->
16d80 69 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 20 20  iLimit;.        
16d90 70 50 72 69 6f 72 2d 3e 69 4f 66 66 73 65 74 20  pPrior->iOffset 
16da0 3d 20 70 2d 3e 69 4f 66 66 73 65 74 3b 0a 20 20  = p->iOffset;.  
16db0 20 20 20 20 20 20 70 50 72 69 6f 72 2d 3e 70 4c        pPrior->pL
16dc0 69 6d 69 74 20 3d 20 70 2d 3e 70 4c 69 6d 69 74  imit = p->pLimit
16dd0 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  ;.        rc = s
16de0 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61  qlite3Select(pPa
16df0 72 73 65 2c 20 70 50 72 69 6f 72 2c 20 26 64 65  rse, pPrior, &de
16e00 73 74 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e  st);.        p->
16e10 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20  pLimit = 0;.    
16e20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
16e30 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c          goto mul
16e40 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20  ti_select_end;. 
16e50 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
16e60 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a   p->pPrior = 0;.
16e70 20 20 20 20 20 20 20 20 70 2d 3e 69 4c 69 6d 69          p->iLimi
16e80 74 20 3d 20 70 50 72 69 6f 72 2d 3e 69 4c 69 6d  t = pPrior->iLim
16e90 69 74 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 69  it;.        p->i
16ea0 4f 66 66 73 65 74 20 3d 20 70 50 72 69 6f 72 2d  Offset = pPrior-
16eb0 3e 69 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20  >iOffset;.      
16ec0 20 20 69 66 28 20 70 2d 3e 69 4c 69 6d 69 74 20    if( p->iLimit 
16ed0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 64 64  ){.          add
16ee0 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  r = sqlite3VdbeA
16ef0 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66 4e 6f  ddOp1(v, OP_IfNo
16f00 74 2c 20 70 2d 3e 69 4c 69 6d 69 74 29 3b 20 56  t, p->iLimit); V
16f10 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
16f20 20 20 20 20 20 20 20 20 20 20 56 64 62 65 43 6f            VdbeCo
16f30 6d 6d 65 6e 74 28 28 76 2c 20 22 4a 75 6d 70 20  mment((v, "Jump 
16f40 61 68 65 61 64 20 69 66 20 4c 49 4d 49 54 20 72  ahead if LIMIT r
16f50 65 61 63 68 65 64 22 29 29 3b 0a 20 20 20 20 20  eached"));.     
16f60 20 20 20 20 20 69 66 28 20 70 2d 3e 69 4f 66 66       if( p->iOff
16f70 73 65 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20  set ){.         
16f80 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
16f90 64 4f 70 33 28 76 2c 20 4f 50 5f 4f 66 66 73 65  dOp3(v, OP_Offse
16fa0 74 4c 69 6d 69 74 2c 0a 20 20 20 20 20 20 20 20  tLimit,.        
16fb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16fc0 20 20 20 20 20 20 70 2d 3e 69 4c 69 6d 69 74 2c        p->iLimit,
16fd0 20 70 2d 3e 69 4f 66 66 73 65 74 2b 31 2c 20 70   p->iOffset+1, p
16fe0 2d 3e 69 4f 66 66 73 65 74 29 3b 0a 20 20 20 20  ->iOffset);.    
16ff0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
17000 7d 0a 20 20 20 20 20 20 20 20 45 78 70 6c 61 69  }.        Explai
17010 6e 51 75 65 72 79 50 6c 61 6e 28 28 70 50 61 72  nQueryPlan((pPar
17020 73 65 2c 20 31 2c 20 22 55 4e 49 4f 4e 20 41 4c  se, 1, "UNION AL
17030 4c 22 29 29 3b 0a 20 20 20 20 20 20 20 20 72 63  L"));.        rc
17040 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74   = sqlite3Select
17050 28 70 50 61 72 73 65 2c 20 70 2c 20 26 64 65 73  (pParse, p, &des
17060 74 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74  t);.        test
17070 63 61 73 65 28 20 72 63 21 3d 53 51 4c 49 54 45  case( rc!=SQLITE
17080 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 20 20 70  _OK );.        p
17090 44 65 6c 65 74 65 20 3d 20 70 2d 3e 70 50 72 69  Delete = p->pPri
170a0 6f 72 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 70  or;.        p->p
170b0 50 72 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a  Prior = pPrior;.
170c0 20 20 20 20 20 20 20 20 70 2d 3e 6e 53 65 6c 65          p->nSele
170d0 63 74 52 6f 77 20 3d 20 73 71 6c 69 74 65 33 4c  ctRow = sqlite3L
170e0 6f 67 45 73 74 41 64 64 28 70 2d 3e 6e 53 65 6c  ogEstAdd(p->nSel
170f0 65 63 74 52 6f 77 2c 20 70 50 72 69 6f 72 2d 3e  ectRow, pPrior->
17100 6e 53 65 6c 65 63 74 52 6f 77 29 3b 0a 20 20 20  nSelectRow);.   
17110 20 20 20 20 20 69 66 28 20 70 50 72 69 6f 72 2d       if( pPrior-
17120 3e 70 4c 69 6d 69 74 0a 20 20 20 20 20 20 20 20  >pLimit.        
17130 20 26 26 20 73 71 6c 69 74 65 33 45 78 70 72 49   && sqlite3ExprI
17140 73 49 6e 74 65 67 65 72 28 70 50 72 69 6f 72 2d  sInteger(pPrior-
17150 3e 70 4c 69 6d 69 74 2d 3e 70 4c 65 66 74 2c 20  >pLimit->pLeft, 
17160 26 6e 4c 69 6d 69 74 29 0a 20 20 20 20 20 20 20  &nLimit).       
17170 20 20 26 26 20 6e 4c 69 6d 69 74 3e 30 20 26 26    && nLimit>0 &&
17180 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3e   p->nSelectRow >
17190 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 28   sqlite3LogEst((
171a0 75 36 34 29 6e 4c 69 6d 69 74 29 20 0a 20 20 20  u64)nLimit) .   
171b0 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
171c0 20 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20    p->nSelectRow 
171d0 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28  = sqlite3LogEst(
171e0 28 75 36 34 29 6e 4c 69 6d 69 74 29 3b 0a 20 20  (u64)nLimit);.  
171f0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
17200 69 66 28 20 61 64 64 72 20 29 7b 0a 20 20 20 20  if( addr ){.    
17210 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
17220 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64  eJumpHere(v, add
17230 72 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  r);.        }.  
17240 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
17250 20 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65 20     }.      case 
17260 54 4b 5f 45 58 43 45 50 54 3a 0a 20 20 20 20 20  TK_EXCEPT:.     
17270 20 63 61 73 65 20 54 4b 5f 55 4e 49 4f 4e 3a 20   case TK_UNION: 
17280 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 75 6e  {.        int un
17290 69 6f 6e 54 61 62 3b 20 20 20 20 2f 2a 20 43 75  ionTab;    /* Cu
172a0 72 73 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20 74  rsor number of t
172b0 68 65 20 74 65 6d 70 20 74 61 62 6c 65 20 68 6f  he temp table ho
172c0 6c 64 69 6e 67 20 72 65 73 75 6c 74 20 2a 2f 0a  lding result */.
172d0 20 20 20 20 20 20 20 20 75 38 20 6f 70 20 3d 20          u8 op = 
172e0 30 3b 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20  0;       /* One 
172f0 6f 66 20 74 68 65 20 53 52 54 5f 20 6f 70 65 72  of the SRT_ oper
17300 61 74 69 6f 6e 73 20 74 6f 20 61 70 70 6c 79 20  ations to apply 
17310 74 6f 20 73 65 6c 66 20 2a 2f 0a 20 20 20 20 20  to self */.     
17320 20 20 20 69 6e 74 20 70 72 69 6f 72 4f 70 3b 20     int priorOp; 
17330 20 20 20 20 2f 2a 20 54 68 65 20 53 52 54 5f 20      /* The SRT_ 
17340 6f 70 65 72 61 74 69 6f 6e 20 74 6f 20 61 70 70  operation to app
17350 6c 79 20 74 6f 20 70 72 69 6f 72 20 73 65 6c 65  ly to prior sele
17360 63 74 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 45  cts */.        E
17370 78 70 72 20 2a 70 4c 69 6d 69 74 3b 20 20 20 20  xpr *pLimit;    
17380 2f 2a 20 53 61 76 65 64 20 76 61 6c 75 65 73 20  /* Saved values 
17390 6f 66 20 70 2d 3e 6e 4c 69 6d 69 74 20 20 2a 2f  of p->nLimit  */
173a0 0a 20 20 20 20 20 20 20 20 69 6e 74 20 61 64 64  .        int add
173b0 72 3b 0a 20 20 20 20 20 20 20 20 53 65 6c 65 63  r;.        Selec
173c0 74 44 65 73 74 20 75 6e 69 6f 6e 64 65 73 74 3b  tDest uniondest;
173d0 0a 20 20 0a 20 20 20 20 20 20 20 20 74 65 73 74  .  .        test
173e0 63 61 73 65 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f  case( p->op==TK_
173f0 45 58 43 45 50 54 20 29 3b 0a 20 20 20 20 20 20  EXCEPT );.      
17400 20 20 74 65 73 74 63 61 73 65 28 20 70 2d 3e 6f    testcase( p->o
17410 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29 3b 0a 20  p==TK_UNION );. 
17420 20 20 20 20 20 20 20 70 72 69 6f 72 4f 70 20 3d         priorOp =
17430 20 53 52 54 5f 55 6e 69 6f 6e 3b 0a 20 20 20 20   SRT_Union;.    
17440 20 20 20 20 69 66 28 20 64 65 73 74 2e 65 44 65      if( dest.eDe
17450 73 74 3d 3d 70 72 69 6f 72 4f 70 20 29 7b 0a 20  st==priorOp ){. 
17460 20 20 20 20 20 20 20 20 20 2f 2a 20 57 65 20 63           /* We c
17470 61 6e 20 72 65 75 73 65 20 61 20 74 65 6d 70 6f  an reuse a tempo
17480 72 61 72 79 20 74 61 62 6c 65 20 67 65 6e 65 72  rary table gener
17490 61 74 65 64 20 62 79 20 61 20 53 45 4c 45 43 54  ated by a SELECT
174a0 20 74 6f 20 6f 75 72 0a 20 20 20 20 20 20 20 20   to our.        
174b0 20 20 2a 2a 20 72 69 67 68 74 2e 0a 20 20 20 20    ** right..    
174c0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
174d0 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4c     assert( p->pL
174e0 69 6d 69 74 3d 3d 30 20 29 3b 20 20 20 20 20 20  imit==0 );      
174f0 2f 2a 20 4e 6f 74 20 61 6c 6c 6f 77 65 64 20 6f  /* Not allowed o
17500 6e 20 6c 65 66 74 77 61 72 64 20 65 6c 65 6d 65  n leftward eleme
17510 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  nts */.         
17520 20 75 6e 69 6f 6e 54 61 62 20 3d 20 64 65 73 74   unionTab = dest
17530 2e 69 53 44 50 61 72 6d 3b 0a 20 20 20 20 20 20  .iSDParm;.      
17540 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
17550 20 20 20 2f 2a 20 57 65 20 77 69 6c 6c 20 6e 65     /* We will ne
17560 65 64 20 74 6f 20 63 72 65 61 74 65 20 6f 75 72  ed to create our
17570 20 6f 77 6e 20 74 65 6d 70 6f 72 61 72 79 20 74   own temporary t
17580 61 62 6c 65 20 74 6f 20 68 6f 6c 64 20 74 68 65  able to hold the
17590 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69 6e  .          ** in
175a0 74 65 72 6d 65 64 69 61 74 65 20 72 65 73 75 6c  termediate resul
175b0 74 73 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f  ts..          */
175c0 0a 20 20 20 20 20 20 20 20 20 20 75 6e 69 6f 6e  .          union
175d0 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54  Tab = pParse->nT
175e0 61 62 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20  ab++;.          
175f0 61 73 73 65 72 74 28 20 70 2d 3e 70 4f 72 64 65  assert( p->pOrde
17600 72 42 79 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  rBy==0 );.      
17610 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74      addr = sqlit
17620 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
17630 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c  OP_OpenEphemeral
17640 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 30 29 3b 0a  , unionTab, 0);.
17650 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
17660 28 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68  ( p->addrOpenEph
17670 6d 5b 30 5d 20 3d 3d 20 2d 31 20 29 3b 0a 20 20  m[0] == -1 );.  
17680 20 20 20 20 20 20 20 20 70 2d 3e 61 64 64 72 4f          p->addrO
17690 70 65 6e 45 70 68 6d 5b 30 5d 20 3d 20 61 64 64  penEphm[0] = add
176a0 72 3b 0a 20 20 20 20 20 20 20 20 20 20 66 69 6e  r;.          fin
176b0 64 52 69 67 68 74 6d 6f 73 74 28 70 29 2d 3e 73  dRightmost(p)->s
176c0 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f 55 73  elFlags |= SF_Us
176d0 65 73 45 70 68 65 6d 65 72 61 6c 3b 0a 20 20 20  esEphemeral;.   
176e0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
176f0 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20 20 20  ->pEList );.    
17700 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 20 20 20      }.  .       
17710 20 2f 2a 20 43 6f 64 65 20 74 68 65 20 53 45 4c   /* Code the SEL
17720 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73 20 74  ECT statements t
17730 6f 20 6f 75 72 20 6c 65 66 74 0a 20 20 20 20 20  o our left.     
17740 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73     */.        as
17750 73 65 72 74 28 20 21 70 50 72 69 6f 72 2d 3e 70  sert( !pPrior->p
17760 4f 72 64 65 72 42 79 20 29 3b 0a 20 20 20 20 20  OrderBy );.     
17770 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74     sqlite3Select
17780 44 65 73 74 49 6e 69 74 28 26 75 6e 69 6f 6e 64  DestInit(&uniond
17790 65 73 74 2c 20 70 72 69 6f 72 4f 70 2c 20 75 6e  est, priorOp, un
177a0 69 6f 6e 54 61 62 29 3b 0a 20 20 20 20 20 20 20  ionTab);.       
177b0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53 65 6c   rc = sqlite3Sel
177c0 65 63 74 28 70 50 61 72 73 65 2c 20 70 50 72 69  ect(pParse, pPri
177d0 6f 72 2c 20 26 75 6e 69 6f 6e 64 65 73 74 29 3b  or, &uniondest);
177e0 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20  .        if( rc 
177f0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  ){.          got
17800 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65  o multi_select_e
17810 6e 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  nd;.        }.  
17820 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 64 65  .        /* Code
17830 20 74 68 65 20 63 75 72 72 65 6e 74 20 53 45 4c   the current SEL
17840 45 43 54 20 73 74 61 74 65 6d 65 6e 74 0a 20 20  ECT statement.  
17850 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
17860 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 45   if( p->op==TK_E
17870 58 43 45 50 54 20 29 7b 0a 20 20 20 20 20 20 20  XCEPT ){.       
17880 20 20 20 6f 70 20 3d 20 53 52 54 5f 45 78 63 65     op = SRT_Exce
17890 70 74 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  pt;.        }els
178a0 65 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  e{.          ass
178b0 65 72 74 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55  ert( p->op==TK_U
178c0 4e 49 4f 4e 20 29 3b 0a 20 20 20 20 20 20 20 20  NION );.        
178d0 20 20 6f 70 20 3d 20 53 52 54 5f 55 6e 69 6f 6e    op = SRT_Union
178e0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
178f0 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20      p->pPrior = 
17900 30 3b 0a 20 20 20 20 20 20 20 20 70 4c 69 6d 69  0;.        pLimi
17910 74 20 3d 20 70 2d 3e 70 4c 69 6d 69 74 3b 0a 20  t = p->pLimit;. 
17920 20 20 20 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74         p->pLimit
17930 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 75 6e   = 0;.        un
17940 69 6f 6e 64 65 73 74 2e 65 44 65 73 74 20 3d 20  iondest.eDest = 
17950 6f 70 3b 0a 20 20 20 20 20 20 20 20 45 78 70 6c  op;.        Expl
17960 61 69 6e 51 75 65 72 79 50 6c 61 6e 28 28 70 50  ainQueryPlan((pP
17970 61 72 73 65 2c 20 31 2c 20 22 25 73 20 55 53 49  arse, 1, "%s USI
17980 4e 47 20 54 45 4d 50 20 42 2d 54 52 45 45 22 2c  NG TEMP B-TREE",
17990 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
179a0 20 20 20 20 20 20 20 20 20 20 20 73 65 6c 65 63             selec
179b0 74 4f 70 4e 61 6d 65 28 70 2d 3e 6f 70 29 29 29  tOpName(p->op)))
179c0 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  ;.        rc = s
179d0 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61  qlite3Select(pPa
179e0 72 73 65 2c 20 70 2c 20 26 75 6e 69 6f 6e 64 65  rse, p, &unionde
179f0 73 74 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73  st);.        tes
17a00 74 63 61 73 65 28 20 72 63 21 3d 53 51 4c 49 54  tcase( rc!=SQLIT
17a10 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 20 20  E_OK );.        
17a20 2f 2a 20 51 75 65 72 79 20 66 6c 61 74 74 65 6e  /* Query flatten
17a30 69 6e 67 20 69 6e 20 73 71 6c 69 74 65 33 53 65  ing in sqlite3Se
17a40 6c 65 63 74 28 29 20 6d 69 67 68 74 20 72 65 66  lect() might ref
17a50 69 6c 6c 20 70 2d 3e 70 4f 72 64 65 72 42 79 2e  ill p->pOrderBy.
17a60 0a 20 20 20 20 20 20 20 20 2a 2a 20 42 65 20 73  .        ** Be s
17a70 75 72 65 20 74 6f 20 64 65 6c 65 74 65 20 70 2d  ure to delete p-
17a80 3e 70 4f 72 64 65 72 42 79 2c 20 74 68 65 72 65  >pOrderBy, there
17a90 66 6f 72 65 2c 20 74 6f 20 61 76 6f 69 64 20 61  fore, to avoid a
17aa0 20 6d 65 6d 6f 72 79 20 6c 65 61 6b 2e 20 2a 2f   memory leak. */
17ab0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
17ac0 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64  ExprListDelete(d
17ad0 62 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79 29 3b  b, p->pOrderBy);
17ae0 0a 20 20 20 20 20 20 20 20 70 44 65 6c 65 74 65  .        pDelete
17af0 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20   = p->pPrior;.  
17b00 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20        p->pPrior 
17b10 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20  = pPrior;.      
17b20 20 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20    p->pOrderBy = 
17b30 30 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  0;.        if( p
17b40 2d 3e 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29  ->op==TK_UNION )
17b50 7b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 6e  {.          p->n
17b60 53 65 6c 65 63 74 52 6f 77 20 3d 20 73 71 6c 69  SelectRow = sqli
17b70 74 65 33 4c 6f 67 45 73 74 41 64 64 28 70 2d 3e  te3LogEstAdd(p->
17b80 6e 53 65 6c 65 63 74 52 6f 77 2c 20 70 50 72 69  nSelectRow, pPri
17b90 6f 72 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 29 3b  or->nSelectRow);
17ba0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
17bb0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65     sqlite3ExprDe
17bc0 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 4c 69 6d  lete(db, p->pLim
17bd0 69 74 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e  it);.        p->
17be0 70 4c 69 6d 69 74 20 3d 20 70 4c 69 6d 69 74 3b  pLimit = pLimit;
17bf0 0a 20 20 20 20 20 20 20 20 70 2d 3e 69 4c 69 6d  .        p->iLim
17c00 69 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  it = 0;.        
17c10 70 2d 3e 69 4f 66 66 73 65 74 20 3d 20 30 3b 0a  p->iOffset = 0;.
17c20 20 20 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 6f    .        /* Co
17c30 6e 76 65 72 74 20 74 68 65 20 64 61 74 61 20 69  nvert the data i
17c40 6e 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20  n the temporary 
17c50 74 61 62 6c 65 20 69 6e 74 6f 20 77 68 61 74 65  table into whate
17c60 76 65 72 20 66 6f 72 6d 0a 20 20 20 20 20 20 20  ver form.       
17c70 20 2a 2a 20 69 74 20 69 73 20 74 68 61 74 20 77   ** it is that w
17c80 65 20 63 75 72 72 65 6e 74 6c 79 20 6e 65 65 64  e currently need
17c90 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
17ca0 20 20 20 20 20 61 73 73 65 72 74 28 20 75 6e 69       assert( uni
17cb0 6f 6e 54 61 62 3d 3d 64 65 73 74 2e 69 53 44 50  onTab==dest.iSDP
17cc0 61 72 6d 20 7c 7c 20 64 65 73 74 2e 65 44 65 73  arm || dest.eDes
17cd0 74 21 3d 70 72 69 6f 72 4f 70 20 29 3b 0a 20 20  t!=priorOp );.  
17ce0 20 20 20 20 20 20 69 66 28 20 64 65 73 74 2e 65        if( dest.e
17cf0 44 65 73 74 21 3d 70 72 69 6f 72 4f 70 20 29 7b  Dest!=priorOp ){
17d00 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 69  .          int i
17d10 43 6f 6e 74 2c 20 69 42 72 65 61 6b 2c 20 69 53  Cont, iBreak, iS
17d20 74 61 72 74 3b 0a 20 20 20 20 20 20 20 20 20 20  tart;.          
17d30 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73  assert( p->pELis
17d40 74 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  t );.          i
17d50 42 72 65 61 6b 20 3d 20 73 71 6c 69 74 65 33 56  Break = sqlite3V
17d60 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 70 50 61  dbeMakeLabel(pPa
17d70 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  rse);.          
17d80 69 43 6f 6e 74 20 3d 20 73 71 6c 69 74 65 33 56  iCont = sqlite3V
17d90 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 70 50 61  dbeMakeLabel(pPa
17da0 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  rse);.          
17db0 63 6f 6d 70 75 74 65 4c 69 6d 69 74 52 65 67 69  computeLimitRegi
17dc0 73 74 65 72 73 28 70 50 61 72 73 65 2c 20 70 2c  sters(pParse, p,
17dd0 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20   iBreak);.      
17de0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
17df0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 77 69  ddOp2(v, OP_Rewi
17e00 6e 64 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 69 42  nd, unionTab, iB
17e10 72 65 61 6b 29 3b 20 56 64 62 65 43 6f 76 65 72  reak); VdbeCover
17e20 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20  age(v);.        
17e30 20 20 69 53 74 61 72 74 20 3d 20 73 71 6c 69 74    iStart = sqlit
17e40 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
17e50 72 28 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20  r(v);.          
17e60 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28  selectInnerLoop(
17e70 70 50 61 72 73 65 2c 20 70 2c 20 75 6e 69 6f 6e  pParse, p, union
17e80 54 61 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20  Tab,.           
17e90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
17ea0 2c 20 30 2c 20 26 64 65 73 74 2c 20 69 43 6f 6e  , 0, &dest, iCon
17eb0 74 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20  t, iBreak);.    
17ec0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
17ed0 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
17ee0 20 69 43 6f 6e 74 29 3b 0a 20 20 20 20 20 20 20   iCont);.       
17ef0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
17f00 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c  dOp2(v, OP_Next,
17f10 20 75 6e 69 6f 6e 54 61 62 2c 20 69 53 74 61 72   unionTab, iStar
17f20 74 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  t); VdbeCoverage
17f30 28 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73  (v);.          s
17f40 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
17f50 65 4c 61 62 65 6c 28 76 2c 20 69 42 72 65 61 6b  eLabel(v, iBreak
17f60 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
17f70 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
17f80 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 75 6e 69 6f  , OP_Close, unio
17f90 6e 54 61 62 2c 20 30 29 3b 0a 20 20 20 20 20 20  nTab, 0);.      
17fa0 20 20 7d 0a 20 20 20 20 20 20 20 20 62 72 65 61    }.        brea
17fb0 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
17fc0 20 64 65 66 61 75 6c 74 3a 20 61 73 73 65 72 74   default: assert
17fd0 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 54 45  ( p->op==TK_INTE
17fe0 52 53 45 43 54 20 29 3b 20 7b 0a 20 20 20 20 20  RSECT ); {.     
17ff0 20 20 20 69 6e 74 20 74 61 62 31 2c 20 74 61 62     int tab1, tab
18000 32 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69  2;.        int i
18010 43 6f 6e 74 2c 20 69 42 72 65 61 6b 2c 20 69 53  Cont, iBreak, iS
18020 74 61 72 74 3b 0a 20 20 20 20 20 20 20 20 45 78  tart;.        Ex
18030 70 72 20 2a 70 4c 69 6d 69 74 3b 0a 20 20 20 20  pr *pLimit;.    
18040 20 20 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20      int addr;.  
18050 20 20 20 20 20 20 53 65 6c 65 63 74 44 65 73 74        SelectDest
18060 20 69 6e 74 65 72 73 65 63 74 64 65 73 74 3b 0a   intersectdest;.
18070 20 20 20 20 20 20 20 20 69 6e 74 20 72 31 3b 0a          int r1;.
18080 20 20 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 4e    .        /* IN
18090 54 45 52 53 45 43 54 20 69 73 20 64 69 66 66 65  TERSECT is diffe
180a0 72 65 6e 74 20 66 72 6f 6d 20 74 68 65 20 6f 74  rent from the ot
180b0 68 65 72 73 20 73 69 6e 63 65 20 69 74 20 72 65  hers since it re
180c0 71 75 69 72 65 73 0a 20 20 20 20 20 20 20 20 2a  quires.        *
180d0 2a 20 74 77 6f 20 74 65 6d 70 6f 72 61 72 79 20  * two temporary 
180e0 74 61 62 6c 65 73 2e 20 20 48 65 6e 63 65 20 69  tables.  Hence i
180f0 74 20 68 61 73 20 69 74 73 20 6f 77 6e 20 63 61  t has its own ca
18100 73 65 2e 20 20 42 65 67 69 6e 0a 20 20 20 20 20  se.  Begin.     
18110 20 20 20 2a 2a 20 62 79 20 61 6c 6c 6f 63 61 74     ** by allocat
18120 69 6e 67 20 74 68 65 20 74 61 62 6c 65 73 20 77  ing the tables w
18130 65 20 77 69 6c 6c 20 6e 65 65 64 2e 0a 20 20 20  e will need..   
18140 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
18150 74 61 62 31 20 3d 20 70 50 61 72 73 65 2d 3e 6e  tab1 = pParse->n
18160 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 20 20 74  Tab++;.        t
18170 61 62 32 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54  ab2 = pParse->nT
18180 61 62 2b 2b 3b 0a 20 20 20 20 20 20 20 20 61 73  ab++;.        as
18190 73 65 72 74 28 20 70 2d 3e 70 4f 72 64 65 72 42  sert( p->pOrderB
181a0 79 3d 3d 30 20 29 3b 0a 20 20 0a 20 20 20 20 20  y==0 );.  .     
181b0 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65     addr = sqlite
181c0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
181d0 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c  P_OpenEphemeral,
181e0 20 74 61 62 31 2c 20 30 29 3b 0a 20 20 20 20 20   tab1, 0);.     
181f0 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 64     assert( p->ad
18200 64 72 4f 70 65 6e 45 70 68 6d 5b 30 5d 20 3d 3d  drOpenEphm[0] ==
18210 20 2d 31 20 29 3b 0a 20 20 20 20 20 20 20 20 70   -1 );.        p
18220 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 30  ->addrOpenEphm[0
18230 5d 20 3d 20 61 64 64 72 3b 0a 20 20 20 20 20 20  ] = addr;.      
18240 20 20 66 69 6e 64 52 69 67 68 74 6d 6f 73 74 28    findRightmost(
18250 70 29 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20  p)->selFlags |= 
18260 53 46 5f 55 73 65 73 45 70 68 65 6d 65 72 61 6c  SF_UsesEphemeral
18270 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
18280 28 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20  ( p->pEList );. 
18290 20 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 64   .        /* Cod
182a0 65 20 74 68 65 20 53 45 4c 45 43 54 73 20 74 6f  e the SELECTs to
182b0 20 6f 75 72 20 6c 65 66 74 20 69 6e 74 6f 20 74   our left into t
182c0 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 22  emporary table "
182d0 74 61 62 31 22 2e 0a 20 20 20 20 20 20 20 20 2a  tab1"..        *
182e0 2f 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  /.        sqlite
182f0 33 53 65 6c 65 63 74 44 65 73 74 49 6e 69 74 28  3SelectDestInit(
18300 26 69 6e 74 65 72 73 65 63 74 64 65 73 74 2c 20  &intersectdest, 
18310 53 52 54 5f 55 6e 69 6f 6e 2c 20 74 61 62 31 29  SRT_Union, tab1)
18320 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  ;.        rc = s
18330 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61  qlite3Select(pPa
18340 72 73 65 2c 20 70 50 72 69 6f 72 2c 20 26 69 6e  rse, pPrior, &in
18350 74 65 72 73 65 63 74 64 65 73 74 29 3b 0a 20 20  tersectdest);.  
18360 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a        if( rc ){.
18370 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d            goto m
18380 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b  ulti_select_end;
18390 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 0a 20 20  .        }.  .  
183a0 20 20 20 20 20 20 2f 2a 20 43 6f 64 65 20 74 68        /* Code th
183b0 65 20 63 75 72 72 65 6e 74 20 53 45 4c 45 43 54  e current SELECT
183c0 20 69 6e 74 6f 20 74 65 6d 70 6f 72 61 72 79 20   into temporary 
183d0 74 61 62 6c 65 20 22 74 61 62 32 22 0a 20 20 20  table "tab2".   
183e0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
183f0 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64  addr = sqlite3Vd
18400 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f  beAddOp2(v, OP_O
18410 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 74 61  penEphemeral, ta
18420 62 32 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  b2, 0);.        
18430 61 73 73 65 72 74 28 20 70 2d 3e 61 64 64 72 4f  assert( p->addrO
18440 70 65 6e 45 70 68 6d 5b 31 5d 20 3d 3d 20 2d 31  penEphm[1] == -1
18450 20 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 61   );.        p->a
18460 64 64 72 4f 70 65 6e 45 70 68 6d 5b 31 5d 20 3d  ddrOpenEphm[1] =
18470 20 61 64 64 72 3b 0a 20 20 20 20 20 20 20 20 70   addr;.        p
18480 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20  ->pPrior = 0;.  
18490 20 20 20 20 20 20 70 4c 69 6d 69 74 20 3d 20 70        pLimit = p
184a0 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20  ->pLimit;.      
184b0 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b    p->pLimit = 0;
184c0 0a 20 20 20 20 20 20 20 20 69 6e 74 65 72 73 65  .        interse
184d0 63 74 64 65 73 74 2e 69 53 44 50 61 72 6d 20 3d  ctdest.iSDParm =
184e0 20 74 61 62 32 3b 0a 20 20 20 20 20 20 20 20 45   tab2;.        E
184f0 78 70 6c 61 69 6e 51 75 65 72 79 50 6c 61 6e 28  xplainQueryPlan(
18500 28 70 50 61 72 73 65 2c 20 31 2c 20 22 25 73 20  (pParse, 1, "%s 
18510 55 53 49 4e 47 20 54 45 4d 50 20 42 2d 54 52 45  USING TEMP B-TRE
18520 45 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  E",.            
18530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 65                se
18540 6c 65 63 74 4f 70 4e 61 6d 65 28 70 2d 3e 6f 70  lectOpName(p->op
18550 29 29 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20  )));.        rc 
18560 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28  = sqlite3Select(
18570 70 50 61 72 73 65 2c 20 70 2c 20 26 69 6e 74 65  pParse, p, &inte
18580 72 73 65 63 74 64 65 73 74 29 3b 0a 20 20 20 20  rsectdest);.    
18590 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 63      testcase( rc
185a0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  !=SQLITE_OK );. 
185b0 20 20 20 20 20 20 20 70 44 65 6c 65 74 65 20 3d         pDelete =
185c0 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20   p->pPrior;.    
185d0 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20      p->pPrior = 
185e0 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 20 20  pPrior;.        
185f0 69 66 28 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f  if( p->nSelectRo
18600 77 3e 70 50 72 69 6f 72 2d 3e 6e 53 65 6c 65 63  w>pPrior->nSelec
18610 74 52 6f 77 20 29 7b 0a 20 20 20 20 20 20 20 20  tRow ){.        
18620 20 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20    p->nSelectRow 
18630 3d 20 70 50 72 69 6f 72 2d 3e 6e 53 65 6c 65 63  = pPrior->nSelec
18640 74 52 6f 77 3b 0a 20 20 20 20 20 20 20 20 7d 0a  tRow;.        }.
18650 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
18660 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 2d  xprDelete(db, p-
18670 3e 70 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20 20  >pLimit);.      
18680 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 70 4c    p->pLimit = pL
18690 69 6d 69 74 3b 0a 20 20 0a 20 20 20 20 20 20 20  imit;.  .       
186a0 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64   /* Generate cod
186b0 65 20 74 6f 20 74 61 6b 65 20 74 68 65 20 69 6e  e to take the in
186c0 74 65 72 73 65 63 74 69 6f 6e 20 6f 66 20 74 68  tersection of th
186d0 65 20 74 77 6f 20 74 65 6d 70 6f 72 61 72 79 0a  e two temporary.
186e0 20 20 20 20 20 20 20 20 2a 2a 20 74 61 62 6c 65          ** table
186f0 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  s..        */.  
18700 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
18710 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20 20 20 20  >pEList );.     
18720 20 20 20 69 42 72 65 61 6b 20 3d 20 73 71 6c 69     iBreak = sqli
18730 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
18740 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
18750 20 20 69 43 6f 6e 74 20 3d 20 73 71 6c 69 74 65    iCont = sqlite
18760 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 70  3VdbeMakeLabel(p
18770 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20  Parse);.        
18780 63 6f 6d 70 75 74 65 4c 69 6d 69 74 52 65 67 69  computeLimitRegi
18790 73 74 65 72 73 28 70 50 61 72 73 65 2c 20 70 2c  sters(pParse, p,
187a0 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20   iBreak);.      
187b0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
187c0 4f 70 32 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64  Op2(v, OP_Rewind
187d0 2c 20 74 61 62 31 2c 20 69 42 72 65 61 6b 29 3b  , tab1, iBreak);
187e0 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
187f0 3b 0a 20 20 20 20 20 20 20 20 72 31 20 3d 20 73  ;.        r1 = s
18800 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67  qlite3GetTempReg
18810 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
18820 20 20 69 53 74 61 72 74 20 3d 20 73 71 6c 69 74    iStart = sqlit
18830 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
18840 4f 50 5f 52 6f 77 44 61 74 61 2c 20 74 61 62 31  OP_RowData, tab1
18850 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 20 20 73  , r1);.        s
18860 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
18870 49 6e 74 28 76 2c 20 4f 50 5f 4e 6f 74 46 6f 75  Int(v, OP_NotFou
18880 6e 64 2c 20 74 61 62 32 2c 20 69 43 6f 6e 74 2c  nd, tab2, iCont,
18890 20 72 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 20   r1, 0);.       
188a0 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
188b0 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
188c0 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
188d0 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 20 20 20  pParse, r1);.   
188e0 20 20 20 20 20 73 65 6c 65 63 74 49 6e 6e 65 72       selectInner
188f0 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20 70 2c 20  Loop(pParse, p, 
18900 74 61 62 31 2c 0a 20 20 20 20 20 20 20 20 20 20  tab1,.          
18910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 2c                0,
18920 20 30 2c 20 26 64 65 73 74 2c 20 69 43 6f 6e 74   0, &dest, iCont
18930 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20  , iBreak);.     
18940 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
18950 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69 43  solveLabel(v, iC
18960 6f 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 73 71  ont);.        sq
18970 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
18980 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 74 61 62 31  v, OP_Next, tab1
18990 2c 20 69 53 74 61 72 74 29 3b 20 56 64 62 65 43  , iStart); VdbeC
189a0 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
189b0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52      sqlite3VdbeR
189c0 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69  esolveLabel(v, i
189d0 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 20 20  Break);.        
189e0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
189f0 32 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 74  2(v, OP_Close, t
18a00 61 62 32 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  ab2, 0);.       
18a10 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
18a20 70 32 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20  p2(v, OP_Close, 
18a30 74 61 62 31 2c 20 30 29 3b 0a 20 20 20 20 20 20  tab1, 0);.      
18a40 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
18a50 0a 20 20 20 20 7d 0a 20 20 0a 20 20 23 69 66 6e  .    }.  .  #ifn
18a60 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
18a70 45 58 50 4c 41 49 4e 0a 20 20 20 20 69 66 28 20  EXPLAIN.    if( 
18a80 70 2d 3e 70 4e 65 78 74 3d 3d 30 20 29 7b 0a 20  p->pNext==0 ){. 
18a90 20 20 20 20 20 45 78 70 6c 61 69 6e 51 75 65 72       ExplainQuer
18aa0 79 50 6c 61 6e 50 6f 70 28 70 50 61 72 73 65 29  yPlanPop(pParse)
18ab0 3b 0a 20 20 20 20 7d 0a 20 20 23 65 6e 64 69 66  ;.    }.  #endif
18ac0 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 43 6f 6d  .  }.  .  /* Com
18ad0 70 75 74 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73  pute collating s
18ae0 65 71 75 65 6e 63 65 73 20 75 73 65 64 20 62 79  equences used by
18af0 20 0a 20 20 2a 2a 20 74 65 6d 70 6f 72 61 72 79   .  ** temporary
18b00 20 74 61 62 6c 65 73 20 6e 65 65 64 65 64 20 74   tables needed t
18b10 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20  o implement the 
18b20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 2e  compound select.
18b30 0a 20 20 2a 2a 20 41 74 74 61 63 68 20 74 68 65  .  ** Attach the
18b40 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75   KeyInfo structu
18b50 72 65 20 74 6f 20 61 6c 6c 20 74 65 6d 70 6f 72  re to all tempor
18b60 61 72 79 20 74 61 62 6c 65 73 2e 0a 20 20 2a 2a  ary tables..  **
18b70 0a 20 20 2a 2a 20 54 68 69 73 20 73 65 63 74 69  .  ** This secti
18b80 6f 6e 20 69 73 20 72 75 6e 20 62 79 20 74 68 65  on is run by the
18b90 20 72 69 67 68 74 2d 6d 6f 73 74 20 53 45 4c 45   right-most SELE
18ba0 43 54 20 73 74 61 74 65 6d 65 6e 74 20 6f 6e 6c  CT statement onl
18bb0 79 2e 0a 20 20 2a 2a 20 53 45 4c 45 43 54 20 73  y..  ** SELECT s
18bc0 74 61 74 65 6d 65 6e 74 73 20 74 6f 20 74 68 65  tatements to the
18bd0 20 6c 65 66 74 20 61 6c 77 61 79 73 20 73 6b 69   left always ski
18be0 70 20 74 68 69 73 20 70 61 72 74 2e 20 20 54 68  p this part.  Th
18bf0 65 20 72 69 67 68 74 2d 6d 6f 73 74 0a 20 20 2a  e right-most.  *
18c00 2a 20 53 45 4c 45 43 54 20 6d 69 67 68 74 20 61  * SELECT might a
18c10 6c 73 6f 20 73 6b 69 70 20 74 68 69 73 20 70 61  lso skip this pa
18c20 72 74 20 69 66 20 69 74 20 68 61 73 20 6e 6f 20  rt if it has no 
18c30 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
18c40 61 6e 64 0a 20 20 2a 2a 20 6e 6f 20 74 65 6d 70  and.  ** no temp
18c50 20 74 61 62 6c 65 73 20 61 72 65 20 72 65 71 75   tables are requ
18c60 69 72 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ired..  */.  if(
18c70 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53   p->selFlags & S
18c80 46 5f 55 73 65 73 45 70 68 65 6d 65 72 61 6c 20  F_UsesEphemeral 
18c90 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 20 20 20  ){.    int i;   
18ca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18cb0 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
18cc0 6e 74 65 72 20 2a 2f 0a 20 20 20 20 4b 65 79 49  nter */.    KeyI
18cd0 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b 20 20  nfo *pKeyInfo;  
18ce0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c            /* Col
18cf0 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20  lating sequence 
18d00 66 6f 72 20 74 68 65 20 72 65 73 75 6c 74 20 73  for the result s
18d10 65 74 20 2a 2f 0a 20 20 20 20 53 65 6c 65 63 74  et */.    Select
18d20 20 2a 70 4c 6f 6f 70 3b 20 20 20 20 20 20 20 20   *pLoop;        
18d30 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c          /* For l
18d40 6f 6f 70 69 6e 67 20 74 68 72 6f 75 67 68 20 53  ooping through S
18d50 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73  ELECT statements
18d60 20 2a 2f 0a 20 20 20 20 43 6f 6c 6c 53 65 71 20   */.    CollSeq 
18d70 2a 2a 61 70 43 6f 6c 6c 3b 20 20 20 20 20 20 20  **apColl;       
18d80 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f        /* For loo
18d90 70 69 6e 67 20 74 68 72 6f 75 67 68 20 70 4b 65  ping through pKe
18da0 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 5d 20 2a  yInfo->aColl[] *
18db0 2f 0a 20 20 20 20 69 6e 74 20 6e 43 6f 6c 3b 20  /.    int nCol; 
18dc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18dd0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
18de0 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 72 65 73 75   columns in resu
18df0 6c 74 20 73 65 74 20 2a 2f 0a 0a 20 20 20 20 61  lt set */..    a
18e00 73 73 65 72 74 28 20 70 2d 3e 70 4e 65 78 74 3d  ssert( p->pNext=
18e10 3d 30 20 29 3b 0a 20 20 20 20 6e 43 6f 6c 20 3d  =0 );.    nCol =
18e20 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70   p->pEList->nExp
18e30 72 3b 0a 20 20 20 20 70 4b 65 79 49 6e 66 6f 20  r;.    pKeyInfo 
18e40 3d 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f  = sqlite3KeyInfo
18e50 41 6c 6c 6f 63 28 64 62 2c 20 6e 43 6f 6c 2c 20  Alloc(db, nCol, 
18e60 31 29 3b 0a 20 20 20 20 69 66 28 20 21 70 4b 65  1);.    if( !pKe
18e70 79 49 6e 66 6f 20 29 7b 0a 20 20 20 20 20 20 72  yInfo ){.      r
18e80 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
18e90 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 67 6f 74  _BKPT;.      got
18ea0 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65  o multi_select_e
18eb0 6e 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f  nd;.    }.    fo
18ec0 72 28 69 3d 30 2c 20 61 70 43 6f 6c 6c 3d 70 4b  r(i=0, apColl=pK
18ed0 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 3b 20 69  eyInfo->aColl; i
18ee0 3c 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 61 70 43 6f  <nCol; i++, apCo
18ef0 6c 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 2a 61 70  ll++){.      *ap
18f00 43 6f 6c 6c 20 3d 20 6d 75 6c 74 69 53 65 6c 65  Coll = multiSele
18f10 63 74 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  ctCollSeq(pParse
18f20 2c 20 70 2c 20 69 29 3b 0a 20 20 20 20 20 20 69  , p, i);.      i
18f30 66 28 20 30 3d 3d 2a 61 70 43 6f 6c 6c 20 29 7b  f( 0==*apColl ){
18f40 0a 20 20 20 20 20 20 20 20 2a 61 70 43 6f 6c 6c  .        *apColl
18f50 20 3d 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c   = db->pDfltColl
18f60 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
18f70 0a 20 20 20 20 66 6f 72 28 70 4c 6f 6f 70 3d 70  .    for(pLoop=p
18f80 3b 20 70 4c 6f 6f 70 3b 20 70 4c 6f 6f 70 3d 70  ; pLoop; pLoop=p
18f90 4c 6f 6f 70 2d 3e 70 50 72 69 6f 72 29 7b 0a 20  Loop->pPrior){. 
18fa0 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
18fb0 32 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  2; i++){.       
18fc0 20 69 6e 74 20 61 64 64 72 20 3d 20 70 4c 6f 6f   int addr = pLoo
18fd0 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b  p->addrOpenEphm[
18fe0 69 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  i];.        if( 
18ff0 61 64 64 72 3c 30 20 29 7b 0a 20 20 20 20 20 20  addr<0 ){.      
19000 20 20 20 20 2f 2a 20 49 66 20 5b 30 5d 20 69 73      /* If [0] is
19010 20 75 6e 75 73 65 64 20 74 68 65 6e 20 5b 31 5d   unused then [1]
19020 20 69 73 20 61 6c 73 6f 20 75 6e 75 73 65 64 2e   is also unused.
19030 20 20 53 6f 20 77 65 20 63 61 6e 0a 20 20 20 20    So we can.    
19040 20 20 20 20 20 20 2a 2a 20 61 6c 77 61 79 73 20        ** always 
19050 73 61 66 65 6c 79 20 61 62 6f 72 74 20 61 73 20  safely abort as 
19060 73 6f 6f 6e 20 61 73 20 74 68 65 20 66 69 72 73  soon as the firs
19070 74 20 75 6e 75 73 65 64 20 73 6c 6f 74 20 69 73  t unused slot is
19080 20 66 6f 75 6e 64 20 2a 2f 0a 20 20 20 20 20 20   found */.      
19090 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 6f 6f      assert( pLoo
190a0 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b  p->addrOpenEphm[
190b0 31 5d 3c 30 20 29 3b 0a 20 20 20 20 20 20 20 20  1]<0 );.        
190c0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
190d0 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74   }.        sqlit
190e0 65 33 56 64 62 65 43 68 61 6e 67 65 50 32 28 76  e3VdbeChangeP2(v
190f0 2c 20 61 64 64 72 2c 20 6e 43 6f 6c 29 3b 0a 20  , addr, nCol);. 
19100 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
19110 62 65 43 68 61 6e 67 65 50 34 28 76 2c 20 61 64  beChangeP4(v, ad
19120 64 72 2c 20 28 63 68 61 72 2a 29 73 71 6c 69 74  dr, (char*)sqlit
19130 65 33 4b 65 79 49 6e 66 6f 52 65 66 28 70 4b 65  e3KeyInfoRef(pKe
19140 79 49 6e 66 6f 29 2c 0a 20 20 20 20 20 20 20 20  yInfo),.        
19150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19160 20 20 20 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b      P4_KEYINFO);
19170 0a 20 20 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e  .        pLoop->
19180 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 69 5d 20  addrOpenEphm[i] 
19190 3d 20 2d 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20  = -1;.      }.  
191a0 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 4b    }.    sqlite3K
191b0 65 79 49 6e 66 6f 55 6e 72 65 66 28 70 4b 65 79  eyInfoUnref(pKey
191c0 49 6e 66 6f 29 3b 0a 20 20 7d 0a 0a 6d 75 6c 74  Info);.  }..mult
191d0 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3a 0a 20 20  i_select_end:.  
191e0 70 44 65 73 74 2d 3e 69 53 64 73 74 20 3d 20 64  pDest->iSdst = d
191f0 65 73 74 2e 69 53 64 73 74 3b 0a 20 20 70 44 65  est.iSdst;.  pDe
19200 73 74 2d 3e 6e 53 64 73 74 20 3d 20 64 65 73 74  st->nSdst = dest
19210 2e 6e 53 64 73 74 3b 0a 20 20 73 71 6c 69 74 65  .nSdst;.  sqlite
19220 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62  3SelectDelete(db
19230 2c 20 70 44 65 6c 65 74 65 29 3b 0a 20 20 72 65  , pDelete);.  re
19240 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69  turn rc;.}.#endi
19250 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
19260 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54  _COMPOUND_SELECT
19270 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 45 72 72 6f 72   */../*.** Error
19280 20 6d 65 73 73 61 67 65 20 66 6f 72 20 77 68 65   message for whe
19290 6e 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 74 65  n two or more te
192a0 72 6d 73 20 6f 66 20 61 20 63 6f 6d 70 6f 75 6e  rms of a compoun
192b0 64 20 73 65 6c 65 63 74 20 68 61 76 65 20 64 69  d select have di
192c0 66 66 65 72 65 6e 74 0a 2a 2a 20 73 69 7a 65 20  fferent.** size 
192d0 72 65 73 75 6c 74 20 73 65 74 73 2e 0a 2a 2f 0a  result sets..*/.
192e0 76 6f 69 64 20 73 71 6c 69 74 65 33 53 65 6c 65  void sqlite3Sele
192f0 63 74 57 72 6f 6e 67 4e 75 6d 54 65 72 6d 73 45  ctWrongNumTermsE
19300 72 72 6f 72 28 50 61 72 73 65 20 2a 70 50 61 72  rror(Parse *pPar
19310 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a  se, Select *p){.
19320 20 20 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61 67    if( p->selFlag
19330 73 20 26 20 53 46 5f 56 61 6c 75 65 73 20 29 7b  s & SF_Values ){
19340 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
19350 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 61 6c  rMsg(pParse, "al
19360 6c 20 56 41 4c 55 45 53 20 6d 75 73 74 20 68 61  l VALUES must ha
19370 76 65 20 74 68 65 20 73 61 6d 65 20 6e 75 6d 62  ve the same numb
19380 65 72 20 6f 66 20 74 65 72 6d 73 22 29 3b 0a 20  er of terms");. 
19390 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69   }else{.    sqli
193a0 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
193b0 73 65 2c 20 22 53 45 4c 45 43 54 73 20 74 6f 20  se, "SELECTs to 
193c0 74 68 65 20 6c 65 66 74 20 61 6e 64 20 72 69 67  the left and rig
193d0 68 74 20 6f 66 20 25 73 22 0a 20 20 20 20 20 20  ht of %s".      
193e0 22 20 64 6f 20 6e 6f 74 20 68 61 76 65 20 74 68  " do not have th
193f0 65 20 73 61 6d 65 20 6e 75 6d 62 65 72 20 6f 66  e same number of
19400 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 22   result columns"
19410 2c 20 73 65 6c 65 63 74 4f 70 4e 61 6d 65 28 70  , selectOpName(p
19420 2d 3e 6f 70 29 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  ->op));.  }.}../
19430 2a 0a 2a 2a 20 43 6f 64 65 20 61 6e 20 6f 75 74  *.** Code an out
19440 70 75 74 20 73 75 62 72 6f 75 74 69 6e 65 20 66  put subroutine f
19450 6f 72 20 61 20 63 6f 72 6f 75 74 69 6e 65 20 69  or a coroutine i
19460 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66  mplementation of
19470 20 61 0a 2a 2a 20 53 45 4c 45 43 54 20 73 74 61   a.** SELECT sta
19480 74 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  tment..**.** The
19490 20 64 61 74 61 20 74 6f 20 62 65 20 6f 75 74 70   data to be outp
194a0 75 74 20 69 73 20 63 6f 6e 74 61 69 6e 65 64 20  ut is contained 
194b0 69 6e 20 70 49 6e 2d 3e 69 53 64 73 74 2e 20 20  in pIn->iSdst.  
194c0 54 68 65 72 65 20 61 72 65 0a 2a 2a 20 70 49 6e  There are.** pIn
194d0 2d 3e 6e 53 64 73 74 20 63 6f 6c 75 6d 6e 73 20  ->nSdst columns 
194e0 74 6f 20 62 65 20 6f 75 74 70 75 74 2e 20 20 70  to be output.  p
194f0 44 65 73 74 20 69 73 20 77 68 65 72 65 20 74 68  Dest is where th
19500 65 20 6f 75 74 70 75 74 20 73 68 6f 75 6c 64 0a  e output should.
19510 2a 2a 20 62 65 20 73 65 6e 74 2e 0a 2a 2a 0a 2a  ** be sent..**.*
19520 2a 20 72 65 67 52 65 74 75 72 6e 20 69 73 20 74  * regReturn is t
19530 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65  he number of the
19540 20 72 65 67 69 73 74 65 72 20 68 6f 6c 64 69 6e   register holdin
19550 67 20 74 68 65 20 73 75 62 72 6f 75 74 69 6e 65  g the subroutine
19560 0a 2a 2a 20 72 65 74 75 72 6e 20 61 64 64 72 65  .** return addre
19570 73 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 72 65 67  ss..**.** If reg
19580 50 72 65 76 3e 30 20 74 68 65 6e 20 69 74 20 69  Prev>0 then it i
19590 73 20 74 68 65 20 66 69 72 73 74 20 72 65 67 69  s the first regi
195a0 73 74 65 72 20 69 6e 20 61 20 76 65 63 74 6f 72  ster in a vector
195b0 20 74 68 61 74 0a 2a 2a 20 72 65 63 6f 72 64 73   that.** records
195c0 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 6f 75   the previous ou
195d0 74 70 75 74 2e 20 20 6d 65 6d 5b 72 65 67 50 72  tput.  mem[regPr
195e0 65 76 5d 20 69 73 20 61 20 66 6c 61 67 20 74 68  ev] is a flag th
195f0 61 74 20 69 73 20 66 61 6c 73 65 0a 2a 2a 20 69  at is false.** i
19600 66 20 74 68 65 72 65 20 68 61 73 20 62 65 65 6e  f there has been
19610 20 6e 6f 20 70 72 65 76 69 6f 75 73 20 6f 75 74   no previous out
19620 70 75 74 2e 20 20 49 66 20 72 65 67 50 72 65 76  put.  If regPrev
19630 3e 30 20 74 68 65 6e 20 63 6f 64 65 20 69 73 0a  >0 then code is.
19640 2a 2a 20 67 65 6e 65 72 61 74 65 64 20 74 6f 20  ** generated to 
19650 73 75 70 70 72 65 73 73 20 64 75 70 6c 69 63 61  suppress duplica
19660 74 65 73 2e 20 20 70 4b 65 79 49 6e 66 6f 20 69  tes.  pKeyInfo i
19670 73 20 75 73 65 64 20 66 6f 72 20 63 6f 6d 70 61  s used for compa
19680 72 69 6e 67 0a 2a 2a 20 6b 65 79 73 2e 0a 2a 2a  ring.** keys..**
19690 0a 2a 2a 20 49 66 20 74 68 65 20 4c 49 4d 49 54  .** If the LIMIT
196a0 20 66 6f 75 6e 64 20 69 6e 20 70 2d 3e 69 4c 69   found in p->iLi
196b0 6d 69 74 20 69 73 20 72 65 61 63 68 65 64 2c 20  mit is reached, 
196c0 6a 75 6d 70 20 69 6d 6d 65 64 69 61 74 65 6c 79  jump immediately
196d0 20 74 6f 0a 2a 2a 20 69 42 72 65 61 6b 2e 0a 2a   to.** iBreak..*
196e0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67 65 6e  /.static int gen
196f0 65 72 61 74 65 4f 75 74 70 75 74 53 75 62 72 6f  erateOutputSubro
19700 75 74 69 6e 65 28 0a 20 20 50 61 72 73 65 20 2a  utine(.  Parse *
19710 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20  pParse,         
19720 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
19730 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20  ext */.  Select 
19740 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *p,             
19750 20 2f 2a 20 54 68 65 20 53 45 4c 45 43 54 20 73   /* The SELECT s
19760 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 53 65  tatement */.  Se
19770 6c 65 63 74 44 65 73 74 20 2a 70 49 6e 2c 20 20  lectDest *pIn,  
19780 20 20 20 20 20 20 2f 2a 20 43 6f 72 6f 75 74 69        /* Corouti
19790 6e 65 20 73 75 70 70 6c 79 69 6e 67 20 64 61 74  ne supplying dat
197a0 61 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73  a */.  SelectDes
197b0 74 20 2a 70 44 65 73 74 2c 20 20 20 20 20 20 2f  t *pDest,      /
197c0 2a 20 57 68 65 72 65 20 74 6f 20 73 65 6e 64 20  * Where to send 
197d0 74 68 65 20 64 61 74 61 20 2a 2f 0a 20 20 69 6e  the data */.  in
197e0 74 20 72 65 67 52 65 74 75 72 6e 2c 20 20 20 20  t regReturn,    
197f0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65 74        /* The ret
19800 75 72 6e 20 61 64 64 72 65 73 73 20 72 65 67 69  urn address regi
19810 73 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 65  ster */.  int re
19820 67 50 72 65 76 2c 20 20 20 20 20 20 20 20 20 20  gPrev,          
19830 20 20 2f 2a 20 50 72 65 76 69 6f 75 73 20 72 65    /* Previous re
19840 73 75 6c 74 20 72 65 67 69 73 74 65 72 2e 20 20  sult register.  
19850 4e 6f 20 75 6e 69 71 75 65 6e 65 73 73 20 69 66  No uniqueness if
19860 20 30 20 2a 2f 0a 20 20 4b 65 79 49 6e 66 6f 20   0 */.  KeyInfo 
19870 2a 70 4b 65 79 49 6e 66 6f 2c 20 20 20 20 20 20  *pKeyInfo,      
19880 2f 2a 20 46 6f 72 20 63 6f 6d 70 61 72 69 6e 67  /* For comparing
19890 20 77 69 74 68 20 70 72 65 76 69 6f 75 73 20 65   with previous e
198a0 6e 74 72 79 20 2a 2f 0a 20 20 69 6e 74 20 69 42  ntry */.  int iB
198b0 72 65 61 6b 20 20 20 20 20 20 20 20 20 20 20 20  reak            
198c0 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 69    /* Jump here i
198d0 66 20 77 65 20 68 69 74 20 74 68 65 20 4c 49 4d  f we hit the LIM
198e0 49 54 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20  IT */.){.  Vdbe 
198f0 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64  *v = pParse->pVd
19900 62 65 3b 0a 20 20 69 6e 74 20 69 43 6f 6e 74 69  be;.  int iConti
19910 6e 75 65 3b 0a 20 20 69 6e 74 20 61 64 64 72 3b  nue;.  int addr;
19920 0a 0a 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74  ..  addr = sqlit
19930 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
19940 72 28 76 29 3b 0a 20 20 69 43 6f 6e 74 69 6e 75  r(v);.  iContinu
19950 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  e = sqlite3VdbeM
19960 61 6b 65 4c 61 62 65 6c 28 70 50 61 72 73 65 29  akeLabel(pParse)
19970 3b 0a 0a 20 20 2f 2a 20 53 75 70 70 72 65 73 73  ;..  /* Suppress
19980 20 64 75 70 6c 69 63 61 74 65 73 20 66 6f 72 20   duplicates for 
19990 55 4e 49 4f 4e 2c 20 45 58 43 45 50 54 2c 20 61  UNION, EXCEPT, a
199a0 6e 64 20 49 4e 54 45 52 53 45 43 54 20 0a 20 20  nd INTERSECT .  
199b0 2a 2f 0a 20 20 69 66 28 20 72 65 67 50 72 65 76  */.  if( regPrev
199c0 20 29 7b 0a 20 20 20 20 69 6e 74 20 61 64 64 72   ){.    int addr
199d0 31 2c 20 61 64 64 72 32 3b 0a 20 20 20 20 61 64  1, addr2;.    ad
199e0 64 72 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62  dr1 = sqlite3Vdb
199f0 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66  eAddOp1(v, OP_If
19a00 4e 6f 74 2c 20 72 65 67 50 72 65 76 29 3b 20 56  Not, regPrev); V
19a10 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
19a20 20 20 20 20 61 64 64 72 32 20 3d 20 73 71 6c 69      addr2 = sqli
19a30 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
19a40 20 4f 50 5f 43 6f 6d 70 61 72 65 2c 20 70 49 6e   OP_Compare, pIn
19a50 2d 3e 69 53 64 73 74 2c 20 72 65 67 50 72 65 76  ->iSdst, regPrev
19a60 2b 31 2c 20 70 49 6e 2d 3e 6e 53 64 73 74 2c 0a  +1, pIn->nSdst,.
19a70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19a80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 63                (c
19a90 68 61 72 2a 29 73 71 6c 69 74 65 33 4b 65 79 49  har*)sqlite3KeyI
19aa0 6e 66 6f 52 65 66 28 70 4b 65 79 49 6e 66 6f 29  nfoRef(pKeyInfo)
19ab0 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20  , P4_KEYINFO);. 
19ac0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
19ad0 64 4f 70 33 28 76 2c 20 4f 50 5f 4a 75 6d 70 2c  dOp3(v, OP_Jump,
19ae0 20 61 64 64 72 32 2b 32 2c 20 69 43 6f 6e 74 69   addr2+2, iConti
19af0 6e 75 65 2c 20 61 64 64 72 32 2b 32 29 3b 20 56  nue, addr2+2); V
19b00 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
19b10 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a      sqlite3VdbeJ
19b20 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 31  umpHere(v, addr1
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 33 28 76 2c 20 4f 50 5f 43  beAddOp3(v, OP_C
19b50 6f 70 79 2c 20 70 49 6e 2d 3e 69 53 64 73 74 2c  opy, pIn->iSdst,
19b60 20 72 65 67 50 72 65 76 2b 31 2c 20 70 49 6e 2d   regPrev+1, pIn-
19b70 3e 6e 53 64 73 74 2d 31 29 3b 0a 20 20 20 20 73  >nSdst-1);.    s
19b80 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
19b90 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
19ba0 31 2c 20 72 65 67 50 72 65 76 29 3b 0a 20 20 7d  1, regPrev);.  }
19bb0 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 64  .  if( pParse->d
19bc0 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
19bd0 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20 2f  ) return 0;..  /
19be0 2a 20 53 75 70 70 72 65 73 73 20 74 68 65 20 66  * Suppress the f
19bf0 69 72 73 74 20 4f 46 46 53 45 54 20 65 6e 74 72  irst OFFSET entr
19c00 69 65 73 20 69 66 20 74 68 65 72 65 20 69 73 20  ies if there is 
19c10 61 6e 20 4f 46 46 53 45 54 20 63 6c 61 75 73 65  an OFFSET clause
19c20 0a 20 20 2a 2f 0a 20 20 63 6f 64 65 4f 66 66 73  .  */.  codeOffs
19c30 65 74 28 76 2c 20 70 2d 3e 69 4f 66 66 73 65 74  et(v, p->iOffset
19c40 2c 20 69 43 6f 6e 74 69 6e 75 65 29 3b 0a 0a 20  , iContinue);.. 
19c50 20 61 73 73 65 72 74 28 20 70 44 65 73 74 2d 3e   assert( pDest->
19c60 65 44 65 73 74 21 3d 53 52 54 5f 45 78 69 73 74  eDest!=SRT_Exist
19c70 73 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  s );.  assert( p
19c80 44 65 73 74 2d 3e 65 44 65 73 74 21 3d 53 52 54  Dest->eDest!=SRT
19c90 5f 54 61 62 6c 65 20 29 3b 0a 20 20 73 77 69 74  _Table );.  swit
19ca0 63 68 28 20 70 44 65 73 74 2d 3e 65 44 65 73 74  ch( pDest->eDest
19cb0 20 29 7b 0a 20 20 20 20 2f 2a 20 53 74 6f 72 65   ){.    /* Store
19cc0 20 74 68 65 20 72 65 73 75 6c 74 20 61 73 20 64   the result as d
19cd0 61 74 61 20 75 73 69 6e 67 20 61 20 75 6e 69 71  ata using a uniq
19ce0 75 65 20 6b 65 79 2e 0a 20 20 20 20 2a 2f 0a 20  ue key..    */. 
19cf0 20 20 20 63 61 73 65 20 53 52 54 5f 45 70 68 65     case SRT_Ephe
19d00 6d 54 61 62 3a 20 7b 0a 20 20 20 20 20 20 69 6e  mTab: {.      in
19d10 74 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65  t r1 = sqlite3Ge
19d20 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29  tTempReg(pParse)
19d30 3b 0a 20 20 20 20 20 20 69 6e 74 20 72 32 20 3d  ;.      int r2 =
19d40 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
19d50 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  eg(pParse);.    
19d60 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
19d70 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65  Op3(v, OP_MakeRe
19d80 63 6f 72 64 2c 20 70 49 6e 2d 3e 69 53 64 73 74  cord, pIn->iSdst
19d90 2c 20 70 49 6e 2d 3e 6e 53 64 73 74 2c 20 72 31  , pIn->nSdst, r1
19da0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
19db0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
19dc0 5f 4e 65 77 52 6f 77 69 64 2c 20 70 44 65 73 74  _NewRowid, pDest
19dd0 2d 3e 69 53 44 50 61 72 6d 2c 20 72 32 29 3b 0a  ->iSDParm, r2);.
19de0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
19df0 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e  eAddOp3(v, OP_In
19e00 73 65 72 74 2c 20 70 44 65 73 74 2d 3e 69 53 44  sert, pDest->iSD
19e10 50 61 72 6d 2c 20 72 31 2c 20 72 32 29 3b 0a 20  Parm, r1, r2);. 
19e20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
19e30 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c  ChangeP5(v, OPFL
19e40 41 47 5f 41 50 50 45 4e 44 29 3b 0a 20 20 20 20  AG_APPEND);.    
19e50 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
19e60 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
19e70 72 32 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  r2);.      sqlit
19e80 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
19e90 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 20 20  (pParse, r1);.  
19ea0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
19eb0 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
19ec0 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20  _OMIT_SUBQUERY. 
19ed0 20 20 20 2f 2a 20 49 66 20 77 65 20 61 72 65 20     /* If we are 
19ee0 63 72 65 61 74 69 6e 67 20 61 20 73 65 74 20 66  creating a set f
19ef0 6f 72 20 61 6e 20 22 65 78 70 72 20 49 4e 20 28  or an "expr IN (
19f00 53 45 4c 45 43 54 20 2e 2e 2e 29 22 2e 0a 20 20  SELECT ...)"..  
19f10 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52    */.    case SR
19f20 54 5f 53 65 74 3a 20 7b 0a 20 20 20 20 20 20 69  T_Set: {.      i
19f30 6e 74 20 72 31 3b 0a 20 20 20 20 20 20 74 65 73  nt r1;.      tes
19f40 74 63 61 73 65 28 20 70 49 6e 2d 3e 6e 53 64 73  tcase( pIn->nSds
19f50 74 3e 31 20 29 3b 0a 20 20 20 20 20 20 72 31 20  t>1 );.      r1 
19f60 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
19f70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20  Reg(pParse);.   
19f80 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
19f90 64 4f 70 34 28 76 2c 20 4f 50 5f 4d 61 6b 65 52  dOp4(v, OP_MakeR
19fa0 65 63 6f 72 64 2c 20 70 49 6e 2d 3e 69 53 64 73  ecord, pIn->iSds
19fb0 74 2c 20 70 49 6e 2d 3e 6e 53 64 73 74 2c 20 0a  t, pIn->nSdst, .
19fc0 20 20 20 20 20 20 20 20 20 20 72 31 2c 20 70 44            r1, pD
19fd0 65 73 74 2d 3e 7a 41 66 66 53 64 73 74 2c 20 70  est->zAffSdst, p
19fe0 49 6e 2d 3e 6e 53 64 73 74 29 3b 0a 20 20 20 20  In->nSdst);.    
19ff0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1a000 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 49 64 78  Op4Int(v, OP_Idx
1a010 49 6e 73 65 72 74 2c 20 70 44 65 73 74 2d 3e 69  Insert, pDest->i
1a020 53 44 50 61 72 6d 2c 20 72 31 2c 0a 20 20 20 20  SDParm, r1,.    
1a030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a040 20 20 20 20 20 20 20 70 49 6e 2d 3e 69 53 64 73         pIn->iSds
1a050 74 2c 20 70 49 6e 2d 3e 6e 53 64 73 74 29 3b 0a  t, pIn->nSdst);.
1a060 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c        sqlite3Rel
1a070 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
1a080 73 65 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 62  se, r1);.      b
1a090 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  reak;.    }..   
1a0a0 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61   /* If this is a
1a0b0 20 73 63 61 6c 61 72 20 73 65 6c 65 63 74 20 74   scalar select t
1a0c0 68 61 74 20 69 73 20 70 61 72 74 20 6f 66 20 61  hat is part of a
1a0d0 6e 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 74 68  n expression, th
1a0e0 65 6e 0a 20 20 20 20 2a 2a 20 73 74 6f 72 65 20  en.    ** store 
1a0f0 74 68 65 20 72 65 73 75 6c 74 73 20 69 6e 20 74  the results in t
1a100 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 20 6d  he appropriate m
1a110 65 6d 6f 72 79 20 63 65 6c 6c 20 61 6e 64 20 62  emory cell and b
1a120 72 65 61 6b 20 6f 75 74 0a 20 20 20 20 2a 2a 20  reak out.    ** 
1a130 6f 66 20 74 68 65 20 73 63 61 6e 20 6c 6f 6f 70  of the scan loop
1a140 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73  ..    */.    cas
1a150 65 20 53 52 54 5f 4d 65 6d 3a 20 7b 0a 20 20 20  e SRT_Mem: {.   
1a160 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 2d 3e     assert( pIn->
1a170 6e 53 64 73 74 3d 3d 31 20 7c 7c 20 70 50 61 72  nSdst==1 || pPar
1a180 73 65 2d 3e 6e 45 72 72 3e 30 20 29 3b 20 20 74  se->nErr>0 );  t
1a190 65 73 74 63 61 73 65 28 20 70 49 6e 2d 3e 6e 53  estcase( pIn->nS
1a1a0 64 73 74 21 3d 31 20 29 3b 0a 20 20 20 20 20 20  dst!=1 );.      
1a1b0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 4d  sqlite3ExprCodeM
1a1c0 6f 76 65 28 70 50 61 72 73 65 2c 20 70 49 6e 2d  ove(pParse, pIn-
1a1d0 3e 69 53 64 73 74 2c 20 70 44 65 73 74 2d 3e 69  >iSdst, pDest->i
1a1e0 53 44 50 61 72 6d 2c 20 31 29 3b 0a 20 20 20 20  SDParm, 1);.    
1a1f0 20 20 2f 2a 20 54 68 65 20 4c 49 4d 49 54 20 63    /* The LIMIT c
1a200 6c 61 75 73 65 20 77 69 6c 6c 20 6a 75 6d 70 20  lause will jump 
1a210 6f 75 74 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20  out of the loop 
1a220 66 6f 72 20 75 73 20 2a 2f 0a 20 20 20 20 20 20  for us */.      
1a230 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e  break;.    }.#en
1a240 64 69 66 20 2f 2a 20 23 69 66 6e 64 65 66 20 53  dif /* #ifndef S
1a250 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
1a260 45 52 59 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 54  ERY */..    /* T
1a270 68 65 20 72 65 73 75 6c 74 73 20 61 72 65 20 73  he results are s
1a280 74 6f 72 65 64 20 69 6e 20 61 20 73 65 71 75 65  tored in a seque
1a290 6e 63 65 20 6f 66 20 72 65 67 69 73 74 65 72 73  nce of registers
1a2a0 0a 20 20 20 20 2a 2a 20 73 74 61 72 74 69 6e 67  .    ** starting
1a2b0 20 61 74 20 70 44 65 73 74 2d 3e 69 53 64 73 74   at pDest->iSdst
1a2c0 2e 20 20 54 68 65 6e 20 74 68 65 20 63 6f 2d 72  .  Then the co-r
1a2d0 6f 75 74 69 6e 65 20 79 69 65 6c 64 73 2e 0a 20  outine yields.. 
1a2e0 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53     */.    case S
1a2f0 52 54 5f 43 6f 72 6f 75 74 69 6e 65 3a 20 7b 0a  RT_Coroutine: {.
1a300 20 20 20 20 20 20 69 66 28 20 70 44 65 73 74 2d        if( pDest-
1a310 3e 69 53 64 73 74 3d 3d 30 20 29 7b 0a 20 20 20  >iSdst==0 ){.   
1a320 20 20 20 20 20 70 44 65 73 74 2d 3e 69 53 64 73       pDest->iSds
1a330 74 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  t = sqlite3GetTe
1a340 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20  mpRange(pParse, 
1a350 70 49 6e 2d 3e 6e 53 64 73 74 29 3b 0a 20 20 20  pIn->nSdst);.   
1a360 20 20 20 20 20 70 44 65 73 74 2d 3e 6e 53 64 73       pDest->nSds
1a370 74 20 3d 20 70 49 6e 2d 3e 6e 53 64 73 74 3b 0a  t = pIn->nSdst;.
1a380 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
1a390 6c 69 74 65 33 45 78 70 72 43 6f 64 65 4d 6f 76  lite3ExprCodeMov
1a3a0 65 28 70 50 61 72 73 65 2c 20 70 49 6e 2d 3e 69  e(pParse, pIn->i
1a3b0 53 64 73 74 2c 20 70 44 65 73 74 2d 3e 69 53 64  Sdst, pDest->iSd
1a3c0 73 74 2c 20 70 49 6e 2d 3e 6e 53 64 73 74 29 3b  st, pIn->nSdst);
1a3d0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
1a3e0 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 59  beAddOp1(v, OP_Y
1a3f0 69 65 6c 64 2c 20 70 44 65 73 74 2d 3e 69 53 44  ield, pDest->iSD
1a400 50 61 72 6d 29 3b 0a 20 20 20 20 20 20 62 72 65  Parm);.      bre
1a410 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ak;.    }..    /
1a420 2a 20 49 66 20 6e 6f 6e 65 20 6f 66 20 74 68 65  * If none of the
1a430 20 61 62 6f 76 65 2c 20 74 68 65 6e 20 74 68 65   above, then the
1a440 20 72 65 73 75 6c 74 20 64 65 73 74 69 6e 61 74   result destinat
1a450 69 6f 6e 20 6d 75 73 74 20 62 65 0a 20 20 20 20  ion must be.    
1a460 2a 2a 20 53 52 54 5f 4f 75 74 70 75 74 2e 20 20  ** SRT_Output.  
1a470 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
1a480 6e 65 76 65 72 20 63 61 6c 6c 65 64 20 77 69 74  never called wit
1a490 68 20 61 6e 79 20 6f 74 68 65 72 0a 20 20 20 20  h any other.    
1a4a0 2a 2a 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 6f  ** destination o
1a4b0 74 68 65 72 20 74 68 61 6e 20 74 68 65 20 6f 6e  ther than the on
1a4c0 65 73 20 68 61 6e 64 6c 65 64 20 61 62 6f 76 65  es handled above
1a4d0 20 6f 72 20 53 52 54 5f 4f 75 74 70 75 74 2e 0a   or SRT_Output..
1a4e0 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 46 6f      **.    ** Fo
1a4f0 72 20 53 52 54 5f 4f 75 74 70 75 74 2c 20 72 65  r SRT_Output, re
1a500 73 75 6c 74 73 20 61 72 65 20 73 74 6f 72 65 64  sults are stored
1a510 20 69 6e 20 61 20 73 65 71 75 65 6e 63 65 20 6f   in a sequence o
1a520 66 20 72 65 67 69 73 74 65 72 73 2e 20 20 0a 20  f registers.  . 
1a530 20 20 20 2a 2a 20 54 68 65 6e 20 74 68 65 20 4f     ** Then the O
1a540 50 5f 52 65 73 75 6c 74 52 6f 77 20 6f 70 63 6f  P_ResultRow opco
1a550 64 65 20 69 73 20 75 73 65 64 20 74 6f 20 63 61  de is used to ca
1a560 75 73 65 20 73 71 6c 69 74 65 33 5f 73 74 65 70  use sqlite3_step
1a570 28 29 20 74 6f 0a 20 20 20 20 2a 2a 20 72 65 74  () to.    ** ret
1a580 75 72 6e 20 74 68 65 20 6e 65 78 74 20 72 6f 77  urn the next row
1a590 20 6f 66 20 72 65 73 75 6c 74 2e 0a 20 20 20 20   of result..    
1a5a0 2a 2f 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20  */.    default: 
1a5b0 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
1a5c0 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52  pDest->eDest==SR
1a5d0 54 5f 4f 75 74 70 75 74 20 29 3b 0a 20 20 20 20  T_Output );.    
1a5e0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1a5f0 4f 70 32 28 76 2c 20 4f 50 5f 52 65 73 75 6c 74  Op2(v, OP_Result
1a600 52 6f 77 2c 20 70 49 6e 2d 3e 69 53 64 73 74 2c  Row, pIn->iSdst,
1a610 20 70 49 6e 2d 3e 6e 53 64 73 74 29 3b 0a 20 20   pIn->nSdst);.  
1a620 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
1a630 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20  .  }..  /* Jump 
1a640 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  to the end of th
1a650 65 20 6c 6f 6f 70 20 69 66 20 74 68 65 20 4c 49  e loop if the LI
1a660 4d 49 54 20 69 73 20 72 65 61 63 68 65 64 2e 0a  MIT is reached..
1a670 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 69 4c    */.  if( p->iL
1a680 69 6d 69 74 20 29 7b 0a 20 20 20 20 73 71 6c 69  imit ){.    sqli
1a690 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
1a6a0 20 4f 50 5f 44 65 63 72 4a 75 6d 70 5a 65 72 6f   OP_DecrJumpZero
1a6b0 2c 20 70 2d 3e 69 4c 69 6d 69 74 2c 20 69 42 72  , p->iLimit, iBr
1a6c0 65 61 6b 29 3b 20 56 64 62 65 43 6f 76 65 72 61  eak); VdbeCovera
1a6d0 67 65 28 76 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  ge(v);.  }..  /*
1a6e0 20 47 65 6e 65 72 61 74 65 20 74 68 65 20 73 75   Generate the su
1a6f0 62 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 0a  broutine return.
1a700 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64    */.  sqlite3Vd
1a710 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
1a720 2c 20 69 43 6f 6e 74 69 6e 75 65 29 3b 0a 20 20  , iContinue);.  
1a730 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1a740 31 28 76 2c 20 4f 50 5f 52 65 74 75 72 6e 2c 20  1(v, OP_Return, 
1a750 72 65 67 52 65 74 75 72 6e 29 3b 0a 0a 20 20 72  regReturn);..  r
1a760 65 74 75 72 6e 20 61 64 64 72 3b 0a 7d 0a 0a 2f  eturn addr;.}../
1a770 2a 0a 2a 2a 20 41 6c 74 65 72 6e 61 74 69 76 65  *.** Alternative
1a780 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74   compound select
1a790 20 63 6f 64 65 20 67 65 6e 65 72 61 74 6f 72 20   code generator 
1a7a0 66 6f 72 20 63 61 73 65 73 20 77 68 65 6e 20 74  for cases when t
1a7b0 68 65 72 65 0a 2a 2a 20 69 73 20 61 6e 20 4f 52  here.** is an OR
1a7c0 44 45 52 20 42 59 20 63 6c 61 75 73 65 2e 0a 2a  DER BY clause..*
1a7d0 2a 0a 2a 2a 20 57 65 20 61 73 73 75 6d 65 20 61  *.** We assume a
1a7e0 20 71 75 65 72 79 20 6f 66 20 74 68 65 20 66 6f   query of the fo
1a7f0 6c 6c 6f 77 69 6e 67 20 66 6f 72 6d 3a 0a 2a 2a  llowing form:.**
1a800 0a 2a 2a 20 20 20 20 20 20 3c 73 65 6c 65 63 74  .**      <select
1a810 41 3e 20 20 3c 6f 70 65 72 61 74 6f 72 3e 20 20  A>  <operator>  
1a820 3c 73 65 6c 65 63 74 42 3e 20 20 4f 52 44 45 52  <selectB>  ORDER
1a830 20 42 59 20 3c 6f 72 64 65 72 62 79 6c 69 73 74   BY <orderbylist
1a840 3e 0a 2a 2a 0a 2a 2a 20 3c 6f 70 65 72 61 74 6f  >.**.** <operato
1a850 72 3e 20 69 73 20 6f 6e 65 20 6f 66 20 55 4e 49  r> is one of UNI
1a860 4f 4e 20 41 4c 4c 2c 20 55 4e 49 4f 4e 2c 20 45  ON ALL, UNION, E
1a870 58 43 45 50 54 2c 20 6f 72 20 49 4e 54 45 52 53  XCEPT, or INTERS
1a880 45 43 54 2e 20 20 54 68 65 20 69 64 65 61 0a 2a  ECT.  The idea.*
1a890 2a 20 69 73 20 74 6f 20 63 6f 64 65 20 62 6f 74  * is to code bot
1a8a0 68 20 3c 73 65 6c 65 63 74 41 3e 20 61 6e 64 20  h <selectA> and 
1a8b0 3c 73 65 6c 65 63 74 42 3e 20 77 69 74 68 20 74  <selectB> with t
1a8c0 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
1a8d0 73 65 20 61 73 0a 2a 2a 20 63 6f 2d 72 6f 75 74  se as.** co-rout
1a8e0 69 6e 65 73 2e 20 20 54 68 65 6e 20 72 75 6e 20  ines.  Then run 
1a8f0 74 68 65 20 63 6f 2d 72 6f 75 74 69 6e 65 73 20  the co-routines 
1a900 69 6e 20 70 61 72 61 6c 6c 65 6c 20 61 6e 64 20  in parallel and 
1a910 6d 65 72 67 65 20 74 68 65 20 72 65 73 75 6c 74  merge the result
1a920 73 0a 2a 2a 20 69 6e 74 6f 20 74 68 65 20 6f 75  s.** into the ou
1a930 74 70 75 74 2e 20 20 49 6e 20 61 64 64 69 74 69  tput.  In additi
1a940 6f 6e 20 74 6f 20 74 68 65 20 74 77 6f 20 63 6f  on to the two co
1a950 72 6f 75 74 69 6e 65 73 20 28 63 61 6c 6c 65 64  routines (called
1a960 20 73 65 6c 65 63 74 41 20 61 6e 64 0a 2a 2a 20   selectA and.** 
1a970 73 65 6c 65 63 74 42 29 20 74 68 65 72 65 20 61  selectB) there a
1a980 72 65 20 37 20 73 75 62 72 6f 75 74 69 6e 65 73  re 7 subroutines
1a990 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 6f 75 74 41 3a  :.**.**    outA:
1a9a0 20 20 20 20 4d 6f 76 65 20 74 68 65 20 6f 75 74      Move the out
1a9b0 70 75 74 20 6f 66 20 74 68 65 20 73 65 6c 65 63  put of the selec
1a9c0 74 41 20 63 6f 72 6f 75 74 69 6e 65 20 69 6e 74  tA coroutine int
1a9d0 6f 20 74 68 65 20 6f 75 74 70 75 74 0a 2a 2a 20  o the output.** 
1a9e0 20 20 20 20 20 20 20 20 20 20 20 20 6f 66 20 74              of t
1a9f0 68 65 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72  he compound quer
1aa00 79 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 6f 75 74 42  y..**.**    outB
1aa10 3a 20 20 20 20 4d 6f 76 65 20 74 68 65 20 6f 75  :    Move the ou
1aa20 74 70 75 74 20 6f 66 20 74 68 65 20 73 65 6c 65  tput of the sele
1aa30 63 74 42 20 63 6f 72 6f 75 74 69 6e 65 20 69 6e  ctB coroutine in
1aa40 74 6f 20 74 68 65 20 6f 75 74 70 75 74 0a 2a 2a  to the output.**
1aa50 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 66 20               of 
1aa60 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65  the compound que
1aa70 72 79 2e 20 20 28 4f 6e 6c 79 20 67 65 6e 65 72  ry.  (Only gener
1aa80 61 74 65 64 20 66 6f 72 20 55 4e 49 4f 4e 20 61  ated for UNION a
1aa90 6e 64 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  nd.**           
1aaa0 20 20 55 4e 49 4f 4e 20 41 4c 4c 2e 20 20 45 58    UNION ALL.  EX
1aab0 43 45 50 54 20 61 6e 64 20 49 4e 53 45 52 54 53  CEPT and INSERTS
1aac0 45 43 54 20 6e 65 76 65 72 20 6f 75 74 70 75 74  ECT never output
1aad0 20 61 20 72 6f 77 20 74 68 61 74 0a 2a 2a 20 20   a row that.**  
1aae0 20 20 20 20 20 20 20 20 20 20 20 61 70 70 65 61             appea
1aaf0 72 73 20 6f 6e 6c 79 20 69 6e 20 42 2e 29 0a 2a  rs only in B.).*
1ab00 2a 0a 2a 2a 20 20 20 20 41 6c 74 42 3a 20 20 20  *.**    AltB:   
1ab10 20 43 61 6c 6c 65 64 20 77 68 65 6e 20 74 68 65   Called when the
1ab20 72 65 20 69 73 20 64 61 74 61 20 66 72 6f 6d 20  re is data from 
1ab30 62 6f 74 68 20 63 6f 72 6f 75 74 69 6e 65 73 20  both coroutines 
1ab40 61 6e 64 20 41 3c 42 2e 0a 2a 2a 0a 2a 2a 20 20  and A<B..**.**  
1ab50 20 20 41 65 71 42 3a 20 20 20 20 43 61 6c 6c 65    AeqB:    Calle
1ab60 64 20 77 68 65 6e 20 74 68 65 72 65 20 69 73 20  d when there is 
1ab70 64 61 74 61 20 66 72 6f 6d 20 62 6f 74 68 20 63  data from both c
1ab80 6f 72 6f 75 74 69 6e 65 73 20 61 6e 64 20 41 3d  oroutines and A=
1ab90 3d 42 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 41 67 74  =B..**.**    Agt
1aba0 42 3a 20 20 20 20 43 61 6c 6c 65 64 20 77 68 65  B:    Called whe
1abb0 6e 20 74 68 65 72 65 20 69 73 20 64 61 74 61 20  n there is data 
1abc0 66 72 6f 6d 20 62 6f 74 68 20 63 6f 72 6f 75 74  from both corout
1abd0 69 6e 65 73 20 61 6e 64 20 41 3e 42 2e 0a 2a 2a  ines and A>B..**
1abe0 0a 2a 2a 20 20 20 20 45 6f 66 41 3a 20 20 20 20  .**    EofA:    
1abf0 43 61 6c 6c 65 64 20 77 68 65 6e 20 64 61 74 61  Called when data
1ac00 20 69 73 20 65 78 68 61 75 73 74 65 64 20 66 72   is exhausted fr
1ac10 6f 6d 20 73 65 6c 65 63 74 41 2e 0a 2a 2a 0a 2a  om selectA..**.*
1ac20 2a 20 20 20 20 45 6f 66 42 3a 20 20 20 20 43 61  *    EofB:    Ca
1ac30 6c 6c 65 64 20 77 68 65 6e 20 64 61 74 61 20 69  lled when data i
1ac40 73 20 65 78 68 61 75 73 74 65 64 20 66 72 6f 6d  s exhausted from
1ac50 20 73 65 6c 65 63 74 42 2e 0a 2a 2a 0a 2a 2a 20   selectB..**.** 
1ac60 54 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  The implementati
1ac70 6f 6e 20 6f 66 20 74 68 65 20 6c 61 74 74 65 72  on of the latter
1ac80 20 66 69 76 65 20 73 75 62 72 6f 75 74 69 6e 65   five subroutine
1ac90 73 20 64 65 70 65 6e 64 20 6f 6e 20 77 68 69 63  s depend on whic
1aca0 68 20 0a 2a 2a 20 3c 6f 70 65 72 61 74 6f 72 3e  h .** <operator>
1acb0 20 69 73 20 75 73 65 64 3a 0a 2a 2a 0a 2a 2a 0a   is used:.**.**.
1acc0 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 55  **             U
1acd0 4e 49 4f 4e 20 41 4c 4c 20 20 20 20 20 20 20 20  NION ALL        
1ace0 20 55 4e 49 4f 4e 20 20 20 20 20 20 20 20 20 20   UNION          
1acf0 20 20 45 58 43 45 50 54 20 20 20 20 20 20 20 20    EXCEPT        
1ad00 20 20 49 4e 54 45 52 53 45 43 54 0a 2a 2a 20 20    INTERSECT.**  
1ad10 20 20 20 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d          --------
1ad20 2d 2d 2d 2d 2d 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d  -----  ---------
1ad30 2d 2d 2d 2d 2d 2d 2d 2d 20 20 2d 2d 2d 2d 2d 2d  --------  ------
1ad40 2d 2d 2d 2d 2d 2d 2d 2d 20 20 2d 2d 2d 2d 2d 2d  --------  ------
1ad50 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20  -----------.**  
1ad60 20 41 6c 74 42 3a 20 20 20 6f 75 74 41 2c 20 6e   AltB:   outA, n
1ad70 65 78 74 41 20 20 20 20 20 20 6f 75 74 41 2c 20  extA      outA, 
1ad80 6e 65 78 74 41 20 20 20 20 20 20 20 6f 75 74 41  nextA       outA
1ad90 2c 20 6e 65 78 74 41 20 20 20 20 20 20 20 20 20  , nextA         
1ada0 6e 65 78 74 41 0a 2a 2a 0a 2a 2a 20 20 20 41 65  nextA.**.**   Ae
1adb0 71 42 3a 20 20 20 6f 75 74 41 2c 20 6e 65 78 74  qB:   outA, next
1adc0 41 20 20 20 20 20 20 20 20 20 6e 65 78 74 41 20  A         nextA 
1add0 20 20 20 20 20 20 20 20 20 20 20 20 6e 65 78 74              next
1ade0 41 20 20 20 20 20 20 20 20 20 6f 75 74 41 2c 20  A         outA, 
1adf0 6e 65 78 74 41 0a 2a 2a 0a 2a 2a 20 20 20 41 67  nextA.**.**   Ag
1ae00 74 42 3a 20 20 20 6f 75 74 42 2c 20 6e 65 78 74  tB:   outB, next
1ae10 42 20 20 20 20 20 20 6f 75 74 42 2c 20 6e 65 78  B      outB, nex
1ae20 74 42 20 20 20 20 20 20 20 20 20 20 6e 65 78 74  tB          next
1ae30 42 20 20 20 20 20 20 20 20 20 20 20 20 6e 65 78  B            nex
1ae40 74 42 0a 2a 2a 0a 2a 2a 20 20 20 45 6f 66 41 3a  tB.**.**   EofA:
1ae50 20 20 20 6f 75 74 42 2c 20 6e 65 78 74 42 20 20     outB, nextB  
1ae60 20 20 20 20 6f 75 74 42 2c 20 6e 65 78 74 42 20      outB, nextB 
1ae70 20 20 20 20 20 20 20 20 20 68 61 6c 74 20 20 20           halt   
1ae80 20 20 20 20 20 20 20 20 20 20 68 61 6c 74 0a 2a            halt.*
1ae90 2a 0a 2a 2a 20 20 20 45 6f 66 42 3a 20 20 20 6f  *.**   EofB:   o
1aea0 75 74 41 2c 20 6e 65 78 74 41 20 20 20 20 20 20  utA, nextA      
1aeb0 6f 75 74 41 2c 20 6e 65 78 74 41 20 20 20 20 20  outA, nextA     
1aec0 20 20 6f 75 74 41 2c 20 6e 65 78 74 41 20 20 20    outA, nextA   
1aed0 20 20 20 20 20 20 68 61 6c 74 0a 2a 2a 0a 2a 2a        halt.**.**
1aee0 20 49 6e 20 74 68 65 20 41 6c 74 42 2c 20 41 65   In the AltB, Ae
1aef0 71 42 2c 20 61 6e 64 20 41 67 74 42 20 73 75 62  qB, and AgtB sub
1af00 72 6f 75 74 69 6e 65 73 2c 20 61 6e 20 45 4f 46  routines, an EOF
1af10 20 6f 6e 20 41 20 66 6f 6c 6c 6f 77 69 6e 67 20   on A following 
1af20 6e 65 78 74 41 0a 2a 2a 20 63 61 75 73 65 73 20  nextA.** causes 
1af30 61 6e 20 69 6d 6d 65 64 69 61 74 65 20 6a 75 6d  an immediate jum
1af40 70 20 74 6f 20 45 6f 66 41 20 61 6e 64 20 61 6e  p to EofA and an
1af50 20 45 4f 46 20 6f 6e 20 42 20 66 6f 6c 6c 6f 77   EOF on B follow
1af60 69 6e 67 20 6e 65 78 74 42 20 63 61 75 73 65 73  ing nextB causes
1af70 0a 2a 2a 20 61 6e 20 69 6d 6d 65 64 69 61 74 65  .** an immediate
1af80 20 6a 75 6d 70 20 74 6f 20 45 6f 66 42 2e 20 20   jump to EofB.  
1af90 57 69 74 68 69 6e 20 45 6f 66 41 20 61 6e 64 20  Within EofA and 
1afa0 45 6f 66 42 2c 20 61 6e 64 20 45 4f 46 20 6f 6e  EofB, and EOF on
1afb0 20 65 6e 74 72 79 20 6f 72 0a 2a 2a 20 66 6f 6c   entry or.** fol
1afc0 6c 6f 77 69 6e 67 20 6e 65 78 74 58 20 63 61 75  lowing nextX cau
1afd0 73 65 73 20 61 20 6a 75 6d 70 20 74 6f 20 74 68  ses a jump to th
1afe0 65 20 65 6e 64 20 6f 66 20 74 68 65 20 73 65 6c  e end of the sel
1aff0 65 63 74 20 70 72 6f 63 65 73 73 69 6e 67 2e 0a  ect processing..
1b000 2a 2a 0a 2a 2a 20 44 75 70 6c 69 63 61 74 65 20  **.** Duplicate 
1b010 72 65 6d 6f 76 61 6c 20 69 6e 20 74 68 65 20 55  removal in the U
1b020 4e 49 4f 4e 2c 20 45 58 43 45 50 54 2c 20 61 6e  NION, EXCEPT, an
1b030 64 20 49 4e 54 45 52 53 45 43 54 20 63 61 73 65  d INTERSECT case
1b040 73 20 69 73 20 68 61 6e 64 6c 65 64 0a 2a 2a 20  s is handled.** 
1b050 77 69 74 68 69 6e 20 74 68 65 20 6f 75 74 70 75  within the outpu
1b060 74 20 73 75 62 72 6f 75 74 69 6e 65 2e 20 20 54  t subroutine.  T
1b070 68 65 20 72 65 67 50 72 65 76 20 72 65 67 69 73  he regPrev regis
1b080 74 65 72 20 73 65 74 20 68 6f 6c 64 73 20 74 68  ter set holds th
1b090 65 20 70 72 65 76 69 6f 75 73 6c 79 0a 2a 2a 20  e previously.** 
1b0a0 6f 75 74 70 75 74 20 76 61 6c 75 65 2e 20 20 41  output value.  A
1b0b0 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69 73 20 6d   comparison is m
1b0c0 61 64 65 20 61 67 61 69 6e 73 74 20 74 68 69 73  ade against this
1b0d0 20 76 61 6c 75 65 20 61 6e 64 20 74 68 65 20 6f   value and the o
1b0e0 75 74 70 75 74 0a 2a 2a 20 69 73 20 73 6b 69 70  utput.** is skip
1b0f0 70 65 64 20 69 66 20 74 68 65 20 6e 65 78 74 20  ped if the next 
1b100 72 65 73 75 6c 74 73 20 77 6f 75 6c 64 20 62 65  results would be
1b110 20 74 68 65 20 73 61 6d 65 20 61 73 20 74 68 65   the same as the
1b120 20 70 72 65 76 69 6f 75 73 2e 0a 2a 2a 0a 2a 2a   previous..**.**
1b130 20 54 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74   The implementat
1b140 69 6f 6e 20 70 6c 61 6e 20 69 73 20 74 6f 20 69  ion plan is to i
1b150 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 74 77 6f  mplement the two
1b160 20 63 6f 72 6f 75 74 69 6e 65 73 20 61 6e 64 20   coroutines and 
1b170 73 65 76 65 6e 0a 2a 2a 20 73 75 62 72 6f 75 74  seven.** subrout
1b180 69 6e 65 73 20 66 69 72 73 74 2c 20 74 68 65 6e  ines first, then
1b190 20 70 75 74 20 74 68 65 20 63 6f 6e 74 72 6f 6c   put the control
1b1a0 20 6c 6f 67 69 63 20 61 74 20 74 68 65 20 62 6f   logic at the bo
1b1b0 74 74 6f 6d 2e 20 20 4c 69 6b 65 20 74 68 69 73  ttom.  Like this
1b1c0 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20  :.**.**         
1b1d0 20 67 6f 74 6f 20 49 6e 69 74 0a 2a 2a 20 20 20   goto Init.**   
1b1e0 20 20 63 6f 41 3a 20 63 6f 72 6f 75 74 69 6e 65    coA: coroutine
1b1f0 20 66 6f 72 20 6c 65 66 74 20 71 75 65 72 79 20   for left query 
1b200 28 41 29 0a 2a 2a 20 20 20 20 20 63 6f 42 3a 20  (A).**     coB: 
1b210 63 6f 72 6f 75 74 69 6e 65 20 66 6f 72 20 72 69  coroutine for ri
1b220 67 68 74 20 71 75 65 72 79 20 28 42 29 0a 2a 2a  ght query (B).**
1b230 20 20 20 20 6f 75 74 41 3a 20 6f 75 74 70 75 74      outA: output
1b240 20 6f 6e 65 20 72 6f 77 20 6f 66 20 41 0a 2a 2a   one row of A.**
1b250 20 20 20 20 6f 75 74 42 3a 20 6f 75 74 70 75 74      outB: output
1b260 20 6f 6e 65 20 72 6f 77 20 6f 66 20 42 20 28 55   one row of B (U
1b270 4e 49 4f 4e 20 61 6e 64 20 55 4e 49 4f 4e 20 41  NION and UNION A
1b280 4c 4c 20 6f 6e 6c 79 29 0a 2a 2a 20 20 20 20 45  LL only).**    E
1b290 6f 66 41 3a 20 2e 2e 2e 0a 2a 2a 20 20 20 20 45  ofA: ....**    E
1b2a0 6f 66 42 3a 20 2e 2e 2e 0a 2a 2a 20 20 20 20 41  ofB: ....**    A
1b2b0 6c 74 42 3a 20 2e 2e 2e 0a 2a 2a 20 20 20 20 41  ltB: ....**    A
1b2c0 65 71 42 3a 20 2e 2e 2e 0a 2a 2a 20 20 20 20 41  eqB: ....**    A
1b2d0 67 74 42 3a 20 2e 2e 2e 0a 2a 2a 20 20 20 20 49  gtB: ....**    I
1b2e0 6e 69 74 3a 20 69 6e 69 74 69 61 6c 69 7a 65 20  nit: initialize 
1b2f0 63 6f 72 6f 75 74 69 6e 65 20 72 65 67 69 73 74  coroutine regist
1b300 65 72 73 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ers.**          
1b310 79 69 65 6c 64 20 63 6f 41 0a 2a 2a 20 20 20 20  yield coA.**    
1b320 20 20 20 20 20 20 69 66 20 65 6f 66 28 41 29 20        if eof(A) 
1b330 67 6f 74 6f 20 45 6f 66 41 0a 2a 2a 20 20 20 20  goto EofA.**    
1b340 20 20 20 20 20 20 79 69 65 6c 64 20 63 6f 42 0a        yield coB.
1b350 2a 2a 20 20 20 20 20 20 20 20 20 20 69 66 20 65  **          if e
1b360 6f 66 28 42 29 20 67 6f 74 6f 20 45 6f 66 42 0a  of(B) goto EofB.
1b370 2a 2a 20 20 20 20 43 6d 70 72 3a 20 43 6f 6d 70  **    Cmpr: Comp
1b380 61 72 65 20 41 2c 20 42 0a 2a 2a 20 20 20 20 20  are A, B.**     
1b390 20 20 20 20 20 4a 75 6d 70 20 41 6c 74 42 2c 20       Jump AltB, 
1b3a0 41 65 71 42 2c 20 41 67 74 42 0a 2a 2a 20 20 20  AeqB, AgtB.**   
1b3b0 20 20 45 6e 64 3a 20 2e 2e 2e 0a 2a 2a 0a 2a 2a    End: ....**.**
1b3c0 20 57 65 20 63 61 6c 6c 20 41 6c 74 42 2c 20 41   We call AltB, A
1b3d0 65 71 42 2c 20 41 67 74 42 2c 20 45 6f 66 41 2c  eqB, AgtB, EofA,
1b3e0 20 61 6e 64 20 45 6f 66 42 20 22 73 75 62 72 6f   and EofB "subro
1b3f0 75 74 69 6e 65 73 22 20 62 75 74 20 74 68 65 79  utines" but they
1b400 20 61 72 65 20 6e 6f 74 0a 2a 2a 20 61 63 74 75   are not.** actu
1b410 61 6c 6c 79 20 63 61 6c 6c 65 64 20 75 73 69 6e  ally called usin
1b420 67 20 47 6f 73 75 62 20 61 6e 64 20 74 68 65 79  g Gosub and they
1b430 20 64 6f 20 6e 6f 74 20 52 65 74 75 72 6e 2e 20   do not Return. 
1b440 20 45 6f 66 41 20 61 6e 64 20 45 6f 66 42 20 6c   EofA and EofB l
1b450 6f 6f 70 0a 2a 2a 20 75 6e 74 69 6c 20 61 6c 6c  oop.** until all
1b460 20 64 61 74 61 20 69 73 20 65 78 68 61 75 73 74   data is exhaust
1b470 65 64 20 74 68 65 6e 20 6a 75 6d 70 20 74 6f 20  ed then jump to 
1b480 74 68 65 20 22 65 6e 64 22 20 6c 61 62 65 2e 20  the "end" labe. 
1b490 20 41 6c 74 42 2c 20 41 65 71 42 2c 0a 2a 2a 20   AltB, AeqB,.** 
1b4a0 61 6e 64 20 41 67 74 42 20 6a 75 6d 70 20 74 6f  and AgtB jump to
1b4b0 20 65 69 74 68 65 72 20 4c 32 20 6f 72 20 74 6f   either L2 or to
1b4c0 20 6f 6e 65 20 6f 66 20 45 6f 66 41 20 6f 72 20   one of EofA or 
1b4d0 45 6f 66 42 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66  EofB..*/.#ifndef
1b4e0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d   SQLITE_OMIT_COM
1b4f0 50 4f 55 4e 44 5f 53 45 4c 45 43 54 0a 73 74 61  POUND_SELECT.sta
1b500 74 69 63 20 69 6e 74 20 6d 75 6c 74 69 53 65 6c  tic int multiSel
1b510 65 63 74 4f 72 64 65 72 42 79 28 0a 20 20 50 61  ectOrderBy(.  Pa
1b520 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
1b530 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63      /* Parsing c
1b540 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65  ontext */.  Sele
1b550 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  ct *p,          
1b560 20 20 2f 2a 20 54 68 65 20 72 69 67 68 74 2d 6d    /* The right-m
1b570 6f 73 74 20 6f 66 20 53 45 4c 45 43 54 73 20 74  ost of SELECTs t
1b580 6f 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20  o be coded */.  
1b590 53 65 6c 65 63 74 44 65 73 74 20 2a 70 44 65 73  SelectDest *pDes
1b5a0 74 20 20 20 20 20 2f 2a 20 57 68 61 74 20 74 6f  t     /* What to
1b5b0 20 64 6f 20 77 69 74 68 20 71 75 65 72 79 20 72   do with query r
1b5c0 65 73 75 6c 74 73 20 2a 2f 0a 29 7b 0a 20 20 69  esults */.){.  i
1b5d0 6e 74 20 69 2c 20 6a 3b 20 20 20 20 20 20 20 20  nt i, j;        
1b5e0 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
1b5f0 6e 74 65 72 73 20 2a 2f 0a 20 20 53 65 6c 65 63  nters */.  Selec
1b600 74 20 2a 70 50 72 69 6f 72 3b 20 20 20 20 20 20  t *pPrior;      
1b610 20 2f 2a 20 41 6e 6f 74 68 65 72 20 53 45 4c 45   /* Another SELE
1b620 43 54 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 74  CT immediately t
1b630 6f 20 6f 75 72 20 6c 65 66 74 20 2a 2f 0a 20 20  o our left */.  
1b640 56 64 62 65 20 2a 76 3b 20 20 20 20 20 20 20 20  Vdbe *v;        
1b650 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74        /* Generat
1b660 65 20 63 6f 64 65 20 74 6f 20 74 68 69 73 20 56  e code to this V
1b670 44 42 45 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44  DBE */.  SelectD
1b680 65 73 74 20 64 65 73 74 41 3b 20 20 20 20 20 2f  est destA;     /
1b690 2a 20 44 65 73 74 69 6e 61 74 69 6f 6e 20 66 6f  * Destination fo
1b6a0 72 20 63 6f 72 6f 75 74 69 6e 65 20 41 20 2a 2f  r coroutine A */
1b6b0 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 64 65  .  SelectDest de
1b6c0 73 74 42 3b 20 20 20 20 20 2f 2a 20 44 65 73 74  stB;     /* Dest
1b6d0 69 6e 61 74 69 6f 6e 20 66 6f 72 20 63 6f 72 6f  ination for coro
1b6e0 75 74 69 6e 65 20 42 20 2a 2f 0a 20 20 69 6e 74  utine B */.  int
1b6f0 20 72 65 67 41 64 64 72 41 3b 20 20 20 20 20 20   regAddrA;      
1b700 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 72 65     /* Address re
1b710 67 69 73 74 65 72 20 66 6f 72 20 73 65 6c 65 63  gister for selec
1b720 74 2d 41 20 63 6f 72 6f 75 74 69 6e 65 20 2a 2f  t-A coroutine */
1b730 0a 20 20 69 6e 74 20 72 65 67 41 64 64 72 42 3b  .  int regAddrB;
1b740 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72           /* Addr
1b750 65 73 73 20 72 65 67 69 73 74 65 72 20 66 6f 72  ess register for
1b760 20 73 65 6c 65 63 74 2d 42 20 63 6f 72 6f 75 74   select-B corout
1b770 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64  ine */.  int add
1b780 72 53 65 6c 65 63 74 41 3b 20 20 20 20 20 20 2f  rSelectA;      /
1b790 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 68 65  * Address of the
1b7a0 20 73 65 6c 65 63 74 2d 41 20 63 6f 72 6f 75 74   select-A corout
1b7b0 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64  ine */.  int add
1b7c0 72 53 65 6c 65 63 74 42 3b 20 20 20 20 20 20 2f  rSelectB;      /
1b7d0 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 68 65  * Address of the
1b7e0 20 73 65 6c 65 63 74 2d 42 20 63 6f 72 6f 75 74   select-B corout
1b7f0 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67  ine */.  int reg
1b800 4f 75 74 41 3b 20 20 20 20 20 20 20 20 20 20 2f  OutA;          /
1b810 2a 20 41 64 64 72 65 73 73 20 72 65 67 69 73 74  * Address regist
1b820 65 72 20 66 6f 72 20 74 68 65 20 6f 75 74 70 75  er for the outpu
1b830 74 2d 41 20 73 75 62 72 6f 75 74 69 6e 65 20 2a  t-A subroutine *
1b840 2f 0a 20 20 69 6e 74 20 72 65 67 4f 75 74 42 3b  /.  int regOutB;
1b850 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64            /* Add
1b860 72 65 73 73 20 72 65 67 69 73 74 65 72 20 66 6f  ress register fo
1b870 72 20 74 68 65 20 6f 75 74 70 75 74 2d 42 20 73  r the output-B s
1b880 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69  ubroutine */.  i
1b890 6e 74 20 61 64 64 72 4f 75 74 41 3b 20 20 20 20  nt addrOutA;    
1b8a0 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
1b8b0 6f 66 20 74 68 65 20 6f 75 74 70 75 74 2d 41 20  of the output-A 
1b8c0 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20  subroutine */.  
1b8d0 69 6e 74 20 61 64 64 72 4f 75 74 42 20 3d 20 30  int addrOutB = 0
1b8e0 3b 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73  ;     /* Address
1b8f0 20 6f 66 20 74 68 65 20 6f 75 74 70 75 74 2d 42   of the output-B
1b900 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20   subroutine */. 
1b910 20 69 6e 74 20 61 64 64 72 45 6f 66 41 3b 20 20   int addrEofA;  
1b920 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73         /* Addres
1b930 73 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74 2d  s of the select-
1b940 41 2d 65 78 68 61 75 73 74 65 64 20 73 75 62 72  A-exhausted subr
1b950 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20  outine */.  int 
1b960 61 64 64 72 45 6f 66 41 5f 6e 6f 42 3b 20 20 20  addrEofA_noB;   
1b970 20 20 2f 2a 20 41 6c 74 65 72 6e 61 74 65 20 61    /* Alternate a
1b980 64 64 72 45 6f 66 41 20 69 66 20 42 20 69 73 20  ddrEofA if B is 
1b990 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64 20 2a 2f  uninitialized */
1b9a0 0a 20 20 69 6e 74 20 61 64 64 72 45 6f 66 42 3b  .  int addrEofB;
1b9b0 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72           /* Addr
1b9c0 65 73 73 20 6f 66 20 74 68 65 20 73 65 6c 65 63  ess of the selec
1b9d0 74 2d 42 2d 65 78 68 61 75 73 74 65 64 20 73 75  t-B-exhausted su
1b9e0 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e  broutine */.  in
1b9f0 74 20 61 64 64 72 41 6c 74 42 3b 20 20 20 20 20  t addrAltB;     
1ba00 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f      /* Address o
1ba10 66 20 74 68 65 20 41 3c 42 20 73 75 62 72 6f 75  f the A<B subrou
1ba20 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64  tine */.  int ad
1ba30 64 72 41 65 71 42 3b 20 20 20 20 20 20 20 20 20  drAeqB;         
1ba40 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 68  /* Address of th
1ba50 65 20 41 3d 3d 42 20 73 75 62 72 6f 75 74 69 6e  e A==B subroutin
1ba60 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 41  e */.  int addrA
1ba70 67 74 42 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  gtB;         /* 
1ba80 41 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 41  Address of the A
1ba90 3e 42 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f  >B subroutine */
1baa0 0a 20 20 69 6e 74 20 72 65 67 4c 69 6d 69 74 41  .  int regLimitA
1bab0 3b 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 6d 69  ;        /* Limi
1bac0 74 20 72 65 67 69 73 74 65 72 20 66 6f 72 20 73  t register for s
1bad0 65 6c 65 63 74 2d 41 20 2a 2f 0a 20 20 69 6e 74  elect-A */.  int
1bae0 20 72 65 67 4c 69 6d 69 74 42 3b 20 20 20 20 20   regLimitB;     
1baf0 20 20 20 2f 2a 20 4c 69 6d 69 74 20 72 65 67 69     /* Limit regi
1bb00 73 74 65 72 20 66 6f 72 20 73 65 6c 65 63 74 2d  ster for select-
1bb10 41 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 50 72  A */.  int regPr
1bb20 65 76 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ev;          /* 
1bb30 41 20 72 61 6e 67 65 20 6f 66 20 72 65 67 69 73  A range of regis
1bb40 74 65 72 73 20 74 6f 20 68 6f 6c 64 20 70 72 65  ters to hold pre
1bb50 76 69 6f 75 73 20 6f 75 74 70 75 74 20 2a 2f 0a  vious output */.
1bb60 20 20 69 6e 74 20 73 61 76 65 64 4c 69 6d 69 74    int savedLimit
1bb70 3b 20 20 20 20 20 20 20 2f 2a 20 53 61 76 65 64  ;       /* Saved
1bb80 20 76 61 6c 75 65 20 6f 66 20 70 2d 3e 69 4c 69   value of p->iLi
1bb90 6d 69 74 20 2a 2f 0a 20 20 69 6e 74 20 73 61 76  mit */.  int sav
1bba0 65 64 4f 66 66 73 65 74 3b 20 20 20 20 20 20 2f  edOffset;      /
1bbb0 2a 20 53 61 76 65 64 20 76 61 6c 75 65 20 6f 66  * Saved value of
1bbc0 20 70 2d 3e 69 4f 66 66 73 65 74 20 2a 2f 0a 20   p->iOffset */. 
1bbd0 20 69 6e 74 20 6c 61 62 65 6c 43 6d 70 72 3b 20   int labelCmpr; 
1bbe0 20 20 20 20 20 20 20 2f 2a 20 4c 61 62 65 6c 20         /* Label 
1bbf0 66 6f 72 20 74 68 65 20 73 74 61 72 74 20 6f 66  for the start of
1bc00 20 74 68 65 20 6d 65 72 67 65 20 61 6c 67 6f 72   the merge algor
1bc10 69 74 68 6d 20 2a 2f 0a 20 20 69 6e 74 20 6c 61  ithm */.  int la
1bc20 62 65 6c 45 6e 64 3b 20 20 20 20 20 20 20 20 20  belEnd;         
1bc30 2f 2a 20 4c 61 62 65 6c 20 66 6f 72 20 74 68 65  /* Label for the
1bc40 20 65 6e 64 20 6f 66 20 74 68 65 20 6f 76 65 72   end of the over
1bc50 61 6c 6c 20 53 45 4c 45 43 54 20 73 74 6d 74 20  all SELECT stmt 
1bc60 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 31 3b 20  */.  int addr1; 
1bc70 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75             /* Ju
1bc80 6d 70 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 20  mp instructions 
1bc90 74 68 61 74 20 67 65 74 20 72 65 74 61 72 67 65  that get retarge
1bca0 74 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 70  tted */.  int op
1bcb0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1bcc0 2f 2a 20 4f 6e 65 20 6f 66 20 54 4b 5f 41 4c 4c  /* One of TK_ALL
1bcd0 2c 20 54 4b 5f 55 4e 49 4f 4e 2c 20 54 4b 5f 45  , TK_UNION, TK_E
1bce0 58 43 45 50 54 2c 20 54 4b 5f 49 4e 54 45 52 53  XCEPT, TK_INTERS
1bcf0 45 43 54 20 2a 2f 0a 20 20 4b 65 79 49 6e 66 6f  ECT */.  KeyInfo
1bd00 20 2a 70 4b 65 79 44 75 70 20 3d 20 30 3b 20 2f   *pKeyDup = 0; /
1bd10 2a 20 43 6f 6d 70 61 72 69 73 6f 6e 20 69 6e 66  * Comparison inf
1bd20 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20 64 75 70  ormation for dup
1bd30 6c 69 63 61 74 65 20 72 65 6d 6f 76 61 6c 20 2a  licate removal *
1bd40 2f 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65  /.  KeyInfo *pKe
1bd50 79 4d 65 72 67 65 3b 20 20 20 2f 2a 20 43 6f 6d  yMerge;   /* Com
1bd60 70 61 72 69 73 6f 6e 20 69 6e 66 6f 72 6d 61 74  parison informat
1bd70 69 6f 6e 20 66 6f 72 20 6d 65 72 67 69 6e 67 20  ion for merging 
1bd80 72 6f 77 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65  rows */.  sqlite
1bd90 33 20 2a 64 62 3b 20 20 20 20 20 20 20 20 20 20  3 *db;          
1bda0 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e  /* Database conn
1bdb0 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 45 78 70 72  ection */.  Expr
1bdc0 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 3b 20  List *pOrderBy; 
1bdd0 20 20 2f 2a 20 54 68 65 20 4f 52 44 45 52 20 42    /* The ORDER B
1bde0 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e  Y clause */.  in
1bdf0 74 20 6e 4f 72 64 65 72 42 79 3b 20 20 20 20 20  t nOrderBy;     
1be00 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
1be10 20 74 65 72 6d 73 20 69 6e 20 74 68 65 20 4f 52   terms in the OR
1be20 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f  DER BY clause */
1be30 0a 20 20 69 6e 74 20 2a 61 50 65 72 6d 75 74 65  .  int *aPermute
1be40 3b 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 70 70  ;        /* Mapp
1be50 69 6e 67 20 66 72 6f 6d 20 4f 52 44 45 52 20 42  ing from ORDER B
1be60 59 20 74 65 72 6d 73 20 74 6f 20 72 65 73 75 6c  Y terms to resul
1be70 74 20 73 65 74 20 63 6f 6c 75 6d 6e 73 20 2a 2f  t set columns */
1be80 0a 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70  ..  assert( p->p
1be90 4f 72 64 65 72 42 79 21 3d 30 20 29 3b 0a 20 20  OrderBy!=0 );.  
1bea0 61 73 73 65 72 74 28 20 70 4b 65 79 44 75 70 3d  assert( pKeyDup=
1beb0 3d 30 20 29 3b 20 2f 2a 20 22 4d 61 6e 61 67 65  =0 ); /* "Manage
1bec0 64 22 20 63 6f 64 65 20 6e 65 65 64 73 20 74 68  d" code needs th
1bed0 69 73 2e 20 20 54 69 63 6b 65 74 20 23 33 33 38  is.  Ticket #338
1bee0 32 2e 20 2a 2f 0a 20 20 64 62 20 3d 20 70 50 61  2. */.  db = pPa
1bef0 72 73 65 2d 3e 64 62 3b 0a 20 20 76 20 3d 20 70  rse->db;.  v = p
1bf00 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
1bf10 61 73 73 65 72 74 28 20 76 21 3d 30 20 29 3b 20  assert( v!=0 ); 
1bf20 20 20 20 20 20 20 2f 2a 20 41 6c 72 65 61 64 79        /* Already
1bf30 20 74 68 72 6f 77 6e 20 74 68 65 20 65 72 72 6f   thrown the erro
1bf40 72 20 69 66 20 56 44 42 45 20 61 6c 6c 6f 63 20  r if VDBE alloc 
1bf50 66 61 69 6c 65 64 20 2a 2f 0a 20 20 6c 61 62 65  failed */.  labe
1bf60 6c 45 6e 64 20 3d 20 73 71 6c 69 74 65 33 56 64  lEnd = sqlite3Vd
1bf70 62 65 4d 61 6b 65 4c 61 62 65 6c 28 70 50 61 72  beMakeLabel(pPar
1bf80 73 65 29 3b 0a 20 20 6c 61 62 65 6c 43 6d 70 72  se);.  labelCmpr
1bf90 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
1bfa0 6b 65 4c 61 62 65 6c 28 70 50 61 72 73 65 29 3b  keLabel(pParse);
1bfb0 0a 0a 0a 20 20 2f 2a 20 50 61 74 63 68 20 75 70  ...  /* Patch up
1bfc0 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   the ORDER BY cl
1bfd0 61 75 73 65 0a 20 20 2a 2f 0a 20 20 6f 70 20 3d  ause.  */.  op =
1bfe0 20 70 2d 3e 6f 70 3b 20 20 0a 20 20 70 50 72 69   p->op;  .  pPri
1bff0 6f 72 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 0a  or = p->pPrior;.
1c000 20 20 61 73 73 65 72 74 28 20 70 50 72 69 6f 72    assert( pPrior
1c010 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 3b  ->pOrderBy==0 );
1c020 0a 20 20 70 4f 72 64 65 72 42 79 20 3d 20 70 2d  .  pOrderBy = p-
1c030 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 61 73 73  >pOrderBy;.  ass
1c040 65 72 74 28 20 70 4f 72 64 65 72 42 79 20 29 3b  ert( pOrderBy );
1c050 0a 20 20 6e 4f 72 64 65 72 42 79 20 3d 20 70 4f  .  nOrderBy = pO
1c060 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 0a 0a  rderBy->nExpr;..
1c070 20 20 2f 2a 20 46 6f 72 20 6f 70 65 72 61 74 6f    /* For operato
1c080 72 73 20 6f 74 68 65 72 20 74 68 61 6e 20 55 4e  rs other than UN
1c090 49 4f 4e 20 41 4c 4c 20 77 65 20 68 61 76 65 20  ION ALL we have 
1c0a0 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61  to make sure tha
1c0b0 74 0a 20 20 2a 2a 20 74 68 65 20 4f 52 44 45 52  t.  ** the ORDER
1c0c0 20 42 59 20 63 6c 61 75 73 65 20 63 6f 76 65 72   BY clause cover
1c0d0 73 20 65 76 65 72 79 20 74 65 72 6d 20 6f 66 20  s every term of 
1c0e0 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 2e 20  the result set. 
1c0f0 20 41 64 64 0a 20 20 2a 2a 20 74 65 72 6d 73 20   Add.  ** terms 
1c100 74 6f 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  to the ORDER BY 
1c110 63 6c 61 75 73 65 20 61 73 20 6e 65 63 65 73 73  clause as necess
1c120 61 72 79 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ary..  */.  if( 
1c130 6f 70 21 3d 54 4b 5f 41 4c 4c 20 29 7b 0a 20 20  op!=TK_ALL ){.  
1c140 20 20 66 6f 72 28 69 3d 31 3b 20 64 62 2d 3e 6d    for(i=1; db->m
1c150 61 6c 6c 6f 63 46 61 69 6c 65 64 3d 3d 30 20 26  allocFailed==0 &
1c160 26 20 69 3c 3d 70 2d 3e 70 45 4c 69 73 74 2d 3e  & i<=p->pEList->
1c170 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
1c180 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69     struct ExprLi
1c190 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a  st_item *pItem;.
1c1a0 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 2c 20 70        for(j=0, p
1c1b0 49 74 65 6d 3d 70 4f 72 64 65 72 42 79 2d 3e 61  Item=pOrderBy->a
1c1c0 3b 20 6a 3c 6e 4f 72 64 65 72 42 79 3b 20 6a 2b  ; j<nOrderBy; j+
1c1d0 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20  +, pItem++){.   
1c1e0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49 74       assert( pIt
1c1f0 65 6d 2d 3e 75 2e 78 2e 69 4f 72 64 65 72 42 79  em->u.x.iOrderBy
1c200 43 6f 6c 3e 30 20 29 3b 0a 20 20 20 20 20 20 20  Col>0 );.       
1c210 20 69 66 28 20 70 49 74 65 6d 2d 3e 75 2e 78 2e   if( pItem->u.x.
1c220 69 4f 72 64 65 72 42 79 43 6f 6c 3d 3d 69 20 29  iOrderByCol==i )
1c230 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
1c240 20 20 20 20 20 20 69 66 28 20 6a 3d 3d 6e 4f 72        if( j==nOr
1c250 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20 20  derBy ){.       
1c260 20 45 78 70 72 20 2a 70 4e 65 77 20 3d 20 73 71   Expr *pNew = sq
1c270 6c 69 74 65 33 45 78 70 72 28 64 62 2c 20 54 4b  lite3Expr(db, TK
1c280 5f 49 4e 54 45 47 45 52 2c 20 30 29 3b 0a 20 20  _INTEGER, 0);.  
1c290 20 20 20 20 20 20 69 66 28 20 70 4e 65 77 3d 3d        if( pNew==
1c2a0 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  0 ) return SQLIT
1c2b0 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20  E_NOMEM_BKPT;.  
1c2c0 20 20 20 20 20 20 70 4e 65 77 2d 3e 66 6c 61 67        pNew->flag
1c2d0 73 20 7c 3d 20 45 50 5f 49 6e 74 56 61 6c 75 65  s |= EP_IntValue
1c2e0 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e  ;.        pNew->
1c2f0 75 2e 69 56 61 6c 75 65 20 3d 20 69 3b 0a 20 20  u.iValue = i;.  
1c300 20 20 20 20 20 20 70 2d 3e 70 4f 72 64 65 72 42        p->pOrderB
1c310 79 20 3d 20 70 4f 72 64 65 72 42 79 20 3d 20 73  y = pOrderBy = s
1c320 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70  qlite3ExprListAp
1c330 70 65 6e 64 28 70 50 61 72 73 65 2c 20 70 4f 72  pend(pParse, pOr
1c340 64 65 72 42 79 2c 20 70 4e 65 77 29 3b 0a 20 20  derBy, pNew);.  
1c350 20 20 20 20 20 20 69 66 28 20 70 4f 72 64 65 72        if( pOrder
1c360 42 79 20 29 20 70 4f 72 64 65 72 42 79 2d 3e 61  By ) pOrderBy->a
1c370 5b 6e 4f 72 64 65 72 42 79 2b 2b 5d 2e 75 2e 78  [nOrderBy++].u.x
1c380 2e 69 4f 72 64 65 72 42 79 43 6f 6c 20 3d 20 28  .iOrderByCol = (
1c390 75 31 36 29 69 3b 0a 20 20 20 20 20 20 7d 0a 20  u16)i;.      }. 
1c3a0 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43     }.  }..  /* C
1c3b0 6f 6d 70 75 74 65 20 74 68 65 20 63 6f 6d 70 61  ompute the compa
1c3c0 72 69 73 6f 6e 20 70 65 72 6d 75 74 61 74 69 6f  rison permutatio
1c3d0 6e 20 61 6e 64 20 6b 65 79 69 6e 66 6f 20 74 68  n and keyinfo th
1c3e0 61 74 20 69 73 20 75 73 65 64 20 77 69 74 68 0a  at is used with.
1c3f0 20 20 2a 2a 20 74 68 65 20 70 65 72 6d 75 74 61    ** the permuta
1c400 74 69 6f 6e 20 75 73 65 64 20 74 6f 20 64 65 74  tion used to det
1c410 65 72 6d 69 6e 65 20 69 66 20 74 68 65 20 6e 65  ermine if the ne
1c420 78 74 0a 20 20 2a 2a 20 72 6f 77 20 6f 66 20 72  xt.  ** row of r
1c430 65 73 75 6c 74 73 20 63 6f 6d 65 73 20 66 72 6f  esults comes fro
1c440 6d 20 73 65 6c 65 63 74 41 20 6f 72 20 73 65 6c  m selectA or sel
1c450 65 63 74 42 2e 20 20 41 6c 73 6f 20 61 64 64 20  ectB.  Also add 
1c460 65 78 70 6c 69 63 69 74 0a 20 20 2a 2a 20 63 6f  explicit.  ** co
1c470 6c 6c 61 74 69 6f 6e 73 20 74 6f 20 74 68 65 20  llations to the 
1c480 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
1c490 74 65 72 6d 73 20 73 6f 20 74 68 61 74 20 77 68  terms so that wh
1c4a0 65 6e 20 74 68 65 20 73 75 62 71 75 65 72 69 65  en the subquerie
1c4b0 73 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20 72 69  s.  ** to the ri
1c4c0 67 68 74 20 61 6e 64 20 74 68 65 20 6c 65 66 74  ght and the left
1c4d0 20 61 72 65 20 65 76 61 6c 75 61 74 65 64 2c 20   are evaluated, 
1c4e0 74 68 65 79 20 75 73 65 20 74 68 65 20 63 6f 72  they use the cor
1c4f0 72 65 63 74 0a 20 20 2a 2a 20 63 6f 6c 6c 61 74  rect.  ** collat
1c500 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 61 50 65 72  ion..  */.  aPer
1c510 6d 75 74 65 20 3d 20 73 71 6c 69 74 65 33 44 62  mute = sqlite3Db
1c520 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 64 62 2c 20  MallocRawNN(db, 
1c530 73 69 7a 65 6f 66 28 69 6e 74 29 2a 28 6e 4f 72  sizeof(int)*(nOr
1c540 64 65 72 42 79 20 2b 20 31 29 29 3b 0a 20 20 69  derBy + 1));.  i
1c550 66 28 20 61 50 65 72 6d 75 74 65 20 29 7b 0a 20  f( aPermute ){. 
1c560 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69     struct ExprLi
1c570 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a  st_item *pItem;.
1c580 20 20 20 20 61 50 65 72 6d 75 74 65 5b 30 5d 20      aPermute[0] 
1c590 3d 20 6e 4f 72 64 65 72 42 79 3b 0a 20 20 20 20  = nOrderBy;.    
1c5a0 66 6f 72 28 69 3d 31 2c 20 70 49 74 65 6d 3d 70  for(i=1, pItem=p
1c5b0 4f 72 64 65 72 42 79 2d 3e 61 3b 20 69 3c 3d 6e  OrderBy->a; i<=n
1c5c0 4f 72 64 65 72 42 79 3b 20 69 2b 2b 2c 20 70 49  OrderBy; i++, pI
1c5d0 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 61 73  tem++){.      as
1c5e0 73 65 72 74 28 20 70 49 74 65 6d 2d 3e 75 2e 78  sert( pItem->u.x
1c5f0 2e 69 4f 72 64 65 72 42 79 43 6f 6c 3e 30 20 29  .iOrderByCol>0 )
1c600 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
1c610 70 49 74 65 6d 2d 3e 75 2e 78 2e 69 4f 72 64 65  pItem->u.x.iOrde
1c620 72 42 79 43 6f 6c 3c 3d 70 2d 3e 70 45 4c 69 73  rByCol<=p->pELis
1c630 74 2d 3e 6e 45 78 70 72 20 29 3b 0a 20 20 20 20  t->nExpr );.    
1c640 20 20 61 50 65 72 6d 75 74 65 5b 69 5d 20 3d 20    aPermute[i] = 
1c650 70 49 74 65 6d 2d 3e 75 2e 78 2e 69 4f 72 64 65  pItem->u.x.iOrde
1c660 72 42 79 43 6f 6c 20 2d 20 31 3b 0a 20 20 20 20  rByCol - 1;.    
1c670 7d 0a 20 20 20 20 70 4b 65 79 4d 65 72 67 65 20  }.    pKeyMerge 
1c680 3d 20 6d 75 6c 74 69 53 65 6c 65 63 74 4f 72 64  = multiSelectOrd
1c690 65 72 42 79 4b 65 79 49 6e 66 6f 28 70 50 61 72  erByKeyInfo(pPar
1c6a0 73 65 2c 20 70 2c 20 31 29 3b 0a 20 20 7d 65 6c  se, p, 1);.  }el
1c6b0 73 65 7b 0a 20 20 20 20 70 4b 65 79 4d 65 72 67  se{.    pKeyMerg
1c6c0 65 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  e = 0;.  }..  /*
1c6d0 20 52 65 61 74 74 61 63 68 20 74 68 65 20 4f 52   Reattach the OR
1c6e0 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 74 6f  DER BY clause to
1c6f0 20 74 68 65 20 71 75 65 72 79 2e 0a 20 20 2a 2f   the query..  */
1c700 0a 20 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d  .  p->pOrderBy =
1c710 20 70 4f 72 64 65 72 42 79 3b 0a 20 20 70 50 72   pOrderBy;.  pPr
1c720 69 6f 72 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20  ior->pOrderBy = 
1c730 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
1c740 75 70 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  up(pParse->db, p
1c750 4f 72 64 65 72 42 79 2c 20 30 29 3b 0a 0a 20 20  OrderBy, 0);..  
1c760 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 72 61  /* Allocate a ra
1c770 6e 67 65 20 6f 66 20 74 65 6d 70 6f 72 61 72 79  nge of temporary
1c780 20 72 65 67 69 73 74 65 72 73 20 61 6e 64 20 74   registers and t
1c790 68 65 20 4b 65 79 49 6e 66 6f 20 6e 65 65 64 65  he KeyInfo neede
1c7a0 64 0a 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 6c  d.  ** for the l
1c7b0 6f 67 69 63 20 74 68 61 74 20 72 65 6d 6f 76 65  ogic that remove
1c7c0 73 20 64 75 70 6c 69 63 61 74 65 20 72 65 73 75  s duplicate resu
1c7d0 6c 74 20 72 6f 77 73 20 77 68 65 6e 20 74 68 65  lt rows when the
1c7e0 0a 20 20 2a 2a 20 6f 70 65 72 61 74 6f 72 20 69  .  ** operator i
1c7f0 73 20 55 4e 49 4f 4e 2c 20 45 58 43 45 50 54 2c  s UNION, EXCEPT,
1c800 20 6f 72 20 49 4e 54 45 52 53 45 43 54 20 28 62   or INTERSECT (b
1c810 75 74 20 6e 6f 74 20 55 4e 49 4f 4e 20 41 4c 4c  ut not UNION ALL
1c820 29 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6f 70  )..  */.  if( op
1c830 3d 3d 54 4b 5f 41 4c 4c 20 29 7b 0a 20 20 20 20  ==TK_ALL ){.    
1c840 72 65 67 50 72 65 76 20 3d 20 30 3b 0a 20 20 7d  regPrev = 0;.  }
1c850 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 6e 45  else{.    int nE
1c860 78 70 72 20 3d 20 70 2d 3e 70 45 4c 69 73 74 2d  xpr = p->pEList-
1c870 3e 6e 45 78 70 72 3b 0a 20 20 20 20 61 73 73 65  >nExpr;.    asse
1c880 72 74 28 20 6e 4f 72 64 65 72 42 79 3e 3d 6e 45  rt( nOrderBy>=nE
1c890 78 70 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f  xpr || db->mallo
1c8a0 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 72  cFailed );.    r
1c8b0 65 67 50 72 65 76 20 3d 20 70 50 61 72 73 65 2d  egPrev = pParse-
1c8c0 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20 70 50 61  >nMem+1;.    pPa
1c8d0 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 45 78  rse->nMem += nEx
1c8e0 70 72 2b 31 3b 0a 20 20 20 20 73 71 6c 69 74 65  pr+1;.    sqlite
1c8f0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
1c900 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 72 65  P_Integer, 0, re
1c910 67 50 72 65 76 29 3b 0a 20 20 20 20 70 4b 65 79  gPrev);.    pKey
1c920 44 75 70 20 3d 20 73 71 6c 69 74 65 33 4b 65 79  Dup = sqlite3Key
1c930 49 6e 66 6f 41 6c 6c 6f 63 28 64 62 2c 20 6e 45  InfoAlloc(db, nE
1c940 78 70 72 2c 20 31 29 3b 0a 20 20 20 20 69 66 28  xpr, 1);.    if(
1c950 20 70 4b 65 79 44 75 70 20 29 7b 0a 20 20 20 20   pKeyDup ){.    
1c960 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
1c970 33 4b 65 79 49 6e 66 6f 49 73 57 72 69 74 65 61  3KeyInfoIsWritea
1c980 62 6c 65 28 70 4b 65 79 44 75 70 29 20 29 3b 0a  ble(pKeyDup) );.
1c990 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
1c9a0 3c 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20  <nExpr; i++){.  
1c9b0 20 20 20 20 20 20 70 4b 65 79 44 75 70 2d 3e 61        pKeyDup->a
1c9c0 43 6f 6c 6c 5b 69 5d 20 3d 20 6d 75 6c 74 69 53  Coll[i] = multiS
1c9d0 65 6c 65 63 74 43 6f 6c 6c 53 65 71 28 70 50 61  electCollSeq(pPa
1c9e0 72 73 65 2c 20 70 2c 20 69 29 3b 0a 20 20 20 20  rse, p, i);.    
1c9f0 20 20 20 20 70 4b 65 79 44 75 70 2d 3e 61 53 6f      pKeyDup->aSo
1ca00 72 74 4f 72 64 65 72 5b 69 5d 20 3d 20 30 3b 0a  rtOrder[i] = 0;.
1ca10 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
1ca20 7d 0a 20 0a 20 20 2f 2a 20 53 65 70 61 72 61 74  }. .  /* Separat
1ca30 65 20 74 68 65 20 6c 65 66 74 20 61 6e 64 20 74  e the left and t
1ca40 68 65 20 72 69 67 68 74 20 71 75 65 72 79 20 66  he right query f
1ca50 72 6f 6d 20 6f 6e 65 20 61 6e 6f 74 68 65 72 0a  rom one another.
1ca60 20 20 2a 2f 0a 20 20 70 2d 3e 70 50 72 69 6f 72    */.  p->pPrior
1ca70 20 3d 20 30 3b 0a 20 20 70 50 72 69 6f 72 2d 3e   = 0;.  pPrior->
1ca80 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 73 71 6c  pNext = 0;.  sql
1ca90 69 74 65 33 52 65 73 6f 6c 76 65 4f 72 64 65 72  ite3ResolveOrder
1caa0 47 72 6f 75 70 42 79 28 70 50 61 72 73 65 2c 20  GroupBy(pParse, 
1cab0 70 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20  p, p->pOrderBy, 
1cac0 22 4f 52 44 45 52 22 29 3b 0a 20 20 69 66 28 20  "ORDER");.  if( 
1cad0 70 50 72 69 6f 72 2d 3e 70 50 72 69 6f 72 3d 3d  pPrior->pPrior==
1cae0 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
1caf0 52 65 73 6f 6c 76 65 4f 72 64 65 72 47 72 6f 75  ResolveOrderGrou
1cb00 70 42 79 28 70 50 61 72 73 65 2c 20 70 50 72 69  pBy(pParse, pPri
1cb10 6f 72 2c 20 70 50 72 69 6f 72 2d 3e 70 4f 72 64  or, pPrior->pOrd
1cb20 65 72 42 79 2c 20 22 4f 52 44 45 52 22 29 3b 0a  erBy, "ORDER");.
1cb30 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75 74    }..  /* Comput
1cb40 65 20 74 68 65 20 6c 69 6d 69 74 20 72 65 67 69  e the limit regi
1cb50 73 74 65 72 73 20 2a 2f 0a 20 20 63 6f 6d 70 75  sters */.  compu
1cb60 74 65 4c 69 6d 69 74 52 65 67 69 73 74 65 72 73  teLimitRegisters
1cb70 28 70 50 61 72 73 65 2c 20 70 2c 20 6c 61 62 65  (pParse, p, labe
1cb80 6c 45 6e 64 29 3b 0a 20 20 69 66 28 20 70 2d 3e  lEnd);.  if( p->
1cb90 69 4c 69 6d 69 74 20 26 26 20 6f 70 3d 3d 54 4b  iLimit && op==TK
1cba0 5f 41 4c 4c 20 29 7b 0a 20 20 20 20 72 65 67 4c  _ALL ){.    regL
1cbb0 69 6d 69 74 41 20 3d 20 2b 2b 70 50 61 72 73 65  imitA = ++pParse
1cbc0 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 72 65 67 4c  ->nMem;.    regL
1cbd0 69 6d 69 74 42 20 3d 20 2b 2b 70 50 61 72 73 65  imitB = ++pParse
1cbe0 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 73 71 6c 69  ->nMem;.    sqli
1cbf0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
1cc00 20 4f 50 5f 43 6f 70 79 2c 20 70 2d 3e 69 4f 66   OP_Copy, p->iOf
1cc10 66 73 65 74 20 3f 20 70 2d 3e 69 4f 66 66 73 65  fset ? p->iOffse
1cc20 74 2b 31 20 3a 20 70 2d 3e 69 4c 69 6d 69 74 2c  t+1 : p->iLimit,
1cc30 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1cc40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cc50 20 20 20 72 65 67 4c 69 6d 69 74 41 29 3b 0a 20     regLimitA);. 
1cc60 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1cc70 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6f 70 79 2c  dOp2(v, OP_Copy,
1cc80 20 72 65 67 4c 69 6d 69 74 41 2c 20 72 65 67 4c   regLimitA, regL
1cc90 69 6d 69 74 42 29 3b 0a 20 20 7d 65 6c 73 65 7b  imitB);.  }else{
1cca0 0a 20 20 20 20 72 65 67 4c 69 6d 69 74 41 20 3d  .    regLimitA =
1ccb0 20 72 65 67 4c 69 6d 69 74 42 20 3d 20 30 3b 0a   regLimitB = 0;.
1ccc0 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 45 78 70    }.  sqlite3Exp
1ccd0 72 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70  rDelete(db, p->p
1cce0 4c 69 6d 69 74 29 3b 0a 20 20 70 2d 3e 70 4c 69  Limit);.  p->pLi
1ccf0 6d 69 74 20 3d 20 30 3b 0a 0a 20 20 72 65 67 41  mit = 0;..  regA
1cd00 64 64 72 41 20 3d 20 2b 2b 70 50 61 72 73 65 2d  ddrA = ++pParse-
1cd10 3e 6e 4d 65 6d 3b 0a 20 20 72 65 67 41 64 64 72  >nMem;.  regAddr
1cd20 42 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  B = ++pParse->nM
1cd30 65 6d 3b 0a 20 20 72 65 67 4f 75 74 41 20 3d 20  em;.  regOutA = 
1cd40 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
1cd50 20 20 72 65 67 4f 75 74 42 20 3d 20 2b 2b 70 50    regOutB = ++pP
1cd60 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 73 71  arse->nMem;.  sq
1cd70 6c 69 74 65 33 53 65 6c 65 63 74 44 65 73 74 49  lite3SelectDestI
1cd80 6e 69 74 28 26 64 65 73 74 41 2c 20 53 52 54 5f  nit(&destA, SRT_
1cd90 43 6f 72 6f 75 74 69 6e 65 2c 20 72 65 67 41 64  Coroutine, regAd
1cda0 64 72 41 29 3b 0a 20 20 73 71 6c 69 74 65 33 53  drA);.  sqlite3S
1cdb0 65 6c 65 63 74 44 65 73 74 49 6e 69 74 28 26 64  electDestInit(&d
1cdc0 65 73 74 42 2c 20 53 52 54 5f 43 6f 72 6f 75 74  estB, SRT_Corout
1cdd0 69 6e 65 2c 20 72 65 67 41 64 64 72 42 29 3b 0a  ine, regAddrB);.
1cde0 0a 20 20 45 78 70 6c 61 69 6e 51 75 65 72 79 50  .  ExplainQueryP
1cdf0 6c 61 6e 28 28 70 50 61 72 73 65 2c 20 31 2c 20  lan((pParse, 1, 
1ce00 22 4d 45 52 47 45 20 28 25 73 29 22 2c 20 73 65  "MERGE (%s)", se
1ce10 6c 65 63 74 4f 70 4e 61 6d 65 28 70 2d 3e 6f 70  lectOpName(p->op
1ce20 29 29 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72  )));..  /* Gener
1ce30 61 74 65 20 61 20 63 6f 72 6f 75 74 69 6e 65 20  ate a coroutine 
1ce40 74 6f 20 65 76 61 6c 75 61 74 65 20 74 68 65 20  to evaluate the 
1ce50 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
1ce60 20 74 6f 20 74 68 65 0a 20 20 2a 2a 20 6c 65 66   to the.  ** lef
1ce70 74 20 6f 66 20 74 68 65 20 63 6f 6d 70 6f 75 6e  t of the compoun
1ce80 64 20 6f 70 65 72 61 74 6f 72 20 2d 20 74 68 65  d operator - the
1ce90 20 22 41 22 20 73 65 6c 65 63 74 2e 0a 20 20 2a   "A" select..  *
1cea0 2f 0a 20 20 61 64 64 72 53 65 6c 65 63 74 41 20  /.  addrSelectA 
1ceb0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  = sqlite3VdbeCur
1cec0 72 65 6e 74 41 64 64 72 28 76 29 20 2b 20 31 3b  rentAddr(v) + 1;
1ced0 0a 20 20 61 64 64 72 31 20 3d 20 73 71 6c 69 74  .  addr1 = sqlit
1cee0 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
1cef0 4f 50 5f 49 6e 69 74 43 6f 72 6f 75 74 69 6e 65  OP_InitCoroutine
1cf00 2c 20 72 65 67 41 64 64 72 41 2c 20 30 2c 20 61  , regAddrA, 0, a
1cf10 64 64 72 53 65 6c 65 63 74 41 29 3b 0a 20 20 56  ddrSelectA);.  V
1cf20 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
1cf30 6c 65 66 74 20 53 45 4c 45 43 54 22 29 29 3b 0a  left SELECT"));.
1cf40 20 20 70 50 72 69 6f 72 2d 3e 69 4c 69 6d 69 74    pPrior->iLimit
1cf50 20 3d 20 72 65 67 4c 69 6d 69 74 41 3b 0a 20 20   = regLimitA;.  
1cf60 45 78 70 6c 61 69 6e 51 75 65 72 79 50 6c 61 6e  ExplainQueryPlan
1cf70 28 28 70 50 61 72 73 65 2c 20 31 2c 20 22 4c 45  ((pParse, 1, "LE
1cf80 46 54 22 29 29 3b 0a 20 20 73 71 6c 69 74 65 33  FT"));.  sqlite3
1cf90 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70  Select(pParse, p
1cfa0 50 72 69 6f 72 2c 20 26 64 65 73 74 41 29 3b 0a  Prior, &destA);.
1cfb0 20 20 73 71 6c 69 74 65 33 56 64 62 65 45 6e 64    sqlite3VdbeEnd
1cfc0 43 6f 72 6f 75 74 69 6e 65 28 76 2c 20 72 65 67  Coroutine(v, reg
1cfd0 41 64 64 72 41 29 3b 0a 20 20 73 71 6c 69 74 65  AddrA);.  sqlite
1cfe0 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
1cff0 20 61 64 64 72 31 29 3b 0a 0a 20 20 2f 2a 20 47   addr1);..  /* G
1d000 65 6e 65 72 61 74 65 20 61 20 63 6f 72 6f 75 74  enerate a corout
1d010 69 6e 65 20 74 6f 20 65 76 61 6c 75 61 74 65 20  ine to evaluate 
1d020 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65  the SELECT state
1d030 6d 65 6e 74 20 6f 6e 20 0a 20 20 2a 2a 20 74 68  ment on .  ** th
1d040 65 20 72 69 67 68 74 20 2d 20 74 68 65 20 22 42  e right - the "B
1d050 22 20 73 65 6c 65 63 74 0a 20 20 2a 2f 0a 20 20  " select.  */.  
1d060 61 64 64 72 53 65 6c 65 63 74 42 20 3d 20 73 71  addrSelectB = sq
1d070 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
1d080 41 64 64 72 28 76 29 20 2b 20 31 3b 0a 20 20 61  Addr(v) + 1;.  a
1d090 64 64 72 31 20 3d 20 73 71 6c 69 74 65 33 56 64  ddr1 = sqlite3Vd
1d0a0 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49  beAddOp3(v, OP_I
1d0b0 6e 69 74 43 6f 72 6f 75 74 69 6e 65 2c 20 72 65  nitCoroutine, re
1d0c0 67 41 64 64 72 42 2c 20 30 2c 20 61 64 64 72 53  gAddrB, 0, addrS
1d0d0 65 6c 65 63 74 42 29 3b 0a 20 20 56 64 62 65 43  electB);.  VdbeC
1d0e0 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 72 69 67 68  omment((v, "righ
1d0f0 74 20 53 45 4c 45 43 54 22 29 29 3b 0a 20 20 73  t SELECT"));.  s
1d100 61 76 65 64 4c 69 6d 69 74 20 3d 20 70 2d 3e 69  avedLimit = p->i
1d110 4c 69 6d 69 74 3b 0a 20 20 73 61 76 65 64 4f 66  Limit;.  savedOf
1d120 66 73 65 74 20 3d 20 70 2d 3e 69 4f 66 66 73 65  fset = p->iOffse
1d130 74 3b 0a 20 20 70 2d 3e 69 4c 69 6d 69 74 20 3d  t;.  p->iLimit =
1d140 20 72 65 67 4c 69 6d 69 74 42 3b 0a 20 20 70 2d   regLimitB;.  p-
1d150 3e 69 4f 66 66 73 65 74 20 3d 20 30 3b 20 20 0a  >iOffset = 0;  .
1d160 20 20 45 78 70 6c 61 69 6e 51 75 65 72 79 50 6c    ExplainQueryPl
1d170 61 6e 28 28 70 50 61 72 73 65 2c 20 31 2c 20 22  an((pParse, 1, "
1d180 52 49 47 48 54 22 29 29 3b 0a 20 20 73 71 6c 69  RIGHT"));.  sqli
1d190 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65  te3Select(pParse
1d1a0 2c 20 70 2c 20 26 64 65 73 74 42 29 3b 0a 20 20  , p, &destB);.  
1d1b0 70 2d 3e 69 4c 69 6d 69 74 20 3d 20 73 61 76 65  p->iLimit = save
1d1c0 64 4c 69 6d 69 74 3b 0a 20 20 70 2d 3e 69 4f 66  dLimit;.  p->iOf
1d1d0 66 73 65 74 20 3d 20 73 61 76 65 64 4f 66 66 73  fset = savedOffs
1d1e0 65 74 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  et;.  sqlite3Vdb
1d1f0 65 45 6e 64 43 6f 72 6f 75 74 69 6e 65 28 76 2c  eEndCoroutine(v,
1d200 20 72 65 67 41 64 64 72 42 29 3b 0a 0a 20 20 2f   regAddrB);..  /
1d210 2a 20 47 65 6e 65 72 61 74 65 20 61 20 73 75 62  * Generate a sub
1d220 72 6f 75 74 69 6e 65 20 74 68 61 74 20 6f 75 74  routine that out
1d230 70 75 74 73 20 74 68 65 20 63 75 72 72 65 6e 74  puts the current
1d240 20 72 6f 77 20 6f 66 20 74 68 65 20 41 0a 20 20   row of the A.  
1d250 2a 2a 20 73 65 6c 65 63 74 20 61 73 20 74 68 65  ** select as the
1d260 20 6e 65 78 74 20 6f 75 74 70 75 74 20 72 6f 77   next output row
1d270 20 6f 66 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64   of the compound
1d280 20 73 65 6c 65 63 74 2e 0a 20 20 2a 2f 0a 20 20   select..  */.  
1d290 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28  VdbeNoopComment(
1d2a0 28 76 2c 20 22 4f 75 74 70 75 74 20 72 6f 75 74  (v, "Output rout
1d2b0 69 6e 65 20 66 6f 72 20 41 22 29 29 3b 0a 20 20  ine for A"));.  
1d2c0 61 64 64 72 4f 75 74 41 20 3d 20 67 65 6e 65 72  addrOutA = gener
1d2d0 61 74 65 4f 75 74 70 75 74 53 75 62 72 6f 75 74  ateOutputSubrout
1d2e0 69 6e 65 28 70 50 61 72 73 65 2c 0a 20 20 20 20  ine(pParse,.    
1d2f0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 2c 20               p, 
1d300 26 64 65 73 74 41 2c 20 70 44 65 73 74 2c 20 72  &destA, pDest, r
1d310 65 67 4f 75 74 41 2c 0a 20 20 20 20 20 20 20 20  egOutA,.        
1d320 20 20 20 20 20 20 20 20 20 72 65 67 50 72 65 76           regPrev
1d330 2c 20 70 4b 65 79 44 75 70 2c 20 6c 61 62 65 6c  , pKeyDup, label
1d340 45 6e 64 29 3b 0a 20 20 0a 20 20 2f 2a 20 47 65  End);.  .  /* Ge
1d350 6e 65 72 61 74 65 20 61 20 73 75 62 72 6f 75 74  nerate a subrout
1d360 69 6e 65 20 74 68 61 74 20 6f 75 74 70 75 74 73  ine that outputs
1d370 20 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f 77   the current row
1d380 20 6f 66 20 74 68 65 20 42 0a 20 20 2a 2a 20 73   of the B.  ** s
1d390 65 6c 65 63 74 20 61 73 20 74 68 65 20 6e 65 78  elect as the nex
1d3a0 74 20 6f 75 74 70 75 74 20 72 6f 77 20 6f 66 20  t output row of 
1d3b0 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c  the compound sel
1d3c0 65 63 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ect..  */.  if( 
1d3d0 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 7c 7c 20 6f 70  op==TK_ALL || op
1d3e0 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29 7b 0a 20 20  ==TK_UNION ){.  
1d3f0 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e    VdbeNoopCommen
1d400 74 28 28 76 2c 20 22 4f 75 74 70 75 74 20 72 6f  t((v, "Output ro
1d410 75 74 69 6e 65 20 66 6f 72 20 42 22 29 29 3b 0a  utine for B"));.
1d420 20 20 20 20 61 64 64 72 4f 75 74 42 20 3d 20 67      addrOutB = g
1d430 65 6e 65 72 61 74 65 4f 75 74 70 75 74 53 75 62  enerateOutputSub
1d440 72 6f 75 74 69 6e 65 28 70 50 61 72 73 65 2c 0a  routine(pParse,.
1d450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d460 20 70 2c 20 26 64 65 73 74 42 2c 20 70 44 65 73   p, &destB, pDes
1d470 74 2c 20 72 65 67 4f 75 74 42 2c 0a 20 20 20 20  t, regOutB,.    
1d480 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65 67               reg
1d490 50 72 65 76 2c 20 70 4b 65 79 44 75 70 2c 20 6c  Prev, pKeyDup, l
1d4a0 61 62 65 6c 45 6e 64 29 3b 0a 20 20 7d 0a 20 20  abelEnd);.  }.  
1d4b0 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 55 6e  sqlite3KeyInfoUn
1d4c0 72 65 66 28 70 4b 65 79 44 75 70 29 3b 0a 0a 20  ref(pKeyDup);.. 
1d4d0 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20 73   /* Generate a s
1d4e0 75 62 72 6f 75 74 69 6e 65 20 74 6f 20 72 75 6e  ubroutine to run
1d4f0 20 77 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74   when the result
1d500 73 20 66 72 6f 6d 20 73 65 6c 65 63 74 20 41 0a  s from select A.
1d510 20 20 2a 2a 20 61 72 65 20 65 78 68 61 75 73 74    ** are exhaust
1d520 65 64 20 61 6e 64 20 6f 6e 6c 79 20 64 61 74 61  ed and only data
1d530 20 69 6e 20 73 65 6c 65 63 74 20 42 20 72 65 6d   in select B rem
1d540 61 69 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ains..  */.  if(
1d550 20 6f 70 3d 3d 54 4b 5f 45 58 43 45 50 54 20 7c   op==TK_EXCEPT |
1d560 7c 20 6f 70 3d 3d 54 4b 5f 49 4e 54 45 52 53 45  | op==TK_INTERSE
1d570 43 54 20 29 7b 0a 20 20 20 20 61 64 64 72 45 6f  CT ){.    addrEo
1d580 66 41 5f 6e 6f 42 20 3d 20 61 64 64 72 45 6f 66  fA_noB = addrEof
1d590 41 20 3d 20 6c 61 62 65 6c 45 6e 64 3b 0a 20 20  A = labelEnd;.  
1d5a0 7d 65 6c 73 65 7b 20 20 0a 20 20 20 20 56 64 62  }else{  .    Vdb
1d5b0 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c  eNoopComment((v,
1d5c0 20 22 65 6f 66 2d 41 20 73 75 62 72 6f 75 74 69   "eof-A subrouti
1d5d0 6e 65 22 29 29 3b 0a 20 20 20 20 61 64 64 72 45  ne"));.    addrE
1d5e0 6f 66 41 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ofA = sqlite3Vdb
1d5f0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f  eAddOp2(v, OP_Go
1d600 73 75 62 2c 20 72 65 67 4f 75 74 42 2c 20 61 64  sub, regOutB, ad
1d610 64 72 4f 75 74 42 29 3b 0a 20 20 20 20 61 64 64  drOutB);.    add
1d620 72 45 6f 66 41 5f 6e 6f 42 20 3d 20 73 71 6c 69  rEofA_noB = sqli
1d630 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
1d640 20 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67 41 64   OP_Yield, regAd
1d650 64 72 42 2c 20 6c 61 62 65 6c 45 6e 64 29 3b 0a  drB, labelEnd);.
1d660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d680 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
1d690 65 28 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  e(v);.    sqlite
1d6a0 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 61 64 64  3VdbeGoto(v, add
1d6b0 72 45 6f 66 41 29 3b 0a 20 20 20 20 70 2d 3e 6e  rEofA);.    p->n
1d6c0 53 65 6c 65 63 74 52 6f 77 20 3d 20 73 71 6c 69  SelectRow = sqli
1d6d0 74 65 33 4c 6f 67 45 73 74 41 64 64 28 70 2d 3e  te3LogEstAdd(p->
1d6e0 6e 53 65 6c 65 63 74 52 6f 77 2c 20 70 50 72 69  nSelectRow, pPri
1d6f0 6f 72 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 29 3b  or->nSelectRow);
1d700 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72  .  }..  /* Gener
1d710 61 74 65 20 61 20 73 75 62 72 6f 75 74 69 6e 65  ate a subroutine
1d720 20 74 6f 20 72 75 6e 20 77 68 65 6e 20 74 68 65   to run when the
1d730 20 72 65 73 75 6c 74 73 20 66 72 6f 6d 20 73 65   results from se
1d740 6c 65 63 74 20 42 0a 20 20 2a 2a 20 61 72 65 20  lect B.  ** are 
1d750 65 78 68 61 75 73 74 65 64 20 61 6e 64 20 6f 6e  exhausted and on
1d760 6c 79 20 64 61 74 61 20 69 6e 20 73 65 6c 65 63  ly data in selec
1d770 74 20 41 20 72 65 6d 61 69 6e 73 2e 0a 20 20 2a  t A remains..  *
1d780 2f 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 49  /.  if( op==TK_I
1d790 4e 54 45 52 53 45 43 54 20 29 7b 0a 20 20 20 20  NTERSECT ){.    
1d7a0 61 64 64 72 45 6f 66 42 20 3d 20 61 64 64 72 45  addrEofB = addrE
1d7b0 6f 66 41 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e  ofA;.    if( p->
1d7c0 6e 53 65 6c 65 63 74 52 6f 77 20 3e 20 70 50 72  nSelectRow > pPr
1d7d0 69 6f 72 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20  ior->nSelectRow 
1d7e0 29 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20  ) p->nSelectRow 
1d7f0 3d 20 70 50 72 69 6f 72 2d 3e 6e 53 65 6c 65 63  = pPrior->nSelec
1d800 74 52 6f 77 3b 0a 20 20 7d 65 6c 73 65 7b 20 20  tRow;.  }else{  
1d810 0a 20 20 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d  .    VdbeNoopCom
1d820 6d 65 6e 74 28 28 76 2c 20 22 65 6f 66 2d 42 20  ment((v, "eof-B 
1d830 73 75 62 72 6f 75 74 69 6e 65 22 29 29 3b 0a 20  subroutine"));. 
1d840 20 20 20 61 64 64 72 45 6f 66 42 20 3d 20 73 71     addrEofB = sq
1d850 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
1d860 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67  v, OP_Gosub, reg
1d870 4f 75 74 41 2c 20 61 64 64 72 4f 75 74 41 29 3b  OutA, addrOutA);
1d880 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
1d890 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 59 69 65  AddOp2(v, OP_Yie
1d8a0 6c 64 2c 20 72 65 67 41 64 64 72 41 2c 20 6c 61  ld, regAddrA, la
1d8b0 62 65 6c 45 6e 64 29 3b 20 56 64 62 65 43 6f 76  belEnd); VdbeCov
1d8c0 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 73 71  erage(v);.    sq
1d8d0 6c 69 74 65 33 56 64 62 65 47 6f 74 6f 28 76 2c  lite3VdbeGoto(v,
1d8e0 20 61 64 64 72 45 6f 66 42 29 3b 0a 20 20 7d 0a   addrEofB);.  }.
1d8f0 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63  .  /* Generate c
1d900 6f 64 65 20 74 6f 20 68 61 6e 64 6c 65 20 74 68  ode to handle th
1d910 65 20 63 61 73 65 20 6f 66 20 41 3c 42 0a 20 20  e case of A<B.  
1d920 2a 2f 0a 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d  */.  VdbeNoopCom
1d930 6d 65 6e 74 28 28 76 2c 20 22 41 2d 6c 74 2d 42  ment((v, "A-lt-B
1d940 20 73 75 62 72 6f 75 74 69 6e 65 22 29 29 3b 0a   subroutine"));.
1d950 20 20 61 64 64 72 41 6c 74 42 20 3d 20 73 71 6c    addrAltB = sql
1d960 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
1d970 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 4f  , OP_Gosub, regO
1d980 75 74 41 2c 20 61 64 64 72 4f 75 74 41 29 3b 0a  utA, addrOutA);.
1d990 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1d9a0 4f 70 32 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c  Op2(v, OP_Yield,
1d9b0 20 72 65 67 41 64 64 72 41 2c 20 61 64 64 72 45   regAddrA, addrE
1d9c0 6f 66 41 29 3b 20 56 64 62 65 43 6f 76 65 72 61  ofA); VdbeCovera
1d9d0 67 65 28 76 29 3b 0a 20 20 73 71 6c 69 74 65 33  ge(v);.  sqlite3
1d9e0 56 64 62 65 47 6f 74 6f 28 76 2c 20 6c 61 62 65  VdbeGoto(v, labe
1d9f0 6c 43 6d 70 72 29 3b 0a 0a 20 20 2f 2a 20 47 65  lCmpr);..  /* Ge
1da00 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 68  nerate code to h
1da10 61 6e 64 6c 65 20 74 68 65 20 63 61 73 65 20 6f  andle the case o
1da20 66 20 41 3d 3d 42 0a 20 20 2a 2f 0a 20 20 69 66  f A==B.  */.  if
1da30 28 20 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 29 7b 0a  ( op==TK_ALL ){.
1da40 20 20 20 20 61 64 64 72 41 65 71 42 20 3d 20 61      addrAeqB = a
1da50 64 64 72 41 6c 74 42 3b 0a 20 20 7d 65 6c 73 65  ddrAltB;.  }else
1da60 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 49 4e 54 45   if( op==TK_INTE
1da70 52 53 45 43 54 20 29 7b 0a 20 20 20 20 61 64 64  RSECT ){.    add
1da80 72 41 65 71 42 20 3d 20 61 64 64 72 41 6c 74 42  rAeqB = addrAltB
1da90 3b 0a 20 20 20 20 61 64 64 72 41 6c 74 42 2b 2b  ;.    addrAltB++
1daa0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 56  ;.  }else{.    V
1dab0 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28  dbeNoopComment((
1dac0 76 2c 20 22 41 2d 65 71 2d 42 20 73 75 62 72 6f  v, "A-eq-B subro
1dad0 75 74 69 6e 65 22 29 29 3b 0a 20 20 20 20 61 64  utine"));.    ad
1dae0 64 72 41 65 71 42 20 3d 0a 20 20 20 20 73 71 6c  drAeqB =.    sql
1daf0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
1db00 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67 41  , OP_Yield, regA
1db10 64 64 72 41 2c 20 61 64 64 72 45 6f 66 41 29 3b  ddrA, addrEofA);
1db20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
1db30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
1db40 65 47 6f 74 6f 28 76 2c 20 6c 61 62 65 6c 43 6d  eGoto(v, labelCm
1db50 70 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47  pr);.  }..  /* G
1db60 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20  enerate code to 
1db70 68 61 6e 64 6c 65 20 74 68 65 20 63 61 73 65 20  handle the case 
1db80 6f 66 20 41 3e 42 0a 20 20 2a 2f 0a 20 20 56 64  of A>B.  */.  Vd
1db90 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76  beNoopComment((v
1dba0 2c 20 22 41 2d 67 74 2d 42 20 73 75 62 72 6f 75  , "A-gt-B subrou
1dbb0 74 69 6e 65 22 29 29 3b 0a 20 20 61 64 64 72 41  tine"));.  addrA
1dbc0 67 74 42 20 3d 20 73 71 6c 69 74 65 33 56 64 62  gtB = sqlite3Vdb
1dbd0 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b  eCurrentAddr(v);
1dbe0 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 41 4c  .  if( op==TK_AL
1dbf0 4c 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 55 4e 49 4f  L || op==TK_UNIO
1dc00 4e 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  N ){.    sqlite3
1dc10 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
1dc20 5f 47 6f 73 75 62 2c 20 72 65 67 4f 75 74 42 2c  _Gosub, regOutB,
1dc30 20 61 64 64 72 4f 75 74 42 29 3b 0a 20 20 7d 0a   addrOutB);.  }.
1dc40 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1dc50 4f 70 32 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c  Op2(v, OP_Yield,
1dc60 20 72 65 67 41 64 64 72 42 2c 20 61 64 64 72 45   regAddrB, addrE
1dc70 6f 66 42 29 3b 20 56 64 62 65 43 6f 76 65 72 61  ofB); VdbeCovera
1dc80 67 65 28 76 29 3b 0a 20 20 73 71 6c 69 74 65 33  ge(v);.  sqlite3
1dc90 56 64 62 65 47 6f 74 6f 28 76 2c 20 6c 61 62 65  VdbeGoto(v, labe
1dca0 6c 43 6d 70 72 29 3b 0a 0a 20 20 2f 2a 20 54 68  lCmpr);..  /* Th
1dcb0 69 73 20 63 6f 64 65 20 72 75 6e 73 20 6f 6e 63  is code runs onc
1dcc0 65 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20  e to initialize 
1dcd0 65 76 65 72 79 74 68 69 6e 67 2e 0a 20 20 2a 2f  everything..  */
1dce0 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75  .  sqlite3VdbeJu
1dcf0 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 31 29  mpHere(v, addr1)
1dd00 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
1dd10 64 64 4f 70 32 28 76 2c 20 4f 50 5f 59 69 65 6c  ddOp2(v, OP_Yiel
1dd20 64 2c 20 72 65 67 41 64 64 72 41 2c 20 61 64 64  d, regAddrA, add
1dd30 72 45 6f 66 41 5f 6e 6f 42 29 3b 20 56 64 62 65  rEofA_noB); Vdbe
1dd40 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 73  Coverage(v);.  s
1dd50 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
1dd60 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 72 65  (v, OP_Yield, re
1dd70 67 41 64 64 72 42 2c 20 61 64 64 72 45 6f 66 42  gAddrB, addrEofB
1dd80 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
1dd90 76 29 3b 0a 0a 20 20 2f 2a 20 49 6d 70 6c 65 6d  v);..  /* Implem
1dda0 65 6e 74 20 74 68 65 20 6d 61 69 6e 20 6d 65 72  ent the main mer
1ddb0 67 65 20 6c 6f 6f 70 0a 20 20 2a 2f 0a 20 20 73  ge loop.  */.  s
1ddc0 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
1ddd0 65 4c 61 62 65 6c 28 76 2c 20 6c 61 62 65 6c 43  eLabel(v, labelC
1dde0 6d 70 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  mpr);.  sqlite3V
1ddf0 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
1de00 50 65 72 6d 75 74 61 74 69 6f 6e 2c 20 30 2c 20  Permutation, 0, 
1de10 30 2c 20 30 2c 20 28 63 68 61 72 2a 29 61 50 65  0, 0, (char*)aPe
1de20 72 6d 75 74 65 2c 20 50 34 5f 49 4e 54 41 52 52  rmute, P4_INTARR
1de30 41 59 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  AY);.  sqlite3Vd
1de40 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 43  beAddOp4(v, OP_C
1de50 6f 6d 70 61 72 65 2c 20 64 65 73 74 41 2e 69 53  ompare, destA.iS
1de60 64 73 74 2c 20 64 65 73 74 42 2e 69 53 64 73 74  dst, destB.iSdst
1de70 2c 20 6e 4f 72 64 65 72 42 79 2c 0a 20 20 20 20  , nOrderBy,.    
1de80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1de90 20 20 20 20 20 28 63 68 61 72 2a 29 70 4b 65 79       (char*)pKey
1dea0 4d 65 72 67 65 2c 20 50 34 5f 4b 45 59 49 4e 46  Merge, P4_KEYINF
1deb0 4f 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  O);.  sqlite3Vdb
1dec0 65 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46  eChangeP5(v, OPF
1ded0 4c 41 47 5f 50 45 52 4d 55 54 45 29 3b 0a 20 20  LAG_PERMUTE);.  
1dee0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1def0 33 28 76 2c 20 4f 50 5f 4a 75 6d 70 2c 20 61 64  3(v, OP_Jump, ad
1df00 64 72 41 6c 74 42 2c 20 61 64 64 72 41 65 71 42  drAltB, addrAeqB
1df10 2c 20 61 64 64 72 41 67 74 42 29 3b 20 56 64 62  , addrAgtB); Vdb
1df20 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 0a 20  eCoverage(v);.. 
1df30 20 2f 2a 20 4a 75 6d 70 20 74 6f 20 74 68 65 20   /* Jump to the 
1df40 74 68 69 73 20 70 6f 69 6e 74 20 69 6e 20 6f 72  this point in or
1df50 64 65 72 20 74 6f 20 74 65 72 6d 69 6e 61 74 65  der to terminate
1df60 20 74 68 65 20 71 75 65 72 79 2e 0a 20 20 2a 2f   the query..  */
1df70 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65  .  sqlite3VdbeRe
1df80 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 6c 61  solveLabel(v, la
1df90 62 65 6c 45 6e 64 29 3b 0a 0a 20 20 2f 2a 20 52  belEnd);..  /* R
1dfa0 65 61 73 73 65 6d 62 6c 79 20 74 68 65 20 63 6f  eassembly the co
1dfb0 6d 70 6f 75 6e 64 20 71 75 65 72 79 20 73 6f 20  mpound query so 
1dfc0 74 68 61 74 20 69 74 20 77 69 6c 6c 20 62 65 20  that it will be 
1dfd0 66 72 65 65 64 20 63 6f 72 72 65 63 74 6c 79 0a  freed correctly.
1dfe0 20 20 2a 2a 20 62 79 20 74 68 65 20 63 61 6c 6c    ** by the call
1dff0 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a  ing function */.
1e000 20 20 69 66 28 20 70 2d 3e 70 50 72 69 6f 72 20    if( p->pPrior 
1e010 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65  ){.    sqlite3Se
1e020 6c 65 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70  lectDelete(db, p
1e030 2d 3e 70 50 72 69 6f 72 29 3b 0a 20 20 7d 0a 20  ->pPrior);.  }. 
1e040 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50 72   p->pPrior = pPr
1e050 69 6f 72 3b 0a 20 20 70 50 72 69 6f 72 2d 3e 70  ior;.  pPrior->p
1e060 4e 65 78 74 20 3d 20 70 3b 0a 0a 20 20 2f 2a 2a  Next = p;..  /**
1e070 2a 20 54 42 44 3a 20 20 49 6e 73 65 72 74 20 73  * TBD:  Insert s
1e080 75 62 72 6f 75 74 69 6e 65 20 63 61 6c 6c 73 20  ubroutine calls 
1e090 74 6f 20 63 6c 6f 73 65 20 63 75 72 73 6f 72 73  to close cursors
1e0a0 20 6f 6e 20 69 6e 63 6f 6d 70 6c 65 74 65 0a 20   on incomplete. 
1e0b0 20 2a 2a 2a 2a 20 73 75 62 71 75 65 72 69 65 73   **** subqueries
1e0c0 20 2a 2a 2a 2a 2f 0a 20 20 45 78 70 6c 61 69 6e   ****/.  Explain
1e0d0 51 75 65 72 79 50 6c 61 6e 50 6f 70 28 70 50 61  QueryPlanPop(pPa
1e0e0 72 73 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  rse);.  return p
1e0f0 50 61 72 73 65 2d 3e 6e 45 72 72 21 3d 30 3b 0a  Parse->nErr!=0;.
1e100 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 21 64  }.#endif..#if !d
1e110 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
1e120 49 54 5f 53 55 42 51 55 45 52 59 29 20 7c 7c 20  IT_SUBQUERY) || 
1e130 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
1e140 4f 4d 49 54 5f 56 49 45 57 29 0a 0a 2f 2a 20 41  OMIT_VIEW)../* A
1e150 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68  n instance of th
1e160 65 20 53 75 62 73 74 43 6f 6e 74 65 78 74 20 6f  e SubstContext o
1e170 62 6a 65 63 74 20 64 65 73 63 72 69 62 65 73 20  bject describes 
1e180 61 6e 20 73 75 62 73 74 69 74 75 74 69 6f 6e 20  an substitution 
1e190 65 64 69 74 0a 2a 2a 20 74 6f 20 62 65 20 70 65  edit.** to be pe
1e1a0 72 66 6f 72 6d 65 64 20 6f 6e 20 61 20 70 61 72  rformed on a par
1e1b0 73 65 20 74 72 65 65 2e 0a 2a 2a 0a 2a 2a 20 41  se tree..**.** A
1e1c0 6c 6c 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f  ll references to
1e1d0 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 61 62 6c   columns in tabl
1e1e0 65 20 69 54 61 62 6c 65 20 61 72 65 20 74 6f 20  e iTable are to 
1e1f0 62 65 20 72 65 70 6c 61 63 65 64 20 62 79 20 63  be replaced by c
1e200 6f 72 72 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20  orresponding.** 
1e210 65 78 70 72 65 73 73 69 6f 6e 73 20 69 6e 20 70  expressions in p
1e220 45 4c 69 73 74 2e 0a 2a 2f 0a 74 79 70 65 64 65  EList..*/.typede
1e230 66 20 73 74 72 75 63 74 20 53 75 62 73 74 43 6f  f struct SubstCo
1e240 6e 74 65 78 74 20 7b 0a 20 20 50 61 72 73 65 20  ntext {.  Parse 
1e250 2a 70 50 61 72 73 65 3b 20 20 20 20 20 20 20 20  *pParse;        
1e260 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 69      /* The parsi
1e270 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
1e280 69 6e 74 20 69 54 61 62 6c 65 3b 20 20 20 20 20  int iTable;     
1e290 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 70            /* Rep
1e2a0 6c 61 63 65 20 72 65 66 65 72 65 6e 63 65 73 20  lace references 
1e2b0 74 6f 20 74 68 69 73 20 74 61 62 6c 65 20 2a 2f  to this table */
1e2c0 0a 20 20 69 6e 74 20 69 4e 65 77 54 61 62 6c 65  .  int iNewTable
1e2d0 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
1e2e0 4e 65 77 20 74 61 62 6c 65 20 6e 75 6d 62 65 72  New table number
1e2f0 20 2a 2f 0a 20 20 69 6e 74 20 69 73 4c 65 66 74   */.  int isLeft
1e300 4a 6f 69 6e 3b 20 20 20 20 20 20 20 20 20 20 20  Join;           
1e310 2f 2a 20 41 64 64 20 54 4b 5f 49 46 5f 4e 55 4c  /* Add TK_IF_NUL
1e320 4c 5f 52 4f 57 20 6f 70 63 6f 64 65 73 20 6f 6e  L_ROW opcodes on
1e330 20 65 61 63 68 20 72 65 70 6c 61 63 65 6d 65 6e   each replacemen
1e340 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  t */.  ExprList 
1e350 2a 70 45 4c 69 73 74 3b 20 20 20 20 20 20 20 20  *pEList;        
1e360 20 2f 2a 20 52 65 70 6c 61 63 65 6d 65 6e 74 20   /* Replacement 
1e370 65 78 70 72 65 73 73 69 6f 6e 73 20 2a 2f 0a 7d  expressions */.}
1e380 20 53 75 62 73 74 43 6f 6e 74 65 78 74 3b 0a 0a   SubstContext;..
1e390 2f 2a 20 46 6f 72 77 61 72 64 20 44 65 63 6c 61  /* Forward Decla
1e3a0 72 61 74 69 6f 6e 73 20 2a 2f 0a 73 74 61 74 69  rations */.stati
1e3b0 63 20 76 6f 69 64 20 73 75 62 73 74 45 78 70 72  c void substExpr
1e3c0 4c 69 73 74 28 53 75 62 73 74 43 6f 6e 74 65 78  List(SubstContex
1e3d0 74 2a 2c 20 45 78 70 72 4c 69 73 74 2a 29 3b 0a  t*, ExprList*);.
1e3e0 73 74 61 74 69 63 20 76 6f 69 64 20 73 75 62 73  static void subs
1e3f0 74 53 65 6c 65 63 74 28 53 75 62 73 74 43 6f 6e  tSelect(SubstCon
1e400 74 65 78 74 2a 2c 20 53 65 6c 65 63 74 2a 2c 20  text*, Select*, 
1e410 69 6e 74 29 3b 0a 0a 2f 2a 0a 2a 2a 20 53 63 61  int);../*.** Sca
1e420 6e 20 74 68 72 6f 75 67 68 20 74 68 65 20 65 78  n through the ex
1e430 70 72 65 73 73 69 6f 6e 20 70 45 78 70 72 2e 20  pression pExpr. 
1e440 20 52 65 70 6c 61 63 65 20 65 76 65 72 79 20 72   Replace every r
1e450 65 66 65 72 65 6e 63 65 20 74 6f 0a 2a 2a 20 61  eference to.** a
1e460 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 61 62 6c 65   column in table
1e470 20 6e 75 6d 62 65 72 20 69 54 61 62 6c 65 20 77   number iTable w
1e480 69 74 68 20 61 20 63 6f 70 79 20 6f 66 20 74 68  ith a copy of th
1e490 65 20 69 43 6f 6c 75 6d 6e 2d 74 68 0a 2a 2a 20  e iColumn-th.** 
1e4a0 65 6e 74 72 79 20 69 6e 20 70 45 4c 69 73 74 2e  entry in pEList.
1e4b0 20 20 28 42 75 74 20 6c 65 61 76 65 20 72 65 66    (But leave ref
1e4c0 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20 52  erences to the R
1e4d0 4f 57 49 44 20 63 6f 6c 75 6d 6e 20 0a 2a 2a 20  OWID column .** 
1e4e0 75 6e 63 68 61 6e 67 65 64 2e 29 0a 2a 2a 0a 2a  unchanged.).**.*
1e4f0 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
1e500 73 20 70 61 72 74 20 6f 66 20 74 68 65 20 66 6c  s part of the fl
1e510 61 74 74 65 6e 69 6e 67 20 70 72 6f 63 65 64 75  attening procedu
1e520 72 65 2e 20 20 41 20 73 75 62 71 75 65 72 79 0a  re.  A subquery.
1e530 2a 2a 20 77 68 6f 73 65 20 72 65 73 75 6c 74 20  ** whose result 
1e540 73 65 74 20 69 73 20 64 65 66 69 6e 65 64 20 62  set is defined b
1e550 79 20 70 45 4c 69 73 74 20 61 70 70 65 61 72 73  y pEList appears
1e560 20 61 73 20 65 6e 74 72 79 20 69 6e 20 74 68 65   as entry in the
1e570 0a 2a 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  .** FROM clause 
1e580 6f 66 20 61 20 53 45 4c 45 43 54 20 73 75 63 68  of a SELECT such
1e590 20 74 68 61 74 20 74 68 65 20 56 44 42 45 20 63   that the VDBE c
1e5a0 75 72 73 6f 72 20 61 73 73 69 67 6e 65 64 20 74  ursor assigned t
1e5b0 6f 20 74 68 61 74 0a 2a 2a 20 46 4f 52 4d 20 63  o that.** FORM c
1e5c0 6c 61 75 73 65 20 65 6e 74 72 79 20 69 73 20 69  lause entry is i
1e5d0 54 61 62 6c 65 2e 20 20 54 68 69 73 20 72 6f 75  Table.  This rou
1e5e0 74 69 6e 65 20 6d 61 6b 65 73 20 74 68 65 20 6e  tine makes the n
1e5f0 65 63 65 73 73 61 72 79 20 0a 2a 2a 20 63 68 61  ecessary .** cha
1e600 6e 67 65 73 20 74 6f 20 70 45 78 70 72 20 73 6f  nges to pExpr so
1e610 20 74 68 61 74 20 69 74 20 72 65 66 65 72 73 20   that it refers 
1e620 64 69 72 65 63 74 6c 79 20 74 6f 20 74 68 65 20  directly to the 
1e630 73 6f 75 72 63 65 20 74 61 62 6c 65 0a 2a 2a 20  source table.** 
1e640 6f 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20  of the subquery 
1e650 72 61 74 68 65 72 20 74 68 65 20 72 65 73 75 6c  rather the resul
1e660 74 20 73 65 74 20 6f 66 20 74 68 65 20 73 75 62  t set of the sub
1e670 71 75 65 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63  query..*/.static
1e680 20 45 78 70 72 20 2a 73 75 62 73 74 45 78 70 72   Expr *substExpr
1e690 28 0a 20 20 53 75 62 73 74 43 6f 6e 74 65 78 74  (.  SubstContext
1e6a0 20 2a 70 53 75 62 73 74 2c 20 20 2f 2a 20 44 65   *pSubst,  /* De
1e6b0 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 74 68 65  scription of the
1e6c0 20 73 75 62 73 74 69 74 75 74 69 6f 6e 20 2a 2f   substitution */
1e6d0 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 20  .  Expr *pExpr  
1e6e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 70            /* Exp
1e6f0 72 20 69 6e 20 77 68 69 63 68 20 73 75 62 73 74  r in which subst
1e700 69 74 75 74 69 6f 6e 20 6f 63 63 75 72 73 20 2a  itution occurs *
1e710 2f 0a 29 7b 0a 20 20 69 66 28 20 70 45 78 70 72  /.){.  if( pExpr
1e720 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
1e730 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f    if( ExprHasPro
1e740 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
1e750 46 72 6f 6d 4a 6f 69 6e 29 0a 20 20 20 26 26 20  FromJoin).   && 
1e760 70 45 78 70 72 2d 3e 69 52 69 67 68 74 4a 6f 69  pExpr->iRightJoi
1e770 6e 54 61 62 6c 65 3d 3d 70 53 75 62 73 74 2d 3e  nTable==pSubst->
1e780 69 54 61 62 6c 65 0a 20 20 29 7b 0a 20 20 20 20  iTable.  ){.    
1e790 70 45 78 70 72 2d 3e 69 52 69 67 68 74 4a 6f 69  pExpr->iRightJoi
1e7a0 6e 54 61 62 6c 65 20 3d 20 70 53 75 62 73 74 2d  nTable = pSubst-
1e7b0 3e 69 4e 65 77 54 61 62 6c 65 3b 0a 20 20 7d 0a  >iNewTable;.  }.
1e7c0 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d    if( pExpr->op=
1e7d0 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20 70 45  =TK_COLUMN && pE
1e7e0 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 70 53 75  xpr->iTable==pSu
1e7f0 62 73 74 2d 3e 69 54 61 62 6c 65 20 29 7b 0a 20  bst->iTable ){. 
1e800 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 69 43     if( pExpr->iC
1e810 6f 6c 75 6d 6e 3c 30 20 29 7b 0a 20 20 20 20 20  olumn<0 ){.     
1e820 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f   pExpr->op = TK_
1e830 4e 55 4c 4c 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  NULL;.    }else{
1e840 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 4e 65  .      Expr *pNe
1e850 77 3b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70  w;.      Expr *p
1e860 43 6f 70 79 20 3d 20 70 53 75 62 73 74 2d 3e 70  Copy = pSubst->p
1e870 45 4c 69 73 74 2d 3e 61 5b 70 45 78 70 72 2d 3e  EList->a[pExpr->
1e880 69 43 6f 6c 75 6d 6e 5d 2e 70 45 78 70 72 3b 0a  iColumn].pExpr;.
1e890 20 20 20 20 20 20 45 78 70 72 20 69 66 4e 75 6c        Expr ifNul
1e8a0 6c 52 6f 77 3b 0a 20 20 20 20 20 20 61 73 73 65  lRow;.      asse
1e8b0 72 74 28 20 70 53 75 62 73 74 2d 3e 70 45 4c 69  rt( pSubst->pELi
1e8c0 73 74 21 3d 30 20 26 26 20 70 45 78 70 72 2d 3e  st!=0 && pExpr->
1e8d0 69 43 6f 6c 75 6d 6e 3c 70 53 75 62 73 74 2d 3e  iColumn<pSubst->
1e8e0 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 3b  pEList->nExpr );
1e8f0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
1e900 45 78 70 72 2d 3e 70 52 69 67 68 74 3d 3d 30 20  Expr->pRight==0 
1e910 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c  );.      if( sql
1e920 69 74 65 33 45 78 70 72 49 73 56 65 63 74 6f 72  ite3ExprIsVector
1e930 28 70 43 6f 70 79 29 20 29 7b 0a 20 20 20 20 20  (pCopy) ){.     
1e940 20 20 20 73 71 6c 69 74 65 33 56 65 63 74 6f 72     sqlite3Vector
1e950 45 72 72 6f 72 4d 73 67 28 70 53 75 62 73 74 2d  ErrorMsg(pSubst-
1e960 3e 70 50 61 72 73 65 2c 20 70 43 6f 70 79 29 3b  >pParse, pCopy);
1e970 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
1e980 20 20 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64        sqlite3 *d
1e990 62 20 3d 20 70 53 75 62 73 74 2d 3e 70 50 61 72  b = pSubst->pPar
1e9a0 73 65 2d 3e 64 62 3b 0a 20 20 20 20 20 20 20 20  se->db;.        
1e9b0 69 66 28 20 70 53 75 62 73 74 2d 3e 69 73 4c 65  if( pSubst->isLe
1e9c0 66 74 4a 6f 69 6e 20 26 26 20 70 43 6f 70 79 2d  ftJoin && pCopy-
1e9d0 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29  >op!=TK_COLUMN )
1e9e0 7b 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 73  {.          mems
1e9f0 65 74 28 26 69 66 4e 75 6c 6c 52 6f 77 2c 20 30  et(&ifNullRow, 0
1ea00 2c 20 73 69 7a 65 6f 66 28 69 66 4e 75 6c 6c 52  , sizeof(ifNullR
1ea10 6f 77 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ow));.          
1ea20 69 66 4e 75 6c 6c 52 6f 77 2e 6f 70 20 3d 20 54  ifNullRow.op = T
1ea30 4b 5f 49 46 5f 4e 55 4c 4c 5f 52 4f 57 3b 0a 20  K_IF_NULL_ROW;. 
1ea40 20 20 20 20 20 20 20 20 20 69 66 4e 75 6c 6c 52           ifNullR
1ea50 6f 77 2e 70 4c 65 66 74 20 3d 20 70 43 6f 70 79  ow.pLeft = pCopy
1ea60 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 4e 75  ;.          ifNu
1ea70 6c 6c 52 6f 77 2e 69 54 61 62 6c 65 20 3d 20 70  llRow.iTable = p
1ea80 53 75 62 73 74 2d 3e 69 4e 65 77 54 61 62 6c 65  Subst->iNewTable
1ea90 3b 0a 20 20 20 20 20 20 20 20 20 20 70 43 6f 70  ;.          pCop
1eaa0 79 20 3d 20 26 69 66 4e 75 6c 6c 52 6f 77 3b 0a  y = &ifNullRow;.
1eab0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1eac0 20 20 74 65 73 74 63 61 73 65 28 20 45 78 70 72    testcase( Expr
1ead0 48 61 73 50 72 6f 70 65 72 74 79 28 70 43 6f 70  HasProperty(pCop
1eae0 79 2c 20 45 50 5f 53 75 62 71 75 65 72 79 29 20  y, EP_Subquery) 
1eaf0 29 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 20  );.        pNew 
1eb00 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70  = sqlite3ExprDup
1eb10 28 64 62 2c 20 70 43 6f 70 79 2c 20 30 29 3b 0a  (db, pCopy, 0);.
1eb20 20 20 20 20 20 20 20 20 69 66 28 20 70 4e 65 77          if( pNew
1eb30 20 26 26 20 70 53 75 62 73 74 2d 3e 69 73 4c 65   && pSubst->isLe
1eb40 66 74 4a 6f 69 6e 20 29 7b 0a 20 20 20 20 20 20  ftJoin ){.      
1eb50 20 20 20 20 45 78 70 72 53 65 74 50 72 6f 70 65      ExprSetPrope
1eb60 72 74 79 28 70 4e 65 77 2c 20 45 50 5f 43 61 6e  rty(pNew, EP_Can
1eb70 42 65 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 20  BeNull);.       
1eb80 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 70   }.        if( p
1eb90 4e 65 77 20 26 26 20 45 78 70 72 48 61 73 50 72  New && ExprHasPr
1eba0 6f 70 65 72 74 79 28 70 45 78 70 72 2c 45 50 5f  operty(pExpr,EP_
1ebb0 46 72 6f 6d 4a 6f 69 6e 29 20 29 7b 0a 20 20 20  FromJoin) ){.   
1ebc0 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 69 52 69         pNew->iRi
1ebd0 67 68 74 4a 6f 69 6e 54 61 62 6c 65 20 3d 20 70  ghtJoinTable = p
1ebe0 45 78 70 72 2d 3e 69 52 69 67 68 74 4a 6f 69 6e  Expr->iRightJoin
1ebf0 54 61 62 6c 65 3b 0a 20 20 20 20 20 20 20 20 20  Table;.         
1ec00 20 45 78 70 72 53 65 74 50 72 6f 70 65 72 74 79   ExprSetProperty
1ec10 28 70 4e 65 77 2c 20 45 50 5f 46 72 6f 6d 4a 6f  (pNew, EP_FromJo
1ec20 69 6e 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  in);.        }. 
1ec30 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
1ec40 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 45 78  prDelete(db, pEx
1ec50 70 72 29 3b 0a 20 20 20 20 20 20 20 20 70 45 78  pr);.        pEx
1ec60 70 72 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 20  pr = pNew;.     
1ec70 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65   }.    }.  }else
1ec80 7b 0a 20 20 20 20 69 66 28 20 70 45 78 70 72 2d  {.    if( pExpr-
1ec90 3e 6f 70 3d 3d 54 4b 5f 49 46 5f 4e 55 4c 4c 5f  >op==TK_IF_NULL_
1eca0 52 4f 57 20 26 26 20 70 45 78 70 72 2d 3e 69 54  ROW && pExpr->iT
1ecb0 61 62 6c 65 3d 3d 70 53 75 62 73 74 2d 3e 69 54  able==pSubst->iT
1ecc0 61 62 6c 65 20 29 7b 0a 20 20 20 20 20 20 70 45  able ){.      pE
1ecd0 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20 70 53  xpr->iTable = pS
1ece0 75 62 73 74 2d 3e 69 4e 65 77 54 61 62 6c 65 3b  ubst->iNewTable;
1ecf0 0a 20 20 20 20 7d 0a 20 20 20 20 70 45 78 70 72  .    }.    pExpr
1ed00 2d 3e 70 4c 65 66 74 20 3d 20 73 75 62 73 74 45  ->pLeft = substE
1ed10 78 70 72 28 70 53 75 62 73 74 2c 20 70 45 78 70  xpr(pSubst, pExp
1ed20 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 70  r->pLeft);.    p
1ed30 45 78 70 72 2d 3e 70 52 69 67 68 74 20 3d 20 73  Expr->pRight = s
1ed40 75 62 73 74 45 78 70 72 28 70 53 75 62 73 74 2c  ubstExpr(pSubst,
1ed50 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 29 3b   pExpr->pRight);
1ed60 0a 20 20 20 20 69 66 28 20 45 78 70 72 48 61 73  .    if( ExprHas
1ed70 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
1ed80 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 7b  EP_xIsSelect) ){
1ed90 0a 20 20 20 20 20 20 73 75 62 73 74 53 65 6c 65  .      substSele
1eda0 63 74 28 70 53 75 62 73 74 2c 20 70 45 78 70 72  ct(pSubst, pExpr
1edb0 2d 3e 78 2e 70 53 65 6c 65 63 74 2c 20 31 29 3b  ->x.pSelect, 1);
1edc0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1edd0 20 20 73 75 62 73 74 45 78 70 72 4c 69 73 74 28    substExprList(
1ede0 70 53 75 62 73 74 2c 20 70 45 78 70 72 2d 3e 78  pSubst, pExpr->x
1edf0 2e 70 4c 69 73 74 29 3b 0a 20 20 20 20 7d 0a 20  .pList);.    }. 
1ee00 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 45 78 70   }.  return pExp
1ee10 72 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64  r;.}.static void
1ee20 20 73 75 62 73 74 45 78 70 72 4c 69 73 74 28 0a   substExprList(.
1ee30 20 20 53 75 62 73 74 43 6f 6e 74 65 78 74 20 2a    SubstContext *
1ee40 70 53 75 62 73 74 2c 20 2f 2a 20 44 65 73 63 72  pSubst, /* Descr
1ee50 69 70 74 69 6f 6e 20 6f 66 20 74 68 65 20 73 75  iption of the su
1ee60 62 73 74 69 74 75 74 69 6f 6e 20 2a 2f 0a 20 20  bstitution */.  
1ee70 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 20  ExprList *pList 
1ee80 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 74 6f        /* List to
1ee90 20 73 63 61 6e 20 61 6e 64 20 69 6e 20 77 68 69   scan and in whi
1eea0 63 68 20 74 6f 20 6d 61 6b 65 20 73 75 62 73 74  ch to make subst
1eeb0 69 74 75 74 65 73 20 2a 2f 0a 29 7b 0a 20 20 69  itutes */.){.  i
1eec0 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 4c 69 73  nt i;.  if( pLis
1eed0 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  t==0 ) return;. 
1eee0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73   for(i=0; i<pLis
1eef0 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a  t->nExpr; i++){.
1ef00 20 20 20 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e      pList->a[i].
1ef10 70 45 78 70 72 20 3d 20 73 75 62 73 74 45 78 70  pExpr = substExp
1ef20 72 28 70 53 75 62 73 74 2c 20 70 4c 69 73 74 2d  r(pSubst, pList-
1ef30 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20  >a[i].pExpr);.  
1ef40 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20  }.}.static void 
1ef50 73 75 62 73 74 53 65 6c 65 63 74 28 0a 20 20 53  substSelect(.  S
1ef60 75 62 73 74 43 6f 6e 74 65 78 74 20 2a 70 53 75  ubstContext *pSu
1ef70 62 73 74 2c 20 2f 2a 20 44 65 73 63 72 69 70 74  bst, /* Descript
1ef80 69 6f 6e 20 6f 66 20 74 68 65 20 73 75 62 73 74  ion of the subst
1ef90 69 74 75 74 69 6f 6e 20 2a 2f 0a 20 20 53 65 6c  itution */.  Sel
1efa0 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20  ect *p,         
1efb0 20 20 20 2f 2a 20 53 45 4c 45 43 54 20 73 74 61     /* SELECT sta
1efc0 74 65 6d 65 6e 74 20 69 6e 20 77 68 69 63 68 20  tement in which 
1efd0 74 6f 20 6d 61 6b 65 20 73 75 62 73 74 69 74 75  to make substitu
1efe0 74 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 64  tions */.  int d
1eff0 6f 50 72 69 6f 72 20 20 20 20 20 20 20 20 20 20  oPrior          
1f000 20 2f 2a 20 44 6f 20 73 75 62 73 74 69 74 75 74   /* Do substitut
1f010 65 73 20 6f 6e 20 70 2d 3e 70 50 72 69 6f 72 20  es on p->pPrior 
1f020 74 6f 6f 20 2a 2f 0a 29 7b 0a 20 20 53 72 63 4c  too */.){.  SrcL
1f030 69 73 74 20 2a 70 53 72 63 3b 0a 20 20 73 74 72  ist *pSrc;.  str
1f040 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
1f050 20 2a 70 49 74 65 6d 3b 0a 20 20 69 6e 74 20 69   *pItem;.  int i
1f060 3b 0a 20 20 69 66 28 20 21 70 20 29 20 72 65 74  ;.  if( !p ) ret
1f070 75 72 6e 3b 0a 20 20 64 6f 7b 0a 20 20 20 20 73  urn;.  do{.    s
1f080 75 62 73 74 45 78 70 72 4c 69 73 74 28 70 53 75  ubstExprList(pSu
1f090 62 73 74 2c 20 70 2d 3e 70 45 4c 69 73 74 29 3b  bst, p->pEList);
1f0a0 0a 20 20 20 20 73 75 62 73 74 45 78 70 72 4c 69  .    substExprLi
1f0b0 73 74 28 70 53 75 62 73 74 2c 20 70 2d 3e 70 47  st(pSubst, p->pG
1f0c0 72 6f 75 70 42 79 29 3b 0a 20 20 20 20 73 75 62  roupBy);.    sub
1f0d0 73 74 45 78 70 72 4c 69 73 74 28 70 53 75 62 73  stExprList(pSubs
1f0e0 74 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79 29 3b  t, p->pOrderBy);
1f0f0 0a 20 20 20 20 70 2d 3e 70 48 61 76 69 6e 67 20  .    p->pHaving 
1f100 3d 20 73 75 62 73 74 45 78 70 72 28 70 53 75 62  = substExpr(pSub
1f110 73 74 2c 20 70 2d 3e 70 48 61 76 69 6e 67 29 3b  st, p->pHaving);
1f120 0a 20 20 20 20 70 2d 3e 70 57 68 65 72 65 20 3d  .    p->pWhere =
1f130 20 73 75 62 73 74 45 78 70 72 28 70 53 75 62 73   substExpr(pSubs
1f140 74 2c 20 70 2d 3e 70 57 68 65 72 65 29 3b 0a 20  t, p->pWhere);. 
1f150 20 20 20 70 53 72 63 20 3d 20 70 2d 3e 70 53 72     pSrc = p->pSr
1f160 63 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  c;.    assert( p
1f170 53 72 63 21 3d 30 20 29 3b 0a 20 20 20 20 66 6f  Src!=0 );.    fo
1f180 72 28 69 3d 70 53 72 63 2d 3e 6e 53 72 63 2c 20  r(i=pSrc->nSrc, 
1f190 70 49 74 65 6d 3d 70 53 72 63 2d 3e 61 3b 20 69  pItem=pSrc->a; i
1f1a0 3e 30 3b 20 69 2d 2d 2c 20 70 49 74 65 6d 2b 2b  >0; i--, pItem++
1f1b0 29 7b 0a 20 20 20 20 20 20 73 75 62 73 74 53 65  ){.      substSe
1f1c0 6c 65 63 74 28 70 53 75 62 73 74 2c 20 70 49 74  lect(pSubst, pIt
1f1d0 65 6d 2d 3e 70 53 65 6c 65 63 74 2c 20 31 29 3b  em->pSelect, 1);
1f1e0 0a 20 20 20 20 20 20 69 66 28 20 70 49 74 65 6d  .      if( pItem
1f1f0 2d 3e 66 67 2e 69 73 54 61 62 46 75 6e 63 20 29  ->fg.isTabFunc )
1f200 7b 0a 20 20 20 20 20 20 20 20 73 75 62 73 74 45  {.        substE
1f210 78 70 72 4c 69 73 74 28 70 53 75 62 73 74 2c 20  xprList(pSubst, 
1f220 70 49 74 65 6d 2d 3e 75 31 2e 70 46 75 6e 63 41  pItem->u1.pFuncA
1f230 72 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  rg);.      }.   
1f240 20 7d 0a 20 20 7d 77 68 69 6c 65 28 20 64 6f 50   }.  }while( doP
1f250 72 69 6f 72 20 26 26 20 28 70 20 3d 20 70 2d 3e  rior && (p = p->
1f260 70 50 72 69 6f 72 29 21 3d 30 20 29 3b 0a 7d 0a  pPrior)!=0 );.}.
1f270 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e  #endif /* !defin
1f280 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ed(SQLITE_OMIT_S
1f290 55 42 51 55 45 52 59 29 20 7c 7c 20 21 64 65 66  UBQUERY) || !def
1f2a0 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
1f2b0 5f 56 49 45 57 29 20 2a 2f 0a 0a 23 69 66 20 21  _VIEW) */..#if !
1f2c0 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
1f2d0 4d 49 54 5f 53 55 42 51 55 45 52 59 29 20 7c 7c  MIT_SUBQUERY) ||
1f2e0 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
1f2f0 5f 4f 4d 49 54 5f 56 49 45 57 29 0a 2f 2a 0a 2a  _OMIT_VIEW)./*.*
1f300 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61  * This routine a
1f310 74 74 65 6d 70 74 73 20 74 6f 20 66 6c 61 74 74  ttempts to flatt
1f320 65 6e 20 73 75 62 71 75 65 72 69 65 73 20 61 73  en subqueries as
1f330 20 61 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 6f   a performance o
1f340 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 0a 2a 2a 20  ptimization..** 
1f350 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74  This routine ret
1f360 75 72 6e 73 20 31 20 69 66 20 69 74 20 6d 61 6b  urns 1 if it mak
1f370 65 73 20 63 68 61 6e 67 65 73 20 61 6e 64 20 30  es changes and 0
1f380 20 69 66 20 6e 6f 20 66 6c 61 74 74 65 6e 69 6e   if no flattenin
1f390 67 20 6f 63 63 75 72 73 2e 0a 2a 2a 0a 2a 2a 20  g occurs..**.** 
1f3a0 54 6f 20 75 6e 64 65 72 73 74 61 6e 64 20 74 68  To understand th
1f3b0 65 20 63 6f 6e 63 65 70 74 20 6f 66 20 66 6c 61  e concept of fla
1f3c0 74 74 65 6e 69 6e 67 2c 20 63 6f 6e 73 69 64 65  ttening, conside
1f3d0 72 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a  r the following.
1f3e0 2a 2a 20 71 75 65 72 79 3a 0a 2a 2a 0a 2a 2a 20  ** query:.**.** 
1f3f0 20 20 20 20 53 45 4c 45 43 54 20 61 20 46 52 4f      SELECT a FRO
1f400 4d 20 28 53 45 4c 45 43 54 20 78 2b 79 20 41 53  M (SELECT x+y AS
1f410 20 61 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45   a FROM t1 WHERE
1f420 20 7a 3c 31 30 30 29 20 57 48 45 52 45 20 61 3e   z<100) WHERE a>
1f430 35 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 65 66 61  5.**.** The defa
1f440 75 6c 74 20 77 61 79 20 6f 66 20 69 6d 70 6c 65  ult way of imple
1f450 6d 65 6e 74 69 6e 67 20 74 68 69 73 20 71 75 65  menting this que
1f460 72 79 20 69 73 20 74 6f 20 65 78 65 63 75 74 65  ry is to execute
1f470 20 74 68 65 0a 2a 2a 20 73 75 62 71 75 65 72 79   the.** subquery
1f480 20 66 69 72 73 74 20 61 6e 64 20 73 74 6f 72 65   first and store
1f490 20 74 68 65 20 72 65 73 75 6c 74 73 20 69 6e 20   the results in 
1f4a0 61 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  a temporary tabl
1f4b0 65 2c 20 74 68 65 6e 0a 2a 2a 20 72 75 6e 20 74  e, then.** run t
1f4c0 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 6f  he outer query o
1f4d0 6e 20 74 68 61 74 20 74 65 6d 70 6f 72 61 72 79  n that temporary
1f4e0 20 74 61 62 6c 65 2e 20 20 54 68 69 73 20 72 65   table.  This re
1f4f0 71 75 69 72 65 73 20 74 77 6f 0a 2a 2a 20 70 61  quires two.** pa
1f500 73 73 65 73 20 6f 76 65 72 20 74 68 65 20 64 61  sses over the da
1f510 74 61 2e 20 20 46 75 72 74 68 65 72 6d 6f 72 65  ta.  Furthermore
1f520 2c 20 62 65 63 61 75 73 65 20 74 68 65 20 74 65  , because the te
1f530 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 0a 2a 2a  mporary table.**
1f540 20 68 61 73 20 6e 6f 20 69 6e 64 69 63 65 73 2c   has no indices,
1f550 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
1f560 65 20 6f 6e 20 74 68 65 20 6f 75 74 65 72 20 71  e on the outer q
1f570 75 65 72 79 20 63 61 6e 6e 6f 74 20 62 65 0a 2a  uery cannot be.*
1f580 2a 20 6f 70 74 69 6d 69 7a 65 64 2e 0a 2a 2a 0a  * optimized..**.
1f590 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
1f5a0 61 74 74 65 6d 70 74 73 20 74 6f 20 72 65 77 72  attempts to rewr
1f5b0 69 74 65 20 71 75 65 72 69 65 73 20 73 75 63 68  ite queries such
1f5c0 20 61 73 20 74 68 65 20 61 62 6f 76 65 20 69 6e   as the above in
1f5d0 74 6f 0a 2a 2a 20 61 20 73 69 6e 67 6c 65 20 66  to.** a single f
1f5e0 6c 61 74 20 73 65 6c 65 63 74 2c 20 6c 69 6b 65  lat select, like
1f5f0 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20   this:.**.**    
1f600 20 53 45 4c 45 43 54 20 78 2b 79 20 41 53 20 61   SELECT x+y AS a
1f610 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 7a   FROM t1 WHERE z
1f620 3c 31 30 30 20 41 4e 44 20 61 3e 35 0a 2a 2a 0a  <100 AND a>5.**.
1f630 2a 2a 20 54 68 65 20 63 6f 64 65 20 67 65 6e 65  ** The code gene
1f640 72 61 74 65 64 20 66 6f 72 20 74 68 69 73 20 73  rated for this s
1f650 69 6d 70 6c 69 66 69 63 61 74 69 6f 6e 20 67 69  implification gi
1f660 76 65 73 20 74 68 65 20 73 61 6d 65 20 72 65 73  ves the same res
1f670 75 6c 74 0a 2a 2a 20 62 75 74 20 6f 6e 6c 79 20  ult.** but only 
1f680 68 61 73 20 74 6f 20 73 63 61 6e 20 74 68 65 20  has to scan the 
1f690 64 61 74 61 20 6f 6e 63 65 2e 20 20 41 6e 64 20  data once.  And 
1f6a0 62 65 63 61 75 73 65 20 69 6e 64 69 63 65 73 20  because indices 
1f6b0 6d 69 67 68 74 20 0a 2a 2a 20 65 78 69 73 74 20  might .** exist 
1f6c0 6f 6e 20 74 68 65 20 74 61 62 6c 65 20 74 31 2c  on the table t1,
1f6d0 20 61 20 63 6f 6d 70 6c 65 74 65 20 73 63 61 6e   a complete scan
1f6e0 20 6f 66 20 74 68 65 20 64 61 74 61 20 6d 69 67   of the data mig
1f6f0 68 74 20 62 65 0a 2a 2a 20 61 76 6f 69 64 65 64  ht be.** avoided
1f700 2e 0a 2a 2a 0a 2a 2a 20 46 6c 61 74 74 65 6e 69  ..**.** Flatteni
1f710 6e 67 20 69 73 20 73 75 62 6a 65 63 74 20 74 6f  ng is subject to
1f720 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63   the following c
1f730 6f 6e 73 74 72 61 69 6e 74 73 3a 0a 2a 2a 0a 2a  onstraints:.**.*
1f740 2a 20 20 28 2a 2a 29 20 20 57 65 20 6e 6f 20 6c  *  (**)  We no l
1f750 6f 6e 67 65 72 20 61 74 74 65 6d 70 74 20 74 6f  onger attempt to
1f760 20 66 6c 61 74 74 65 6e 20 61 67 67 72 65 67 61   flatten aggrega
1f770 74 65 20 73 75 62 71 75 65 72 69 65 73 2e 20 57  te subqueries. W
1f780 61 73 3a 0a 2a 2a 20 20 20 20 20 20 20 20 54 68  as:.**        Th
1f790 65 20 73 75 62 71 75 65 72 79 20 61 6e 64 20 74  e subquery and t
1f7a0 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 63  he outer query c
1f7b0 61 6e 6e 6f 74 20 62 6f 74 68 20 62 65 20 61 67  annot both be ag
1f7c0 67 72 65 67 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20  gregates..**.** 
1f7d0 20 28 2a 2a 29 20 20 57 65 20 6e 6f 20 6c 6f 6e   (**)  We no lon
1f7e0 67 65 72 20 61 74 74 65 6d 70 74 20 74 6f 20 66  ger attempt to f
1f7f0 6c 61 74 74 65 6e 20 61 67 67 72 65 67 61 74 65  latten aggregate
1f800 20 73 75 62 71 75 65 72 69 65 73 2e 20 57 61 73   subqueries. Was
1f810 3a 0a 2a 2a 20 20 20 20 20 20 20 20 28 32 29 20  :.**        (2) 
1f820 49 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20  If the subquery 
1f830 69 73 20 61 6e 20 61 67 67 72 65 67 61 74 65 20  is an aggregate 
1f840 74 68 65 6e 0a 2a 2a 20 20 20 20 20 20 20 20 28  then.**        (
1f850 32 61 29 20 74 68 65 20 6f 75 74 65 72 20 71 75  2a) the outer qu
1f860 65 72 79 20 6d 75 73 74 20 6e 6f 74 20 62 65 20  ery must not be 
1f870 61 20 6a 6f 69 6e 20 61 6e 64 0a 2a 2a 20 20 20  a join and.**   
1f880 20 20 20 20 20 28 32 62 29 20 74 68 65 20 6f 75       (2b) the ou
1f890 74 65 72 20 71 75 65 72 79 20 6d 75 73 74 20 6e  ter query must n
1f8a0 6f 74 20 75 73 65 20 73 75 62 71 75 65 72 69 65  ot use subquerie
1f8b0 73 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  s.**            
1f8c0 20 6f 74 68 65 72 20 74 68 61 6e 20 74 68 65 20   other than the 
1f8d0 6f 6e 65 20 46 52 4f 4d 2d 63 6c 61 75 73 65 20  one FROM-clause 
1f8e0 73 75 62 71 75 65 72 79 20 74 68 61 74 20 69 73  subquery that is
1f8f0 20 61 20 63 61 6e 64 69 64 61 74 65 0a 2a 2a 20   a candidate.** 
1f900 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 20              for 
1f910 66 6c 61 74 74 65 6e 69 6e 67 2e 20 20 28 54 68  flattening.  (Th
1f920 69 73 20 69 73 20 64 75 65 20 74 6f 20 74 69 63  is is due to tic
1f930 6b 65 74 20 5b 32 66 37 31 37 30 64 37 33 62 66  ket [2f7170d73bf
1f940 39 61 62 66 38 30 5d 0a 2a 2a 20 20 20 20 20 20  9abf80].**      
1f950 20 20 20 20 20 20 20 66 72 6f 6d 20 32 30 31 35         from 2015
1f960 2d 30 32 2d 30 39 2e 29 0a 2a 2a 0a 2a 2a 20 20  -02-09.).**.**  
1f970 20 28 33 29 20 20 49 66 20 74 68 65 20 73 75 62   (3)  If the sub
1f980 71 75 65 72 79 20 69 73 20 74 68 65 20 72 69 67  query is the rig
1f990 68 74 20 6f 70 65 72 61 6e 64 20 6f 66 20 61 20  ht operand of a 
1f9a0 4c 45 46 54 20 4a 4f 49 4e 20 74 68 65 6e 0a 2a  LEFT JOIN then.*
1f9b0 2a 20 20 20 20 20 20 20 20 28 33 61 29 20 74 68  *        (3a) th
1f9c0 65 20 73 75 62 71 75 65 72 79 20 6d 61 79 20 6e  e subquery may n
1f9d0 6f 74 20 62 65 20 61 20 6a 6f 69 6e 20 61 6e 64  ot be a join and
1f9e0 0a 2a 2a 20 20 20 20 20 20 20 20 28 33 62 29 20  .**        (3b) 
1f9f0 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
1fa00 6f 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20  of the subquery 
1fa10 6d 61 79 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20  may not contain 
1fa20 61 20 76 69 72 74 75 61 6c 0a 2a 2a 20 20 20 20  a virtual.**    
1fa30 20 20 20 20 20 20 20 20 20 74 61 62 6c 65 20 61           table a
1fa40 6e 64 0a 2a 2a 20 20 20 20 20 20 20 20 28 33 63  nd.**        (3c
1fa50 29 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  ) the outer quer
1fa60 79 20 6d 61 79 20 6e 6f 74 20 62 65 20 61 6e 20  y may not be an 
1fa70 61 67 67 72 65 67 61 74 65 2e 0a 2a 2a 0a 2a 2a  aggregate..**.**
1fa80 20 20 20 28 34 29 20 20 54 68 65 20 73 75 62 71     (4)  The subq
1fa90 75 65 72 79 20 63 61 6e 20 6e 6f 74 20 62 65 20  uery can not be 
1faa0 44 49 53 54 49 4e 43 54 2e 0a 2a 2a 0a 2a 2a 20  DISTINCT..**.** 
1fab0 20 28 2a 2a 29 20 20 41 74 20 6f 6e 65 20 70 6f   (**)  At one po
1fac0 69 6e 74 20 72 65 73 74 72 69 63 74 69 6f 6e 73  int restrictions
1fad0 20 28 34 29 20 61 6e 64 20 28 35 29 20 64 65 66   (4) and (5) def
1fae0 69 6e 65 64 20 61 20 73 75 62 73 65 74 20 6f 66  ined a subset of
1faf0 20 44 49 53 54 49 4e 43 54 0a 2a 2a 20 20 20 20   DISTINCT.**    
1fb00 20 20 20 20 73 75 62 2d 71 75 65 72 69 65 73 20      sub-queries 
1fb10 74 68 61 74 20 77 65 72 65 20 65 78 63 6c 75 64  that were exclud
1fb20 65 64 20 66 72 6f 6d 20 74 68 69 73 20 6f 70 74  ed from this opt
1fb30 69 6d 69 7a 61 74 69 6f 6e 2e 20 52 65 73 74 72  imization. Restr
1fb40 69 63 74 69 6f 6e 20 0a 2a 2a 20 20 20 20 20 20  iction .**      
1fb50 20 20 28 34 29 20 68 61 73 20 73 69 6e 63 65 20    (4) has since 
1fb60 62 65 65 6e 20 65 78 70 61 6e 64 65 64 20 74 6f  been expanded to
1fb70 20 65 78 63 6c 75 64 65 20 61 6c 6c 20 44 49 53   exclude all DIS
1fb80 54 49 4e 43 54 20 73 75 62 71 75 65 72 69 65 73  TINCT subqueries
1fb90 2e 0a 2a 2a 0a 2a 2a 20 20 28 2a 2a 29 20 20 57  ..**.**  (**)  W
1fba0 65 20 6e 6f 20 6c 6f 6e 67 65 72 20 61 74 74 65  e no longer atte
1fbb0 6d 70 74 20 74 6f 20 66 6c 61 74 74 65 6e 20 61  mpt to flatten a
1fbc0 67 67 72 65 67 61 74 65 20 73 75 62 71 75 65 72  ggregate subquer
1fbd0 69 65 73 2e 20 20 57 61 73 3a 0a 2a 2a 20 20 20  ies.  Was:.**   
1fbe0 20 20 20 20 20 49 66 20 74 68 65 20 73 75 62 71       If the subq
1fbf0 75 65 72 79 20 69 73 20 61 67 67 72 65 67 61 74  uery is aggregat
1fc00 65 2c 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  e, the outer que
1fc10 72 79 20 6d 61 79 20 6e 6f 74 20 62 65 20 44 49  ry may not be DI
1fc20 53 54 49 4e 43 54 2e 0a 2a 2a 0a 2a 2a 20 20 20  STINCT..**.**   
1fc30 28 37 29 20 20 54 68 65 20 73 75 62 71 75 65 72  (7)  The subquer
1fc40 79 20 6d 75 73 74 20 68 61 76 65 20 61 20 46 52  y must have a FR
1fc50 4f 4d 20 63 6c 61 75 73 65 2e 20 20 54 4f 44 4f  OM clause.  TODO
1fc60 3a 20 20 46 6f 72 20 73 75 62 71 75 65 72 69 65  :  For subquerie
1fc70 73 20 77 69 74 68 6f 75 74 0a 2a 2a 20 20 20 20  s without.**    
1fc80 20 20 20 20 41 20 46 52 4f 4d 20 63 6c 61 75 73      A FROM claus
1fc90 65 2c 20 63 6f 6e 73 69 64 65 72 20 61 64 64 69  e, consider addi
1fca0 6e 67 20 61 20 46 52 4f 4d 20 63 6c 61 75 73 65  ng a FROM clause
1fcb0 20 77 69 74 68 20 74 68 65 20 73 70 65 63 69 61   with the specia
1fcc0 6c 0a 2a 2a 20 20 20 20 20 20 20 20 74 61 62 6c  l.**        tabl
1fcd0 65 20 73 71 6c 69 74 65 5f 6f 6e 63 65 20 74 68  e sqlite_once th
1fce0 61 74 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61  at consists of a
1fcf0 20 73 69 6e 67 6c 65 20 72 6f 77 20 63 6f 6e 74   single row cont
1fd00 61 69 6e 69 6e 67 20 61 0a 2a 2a 20 20 20 20 20  aining a.**     
1fd10 20 20 20 73 69 6e 67 6c 65 20 4e 55 4c 4c 2e 0a     single NULL..
1fd20 2a 2a 0a 2a 2a 20 20 20 28 38 29 20 20 49 66 20  **.**   (8)  If 
1fd30 74 68 65 20 73 75 62 71 75 65 72 79 20 75 73 65  the subquery use
1fd40 73 20 4c 49 4d 49 54 20 74 68 65 6e 20 74 68 65  s LIMIT then the
1fd50 20 6f 75 74 65 72 20 71 75 65 72 79 20 6d 61 79   outer query may
1fd60 20 6e 6f 74 20 62 65 20 61 20 6a 6f 69 6e 2e 0a   not be a join..
1fd70 2a 2a 0a 2a 2a 20 20 20 28 39 29 20 20 49 66 20  **.**   (9)  If 
1fd80 74 68 65 20 73 75 62 71 75 65 72 79 20 75 73 65  the subquery use
1fd90 73 20 4c 49 4d 49 54 20 74 68 65 6e 20 74 68 65  s LIMIT then the
1fda0 20 6f 75 74 65 72 20 71 75 65 72 79 20 6d 61 79   outer query may
1fdb0 20 6e 6f 74 20 62 65 20 61 67 67 72 65 67 61 74   not be aggregat
1fdc0 65 2e 0a 2a 2a 0a 2a 2a 20 20 28 2a 2a 29 20 20  e..**.**  (**)  
1fdd0 52 65 73 74 72 69 63 74 69 6f 6e 20 28 31 30 29  Restriction (10)
1fde0 20 77 61 73 20 72 65 6d 6f 76 65 64 20 66 72 6f   was removed fro
1fdf0 6d 20 74 68 65 20 63 6f 64 65 20 6f 6e 20 32 30  m the code on 20
1fe00 30 35 2d 30 32 2d 30 35 20 62 75 74 20 77 65 0a  05-02-05 but we.
1fe10 2a 2a 20 20 20 20 20 20 20 20 61 63 63 69 64 65  **        accide
1fe20 6e 74 6c 79 20 63 61 72 72 69 65 64 20 74 68 65  ntly carried the
1fe30 20 63 6f 6d 6d 65 6e 74 20 66 6f 72 77 61 72 64   comment forward
1fe40 20 75 6e 74 69 6c 20 32 30 31 34 2d 30 39 2d 31   until 2014-09-1
1fe50 35 2e 20 20 4f 72 69 67 69 6e 61 6c 0a 2a 2a 20  5.  Original.** 
1fe60 20 20 20 20 20 20 20 63 6f 6e 73 74 72 61 69 6e         constrain
1fe70 74 3a 20 22 49 66 20 74 68 65 20 73 75 62 71 75  t: "If the subqu
1fe80 65 72 79 20 69 73 20 61 67 67 72 65 67 61 74 65  ery is aggregate
1fe90 20 74 68 65 6e 20 74 68 65 20 6f 75 74 65 72 20   then the outer 
1fea0 71 75 65 72 79 20 0a 2a 2a 20 20 20 20 20 20 20  query .**       
1feb0 20 6d 61 79 20 6e 6f 74 20 75 73 65 20 4c 49 4d   may not use LIM
1fec0 49 54 2e 22 0a 2a 2a 0a 2a 2a 20 20 28 31 31 29  IT.".**.**  (11)
1fed0 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20 61    The subquery a
1fee0 6e 64 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  nd the outer que
1fef0 72 79 20 6d 61 79 20 6e 6f 74 20 62 6f 74 68 20  ry may not both 
1ff00 68 61 76 65 20 4f 52 44 45 52 20 42 59 20 63 6c  have ORDER BY cl
1ff10 61 75 73 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 28 2a  auses..**.**  (*
1ff20 2a 29 20 20 4e 6f 74 20 69 6d 70 6c 65 6d 65 6e  *)  Not implemen
1ff30 74 65 64 2e 20 20 53 75 62 73 75 6d 65 64 20 69  ted.  Subsumed i
1ff40 6e 74 6f 20 72 65 73 74 72 69 63 74 69 6f 6e 20  nto restriction 
1ff50 28 33 29 2e 20 20 57 61 73 20 70 72 65 76 69 6f  (3).  Was previo
1ff60 75 73 6c 79 0a 2a 2a 20 20 20 20 20 20 20 20 61  usly.**        a
1ff70 20 73 65 70 61 72 61 74 65 20 72 65 73 74 72 69   separate restri
1ff80 63 74 69 6f 6e 20 64 65 72 69 76 69 6e 67 20 66  ction deriving f
1ff90 72 6f 6d 20 74 69 63 6b 65 74 20 23 33 35 30 2e  rom ticket #350.
1ffa0 0a 2a 2a 0a 2a 2a 20 20 28 31 33 29 20 20 54 68  .**.**  (13)  Th
1ffb0 65 20 73 75 62 71 75 65 72 79 20 61 6e 64 20 6f  e subquery and o
1ffc0 75 74 65 72 20 71 75 65 72 79 20 6d 61 79 20 6e  uter query may n
1ffd0 6f 74 20 62 6f 74 68 20 75 73 65 20 4c 49 4d 49  ot both use LIMI
1ffe0 54 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 34 29 20 20  T..**.**  (14)  
1fff0 54 68 65 20 73 75 62 71 75 65 72 79 20 6d 61 79  The subquery may
20000 20 6e 6f 74 20 75 73 65 20 4f 46 46 53 45 54 2e   not use OFFSET.
20010 0a 2a 2a 0a 2a 2a 20 20 28 31 35 29 20 20 49 66  .**.**  (15)  If
20020 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
20030 20 69 73 20 70 61 72 74 20 6f 66 20 61 20 63 6f   is part of a co
20040 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 2c 20 74  mpound select, t
20050 68 65 6e 20 74 68 65 0a 2a 2a 20 20 20 20 20 20  hen the.**      
20060 20 20 73 75 62 71 75 65 72 79 20 6d 61 79 20 6e    subquery may n
20070 6f 74 20 75 73 65 20 4c 49 4d 49 54 2e 0a 2a 2a  ot use LIMIT..**
20080 20 20 20 20 20 20 20 20 28 53 65 65 20 74 69 63          (See tic
20090 6b 65 74 20 23 32 33 33 39 20 61 6e 64 20 74 69  ket #2339 and ti
200a0 63 6b 65 74 20 5b 30 32 61 38 65 38 31 64 34 34  cket [02a8e81d44
200b0 5d 29 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 36 29 20  ])..**.**  (16) 
200c0 20 49 66 20 74 68 65 20 6f 75 74 65 72 20 71 75   If the outer qu
200d0 65 72 79 20 69 73 20 61 67 67 72 65 67 61 74 65  ery is aggregate
200e0 2c 20 74 68 65 6e 20 74 68 65 20 73 75 62 71 75  , then the subqu
200f0 65 72 79 20 6d 61 79 20 6e 6f 74 0a 2a 2a 20 20  ery may not.**  
20100 20 20 20 20 20 20 75 73 65 20 4f 52 44 45 52 20        use ORDER 
20110 42 59 2e 20 20 28 54 69 63 6b 65 74 20 23 32 39  BY.  (Ticket #29
20120 34 32 29 20 20 54 68 69 73 20 75 73 65 64 20 74  42)  This used t
20130 6f 20 6e 6f 74 20 6d 61 74 74 65 72 0a 2a 2a 20  o not matter.** 
20140 20 20 20 20 20 20 20 75 6e 74 69 6c 20 77 65 20         until we 
20150 69 6e 74 72 6f 64 75 63 65 64 20 74 68 65 20 67  introduced the g
20160 72 6f 75 70 5f 63 6f 6e 63 61 74 28 29 20 66 75  roup_concat() fu
20170 6e 63 74 69 6f 6e 2e 20 20 0a 2a 2a 0a 2a 2a 20  nction.  .**.** 
20180 20 28 31 37 29 20 20 49 66 20 74 68 65 20 73 75   (17)  If the su
20190 62 71 75 65 72 79 20 69 73 20 61 20 63 6f 6d 70  bquery is a comp
201a0 6f 75 6e 64 20 73 65 6c 65 63 74 2c 20 74 68 65  ound select, the
201b0 6e 0a 2a 2a 20 20 20 20 20 20 20 20 28 31 37 61  n.**        (17a
201c0 29 20 61 6c 6c 20 63 6f 6d 70 6f 75 6e 64 20 6f  ) all compound o
201d0 70 65 72 61 74 6f 72 73 20 6d 75 73 74 20 62 65  perators must be
201e0 20 61 20 55 4e 49 4f 4e 20 41 4c 4c 2c 20 61 6e   a UNION ALL, an
201f0 64 0a 2a 2a 20 20 20 20 20 20 20 20 28 31 37 62  d.**        (17b
20200 29 20 6e 6f 20 74 65 72 6d 73 20 77 69 74 68 69  ) no terms withi
20210 6e 20 74 68 65 20 73 75 62 71 75 65 72 79 20 63  n the subquery c
20220 6f 6d 70 6f 75 6e 64 20 6d 61 79 20 62 65 20 61  ompound may be a
20230 67 67 72 65 67 61 74 65 0a 2a 2a 20 20 20 20 20  ggregate.**     
20240 20 20 20 20 20 20 20 20 20 6f 72 20 44 49 53 54           or DIST
20250 49 4e 43 54 2c 20 61 6e 64 0a 2a 2a 20 20 20 20  INCT, and.**    
20260 20 20 20 20 28 31 37 63 29 20 65 76 65 72 79 20      (17c) every 
20270 74 65 72 6d 20 77 69 74 68 69 6e 20 74 68 65 20  term within the 
20280 73 75 62 71 75 65 72 79 20 63 6f 6d 70 6f 75 6e  subquery compoun
20290 64 20 6d 75 73 74 20 68 61 76 65 20 61 20 46 52  d must have a FR
202a0 4f 4d 20 63 6c 61 75 73 65 0a 2a 2a 20 20 20 20  OM clause.**    
202b0 20 20 20 20 28 31 37 64 29 20 74 68 65 20 6f 75      (17d) the ou
202c0 74 65 72 20 71 75 65 72 79 20 6d 61 79 20 6e 6f  ter query may no
202d0 74 20 62 65 0a 2a 2a 20 20 20 20 20 20 20 20 20  t be.**         
202e0 20 20 20 20 20 28 31 37 64 31 29 20 61 67 67 72       (17d1) aggr
202f0 65 67 61 74 65 2c 20 6f 72 0a 2a 2a 20 20 20 20  egate, or.**    
20300 20 20 20 20 20 20 20 20 20 20 28 31 37 64 32 29            (17d2)
20310 20 44 49 53 54 49 4e 43 54 2c 20 6f 72 0a 2a 2a   DISTINCT, or.**
20320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 31                (1
20330 37 64 33 29 20 61 20 6a 6f 69 6e 2e 0a 2a 2a 0a  7d3) a join..**.
20340 2a 2a 20 20 20 20 20 20 20 20 54 68 65 20 70 61  **        The pa
20350 72 65 6e 74 20 61 6e 64 20 73 75 62 2d 71 75 65  rent and sub-que
20360 72 79 20 6d 61 79 20 63 6f 6e 74 61 69 6e 20 57  ry may contain W
20370 48 45 52 45 20 63 6c 61 75 73 65 73 2e 20 53 75  HERE clauses. Su
20380 62 6a 65 63 74 20 74 6f 0a 2a 2a 20 20 20 20 20  bject to.**     
20390 20 20 20 72 75 6c 65 73 20 28 31 31 29 2c 20 28     rules (11), (
203a0 31 33 29 20 61 6e 64 20 28 31 34 29 2c 20 74 68  13) and (14), th
203b0 65 79 20 6d 61 79 20 61 6c 73 6f 20 63 6f 6e 74  ey may also cont
203c0 61 69 6e 20 4f 52 44 45 52 20 42 59 2c 0a 2a 2a  ain ORDER BY,.**
203d0 20 20 20 20 20 20 20 20 4c 49 4d 49 54 20 61 6e          LIMIT an
203e0 64 20 4f 46 46 53 45 54 20 63 6c 61 75 73 65 73  d OFFSET clauses
203f0 2e 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20  .  The subquery 
20400 63 61 6e 6e 6f 74 20 75 73 65 20 61 6e 79 20 63  cannot use any c
20410 6f 6d 70 6f 75 6e 64 0a 2a 2a 20 20 20 20 20 20  ompound.**      
20420 20 20 6f 70 65 72 61 74 6f 72 20 6f 74 68 65 72    operator other
20430 20 74 68 61 6e 20 55 4e 49 4f 4e 20 41 4c 4c 20   than UNION ALL 
20440 62 65 63 61 75 73 65 20 61 6c 6c 20 74 68 65 20  because all the 
20450 6f 74 68 65 72 20 63 6f 6d 70 6f 75 6e 64 0a 2a  other compound.*
20460 2a 20 20 20 20 20 20 20 20 6f 70 65 72 61 74 6f  *        operato
20470 72 73 20 68 61 76 65 20 61 6e 20 69 6d 70 6c 69  rs have an impli
20480 65 64 20 44 49 53 54 49 4e 43 54 20 77 68 69 63  ed DISTINCT whic
20490 68 20 69 73 20 64 69 73 61 6c 6c 6f 77 65 64 20  h is disallowed 
204a0 62 79 0a 2a 2a 20 20 20 20 20 20 20 20 72 65 73  by.**        res
204b0 74 72 69 63 74 69 6f 6e 20 28 34 29 2e 0a 2a 2a  triction (4)..**
204c0 0a 2a 2a 20 20 20 20 20 20 20 20 41 6c 73 6f 2c  .**        Also,
204d0 20 65 61 63 68 20 63 6f 6d 70 6f 6e 65 6e 74 20   each component 
204e0 6f 66 20 74 68 65 20 73 75 62 2d 71 75 65 72 79  of the sub-query
204f0 20 6d 75 73 74 20 72 65 74 75 72 6e 20 74 68 65   must return the
20500 20 73 61 6d 65 20 6e 75 6d 62 65 72 0a 2a 2a 20   same number.** 
20510 20 20 20 20 20 20 20 6f 66 20 72 65 73 75 6c 74         of result
20520 20 63 6f 6c 75 6d 6e 73 2e 20 54 68 69 73 20 69   columns. This i
20530 73 20 61 63 74 75 61 6c 6c 79 20 61 20 72 65 71  s actually a req
20540 75 69 72 65 6d 65 6e 74 20 66 6f 72 20 61 6e 79  uirement for any
20550 20 63 6f 6d 70 6f 75 6e 64 0a 2a 2a 20 20 20 20   compound.**    
20560 20 20 20 20 53 45 4c 45 43 54 20 73 74 61 74 65      SELECT state
20570 6d 65 6e 74 2c 20 62 75 74 20 61 6c 6c 20 74 68  ment, but all th
20580 65 20 63 6f 64 65 20 68 65 72 65 20 64 6f 65 73  e code here does
20590 20 69 73 20 6d 61 6b 65 20 73 75 72 65 20 74 68   is make sure th
205a0 61 74 20 6e 6f 0a 2a 2a 20 20 20 20 20 20 20 20  at no.**        
205b0 73 75 63 68 20 28 69 6c 6c 65 67 61 6c 29 20 73  such (illegal) s
205c0 75 62 2d 71 75 65 72 79 20 69 73 20 66 6c 61 74  ub-query is flat
205d0 74 65 6e 65 64 2e 20 54 68 65 20 63 61 6c 6c 65  tened. The calle
205e0 72 20 77 69 6c 6c 20 64 65 74 65 63 74 20 74 68  r will detect th
205f0 65 0a 2a 2a 20 20 20 20 20 20 20 20 73 79 6e 74  e.**        synt
20600 61 78 20 65 72 72 6f 72 20 61 6e 64 20 72 65 74  ax error and ret
20610 75 72 6e 20 61 20 64 65 74 61 69 6c 65 64 20 6d  urn a detailed m
20620 65 73 73 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 20 28  essage..**.**  (
20630 31 38 29 20 20 49 66 20 74 68 65 20 73 75 62 2d  18)  If the sub-
20640 71 75 65 72 79 20 69 73 20 61 20 63 6f 6d 70 6f  query is a compo
20650 75 6e 64 20 73 65 6c 65 63 74 2c 20 74 68 65 6e  und select, then
20660 20 61 6c 6c 20 74 65 72 6d 73 20 6f 66 20 74 68   all terms of th
20670 65 0a 2a 2a 20 20 20 20 20 20 20 20 4f 52 44 45  e.**        ORDE
20680 52 20 42 59 20 63 6c 61 75 73 65 20 6f 66 20 74  R BY clause of t
20690 68 65 20 70 61 72 65 6e 74 20 6d 75 73 74 20 62  he parent must b
206a0 65 20 73 69 6d 70 6c 65 20 72 65 66 65 72 65 6e  e simple referen
206b0 63 65 73 20 74 6f 20 0a 2a 2a 20 20 20 20 20 20  ces to .**      
206c0 20 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65    columns of the
206d0 20 73 75 62 2d 71 75 65 72 79 2e 0a 2a 2a 0a 2a   sub-query..**.*
206e0 2a 20 20 28 31 39 29 20 20 49 66 20 74 68 65 20  *  (19)  If the 
206f0 73 75 62 71 75 65 72 79 20 75 73 65 73 20 4c 49  subquery uses LI
20700 4d 49 54 20 74 68 65 6e 20 74 68 65 20 6f 75 74  MIT then the out
20710 65 72 20 71 75 65 72 79 20 6d 61 79 20 6e 6f 74  er query may not
20720 0a 2a 2a 20 20 20 20 20 20 20 20 68 61 76 65 20  .**        have 
20730 61 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e 0a  a WHERE clause..
20740 2a 2a 0a 2a 2a 20 20 28 32 30 29 20 20 49 66 20  **.**  (20)  If 
20750 74 68 65 20 73 75 62 2d 71 75 65 72 79 20 69 73  the sub-query is
20760 20 61 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65   a compound sele
20770 63 74 2c 20 74 68 65 6e 20 69 74 20 6d 75 73 74  ct, then it must
20780 20 6e 6f 74 20 75 73 65 0a 2a 2a 20 20 20 20 20   not use.**     
20790 20 20 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63     an ORDER BY c
207a0 6c 61 75 73 65 2e 20 20 54 69 63 6b 65 74 20 23  lause.  Ticket #
207b0 33 37 37 33 2e 20 20 57 65 20 63 6f 75 6c 64 20  3773.  We could 
207c0 72 65 6c 61 78 20 74 68 69 73 20 63 6f 6e 73 74  relax this const
207d0 72 61 69 6e 74 0a 2a 2a 20 20 20 20 20 20 20 20  raint.**        
207e0 73 6f 6d 65 77 68 61 74 20 62 79 20 73 61 79 69  somewhat by sayi
207f0 6e 67 20 74 68 61 74 20 74 68 65 20 74 65 72 6d  ng that the term
20800 73 20 6f 66 20 74 68 65 20 4f 52 44 45 52 20 42  s of the ORDER B
20810 59 20 63 6c 61 75 73 65 20 6d 75 73 74 0a 2a 2a  Y clause must.**
20820 20 20 20 20 20 20 20 20 61 70 70 65 61 72 20 61          appear a
20830 73 20 75 6e 6d 6f 64 69 66 69 65 64 20 72 65 73  s unmodified res
20840 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74  ult columns in t
20850 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 2e 20  he outer query. 
20860 20 42 75 74 20 77 65 0a 2a 2a 20 20 20 20 20 20   But we.**      
20870 20 20 68 61 76 65 20 6f 74 68 65 72 20 6f 70 74    have other opt
20880 69 6d 69 7a 61 74 69 6f 6e 73 20 69 6e 20 6d 69  imizations in mi
20890 6e 64 20 74 6f 20 64 65 61 6c 20 77 69 74 68 20  nd to deal with 
208a0 74 68 61 74 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a  that case..**.**
208b0 20 20 28 32 31 29 20 20 49 66 20 74 68 65 20 73    (21)  If the s
208c0 75 62 71 75 65 72 79 20 75 73 65 73 20 4c 49 4d  ubquery uses LIM
208d0 49 54 20 74 68 65 6e 20 74 68 65 20 6f 75 74 65  IT then the oute
208e0 72 20 71 75 65 72 79 20 6d 61 79 20 6e 6f 74 20  r query may not 
208f0 62 65 0a 2a 2a 20 20 20 20 20 20 20 20 44 49 53  be.**        DIS
20900 54 49 4e 43 54 2e 20 20 28 53 65 65 20 74 69 63  TINCT.  (See tic
20910 6b 65 74 20 5b 37 35 32 65 31 36 34 36 66 63 5d  ket [752e1646fc]
20920 29 2e 0a 2a 2a 0a 2a 2a 20 20 28 32 32 29 20 20  )..**.**  (22)  
20930 54 68 65 20 73 75 62 71 75 65 72 79 20 6d 61 79  The subquery may
20940 20 6e 6f 74 20 62 65 20 61 20 72 65 63 75 72 73   not be a recurs
20950 69 76 65 20 43 54 45 2e 0a 2a 2a 0a 2a 2a 20 20  ive CTE..**.**  
20960 28 2a 2a 29 20 20 53 75 62 73 75 6d 65 64 20 69  (**)  Subsumed i
20970 6e 74 6f 20 72 65 73 74 72 69 63 74 69 6f 6e 20  nto restriction 
20980 28 31 37 64 33 29 2e 20 20 57 61 73 3a 20 49 66  (17d3).  Was: If
20990 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
209a0 20 69 73 0a 2a 2a 20 20 20 20 20 20 20 20 61 20   is.**        a 
209b0 72 65 63 75 72 73 69 76 65 20 43 54 45 2c 20 74  recursive CTE, t
209c0 68 65 6e 20 74 68 65 20 73 75 62 2d 71 75 65 72  hen the sub-quer
209d0 79 20 6d 61 79 20 6e 6f 74 20 62 65 20 61 20 63  y may not be a c
209e0 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79 2e 0a 2a  ompound query..*
209f0 2a 20 20 20 20 20 20 20 20 54 68 69 73 20 72 65  *        This re
20a00 73 74 72 69 63 74 69 6f 6e 20 69 73 20 62 65 63  striction is bec
20a10 61 75 73 65 20 74 72 61 6e 73 66 6f 72 6d 69 6e  ause transformin
20a20 67 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20  g the.**        
20a30 70 61 72 65 6e 74 20 74 6f 20 61 20 63 6f 6d 70  parent to a comp
20a40 6f 75 6e 64 20 71 75 65 72 79 20 63 6f 6e 66 75  ound query confu
20a50 73 65 73 20 74 68 65 20 63 6f 64 65 20 74 68 61  ses the code tha
20a60 74 20 68 61 6e 64 6c 65 73 0a 2a 2a 20 20 20 20  t handles.**    
20a70 20 20 20 20 72 65 63 75 72 73 69 76 65 20 71 75      recursive qu
20a80 65 72 69 65 73 20 69 6e 20 6d 75 6c 74 69 53 65  eries in multiSe
20a90 6c 65 63 74 28 29 2e 0a 2a 2a 0a 2a 2a 20 20 28  lect()..**.**  (
20aa0 2a 2a 29 20 20 57 65 20 6e 6f 20 6c 6f 6e 67 65  **)  We no longe
20ab0 72 20 61 74 74 65 6d 70 74 20 74 6f 20 66 6c 61  r attempt to fla
20ac0 74 74 65 6e 20 61 67 67 72 65 67 61 74 65 20 73  tten aggregate s
20ad0 75 62 71 75 65 72 69 65 73 2e 20 20 57 61 73 3a  ubqueries.  Was:
20ae0 0a 2a 2a 20 20 20 20 20 20 20 20 54 68 65 20 73  .**        The s
20af0 75 62 71 75 65 72 79 20 6d 61 79 20 6e 6f 74 20  ubquery may not 
20b00 62 65 20 61 6e 20 61 67 67 72 65 67 61 74 65 20  be an aggregate 
20b10 74 68 61 74 20 75 73 65 73 20 74 68 65 20 62 75  that uses the bu
20b20 69 6c 74 2d 69 6e 20 6d 69 6e 28 29 20 6f 72 20  ilt-in min() or 
20b30 0a 2a 2a 20 20 20 20 20 20 20 20 6f 72 20 6d 61  .**        or ma
20b40 78 28 29 20 66 75 6e 63 74 69 6f 6e 73 2e 20 20  x() functions.  
20b50 28 57 69 74 68 6f 75 74 20 74 68 69 73 20 72 65  (Without this re
20b60 73 74 72 69 63 74 69 6f 6e 2c 20 61 20 71 75 65  striction, a que
20b70 72 79 20 6c 69 6b 65 3a 0a 2a 2a 20 20 20 20 20  ry like:.**     
20b80 20 20 20 22 53 45 4c 45 43 54 20 78 20 46 52 4f     "SELECT x FRO
20b90 4d 20 28 53 45 4c 45 43 54 20 6d 61 78 28 79 29  M (SELECT max(y)
20ba0 2c 20 78 20 46 52 4f 4d 20 74 31 29 22 20 77 6f  , x FROM t1)" wo
20bb0 75 6c 64 20 6e 6f 74 20 6e 65 63 65 73 73 61 72  uld not necessar
20bc0 69 6c 79 0a 2a 2a 20 20 20 20 20 20 20 20 72 65  ily.**        re
20bd0 74 75 72 6e 20 74 68 65 20 76 61 6c 75 65 20 58  turn the value X
20be0 20 66 6f 72 20 77 68 69 63 68 20 59 20 77 61 73   for which Y was
20bf0 20 6d 61 78 69 6d 61 6c 2e 29 0a 2a 2a 0a 2a 2a   maximal.).**.**
20c00 20 20 28 32 35 29 20 20 49 66 20 65 69 74 68 65    (25)  If eithe
20c10 72 20 74 68 65 20 73 75 62 71 75 65 72 79 20 6f  r the subquery o
20c20 72 20 74 68 65 20 70 61 72 65 6e 74 20 71 75 65  r the parent que
20c30 72 79 20 63 6f 6e 74 61 69 6e 73 20 61 20 77 69  ry contains a wi
20c40 6e 64 6f 77 0a 2a 2a 20 20 20 20 20 20 20 20 66  ndow.**        f
20c50 75 6e 63 74 69 6f 6e 20 69 6e 20 74 68 65 20 73  unction in the s
20c60 65 6c 65 63 74 20 6c 69 73 74 20 6f 72 20 4f 52  elect list or OR
20c70 44 45 52 20 42 59 20 63 6c 61 75 73 65 2c 20 66  DER BY clause, f
20c80 6c 61 74 74 65 6e 69 6e 67 0a 2a 2a 20 20 20 20  lattening.**    
20c90 20 20 20 20 69 73 20 6e 6f 74 20 61 74 74 65 6d      is not attem
20ca0 70 74 65 64 2e 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 49  pted..**.**.** I
20cb0 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2c 20  n this routine, 
20cc0 74 68 65 20 22 70 22 20 70 61 72 61 6d 65 74 65  the "p" paramete
20cd0 72 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74  r is a pointer t
20ce0 6f 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  o the outer quer
20cf0 79 2e 0a 2a 2a 20 54 68 65 20 73 75 62 71 75 65  y..** The subque
20d00 72 79 20 69 73 20 70 2d 3e 70 53 72 63 2d 3e 61  ry is p->pSrc->a
20d10 5b 69 46 72 6f 6d 5d 2e 20 20 69 73 41 67 67 20  [iFrom].  isAgg 
20d20 69 73 20 74 72 75 65 20 69 66 20 74 68 65 20 6f  is true if the o
20d30 75 74 65 72 20 71 75 65 72 79 0a 2a 2a 20 75 73  uter query.** us
20d40 65 73 20 61 67 67 72 65 67 61 74 65 73 2e 0a 2a  es aggregates..*
20d50 2a 0a 2a 2a 20 49 66 20 66 6c 61 74 74 65 6e 69  *.** If flatteni
20d60 6e 67 20 69 73 20 6e 6f 74 20 61 74 74 65 6d 70  ng is not attemp
20d70 74 65 64 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  ted, this routin
20d80 65 20 69 73 20 61 20 6e 6f 2d 6f 70 20 61 6e 64  e is a no-op and
20d90 20 72 65 74 75 72 6e 73 20 30 2e 0a 2a 2a 20 49   returns 0..** I
20da0 66 20 66 6c 61 74 74 65 6e 69 6e 67 20 69 73 20  f flattening is 
20db0 61 74 74 65 6d 70 74 65 64 20 74 68 69 73 20 72  attempted this r
20dc0 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 31  outine returns 1
20dd0 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 6f 66 20 74  ..**.** All of t
20de0 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 61 6e  he expression an
20df0 61 6c 79 73 69 73 20 6d 75 73 74 20 6f 63 63 75  alysis must occu
20e00 72 20 6f 6e 20 62 6f 74 68 20 74 68 65 20 6f 75  r on both the ou
20e10 74 65 72 20 71 75 65 72 79 20 61 6e 64 0a 2a 2a  ter query and.**
20e20 20 74 68 65 20 73 75 62 71 75 65 72 79 20 62 65   the subquery be
20e30 66 6f 72 65 20 74 68 69 73 20 72 6f 75 74 69 6e  fore this routin
20e40 65 20 72 75 6e 73 2e 0a 2a 2f 0a 73 74 61 74 69  e runs..*/.stati
20e50 63 20 69 6e 74 20 66 6c 61 74 74 65 6e 53 75 62  c int flattenSub
20e60 71 75 65 72 79 28 0a 20 20 50 61 72 73 65 20 2a  query(.  Parse *
20e70 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 2f 2a  pParse,       /*
20e80 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
20e90 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c   */.  Select *p,
20ea0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
20eb0 65 20 70 61 72 65 6e 74 20 6f 72 20 6f 75 74 65  e parent or oute
20ec0 72 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  r SELECT stateme
20ed0 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 69 46 72 6f  nt */.  int iFro
20ee0 6d 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  m,           /* 
20ef0 49 6e 64 65 78 20 69 6e 20 70 2d 3e 70 53 72 63  Index in p->pSrc
20f00 2d 3e 61 5b 5d 20 6f 66 20 74 68 65 20 69 6e 6e  ->a[] of the inn
20f10 65 72 20 73 75 62 71 75 65 72 79 20 2a 2f 0a 20  er subquery */. 
20f20 20 69 6e 74 20 69 73 41 67 67 20 20 20 20 20 20   int isAgg      
20f30 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
20f40 20 6f 75 74 65 72 20 53 45 4c 45 43 54 20 75 73   outer SELECT us
20f50 65 73 20 61 67 67 72 65 67 61 74 65 20 66 75 6e  es aggregate fun
20f60 63 74 69 6f 6e 73 20 2a 2f 0a 29 7b 0a 20 20 63  ctions */.){.  c
20f70 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 61 76 65  onst char *zSave
20f80 64 41 75 74 68 43 6f 6e 74 65 78 74 20 3d 20 70  dAuthContext = p
20f90 50 61 72 73 65 2d 3e 7a 41 75 74 68 43 6f 6e 74  Parse->zAuthCont
20fa0 65 78 74 3b 0a 20 20 53 65 6c 65 63 74 20 2a 70  ext;.  Select *p
20fb0 50 61 72 65 6e 74 3b 20 20 20 20 2f 2a 20 43 75  Parent;    /* Cu
20fc0 72 72 65 6e 74 20 55 4e 49 4f 4e 20 41 4c 4c 20  rrent UNION ALL 
20fd0 74 65 72 6d 20 6f 66 20 74 68 65 20 6f 74 68 65  term of the othe
20fe0 72 20 71 75 65 72 79 20 2a 2f 0a 20 20 53 65 6c  r query */.  Sel
20ff0 65 63 74 20 2a 70 53 75 62 3b 20 20 20 20 20 20  ect *pSub;      
21000 20 2f 2a 20 54 68 65 20 69 6e 6e 65 72 20 71 75   /* The inner qu
21010 65 72 79 20 6f 72 20 22 73 75 62 71 75 65 72 79  ery or "subquery
21020 22 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70  " */.  Select *p
21030 53 75 62 31 3b 20 20 20 20 20 20 2f 2a 20 50 6f  Sub1;      /* Po
21040 69 6e 74 65 72 20 74 6f 20 74 68 65 20 72 69 67  inter to the rig
21050 68 74 6d 6f 73 74 20 73 65 6c 65 63 74 20 69 6e  htmost select in
21060 20 73 75 62 2d 71 75 65 72 79 20 2a 2f 0a 20 20   sub-query */.  
21070 53 72 63 4c 69 73 74 20 2a 70 53 72 63 3b 20 20  SrcList *pSrc;  
21080 20 20 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20      /* The FROM 
21090 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 6f 75  clause of the ou
210a0 74 65 72 20 71 75 65 72 79 20 2a 2f 0a 20 20 53  ter query */.  S
210b0 72 63 4c 69 73 74 20 2a 70 53 75 62 53 72 63 3b  rcList *pSubSrc;
210c0 20 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63     /* The FROM c
210d0 6c 61 75 73 65 20 6f 66 20 74 68 65 20 73 75 62  lause of the sub
210e0 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20 69  query */.  int i
210f0 50 61 72 65 6e 74 3b 20 20 20 20 20 20 20 20 2f  Parent;        /
21100 2a 20 56 44 42 45 20 63 75 72 73 6f 72 20 6e 75  * VDBE cursor nu
21110 6d 62 65 72 20 6f 66 20 74 68 65 20 70 53 75 62  mber of the pSub
21120 20 72 65 73 75 6c 74 20 73 65 74 20 74 65 6d 70   result set temp
21130 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20   table */.  int 
21140 69 4e 65 77 50 61 72 65 6e 74 20 3d 20 2d 31 3b  iNewParent = -1;
21150 2f 2a 20 52 65 70 6c 61 63 65 6d 65 6e 74 20 74  /* Replacement t
21160 61 62 6c 65 20 66 6f 72 20 69 50 61 72 65 6e 74  able for iParent
21170 20 2a 2f 0a 20 20 69 6e 74 20 69 73 4c 65 66 74   */.  int isLeft
21180 4a 6f 69 6e 20 3d 20 30 3b 20 2f 2a 20 54 72 75  Join = 0; /* Tru
21190 65 20 69 66 20 70 53 75 62 20 69 73 20 74 68 65  e if pSub is the
211a0 20 72 69 67 68 74 20 73 69 64 65 20 6f 66 20 61   right side of a
211b0 20 4c 45 46 54 20 4a 4f 49 4e 20 2a 2f 20 20 20   LEFT JOIN */   
211c0 20 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20   .  int i;      
211d0 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
211e0 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 45 78 70  counter */.  Exp
211f0 72 20 2a 70 57 68 65 72 65 3b 20 20 20 20 20 20  r *pWhere;      
21200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
21210 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   The WHERE claus
21220 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72  e */.  struct Sr
21230 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53 75 62  cList_item *pSub
21240 69 74 65 6d 3b 20 20 20 2f 2a 20 54 68 65 20 73  item;   /* The s
21250 75 62 71 75 65 72 79 20 2a 2f 0a 20 20 73 71 6c  ubquery */.  sql
21260 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
21270 65 2d 3e 64 62 3b 0a 0a 20 20 2f 2a 20 43 68 65  e->db;..  /* Che
21280 63 6b 20 74 6f 20 73 65 65 20 69 66 20 66 6c 61  ck to see if fla
21290 74 74 65 6e 69 6e 67 20 69 73 20 70 65 72 6d 69  ttening is permi
212a0 74 74 65 64 2e 20 20 52 65 74 75 72 6e 20 30 20  tted.  Return 0 
212b0 69 66 20 6e 6f 74 2e 0a 20 20 2a 2f 0a 20 20 61  if not..  */.  a
212c0 73 73 65 72 74 28 20 70 21 3d 30 20 29 3b 0a 20  ssert( p!=0 );. 
212d0 20 61 73 73 65 72 74 28 20 70 2d 3e 70 50 72 69   assert( p->pPri
212e0 6f 72 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 4f  or==0 );.  if( O
212f0 70 74 69 6d 69 7a 61 74 69 6f 6e 44 69 73 61 62  ptimizationDisab
21300 6c 65 64 28 64 62 2c 20 53 51 4c 49 54 45 5f 51  led(db, SQLITE_Q
21310 75 65 72 79 46 6c 61 74 74 65 6e 65 72 29 20 29  ueryFlattener) )
21320 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 53 72   return 0;.  pSr
21330 63 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 61  c = p->pSrc;.  a
21340 73 73 65 72 74 28 20 70 53 72 63 20 26 26 20 69  ssert( pSrc && i
21350 46 72 6f 6d 3e 3d 30 20 26 26 20 69 46 72 6f 6d  From>=0 && iFrom
21360 3c 70 53 72 63 2d 3e 6e 53 72 63 20 29 3b 0a 20  <pSrc->nSrc );. 
21370 20 70 53 75 62 69 74 65 6d 20 3d 20 26 70 53 72   pSubitem = &pSr
21380 63 2d 3e 61 5b 69 46 72 6f 6d 5d 3b 0a 20 20 69  c->a[iFrom];.  i
21390 50 61 72 65 6e 74 20 3d 20 70 53 75 62 69 74 65  Parent = pSubite
213a0 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a 20 20 70 53  m->iCursor;.  pS
213b0 75 62 20 3d 20 70 53 75 62 69 74 65 6d 2d 3e 70  ub = pSubitem->p
213c0 53 65 6c 65 63 74 3b 0a 20 20 61 73 73 65 72 74  Select;.  assert
213d0 28 20 70 53 75 62 21 3d 30 20 29 3b 0a 0a 23 69  ( pSub!=0 );..#i
213e0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
213f0 54 5f 57 49 4e 44 4f 57 46 55 4e 43 0a 20 20 69  T_WINDOWFUNC.  i
21400 66 28 20 70 2d 3e 70 57 69 6e 20 7c 7c 20 70 53  f( p->pWin || pS
21410 75 62 2d 3e 70 57 69 6e 20 29 20 72 65 74 75 72  ub->pWin ) retur
21420 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  n 0;            
21430 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63        /* Restric
21440 74 69 6f 6e 20 28 32 35 29 20 2a 2f 0a 23 65 6e  tion (25) */.#en
21450 64 69 66 0a 0a 20 20 70 53 75 62 53 72 63 20 3d  dif..  pSubSrc =
21460 20 70 53 75 62 2d 3e 70 53 72 63 3b 0a 20 20 61   pSub->pSrc;.  a
21470 73 73 65 72 74 28 20 70 53 75 62 53 72 63 20 29  ssert( pSubSrc )
21480 3b 0a 20 20 2f 2a 20 50 72 69 6f 72 20 74 6f 20  ;.  /* Prior to 
21490 76 65 72 73 69 6f 6e 20 33 2e 31 2e 32 2c 20 77  version 3.1.2, w
214a0 68 65 6e 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46  hen LIMIT and OF
214b0 46 53 45 54 20 68 61 64 20 74 6f 20 62 65 20 73  FSET had to be s
214c0 69 6d 70 6c 65 20 63 6f 6e 73 74 61 6e 74 73 2c  imple constants,
214d0 0a 20 20 2a 2a 20 6e 6f 74 20 61 72 62 69 74 72  .  ** not arbitr
214e0 61 72 79 20 65 78 70 72 65 73 73 69 6f 6e 73 2c  ary expressions,
214f0 20 77 65 20 61 6c 6c 6f 77 65 64 20 73 6f 6d 65   we allowed some
21500 20 63 6f 6d 62 69 6e 69 6e 67 20 6f 66 20 4c 49   combining of LI
21510 4d 49 54 20 61 6e 64 20 4f 46 46 53 45 54 0a 20  MIT and OFFSET. 
21520 20 2a 2a 20 62 65 63 61 75 73 65 20 74 68 65 79   ** because they
21530 20 63 6f 75 6c 64 20 62 65 20 63 6f 6d 70 75 74   could be comput
21540 65 64 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69  ed at compile-ti
21550 6d 65 2e 20 20 42 75 74 20 77 68 65 6e 20 4c 49  me.  But when LI
21560 4d 49 54 20 61 6e 64 20 4f 46 46 53 45 54 0a 20  MIT and OFFSET. 
21570 20 2a 2a 20 62 65 63 61 6d 65 20 61 72 62 69 74   ** became arbit
21580 72 61 72 79 20 65 78 70 72 65 73 73 69 6f 6e 73  rary expressions
21590 2c 20 77 65 20 77 65 72 65 20 66 6f 72 63 65 64  , we were forced
215a0 20 74 6f 20 61 64 64 20 72 65 73 74 72 69 63 74   to add restrict
215b0 69 6f 6e 73 20 28 31 33 29 0a 20 20 2a 2a 20 61  ions (13).  ** a
215c0 6e 64 20 28 31 34 29 2e 20 2a 2f 0a 20 20 69 66  nd (14). */.  if
215d0 28 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20 26  ( pSub->pLimit &
215e0 26 20 70 2d 3e 70 4c 69 6d 69 74 20 29 20 72 65  & p->pLimit ) re
215f0 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20  turn 0;         
21600 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74       /* Restrict
21610 69 6f 6e 20 28 31 33 29 20 2a 2f 0a 20 20 69 66  ion (13) */.  if
21620 28 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20 26  ( pSub->pLimit &
21630 26 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74 2d 3e  & pSub->pLimit->
21640 70 52 69 67 68 74 20 29 20 72 65 74 75 72 6e 20  pRight ) return 
21650 30 3b 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74  0;   /* Restrict
21660 69 6f 6e 20 28 31 34 29 20 2a 2f 0a 20 20 69 66  ion (14) */.  if
21670 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26  ( (p->selFlags &
21680 20 53 46 5f 43 6f 6d 70 6f 75 6e 64 29 21 3d 30   SF_Compound)!=0
21690 20 26 26 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74   && pSub->pLimit
216a0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
216b0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
216c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
216d0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
216e0 52 65 73 74 72 69 63 74 69 6f 6e 20 28 31 35 29  Restriction (15)
216f0 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20 70 53   */.  }.  if( pS
21700 75 62 53 72 63 2d 3e 6e 53 72 63 3d 3d 30 20 29  ubSrc->nSrc==0 )
21710 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20   return 0;      
21720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21730 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20   /* Restriction 
21740 28 37 29 20 20 2a 2f 0a 20 20 69 66 28 20 70 53  (7)  */.  if( pS
21750 75 62 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53  ub->selFlags & S
21760 46 5f 44 69 73 74 69 6e 63 74 20 29 20 72 65 74  F_Distinct ) ret
21770 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20  urn 0;          
21780 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20   /* Restriction 
21790 28 34 29 20 20 2a 2f 0a 20 20 69 66 28 20 70 53  (4)  */.  if( pS
217a0 75 62 2d 3e 70 4c 69 6d 69 74 20 26 26 20 28 70  ub->pLimit && (p
217b0 53 72 63 2d 3e 6e 53 72 63 3e 31 20 7c 7c 20 69  Src->nSrc>1 || i
217c0 73 41 67 67 29 20 29 7b 0a 20 20 20 20 20 72 65  sAgg) ){.     re
217d0 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20  turn 0;         
217e0 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 73 20  /* Restrictions 
217f0 28 38 29 28 39 29 20 2a 2f 0a 20 20 7d 0a 20 20  (8)(9) */.  }.  
21800 69 66 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 20  if( p->pOrderBy 
21810 26 26 20 70 53 75 62 2d 3e 70 4f 72 64 65 72 42  && pSub->pOrderB
21820 79 20 29 7b 0a 20 20 20 20 20 72 65 74 75 72 6e  y ){.     return
21830 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
21840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
21860 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28 31 31   Restriction (11
21870 29 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20 69  ) */.  }.  if( i
21880 73 41 67 67 20 26 26 20 70 53 75 62 2d 3e 70 4f  sAgg && pSub->pO
21890 72 64 65 72 42 79 20 29 20 72 65 74 75 72 6e 20  rderBy ) return 
218a0 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
218b0 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e    /* Restriction
218c0 20 28 31 36 29 20 2a 2f 0a 20 20 69 66 28 20 70   (16) */.  if( p
218d0 53 75 62 2d 3e 70 4c 69 6d 69 74 20 26 26 20 70  Sub->pLimit && p
218e0 2d 3e 70 57 68 65 72 65 20 29 20 72 65 74 75 72  ->pWhere ) retur
218f0 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  n 0;            
21900 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e    /* Restriction
21910 20 28 31 39 29 20 2a 2f 0a 20 20 69 66 28 20 70   (19) */.  if( p
21920 53 75 62 2d 3e 70 4c 69 6d 69 74 20 26 26 20 28  Sub->pLimit && (
21930 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46  p->selFlags & SF
21940 5f 44 69 73 74 69 6e 63 74 29 21 3d 30 20 29 7b  _Distinct)!=0 ){
21950 0a 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20  .     return 0; 
21960 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72          /* Restr
21970 69 63 74 69 6f 6e 20 28 32 31 29 20 2a 2f 0a 20  iction (21) */. 
21980 20 7d 0a 20 20 69 66 28 20 70 53 75 62 2d 3e 73   }.  if( pSub->s
21990 65 6c 46 6c 61 67 73 20 26 20 28 53 46 5f 52 65  elFlags & (SF_Re
219a0 63 75 72 73 69 76 65 29 20 29 7b 0a 20 20 20 20  cursive) ){.    
219b0 72 65 74 75 72 6e 20 30 3b 20 2f 2a 20 52 65 73  return 0; /* Res
219c0 74 72 69 63 74 69 6f 6e 73 20 28 32 32 29 20 2a  trictions (22) *
219d0 2f 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a  /.  }..  /*.  **
219e0 20 49 66 20 74 68 65 20 73 75 62 71 75 65 72 79   If the subquery
219f0 20 69 73 20 74 68 65 20 72 69 67 68 74 20 6f 70   is the right op
21a00 65 72 61 6e 64 20 6f 66 20 61 20 4c 45 46 54 20  erand of a LEFT 
21a10 4a 4f 49 4e 2c 20 74 68 65 6e 20 74 68 65 0a 20  JOIN, then the. 
21a20 20 2a 2a 20 73 75 62 71 75 65 72 79 20 6d 61 79   ** subquery may
21a30 20 6e 6f 74 20 62 65 20 61 20 6a 6f 69 6e 20 69   not be a join i
21a40 74 73 65 6c 66 20 28 33 61 29 2e 20 45 78 61 6d  tself (3a). Exam
21a50 70 6c 65 20 6f 66 20 77 68 79 20 74 68 69 73 20  ple of why this 
21a60 69 73 20 6e 6f 74 0a 20 20 2a 2a 20 61 6c 6c 6f  is not.  ** allo
21a70 77 65 64 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  wed:.  **.  **  
21a80 20 20 20 20 20 20 20 74 31 20 4c 45 46 54 20 4f         t1 LEFT O
21a90 55 54 45 52 20 4a 4f 49 4e 20 28 74 32 20 4a 4f  UTER JOIN (t2 JO
21aa0 49 4e 20 74 33 29 0a 20 20 2a 2a 0a 20 20 2a 2a  IN t3).  **.  **
21ab0 20 49 66 20 77 65 20 66 6c 61 74 74 65 6e 20 74   If we flatten t
21ac0 68 65 20 61 62 6f 76 65 2c 20 77 65 20 77 6f 75  he above, we wou
21ad0 6c 64 20 67 65 74 0a 20 20 2a 2a 0a 20 20 2a 2a  ld get.  **.  **
21ae0 20 20 20 20 20 20 20 20 20 28 74 31 20 4c 45 46           (t1 LEF
21af0 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20 74 32 29  T OUTER JOIN t2)
21b00 20 4a 4f 49 4e 20 74 33 0a 20 20 2a 2a 0a 20 20   JOIN t3.  **.  
21b10 2a 2a 20 77 68 69 63 68 20 69 73 20 6e 6f 74 20  ** which is not 
21b20 61 74 20 61 6c 6c 20 74 68 65 20 73 61 6d 65 20  at all the same 
21b30 74 68 69 6e 67 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  thing..  **.  **
21b40 20 49 66 20 74 68 65 20 73 75 62 71 75 65 72 79   If the subquery
21b50 20 69 73 20 74 68 65 20 72 69 67 68 74 20 6f 70   is the right op
21b60 65 72 61 6e 64 20 6f 66 20 61 20 4c 45 46 54 20  erand of a LEFT 
21b70 4a 4f 49 4e 2c 20 74 68 65 6e 20 74 68 65 20 6f  JOIN, then the o
21b80 75 74 65 72 0a 20 20 2a 2a 20 71 75 65 72 79 20  uter.  ** query 
21b90 63 61 6e 6e 6f 74 20 62 65 20 61 6e 20 61 67 67  cannot be an agg
21ba0 72 65 67 61 74 65 2e 20 28 33 63 29 20 20 54 68  regate. (3c)  Th
21bb0 69 73 20 69 73 20 61 6e 20 61 72 74 69 66 61 63  is is an artifac
21bc0 74 20 6f 66 20 74 68 65 20 77 61 79 0a 20 20 2a  t of the way.  *
21bd0 2a 20 61 67 67 72 65 67 61 74 65 73 20 61 72 65  * aggregates are
21be0 20 70 72 6f 63 65 73 73 65 64 20 2d 20 74 68 65   processed - the
21bf0 72 65 20 69 73 20 6e 6f 20 6d 65 63 68 61 6e 69  re is no mechani
21c00 73 6d 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20  sm to determine 
21c10 69 66 0a 20 20 2a 2a 20 74 68 65 20 4c 45 46 54  if.  ** the LEFT
21c20 20 4a 4f 49 4e 20 74 61 62 6c 65 20 73 68 6f 75   JOIN table shou
21c30 6c 64 20 62 65 20 61 6c 6c 2d 4e 55 4c 4c 2e 0a  ld be all-NULL..
21c40 20 20 2a 2a 0a 20 20 2a 2a 20 53 65 65 20 61 6c    **.  ** See al
21c50 73 6f 20 74 69 63 6b 65 74 73 20 23 33 30 36 2c  so tickets #306,
21c60 20 23 33 35 30 2c 20 61 6e 64 20 23 33 33 30 30   #350, and #3300
21c70 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 70 53  ..  */.  if( (pS
21c80 75 62 69 74 65 6d 2d 3e 66 67 2e 6a 6f 69 6e 74  ubitem->fg.joint
21c90 79 70 65 20 26 20 4a 54 5f 4f 55 54 45 52 29 21  ype & JT_OUTER)!
21ca0 3d 30 20 29 7b 0a 20 20 20 20 69 73 4c 65 66 74  =0 ){.    isLeft
21cb0 4a 6f 69 6e 20 3d 20 31 3b 0a 20 20 20 20 69 66  Join = 1;.    if
21cc0 28 20 70 53 75 62 53 72 63 2d 3e 6e 53 72 63 3e  ( pSubSrc->nSrc>
21cd0 31 20 7c 7c 20 69 73 41 67 67 20 7c 7c 20 49 73  1 || isAgg || Is
21ce0 56 69 72 74 75 61 6c 28 70 53 75 62 53 72 63 2d  Virtual(pSubSrc-
21cf0 3e 61 5b 30 5d 2e 70 54 61 62 29 20 29 7b 0a 20  >a[0].pTab) ){. 
21d00 20 20 20 20 20 2f 2a 20 20 28 33 61 29 20 20 20       /*  (3a)   
21d10 20 20 20 20 20 20 20 20 20 20 28 33 63 29 20 20            (3c)  
21d20 20 20 20 28 33 62 29 20 2a 2f 0a 20 20 20 20 20     (3b) */.     
21d30 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d   return 0;.    }
21d40 0a 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49  .  }.#ifdef SQLI
21d50 54 45 5f 45 58 54 52 41 5f 49 46 4e 55 4c 4c 52  TE_EXTRA_IFNULLR
21d60 4f 57 0a 20 20 65 6c 73 65 20 69 66 28 20 69 46  OW.  else if( iF
21d70 72 6f 6d 3e 30 20 26 26 20 21 69 73 41 67 67 20  rom>0 && !isAgg 
21d80 29 7b 0a 20 20 20 20 2f 2a 20 53 65 74 74 69 6e  ){.    /* Settin
21d90 67 20 69 73 4c 65 66 74 4a 6f 69 6e 20 74 6f 20  g isLeftJoin to 
21da0 2d 31 20 63 61 75 73 65 73 20 4f 50 5f 49 66 4e  -1 causes OP_IfN
21db0 75 6c 6c 52 6f 77 20 6f 70 63 6f 64 65 73 20 74  ullRow opcodes t
21dc0 6f 20 62 65 20 67 65 6e 65 72 61 74 65 64 20 66  o be generated f
21dd0 6f 72 0a 20 20 20 20 2a 2a 20 65 76 65 72 79 20  or.    ** every 
21de0 72 65 66 65 72 65 6e 63 65 20 74 6f 20 61 6e 79  reference to any
21df0 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 20 66   result column f
21e00 72 6f 6d 20 73 75 62 71 75 65 72 79 20 69 6e 20  rom subquery in 
21e10 61 20 6a 6f 69 6e 2c 20 65 76 65 6e 0a 20 20 20  a join, even.   
21e20 20 2a 2a 20 74 68 6f 75 67 68 20 74 68 65 79 20   ** though they 
21e30 61 72 65 20 6e 6f 74 20 6e 65 63 65 73 73 61 72  are not necessar
21e40 79 2e 20 20 54 68 69 73 20 77 69 6c 6c 20 73 74  y.  This will st
21e50 72 65 73 73 2d 74 65 73 74 20 74 68 65 20 4f 50  ress-test the OP
21e60 5f 49 66 4e 75 6c 6c 52 6f 77 20 0a 20 20 20 20  _IfNullRow .    
21e70 2a 2a 20 6f 70 63 6f 64 65 2e 20 2a 2f 0a 20 20  ** opcode. */.  
21e80 20 20 69 73 4c 65 66 74 4a 6f 69 6e 20 3d 20 2d    isLeftJoin = -
21e90 31 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  1;.  }.#endif.. 
21ea0 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20   /* Restriction 
21eb0 28 31 37 29 3a 20 49 66 20 74 68 65 20 73 75 62  (17): If the sub
21ec0 2d 71 75 65 72 79 20 69 73 20 61 20 63 6f 6d 70  -query is a comp
21ed0 6f 75 6e 64 20 53 45 4c 45 43 54 2c 20 74 68 65  ound SELECT, the
21ee0 6e 20 69 74 20 6d 75 73 74 0a 20 20 2a 2a 20 75  n it must.  ** u
21ef0 73 65 20 6f 6e 6c 79 20 74 68 65 20 55 4e 49 4f  se only the UNIO
21f00 4e 20 41 4c 4c 20 6f 70 65 72 61 74 6f 72 2e 20  N ALL operator. 
21f10 41 6e 64 20 6e 6f 6e 65 20 6f 66 20 74 68 65 20  And none of the 
21f20 73 69 6d 70 6c 65 20 73 65 6c 65 63 74 20 71 75  simple select qu
21f30 65 72 69 65 73 0a 20 20 2a 2a 20 74 68 61 74 20  eries.  ** that 
21f40 6d 61 6b 65 20 75 70 20 74 68 65 20 63 6f 6d 70  make up the comp
21f50 6f 75 6e 64 20 53 45 4c 45 43 54 20 61 72 65 20  ound SELECT are 
21f60 61 6c 6c 6f 77 65 64 20 74 6f 20 62 65 20 61 67  allowed to be ag
21f70 67 72 65 67 61 74 65 20 6f 72 20 64 69 73 74 69  gregate or disti
21f80 6e 63 74 0a 20 20 2a 2a 20 71 75 65 72 69 65 73  nct.  ** queries
21f90 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 53 75  ..  */.  if( pSu
21fa0 62 2d 3e 70 50 72 69 6f 72 20 29 7b 0a 20 20 20  b->pPrior ){.   
21fb0 20 69 66 28 20 70 53 75 62 2d 3e 70 4f 72 64 65   if( pSub->pOrde
21fc0 72 42 79 20 29 7b 0a 20 20 20 20 20 20 72 65 74  rBy ){.      ret
21fd0 75 72 6e 20 30 3b 20 20 2f 2a 20 52 65 73 74 72  urn 0;  /* Restr
21fe0 69 63 74 69 6f 6e 20 28 32 30 29 20 2a 2f 0a 20  iction (20) */. 
21ff0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 73 41     }.    if( isA
22000 67 67 20 7c 7c 20 28 70 2d 3e 73 65 6c 46 6c 61  gg || (p->selFla
22010 67 73 20 26 20 53 46 5f 44 69 73 74 69 6e 63 74  gs & SF_Distinct
22020 29 21 3d 30 20 7c 7c 20 70 53 72 63 2d 3e 6e 53  )!=0 || pSrc->nS
22030 72 63 21 3d 31 20 29 7b 0a 20 20 20 20 20 20 72  rc!=1 ){.      r
22040 65 74 75 72 6e 20 30 3b 20 2f 2a 20 28 31 37 64  eturn 0; /* (17d
22050 31 29 2c 20 28 31 37 64 32 29 2c 20 6f 72 20 28  1), (17d2), or (
22060 31 37 64 33 29 20 2a 2f 0a 20 20 20 20 7d 0a 20  17d3) */.    }. 
22070 20 20 20 66 6f 72 28 70 53 75 62 31 3d 70 53 75     for(pSub1=pSu
22080 62 3b 20 70 53 75 62 31 3b 20 70 53 75 62 31 3d  b; pSub1; pSub1=
22090 70 53 75 62 31 2d 3e 70 50 72 69 6f 72 29 7b 0a  pSub1->pPrior){.
220a0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
220b0 28 70 53 75 62 31 2d 3e 73 65 6c 46 6c 61 67 73  (pSub1->selFlags
220c0 20 26 20 28 53 46 5f 44 69 73 74 69 6e 63 74 7c   & (SF_Distinct|
220d0 53 46 5f 41 67 67 72 65 67 61 74 65 29 29 3d 3d  SF_Aggregate))==
220e0 53 46 5f 44 69 73 74 69 6e 63 74 20 29 3b 0a 20  SF_Distinct );. 
220f0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 28       testcase( (
22100 70 53 75 62 31 2d 3e 73 65 6c 46 6c 61 67 73 20  pSub1->selFlags 
22110 26 20 28 53 46 5f 44 69 73 74 69 6e 63 74 7c 53  & (SF_Distinct|S
22120 46 5f 41 67 67 72 65 67 61 74 65 29 29 3d 3d 53  F_Aggregate))==S
22130 46 5f 41 67 67 72 65 67 61 74 65 20 29 3b 0a 20  F_Aggregate );. 
22140 20 20 20 20 20 61 73 73 65 72 74 28 20 70 53 75       assert( pSu
22150 62 2d 3e 70 53 72 63 21 3d 30 20 29 3b 0a 20 20  b->pSrc!=0 );.  
22160 20 20 20 20 61 73 73 65 72 74 28 20 70 53 75 62      assert( pSub
22170 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3d  ->pEList->nExpr=
22180 3d 70 53 75 62 31 2d 3e 70 45 4c 69 73 74 2d 3e  =pSub1->pEList->
22190 6e 45 78 70 72 20 29 3b 0a 20 20 20 20 20 20 69  nExpr );.      i
221a0 66 28 20 28 70 53 75 62 31 2d 3e 73 65 6c 46 6c  f( (pSub1->selFl
221b0 61 67 73 20 26 20 28 53 46 5f 44 69 73 74 69 6e  ags & (SF_Distin
221c0 63 74 7c 53 46 5f 41 67 67 72 65 67 61 74 65 29  ct|SF_Aggregate)
221d0 29 21 3d 30 20 20 20 20 2f 2a 20 28 31 37 62 29  )!=0    /* (17b)
221e0 20 2a 2f 0a 20 20 20 20 20 20 20 7c 7c 20 28 70   */.       || (p
221f0 53 75 62 31 2d 3e 70 50 72 69 6f 72 20 26 26 20  Sub1->pPrior && 
22200 70 53 75 62 31 2d 3e 6f 70 21 3d 54 4b 5f 41 4c  pSub1->op!=TK_AL
22210 4c 29 20 20 20 20 20 20 20 20 20 20 20 20 20 20  L)              
22220 20 20 20 2f 2a 20 28 31 37 61 29 20 2a 2f 0a 20     /* (17a) */. 
22230 20 20 20 20 20 20 7c 7c 20 70 53 75 62 31 2d 3e        || pSub1->
22240 70 53 72 63 2d 3e 6e 53 72 63 3c 31 20 20 20 20  pSrc->nSrc<1    
22250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
22270 20 28 31 37 63 29 20 2a 2f 0a 20 20 20 20 20 20   (17c) */.      
22280 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
22290 6e 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  n 0;.      }.   
222a0 20 20 20 74 65 73 74 63 61 73 65 28 20 70 53 75     testcase( pSu
222b0 62 31 2d 3e 70 53 72 63 2d 3e 6e 53 72 63 3e 31  b1->pSrc->nSrc>1
222c0 20 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f   );.    }..    /
222d0 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28 31  * Restriction (1
222e0 38 29 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70  8). */.    if( p
222f0 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20  ->pOrderBy ){.  
22300 20 20 20 20 69 6e 74 20 69 69 3b 0a 20 20 20 20      int ii;.    
22310 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70    for(ii=0; ii<p
22320 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70  ->pOrderBy->nExp
22330 72 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20  r; ii++){.      
22340 20 20 69 66 28 20 70 2d 3e 70 4f 72 64 65 72 42    if( p->pOrderB
22350 79 2d 3e 61 5b 69 69 5d 2e 75 2e 78 2e 69 4f 72  y->a[ii].u.x.iOr
22360 64 65 72 42 79 43 6f 6c 3d 3d 30 20 29 20 72 65  derByCol==0 ) re
22370 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d 0a  turn 0;.      }.
22380 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
22390 45 78 2d 72 65 73 74 72 69 63 74 69 6f 6e 20 28  Ex-restriction (
223a0 32 33 29 3a 0a 20 20 2a 2a 20 54 68 65 20 6f 6e  23):.  ** The on
223b0 6c 79 20 77 61 79 20 74 68 61 74 20 74 68 65 20  ly way that the 
223c0 72 65 63 75 72 73 69 76 65 20 70 61 72 74 20 6f  recursive part o
223d0 66 20 61 20 43 54 45 20 63 61 6e 20 63 6f 6e 74  f a CTE can cont
223e0 61 69 6e 20 61 20 63 6f 6d 70 6f 75 6e 64 0a 20  ain a compound. 
223f0 20 2a 2a 20 73 75 62 71 75 65 72 79 20 69 73 20   ** subquery is 
22400 66 6f 72 20 74 68 65 20 73 75 62 71 75 65 72 79  for the subquery
22410 20 74 6f 20 62 65 20 6f 6e 65 20 74 65 72 6d 20   to be one term 
22420 6f 66 20 61 20 6a 6f 69 6e 2e 20 20 42 75 74 20  of a join.  But 
22430 69 66 20 74 68 65 0a 20 20 2a 2a 20 73 75 62 71  if the.  ** subq
22440 75 65 72 79 20 69 73 20 61 20 6a 6f 69 6e 2c 20  uery is a join, 
22450 74 68 65 6e 20 74 68 65 20 66 6c 61 74 74 65 6e  then the flatten
22460 69 6e 67 20 68 61 73 20 61 6c 72 65 61 64 79 20  ing has already 
22470 62 65 65 6e 20 73 74 6f 70 70 65 64 20 62 79 0a  been stopped by.
22480 20 20 2a 2a 20 72 65 73 74 72 69 63 74 69 6f 6e    ** restriction
22490 20 28 31 37 64 33 29 0a 20 20 2a 2f 0a 20 20 61   (17d3).  */.  a
224a0 73 73 65 72 74 28 20 28 70 2d 3e 73 65 6c 46 6c  ssert( (p->selFl
224b0 61 67 73 20 26 20 53 46 5f 52 65 63 75 72 73 69  ags & SF_Recursi
224c0 76 65 29 3d 3d 30 20 7c 7c 20 70 53 75 62 2d 3e  ve)==0 || pSub->
224d0 70 50 72 69 6f 72 3d 3d 30 20 29 3b 0a 0a 20 20  pPrior==0 );..  
224e0 2f 2a 2a 2a 2a 2a 20 49 66 20 77 65 20 72 65 61  /***** If we rea
224f0 63 68 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 66  ch this point, f
22500 6c 61 74 74 65 6e 69 6e 67 20 69 73 20 70 65 72  lattening is per
22510 6d 69 74 74 65 64 2e 20 2a 2a 2a 2a 2a 2f 0a 20  mitted. *****/. 
22520 20 53 45 4c 45 43 54 54 52 41 43 45 28 31 2c 70   SELECTTRACE(1,p
22530 50 61 72 73 65 2c 70 2c 28 22 66 6c 61 74 74 65  Parse,p,("flatte
22540 6e 20 25 75 2e 25 70 20 66 72 6f 6d 20 74 65 72  n %u.%p from ter
22550 6d 20 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20  m %d\n",.       
22560 20 20 20 20 20 20 20 20 20 20 20 20 70 53 75 62              pSub
22570 2d 3e 73 65 6c 49 64 2c 20 70 53 75 62 2c 20 69  ->selId, pSub, i
22580 46 72 6f 6d 29 29 3b 0a 0a 20 20 2f 2a 20 41 75  From));..  /* Au
22590 74 68 6f 72 69 7a 65 20 74 68 65 20 73 75 62 71  thorize the subq
225a0 75 65 72 79 20 2a 2f 0a 20 20 70 50 61 72 73 65  uery */.  pParse
225b0 2d 3e 7a 41 75 74 68 43 6f 6e 74 65 78 74 20 3d  ->zAuthContext =
225c0 20 70 53 75 62 69 74 65 6d 2d 3e 7a 4e 61 6d 65   pSubitem->zName
225d0 3b 0a 20 20 54 45 53 54 4f 4e 4c 59 28 69 20 3d  ;.  TESTONLY(i =
225e0 29 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65  ) sqlite3AuthChe
225f0 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54  ck(pParse, SQLIT
22600 45 5f 53 45 4c 45 43 54 2c 20 30 2c 20 30 2c 20  E_SELECT, 0, 0, 
22610 30 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20  0);.  testcase( 
22620 69 3d 3d 53 51 4c 49 54 45 5f 44 45 4e 59 20 29  i==SQLITE_DENY )
22630 3b 0a 20 20 70 50 61 72 73 65 2d 3e 7a 41 75 74  ;.  pParse->zAut
22640 68 43 6f 6e 74 65 78 74 20 3d 20 7a 53 61 76 65  hContext = zSave
22650 64 41 75 74 68 43 6f 6e 74 65 78 74 3b 0a 0a 20  dAuthContext;.. 
22660 20 2f 2a 20 49 66 20 74 68 65 20 73 75 62 2d 71   /* If the sub-q
22670 75 65 72 79 20 69 73 20 61 20 63 6f 6d 70 6f 75  uery is a compou
22680 6e 64 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  nd SELECT statem
22690 65 6e 74 2c 20 74 68 65 6e 20 28 62 79 20 72 65  ent, then (by re
226a0 73 74 72 69 63 74 69 6f 6e 73 0a 20 20 2a 2a 20  strictions.  ** 
226b0 31 37 20 61 6e 64 20 31 38 20 61 62 6f 76 65 29  17 and 18 above)
226c0 20 69 74 20 6d 75 73 74 20 62 65 20 61 20 55 4e   it must be a UN
226d0 49 4f 4e 20 41 4c 4c 20 61 6e 64 20 74 68 65 20  ION ALL and the 
226e0 70 61 72 65 6e 74 20 71 75 65 72 79 20 6d 75 73  parent query mus
226f0 74 20 0a 20 20 2a 2a 20 62 65 20 6f 66 20 74 68  t .  ** be of th
22700 65 20 66 6f 72 6d 3a 0a 20 20 2a 2a 0a 20 20 2a  e form:.  **.  *
22710 2a 20 20 20 20 20 53 45 4c 45 43 54 20 3c 65 78  *     SELECT <ex
22720 70 72 2d 6c 69 73 74 3e 20 46 52 4f 4d 20 28 3c  pr-list> FROM (<
22730 73 75 62 2d 71 75 65 72 79 3e 29 20 3c 77 68 65  sub-query>) <whe
22740 72 65 2d 63 6c 61 75 73 65 3e 20 0a 20 20 2a 2a  re-clause> .  **
22750 0a 20 20 2a 2a 20 66 6f 6c 6c 6f 77 65 64 20 62  .  ** followed b
22760 79 20 61 6e 79 20 4f 52 44 45 52 20 42 59 2c 20  y any ORDER BY, 
22770 4c 49 4d 49 54 20 61 6e 64 2f 6f 72 20 4f 46 46  LIMIT and/or OFF
22780 53 45 54 20 63 6c 61 75 73 65 73 2e 20 54 68 69  SET clauses. Thi
22790 73 20 62 6c 6f 63 6b 0a 20 20 2a 2a 20 63 72 65  s block.  ** cre
227a0 61 74 65 73 20 4e 2d 31 20 63 6f 70 69 65 73 20  ates N-1 copies 
227b0 6f 66 20 74 68 65 20 70 61 72 65 6e 74 20 71 75  of the parent qu
227c0 65 72 79 20 77 69 74 68 6f 75 74 20 61 6e 79 20  ery without any 
227d0 4f 52 44 45 52 20 42 59 2c 20 4c 49 4d 49 54 20  ORDER BY, LIMIT 
227e0 6f 72 20 0a 20 20 2a 2a 20 4f 46 46 53 45 54 20  or .  ** OFFSET 
227f0 63 6c 61 75 73 65 73 20 61 6e 64 20 6a 6f 69 6e  clauses and join
22800 73 20 74 68 65 6d 20 74 6f 20 74 68 65 20 6c 65  s them to the le
22810 66 74 2d 68 61 6e 64 2d 73 69 64 65 20 6f 66 20  ft-hand-side of 
22820 74 68 65 20 6f 72 69 67 69 6e 61 6c 0a 20 20 2a  the original.  *
22830 2a 20 75 73 69 6e 67 20 55 4e 49 4f 4e 20 41 4c  * using UNION AL
22840 4c 20 6f 70 65 72 61 74 6f 72 73 2e 20 49 6e 20  L operators. In 
22850 74 68 69 73 20 63 61 73 65 20 4e 20 69 73 20 74  this case N is t
22860 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 73 69 6d  he number of sim
22870 70 6c 65 0a 20 20 2a 2a 20 73 65 6c 65 63 74 20  ple.  ** select 
22880 73 74 61 74 65 6d 65 6e 74 73 20 69 6e 20 74 68  statements in th
22890 65 20 63 6f 6d 70 6f 75 6e 64 20 73 75 62 2d 71  e compound sub-q
228a0 75 65 72 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  uery..  **.  ** 
228b0 45 78 61 6d 70 6c 65 3a 0a 20 20 2a 2a 0a 20 20  Example:.  **.  
228c0 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 61 2b  **     SELECT a+
228d0 31 20 46 52 4f 4d 20 28 0a 20 20 2a 2a 20 20 20  1 FROM (.  **   
228e0 20 20 20 20 20 53 45 4c 45 43 54 20 78 20 46 52       SELECT x FR
228f0 4f 4d 20 74 61 62 0a 20 20 2a 2a 20 20 20 20 20  OM tab.  **     
22900 20 20 20 55 4e 49 4f 4e 20 41 4c 4c 0a 20 20 2a     UNION ALL.  *
22910 2a 20 20 20 20 20 20 20 20 53 45 4c 45 43 54 20  *        SELECT 
22920 79 20 46 52 4f 4d 20 74 61 62 0a 20 20 2a 2a 20  y FROM tab.  ** 
22930 20 20 20 20 20 20 20 55 4e 49 4f 4e 20 41 4c 4c         UNION ALL
22940 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 53 45 4c  .  **        SEL
22950 45 43 54 20 61 62 73 28 7a 2a 32 29 20 46 52 4f  ECT abs(z*2) FRO
22960 4d 20 74 61 62 32 0a 20 20 2a 2a 20 20 20 20 20  M tab2.  **     
22970 29 20 57 48 45 52 45 20 61 21 3d 35 20 4f 52 44  ) WHERE a!=5 ORD
22980 45 52 20 42 59 20 31 0a 20 20 2a 2a 0a 20 20 2a  ER BY 1.  **.  *
22990 2a 20 54 72 61 6e 73 66 6f 72 6d 65 64 20 69 6e  * Transformed in
229a0 74 6f 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  to:.  **.  **   
229b0 20 20 53 45 4c 45 43 54 20 78 2b 31 20 46 52 4f    SELECT x+1 FRO
229c0 4d 20 74 61 62 20 57 48 45 52 45 20 78 2b 31 21  M tab WHERE x+1!
229d0 3d 35 0a 20 20 2a 2a 20 20 20 20 20 55 4e 49 4f  =5.  **     UNIO
229e0 4e 20 41 4c 4c 0a 20 20 2a 2a 20 20 20 20 20 53  N ALL.  **     S
229f0 45 4c 45 43 54 20 79 2b 31 20 46 52 4f 4d 20 74  ELECT y+1 FROM t
22a00 61 62 20 57 48 45 52 45 20 79 2b 31 21 3d 35 0a  ab WHERE y+1!=5.
22a10 20 20 2a 2a 20 20 20 20 20 55 4e 49 4f 4e 20 41    **     UNION A
22a20 4c 4c 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c 45  LL.  **     SELE
22a30 43 54 20 61 62 73 28 7a 2a 32 29 2b 31 20 46 52  CT abs(z*2)+1 FR
22a40 4f 4d 20 74 61 62 32 20 57 48 45 52 45 20 61 62  OM tab2 WHERE ab
22a50 73 28 7a 2a 32 29 2b 31 21 3d 35 0a 20 20 2a 2a  s(z*2)+1!=5.  **
22a60 20 20 20 20 20 4f 52 44 45 52 20 42 59 20 31 0a       ORDER BY 1.
22a70 20 20 2a 2a 0a 20 20 2a 2a 20 57 65 20 63 61 6c    **.  ** We cal
22a80 6c 20 74 68 69 73 20 74 68 65 20 22 63 6f 6d 70  l this the "comp
22a90 6f 75 6e 64 2d 73 75 62 71 75 65 72 79 20 66 6c  ound-subquery fl
22aa0 61 74 74 65 6e 69 6e 67 22 2e 0a 20 20 2a 2f 0a  attening"..  */.
22ab0 20 20 66 6f 72 28 70 53 75 62 3d 70 53 75 62 2d    for(pSub=pSub-
22ac0 3e 70 50 72 69 6f 72 3b 20 70 53 75 62 3b 20 70  >pPrior; pSub; p
22ad0 53 75 62 3d 70 53 75 62 2d 3e 70 50 72 69 6f 72  Sub=pSub->pPrior
22ae0 29 7b 0a 20 20 20 20 53 65 6c 65 63 74 20 2a 70  ){.    Select *p
22af0 4e 65 77 3b 0a 20 20 20 20 45 78 70 72 4c 69 73  New;.    ExprLis
22b00 74 20 2a 70 4f 72 64 65 72 42 79 20 3d 20 70 2d  t *pOrderBy = p-
22b10 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 20 20 45  >pOrderBy;.    E
22b20 78 70 72 20 2a 70 4c 69 6d 69 74 20 3d 20 70 2d  xpr *pLimit = p-
22b30 3e 70 4c 69 6d 69 74 3b 0a 20 20 20 20 53 65 6c  >pLimit;.    Sel
22b40 65 63 74 20 2a 70 50 72 69 6f 72 20 3d 20 70 2d  ect *pPrior = p-
22b50 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 70 2d 3e  >pPrior;.    p->
22b60 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20  pOrderBy = 0;.  
22b70 20 20 70 2d 3e 70 53 72 63 20 3d 20 30 3b 0a 20    p->pSrc = 0;. 
22b80 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30     p->pPrior = 0
22b90 3b 0a 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20  ;.    p->pLimit 
22ba0 3d 20 30 3b 0a 20 20 20 20 70 4e 65 77 20 3d 20  = 0;.    pNew = 
22bb0 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70  sqlite3SelectDup
22bc0 28 64 62 2c 20 70 2c 20 30 29 3b 0a 20 20 20 20  (db, p, 0);.    
22bd0 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 70 4c 69 6d  p->pLimit = pLim
22be0 69 74 3b 0a 20 20 20 20 70 2d 3e 70 4f 72 64 65  it;.    p->pOrde
22bf0 72 42 79 20 3d 20 70 4f 72 64 65 72 42 79 3b 0a  rBy = pOrderBy;.
22c00 20 20 20 20 70 2d 3e 70 53 72 63 20 3d 20 70 53      p->pSrc = pS
22c10 72 63 3b 0a 20 20 20 20 70 2d 3e 6f 70 20 3d 20  rc;.    p->op = 
22c20 54 4b 5f 41 4c 4c 3b 0a 20 20 20 20 69 66 28 20  TK_ALL;.    if( 
22c30 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20  pNew==0 ){.     
22c40 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50 72   p->pPrior = pPr
22c50 69 6f 72 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ior;.    }else{.
22c60 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 50 72 69        pNew->pPri
22c70 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20  or = pPrior;.   
22c80 20 20 20 69 66 28 20 70 50 72 69 6f 72 20 29 20     if( pPrior ) 
22c90 70 50 72 69 6f 72 2d 3e 70 4e 65 78 74 20 3d 20  pPrior->pNext = 
22ca0 70 4e 65 77 3b 0a 20 20 20 20 20 20 70 4e 65 77  pNew;.      pNew
22cb0 2d 3e 70 4e 65 78 74 20 3d 20 70 3b 0a 20 20 20  ->pNext = p;.   
22cc0 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70     p->pPrior = p
22cd0 4e 65 77 3b 0a 20 20 20 20 20 20 53 45 4c 45 43  New;.      SELEC
22ce0 54 54 52 41 43 45 28 32 2c 70 50 61 72 73 65 2c  TTRACE(2,pParse,
22cf0 70 2c 28 22 63 6f 6d 70 6f 75 6e 64 2d 73 75 62  p,("compound-sub
22d00 71 75 65 72 79 20 66 6c 61 74 74 65 6e 65 72 22  query flattener"
22d10 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
22d20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
22d30 20 63 72 65 61 74 65 73 20 25 75 20 61 73 20 70   creates %u as p
22d40 65 65 72 5c 6e 22 2c 70 4e 65 77 2d 3e 73 65 6c  eer\n",pNew->sel
22d50 49 64 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Id));.    }.    
22d60 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
22d70 69 6c 65 64 20 29 20 72 65 74 75 72 6e 20 31 3b  iled ) return 1;
22d80 0a 20 20 7d 0a 0a 20 20 2f 2a 20 42 65 67 69 6e  .  }..  /* Begin
22d90 20 66 6c 61 74 74 65 6e 69 6e 67 20 74 68 65 20   flattening the 
22da0 69 46 72 6f 6d 2d 74 68 20 65 6e 74 72 79 20 6f  iFrom-th entry o
22db0 66 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  f the FROM claus
22dc0 65 20 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20 6f  e .  ** in the o
22dd0 75 74 65 72 20 71 75 65 72 79 2e 0a 20 20 2a 2f  uter query..  */
22de0 0a 20 20 70 53 75 62 20 3d 20 70 53 75 62 31 20  .  pSub = pSub1 
22df0 3d 20 70 53 75 62 69 74 65 6d 2d 3e 70 53 65 6c  = pSubitem->pSel
22e00 65 63 74 3b 0a 0a 20 20 2f 2a 20 44 65 6c 65 74  ect;..  /* Delet
22e10 65 20 74 68 65 20 74 72 61 6e 73 69 65 6e 74 20  e the transient 
22e20 74 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 20  table structure 
22e30 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
22e40 74 68 65 0a 20 20 2a 2a 20 73 75 62 71 75 65 72  the.  ** subquer
22e50 79 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  y.  */.  sqlite3
22e60 44 62 46 72 65 65 28 64 62 2c 20 70 53 75 62 69  DbFree(db, pSubi
22e70 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65 29 3b  tem->zDatabase);
22e80 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
22e90 28 64 62 2c 20 70 53 75 62 69 74 65 6d 2d 3e 7a  (db, pSubitem->z
22ea0 4e 61 6d 65 29 3b 0a 20 20 73 71 6c 69 74 65 33  Name);.  sqlite3
22eb0 44 62 46 72 65 65 28 64 62 2c 20 70 53 75 62 69  DbFree(db, pSubi
22ec0 74 65 6d 2d 3e 7a 41 6c 69 61 73 29 3b 0a 20 20  tem->zAlias);.  
22ed0 70 53 75 62 69 74 65 6d 2d 3e 7a 44 61 74 61 62  pSubitem->zDatab
22ee0 61 73 65 20 3d 20 30 3b 0a 20 20 70 53 75 62 69  ase = 0;.  pSubi
22ef0 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 30 3b 0a  tem->zName = 0;.
22f00 20 20 70 53 75 62 69 74 65 6d 2d 3e 7a 41 6c 69    pSubitem->zAli
22f10 61 73 20 3d 20 30 3b 0a 20 20 70 53 75 62 69 74  as = 0;.  pSubit
22f20 65 6d 2d 3e 70 53 65 6c 65 63 74 20 3d 20 30 3b  em->pSelect = 0;
22f30 0a 0a 20 20 2f 2a 20 44 65 66 65 72 20 64 65 6c  ..  /* Defer del
22f40 65 74 69 6e 67 20 74 68 65 20 54 61 62 6c 65 20  eting the Table 
22f50 6f 62 6a 65 63 74 20 61 73 73 6f 63 69 61 74 65  object associate
22f60 64 20 77 69 74 68 20 74 68 65 0a 20 20 2a 2a 20  d with the.  ** 
22f70 73 75 62 71 75 65 72 79 20 75 6e 74 69 6c 20 63  subquery until c
22f80 6f 64 65 20 67 65 6e 65 72 61 74 69 6f 6e 20 69  ode generation i
22f90 73 0a 20 20 2a 2a 20 63 6f 6d 70 6c 65 74 65 2c  s.  ** complete,
22fa0 20 73 69 6e 63 65 20 74 68 65 72 65 20 6d 61 79   since there may
22fb0 20 73 74 69 6c 6c 20 65 78 69 73 74 20 45 78 70   still exist Exp
22fc0 72 2e 70 54 61 62 20 65 6e 74 72 69 65 73 20 74  r.pTab entries t
22fd0 68 61 74 0a 20 20 2a 2a 20 72 65 66 65 72 20 74  hat.  ** refer t
22fe0 6f 20 74 68 65 20 73 75 62 71 75 65 72 79 20 65  o the subquery e
22ff0 76 65 6e 20 61 66 74 65 72 20 66 6c 61 74 74 65  ven after flatte
23000 6e 69 6e 67 2e 20 20 54 69 63 6b 65 74 20 23 33  ning.  Ticket #3
23010 33 34 36 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 70  346..  **.  ** p
23020 53 75 62 69 74 65 6d 2d 3e 70 54 61 62 20 69 73  Subitem->pTab is
23030 20 61 6c 77 61 79 73 20 6e 6f 6e 2d 4e 55 4c 4c   always non-NULL
23040 20 62 79 20 74 65 73 74 20 72 65 73 74 72 69 63   by test restric
23050 74 69 6f 6e 73 20 61 6e 64 20 74 65 73 74 73 20  tions and tests 
23060 61 62 6f 76 65 2e 0a 20 20 2a 2f 0a 20 20 69 66  above..  */.  if
23070 28 20 41 4c 57 41 59 53 28 70 53 75 62 69 74 65  ( ALWAYS(pSubite
23080 6d 2d 3e 70 54 61 62 21 3d 30 29 20 29 7b 0a 20  m->pTab!=0) ){. 
23090 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 54 6f     Table *pTabTo
230a0 44 65 6c 20 3d 20 70 53 75 62 69 74 65 6d 2d 3e  Del = pSubitem->
230b0 70 54 61 62 3b 0a 20 20 20 20 69 66 28 20 70 54  pTab;.    if( pT
230c0 61 62 54 6f 44 65 6c 2d 3e 6e 54 61 62 52 65 66  abToDel->nTabRef
230d0 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 50 61 72  ==1 ){.      Par
230e0 73 65 20 2a 70 54 6f 70 6c 65 76 65 6c 20 3d 20  se *pToplevel = 
230f0 73 71 6c 69 74 65 33 50 61 72 73 65 54 6f 70 6c  sqlite3ParseTopl
23100 65 76 65 6c 28 70 50 61 72 73 65 29 3b 0a 20 20  evel(pParse);.  
23110 20 20 20 20 70 54 61 62 54 6f 44 65 6c 2d 3e 70      pTabToDel->p
23120 4e 65 78 74 5a 6f 6d 62 69 65 20 3d 20 70 54 6f  NextZombie = pTo
23130 70 6c 65 76 65 6c 2d 3e 70 5a 6f 6d 62 69 65 54  plevel->pZombieT
23140 61 62 3b 0a 20 20 20 20 20 20 70 54 6f 70 6c 65  ab;.      pTople
23150 76 65 6c 2d 3e 70 5a 6f 6d 62 69 65 54 61 62 20  vel->pZombieTab 
23160 3d 20 70 54 61 62 54 6f 44 65 6c 3b 0a 20 20 20  = pTabToDel;.   
23170 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 54   }else{.      pT
23180 61 62 54 6f 44 65 6c 2d 3e 6e 54 61 62 52 65 66  abToDel->nTabRef
23190 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 53  --;.    }.    pS
231a0 75 62 69 74 65 6d 2d 3e 70 54 61 62 20 3d 20 30  ubitem->pTab = 0
231b0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20  ;.  }..  /* The 
231c0 66 6f 6c 6c 6f 77 69 6e 67 20 6c 6f 6f 70 20 72  following loop r
231d0 75 6e 73 20 6f 6e 63 65 20 66 6f 72 20 65 61 63  uns once for eac
231e0 68 20 74 65 72 6d 20 69 6e 20 61 20 63 6f 6d 70  h term in a comp
231f0 6f 75 6e 64 2d 73 75 62 71 75 65 72 79 0a 20 20  ound-subquery.  
23200 2a 2a 20 66 6c 61 74 74 65 6e 69 6e 67 20 28 61  ** flattening (a
23210 73 20 64 65 73 63 72 69 62 65 64 20 61 62 6f 76  s described abov
23220 65 29 2e 20 20 49 66 20 77 65 20 61 72 65 20 64  e).  If we are d
23230 6f 69 6e 67 20 61 20 64 69 66 66 65 72 65 6e 74  oing a different
23240 20 6b 69 6e 64 0a 20 20 2a 2a 20 6f 66 20 66 6c   kind.  ** of fl
23250 61 74 74 65 6e 69 6e 67 20 2d 20 61 20 66 6c 61  attening - a fla
23260 74 74 65 6e 69 6e 67 20 6f 74 68 65 72 20 74 68  ttening other th
23270 61 6e 20 61 20 63 6f 6d 70 6f 75 6e 64 2d 73 75  an a compound-su
23280 62 71 75 65 72 79 20 66 6c 61 74 74 65 6e 69 6e  bquery flattenin
23290 67 20 2d 0a 20 20 2a 2a 20 74 68 65 6e 20 74 68  g -.  ** then th
232a0 69 73 20 6c 6f 6f 70 20 6f 6e 6c 79 20 72 75 6e  is loop only run
232b0 73 20 6f 6e 63 65 2e 0a 20 20 2a 2a 0a 20 20 2a  s once..  **.  *
232c0 2a 20 54 68 69 73 20 6c 6f 6f 70 20 6d 6f 76 65  * This loop move
232d0 73 20 61 6c 6c 20 6f 66 20 74 68 65 20 46 52 4f  s all of the FRO
232e0 4d 20 65 6c 65 6d 65 6e 74 73 20 6f 66 20 74 68  M elements of th
232f0 65 20 73 75 62 71 75 65 72 79 20 69 6e 74 6f 20  e subquery into 
23300 74 68 65 0a 20 20 2a 2a 20 74 68 65 20 46 52 4f  the.  ** the FRO
23310 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20  M clause of the 
23320 6f 75 74 65 72 20 71 75 65 72 79 2e 20 20 42 65  outer query.  Be
23330 66 6f 72 65 20 64 6f 69 6e 67 20 74 68 69 73 2c  fore doing this,
23340 20 72 65 6d 65 6d 62 65 72 0a 20 20 2a 2a 20 74   remember.  ** t
23350 68 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72  he cursor number
23360 20 66 6f 72 20 74 68 65 20 6f 72 69 67 69 6e 61   for the origina
23370 6c 20 6f 75 74 65 72 20 71 75 65 72 79 20 46 52  l outer query FR
23380 4f 4d 20 65 6c 65 6d 65 6e 74 20 69 6e 0a 20 20  OM element in.  
23390 2a 2a 20 69 50 61 72 65 6e 74 2e 20 20 54 68 65  ** iParent.  The
233a0 20 69 50 61 72 65 6e 74 20 63 75 72 73 6f 72 20   iParent cursor 
233b0 77 69 6c 6c 20 6e 65 76 65 72 20 62 65 20 75 73  will never be us
233c0 65 64 2e 20 20 53 75 62 73 65 71 75 65 6e 74 20  ed.  Subsequent 
233d0 63 6f 64 65 0a 20 20 2a 2a 20 77 69 6c 6c 20 73  code.  ** will s
233e0 63 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 73 20  can expressions 
233f0 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 69 50 61 72  looking for iPar
23400 65 6e 74 20 72 65 66 65 72 65 6e 63 65 73 20 61  ent references a
23410 6e 64 20 72 65 70 6c 61 63 65 0a 20 20 2a 2a 20  nd replace.  ** 
23420 74 68 6f 73 65 20 72 65 66 65 72 65 6e 63 65 73  those references
23430 20 77 69 74 68 20 65 78 70 72 65 73 73 69 6f 6e   with expression
23440 73 20 74 68 61 74 20 72 65 73 6f 6c 76 65 20 74  s that resolve t
23450 6f 20 74 68 65 20 73 75 62 71 75 65 72 79 20 46  o the subquery F
23460 52 4f 4d 0a 20 20 2a 2a 20 65 6c 65 6d 65 6e 74  ROM.  ** element
23470 73 20 77 65 20 61 72 65 20 6e 6f 77 20 63 6f 70  s we are now cop
23480 79 69 6e 67 20 69 6e 2e 0a 20 20 2a 2f 0a 20 20  ying in..  */.  
23490 66 6f 72 28 70 50 61 72 65 6e 74 3d 70 3b 20 70  for(pParent=p; p
234a0 50 61 72 65 6e 74 3b 20 70 50 61 72 65 6e 74 3d  Parent; pParent=
234b0 70 50 61 72 65 6e 74 2d 3e 70 50 72 69 6f 72 2c  pParent->pPrior,
234c0 20 70 53 75 62 3d 70 53 75 62 2d 3e 70 50 72 69   pSub=pSub->pPri
234d0 6f 72 29 7b 0a 20 20 20 20 69 6e 74 20 6e 53 75  or){.    int nSu
234e0 62 53 72 63 3b 0a 20 20 20 20 75 38 20 6a 6f 69  bSrc;.    u8 joi
234f0 6e 74 79 70 65 20 3d 20 30 3b 0a 20 20 20 20 61  ntype = 0;.    a
23500 73 73 65 72 74 28 20 70 53 75 62 21 3d 30 20 29  ssert( pSub!=0 )
23510 3b 0a 20 20 20 20 70 53 75 62 53 72 63 20 3d 20  ;.    pSubSrc = 
23520 70 53 75 62 2d 3e 70 53 72 63 3b 20 20 20 20 20  pSub->pSrc;     
23530 2f 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f  /* FROM clause o
23540 66 20 73 75 62 71 75 65 72 79 20 2a 2f 0a 20 20  f subquery */.  
23550 20 20 6e 53 75 62 53 72 63 20 3d 20 70 53 75 62    nSubSrc = pSub
23560 53 72 63 2d 3e 6e 53 72 63 3b 20 20 2f 2a 20 4e  Src->nSrc;  /* N
23570 75 6d 62 65 72 20 6f 66 20 74 65 72 6d 73 20 69  umber of terms i
23580 6e 20 73 75 62 71 75 65 72 79 20 46 52 4f 4d 20  n subquery FROM 
23590 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20 70 53  clause */.    pS
235a0 72 63 20 3d 20 70 50 61 72 65 6e 74 2d 3e 70 53  rc = pParent->pS
235b0 72 63 3b 20 20 20 20 20 2f 2a 20 46 52 4f 4d 20  rc;     /* FROM 
235c0 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 6f 75  clause of the ou
235d0 74 65 72 20 71 75 65 72 79 20 2a 2f 0a 0a 20 20  ter query */..  
235e0 20 20 69 66 28 20 70 53 72 63 20 29 7b 0a 20 20    if( pSrc ){.  
235f0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72      assert( pPar
23600 65 6e 74 3d 3d 70 20 29 3b 20 20 2f 2a 20 46 69  ent==p );  /* Fi
23610 72 73 74 20 74 69 6d 65 20 74 68 72 6f 75 67 68  rst time through
23620 20 74 68 65 20 6c 6f 6f 70 20 2a 2f 0a 20 20 20   the loop */.   
23630 20 20 20 6a 6f 69 6e 74 79 70 65 20 3d 20 70 53     jointype = pS
23640 75 62 69 74 65 6d 2d 3e 66 67 2e 6a 6f 69 6e 74  ubitem->fg.joint
23650 79 70 65 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ype;.    }else{.
23660 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
23670 61 72 65 6e 74 21 3d 70 20 29 3b 20 20 2f 2a 20  arent!=p );  /* 
23680 32 6e 64 20 61 6e 64 20 73 75 62 73 65 71 75 65  2nd and subseque
23690 6e 74 20 74 69 6d 65 73 20 74 68 72 6f 75 67 68  nt times through
236a0 20 74 68 65 20 6c 6f 6f 70 20 2a 2f 0a 20 20 20   the loop */.   
236b0 20 20 20 70 53 72 63 20 3d 20 73 71 6c 69 74 65     pSrc = sqlite
236c0 33 53 72 63 4c 69 73 74 41 70 70 65 6e 64 28 70  3SrcListAppend(p
236d0 50 61 72 73 65 2c 20 30 2c 20 30 2c 20 30 29 3b  Parse, 0, 0, 0);
236e0 0a 20 20 20 20 20 20 69 66 28 20 70 53 72 63 3d  .      if( pSrc=
236f0 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  =0 ) break;.    
23700 20 20 70 50 61 72 65 6e 74 2d 3e 70 53 72 63 20    pParent->pSrc 
23710 3d 20 70 53 72 63 3b 0a 20 20 20 20 7d 0a 0a 20  = pSrc;.    }.. 
23720 20 20 20 2f 2a 20 54 68 65 20 73 75 62 71 75 65     /* The subque
23730 72 79 20 75 73 65 73 20 61 20 73 69 6e 67 6c 65  ry uses a single
23740 20 73 6c 6f 74 20 6f 66 20 74 68 65 20 46 52 4f   slot of the FRO
23750 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20  M clause of the 
23760 6f 75 74 65 72 0a 20 20 20 20 2a 2a 20 71 75 65  outer.    ** que
23770 72 79 2e 20 20 49 66 20 74 68 65 20 73 75 62 71  ry.  If the subq
23780 75 65 72 79 20 68 61 73 20 6d 6f 72 65 20 74 68  uery has more th
23790 61 6e 20 6f 6e 65 20 65 6c 65 6d 65 6e 74 20 69  an one element i
237a0 6e 20 69 74 73 20 46 52 4f 4d 20 63 6c 61 75 73  n its FROM claus
237b0 65 2c 0a 20 20 20 20 2a 2a 20 74 68 65 6e 20 65  e,.    ** then e
237c0 78 70 61 6e 64 20 74 68 65 20 6f 75 74 65 72 20  xpand the outer 
237d0 71 75 65 72 79 20 74 6f 20 6d 61 6b 65 20 73 70  query to make sp
237e0 61 63 65 20 66 6f 72 20 69 74 20 74 6f 20 68 6f  ace for it to ho
237f0 6c 64 20 61 6c 6c 20 65 6c 65 6d 65 6e 74 73 0a  ld all elements.
23800 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 73 75      ** of the su
23810 62 71 75 65 72 79 2e 0a 20 20 20 20 2a 2a 0a 20  bquery..    **. 
23820 20 20 20 2a 2a 20 45 78 61 6d 70 6c 65 3a 0a 20     ** Example:. 
23830 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20     **.    **    
23840 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 61  SELECT * FROM ta
23850 62 41 2c 20 28 53 45 4c 45 43 54 20 2a 20 46 52  bA, (SELECT * FR
23860 4f 4d 20 73 75 62 31 2c 20 73 75 62 32 29 2c 20  OM sub1, sub2), 
23870 74 61 62 42 3b 0a 20 20 20 20 2a 2a 0a 20 20 20  tabB;.    **.   
23880 20 2a 2a 20 54 68 65 20 6f 75 74 65 72 20 71 75   ** The outer qu
23890 65 72 79 20 68 61 73 20 33 20 73 6c 6f 74 73 20  ery has 3 slots 
238a0 69 6e 20 69 74 73 20 46 52 4f 4d 20 63 6c 61 75  in its FROM clau
238b0 73 65 2e 20 20 4f 6e 65 20 73 6c 6f 74 20 6f 66  se.  One slot of
238c0 20 74 68 65 0a 20 20 20 20 2a 2a 20 6f 75 74 65   the.    ** oute
238d0 72 20 71 75 65 72 79 20 28 74 68 65 20 6d 69 64  r query (the mid
238e0 64 6c 65 20 73 6c 6f 74 29 20 69 73 20 75 73 65  dle slot) is use
238f0 64 20 62 79 20 74 68 65 20 73 75 62 71 75 65 72  d by the subquer
23900 79 2e 20 20 54 68 65 20 6e 65 78 74 0a 20 20 20  y.  The next.   
23910 20 2a 2a 20 62 6c 6f 63 6b 20 6f 66 20 63 6f 64   ** block of cod
23920 65 20 77 69 6c 6c 20 65 78 70 61 6e 64 20 74 68  e will expand th
23930 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 46 52  e outer query FR
23940 4f 4d 20 63 6c 61 75 73 65 20 74 6f 20 34 20 73  OM clause to 4 s
23950 6c 6f 74 73 2e 0a 20 20 20 20 2a 2a 20 54 68 65  lots..    ** The
23960 20 6d 69 64 64 6c 65 20 73 6c 6f 74 20 69 73 20   middle slot is 
23970 65 78 70 61 6e 64 65 64 20 74 6f 20 74 77 6f 20  expanded to two 
23980 73 6c 6f 74 73 20 69 6e 20 6f 72 64 65 72 20 74  slots in order t
23990 6f 20 6d 61 6b 65 20 73 70 61 63 65 0a 20 20 20  o make space.   
239a0 20 2a 2a 20 66 6f 72 20 74 68 65 20 74 77 6f 20   ** for the two 
239b0 65 6c 65 6d 65 6e 74 73 20 69 6e 20 74 68 65 20  elements in the 
239c0 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74  FROM clause of t
239d0 68 65 20 73 75 62 71 75 65 72 79 2e 0a 20 20 20  he subquery..   
239e0 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 53 75 62   */.    if( nSub
239f0 53 72 63 3e 31 20 29 7b 0a 20 20 20 20 20 20 70  Src>1 ){.      p
23a00 53 72 63 20 3d 20 73 71 6c 69 74 65 33 53 72 63  Src = sqlite3Src
23a10 4c 69 73 74 45 6e 6c 61 72 67 65 28 70 50 61 72  ListEnlarge(pPar
23a20 73 65 2c 20 70 53 72 63 2c 20 6e 53 75 62 53 72  se, pSrc, nSubSr
23a30 63 2d 31 2c 69 46 72 6f 6d 2b 31 29 3b 0a 20 20  c-1,iFrom+1);.  
23a40 20 20 20 20 69 66 28 20 70 53 72 63 3d 3d 30 20      if( pSrc==0 
23a50 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 70  ) break;.      p
23a60 50 61 72 65 6e 74 2d 3e 70 53 72 63 20 3d 20 70  Parent->pSrc = p
23a70 53 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  Src;.    }..    
23a80 2f 2a 20 54 72 61 6e 73 66 65 72 20 74 68 65 20  /* Transfer the 
23a90 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 65 72 6d  FROM clause term
23aa0 73 20 66 72 6f 6d 20 74 68 65 20 73 75 62 71 75  s from the subqu
23ab0 65 72 79 20 69 6e 74 6f 20 74 68 65 0a 20 20 20  ery into the.   
23ac0 20 2a 2a 20 6f 75 74 65 72 20 71 75 65 72 79 2e   ** outer query.
23ad0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28  .    */.    for(
23ae0 69 3d 30 3b 20 69 3c 6e 53 75 62 53 72 63 3b 20  i=0; i<nSubSrc; 
23af0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  i++){.      sqli
23b00 74 65 33 49 64 4c 69 73 74 44 65 6c 65 74 65 28  te3IdListDelete(
23b10 64 62 2c 20 70 53 72 63 2d 3e 61 5b 69 2b 69 46  db, pSrc->a[i+iF
23b20 72 6f 6d 5d 2e 70 55 73 69 6e 67 29 3b 0a 20 20  rom].pUsing);.  
23b30 20 20 20 20 61 73 73 65 72 74 28 20 70 53 72 63      assert( pSrc
23b40 2d 3e 61 5b 69 2b 69 46 72 6f 6d 5d 2e 66 67 2e  ->a[i+iFrom].fg.
23b50 69 73 54 61 62 46 75 6e 63 3d 3d 30 20 29 3b 0a  isTabFunc==0 );.
23b60 20 20 20 20 20 20 70 53 72 63 2d 3e 61 5b 69 2b        pSrc->a[i+
23b70 69 46 72 6f 6d 5d 20 3d 20 70 53 75 62 53 72 63  iFrom] = pSubSrc
23b80 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 20 20 69 4e  ->a[i];.      iN
23b90 65 77 50 61 72 65 6e 74 20 3d 20 70 53 75 62 53  ewParent = pSubS
23ba0 72 63 2d 3e 61 5b 69 5d 2e 69 43 75 72 73 6f 72  rc->a[i].iCursor
23bb0 3b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 26  ;.      memset(&
23bc0 70 53 75 62 53 72 63 2d 3e 61 5b 69 5d 2c 20 30  pSubSrc->a[i], 0
23bd0 2c 20 73 69 7a 65 6f 66 28 70 53 75 62 53 72 63  , sizeof(pSubSrc
23be0 2d 3e 61 5b 69 5d 29 29 3b 0a 20 20 20 20 7d 0a  ->a[i]));.    }.
23bf0 20 20 20 20 70 53 72 63 2d 3e 61 5b 69 46 72 6f      pSrc->a[iFro
23c00 6d 5d 2e 66 67 2e 6a 6f 69 6e 74 79 70 65 20 3d  m].fg.jointype =
23c10 20 6a 6f 69 6e 74 79 70 65 3b 0a 20 20 0a 20 20   jointype;.  .  
23c20 20 20 2f 2a 20 4e 6f 77 20 62 65 67 69 6e 20 73    /* Now begin s
23c30 75 62 73 74 69 74 75 74 69 6e 67 20 73 75 62 71  ubstituting subq
23c40 75 65 72 79 20 72 65 73 75 6c 74 20 73 65 74 20  uery result set 
23c50 65 78 70 72 65 73 73 69 6f 6e 73 20 66 6f 72 20  expressions for 
23c60 0a 20 20 20 20 2a 2a 20 72 65 66 65 72 65 6e 63  .    ** referenc
23c70 65 73 20 74 6f 20 74 68 65 20 69 50 61 72 65 6e  es to the iParen
23c80 74 20 69 6e 20 74 68 65 20 6f 75 74 65 72 20 71  t in the outer q
23c90 75 65 72 79 2e 0a 20 20 20 20 2a 2a 20 0a 20 20  uery..    ** .  
23ca0 20 20 2a 2a 20 45 78 61 6d 70 6c 65 3a 0a 20 20    ** Example:.  
23cb0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 53 45    **.    **   SE
23cc0 4c 45 43 54 20 61 2b 35 2c 20 62 2a 31 30 20 46  LECT a+5, b*10 F
23cd0 52 4f 4d 20 28 53 45 4c 45 43 54 20 78 2a 33 20  ROM (SELECT x*3 
23ce0 41 53 20 61 2c 20 79 2b 31 30 20 41 53 20 62 20  AS a, y+10 AS b 
23cf0 46 52 4f 4d 20 74 31 29 20 57 48 45 52 45 20 61  FROM t1) WHERE a
23d00 3e 62 3b 0a 20 20 20 20 2a 2a 20 20 20 5c 20 20  >b;.    **   \  
23d10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23d20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f     \____________
23d30 5f 20 73 75 62 71 75 65 72 79 20 5f 5f 5f 5f 5f  _ subquery _____
23d40 5f 5f 5f 5f 5f 2f 20 20 20 20 20 20 20 20 20 20  _____/          
23d50 2f 0a 20 20 20 20 2a 2a 20 20 20 20 5c 5f 5f 5f  /.    **    \___
23d60 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
23d70 5f 5f 20 6f 75 74 65 72 20 71 75 65 72 79 20 5f  __ outer query _
23d80 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
23d90 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 0a 20  _____________/. 
23da0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 57 65 20     **.    ** We 
23db0 6c 6f 6f 6b 20 61 74 20 65 76 65 72 79 20 65 78  look at every ex
23dc0 70 72 65 73 73 69 6f 6e 20 69 6e 20 74 68 65 20  pression in the 
23dd0 6f 75 74 65 72 20 71 75 65 72 79 20 61 6e 64 20  outer query and 
23de0 65 76 65 72 79 20 70 6c 61 63 65 20 77 65 20 73  every place we s
23df0 65 65 0a 20 20 20 20 2a 2a 20 22 61 22 20 77 65  ee.    ** "a" we
23e00 20 73 75 62 73 74 69 74 75 74 65 20 22 78 2a 33   substitute "x*3
23e10 22 20 61 6e 64 20 65 76 65 72 79 20 70 6c 61 63  " and every plac
23e20 65 20 77 65 20 73 65 65 20 22 62 22 20 77 65 20  e we see "b" we 
23e30 73 75 62 73 74 69 74 75 74 65 20 22 79 2b 31 30  substitute "y+10
23e40 22 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  "..    */.    if
23e50 28 20 70 53 75 62 2d 3e 70 4f 72 64 65 72 42 79  ( pSub->pOrderBy
23e60 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 74 20   ){.      /* At 
23e70 74 68 69 73 20 70 6f 69 6e 74 2c 20 61 6e 79 20  this point, any 
23e80 6e 6f 6e 2d 7a 65 72 6f 20 69 4f 72 64 65 72 42  non-zero iOrderB
23e90 79 43 6f 6c 20 76 61 6c 75 65 73 20 69 6e 64 69  yCol values indi
23ea0 63 61 74 65 20 74 68 61 74 20 74 68 65 0a 20 20  cate that the.  
23eb0 20 20 20 20 2a 2a 20 4f 52 44 45 52 20 42 59 20      ** ORDER BY 
23ec0 63 6f 6c 75 6d 6e 20 65 78 70 72 65 73 73 69 6f  column expressio
23ed0 6e 20 69 73 20 69 64 65 6e 74 69 63 61 6c 20 74  n is identical t
23ee0 6f 20 74 68 65 20 69 4f 72 64 65 72 42 79 43 6f  o the iOrderByCo
23ef0 6c 27 74 68 0a 20 20 20 20 20 20 2a 2a 20 65 78  l'th.      ** ex
23f00 70 72 65 73 73 69 6f 6e 20 72 65 74 75 72 6e 65  pression returne
23f10 64 20 62 79 20 53 45 4c 45 43 54 20 73 74 61 74  d by SELECT stat
23f20 65 6d 65 6e 74 20 70 53 75 62 2e 20 53 69 6e 63  ement pSub. Sinc
23f30 65 20 74 68 65 73 65 20 76 61 6c 75 65 73 0a 20  e these values. 
23f40 20 20 20 20 20 2a 2a 20 64 6f 20 6e 6f 74 20 6e       ** do not n
23f50 65 63 65 73 73 61 72 69 6c 79 20 63 6f 72 72 65  ecessarily corre
23f60 73 70 6f 6e 64 20 74 6f 20 63 6f 6c 75 6d 6e 73  spond to columns
23f70 20 69 6e 20 53 45 4c 45 43 54 20 73 74 61 74 65   in SELECT state
23f80 6d 65 6e 74 20 70 50 61 72 65 6e 74 2c 0a 20 20  ment pParent,.  
23f90 20 20 20 20 2a 2a 20 7a 65 72 6f 20 74 68 65 6d      ** zero them
23fa0 20 62 65 66 6f 72 65 20 74 72 61 6e 73 66 65 72   before transfer
23fb0 69 6e 67 20 74 68 65 20 4f 52 44 45 52 20 42 59  ing the ORDER BY
23fc0 20 63 6c 61 75 73 65 2e 0a 20 20 20 20 20 20 2a   clause..      *
23fd0 2a 0a 20 20 20 20 20 20 2a 2a 20 4e 6f 74 20 64  *.      ** Not d
23fe0 6f 69 6e 67 20 74 68 69 73 20 6d 61 79 20 63 61  oing this may ca
23ff0 75 73 65 20 61 6e 20 65 72 72 6f 72 20 69 66 20  use an error if 
24000 61 20 73 75 62 73 65 71 75 65 6e 74 20 63 61 6c  a subsequent cal
24010 6c 20 74 6f 20 74 68 69 73 0a 20 20 20 20 20 20  l to this.      
24020 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 61 74 74 65  ** function atte
24030 6d 70 74 73 20 74 6f 20 66 6c 61 74 74 65 6e 20  mpts to flatten 
24040 61 20 63 6f 6d 70 6f 75 6e 64 20 73 75 62 2d 71  a compound sub-q
24050 75 65 72 79 20 69 6e 74 6f 20 70 50 61 72 65 6e  uery into pParen
24060 74 0a 20 20 20 20 20 20 2a 2a 20 28 74 68 65 20  t.      ** (the 
24070 6f 6e 6c 79 20 77 61 79 20 74 68 69 73 20 63 61  only way this ca
24080 6e 20 68 61 70 70 65 6e 20 69 73 20 69 66 20 74  n happen is if t
24090 68 65 20 63 6f 6d 70 6f 75 6e 64 20 73 75 62 2d  he compound sub-
240a0 71 75 65 72 79 20 69 73 0a 20 20 20 20 20 20 2a  query is.      *
240b0 2a 20 63 75 72 72 65 6e 74 6c 79 20 70 61 72 74  * currently part
240c0 20 6f 66 20 70 53 75 62 2d 3e 70 53 72 63 29 2e   of pSub->pSrc).
240d0 20 53 65 65 20 74 69 63 6b 65 74 20 5b 64 31 31   See ticket [d11
240e0 61 36 65 39 30 38 66 5d 2e 20 20 2a 2f 0a 20 20  a6e908f].  */.  
240f0 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f      ExprList *pO
24100 72 64 65 72 42 79 20 3d 20 70 53 75 62 2d 3e 70  rderBy = pSub->p
24110 4f 72 64 65 72 42 79 3b 0a 20 20 20 20 20 20 66  OrderBy;.      f
24120 6f 72 28 69 3d 30 3b 20 69 3c 70 4f 72 64 65 72  or(i=0; i<pOrder
24130 42 79 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b  By->nExpr; i++){
24140 0a 20 20 20 20 20 20 20 20 70 4f 72 64 65 72 42  .        pOrderB
24150 79 2d 3e 61 5b 69 5d 2e 75 2e 78 2e 69 4f 72 64  y->a[i].u.x.iOrd
24160 65 72 42 79 43 6f 6c 20 3d 20 30 3b 0a 20 20 20  erByCol = 0;.   
24170 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72     }.      asser
24180 74 28 20 70 50 61 72 65 6e 74 2d 3e 70 4f 72 64  t( pParent->pOrd
24190 65 72 42 79 3d 3d 30 20 29 3b 0a 20 20 20 20 20  erBy==0 );.     
241a0 20 70 50 61 72 65 6e 74 2d 3e 70 4f 72 64 65 72   pParent->pOrder
241b0 42 79 20 3d 20 70 4f 72 64 65 72 42 79 3b 0a 20  By = pOrderBy;. 
241c0 20 20 20 20 20 70 53 75 62 2d 3e 70 4f 72 64 65       pSub->pOrde
241d0 72 42 79 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  rBy = 0;.    }. 
241e0 20 20 20 70 57 68 65 72 65 20 3d 20 70 53 75 62     pWhere = pSub
241f0 2d 3e 70 57 68 65 72 65 3b 0a 20 20 20 20 70 53  ->pWhere;.    pS
24200 75 62 2d 3e 70 57 68 65 72 65 20 3d 20 30 3b 0a  ub->pWhere = 0;.
24210 20 20 20 20 69 66 28 20 69 73 4c 65 66 74 4a 6f      if( isLeftJo
24220 69 6e 3e 30 20 29 7b 0a 20 20 20 20 20 20 73 65  in>0 ){.      se
24230 74 4a 6f 69 6e 45 78 70 72 28 70 57 68 65 72 65  tJoinExpr(pWhere
24240 2c 20 69 4e 65 77 50 61 72 65 6e 74 29 3b 0a 20  , iNewParent);. 
24250 20 20 20 7d 0a 20 20 20 20 70 50 61 72 65 6e 74     }.    pParent
24260 2d 3e 70 57 68 65 72 65 20 3d 20 73 71 6c 69 74  ->pWhere = sqlit
24270 65 33 45 78 70 72 41 6e 64 28 70 50 61 72 73 65  e3ExprAnd(pParse
24280 2c 20 70 57 68 65 72 65 2c 20 70 50 61 72 65 6e  , pWhere, pParen
24290 74 2d 3e 70 57 68 65 72 65 29 3b 0a 20 20 20 20  t->pWhere);.    
242a0 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
242b0 69 6c 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20  iled==0 ){.     
242c0 20 53 75 62 73 74 43 6f 6e 74 65 78 74 20 78 3b   SubstContext x;
242d0 0a 20 20 20 20 20 20 78 2e 70 50 61 72 73 65 20  .      x.pParse 
242e0 3d 20 70 50 61 72 73 65 3b 0a 20 20 20 20 20 20  = pParse;.      
242f0 78 2e 69 54 61 62 6c 65 20 3d 20 69 50 61 72 65  x.iTable = iPare
24300 6e 74 3b 0a 20 20 20 20 20 20 78 2e 69 4e 65 77  nt;.      x.iNew
24310 54 61 62 6c 65 20 3d 20 69 4e 65 77 50 61 72 65  Table = iNewPare
24320 6e 74 3b 0a 20 20 20 20 20 20 78 2e 69 73 4c 65  nt;.      x.isLe
24330 66 74 4a 6f 69 6e 20 3d 20 69 73 4c 65 66 74 4a  ftJoin = isLeftJ
24340 6f 69 6e 3b 0a 20 20 20 20 20 20 78 2e 70 45 4c  oin;.      x.pEL
24350 69 73 74 20 3d 20 70 53 75 62 2d 3e 70 45 4c 69  ist = pSub->pELi
24360 73 74 3b 0a 20 20 20 20 20 20 73 75 62 73 74 53  st;.      substS
24370 65 6c 65 63 74 28 26 78 2c 20 70 50 61 72 65 6e  elect(&x, pParen
24380 74 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 0a  t, 0);.    }.  .
24390 20 20 20 20 2f 2a 20 54 68 65 20 66 6c 61 74 74      /* The flatt
243a0 65 6e 65 64 20 71 75 65 72 79 20 69 73 20 61 20  ened query is a 
243b0 63 6f 6d 70 6f 75 6e 64 20 69 66 20 65 69 74 68  compound if eith
243c0 65 72 20 74 68 65 20 69 6e 6e 65 72 20 6f 72 20  er the inner or 
243d0 74 68 65 0a 20 20 20 20 2a 2a 20 6f 75 74 65 72  the.    ** outer
243e0 20 71 75 65 72 79 20 69 73 20 61 20 63 6f 6d 70   query is a comp
243f0 6f 75 6e 64 2e 20 2a 2f 0a 20 20 20 20 70 50 61  ound. */.    pPa
24400 72 65 6e 74 2d 3e 73 65 6c 46 6c 61 67 73 20 7c  rent->selFlags |
24410 3d 20 70 53 75 62 2d 3e 73 65 6c 46 6c 61 67 73  = pSub->selFlags
24420 20 26 20 53 46 5f 43 6f 6d 70 6f 75 6e 64 3b 0a   & SF_Compound;.
24430 20 20 20 20 61 73 73 65 72 74 28 20 28 70 53 75      assert( (pSu
24440 62 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46  b->selFlags & SF
24450 5f 44 69 73 74 69 6e 63 74 29 3d 3d 30 20 29 3b  _Distinct)==0 );
24460 20 2f 2a 20 72 65 73 74 72 69 63 74 69 6f 6e 20   /* restriction 
24470 28 31 37 62 29 20 2a 2f 0a 20 20 0a 20 20 20 20  (17b) */.  .    
24480 2f 2a 0a 20 20 20 20 2a 2a 20 53 45 4c 45 43 54  /*.    ** SELECT
24490 20 2e 2e 2e 20 46 52 4f 4d 20 28 53 45 4c 45 43   ... FROM (SELEC
244a0 54 20 2e 2e 2e 20 4c 49 4d 49 54 20 61 20 4f 46  T ... LIMIT a OF
244b0 46 53 45 54 20 62 29 20 4c 49 4d 49 54 20 78 20  FSET b) LIMIT x 
244c0 4f 46 46 53 45 54 20 79 3b 0a 20 20 20 20 2a 2a  OFFSET y;.    **
244d0 0a 20 20 20 20 2a 2a 20 4f 6e 65 20 69 73 20 74  .    ** One is t
244e0 65 6d 70 74 65 64 20 74 6f 20 74 72 79 20 74 6f  empted to try to
244f0 20 61 64 64 20 61 20 61 6e 64 20 62 20 74 6f 20   add a and b to 
24500 63 6f 6d 62 69 6e 65 20 74 68 65 20 6c 69 6d 69  combine the limi
24510 74 73 2e 20 20 42 75 74 20 74 68 69 73 0a 20 20  ts.  But this.  
24520 20 20 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 77 6f    ** does not wo
24530 72 6b 20 69 66 20 65 69 74 68 65 72 20 6c 69 6d  rk if either lim
24540 69 74 20 69 73 20 6e 65 67 61 74 69 76 65 2e 0a  it is negative..
24550 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
24560 53 75 62 2d 3e 70 4c 69 6d 69 74 20 29 7b 0a 20  Sub->pLimit ){. 
24570 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70 4c       pParent->pL
24580 69 6d 69 74 20 3d 20 70 53 75 62 2d 3e 70 4c 69  imit = pSub->pLi
24590 6d 69 74 3b 0a 20 20 20 20 20 20 70 53 75 62 2d  mit;.      pSub-
245a0 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20  >pLimit = 0;.   
245b0 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 6e   }.  }..  /* Fin
245c0 69 61 6c 6c 79 2c 20 64 65 6c 65 74 65 20 77 68  ially, delete wh
245d0 61 74 20 69 73 20 6c 65 66 74 20 6f 66 20 74 68  at is left of th
245e0 65 20 73 75 62 71 75 65 72 79 20 61 6e 64 20 72  e subquery and r
245f0 65 74 75 72 6e 0a 20 20 2a 2a 20 73 75 63 63 65  eturn.  ** succe
24600 73 73 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  ss..  */.  sqlit
24610 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64  e3SelectDelete(d
24620 62 2c 20 70 53 75 62 31 29 3b 0a 0a 23 69 66 20  b, pSub1);..#if 
24630 53 45 4c 45 43 54 54 52 41 43 45 5f 45 4e 41 42  SELECTTRACE_ENAB
24640 4c 45 44 0a 20 20 69 66 28 20 73 71 6c 69 74 65  LED.  if( sqlite
24650 33 53 65 6c 65 63 74 54 72 61 63 65 20 26 20 30  3SelectTrace & 0
24660 78 31 30 30 20 29 7b 0a 20 20 20 20 53 45 4c 45  x100 ){.    SELE
24670 43 54 54 52 41 43 45 28 30 78 31 30 30 2c 70 50  CTTRACE(0x100,pP
24680 61 72 73 65 2c 70 2c 28 22 41 66 74 65 72 20 66  arse,p,("After f
24690 6c 61 74 74 65 6e 69 6e 67 3a 5c 6e 22 29 29 3b  lattening:\n"));
246a0 0a 20 20 20 20 73 71 6c 69 74 65 33 54 72 65 65  .    sqlite3Tree
246b0 56 69 65 77 53 65 6c 65 63 74 28 30 2c 20 70 2c  ViewSelect(0, p,
246c0 20 30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a   0);.  }.#endif.
246d0 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 23  .  return 1;.}.#
246e0 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65  endif /* !define
246f0 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  d(SQLITE_OMIT_SU
24700 42 51 55 45 52 59 29 20 7c 7c 20 21 64 65 66 69  BQUERY) || !defi
24710 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
24720 56 49 45 57 29 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  VIEW) */../*.** 
24730 41 20 73 74 72 75 63 74 75 72 65 20 74 6f 20 6b  A structure to k
24740 65 65 70 20 74 72 61 63 6b 20 6f 66 20 61 6c 6c  eep track of all
24750 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 76   of the column v
24760 61 6c 75 65 73 20 74 68 61 74 20 61 72 65 20 66  alues that are f
24770 69 78 65 64 20 74 6f 0a 2a 2a 20 61 20 6b 6e 6f  ixed to.** a kno
24780 77 6e 20 76 61 6c 75 65 20 64 75 65 20 74 6f 20  wn value due to 
24790 57 48 45 52 45 20 63 6c 61 75 73 65 20 63 6f 6e  WHERE clause con
247a0 73 74 72 61 69 6e 74 73 20 6f 66 20 74 68 65 20  straints of the 
247b0 66 6f 72 6d 20 43 4f 4c 55 4d 4e 3d 56 41 4c 55  form COLUMN=VALU
247c0 45 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74  E..*/.typedef st
247d0 72 75 63 74 20 57 68 65 72 65 43 6f 6e 73 74 20  ruct WhereConst 
247e0 57 68 65 72 65 43 6f 6e 73 74 3b 0a 73 74 72 75  WhereConst;.stru
247f0 63 74 20 57 68 65 72 65 43 6f 6e 73 74 20 7b 0a  ct WhereConst {.
24800 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 3b    Parse *pParse;
24810 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
24820 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20 6e  ntext */.  int n
24830 43 6f 6e 73 74 3b 20 20 20 20 20 20 2f 2a 20 4e  Const;      /* N
24840 75 6d 62 65 72 20 66 6f 72 20 43 4f 4c 55 4d 4e  umber for COLUMN
24850 3d 43 4f 4e 53 54 41 4e 54 20 74 65 72 6d 73 20  =CONSTANT terms 
24860 2a 2f 0a 20 20 69 6e 74 20 6e 43 68 6e 67 3b 20  */.  int nChng; 
24870 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
24880 6f 66 20 74 69 6d 65 73 20 61 20 63 6f 6e 73 74  of times a const
24890 61 6e 74 20 69 73 20 70 72 6f 70 61 67 61 74 65  ant is propagate
248a0 64 20 2a 2f 0a 20 20 45 78 70 72 20 2a 2a 61 70  d */.  Expr **ap
248b0 45 78 70 72 3b 20 20 20 2f 2a 20 5b 69 2a 32 5d  Expr;   /* [i*2]
248c0 20 69 73 20 43 4f 4c 55 4d 4e 20 61 6e 64 20 5b   is COLUMN and [
248d0 69 2a 32 2b 31 5d 20 69 73 20 56 41 4c 55 45 20  i*2+1] is VALUE 
248e0 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 64 64  */.};../*.** Add
248f0 20 61 20 6e 65 77 20 65 6e 74 72 79 20 74 6f 20   a new entry to 
24900 74 68 65 20 70 43 6f 6e 73 74 20 6f 62 6a 65 63  the pConst objec
24910 74 2e 20 20 45 78 63 65 70 74 2c 20 64 6f 20 6e  t.  Except, do n
24920 6f 74 20 61 64 64 20 64 75 70 6c 69 63 61 74 65  ot add duplicate
24930 0a 2a 2a 20 70 43 6f 6c 75 6d 6e 20 65 6e 74 69  .** pColumn enti
24940 72 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  res..*/.static v
24950 6f 69 64 20 63 6f 6e 73 74 49 6e 73 65 72 74 28  oid constInsert(
24960 0a 20 20 57 68 65 72 65 43 6f 6e 73 74 20 2a 70  .  WhereConst *p
24970 43 6f 6e 73 74 2c 20 20 20 20 20 20 2f 2a 20 54  Const,      /* T
24980 68 65 20 57 68 65 72 65 43 6f 6e 73 74 20 69 6e  he WhereConst in
24990 74 6f 20 77 68 69 63 68 20 77 65 20 61 72 65 20  to which we are 
249a0 69 6e 73 65 72 74 69 6e 67 20 2a 2f 0a 20 20 45  inserting */.  E
249b0 78 70 72 20 2a 70 43 6f 6c 75 6d 6e 2c 20 20 20  xpr *pColumn,   
249c0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 43          /* The C
249d0 4f 4c 55 4d 4e 20 70 61 72 74 20 6f 66 20 74 68  OLUMN part of th
249e0 65 20 63 6f 6e 73 74 72 61 69 6e 74 20 2a 2f 0a  e constraint */.
249f0 20 20 45 78 70 72 20 2a 70 56 61 6c 75 65 20 20    Expr *pValue  
24a00 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
24a10 65 20 56 41 4c 55 45 20 70 61 72 74 20 6f 66 20  e VALUE part of 
24a20 74 68 65 20 63 6f 6e 73 74 72 61 69 6e 74 20 2a  the constraint *
24a30 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  /.){.  int i;.  
24a40 61 73 73 65 72 74 28 20 70 43 6f 6c 75 6d 6e 2d  assert( pColumn-
24a50 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29  >op==TK_COLUMN )
24a60 3b 0a 0a 20 20 2f 2a 20 32 30 31 38 2d 31 30 2d  ;..  /* 2018-10-
24a70 32 35 20 74 69 63 6b 65 74 20 5b 63 66 35 65 64  25 ticket [cf5ed
24a80 32 30 66 5d 0a 20 20 2a 2a 20 4d 61 6b 65 20 73  20f].  ** Make s
24a90 75 72 65 20 74 68 65 20 73 61 6d 65 20 70 43 6f  ure the same pCo
24aa0 6c 75 6d 6e 20 69 73 20 6e 6f 74 20 69 6e 73 65  lumn is not inse
24ab0 72 74 65 64 20 6d 6f 72 65 20 74 68 61 6e 20 6f  rted more than o
24ac0 6e 63 65 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30  nce */.  for(i=0
24ad0 3b 20 69 3c 70 43 6f 6e 73 74 2d 3e 6e 43 6f 6e  ; i<pConst->nCon
24ae0 73 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63 6f  st; i++){.    co
24af0 6e 73 74 20 45 78 70 72 20 2a 70 45 78 70 72 20  nst Expr *pExpr 
24b00 3d 20 70 43 6f 6e 73 74 2d 3e 61 70 45 78 70 72  = pConst->apExpr
24b10 5b 69 2a 32 5d 3b 0a 20 20 20 20 61 73 73 65 72  [i*2];.    asser
24b20 74 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  t( pExpr->op==TK
24b30 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 69  _COLUMN );.    i
24b40 66 28 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  f( pExpr->iTable
24b50 3d 3d 70 43 6f 6c 75 6d 6e 2d 3e 69 54 61 62 6c  ==pColumn->iTabl
24b60 65 0a 20 20 20 20 20 26 26 20 70 45 78 70 72 2d  e.     && pExpr-
24b70 3e 69 43 6f 6c 75 6d 6e 3d 3d 70 43 6f 6c 75 6d  >iColumn==pColum
24b80 6e 2d 3e 69 43 6f 6c 75 6d 6e 0a 20 20 20 20 29  n->iColumn.    )
24b90 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 20  {.      return; 
24ba0 20 2f 2a 20 41 6c 72 65 61 64 79 20 70 72 65 73   /* Already pres
24bb0 65 6e 74 2e 20 20 52 65 74 75 72 6e 20 77 69 74  ent.  Return wit
24bc0 68 6f 75 74 20 64 6f 69 6e 67 20 61 6e 79 74 68  hout doing anyth
24bd0 69 6e 67 2e 20 2a 2f 0a 20 20 20 20 7d 0a 20 20  ing. */.    }.  
24be0 7d 0a 0a 20 20 70 43 6f 6e 73 74 2d 3e 6e 43 6f  }..  pConst->nCo
24bf0 6e 73 74 2b 2b 3b 0a 20 20 70 43 6f 6e 73 74 2d  nst++;.  pConst-
24c00 3e 61 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65  >apExpr = sqlite
24c10 33 44 62 52 65 61 6c 6c 6f 63 4f 72 46 72 65 65  3DbReallocOrFree
24c20 28 70 43 6f 6e 73 74 2d 3e 70 50 61 72 73 65 2d  (pConst->pParse-
24c30 3e 64 62 2c 20 70 43 6f 6e 73 74 2d 3e 61 70 45  >db, pConst->apE
24c40 78 70 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20  xpr,.           
24c50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43                pC
24c60 6f 6e 73 74 2d 3e 6e 43 6f 6e 73 74 2a 32 2a 73  onst->nConst*2*s
24c70 69 7a 65 6f 66 28 45 78 70 72 2a 29 29 3b 0a 20  izeof(Expr*));. 
24c80 20 69 66 28 20 70 43 6f 6e 73 74 2d 3e 61 70 45   if( pConst->apE
24c90 78 70 72 3d 3d 30 20 29 7b 0a 20 20 20 20 70 43  xpr==0 ){.    pC
24ca0 6f 6e 73 74 2d 3e 6e 43 6f 6e 73 74 20 3d 20 30  onst->nConst = 0
24cb0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
24cc0 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72  f( ExprHasProper
24cd0 74 79 28 70 56 61 6c 75 65 2c 20 45 50 5f 46 69  ty(pValue, EP_Fi
24ce0 78 65 64 43 6f 6c 29 20 29 20 70 56 61 6c 75 65  xedCol) ) pValue
24cf0 20 3d 20 70 56 61 6c 75 65 2d 3e 70 4c 65 66 74   = pValue->pLeft
24d00 3b 0a 20 20 20 20 70 43 6f 6e 73 74 2d 3e 61 70  ;.    pConst->ap
24d10 45 78 70 72 5b 70 43 6f 6e 73 74 2d 3e 6e 43 6f  Expr[pConst->nCo
24d20 6e 73 74 2a 32 2d 32 5d 20 3d 20 70 43 6f 6c 75  nst*2-2] = pColu
24d30 6d 6e 3b 0a 20 20 20 20 70 43 6f 6e 73 74 2d 3e  mn;.    pConst->
24d40 61 70 45 78 70 72 5b 70 43 6f 6e 73 74 2d 3e 6e  apExpr[pConst->n
24d50 43 6f 6e 73 74 2a 32 2d 31 5d 20 3d 20 70 56 61  Const*2-1] = pVa
24d60 6c 75 65 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  lue;.  }.}../*.*
24d70 2a 20 46 69 6e 64 20 61 6c 6c 20 74 65 72 6d 73  * Find all terms
24d80 20 6f 66 20 43 4f 4c 55 4d 4e 3d 56 41 4c 55 45   of COLUMN=VALUE
24d90 20 6f 72 20 56 41 4c 55 45 3d 43 4f 4c 55 4d 4e   or VALUE=COLUMN
24da0 20 69 6e 20 70 45 78 70 72 20 77 68 65 72 65 20   in pExpr where 
24db0 56 41 4c 55 45 0a 2a 2a 20 69 73 20 61 20 63 6f  VALUE.** is a co
24dc0 6e 73 74 61 6e 74 20 65 78 70 72 65 73 73 69 6f  nstant expressio
24dd0 6e 20 61 6e 64 20 77 68 65 72 65 20 74 68 65 20  n and where the 
24de0 74 65 72 6d 20 6d 75 73 74 20 62 65 20 74 72 75  term must be tru
24df0 65 20 62 65 63 61 75 73 65 20 69 74 0a 2a 2a 20  e because it.** 
24e00 69 73 20 70 61 72 74 20 6f 66 20 74 68 65 20 41  is part of the A
24e10 4e 44 2d 63 6f 6e 6e 65 63 74 65 64 20 74 65 72  ND-connected ter
24e20 6d 73 20 6f 66 20 74 68 65 20 65 78 70 72 65 73  ms of the expres
24e30 73 69 6f 6e 2e 20 20 46 6f 72 20 65 61 63 68 20  sion.  For each 
24e40 74 65 72 6d 0a 2a 2a 20 66 6f 75 6e 64 2c 20 61  term.** found, a
24e50 64 64 20 69 74 20 74 6f 20 74 68 65 20 70 43 6f  dd it to the pCo
24e60 6e 73 74 20 73 74 72 75 63 74 75 72 65 2e 0a 2a  nst structure..*
24e70 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 69  /.static void fi
24e80 6e 64 43 6f 6e 73 74 49 6e 57 68 65 72 65 28 57  ndConstInWhere(W
24e90 68 65 72 65 43 6f 6e 73 74 20 2a 70 43 6f 6e 73  hereConst *pCons
24ea0 74 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b  t, Expr *pExpr){
24eb0 0a 20 20 45 78 70 72 20 2a 70 52 69 67 68 74 2c  .  Expr *pRight,
24ec0 20 2a 70 4c 65 66 74 3b 0a 20 20 69 66 28 20 70   *pLeft;.  if( p
24ed0 45 78 70 72 3d 3d 30 20 29 20 72 65 74 75 72 6e  Expr==0 ) return
24ee0 3b 0a 20 20 69 66 28 20 45 78 70 72 48 61 73 50  ;.  if( ExprHasP
24ef0 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
24f00 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29 20 72 65  P_FromJoin) ) re
24f10 74 75 72 6e 3b 0a 20 20 69 66 28 20 70 45 78 70  turn;.  if( pExp
24f20 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 4e 44 20 29 7b  r->op==TK_AND ){
24f30 0a 20 20 20 20 66 69 6e 64 43 6f 6e 73 74 49 6e  .    findConstIn
24f40 57 68 65 72 65 28 70 43 6f 6e 73 74 2c 20 70 45  Where(pConst, pE
24f50 78 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20  xpr->pRight);.  
24f60 20 20 66 69 6e 64 43 6f 6e 73 74 49 6e 57 68 65    findConstInWhe
24f70 72 65 28 70 43 6f 6e 73 74 2c 20 70 45 78 70 72  re(pConst, pExpr
24f80 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 72 65  ->pLeft);.    re
24f90 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20  turn;.  }.  if( 
24fa0 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 45 51  pExpr->op!=TK_EQ
24fb0 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 52 69   ) return;.  pRi
24fc0 67 68 74 20 3d 20 70 45 78 70 72 2d 3e 70 52 69  ght = pExpr->pRi
24fd0 67 68 74 3b 0a 20 20 70 4c 65 66 74 20 3d 20 70  ght;.  pLeft = p
24fe0 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 61  Expr->pLeft;.  a
24ff0 73 73 65 72 74 28 20 70 52 69 67 68 74 21 3d 30  ssert( pRight!=0
25000 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4c   );.  assert( pL
25010 65 66 74 21 3d 30 20 29 3b 0a 20 20 69 66 28 20  eft!=0 );.  if( 
25020 70 52 69 67 68 74 2d 3e 6f 70 3d 3d 54 4b 5f 43  pRight->op==TK_C
25030 4f 4c 55 4d 4e 0a 20 20 20 26 26 20 21 45 78 70  OLUMN.   && !Exp
25040 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 52 69  rHasProperty(pRi
25050 67 68 74 2c 20 45 50 5f 46 69 78 65 64 43 6f 6c  ght, EP_FixedCol
25060 29 0a 20 20 20 26 26 20 73 71 6c 69 74 65 33 45  ).   && sqlite3E
25070 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 28 70 4c  xprIsConstant(pL
25080 65 66 74 29 0a 20 20 20 26 26 20 73 71 6c 69 74  eft).   && sqlit
25090 65 33 49 73 42 69 6e 61 72 79 28 73 71 6c 69 74  e3IsBinary(sqlit
250a0 65 33 42 69 6e 61 72 79 43 6f 6d 70 61 72 65 43  e3BinaryCompareC
250b0 6f 6c 6c 53 65 71 28 70 43 6f 6e 73 74 2d 3e 70  ollSeq(pConst->p
250c0 50 61 72 73 65 2c 70 4c 65 66 74 2c 70 52 69 67  Parse,pLeft,pRig
250d0 68 74 29 29 0a 20 20 29 7b 0a 20 20 20 20 63 6f  ht)).  ){.    co
250e0 6e 73 74 49 6e 73 65 72 74 28 70 43 6f 6e 73 74  nstInsert(pConst
250f0 2c 20 70 52 69 67 68 74 2c 20 70 4c 65 66 74 29  , pRight, pLeft)
25100 3b 0a 20 20 7d 65 6c 73 65 0a 20 20 69 66 28 20  ;.  }else.  if( 
25110 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f  pLeft->op==TK_CO
25120 4c 55 4d 4e 0a 20 20 20 26 26 20 21 45 78 70 72  LUMN.   && !Expr
25130 48 61 73 50 72 6f 70 65 72 74 79 28 70 4c 65 66  HasProperty(pLef
25140 74 2c 20 45 50 5f 46 69 78 65 64 43 6f 6c 29 0a  t, EP_FixedCol).
25150 20 20 20 26 26 20 73 71 6c 69 74 65 33 45 78 70     && sqlite3Exp
25160 72 49 73 43 6f 6e 73 74 61 6e 74 28 70 52 69 67  rIsConstant(pRig
25170 68 74 29 0a 20 20 20 26 26 20 73 71 6c 69 74 65  ht).   && sqlite
25180 33 49 73 42 69 6e 61 72 79 28 73 71 6c 69 74 65  3IsBinary(sqlite
25190 33 42 69 6e 61 72 79 43 6f 6d 70 61 72 65 43 6f  3BinaryCompareCo
251a0 6c 6c 53 65 71 28 70 43 6f 6e 73 74 2d 3e 70 50  llSeq(pConst->pP
251b0 61 72 73 65 2c 70 4c 65 66 74 2c 70 52 69 67 68  arse,pLeft,pRigh
251c0 74 29 29 0a 20 20 29 7b 0a 20 20 20 20 63 6f 6e  t)).  ){.    con
251d0 73 74 49 6e 73 65 72 74 28 70 43 6f 6e 73 74 2c  stInsert(pConst,
251e0 20 70 4c 65 66 74 2c 20 70 52 69 67 68 74 29 3b   pLeft, pRight);
251f0 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  .  }.}../*.** Th
25200 69 73 20 69 73 20 61 20 57 61 6c 6b 65 72 20 65  is is a Walker e
25210 78 70 72 65 73 73 69 6f 6e 20 63 61 6c 6c 62 61  xpression callba
25220 63 6b 2e 20 20 70 45 78 70 72 20 69 73 20 61 20  ck.  pExpr is a 
25230 63 61 6e 64 69 64 61 74 65 20 65 78 70 72 65 73  candidate expres
25240 73 69 6f 6e 0a 2a 2a 20 74 6f 20 62 65 20 72 65  sion.** to be re
25250 70 6c 61 63 65 64 20 62 79 20 61 20 76 61 6c 75  placed by a valu
25260 65 2e 20 20 49 66 20 70 45 78 70 72 20 69 73 20  e.  If pExpr is 
25270 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 20 6f 6e  equivalent to on
25280 65 20 6f 66 20 74 68 65 0a 2a 2a 20 63 6f 6c 75  e of the.** colu
25290 6d 6e 73 20 6e 61 6d 65 64 20 69 6e 20 70 57 61  mns named in pWa
252a0 6c 6b 65 72 2d 3e 75 2e 70 43 6f 6e 73 74 2c 20  lker->u.pConst, 
252b0 74 68 65 6e 20 6f 76 65 72 77 72 69 74 65 20 69  then overwrite i
252c0 74 20 77 69 74 68 20 69 74 73 0a 2a 2a 20 63 6f  t with its.** co
252d0 72 72 65 73 70 6f 6e 64 69 6e 67 20 76 61 6c 75  rresponding valu
252e0 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
252f0 20 70 72 6f 70 61 67 61 74 65 43 6f 6e 73 74 61   propagateConsta
25300 6e 74 45 78 70 72 52 65 77 72 69 74 65 28 57 61  ntExprRewrite(Wa
25310 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 45  lker *pWalker, E
25320 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 69  xpr *pExpr){.  i
25330 6e 74 20 69 3b 0a 20 20 57 68 65 72 65 43 6f 6e  nt i;.  WhereCon
25340 73 74 20 2a 70 43 6f 6e 73 74 3b 0a 20 20 69 66  st *pConst;.  if
25350 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f  ( pExpr->op!=TK_
25360 43 4f 4c 55 4d 4e 20 29 20 72 65 74 75 72 6e 20  COLUMN ) return 
25370 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20 20  WRC_Continue;.  
25380 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65  if( ExprHasPrope
25390 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 46 69  rty(pExpr, EP_Fi
253a0 78 65 64 43 6f 6c 29 20 29 20 72 65 74 75 72 6e  xedCol) ) return
253b0 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20   WRC_Continue;. 
253c0 20 70 43 6f 6e 73 74 20 3d 20 70 57 61 6c 6b 65   pConst = pWalke
253d0 72 2d 3e 75 2e 70 43 6f 6e 73 74 3b 0a 20 20 66  r->u.pConst;.  f
253e0 6f 72 28 69 3d 30 3b 20 69 3c 70 43 6f 6e 73 74  or(i=0; i<pConst
253f0 2d 3e 6e 43 6f 6e 73 74 3b 20 69 2b 2b 29 7b 0a  ->nConst; i++){.
25400 20 20 20 20 45 78 70 72 20 2a 70 43 6f 6c 75 6d      Expr *pColum
25410 6e 20 3d 20 70 43 6f 6e 73 74 2d 3e 61 70 45 78  n = pConst->apEx
25420 70 72 5b 69 2a 32 5d 3b 0a 20 20 20 20 69 66 28  pr[i*2];.    if(
25430 20 70 43 6f 6c 75 6d 6e 3d 3d 70 45 78 70 72 20   pColumn==pExpr 
25440 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
25450 69 66 28 20 70 43 6f 6c 75 6d 6e 2d 3e 69 54 61  if( pColumn->iTa
25460 62 6c 65 21 3d 70 45 78 70 72 2d 3e 69 54 61 62  ble!=pExpr->iTab
25470 6c 65 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  le ) continue;. 
25480 20 20 20 69 66 28 20 70 43 6f 6c 75 6d 6e 2d 3e     if( pColumn->
25490 69 43 6f 6c 75 6d 6e 21 3d 70 45 78 70 72 2d 3e  iColumn!=pExpr->
254a0 69 43 6f 6c 75 6d 6e 20 29 20 63 6f 6e 74 69 6e  iColumn ) contin
254b0 75 65 3b 0a 20 20 20 20 2f 2a 20 41 20 6d 61 74  ue;.    /* A mat
254c0 63 68 20 69 73 20 66 6f 75 6e 64 2e 20 20 41 64  ch is found.  Ad
254d0 64 20 74 68 65 20 45 50 5f 46 69 78 65 64 43 6f  d the EP_FixedCo
254e0 6c 20 70 72 6f 70 65 72 74 79 20 2a 2f 0a 20 20  l property */.  
254f0 20 20 70 43 6f 6e 73 74 2d 3e 6e 43 68 6e 67 2b    pConst->nChng+
25500 2b 3b 0a 20 20 20 20 45 78 70 72 43 6c 65 61 72  +;.    ExprClear
25510 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
25520 45 50 5f 4c 65 61 66 29 3b 0a 20 20 20 20 45 78  EP_Leaf);.    Ex
25530 70 72 53 65 74 50 72 6f 70 65 72 74 79 28 70 45  prSetProperty(pE
25540 78 70 72 2c 20 45 50 5f 46 69 78 65 64 43 6f 6c  xpr, EP_FixedCol
25550 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
25560 45 78 70 72 2d 3e 70 4c 65 66 74 3d 3d 30 20 29  Expr->pLeft==0 )
25570 3b 0a 20 20 20 20 70 45 78 70 72 2d 3e 70 4c 65  ;.    pExpr->pLe
25580 66 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ft = sqlite3Expr
25590 44 75 70 28 70 43 6f 6e 73 74 2d 3e 70 50 61 72  Dup(pConst->pPar
255a0 73 65 2d 3e 64 62 2c 20 70 43 6f 6e 73 74 2d 3e  se->db, pConst->
255b0 61 70 45 78 70 72 5b 69 2a 32 2b 31 5d 2c 20 30  apExpr[i*2+1], 0
255c0 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  );.    break;.  
255d0 7d 0a 20 20 72 65 74 75 72 6e 20 57 52 43 5f 50  }.  return WRC_P
255e0 72 75 6e 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  rune;.}../*.** T
255f0 68 65 20 57 48 45 52 45 2d 63 6c 61 75 73 65 20  he WHERE-clause 
25600 63 6f 6e 73 74 61 6e 74 20 70 72 6f 70 61 67 61  constant propaga
25610 74 69 6f 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f  tion optimizatio
25620 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  n..**.** If the 
25630 57 48 45 52 45 20 63 6c 61 75 73 65 20 63 6f 6e  WHERE clause con
25640 74 61 69 6e 73 20 74 65 72 6d 73 20 6f 66 20 74  tains terms of t
25650 68 65 20 66 6f 72 6d 20 43 4f 4c 55 4d 4e 3d 43  he form COLUMN=C
25660 4f 4e 53 54 41 4e 54 20 6f 72 0a 2a 2a 20 43 4f  ONSTANT or.** CO
25670 4e 53 54 41 4e 54 3d 43 4f 4c 55 4d 4e 20 74 68  NSTANT=COLUMN th
25680 61 74 20 6d 75 73 74 20 62 65 20 74 72 65 65 20  at must be tree 
25690 28 69 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c  (in other words,
256a0 20 69 66 20 74 68 65 20 74 65 72 6d 73 20 74 6f   if the terms to
256b0 70 2d 6c 65 76 65 6c 0a 2a 2a 20 41 4e 44 2d 63  p-level.** AND-c
256c0 6f 6e 6e 65 63 74 65 64 20 74 65 72 6d 73 20 74  onnected terms t
256d0 68 61 74 20 61 72 65 20 6e 6f 74 20 70 61 72 74  hat are not part
256e0 20 6f 66 20 61 20 4f 4e 20 63 6c 61 75 73 65 20   of a ON clause 
256f0 66 72 6f 6d 20 61 20 4c 45 46 54 20 4a 4f 49 4e  from a LEFT JOIN
25700 29 0a 2a 2a 20 74 68 65 6e 20 74 68 72 6f 75 67  ).** then throug
25710 68 6f 75 74 20 74 68 65 20 71 75 65 72 79 20 72  hout the query r
25720 65 70 6c 61 63 65 20 61 6c 6c 20 6f 74 68 65 72  eplace all other
25730 20 6f 63 63 75 72 72 65 6e 63 65 73 20 6f 66 20   occurrences of 
25740 43 4f 4c 55 4d 4e 0a 2a 2a 20 77 69 74 68 20 43  COLUMN.** with C
25750 4f 4e 53 54 41 4e 54 20 77 69 74 68 69 6e 20 74  ONSTANT within t
25760 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e  he WHERE clause.
25770 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65 78 61 6d 70  .**.** For examp
25780 6c 65 2c 20 74 68 65 20 71 75 65 72 79 3a 0a 2a  le, the query:.*
25790 2a 0a 2a 2a 20 20 20 20 20 20 53 45 4c 45 43 54  *.**      SELECT
257a0 20 2a 20 46 52 4f 4d 20 74 31 2c 20 74 32 2c 20   * FROM t1, t2, 
257b0 74 33 20 57 48 45 52 45 20 74 31 2e 61 3d 33 39  t3 WHERE t1.a=39
257c0 20 41 4e 44 20 74 32 2e 62 3d 74 31 2e 61 20 41   AND t2.b=t1.a A
257d0 4e 44 20 74 33 2e 63 3d 74 32 2e 62 0a 2a 2a 0a  ND t3.c=t2.b.**.
257e0 2a 2a 20 49 73 20 74 72 61 6e 73 66 6f 72 6d 65  ** Is transforme
257f0 64 20 69 6e 74 6f 0a 2a 2a 0a 2a 2a 20 20 20 20  d into.**.**    
25800 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
25810 74 31 2c 20 74 32 2c 20 74 33 20 57 48 45 52 45  t1, t2, t3 WHERE
25820 20 74 31 2e 61 3d 33 39 20 41 4e 44 20 74 32 2e   t1.a=39 AND t2.
25830 62 3d 33 39 20 41 4e 44 20 74 33 2e 63 3d 33 39  b=39 AND t3.c=39
25840 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72  .**.** Return tr
25850 75 65 20 69 66 20 61 6e 79 20 74 72 61 6e 73 66  ue if any transf
25860 6f 72 6d 61 74 69 6f 6e 73 20 77 68 65 72 65 20  ormations where 
25870 6d 61 64 65 20 61 6e 64 20 66 61 6c 73 65 20 69  made and false i
25880 66 20 6e 6f 74 2e 0a 2a 2a 0a 2a 2a 20 49 6d 70  f not..**.** Imp
25890 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6e 6f 74 65  lementation note
258a0 3a 20 20 43 6f 6e 73 74 61 6e 74 20 70 72 6f 70  :  Constant prop
258b0 61 67 61 74 69 6f 6e 20 69 73 20 74 72 69 63 6b  agation is trick
258c0 79 20 64 75 65 20 74 6f 20 61 66 66 69 6e 69 74  y due to affinit
258d0 79 0a 2a 2a 20 61 6e 64 20 63 6f 6c 6c 61 74 69  y.** and collati
258e0 6e 67 20 73 65 71 75 65 6e 63 65 20 69 6e 74 65  ng sequence inte
258f0 72 61 63 74 69 6f 6e 73 2e 20 20 43 6f 6e 73 69  ractions.  Consi
25900 64 65 72 20 74 68 69 73 20 65 78 61 6d 70 6c 65  der this example
25910 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 43 52 45 41 54  :.**.**    CREAT
25920 45 20 54 41 42 4c 45 20 74 31 28 61 20 49 4e 54  E TABLE t1(a INT
25930 2c 62 20 54 45 58 54 29 3b 0a 2a 2a 20 20 20 20  ,b TEXT);.**    
25940 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56  INSERT INTO t1 V
25950 41 4c 55 45 53 28 31 32 33 2c 27 30 31 32 33 27  ALUES(123,'0123'
25960 29 3b 0a 2a 2a 20 20 20 20 53 45 4c 45 43 54 20  );.**    SELECT 
25970 2a 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20  * FROM t1 WHERE 
25980 61 3d 31 32 33 20 41 4e 44 20 62 3d 61 3b 0a 2a  a=123 AND b=a;.*
25990 2a 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52  *    SELECT * FR
259a0 4f 4d 20 74 31 20 57 48 45 52 45 20 61 3d 31 32  OM t1 WHERE a=12
259b0 33 20 41 4e 44 20 62 3d 31 32 33 3b 0a 2a 2a 0a  3 AND b=123;.**.
259c0 2a 2a 20 54 68 65 20 74 77 6f 20 53 45 4c 45 43  ** The two SELEC
259d0 54 20 73 74 61 74 65 6d 65 6e 74 73 20 61 62 6f  T statements abo
259e0 76 65 20 73 68 6f 75 6c 64 20 72 65 74 75 72 6e  ve should return
259f0 20 64 69 66 66 65 72 65 6e 74 20 61 6e 73 77 65   different answe
25a00 72 73 2e 20 20 62 3d 61 0a 2a 2a 20 69 73 20 61  rs.  b=a.** is a
25a10 6c 77 61 79 20 74 72 75 65 20 62 65 63 61 75 73  lway true becaus
25a20 65 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e  e the comparison
25a30 20 75 73 65 73 20 6e 75 6d 65 72 69 63 20 61 66   uses numeric af
25a40 66 69 6e 69 74 79 2c 20 62 75 74 20 62 3d 31 32  finity, but b=12
25a50 33 0a 2a 2a 20 69 73 20 66 61 6c 73 65 20 62 65  3.** is false be
25a60 63 61 75 73 65 20 69 74 20 75 73 65 73 20 74 65  cause it uses te
25a70 78 74 20 61 66 66 69 6e 69 74 79 20 61 6e 64 20  xt affinity and 
25a80 27 30 31 32 33 27 20 69 73 20 6e 6f 74 20 74 68  '0123' is not th
25a90 65 20 73 61 6d 65 20 61 73 20 27 31 32 33 27 2e  e same as '123'.
25aa0 0a 2a 2a 20 54 6f 20 77 6f 72 6b 20 61 72 6f 75  .** To work arou
25ab0 6e 64 20 74 68 69 73 2c 20 74 68 65 20 65 78 70  nd this, the exp
25ac0 72 65 73 73 69 6f 6e 20 74 72 65 65 20 69 73 20  ression tree is 
25ad0 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 63 68 61  not actually cha
25ae0 6e 67 65 64 20 66 72 6f 6d 0a 2a 2a 20 22 62 3d  nged from.** "b=
25af0 61 22 20 74 6f 20 22 62 3d 31 32 33 22 20 62 75  a" to "b=123" bu
25b00 74 20 72 61 74 68 65 72 20 74 68 65 20 22 61 22  t rather the "a"
25b10 20 69 6e 20 22 62 3d 61 22 20 69 73 20 74 61 67   in "b=a" is tag
25b20 67 65 64 20 77 69 74 68 20 45 50 5f 46 69 78 65  ged with EP_Fixe
25b30 64 43 6f 6c 0a 2a 2a 20 61 6e 64 20 74 68 65 20  dCol.** and the 
25b40 22 31 32 33 22 20 76 61 6c 75 65 20 69 73 20 68  "123" value is h
25b50 75 6e 67 20 6f 66 66 20 6f 66 20 74 68 65 20 70  ung off of the p
25b60 4c 65 66 74 20 70 6f 69 6e 74 65 72 2e 20 20 43  Left pointer.  C
25b70 6f 64 65 20 67 65 6e 65 72 61 74 6f 72 0a 2a 2a  ode generator.**
25b80 20 72 6f 75 74 69 6e 65 73 20 6b 6e 6f 77 20 74   routines know t
25b90 6f 20 67 65 6e 65 72 61 74 65 20 74 68 65 20 63  o generate the c
25ba0 6f 6e 73 74 61 6e 74 20 22 31 32 33 22 20 69 6e  onstant "123" in
25bb0 73 74 65 61 64 20 6f 66 20 6c 6f 6f 6b 69 6e 67  stead of looking
25bc0 20 75 70 20 74 68 65 0a 2a 2a 20 63 6f 6c 75 6d   up the.** colum
25bd0 6e 20 76 61 6c 75 65 2e 20 20 41 6c 73 6f 2c 20  n value.  Also, 
25be0 74 6f 20 61 76 6f 69 64 20 63 6f 6c 6c 61 74 69  to avoid collati
25bf0 6f 6e 20 70 72 6f 62 6c 65 6d 73 2c 20 74 68 69  on problems, thi
25c00 73 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69  s optimization i
25c10 73 0a 2a 2a 20 6f 6e 6c 79 20 61 74 74 65 6d 70  s.** only attemp
25c20 74 65 64 20 69 66 20 74 68 65 20 22 61 3d 31 32  ted if the "a=12
25c30 33 22 20 74 65 72 6d 20 75 73 65 73 20 74 68 65  3" term uses the
25c40 20 64 65 66 61 75 6c 74 20 42 49 4e 41 52 59 20   default BINARY 
25c50 63 6f 6c 6c 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74  collation..*/.st
25c60 61 74 69 63 20 69 6e 74 20 70 72 6f 70 61 67 61  atic int propaga
25c70 74 65 43 6f 6e 73 74 61 6e 74 73 28 0a 20 20 50  teConstants(.  P
25c80 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
25c90 2f 2a 20 54 68 65 20 70 61 72 73 69 6e 67 20 63  /* The parsing c
25ca0 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65  ontext */.  Sele
25cb0 63 74 20 2a 70 20 20 20 20 20 20 20 20 2f 2a 20  ct *p        /* 
25cc0 54 68 65 20 71 75 65 72 79 20 69 6e 20 77 68 69  The query in whi
25cd0 63 68 20 74 6f 20 70 72 6f 70 61 67 61 74 65 20  ch to propagate 
25ce0 63 6f 6e 73 74 61 6e 74 73 20 2a 2f 0a 29 7b 0a  constants */.){.
25cf0 20 20 57 68 65 72 65 43 6f 6e 73 74 20 78 3b 0a    WhereConst x;.
25d00 20 20 57 61 6c 6b 65 72 20 77 3b 0a 20 20 69 6e    Walker w;.  in
25d10 74 20 6e 43 68 6e 67 20 3d 20 30 3b 0a 20 20 78  t nChng = 0;.  x
25d20 2e 70 50 61 72 73 65 20 3d 20 70 50 61 72 73 65  .pParse = pParse
25d30 3b 0a 20 20 64 6f 7b 0a 20 20 20 20 78 2e 6e 43  ;.  do{.    x.nC
25d40 6f 6e 73 74 20 3d 20 30 3b 0a 20 20 20 20 78 2e  onst = 0;.    x.
25d50 6e 43 68 6e 67 20 3d 20 30 3b 0a 20 20 20 20 78  nChng = 0;.    x
25d60 2e 61 70 45 78 70 72 20 3d 20 30 3b 0a 20 20 20  .apExpr = 0;.   
25d70 20 66 69 6e 64 43 6f 6e 73 74 49 6e 57 68 65 72   findConstInWher
25d80 65 28 26 78 2c 20 70 2d 3e 70 57 68 65 72 65 29  e(&x, p->pWhere)
25d90 3b 0a 20 20 20 20 69 66 28 20 78 2e 6e 43 6f 6e  ;.    if( x.nCon
25da0 73 74 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 73  st ){.      mems
25db0 65 74 28 26 77 2c 20 30 2c 20 73 69 7a 65 6f 66  et(&w, 0, sizeof
25dc0 28 77 29 29 3b 0a 20 20 20 20 20 20 77 2e 70 50  (w));.      w.pP
25dd0 61 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20  arse = pParse;. 
25de0 20 20 20 20 20 77 2e 78 45 78 70 72 43 61 6c 6c       w.xExprCall
25df0 62 61 63 6b 20 3d 20 70 72 6f 70 61 67 61 74 65  back = propagate
25e00 43 6f 6e 73 74 61 6e 74 45 78 70 72 52 65 77 72  ConstantExprRewr
25e10 69 74 65 3b 0a 20 20 20 20 20 20 77 2e 78 53 65  ite;.      w.xSe
25e20 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20 3d 20 73  lectCallback = s
25e30 71 6c 69 74 65 33 53 65 6c 65 63 74 57 61 6c 6b  qlite3SelectWalk
25e40 4e 6f 6f 70 3b 0a 20 20 20 20 20 20 77 2e 78 53  Noop;.      w.xS
25e50 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 32 20 3d  electCallback2 =
25e60 20 30 3b 0a 20 20 20 20 20 20 77 2e 77 61 6c 6b   0;.      w.walk
25e70 65 72 44 65 70 74 68 20 3d 20 30 3b 0a 20 20 20  erDepth = 0;.   
25e80 20 20 20 77 2e 75 2e 70 43 6f 6e 73 74 20 3d 20     w.u.pConst = 
25e90 26 78 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  &x;.      sqlite
25ea0 33 57 61 6c 6b 45 78 70 72 28 26 77 2c 20 70 2d  3WalkExpr(&w, p-
25eb0 3e 70 57 68 65 72 65 29 3b 0a 20 20 20 20 20 20  >pWhere);.      
25ec0 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 78 2e  sqlite3DbFree(x.
25ed0 70 50 61 72 73 65 2d 3e 64 62 2c 20 78 2e 61 70  pParse->db, x.ap
25ee0 45 78 70 72 29 3b 0a 20 20 20 20 20 20 6e 43 68  Expr);.      nCh
25ef0 6e 67 20 2b 3d 20 78 2e 6e 43 68 6e 67 3b 0a 20  ng += x.nChng;. 
25f00 20 20 20 7d 0a 20 20 7d 77 68 69 6c 65 28 20 78     }.  }while( x
25f10 2e 6e 43 68 6e 67 20 29 3b 20 20 0a 20 20 72 65  .nChng );  .  re
25f20 74 75 72 6e 20 6e 43 68 6e 67 3b 0a 7d 0a 0a 23  turn nChng;.}..#
25f30 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
25f40 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
25f50 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51  ) || !defined(SQ
25f60 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 0a  LITE_OMIT_VIEW).
25f70 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 63 6f 70 69 65  /*.** Make copie
25f80 73 20 6f 66 20 72 65 6c 65 76 61 6e 74 20 57 48  s of relevant WH
25f90 45 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d 73  ERE clause terms
25fa0 20 6f 66 20 74 68 65 20 6f 75 74 65 72 20 71 75   of the outer qu
25fb0 65 72 79 20 69 6e 74 6f 0a 2a 2a 20 74 68 65 20  ery into.** the 
25fc0 57 48 45 52 45 20 63 6c 61 75 73 65 20 6f 66 20  WHERE clause of 
25fd0 73 75 62 71 75 65 72 79 2e 20 20 45 78 61 6d 70  subquery.  Examp
25fe0 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 53 45 4c  le:.**.**    SEL
25ff0 45 43 54 20 2a 20 46 52 4f 4d 20 28 53 45 4c 45  ECT * FROM (SELE
26000 43 54 20 61 20 41 53 20 78 2c 20 63 2d 64 20 41  CT a AS x, c-d A
26010 53 20 79 20 46 52 4f 4d 20 74 31 29 20 57 48 45  S y FROM t1) WHE
26020 52 45 20 78 3d 35 20 41 4e 44 20 79 3d 31 30 3b  RE x=5 AND y=10;
26030 0a 2a 2a 0a 2a 2a 20 54 72 61 6e 73 66 6f 72 6d  .**.** Transform
26040 65 64 20 69 6e 74 6f 3a 0a 2a 2a 0a 2a 2a 20 20  ed into:.**.**  
26050 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
26060 28 53 45 4c 45 43 54 20 61 20 41 53 20 78 2c 20  (SELECT a AS x, 
26070 63 2d 64 20 41 53 20 79 20 46 52 4f 4d 20 74 31  c-d AS y FROM t1
26080 20 57 48 45 52 45 20 61 3d 35 20 41 4e 44 20 63   WHERE a=5 AND c
26090 2d 64 3d 31 30 29 0a 2a 2a 20 20 20 20 20 57 48  -d=10).**     WH
260a0 45 52 45 20 78 3d 35 20 41 4e 44 20 79 3d 31 30  ERE x=5 AND y=10
260b0 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 20 68 6f 70 65  ;.**.** The hope
260c0 20 69 73 20 74 68 61 74 20 74 68 65 20 74 65 72   is that the ter
260d0 6d 73 20 61 64 64 65 64 20 74 6f 20 74 68 65 20  ms added to the 
260e0 69 6e 6e 65 72 20 71 75 65 72 79 20 77 69 6c 6c  inner query will
260f0 20 6d 61 6b 65 20 69 74 20 6d 6f 72 65 0a 2a 2a   make it more.**
26100 20 65 66 66 69 63 69 65 6e 74 2e 0a 2a 2a 0a 2a   efficient..**.*
26110 2a 20 44 6f 20 6e 6f 74 20 61 74 74 65 6d 70 74  * Do not attempt
26120 20 74 68 69 73 20 6f 70 74 69 6d 69 7a 61 74 69   this optimizati
26130 6f 6e 20 69 66 3a 0a 2a 2a 0a 2a 2a 20 20 20 28  on if:.**.**   (
26140 31 29 20 28 2a 2a 20 54 68 69 73 20 72 65 73 74  1) (** This rest
26150 72 69 63 74 69 6f 6e 20 77 61 73 20 72 65 6d 6f  riction was remo
26160 76 65 64 20 6f 6e 20 32 30 31 37 2d 30 39 2d 32  ved on 2017-09-2
26170 39 2e 20 20 57 65 20 75 73 65 64 20 74 6f 0a 2a  9.  We used to.*
26180 2a 20 20 20 20 20 20 20 20 20 20 20 64 69 73 61  *           disa
26190 6c 6c 6f 77 20 74 68 69 73 20 6f 70 74 69 6d 69  llow this optimi
261a0 7a 61 74 69 6f 6e 20 66 6f 72 20 61 67 67 72 65  zation for aggre
261b0 67 61 74 65 20 73 75 62 71 75 65 72 69 65 73 2c  gate subqueries,
261c0 20 62 75 74 20 6e 6f 77 0a 2a 2a 20 20 20 20 20   but now.**     
261d0 20 20 20 20 20 20 69 74 20 69 73 20 61 6c 6c 6f        it is allo
261e0 77 65 64 20 62 79 20 70 75 74 74 69 6e 67 20 74  wed by putting t
261f0 68 65 20 65 78 74 72 61 20 74 65 72 6d 73 20 6f  he extra terms o
26200 6e 20 74 68 65 20 48 41 56 49 4e 47 20 63 6c 61  n the HAVING cla
26210 75 73 65 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20  use..**         
26220 20 20 54 68 65 20 61 64 64 65 64 20 48 41 56 49    The added HAVI
26230 4e 47 20 63 6c 61 75 73 65 20 69 73 20 70 6f 69  NG clause is poi
26240 6e 74 6c 65 73 73 20 69 66 20 74 68 65 20 73 75  ntless if the su
26250 62 71 75 65 72 79 20 6c 61 63 6b 73 0a 2a 2a 20  bquery lacks.** 
26260 20 20 20 20 20 20 20 20 20 20 61 20 47 52 4f 55            a GROU
26270 50 20 42 59 20 63 6c 61 75 73 65 2e 20 20 42 75  P BY clause.  Bu
26280 74 20 73 75 63 68 20 61 20 48 41 56 49 4e 47 20  t such a HAVING 
26290 63 6c 61 75 73 65 20 69 73 20 61 6c 73 6f 20 68  clause is also h
262a0 61 72 6d 6c 65 73 73 0a 2a 2a 20 20 20 20 20 20  armless.**      
262b0 20 20 20 20 20 73 6f 20 74 68 65 72 65 20 64 6f       so there do
262c0 65 73 20 6e 6f 74 20 61 70 70 65 61 72 20 74 6f  es not appear to
262d0 20 62 65 20 61 6e 79 20 72 65 61 73 6f 6e 20 74   be any reason t
262e0 6f 20 61 64 64 20 65 78 74 72 61 20 6c 6f 67 69  o add extra logi
262f0 63 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 74  c.**           t
26300 6f 20 73 75 70 70 72 65 73 73 20 69 74 2e 20 2a  o suppress it. *
26310 2a 29 0a 2a 2a 0a 2a 2a 20 20 20 28 32 29 20 54  *).**.**   (2) T
26320 68 65 20 69 6e 6e 65 72 20 71 75 65 72 79 20 69  he inner query i
26330 73 20 74 68 65 20 72 65 63 75 72 73 69 76 65 20  s the recursive 
26340 70 61 72 74 20 6f 66 20 61 20 63 6f 6d 6d 6f 6e  part of a common
26350 20 74 61 62 6c 65 20 65 78 70 72 65 73 73 69 6f   table expressio
26360 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 33 29 20 54  n..**.**   (3) T
26370 68 65 20 69 6e 6e 65 72 20 71 75 65 72 79 20 68  he inner query h
26380 61 73 20 61 20 4c 49 4d 49 54 20 63 6c 61 75 73  as a LIMIT claus
26390 65 20 28 73 69 6e 63 65 20 74 68 65 20 63 68 61  e (since the cha
263a0 6e 67 65 73 20 74 6f 20 74 68 65 20 57 48 45 52  nges to the WHER
263b0 45 0a 2a 2a 20 20 20 20 20 20 20 63 6c 61 75 73  E.**       claus
263c0 65 20 77 6f 75 6c 64 20 63 68 61 6e 67 65 20 74  e would change t
263d0 68 65 20 6d 65 61 6e 69 6e 67 20 6f 66 20 74 68  he meaning of th
263e0 65 20 4c 49 4d 49 54 29 2e 0a 2a 2a 0a 2a 2a 20  e LIMIT)..**.** 
263f0 20 20 28 34 29 20 54 68 65 20 69 6e 6e 65 72 20    (4) The inner 
26400 71 75 65 72 79 20 69 73 20 74 68 65 20 72 69 67  query is the rig
26410 68 74 20 6f 70 65 72 61 6e 64 20 6f 66 20 61 20  ht operand of a 
26420 4c 45 46 54 20 4a 4f 49 4e 20 61 6e 64 20 74 68  LEFT JOIN and th
26430 65 0a 2a 2a 20 20 20 20 20 20 20 65 78 70 72 65  e.**       expre
26440 73 73 69 6f 6e 20 74 6f 20 62 65 20 70 75 73 68  ssion to be push
26450 65 64 20 64 6f 77 6e 20 64 6f 65 73 20 6e 6f 74  ed down does not
26460 20 63 6f 6d 65 20 66 72 6f 6d 20 74 68 65 20 4f   come from the O
26470 4e 20 63 6c 61 75 73 65 0a 2a 2a 20 20 20 20 20  N clause.**     
26480 20 20 6f 6e 20 74 68 61 74 20 4c 45 46 54 20 4a    on that LEFT J
26490 4f 49 4e 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 35 29  OIN..**.**   (5)
264a0 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   The WHERE claus
264b0 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6f 72 69  e expression ori
264c0 67 69 6e 61 74 65 73 20 69 6e 20 74 68 65 20 4f  ginates in the O
264d0 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73  N or USING claus
264e0 65 0a 2a 2a 20 20 20 20 20 20 20 6f 66 20 61 20  e.**       of a 
264f0 4c 45 46 54 20 4a 4f 49 4e 20 77 68 65 72 65 20  LEFT JOIN where 
26500 69 43 75 72 73 6f 72 20 69 73 20 6e 6f 74 20 74  iCursor is not t
26510 68 65 20 72 69 67 68 74 2d 68 61 6e 64 20 74 61  he right-hand ta
26520 62 6c 65 20 6f 66 20 74 68 61 74 0a 2a 2a 20 20  ble of that.**  
26530 20 20 20 20 20 6c 65 66 74 20 6a 6f 69 6e 2e 20       left join. 
26540 20 41 6e 20 65 78 61 6d 70 6c 65 3a 0a 2a 2a 0a   An example:.**.
26550 2a 2a 20 20 20 20 20 20 20 20 20 20 20 53 45 4c  **           SEL
26560 45 43 54 20 2a 0a 2a 2a 20 20 20 20 20 20 20 20  ECT *.**        
26570 20 20 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20     FROM (SELECT 
26580 31 20 41 53 20 61 31 20 55 4e 49 4f 4e 20 41 4c  1 AS a1 UNION AL
26590 4c 20 53 45 4c 45 43 54 20 32 29 20 41 53 20 61  L SELECT 2) AS a
265a0 61 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 4a  a.**           J
265b0 4f 49 4e 20 28 53 45 4c 45 43 54 20 31 20 41 53  OIN (SELECT 1 AS
265c0 20 62 32 20 55 4e 49 4f 4e 20 41 4c 4c 20 53 45   b2 UNION ALL SE
265d0 4c 45 43 54 20 32 29 20 41 53 20 62 62 20 4f 4e  LECT 2) AS bb ON
265e0 20 28 61 31 3d 62 32 29 0a 2a 2a 20 20 20 20 20   (a1=b2).**     
265f0 20 20 20 20 20 20 4c 45 46 54 20 4a 4f 49 4e 20        LEFT JOIN 
26600 28 53 45 4c 45 43 54 20 38 20 41 53 20 63 33 20  (SELECT 8 AS c3 
26610 55 4e 49 4f 4e 20 41 4c 4c 20 53 45 4c 45 43 54  UNION ALL SELECT
26620 20 39 29 20 41 53 20 63 63 20 4f 4e 20 28 62 32   9) AS cc ON (b2
26630 3d 32 29 3b 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  =2);.**.**      
26640 20 54 68 65 20 63 6f 72 72 65 63 74 20 61 6e 73   The correct ans
26650 77 65 72 20 69 73 20 74 68 72 65 65 20 72 6f 77  wer is three row
26660 73 3a 20 20 28 31 2c 31 2c 4e 55 4c 4c 29 2c 28  s:  (1,1,NULL),(
26670 32 2c 32 2c 38 29 2c 28 32 2c 32 2c 39 29 2e 0a  2,2,8),(2,2,9)..
26680 2a 2a 20 20 20 20 20 20 20 42 75 74 20 69 66 20  **       But if 
26690 74 68 65 20 28 62 32 3d 32 29 20 74 65 72 6d 20  the (b2=2) term 
266a0 77 65 72 65 20 74 6f 20 62 65 20 70 75 73 68 65  were to be pushe
266b0 64 20 64 6f 77 6e 20 69 6e 74 6f 20 74 68 65 20  d down into the 
266c0 62 62 20 73 75 62 71 75 65 72 79 2c 0a 2a 2a 20  bb subquery,.** 
266d0 20 20 20 20 20 20 74 68 65 6e 20 74 68 65 20 28        then the (
266e0 31 2c 31 2c 4e 55 4c 4c 29 20 72 6f 77 20 77 6f  1,1,NULL) row wo
266f0 75 6c 64 20 62 65 20 73 75 70 70 72 65 73 73 65  uld be suppresse
26700 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 36 29 20 54  d..**.**   (6) T
26710 68 65 20 69 6e 6e 65 72 20 71 75 65 72 79 20 66  he inner query f
26720 65 61 74 75 72 65 73 20 6f 6e 65 20 6f 72 20 6d  eatures one or m
26730 6f 72 65 20 77 69 6e 64 6f 77 2d 66 75 6e 63 74  ore window-funct
26740 69 6f 6e 73 20 28 73 69 6e 63 65 20 0a 2a 2a 20  ions (since .** 
26750 20 20 20 20 20 20 63 68 61 6e 67 65 73 20 74 6f        changes to
26760 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
26770 65 20 6f 66 20 74 68 65 20 69 6e 6e 65 72 20 71  e of the inner q
26780 75 65 72 79 20 63 6f 75 6c 64 20 63 68 61 6e 67  uery could chang
26790 65 20 74 68 65 20 0a 2a 2a 20 20 20 20 20 20 20  e the .**       
267a0 77 69 6e 64 6f 77 20 6f 76 65 72 20 77 68 69 63  window over whic
267b0 68 20 77 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f  h window functio
267c0 6e 73 20 61 72 65 20 63 61 6c 63 75 6c 61 74 65  ns are calculate
267d0 64 29 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  d)..**.** Return
267e0 20 30 20 69 66 20 6e 6f 20 63 68 61 6e 67 65 73   0 if no changes
267f0 20 61 72 65 20 6d 61 64 65 20 61 6e 64 20 6e 6f   are made and no
26800 6e 2d 7a 65 72 6f 20 69 66 20 6f 6e 65 20 6f 72  n-zero if one or
26810 20 6d 6f 72 65 20 57 48 45 52 45 20 63 6c 61 75   more WHERE clau
26820 73 65 0a 2a 2a 20 74 65 72 6d 73 20 61 72 65 20  se.** terms are 
26830 64 75 70 6c 69 63 61 74 65 64 20 69 6e 74 6f 20  duplicated into 
26840 74 68 65 20 73 75 62 71 75 65 72 79 2e 0a 2a 2f  the subquery..*/
26850 0a 73 74 61 74 69 63 20 69 6e 74 20 70 75 73 68  .static int push
26860 44 6f 77 6e 57 68 65 72 65 54 65 72 6d 73 28 0a  DownWhereTerms(.
26870 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
26880 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65          /* Parse
26890 20 63 6f 6e 74 65 78 74 20 28 66 6f 72 20 6d 61   context (for ma
268a0 6c 6c 6f 63 28 29 20 61 6e 64 20 65 72 72 6f 72  lloc() and error
268b0 20 72 65 70 6f 72 74 69 6e 67 29 20 2a 2f 0a 20   reporting) */. 
268c0 20 53 65 6c 65 63 74 20 2a 70 53 75 62 71 2c 20   Select *pSubq, 
268d0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73 75         /* The su
268e0 62 71 75 65 72 79 20 77 68 6f 73 65 20 57 48 45  bquery whose WHE
268f0 52 45 20 63 6c 61 75 73 65 20 69 73 20 74 6f 20  RE clause is to 
26900 62 65 20 61 75 67 6d 65 6e 74 65 64 20 2a 2f 0a  be augmented */.
26910 20 20 45 78 70 72 20 2a 70 57 68 65 72 65 2c 20    Expr *pWhere, 
26920 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57          /* The W
26930 48 45 52 45 20 63 6c 61 75 73 65 20 6f 66 20 74  HERE clause of t
26940 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 2a  he outer query *
26950 2f 0a 20 20 69 6e 74 20 69 43 75 72 73 6f 72 2c  /.  int iCursor,
26960 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72            /* Cur
26970 73 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20 74 68  sor number of th
26980 65 20 73 75 62 71 75 65 72 79 20 2a 2f 0a 20 20  e subquery */.  
26990 69 6e 74 20 69 73 4c 65 66 74 4a 6f 69 6e 20 20  int isLeftJoin  
269a0 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
269b0 20 70 53 75 62 71 20 69 73 20 74 68 65 20 72 69   pSubq is the ri
269c0 67 68 74 20 74 65 72 6d 20 6f 66 20 61 20 4c 45  ght term of a LE
269d0 46 54 20 4a 4f 49 4e 20 2a 2f 0a 29 7b 0a 20 20  FT JOIN */.){.  
269e0 45 78 70 72 20 2a 70 4e 65 77 3b 0a 20 20 69 6e  Expr *pNew;.  in
269f0 74 20 6e 43 68 6e 67 20 3d 20 30 3b 0a 20 20 69  t nChng = 0;.  i
26a00 66 28 20 70 57 68 65 72 65 3d 3d 30 20 29 20 72  f( pWhere==0 ) r
26a10 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70  eturn 0;.  if( p
26a20 53 75 62 71 2d 3e 73 65 6c 46 6c 61 67 73 20 26  Subq->selFlags &
26a30 20 53 46 5f 52 65 63 75 72 73 69 76 65 20 29 20   SF_Recursive ) 
26a40 72 65 74 75 72 6e 20 30 3b 20 20 2f 2a 20 72 65  return 0;  /* re
26a50 73 74 72 69 63 74 69 6f 6e 20 28 32 29 20 2a 2f  striction (2) */
26a60 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
26a70 5f 4f 4d 49 54 5f 57 49 4e 44 4f 57 46 55 4e 43  _OMIT_WINDOWFUNC
26a80 0a 20 20 69 66 28 20 70 53 75 62 71 2d 3e 70 57  .  if( pSubq->pW
26a90 69 6e 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20  in ) return 0;  
26aa0 20 20 2f 2a 20 72 65 73 74 72 69 63 74 69 6f 6e    /* restriction
26ab0 20 28 36 29 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a   (6) */.#endif..
26ac0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
26ad0 42 55 47 0a 20 20 2f 2a 20 4f 6e 6c 79 20 74 68  BUG.  /* Only th
26ae0 65 20 66 69 72 73 74 20 74 65 72 6d 20 6f 66 20  e first term of 
26af0 61 20 63 6f 6d 70 6f 75 6e 64 20 63 61 6e 20 68  a compound can h
26b00 61 76 65 20 61 20 57 49 54 48 20 63 6c 61 75 73  ave a WITH claus
26b10 65 2e 20 20 42 75 74 20 6d 61 6b 65 0a 20 20 2a  e.  But make.  *
26b20 2a 20 73 75 72 65 20 6e 6f 20 6f 74 68 65 72 20  * sure no other 
26b30 74 65 72 6d 73 20 61 72 65 20 6d 61 72 6b 65 64  terms are marked
26b40 20 53 46 5f 52 65 63 75 72 73 69 76 65 20 69 6e   SF_Recursive in
26b50 20 63 61 73 65 20 73 6f 6d 65 74 68 69 6e 67 20   case something 
26b60 63 68 61 6e 67 65 73 0a 20 20 2a 2a 20 69 6e 20  changes.  ** in 
26b70 74 68 65 20 66 75 74 75 72 65 2e 0a 20 20 2a 2f  the future..  */
26b80 0a 20 20 7b 0a 20 20 20 20 53 65 6c 65 63 74 20  .  {.    Select 
26b90 2a 70 58 3b 20 20 0a 20 20 20 20 66 6f 72 28 70  *pX;  .    for(p
26ba0 58 3d 70 53 75 62 71 3b 20 70 58 3b 20 70 58 3d  X=pSubq; pX; pX=
26bb0 70 58 2d 3e 70 50 72 69 6f 72 29 7b 0a 20 20 20  pX->pPrior){.   
26bc0 20 20 20 61 73 73 65 72 74 28 20 28 70 58 2d 3e     assert( (pX->
26bd0 73 65 6c 46 6c 61 67 73 20 26 20 28 53 46 5f 52  selFlags & (SF_R
26be0 65 63 75 72 73 69 76 65 29 29 3d 3d 30 20 29 3b  ecursive))==0 );
26bf0 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
26c00 66 0a 0a 20 20 69 66 28 20 70 53 75 62 71 2d 3e  f..  if( pSubq->
26c10 70 4c 69 6d 69 74 21 3d 30 20 29 7b 0a 20 20 20  pLimit!=0 ){.   
26c20 20 72 65 74 75 72 6e 20 30 3b 20 2f 2a 20 72 65   return 0; /* re
26c30 73 74 72 69 63 74 69 6f 6e 20 28 33 29 20 2a 2f  striction (3) */
26c40 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28 20 70 57  .  }.  while( pW
26c50 68 65 72 65 2d 3e 6f 70 3d 3d 54 4b 5f 41 4e 44  here->op==TK_AND
26c60 20 29 7b 0a 20 20 20 20 6e 43 68 6e 67 20 2b 3d   ){.    nChng +=
26c70 20 70 75 73 68 44 6f 77 6e 57 68 65 72 65 54 65   pushDownWhereTe
26c80 72 6d 73 28 70 50 61 72 73 65 2c 20 70 53 75 62  rms(pParse, pSub
26c90 71 2c 20 70 57 68 65 72 65 2d 3e 70 52 69 67 68  q, pWhere->pRigh
26ca0 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  t,.             
26cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26cc0 20 20 20 69 43 75 72 73 6f 72 2c 20 69 73 4c 65     iCursor, isLe
26cd0 66 74 4a 6f 69 6e 29 3b 0a 20 20 20 20 70 57 68  ftJoin);.    pWh
26ce0 65 72 65 20 3d 20 70 57 68 65 72 65 2d 3e 70 4c  ere = pWhere->pL
26cf0 65 66 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69  eft;.  }.  if( i
26d00 73 4c 65 66 74 4a 6f 69 6e 0a 20 20 20 26 26 20  sLeftJoin.   && 
26d10 28 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  (ExprHasProperty
26d20 28 70 57 68 65 72 65 2c 45 50 5f 46 72 6f 6d 4a  (pWhere,EP_FromJ
26d30 6f 69 6e 29 3d 3d 30 0a 20 20 20 20 20 20 20 20  oin)==0.        
26d40 20 7c 7c 20 70 57 68 65 72 65 2d 3e 69 52 69 67   || pWhere->iRig
26d50 68 74 4a 6f 69 6e 54 61 62 6c 65 21 3d 69 43 75  htJoinTable!=iCu
26d60 72 73 6f 72 29 0a 20 20 29 7b 0a 20 20 20 20 72  rsor).  ){.    r
26d70 65 74 75 72 6e 20 30 3b 20 2f 2a 20 72 65 73 74  eturn 0; /* rest
26d80 72 69 63 74 69 6f 6e 20 28 34 29 20 2a 2f 0a 20  riction (4) */. 
26d90 20 7d 0a 20 20 69 66 28 20 45 78 70 72 48 61 73   }.  if( ExprHas
26da0 50 72 6f 70 65 72 74 79 28 70 57 68 65 72 65 2c  Property(pWhere,
26db0 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 26 26 20  EP_FromJoin) && 
26dc0 70 57 68 65 72 65 2d 3e 69 52 69 67 68 74 4a 6f  pWhere->iRightJo
26dd0 69 6e 54 61 62 6c 65 21 3d 69 43 75 72 73 6f 72  inTable!=iCursor
26de0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
26df0 3b 20 2f 2a 20 72 65 73 74 72 69 63 74 69 6f 6e  ; /* restriction
26e00 20 28 35 29 20 2a 2f 0a 20 20 7d 0a 20 20 69 66   (5) */.  }.  if
26e10 28 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 54  ( sqlite3ExprIsT
26e20 61 62 6c 65 43 6f 6e 73 74 61 6e 74 28 70 57 68  ableConstant(pWh
26e30 65 72 65 2c 20 69 43 75 72 73 6f 72 29 20 29 7b  ere, iCursor) ){
26e40 0a 20 20 20 20 6e 43 68 6e 67 2b 2b 3b 0a 20 20  .    nChng++;.  
26e50 20 20 77 68 69 6c 65 28 20 70 53 75 62 71 20 29    while( pSubq )
26e60 7b 0a 20 20 20 20 20 20 53 75 62 73 74 43 6f 6e  {.      SubstCon
26e70 74 65 78 74 20 78 3b 0a 20 20 20 20 20 20 70 4e  text x;.      pN
26e80 65 77 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ew = sqlite3Expr
26e90 44 75 70 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  Dup(pParse->db, 
26ea0 70 57 68 65 72 65 2c 20 30 29 3b 0a 20 20 20 20  pWhere, 0);.    
26eb0 20 20 75 6e 73 65 74 4a 6f 69 6e 45 78 70 72 28    unsetJoinExpr(
26ec0 70 4e 65 77 2c 20 2d 31 29 3b 0a 20 20 20 20 20  pNew, -1);.     
26ed0 20 78 2e 70 50 61 72 73 65 20 3d 20 70 50 61 72   x.pParse = pPar
26ee0 73 65 3b 0a 20 20 20 20 20 20 78 2e 69 54 61 62  se;.      x.iTab
26ef0 6c 65 20 3d 20 69 43 75 72 73 6f 72 3b 0a 20 20  le = iCursor;.  
26f00 20 20 20 20 78 2e 69 4e 65 77 54 61 62 6c 65 20      x.iNewTable 
26f10 3d 20 69 43 75 72 73 6f 72 3b 0a 20 20 20 20 20  = iCursor;.     
26f20 20 78 2e 69 73 4c 65 66 74 4a 6f 69 6e 20 3d 20   x.isLeftJoin = 
26f30 30 3b 0a 20 20 20 20 20 20 78 2e 70 45 4c 69 73  0;.      x.pELis
26f40 74 20 3d 20 70 53 75 62 71 2d 3e 70 45 4c 69 73  t = pSubq->pELis
26f50 74 3b 0a 20 20 20 20 20 20 70 4e 65 77 20 3d 20  t;.      pNew = 
26f60 73 75 62 73 74 45 78 70 72 28 26 78 2c 20 70 4e  substExpr(&x, pN
26f70 65 77 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  ew);.      if( p
26f80 53 75 62 71 2d 3e 73 65 6c 46 6c 61 67 73 20 26  Subq->selFlags &
26f90 20 53 46 5f 41 67 67 72 65 67 61 74 65 20 29 7b   SF_Aggregate ){
26fa0 0a 20 20 20 20 20 20 20 20 70 53 75 62 71 2d 3e  .        pSubq->
26fb0 70 48 61 76 69 6e 67 20 3d 20 73 71 6c 69 74 65  pHaving = sqlite
26fc0 33 45 78 70 72 41 6e 64 28 70 50 61 72 73 65 2c  3ExprAnd(pParse,
26fd0 20 70 53 75 62 71 2d 3e 70 48 61 76 69 6e 67 2c   pSubq->pHaving,
26fe0 20 70 4e 65 77 29 3b 0a 20 20 20 20 20 20 7d 65   pNew);.      }e
26ff0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 53 75  lse{.        pSu
27000 62 71 2d 3e 70 57 68 65 72 65 20 3d 20 73 71 6c  bq->pWhere = sql
27010 69 74 65 33 45 78 70 72 41 6e 64 28 70 50 61 72  ite3ExprAnd(pPar
27020 73 65 2c 20 70 53 75 62 71 2d 3e 70 57 68 65 72  se, pSubq->pWher
27030 65 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20 20 20  e, pNew);.      
27040 7d 0a 20 20 20 20 20 20 70 53 75 62 71 20 3d 20  }.      pSubq = 
27050 70 53 75 62 71 2d 3e 70 50 72 69 6f 72 3b 0a 20  pSubq->pPrior;. 
27060 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
27070 6e 20 6e 43 68 6e 67 3b 0a 7d 0a 23 65 6e 64 69  n nChng;.}.#endi
27080 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51  f /* !defined(SQ
27090 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
270a0 52 59 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28  RY) || !defined(
270b0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57  SQLITE_OMIT_VIEW
270c0 29 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  ) */../*.** The 
270d0 70 46 75 6e 63 20 69 73 20 74 68 65 20 6f 6e 6c  pFunc is the onl
270e0 79 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63  y aggregate func
270f0 74 69 6f 6e 20 69 6e 20 74 68 65 20 71 75 65 72  tion in the quer
27100 79 2e 20 20 43 68 65 63 6b 20 74 6f 20 73 65 65  y.  Check to see
27110 0a 2a 2a 20 69 66 20 74 68 65 20 71 75 65 72 79  .** if the query
27120 20 69 73 20 61 20 63 61 6e 64 69 64 61 74 65 20   is a candidate 
27130 66 6f 72 20 74 68 65 20 6d 69 6e 2f 6d 61 78 20  for the min/max 
27140 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 20 0a 2a  optimization. .*
27150 2a 0a 2a 2a 20 49 66 20 74 68 65 20 71 75 65 72  *.** If the quer
27160 79 20 69 73 20 61 20 63 61 6e 64 69 64 61 74 65  y is a candidate
27170 20 66 6f 72 20 74 68 65 20 6d 69 6e 2f 6d 61 78   for the min/max
27180 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2c 20 74   optimization, t
27190 68 65 6e 20 73 65 74 0a 2a 2a 20 2a 70 70 4d 69  hen set.** *ppMi
271a0 6e 4d 61 78 20 74 6f 20 62 65 20 61 6e 20 4f 52  nMax to be an OR
271b0 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 74 6f  DER BY clause to
271c0 20 62 65 20 75 73 65 64 20 66 6f 72 20 74 68 65   be used for the
271d0 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 0a 2a 2a   optimization.**
271e0 20 61 6e 64 20 72 65 74 75 72 6e 20 65 69 74 68   and return eith
271f0 65 72 20 57 48 45 52 45 5f 4f 52 44 45 52 42 59  er WHERE_ORDERBY
27200 5f 4d 49 4e 20 6f 72 20 57 48 45 52 45 5f 4f 52  _MIN or WHERE_OR
27210 44 45 52 42 59 5f 4d 41 58 20 64 65 70 65 6e 64  DERBY_MAX depend
27220 69 6e 67 20 6f 6e 0a 2a 2a 20 77 68 65 74 68 65  ing on.** whethe
27230 72 20 70 46 75 6e 63 20 69 73 20 61 20 6d 69 6e  r pFunc is a min
27240 28 29 20 6f 72 20 6d 61 78 28 29 20 66 75 6e 63  () or max() func
27250 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  tion..**.** If t
27260 68 65 20 71 75 65 72 79 20 69 73 20 6e 6f 74 20  he query is not 
27270 61 20 63 61 6e 64 69 64 61 74 65 20 66 6f 72 20  a candidate for 
27280 74 68 65 20 6d 69 6e 2f 6d 61 78 20 6f 70 74 69  the min/max opti
27290 6d 69 7a 61 74 69 6f 6e 2c 20 72 65 74 75 72 6e  mization, return
272a0 0a 2a 2a 20 57 48 45 52 45 5f 4f 52 44 45 52 42  .** WHERE_ORDERB
272b0 59 5f 4e 4f 52 4d 41 4c 20 28 77 68 69 63 68 20  Y_NORMAL (which 
272c0 6d 75 73 74 20 62 65 20 7a 65 72 6f 29 2e 0a 2a  must be zero)..*
272d0 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
272e0 65 20 6d 75 73 74 20 62 65 20 63 61 6c 6c 65 64  e must be called
272f0 20 61 66 74 65 72 20 61 67 67 72 65 67 61 74 65   after aggregate
27300 20 66 75 6e 63 74 69 6f 6e 73 20 68 61 76 65 20   functions have 
27310 62 65 65 6e 0a 2a 2a 20 6c 6f 63 61 74 65 64 20  been.** located 
27320 62 75 74 20 62 65 66 6f 72 65 20 74 68 65 69 72  but before their
27330 20 61 72 67 75 6d 65 6e 74 73 20 68 61 76 65 20   arguments have 
27340 62 65 65 6e 20 73 75 62 6a 65 63 74 65 64 20 74  been subjected t
27350 6f 20 61 67 67 72 65 67 61 74 65 0a 2a 2a 20 61  o aggregate.** a
27360 6e 61 6c 79 73 69 73 2e 0a 2a 2f 0a 73 74 61 74  nalysis..*/.stat
27370 69 63 20 75 38 20 6d 69 6e 4d 61 78 51 75 65 72  ic u8 minMaxQuer
27380 79 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 45  y(sqlite3 *db, E
27390 78 70 72 20 2a 70 46 75 6e 63 2c 20 45 78 70 72  xpr *pFunc, Expr
273a0 4c 69 73 74 20 2a 2a 70 70 4d 69 6e 4d 61 78 29  List **ppMinMax)
273b0 7b 0a 20 20 69 6e 74 20 65 52 65 74 20 3d 20 57  {.  int eRet = W
273c0 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4e 4f 52  HERE_ORDERBY_NOR
273d0 4d 41 4c 3b 20 20 20 20 20 20 2f 2a 20 52 65 74  MAL;      /* Ret
273e0 75 72 6e 20 76 61 6c 75 65 20 2a 2f 0a 20 20 45  urn value */.  E
273f0 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 20  xprList *pEList 
27400 3d 20 70 46 75 6e 63 2d 3e 78 2e 70 4c 69 73 74  = pFunc->x.pList
27410 3b 20 20 20 20 2f 2a 20 41 72 67 75 6d 65 6e 74  ;    /* Argument
27420 73 20 74 6f 20 61 67 67 20 66 75 6e 63 74 69 6f  s to agg functio
27430 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  n */.  const cha
27440 72 20 2a 7a 46 75 6e 63 3b 20 20 20 20 20 20 20  r *zFunc;       
27450 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
27460 4e 61 6d 65 20 6f 66 20 61 67 67 72 65 67 61 74  Name of aggregat
27470 65 20 66 75 6e 63 74 69 6f 6e 20 70 46 75 6e 63  e function pFunc
27480 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
27490 70 4f 72 64 65 72 42 79 3b 0a 20 20 75 38 20 73  pOrderBy;.  u8 s
274a0 6f 72 74 4f 72 64 65 72 3b 0a 0a 20 20 61 73 73  ortOrder;..  ass
274b0 65 72 74 28 20 2a 70 70 4d 69 6e 4d 61 78 3d 3d  ert( *ppMinMax==
274c0 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
274d0 46 75 6e 63 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47  Func->op==TK_AGG
274e0 5f 46 55 4e 43 54 49 4f 4e 20 29 3b 0a 20 20 61  _FUNCTION );.  a
274f0 73 73 65 72 74 28 20 21 49 73 57 69 6e 64 6f 77  ssert( !IsWindow
27500 46 75 6e 63 28 70 46 75 6e 63 29 20 29 3b 0a 20  Func(pFunc) );. 
27510 20 69 66 28 20 70 45 4c 69 73 74 3d 3d 30 20 7c   if( pEList==0 |
27520 7c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 21  | pEList->nExpr!
27530 3d 31 20 7c 7c 20 45 78 70 72 48 61 73 50 72 6f  =1 || ExprHasPro
27540 70 65 72 74 79 28 70 46 75 6e 63 2c 20 45 50 5f  perty(pFunc, EP_
27550 57 69 6e 46 75 6e 63 29 20 29 7b 0a 20 20 20 20  WinFunc) ){.    
27560 72 65 74 75 72 6e 20 65 52 65 74 3b 0a 20 20 7d  return eRet;.  }
27570 0a 20 20 7a 46 75 6e 63 20 3d 20 70 46 75 6e 63  .  zFunc = pFunc
27580 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 69 66  ->u.zToken;.  if
27590 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  ( sqlite3StrICmp
275a0 28 7a 46 75 6e 63 2c 20 22 6d 69 6e 22 29 3d 3d  (zFunc, "min")==
275b0 30 20 29 7b 0a 20 20 20 20 65 52 65 74 20 3d 20  0 ){.    eRet = 
275c0 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d 49  WHERE_ORDERBY_MI
275d0 4e 3b 0a 20 20 20 20 73 6f 72 74 4f 72 64 65 72  N;.    sortOrder
275e0 20 3d 20 53 51 4c 49 54 45 5f 53 4f 5f 41 53 43   = SQLITE_SO_ASC
275f0 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 73 71  ;.  }else if( sq
27600 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 46 75  lite3StrICmp(zFu
27610 6e 63 2c 20 22 6d 61 78 22 29 3d 3d 30 20 29 7b  nc, "max")==0 ){
27620 0a 20 20 20 20 65 52 65 74 20 3d 20 57 48 45 52  .    eRet = WHER
27630 45 5f 4f 52 44 45 52 42 59 5f 4d 41 58 3b 0a 20  E_ORDERBY_MAX;. 
27640 20 20 20 73 6f 72 74 4f 72 64 65 72 20 3d 20 53     sortOrder = S
27650 51 4c 49 54 45 5f 53 4f 5f 44 45 53 43 3b 0a 20  QLITE_SO_DESC;. 
27660 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75   }else{.    retu
27670 72 6e 20 65 52 65 74 3b 0a 20 20 7d 0a 20 20 2a  rn eRet;.  }.  *
27680 70 70 4d 69 6e 4d 61 78 20 3d 20 70 4f 72 64 65  ppMinMax = pOrde
27690 72 42 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70  rBy = sqlite3Exp
276a0 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70 45 4c  rListDup(db, pEL
276b0 69 73 74 2c 20 30 29 3b 0a 20 20 61 73 73 65 72  ist, 0);.  asser
276c0 74 28 20 70 4f 72 64 65 72 42 79 21 3d 30 20 7c  t( pOrderBy!=0 |
276d0 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  | db->mallocFail
276e0 65 64 20 29 3b 0a 20 20 69 66 28 20 70 4f 72 64  ed );.  if( pOrd
276f0 65 72 42 79 20 29 20 70 4f 72 64 65 72 42 79 2d  erBy ) pOrderBy-
27700 3e 61 5b 30 5d 2e 73 6f 72 74 4f 72 64 65 72 20  >a[0].sortOrder 
27710 3d 20 73 6f 72 74 4f 72 64 65 72 3b 0a 20 20 72  = sortOrder;.  r
27720 65 74 75 72 6e 20 65 52 65 74 3b 0a 7d 0a 0a 2f  eturn eRet;.}../
27730 2a 0a 2a 2a 20 54 68 65 20 73 65 6c 65 63 74 20  *.** The select 
27740 73 74 61 74 65 6d 65 6e 74 20 70 61 73 73 65 64  statement passed
27750 20 61 73 20 74 68 65 20 66 69 72 73 74 20 61 72   as the first ar
27760 67 75 6d 65 6e 74 20 69 73 20 61 6e 20 61 67 67  gument is an agg
27770 72 65 67 61 74 65 20 71 75 65 72 79 2e 0a 2a 2a  regate query..**
27780 20 54 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   The second argu
27790 6d 65 6e 74 20 69 73 20 74 68 65 20 61 73 73 6f  ment is the asso
277a0 63 69 61 74 65 64 20 61 67 67 72 65 67 61 74 65  ciated aggregate
277b0 2d 69 6e 66 6f 20 6f 62 6a 65 63 74 2e 20 54 68  -info object. Th
277c0 69 73 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20  is .** function 
277d0 74 65 73 74 73 20 69 66 20 74 68 65 20 53 45 4c  tests if the SEL
277e0 45 43 54 20 69 73 20 6f 66 20 74 68 65 20 66 6f  ECT is of the fo
277f0 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 53 45 4c 45  rm:.**.**   SELE
27800 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d  CT count(*) FROM
27810 20 3c 74 62 6c 3e 0a 2a 2a 0a 2a 2a 20 77 68 65   <tbl>.**.** whe
27820 72 65 20 74 61 62 6c 65 20 69 73 20 61 20 64 61  re table is a da
27830 74 61 62 61 73 65 20 74 61 62 6c 65 2c 20 6e 6f  tabase table, no
27840 74 20 61 20 73 75 62 2d 73 65 6c 65 63 74 20 6f  t a sub-select o
27850 72 20 76 69 65 77 2e 20 49 66 20 74 68 65 20 71  r view. If the q
27860 75 65 72 79 0a 2a 2a 20 64 6f 65 73 20 6d 61 74  uery.** does mat
27870 63 68 20 74 68 69 73 20 70 61 74 74 65 72 6e 2c  ch this pattern,
27880 20 74 68 65 6e 20 61 20 70 6f 69 6e 74 65 72 20   then a pointer 
27890 74 6f 20 74 68 65 20 54 61 62 6c 65 20 6f 62 6a  to the Table obj
278a0 65 63 74 20 72 65 70 72 65 73 65 6e 74 69 6e 67  ect representing
278b0 0a 2a 2a 20 3c 74 62 6c 3e 20 69 73 20 72 65 74  .** <tbl> is ret
278c0 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65  urned. Otherwise
278d0 2c 20 30 20 69 73 20 72 65 74 75 72 6e 65 64 2e  , 0 is returned.
278e0 0a 2a 2f 0a 73 74 61 74 69 63 20 54 61 62 6c 65  .*/.static Table
278f0 20 2a 69 73 53 69 6d 70 6c 65 43 6f 75 6e 74 28   *isSimpleCount(
27900 53 65 6c 65 63 74 20 2a 70 2c 20 41 67 67 49 6e  Select *p, AggIn
27910 66 6f 20 2a 70 41 67 67 49 6e 66 6f 29 7b 0a 20  fo *pAggInfo){. 
27920 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20   Table *pTab;.  
27930 45 78 70 72 20 2a 70 45 78 70 72 3b 0a 0a 20 20  Expr *pExpr;..  
27940 61 73 73 65 72 74 28 20 21 70 2d 3e 70 47 72 6f  assert( !p->pGro
27950 75 70 42 79 20 29 3b 0a 0a 20 20 69 66 28 20 70  upBy );..  if( p
27960 2d 3e 70 57 68 65 72 65 20 7c 7c 20 70 2d 3e 70  ->pWhere || p->p
27970 45 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d 31 20  EList->nExpr!=1 
27980 0a 20 20 20 7c 7c 20 70 2d 3e 70 53 72 63 2d 3e  .   || p->pSrc->
27990 6e 53 72 63 21 3d 31 20 7c 7c 20 70 2d 3e 70 53  nSrc!=1 || p->pS
279a0 72 63 2d 3e 61 5b 30 5d 2e 70 53 65 6c 65 63 74  rc->a[0].pSelect
279b0 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  .  ){.    return
279c0 20 30 3b 0a 20 20 7d 0a 20 20 70 54 61 62 20 3d   0;.  }.  pTab =
279d0 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 30 5d 2e 70   p->pSrc->a[0].p
279e0 54 61 62 3b 0a 20 20 70 45 78 70 72 20 3d 20 70  Tab;.  pExpr = p
279f0 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70  ->pEList->a[0].p
27a00 45 78 70 72 3b 0a 20 20 61 73 73 65 72 74 28 20  Expr;.  assert( 
27a10 70 54 61 62 20 26 26 20 21 70 54 61 62 2d 3e 70  pTab && !pTab->p
27a20 53 65 6c 65 63 74 20 26 26 20 70 45 78 70 72 20  Select && pExpr 
27a30 29 3b 0a 0a 20 20 69 66 28 20 49 73 56 69 72 74  );..  if( IsVirt
27a40 75 61 6c 28 70 54 61 62 29 20 29 20 72 65 74 75  ual(pTab) ) retu
27a50 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 45 78 70  rn 0;.  if( pExp
27a60 72 2d 3e 6f 70 21 3d 54 4b 5f 41 47 47 5f 46 55  r->op!=TK_AGG_FU
27a70 4e 43 54 49 4f 4e 20 29 20 72 65 74 75 72 6e 20  NCTION ) return 
27a80 30 3b 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70  0;.  if( NEVER(p
27a90 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3d 3d  AggInfo->nFunc==
27aa0 30 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  0) ) return 0;. 
27ab0 20 69 66 28 20 28 70 41 67 67 49 6e 66 6f 2d 3e   if( (pAggInfo->
27ac0 61 46 75 6e 63 5b 30 5d 2e 70 46 75 6e 63 2d 3e  aFunc[0].pFunc->
27ad0 66 75 6e 63 46 6c 61 67 73 26 53 51 4c 49 54 45  funcFlags&SQLITE
27ae0 5f 46 55 4e 43 5f 43 4f 55 4e 54 29 3d 3d 30 20  _FUNC_COUNT)==0 
27af0 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66  ) return 0;.  if
27b00 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  ( ExprHasPropert
27b10 79 28 70 45 78 70 72 2c 20 45 50 5f 44 69 73 74  y(pExpr, EP_Dist
27b20 69 6e 63 74 7c 45 50 5f 57 69 6e 46 75 6e 63 29  inct|EP_WinFunc)
27b30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20   ) return 0;..  
27b40 72 65 74 75 72 6e 20 70 54 61 62 3b 0a 7d 0a 0a  return pTab;.}..
27b50 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 73 6f 75  /*.** If the sou
27b60 72 63 65 2d 6c 69 73 74 20 69 74 65 6d 20 70 61  rce-list item pa
27b70 73 73 65 64 20 61 73 20 61 6e 20 61 72 67 75 6d  ssed as an argum
27b80 65 6e 74 20 77 61 73 20 61 75 67 6d 65 6e 74 65  ent was augmente
27b90 64 20 77 69 74 68 20 61 6e 0a 2a 2a 20 49 4e 44  d with an.** IND
27ba0 45 58 45 44 20 42 59 20 63 6c 61 75 73 65 2c 20  EXED BY clause, 
27bb0 74 68 65 6e 20 74 72 79 20 74 6f 20 6c 6f 63 61  then try to loca
27bc0 74 65 20 74 68 65 20 73 70 65 63 69 66 69 65 64  te the specified
27bd0 20 69 6e 64 65 78 2e 20 49 66 20 74 68 65 72 65   index. If there
27be0 0a 2a 2a 20 77 61 73 20 73 75 63 68 20 61 20 63  .** was such a c
27bf0 6c 61 75 73 65 20 61 6e 64 20 74 68 65 20 6e 61  lause and the na
27c00 6d 65 64 20 69 6e 64 65 78 20 63 61 6e 6e 6f 74  med index cannot
27c10 20 62 65 20 66 6f 75 6e 64 2c 20 72 65 74 75 72   be found, retur
27c20 6e 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 45 52 52  n .** SQLITE_ERR
27c30 4f 52 20 61 6e 64 20 6c 65 61 76 65 20 61 6e 20  OR and leave an 
27c40 65 72 72 6f 72 20 69 6e 20 70 50 61 72 73 65 2e  error in pParse.
27c50 20 4f 74 68 65 72 77 69 73 65 2c 20 70 6f 70 75   Otherwise, popu
27c60 6c 61 74 65 20 0a 2a 2a 20 70 46 72 6f 6d 2d 3e  late .** pFrom->
27c70 70 49 6e 64 65 78 20 61 6e 64 20 72 65 74 75 72  pIndex and retur
27c80 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a  n SQLITE_OK..*/.
27c90 69 6e 74 20 73 71 6c 69 74 65 33 49 6e 64 65 78  int sqlite3Index
27ca0 65 64 42 79 4c 6f 6f 6b 75 70 28 50 61 72 73 65  edByLookup(Parse
27cb0 20 2a 70 50 61 72 73 65 2c 20 73 74 72 75 63 74   *pParse, struct
27cc0 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
27cd0 46 72 6f 6d 29 7b 0a 20 20 69 66 28 20 70 46 72  From){.  if( pFr
27ce0 6f 6d 2d 3e 70 54 61 62 20 26 26 20 70 46 72 6f  om->pTab && pFro
27cf0 6d 2d 3e 66 67 2e 69 73 49 6e 64 65 78 65 64 42  m->fg.isIndexedB
27d00 79 20 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a  y ){.    Table *
27d10 70 54 61 62 20 3d 20 70 46 72 6f 6d 2d 3e 70 54  pTab = pFrom->pT
27d20 61 62 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 49  ab;.    char *zI
27d30 6e 64 65 78 65 64 42 79 20 3d 20 70 46 72 6f 6d  ndexedBy = pFrom
27d40 2d 3e 75 31 2e 7a 49 6e 64 65 78 65 64 42 79 3b  ->u1.zIndexedBy;
27d50 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78  .    Index *pIdx
27d60 3b 0a 20 20 20 20 66 6f 72 28 70 49 64 78 3d 70  ;.    for(pIdx=p
27d70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 0a 20 20  Tab->pIndex; .  
27d80 20 20 20 20 20 20 70 49 64 78 20 26 26 20 73 71        pIdx && sq
27d90 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 49 64  lite3StrICmp(pId
27da0 78 2d 3e 7a 4e 61 6d 65 2c 20 7a 49 6e 64 65 78  x->zName, zIndex
27db0 65 64 42 79 29 3b 20 0a 20 20 20 20 20 20 20 20  edBy); .        
27dc0 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74  pIdx=pIdx->pNext
27dd0 0a 20 20 20 20 29 3b 0a 20 20 20 20 69 66 28 20  .    );.    if( 
27de0 21 70 49 64 78 20 29 7b 0a 20 20 20 20 20 20 73  !pIdx ){.      s
27df0 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
27e00 50 61 72 73 65 2c 20 22 6e 6f 20 73 75 63 68 20  Parse, "no such 
27e10 69 6e 64 65 78 3a 20 25 73 22 2c 20 7a 49 6e 64  index: %s", zInd
27e20 65 78 65 64 42 79 2c 20 30 29 3b 0a 20 20 20 20  exedBy, 0);.    
27e30 20 20 70 50 61 72 73 65 2d 3e 63 68 65 63 6b 53    pParse->checkS
27e40 63 68 65 6d 61 20 3d 20 31 3b 0a 20 20 20 20 20  chema = 1;.     
27e50 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
27e60 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20  RROR;.    }.    
27e70 70 46 72 6f 6d 2d 3e 70 49 42 49 6e 64 65 78 20  pFrom->pIBIndex 
27e80 3d 20 70 49 64 78 3b 0a 20 20 7d 0a 20 20 72 65  = pIdx;.  }.  re
27e90 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
27ea0 7d 0a 2f 2a 0a 2a 2a 20 44 65 74 65 63 74 20 63  }./*.** Detect c
27eb0 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 20 73  ompound SELECT s
27ec0 74 61 74 65 6d 65 6e 74 73 20 74 68 61 74 20 75  tatements that u
27ed0 73 65 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63  se an ORDER BY c
27ee0 6c 61 75 73 65 20 77 69 74 68 20 0a 2a 2a 20 61  lause with .** a
27ef0 6e 20 61 6c 74 65 72 6e 61 74 69 76 65 20 63 6f  n alternative co
27f00 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
27f10 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 53 45 4c 45 43  ..**.**    SELEC
27f20 54 20 2e 2e 2e 20 46 52 4f 4d 20 74 31 20 45 58  T ... FROM t1 EX
27f30 43 45 50 54 20 53 45 4c 45 43 54 20 2e 2e 2e 20  CEPT SELECT ... 
27f40 46 52 4f 4d 20 74 32 20 4f 52 44 45 52 20 42 59  FROM t2 ORDER BY
27f50 20 2e 2e 20 43 4f 4c 4c 41 54 45 20 2e 2e 2e 0a   .. COLLATE ....
27f60 2a 2a 0a 2a 2a 20 54 68 65 73 65 20 61 72 65 20  **.** These are 
27f70 72 65 77 72 69 74 74 65 6e 20 61 73 20 61 20 73  rewritten as a s
27f80 75 62 71 75 65 72 79 3a 0a 2a 2a 0a 2a 2a 20 20  ubquery:.**.**  
27f90 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
27fa0 28 53 45 4c 45 43 54 20 2e 2e 2e 20 46 52 4f 4d  (SELECT ... FROM
27fb0 20 74 31 20 45 58 43 45 50 54 20 53 45 4c 45 43   t1 EXCEPT SELEC
27fc0 54 20 2e 2e 2e 20 46 52 4f 4d 20 74 32 29 0a 2a  T ... FROM t2).*
27fd0 2a 20 20 20 20 20 4f 52 44 45 52 20 42 59 20 2e  *     ORDER BY .
27fe0 2e 2e 20 43 4f 4c 4c 41 54 45 20 2e 2e 2e 0a 2a  .. COLLATE ....*
27ff0 2a 0a 2a 2a 20 54 68 69 73 20 74 72 61 6e 73 66  *.** This transf
28000 6f 72 6d 61 74 69 6f 6e 20 69 73 20 6e 65 63 65  ormation is nece
28010 73 73 61 72 79 20 62 65 63 61 75 73 65 20 74 68  ssary because th
28020 65 20 6d 75 6c 74 69 53 65 6c 65 63 74 4f 72 64  e multiSelectOrd
28030 65 72 42 79 28 29 20 72 6f 75 74 69 6e 65 0a 2a  erBy() routine.*
28040 2a 20 61 62 6f 76 65 20 74 68 61 74 20 67 65 6e  * above that gen
28050 65 72 61 74 65 73 20 74 68 65 20 63 6f 64 65 20  erates the code 
28060 66 6f 72 20 61 20 63 6f 6d 70 6f 75 6e 64 20 53  for a compound S
28070 45 4c 45 43 54 20 77 69 74 68 20 61 6e 20 4f 52  ELECT with an OR
28080 44 45 52 20 42 59 20 63 6c 61 75 73 65 0a 2a 2a  DER BY clause.**
28090 20 75 73 65 73 20 61 20 6d 65 72 67 65 20 61 6c   uses a merge al
280a0 67 6f 72 69 74 68 6d 20 74 68 61 74 20 72 65 71  gorithm that req
280b0 75 69 72 65 73 20 74 68 65 20 73 61 6d 65 20 63  uires the same c
280c0 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
280d0 65 20 6f 6e 20 74 68 65 0a 2a 2a 20 72 65 73 75  e on the.** resu
280e0 6c 74 20 63 6f 6c 75 6d 6e 73 20 61 73 20 6f 6e  lt columns as on
280f0 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   the ORDER BY cl
28100 61 75 73 65 2e 20 20 53 65 65 20 74 69 63 6b 65  ause.  See ticke
28110 74 0a 2a 2a 20 68 74 74 70 3a 2f 2f 77 77 77 2e  t.** http://www.
28120 73 71 6c 69 74 65 2e 6f 72 67 2f 73 72 63 2f 69  sqlite.org/src/i
28130 6e 66 6f 2f 36 37 30 39 35 37 34 64 32 61 0a 2a  nfo/6709574d2a.*
28140 2a 0a 2a 2a 20 54 68 69 73 20 74 72 61 6e 73 66  *.** This transf
28150 6f 72 6d 61 74 69 6f 6e 20 69 73 20 6f 6e 6c 79  ormation is only
28160 20 6e 65 65 64 65 64 20 66 6f 72 20 45 58 43 45   needed for EXCE
28170 50 54 2c 20 49 4e 54 45 52 53 45 43 54 2c 20 61  PT, INTERSECT, a
28180 6e 64 20 55 4e 49 4f 4e 2e 0a 2a 2a 20 54 68 65  nd UNION..** The
28190 20 55 4e 49 4f 4e 20 41 4c 4c 20 6f 70 65 72 61   UNION ALL opera
281a0 74 6f 72 20 77 6f 72 6b 73 20 66 69 6e 65 20 77  tor works fine w
281b0 69 74 68 20 6d 75 6c 74 69 53 65 6c 65 63 74 4f  ith multiSelectO
281c0 72 64 65 72 42 79 28 29 20 65 76 65 6e 20 77 68  rderBy() even wh
281d0 65 6e 0a 2a 2a 20 74 68 65 72 65 20 61 72 65 20  en.** there are 
281e0 43 4f 4c 4c 41 54 45 20 74 65 72 6d 73 20 69 6e  COLLATE terms in
281f0 20 74 68 65 20 4f 52 44 45 52 20 42 59 2e 0a 2a   the ORDER BY..*
28200 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f 6e  /.static int con
28210 76 65 72 74 43 6f 6d 70 6f 75 6e 64 53 65 6c 65  vertCompoundSele
28220 63 74 54 6f 53 75 62 71 75 65 72 79 28 57 61 6c  ctToSubquery(Wal
28230 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 53 65  ker *pWalker, Se
28240 6c 65 63 74 20 2a 70 29 7b 0a 20 20 69 6e 74 20  lect *p){.  int 
28250 69 3b 0a 20 20 53 65 6c 65 63 74 20 2a 70 4e 65  i;.  Select *pNe
28260 77 3b 0a 20 20 53 65 6c 65 63 74 20 2a 70 58 3b  w;.  Select *pX;
28270 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a  .  sqlite3 *db;.
28280 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
28290 74 5f 69 74 65 6d 20 2a 61 3b 0a 20 20 53 72 63  t_item *a;.  Src
282a0 4c 69 73 74 20 2a 70 4e 65 77 53 72 63 3b 0a 20  List *pNewSrc;. 
282b0 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 3b 0a   Parse *pParse;.
282c0 20 20 54 6f 6b 65 6e 20 64 75 6d 6d 79 3b 0a 0a    Token dummy;..
282d0 20 20 69 66 28 20 70 2d 3e 70 50 72 69 6f 72 3d    if( p->pPrior=
282e0 3d 30 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f  =0 ) return WRC_
282f0 43 6f 6e 74 69 6e 75 65 3b 0a 20 20 69 66 28 20  Continue;.  if( 
28300 70 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 29  p->pOrderBy==0 )
28310 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74   return WRC_Cont
28320 69 6e 75 65 3b 0a 20 20 66 6f 72 28 70 58 3d 70  inue;.  for(pX=p
28330 3b 20 70 58 20 26 26 20 28 70 58 2d 3e 6f 70 3d  ; pX && (pX->op=
28340 3d 54 4b 5f 41 4c 4c 20 7c 7c 20 70 58 2d 3e 6f  =TK_ALL || pX->o
28350 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 29 3b 20 70  p==TK_SELECT); p
28360 58 3d 70 58 2d 3e 70 50 72 69 6f 72 29 7b 7d 0a  X=pX->pPrior){}.
28370 20 20 69 66 28 20 70 58 3d 3d 30 20 29 20 72 65    if( pX==0 ) re
28380 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75  turn WRC_Continu
28390 65 3b 0a 20 20 61 20 3d 20 70 2d 3e 70 4f 72 64  e;.  a = p->pOrd
283a0 65 72 42 79 2d 3e 61 3b 0a 20 20 66 6f 72 28 69  erBy->a;.  for(i
283b0 3d 70 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 6e 45  =p->pOrderBy->nE
283c0 78 70 72 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d  xpr-1; i>=0; i--
283d0 29 7b 0a 20 20 20 20 69 66 28 20 61 5b 69 5d 2e  ){.    if( a[i].
283e0 70 45 78 70 72 2d 3e 66 6c 61 67 73 20 26 20 45  pExpr->flags & E
283f0 50 5f 43 6f 6c 6c 61 74 65 20 29 20 62 72 65 61  P_Collate ) brea
28400 6b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 3c 30  k;.  }.  if( i<0
28410 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f   ) return WRC_Co
28420 6e 74 69 6e 75 65 3b 0a 0a 20 20 2f 2a 20 49 66  ntinue;..  /* If
28430 20 77 65 20 72 65 61 63 68 20 74 68 69 73 20 70   we reach this p
28440 6f 69 6e 74 2c 20 74 68 61 74 20 6d 65 61 6e 73  oint, that means
28450 20 74 68 65 20 74 72 61 6e 73 66 6f 72 6d 61 74   the transformat
28460 69 6f 6e 20 69 73 20 72 65 71 75 69 72 65 64 2e  ion is required.
28470 20 2a 2f 0a 0a 20 20 70 50 61 72 73 65 20 3d 20   */..  pParse = 
28480 70 57 61 6c 6b 65 72 2d 3e 70 50 61 72 73 65 3b  pWalker->pParse;
28490 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  .  db = pParse->
284a0 64 62 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c  db;.  pNew = sql
284b0 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f  ite3DbMallocZero
284c0 28 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70 4e 65  (db, sizeof(*pNe
284d0 77 29 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77  w) );.  if( pNew
284e0 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 57 52 43  ==0 ) return WRC
284f0 5f 41 62 6f 72 74 3b 0a 20 20 6d 65 6d 73 65 74  _Abort;.  memset
28500 28 26 64 75 6d 6d 79 2c 20 30 2c 20 73 69 7a 65  (&dummy, 0, size
28510 6f 66 28 64 75 6d 6d 79 29 29 3b 0a 20 20 70 4e  of(dummy));.  pN
28520 65 77 53 72 63 20 3d 20 73 71 6c 69 74 65 33 53  ewSrc = sqlite3S
28530 72 63 4c 69 73 74 41 70 70 65 6e 64 46 72 6f 6d  rcListAppendFrom
28540 54 65 72 6d 28 70 50 61 72 73 65 2c 30 2c 30 2c  Term(pParse,0,0,
28550 30 2c 26 64 75 6d 6d 79 2c 70 4e 65 77 2c 30 2c  0,&dummy,pNew,0,
28560 30 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 53 72  0);.  if( pNewSr
28570 63 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 57 52  c==0 ) return WR
28580 43 5f 41 62 6f 72 74 3b 0a 20 20 2a 70 4e 65 77  C_Abort;.  *pNew
28590 20 3d 20 2a 70 3b 0a 20 20 70 2d 3e 70 53 72 63   = *p;.  p->pSrc
285a0 20 3d 20 70 4e 65 77 53 72 63 3b 0a 20 20 70 2d   = pNewSrc;.  p-
285b0 3e 70 45 4c 69 73 74 20 3d 20 73 71 6c 69 74 65  >pEList = sqlite
285c0 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28  3ExprListAppend(
285d0 70 50 61 72 73 65 2c 20 30 2c 20 73 71 6c 69 74  pParse, 0, sqlit
285e0 65 33 45 78 70 72 28 64 62 2c 20 54 4b 5f 41 53  e3Expr(db, TK_AS
285f0 54 45 52 49 53 4b 2c 20 30 29 29 3b 0a 20 20 70  TERISK, 0));.  p
28600 2d 3e 6f 70 20 3d 20 54 4b 5f 53 45 4c 45 43 54  ->op = TK_SELECT
28610 3b 0a 20 20 70 2d 3e 70 57 68 65 72 65 20 3d 20  ;.  p->pWhere = 
28620 30 3b 0a 20 20 70 4e 65 77 2d 3e 70 47 72 6f 75  0;.  pNew->pGrou
28630 70 42 79 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d  pBy = 0;.  pNew-
28640 3e 70 48 61 76 69 6e 67 20 3d 20 30 3b 0a 20 20  >pHaving = 0;.  
28650 70 4e 65 77 2d 3e 70 4f 72 64 65 72 42 79 20 3d  pNew->pOrderBy =
28660 20 30 3b 0a 20 20 70 2d 3e 70 50 72 69 6f 72 20   0;.  p->pPrior 
28670 3d 20 30 3b 0a 20 20 70 2d 3e 70 4e 65 78 74 20  = 0;.  p->pNext 
28680 3d 20 30 3b 0a 20 20 70 2d 3e 70 57 69 74 68 20  = 0;.  p->pWith 
28690 3d 20 30 3b 0a 20 20 70 2d 3e 73 65 6c 46 6c 61  = 0;.  p->selFla
286a0 67 73 20 26 3d 20 7e 53 46 5f 43 6f 6d 70 6f 75  gs &= ~SF_Compou
286b0 6e 64 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70  nd;.  assert( (p
286c0 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f  ->selFlags & SF_
286d0 43 6f 6e 76 65 72 74 65 64 29 3d 3d 30 20 29 3b  Converted)==0 );
286e0 0a 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 7c  .  p->selFlags |
286f0 3d 20 53 46 5f 43 6f 6e 76 65 72 74 65 64 3b 0a  = SF_Converted;.
28700 20 20 61 73 73 65 72 74 28 20 70 4e 65 77 2d 3e    assert( pNew->
28710 70 50 72 69 6f 72 21 3d 30 20 29 3b 0a 20 20 70  pPrior!=0 );.  p
28720 4e 65 77 2d 3e 70 50 72 69 6f 72 2d 3e 70 4e 65  New->pPrior->pNe
28730 78 74 20 3d 20 70 4e 65 77 3b 0a 20 20 70 4e 65  xt = pNew;.  pNe
28740 77 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20  w->pLimit = 0;. 
28750 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74   return WRC_Cont
28760 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  inue;.}../*.** C
28770 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74  heck to see if t
28780 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 74  he FROM clause t
28790 65 72 6d 20 70 46 72 6f 6d 20 68 61 73 20 74 61  erm pFrom has ta
287a0 62 6c 65 2d 76 61 6c 75 65 64 20 66 75 6e 63 74  ble-valued funct
287b0 69 6f 6e 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 73  ion.** arguments
287c0 2e 20 20 49 66 20 69 74 20 64 6f 65 73 2c 20 6c  .  If it does, l
287d0 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20 6d 65  eave an error me
287e0 73 73 61 67 65 20 69 6e 20 70 50 61 72 73 65 20  ssage in pParse 
287f0 61 6e 64 20 72 65 74 75 72 6e 0a 2a 2a 20 6e 6f  and return.** no
28800 6e 2d 7a 65 72 6f 2c 20 73 69 6e 63 65 20 70 46  n-zero, since pF
28810 72 6f 6d 20 69 73 20 6e 6f 74 20 61 6c 6c 6f 77  rom is not allow
28820 65 64 20 74 6f 20 62 65 20 61 20 74 61 62 6c 65  ed to be a table
28830 2d 76 61 6c 75 65 64 20 66 75 6e 63 74 69 6f 6e  -valued function
28840 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
28850 63 61 6e 6e 6f 74 42 65 46 75 6e 63 74 69 6f 6e  cannotBeFunction
28860 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
28870 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
28880 74 65 6d 20 2a 70 46 72 6f 6d 29 7b 0a 20 20 69  tem *pFrom){.  i
28890 66 28 20 70 46 72 6f 6d 2d 3e 66 67 2e 69 73 54  f( pFrom->fg.isT
288a0 61 62 46 75 6e 63 20 29 7b 0a 20 20 20 20 73 71  abFunc ){.    sq
288b0 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
288c0 61 72 73 65 2c 20 22 27 25 73 27 20 69 73 20 6e  arse, "'%s' is n
288d0 6f 74 20 61 20 66 75 6e 63 74 69 6f 6e 22 2c 20  ot a function", 
288e0 70 46 72 6f 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20  pFrom->zName);. 
288f0 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d     return 1;.  }
28900 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
28910 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
28920 4d 49 54 5f 43 54 45 0a 2f 2a 0a 2a 2a 20 41 72  MIT_CTE./*.** Ar
28930 67 75 6d 65 6e 74 20 70 57 69 74 68 20 28 77 68  gument pWith (wh
28940 69 63 68 20 6d 61 79 20 62 65 20 4e 55 4c 4c 29  ich may be NULL)
28950 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 6c 69 6e   points to a lin
28960 6b 65 64 20 6c 69 73 74 20 6f 66 20 6e 65 73 74  ked list of nest
28970 65 64 20 0a 2a 2a 20 57 49 54 48 20 63 6f 6e 74  ed .** WITH cont
28980 65 78 74 73 2c 20 66 72 6f 6d 20 69 6e 6e 65 72  exts, from inner
28990 20 74 6f 20 6f 75 74 65 72 6d 6f 73 74 2e 20 49   to outermost. I
289a0 66 20 74 68 65 20 74 61 62 6c 65 20 69 64 65 6e  f the table iden
289b0 74 69 66 69 65 64 20 62 79 20 0a 2a 2a 20 46 52  tified by .** FR
289c0 4f 4d 20 63 6c 61 75 73 65 20 65 6c 65 6d 65 6e  OM clause elemen
289d0 74 20 70 49 74 65 6d 20 69 73 20 72 65 61 6c 6c  t pItem is reall
289e0 79 20 61 20 63 6f 6d 6d 6f 6e 2d 74 61 62 6c 65  y a common-table
289f0 2d 65 78 70 72 65 73 73 69 6f 6e 20 28 43 54 45  -expression (CTE
28a00 29 20 0a 2a 2a 20 74 68 65 6e 20 72 65 74 75 72  ) .** then retur
28a10 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  n a pointer to t
28a20 68 65 20 43 54 45 20 64 65 66 69 6e 69 74 69 6f  he CTE definitio
28a30 6e 20 66 6f 72 20 74 68 61 74 20 74 61 62 6c 65  n for that table
28a40 2e 20 4f 74 68 65 72 77 69 73 65 0a 2a 2a 20 72  . Otherwise.** r
28a50 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a  eturn NULL..**.*
28a60 2a 20 49 66 20 61 20 6e 6f 6e 2d 4e 55 4c 4c 20  * If a non-NULL 
28a70 76 61 6c 75 65 20 69 73 20 72 65 74 75 72 6e 65  value is returne
28a80 64 2c 20 73 65 74 20 2a 70 70 43 6f 6e 74 65 78  d, set *ppContex
28a90 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68  t to point to th
28aa0 65 20 57 69 74 68 0a 2a 2a 20 6f 62 6a 65 63 74  e With.** object
28ab0 20 74 68 61 74 20 74 68 65 20 72 65 74 75 72 6e   that the return
28ac0 65 64 20 43 54 45 20 62 65 6c 6f 6e 67 73 20 74  ed CTE belongs t
28ad0 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 73 74 72  o..*/.static str
28ae0 75 63 74 20 43 74 65 20 2a 73 65 61 72 63 68 57  uct Cte *searchW
28af0 69 74 68 28 0a 20 20 57 69 74 68 20 2a 70 57 69  ith(.  With *pWi
28b00 74 68 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  th,             
28b10 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e         /* Curren
28b20 74 20 69 6e 6e 65 72 6d 6f 73 74 20 57 49 54 48  t innermost WITH
28b30 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 73 74 72   clause */.  str
28b40 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
28b50 20 2a 70 49 74 65 6d 2c 20 20 20 20 20 2f 2a 20   *pItem,     /* 
28b60 46 52 4f 4d 20 63 6c 61 75 73 65 20 65 6c 65 6d  FROM clause elem
28b70 65 6e 74 20 74 6f 20 72 65 73 6f 6c 76 65 20 2a  ent to resolve *
28b80 2f 0a 20 20 57 69 74 68 20 2a 2a 70 70 43 6f 6e  /.  With **ppCon
28b90 74 65 78 74 20 20 20 20 20 20 20 20 20 20 20 20  text            
28ba0 20 20 20 20 2f 2a 20 4f 55 54 3a 20 57 49 54 48      /* OUT: WITH
28bb0 20 63 6c 61 75 73 65 20 72 65 74 75 72 6e 20 76   clause return v
28bc0 61 6c 75 65 20 62 65 6c 6f 6e 67 73 20 74 6f 20  alue belongs to 
28bd0 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68  */.){.  const ch
28be0 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 69 66 28  ar *zName;.  if(
28bf0 20 70 49 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73   pItem->zDatabas
28c00 65 3d 3d 30 20 26 26 20 28 7a 4e 61 6d 65 20 3d  e==0 && (zName =
28c10 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 21 3d   pItem->zName)!=
28c20 30 20 29 7b 0a 20 20 20 20 57 69 74 68 20 2a 70  0 ){.    With *p
28c30 3b 0a 20 20 20 20 66 6f 72 28 70 3d 70 57 69 74  ;.    for(p=pWit
28c40 68 3b 20 70 3b 20 70 3d 70 2d 3e 70 4f 75 74 65  h; p; p=p->pOute
28c50 72 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b  r){.      int i;
28c60 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
28c70 69 3c 70 2d 3e 6e 43 74 65 3b 20 69 2b 2b 29 7b  i<p->nCte; i++){
28c80 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c  .        if( sql
28c90 69 74 65 33 53 74 72 49 43 6d 70 28 7a 4e 61 6d  ite3StrICmp(zNam
28ca0 65 2c 20 70 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65  e, p->a[i].zName
28cb0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
28cc0 20 20 2a 70 70 43 6f 6e 74 65 78 74 20 3d 20 70    *ppContext = p
28cd0 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  ;.          retu
28ce0 72 6e 20 26 70 2d 3e 61 5b 69 5d 3b 0a 20 20 20  rn &p->a[i];.   
28cf0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
28d00 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
28d10 6e 20 30 3b 0a 7d 0a 0a 2f 2a 20 54 68 65 20 63  n 0;.}../* The c
28d20 6f 64 65 20 67 65 6e 65 72 61 74 6f 72 20 6d 61  ode generator ma
28d30 69 6e 74 61 69 6e 73 20 61 20 73 74 61 63 6b 20  intains a stack 
28d40 6f 66 20 61 63 74 69 76 65 20 57 49 54 48 20 63  of active WITH c
28d50 6c 61 75 73 65 73 0a 2a 2a 20 77 69 74 68 20 74  lauses.** with t
28d60 68 65 20 69 6e 6e 65 72 2d 6d 6f 73 74 20 57 49  he inner-most WI
28d70 54 48 20 63 6c 61 75 73 65 20 62 65 69 6e 67 20  TH clause being 
28d80 61 74 20 74 68 65 20 74 6f 70 20 6f 66 20 74 68  at the top of th
28d90 65 20 73 74 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54  e stack..**.** T
28da0 68 69 73 20 72 6f 75 74 69 6e 65 20 70 75 73 68  his routine push
28db0 65 73 20 74 68 65 20 57 49 54 48 20 63 6c 61 75  es the WITH clau
28dc0 73 65 20 70 61 73 73 65 64 20 61 73 20 74 68 65  se passed as the
28dd0 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
28de0 0a 2a 2a 20 6f 6e 74 6f 20 74 68 65 20 74 6f 70  .** onto the top
28df0 20 6f 66 20 74 68 65 20 73 74 61 63 6b 2e 20 49   of the stack. I
28e00 66 20 61 72 67 75 6d 65 6e 74 20 62 46 72 65 65  f argument bFree
28e10 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20 74   is true, then t
28e20 68 69 73 0a 2a 2a 20 57 49 54 48 20 63 6c 61 75  his.** WITH clau
28e30 73 65 20 77 69 6c 6c 20 6e 65 76 65 72 20 62 65  se will never be
28e40 20 70 6f 70 70 65 64 20 66 72 6f 6d 20 74 68 65   popped from the
28e50 20 73 74 61 63 6b 2e 20 49 6e 20 74 68 69 73 20   stack. In this 
28e60 63 61 73 65 20 69 74 0a 2a 2a 20 73 68 6f 75 6c  case it.** shoul
28e70 64 20 62 65 20 66 72 65 65 64 20 61 6c 6f 6e 67  d be freed along
28e80 20 77 69 74 68 20 74 68 65 20 50 61 72 73 65 20   with the Parse 
28e90 6f 62 6a 65 63 74 2e 20 49 6e 20 6f 74 68 65 72  object. In other
28ea0 20 63 61 73 65 73 2c 20 77 68 65 6e 0a 2a 2a 20   cases, when.** 
28eb0 62 46 72 65 65 3d 3d 30 2c 20 74 68 65 20 57 69  bFree==0, the Wi
28ec0 74 68 20 6f 62 6a 65 63 74 20 77 69 6c 6c 20 62  th object will b
28ed0 65 20 66 72 65 65 64 20 61 6c 6f 6e 67 20 77 69  e freed along wi
28ee0 74 68 20 74 68 65 20 53 45 4c 45 43 54 20 0a 2a  th the SELECT .*
28ef0 2a 20 73 74 61 74 65 6d 65 6e 74 20 77 69 74 68  * statement with
28f00 20 77 68 69 63 68 20 69 74 20 69 73 20 61 73 73   which it is ass
28f10 6f 63 69 61 74 65 64 2e 0a 2a 2f 0a 76 6f 69 64  ociated..*/.void
28f20 20 73 71 6c 69 74 65 33 57 69 74 68 50 75 73 68   sqlite3WithPush
28f30 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
28f40 57 69 74 68 20 2a 70 57 69 74 68 2c 20 75 38 20  With *pWith, u8 
28f50 62 46 72 65 65 29 7b 0a 20 20 61 73 73 65 72 74  bFree){.  assert
28f60 28 20 62 46 72 65 65 3d 3d 30 20 7c 7c 20 28 70  ( bFree==0 || (p
28f70 50 61 72 73 65 2d 3e 70 57 69 74 68 3d 3d 30 20  Parse->pWith==0 
28f80 26 26 20 70 50 61 72 73 65 2d 3e 70 57 69 74 68  && pParse->pWith
28f90 54 6f 46 72 65 65 3d 3d 30 29 20 29 3b 0a 20 20  ToFree==0) );.  
28fa0 69 66 28 20 70 57 69 74 68 20 29 7b 0a 20 20 20  if( pWith ){.   
28fb0 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d   assert( pParse-
28fc0 3e 70 57 69 74 68 21 3d 70 57 69 74 68 20 29 3b  >pWith!=pWith );
28fd0 0a 20 20 20 20 70 57 69 74 68 2d 3e 70 4f 75 74  .    pWith->pOut
28fe0 65 72 20 3d 20 70 50 61 72 73 65 2d 3e 70 57 69  er = pParse->pWi
28ff0 74 68 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e  th;.    pParse->
29000 70 57 69 74 68 20 3d 20 70 57 69 74 68 3b 0a 20  pWith = pWith;. 
29010 20 20 20 69 66 28 20 62 46 72 65 65 20 29 20 70     if( bFree ) p
29020 50 61 72 73 65 2d 3e 70 57 69 74 68 54 6f 46 72  Parse->pWithToFr
29030 65 65 20 3d 20 70 57 69 74 68 3b 0a 20 20 7d 0a  ee = pWith;.  }.
29040 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
29050 6e 63 74 69 6f 6e 20 63 68 65 63 6b 73 20 69 66  nction checks if
29060 20 61 72 67 75 6d 65 6e 74 20 70 46 72 6f 6d 20   argument pFrom 
29070 72 65 66 65 72 73 20 74 6f 20 61 20 43 54 45 20  refers to a CTE 
29080 64 65 63 6c 61 72 65 64 20 62 79 20 0a 2a 2a 20  declared by .** 
29090 61 20 57 49 54 48 20 63 6c 61 75 73 65 20 6f 6e  a WITH clause on
290a0 20 74 68 65 20 73 74 61 63 6b 20 63 75 72 72 65   the stack curre
290b0 6e 74 6c 79 20 6d 61 69 6e 74 61 69 6e 65 64 20  ntly maintained 
290c0 62 79 20 74 68 65 20 70 61 72 73 65 72 2e 20 41  by the parser. A
290d0 6e 64 2c 0a 2a 2a 20 69 66 20 63 75 72 72 65 6e  nd,.** if curren
290e0 74 6c 79 20 70 72 6f 63 65 73 73 69 6e 67 20 61  tly processing a
290f0 20 43 54 45 20 65 78 70 72 65 73 73 69 6f 6e 2c   CTE expression,
29100 20 69 66 20 69 74 20 69 73 20 61 20 72 65 63 75   if it is a recu
29110 72 73 69 76 65 0a 2a 2a 20 72 65 66 65 72 65 6e  rsive.** referen
29120 63 65 20 74 6f 20 74 68 65 20 63 75 72 72 65 6e  ce to the curren
29130 74 20 43 54 45 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  t CTE..**.** If 
29140 70 46 72 6f 6d 20 66 61 6c 6c 73 20 69 6e 74 6f  pFrom falls into
29150 20 65 69 74 68 65 72 20 6f 66 20 74 68 65 20 74   either of the t
29160 77 6f 20 63 61 74 65 67 6f 72 69 65 73 20 61 62  wo categories ab
29170 6f 76 65 2c 20 70 46 72 6f 6d 2d 3e 70 54 61 62  ove, pFrom->pTab
29180 0a 2a 2a 20 61 6e 64 20 6f 74 68 65 72 20 66 69  .** and other fi
29190 65 6c 64 73 20 61 72 65 20 70 6f 70 75 6c 61 74  elds are populat
291a0 65 64 20 61 63 63 6f 72 64 69 6e 67 6c 79 2e 20  ed accordingly. 
291b0 54 68 65 20 63 61 6c 6c 65 72 20 73 68 6f 75 6c  The caller shoul
291c0 64 20 63 68 65 63 6b 0a 2a 2a 20 28 70 46 72 6f  d check.** (pFro
291d0 6d 2d 3e 70 54 61 62 21 3d 30 29 20 74 6f 20 64  m->pTab!=0) to d
291e0 65 74 65 72 6d 69 6e 65 20 77 68 65 74 68 65 72  etermine whether
291f0 20 6f 72 20 6e 6f 74 20 61 20 73 75 63 63 65 73   or not a succes
29200 73 66 75 6c 20 6d 61 74 63 68 0a 2a 2a 20 77 61  sful match.** wa
29210 73 20 66 6f 75 6e 64 2e 0a 2a 2a 0a 2a 2a 20 57  s found..**.** W
29220 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 61 20  hether or not a 
29230 6d 61 74 63 68 20 69 73 20 66 6f 75 6e 64 2c 20  match is found, 
29240 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
29250 75 72 6e 65 64 20 69 66 20 6e 6f 20 65 72 72 6f  urned if no erro
29260 72 0a 2a 2a 20 6f 63 63 75 72 73 2e 20 49 66 20  r.** occurs. If 
29270 61 6e 20 65 72 72 6f 72 20 64 6f 65 73 20 6f 63  an error does oc
29280 63 75 72 2c 20 61 6e 20 65 72 72 6f 72 20 6d 65  cur, an error me
29290 73 73 61 67 65 20 69 73 20 73 74 6f 72 65 64 20  ssage is stored 
292a0 69 6e 20 74 68 65 0a 2a 2a 20 70 61 72 73 65 72  in the.** parser
292b0 20 61 6e 64 20 73 6f 6d 65 20 65 72 72 6f 72 20   and some error 
292c0 63 6f 64 65 20 6f 74 68 65 72 20 74 68 61 6e 20  code other than 
292d0 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e  SQLITE_OK return
292e0 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
292f0 74 20 77 69 74 68 45 78 70 61 6e 64 28 0a 20 20  t withExpand(.  
29300 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c  Walker *pWalker,
29310 20 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69   .  struct SrcLi
29320 73 74 5f 69 74 65 6d 20 2a 70 46 72 6f 6d 0a 29  st_item *pFrom.)
29330 7b 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  {.  Parse *pPars
29340 65 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 70 50 61  e = pWalker->pPa
29350 72 73 65 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a  rse;.  sqlite3 *
29360 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
29370 0a 20 20 73 74 72 75 63 74 20 43 74 65 20 2a 70  .  struct Cte *p
29380 43 74 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  Cte;            
29390 20 20 20 2f 2a 20 4d 61 74 63 68 65 64 20 43 54     /* Matched CT
293a0 45 20 28 6f 72 20 4e 55 4c 4c 20 69 66 20 6e 6f  E (or NULL if no
293b0 20 6d 61 74 63 68 29 20 2a 2f 0a 20 20 57 69 74   match) */.  Wit
293c0 68 20 2a 70 57 69 74 68 3b 20 20 20 20 20 20 20  h *pWith;       
293d0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
293e0 57 49 54 48 20 63 6c 61 75 73 65 20 74 68 61 74  WITH clause that
293f0 20 70 43 74 65 20 62 65 6c 6f 6e 67 73 20 74 6f   pCte belongs to
29400 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70   */..  assert( p
29410 46 72 6f 6d 2d 3e 70 54 61 62 3d 3d 30 20 29 3b  From->pTab==0 );
29420 0a 0a 20 20 70 43 74 65 20 3d 20 73 65 61 72 63  ..  pCte = searc
29430 68 57 69 74 68 28 70 50 61 72 73 65 2d 3e 70 57  hWith(pParse->pW
29440 69 74 68 2c 20 70 46 72 6f 6d 2c 20 26 70 57 69  ith, pFrom, &pWi
29450 74 68 29 3b 0a 20 20 69 66 28 20 70 43 74 65 20  th);.  if( pCte 
29460 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54  ){.    Table *pT
29470 61 62 3b 0a 20 20 20 20 45 78 70 72 4c 69 73 74  ab;.    ExprList
29480 20 2a 70 45 4c 69 73 74 3b 0a 20 20 20 20 53 65   *pEList;.    Se
29490 6c 65 63 74 20 2a 70 53 65 6c 3b 0a 20 20 20 20  lect *pSel;.    
294a0 53 65 6c 65 63 74 20 2a 70 4c 65 66 74 3b 20 20  Select *pLeft;  
294b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
294c0 20 4c 65 66 74 2d 6d 6f 73 74 20 53 45 4c 45 43   Left-most SELEC
294d0 54 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20  T statement */. 
294e0 20 20 20 69 6e 74 20 62 4d 61 79 52 65 63 75 72     int bMayRecur
294f0 73 69 76 65 3b 20 20 20 20 20 20 20 20 20 20 20  sive;           
29500 20 2f 2a 20 54 72 75 65 20 69 66 20 63 6f 6d 70   /* True if comp
29510 6f 75 6e 64 20 6a 6f 69 6e 65 64 20 62 79 20 55  ound joined by U
29520 4e 49 4f 4e 20 5b 41 4c 4c 5d 20 2a 2f 0a 20 20  NION [ALL] */.  
29530 20 20 57 69 74 68 20 2a 70 53 61 76 65 64 57 69    With *pSavedWi
29540 74 68 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  th;             
29550 2f 2a 20 49 6e 69 74 69 61 6c 20 76 61 6c 75 65  /* Initial value
29560 20 6f 66 20 70 50 61 72 73 65 2d 3e 70 57 69 74   of pParse->pWit
29570 68 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 49 66 20  h */..    /* If 
29580 70 43 74 65 2d 3e 7a 43 74 65 45 72 72 20 69 73  pCte->zCteErr is
29590 20 6e 6f 6e 2d 4e 55 4c 4c 20 61 74 20 74 68 69   non-NULL at thi
295a0 73 20 70 6f 69 6e 74 2c 20 74 68 65 6e 20 74 68  s point, then th
295b0 69 73 20 69 73 20 61 6e 20 69 6c 6c 65 67 61 6c  is is an illegal
295c0 0a 20 20 20 20 2a 2a 20 72 65 63 75 72 73 69 76  .    ** recursiv
295d0 65 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 43  e reference to C
295e0 54 45 20 70 43 74 65 2e 20 4c 65 61 76 65 20 61  TE pCte. Leave a
295f0 6e 20 65 72 72 6f 72 20 69 6e 20 70 50 61 72 73  n error in pPars
29600 65 20 61 6e 64 20 72 65 74 75 72 6e 0a 20 20 20  e and return.   
29610 20 2a 2a 20 65 61 72 6c 79 2e 20 49 66 20 70 43   ** early. If pC
29620 74 65 2d 3e 7a 43 74 65 45 72 72 20 69 73 20 4e  te->zCteErr is N
29630 55 4c 4c 2c 20 74 68 65 6e 20 74 68 69 73 20 69  ULL, then this i
29640 73 20 6e 6f 74 20 61 20 72 65 63 75 72 73 69 76  s not a recursiv
29650 65 20 72 65 66 65 72 65 6e 63 65 2e 0a 20 20 20  e reference..   
29660 20 2a 2a 20 49 6e 20 74 68 69 73 20 63 61 73 65   ** In this case
29670 2c 20 70 72 6f 63 65 65 64 2e 20 20 2a 2f 0a 20  , proceed.  */. 
29680 20 20 20 69 66 28 20 70 43 74 65 2d 3e 7a 43 74     if( pCte->zCt
29690 65 45 72 72 20 29 7b 0a 20 20 20 20 20 20 73 71  eErr ){.      sq
296a0 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
296b0 61 72 73 65 2c 20 70 43 74 65 2d 3e 7a 43 74 65  arse, pCte->zCte
296c0 45 72 72 2c 20 70 43 74 65 2d 3e 7a 4e 61 6d 65  Err, pCte->zName
296d0 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
296e0 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
296f0 20 20 7d 0a 20 20 20 20 69 66 28 20 63 61 6e 6e    }.    if( cann
29700 6f 74 42 65 46 75 6e 63 74 69 6f 6e 28 70 50 61  otBeFunction(pPa
29710 72 73 65 2c 20 70 46 72 6f 6d 29 20 29 20 72 65  rse, pFrom) ) re
29720 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
29730 52 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20  R;..    assert( 
29740 70 46 72 6f 6d 2d 3e 70 54 61 62 3d 3d 30 20 29  pFrom->pTab==0 )
29750 3b 0a 20 20 20 20 70 46 72 6f 6d 2d 3e 70 54 61  ;.    pFrom->pTa
29760 62 20 3d 20 70 54 61 62 20 3d 20 73 71 6c 69 74  b = pTab = sqlit
29770 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64  e3DbMallocZero(d
29780 62 2c 20 73 69 7a 65 6f 66 28 54 61 62 6c 65 29  b, sizeof(Table)
29790 29 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62 3d  );.    if( pTab=
297a0 3d 30 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f  =0 ) return WRC_
297b0 41 62 6f 72 74 3b 0a 20 20 20 20 70 54 61 62 2d  Abort;.    pTab-
297c0 3e 6e 54 61 62 52 65 66 20 3d 20 31 3b 0a 20 20  >nTabRef = 1;.  
297d0 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 20 3d 20    pTab->zName = 
297e0 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28  sqlite3DbStrDup(
297f0 64 62 2c 20 70 43 74 65 2d 3e 7a 4e 61 6d 65 29  db, pCte->zName)
29800 3b 0a 20 20 20 20 70 54 61 62 2d 3e 69 50 4b 65  ;.    pTab->iPKe
29810 79 20 3d 20 2d 31 3b 0a 20 20 20 20 70 54 61 62  y = -1;.    pTab
29820 2d 3e 6e 52 6f 77 4c 6f 67 45 73 74 20 3d 20 32  ->nRowLogEst = 2
29830 30 30 3b 20 61 73 73 65 72 74 28 20 32 30 30 3d  00; assert( 200=
29840 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 31  =sqlite3LogEst(1
29850 30 34 38 35 37 36 29 20 29 3b 0a 20 20 20 20 70  048576) );.    p
29860 54 61 62 2d 3e 74 61 62 46 6c 61 67 73 20 7c 3d  Tab->tabFlags |=
29870 20 54 46 5f 45 70 68 65 6d 65 72 61 6c 20 7c 20   TF_Ephemeral | 
29880 54 46 5f 4e 6f 56 69 73 69 62 6c 65 52 6f 77 69  TF_NoVisibleRowi
29890 64 3b 0a 20 20 20 20 70 46 72 6f 6d 2d 3e 70 53  d;.    pFrom->pS
298a0 65 6c 65 63 74 20 3d 20 73 71 6c 69 74 65 33 53  elect = sqlite3S
298b0 65 6c 65 63 74 44 75 70 28 64 62 2c 20 70 43 74  electDup(db, pCt
298c0 65 2d 3e 70 53 65 6c 65 63 74 2c 20 30 29 3b 0a  e->pSelect, 0);.
298d0 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c      if( db->mall
298e0 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74 75 72  ocFailed ) retur
298f0 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42  n SQLITE_NOMEM_B
29900 4b 50 54 3b 0a 20 20 20 20 61 73 73 65 72 74 28  KPT;.    assert(
29910 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 20   pFrom->pSelect 
29920 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b  );..    /* Check
29930 20 69 66 20 74 68 69 73 20 69 73 20 61 20 72 65   if this is a re
29940 63 75 72 73 69 76 65 20 43 54 45 2e 20 2a 2f 0a  cursive CTE. */.
29950 20 20 20 20 70 53 65 6c 20 3d 20 70 46 72 6f 6d      pSel = pFrom
29960 2d 3e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 62  ->pSelect;.    b
29970 4d 61 79 52 65 63 75 72 73 69 76 65 20 3d 20 28  MayRecursive = (
29980 20 70 53 65 6c 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c   pSel->op==TK_AL
29990 4c 20 7c 7c 20 70 53 65 6c 2d 3e 6f 70 3d 3d 54  L || pSel->op==T
299a0 4b 5f 55 4e 49 4f 4e 20 29 3b 0a 20 20 20 20 69  K_UNION );.    i
299b0 66 28 20 62 4d 61 79 52 65 63 75 72 73 69 76 65  f( bMayRecursive
299c0 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b   ){.      int i;
299d0 0a 20 20 20 20 20 20 53 72 63 4c 69 73 74 20 2a  .      SrcList *
299e0 70 53 72 63 20 3d 20 70 46 72 6f 6d 2d 3e 70 53  pSrc = pFrom->pS
299f0 65 6c 65 63 74 2d 3e 70 53 72 63 3b 0a 20 20 20  elect->pSrc;.   
29a00 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 53     for(i=0; i<pS
29a10 72 63 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a  rc->nSrc; i++){.
29a20 20 20 20 20 20 20 20 20 73 74 72 75 63 74 20 53          struct S
29a30 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  rcList_item *pIt
29a40 65 6d 20 3d 20 26 70 53 72 63 2d 3e 61 5b 69 5d  em = &pSrc->a[i]
29a50 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 49  ;.        if( pI
29a60 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65 3d 3d  tem->zDatabase==
29a70 30 20 0a 20 20 20 20 20 20 20 20 20 26 26 20 70  0 .         && p
29a80 49 74 65 6d 2d 3e 7a 4e 61 6d 65 21 3d 30 20 0a  Item->zName!=0 .
29a90 20 20 20 20 20 20 20 20 20 26 26 20 30 3d 3d 73           && 0==s
29aa0 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 49  qlite3StrICmp(pI
29ab0 74 65 6d 2d 3e 7a 4e 61 6d 65 2c 20 70 43 74 65  tem->zName, pCte
29ac0 2d 3e 7a 4e 61 6d 65 29 0a 20 20 20 20 20 20 20  ->zName).       
29ad0 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20     ){.          
29ae0 70 49 74 65 6d 2d 3e 70 54 61 62 20 3d 20 70 54  pItem->pTab = pT
29af0 61 62 3b 0a 20 20 20 20 20 20 20 20 20 20 70 49  ab;.          pI
29b00 74 65 6d 2d 3e 66 67 2e 69 73 52 65 63 75 72 73  tem->fg.isRecurs
29b10 69 76 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  ive = 1;.       
29b20 20 20 20 70 54 61 62 2d 3e 6e 54 61 62 52 65 66     pTab->nTabRef
29b30 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 70 53  ++;.          pS
29b40 65 6c 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20  el->selFlags |= 
29b50 53 46 5f 52 65 63 75 72 73 69 76 65 3b 0a 20 20  SF_Recursive;.  
29b60 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
29b70 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4f 6e      }..    /* On
29b80 6c 79 20 6f 6e 65 20 72 65 63 75 72 73 69 76 65  ly one recursive
29b90 20 72 65 66 65 72 65 6e 63 65 20 69 73 20 70 65   reference is pe
29ba0 72 6d 69 74 74 65 64 2e 20 2a 2f 20 0a 20 20 20  rmitted. */ .   
29bb0 20 69 66 28 20 70 54 61 62 2d 3e 6e 54 61 62 52   if( pTab->nTabR
29bc0 65 66 3e 32 20 29 7b 0a 20 20 20 20 20 20 73 71  ef>2 ){.      sq
29bd0 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 0a 20  lite3ErrorMsg(. 
29be0 20 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2c           pParse,
29bf0 20 22 6d 75 6c 74 69 70 6c 65 20 72 65 66 65 72   "multiple refer
29c00 65 6e 63 65 73 20 74 6f 20 72 65 63 75 72 73 69  ences to recursi
29c10 76 65 20 74 61 62 6c 65 3a 20 25 73 22 2c 20 70  ve table: %s", p
29c20 43 74 65 2d 3e 7a 4e 61 6d 65 0a 20 20 20 20 20  Cte->zName.     
29c30 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   );.      return
29c40 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
29c50 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
29c60 20 70 54 61 62 2d 3e 6e 54 61 62 52 65 66 3d 3d   pTab->nTabRef==
29c70 31 20 7c 7c 20 0a 20 20 20 20 20 20 20 20 20 20  1 || .          
29c80 20 20 28 28 70 53 65 6c 2d 3e 73 65 6c 46 6c 61    ((pSel->selFla
29c90 67 73 26 53 46 5f 52 65 63 75 72 73 69 76 65 29  gs&SF_Recursive)
29ca0 20 26 26 20 70 54 61 62 2d 3e 6e 54 61 62 52 65   && pTab->nTabRe
29cb0 66 3d 3d 32 20 29 29 3b 0a 0a 20 20 20 20 70 43  f==2 ));..    pC
29cc0 74 65 2d 3e 7a 43 74 65 45 72 72 20 3d 20 22 63  te->zCteErr = "c
29cd0 69 72 63 75 6c 61 72 20 72 65 66 65 72 65 6e 63  ircular referenc
29ce0 65 3a 20 25 73 22 3b 0a 20 20 20 20 70 53 61 76  e: %s";.    pSav
29cf0 65 64 57 69 74 68 20 3d 20 70 50 61 72 73 65 2d  edWith = pParse-
29d00 3e 70 57 69 74 68 3b 0a 20 20 20 20 70 50 61 72  >pWith;.    pPar
29d10 73 65 2d 3e 70 57 69 74 68 20 3d 20 70 57 69 74  se->pWith = pWit
29d20 68 3b 0a 20 20 20 20 69 66 28 20 62 4d 61 79 52  h;.    if( bMayR
29d30 65 63 75 72 73 69 76 65 20 29 7b 0a 20 20 20 20  ecursive ){.    
29d40 20 20 53 65 6c 65 63 74 20 2a 70 50 72 69 6f 72    Select *pPrior
29d50 20 3d 20 70 53 65 6c 2d 3e 70 50 72 69 6f 72 3b   = pSel->pPrior;
29d60 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
29d70 50 72 69 6f 72 2d 3e 70 57 69 74 68 3d 3d 30 20  Prior->pWith==0 
29d80 29 3b 0a 20 20 20 20 20 20 70 50 72 69 6f 72 2d  );.      pPrior-
29d90 3e 70 57 69 74 68 20 3d 20 70 53 65 6c 2d 3e 70  >pWith = pSel->p
29da0 57 69 74 68 3b 0a 20 20 20 20 20 20 73 71 6c 69  With;.      sqli
29db0 74 65 33 57 61 6c 6b 53 65 6c 65 63 74 28 70 57  te3WalkSelect(pW
29dc0 61 6c 6b 65 72 2c 20 70 50 72 69 6f 72 29 3b 0a  alker, pPrior);.
29dd0 20 20 20 20 20 20 70 50 72 69 6f 72 2d 3e 70 57        pPrior->pW
29de0 69 74 68 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c  ith = 0;.    }el
29df0 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  se{.      sqlite
29e00 33 57 61 6c 6b 53 65 6c 65 63 74 28 70 57 61 6c  3WalkSelect(pWal
29e10 6b 65 72 2c 20 70 53 65 6c 29 3b 0a 20 20 20 20  ker, pSel);.    
29e20 7d 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 70 57  }.    pParse->pW
29e30 69 74 68 20 3d 20 70 57 69 74 68 3b 0a 0a 20 20  ith = pWith;..  
29e40 20 20 66 6f 72 28 70 4c 65 66 74 3d 70 53 65 6c    for(pLeft=pSel
29e50 3b 20 70 4c 65 66 74 2d 3e 70 50 72 69 6f 72 3b  ; pLeft->pPrior;
29e60 20 70 4c 65 66 74 3d 70 4c 65 66 74 2d 3e 70 50   pLeft=pLeft->pP
29e70 72 69 6f 72 29 3b 0a 20 20 20 20 70 45 4c 69 73  rior);.    pELis
29e80 74 20 3d 20 70 4c 65 66 74 2d 3e 70 45 4c 69 73  t = pLeft->pELis
29e90 74 3b 0a 20 20 20 20 69 66 28 20 70 43 74 65 2d  t;.    if( pCte-
29ea0 3e 70 43 6f 6c 73 20 29 7b 0a 20 20 20 20 20 20  >pCols ){.      
29eb0 69 66 28 20 70 45 4c 69 73 74 20 26 26 20 70 45  if( pEList && pE
29ec0 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d 70 43 74  List->nExpr!=pCt
29ed0 65 2d 3e 70 43 6f 6c 73 2d 3e 6e 45 78 70 72 20  e->pCols->nExpr 
29ee0 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
29ef0 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
29f00 65 2c 20 22 74 61 62 6c 65 20 25 73 20 68 61 73  e, "table %s has
29f10 20 25 64 20 76 61 6c 75 65 73 20 66 6f 72 20 25   %d values for %
29f20 64 20 63 6f 6c 75 6d 6e 73 22 2c 0a 20 20 20 20  d columns",.    
29f30 20 20 20 20 20 20 20 20 70 43 74 65 2d 3e 7a 4e          pCte->zN
29f40 61 6d 65 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78  ame, pEList->nEx
29f50 70 72 2c 20 70 43 74 65 2d 3e 70 43 6f 6c 73 2d  pr, pCte->pCols-
29f60 3e 6e 45 78 70 72 0a 20 20 20 20 20 20 20 20 29  >nExpr.        )
29f70 3b 0a 20 20 20 20 20 20 20 20 70 50 61 72 73 65  ;.        pParse
29f80 2d 3e 70 57 69 74 68 20 3d 20 70 53 61 76 65 64  ->pWith = pSaved
29f90 57 69 74 68 3b 0a 20 20 20 20 20 20 20 20 72 65  With;.        re
29fa0 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
29fb0 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  R;.      }.     
29fc0 20 70 45 4c 69 73 74 20 3d 20 70 43 74 65 2d 3e   pEList = pCte->
29fd0 70 43 6f 6c 73 3b 0a 20 20 20 20 7d 0a 0a 20 20  pCols;.    }..  
29fe0 20 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 73    sqlite3Columns
29ff0 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 70 50 61  FromExprList(pPa
2a000 72 73 65 2c 20 70 45 4c 69 73 74 2c 20 26 70 54  rse, pEList, &pT
2a010 61 62 2d 3e 6e 43 6f 6c 2c 20 26 70 54 61 62 2d  ab->nCol, &pTab-
2a020 3e 61 43 6f 6c 29 3b 0a 20 20 20 20 69 66 28 20  >aCol);.    if( 
2a030 62 4d 61 79 52 65 63 75 72 73 69 76 65 20 29 7b  bMayRecursive ){
2a040 0a 20 20 20 20 20 20 69 66 28 20 70 53 65 6c 2d  .      if( pSel-
2a050 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 52  >selFlags & SF_R
2a060 65 63 75 72 73 69 76 65 20 29 7b 0a 20 20 20 20  ecursive ){.    
2a070 20 20 20 20 70 43 74 65 2d 3e 7a 43 74 65 45 72      pCte->zCteEr
2a080 72 20 3d 20 22 6d 75 6c 74 69 70 6c 65 20 72 65  r = "multiple re
2a090 63 75 72 73 69 76 65 20 72 65 66 65 72 65 6e 63  cursive referenc
2a0a0 65 73 3a 20 25 73 22 3b 0a 20 20 20 20 20 20 7d  es: %s";.      }
2a0b0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 43  else{.        pC
2a0c0 74 65 2d 3e 7a 43 74 65 45 72 72 20 3d 20 22 72  te->zCteErr = "r
2a0d0 65 63 75 72 73 69 76 65 20 72 65 66 65 72 65 6e  ecursive referen
2a0e0 63 65 20 69 6e 20 61 20 73 75 62 71 75 65 72 79  ce in a subquery
2a0f0 3a 20 25 73 22 3b 0a 20 20 20 20 20 20 7d 0a 20  : %s";.      }. 
2a100 20 20 20 20 20 73 71 6c 69 74 65 33 57 61 6c 6b       sqlite3Walk
2a110 53 65 6c 65 63 74 28 70 57 61 6c 6b 65 72 2c 20  Select(pWalker, 
2a120 70 53 65 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20  pSel);.    }.   
2a130 20 70 43 74 65 2d 3e 7a 43 74 65 45 72 72 20 3d   pCte->zCteErr =
2a140 20 30 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e   0;.    pParse->
2a150 70 57 69 74 68 20 3d 20 70 53 61 76 65 64 57 69  pWith = pSavedWi
2a160 74 68 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  th;.  }..  retur
2a170 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23  n SQLITE_OK;.}.#
2a180 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53  endif..#ifndef S
2a190 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 54 45 0a 2f  QLITE_OMIT_CTE./
2a1a0 2a 0a 2a 2a 20 49 66 20 74 68 65 20 53 45 4c 45  *.** If the SELE
2a1b0 43 54 20 70 61 73 73 65 64 20 61 73 20 74 68 65  CT passed as the
2a1c0 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
2a1d0 20 68 61 73 20 61 6e 20 61 73 73 6f 63 69 61 74   has an associat
2a1e0 65 64 20 57 49 54 48 20 0a 2a 2a 20 63 6c 61 75  ed WITH .** clau
2a1f0 73 65 2c 20 70 6f 70 20 69 74 20 66 72 6f 6d 20  se, pop it from 
2a200 74 68 65 20 73 74 61 63 6b 20 73 74 6f 72 65 64  the stack stored
2a210 20 61 73 20 70 61 72 74 20 6f 66 20 74 68 65 20   as part of the 
2a220 50 61 72 73 65 20 6f 62 6a 65 63 74 2e 0a 2a 2a  Parse object..**
2a230 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
2a240 6e 20 69 73 20 75 73 65 64 20 61 73 20 74 68 65  n is used as the
2a250 20 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b   xSelectCallback
2a260 32 28 29 20 63 61 6c 6c 62 61 63 6b 20 62 79 0a  2() callback by.
2a270 2a 2a 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  ** sqlite3Select
2a280 45 78 70 61 6e 64 28 29 20 77 68 65 6e 20 77 61  Expand() when wa
2a290 6c 6b 69 6e 67 20 61 20 53 45 4c 45 43 54 20 74  lking a SELECT t
2a2a0 72 65 65 20 74 6f 20 72 65 73 6f 6c 76 65 20 74  ree to resolve t
2a2b0 61 62 6c 65 0a 2a 2a 20 6e 61 6d 65 73 20 61 6e  able.** names an
2a2c0 64 20 6f 74 68 65 72 20 46 52 4f 4d 20 63 6c 61  d other FROM cla
2a2d0 75 73 65 20 65 6c 65 6d 65 6e 74 73 2e 20 0a 2a  use elements. .*
2a2e0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 65  /.static void se
2a2f0 6c 65 63 74 50 6f 70 57 69 74 68 28 57 61 6c 6b  lectPopWith(Walk
2a300 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 53 65 6c  er *pWalker, Sel
2a310 65 63 74 20 2a 70 29 7b 0a 20 20 50 61 72 73 65  ect *p){.  Parse
2a320 20 2a 70 50 61 72 73 65 20 3d 20 70 57 61 6c 6b   *pParse = pWalk
2a330 65 72 2d 3e 70 50 61 72 73 65 3b 0a 20 20 69 66  er->pParse;.  if
2a340 28 20 4f 4b 5f 49 46 5f 41 4c 57 41 59 53 5f 54  ( OK_IF_ALWAYS_T
2a350 52 55 45 28 70 50 61 72 73 65 2d 3e 70 57 69 74  RUE(pParse->pWit
2a360 68 29 20 26 26 20 70 2d 3e 70 50 72 69 6f 72 3d  h) && p->pPrior=
2a370 3d 30 20 29 7b 0a 20 20 20 20 57 69 74 68 20 2a  =0 ){.    With *
2a380 70 57 69 74 68 20 3d 20 66 69 6e 64 52 69 67 68  pWith = findRigh
2a390 74 6d 6f 73 74 28 70 29 2d 3e 70 57 69 74 68 3b  tmost(p)->pWith;
2a3a0 0a 20 20 20 20 69 66 28 20 70 57 69 74 68 21 3d  .    if( pWith!=
2a3b0 30 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  0 ){.      asser
2a3c0 74 28 20 70 50 61 72 73 65 2d 3e 70 57 69 74 68  t( pParse->pWith
2a3d0 3d 3d 70 57 69 74 68 20 29 3b 0a 20 20 20 20 20  ==pWith );.     
2a3e0 20 70 50 61 72 73 65 2d 3e 70 57 69 74 68 20 3d   pParse->pWith =
2a3f0 20 70 57 69 74 68 2d 3e 70 4f 75 74 65 72 3b 0a   pWith->pOuter;.
2a400 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6c 73      }.  }.}.#els
2a410 65 0a 23 64 65 66 69 6e 65 20 73 65 6c 65 63 74  e.#define select
2a420 50 6f 70 57 69 74 68 20 30 0a 23 65 6e 64 69 66  PopWith 0.#endif
2a430 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 53 72 63 4c  ../*.** The SrcL
2a440 69 73 74 5f 69 74 65 6d 20 73 74 72 75 63 74 75  ist_item structu
2a450 72 65 20 70 61 73 73 65 64 20 61 73 20 74 68 65  re passed as the
2a460 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
2a470 20 72 65 70 72 65 73 65 6e 74 73 20 61 0a 2a 2a   represents a.**
2a480 20 73 75 62 2d 71 75 65 72 79 20 69 6e 20 74 68   sub-query in th
2a490 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66  e FROM clause of
2a4a0 20 61 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d   a SELECT statem
2a4b0 65 6e 74 2e 20 54 68 69 73 20 66 75 6e 63 74 69  ent. This functi
2a4c0 6f 6e 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 73 20  on.** allocates 
2a4d0 61 6e 64 20 70 6f 70 75 6c 61 74 65 73 20 74 68  and populates th
2a4e0 65 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 2e 70  e SrcList_item.p
2a4f0 54 61 62 20 6f 62 6a 65 63 74 2e 20 49 66 20 73  Tab object. If s
2a500 75 63 63 65 73 73 66 75 6c 2c 0a 2a 2a 20 53 51  uccessful,.** SQ
2a510 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
2a520 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ned. Otherwise, 
2a530 69 66 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72 20  if an OOM error 
2a540 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c 0a  is encountered,.
2a550 2a 2a 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2e  ** SQLITE_NOMEM.
2a560 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45  .*/.int sqlite3E
2a570 78 70 61 6e 64 53 75 62 71 75 65 72 79 28 50 61  xpandSubquery(Pa
2a580 72 73 65 20 2a 70 50 61 72 73 65 2c 20 73 74 72  rse *pParse, str
2a590 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
2a5a0 20 2a 70 46 72 6f 6d 29 7b 0a 20 20 53 65 6c 65   *pFrom){.  Sele
2a5b0 63 74 20 2a 70 53 65 6c 20 3d 20 70 46 72 6f 6d  ct *pSel = pFrom
2a5c0 2d 3e 70 53 65 6c 65 63 74 3b 0a 20 20 54 61 62  ->pSelect;.  Tab
2a5d0 6c 65 20 2a 70 54 61 62 3b 0a 0a 20 20 61 73 73  le *pTab;..  ass
2a5e0 65 72 74 28 20 70 53 65 6c 20 29 3b 0a 20 20 70  ert( pSel );.  p
2a5f0 46 72 6f 6d 2d 3e 70 54 61 62 20 3d 20 70 54 61  From->pTab = pTa
2a600 62 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  b = sqlite3DbMal
2a610 6c 6f 63 5a 65 72 6f 28 70 50 61 72 73 65 2d 3e  locZero(pParse->
2a620 64 62 2c 20 73 69 7a 65 6f 66 28 54 61 62 6c 65  db, sizeof(Table
2a630 29 29 3b 0a 20 20 69 66 28 20 70 54 61 62 3d 3d  ));.  if( pTab==
2a640 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  0 ) return SQLIT
2a650 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 70 54 61 62 2d  E_NOMEM;.  pTab-
2a660 3e 6e 54 61 62 52 65 66 20 3d 20 31 3b 0a 20 20  >nTabRef = 1;.  
2a670 69 66 28 20 70 46 72 6f 6d 2d 3e 7a 41 6c 69 61  if( pFrom->zAlia
2a680 73 20 29 7b 0a 20 20 20 20 70 54 61 62 2d 3e 7a  s ){.    pTab->z
2a690 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62  Name = sqlite3Db
2a6a0 53 74 72 44 75 70 28 70 50 61 72 73 65 2d 3e 64  StrDup(pParse->d
2a6b0 62 2c 20 70 46 72 6f 6d 2d 3e 7a 41 6c 69 61 73  b, pFrom->zAlias
2a6c0 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
2a6d0 70 54 61 62 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71  pTab->zName = sq
2a6e0 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 70 50 61  lite3MPrintf(pPa
2a6f0 72 73 65 2d 3e 64 62 2c 20 22 73 75 62 71 75 65  rse->db, "subque
2a700 72 79 5f 25 75 22 2c 20 70 53 65 6c 2d 3e 73 65  ry_%u", pSel->se
2a710 6c 49 64 29 3b 0a 20 20 7d 0a 20 20 77 68 69 6c  lId);.  }.  whil
2a720 65 28 20 70 53 65 6c 2d 3e 70 50 72 69 6f 72 20  e( pSel->pPrior 
2a730 29 7b 20 70 53 65 6c 20 3d 20 70 53 65 6c 2d 3e  ){ pSel = pSel->
2a740 70 50 72 69 6f 72 3b 20 7d 0a 20 20 73 71 6c 69  pPrior; }.  sqli
2a750 74 65 33 43 6f 6c 75 6d 6e 73 46 72 6f 6d 45 78  te3ColumnsFromEx
2a760 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70  prList(pParse, p
2a770 53 65 6c 2d 3e 70 45 4c 69 73 74 2c 26 70 54 61  Sel->pEList,&pTa
2a780 62 2d 3e 6e 43 6f 6c 2c 26 70 54 61 62 2d 3e 61  b->nCol,&pTab->a
2a790 43 6f 6c 29 3b 0a 20 20 70 54 61 62 2d 3e 69 50  Col);.  pTab->iP
2a7a0 4b 65 79 20 3d 20 2d 31 3b 0a 20 20 70 54 61 62  Key = -1;.  pTab
2a7b0 2d 3e 6e 52 6f 77 4c 6f 67 45 73 74 20 3d 20 32  ->nRowLogEst = 2
2a7c0 30 30 3b 20 61 73 73 65 72 74 28 20 32 30 30 3d  00; assert( 200=
2a7d0 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 31  =sqlite3LogEst(1
2a7e0 30 34 38 35 37 36 29 20 29 3b 0a 20 20 70 54 61  048576) );.  pTa
2a7f0 62 2d 3e 74 61 62 46 6c 61 67 73 20 7c 3d 20 54  b->tabFlags |= T
2a800 46 5f 45 70 68 65 6d 65 72 61 6c 3b 0a 0a 20 20  F_Ephemeral;..  
2a810 72 65 74 75 72 6e 20 70 50 61 72 73 65 2d 3e 6e  return pParse->n
2a820 45 72 72 20 3f 20 53 51 4c 49 54 45 5f 45 52 52  Err ? SQLITE_ERR
2a830 4f 52 20 3a 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  OR : SQLITE_OK;.
2a840 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
2a850 75 74 69 6e 65 20 69 73 20 61 20 57 61 6c 6b 65  utine is a Walke
2a860 72 20 63 61 6c 6c 62 61 63 6b 20 66 6f 72 20 22  r callback for "
2a870 65 78 70 61 6e 64 69 6e 67 22 20 61 20 53 45 4c  expanding" a SEL
2a880 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a  ECT statement..*
2a890 2a 20 22 45 78 70 61 6e 64 69 6e 67 22 20 6d 65  * "Expanding" me
2a8a0 61 6e 73 20 74 6f 20 64 6f 20 74 68 65 20 66 6f  ans to do the fo
2a8b0 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20  llowing:.**.**  
2a8c0 20 20 28 31 29 20 20 4d 61 6b 65 20 73 75 72 65    (1)  Make sure
2a8d0 20 56 44 42 45 20 63 75 72 73 6f 72 20 6e 75 6d   VDBE cursor num
2a8e0 62 65 72 73 20 68 61 76 65 20 62 65 65 6e 20 61  bers have been a
2a8f0 73 73 69 67 6e 65 64 20 74 6f 20 65 76 65 72 79  ssigned to every
2a900 0a 2a 2a 20 20 20 20 20 20 20 20 20 65 6c 65 6d  .**         elem
2a910 65 6e 74 20 6f 66 20 74 68 65 20 46 52 4f 4d 20  ent of the FROM 
2a920 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 20 20  clause..**.**   
2a930 20 28 32 29 20 20 46 69 6c 6c 20 69 6e 20 74 68   (2)  Fill in th
2a940 65 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 5d 2e  e pTabList->a[].
2a950 70 54 61 62 20 66 69 65 6c 64 73 20 69 6e 20 74  pTab fields in t
2a960 68 65 20 53 72 63 4c 69 73 74 20 74 68 61 74 20  he SrcList that 
2a970 0a 2a 2a 20 20 20 20 20 20 20 20 20 64 65 66 69  .**         defi
2a980 6e 65 73 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e  nes FROM clause.
2a990 20 20 57 68 65 6e 20 76 69 65 77 73 20 61 70 70    When views app
2a9a0 65 61 72 20 69 6e 20 74 68 65 20 46 52 4f 4d 20  ear in the FROM 
2a9b0 63 6c 61 75 73 65 2c 0a 2a 2a 20 20 20 20 20 20  clause,.**      
2a9c0 20 20 20 66 69 6c 6c 20 70 54 61 62 4c 69 73 74     fill pTabList
2a9d0 2d 3e 61 5b 5d 2e 70 53 65 6c 65 63 74 20 77 69  ->a[].pSelect wi
2a9e0 74 68 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65  th a copy of the
2a9f0 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
2aa00 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 74 68 61  t.**         tha
2aa10 74 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65  t implements the
2aa20 20 76 69 65 77 2e 20 20 41 20 63 6f 70 79 20 69   view.  A copy i
2aa30 73 20 6d 61 64 65 20 6f 66 20 74 68 65 20 76 69  s made of the vi
2aa40 65 77 27 73 20 53 45 4c 45 43 54 0a 2a 2a 20 20  ew's SELECT.**  
2aa50 20 20 20 20 20 20 20 73 74 61 74 65 6d 65 6e 74         statement
2aa60 20 73 6f 20 74 68 61 74 20 77 65 20 63 61 6e 20   so that we can 
2aa70 66 72 65 65 6c 79 20 6d 6f 64 69 66 79 20 6f 72  freely modify or
2aa80 20 64 65 6c 65 74 65 20 74 68 61 74 20 73 74 61   delete that sta
2aa90 74 65 6d 65 6e 74 0a 2a 2a 20 20 20 20 20 20 20  tement.**       
2aaa0 20 20 77 69 74 68 6f 75 74 20 77 6f 72 72 79 69    without worryi
2aab0 6e 67 20 61 62 6f 75 74 20 6d 65 73 73 69 6e 67  ng about messing
2aac0 20 75 70 20 74 68 65 20 70 65 72 73 69 73 74 65   up the persiste
2aad0 6e 74 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f  nt representatio
2aae0 6e 0a 2a 2a 20 20 20 20 20 20 20 20 20 6f 66 20  n.**         of 
2aaf0 74 68 65 20 76 69 65 77 2e 0a 2a 2a 0a 2a 2a 20  the view..**.** 
2ab00 20 20 20 28 33 29 20 20 41 64 64 20 74 65 72 6d     (3)  Add term
2ab10 73 20 74 6f 20 74 68 65 20 57 48 45 52 45 20 63  s to the WHERE c
2ab20 6c 61 75 73 65 20 74 6f 20 61 63 63 6f 6d 6d 6f  lause to accommo
2ab30 64 61 74 65 20 74 68 65 20 4e 41 54 55 52 41 4c  date the NATURAL
2ab40 20 6b 65 79 77 6f 72 64 0a 2a 2a 20 20 20 20 20   keyword.**     
2ab50 20 20 20 20 6f 6e 20 6a 6f 69 6e 73 20 61 6e 64      on joins and
2ab60 20 74 68 65 20 4f 4e 20 61 6e 64 20 55 53 49 4e   the ON and USIN
2ab70 47 20 63 6c 61 75 73 65 20 6f 66 20 6a 6f 69 6e  G clause of join
2ab80 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 34 29 20  s..**.**    (4) 
2ab90 20 53 63 61 6e 20 74 68 65 20 6c 69 73 74 20 6f   Scan the list o
2aba0 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65  f columns in the
2abb0 20 72 65 73 75 6c 74 20 73 65 74 20 28 70 45 4c   result set (pEL
2abc0 69 73 74 29 20 6c 6f 6f 6b 69 6e 67 0a 2a 2a 20  ist) looking.** 
2abd0 20 20 20 20 20 20 20 20 66 6f 72 20 69 6e 73 74          for inst
2abe0 61 6e 63 65 73 20 6f 66 20 74 68 65 20 22 2a 22  ances of the "*"
2abf0 20 6f 70 65 72 61 74 6f 72 20 6f 72 20 74 68 65   operator or the
2ac00 20 54 41 42 4c 45 2e 2a 20 6f 70 65 72 61 74 6f   TABLE.* operato
2ac10 72 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20 49 66  r..**         If
2ac20 20 66 6f 75 6e 64 2c 20 65 78 70 61 6e 64 20 65   found, expand e
2ac30 61 63 68 20 22 2a 22 20 74 6f 20 62 65 20 65 76  ach "*" to be ev
2ac40 65 72 79 20 63 6f 6c 75 6d 6e 20 69 6e 20 65 76  ery column in ev
2ac50 65 72 79 20 74 61 62 6c 65 0a 2a 2a 20 20 20 20  ery table.**    
2ac60 20 20 20 20 20 61 6e 64 20 54 41 42 4c 45 2e 2a       and TABLE.*
2ac70 20 74 6f 20 62 65 20 65 76 65 72 79 20 63 6f 6c   to be every col
2ac80 75 6d 6e 20 69 6e 20 54 41 42 4c 45 2e 0a 2a 2a  umn in TABLE..**
2ac90 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
2aca0 65 6c 65 63 74 45 78 70 61 6e 64 65 72 28 57 61  electExpander(Wa
2acb0 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 53  lker *pWalker, S
2acc0 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 50 61 72  elect *p){.  Par
2acd0 73 65 20 2a 70 50 61 72 73 65 20 3d 20 70 57 61  se *pParse = pWa
2ace0 6c 6b 65 72 2d 3e 70 50 61 72 73 65 3b 0a 20 20  lker->pParse;.  
2acf0 69 6e 74 20 69 2c 20 6a 2c 20 6b 3b 0a 20 20 53  int i, j, k;.  S
2ad00 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74  rcList *pTabList
2ad10 3b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45  ;.  ExprList *pE
2ad20 4c 69 73 74 3b 0a 20 20 73 74 72 75 63 74 20 53  List;.  struct S
2ad30 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 46 72  rcList_item *pFr
2ad40 6f 6d 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  om;.  sqlite3 *d
2ad50 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
2ad60 20 20 45 78 70 72 20 2a 70 45 2c 20 2a 70 52 69    Expr *pE, *pRi
2ad70 67 68 74 2c 20 2a 70 45 78 70 72 3b 0a 20 20 75  ght, *pExpr;.  u
2ad80 31 36 20 73 65 6c 46 6c 61 67 73 20 3d 20 70 2d  16 selFlags = p-
2ad90 3e 73 65 6c 46 6c 61 67 73 3b 0a 20 20 75 33 32  >selFlags;.  u32
2ada0 20 65 6c 69 73 74 46 6c 61 67 73 20 3d 20 30 3b   elistFlags = 0;
2adb0 0a 0a 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20  ..  p->selFlags 
2adc0 7c 3d 20 53 46 5f 45 78 70 61 6e 64 65 64 3b 0a  |= SF_Expanded;.
2add0 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
2ade0 46 61 69 6c 65 64 20 20 29 7b 0a 20 20 20 20 72  Failed  ){.    r
2adf0 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b  eturn WRC_Abort;
2ae00 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
2ae10 2d 3e 70 53 72 63 21 3d 30 20 29 3b 0a 20 20 69  ->pSrc!=0 );.  i
2ae20 66 28 20 28 73 65 6c 46 6c 61 67 73 20 26 20 53  f( (selFlags & S
2ae30 46 5f 45 78 70 61 6e 64 65 64 29 21 3d 30 20 29  F_Expanded)!=0 )
2ae40 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 57 52 43  {.    return WRC
2ae50 5f 50 72 75 6e 65 3b 0a 20 20 7d 0a 20 20 69 66  _Prune;.  }.  if
2ae60 28 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65  ( pWalker->eCode
2ae70 20 29 7b 0a 20 20 20 20 2f 2a 20 52 65 6e 75 6d   ){.    /* Renum
2ae80 62 65 72 20 73 65 6c 49 64 20 62 65 63 61 75 73  ber selId becaus
2ae90 65 20 69 74 20 68 61 73 20 62 65 65 6e 20 63 6f  e it has been co
2aea0 70 69 65 64 20 66 72 6f 6d 20 61 20 76 69 65 77  pied from a view
2aeb0 20 2a 2f 0a 20 20 20 20 70 2d 3e 73 65 6c 49 64   */.    p->selId
2aec0 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 53 65   = ++pParse->nSe
2aed0 6c 65 63 74 3b 0a 20 20 7d 0a 20 20 70 54 61 62  lect;.  }.  pTab
2aee0 4c 69 73 74 20 3d 20 70 2d 3e 70 53 72 63 3b 0a  List = p->pSrc;.
2aef0 20 20 70 45 4c 69 73 74 20 3d 20 70 2d 3e 70 45    pEList = p->pE
2af00 4c 69 73 74 3b 0a 20 20 73 71 6c 69 74 65 33 57  List;.  sqlite3W
2af10 69 74 68 50 75 73 68 28 70 50 61 72 73 65 2c 20  ithPush(pParse, 
2af20 70 2d 3e 70 57 69 74 68 2c 20 30 29 3b 0a 0a 20  p->pWith, 0);.. 
2af30 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 63 75   /* Make sure cu
2af40 72 73 6f 72 20 6e 75 6d 62 65 72 73 20 68 61 76  rsor numbers hav
2af50 65 20 62 65 65 6e 20 61 73 73 69 67 6e 65 64 20  e been assigned 
2af60 74 6f 20 61 6c 6c 20 65 6e 74 72 69 65 73 20 69  to all entries i
2af70 6e 0a 20 20 2a 2a 20 74 68 65 20 46 52 4f 4d 20  n.  ** the FROM 
2af80 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 53 45  clause of the SE
2af90 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a  LECT statement..
2afa0 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 53 72    */.  sqlite3Sr
2afb0 63 4c 69 73 74 41 73 73 69 67 6e 43 75 72 73 6f  cListAssignCurso
2afc0 72 73 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c  rs(pParse, pTabL
2afd0 69 73 74 29 3b 0a 0a 20 20 2f 2a 20 4c 6f 6f 6b  ist);..  /* Look
2afe0 20 75 70 20 65 76 65 72 79 20 74 61 62 6c 65 20   up every table 
2aff0 6e 61 6d 65 64 20 69 6e 20 74 68 65 20 46 52 4f  named in the FRO
2b000 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20  M clause of the 
2b010 73 65 6c 65 63 74 2e 20 20 49 66 0a 20 20 2a 2a  select.  If.  **
2b020 20 61 6e 20 65 6e 74 72 79 20 6f 66 20 74 68 65   an entry of the
2b030 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 69 73 20   FROM clause is 
2b040 61 20 73 75 62 71 75 65 72 79 20 69 6e 73 74 65  a subquery inste
2b050 61 64 20 6f 66 20 61 20 74 61 62 6c 65 20 6f 72  ad of a table or
2b060 20 76 69 65 77 2c 0a 20 20 2a 2a 20 74 68 65 6e   view,.  ** then
2b070 20 63 72 65 61 74 65 20 61 20 74 72 61 6e 73 69   create a transi
2b080 65 6e 74 20 74 61 62 6c 65 20 73 74 72 75 63 74  ent table struct
2b090 75 72 65 20 74 6f 20 64 65 73 63 72 69 62 65 20  ure to describe 
2b0a0 74 68 65 20 73 75 62 71 75 65 72 79 2e 0a 20 20  the subquery..  
2b0b0 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 46  */.  for(i=0, pF
2b0c0 72 6f 6d 3d 70 54 61 62 4c 69 73 74 2d 3e 61 3b  rom=pTabList->a;
2b0d0 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72   i<pTabList->nSr
2b0e0 63 3b 20 69 2b 2b 2c 20 70 46 72 6f 6d 2b 2b 29  c; i++, pFrom++)
2b0f0 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61  {.    Table *pTa
2b100 62 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  b;.    assert( p
2b110 46 72 6f 6d 2d 3e 66 67 2e 69 73 52 65 63 75 72  From->fg.isRecur
2b120 73 69 76 65 3d 3d 30 20 7c 7c 20 70 46 72 6f 6d  sive==0 || pFrom
2b130 2d 3e 70 54 61 62 21 3d 30 20 29 3b 0a 20 20 20  ->pTab!=0 );.   
2b140 20 69 66 28 20 70 46 72 6f 6d 2d 3e 66 67 2e 69   if( pFrom->fg.i
2b150 73 52 65 63 75 72 73 69 76 65 20 29 20 63 6f 6e  sRecursive ) con
2b160 74 69 6e 75 65 3b 0a 20 20 20 20 61 73 73 65 72  tinue;.    asser
2b170 74 28 20 70 46 72 6f 6d 2d 3e 70 54 61 62 3d 3d  t( pFrom->pTab==
2b180 30 20 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  0 );.#ifndef SQL
2b190 49 54 45 5f 4f 4d 49 54 5f 43 54 45 0a 20 20 20  ITE_OMIT_CTE.   
2b1a0 20 69 66 28 20 77 69 74 68 45 78 70 61 6e 64 28   if( withExpand(
2b1b0 70 57 61 6c 6b 65 72 2c 20 70 46 72 6f 6d 29 20  pWalker, pFrom) 
2b1c0 29 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f  ) return WRC_Abo
2b1d0 72 74 3b 0a 20 20 20 20 69 66 28 20 70 46 72 6f  rt;.    if( pFro
2b1e0 6d 2d 3e 70 54 61 62 20 29 20 7b 7d 20 65 6c 73  m->pTab ) {} els
2b1f0 65 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28  e.#endif.    if(
2b200 20 70 46 72 6f 6d 2d 3e 7a 4e 61 6d 65 3d 3d 30   pFrom->zName==0
2b210 20 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   ){.#ifndef SQLI
2b220 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
2b230 0a 20 20 20 20 20 20 53 65 6c 65 63 74 20 2a 70  .      Select *p
2b240 53 65 6c 20 3d 20 70 46 72 6f 6d 2d 3e 70 53 65  Sel = pFrom->pSe
2b250 6c 65 63 74 3b 0a 20 20 20 20 20 20 2f 2a 20 41  lect;.      /* A
2b260 20 73 75 62 2d 71 75 65 72 79 20 69 6e 20 74 68   sub-query in th
2b270 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66  e FROM clause of
2b280 20 61 20 53 45 4c 45 43 54 20 2a 2f 0a 20 20 20   a SELECT */.   
2b290 20 20 20 61 73 73 65 72 74 28 20 70 53 65 6c 21     assert( pSel!
2b2a0 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  =0 );.      asse
2b2b0 72 74 28 20 70 46 72 6f 6d 2d 3e 70 54 61 62 3d  rt( pFrom->pTab=
2b2c0 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  =0 );.      if( 
2b2d0 73 71 6c 69 74 65 33 57 61 6c 6b 53 65 6c 65 63  sqlite3WalkSelec
2b2e0 74 28 70 57 61 6c 6b 65 72 2c 20 70 53 65 6c 29  t(pWalker, pSel)
2b2f0 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62   ) return WRC_Ab
2b300 6f 72 74 3b 0a 20 20 20 20 20 20 69 66 28 20 73  ort;.      if( s
2b310 71 6c 69 74 65 33 45 78 70 61 6e 64 53 75 62 71  qlite3ExpandSubq
2b320 75 65 72 79 28 70 50 61 72 73 65 2c 20 70 46 72  uery(pParse, pFr
2b330 6f 6d 29 20 29 20 72 65 74 75 72 6e 20 57 52 43  om) ) return WRC
2b340 5f 41 62 6f 72 74 3b 0a 23 65 6e 64 69 66 0a 20  _Abort;.#endif. 
2b350 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2b360 2f 2a 20 41 6e 20 6f 72 64 69 6e 61 72 79 20 74  /* An ordinary t
2b370 61 62 6c 65 20 6f 72 20 76 69 65 77 20 6e 61 6d  able or view nam
2b380 65 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c  e in the FROM cl
2b390 61 75 73 65 20 2a 2f 0a 20 20 20 20 20 20 61 73  ause */.      as
2b3a0 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e 70 54 61  sert( pFrom->pTa
2b3b0 62 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 46  b==0 );.      pF
2b3c0 72 6f 6d 2d 3e 70 54 61 62 20 3d 20 70 54 61 62  rom->pTab = pTab
2b3d0 20 3d 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65   = sqlite3Locate
2b3e0 54 61 62 6c 65 49 74 65 6d 28 70 50 61 72 73 65  TableItem(pParse
2b3f0 2c 20 30 2c 20 70 46 72 6f 6d 29 3b 0a 20 20 20  , 0, pFrom);.   
2b400 20 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29     if( pTab==0 )
2b410 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72   return WRC_Abor
2b420 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54 61  t;.      if( pTa
2b430 62 2d 3e 6e 54 61 62 52 65 66 3e 3d 30 78 66 66  b->nTabRef>=0xff
2b440 66 66 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  ff ){.        sq
2b450 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
2b460 61 72 73 65 2c 20 22 74 6f 6f 20 6d 61 6e 79 20  arse, "too many 
2b470 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 5c 22  references to \"
2b480 25 73 5c 22 3a 20 6d 61 78 20 36 35 35 33 35 22  %s\": max 65535"
2b490 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 54 61  ,.           pTa
2b4a0 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  b->zName);.     
2b4b0 20 20 20 70 46 72 6f 6d 2d 3e 70 54 61 62 20 3d     pFrom->pTab =
2b4c0 20 30 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75   0;.        retu
2b4d0 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20  rn WRC_Abort;.  
2b4e0 20 20 20 20 7d 0a 20 20 20 20 20 20 70 54 61 62      }.      pTab
2b4f0 2d 3e 6e 54 61 62 52 65 66 2b 2b 3b 0a 20 20 20  ->nTabRef++;.   
2b500 20 20 20 69 66 28 20 21 49 73 56 69 72 74 75 61     if( !IsVirtua
2b510 6c 28 70 54 61 62 29 20 26 26 20 63 61 6e 6e 6f  l(pTab) && canno
2b520 74 42 65 46 75 6e 63 74 69 6f 6e 28 70 50 61 72  tBeFunction(pPar
2b530 73 65 2c 20 70 46 72 6f 6d 29 20 29 7b 0a 20 20  se, pFrom) ){.  
2b540 20 20 20 20 20 20 72 65 74 75 72 6e 20 57 52 43        return WRC
2b550 5f 41 62 6f 72 74 3b 0a 20 20 20 20 20 20 7d 0a  _Abort;.      }.
2b560 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
2b570 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20 7c  ITE_OMIT_VIEW) |
2b580 7c 20 21 64 65 66 69 6e 65 64 20 28 53 51 4c 49  | !defined (SQLI
2b590 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
2b5a0 41 42 4c 45 29 0a 20 20 20 20 20 20 69 66 28 20  ABLE).      if( 
2b5b0 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 29 20  IsVirtual(pTab) 
2b5c0 7c 7c 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74  || pTab->pSelect
2b5d0 20 29 7b 0a 20 20 20 20 20 20 20 20 69 31 36 20   ){.        i16 
2b5e0 6e 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20 75 38  nCol;.        u8
2b5f0 20 65 43 6f 64 65 4f 72 69 67 20 3d 20 70 57 61   eCodeOrig = pWa
2b600 6c 6b 65 72 2d 3e 65 43 6f 64 65 3b 0a 20 20 20  lker->eCode;.   
2b610 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
2b620 56 69 65 77 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d  ViewGetColumnNam
2b630 65 73 28 70 50 61 72 73 65 2c 20 70 54 61 62 29  es(pParse, pTab)
2b640 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62   ) return WRC_Ab
2b650 6f 72 74 3b 0a 20 20 20 20 20 20 20 20 61 73 73  ort;.        ass
2b660 65 72 74 28 20 70 46 72 6f 6d 2d 3e 70 53 65 6c  ert( pFrom->pSel
2b670 65 63 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ect==0 );.      
2b680 20 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74    pFrom->pSelect
2b690 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74   = sqlite3Select
2b6a0 44 75 70 28 64 62 2c 20 70 54 61 62 2d 3e 70 53  Dup(db, pTab->pS
2b6b0 65 6c 65 63 74 2c 20 30 29 3b 0a 20 20 20 20 20  elect, 0);.     
2b6c0 20 20 20 6e 43 6f 6c 20 3d 20 70 54 61 62 2d 3e     nCol = pTab->
2b6d0 6e 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20 70 54  nCol;.        pT
2b6e0 61 62 2d 3e 6e 43 6f 6c 20 3d 20 2d 31 3b 0a 20  ab->nCol = -1;. 
2b6f0 20 20 20 20 20 20 20 70 57 61 6c 6b 65 72 2d 3e         pWalker->
2b700 65 43 6f 64 65 20 3d 20 31 3b 20 20 2f 2a 20 54  eCode = 1;  /* T
2b710 75 72 6e 20 6f 6e 20 53 65 6c 65 63 74 2e 73 65  urn on Select.se
2b720 6c 49 64 20 72 65 6e 75 6d 62 65 72 69 6e 67 20  lId renumbering 
2b730 2a 2f 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  */.        sqlit
2b740 65 33 57 61 6c 6b 53 65 6c 65 63 74 28 70 57 61  e3WalkSelect(pWa
2b750 6c 6b 65 72 2c 20 70 46 72 6f 6d 2d 3e 70 53 65  lker, pFrom->pSe
2b760 6c 65 63 74 29 3b 0a 20 20 20 20 20 20 20 20 70  lect);.        p
2b770 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 20 3d 20  Walker->eCode = 
2b780 65 43 6f 64 65 4f 72 69 67 3b 0a 20 20 20 20 20  eCodeOrig;.     
2b790 20 20 20 70 54 61 62 2d 3e 6e 43 6f 6c 20 3d 20     pTab->nCol = 
2b7a0 6e 43 6f 6c 3b 0a 20 20 20 20 20 20 7d 0a 23 65  nCol;.      }.#e
2b7b0 6e 64 69 66 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ndif.    }..    
2b7c0 2f 2a 20 4c 6f 63 61 74 65 20 74 68 65 20 69 6e  /* Locate the in
2b7d0 64 65 78 20 6e 61 6d 65 64 20 62 79 20 74 68 65  dex named by the
2b7e0 20 49 4e 44 45 58 45 44 20 42 59 20 63 6c 61 75   INDEXED BY clau
2b7f0 73 65 2c 20 69 66 20 61 6e 79 2e 20 2a 2f 0a 20  se, if any. */. 
2b800 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 49 6e     if( sqlite3In
2b810 64 65 78 65 64 42 79 4c 6f 6f 6b 75 70 28 70 50  dexedByLookup(pP
2b820 61 72 73 65 2c 20 70 46 72 6f 6d 29 20 29 7b 0a  arse, pFrom) ){.
2b830 20 20 20 20 20 20 72 65 74 75 72 6e 20 57 52 43        return WRC
2b840 5f 41 62 6f 72 74 3b 0a 20 20 20 20 7d 0a 20 20  _Abort;.    }.  
2b850 7d 0a 0a 20 20 2f 2a 20 50 72 6f 63 65 73 73 20  }..  /* Process 
2b860 4e 41 54 55 52 41 4c 20 6b 65 79 77 6f 72 64 73  NATURAL keywords
2b870 2c 20 61 6e 64 20 4f 4e 20 61 6e 64 20 55 53 49  , and ON and USI
2b880 4e 47 20 63 6c 61 75 73 65 73 20 6f 66 20 6a 6f  NG clauses of jo
2b890 69 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ins..  */.  if( 
2b8a0 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
2b8b0 20 7c 7c 20 73 71 6c 69 74 65 50 72 6f 63 65 73   || sqliteProces
2b8c0 73 4a 6f 69 6e 28 70 50 61 72 73 65 2c 20 70 29  sJoin(pParse, p)
2b8d0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 57   ){.    return W
2b8e0 52 43 5f 41 62 6f 72 74 3b 0a 20 20 7d 0a 0a 20  RC_Abort;.  }.. 
2b8f0 20 2f 2a 20 46 6f 72 20 65 76 65 72 79 20 22 2a   /* For every "*
2b900 22 20 74 68 61 74 20 6f 63 63 75 72 73 20 69 6e  " that occurs in
2b910 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6c 69 73 74   the column list
2b920 2c 20 69 6e 73 65 72 74 20 74 68 65 20 6e 61 6d  , insert the nam
2b930 65 73 20 6f 66 0a 20 20 2a 2a 20 61 6c 6c 20 63  es of.  ** all c
2b940 6f 6c 75 6d 6e 73 20 69 6e 20 61 6c 6c 20 74 61  olumns in all ta
2b950 62 6c 65 73 2e 20 20 41 6e 64 20 66 6f 72 20 65  bles.  And for e
2b960 76 65 72 79 20 54 41 42 4c 45 2e 2a 20 69 6e 73  very TABLE.* ins
2b970 65 72 74 20 74 68 65 20 6e 61 6d 65 73 0a 20 20  ert the names.  
2b980 2a 2a 20 6f 66 20 61 6c 6c 20 63 6f 6c 75 6d 6e  ** of all column
2b990 73 20 69 6e 20 54 41 42 4c 45 2e 20 20 54 68 65  s in TABLE.  The
2b9a0 20 70 61 72 73 65 72 20 69 6e 73 65 72 74 65 64   parser inserted
2b9b0 20 61 20 73 70 65 63 69 61 6c 20 65 78 70 72 65   a special expre
2b9c0 73 73 69 6f 6e 0a 20 20 2a 2a 20 77 69 74 68 20  ssion.  ** with 
2b9d0 74 68 65 20 54 4b 5f 41 53 54 45 52 49 53 4b 20  the TK_ASTERISK 
2b9e0 6f 70 65 72 61 74 6f 72 20 66 6f 72 20 65 61 63  operator for eac
2b9f0 68 20 22 2a 22 20 74 68 61 74 20 69 74 20 66 6f  h "*" that it fo
2ba00 75 6e 64 20 69 6e 20 74 68 65 20 63 6f 6c 75 6d  und in the colum
2ba10 6e 0a 20 20 2a 2a 20 6c 69 73 74 2e 20 20 54 68  n.  ** list.  Th
2ba20 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 64 65  e following code
2ba30 20 6a 75 73 74 20 68 61 73 20 74 6f 20 6c 6f 63   just has to loc
2ba40 61 74 65 20 74 68 65 20 54 4b 5f 41 53 54 45 52  ate the TK_ASTER
2ba50 49 53 4b 0a 20 20 2a 2a 20 65 78 70 72 65 73 73  ISK.  ** express
2ba60 69 6f 6e 73 20 61 6e 64 20 65 78 70 61 6e 64 20  ions and expand 
2ba70 65 61 63 68 20 6f 6e 65 20 74 6f 20 74 68 65 20  each one to the 
2ba80 6c 69 73 74 20 6f 66 20 61 6c 6c 20 63 6f 6c 75  list of all colu
2ba90 6d 6e 73 20 69 6e 0a 20 20 2a 2a 20 61 6c 6c 20  mns in.  ** all 
2baa0 74 61 62 6c 65 73 2e 0a 20 20 2a 2a 0a 20 20 2a  tables..  **.  *
2bab0 2a 20 54 68 65 20 66 69 72 73 74 20 6c 6f 6f 70  * The first loop
2bac0 20 6a 75 73 74 20 63 68 65 63 6b 73 20 74 6f 20   just checks to 
2bad0 73 65 65 20 69 66 20 74 68 65 72 65 20 61 72 65  see if there are
2bae0 20 61 6e 79 20 22 2a 22 20 6f 70 65 72 61 74 6f   any "*" operato
2baf0 72 73 0a 20 20 2a 2a 20 74 68 61 74 20 6e 65 65  rs.  ** that nee
2bb00 64 20 65 78 70 61 6e 64 69 6e 67 2e 0a 20 20 2a  d expanding..  *
2bb10 2f 0a 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 70  /.  for(k=0; k<p
2bb20 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 6b 2b  EList->nExpr; k+
2bb30 2b 29 7b 0a 20 20 20 20 70 45 20 3d 20 70 45 4c  +){.    pE = pEL
2bb40 69 73 74 2d 3e 61 5b 6b 5d 2e 70 45 78 70 72 3b  ist->a[k].pExpr;
2bb50 0a 20 20 20 20 69 66 28 20 70 45 2d 3e 6f 70 3d  .    if( pE->op=
2bb60 3d 54 4b 5f 41 53 54 45 52 49 53 4b 20 29 20 62  =TK_ASTERISK ) b
2bb70 72 65 61 6b 3b 0a 20 20 20 20 61 73 73 65 72 74  reak;.    assert
2bb80 28 20 70 45 2d 3e 6f 70 21 3d 54 4b 5f 44 4f 54  ( pE->op!=TK_DOT
2bb90 20 7c 7c 20 70 45 2d 3e 70 52 69 67 68 74 21 3d   || pE->pRight!=
2bba0 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
2bbb0 20 70 45 2d 3e 6f 70 21 3d 54 4b 5f 44 4f 54 20   pE->op!=TK_DOT 
2bbc0 7c 7c 20 28 70 45 2d 3e 70 4c 65 66 74 21 3d 30  || (pE->pLeft!=0
2bbd0 20 26 26 20 70 45 2d 3e 70 4c 65 66 74 2d 3e 6f   && pE->pLeft->o
2bbe0 70 3d 3d 54 4b 5f 49 44 29 20 29 3b 0a 20 20 20  p==TK_ID) );.   
2bbf0 20 69 66 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f   if( pE->op==TK_
2bc00 44 4f 54 20 26 26 20 70 45 2d 3e 70 52 69 67 68  DOT && pE->pRigh
2bc10 74 2d 3e 6f 70 3d 3d 54 4b 5f 41 53 54 45 52 49  t->op==TK_ASTERI
2bc20 53 4b 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  SK ) break;.    
2bc30 65 6c 69 73 74 46 6c 61 67 73 20 7c 3d 20 70 45  elistFlags |= pE
2bc40 2d 3e 66 6c 61 67 73 3b 0a 20 20 7d 0a 20 20 69  ->flags;.  }.  i
2bc50 66 28 20 6b 3c 70 45 4c 69 73 74 2d 3e 6e 45 78  f( k<pEList->nEx
2bc60 70 72 20 29 7b 0a 20 20 20 20 2f 2a 0a 20 20 20  pr ){.    /*.   
2bc70 20 2a 2a 20 49 66 20 77 65 20 67 65 74 20 68 65   ** If we get he
2bc80 72 65 20 69 74 20 6d 65 61 6e 73 20 74 68 65 20  re it means the 
2bc90 72 65 73 75 6c 74 20 73 65 74 20 63 6f 6e 74 61  result set conta
2bca0 69 6e 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20  ins one or more 
2bcb0 22 2a 22 0a 20 20 20 20 2a 2a 20 6f 70 65 72 61  "*".    ** opera
2bcc0 74 6f 72 73 20 74 68 61 74 20 6e 65 65 64 20 74  tors that need t
2bcd0 6f 20 62 65 20 65 78 70 61 6e 64 65 64 2e 20 20  o be expanded.  
2bce0 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20 65 61 63  Loop through eac
2bcf0 68 20 65 78 70 72 65 73 73 69 6f 6e 0a 20 20 20  h expression.   
2bd00 20 2a 2a 20 69 6e 20 74 68 65 20 72 65 73 75 6c   ** in the resul
2bd10 74 20 73 65 74 20 61 6e 64 20 65 78 70 61 6e 64  t set and expand
2bd20 20 74 68 65 6d 20 6f 6e 65 20 62 79 20 6f 6e 65   them one by one
2bd30 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 74 72  ..    */.    str
2bd40 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
2bd50 6d 20 2a 61 20 3d 20 70 45 4c 69 73 74 2d 3e 61  m *a = pEList->a
2bd60 3b 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a  ;.    ExprList *
2bd70 70 4e 65 77 20 3d 20 30 3b 0a 20 20 20 20 69 6e  pNew = 0;.    in
2bd80 74 20 66 6c 61 67 73 20 3d 20 70 50 61 72 73 65  t flags = pParse
2bd90 2d 3e 64 62 2d 3e 66 6c 61 67 73 3b 0a 20 20 20  ->db->flags;.   
2bda0 20 69 6e 74 20 6c 6f 6e 67 4e 61 6d 65 73 20 3d   int longNames =
2bdb0 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45   (flags & SQLITE
2bdc0 5f 46 75 6c 6c 43 6f 6c 4e 61 6d 65 73 29 21 3d  _FullColNames)!=
2bdd0 30 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0.              
2bde0 20 20 20 20 20 20 20 20 26 26 20 28 66 6c 61 67          && (flag
2bdf0 73 20 26 20 53 51 4c 49 54 45 5f 53 68 6f 72 74  s & SQLITE_Short
2be00 43 6f 6c 4e 61 6d 65 73 29 3d 3d 30 3b 0a 0a 20  ColNames)==0;.. 
2be10 20 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 70 45     for(k=0; k<pE
2be20 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 6b 2b 2b  List->nExpr; k++
2be30 29 7b 0a 20 20 20 20 20 20 70 45 20 3d 20 61 5b  ){.      pE = a[
2be40 6b 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20  k].pExpr;.      
2be50 65 6c 69 73 74 46 6c 61 67 73 20 7c 3d 20 70 45  elistFlags |= pE
2be60 2d 3e 66 6c 61 67 73 3b 0a 20 20 20 20 20 20 70  ->flags;.      p
2be70 52 69 67 68 74 20 3d 20 70 45 2d 3e 70 52 69 67  Right = pE->pRig
2be80 68 74 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  ht;.      assert
2be90 28 20 70 45 2d 3e 6f 70 21 3d 54 4b 5f 44 4f 54  ( pE->op!=TK_DOT
2bea0 20 7c 7c 20 70 52 69 67 68 74 21 3d 30 20 29 3b   || pRight!=0 );
2beb0 0a 20 20 20 20 20 20 69 66 28 20 70 45 2d 3e 6f  .      if( pE->o
2bec0 70 21 3d 54 4b 5f 41 53 54 45 52 49 53 4b 0a 20  p!=TK_ASTERISK. 
2bed0 20 20 20 20 20 20 26 26 20 28 70 45 2d 3e 6f 70        && (pE->op
2bee0 21 3d 54 4b 5f 44 4f 54 20 7c 7c 20 70 52 69 67  !=TK_DOT || pRig
2bef0 68 74 2d 3e 6f 70 21 3d 54 4b 5f 41 53 54 45 52  ht->op!=TK_ASTER
2bf00 49 53 4b 29 0a 20 20 20 20 20 20 29 7b 0a 20 20  ISK).      ){.  
2bf10 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 70 61        /* This pa
2bf20 72 74 69 63 75 6c 61 72 20 65 78 70 72 65 73 73  rticular express
2bf30 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65  ion does not nee
2bf40 64 20 74 6f 20 62 65 20 65 78 70 61 6e 64 65 64  d to be expanded
2bf50 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
2bf60 20 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69       pNew = sqli
2bf70 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e  te3ExprListAppen
2bf80 64 28 70 50 61 72 73 65 2c 20 70 4e 65 77 2c 20  d(pParse, pNew, 
2bf90 61 5b 6b 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20  a[k].pExpr);.   
2bfa0 20 20 20 20 20 69 66 28 20 70 4e 65 77 20 29 7b       if( pNew ){
2bfb0 0a 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d  .          pNew-
2bfc0 3e 61 5b 70 4e 65 77 2d 3e 6e 45 78 70 72 2d 31  >a[pNew->nExpr-1
2bfd0 5d 2e 7a 4e 61 6d 65 20 3d 20 61 5b 6b 5d 2e 7a  ].zName = a[k].z
2bfe0 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 20 20  Name;.          
2bff0 70 4e 65 77 2d 3e 61 5b 70 4e 65 77 2d 3e 6e 45  pNew->a[pNew->nE
2c000 78 70 72 2d 31 5d 2e 7a 53 70 61 6e 20 3d 20 61  xpr-1].zSpan = a
2c010 5b 6b 5d 2e 7a 53 70 61 6e 3b 0a 20 20 20 20 20  [k].zSpan;.     
2c020 20 20 20 20 20 61 5b 6b 5d 2e 7a 4e 61 6d 65 20       a[k].zName 
2c030 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 61  = 0;.          a
2c040 5b 6b 5d 2e 7a 53 70 61 6e 20 3d 20 30 3b 0a 20  [k].zSpan = 0;. 
2c050 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2c060 20 61 5b 6b 5d 2e 70 45 78 70 72 20 3d 20 30 3b   a[k].pExpr = 0;
2c070 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
2c080 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 65 78        /* This ex
2c090 70 72 65 73 73 69 6f 6e 20 69 73 20 61 20 22 2a  pression is a "*
2c0a0 22 20 6f 72 20 61 20 22 54 41 42 4c 45 2e 2a 22  " or a "TABLE.*"
2c0b0 20 61 6e 64 20 6e 65 65 64 73 20 74 6f 20 62 65   and needs to be
2c0c0 0a 20 20 20 20 20 20 20 20 2a 2a 20 65 78 70 61  .        ** expa
2c0d0 6e 64 65 64 2e 20 2a 2f 0a 20 20 20 20 20 20 20  nded. */.       
2c0e0 20 69 6e 74 20 74 61 62 6c 65 53 65 65 6e 20 3d   int tableSeen =
2c0f0 20 30 3b 20 20 20 20 20 20 2f 2a 20 53 65 74 20   0;      /* Set 
2c100 74 6f 20 31 20 77 68 65 6e 20 54 41 42 4c 45 20  to 1 when TABLE 
2c110 6d 61 74 63 68 65 73 20 2a 2f 0a 20 20 20 20 20  matches */.     
2c120 20 20 20 63 68 61 72 20 2a 7a 54 4e 61 6d 65 20     char *zTName 
2c130 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 74 65  = 0;       /* te
2c140 78 74 20 6f 66 20 6e 61 6d 65 20 6f 66 20 54 41  xt of name of TA
2c150 42 4c 45 20 2a 2f 0a 20 20 20 20 20 20 20 20 69  BLE */.        i
2c160 66 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f  f( pE->op==TK_DO
2c170 54 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61  T ){.          a
2c180 73 73 65 72 74 28 20 70 45 2d 3e 70 4c 65 66 74  ssert( pE->pLeft
2c190 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20  !=0 );.         
2c1a0 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61   assert( !ExprHa
2c1b0 73 50 72 6f 70 65 72 74 79 28 70 45 2d 3e 70 4c  sProperty(pE->pL
2c1c0 65 66 74 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65  eft, EP_IntValue
2c1d0 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7a  ) );.          z
2c1e0 54 4e 61 6d 65 20 3d 20 70 45 2d 3e 70 4c 65 66  TName = pE->pLef
2c1f0 74 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 20  t->u.zToken;.   
2c200 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 66       }.        f
2c210 6f 72 28 69 3d 30 2c 20 70 46 72 6f 6d 3d 70 54  or(i=0, pFrom=pT
2c220 61 62 4c 69 73 74 2d 3e 61 3b 20 69 3c 70 54 61  abList->a; i<pTa
2c230 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b  bList->nSrc; i++
2c240 2c 20 70 46 72 6f 6d 2b 2b 29 7b 0a 20 20 20 20  , pFrom++){.    
2c250 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61        Table *pTa
2c260 62 20 3d 20 70 46 72 6f 6d 2d 3e 70 54 61 62 3b  b = pFrom->pTab;
2c270 0a 20 20 20 20 20 20 20 20 20 20 53 65 6c 65 63  .          Selec
2c280 74 20 2a 70 53 75 62 20 3d 20 70 46 72 6f 6d 2d  t *pSub = pFrom-
2c290 3e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 20 20  >pSelect;.      
2c2a0 20 20 20 20 63 68 61 72 20 2a 7a 54 61 62 4e 61      char *zTabNa
2c2b0 6d 65 20 3d 20 70 46 72 6f 6d 2d 3e 7a 41 6c 69  me = pFrom->zAli
2c2c0 61 73 3b 0a 20 20 20 20 20 20 20 20 20 20 63 6f  as;.          co
2c2d0 6e 73 74 20 63 68 61 72 20 2a 7a 53 63 68 65 6d  nst char *zSchem
2c2e0 61 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 20  aName = 0;.     
2c2f0 20 20 20 20 20 69 6e 74 20 69 44 62 3b 0a 20 20       int iDb;.  
2c300 20 20 20 20 20 20 20 20 69 66 28 20 7a 54 61 62          if( zTab
2c310 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Name==0 ){.     
2c320 20 20 20 20 20 20 20 7a 54 61 62 4e 61 6d 65 20         zTabName 
2c330 3d 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 3b 0a 20  = pTab->zName;. 
2c340 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
2c350 20 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c       if( db->mal
2c360 6c 6f 63 46 61 69 6c 65 64 20 29 20 62 72 65 61  locFailed ) brea
2c370 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  k;.          if(
2c380 20 70 53 75 62 3d 3d 30 20 7c 7c 20 28 70 53 75   pSub==0 || (pSu
2c390 62 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46  b->selFlags & SF
2c3a0 5f 4e 65 73 74 65 64 46 72 6f 6d 29 3d 3d 30 20  _NestedFrom)==0 
2c3b0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  ){.            p
2c3c0 53 75 62 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  Sub = 0;.       
2c3d0 20 20 20 20 20 69 66 28 20 7a 54 4e 61 6d 65 20       if( zTName 
2c3e0 26 26 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  && sqlite3StrICm
2c3f0 70 28 7a 54 4e 61 6d 65 2c 20 7a 54 61 62 4e 61  p(zTName, zTabNa
2c400 6d 65 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  me)!=0 ){.      
2c410 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65          continue
2c420 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
2c430 20 20 20 20 20 20 20 20 20 20 20 20 69 44 62 20              iDb 
2c440 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54  = sqlite3SchemaT
2c450 6f 49 6e 64 65 78 28 64 62 2c 20 70 54 61 62 2d  oIndex(db, pTab-
2c460 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 20  >pSchema);.     
2c470 20 20 20 20 20 20 20 7a 53 63 68 65 6d 61 4e 61         zSchemaNa
2c480 6d 65 20 3d 20 69 44 62 3e 3d 30 20 3f 20 64 62  me = iDb>=0 ? db
2c490 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 44 62 53 4e  ->aDb[iDb].zDbSN
2c4a0 61 6d 65 20 3a 20 22 2a 22 3b 0a 20 20 20 20 20  ame : "*";.     
2c4b0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
2c4c0 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 54 61 62   for(j=0; j<pTab
2c4d0 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20  ->nCol; j++){.  
2c4e0 20 20 20 20 20 20 20 20 20 20 63 68 61 72 20 2a            char *
2c4f0 7a 4e 61 6d 65 20 3d 20 70 54 61 62 2d 3e 61 43  zName = pTab->aC
2c500 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20  ol[j].zName;.   
2c510 20 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a           char *z
2c520 43 6f 6c 6e 61 6d 65 3b 20 20 2f 2a 20 54 68 65  Colname;  /* The
2c530 20 63 6f 6d 70 75 74 65 64 20 63 6f 6c 75 6d 6e   computed column
2c540 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 20 20 20   name */.       
2c550 20 20 20 20 20 63 68 61 72 20 2a 7a 54 6f 46 72       char *zToFr
2c560 65 65 3b 20 20 20 2f 2a 20 4d 61 6c 6c 6f 63 65  ee;   /* Malloce
2c570 64 20 73 74 72 69 6e 67 20 74 68 61 74 20 6e 65  d string that ne
2c580 65 64 73 20 74 6f 20 62 65 20 66 72 65 65 64 20  eds to be freed 
2c590 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 54  */.            T
2c5a0 6f 6b 65 6e 20 73 43 6f 6c 6e 61 6d 65 3b 20 20  oken sColname;  
2c5b0 2f 2a 20 43 6f 6d 70 75 74 65 64 20 63 6f 6c 75  /* Computed colu
2c5c0 6d 6e 20 6e 61 6d 65 20 61 73 20 61 20 74 6f 6b  mn name as a tok
2c5d0 65 6e 20 2a 2f 0a 0a 20 20 20 20 20 20 20 20 20  en */..         
2c5e0 20 20 20 61 73 73 65 72 74 28 20 7a 4e 61 6d 65     assert( zName
2c5f0 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   );.            
2c600 69 66 28 20 7a 54 4e 61 6d 65 20 26 26 20 70 53  if( zTName && pS
2c610 75 62 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ub.             
2c620 26 26 20 73 71 6c 69 74 65 33 4d 61 74 63 68 53  && sqlite3MatchS
2c630 70 61 6e 4e 61 6d 65 28 70 53 75 62 2d 3e 70 45  panName(pSub->pE
2c640 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 7a 53 70 61 6e  List->a[j].zSpan
2c650 2c 20 30 2c 20 7a 54 4e 61 6d 65 2c 20 30 29 3d  , 0, zTName, 0)=
2c660 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20 20 29  =0.            )
2c670 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
2c680 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
2c690 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20        }..       
2c6a0 20 20 20 20 20 2f 2a 20 49 66 20 61 20 63 6f 6c       /* If a col
2c6b0 75 6d 6e 20 69 73 20 6d 61 72 6b 65 64 20 61 73  umn is marked as
2c6c0 20 27 68 69 64 64 65 6e 27 2c 20 6f 6d 69 74 20   'hidden', omit 
2c6d0 69 74 20 66 72 6f 6d 20 74 68 65 20 65 78 70 61  it from the expa
2c6e0 6e 64 65 64 0a 20 20 20 20 20 20 20 20 20 20 20  nded.           
2c6f0 20 2a 2a 20 72 65 73 75 6c 74 2d 73 65 74 20 6c   ** result-set l
2c700 69 73 74 20 75 6e 6c 65 73 73 20 74 68 65 20 53  ist unless the S
2c710 45 4c 45 43 54 20 68 61 73 20 74 68 65 20 53 46  ELECT has the SF
2c720 5f 49 6e 63 6c 75 64 65 48 69 64 64 65 6e 0a 20  _IncludeHidden. 
2c730 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 62 69             ** bi
2c740 74 20 73 65 74 2e 0a 20 20 20 20 20 20 20 20 20  t set..         
2c750 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20     */.          
2c760 20 20 69 66 28 20 28 70 2d 3e 73 65 6c 46 6c 61    if( (p->selFla
2c770 67 73 20 26 20 53 46 5f 49 6e 63 6c 75 64 65 48  gs & SF_IncludeH
2c780 69 64 64 65 6e 29 3d 3d 30 0a 20 20 20 20 20 20  idden)==0.      
2c790 20 20 20 20 20 20 20 26 26 20 49 73 48 69 64 64         && IsHidd
2c7a0 65 6e 43 6f 6c 75 6d 6e 28 26 70 54 61 62 2d 3e  enColumn(&pTab->
2c7b0 61 43 6f 6c 5b 6a 5d 29 20 0a 20 20 20 20 20 20  aCol[j]) .      
2c7c0 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
2c7d0 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b         continue;
2c7e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
2c7f0 20 20 20 20 20 20 20 20 20 20 20 74 61 62 6c 65             table
2c800 53 65 65 6e 20 3d 20 31 3b 0a 0a 20 20 20 20 20  Seen = 1;..     
2c810 20 20 20 20 20 20 20 69 66 28 20 69 3e 30 20 26         if( i>0 &
2c820 26 20 7a 54 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20  & zTName==0 ){. 
2c830 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28               if(
2c840 20 28 70 46 72 6f 6d 2d 3e 66 67 2e 6a 6f 69 6e   (pFrom->fg.join
2c850 74 79 70 65 20 26 20 4a 54 5f 4e 41 54 55 52 41  type & JT_NATURA
2c860 4c 29 21 3d 30 0a 20 20 20 20 20 20 20 20 20 20  L)!=0.          
2c870 20 20 20 20 20 20 26 26 20 74 61 62 6c 65 41 6e        && tableAn
2c880 64 43 6f 6c 75 6d 6e 49 6e 64 65 78 28 70 54 61  dColumnIndex(pTa
2c890 62 4c 69 73 74 2c 20 69 2c 20 7a 4e 61 6d 65 2c  bList, i, zName,
2c8a0 20 30 2c 20 30 29 0a 20 20 20 20 20 20 20 20 20   0, 0).         
2c8b0 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
2c8c0 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 20 61 20          /* In a 
2c8d0 4e 41 54 55 52 41 4c 20 6a 6f 69 6e 2c 20 6f 6d  NATURAL join, om
2c8e0 69 74 20 74 68 65 20 6a 6f 69 6e 20 63 6f 6c 75  it the join colu
2c8f0 6d 6e 73 20 66 72 6f 6d 20 74 68 65 20 0a 20 20  mns from the .  
2c900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a                **
2c910 20 74 61 62 6c 65 20 74 6f 20 74 68 65 20 72 69   table to the ri
2c920 67 68 74 20 6f 66 20 74 68 65 20 6a 6f 69 6e 20  ght of the join 
2c930 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  */.             
2c940 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
2c950 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
2c960 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73             if( s
2c970 71 6c 69 74 65 33 49 64 4c 69 73 74 49 6e 64 65  qlite3IdListInde
2c980 78 28 70 46 72 6f 6d 2d 3e 70 55 73 69 6e 67 2c  x(pFrom->pUsing,
2c990 20 7a 4e 61 6d 65 29 3e 3d 30 20 29 7b 0a 20 20   zName)>=0 ){.  
2c9a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2c9b0 20 49 6e 20 61 20 6a 6f 69 6e 20 77 69 74 68 20   In a join with 
2c9c0 61 20 55 53 49 4e 47 20 63 6c 61 75 73 65 2c 20  a USING clause, 
2c9d0 6f 6d 69 74 20 63 6f 6c 75 6d 6e 73 20 69 6e 20  omit columns in 
2c9e0 74 68 65 0a 20 20 20 20 20 20 20 20 20 20 20 20  the.            
2c9f0 20 20 20 20 2a 2a 20 75 73 69 6e 67 20 63 6c 61      ** using cla
2ca00 75 73 65 20 66 72 6f 6d 20 74 68 65 20 74 61 62  use from the tab
2ca10 6c 65 20 6f 6e 20 74 68 65 20 72 69 67 68 74 2e  le on the right.
2ca20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
2ca30 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
2ca40 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
2ca50 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2ca60 20 20 20 20 20 20 20 20 70 52 69 67 68 74 20 3d          pRight =
2ca70 20 73 71 6c 69 74 65 33 45 78 70 72 28 64 62 2c   sqlite3Expr(db,
2ca80 20 54 4b 5f 49 44 2c 20 7a 4e 61 6d 65 29 3b 0a   TK_ID, zName);.
2ca90 20 20 20 20 20 20 20 20 20 20 20 20 7a 43 6f 6c              zCol
2caa0 6e 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20  name = zName;.  
2cab0 20 20 20 20 20 20 20 20 20 20 7a 54 6f 46 72 65            zToFre
2cac0 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  e = 0;.         
2cad0 20 20 20 69 66 28 20 6c 6f 6e 67 4e 61 6d 65 73     if( longNames
2cae0 20 7c 7c 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53   || pTabList->nS
2caf0 72 63 3e 31 20 29 7b 0a 20 20 20 20 20 20 20 20  rc>1 ){.        
2cb00 20 20 20 20 20 20 45 78 70 72 20 2a 70 4c 65 66        Expr *pLef
2cb10 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  t;.             
2cb20 20 70 4c 65 66 74 20 3d 20 73 71 6c 69 74 65 33   pLeft = sqlite3
2cb30 45 78 70 72 28 64 62 2c 20 54 4b 5f 49 44 2c 20  Expr(db, TK_ID, 
2cb40 7a 54 61 62 4e 61 6d 65 29 3b 0a 20 20 20 20 20  zTabName);.     
2cb50 20 20 20 20 20 20 20 20 20 70 45 78 70 72 20 3d           pExpr =
2cb60 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70 50   sqlite3PExpr(pP
2cb70 61 72 73 65 2c 20 54 4b 5f 44 4f 54 2c 20 70 4c  arse, TK_DOT, pL
2cb80 65 66 74 2c 20 70 52 69 67 68 74 29 3b 0a 20 20  eft, pRight);.  
2cb90 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
2cba0 7a 53 63 68 65 6d 61 4e 61 6d 65 20 29 7b 0a 20  zSchemaName ){. 
2cbb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
2cbc0 4c 65 66 74 20 3d 20 73 71 6c 69 74 65 33 45 78  Left = sqlite3Ex
2cbd0 70 72 28 64 62 2c 20 54 4b 5f 49 44 2c 20 7a 53  pr(db, TK_ID, zS
2cbe0 63 68 65 6d 61 4e 61 6d 65 29 3b 0a 20 20 20 20  chemaName);.    
2cbf0 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70              pExp
2cc00 72 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72  r = sqlite3PExpr
2cc10 28 70 50 61 72 73 65 2c 20 54 4b 5f 44 4f 54 2c  (pParse, TK_DOT,
2cc20 20 70 4c 65 66 74 2c 20 70 45 78 70 72 29 3b 0a   pLeft, pExpr);.
2cc30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a                }.
2cc40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
2cc50 28 20 6c 6f 6e 67 4e 61 6d 65 73 20 29 7b 0a 20  ( longNames ){. 
2cc60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a                 z
2cc70 43 6f 6c 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65  Colname = sqlite
2cc80 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 25 73  3MPrintf(db, "%s
2cc90 2e 25 73 22 2c 20 7a 54 61 62 4e 61 6d 65 2c 20  .%s", zTabName, 
2cca0 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  zName);.        
2ccb0 20 20 20 20 20 20 20 20 7a 54 6f 46 72 65 65 20          zToFree 
2ccc0 3d 20 7a 43 6f 6c 6e 61 6d 65 3b 0a 20 20 20 20  = zColname;.    
2ccd0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2cce0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
2ccf0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78               pEx
2cd00 70 72 20 3d 20 70 52 69 67 68 74 3b 0a 20 20 20  pr = pRight;.   
2cd10 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
2cd20 20 20 20 20 20 20 20 70 4e 65 77 20 3d 20 73 71         pNew = sq
2cd30 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70 70  lite3ExprListApp
2cd40 65 6e 64 28 70 50 61 72 73 65 2c 20 70 4e 65 77  end(pParse, pNew
2cd50 2c 20 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20  , pExpr);.      
2cd60 20 20 20 20 20 20 73 71 6c 69 74 65 33 54 6f 6b        sqlite3Tok
2cd70 65 6e 49 6e 69 74 28 26 73 43 6f 6c 6e 61 6d 65  enInit(&sColname
2cd80 2c 20 7a 43 6f 6c 6e 61 6d 65 29 3b 0a 20 20 20  , zColname);.   
2cd90 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
2cda0 45 78 70 72 4c 69 73 74 53 65 74 4e 61 6d 65 28  ExprListSetName(
2cdb0 70 50 61 72 73 65 2c 20 70 4e 65 77 2c 20 26 73  pParse, pNew, &s
2cdc0 43 6f 6c 6e 61 6d 65 2c 20 30 29 3b 0a 20 20 20  Colname, 0);.   
2cdd0 20 20 20 20 20 20 20 20 20 69 66 28 20 70 4e 65           if( pNe
2cde0 77 20 26 26 20 28 70 2d 3e 73 65 6c 46 6c 61 67  w && (p->selFlag
2cdf0 73 20 26 20 53 46 5f 4e 65 73 74 65 64 46 72 6f  s & SF_NestedFro
2ce00 6d 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  m)!=0 ){.       
2ce10 20 20 20 20 20 20 20 73 74 72 75 63 74 20 45 78         struct Ex
2ce20 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 58 20  prList_item *pX 
2ce30 3d 20 26 70 4e 65 77 2d 3e 61 5b 70 4e 65 77 2d  = &pNew->a[pNew-
2ce40 3e 6e 45 78 70 72 2d 31 5d 3b 0a 20 20 20 20 20  >nExpr-1];.     
2ce50 20 20 20 20 20 20 20 20 20 69 66 28 20 70 53 75           if( pSu
2ce60 62 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  b ){.           
2ce70 20 20 20 20 20 70 58 2d 3e 7a 53 70 61 6e 20 3d       pX->zSpan =
2ce80 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70   sqlite3DbStrDup
2ce90 28 64 62 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73  (db, pSub->pELis
2cea0 74 2d 3e 61 5b 6a 5d 2e 7a 53 70 61 6e 29 3b 0a  t->a[j].zSpan);.
2ceb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cec0 74 65 73 74 63 61 73 65 28 20 70 58 2d 3e 7a 53  testcase( pX->zS
2ced0 70 61 6e 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  pan==0 );.      
2cee0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
2cef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
2cf00 58 2d 3e 7a 53 70 61 6e 20 3d 20 73 71 6c 69 74  X->zSpan = sqlit
2cf10 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 25  e3MPrintf(db, "%
2cf20 73 2e 25 73 2e 25 73 22 2c 0a 20 20 20 20 20 20  s.%s.%s",.      
2cf30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cf40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cf50 20 20 20 20 20 7a 53 63 68 65 6d 61 4e 61 6d 65       zSchemaName
2cf60 2c 20 7a 54 61 62 4e 61 6d 65 2c 20 7a 43 6f 6c  , zTabName, zCol
2cf70 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20  name);.         
2cf80 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
2cf90 20 70 58 2d 3e 7a 53 70 61 6e 3d 3d 30 20 29 3b   pX->zSpan==0 );
2cfa0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  .              }
2cfb0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
2cfc0 58 2d 3e 62 53 70 61 6e 49 73 54 61 62 20 3d 20  X->bSpanIsTab = 
2cfd0 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  1;.            }
2cfe0 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
2cff0 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a  ite3DbFree(db, z
2d000 54 6f 46 72 65 65 29 3b 0a 20 20 20 20 20 20 20  ToFree);.       
2d010 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
2d020 20 20 20 20 20 20 20 69 66 28 20 21 74 61 62 6c         if( !tabl
2d030 65 53 65 65 6e 20 29 7b 0a 20 20 20 20 20 20 20  eSeen ){.       
2d040 20 20 20 69 66 28 20 7a 54 4e 61 6d 65 20 29 7b     if( zTName ){
2d050 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
2d060 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
2d070 72 73 65 2c 20 22 6e 6f 20 73 75 63 68 20 74 61  rse, "no such ta
2d080 62 6c 65 3a 20 25 73 22 2c 20 7a 54 4e 61 6d 65  ble: %s", zTName
2d090 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c  );.          }el
2d0a0 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
2d0b0 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
2d0c0 70 50 61 72 73 65 2c 20 22 6e 6f 20 74 61 62 6c  pParse, "no tabl
2d0d0 65 73 20 73 70 65 63 69 66 69 65 64 22 29 3b 0a  es specified");.
2d0e0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2d0f0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
2d100 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 45    }.    sqlite3E
2d110 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62  xprListDelete(db
2d120 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 70  , pEList);.    p
2d130 2d 3e 70 45 4c 69 73 74 20 3d 20 70 4e 65 77 3b  ->pEList = pNew;
2d140 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70 45  .  }.  if( p->pE
2d150 4c 69 73 74 20 29 7b 0a 20 20 20 20 69 66 28 20  List ){.    if( 
2d160 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  p->pEList->nExpr
2d170 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49  >db->aLimit[SQLI
2d180 54 45 5f 4c 49 4d 49 54 5f 43 4f 4c 55 4d 4e 5d  TE_LIMIT_COLUMN]
2d190 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
2d1a0 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
2d1b0 2c 20 22 74 6f 6f 20 6d 61 6e 79 20 63 6f 6c 75  , "too many colu
2d1c0 6d 6e 73 20 69 6e 20 72 65 73 75 6c 74 20 73 65  mns in result se
2d1d0 74 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  t");.      retur
2d1e0 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20  n WRC_Abort;.   
2d1f0 20 7d 0a 20 20 20 20 69 66 28 20 28 65 6c 69 73   }.    if( (elis
2d200 74 46 6c 61 67 73 20 26 20 28 45 50 5f 48 61 73  tFlags & (EP_Has
2d210 46 75 6e 63 7c 45 50 5f 53 75 62 71 75 65 72 79  Func|EP_Subquery
2d220 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 70  ))!=0 ){.      p
2d230 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46  ->selFlags |= SF
2d240 5f 43 6f 6d 70 6c 65 78 52 65 73 75 6c 74 3b 0a  _ComplexResult;.
2d250 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
2d260 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b  rn WRC_Continue;
2d270 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4e 6f 2d 6f 70 20  .}../*.** No-op 
2d280 72 6f 75 74 69 6e 65 20 66 6f 72 20 74 68 65 20  routine for the 
2d290 70 61 72 73 65 2d 74 72 65 65 20 77 61 6c 6b 65  parse-tree walke
2d2a0 72 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68  r..**.** When th
2d2b0 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 74 68  is routine is th
2d2c0 65 20 57 61 6c 6b 65 72 2e 78 45 78 70 72 43 61  e Walker.xExprCa
2d2d0 6c 6c 62 61 63 6b 20 74 68 65 6e 20 65 78 70 72  llback then expr
2d2e0 65 73 73 69 6f 6e 20 74 72 65 65 73 0a 2a 2a 20  ession trees.** 
2d2f0 61 72 65 20 77 61 6c 6b 65 64 20 77 69 74 68 6f  are walked witho
2d300 75 74 20 61 6e 79 20 61 63 74 69 6f 6e 73 20 62  ut any actions b
2d310 65 69 6e 67 20 74 61 6b 65 6e 20 61 74 20 65 61  eing taken at ea
2d320 63 68 20 6e 6f 64 65 2e 20 20 50 72 65 73 75 6d  ch node.  Presum
2d330 61 62 6c 79 2c 0a 2a 2a 20 77 68 65 6e 20 74 68  ably,.** when th
2d340 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73  is routine is us
2d350 65 64 20 66 6f 72 20 57 61 6c 6b 65 72 2e 78 45  ed for Walker.xE
2d360 78 70 72 43 61 6c 6c 62 61 63 6b 20 74 68 65 6e  xprCallback then
2d370 20 0a 2a 2a 20 57 61 6c 6b 65 72 2e 78 53 65 6c   .** Walker.xSel
2d380 65 63 74 43 61 6c 6c 62 61 63 6b 20 69 73 20 73  ectCallback is s
2d390 65 74 20 74 6f 20 64 6f 20 73 6f 6d 65 74 68 69  et to do somethi
2d3a0 6e 67 20 75 73 65 66 75 6c 20 66 6f 72 20 65 76  ng useful for ev
2d3b0 65 72 79 20 0a 2a 2a 20 73 75 62 71 75 65 72 79  ery .** subquery
2d3c0 20 69 6e 20 74 68 65 20 70 61 72 73 65 72 20 74   in the parser t
2d3d0 72 65 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ree..*/.int sqli
2d3e0 74 65 33 45 78 70 72 57 61 6c 6b 4e 6f 6f 70 28  te3ExprWalkNoop(
2d3f0 57 61 6c 6b 65 72 20 2a 4e 6f 74 55 73 65 64 2c  Walker *NotUsed,
2d400 20 45 78 70 72 20 2a 4e 6f 74 55 73 65 64 32 29   Expr *NotUsed2)
2d410 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  {.  UNUSED_PARAM
2d420 45 54 45 52 32 28 4e 6f 74 55 73 65 64 2c 20 4e  ETER2(NotUsed, N
2d430 6f 74 55 73 65 64 32 29 3b 0a 20 20 72 65 74 75  otUsed2);.  retu
2d440 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b  rn WRC_Continue;
2d450 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4e 6f 2d 6f 70 20  .}../*.** No-op 
2d460 72 6f 75 74 69 6e 65 20 66 6f 72 20 74 68 65 20  routine for the 
2d470 70 61 72 73 65 2d 74 72 65 65 20 77 61 6c 6b 65  parse-tree walke
2d480 72 20 66 6f 72 20 53 45 4c 45 43 54 20 73 74 61  r for SELECT sta
2d490 74 65 6d 65 6e 74 73 2e 0a 2a 2a 20 73 75 62 71  tements..** subq
2d4a0 75 65 72 79 20 69 6e 20 74 68 65 20 70 61 72 73  uery in the pars
2d4b0 65 72 20 74 72 65 65 2e 0a 2a 2f 0a 69 6e 74 20  er tree..*/.int 
2d4c0 73 71 6c 69 74 65 33 53 65 6c 65 63 74 57 61 6c  sqlite3SelectWal
2d4d0 6b 4e 6f 6f 70 28 57 61 6c 6b 65 72 20 2a 4e 6f  kNoop(Walker *No
2d4e0 74 55 73 65 64 2c 20 53 65 6c 65 63 74 20 2a 4e  tUsed, Select *N
2d4f0 6f 74 55 73 65 64 32 29 7b 0a 20 20 55 4e 55 53  otUsed2){.  UNUS
2d500 45 44 5f 50 41 52 41 4d 45 54 45 52 32 28 4e 6f  ED_PARAMETER2(No
2d510 74 55 73 65 64 2c 20 4e 6f 74 55 73 65 64 32 29  tUsed, NotUsed2)
2d520 3b 0a 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43  ;.  return WRC_C
2d530 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 23 69 66 20  ontinue;.}..#if 
2d540 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a  SQLITE_DEBUG./*.
2d550 2a 2a 20 41 6c 77 61 79 73 20 61 73 73 65 72 74  ** Always assert
2d560 2e 20 20 54 68 69 73 20 78 53 65 6c 65 63 74 43  .  This xSelectC
2d570 61 6c 6c 62 61 63 6b 32 20 69 6d 70 6c 65 6d 65  allback2 impleme
2d580 6e 74 61 74 69 6f 6e 20 70 72 6f 76 65 73 20 74  ntation proves t
2d590 68 61 74 20 74 68 65 0a 2a 2a 20 78 53 65 6c 65  hat the.** xSele
2d5a0 63 74 43 61 6c 6c 62 61 63 6b 32 20 69 73 20 6e  ctCallback2 is n
2d5b0 65 76 65 72 20 69 6e 76 6f 6b 65 64 2e 0a 2a 2f  ever invoked..*/
2d5c0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53 65 6c  .void sqlite3Sel
2d5d0 65 63 74 57 61 6c 6b 41 73 73 65 72 74 32 28 57  ectWalkAssert2(W
2d5e0 61 6c 6b 65 72 20 2a 4e 6f 74 55 73 65 64 2c 20  alker *NotUsed, 
2d5f0 53 65 6c 65 63 74 20 2a 4e 6f 74 55 73 65 64 32  Select *NotUsed2
2d600 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  ){.  UNUSED_PARA
2d610 4d 45 54 45 52 32 28 4e 6f 74 55 73 65 64 2c 20  METER2(NotUsed, 
2d620 4e 6f 74 55 73 65 64 32 29 3b 0a 20 20 61 73 73  NotUsed2);.  ass
2d630 65 72 74 28 20 30 20 29 3b 0a 7d 0a 23 65 6e 64  ert( 0 );.}.#end
2d640 69 66 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  if./*.** This ro
2d650 75 74 69 6e 65 20 22 65 78 70 61 6e 64 73 22 20  utine "expands" 
2d660 61 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  a SELECT stateme
2d670 6e 74 20 61 6e 64 20 61 6c 6c 20 6f 66 20 69 74  nt and all of it
2d680 73 20 73 75 62 71 75 65 72 69 65 73 2e 0a 2a 2a  s subqueries..**
2d690 20 46 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20   For additional 
2d6a0 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f 6e 20 77  information on w
2d6b0 68 61 74 20 69 74 20 6d 65 61 6e 73 20 74 6f 20  hat it means to 
2d6c0 22 65 78 70 61 6e 64 22 20 61 20 53 45 4c 45 43  "expand" a SELEC
2d6d0 54 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 2c 20  T.** statement, 
2d6e0 73 65 65 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20  see the comment 
2d6f0 6f 6e 20 74 68 65 20 73 65 6c 65 63 74 45 78 70  on the selectExp
2d700 61 6e 64 20 77 6f 72 6b 65 72 20 63 61 6c 6c 62  and worker callb
2d710 61 63 6b 20 61 62 6f 76 65 2e 0a 2a 2a 0a 2a 2a  ack above..**.**
2d720 20 45 78 70 61 6e 64 69 6e 67 20 61 20 53 45 4c   Expanding a SEL
2d730 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 69 73  ECT statement is
2d740 20 74 68 65 20 66 69 72 73 74 20 73 74 65 70 20   the first step 
2d750 69 6e 20 70 72 6f 63 65 73 73 69 6e 67 20 61 0a  in processing a.
2d760 2a 2a 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  ** SELECT statem
2d770 65 6e 74 2e 20 20 54 68 65 20 53 45 4c 45 43 54  ent.  The SELECT
2d780 20 73 74 61 74 65 6d 65 6e 74 20 6d 75 73 74 20   statement must 
2d790 62 65 20 65 78 70 61 6e 64 65 64 20 62 65 66 6f  be expanded befo
2d7a0 72 65 0a 2a 2a 20 6e 61 6d 65 20 72 65 73 6f 6c  re.** name resol
2d7b0 75 74 69 6f 6e 20 69 73 20 70 65 72 66 6f 72 6d  ution is perform
2d7c0 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 79  ed..**.** If any
2d7d0 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67  thing goes wrong
2d7e0 2c 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61  , an error messa
2d7f0 67 65 20 69 73 20 77 72 69 74 74 65 6e 20 69 6e  ge is written in
2d800 74 6f 20 70 50 61 72 73 65 2e 0a 2a 2a 20 54 68  to pParse..** Th
2d810 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69  e calling functi
2d820 6f 6e 20 63 61 6e 20 64 65 74 65 63 74 20 74 68  on can detect th
2d830 65 20 70 72 6f 62 6c 65 6d 20 62 79 20 6c 6f 6f  e problem by loo
2d840 6b 69 6e 67 20 61 74 20 70 50 61 72 73 65 2d 3e  king at pParse->
2d850 6e 45 72 72 0a 2a 2a 20 61 6e 64 2f 6f 72 20 70  nErr.** and/or p
2d860 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  Parse->db->mallo
2d870 63 46 61 69 6c 65 64 2e 0a 2a 2f 0a 73 74 61 74  cFailed..*/.stat
2d880 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65 33 53  ic void sqlite3S
2d890 65 6c 65 63 74 45 78 70 61 6e 64 28 50 61 72 73  electExpand(Pars
2d8a0 65 20 2a 70 50 61 72 73 65 2c 20 53 65 6c 65 63  e *pParse, Selec
2d8b0 74 20 2a 70 53 65 6c 65 63 74 29 7b 0a 20 20 57  t *pSelect){.  W
2d8c0 61 6c 6b 65 72 20 77 3b 0a 20 20 77 2e 78 45 78  alker w;.  w.xEx
2d8d0 70 72 43 61 6c 6c 62 61 63 6b 20 3d 20 73 71 6c  prCallback = sql
2d8e0 69 74 65 33 45 78 70 72 57 61 6c 6b 4e 6f 6f 70  ite3ExprWalkNoop
2d8f0 3b 0a 20 20 77 2e 70 50 61 72 73 65 20 3d 20 70  ;.  w.pParse = p
2d900 50 61 72 73 65 3b 0a 20 20 69 66 28 20 4f 4b 5f  Parse;.  if( OK_
2d910 49 46 5f 41 4c 57 41 59 53 5f 54 52 55 45 28 70  IF_ALWAYS_TRUE(p
2d920 50 61 72 73 65 2d 3e 68 61 73 43 6f 6d 70 6f 75  Parse->hasCompou
2d930 6e 64 29 20 29 7b 0a 20 20 20 20 77 2e 78 53 65  nd) ){.    w.xSe
2d940 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20 3d 20 63  lectCallback = c
2d950 6f 6e 76 65 72 74 43 6f 6d 70 6f 75 6e 64 53 65  onvertCompoundSe
2d960 6c 65 63 74 54 6f 53 75 62 71 75 65 72 79 3b 0a  lectToSubquery;.
2d970 20 20 20 20 77 2e 78 53 65 6c 65 63 74 43 61 6c      w.xSelectCal
2d980 6c 62 61 63 6b 32 20 3d 20 30 3b 0a 20 20 20 20  lback2 = 0;.    
2d990 73 71 6c 69 74 65 33 57 61 6c 6b 53 65 6c 65 63  sqlite3WalkSelec
2d9a0 74 28 26 77 2c 20 70 53 65 6c 65 63 74 29 3b 0a  t(&w, pSelect);.
2d9b0 20 20 7d 0a 20 20 77 2e 78 53 65 6c 65 63 74 43    }.  w.xSelectC
2d9c0 61 6c 6c 62 61 63 6b 20 3d 20 73 65 6c 65 63 74  allback = select
2d9d0 45 78 70 61 6e 64 65 72 3b 0a 20 20 77 2e 78 53  Expander;.  w.xS
2d9e0 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 32 20 3d  electCallback2 =
2d9f0 20 73 65 6c 65 63 74 50 6f 70 57 69 74 68 3b 0a   selectPopWith;.
2da00 20 20 77 2e 65 43 6f 64 65 20 3d 20 30 3b 0a 20    w.eCode = 0;. 
2da10 20 73 71 6c 69 74 65 33 57 61 6c 6b 53 65 6c 65   sqlite3WalkSele
2da20 63 74 28 26 77 2c 20 70 53 65 6c 65 63 74 29 3b  ct(&w, pSelect);
2da30 0a 7d 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  .}...#ifndef SQL
2da40 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
2da50 59 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20  Y./*.** This is 
2da60 61 20 57 61 6c 6b 65 72 2e 78 53 65 6c 65 63 74  a Walker.xSelect
2da70 43 61 6c 6c 62 61 63 6b 20 63 61 6c 6c 62 61 63  Callback callbac
2da80 6b 20 66 6f 72 20 74 68 65 20 73 71 6c 69 74 65  k for the sqlite
2da90 33 53 65 6c 65 63 74 54 79 70 65 49 6e 66 6f 28  3SelectTypeInfo(
2daa0 29 0a 2a 2a 20 69 6e 74 65 72 66 61 63 65 2e 0a  ).** interface..
2dab0 2a 2a 0a 2a 2a 20 46 6f 72 20 65 61 63 68 20 46  **.** For each F
2dac0 52 4f 4d 2d 63 6c 61 75 73 65 20 73 75 62 71 75  ROM-clause subqu
2dad0 65 72 79 2c 20 61 64 64 20 43 6f 6c 75 6d 6e 2e  ery, add Column.
2dae0 7a 54 79 70 65 20 61 6e 64 20 43 6f 6c 75 6d 6e  zType and Column
2daf0 2e 7a 43 6f 6c 6c 0a 2a 2a 20 69 6e 66 6f 72 6d  .zColl.** inform
2db00 61 74 69 6f 6e 20 74 6f 20 74 68 65 20 54 61 62  ation to the Tab
2db10 6c 65 20 73 74 72 75 63 74 75 72 65 20 74 68 61  le structure tha
2db20 74 20 72 65 70 72 65 73 65 6e 74 73 20 74 68 65  t represents the
2db30 20 72 65 73 75 6c 74 20 73 65 74 0a 2a 2a 20 6f   result set.** o
2db40 66 20 74 68 61 74 20 73 75 62 71 75 65 72 79 2e  f that subquery.
2db50 0a 2a 2a 0a 2a 2a 20 54 68 65 20 54 61 62 6c 65  .**.** The Table
2db60 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20   structure that 
2db70 72 65 70 72 65 73 65 6e 74 73 20 74 68 65 20 72  represents the r
2db80 65 73 75 6c 74 20 73 65 74 20 77 61 73 20 63 6f  esult set was co
2db90 6e 73 74 72 75 63 74 65 64 0a 2a 2a 20 62 79 20  nstructed.** by 
2dba0 73 65 6c 65 63 74 45 78 70 61 6e 64 65 72 28 29  selectExpander()
2dbb0 20 62 75 74 20 74 68 65 20 74 79 70 65 20 61 6e   but the type an
2dbc0 64 20 63 6f 6c 6c 61 74 69 6f 6e 20 69 6e 66 6f  d collation info
2dbd0 72 6d 61 74 69 6f 6e 20 77 61 73 20 6f 6d 69 74  rmation was omit
2dbe0 74 65 64 0a 2a 2a 20 61 74 20 74 68 61 74 20 70  ted.** at that p
2dbf0 6f 69 6e 74 20 62 65 63 61 75 73 65 20 69 64 65  oint because ide
2dc00 6e 74 69 66 69 65 72 73 20 68 61 64 20 6e 6f 74  ntifiers had not
2dc10 20 79 65 74 20 62 65 65 6e 20 72 65 73 6f 6c 76   yet been resolv
2dc20 65 64 2e 20 20 54 68 69 73 0a 2a 2a 20 72 6f 75  ed.  This.** rou
2dc30 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 61  tine is called a
2dc40 66 74 65 72 20 69 64 65 6e 74 69 66 69 65 72 20  fter identifier 
2dc50 72 65 73 6f 6c 75 74 69 6f 6e 2e 0a 2a 2f 0a 73  resolution..*/.s
2dc60 74 61 74 69 63 20 76 6f 69 64 20 73 65 6c 65 63  tatic void selec
2dc70 74 41 64 64 53 75 62 71 75 65 72 79 54 79 70 65  tAddSubqueryType
2dc80 49 6e 66 6f 28 57 61 6c 6b 65 72 20 2a 70 57 61  Info(Walker *pWa
2dc90 6c 6b 65 72 2c 20 53 65 6c 65 63 74 20 2a 70 29  lker, Select *p)
2dca0 7b 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  {.  Parse *pPars
2dcb0 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 53 72  e;.  int i;.  Sr
2dcc0 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74 3b  cList *pTabList;
2dcd0 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73  .  struct SrcLis
2dce0 74 5f 69 74 65 6d 20 2a 70 46 72 6f 6d 3b 0a 0a  t_item *pFrom;..
2dcf0 20 20 61 73 73 65 72 74 28 20 70 2d 3e 73 65 6c    assert( p->sel
2dd00 46 6c 61 67 73 20 26 20 53 46 5f 52 65 73 6f 6c  Flags & SF_Resol
2dd10 76 65 64 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e  ved );.  if( p->
2dd20 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 48 61  selFlags & SF_Ha
2dd30 73 54 79 70 65 49 6e 66 6f 20 29 20 72 65 74 75  sTypeInfo ) retu
2dd40 72 6e 3b 0a 20 20 70 2d 3e 73 65 6c 46 6c 61 67  rn;.  p->selFlag
2dd50 73 20 7c 3d 20 53 46 5f 48 61 73 54 79 70 65 49  s |= SF_HasTypeI
2dd60 6e 66 6f 3b 0a 20 20 70 50 61 72 73 65 20 3d 20  nfo;.  pParse = 
2dd70 70 57 61 6c 6b 65 72 2d 3e 70 50 61 72 73 65 3b  pWalker->pParse;
2dd80 0a 20 20 70 54 61 62 4c 69 73 74 20 3d 20 70 2d  .  pTabList = p-
2dd90 3e 70 53 72 63 3b 0a 20 20 66 6f 72 28 69 3d 30  >pSrc;.  for(i=0
2dda0 2c 20 70 46 72 6f 6d 3d 70 54 61 62 4c 69 73 74  , pFrom=pTabList
2ddb0 2d 3e 61 3b 20 69 3c 70 54 61 62 4c 69 73 74 2d  ->a; i<pTabList-
2ddc0 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 46 72 6f  >nSrc; i++, pFro
2ddd0 6d 2b 2b 29 7b 0a 20 20 20 20 54 61 62 6c 65 20  m++){.    Table 
2dde0 2a 70 54 61 62 20 3d 20 70 46 72 6f 6d 2d 3e 70  *pTab = pFrom->p
2ddf0 54 61 62 3b 0a 20 20 20 20 61 73 73 65 72 74 28  Tab;.    assert(
2de00 20 70 54 61 62 21 3d 30 20 29 3b 0a 20 20 20 20   pTab!=0 );.    
2de10 69 66 28 20 28 70 54 61 62 2d 3e 74 61 62 46 6c  if( (pTab->tabFl
2de20 61 67 73 20 26 20 54 46 5f 45 70 68 65 6d 65 72  ags & TF_Ephemer
2de30 61 6c 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  al)!=0 ){.      
2de40 2f 2a 20 41 20 73 75 62 2d 71 75 65 72 79 20 69  /* A sub-query i
2de50 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  n the FROM claus
2de60 65 20 6f 66 20 61 20 53 45 4c 45 43 54 20 2a 2f  e of a SELECT */
2de70 0a 20 20 20 20 20 20 53 65 6c 65 63 74 20 2a 70  .      Select *p
2de80 53 65 6c 20 3d 20 70 46 72 6f 6d 2d 3e 70 53 65  Sel = pFrom->pSe
2de90 6c 65 63 74 3b 0a 20 20 20 20 20 20 69 66 28 20  lect;.      if( 
2dea0 70 53 65 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  pSel ){.        
2deb0 77 68 69 6c 65 28 20 70 53 65 6c 2d 3e 70 50 72  while( pSel->pPr
2dec0 69 6f 72 20 29 20 70 53 65 6c 20 3d 20 70 53 65  ior ) pSel = pSe
2ded0 6c 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 20  l->pPrior;.     
2dee0 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74     sqlite3Select
2def0 41 64 64 43 6f 6c 75 6d 6e 54 79 70 65 41 6e 64  AddColumnTypeAnd
2df00 43 6f 6c 6c 61 74 69 6f 6e 28 70 50 61 72 73 65  Collation(pParse
2df10 2c 20 70 54 61 62 2c 20 70 53 65 6c 29 3b 0a 20  , pTab, pSel);. 
2df20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
2df30 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a  .}.#endif.../*.*
2df40 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61  * This routine a
2df50 64 64 73 20 64 61 74 61 74 79 70 65 20 61 6e 64  dds datatype and
2df60 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
2df70 6e 63 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  nce information 
2df80 74 6f 0a 2a 2a 20 74 68 65 20 54 61 62 6c 65 20  to.** the Table 
2df90 73 74 72 75 63 74 75 72 65 73 20 6f 66 20 61 6c  structures of al
2dfa0 6c 20 46 52 4f 4d 2d 63 6c 61 75 73 65 20 73 75  l FROM-clause su
2dfb0 62 71 75 65 72 69 65 73 20 69 6e 20 61 0a 2a 2a  bqueries in a.**
2dfc0 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
2dfd0 74 2e 0a 2a 2a 0a 2a 2a 20 55 73 65 20 74 68 69  t..**.** Use thi
2dfe0 73 20 72 6f 75 74 69 6e 65 20 61 66 74 65 72 20  s routine after 
2dff0 6e 61 6d 65 20 72 65 73 6f 6c 75 74 69 6f 6e 2e  name resolution.
2e000 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
2e010 73 71 6c 69 74 65 33 53 65 6c 65 63 74 41 64 64  sqlite3SelectAdd
2e020 54 79 70 65 49 6e 66 6f 28 50 61 72 73 65 20 2a  TypeInfo(Parse *
2e030 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a  pParse, Select *
2e040 70 53 65 6c 65 63 74 29 7b 0a 23 69 66 6e 64 65  pSelect){.#ifnde
2e050 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  f SQLITE_OMIT_SU
2e060 42 51 55 45 52 59 0a 20 20 57 61 6c 6b 65 72 20  BQUERY.  Walker 
2e070 77 3b 0a 20 20 77 2e 78 53 65 6c 65 63 74 43 61  w;.  w.xSelectCa
2e080 6c 6c 62 61 63 6b 20 3d 20 73 71 6c 69 74 65 33  llback = sqlite3
2e090 53 65 6c 65 63 74 57 61 6c 6b 4e 6f 6f 70 3b 0a  SelectWalkNoop;.
2e0a0 20 20 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62    w.xSelectCallb
2e0b0 61 63 6b 32 20 3d 20 73 65 6c 65 63 74 41 64 64  ack2 = selectAdd
2e0c0 53 75 62 71 75 65 72 79 54 79 70 65 49 6e 66 6f  SubqueryTypeInfo
2e0d0 3b 0a 20 20 77 2e 78 45 78 70 72 43 61 6c 6c 62  ;.  w.xExprCallb
2e0e0 61 63 6b 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ack = sqlite3Exp
2e0f0 72 57 61 6c 6b 4e 6f 6f 70 3b 0a 20 20 77 2e 70  rWalkNoop;.  w.p
2e100 50 61 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a  Parse = pParse;.
2e110 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 53 65 6c    sqlite3WalkSel
2e120 65 63 74 28 26 77 2c 20 70 53 65 6c 65 63 74 29  ect(&w, pSelect)
2e130 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 0a 2f 2a 0a  ;.#endif.}.../*.
2e140 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
2e150 73 65 74 73 20 75 70 20 61 20 53 45 4c 45 43 54  sets up a SELECT
2e160 20 73 74 61 74 65 6d 65 6e 74 20 66 6f 72 20 70   statement for p
2e170 72 6f 63 65 73 73 69 6e 67 2e 20 20 54 68 65 0a  rocessing.  The.
2e180 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 73 20  ** following is 
2e190 61 63 63 6f 6d 70 6c 69 73 68 65 64 3a 0a 2a 2a  accomplished:.**
2e1a0 0a 2a 2a 20 20 20 20 20 2a 20 20 56 44 42 45 20  .**     *  VDBE 
2e1b0 43 75 72 73 6f 72 20 6e 75 6d 62 65 72 73 20 61  Cursor numbers a
2e1c0 72 65 20 61 73 73 69 67 6e 65 64 20 74 6f 20 61  re assigned to a
2e1d0 6c 6c 20 46 52 4f 4d 2d 63 6c 61 75 73 65 20 74  ll FROM-clause t
2e1e0 65 72 6d 73 2e 0a 2a 2a 20 20 20 20 20 2a 20 20  erms..**     *  
2e1f0 45 70 68 65 6d 65 72 61 6c 20 54 61 62 6c 65 20  Ephemeral Table 
2e200 6f 62 6a 65 63 74 73 20 61 72 65 20 63 72 65 61  objects are crea
2e210 74 65 64 20 66 6f 72 20 61 6c 6c 20 46 52 4f 4d  ted for all FROM
2e220 2d 63 6c 61 75 73 65 20 73 75 62 71 75 65 72 69  -clause subqueri
2e230 65 73 2e 0a 2a 2a 20 20 20 20 20 2a 20 20 4f 4e  es..**     *  ON
2e240 20 61 6e 64 20 55 53 49 4e 47 20 63 6c 61 75 73   and USING claus
2e250 65 73 20 61 72 65 20 73 68 69 66 74 65 64 20 69  es are shifted i
2e260 6e 74 6f 20 57 48 45 52 45 20 73 74 61 74 65 6d  nto WHERE statem
2e270 65 6e 74 73 0a 2a 2a 20 20 20 20 20 2a 20 20 57  ents.**     *  W
2e280 69 6c 64 63 61 72 64 73 20 22 2a 22 20 61 6e 64  ildcards "*" and
2e290 20 22 54 41 42 4c 45 2e 2a 22 20 69 6e 20 72 65   "TABLE.*" in re
2e2a0 73 75 6c 74 20 73 65 74 73 20 61 72 65 20 65 78  sult sets are ex
2e2b0 70 61 6e 64 65 64 2e 0a 2a 2a 20 20 20 20 20 2a  panded..**     *
2e2c0 20 20 49 64 65 6e 74 69 66 69 65 72 73 20 69 6e    Identifiers in
2e2d0 20 65 78 70 72 65 73 73 69 6f 6e 20 61 72 65 20   expression are 
2e2e0 6d 61 74 63 68 65 64 20 74 6f 20 74 61 62 6c 65  matched to table
2e2f0 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  s..**.** This ro
2e300 75 74 69 6e 65 20 61 63 74 73 20 72 65 63 75 72  utine acts recur
2e310 73 69 76 65 6c 79 20 6f 6e 20 61 6c 6c 20 73 75  sively on all su
2e320 62 71 75 65 72 69 65 73 20 77 69 74 68 69 6e 20  bqueries within 
2e330 74 68 65 20 53 45 4c 45 43 54 2e 0a 2a 2f 0a 76  the SELECT..*/.v
2e340 6f 69 64 20 73 71 6c 69 74 65 33 53 65 6c 65 63  oid sqlite3Selec
2e350 74 50 72 65 70 28 0a 20 20 50 61 72 73 65 20 2a  tPrep(.  Parse *
2e360 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20  pParse,         
2e370 2f 2a 20 54 68 65 20 70 61 72 73 65 72 20 63 6f  /* The parser co
2e380 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63  ntext */.  Selec
2e390 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  t *p,           
2e3a0 20 20 2f 2a 20 54 68 65 20 53 45 4c 45 43 54 20    /* The SELECT 
2e3b0 73 74 61 74 65 6d 65 6e 74 20 62 65 69 6e 67 20  statement being 
2e3c0 63 6f 64 65 64 2e 20 2a 2f 0a 20 20 4e 61 6d 65  coded. */.  Name
2e3d0 43 6f 6e 74 65 78 74 20 2a 70 4f 75 74 65 72 4e  Context *pOuterN
2e3e0 43 20 20 2f 2a 20 4e 61 6d 65 20 63 6f 6e 74 65  C  /* Name conte
2e3f0 78 74 20 66 6f 72 20 63 6f 6e 74 61 69 6e 65 72  xt for container
2e400 20 2a 2f 0a 29 7b 0a 20 20 61 73 73 65 72 74 28   */.){.  assert(
2e410 20 70 21 3d 30 20 7c 7c 20 70 50 61 72 73 65 2d   p!=0 || pParse-
2e420 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
2e430 64 20 29 3b 0a 20 20 69 66 28 20 70 50 61 72 73  d );.  if( pPars
2e440 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  e->db->mallocFai
2e450 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  led ) return;.  
2e460 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20  if( p->selFlags 
2e470 26 20 53 46 5f 48 61 73 54 79 70 65 49 6e 66 6f  & SF_HasTypeInfo
2e480 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 73 71 6c   ) return;.  sql
2e490 69 74 65 33 53 65 6c 65 63 74 45 78 70 61 6e 64  ite3SelectExpand
2e4a0 28 70 50 61 72 73 65 2c 20 70 29 3b 0a 20 20 69  (pParse, p);.  i
2e4b0 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20  f( pParse->nErr 
2e4c0 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d  || pParse->db->m
2e4d0 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65  allocFailed ) re
2e4e0 74 75 72 6e 3b 0a 20 20 73 71 6c 69 74 65 33 52  turn;.  sqlite3R
2e4f0 65 73 6f 6c 76 65 53 65 6c 65 63 74 4e 61 6d 65  esolveSelectName
2e500 73 28 70 50 61 72 73 65 2c 20 70 2c 20 70 4f 75  s(pParse, p, pOu
2e510 74 65 72 4e 43 29 3b 0a 20 20 69 66 28 20 70 50  terNC);.  if( pP
2e520 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 70 50  arse->nErr || pP
2e530 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  arse->db->malloc
2e540 46 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b  Failed ) return;
2e550 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  .  sqlite3Select
2e560 41 64 64 54 79 70 65 49 6e 66 6f 28 70 50 61 72  AddTypeInfo(pPar
2e570 73 65 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  se, p);.}../*.**
2e580 20 52 65 73 65 74 20 74 68 65 20 61 67 67 72 65   Reset the aggre
2e590 67 61 74 65 20 61 63 63 75 6d 75 6c 61 74 6f 72  gate accumulator
2e5a0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 67 67 72  ..**.** The aggr
2e5b0 65 67 61 74 65 20 61 63 63 75 6d 75 6c 61 74 6f  egate accumulato
2e5c0 72 20 69 73 20 61 20 73 65 74 20 6f 66 20 6d 65  r is a set of me
2e5d0 6d 6f 72 79 20 63 65 6c 6c 73 20 74 68 61 74 20  mory cells that 
2e5e0 68 6f 6c 64 0a 2a 2a 20 69 6e 74 65 72 6d 65 64  hold.** intermed
2e5f0 69 61 74 65 20 72 65 73 75 6c 74 73 20 77 68 69  iate results whi
2e600 6c 65 20 63 61 6c 63 75 6c 61 74 69 6e 67 20 61  le calculating a
2e610 6e 20 61 67 67 72 65 67 61 74 65 2e 20 20 54 68  n aggregate.  Th
2e620 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 67 65  is.** routine ge
2e630 6e 65 72 61 74 65 73 20 63 6f 64 65 20 74 68 61  nerates code tha
2e640 74 20 73 74 6f 72 65 73 20 4e 55 4c 4c 73 20 69  t stores NULLs i
2e650 6e 20 61 6c 6c 20 6f 66 20 74 68 6f 73 65 20 6d  n all of those m
2e660 65 6d 6f 72 79 0a 2a 2a 20 63 65 6c 6c 73 2e 0a  emory.** cells..
2e670 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72  */.static void r
2e680 65 73 65 74 41 63 63 75 6d 75 6c 61 74 6f 72 28  esetAccumulator(
2e690 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 41  Parse *pParse, A
2e6a0 67 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f  ggInfo *pAggInfo
2e6b0 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  ){.  Vdbe *v = p
2e6c0 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
2e6d0 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20  int i;.  struct 
2e6e0 41 67 67 49 6e 66 6f 5f 66 75 6e 63 20 2a 70 46  AggInfo_func *pF
2e6f0 75 6e 63 3b 0a 20 20 69 6e 74 20 6e 52 65 67 20  unc;.  int nReg 
2e700 3d 20 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e  = pAggInfo->nFun
2e710 63 20 2b 20 70 41 67 67 49 6e 66 6f 2d 3e 6e 43  c + pAggInfo->nC
2e720 6f 6c 75 6d 6e 3b 0a 20 20 69 66 28 20 6e 52 65  olumn;.  if( nRe
2e730 67 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 23  g==0 ) return;.#
2e740 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
2e750 55 47 0a 20 20 2f 2a 20 56 65 72 69 66 79 20 74  UG.  /* Verify t
2e760 68 61 74 20 61 6c 6c 20 41 67 67 49 6e 66 6f 20  hat all AggInfo 
2e770 72 65 67 69 73 74 65 72 73 20 61 72 65 20 77 69  registers are wi
2e780 74 68 69 6e 20 74 68 65 20 72 61 6e 67 65 20 73  thin the range s
2e790 70 65 63 69 66 69 65 64 20 62 79 0a 20 20 2a 2a  pecified by.  **
2e7a0 20 41 67 67 49 6e 66 6f 2e 6d 6e 52 65 67 2e 2e   AggInfo.mnReg..
2e7b0 41 67 67 49 6e 66 6f 2e 6d 78 52 65 67 20 2a 2f  AggInfo.mxReg */
2e7c0 0a 20 20 61 73 73 65 72 74 28 20 6e 52 65 67 3d  .  assert( nReg=
2e7d0 3d 70 41 67 67 49 6e 66 6f 2d 3e 6d 78 52 65 67  =pAggInfo->mxReg
2e7e0 2d 70 41 67 67 49 6e 66 6f 2d 3e 6d 6e 52 65 67  -pAggInfo->mnReg
2e7f0 2b 31 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  +1 );.  for(i=0;
2e800 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 43 6f   i<pAggInfo->nCo
2e810 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  lumn; i++){.    
2e820 61 73 73 65 72 74 28 20 70 41 67 67 49 6e 66 6f  assert( pAggInfo
2e830 2d 3e 61 43 6f 6c 5b 69 5d 2e 69 4d 65 6d 3e 3d  ->aCol[i].iMem>=
2e840 70 41 67 67 49 6e 66 6f 2d 3e 6d 6e 52 65 67 0a  pAggInfo->mnReg.
2e850 20 20 20 20 20 20 20 20 20 26 26 20 70 41 67 67           && pAgg
2e860 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 69 5d 2e 69 4d  Info->aCol[i].iM
2e870 65 6d 3c 3d 70 41 67 67 49 6e 66 6f 2d 3e 6d 78  em<=pAggInfo->mx
2e880 52 65 67 20 29 3b 0a 20 20 7d 0a 20 20 66 6f 72  Reg );.  }.  for
2e890 28 69 3d 30 3b 20 69 3c 70 41 67 67 49 6e 66 6f  (i=0; i<pAggInfo
2e8a0 2d 3e 6e 46 75 6e 63 3b 20 69 2b 2b 29 7b 0a 20  ->nFunc; i++){. 
2e8b0 20 20 20 61 73 73 65 72 74 28 20 70 41 67 67 49     assert( pAggI
2e8c0 6e 66 6f 2d 3e 61 46 75 6e 63 5b 69 5d 2e 69 4d  nfo->aFunc[i].iM
2e8d0 65 6d 3e 3d 70 41 67 67 49 6e 66 6f 2d 3e 6d 6e  em>=pAggInfo->mn
2e8e0 52 65 67 0a 20 20 20 20 20 20 20 20 20 26 26 20  Reg.         && 
2e8f0 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b  pAggInfo->aFunc[
2e900 69 5d 2e 69 4d 65 6d 3c 3d 70 41 67 67 49 6e 66  i].iMem<=pAggInf
2e910 6f 2d 3e 6d 78 52 65 67 20 29 3b 0a 20 20 7d 0a  o->mxReg );.  }.
2e920 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33  #endif.  sqlite3
2e930 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
2e940 5f 4e 75 6c 6c 2c 20 30 2c 20 70 41 67 67 49 6e  _Null, 0, pAggIn
2e950 66 6f 2d 3e 6d 6e 52 65 67 2c 20 70 41 67 67 49  fo->mnReg, pAggI
2e960 6e 66 6f 2d 3e 6d 78 52 65 67 29 3b 0a 20 20 66  nfo->mxReg);.  f
2e970 6f 72 28 70 46 75 6e 63 3d 70 41 67 67 49 6e 66  or(pFunc=pAggInf
2e980 6f 2d 3e 61 46 75 6e 63 2c 20 69 3d 30 3b 20 69  o->aFunc, i=0; i
2e990 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63  <pAggInfo->nFunc
2e9a0 3b 20 69 2b 2b 2c 20 70 46 75 6e 63 2b 2b 29 7b  ; i++, pFunc++){
2e9b0 0a 20 20 20 20 69 66 28 20 70 46 75 6e 63 2d 3e  .    if( pFunc->
2e9c0 69 44 69 73 74 69 6e 63 74 3e 3d 30 20 29 7b 0a  iDistinct>=0 ){.
2e9d0 20 20 20 20 20 20 45 78 70 72 20 2a 70 45 20 3d        Expr *pE =
2e9e0 20 70 46 75 6e 63 2d 3e 70 45 78 70 72 3b 0a 20   pFunc->pExpr;. 
2e9f0 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78       assert( !Ex
2ea00 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
2ea10 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20  , EP_xIsSelect) 
2ea20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45 2d  );.      if( pE-
2ea30 3e 78 2e 70 4c 69 73 74 3d 3d 30 20 7c 7c 20 70  >x.pList==0 || p
2ea40 45 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70  E->x.pList->nExp
2ea50 72 21 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20  r!=1 ){.        
2ea60 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
2ea70 70 50 61 72 73 65 2c 20 22 44 49 53 54 49 4e 43  pParse, "DISTINC
2ea80 54 20 61 67 67 72 65 67 61 74 65 73 20 6d 75 73  T aggregates mus
2ea90 74 20 68 61 76 65 20 65 78 61 63 74 6c 79 20 6f  t have exactly o
2eaa0 6e 65 20 22 0a 20 20 20 20 20 20 20 20 20 20 20  ne ".           
2eab0 22 61 72 67 75 6d 65 6e 74 22 29 3b 0a 20 20 20  "argument");.   
2eac0 20 20 20 20 20 70 46 75 6e 63 2d 3e 69 44 69 73       pFunc->iDis
2ead0 74 69 6e 63 74 20 3d 20 2d 31 3b 0a 20 20 20 20  tinct = -1;.    
2eae0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
2eaf0 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e   KeyInfo *pKeyIn
2eb00 66 6f 20 3d 20 73 71 6c 69 74 65 33 4b 65 79 49  fo = sqlite3KeyI
2eb10 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74 28  nfoFromExprList(
2eb20 70 50 61 72 73 65 2c 20 70 45 2d 3e 78 2e 70 4c  pParse, pE->x.pL
2eb30 69 73 74 2c 30 2c 30 29 3b 0a 20 20 20 20 20 20  ist,0,0);.      
2eb40 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
2eb50 4f 70 34 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70  Op4(v, OP_OpenEp
2eb60 68 65 6d 65 72 61 6c 2c 20 70 46 75 6e 63 2d 3e  hemeral, pFunc->
2eb70 69 44 69 73 74 69 6e 63 74 2c 20 30 2c 20 30 2c  iDistinct, 0, 0,
2eb80 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2eb90 20 20 20 20 20 20 20 20 20 20 20 28 63 68 61 72             (char
2eba0 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b  *)pKeyInfo, P4_K
2ebb0 45 59 49 4e 46 4f 29 3b 0a 20 20 20 20 20 20 7d  EYINFO);.      }
2ebc0 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
2ebd0 0a 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 4f  .** Invoke the O
2ebe0 50 5f 41 67 67 46 69 6e 61 6c 69 7a 65 20 6f 70  P_AggFinalize op
2ebf0 63 6f 64 65 20 66 6f 72 20 65 76 65 72 79 20 61  code for every a
2ec00 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f  ggregate functio
2ec10 6e 0a 2a 2a 20 69 6e 20 74 68 65 20 41 67 67 49  n.** in the AggI
2ec20 6e 66 6f 20 73 74 72 75 63 74 75 72 65 2e 0a 2a  nfo structure..*
2ec30 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 69  /.static void fi
2ec40 6e 61 6c 69 7a 65 41 67 67 46 75 6e 63 74 69 6f  nalizeAggFunctio
2ec50 6e 73 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ns(Parse *pParse
2ec60 2c 20 41 67 67 49 6e 66 6f 20 2a 70 41 67 67 49  , AggInfo *pAggI
2ec70 6e 66 6f 29 7b 0a 20 20 56 64 62 65 20 2a 76 20  nfo){.  Vdbe *v 
2ec80 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
2ec90 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75  .  int i;.  stru
2eca0 63 74 20 41 67 67 49 6e 66 6f 5f 66 75 6e 63 20  ct AggInfo_func 
2ecb0 2a 70 46 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20  *pF;.  for(i=0, 
2ecc0 70 46 3d 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75  pF=pAggInfo->aFu
2ecd0 6e 63 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e  nc; i<pAggInfo->
2ece0 6e 46 75 6e 63 3b 20 69 2b 2b 2c 20 70 46 2b 2b  nFunc; i++, pF++
2ecf0 29 7b 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20  ){.    ExprList 
2ed00 2a 70 4c 69 73 74 20 3d 20 70 46 2d 3e 70 45 78  *pList = pF->pEx
2ed10 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20 20  pr->x.pList;.   
2ed20 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61   assert( !ExprHa
2ed30 73 50 72 6f 70 65 72 74 79 28 70 46 2d 3e 70 45  sProperty(pF->pE
2ed40 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63  xpr, EP_xIsSelec
2ed50 74 29 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  t) );.    sqlite
2ed60 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
2ed70 50 5f 41 67 67 46 69 6e 61 6c 2c 20 70 46 2d 3e  P_AggFinal, pF->
2ed80 69 4d 65 6d 2c 20 70 4c 69 73 74 20 3f 20 70 4c  iMem, pList ? pL
2ed90 69 73 74 2d 3e 6e 45 78 70 72 20 3a 20 30 29 3b  ist->nExpr : 0);
2eda0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
2edb0 41 70 70 65 6e 64 50 34 28 76 2c 20 70 46 2d 3e  AppendP4(v, pF->
2edc0 70 46 75 6e 63 2c 20 50 34 5f 46 55 4e 43 44 45  pFunc, P4_FUNCDE
2edd0 46 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a  F);.  }.}.../*.*
2ede0 2a 20 55 70 64 61 74 65 20 74 68 65 20 61 63 63  * Update the acc
2edf0 75 6d 75 6c 61 74 6f 72 20 6d 65 6d 6f 72 79 20  umulator memory 
2ee00 63 65 6c 6c 73 20 66 6f 72 20 61 6e 20 61 67 67  cells for an agg
2ee10 72 65 67 61 74 65 20 62 61 73 65 64 20 6f 6e 0a  regate based on.
2ee20 2a 2a 20 74 68 65 20 63 75 72 72 65 6e 74 20 63  ** the current c
2ee30 75 72 73 6f 72 20 70 6f 73 69 74 69 6f 6e 2e 0a  ursor position..
2ee40 2a 2a 0a 2a 2a 20 49 66 20 72 65 67 41 63 63 20  **.** If regAcc 
2ee50 69 73 20 6e 6f 6e 2d 7a 65 72 6f 20 61 6e 64 20  is non-zero and 
2ee60 74 68 65 72 65 20 61 72 65 20 6e 6f 20 6d 69 6e  there are no min
2ee70 28 29 20 6f 72 20 6d 61 78 28 29 20 61 67 67 72  () or max() aggr
2ee80 65 67 61 74 65 73 0a 2a 2a 20 69 6e 20 70 41 67  egates.** in pAg
2ee90 67 49 6e 66 6f 2c 20 74 68 65 6e 20 6f 6e 6c 79  gInfo, then only
2eea0 20 70 6f 70 75 6c 61 74 65 20 74 68 65 20 70 41   populate the pA
2eeb0 67 67 49 6e 66 6f 2d 3e 6e 41 63 63 75 6d 75 6c  ggInfo->nAccumul
2eec0 61 74 6f 72 20 61 63 63 75 6d 75 6c 61 74 6f 72  ator accumulator
2eed0 0a 2a 2a 20 72 65 67 69 73 74 65 72 73 20 69 66  .** registers if
2eee0 20 72 65 67 69 73 74 65 72 20 72 65 67 41 63 63   register regAcc
2eef0 20 63 6f 6e 74 61 69 6e 73 20 30 2e 20 54 68 65   contains 0. The
2ef00 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 74 61 6b   caller will tak
2ef10 65 20 63 61 72 65 0a 2a 2a 20 6f 66 20 73 65 74  e care.** of set
2ef20 74 69 6e 67 20 61 6e 64 20 63 6c 65 61 72 69 6e  ting and clearin
2ef30 67 20 72 65 67 41 63 63 2e 0a 2a 2f 0a 73 74 61  g regAcc..*/.sta
2ef40 74 69 63 20 76 6f 69 64 20 75 70 64 61 74 65 41  tic void updateA
2ef50 63 63 75 6d 75 6c 61 74 6f 72 28 50 61 72 73 65  ccumulator(Parse
2ef60 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 72 65   *pParse, int re
2ef70 67 41 63 63 2c 20 41 67 67 49 6e 66 6f 20 2a 70  gAcc, AggInfo *p
2ef80 41 67 67 49 6e 66 6f 29 7b 0a 20 20 56 64 62 65  AggInfo){.  Vdbe
2ef90 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56   *v = pParse->pV
2efa0 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  dbe;.  int i;.  
2efb0 69 6e 74 20 72 65 67 48 69 74 20 3d 20 30 3b 0a  int regHit = 0;.
2efc0 20 20 69 6e 74 20 61 64 64 72 48 69 74 54 65 73    int addrHitTes
2efd0 74 20 3d 20 30 3b 0a 20 20 73 74 72 75 63 74 20  t = 0;.  struct 
2efe0 41 67 67 49 6e 66 6f 5f 66 75 6e 63 20 2a 70 46  AggInfo_func *pF
2eff0 3b 0a 20 20 73 74 72 75 63 74 20 41 67 67 49 6e  ;.  struct AggIn
2f000 66 6f 5f 63 6f 6c 20 2a 70 43 3b 0a 0a 20 20 70  fo_col *pC;..  p
2f010 41 67 67 49 6e 66 6f 2d 3e 64 69 72 65 63 74 4d  AggInfo->directM
2f020 6f 64 65 20 3d 20 31 3b 0a 20 20 66 6f 72 28 69  ode = 1;.  for(i
2f030 3d 30 2c 20 70 46 3d 70 41 67 67 49 6e 66 6f 2d  =0, pF=pAggInfo-
2f040 3e 61 46 75 6e 63 3b 20 69 3c 70 41 67 67 49 6e  >aFunc; i<pAggIn
2f050 66 6f 2d 3e 6e 46 75 6e 63 3b 20 69 2b 2b 2c 20  fo->nFunc; i++, 
2f060 70 46 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6e  pF++){.    int n
2f070 41 72 67 3b 0a 20 20 20 20 69 6e 74 20 61 64 64  Arg;.    int add
2f080 72 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20 20 69  rNext = 0;.    i
2f090 6e 74 20 72 65 67 41 67 67 3b 0a 20 20 20 20 45  nt regAgg;.    E
2f0a0 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d  xprList *pList =
2f0b0 20 70 46 2d 3e 70 45 78 70 72 2d 3e 78 2e 70 4c   pF->pExpr->x.pL
2f0c0 69 73 74 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ist;.    assert(
2f0d0 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
2f0e0 79 28 70 46 2d 3e 70 45 78 70 72 2c 20 45 50 5f  y(pF->pExpr, EP_
2f0f0 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20  xIsSelect) );.  
2f100 20 20 61 73 73 65 72 74 28 20 21 49 73 57 69 6e    assert( !IsWin
2f110 64 6f 77 46 75 6e 63 28 70 46 2d 3e 70 45 78 70  dowFunc(pF->pExp
2f120 72 29 20 29 3b 0a 20 20 20 20 69 66 28 20 45 78  r) );.    if( Ex
2f130 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 46  prHasProperty(pF
2f140 2d 3e 70 45 78 70 72 2c 20 45 50 5f 57 69 6e 46  ->pExpr, EP_WinF
2f150 75 6e 63 29 20 29 7b 0a 20 20 20 20 20 20 45 78  unc) ){.      Ex
2f160 70 72 20 2a 70 46 69 6c 74 65 72 20 3d 20 70 46  pr *pFilter = pF
2f170 2d 3e 70 45 78 70 72 2d 3e 79 2e 70 57 69 6e 2d  ->pExpr->y.pWin-
2f180 3e 70 46 69 6c 74 65 72 3b 0a 20 20 20 20 20 20  >pFilter;.      
2f190 61 64 64 72 4e 65 78 74 20 3d 20 73 71 6c 69 74  addrNext = sqlit
2f1a0 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
2f1b0 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 73  pParse);.      s
2f1c0 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73  qlite3ExprIfFals
2f1d0 65 28 70 50 61 72 73 65 2c 20 70 46 69 6c 74 65  e(pParse, pFilte
2f1e0 72 2c 20 61 64 64 72 4e 65 78 74 2c 20 53 51 4c  r, addrNext, SQL
2f1f0 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b  ITE_JUMPIFNULL);
2f200 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
2f210 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20 6e 41  List ){.      nA
2f220 72 67 20 3d 20 70 4c 69 73 74 2d 3e 6e 45 78 70  rg = pList->nExp
2f230 72 3b 0a 20 20 20 20 20 20 72 65 67 41 67 67 20  r;.      regAgg 
2f240 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
2f250 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 6e 41  Range(pParse, nA
2f260 72 67 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  rg);.      sqlit
2f270 65 33 45 78 70 72 43 6f 64 65 45 78 70 72 4c 69  e3ExprCodeExprLi
2f280 73 74 28 70 50 61 72 73 65 2c 20 70 4c 69 73 74  st(pParse, pList
2f290 2c 20 72 65 67 41 67 67 2c 20 30 2c 20 53 51 4c  , regAgg, 0, SQL
2f2a0 49 54 45 5f 45 43 45 4c 5f 44 55 50 29 3b 0a 20  ITE_ECEL_DUP);. 
2f2b0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2f2c0 6e 41 72 67 20 3d 20 30 3b 0a 20 20 20 20 20 20  nArg = 0;.      
2f2d0 72 65 67 41 67 67 20 3d 20 30 3b 0a 20 20 20 20  regAgg = 0;.    
2f2e0 7d 0a 20 20 20 20 69 66 28 20 70 46 2d 3e 69 44  }.    if( pF->iD
2f2f0 69 73 74 69 6e 63 74 3e 3d 30 20 29 7b 0a 20 20  istinct>=0 ){.  
2f300 20 20 20 20 69 66 28 20 61 64 64 72 4e 65 78 74      if( addrNext
2f310 3d 3d 30 20 29 7b 20 0a 20 20 20 20 20 20 20 20  ==0 ){ .        
2f320 61 64 64 72 4e 65 78 74 20 3d 20 73 71 6c 69 74  addrNext = sqlit
2f330 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
2f340 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 7d  pParse);.      }
2f350 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
2f360 20 6e 41 72 67 3d 3d 30 20 29 3b 20 20 2f 2a 20   nArg==0 );  /* 
2f370 45 72 72 6f 72 20 63 6f 6e 64 69 74 69 6f 6e 20  Error condition 
2f380 2a 2f 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  */.      testcas
2f390 65 28 20 6e 41 72 67 3e 31 20 29 3b 20 20 20 2f  e( nArg>1 );   /
2f3a0 2a 20 41 6c 73 6f 20 61 6e 20 65 72 72 6f 72 20  * Also an error 
2f3b0 2a 2f 0a 20 20 20 20 20 20 63 6f 64 65 44 69 73  */.      codeDis
2f3c0 74 69 6e 63 74 28 70 50 61 72 73 65 2c 20 70 46  tinct(pParse, pF
2f3d0 2d 3e 69 44 69 73 74 69 6e 63 74 2c 20 61 64 64  ->iDistinct, add
2f3e0 72 4e 65 78 74 2c 20 31 2c 20 72 65 67 41 67 67  rNext, 1, regAgg
2f3f0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
2f400 20 70 46 2d 3e 70 46 75 6e 63 2d 3e 66 75 6e 63   pF->pFunc->func
2f410 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46  Flags & SQLITE_F
2f420 55 4e 43 5f 4e 45 45 44 43 4f 4c 4c 20 29 7b 0a  UNC_NEEDCOLL ){.
2f430 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70        CollSeq *p
2f440 43 6f 6c 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20  Coll = 0;.      
2f450 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f  struct ExprList_
2f460 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 20  item *pItem;.   
2f470 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20     int j;.      
2f480 61 73 73 65 72 74 28 20 70 4c 69 73 74 21 3d 30  assert( pList!=0
2f490 20 29 3b 20 20 2f 2a 20 70 4c 69 73 74 21 3d 30   );  /* pList!=0
2f4a0 20 69 66 20 70 46 2d 3e 70 46 75 6e 63 20 68 61   if pF->pFunc ha
2f4b0 73 20 4e 45 45 44 43 4f 4c 4c 20 2a 2f 0a 20 20  s NEEDCOLL */.  
2f4c0 20 20 20 20 66 6f 72 28 6a 3d 30 2c 20 70 49 74      for(j=0, pIt
2f4d0 65 6d 3d 70 4c 69 73 74 2d 3e 61 3b 20 21 70 43  em=pList->a; !pC
2f4e0 6f 6c 6c 20 26 26 20 6a 3c 6e 41 72 67 3b 20 6a  oll && j<nArg; j
2f4f0 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20  ++, pItem++){.  
2f500 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71        pColl = sq
2f510 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71  lite3ExprCollSeq
2f520 28 70 50 61 72 73 65 2c 20 70 49 74 65 6d 2d 3e  (pParse, pItem->
2f530 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 7d 0a  pExpr);.      }.
2f540 20 20 20 20 20 20 69 66 28 20 21 70 43 6f 6c 6c        if( !pColl
2f550 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43 6f 6c   ){.        pCol
2f560 6c 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e  l = pParse->db->
2f570 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20  pDfltColl;.     
2f580 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 65 67   }.      if( reg
2f590 48 69 74 3d 3d 30 20 26 26 20 70 41 67 67 49 6e  Hit==0 && pAggIn
2f5a0 66 6f 2d 3e 6e 41 63 63 75 6d 75 6c 61 74 6f 72  fo->nAccumulator
2f5b0 20 29 20 72 65 67 48 69 74 20 3d 20 2b 2b 70 50   ) regHit = ++pP
2f5c0 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20  arse->nMem;.    
2f5d0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
2f5e0 4f 70 34 28 76 2c 20 4f 50 5f 43 6f 6c 6c 53 65  Op4(v, OP_CollSe
2f5f0 71 2c 20 72 65 67 48 69 74 2c 20 30 2c 20 30 2c  q, regHit, 0, 0,
2f600 20 28 63 68 61 72 20 2a 29 70 43 6f 6c 6c 2c 20   (char *)pColl, 
2f610 50 34 5f 43 4f 4c 4c 53 45 51 29 3b 0a 20 20 20  P4_COLLSEQ);.   
2f620 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64   }.    sqlite3Vd
2f630 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 41  beAddOp3(v, OP_A
2f640 67 67 53 74 65 70 2c 20 30 2c 20 72 65 67 41 67  ggStep, 0, regAg
2f650 67 2c 20 70 46 2d 3e 69 4d 65 6d 29 3b 0a 20 20  g, pF->iMem);.  
2f660 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 70 70    sqlite3VdbeApp
2f670 65 6e 64 50 34 28 76 2c 20 70 46 2d 3e 70 46 75  endP4(v, pF->pFu
2f680 6e 63 2c 20 50 34 5f 46 55 4e 43 44 45 46 29 3b  nc, P4_FUNCDEF);
2f690 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
2f6a0 43 68 61 6e 67 65 50 35 28 76 2c 20 28 75 38 29  ChangeP5(v, (u8)
2f6b0 6e 41 72 67 29 3b 0a 20 20 20 20 73 71 6c 69 74  nArg);.    sqlit
2f6c0 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 61 6e  e3ReleaseTempRan
2f6d0 67 65 28 70 50 61 72 73 65 2c 20 72 65 67 41 67  ge(pParse, regAg
2f6e0 67 2c 20 6e 41 72 67 29 3b 0a 20 20 20 20 69 66  g, nArg);.    if
2f6f0 28 20 61 64 64 72 4e 65 78 74 20 29 7b 0a 20 20  ( addrNext ){.  
2f700 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52      sqlite3VdbeR
2f710 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61  esolveLabel(v, a
2f720 64 64 72 4e 65 78 74 29 3b 0a 20 20 20 20 7d 0a  ddrNext);.    }.
2f730 20 20 7d 0a 20 20 69 66 28 20 72 65 67 48 69 74    }.  if( regHit
2f740 3d 3d 30 20 26 26 20 70 41 67 67 49 6e 66 6f 2d  ==0 && pAggInfo-
2f750 3e 6e 41 63 63 75 6d 75 6c 61 74 6f 72 20 29 7b  >nAccumulator ){
2f760 0a 20 20 20 20 72 65 67 48 69 74 20 3d 20 72 65  .    regHit = re
2f770 67 41 63 63 3b 0a 20 20 7d 0a 20 20 69 66 28 20  gAcc;.  }.  if( 
2f780 72 65 67 48 69 74 20 29 7b 0a 20 20 20 20 61 64  regHit ){.    ad
2f790 64 72 48 69 74 54 65 73 74 20 3d 20 73 71 6c 69  drHitTest = sqli
2f7a0 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
2f7b0 20 4f 50 5f 49 66 2c 20 72 65 67 48 69 74 29 3b   OP_If, regHit);
2f7c0 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
2f7d0 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 2c  ;.  }.  for(i=0,
2f7e0 20 70 43 3d 70 41 67 67 49 6e 66 6f 2d 3e 61 43   pC=pAggInfo->aC
2f7f0 6f 6c 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e  ol; i<pAggInfo->
2f800 6e 41 63 63 75 6d 75 6c 61 74 6f 72 3b 20 69 2b  nAccumulator; i+
2f810 2b 2c 20 70 43 2b 2b 29 7b 0a 20 20 20 20 73 71  +, pC++){.    sq
2f820 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50  lite3ExprCode(pP
2f830 61 72 73 65 2c 20 70 43 2d 3e 70 45 78 70 72 2c  arse, pC->pExpr,
2f840 20 70 43 2d 3e 69 4d 65 6d 29 3b 0a 20 20 7d 0a   pC->iMem);.  }.
2f850 20 20 70 41 67 67 49 6e 66 6f 2d 3e 64 69 72 65    pAggInfo->dire
2f860 63 74 4d 6f 64 65 20 3d 20 30 3b 0a 20 20 69 66  ctMode = 0;.  if
2f870 28 20 61 64 64 72 48 69 74 54 65 73 74 20 29 7b  ( addrHitTest ){
2f880 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
2f890 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72  JumpHere(v, addr
2f8a0 48 69 74 54 65 73 74 29 3b 0a 20 20 7d 0a 7d 0a  HitTest);.  }.}.
2f8b0 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 73 69 6e  ./*.** Add a sin
2f8c0 67 6c 65 20 4f 50 5f 45 78 70 6c 61 69 6e 20 69  gle OP_Explain i
2f8d0 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f 20 74 68  nstruction to th
2f8e0 65 20 56 44 42 45 20 74 6f 20 65 78 70 6c 61 69  e VDBE to explai
2f8f0 6e 20 61 20 73 69 6d 70 6c 65 0a 2a 2a 20 63 6f  n a simple.** co
2f900 75 6e 74 28 2a 29 20 71 75 65 72 79 20 28 22 53  unt(*) query ("S
2f910 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46  ELECT count(*) F
2f920 52 4f 4d 20 70 54 61 62 22 29 2e 0a 2a 2f 0a 23  ROM pTab")..*/.#
2f930 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
2f940 49 54 5f 45 58 50 4c 41 49 4e 0a 73 74 61 74 69  IT_EXPLAIN.stati
2f950 63 20 76 6f 69 64 20 65 78 70 6c 61 69 6e 53 69  c void explainSi
2f960 6d 70 6c 65 43 6f 75 6e 74 28 0a 20 20 50 61 72  mpleCount(.  Par
2f970 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
2f980 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2f990 50 61 72 73 65 20 63 6f 6e 74 65 78 74 20 2a 2f  Parse context */
2f9a0 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 2c 20  .  Table *pTab, 
2f9b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f9c0 20 20 20 2f 2a 20 54 61 62 6c 65 20 62 65 69 6e     /* Table bein
2f9d0 67 20 71 75 65 72 69 65 64 20 2a 2f 0a 20 20 49  g queried */.  I
2f9e0 6e 64 65 78 20 2a 70 49 64 78 20 20 20 20 20 20  ndex *pIdx      
2f9f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2fa00 2a 20 49 6e 64 65 78 20 75 73 65 64 20 74 6f 20  * Index used to 
2fa10 6f 70 74 69 6d 69 7a 65 20 73 63 61 6e 2c 20 6f  optimize scan, o
2fa20 72 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 69  r NULL */.){.  i
2fa30 66 28 20 70 50 61 72 73 65 2d 3e 65 78 70 6c 61  f( pParse->expla
2fa40 69 6e 3d 3d 32 20 29 7b 0a 20 20 20 20 69 6e 74  in==2 ){.    int
2fa50 20 62 43 6f 76 65 72 20 3d 20 28 70 49 64 78 21   bCover = (pIdx!
2fa60 3d 30 20 26 26 20 28 48 61 73 52 6f 77 69 64 28  =0 && (HasRowid(
2fa70 70 54 61 62 29 20 7c 7c 20 21 49 73 50 72 69 6d  pTab) || !IsPrim
2fa80 61 72 79 4b 65 79 49 6e 64 65 78 28 70 49 64 78  aryKeyIndex(pIdx
2fa90 29 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  )));.    sqlite3
2faa0 56 64 62 65 45 78 70 6c 61 69 6e 28 70 50 61 72  VdbeExplain(pPar
2fab0 73 65 2c 20 30 2c 20 22 53 43 41 4e 20 54 41 42  se, 0, "SCAN TAB
2fac0 4c 45 20 25 73 25 73 25 73 22 2c 0a 20 20 20 20  LE %s%s%s",.    
2fad0 20 20 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c      pTab->zName,
2fae0 0a 20 20 20 20 20 20 20 20 62 43 6f 76 65 72 20  .        bCover 
2faf0 3f 20 22 20 55 53 49 4e 47 20 43 4f 56 45 52 49  ? " USING COVERI
2fb00 4e 47 20 49 4e 44 45 58 20 22 20 3a 20 22 22 2c  NG INDEX " : "",
2fb10 0a 20 20 20 20 20 20 20 20 62 43 6f 76 65 72 20  .        bCover 
2fb20 3f 20 70 49 64 78 2d 3e 7a 4e 61 6d 65 20 3a 20  ? pIdx->zName : 
2fb30 22 22 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 7d 0a  "".    );.  }.}.
2fb40 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 65  #else.# define e
2fb50 78 70 6c 61 69 6e 53 69 6d 70 6c 65 43 6f 75 6e  xplainSimpleCoun
2fb60 74 28 61 2c 62 2c 63 29 0a 23 65 6e 64 69 66 0a  t(a,b,c).#endif.
2fb70 0a 2f 2a 0a 2a 2a 20 73 71 6c 69 74 65 33 57 61  ./*.** sqlite3Wa
2fb80 6c 6b 45 78 70 72 28 29 20 63 61 6c 6c 62 61 63  lkExpr() callbac
2fb90 6b 20 75 73 65 64 20 62 79 20 68 61 76 69 6e 67  k used by having
2fba0 54 6f 57 68 65 72 65 28 29 2e 0a 2a 2a 0a 2a 2a  ToWhere()..**.**
2fbb0 20 49 66 20 74 68 65 20 6e 6f 64 65 20 70 61 73   If the node pas
2fbc0 73 65 64 20 74 6f 20 74 68 65 20 63 61 6c 6c 62  sed to the callb
2fbd0 61 63 6b 20 69 73 20 61 20 54 4b 5f 41 4e 44 20  ack is a TK_AND 
2fbe0 6e 6f 64 65 2c 20 72 65 74 75 72 6e 20 0a 2a 2a  node, return .**
2fbf0 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 20 74 6f   WRC_Continue to
2fc00 20 74 65 6c 6c 20 73 71 6c 69 74 65 33 57 61 6c   tell sqlite3Wal
2fc10 6b 45 78 70 72 28 29 20 74 6f 20 69 74 65 72 61  kExpr() to itera
2fc20 74 65 20 74 68 72 6f 75 67 68 20 63 68 69 6c 64  te through child
2fc30 20 6e 6f 64 65 73 2e 0a 2a 2a 0a 2a 2a 20 4f 74   nodes..**.** Ot
2fc40 68 65 72 77 69 73 65 2c 20 72 65 74 75 72 6e 20  herwise, return 
2fc50 57 52 43 5f 50 72 75 6e 65 2e 20 49 6e 20 74 68  WRC_Prune. In th
2fc60 69 73 20 63 61 73 65 2c 20 61 6c 73 6f 20 63 68  is case, also ch
2fc70 65 63 6b 20 69 66 20 74 68 65 20 0a 2a 2a 20 73  eck if the .** s
2fc80 75 62 2d 65 78 70 72 65 73 73 69 6f 6e 20 6d 61  ub-expression ma
2fc90 74 63 68 65 73 20 74 68 65 20 63 72 69 74 65 72  tches the criter
2fca0 69 61 20 66 6f 72 20 62 65 69 6e 67 20 6d 6f 76  ia for being mov
2fcb0 65 64 20 74 6f 20 74 68 65 20 57 48 45 52 45 0a  ed to the WHERE.
2fcc0 2a 2a 20 63 6c 61 75 73 65 2e 20 49 66 20 73 6f  ** clause. If so
2fcd0 2c 20 61 64 64 20 69 74 20 74 6f 20 74 68 65 20  , add it to the 
2fce0 57 48 45 52 45 20 63 6c 61 75 73 65 20 61 6e 64  WHERE clause and
2fcf0 20 72 65 70 6c 61 63 65 20 74 68 65 20 73 75 62   replace the sub
2fd00 2d 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 77  -expression.** w
2fd10 69 74 68 69 6e 20 74 68 65 20 48 41 56 49 4e 47  ithin the HAVING
2fd20 20 65 78 70 72 65 73 73 69 6f 6e 20 77 69 74 68   expression with
2fd30 20 61 20 63 6f 6e 73 74 61 6e 74 20 22 31 22 2e   a constant "1".
2fd40 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 68  .*/.static int h
2fd50 61 76 69 6e 67 54 6f 57 68 65 72 65 45 78 70 72  avingToWhereExpr
2fd60 43 62 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b  Cb(Walker *pWalk
2fd70 65 72 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29  er, Expr *pExpr)
2fd80 7b 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f  {.  if( pExpr->o
2fd90 70 21 3d 54 4b 5f 41 4e 44 20 29 7b 0a 20 20 20  p!=TK_AND ){.   
2fda0 20 53 65 6c 65 63 74 20 2a 70 53 20 3d 20 70 57   Select *pS = pW
2fdb0 61 6c 6b 65 72 2d 3e 75 2e 70 53 65 6c 65 63 74  alker->u.pSelect
2fdc0 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  ;.    if( sqlite
2fdd0 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 4f  3ExprIsConstantO
2fde0 72 47 72 6f 75 70 42 79 28 70 57 61 6c 6b 65 72  rGroupBy(pWalker
2fdf0 2d 3e 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c  ->pParse, pExpr,
2fe00 20 70 53 2d 3e 70 47 72 6f 75 70 42 79 29 20 29   pS->pGroupBy) )
2fe10 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 20  {.      sqlite3 
2fe20 2a 64 62 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 70  *db = pWalker->p
2fe30 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 20 20 20  Parse->db;.     
2fe40 20 45 78 70 72 20 2a 70 4e 65 77 20 3d 20 73 71   Expr *pNew = sq
2fe50 6c 69 74 65 33 45 78 70 72 41 6c 6c 6f 63 28 64  lite3ExprAlloc(d
2fe60 62 2c 20 54 4b 5f 49 4e 54 45 47 45 52 2c 20 26  b, TK_INTEGER, &
2fe70 73 71 6c 69 74 65 33 49 6e 74 54 6f 6b 65 6e 73  sqlite3IntTokens
2fe80 5b 31 5d 2c 20 30 29 3b 0a 20 20 20 20 20 20 69  [1], 0);.      i
2fe90 66 28 20 70 4e 65 77 20 29 7b 0a 20 20 20 20 20  f( pNew ){.     
2fea0 20 20 20 45 78 70 72 20 2a 70 57 68 65 72 65 20     Expr *pWhere 
2feb0 3d 20 70 53 2d 3e 70 57 68 65 72 65 3b 0a 20 20  = pS->pWhere;.  
2fec0 20 20 20 20 20 20 53 57 41 50 28 45 78 70 72 2c        SWAP(Expr,
2fed0 20 2a 70 4e 65 77 2c 20 2a 70 45 78 70 72 29 3b   *pNew, *pExpr);
2fee0 0a 20 20 20 20 20 20 20 20 70 4e 65 77 20 3d 20  .        pNew = 
2fef0 73 71 6c 69 74 65 33 45 78 70 72 41 6e 64 28 70  sqlite3ExprAnd(p
2ff00 57 61 6c 6b 65 72 2d 3e 70 50 61 72 73 65 2c 20  Walker->pParse, 
2ff10 70 57 68 65 72 65 2c 20 70 4e 65 77 29 3b 0a 20  pWhere, pNew);. 
2ff20 20 20 20 20 20 20 20 70 53 2d 3e 70 57 68 65 72         pS->pWher
2ff30 65 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 20 20  e = pNew;.      
2ff40 20 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65    pWalker->eCode
2ff50 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 1;.      }.  
2ff60 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 57    }.    return W
2ff70 52 43 5f 50 72 75 6e 65 3b 0a 20 20 7d 0a 20 20  RC_Prune;.  }.  
2ff80 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69  return WRC_Conti
2ff90 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72  nue;.}../*.** Tr
2ffa0 61 6e 73 66 65 72 20 65 6c 69 67 69 62 6c 65 20  ansfer eligible 
2ffb0 74 65 72 6d 73 20 66 72 6f 6d 20 74 68 65 20 48  terms from the H
2ffc0 41 56 49 4e 47 20 63 6c 61 75 73 65 20 6f 66 20  AVING clause of 
2ffd0 61 20 71 75 65 72 79 2c 20 77 68 69 63 68 20 69  a query, which i
2ffe0 73 0a 2a 2a 20 70 72 6f 63 65 73 73 65 64 20 61  s.** processed a
2fff0 66 74 65 72 20 67 72 6f 75 70 69 6e 67 2c 20 74  fter grouping, t
30000 6f 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  o the WHERE clau
30010 73 65 2c 20 77 68 69 63 68 20 69 73 20 70 72 6f  se, which is pro
30020 63 65 73 73 65 64 20 62 65 66 6f 72 65 0a 2a 2a  cessed before.**
30030 20 67 72 6f 75 70 69 6e 67 2e 20 46 6f 72 20 65   grouping. For e
30040 78 61 6d 70 6c 65 2c 20 74 68 65 20 71 75 65 72  xample, the quer
30050 79 3a 0a 2a 2a 0a 2a 2a 20 20 20 53 45 4c 45 43  y:.**.**   SELEC
30060 54 20 2a 20 46 52 4f 4d 20 3c 74 61 62 6c 65 73  T * FROM <tables
30070 3e 20 57 48 45 52 45 20 61 3d 3f 20 47 52 4f 55  > WHERE a=? GROU
30080 50 20 42 59 20 62 20 48 41 56 49 4e 47 20 62 3d  P BY b HAVING b=
30090 3f 20 41 4e 44 20 63 3d 3f 0a 2a 2a 0a 2a 2a 20  ? AND c=?.**.** 
300a0 63 61 6e 20 62 65 20 72 65 77 72 69 74 74 65 6e  can be rewritten
300b0 20 61 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 53 45 4c   as:.**.**   SEL
300c0 45 43 54 20 2a 20 46 52 4f 4d 20 3c 74 61 62 6c  ECT * FROM <tabl
300d0 65 73 3e 20 57 48 45 52 45 20 61 3d 3f 20 41 4e  es> WHERE a=? AN
300e0 44 20 62 3d 3f 20 47 52 4f 55 50 20 42 59 20 62  D b=? GROUP BY b
300f0 20 48 41 56 49 4e 47 20 63 3d 3f 0a 2a 2a 0a 2a   HAVING c=?.**.*
30100 2a 20 41 20 74 65 72 6d 20 6f 66 20 74 68 65 20  * A term of the 
30110 48 41 56 49 4e 47 20 65 78 70 72 65 73 73 69 6f  HAVING expressio
30120 6e 20 69 73 20 65 6c 69 67 69 62 6c 65 20 66 6f  n is eligible fo
30130 72 20 74 72 61 6e 73 66 65 72 20 69 66 20 69 74  r transfer if it
30140 20 63 6f 6e 73 69 73 74 73 0a 2a 2a 20 65 6e 74   consists.** ent
30150 69 72 65 6c 79 20 6f 66 20 63 6f 6e 73 74 61 6e  irely of constan
30160 74 73 20 61 6e 64 20 65 78 70 72 65 73 73 69 6f  ts and expressio
30170 6e 73 20 74 68 61 74 20 61 72 65 20 61 6c 73 6f  ns that are also
30180 20 47 52 4f 55 50 20 42 59 20 74 65 72 6d 73 20   GROUP BY terms 
30190 74 68 61 74 0a 2a 2a 20 75 73 65 20 74 68 65 20  that.** use the 
301a0 22 42 49 4e 41 52 59 22 20 63 6f 6c 6c 61 74 69  "BINARY" collati
301b0 6f 6e 20 73 65 71 75 65 6e 63 65 2e 0a 2a 2f 0a  on sequence..*/.
301c0 73 74 61 74 69 63 20 76 6f 69 64 20 68 61 76 69  static void havi
301d0 6e 67 54 6f 57 68 65 72 65 28 50 61 72 73 65 20  ngToWhere(Parse 
301e0 2a 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74 20  *pParse, Select 
301f0 2a 70 29 7b 0a 20 20 57 61 6c 6b 65 72 20 73 57  *p){.  Walker sW
30200 61 6c 6b 65 72 3b 0a 20 20 6d 65 6d 73 65 74 28  alker;.  memset(
30210 26 73 57 61 6c 6b 65 72 2c 20 30 2c 20 73 69 7a  &sWalker, 0, siz
30220 65 6f 66 28 73 57 61 6c 6b 65 72 29 29 3b 0a 20  eof(sWalker));. 
30230 20 73 57 61 6c 6b 65 72 2e 70 50 61 72 73 65 20   sWalker.pParse 
30240 3d 20 70 50 61 72 73 65 3b 0a 20 20 73 57 61 6c  = pParse;.  sWal
30250 6b 65 72 2e 78 45 78 70 72 43 61 6c 6c 62 61 63  ker.xExprCallbac
30260 6b 20 3d 20 68 61 76 69 6e 67 54 6f 57 68 65 72  k = havingToWher
30270 65 45 78 70 72 43 62 3b 0a 20 20 73 57 61 6c 6b  eExprCb;.  sWalk
30280 65 72 2e 75 2e 70 53 65 6c 65 63 74 20 3d 20 70  er.u.pSelect = p
30290 3b 0a 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 45  ;.  sqlite3WalkE
302a0 78 70 72 28 26 73 57 61 6c 6b 65 72 2c 20 70 2d  xpr(&sWalker, p-
302b0 3e 70 48 61 76 69 6e 67 29 3b 0a 23 69 66 20 53  >pHaving);.#if S
302c0 45 4c 45 43 54 54 52 41 43 45 5f 45 4e 41 42 4c  ELECTTRACE_ENABL
302d0 45 44 0a 20 20 69 66 28 20 73 57 61 6c 6b 65 72  ED.  if( sWalker
302e0 2e 65 43 6f 64 65 20 26 26 20 28 73 71 6c 69 74  .eCode && (sqlit
302f0 65 33 53 65 6c 65 63 74 54 72 61 63 65 20 26 20  e3SelectTrace & 
30300 30 78 31 30 30 29 21 3d 30 20 29 7b 0a 20 20 20  0x100)!=0 ){.   
30310 20 53 45 4c 45 43 54 54 52 41 43 45 28 30 78 31   SELECTTRACE(0x1
30320 30 30 2c 70 50 61 72 73 65 2c 70 2c 28 22 4d 6f  00,pParse,p,("Mo
30330 76 65 20 48 41 56 49 4e 47 20 74 65 72 6d 73 20  ve HAVING terms 
30340 69 6e 74 6f 20 57 48 45 52 45 3a 5c 6e 22 29 29  into WHERE:\n"))
30350 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 54 72 65  ;.    sqlite3Tre
30360 65 56 69 65 77 53 65 6c 65 63 74 28 30 2c 20 70  eViewSelect(0, p
30370 2c 20 30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  , 0);.  }.#endif
30380 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20  .}../*.** Check 
30390 74 6f 20 73 65 65 20 69 66 20 74 68 65 20 70 54  to see if the pT
303a0 68 69 73 20 65 6e 74 72 79 20 6f 66 20 70 54 61  his entry of pTa
303b0 62 4c 69 73 74 20 69 73 20 61 20 73 65 6c 66 2d  bList is a self-
303c0 6a 6f 69 6e 20 6f 66 20 61 20 70 72 69 6f 72 20  join of a prior 
303d0 76 69 65 77 2e 0a 2a 2a 20 49 66 20 69 74 20 69  view..** If it i
303e0 73 2c 20 74 68 65 6e 20 72 65 74 75 72 6e 20 74  s, then return t
303f0 68 65 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  he SrcList_item 
30400 66 6f 72 20 74 68 65 20 70 72 69 6f 72 20 76 69  for the prior vi
30410 65 77 2e 20 20 49 66 20 69 74 20 69 73 20 6e 6f  ew.  If it is no
30420 74 2c 0a 2a 2a 20 74 68 65 6e 20 72 65 74 75 72  t,.** then retur
30430 6e 20 30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 73  n 0..*/.static s
30440 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
30450 65 6d 20 2a 69 73 53 65 6c 66 4a 6f 69 6e 56 69  em *isSelfJoinVi
30460 65 77 28 0a 20 20 53 72 63 4c 69 73 74 20 2a 70  ew(.  SrcList *p
30470 54 61 62 4c 69 73 74 2c 20 20 20 20 20 20 20 20  TabList,        
30480 20 20 20 2f 2a 20 53 65 61 72 63 68 20 66 6f 72     /* Search for
30490 20 73 65 6c 66 2d 6a 6f 69 6e 73 20 69 6e 20 74   self-joins in t
304a0 68 69 73 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  his FROM clause 
304b0 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c  */.  struct SrcL
304c0 69 73 74 5f 69 74 65 6d 20 2a 70 54 68 69 73 20  ist_item *pThis 
304d0 20 20 2f 2a 20 53 65 61 72 63 68 20 66 6f 72 20    /* Search for 
304e0 70 72 69 6f 72 20 72 65 66 65 72 65 6e 63 65 20  prior reference 
304f0 74 6f 20 74 68 69 73 20 73 75 62 71 75 65 72 79  to this subquery
30500 20 2a 2f 0a 29 7b 0a 20 20 73 74 72 75 63 74 20   */.){.  struct 
30510 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  SrcList_item *pI
30520 74 65 6d 3b 0a 20 20 66 6f 72 28 70 49 74 65 6d  tem;.  for(pItem
30530 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61 3b 20   = pTabList->a; 
30540 70 49 74 65 6d 3c 70 54 68 69 73 3b 20 70 49 74  pItem<pThis; pIt
30550 65 6d 2b 2b 29 7b 0a 20 20 20 20 53 65 6c 65 63  em++){.    Selec
30560 74 20 2a 70 53 31 3b 0a 20 20 20 20 69 66 28 20  t *pS1;.    if( 
30570 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 3d 3d  pItem->pSelect==
30580 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  0 ) continue;.  
30590 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 66 67 2e    if( pItem->fg.
305a0 76 69 61 43 6f 72 6f 75 74 69 6e 65 20 29 20 63  viaCoroutine ) c
305b0 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28  ontinue;.    if(
305c0 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 3d 3d 30   pItem->zName==0
305d0 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
305e0 20 61 73 73 65 72 74 28 20 70 49 74 65 6d 2d 3e   assert( pItem->
305f0 70 54 61 62 21 3d 30 20 29 3b 0a 20 20 20 20 61  pTab!=0 );.    a
30600 73 73 65 72 74 28 20 70 54 68 69 73 2d 3e 70 54  ssert( pThis->pT
30610 61 62 21 3d 30 20 29 3b 0a 20 20 20 20 69 66 28  ab!=0 );.    if(
30620 20 70 49 74 65 6d 2d 3e 70 54 61 62 2d 3e 70 53   pItem->pTab->pS
30630 63 68 65 6d 61 21 3d 70 54 68 69 73 2d 3e 70 54  chema!=pThis->pT
30640 61 62 2d 3e 70 53 63 68 65 6d 61 20 29 20 63 6f  ab->pSchema ) co
30650 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20  ntinue;.    if( 
30660 73 71 6c 69 74 65 33 5f 73 74 72 69 63 6d 70 28  sqlite3_stricmp(
30670 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 2c 20 70 54  pItem->zName, pT
30680 68 69 73 2d 3e 7a 4e 61 6d 65 29 21 3d 30 20 29  his->zName)!=0 )
30690 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 70   continue;.    p
306a0 53 31 20 3d 20 70 49 74 65 6d 2d 3e 70 53 65 6c  S1 = pItem->pSel
306b0 65 63 74 3b 0a 20 20 20 20 69 66 28 20 70 49 74  ect;.    if( pIt
306c0 65 6d 2d 3e 70 54 61 62 2d 3e 70 53 63 68 65 6d  em->pTab->pSchem
306d0 61 3d 3d 30 20 26 26 20 70 54 68 69 73 2d 3e 70  a==0 && pThis->p
306e0 53 65 6c 65 63 74 2d 3e 73 65 6c 49 64 21 3d 70  Select->selId!=p
306f0 53 31 2d 3e 73 65 6c 49 64 20 29 7b 0a 20 20 20  S1->selId ){.   
30700 20 20 20 2f 2a 20 54 68 65 20 71 75 65 72 79 20     /* The query 
30710 66 6c 61 74 74 65 6e 65 72 20 6c 65 66 74 20 74  flattener left t
30720 77 6f 20 64 69 66 66 65 72 65 6e 74 20 43 54 45  wo different CTE
30730 20 74 61 62 6c 65 73 20 77 69 74 68 20 69 64 65   tables with ide
30740 6e 74 69 63 61 6c 0a 20 20 20 20 20 20 2a 2a 20  ntical.      ** 
30750 6e 61 6d 65 73 20 69 6e 20 74 68 65 20 73 61 6d  names in the sam
30760 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20 2a  e FROM clause. *
30770 2f 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65  /.      continue
30780 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
30790 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61  sqlite3ExprCompa
307a0 72 65 28 30 2c 20 70 54 68 69 73 2d 3e 70 53 65  re(0, pThis->pSe
307b0 6c 65 63 74 2d 3e 70 57 68 65 72 65 2c 20 70 53  lect->pWhere, pS
307c0 31 2d 3e 70 57 68 65 72 65 2c 20 2d 31 29 0a 20  1->pWhere, -1). 
307d0 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 45 78      || sqlite3Ex
307e0 70 72 43 6f 6d 70 61 72 65 28 30 2c 20 70 54 68  prCompare(0, pTh
307f0 69 73 2d 3e 70 53 65 6c 65 63 74 2d 3e 70 48 61  is->pSelect->pHa
30800 76 69 6e 67 2c 20 70 53 31 2d 3e 70 48 61 76 69  ving, pS1->pHavi
30810 6e 67 2c 20 2d 31 29 20 0a 20 20 20 20 29 7b 0a  ng, -1) .    ){.
30820 20 20 20 20 20 20 2f 2a 20 54 68 65 20 76 69 65        /* The vie
30830 77 20 77 61 73 20 6d 6f 64 69 66 69 65 64 20 62  w was modified b
30840 79 20 73 6f 6d 65 20 6f 74 68 65 72 20 6f 70 74  y some other opt
30850 69 6d 69 7a 61 74 69 6f 6e 20 73 75 63 68 20 61  imization such a
30860 73 0a 20 20 20 20 20 20 2a 2a 20 70 75 73 68 44  s.      ** pushD
30870 6f 77 6e 57 68 65 72 65 54 65 72 6d 73 28 29 20  ownWhereTerms() 
30880 2a 2f 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75  */.      continu
30890 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74  e;.    }.    ret
308a0 75 72 6e 20 70 49 74 65 6d 3b 0a 20 20 7d 0a 20  urn pItem;.  }. 
308b0 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 23 69   return 0;.}..#i
308c0 66 64 65 66 20 53 51 4c 49 54 45 5f 43 4f 55 4e  fdef SQLITE_COUN
308d0 54 4f 46 56 49 45 57 5f 4f 50 54 49 4d 49 5a 41  TOFVIEW_OPTIMIZA
308e0 54 49 4f 4e 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d  TION./*.** Attem
308f0 70 74 20 74 6f 20 74 72 61 6e 73 66 6f 72 6d 20  pt to transform 
30900 61 20 71 75 65 72 79 20 6f 66 20 74 68 65 20 66  a query of the f
30910 6f 72 6d 0a 2a 2a 0a 2a 2a 20 20 20 20 53 45 4c  orm.**.**    SEL
30920 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f  ECT count(*) FRO
30930 4d 20 28 53 45 4c 45 43 54 20 78 20 46 52 4f 4d  M (SELECT x FROM
30940 20 74 31 20 55 4e 49 4f 4e 20 41 4c 4c 20 53 45   t1 UNION ALL SE
30950 4c 45 43 54 20 79 20 46 52 4f 4d 20 74 32 29 0a  LECT y FROM t2).
30960 2a 2a 0a 2a 2a 20 49 6e 74 6f 20 74 68 69 73 3a  **.** Into this:
30970 0a 2a 2a 0a 2a 2a 20 20 20 20 53 45 4c 45 43 54  .**.**    SELECT
30980 20 28 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a   (SELECT count(*
30990 29 20 46 52 4f 4d 20 74 31 29 2b 28 53 45 4c 45  ) FROM t1)+(SELE
309a0 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d  CT count(*) FROM
309b0 20 74 32 29 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74   t2).**.** The t
309c0 72 61 6e 73 66 6f 72 6d 61 74 69 6f 6e 20 6f 6e  ransformation on
309d0 6c 79 20 77 6f 72 6b 73 20 69 66 20 61 6c 6c 20  ly works if all 
309e0 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
309f0 20 61 72 65 20 74 72 75 65 3a 0a 2a 2a 0a 2a 2a   are true:.**.**
30a00 20 20 20 2a 20 20 54 68 65 20 73 75 62 71 75 65     *  The subque
30a10 72 79 20 69 73 20 61 20 55 4e 49 4f 4e 20 41 4c  ry is a UNION AL
30a20 4c 20 6f 66 20 74 77 6f 20 6f 72 20 6d 6f 72 65  L of two or more
30a30 20 74 65 72 6d 73 0a 2a 2a 20 20 20 2a 20 20 54   terms.**   *  T
30a40 68 65 20 73 75 62 71 75 65 72 79 20 64 6f 65 73  he subquery does
30a50 20 6e 6f 74 20 68 61 76 65 20 61 20 4c 49 4d 49   not have a LIMI
30a60 54 20 63 6c 61 75 73 65 0a 2a 2a 20 20 20 2a 20  T clause.**   * 
30a70 20 54 68 65 72 65 20 69 73 20 6e 6f 20 57 48 45   There is no WHE
30a80 52 45 20 6f 72 20 47 52 4f 55 50 20 42 59 20 6f  RE or GROUP BY o
30a90 72 20 48 41 56 49 4e 47 20 63 6c 61 75 73 65 73  r HAVING clauses
30aa0 20 6f 6e 20 74 68 65 20 73 75 62 71 75 65 72 69   on the subqueri
30ab0 65 73 0a 2a 2a 20 20 20 2a 20 20 54 68 65 20 6f  es.**   *  The o
30ac0 75 74 65 72 20 71 75 65 72 79 20 69 73 20 61 20  uter query is a 
30ad0 73 69 6d 70 6c 65 20 63 6f 75 6e 74 28 2a 29 20  simple count(*) 
30ae0 77 69 74 68 20 6e 6f 20 57 48 45 52 45 20 63 6c  with no WHERE cl
30af0 61 75 73 65 20 6f 72 20 6f 74 68 65 72 0a 2a 2a  ause or other.**
30b00 20 20 20 20 20 20 65 78 74 72 61 6e 65 6f 75 73        extraneous
30b10 20 73 79 6e 74 61 78 2e 0a 2a 2a 0a 2a 2a 20 52   syntax..**.** R
30b20 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 74 68  eturn TRUE if th
30b30 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69  e optimization i
30b40 73 20 75 6e 64 65 72 74 61 6b 65 6e 2e 0a 2a 2f  s undertaken..*/
30b50 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f 75 6e  .static int coun
30b60 74 4f 66 56 69 65 77 4f 70 74 69 6d 69 7a 61 74  tOfViewOptimizat
30b70 69 6f 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73  ion(Parse *pPars
30b80 65 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20  e, Select *p){. 
30b90 20 53 65 6c 65 63 74 20 2a 70 53 75 62 2c 20 2a   Select *pSub, *
30ba0 70 50 72 69 6f 72 3b 0a 20 20 45 78 70 72 20 2a  pPrior;.  Expr *
30bb0 70 45 78 70 72 3b 0a 20 20 45 78 70 72 20 2a 70  pExpr;.  Expr *p
30bc0 43 6f 75 6e 74 3b 0a 20 20 73 71 6c 69 74 65 33  Count;.  sqlite3
30bd0 20 2a 64 62 3b 0a 20 20 69 66 28 20 28 70 2d 3e   *db;.  if( (p->
30be0 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 41 67  selFlags & SF_Ag
30bf0 67 72 65 67 61 74 65 29 3d 3d 30 20 29 20 72 65  gregate)==0 ) re
30c00 74 75 72 6e 20 30 3b 20 20 20 2f 2a 20 54 68 69  turn 0;   /* Thi
30c10 73 20 69 73 20 61 6e 20 61 67 67 72 65 67 61 74  s is an aggregat
30c20 65 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 45  e */.  if( p->pE
30c30 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d 31 20 29  List->nExpr!=1 )
30c40 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20   return 0;      
30c50 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 6e 67           /* Sing
30c60 6c 65 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e  le result column
30c70 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 57 68   */.  if( p->pWh
30c80 65 72 65 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ere ) return 0;.
30c90 20 20 69 66 28 20 70 2d 3e 70 47 72 6f 75 70 42    if( p->pGroupB
30ca0 79 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  y ) return 0;.  
30cb0 70 45 78 70 72 20 3d 20 70 2d 3e 70 45 4c 69 73  pExpr = p->pELis
30cc0 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20  t->a[0].pExpr;. 
30cd0 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d   if( pExpr->op!=
30ce0 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 20  TK_AGG_FUNCTION 
30cf0 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20  ) return 0;     
30d00 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 69 73 20     /* Result is 
30d10 61 6e 20 61 67 67 72 65 67 61 74 65 20 2a 2f 0a  an aggregate */.
30d20 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73 74    if( sqlite3_st
30d30 72 69 63 6d 70 28 70 45 78 70 72 2d 3e 75 2e 7a  ricmp(pExpr->u.z
30d40 54 6f 6b 65 6e 2c 22 63 6f 75 6e 74 22 29 20 29  Token,"count") )
30d50 20 72 65 74 75 72 6e 20 30 3b 20 20 2f 2a 20 49   return 0;  /* I
30d60 73 20 63 6f 75 6e 74 28 29 20 2a 2f 0a 20 20 69  s count() */.  i
30d70 66 28 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73  f( pExpr->x.pLis
30d80 74 21 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  t!=0 ) return 0;
30d90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30da0 20 2f 2a 20 4d 75 73 74 20 62 65 20 63 6f 75 6e   /* Must be coun
30db0 74 28 2a 29 20 2a 2f 0a 20 20 69 66 28 20 70 2d  t(*) */.  if( p-
30dc0 3e 70 53 72 63 2d 3e 6e 53 72 63 21 3d 31 20 29  >pSrc->nSrc!=1 )
30dd0 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20   return 0;      
30de0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
30df0 6e 65 20 74 61 62 6c 65 20 69 6e 20 46 52 4f 4d  ne table in FROM
30e00 20 20 2a 2f 0a 20 20 70 53 75 62 20 3d 20 70 2d    */.  pSub = p-
30e10 3e 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 53 65 6c  >pSrc->a[0].pSel
30e20 65 63 74 3b 0a 20 20 69 66 28 20 70 53 75 62 3d  ect;.  if( pSub=
30e30 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20  =0 ) return 0;  
30e40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30e50 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
30e60 46 52 4f 4d 20 69 73 20 61 20 73 75 62 71 75 65  FROM is a subque
30e70 72 79 20 2a 2f 0a 20 20 69 66 28 20 70 53 75 62  ry */.  if( pSub
30e80 2d 3e 70 50 72 69 6f 72 3d 3d 30 20 29 20 72 65  ->pPrior==0 ) re
30e90 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20  turn 0;         
30ea0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 75 73            /* Mus
30eb0 74 20 62 65 20 61 20 63 6f 6d 70 6f 75 6e 64 20  t be a compound 
30ec0 72 79 20 2a 2f 0a 20 20 64 6f 7b 0a 20 20 20 20  ry */.  do{.    
30ed0 69 66 28 20 70 53 75 62 2d 3e 6f 70 21 3d 54 4b  if( pSub->op!=TK
30ee0 5f 41 4c 4c 20 26 26 20 70 53 75 62 2d 3e 70 50  _ALL && pSub->pP
30ef0 72 69 6f 72 20 29 20 72 65 74 75 72 6e 20 30 3b  rior ) return 0;
30f00 20 20 2f 2a 20 4d 75 73 74 20 62 65 20 55 4e 49    /* Must be UNI
30f10 4f 4e 20 41 4c 4c 20 2a 2f 0a 20 20 20 20 69 66  ON ALL */.    if
30f20 28 20 70 53 75 62 2d 3e 70 57 68 65 72 65 20 29  ( pSub->pWhere )
30f30 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20   return 0;      
30f40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30f50 2f 2a 20 4e 6f 20 57 48 45 52 45 20 63 6c 61 75  /* No WHERE clau
30f60 73 65 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 53  se */.    if( pS
30f70 75 62 2d 3e 70 4c 69 6d 69 74 20 29 20 72 65 74  ub->pLimit ) ret
30f80 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20  urn 0;          
30f90 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
30fa0 6f 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 20 2a  o LIMIT clause *
30fb0 2f 0a 20 20 20 20 69 66 28 20 70 53 75 62 2d 3e  /.    if( pSub->
30fc0 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 41 67  selFlags & SF_Ag
30fd0 67 72 65 67 61 74 65 20 29 20 72 65 74 75 72 6e  gregate ) return
30fe0 20 30 3b 20 20 20 20 20 2f 2a 20 4e 6f 74 20 61   0;     /* Not a
30ff0 6e 20 61 67 67 72 65 67 61 74 65 20 2a 2f 0a 20  n aggregate */. 
31000 20 20 20 70 53 75 62 20 3d 20 70 53 75 62 2d 3e     pSub = pSub->
31010 70 50 72 69 6f 72 3b 20 20 20 20 20 20 20 20 20  pPrior;         
31020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31030 20 20 20 20 20 2f 2a 20 52 65 70 65 61 74 20 6f       /* Repeat o
31040 76 65 72 20 63 6f 6d 70 6f 75 6e 64 20 2a 2f 0a  ver compound */.
31050 20 20 7d 77 68 69 6c 65 28 20 70 53 75 62 20 29    }while( pSub )
31060 3b 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 72 65  ;..  /* If we re
31070 61 63 68 20 74 68 69 73 20 70 6f 69 6e 74 20 74  ach this point t
31080 68 65 6e 20 69 74 20 69 73 20 4f 4b 20 74 6f 20  hen it is OK to 
31090 70 65 72 66 6f 72 6d 20 74 68 65 20 74 72 61 6e  perform the tran
310a0 73 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a 0a 20  sformation */.. 
310b0 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62   db = pParse->db
310c0 3b 0a 20 20 70 43 6f 75 6e 74 20 3d 20 70 45 78  ;.  pCount = pEx
310d0 70 72 3b 0a 20 20 70 45 78 70 72 20 3d 20 30 3b  pr;.  pExpr = 0;
310e0 0a 20 20 70 53 75 62 20 3d 20 70 2d 3e 70 53 72  .  pSub = p->pSr
310f0 63 2d 3e 61 5b 30 5d 2e 70 53 65 6c 65 63 74 3b  c->a[0].pSelect;
31100 0a 20 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 30 5d  .  p->pSrc->a[0]
31110 2e 70 53 65 6c 65 63 74 20 3d 20 30 3b 0a 20 20  .pSelect = 0;.  
31120 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44 65  sqlite3SrcListDe
31130 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 53 72 63  lete(db, p->pSrc
31140 29 3b 0a 20 20 70 2d 3e 70 53 72 63 20 3d 20 73  );.  p->pSrc = s
31150 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65  qlite3DbMallocZe
31160 72 6f 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 73  ro(pParse->db, s
31170 69 7a 65 6f 66 28 2a 70 2d 3e 70 53 72 63 29 29  izeof(*p->pSrc))
31180 3b 0a 20 20 77 68 69 6c 65 28 20 70 53 75 62 20  ;.  while( pSub 
31190 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 54 65  ){.    Expr *pTe
311a0 72 6d 3b 0a 20 20 20 20 70 50 72 69 6f 72 20 3d  rm;.    pPrior =
311b0 20 70 53 75 62 2d 3e 70 50 72 69 6f 72 3b 0a 20   pSub->pPrior;. 
311c0 20 20 20 70 53 75 62 2d 3e 70 50 72 69 6f 72 20     pSub->pPrior 
311d0 3d 20 30 3b 0a 20 20 20 20 70 53 75 62 2d 3e 70  = 0;.    pSub->p
311e0 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20 20 70 53  Next = 0;.    pS
311f0 75 62 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20  ub->selFlags |= 
31200 53 46 5f 41 67 67 72 65 67 61 74 65 3b 0a 20 20  SF_Aggregate;.  
31210 20 20 70 53 75 62 2d 3e 73 65 6c 46 6c 61 67 73    pSub->selFlags
31220 20 26 3d 20 7e 53 46 5f 43 6f 6d 70 6f 75 6e 64   &= ~SF_Compound
31230 3b 0a 20 20 20 20 70 53 75 62 2d 3e 6e 53 65 6c  ;.    pSub->nSel
31240 65 63 74 52 6f 77 20 3d 20 30 3b 0a 20 20 20 20  ectRow = 0;.    
31250 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
31260 65 6c 65 74 65 28 64 62 2c 20 70 53 75 62 2d 3e  elete(db, pSub->
31270 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 70 54 65  pEList);.    pTe
31280 72 6d 20 3d 20 70 50 72 69 6f 72 20 3f 20 73 71  rm = pPrior ? sq
31290 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c  lite3ExprDup(db,
312a0 20 70 43 6f 75 6e 74 2c 20 30 29 20 3a 20 70 43   pCount, 0) : pC
312b0 6f 75 6e 74 3b 0a 20 20 20 20 70 53 75 62 2d 3e  ount;.    pSub->
312c0 70 45 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33  pEList = sqlite3
312d0 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70  ExprListAppend(p
312e0 50 61 72 73 65 2c 20 30 2c 20 70 54 65 72 6d 29  Parse, 0, pTerm)
312f0 3b 0a 20 20 20 20 70 54 65 72 6d 20 3d 20 73 71  ;.    pTerm = sq
31300 6c 69 74 65 33 50 45 78 70 72 28 70 50 61 72 73  lite3PExpr(pPars
31310 65 2c 20 54 4b 5f 53 45 4c 45 43 54 2c 20 30 2c  e, TK_SELECT, 0,
31320 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
31330 50 45 78 70 72 41 64 64 53 65 6c 65 63 74 28 70  PExprAddSelect(p
31340 50 61 72 73 65 2c 20 70 54 65 72 6d 2c 20 70 53  Parse, pTerm, pS
31350 75 62 29 3b 0a 20 20 20 20 69 66 28 20 70 45 78  ub);.    if( pEx
31360 70 72 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70  pr==0 ){.      p
31370 45 78 70 72 20 3d 20 70 54 65 72 6d 3b 0a 20 20  Expr = pTerm;.  
31380 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
31390 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 50 45  Expr = sqlite3PE
313a0 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 50  xpr(pParse, TK_P
313b0 4c 55 53 2c 20 70 54 65 72 6d 2c 20 70 45 78 70  LUS, pTerm, pExp
313c0 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 53  r);.    }.    pS
313d0 75 62 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20 7d  ub = pPrior;.  }
313e0 0a 20 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b  .  p->pEList->a[
313f0 30 5d 2e 70 45 78 70 72 20 3d 20 70 45 78 70 72  0].pExpr = pExpr
31400 3b 0a 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20  ;.  p->selFlags 
31410 26 3d 20 7e 53 46 5f 41 67 67 72 65 67 61 74 65  &= ~SF_Aggregate
31420 3b 0a 0a 23 69 66 20 53 45 4c 45 43 54 54 52 41  ;..#if SELECTTRA
31430 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20 69 66 28  CE_ENABLED.  if(
31440 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 54 72   sqlite3SelectTr
31450 61 63 65 20 26 20 30 78 34 30 30 20 29 7b 0a 20  ace & 0x400 ){. 
31460 20 20 20 53 45 4c 45 43 54 54 52 41 43 45 28 30     SELECTTRACE(0
31470 78 34 30 30 2c 70 50 61 72 73 65 2c 70 2c 28 22  x400,pParse,p,("
31480 41 66 74 65 72 20 63 6f 75 6e 74 2d 6f 66 2d 76  After count-of-v
31490 69 65 77 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  iew optimization
314a0 3a 5c 6e 22 29 29 3b 0a 20 20 20 20 73 71 6c 69  :\n"));.    sqli
314b0 74 65 33 54 72 65 65 56 69 65 77 53 65 6c 65 63  te3TreeViewSelec
314c0 74 28 30 2c 20 70 2c 20 30 29 3b 0a 20 20 7d 0a  t(0, p, 0);.  }.
314d0 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20  #endif.  return 
314e0 31 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  1;.}.#endif /* S
314f0 51 4c 49 54 45 5f 43 4f 55 4e 54 4f 46 56 49 45  QLITE_COUNTOFVIE
31500 57 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 20 2a  W_OPTIMIZATION *
31510 2f 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  /../*.** Generat
31520 65 20 63 6f 64 65 20 66 6f 72 20 74 68 65 20 53  e code for the S
31530 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
31540 67 69 76 65 6e 20 69 6e 20 74 68 65 20 70 20 61  given in the p a
31550 72 67 75 6d 65 6e 74 2e 20 20 0a 2a 2a 0a 2a 2a  rgument.  .**.**
31560 20 54 68 65 20 72 65 73 75 6c 74 73 20 61 72 65   The results are
31570 20 72 65 74 75 72 6e 65 64 20 61 63 63 6f 72 64   returned accord
31580 69 6e 67 20 74 6f 20 74 68 65 20 53 65 6c 65 63  ing to the Selec
31590 74 44 65 73 74 20 73 74 72 75 63 74 75 72 65 2e  tDest structure.
315a0 0a 2a 2a 20 53 65 65 20 63 6f 6d 6d 65 6e 74 73  .** See comments
315b0 20 69 6e 20 73 71 6c 69 74 65 49 6e 74 2e 68 20   in sqliteInt.h 
315c0 66 6f 72 20 66 75 72 74 68 65 72 20 69 6e 66 6f  for further info
315d0 72 6d 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54  rmation..**.** T
315e0 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75  his routine retu
315f0 72 6e 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  rns the number o
31600 66 20 65 72 72 6f 72 73 2e 20 20 49 66 20 61 6e  f errors.  If an
31610 79 20 65 72 72 6f 72 73 20 61 72 65 0a 2a 2a 20  y errors are.** 
31620 65 6e 63 6f 75 6e 74 65 72 65 64 2c 20 74 68 65  encountered, the
31630 6e 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65  n an appropriate
31640 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69   error message i
31650 73 20 6c 65 66 74 20 69 6e 0a 2a 2a 20 70 50 61  s left in.** pPa
31660 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2e 0a 2a 2a  rse->zErrMsg..**
31670 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
31680 20 64 6f 65 73 20 4e 4f 54 20 66 72 65 65 20 74   does NOT free t
31690 68 65 20 53 65 6c 65 63 74 20 73 74 72 75 63 74  he Select struct
316a0 75 72 65 20 70 61 73 73 65 64 20 69 6e 2e 20 20  ure passed in.  
316b0 54 68 65 0a 2a 2a 20 63 61 6c 6c 69 6e 67 20 66  The.** calling f
316c0 75 6e 63 74 69 6f 6e 20 6e 65 65 64 73 20 74 6f  unction needs to
316d0 20 64 6f 20 74 68 61 74 2e 0a 2a 2f 0a 69 6e 74   do that..*/.int
316e0 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 0a   sqlite3Select(.
316f0 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
31700 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
31710 70 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a  parser context *
31720 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20  /.  Select *p,  
31730 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
31740 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  e SELECT stateme
31750 6e 74 20 62 65 69 6e 67 20 63 6f 64 65 64 2e 20  nt being coded. 
31760 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20  */.  SelectDest 
31770 2a 70 44 65 73 74 20 20 20 20 20 20 2f 2a 20 57  *pDest      /* W
31780 68 61 74 20 74 6f 20 64 6f 20 77 69 74 68 20 74  hat to do with t
31790 68 65 20 71 75 65 72 79 20 72 65 73 75 6c 74 73  he query results
317a0 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 2c 20   */.){.  int i, 
317b0 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  j;              
317c0 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73  /* Loop counters
317d0 20 2a 2f 0a 20 20 57 68 65 72 65 49 6e 66 6f 20   */.  WhereInfo 
317e0 2a 70 57 49 6e 66 6f 3b 20 20 20 20 20 2f 2a 20  *pWInfo;     /* 
317f0 52 65 74 75 72 6e 20 66 72 6f 6d 20 73 71 6c 69  Return from sqli
31800 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 29 20  te3WhereBegin() 
31810 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b 20 20 20  */.  Vdbe *v;   
31820 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
31830 68 65 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69  he virtual machi
31840 6e 65 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75  ne under constru
31850 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 69  ction */.  int i
31860 73 41 67 67 3b 20 20 20 20 20 20 20 20 20 20 20  sAgg;           
31870 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 73 65    /* True for se
31880 6c 65 63 74 20 6c 69 73 74 73 20 6c 69 6b 65 20  lect lists like 
31890 22 63 6f 75 6e 74 28 2a 29 22 20 2a 2f 0a 20 20  "count(*)" */.  
318a0 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74  ExprList *pEList
318b0 20 3d 20 30 3b 20 20 2f 2a 20 4c 69 73 74 20 6f   = 0;  /* List o
318c0 66 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 65 78 74  f columns to ext
318d0 72 61 63 74 2e 20 2a 2f 0a 20 20 53 72 63 4c 69  ract. */.  SrcLi
318e0 73 74 20 2a 70 54 61 62 4c 69 73 74 3b 20 20 20  st *pTabList;   
318f0 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 74 61 62    /* List of tab
31900 6c 65 73 20 74 6f 20 73 65 6c 65 63 74 20 66 72  les to select fr
31910 6f 6d 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 57  om */.  Expr *pW
31920 68 65 72 65 3b 20 20 20 20 20 20 20 20 20 20 2f  here;          /
31930 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75  * The WHERE clau
31940 73 65 2e 20 20 4d 61 79 20 62 65 20 4e 55 4c 4c  se.  May be NULL
31950 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
31960 70 47 72 6f 75 70 42 79 3b 20 20 20 20 2f 2a 20  pGroupBy;    /* 
31970 54 68 65 20 47 52 4f 55 50 20 42 59 20 63 6c 61  The GROUP BY cla
31980 75 73 65 2e 20 20 4d 61 79 20 62 65 20 4e 55 4c  use.  May be NUL
31990 4c 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 48 61  L */.  Expr *pHa
319a0 76 69 6e 67 3b 20 20 20 20 20 20 20 20 20 2f 2a  ving;         /*
319b0 20 54 68 65 20 48 41 56 49 4e 47 20 63 6c 61 75   The HAVING clau
319c0 73 65 2e 20 20 4d 61 79 20 62 65 20 4e 55 4c 4c  se.  May be NULL
319d0 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 31   */.  int rc = 1
319e0 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
319f0 56 61 6c 75 65 20 74 6f 20 72 65 74 75 72 6e 20  Value to return 
31a00 66 72 6f 6d 20 74 68 69 73 20 66 75 6e 63 74 69  from this functi
31a10 6f 6e 20 2a 2f 0a 20 20 44 69 73 74 69 6e 63 74  on */.  Distinct
31a20 43 74 78 20 73 44 69 73 74 69 6e 63 74 3b 20 2f  Ctx sDistinct; /
31a30 2a 20 49 6e 66 6f 20 6f 6e 20 68 6f 77 20 74 6f  * Info on how to
31a40 20 63 6f 64 65 20 74 68 65 20 44 49 53 54 49 4e   code the DISTIN
31a50 43 54 20 6b 65 79 77 6f 72 64 20 2a 2f 0a 20 20  CT keyword */.  
31a60 53 6f 72 74 43 74 78 20 73 53 6f 72 74 3b 20 20  SortCtx sSort;  
31a70 20 20 20 20 20 20 20 2f 2a 20 49 6e 66 6f 20 6f         /* Info o
31a80 6e 20 68 6f 77 20 74 6f 20 63 6f 64 65 20 74 68  n how to code th
31a90 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
31aa0 65 20 2a 2f 0a 20 20 41 67 67 49 6e 66 6f 20 73  e */.  AggInfo s
31ab0 41 67 67 49 6e 66 6f 3b 20 20 20 20 20 20 2f 2a  AggInfo;      /*
31ac0 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 75 73 65   Information use
31ad0 64 20 62 79 20 61 67 67 72 65 67 61 74 65 20 71  d by aggregate q
31ae0 75 65 72 69 65 73 20 2a 2f 0a 20 20 69 6e 74 20  ueries */.  int 
31af0 69 45 6e 64 3b 20 20 20 20 20 20 20 20 20 20 20  iEnd;           
31b00 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66     /* Address of
31b10 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
31b20 71 75 65 72 79 20 2a 2f 0a 20 20 73 71 6c 69 74  query */.  sqlit
31b30 65 33 20 2a 64 62 3b 20 20 20 20 20 20 20 20 20  e3 *db;         
31b40 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73    /* The databas
31b50 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a  e connection */.
31b60 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4d 69 6e    ExprList *pMin
31b70 4d 61 78 4f 72 64 65 72 42 79 20 3d 20 30 3b 20  MaxOrderBy = 0; 
31b80 20 2f 2a 20 41 64 64 65 64 20 4f 52 44 45 52 20   /* Added ORDER 
31b90 42 59 20 66 6f 72 20 6d 69 6e 2f 6d 61 78 20 71  BY for min/max q
31ba0 75 65 72 69 65 73 20 2a 2f 0a 20 20 75 38 20 6d  ueries */.  u8 m
31bb0 69 6e 4d 61 78 46 6c 61 67 3b 20 20 20 20 20 20  inMaxFlag;      
31bc0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c             /* Fl
31bd0 61 67 20 66 6f 72 20 6d 69 6e 2f 6d 61 78 20 71  ag for min/max q
31be0 75 65 72 69 65 73 20 2a 2f 0a 0a 20 20 64 62 20  ueries */..  db 
31bf0 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
31c00 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64  v = sqlite3GetVd
31c10 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66  be(pParse);.  if
31c20 28 20 70 3d 3d 30 20 7c 7c 20 64 62 2d 3e 6d 61  ( p==0 || db->ma
31c30 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20 70 50  llocFailed || pP
31c40 61 72 73 65 2d 3e 6e 45 72 72 20 29 7b 0a 20 20  arse->nErr ){.  
31c50 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a    return 1;.  }.
31c60 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74    if( sqlite3Aut
31c70 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53  hCheck(pParse, S
31c80 51 4c 49 54 45 5f 53 45 4c 45 43 54 2c 20 30 2c  QLITE_SELECT, 0,
31c90 20 30 2c 20 30 29 20 29 20 72 65 74 75 72 6e 20   0, 0) ) return 
31ca0 31 3b 0a 20 20 6d 65 6d 73 65 74 28 26 73 41 67  1;.  memset(&sAg
31cb0 67 49 6e 66 6f 2c 20 30 2c 20 73 69 7a 65 6f 66  gInfo, 0, sizeof
31cc0 28 73 41 67 67 49 6e 66 6f 29 29 3b 0a 23 69 66  (sAggInfo));.#if
31cd0 20 53 45 4c 45 43 54 54 52 41 43 45 5f 45 4e 41   SELECTTRACE_ENA
31ce0 42 4c 45 44 0a 20 20 53 45 4c 45 43 54 54 52 41  BLED.  SELECTTRA
31cf0 43 45 28 31 2c 70 50 61 72 73 65 2c 70 2c 20 28  CE(1,pParse,p, (
31d00 22 62 65 67 69 6e 20 70 72 6f 63 65 73 73 69 6e  "begin processin
31d10 67 3a 5c 6e 22 2c 20 70 50 61 72 73 65 2d 3e 61  g:\n", pParse->a
31d20 64 64 72 45 78 70 6c 61 69 6e 29 29 3b 0a 20 20  ddrExplain));.  
31d30 69 66 28 20 73 71 6c 69 74 65 33 53 65 6c 65 63  if( sqlite3Selec
31d40 74 54 72 61 63 65 20 26 20 30 78 31 30 30 20 29  tTrace & 0x100 )
31d50 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 54 72 65  {.    sqlite3Tre
31d60 65 56 69 65 77 53 65 6c 65 63 74 28 30 2c 20 70  eViewSelect(0, p
31d70 2c 20 30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  , 0);.  }.#endif
31d80 0a 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70  ..  assert( p->p
31d90 4f 72 64 65 72 42 79 3d 3d 30 20 7c 7c 20 70 44  OrderBy==0 || pD
31da0 65 73 74 2d 3e 65 44 65 73 74 21 3d 53 52 54 5f  est->eDest!=SRT_
31db0 44 69 73 74 46 69 66 6f 20 29 3b 0a 20 20 61 73  DistFifo );.  as
31dc0 73 65 72 74 28 20 70 2d 3e 70 4f 72 64 65 72 42  sert( p->pOrderB
31dd0 79 3d 3d 30 20 7c 7c 20 70 44 65 73 74 2d 3e 65  y==0 || pDest->e
31de0 44 65 73 74 21 3d 53 52 54 5f 46 69 66 6f 20 29  Dest!=SRT_Fifo )
31df0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70  ;.  assert( p->p
31e00 4f 72 64 65 72 42 79 3d 3d 30 20 7c 7c 20 70 44  OrderBy==0 || pD
31e10 65 73 74 2d 3e 65 44 65 73 74 21 3d 53 52 54 5f  est->eDest!=SRT_
31e20 44 69 73 74 51 75 65 75 65 20 29 3b 0a 20 20 61  DistQueue );.  a
31e30 73 73 65 72 74 28 20 70 2d 3e 70 4f 72 64 65 72  ssert( p->pOrder
31e40 42 79 3d 3d 30 20 7c 7c 20 70 44 65 73 74 2d 3e  By==0 || pDest->
31e50 65 44 65 73 74 21 3d 53 52 54 5f 51 75 65 75 65  eDest!=SRT_Queue
31e60 20 29 3b 0a 20 20 69 66 28 20 49 67 6e 6f 72 61   );.  if( Ignora
31e70 62 6c 65 4f 72 64 65 72 62 79 28 70 44 65 73 74  bleOrderby(pDest
31e80 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  ) ){.    assert(
31e90 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52  pDest->eDest==SR
31ea0 54 5f 45 78 69 73 74 73 20 7c 7c 20 70 44 65 73  T_Exists || pDes
31eb0 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 55 6e  t->eDest==SRT_Un
31ec0 69 6f 6e 20 7c 7c 20 0a 20 20 20 20 20 20 20 20  ion || .        
31ed0 20 20 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d     pDest->eDest=
31ee0 3d 53 52 54 5f 45 78 63 65 70 74 20 7c 7c 20 70  =SRT_Except || p
31ef0 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54  Dest->eDest==SRT
31f00 5f 44 69 73 63 61 72 64 20 7c 7c 0a 20 20 20 20  _Discard ||.    
31f10 20 20 20 20 20 20 20 70 44 65 73 74 2d 3e 65 44         pDest->eD
31f20 65 73 74 3d 3d 53 52 54 5f 51 75 65 75 65 20 20  est==SRT_Queue  
31f30 7c 7c 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d  || pDest->eDest=
31f40 3d 53 52 54 5f 44 69 73 74 46 69 66 6f 20 7c 7c  =SRT_DistFifo ||
31f50 0a 20 20 20 20 20 20 20 20 20 20 20 70 44 65 73  .           pDes
31f60 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 44 69  t->eDest==SRT_Di
31f70 73 74 51 75 65 75 65 20 7c 7c 20 70 44 65 73 74  stQueue || pDest
31f80 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 46 69 66  ->eDest==SRT_Fif
31f90 6f 29 3b 0a 20 20 20 20 2f 2a 20 49 66 20 4f 52  o);.    /* If OR
31fa0 44 45 52 20 42 59 20 6d 61 6b 65 73 20 6e 6f 20  DER BY makes no 
31fb0 64 69 66 66 65 72 65 6e 63 65 20 69 6e 20 74 68  difference in th
31fc0 65 20 6f 75 74 70 75 74 20 74 68 65 6e 20 6e 65  e output then ne
31fd0 69 74 68 65 72 20 64 6f 65 73 0a 20 20 20 20 2a  ither does.    *
31fe0 2a 20 44 49 53 54 49 4e 43 54 20 73 6f 20 69 74  * DISTINCT so it
31ff0 20 63 61 6e 20 62 65 20 72 65 6d 6f 76 65 64 20   can be removed 
32000 74 6f 6f 2e 20 2a 2f 0a 20 20 20 20 73 71 6c 69  too. */.    sqli
32010 74 65 33 57 69 6e 64 6f 77 52 65 6d 6f 76 65 45  te3WindowRemoveE
32020 78 70 72 4c 69 73 74 46 72 6f 6d 53 65 6c 65 63  xprListFromSelec
32030 74 28 70 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79  t(p, p->pOrderBy
32040 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  );.    sqlite3Ex
32050 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c  prListDelete(db,
32060 20 70 2d 3e 70 4f 72 64 65 72 42 79 29 3b 0a 20   p->pOrderBy);. 
32070 20 20 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d     p->pOrderBy =
32080 20 30 3b 0a 20 20 20 20 70 2d 3e 73 65 6c 46 6c   0;.    p->selFl
32090 61 67 73 20 26 3d 20 7e 53 46 5f 44 69 73 74 69  ags &= ~SF_Disti
320a0 6e 63 74 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  nct;.  }.  sqlit
320b0 65 33 53 65 6c 65 63 74 50 72 65 70 28 70 50 61  e3SelectPrep(pPa
320c0 72 73 65 2c 20 70 2c 20 30 29 3b 0a 20 20 69 66  rse, p, 0);.  if
320d0 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c  ( pParse->nErr |
320e0 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  | db->mallocFail
320f0 65 64 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 73  ed ){.    goto s
32100 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 20  elect_end;.  }. 
32110 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69   assert( p->pELi
32120 73 74 21 3d 30 20 29 3b 0a 23 69 66 20 53 45 4c  st!=0 );.#if SEL
32130 45 43 54 54 52 41 43 45 5f 45 4e 41 42 4c 45 44  ECTTRACE_ENABLED
32140 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 65  .  if( sqlite3Se
32150 6c 65 63 74 54 72 61 63 65 20 26 20 30 78 31 30  lectTrace & 0x10
32160 34 20 29 7b 0a 20 20 20 20 53 45 4c 45 43 54 54  4 ){.    SELECTT
32170 52 41 43 45 28 30 78 31 30 34 2c 70 50 61 72 73  RACE(0x104,pPars
32180 65 2c 70 2c 20 28 22 61 66 74 65 72 20 6e 61 6d  e,p, ("after nam
32190 65 20 72 65 73 6f 6c 75 74 69 6f 6e 3a 5c 6e 22  e resolution:\n"
321a0 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 54  ));.    sqlite3T
321b0 72 65 65 56 69 65 77 53 65 6c 65 63 74 28 30 2c  reeViewSelect(0,
321c0 20 70 2c 20 30 29 3b 0a 20 20 7d 0a 23 65 6e 64   p, 0);.  }.#end
321d0 69 66 0a 0a 20 20 69 66 28 20 70 44 65 73 74 2d  if..  if( pDest-
321e0 3e 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70  >eDest==SRT_Outp
321f0 75 74 20 29 7b 0a 20 20 20 20 67 65 6e 65 72 61  ut ){.    genera
32200 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50  teColumnNames(pP
32210 61 72 73 65 2c 20 70 29 3b 0a 20 20 7d 0a 0a 23  arse, p);.  }..#
32220 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
32230 49 54 5f 57 49 4e 44 4f 57 46 55 4e 43 0a 20 20  IT_WINDOWFUNC.  
32240 69 66 28 20 73 71 6c 69 74 65 33 57 69 6e 64 6f  if( sqlite3Windo
32250 77 52 65 77 72 69 74 65 28 70 50 61 72 73 65 2c  wRewrite(pParse,
32260 20 70 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20   p) ){.    goto 
32270 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a  select_end;.  }.
32280 23 69 66 20 53 45 4c 45 43 54 54 52 41 43 45 5f  #if SELECTTRACE_
32290 45 4e 41 42 4c 45 44 0a 20 20 69 66 28 20 73 71  ENABLED.  if( sq
322a0 6c 69 74 65 33 53 65 6c 65 63 74 54 72 61 63 65  lite3SelectTrace
322b0 20 26 20 30 78 31 30 38 20 29 7b 0a 20 20 20 20   & 0x108 ){.    
322c0 53 45 4c 45 43 54 54 52 41 43 45 28 30 78 31 30  SELECTTRACE(0x10
322d0 34 2c 70 50 61 72 73 65 2c 70 2c 20 28 22 61 66  4,pParse,p, ("af
322e0 74 65 72 20 77 69 6e 64 6f 77 20 72 65 77 72 69  ter window rewri
322f0 74 65 3a 5c 6e 22 29 29 3b 0a 20 20 20 20 73 71  te:\n"));.    sq
32300 6c 69 74 65 33 54 72 65 65 56 69 65 77 53 65 6c  lite3TreeViewSel
32310 65 63 74 28 30 2c 20 70 2c 20 30 29 3b 0a 20 20  ect(0, p, 0);.  
32320 7d 0a 23 65 6e 64 69 66 0a 23 65 6e 64 69 66 20  }.#endif.#endif 
32330 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57  /* SQLITE_OMIT_W
32340 49 4e 44 4f 57 46 55 4e 43 20 2a 2f 0a 20 20 70  INDOWFUNC */.  p
32350 54 61 62 4c 69 73 74 20 3d 20 70 2d 3e 70 53 72  TabList = p->pSr
32360 63 3b 0a 20 20 69 73 41 67 67 20 3d 20 28 70 2d  c;.  isAgg = (p-
32370 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 41  >selFlags & SF_A
32380 67 67 72 65 67 61 74 65 29 21 3d 30 3b 0a 20 20  ggregate)!=0;.  
32390 6d 65 6d 73 65 74 28 26 73 53 6f 72 74 2c 20 30  memset(&sSort, 0
323a0 2c 20 73 69 7a 65 6f 66 28 73 53 6f 72 74 29 29  , sizeof(sSort))
323b0 3b 0a 20 20 73 53 6f 72 74 2e 70 4f 72 64 65 72  ;.  sSort.pOrder
323c0 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79  By = p->pOrderBy
323d0 3b 0a 0a 20 20 2f 2a 20 54 72 79 20 74 6f 20 76  ;..  /* Try to v
323e0 61 72 69 6f 75 73 20 6f 70 74 69 6d 69 7a 61 74  arious optimizat
323f0 69 6f 6e 73 20 28 66 6c 61 74 74 65 6e 69 6e 67  ions (flattening
32400 20 73 75 62 71 75 65 72 69 65 73 2c 20 61 6e 64   subqueries, and
32410 20 73 74 72 65 6e 67 74 68 0a 20 20 2a 2a 20 72   strength.  ** r
32420 65 64 75 63 74 69 6f 6e 20 6f 66 20 6a 6f 69 6e  eduction of join
32430 20 6f 70 65 72 61 74 6f 72 73 29 20 69 6e 20 74   operators) in t
32440 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 75  he FROM clause u
32450 70 20 69 6e 74 6f 20 74 68 65 20 6d 61 69 6e 20  p into the main 
32460 71 75 65 72 79 0a 20 20 2a 2f 0a 23 69 66 20 21  query.  */.#if !
32470 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
32480 4d 49 54 5f 53 55 42 51 55 45 52 59 29 20 7c 7c  MIT_SUBQUERY) ||
32490 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
324a0 5f 4f 4d 49 54 5f 56 49 45 57 29 0a 20 20 66 6f  _OMIT_VIEW).  fo
324b0 72 28 69 3d 30 3b 20 21 70 2d 3e 70 50 72 69 6f  r(i=0; !p->pPrio
324c0 72 20 26 26 20 69 3c 70 54 61 62 4c 69 73 74 2d  r && i<pTabList-
324d0 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20  >nSrc; i++){.   
324e0 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
324f0 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70  item *pItem = &p
32500 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 3b 0a 20  TabList->a[i];. 
32510 20 20 20 53 65 6c 65 63 74 20 2a 70 53 75 62 20     Select *pSub 
32520 3d 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74  = pItem->pSelect
32530 3b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61  ;.    Table *pTa
32540 62 20 3d 20 70 49 74 65 6d 2d 3e 70 54 61 62 3b  b = pItem->pTab;
32550 0a 0a 20 20 20 20 2f 2a 20 43 6f 6e 76 65 72 74  ..    /* Convert
32560 20 4c 45 46 54 20 4a 4f 49 4e 20 69 6e 74 6f 20   LEFT JOIN into 
32570 4a 4f 49 4e 20 69 66 20 74 68 65 72 65 20 61 72  JOIN if there ar
32580 65 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 72  e terms of the r
32590 69 67 68 74 20 74 61 62 6c 65 0a 20 20 20 20 2a  ight table.    *
325a0 2a 20 6f 66 20 74 68 65 20 4c 45 46 54 20 4a 4f  * of the LEFT JO
325b0 49 4e 20 75 73 65 64 20 69 6e 20 74 68 65 20 57  IN used in the W
325c0 48 45 52 45 20 63 6c 61 75 73 65 2e 0a 20 20 20  HERE clause..   
325d0 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 70 49 74   */.    if( (pIt
325e0 65 6d 2d 3e 66 67 2e 6a 6f 69 6e 74 79 70 65 20  em->fg.jointype 
325f0 26 20 4a 54 5f 4c 45 46 54 29 21 3d 30 0a 20 20  & JT_LEFT)!=0.  
32600 20 20 20 26 26 20 73 71 6c 69 74 65 33 45 78 70     && sqlite3Exp
32610 72 49 6d 70 6c 69 65 73 4e 6f 6e 4e 75 6c 6c 52  rImpliesNonNullR
32620 6f 77 28 70 2d 3e 70 57 68 65 72 65 2c 20 70 49  ow(p->pWhere, pI
32630 74 65 6d 2d 3e 69 43 75 72 73 6f 72 29 0a 20 20  tem->iCursor).  
32640 20 20 20 26 26 20 4f 70 74 69 6d 69 7a 61 74 69     && Optimizati
32650 6f 6e 45 6e 61 62 6c 65 64 28 64 62 2c 20 53 51  onEnabled(db, SQ
32660 4c 49 54 45 5f 53 69 6d 70 6c 69 66 79 4a 6f 69  LITE_SimplifyJoi
32670 6e 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  n).    ){.      
32680 53 45 4c 45 43 54 54 52 41 43 45 28 30 78 31 30  SELECTTRACE(0x10
32690 30 2c 70 50 61 72 73 65 2c 70 2c 0a 20 20 20 20  0,pParse,p,.    
326a0 20 20 20 20 20 20 20 20 20 20 20 20 28 22 4c 45              ("LE
326b0 46 54 2d 4a 4f 49 4e 20 73 69 6d 70 6c 69 66 69  FT-JOIN simplifi
326c0 65 73 20 74 6f 20 4a 4f 49 4e 20 6f 6e 20 74 65  es to JOIN on te
326d0 72 6d 20 25 64 5c 6e 22 2c 69 29 29 3b 0a 20 20  rm %d\n",i));.  
326e0 20 20 20 20 70 49 74 65 6d 2d 3e 66 67 2e 6a 6f      pItem->fg.jo
326f0 69 6e 74 79 70 65 20 26 3d 20 7e 28 4a 54 5f 4c  intype &= ~(JT_L
32700 45 46 54 7c 4a 54 5f 4f 55 54 45 52 29 3b 0a 20  EFT|JT_OUTER);. 
32710 20 20 20 20 20 75 6e 73 65 74 4a 6f 69 6e 45 78       unsetJoinEx
32720 70 72 28 70 2d 3e 70 57 68 65 72 65 2c 20 70 49  pr(p->pWhere, pI
32730 74 65 6d 2d 3e 69 43 75 72 73 6f 72 29 3b 0a 20  tem->iCursor);. 
32740 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4e 6f 20     }..    /* No 
32750 66 75 74 68 65 72 20 61 63 74 69 6f 6e 20 69 66  futher action if
32760 20 74 68 69 73 20 74 65 72 6d 20 6f 66 20 74 68   this term of th
32770 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 69 73  e FROM clause is
32780 20 6e 6f 20 61 20 73 75 62 71 75 65 72 79 20 2a   no a subquery *
32790 2f 0a 20 20 20 20 69 66 28 20 70 53 75 62 3d 3d  /.    if( pSub==
327a0 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 0a 20  0 ) continue;.. 
327b0 20 20 20 2f 2a 20 43 61 74 63 68 20 6d 69 73 6d     /* Catch mism
327c0 61 74 63 68 20 69 6e 20 74 68 65 20 64 65 63 6c  atch in the decl
327d0 61 72 65 64 20 63 6f 6c 75 6d 6e 73 20 6f 66 20  ared columns of 
327e0 61 20 76 69 65 77 20 61 6e 64 20 74 68 65 20 6e  a view and the n
327f0 75 6d 62 65 72 20 6f 66 0a 20 20 20 20 2a 2a 20  umber of.    ** 
32800 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 53  columns in the S
32810 45 4c 45 43 54 20 6f 6e 20 74 68 65 20 52 48 53  ELECT on the RHS
32820 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 54 61 62   */.    if( pTab
32830 2d 3e 6e 43 6f 6c 21 3d 70 53 75 62 2d 3e 70 45  ->nCol!=pSub->pE
32840 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20  List->nExpr ){. 
32850 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
32860 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 65 78  rMsg(pParse, "ex
32870 70 65 63 74 65 64 20 25 64 20 63 6f 6c 75 6d 6e  pected %d column
32880 73 20 66 6f 72 20 27 25 73 27 20 62 75 74 20 67  s for '%s' but g
32890 6f 74 20 25 64 22 2c 0a 20 20 20 20 20 20 20 20  ot %d",.        
328a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 54                pT
328b0 61 62 2d 3e 6e 43 6f 6c 2c 20 70 54 61 62 2d 3e  ab->nCol, pTab->
328c0 7a 4e 61 6d 65 2c 20 70 53 75 62 2d 3e 70 45 4c  zName, pSub->pEL
328d0 69 73 74 2d 3e 6e 45 78 70 72 29 3b 0a 20 20 20  ist->nExpr);.   
328e0 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65     goto select_e
328f0 6e 64 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  nd;.    }..    /
32900 2a 20 44 6f 20 6e 6f 74 20 74 72 79 20 74 6f 20  * Do not try to 
32910 66 6c 61 74 74 65 6e 20 61 6e 20 61 67 67 72 65  flatten an aggre
32920 67 61 74 65 20 73 75 62 71 75 65 72 79 2e 0a 20  gate subquery.. 
32930 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 46 6c 61     **.    ** Fla
32940 74 74 65 6e 69 6e 67 20 61 6e 20 61 67 67 72 65  ttening an aggre
32950 67 61 74 65 20 73 75 62 71 75 65 72 79 20 69 73  gate subquery is
32960 20 6f 6e 6c 79 20 70 6f 73 73 69 62 6c 65 20 69   only possible i
32970 66 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  f the outer quer
32980 79 0a 20 20 20 20 2a 2a 20 69 73 20 6e 6f 74 20  y.    ** is not 
32990 61 20 6a 6f 69 6e 2e 20 20 42 75 74 20 69 66 20  a join.  But if 
329a0 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  the outer query 
329b0 69 73 20 6e 6f 74 20 61 20 6a 6f 69 6e 2c 20 74  is not a join, t
329c0 68 65 6e 20 74 68 65 20 73 75 62 71 75 65 72 79  hen the subquery
329d0 0a 20 20 20 20 2a 2a 20 77 69 6c 6c 20 62 65 20  .    ** will be 
329e0 69 6d 70 6c 65 6d 65 6e 74 65 64 20 61 73 20 61  implemented as a
329f0 20 63 6f 2d 72 6f 75 74 69 6e 65 20 61 6e 64 20   co-routine and 
32a00 74 68 65 72 65 20 69 73 20 6e 6f 20 61 64 76 61  there is no adva
32a10 6e 74 61 67 65 20 74 6f 0a 20 20 20 20 2a 2a 20  ntage to.    ** 
32a20 66 6c 61 74 74 65 6e 69 6e 67 20 69 6e 20 74 68  flattening in th
32a30 61 74 20 63 61 73 65 2e 0a 20 20 20 20 2a 2f 0a  at case..    */.
32a40 20 20 20 20 69 66 28 20 28 70 53 75 62 2d 3e 73      if( (pSub->s
32a50 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 41 67 67  elFlags & SF_Agg
32a60 72 65 67 61 74 65 29 21 3d 30 20 29 20 63 6f 6e  regate)!=0 ) con
32a70 74 69 6e 75 65 3b 0a 20 20 20 20 61 73 73 65 72  tinue;.    asser
32a80 74 28 20 70 53 75 62 2d 3e 70 47 72 6f 75 70 42  t( pSub->pGroupB
32a90 79 3d 3d 30 20 29 3b 0a 0a 20 20 20 20 2f 2a 20  y==0 );..    /* 
32aa0 49 66 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  If the outer que
32ab0 72 79 20 63 6f 6e 74 61 69 6e 73 20 61 20 22 63  ry contains a "c
32ac0 6f 6d 70 6c 65 78 22 20 72 65 73 75 6c 74 20 73  omplex" result s
32ad0 65 74 20 28 74 68 61 74 20 69 73 2c 0a 20 20 20  et (that is,.   
32ae0 20 2a 2a 20 69 66 20 74 68 65 20 72 65 73 75 6c   ** if the resul
32af0 74 20 73 65 74 20 6f 66 20 74 68 65 20 6f 75 74  t set of the out
32b00 65 72 20 71 75 65 72 79 20 75 73 65 73 20 66 75  er query uses fu
32b10 6e 63 74 69 6f 6e 73 20 6f 72 20 73 75 62 71 75  nctions or subqu
32b20 65 72 69 65 73 29 0a 20 20 20 20 2a 2a 20 61 6e  eries).    ** an
32b30 64 20 69 66 20 74 68 65 20 73 75 62 71 75 65 72  d if the subquer
32b40 79 20 63 6f 6e 74 61 69 6e 73 20 61 6e 20 4f 52  y contains an OR
32b50 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 61 6e  DER BY clause an
32b60 64 20 69 66 0a 20 20 20 20 2a 2a 20 69 74 20 77  d if.    ** it w
32b70 69 6c 6c 20 62 65 20 69 6d 70 6c 65 6d 65 6e 74  ill be implement
32b80 65 64 20 61 73 20 61 20 63 6f 2d 72 6f 75 74 69  ed as a co-routi
32b90 6e 65 2c 20 74 68 65 6e 20 64 6f 20 6e 6f 74 20  ne, then do not 
32ba0 66 6c 61 74 74 65 6e 2e 20 20 54 68 69 73 0a 20  flatten.  This. 
32bb0 20 20 20 2a 2a 20 72 65 73 74 72 69 63 74 69 6f     ** restrictio
32bc0 6e 20 61 6c 6c 6f 77 73 20 53 51 4c 20 63 6f 6e  n allows SQL con
32bd0 73 74 72 75 63 74 73 20 6c 69 6b 65 20 74 68 69  structs like thi
32be0 73 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  s:.    **.    **
32bf0 20 20 53 45 4c 45 43 54 20 65 78 70 65 6e 73 69    SELECT expensi
32c00 76 65 5f 66 75 6e 63 74 69 6f 6e 28 78 29 0a 20  ve_function(x). 
32c10 20 20 20 2a 2a 20 20 20 20 46 52 4f 4d 20 28 53     **    FROM (S
32c20 45 4c 45 43 54 20 78 20 46 52 4f 4d 20 74 61 62  ELECT x FROM tab
32c30 20 4f 52 44 45 52 20 42 59 20 79 20 4c 49 4d 49   ORDER BY y LIMI
32c40 54 20 31 30 29 3b 0a 20 20 20 20 2a 2a 0a 20 20  T 10);.    **.  
32c50 20 20 2a 2a 20 54 68 65 20 65 78 70 65 6e 73 69    ** The expensi
32c60 76 65 5f 66 75 6e 63 74 69 6f 6e 28 29 20 69 73  ve_function() is
32c70 20 6f 6e 6c 79 20 63 6f 6d 70 75 74 65 64 20 6f   only computed o
32c80 6e 20 74 68 65 20 31 30 20 72 6f 77 73 20 74 68  n the 10 rows th
32c90 61 74 0a 20 20 20 20 2a 2a 20 61 72 65 20 6f 75  at.    ** are ou
32ca0 74 70 75 74 2c 20 72 61 74 68 65 72 20 74 68 61  tput, rather tha
32cb0 6e 20 65 76 65 72 79 20 72 6f 77 20 6f 66 20 74  n every row of t
32cc0 68 65 20 74 61 62 6c 65 2e 0a 20 20 20 20 2a 2a  he table..    **
32cd0 0a 20 20 20 20 2a 2a 20 54 68 65 20 72 65 71 75  .    ** The requ
32ce0 69 72 65 6d 65 6e 74 20 74 68 61 74 20 74 68 65  irement that the
32cf0 20 6f 75 74 65 72 20 71 75 65 72 79 20 68 61 76   outer query hav
32d00 65 20 61 20 63 6f 6d 70 6c 65 78 20 72 65 73 75  e a complex resu
32d10 6c 74 20 73 65 74 0a 20 20 20 20 2a 2a 20 6d 65  lt set.    ** me
32d20 61 6e 73 20 74 68 61 74 20 66 6c 61 74 74 65 6e  ans that flatten
32d30 69 6e 67 20 64 6f 65 73 20 6f 63 63 75 72 20 6f  ing does occur o
32d40 6e 20 73 69 6d 70 6c 65 72 20 53 51 4c 20 63 6f  n simpler SQL co
32d50 6e 73 74 72 61 69 6e 74 73 20 77 69 74 68 6f 75  nstraints withou
32d60 74 0a 20 20 20 20 2a 2a 20 74 68 65 20 65 78 70  t.    ** the exp
32d70 65 6e 73 69 76 65 5f 66 75 6e 63 74 69 6f 6e 28  ensive_function(
32d80 29 20 6c 69 6b 65 3a 0a 20 20 20 20 2a 2a 0a 20  ) like:.    **. 
32d90 20 20 20 2a 2a 20 20 53 45 4c 45 43 54 20 78 20     **  SELECT x 
32da0 46 52 4f 4d 20 28 53 45 4c 45 43 54 20 78 20 46  FROM (SELECT x F
32db0 52 4f 4d 20 74 61 62 20 4f 52 44 45 52 20 42 59  ROM tab ORDER BY
32dc0 20 79 20 4c 49 4d 49 54 20 31 30 29 3b 0a 20 20   y LIMIT 10);.  
32dd0 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 53 75    */.    if( pSu
32de0 62 2d 3e 70 4f 72 64 65 72 42 79 21 3d 30 0a 20  b->pOrderBy!=0. 
32df0 20 20 20 20 26 26 20 69 3d 3d 30 0a 20 20 20 20      && i==0.    
32e00 20 26 26 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73   && (p->selFlags
32e10 20 26 20 53 46 5f 43 6f 6d 70 6c 65 78 52 65 73   & SF_ComplexRes
32e20 75 6c 74 29 21 3d 30 0a 20 20 20 20 20 26 26 20  ult)!=0.     && 
32e30 28 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3d  (pTabList->nSrc=
32e40 3d 31 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 28  =1.         || (
32e50 70 54 61 62 4c 69 73 74 2d 3e 61 5b 31 5d 2e 66  pTabList->a[1].f
32e60 67 2e 6a 6f 69 6e 74 79 70 65 26 28 4a 54 5f 4c  g.jointype&(JT_L
32e70 45 46 54 7c 4a 54 5f 43 52 4f 53 53 29 29 21 3d  EFT|JT_CROSS))!=
32e80 30 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  0).    ){.      
32e90 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a  continue;.    }.
32ea0 0a 20 20 20 20 69 66 28 20 66 6c 61 74 74 65 6e  .    if( flatten
32eb0 53 75 62 71 75 65 72 79 28 70 50 61 72 73 65 2c  Subquery(pParse,
32ec0 20 70 2c 20 69 2c 20 69 73 41 67 67 29 20 29 7b   p, i, isAgg) ){
32ed0 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 72 73  .      if( pPars
32ee0 65 2d 3e 6e 45 72 72 20 29 20 67 6f 74 6f 20 73  e->nErr ) goto s
32ef0 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20  elect_end;.     
32f00 20 2f 2a 20 54 68 69 73 20 73 75 62 71 75 65 72   /* This subquer
32f10 79 20 63 61 6e 20 62 65 20 61 62 73 6f 72 62 65  y can be absorbe
32f20 64 20 69 6e 74 6f 20 69 74 73 20 70 61 72 65 6e  d into its paren
32f30 74 2e 20 2a 2f 0a 20 20 20 20 20 20 69 20 3d 20  t. */.      i = 
32f40 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 54  -1;.    }.    pT
32f50 61 62 4c 69 73 74 20 3d 20 70 2d 3e 70 53 72 63  abList = p->pSrc
32f60 3b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61  ;.    if( db->ma
32f70 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 67 6f 74  llocFailed ) got
32f80 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  o select_end;.  
32f90 20 20 69 66 28 20 21 49 67 6e 6f 72 61 62 6c 65    if( !Ignorable
32fa0 4f 72 64 65 72 62 79 28 70 44 65 73 74 29 20 29  Orderby(pDest) )
32fb0 7b 0a 20 20 20 20 20 20 73 53 6f 72 74 2e 70 4f  {.      sSort.pO
32fc0 72 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64  rderBy = p->pOrd
32fd0 65 72 42 79 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  erBy;.    }.  }.
32fe0 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20  #endif..#ifndef 
32ff0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50  SQLITE_OMIT_COMP
33000 4f 55 4e 44 5f 53 45 4c 45 43 54 0a 20 20 2f 2a  OUND_SELECT.  /*
33010 20 48 61 6e 64 6c 65 20 63 6f 6d 70 6f 75 6e 64   Handle compound
33020 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
33030 74 73 20 75 73 69 6e 67 20 74 68 65 20 73 65 70  ts using the sep
33040 61 72 61 74 65 20 6d 75 6c 74 69 53 65 6c 65 63  arate multiSelec
33050 74 28 29 0a 20 20 2a 2a 20 70 72 6f 63 65 64 75  t().  ** procedu
33060 72 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  re..  */.  if( p
33070 2d 3e 70 50 72 69 6f 72 20 29 7b 0a 20 20 20 20  ->pPrior ){.    
33080 72 63 20 3d 20 6d 75 6c 74 69 53 65 6c 65 63 74  rc = multiSelect
33090 28 70 50 61 72 73 65 2c 20 70 2c 20 70 44 65 73  (pParse, p, pDes
330a0 74 29 3b 0a 23 69 66 20 53 45 4c 45 43 54 54 52  t);.#if SELECTTR
330b0 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20 20 20  ACE_ENABLED.    
330c0 53 45 4c 45 43 54 54 52 41 43 45 28 30 78 31 2c  SELECTTRACE(0x1,
330d0 70 50 61 72 73 65 2c 70 2c 28 22 65 6e 64 20 63  pParse,p,("end c
330e0 6f 6d 70 6f 75 6e 64 2d 73 65 6c 65 63 74 20 70  ompound-select p
330f0 72 6f 63 65 73 73 69 6e 67 5c 6e 22 29 29 3b 0a  rocessing\n"));.
33100 20 20 20 20 69 66 28 20 28 73 71 6c 69 74 65 33      if( (sqlite3
33110 53 65 6c 65 63 74 54 72 61 63 65 20 26 20 30 78  SelectTrace & 0x
33120 32 30 30 30 29 21 3d 30 20 26 26 20 45 78 70 6c  2000)!=0 && Expl
33130 61 69 6e 51 75 65 72 79 50 6c 61 6e 50 61 72 65  ainQueryPlanPare
33140 6e 74 28 70 50 61 72 73 65 29 3d 3d 30 20 29 7b  nt(pParse)==0 ){
33150 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 54 72  .      sqlite3Tr
33160 65 65 56 69 65 77 53 65 6c 65 63 74 28 30 2c 20  eeViewSelect(0, 
33170 70 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 23 65 6e  p, 0);.    }.#en
33180 64 69 66 0a 20 20 20 20 69 66 28 20 70 2d 3e 70  dif.    if( p->p
33190 4e 65 78 74 3d 3d 30 20 29 20 45 78 70 6c 61 69  Next==0 ) Explai
331a0 6e 51 75 65 72 79 50 6c 61 6e 50 6f 70 28 70 50  nQueryPlanPop(pP
331b0 61 72 73 65 29 3b 0a 20 20 20 20 72 65 74 75 72  arse);.    retur
331c0 6e 20 72 63 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  n rc;.  }.#endif
331d0 0a 0a 20 20 2f 2a 20 44 6f 20 74 68 65 20 57 48  ..  /* Do the WH
331e0 45 52 45 2d 63 6c 61 75 73 65 20 63 6f 6e 73 74  ERE-clause const
331f0 61 6e 74 20 70 72 6f 70 61 67 61 74 69 6f 6e 20  ant propagation 
33200 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69 66 20  optimization if 
33210 74 68 69 73 20 69 73 0a 20 20 2a 2a 20 61 20 6a  this is.  ** a j
33220 6f 69 6e 2e 20 20 4e 6f 20 6e 65 65 64 20 74 6f  oin.  No need to
33230 20 73 70 65 65 64 20 74 69 6d 65 20 6f 6e 20 74   speed time on t
33240 68 69 73 20 6f 70 65 72 61 74 69 6f 6e 20 66 6f  his operation fo
33250 72 20 6e 6f 6e 2d 6a 6f 69 6e 20 71 75 65 72 69  r non-join queri
33260 65 73 0a 20 20 2a 2a 20 61 73 20 74 68 65 20 65  es.  ** as the e
33270 71 75 69 76 61 6c 65 6e 74 20 6f 70 74 69 6d 69  quivalent optimi
33280 7a 61 74 69 6f 6e 20 77 69 6c 6c 20 62 65 20 68  zation will be h
33290 61 6e 64 6c 65 64 20 62 79 20 71 75 65 72 79 20  andled by query 
332a0 70 6c 61 6e 6e 65 72 20 69 6e 0a 20 20 2a 2a 20  planner in.  ** 
332b0 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69  sqlite3WhereBegi
332c0 6e 28 29 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  n()..  */.  if( 
332d0 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3e 31  pTabList->nSrc>1
332e0 0a 20 20 20 26 26 20 4f 70 74 69 6d 69 7a 61 74  .   && Optimizat
332f0 69 6f 6e 45 6e 61 62 6c 65 64 28 64 62 2c 20 53  ionEnabled(db, S
33300 51 4c 49 54 45 5f 50 72 6f 70 61 67 61 74 65 43  QLITE_PropagateC
33310 6f 6e 73 74 29 0a 20 20 20 26 26 20 70 72 6f 70  onst).   && prop
33320 61 67 61 74 65 43 6f 6e 73 74 61 6e 74 73 28 70  agateConstants(p
33330 50 61 72 73 65 2c 20 70 29 0a 20 20 29 7b 0a 23  Parse, p).  ){.#
33340 69 66 20 53 45 4c 45 43 54 54 52 41 43 45 5f 45  if SELECTTRACE_E
33350 4e 41 42 4c 45 44 0a 20 20 20 20 69 66 28 20 73  NABLED.    if( s
33360 71 6c 69 74 65 33 53 65 6c 65 63 74 54 72 61 63  qlite3SelectTrac
33370 65 20 26 20 30 78 31 30 30 20 29 7b 0a 20 20 20  e & 0x100 ){.   
33380 20 20 20 53 45 4c 45 43 54 54 52 41 43 45 28 30     SELECTTRACE(0
33390 78 31 30 30 2c 70 50 61 72 73 65 2c 70 2c 28 22  x100,pParse,p,("
333a0 41 66 74 65 72 20 63 6f 6e 73 74 61 6e 74 20 70  After constant p
333b0 72 6f 70 61 67 61 74 69 6f 6e 3a 5c 6e 22 29 29  ropagation:\n"))
333c0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 54  ;.      sqlite3T
333d0 72 65 65 56 69 65 77 53 65 6c 65 63 74 28 30 2c  reeViewSelect(0,
333e0 20 70 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 23 65   p, 0);.    }.#e
333f0 6e 64 69 66 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ndif.  }else{.  
33400 20 20 53 45 4c 45 43 54 54 52 41 43 45 28 30 78    SELECTTRACE(0x
33410 31 30 30 2c 70 50 61 72 73 65 2c 70 2c 28 22 43  100,pParse,p,("C
33420 6f 6e 73 74 61 6e 74 20 70 72 6f 70 61 67 61 74  onstant propagat
33430 69 6f 6e 20 6e 6f 74 20 68 65 6c 70 66 75 6c 5c  ion not helpful\
33440 6e 22 29 29 3b 0a 20 20 7d 0a 0a 23 69 66 64 65  n"));.  }..#ifde
33450 66 20 53 51 4c 49 54 45 5f 43 4f 55 4e 54 4f 46  f SQLITE_COUNTOF
33460 56 49 45 57 5f 4f 50 54 49 4d 49 5a 41 54 49 4f  VIEW_OPTIMIZATIO
33470 4e 0a 20 20 69 66 28 20 4f 70 74 69 6d 69 7a 61  N.  if( Optimiza
33480 74 69 6f 6e 45 6e 61 62 6c 65 64 28 64 62 2c 20  tionEnabled(db, 
33490 53 51 4c 49 54 45 5f 51 75 65 72 79 46 6c 61 74  SQLITE_QueryFlat
334a0 74 65 6e 65 72 7c 53 51 4c 49 54 45 5f 43 6f 75  tener|SQLITE_Cou
334b0 6e 74 4f 66 56 69 65 77 29 0a 20 20 20 26 26 20  ntOfView).   && 
334c0 63 6f 75 6e 74 4f 66 56 69 65 77 4f 70 74 69 6d  countOfViewOptim
334d0 69 7a 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20  ization(pParse, 
334e0 70 29 0a 20 20 29 7b 0a 20 20 20 20 69 66 28 20  p).  ){.    if( 
334f0 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
33500 20 29 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65   ) goto select_e
33510 6e 64 3b 0a 20 20 20 20 70 45 4c 69 73 74 20 3d  nd;.    pEList =
33520 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 20 20   p->pEList;.    
33530 70 54 61 62 4c 69 73 74 20 3d 20 70 2d 3e 70 53  pTabList = p->pS
33540 72 63 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  rc;.  }.#endif..
33550 20 20 2f 2a 20 46 6f 72 20 65 61 63 68 20 74 65    /* For each te
33560 72 6d 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63  rm in the FROM c
33570 6c 61 75 73 65 2c 20 64 6f 20 74 77 6f 20 74 68  lause, do two th
33580 69 6e 67 73 3a 0a 20 20 2a 2a 20 28 31 29 20 41  ings:.  ** (1) A
33590 75 74 68 6f 72 69 7a 65 64 20 75 6e 72 65 66 65  uthorized unrefe
335a0 72 65 6e 63 65 64 20 74 61 62 6c 65 73 0a 20 20  renced tables.  
335b0 2a 2a 20 28 32 29 20 47 65 6e 65 72 61 74 65 20  ** (2) Generate 
335c0 63 6f 64 65 20 66 6f 72 20 61 6c 6c 20 73 75 62  code for all sub
335d0 2d 71 75 65 72 69 65 73 0a 20 20 2a 2f 0a 20 20  -queries.  */.  
335e0 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54 61 62 4c  for(i=0; i<pTabL
335f0 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b  ist->nSrc; i++){
33600 0a 20 20 20 20 73 74 72 75 63 74 20 53 72 63 4c  .    struct SrcL
33610 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20  ist_item *pItem 
33620 3d 20 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69  = &pTabList->a[i
33630 5d 3b 0a 20 20 20 20 53 65 6c 65 63 74 44 65 73  ];.    SelectDes
33640 74 20 64 65 73 74 3b 0a 20 20 20 20 53 65 6c 65  t dest;.    Sele
33650 63 74 20 2a 70 53 75 62 3b 0a 23 69 66 20 21 64  ct *pSub;.#if !d
33660 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
33670 49 54 5f 53 55 42 51 55 45 52 59 29 20 7c 7c 20  IT_SUBQUERY) || 
33680 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
33690 4f 4d 49 54 5f 56 49 45 57 29 0a 20 20 20 20 63  OMIT_VIEW).    c
336a0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 61 76 65  onst char *zSave
336b0 64 41 75 74 68 43 6f 6e 74 65 78 74 3b 0a 23 65  dAuthContext;.#e
336c0 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 49 73 73  ndif..    /* Iss
336d0 75 65 20 53 51 4c 49 54 45 5f 52 45 41 44 20 61  ue SQLITE_READ a
336e0 75 74 68 6f 72 69 7a 61 74 69 6f 6e 73 20 77 69  uthorizations wi
336f0 74 68 20 61 20 66 61 6b 65 20 63 6f 6c 75 6d 6e  th a fake column
33700 20 6e 61 6d 65 20 66 6f 72 20 61 6e 79 0a 20 20   name for any.  
33710 20 20 2a 2a 20 74 61 62 6c 65 73 20 74 68 61 74    ** tables that
33720 20 61 72 65 20 72 65 66 65 72 65 6e 63 65 64 20   are referenced 
33730 62 75 74 20 66 72 6f 6d 20 77 68 69 63 68 20 6e  but from which n
33740 6f 20 76 61 6c 75 65 73 20 61 72 65 20 65 78 74  o values are ext
33750 72 61 63 74 65 64 2e 0a 20 20 20 20 2a 2a 20 45  racted..    ** E
33760 78 61 6d 70 6c 65 73 20 6f 66 20 77 68 65 72 65  xamples of where
33770 20 74 68 65 73 65 20 6b 69 6e 64 73 20 6f 66 20   these kinds of 
33780 6e 75 6c 6c 20 53 51 4c 49 54 45 5f 52 45 41 44  null SQLITE_READ
33790 20 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e 73 0a   authorizations.
337a0 20 20 20 20 2a 2a 20 77 6f 75 6c 64 20 6f 63 63      ** would occ
337b0 75 72 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  ur:.    **.    *
337c0 2a 20 20 20 20 20 53 45 4c 45 43 54 20 63 6f 75  *     SELECT cou
337d0 6e 74 28 2a 29 20 46 52 4f 4d 20 74 31 3b 20 20  nt(*) FROM t1;  
337e0 20 2d 2d 20 53 51 4c 49 54 45 5f 52 45 41 44 20   -- SQLITE_READ 
337f0 74 31 2e 22 22 0a 20 20 20 20 2a 2a 20 20 20 20  t1."".    **    
33800 20 53 45 4c 45 43 54 20 74 31 2e 2a 20 46 52 4f   SELECT t1.* FRO
33810 4d 20 74 31 2c 20 74 32 3b 20 20 20 2d 2d 20 53  M t1, t2;   -- S
33820 51 4c 49 54 45 5f 52 45 41 44 20 74 32 2e 22 22  QLITE_READ t2.""
33830 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54  .    **.    ** T
33840 68 65 20 66 61 6b 65 20 63 6f 6c 75 6d 6e 20 6e  he fake column n
33850 61 6d 65 20 69 73 20 61 6e 20 65 6d 70 74 79 20  ame is an empty 
33860 73 74 72 69 6e 67 2e 20 20 49 74 20 69 73 20 70  string.  It is p
33870 6f 73 73 69 62 6c 65 20 66 6f 72 20 61 20 74 61  ossible for a ta
33880 62 6c 65 20 74 6f 0a 20 20 20 20 2a 2a 20 68 61  ble to.    ** ha
33890 76 65 20 61 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65  ve a column name
338a0 64 20 62 79 20 74 68 65 20 65 6d 70 74 79 20 73  d by the empty s
338b0 74 72 69 6e 67 2c 20 69 6e 20 77 68 69 63 68 20  tring, in which 
338c0 63 61 73 65 20 74 68 65 72 65 20 69 73 20 6e 6f  case there is no
338d0 20 77 61 79 20 74 6f 0a 20 20 20 20 2a 2a 20 64   way to.    ** d
338e0 69 73 74 69 6e 67 75 69 73 68 20 62 65 74 77 65  istinguish betwe
338f0 65 6e 20 61 6e 20 75 6e 72 65 66 65 72 65 6e 63  en an unreferenc
33900 65 64 20 74 61 62 6c 65 20 61 6e 64 20 61 6e 20  ed table and an 
33910 61 63 74 75 61 6c 20 72 65 66 65 72 65 6e 63 65  actual reference
33920 20 74 6f 20 74 68 65 0a 20 20 20 20 2a 2a 20 22   to the.    ** "
33930 22 20 63 6f 6c 75 6d 6e 2e 20 54 68 65 20 6f 72  " column. The or
33940 69 67 69 6e 61 6c 20 64 65 73 69 67 6e 20 77 61  iginal design wa
33950 73 20 66 6f 72 20 74 68 65 20 66 61 6b 65 20 63  s for the fake c
33960 6f 6c 75 6d 6e 20 6e 61 6d 65 20 74 6f 20 62 65  olumn name to be
33970 20 61 20 4e 55 4c 4c 2c 0a 20 20 20 20 2a 2a 20   a NULL,.    ** 
33980 77 68 69 63 68 20 77 6f 75 6c 64 20 62 65 20 75  which would be u
33990 6e 61 6d 62 69 67 75 6f 75 73 2e 20 20 42 75 74  nambiguous.  But
339a0 20 6c 65 67 61 63 79 20 61 75 74 68 6f 72 69 7a   legacy authoriz
339b0 61 74 69 6f 6e 20 63 61 6c 6c 62 61 63 6b 73 20  ation callbacks 
339c0 6d 69 67 68 74 0a 20 20 20 20 2a 2a 20 61 73 73  might.    ** ass
339d0 75 6d 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e  ume the column n
339e0 61 6d 65 20 69 73 20 6e 6f 6e 2d 4e 55 4c 4c 20  ame is non-NULL 
339f0 61 6e 64 20 73 65 67 66 61 75 6c 74 2e 20 20 54  and segfault.  T
33a00 68 65 20 75 73 65 20 6f 66 20 61 6e 20 65 6d 70  he use of an emp
33a10 74 79 0a 20 20 20 20 2a 2a 20 73 74 72 69 6e 67  ty.    ** string
33a20 20 66 6f 72 20 74 68 65 20 66 61 6b 65 20 63 6f   for the fake co
33a30 6c 75 6d 6e 20 6e 61 6d 65 20 73 65 65 6d 73 20  lumn name seems 
33a40 73 61 66 65 72 2e 0a 20 20 20 20 2a 2f 0a 20 20  safer..    */.  
33a50 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 63 6f 6c    if( pItem->col
33a60 55 73 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Used==0 ){.     
33a70 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63   sqlite3AuthChec
33a80 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45  k(pParse, SQLITE
33a90 5f 52 45 41 44 2c 20 70 49 74 65 6d 2d 3e 7a 4e  _READ, pItem->zN
33aa0 61 6d 65 2c 20 22 22 2c 20 70 49 74 65 6d 2d 3e  ame, "", pItem->
33ab0 7a 44 61 74 61 62 61 73 65 29 3b 0a 20 20 20 20  zDatabase);.    
33ac0 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  }..#if !defined(
33ad0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
33ae0 55 45 52 59 29 20 7c 7c 20 21 64 65 66 69 6e 65  UERY) || !define
33af0 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  d(SQLITE_OMIT_VI
33b00 45 57 29 0a 20 20 20 20 2f 2a 20 47 65 6e 65 72  EW).    /* Gener
33b10 61 74 65 20 63 6f 64 65 20 66 6f 72 20 61 6c 6c  ate code for all
33b20 20 73 75 62 2d 71 75 65 72 69 65 73 20 69 6e 20   sub-queries in 
33b30 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 0a  the FROM clause.
33b40 20 20 20 20 2a 2f 0a 20 20 20 20 70 53 75 62 20      */.    pSub 
33b50 3d 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74  = pItem->pSelect
33b60 3b 0a 20 20 20 20 69 66 28 20 70 53 75 62 3d 3d  ;.    if( pSub==
33b70 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 0a 20  0 ) continue;.. 
33b80 20 20 20 2f 2a 20 54 68 65 20 63 6f 64 65 20 66     /* The code f
33b90 6f 72 20 61 20 73 75 62 71 75 65 72 79 20 73 68  or a subquery sh
33ba0 6f 75 6c 64 20 6f 6e 6c 79 20 62 65 20 67 65 6e  ould only be gen
33bb0 65 72 61 74 65 64 20 6f 6e 63 65 2c 20 74 68 6f  erated once, tho
33bc0 75 67 68 20 69 74 20 69 73 0a 20 20 20 20 2a 2a  ugh it is.    **
33bd0 20 74 65 63 68 6e 69 63 61 6c 6c 79 20 68 61 72   technically har
33be0 6d 6c 65 73 73 20 66 6f 72 20 69 74 20 74 6f 20  mless for it to 
33bf0 62 65 20 67 65 6e 65 72 61 74 65 64 20 6d 75 6c  be generated mul
33c00 74 69 70 6c 65 20 74 69 6d 65 73 2e 20 54 68 65  tiple times. The
33c10 0a 20 20 20 20 2a 2a 20 66 6f 6c 6c 6f 77 69 6e  .    ** followin
33c20 67 20 61 73 73 65 72 74 28 29 20 77 69 6c 6c 20  g assert() will 
33c30 64 65 74 65 63 74 20 69 66 20 73 6f 6d 65 74 68  detect if someth
33c40 69 6e 67 20 63 68 61 6e 67 65 73 20 74 6f 20 63  ing changes to c
33c50 61 75 73 65 0a 20 20 20 20 2a 2a 20 74 68 65 20  ause.    ** the 
33c60 73 61 6d 65 20 73 75 62 71 75 65 72 79 20 74 6f  same subquery to
33c70 20 62 65 20 63 6f 64 65 64 20 6d 75 6c 74 69 70   be coded multip
33c80 6c 65 20 74 69 6d 65 73 2c 20 61 73 20 61 20 73  le times, as a s
33c90 69 67 6e 61 6c 20 74 6f 20 74 68 65 0a 20 20 20  ignal to the.   
33ca0 20 2a 2a 20 64 65 76 65 6c 6f 70 65 72 73 20 74   ** developers t
33cb0 6f 20 74 72 79 20 74 6f 20 6f 70 74 69 6d 69 7a  o try to optimiz
33cc0 65 20 74 68 65 20 73 69 74 75 61 74 69 6f 6e 2e  e the situation.
33cd0 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
33ce0 70 49 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53  pItem->addrFillS
33cf0 75 62 3d 3d 30 20 29 3b 0a 0a 20 20 20 20 2f 2a  ub==0 );..    /*
33d00 20 49 6e 63 72 65 6d 65 6e 74 20 50 61 72 73 65   Increment Parse
33d10 2e 6e 48 65 69 67 68 74 20 62 79 20 74 68 65 20  .nHeight by the 
33d20 68 65 69 67 68 74 20 6f 66 20 74 68 65 20 6c 61  height of the la
33d30 72 67 65 73 74 20 65 78 70 72 65 73 73 69 6f 6e  rgest expression
33d40 0a 20 20 20 20 2a 2a 20 74 72 65 65 20 72 65 66  .    ** tree ref
33d50 65 72 72 65 64 20 74 6f 20 62 79 20 74 68 69 73  erred to by this
33d60 2c 20 74 68 65 20 70 61 72 65 6e 74 20 73 65 6c  , the parent sel
33d70 65 63 74 2e 20 54 68 65 20 63 68 69 6c 64 20 73  ect. The child s
33d80 65 6c 65 63 74 0a 20 20 20 20 2a 2a 20 6d 61 79  elect.    ** may
33d90 20 63 6f 6e 74 61 69 6e 20 65 78 70 72 65 73 73   contain express
33da0 69 6f 6e 20 74 72 65 65 73 20 6f 66 20 61 74 20  ion trees of at 
33db0 6d 6f 73 74 0a 20 20 20 20 2a 2a 20 28 53 51 4c  most.    ** (SQL
33dc0 49 54 45 5f 4d 41 58 5f 45 58 50 52 5f 44 45 50  ITE_MAX_EXPR_DEP
33dd0 54 48 2d 50 61 72 73 65 2e 6e 48 65 69 67 68 74  TH-Parse.nHeight
33de0 29 20 68 65 69 67 68 74 2e 20 54 68 69 73 20 69  ) height. This i
33df0 73 20 61 20 62 69 74 0a 20 20 20 20 2a 2a 20 6d  s a bit.    ** m
33e00 6f 72 65 20 63 6f 6e 73 65 72 76 61 74 69 76 65  ore conservative
33e10 20 74 68 61 6e 20 6e 65 63 65 73 73 61 72 79 2c   than necessary,
33e20 20 62 75 74 20 6d 75 63 68 20 65 61 73 69 65 72   but much easier
33e30 20 74 68 61 6e 20 65 6e 66 6f 72 63 69 6e 67 0a   than enforcing.
33e40 20 20 20 20 2a 2a 20 61 6e 20 65 78 61 63 74 20      ** an exact 
33e50 6c 69 6d 69 74 2e 0a 20 20 20 20 2a 2f 0a 20 20  limit..    */.  
33e60 20 20 70 50 61 72 73 65 2d 3e 6e 48 65 69 67 68    pParse->nHeigh
33e70 74 20 2b 3d 20 73 71 6c 69 74 65 33 53 65 6c 65  t += sqlite3Sele
33e80 63 74 45 78 70 72 48 65 69 67 68 74 28 70 29 3b  ctExprHeight(p);
33e90 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 20 63 6f  ..    /* Make co
33ea0 70 69 65 73 20 6f 66 20 63 6f 6e 73 74 61 6e 74  pies of constant
33eb0 20 57 48 45 52 45 2d 63 6c 61 75 73 65 20 74 65   WHERE-clause te
33ec0 72 6d 73 20 69 6e 20 74 68 65 20 6f 75 74 65 72  rms in the outer
33ed0 20 71 75 65 72 79 20 64 6f 77 6e 0a 20 20 20 20   query down.    
33ee0 2a 2a 20 69 6e 73 69 64 65 20 74 68 65 20 73 75  ** inside the su
33ef0 62 71 75 65 72 79 2e 20 20 54 68 69 73 20 63 61  bquery.  This ca
33f00 6e 20 68 65 6c 70 20 74 68 65 20 73 75 62 71 75  n help the subqu
33f10 65 72 79 20 74 6f 20 72 75 6e 20 6d 6f 72 65 20  ery to run more 
33f20 65 66 66 69 63 69 65 6e 74 6c 79 2e 0a 20 20 20  efficiently..   
33f30 20 2a 2f 0a 20 20 20 20 69 66 28 20 4f 70 74 69   */.    if( Opti
33f40 6d 69 7a 61 74 69 6f 6e 45 6e 61 62 6c 65 64 28  mizationEnabled(
33f50 64 62 2c 20 53 51 4c 49 54 45 5f 50 75 73 68 44  db, SQLITE_PushD
33f60 6f 77 6e 29 0a 20 20 20 20 20 26 26 20 70 75 73  own).     && pus
33f70 68 44 6f 77 6e 57 68 65 72 65 54 65 72 6d 73 28  hDownWhereTerms(
33f80 70 50 61 72 73 65 2c 20 70 53 75 62 2c 20 70 2d  pParse, pSub, p-
33f90 3e 70 57 68 65 72 65 2c 20 70 49 74 65 6d 2d 3e  >pWhere, pItem->
33fa0 69 43 75 72 73 6f 72 2c 0a 20 20 20 20 20 20 20  iCursor,.       
33fb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33fc0 20 20 20 20 28 70 49 74 65 6d 2d 3e 66 67 2e 6a      (pItem->fg.j
33fd0 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 4f 55 54  ointype & JT_OUT
33fe0 45 52 29 21 3d 30 29 0a 20 20 20 20 29 7b 0a 23  ER)!=0).    ){.#
33ff0 69 66 20 53 45 4c 45 43 54 54 52 41 43 45 5f 45  if SELECTTRACE_E
34000 4e 41 42 4c 45 44 0a 20 20 20 20 20 20 69 66 28  NABLED.      if(
34010 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 54 72   sqlite3SelectTr
34020 61 63 65 20 26 20 30 78 31 30 30 20 29 7b 0a 20  ace & 0x100 ){. 
34030 20 20 20 20 20 20 20 53 45 4c 45 43 54 54 52 41         SELECTTRA
34040 43 45 28 30 78 31 30 30 2c 70 50 61 72 73 65 2c  CE(0x100,pParse,
34050 70 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 28  p,.            (
34060 22 41 66 74 65 72 20 57 48 45 52 45 2d 63 6c 61  "After WHERE-cla
34070 75 73 65 20 70 75 73 68 2d 64 6f 77 6e 20 69 6e  use push-down in
34080 74 6f 20 73 75 62 71 75 65 72 79 20 25 64 3a 5c  to subquery %d:\
34090 6e 22 2c 20 70 53 75 62 2d 3e 73 65 6c 49 64 29  n", pSub->selId)
340a0 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
340b0 65 33 54 72 65 65 56 69 65 77 53 65 6c 65 63 74  e3TreeViewSelect
340c0 28 30 2c 20 70 2c 20 30 29 3b 0a 20 20 20 20 20  (0, p, 0);.     
340d0 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 65   }.#endif.    }e
340e0 6c 73 65 7b 0a 20 20 20 20 20 20 53 45 4c 45 43  lse{.      SELEC
340f0 54 54 52 41 43 45 28 30 78 31 30 30 2c 70 50 61  TTRACE(0x100,pPa
34100 72 73 65 2c 70 2c 28 22 50 75 73 68 2d 64 6f 77  rse,p,("Push-dow
34110 6e 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 5c 6e  n not possible\n
34120 22 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  "));.    }..    
34130 7a 53 61 76 65 64 41 75 74 68 43 6f 6e 74 65 78  zSavedAuthContex
34140 74 20 3d 20 70 50 61 72 73 65 2d 3e 7a 41 75 74  t = pParse->zAut
34150 68 43 6f 6e 74 65 78 74 3b 0a 20 20 20 20 70 50  hContext;.    pP
34160 61 72 73 65 2d 3e 7a 41 75 74 68 43 6f 6e 74 65  arse->zAuthConte
34170 78 74 20 3d 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d  xt = pItem->zNam
34180 65 3b 0a 0a 20 20 20 20 2f 2a 20 47 65 6e 65 72  e;..    /* Gener
34190 61 74 65 20 63 6f 64 65 20 74 6f 20 69 6d 70 6c  ate code to impl
341a0 65 6d 65 6e 74 20 74 68 65 20 73 75 62 71 75 65  ement the subque
341b0 72 79 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  ry.    **.    **
341c0 20 54 68 65 20 73 75 62 71 75 65 72 79 20 69 73   The subquery is
341d0 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 61 73 20   implemented as 
341e0 61 20 63 6f 2d 72 6f 75 74 69 6e 65 20 69 66 20  a co-routine if 
341f0 74 68 65 20 73 75 62 71 75 65 72 79 20 69 73 0a  the subquery is.
34200 20 20 20 20 2a 2a 20 67 75 61 72 61 6e 74 65 65      ** guarantee
34210 64 20 74 6f 20 62 65 20 74 68 65 20 6f 75 74 65  d to be the oute
34220 72 20 6c 6f 6f 70 20 28 73 6f 20 74 68 61 74 20  r loop (so that 
34230 69 74 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64  it does not need
34240 20 74 6f 20 62 65 0a 20 20 20 20 2a 2a 20 63 6f   to be.    ** co
34250 6d 70 75 74 65 64 20 6d 6f 72 65 20 74 68 61 6e  mputed more than
34260 20 6f 6e 63 65 29 0a 20 20 20 20 2a 2a 0a 20 20   once).    **.  
34270 20 20 2a 2a 20 54 4f 44 4f 3a 20 41 72 65 20 74    ** TODO: Are t
34280 68 65 72 65 20 6f 74 68 65 72 20 72 65 61 73 6f  here other reaso
34290 6e 73 20 62 65 73 69 64 65 20 28 31 29 20 74 6f  ns beside (1) to
342a0 20 75 73 65 20 61 20 63 6f 2d 72 6f 75 74 69 6e   use a co-routin
342b0 65 0a 20 20 20 20 2a 2a 20 69 6d 70 6c 65 6d 65  e.    ** impleme
342c0 6e 74 61 74 69 6f 6e 3f 0a 20 20 20 20 2a 2f 0a  ntation?.    */.
342d0 20 20 20 20 69 66 28 20 69 3d 3d 30 0a 20 20 20      if( i==0.   
342e0 20 20 26 26 20 28 70 54 61 62 4c 69 73 74 2d 3e    && (pTabList->
342f0 6e 53 72 63 3d 3d 31 0a 20 20 20 20 20 20 20 20  nSrc==1.        
34300 20 20 20 20 7c 7c 20 28 70 54 61 62 4c 69 73 74      || (pTabList
34310 2d 3e 61 5b 31 5d 2e 66 67 2e 6a 6f 69 6e 74 79  ->a[1].fg.jointy
34320 70 65 26 28 4a 54 5f 4c 45 46 54 7c 4a 54 5f 43  pe&(JT_LEFT|JT_C
34330 52 4f 53 53 29 29 21 3d 30 29 20 20 2f 2a 20 28  ROSS))!=0)  /* (
34340 31 29 20 2a 2f 0a 20 20 20 20 29 7b 0a 20 20 20  1) */.    ){.   
34350 20 20 20 2f 2a 20 49 6d 70 6c 65 6d 65 6e 74 20     /* Implement 
34360 61 20 63 6f 2d 72 6f 75 74 69 6e 65 20 74 68 61  a co-routine tha
34370 74 20 77 69 6c 6c 20 72 65 74 75 72 6e 20 61 20  t will return a 
34380 73 69 6e 67 6c 65 20 72 6f 77 20 6f 66 20 74 68  single row of th
34390 65 20 72 65 73 75 6c 74 0a 20 20 20 20 20 20 2a  e result.      *
343a0 2a 20 73 65 74 20 6f 6e 20 65 61 63 68 20 69 6e  * set on each in
343b0 76 6f 63 61 74 69 6f 6e 2e 0a 20 20 20 20 20 20  vocation..      
343c0 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64  */.      int add
343d0 72 54 6f 70 20 3d 20 73 71 6c 69 74 65 33 56 64  rTop = sqlite3Vd
343e0 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
343f0 2b 31 3b 0a 20 20 20 20 20 0a 20 20 20 20 20 20  +1;.     .      
34400 70 49 74 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e  pItem->regReturn
34410 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
34420 6d 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  m;.      sqlite3
34430 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
34440 5f 49 6e 69 74 43 6f 72 6f 75 74 69 6e 65 2c 20  _InitCoroutine, 
34450 70 49 74 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e  pItem->regReturn
34460 2c 20 30 2c 20 61 64 64 72 54 6f 70 29 3b 0a 20  , 0, addrTop);. 
34470 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
34480 28 28 76 2c 20 22 25 73 22 2c 20 70 49 74 65 6d  ((v, "%s", pItem
34490 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 29 3b  ->pTab->zName));
344a0 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 61 64  .      pItem->ad
344b0 64 72 46 69 6c 6c 53 75 62 20 3d 20 61 64 64 72  drFillSub = addr
344c0 54 6f 70 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  Top;.      sqlit
344d0 65 33 53 65 6c 65 63 74 44 65 73 74 49 6e 69 74  e3SelectDestInit
344e0 28 26 64 65 73 74 2c 20 53 52 54 5f 43 6f 72 6f  (&dest, SRT_Coro
344f0 75 74 69 6e 65 2c 20 70 49 74 65 6d 2d 3e 72 65  utine, pItem->re
34500 67 52 65 74 75 72 6e 29 3b 0a 20 20 20 20 20 20  gReturn);.      
34510 45 78 70 6c 61 69 6e 51 75 65 72 79 50 6c 61 6e  ExplainQueryPlan
34520 28 28 70 50 61 72 73 65 2c 20 31 2c 20 22 43 4f  ((pParse, 1, "CO
34530 2d 52 4f 55 54 49 4e 45 20 25 75 22 2c 20 70 53  -ROUTINE %u", pS
34540 75 62 2d 3e 73 65 6c 49 64 29 29 3b 0a 20 20 20  ub->selId));.   
34550 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74     sqlite3Select
34560 28 70 50 61 72 73 65 2c 20 70 53 75 62 2c 20 26  (pParse, pSub, &
34570 64 65 73 74 29 3b 0a 20 20 20 20 20 20 70 49 74  dest);.      pIt
34580 65 6d 2d 3e 70 54 61 62 2d 3e 6e 52 6f 77 4c 6f  em->pTab->nRowLo
34590 67 45 73 74 20 3d 20 70 53 75 62 2d 3e 6e 53 65  gEst = pSub->nSe
345a0 6c 65 63 74 52 6f 77 3b 0a 20 20 20 20 20 20 70  lectRow;.      p
345b0 49 74 65 6d 2d 3e 66 67 2e 76 69 61 43 6f 72 6f  Item->fg.viaCoro
345c0 75 74 69 6e 65 20 3d 20 31 3b 0a 20 20 20 20 20  utine = 1;.     
345d0 20 70 49 74 65 6d 2d 3e 72 65 67 52 65 73 75 6c   pItem->regResul
345e0 74 20 3d 20 64 65 73 74 2e 69 53 64 73 74 3b 0a  t = dest.iSdst;.
345f0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
34600 65 45 6e 64 43 6f 72 6f 75 74 69 6e 65 28 76 2c  eEndCoroutine(v,
34610 20 70 49 74 65 6d 2d 3e 72 65 67 52 65 74 75 72   pItem->regRetur
34620 6e 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  n);.      sqlite
34630 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
34640 20 61 64 64 72 54 6f 70 2d 31 29 3b 0a 20 20 20   addrTop-1);.   
34650 20 20 20 73 71 6c 69 74 65 33 43 6c 65 61 72 54     sqlite3ClearT
34660 65 6d 70 52 65 67 43 61 63 68 65 28 70 50 61 72  empRegCache(pPar
34670 73 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  se);.    }else{.
34680 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74        /* Generat
34690 65 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20 74  e a subroutine t
346a0 68 61 74 20 77 69 6c 6c 20 66 69 6c 6c 20 61 6e  hat will fill an
346b0 20 65 70 68 65 6d 65 72 61 6c 20 74 61 62 6c 65   ephemeral table
346c0 20 77 69 74 68 0a 20 20 20 20 20 20 2a 2a 20 74   with.      ** t
346d0 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68  he content of th
346e0 69 73 20 73 75 62 71 75 65 72 79 2e 20 20 70 49  is subquery.  pI
346f0 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75 62  tem->addrFillSub
34700 20 77 69 6c 6c 20 70 6f 69 6e 74 0a 20 20 20 20   will point.    
34710 20 20 2a 2a 20 74 6f 20 74 68 65 20 61 64 64 72    ** to the addr
34720 65 73 73 20 6f 66 20 74 68 65 20 67 65 6e 65 72  ess of the gener
34730 61 74 65 64 20 73 75 62 72 6f 75 74 69 6e 65 2e  ated subroutine.
34740 20 20 70 49 74 65 6d 2d 3e 72 65 67 52 65 74 75    pItem->regRetu
34750 72 6e 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 61  rn.      ** is a
34760 20 72 65 67 69 73 74 65 72 20 61 6c 6c 6f 63 61   register alloca
34770 74 65 64 20 74 6f 20 68 6f 6c 64 20 74 68 65 20  ted to hold the 
34780 73 75 62 72 6f 75 74 69 6e 65 20 72 65 74 75 72  subroutine retur
34790 6e 20 61 64 64 72 65 73 73 0a 20 20 20 20 20 20  n address.      
347a0 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 74 6f 70  */.      int top
347b0 41 64 64 72 3b 0a 20 20 20 20 20 20 69 6e 74 20  Addr;.      int 
347c0 6f 6e 63 65 41 64 64 72 20 3d 20 30 3b 0a 20 20  onceAddr = 0;.  
347d0 20 20 20 20 69 6e 74 20 72 65 74 41 64 64 72 3b      int retAddr;
347e0 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 53 72  .      struct Sr
347f0 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 50 72 69  cList_item *pPri
34800 6f 72 3b 0a 0a 20 20 20 20 20 20 61 73 73 65 72  or;..      asser
34810 74 28 20 70 49 74 65 6d 2d 3e 61 64 64 72 46 69  t( pItem->addrFi
34820 6c 6c 53 75 62 3d 3d 30 20 29 3b 0a 20 20 20 20  llSub==0 );.    
34830 20 20 70 49 74 65 6d 2d 3e 72 65 67 52 65 74 75    pItem->regRetu
34840 72 6e 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  rn = ++pParse->n
34850 4d 65 6d 3b 0a 20 20 20 20 20 20 74 6f 70 41 64  Mem;.      topAd
34860 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  dr = sqlite3Vdbe
34870 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74  AddOp2(v, OP_Int
34880 65 67 65 72 2c 20 30 2c 20 70 49 74 65 6d 2d 3e  eger, 0, pItem->
34890 72 65 67 52 65 74 75 72 6e 29 3b 0a 20 20 20 20  regReturn);.    
348a0 20 20 70 49 74 65 6d 2d 3e 61 64 64 72 46 69 6c    pItem->addrFil
348b0 6c 53 75 62 20 3d 20 74 6f 70 41 64 64 72 2b 31  lSub = topAddr+1
348c0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49 74 65  ;.      if( pIte
348d0 6d 2d 3e 66 67 2e 69 73 43 6f 72 72 65 6c 61 74  m->fg.isCorrelat
348e0 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ed==0 ){.       
348f0 20 2f 2a 20 49 66 20 74 68 65 20 73 75 62 71 75   /* If the subqu
34900 65 72 79 20 69 73 20 6e 6f 74 20 63 6f 72 72 65  ery is not corre
34910 6c 61 74 65 64 20 61 6e 64 20 69 66 20 77 65 20  lated and if we 
34920 61 72 65 20 6e 6f 74 20 69 6e 73 69 64 65 20 6f  are not inside o
34930 66 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 20 74  f.        ** a t
34940 72 69 67 67 65 72 2c 20 74 68 65 6e 20 77 65 20  rigger, then we 
34950 6f 6e 6c 79 20 6e 65 65 64 20 74 6f 20 63 6f 6d  only need to com
34960 70 75 74 65 20 74 68 65 20 76 61 6c 75 65 20 6f  pute the value o
34970 66 20 74 68 65 20 73 75 62 71 75 65 72 79 0a 20  f the subquery. 
34980 20 20 20 20 20 20 20 2a 2a 20 6f 6e 63 65 2e 20         ** once. 
34990 2a 2f 0a 20 20 20 20 20 20 20 20 6f 6e 63 65 41  */.        onceA
349a0 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ddr = sqlite3Vdb
349b0 65 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f 4f 6e  eAddOp0(v, OP_On
349c0 63 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  ce); VdbeCoverag
349d0 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20 56 64  e(v);.        Vd
349e0 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 6d  beComment((v, "m
349f0 61 74 65 72 69 61 6c 69 7a 65 20 5c 22 25 73 5c  aterialize \"%s\
34a00 22 22 2c 20 70 49 74 65 6d 2d 3e 70 54 61 62 2d  "", pItem->pTab-
34a10 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 20 20  >zName));.      
34a20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 56  }else{.        V
34a30 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28  dbeNoopComment((
34a40 76 2c 20 22 6d 61 74 65 72 69 61 6c 69 7a 65 20  v, "materialize 
34a50 5c 22 25 73 5c 22 22 2c 20 70 49 74 65 6d 2d 3e  \"%s\"", pItem->
34a60 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20  pTab->zName));. 
34a70 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 50 72       }.      pPr
34a80 69 6f 72 20 3d 20 69 73 53 65 6c 66 4a 6f 69 6e  ior = isSelfJoin
34a90 56 69 65 77 28 70 54 61 62 4c 69 73 74 2c 20 70  View(pTabList, p
34aa0 49 74 65 6d 29 3b 0a 20 20 20 20 20 20 69 66 28  Item);.      if(
34ab0 20 70 50 72 69 6f 72 20 29 7b 0a 20 20 20 20 20   pPrior ){.     
34ac0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
34ad0 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 44  dOp2(v, OP_OpenD
34ae0 75 70 2c 20 70 49 74 65 6d 2d 3e 69 43 75 72 73  up, pItem->iCurs
34af0 6f 72 2c 20 70 50 72 69 6f 72 2d 3e 69 43 75 72  or, pPrior->iCur
34b00 73 6f 72 29 3b 0a 20 20 20 20 20 20 20 20 61 73  sor);.        as
34b10 73 65 72 74 28 20 70 50 72 69 6f 72 2d 3e 70 53  sert( pPrior->pS
34b20 65 6c 65 63 74 21 3d 30 20 29 3b 0a 20 20 20 20  elect!=0 );.    
34b30 20 20 20 20 70 53 75 62 2d 3e 6e 53 65 6c 65 63      pSub->nSelec
34b40 74 52 6f 77 20 3d 20 70 50 72 69 6f 72 2d 3e 70  tRow = pPrior->p
34b50 53 65 6c 65 63 74 2d 3e 6e 53 65 6c 65 63 74 52  Select->nSelectR
34b60 6f 77 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  ow;.      }else{
34b70 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
34b80 53 65 6c 65 63 74 44 65 73 74 49 6e 69 74 28 26  SelectDestInit(&
34b90 64 65 73 74 2c 20 53 52 54 5f 45 70 68 65 6d 54  dest, SRT_EphemT
34ba0 61 62 2c 20 70 49 74 65 6d 2d 3e 69 43 75 72 73  ab, pItem->iCurs
34bb0 6f 72 29 3b 0a 20 20 20 20 20 20 20 20 45 78 70  or);.        Exp
34bc0 6c 61 69 6e 51 75 65 72 79 50 6c 61 6e 28 28 70  lainQueryPlan((p
34bd0 50 61 72 73 65 2c 20 31 2c 20 22 4d 41 54 45 52  Parse, 1, "MATER
34be0 49 41 4c 49 5a 45 20 25 75 22 2c 20 70 53 75 62  IALIZE %u", pSub
34bf0 2d 3e 73 65 6c 49 64 29 29 3b 0a 20 20 20 20 20  ->selId));.     
34c00 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74     sqlite3Select
34c10 28 70 50 61 72 73 65 2c 20 70 53 75 62 2c 20 26  (pParse, pSub, &
34c20 64 65 73 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20  dest);.      }. 
34c30 20 20 20 20 20 70 49 74 65 6d 2d 3e 70 54 61 62       pItem->pTab
34c40 2d 3e 6e 52 6f 77 4c 6f 67 45 73 74 20 3d 20 70  ->nRowLogEst = p
34c50 53 75 62 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 3b  Sub->nSelectRow;
34c60 0a 20 20 20 20 20 20 69 66 28 20 6f 6e 63 65 41  .      if( onceA
34c70 64 64 72 20 29 20 73 71 6c 69 74 65 33 56 64 62  ddr ) sqlite3Vdb
34c80 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 6f 6e 63  eJumpHere(v, onc
34c90 65 41 64 64 72 29 3b 0a 20 20 20 20 20 20 72 65  eAddr);.      re
34ca0 74 41 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56  tAddr = sqlite3V
34cb0 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
34cc0 52 65 74 75 72 6e 2c 20 70 49 74 65 6d 2d 3e 72  Return, pItem->r
34cd0 65 67 52 65 74 75 72 6e 29 3b 0a 20 20 20 20 20  egReturn);.     
34ce0 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
34cf0 20 22 65 6e 64 20 25 73 22 2c 20 70 49 74 65 6d   "end %s", pItem
34d00 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 29 3b  ->pTab->zName));
34d10 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
34d20 62 65 43 68 61 6e 67 65 50 31 28 76 2c 20 74 6f  beChangeP1(v, to
34d30 70 41 64 64 72 2c 20 72 65 74 41 64 64 72 29 3b  pAddr, retAddr);
34d40 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6c  .      sqlite3Cl
34d50 65 61 72 54 65 6d 70 52 65 67 43 61 63 68 65 28  earTempRegCache(
34d60 70 50 61 72 73 65 29 3b 0a 20 20 20 20 7d 0a 20  pParse);.    }. 
34d70 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f     if( db->mallo
34d80 63 46 61 69 6c 65 64 20 29 20 67 6f 74 6f 20 73  cFailed ) goto s
34d90 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 70  elect_end;.    p
34da0 50 61 72 73 65 2d 3e 6e 48 65 69 67 68 74 20 2d  Parse->nHeight -
34db0 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 45  = sqlite3SelectE
34dc0 78 70 72 48 65 69 67 68 74 28 70 29 3b 0a 20 20  xprHeight(p);.  
34dd0 20 20 70 50 61 72 73 65 2d 3e 7a 41 75 74 68 43    pParse->zAuthC
34de0 6f 6e 74 65 78 74 20 3d 20 7a 53 61 76 65 64 41  ontext = zSavedA
34df0 75 74 68 43 6f 6e 74 65 78 74 3b 0a 23 65 6e 64  uthContext;.#end
34e00 69 66 0a 20 20 7d 0a 0a 20 20 2f 2a 20 56 61 72  if.  }..  /* Var
34e10 69 6f 75 73 20 65 6c 65 6d 65 6e 74 73 20 6f 66  ious elements of
34e20 20 74 68 65 20 53 45 4c 45 43 54 20 63 6f 70 69   the SELECT copi
34e30 65 64 20 69 6e 74 6f 20 6c 6f 63 61 6c 20 76 61  ed into local va
34e40 72 69 61 62 6c 65 73 20 66 6f 72 0a 20 20 2a 2a  riables for.  **
34e50 20 63 6f 6e 76 65 6e 69 65 6e 63 65 20 2a 2f 0a   convenience */.
34e60 20 20 70 45 4c 69 73 74 20 3d 20 70 2d 3e 70 45    pEList = p->pE
34e70 4c 69 73 74 3b 0a 20 20 70 57 68 65 72 65 20 3d  List;.  pWhere =
34e80 20 70 2d 3e 70 57 68 65 72 65 3b 0a 20 20 70 47   p->pWhere;.  pG
34e90 72 6f 75 70 42 79 20 3d 20 70 2d 3e 70 47 72 6f  roupBy = p->pGro
34ea0 75 70 42 79 3b 0a 20 20 70 48 61 76 69 6e 67 20  upBy;.  pHaving 
34eb0 3d 20 70 2d 3e 70 48 61 76 69 6e 67 3b 0a 20 20  = p->pHaving;.  
34ec0 73 44 69 73 74 69 6e 63 74 2e 69 73 54 6e 63 74  sDistinct.isTnct
34ed0 20 3d 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20   = (p->selFlags 
34ee0 26 20 53 46 5f 44 69 73 74 69 6e 63 74 29 21 3d  & SF_Distinct)!=
34ef0 30 3b 0a 0a 23 69 66 20 53 45 4c 45 43 54 54 52  0;..#if SELECTTR
34f00 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20 69 66  ACE_ENABLED.  if
34f10 28 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 54  ( sqlite3SelectT
34f20 72 61 63 65 20 26 20 30 78 34 30 30 20 29 7b 0a  race & 0x400 ){.
34f30 20 20 20 20 53 45 4c 45 43 54 54 52 41 43 45 28      SELECTTRACE(
34f40 30 78 34 30 30 2c 70 50 61 72 73 65 2c 70 2c 28  0x400,pParse,p,(
34f50 22 41 66 74 65 72 20 61 6c 6c 20 46 52 4f 4d 2d  "After all FROM-
34f60 63 6c 61 75 73 65 20 61 6e 61 6c 79 73 69 73 3a  clause analysis:
34f70 5c 6e 22 29 29 3b 0a 20 20 20 20 73 71 6c 69 74  \n"));.    sqlit
34f80 65 33 54 72 65 65 56 69 65 77 53 65 6c 65 63 74  e3TreeViewSelect
34f90 28 30 2c 20 70 2c 20 30 29 3b 0a 20 20 7d 0a 23  (0, p, 0);.  }.#
34fa0 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20 74  endif..  /* If t
34fb0 68 65 20 71 75 65 72 79 20 69 73 20 44 49 53 54  he query is DIST
34fc0 49 4e 43 54 20 77 69 74 68 20 61 6e 20 4f 52 44  INCT with an ORD
34fd0 45 52 20 42 59 20 62 75 74 20 69 73 20 6e 6f 74  ER BY but is not
34fe0 20 61 6e 20 61 67 67 72 65 67 61 74 65 2c 20 61   an aggregate, a
34ff0 6e 64 20 0a 20 20 2a 2a 20 69 66 20 74 68 65 20  nd .  ** if the 
35000 73 65 6c 65 63 74 2d 6c 69 73 74 20 69 73 20 74  select-list is t
35010 68 65 20 73 61 6d 65 20 61 73 20 74 68 65 20 4f  he same as the O
35020 52 44 45 52 20 42 59 20 6c 69 73 74 2c 20 74 68  RDER BY list, th
35030 65 6e 20 74 68 69 73 20 71 75 65 72 79 0a 20 20  en this query.  
35040 2a 2a 20 63 61 6e 20 62 65 20 72 65 77 72 69 74  ** can be rewrit
35050 74 65 6e 20 61 73 20 61 20 47 52 4f 55 50 20 42  ten as a GROUP B
35060 59 2e 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64  Y. In other word
35070 73 2c 20 74 68 69 73 3a 0a 20 20 2a 2a 0a 20 20  s, this:.  **.  
35080 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 44 49  **     SELECT DI
35090 53 54 49 4e 43 54 20 78 79 7a 20 46 52 4f 4d 20  STINCT xyz FROM 
350a0 2e 2e 2e 20 4f 52 44 45 52 20 42 59 20 78 79 7a  ... ORDER BY xyz
350b0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 69 73 20 74 72  .  **.  ** is tr
350c0 61 6e 73 66 6f 72 6d 65 64 20 74 6f 3a 0a 20 20  ansformed to:.  
350d0 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c 45  **.  **     SELE
350e0 43 54 20 78 79 7a 20 46 52 4f 4d 20 2e 2e 2e 20  CT xyz FROM ... 
350f0 47 52 4f 55 50 20 42 59 20 78 79 7a 20 4f 52 44  GROUP BY xyz ORD
35100 45 52 20 42 59 20 78 79 7a 0a 20 20 2a 2a 0a 20  ER BY xyz.  **. 
35110 20 2a 2a 20 54 68 65 20 73 65 63 6f 6e 64 20 66   ** The second f
35120 6f 72 6d 20 69 73 20 70 72 65 66 65 72 72 65 64  orm is preferred
35130 20 61 73 20 61 20 73 69 6e 67 6c 65 20 69 6e 64   as a single ind
35140 65 78 20 28 6f 72 20 74 65 6d 70 2d 74 61 62 6c  ex (or temp-tabl
35150 65 29 20 6d 61 79 20 62 65 20 0a 20 20 2a 2a 20  e) may be .  ** 
35160 75 73 65 64 20 66 6f 72 20 62 6f 74 68 20 74 68  used for both th
35170 65 20 4f 52 44 45 52 20 42 59 20 61 6e 64 20 44  e ORDER BY and D
35180 49 53 54 49 4e 43 54 20 70 72 6f 63 65 73 73 69  ISTINCT processi
35190 6e 67 2e 20 41 73 20 6f 72 69 67 69 6e 61 6c 6c  ng. As originall
351a0 79 20 0a 20 20 2a 2a 20 77 72 69 74 74 65 6e 20  y .  ** written 
351b0 74 68 65 20 71 75 65 72 79 20 6d 75 73 74 20 75  the query must u
351c0 73 65 20 61 20 74 65 6d 70 2d 74 61 62 6c 65 20  se a temp-table 
351d0 66 6f 72 20 61 74 20 6c 65 61 73 74 20 6f 6e 65  for at least one
351e0 20 6f 66 20 74 68 65 20 4f 52 44 45 52 20 0a 20   of the ORDER . 
351f0 20 2a 2a 20 42 59 20 61 6e 64 20 44 49 53 54 49   ** BY and DISTI
35200 4e 43 54 2c 20 61 6e 64 20 61 6e 20 69 6e 64 65  NCT, and an inde
35210 78 20 6f 72 20 73 65 70 61 72 61 74 65 20 74 65  x or separate te
35220 6d 70 2d 74 61 62 6c 65 20 66 6f 72 20 74 68 65  mp-table for the
35230 20 6f 74 68 65 72 2e 0a 20 20 2a 2f 0a 20 20 69   other..  */.  i
35240 66 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20  f( (p->selFlags 
35250 26 20 28 53 46 5f 44 69 73 74 69 6e 63 74 7c 53  & (SF_Distinct|S
35260 46 5f 41 67 67 72 65 67 61 74 65 29 29 3d 3d 53  F_Aggregate))==S
35270 46 5f 44 69 73 74 69 6e 63 74 20 0a 20 20 20 26  F_Distinct .   &
35280 26 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  & sqlite3ExprLis
35290 74 43 6f 6d 70 61 72 65 28 73 53 6f 72 74 2e 70  tCompare(sSort.p
352a0 4f 72 64 65 72 42 79 2c 20 70 45 4c 69 73 74 2c  OrderBy, pEList,
352b0 20 2d 31 29 3d 3d 30 0a 20 20 29 7b 0a 20 20 20   -1)==0.  ){.   
352c0 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 3d 20   p->selFlags &= 
352d0 7e 53 46 5f 44 69 73 74 69 6e 63 74 3b 0a 20 20  ~SF_Distinct;.  
352e0 20 20 70 47 72 6f 75 70 42 79 20 3d 20 70 2d 3e    pGroupBy = p->
352f0 70 47 72 6f 75 70 42 79 20 3d 20 73 71 6c 69 74  pGroupBy = sqlit
35300 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 64 62  e3ExprListDup(db
35310 2c 20 70 45 4c 69 73 74 2c 20 30 29 3b 0a 20 20  , pEList, 0);.  
35320 20 20 2f 2a 20 4e 6f 74 69 63 65 20 74 68 61 74    /* Notice that
35330 20 65 76 65 6e 20 74 68 6f 75 67 68 74 20 53 46   even thought SF
35340 5f 44 69 73 74 69 6e 63 74 20 68 61 73 20 62 65  _Distinct has be
35350 65 6e 20 63 6c 65 61 72 65 64 20 66 72 6f 6d 20  en cleared from 
35360 70 2d 3e 73 65 6c 46 6c 61 67 73 2c 0a 20 20 20  p->selFlags,.   
35370 20 2a 2a 20 74 68 65 20 73 44 69 73 74 69 6e 63   ** the sDistinc
35380 74 2e 69 73 54 6e 63 74 20 69 73 20 73 74 69 6c  t.isTnct is stil
35390 6c 20 73 65 74 2e 20 20 48 65 6e 63 65 2c 20 69  l set.  Hence, i
353a0 73 54 6e 63 74 20 72 65 70 72 65 73 65 6e 74 73  sTnct represents
353b0 20 74 68 65 0a 20 20 20 20 2a 2a 20 6f 72 69 67   the.    ** orig
353c0 69 6e 61 6c 20 73 65 74 74 69 6e 67 20 6f 66 20  inal setting of 
353d0 74 68 65 20 53 46 5f 44 69 73 74 69 6e 63 74 20  the SF_Distinct 
353e0 66 6c 61 67 2c 20 6e 6f 74 20 74 68 65 20 63 75  flag, not the cu
353f0 72 72 65 6e 74 20 73 65 74 74 69 6e 67 20 2a 2f  rrent setting */
35400 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 44 69  .    assert( sDi
35410 73 74 69 6e 63 74 2e 69 73 54 6e 63 74 20 29 3b  stinct.isTnct );
35420 0a 0a 23 69 66 20 53 45 4c 45 43 54 54 52 41 43  ..#if SELECTTRAC
35430 45 5f 45 4e 41 42 4c 45 44 0a 20 20 20 20 69 66  E_ENABLED.    if
35440 28 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 54  ( sqlite3SelectT
35450 72 61 63 65 20 26 20 30 78 34 30 30 20 29 7b 0a  race & 0x400 ){.
35460 20 20 20 20 20 20 53 45 4c 45 43 54 54 52 41 43        SELECTTRAC
35470 45 28 30 78 34 30 30 2c 70 50 61 72 73 65 2c 70  E(0x400,pParse,p
35480 2c 28 22 54 72 61 6e 73 66 6f 72 6d 20 44 49 53  ,("Transform DIS
35490 54 49 4e 43 54 20 69 6e 74 6f 20 47 52 4f 55 50  TINCT into GROUP
354a0 20 42 59 3a 5c 6e 22 29 29 3b 0a 20 20 20 20 20   BY:\n"));.     
354b0 20 73 71 6c 69 74 65 33 54 72 65 65 56 69 65 77   sqlite3TreeView
354c0 53 65 6c 65 63 74 28 30 2c 20 70 2c 20 30 29 3b  Select(0, p, 0);
354d0 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
354e0 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65  }..  /* If there
354f0 20 69 73 20 61 6e 20 4f 52 44 45 52 20 42 59 20   is an ORDER BY 
35500 63 6c 61 75 73 65 2c 20 74 68 65 6e 20 63 72 65  clause, then cre
35510 61 74 65 20 61 6e 20 65 70 68 65 6d 65 72 61 6c  ate an ephemeral
35520 20 69 6e 64 65 78 20 74 6f 0a 20 20 2a 2a 20 64   index to.  ** d
35530 6f 20 74 68 65 20 73 6f 72 74 69 6e 67 2e 20 20  o the sorting.  
35540 42 75 74 20 74 68 69 73 20 73 6f 72 74 69 6e 67  But this sorting
35550 20 65 70 68 65 6d 65 72 61 6c 20 69 6e 64 65 78   ephemeral index
35560 20 6d 69 67 68 74 20 65 6e 64 20 75 70 0a 20 20   might end up.  
35570 2a 2a 20 62 65 69 6e 67 20 75 6e 75 73 65 64 20  ** being unused 
35580 69 66 20 74 68 65 20 64 61 74 61 20 63 61 6e 20  if the data can 
35590 62 65 20 65 78 74 72 61 63 74 65 64 20 69 6e 20  be extracted in 
355a0 70 72 65 2d 73 6f 72 74 65 64 20 6f 72 64 65 72  pre-sorted order
355b0 2e 0a 20 20 2a 2a 20 49 66 20 74 68 61 74 20 69  ..  ** If that i
355c0 73 20 74 68 65 20 63 61 73 65 2c 20 74 68 65 6e  s the case, then
355d0 20 74 68 65 20 4f 50 5f 4f 70 65 6e 45 70 68 65   the OP_OpenEphe
355e0 6d 65 72 61 6c 20 69 6e 73 74 72 75 63 74 69 6f  meral instructio
355f0 6e 20 77 69 6c 6c 20 62 65 0a 20 20 2a 2a 20 63  n will be.  ** c
35600 68 61 6e 67 65 64 20 74 6f 20 61 6e 20 4f 50 5f  hanged to an OP_
35610 4e 6f 6f 70 20 6f 6e 63 65 20 77 65 20 66 69 67  Noop once we fig
35620 75 72 65 20 6f 75 74 20 74 68 61 74 20 74 68 65  ure out that the
35630 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 20 69   sorting index i
35640 73 0a 20 20 2a 2a 20 6e 6f 74 20 6e 65 65 64 65  s.  ** not neede
35650 64 2e 20 20 54 68 65 20 73 53 6f 72 74 2e 61 64  d.  The sSort.ad
35660 64 72 53 6f 72 74 49 6e 64 65 78 20 76 61 72 69  drSortIndex vari
35670 61 62 6c 65 20 69 73 20 75 73 65 64 20 74 6f 20  able is used to 
35680 66 61 63 69 6c 69 74 61 74 65 0a 20 20 2a 2a 20  facilitate.  ** 
35690 74 68 61 74 20 63 68 61 6e 67 65 2e 0a 20 20 2a  that change..  *
356a0 2f 0a 20 20 69 66 28 20 73 53 6f 72 74 2e 70 4f  /.  if( sSort.pO
356b0 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 4b 65  rderBy ){.    Ke
356c0 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b  yInfo *pKeyInfo;
356d0 0a 20 20 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20  .    pKeyInfo = 
356e0 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 46 72  sqlite3KeyInfoFr
356f0 6f 6d 45 78 70 72 4c 69 73 74 28 0a 20 20 20 20  omExprList(.    
35700 20 20 20 20 70 50 61 72 73 65 2c 20 73 53 6f 72      pParse, sSor
35710 74 2e 70 4f 72 64 65 72 42 79 2c 20 30 2c 20 70  t.pOrderBy, 0, p
35720 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b 0a 20  EList->nExpr);. 
35730 20 20 20 73 53 6f 72 74 2e 69 45 43 75 72 73 6f     sSort.iECurso
35740 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  r = pParse->nTab
35750 2b 2b 3b 0a 20 20 20 20 73 53 6f 72 74 2e 61 64  ++;.    sSort.ad
35760 64 72 53 6f 72 74 49 6e 64 65 78 20 3d 0a 20 20  drSortIndex =.  
35770 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
35780 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4f 70 65 6e  ddOp4(v, OP_Open
35790 45 70 68 65 6d 65 72 61 6c 2c 0a 20 20 20 20 20  Ephemeral,.     
357a0 20 20 20 20 20 73 53 6f 72 74 2e 69 45 43 75 72       sSort.iECur
357b0 73 6f 72 2c 20 73 53 6f 72 74 2e 70 4f 72 64 65  sor, sSort.pOrde
357c0 72 42 79 2d 3e 6e 45 78 70 72 2b 31 2b 70 45 4c  rBy->nExpr+1+pEL
357d0 69 73 74 2d 3e 6e 45 78 70 72 2c 20 30 2c 0a 20  ist->nExpr, 0,. 
357e0 20 20 20 20 20 20 20 20 20 28 63 68 61 72 2a 29           (char*)
357f0 70 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59  pKeyInfo, P4_KEY
35800 49 4e 46 4f 0a 20 20 20 20 20 20 29 3b 0a 20 20  INFO.      );.  
35810 7d 65 6c 73 65 7b 0a 20 20 20 20 73 53 6f 72 74  }else{.    sSort
35820 2e 61 64 64 72 53 6f 72 74 49 6e 64 65 78 20 3d  .addrSortIndex =
35830 20 2d 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49   -1;.  }..  /* I
35840 66 20 74 68 65 20 6f 75 74 70 75 74 20 69 73 20  f the output is 
35850 64 65 73 74 69 6e 65 64 20 66 6f 72 20 61 20 74  destined for a t
35860 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 2c 20  emporary table, 
35870 6f 70 65 6e 20 74 68 61 74 20 74 61 62 6c 65 2e  open that table.
35880 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 44 65 73  .  */.  if( pDes
35890 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 45 70  t->eDest==SRT_Ep
358a0 68 65 6d 54 61 62 20 29 7b 0a 20 20 20 20 73 71  hemTab ){.    sq
358b0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
358c0 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65  v, OP_OpenEpheme
358d0 72 61 6c 2c 20 70 44 65 73 74 2d 3e 69 53 44 50  ral, pDest->iSDP
358e0 61 72 6d 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78  arm, pEList->nEx
358f0 70 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53  pr);.  }..  /* S
35900 65 74 20 74 68 65 20 6c 69 6d 69 74 65 72 2e 0a  et the limiter..
35910 20 20 2a 2f 0a 20 20 69 45 6e 64 20 3d 20 73 71    */.  iEnd = sq
35920 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
35930 65 6c 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66  el(pParse);.  if
35940 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26  ( (p->selFlags &
35950 20 53 46 5f 46 69 78 65 64 4c 69 6d 69 74 29 3d   SF_FixedLimit)=
35960 3d 30 20 29 7b 0a 20 20 20 20 70 2d 3e 6e 53 65  =0 ){.    p->nSe
35970 6c 65 63 74 52 6f 77 20 3d 20 33 32 30 3b 20 20  lectRow = 320;  
35980 2f 2a 20 34 20 62 69 6c 6c 69 6f 6e 20 72 6f 77  /* 4 billion row
35990 73 20 2a 2f 0a 20 20 7d 0a 20 20 63 6f 6d 70 75  s */.  }.  compu
359a0 74 65 4c 69 6d 69 74 52 65 67 69 73 74 65 72 73  teLimitRegisters
359b0 28 70 50 61 72 73 65 2c 20 70 2c 20 69 45 6e 64  (pParse, p, iEnd
359c0 29 3b 0a 20 20 69 66 28 20 70 2d 3e 69 4c 69 6d  );.  if( p->iLim
359d0 69 74 3d 3d 30 20 26 26 20 73 53 6f 72 74 2e 61  it==0 && sSort.a
359e0 64 64 72 53 6f 72 74 49 6e 64 65 78 3e 3d 30 20  ddrSortIndex>=0 
359f0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
35a00 62 65 43 68 61 6e 67 65 4f 70 63 6f 64 65 28 76  beChangeOpcode(v
35a10 2c 20 73 53 6f 72 74 2e 61 64 64 72 53 6f 72 74  , sSort.addrSort
35a20 49 6e 64 65 78 2c 20 4f 50 5f 53 6f 72 74 65 72  Index, OP_Sorter
35a30 4f 70 65 6e 29 3b 0a 20 20 20 20 73 53 6f 72 74  Open);.    sSort
35a40 2e 73 6f 72 74 46 6c 61 67 73 20 7c 3d 20 53 4f  .sortFlags |= SO
35a50 52 54 46 4c 41 47 5f 55 73 65 53 6f 72 74 65 72  RTFLAG_UseSorter
35a60 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f 70 65 6e  ;.  }..  /* Open
35a70 20 61 6e 20 65 70 68 65 6d 65 72 61 6c 20 69 6e   an ephemeral in
35a80 64 65 78 20 74 6f 20 75 73 65 20 66 6f 72 20 74  dex to use for t
35a90 68 65 20 64 69 73 74 69 6e 63 74 20 73 65 74 2e  he distinct set.
35aa0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 73  .  */.  if( p->s
35ab0 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 44 69 73  elFlags & SF_Dis
35ac0 74 69 6e 63 74 20 29 7b 0a 20 20 20 20 73 44 69  tinct ){.    sDi
35ad0 73 74 69 6e 63 74 2e 74 61 62 54 6e 63 74 20 3d  stinct.tabTnct =
35ae0 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b   pParse->nTab++;
35af0 0a 20 20 20 20 73 44 69 73 74 69 6e 63 74 2e 61  .    sDistinct.a
35b00 64 64 72 54 6e 63 74 20 3d 20 73 71 6c 69 74 65  ddrTnct = sqlite
35b10 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
35b20 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c  P_OpenEphemeral,
35b30 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
35b40 20 20 20 20 20 20 20 20 73 44 69 73 74 69 6e 63          sDistinc
35b50 74 2e 74 61 62 54 6e 63 74 2c 20 30 2c 20 30 2c  t.tabTnct, 0, 0,
35b60 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
35b70 20 20 20 20 20 20 20 20 28 63 68 61 72 2a 29 73          (char*)s
35b80 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 46 72 6f  qlite3KeyInfoFro
35b90 6d 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65  mExprList(pParse
35ba0 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 30 2c 30 29  , p->pEList,0,0)
35bb0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
35bc0 20 20 20 20 20 20 20 20 20 50 34 5f 4b 45 59 49           P4_KEYI
35bd0 4e 46 4f 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  NFO);.    sqlite
35be0 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c  3VdbeChangeP5(v,
35bf0 20 42 54 52 45 45 5f 55 4e 4f 52 44 45 52 45 44   BTREE_UNORDERED
35c00 29 3b 0a 20 20 20 20 73 44 69 73 74 69 6e 63 74  );.    sDistinct
35c10 2e 65 54 6e 63 74 54 79 70 65 20 3d 20 57 48 45  .eTnctType = WHE
35c20 52 45 5f 44 49 53 54 49 4e 43 54 5f 55 4e 4f 52  RE_DISTINCT_UNOR
35c30 44 45 52 45 44 3b 0a 20 20 7d 65 6c 73 65 7b 0a  DERED;.  }else{.
35c40 20 20 20 20 73 44 69 73 74 69 6e 63 74 2e 65 54      sDistinct.eT
35c50 6e 63 74 54 79 70 65 20 3d 20 57 48 45 52 45 5f  nctType = WHERE_
35c60 44 49 53 54 49 4e 43 54 5f 4e 4f 4f 50 3b 0a 20  DISTINCT_NOOP;. 
35c70 20 7d 0a 0a 20 20 69 66 28 20 21 69 73 41 67 67   }..  if( !isAgg
35c80 20 26 26 20 70 47 72 6f 75 70 42 79 3d 3d 30 20   && pGroupBy==0 
35c90 29 7b 0a 20 20 20 20 2f 2a 20 4e 6f 20 61 67 67  ){.    /* No agg
35ca0 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73  regate functions
35cb0 20 61 6e 64 20 6e 6f 20 47 52 4f 55 50 20 42 59   and no GROUP BY
35cc0 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20 75   clause */.    u
35cd0 31 36 20 77 63 74 72 6c 46 6c 61 67 73 20 3d 20  16 wctrlFlags = 
35ce0 28 73 44 69 73 74 69 6e 63 74 2e 69 73 54 6e 63  (sDistinct.isTnc
35cf0 74 20 3f 20 57 48 45 52 45 5f 57 41 4e 54 5f 44  t ? WHERE_WANT_D
35d00 49 53 54 49 4e 43 54 20 3a 20 30 29 0a 20 20 20  ISTINCT : 0).   
35d10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35d20 7c 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26  | (p->selFlags &
35d30 20 53 46 5f 46 69 78 65 64 4c 69 6d 69 74 29 3b   SF_FixedLimit);
35d40 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
35d50 4f 4d 49 54 5f 57 49 4e 44 4f 57 46 55 4e 43 0a  OMIT_WINDOWFUNC.
35d60 20 20 20 20 57 69 6e 64 6f 77 20 2a 70 57 69 6e      Window *pWin
35d70 20 3d 20 70 2d 3e 70 57 69 6e 3b 20 20 20 20 20   = p->pWin;     
35d80 20 2f 2a 20 4d 61 73 74 65 72 20 77 69 6e 64 6f   /* Master windo
35d90 77 20 6f 62 6a 65 63 74 20 28 6f 72 20 4e 55 4c  w object (or NUL
35da0 4c 29 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 57  L) */.    if( pW
35db0 69 6e 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  in ){.      sqli
35dc0 74 65 33 57 69 6e 64 6f 77 43 6f 64 65 49 6e 69  te3WindowCodeIni
35dd0 74 28 70 50 61 72 73 65 2c 20 70 57 69 6e 29 3b  t(pParse, pWin);
35de0 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
35df0 20 20 61 73 73 65 72 74 28 20 57 48 45 52 45 5f    assert( WHERE_
35e00 55 53 45 5f 4c 49 4d 49 54 3d 3d 53 46 5f 46 69  USE_LIMIT==SF_Fi
35e10 78 65 64 4c 69 6d 69 74 20 29 3b 0a 0a 0a 20 20  xedLimit );...  
35e20 20 20 2f 2a 20 42 65 67 69 6e 20 74 68 65 20 64    /* Begin the d
35e30 61 74 61 62 61 73 65 20 73 63 61 6e 2e 20 2a 2f  atabase scan. */
35e40 0a 20 20 20 20 53 45 4c 45 43 54 54 52 41 43 45  .    SELECTTRACE
35e50 28 31 2c 70 50 61 72 73 65 2c 70 2c 28 22 57 68  (1,pParse,p,("Wh
35e60 65 72 65 42 65 67 69 6e 5c 6e 22 29 29 3b 0a 20  ereBegin\n"));. 
35e70 20 20 20 70 57 49 6e 66 6f 20 3d 20 73 71 6c 69     pWInfo = sqli
35e80 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 70 50  te3WhereBegin(pP
35e90 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20  arse, pTabList, 
35ea0 70 57 68 65 72 65 2c 20 73 53 6f 72 74 2e 70 4f  pWhere, sSort.pO
35eb0 72 64 65 72 42 79 2c 0a 20 20 20 20 20 20 20 20  rderBy,.        
35ec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35ed0 20 20 20 20 20 20 20 70 2d 3e 70 45 4c 69 73 74         p->pEList
35ee0 2c 20 77 63 74 72 6c 46 6c 61 67 73 2c 20 70 2d  , wctrlFlags, p-
35ef0 3e 6e 53 65 6c 65 63 74 52 6f 77 29 3b 0a 20 20  >nSelectRow);.  
35f00 20 20 69 66 28 20 70 57 49 6e 66 6f 3d 3d 30 20    if( pWInfo==0 
35f10 29 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e  ) goto select_en
35f20 64 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  d;.    if( sqlit
35f30 65 33 57 68 65 72 65 4f 75 74 70 75 74 52 6f 77  e3WhereOutputRow
35f40 43 6f 75 6e 74 28 70 57 49 6e 66 6f 29 20 3c 20  Count(pWInfo) < 
35f50 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 29 7b  p->nSelectRow ){
35f60 0a 20 20 20 20 20 20 70 2d 3e 6e 53 65 6c 65 63  .      p->nSelec
35f70 74 52 6f 77 20 3d 20 73 71 6c 69 74 65 33 57 68  tRow = sqlite3Wh
35f80 65 72 65 4f 75 74 70 75 74 52 6f 77 43 6f 75 6e  ereOutputRowCoun
35f90 74 28 70 57 49 6e 66 6f 29 3b 0a 20 20 20 20 7d  t(pWInfo);.    }
35fa0 0a 20 20 20 20 69 66 28 20 73 44 69 73 74 69 6e  .    if( sDistin
35fb0 63 74 2e 69 73 54 6e 63 74 20 26 26 20 73 71 6c  ct.isTnct && sql
35fc0 69 74 65 33 57 68 65 72 65 49 73 44 69 73 74 69  ite3WhereIsDisti
35fd0 6e 63 74 28 70 57 49 6e 66 6f 29 20 29 7b 0a 20  nct(pWInfo) ){. 
35fe0 20 20 20 20 20 73 44 69 73 74 69 6e 63 74 2e 65       sDistinct.e
35ff0 54 6e 63 74 54 79 70 65 20 3d 20 73 71 6c 69 74  TnctType = sqlit
36000 65 33 57 68 65 72 65 49 73 44 69 73 74 69 6e 63  e3WhereIsDistinc
36010 74 28 70 57 49 6e 66 6f 29 3b 0a 20 20 20 20 7d  t(pWInfo);.    }
36020 0a 20 20 20 20 69 66 28 20 73 53 6f 72 74 2e 70  .    if( sSort.p
36030 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20  OrderBy ){.     
36040 20 73 53 6f 72 74 2e 6e 4f 42 53 61 74 20 3d 20   sSort.nOBSat = 
36050 73 71 6c 69 74 65 33 57 68 65 72 65 49 73 4f 72  sqlite3WhereIsOr
36060 64 65 72 65 64 28 70 57 49 6e 66 6f 29 3b 0a 20  dered(pWInfo);. 
36070 20 20 20 20 20 73 53 6f 72 74 2e 6c 61 62 65 6c       sSort.label
36080 4f 42 4c 6f 70 74 20 3d 20 73 71 6c 69 74 65 33  OBLopt = sqlite3
36090 57 68 65 72 65 4f 72 64 65 72 42 79 4c 69 6d 69  WhereOrderByLimi
360a0 74 4f 70 74 4c 61 62 65 6c 28 70 57 49 6e 66 6f  tOptLabel(pWInfo
360b0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73 53 6f  );.      if( sSo
360c0 72 74 2e 6e 4f 42 53 61 74 3d 3d 73 53 6f 72 74  rt.nOBSat==sSort
360d0 2e 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72  .pOrderBy->nExpr
360e0 20 29 7b 0a 20 20 20 20 20 20 20 20 73 53 6f 72   ){.        sSor
360f0 74 2e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a  t.pOrderBy = 0;.
36100 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
36110 20 20 20 2f 2a 20 49 66 20 73 6f 72 74 69 6e 67     /* If sorting
36120 20 69 6e 64 65 78 20 74 68 61 74 20 77 61 73 20   index that was 
36130 63 72 65 61 74 65 64 20 62 79 20 61 20 70 72 69  created by a pri
36140 6f 72 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65  or OP_OpenEpheme
36150 72 61 6c 20 0a 20 20 20 20 2a 2a 20 69 6e 73 74  ral .    ** inst
36160 72 75 63 74 69 6f 6e 20 65 6e 64 65 64 20 75 70  ruction ended up
36170 20 6e 6f 74 20 62 65 69 6e 67 20 6e 65 65 64 65   not being neede
36180 64 2c 20 74 68 65 6e 20 63 68 61 6e 67 65 20 74  d, then change t
36190 68 65 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65  he OP_OpenEpheme
361a0 72 61 6c 0a 20 20 20 20 2a 2a 20 69 6e 74 6f 20  ral.    ** into 
361b0 61 6e 20 4f 50 5f 4e 6f 6f 70 2e 0a 20 20 20 20  an OP_Noop..    
361c0 2a 2f 0a 20 20 20 20 69 66 28 20 73 53 6f 72 74  */.    if( sSort
361d0 2e 61 64 64 72 53 6f 72 74 49 6e 64 65 78 3e 3d  .addrSortIndex>=
361e0 30 20 26 26 20 73 53 6f 72 74 2e 70 4f 72 64 65  0 && sSort.pOrde
361f0 72 42 79 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  rBy==0 ){.      
36200 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
36210 65 54 6f 4e 6f 6f 70 28 76 2c 20 73 53 6f 72 74  eToNoop(v, sSort
36220 2e 61 64 64 72 53 6f 72 74 49 6e 64 65 78 29 3b  .addrSortIndex);
36230 0a 20 20 20 20 7d 0a 0a 20 20 20 20 61 73 73 65  .    }..    asse
36240 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 3d 3d 70  rt( p->pEList==p
36250 45 4c 69 73 74 20 29 3b 0a 23 69 66 6e 64 65 66  EList );.#ifndef
36260 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 49 4e   SQLITE_OMIT_WIN
36270 44 4f 57 46 55 4e 43 0a 20 20 20 20 69 66 28 20  DOWFUNC.    if( 
36280 70 57 69 6e 20 29 7b 0a 20 20 20 20 20 20 69 6e  pWin ){.      in
36290 74 20 61 64 64 72 47 6f 73 75 62 20 3d 20 73 71  t addrGosub = sq
362a0 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
362b0 65 6c 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  el(pParse);.    
362c0 20 20 69 6e 74 20 69 43 6f 6e 74 20 3d 20 73 71    int iCont = sq
362d0 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
362e0 65 6c 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  el(pParse);.    
362f0 20 20 69 6e 74 20 69 42 72 65 61 6b 20 3d 20 73    int iBreak = s
36300 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
36310 62 65 6c 28 70 50 61 72 73 65 29 3b 0a 20 20 20  bel(pParse);.   
36320 20 20 20 69 6e 74 20 72 65 67 47 6f 73 75 62 20     int regGosub 
36330 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
36340 3b 0a 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ;..      sqlite3
36350 57 69 6e 64 6f 77 43 6f 64 65 53 74 65 70 28 70  WindowCodeStep(p
36360 50 61 72 73 65 2c 20 70 2c 20 70 57 49 6e 66 6f  Parse, p, pWInfo
36370 2c 20 72 65 67 47 6f 73 75 62 2c 20 61 64 64 72  , regGosub, addr
36380 47 6f 73 75 62 29 3b 0a 0a 20 20 20 20 20 20 73  Gosub);..      s
36390 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
363a0 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20  (v, OP_Goto, 0, 
363b0 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 73  iBreak);.      s
363c0 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
363d0 65 4c 61 62 65 6c 28 76 2c 20 61 64 64 72 47 6f  eLabel(v, addrGo
363e0 73 75 62 29 3b 0a 20 20 20 20 20 20 56 64 62 65  sub);.      Vdbe
363f0 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  NoopComment((v, 
36400 22 69 6e 6e 65 72 2d 6c 6f 6f 70 20 73 75 62 72  "inner-loop subr
36410 6f 75 74 69 6e 65 22 29 29 3b 0a 20 20 20 20 20  outine"));.     
36420 20 73 53 6f 72 74 2e 6c 61 62 65 6c 4f 42 4c 6f   sSort.labelOBLo
36430 70 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 65  pt = 0;.      se
36440 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50  lectInnerLoop(pP
36450 61 72 73 65 2c 20 70 2c 20 2d 31 2c 20 26 73 53  arse, p, -1, &sS
36460 6f 72 74 2c 20 26 73 44 69 73 74 69 6e 63 74 2c  ort, &sDistinct,
36470 20 70 44 65 73 74 2c 20 69 43 6f 6e 74 2c 20 69   pDest, iCont, i
36480 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 73 71  Break);.      sq
36490 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
364a0 4c 61 62 65 6c 28 76 2c 20 69 43 6f 6e 74 29 3b  Label(v, iCont);
364b0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
364c0 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52  beAddOp1(v, OP_R
364d0 65 74 75 72 6e 2c 20 72 65 67 47 6f 73 75 62 29  eturn, regGosub)
364e0 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d  ;.      VdbeComm
364f0 65 6e 74 28 28 76 2c 20 22 65 6e 64 20 69 6e 6e  ent((v, "end inn
36500 65 72 2d 6c 6f 6f 70 20 73 75 62 72 6f 75 74 69  er-loop subrouti
36510 6e 65 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c  ne"));.      sql
36520 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
36530 61 62 65 6c 28 76 2c 20 69 42 72 65 61 6b 29 3b  abel(v, iBreak);
36540 0a 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69  .    }else.#endi
36550 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
36560 5f 57 49 4e 44 4f 57 46 55 4e 43 20 2a 2f 0a 20  _WINDOWFUNC */. 
36570 20 20 20 7b 0a 20 20 20 20 20 20 2f 2a 20 55 73     {.      /* Us
36580 65 20 74 68 65 20 73 74 61 6e 64 61 72 64 20 69  e the standard i
36590 6e 6e 65 72 20 6c 6f 6f 70 2e 20 2a 2f 0a 20 20  nner loop. */.  
365a0 20 20 20 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c      selectInnerL
365b0 6f 6f 70 28 70 50 61 72 73 65 2c 20 70 2c 20 2d  oop(pParse, p, -
365c0 31 2c 20 26 73 53 6f 72 74 2c 20 26 73 44 69 73  1, &sSort, &sDis
365d0 74 69 6e 63 74 2c 20 70 44 65 73 74 2c 0a 20 20  tinct, pDest,.  
365e0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 57          sqlite3W
365f0 68 65 72 65 43 6f 6e 74 69 6e 75 65 4c 61 62 65  hereContinueLabe
36600 6c 28 70 57 49 6e 66 6f 29 2c 0a 20 20 20 20 20  l(pWInfo),.     
36610 20 20 20 20 20 73 71 6c 69 74 65 33 57 68 65 72       sqlite3Wher
36620 65 42 72 65 61 6b 4c 61 62 65 6c 28 70 57 49 6e  eBreakLabel(pWIn
36630 66 6f 29 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  fo));..      /* 
36640 45 6e 64 20 74 68 65 20 64 61 74 61 62 61 73 65  End the database
36650 20 73 63 61 6e 20 6c 6f 6f 70 2e 0a 20 20 20 20   scan loop..    
36660 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74    */.      sqlit
36670 65 33 57 68 65 72 65 45 6e 64 28 70 57 49 6e 66  e3WhereEnd(pWInf
36680 6f 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  o);.    }.  }els
36690 65 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 63  e{.    /* This c
366a0 61 73 65 20 77 68 65 6e 20 74 68 65 72 65 20 65  ase when there e
366b0 78 69 73 74 20 61 67 67 72 65 67 61 74 65 20 66  xist aggregate f
366c0 75 6e 63 74 69 6f 6e 73 20 6f 72 20 61 20 47 52  unctions or a GR
366d0 4f 55 50 20 42 59 20 63 6c 61 75 73 65 0a 20 20  OUP BY clause.  
366e0 20 20 2a 2a 20 6f 72 20 62 6f 74 68 20 2a 2f 0a    ** or both */.
366f0 20 20 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20      NameContext 
36700 73 4e 43 3b 20 20 20 20 2f 2a 20 4e 61 6d 65 20  sNC;    /* Name 
36710 63 6f 6e 74 65 78 74 20 66 6f 72 20 70 72 6f 63  context for proc
36720 65 73 73 69 6e 67 20 61 67 67 72 65 67 61 74 65  essing aggregate
36730 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a   information */.
36740 20 20 20 20 69 6e 74 20 69 41 4d 65 6d 3b 20 20      int iAMem;  
36750 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
36760 20 4d 65 6d 20 61 64 64 72 65 73 73 20 66 6f 72   Mem address for
36770 20 73 74 6f 72 69 6e 67 20 63 75 72 72 65 6e 74   storing current
36780 20 47 52 4f 55 50 20 42 59 20 2a 2f 0a 20 20 20   GROUP BY */.   
36790 20 69 6e 74 20 69 42 4d 65 6d 3b 20 20 20 20 20   int iBMem;     
367a0 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 4d 65       /* First Me
367b0 6d 20 61 64 64 72 65 73 73 20 66 6f 72 20 70 72  m address for pr
367c0 65 76 69 6f 75 73 20 47 52 4f 55 50 20 42 59 20  evious GROUP BY 
367d0 2a 2f 0a 20 20 20 20 69 6e 74 20 69 55 73 65 46  */.    int iUseF
367e0 6c 61 67 3b 20 20 20 20 20 20 20 2f 2a 20 4d 65  lag;       /* Me
367f0 6d 20 61 64 64 72 65 73 73 20 68 6f 6c 64 69 6e  m address holdin
36800 67 20 66 6c 61 67 20 69 6e 64 69 63 61 74 69 6e  g flag indicatin
36810 67 20 74 68 61 74 20 61 74 20 6c 65 61 73 74 0a  g that at least.
36820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36830 20 20 20 20 20 20 20 20 2a 2a 20 6f 6e 65 20 72          ** one r
36840 6f 77 20 6f 66 20 74 68 65 20 69 6e 70 75 74 20  ow of the input 
36850 74 6f 20 74 68 65 20 61 67 67 72 65 67 61 74 6f  to the aggregato
36860 72 20 68 61 73 20 62 65 65 6e 0a 20 20 20 20 20  r has been.     
36870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36880 20 20 20 2a 2a 20 70 72 6f 63 65 73 73 65 64 20     ** processed 
36890 2a 2f 0a 20 20 20 20 69 6e 74 20 69 41 62 6f 72  */.    int iAbor
368a0 74 46 6c 61 67 3b 20 20 20 20 20 2f 2a 20 4d 65  tFlag;     /* Me
368b0 6d 20 61 64 64 72 65 73 73 20 77 68 69 63 68 20  m address which 
368c0 63 61 75 73 65 73 20 71 75 65 72 79 20 61 62 6f  causes query abo
368d0 72 74 20 69 66 20 70 6f 73 69 74 69 76 65 20 2a  rt if positive *
368e0 2f 0a 20 20 20 20 69 6e 74 20 67 72 6f 75 70 42  /.    int groupB
368f0 79 53 6f 72 74 3b 20 20 20 20 2f 2a 20 52 6f 77  ySort;    /* Row
36900 73 20 63 6f 6d 65 20 66 72 6f 6d 20 73 6f 75 72  s come from sour
36910 63 65 20 69 6e 20 47 52 4f 55 50 20 42 59 20 6f  ce in GROUP BY o
36920 72 64 65 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20  rder */.    int 
36930 61 64 64 72 45 6e 64 3b 20 20 20 20 20 20 20 20  addrEnd;        
36940 2f 2a 20 45 6e 64 20 6f 66 20 70 72 6f 63 65 73  /* End of proces
36950 73 69 6e 67 20 66 6f 72 20 74 68 69 73 20 53 45  sing for this SE
36960 4c 45 43 54 20 2a 2f 0a 20 20 20 20 69 6e 74 20  LECT */.    int 
36970 73 6f 72 74 50 54 61 62 20 3d 20 30 3b 20 20 20  sortPTab = 0;   
36980 2f 2a 20 50 73 65 75 64 6f 74 61 62 6c 65 20 75  /* Pseudotable u
36990 73 65 64 20 74 6f 20 64 65 63 6f 64 65 20 73 6f  sed to decode so
369a0 72 74 69 6e 67 20 72 65 73 75 6c 74 73 20 2a 2f  rting results */
369b0 0a 20 20 20 20 69 6e 74 20 73 6f 72 74 4f 75 74  .    int sortOut
369c0 20 3d 20 30 3b 20 20 20 20 2f 2a 20 4f 75 74 70   = 0;    /* Outp
369d0 75 74 20 72 65 67 69 73 74 65 72 20 66 72 6f 6d  ut register from
369e0 20 74 68 65 20 73 6f 72 74 65 72 20 2a 2f 0a 20   the sorter */. 
369f0 20 20 20 69 6e 74 20 6f 72 64 65 72 42 79 47 72     int orderByGr
36a00 70 20 3d 20 30 3b 20 2f 2a 20 54 72 75 65 20 69  p = 0; /* True i
36a10 66 20 74 68 65 20 47 52 4f 55 50 20 42 59 20 61  f the GROUP BY a
36a20 6e 64 20 4f 52 44 45 52 20 42 59 20 61 72 65 20  nd ORDER BY are 
36a30 74 68 65 20 73 61 6d 65 20 2a 2f 0a 0a 20 20 20  the same */..   
36a40 20 2f 2a 20 52 65 6d 6f 76 65 20 61 6e 79 20 61   /* Remove any a
36a50 6e 64 20 61 6c 6c 20 61 6c 69 61 73 65 73 20 62  nd all aliases b
36a60 65 74 77 65 65 6e 20 74 68 65 20 72 65 73 75 6c  etween the resul
36a70 74 20 73 65 74 20 61 6e 64 20 74 68 65 0a 20 20  t set and the.  
36a80 20 20 2a 2a 20 47 52 4f 55 50 20 42 59 20 63 6c    ** GROUP BY cl
36a90 61 75 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ause..    */.   
36aa0 20 69 66 28 20 70 47 72 6f 75 70 42 79 20 29 7b   if( pGroupBy ){
36ab0 0a 20 20 20 20 20 20 69 6e 74 20 6b 3b 20 20 20  .      int k;   
36ac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36ad0 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
36ae0 6e 74 65 72 20 2a 2f 0a 20 20 20 20 20 20 73 74  nter */.      st
36af0 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74  ruct ExprList_it
36b00 65 6d 20 2a 70 49 74 65 6d 3b 20 20 2f 2a 20 46  em *pItem;  /* F
36b10 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20  or looping over 
36b20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 61 20  expression in a 
36b30 6c 69 73 74 20 2a 2f 0a 0a 20 20 20 20 20 20 66  list */..      f
36b40 6f 72 28 6b 3d 70 2d 3e 70 45 4c 69 73 74 2d 3e  or(k=p->pEList->
36b50 6e 45 78 70 72 2c 20 70 49 74 65 6d 3d 70 2d 3e  nExpr, pItem=p->
36b60 70 45 4c 69 73 74 2d 3e 61 3b 20 6b 3e 30 3b 20  pEList->a; k>0; 
36b70 6b 2d 2d 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20  k--, pItem++){. 
36b80 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 75 2e         pItem->u.
36b90 78 2e 69 41 6c 69 61 73 20 3d 20 30 3b 0a 20 20  x.iAlias = 0;.  
36ba0 20 20 20 20 7d 0a 20 20 20 20 20 20 66 6f 72 28      }.      for(
36bb0 6b 3d 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70  k=pGroupBy->nExp
36bc0 72 2c 20 70 49 74 65 6d 3d 70 47 72 6f 75 70 42  r, pItem=pGroupB
36bd0 79 2d 3e 61 3b 20 6b 3e 30 3b 20 6b 2d 2d 2c 20  y->a; k>0; k--, 
36be0 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20  pItem++){.      
36bf0 20 20 70 49 74 65 6d 2d 3e 75 2e 78 2e 69 41 6c    pItem->u.x.iAl
36c00 69 61 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  ias = 0;.      }
36c10 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 36  .      assert( 6
36c20 36 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74  6==sqlite3LogEst
36c30 28 31 30 30 29 20 29 3b 0a 20 20 20 20 20 20 69  (100) );.      i
36c40 66 28 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77  f( p->nSelectRow
36c50 3e 36 36 20 29 20 70 2d 3e 6e 53 65 6c 65 63 74  >66 ) p->nSelect
36c60 52 6f 77 20 3d 20 36 36 3b 0a 20 20 20 20 7d 65  Row = 66;.    }e
36c70 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72  lse{.      asser
36c80 74 28 20 30 3d 3d 73 71 6c 69 74 65 33 4c 6f 67  t( 0==sqlite3Log
36c90 45 73 74 28 31 29 20 29 3b 0a 20 20 20 20 20 20  Est(1) );.      
36ca0 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20  p->nSelectRow = 
36cb0 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  0;.    }..    /*
36cc0 20 49 66 20 74 68 65 72 65 20 69 73 20 62 6f 74   If there is bot
36cd0 68 20 61 20 47 52 4f 55 50 20 42 59 20 61 6e 64  h a GROUP BY and
36ce0 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61   an ORDER BY cla
36cf0 75 73 65 20 61 6e 64 20 74 68 65 79 20 61 72 65  use and they are
36d00 0a 20 20 20 20 2a 2a 20 69 64 65 6e 74 69 63 61  .    ** identica
36d10 6c 2c 20 74 68 65 6e 20 69 74 20 6d 61 79 20 62  l, then it may b
36d20 65 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 64 69  e possible to di
36d30 73 61 62 6c 65 20 74 68 65 20 4f 52 44 45 52 20  sable the ORDER 
36d40 42 59 20 63 6c 61 75 73 65 20 0a 20 20 20 20 2a  BY clause .    *
36d50 2a 20 6f 6e 20 74 68 65 20 67 72 6f 75 6e 64 73  * on the grounds
36d60 20 74 68 61 74 20 74 68 65 20 47 52 4f 55 50 20   that the GROUP 
36d70 42 59 20 77 69 6c 6c 20 63 61 75 73 65 20 65 6c  BY will cause el
36d80 65 6d 65 6e 74 73 20 74 6f 20 63 6f 6d 65 20 6f  ements to come o
36d90 75 74 20 0a 20 20 20 20 2a 2a 20 69 6e 20 74 68  ut .    ** in th
36da0 65 20 63 6f 72 72 65 63 74 20 6f 72 64 65 72 2e  e correct order.
36db0 20 49 74 20 61 6c 73 6f 20 6d 61 79 20 6e 6f 74   It also may not
36dc0 20 2d 20 74 68 65 20 47 52 4f 55 50 20 42 59 20   - the GROUP BY 
36dd0 6d 69 67 68 74 20 75 73 65 20 61 0a 20 20 20 20  might use a.    
36de0 2a 2a 20 64 61 74 61 62 61 73 65 20 69 6e 64 65  ** database inde
36df0 78 20 74 68 61 74 20 63 61 75 73 65 73 20 72 6f  x that causes ro
36e00 77 73 20 74 6f 20 62 65 20 67 72 6f 75 70 65 64  ws to be grouped
36e10 20 74 6f 67 65 74 68 65 72 20 61 73 20 72 65 71   together as req
36e20 75 69 72 65 64 0a 20 20 20 20 2a 2a 20 62 75 74  uired.    ** but
36e30 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 73 6f   not actually so
36e40 72 74 65 64 2e 20 45 69 74 68 65 72 20 77 61 79  rted. Either way
36e50 2c 20 72 65 63 6f 72 64 20 74 68 65 20 66 61 63  , record the fac
36e60 74 20 74 68 61 74 20 74 68 65 0a 20 20 20 20 2a  t that the.    *
36e70 2a 20 4f 52 44 45 52 20 42 59 20 61 6e 64 20 47  * ORDER BY and G
36e80 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 73 20  ROUP BY clauses 
36e90 61 72 65 20 74 68 65 20 73 61 6d 65 20 62 79 20  are the same by 
36ea0 73 65 74 74 69 6e 67 20 74 68 65 20 6f 72 64 65  setting the orde
36eb0 72 42 79 47 72 70 0a 20 20 20 20 2a 2a 20 76 61  rByGrp.    ** va
36ec0 72 69 61 62 6c 65 2e 20 20 2a 2f 0a 20 20 20 20  riable.  */.    
36ed0 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 4c  if( sqlite3ExprL
36ee0 69 73 74 43 6f 6d 70 61 72 65 28 70 47 72 6f 75  istCompare(pGrou
36ef0 70 42 79 2c 20 73 53 6f 72 74 2e 70 4f 72 64 65  pBy, sSort.pOrde
36f00 72 42 79 2c 20 2d 31 29 3d 3d 30 20 29 7b 0a 20  rBy, -1)==0 ){. 
36f10 20 20 20 20 20 6f 72 64 65 72 42 79 47 72 70 20       orderByGrp 
36f20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 0a 20 20 20  = 1;.    }. .   
36f30 20 2f 2a 20 43 72 65 61 74 65 20 61 20 6c 61 62   /* Create a lab
36f40 65 6c 20 74 6f 20 6a 75 6d 70 20 74 6f 20 77 68  el to jump to wh
36f50 65 6e 20 77 65 20 77 61 6e 74 20 74 6f 20 61 62  en we want to ab
36f60 6f 72 74 20 74 68 65 20 71 75 65 72 79 20 2a 2f  ort the query */
36f70 0a 20 20 20 20 61 64 64 72 45 6e 64 20 3d 20 73  .    addrEnd = s
36f80 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
36f90 62 65 6c 28 70 50 61 72 73 65 29 3b 0a 0a 20 20  bel(pParse);..  
36fa0 20 20 2f 2a 20 43 6f 6e 76 65 72 74 20 54 4b 5f    /* Convert TK_
36fb0 43 4f 4c 55 4d 4e 20 6e 6f 64 65 73 20 69 6e 74  COLUMN nodes int
36fc0 6f 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20  o TK_AGG_COLUMN 
36fd0 61 6e 64 20 6d 61 6b 65 20 65 6e 74 72 69 65 73  and make entries
36fe0 20 69 6e 0a 20 20 20 20 2a 2a 20 73 41 67 67 49   in.    ** sAggI
36ff0 6e 66 6f 20 66 6f 72 20 61 6c 6c 20 54 4b 5f 41  nfo for all TK_A
37000 47 47 5f 46 55 4e 43 54 49 4f 4e 20 6e 6f 64 65  GG_FUNCTION node
37010 73 20 69 6e 20 65 78 70 72 65 73 73 69 6f 6e 73  s in expressions
37020 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 53   of the.    ** S
37030 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e  ELECT statement.
37040 0a 20 20 20 20 2a 2f 0a 20 20 20 20 6d 65 6d 73  .    */.    mems
37050 65 74 28 26 73 4e 43 2c 20 30 2c 20 73 69 7a 65  et(&sNC, 0, size
37060 6f 66 28 73 4e 43 29 29 3b 0a 20 20 20 20 73 4e  of(sNC));.    sN
37070 43 2e 70 50 61 72 73 65 20 3d 20 70 50 61 72 73  C.pParse = pPars
37080 65 3b 0a 20 20 20 20 73 4e 43 2e 70 53 72 63 4c  e;.    sNC.pSrcL
37090 69 73 74 20 3d 20 70 54 61 62 4c 69 73 74 3b 0a  ist = pTabList;.
370a0 20 20 20 20 73 4e 43 2e 75 4e 43 2e 70 41 67 67      sNC.uNC.pAgg
370b0 49 6e 66 6f 20 3d 20 26 73 41 67 67 49 6e 66 6f  Info = &sAggInfo
370c0 3b 0a 20 20 20 20 56 56 41 5f 4f 4e 4c 59 28 20  ;.    VVA_ONLY( 
370d0 73 4e 43 2e 6e 63 46 6c 61 67 73 20 3d 20 4e 43  sNC.ncFlags = NC
370e0 5f 55 41 67 67 49 6e 66 6f 3b 20 29 0a 20 20 20  _UAggInfo; ).   
370f0 20 73 41 67 67 49 6e 66 6f 2e 6d 6e 52 65 67 20   sAggInfo.mnReg 
37100 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31  = pParse->nMem+1
37110 3b 0a 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 6e  ;.    sAggInfo.n
37120 53 6f 72 74 69 6e 67 43 6f 6c 75 6d 6e 20 3d 20  SortingColumn = 
37130 70 47 72 6f 75 70 42 79 20 3f 20 70 47 72 6f 75  pGroupBy ? pGrou
37140 70 42 79 2d 3e 6e 45 78 70 72 20 3a 20 30 3b 0a  pBy->nExpr : 0;.
37150 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 70 47 72      sAggInfo.pGr
37160 6f 75 70 42 79 20 3d 20 70 47 72 6f 75 70 42 79  oupBy = pGroupBy
37170 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  ;.    sqlite3Exp
37180 72 41 6e 61 6c 79 7a 65 41 67 67 4c 69 73 74 28  rAnalyzeAggList(
37190 26 73 4e 43 2c 20 70 45 4c 69 73 74 29 3b 0a 20  &sNC, pEList);. 
371a0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e     sqlite3ExprAn
371b0 61 6c 79 7a 65 41 67 67 4c 69 73 74 28 26 73 4e  alyzeAggList(&sN
371c0 43 2c 20 73 53 6f 72 74 2e 70 4f 72 64 65 72 42  C, sSort.pOrderB
371d0 79 29 3b 0a 20 20 20 20 69 66 28 20 70 48 61 76  y);.    if( pHav
371e0 69 6e 67 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ing ){.      if(
371f0 20 70 47 72 6f 75 70 42 79 20 29 7b 0a 20 20 20   pGroupBy ){.   
37200 20 20 20 20 20 61 73 73 65 72 74 28 20 70 57 68       assert( pWh
37210 65 72 65 3d 3d 70 2d 3e 70 57 68 65 72 65 20 29  ere==p->pWhere )
37220 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
37230 28 20 70 48 61 76 69 6e 67 3d 3d 70 2d 3e 70 48  ( pHaving==p->pH
37240 61 76 69 6e 67 20 29 3b 0a 20 20 20 20 20 20 20  aving );.       
37250 20 61 73 73 65 72 74 28 20 70 47 72 6f 75 70 42   assert( pGroupB
37260 79 3d 3d 70 2d 3e 70 47 72 6f 75 70 42 79 20 29  y==p->pGroupBy )
37270 3b 0a 20 20 20 20 20 20 20 20 68 61 76 69 6e 67  ;.        having
37280 54 6f 57 68 65 72 65 28 70 50 61 72 73 65 2c 20  ToWhere(pParse, 
37290 70 29 3b 0a 20 20 20 20 20 20 20 20 70 57 68 65  p);.        pWhe
372a0 72 65 20 3d 20 70 2d 3e 70 57 68 65 72 65 3b 0a  re = p->pWhere;.
372b0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
372c0 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65  lite3ExprAnalyze
372d0 41 67 67 72 65 67 61 74 65 73 28 26 73 4e 43 2c  Aggregates(&sNC,
372e0 20 70 48 61 76 69 6e 67 29 3b 0a 20 20 20 20 7d   pHaving);.    }
372f0 0a 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 6e 41  .    sAggInfo.nA
37300 63 63 75 6d 75 6c 61 74 6f 72 20 3d 20 73 41 67  ccumulator = sAg
37310 67 49 6e 66 6f 2e 6e 43 6f 6c 75 6d 6e 3b 0a 20  gInfo.nColumn;. 
37320 20 20 20 69 66 28 20 70 2d 3e 70 47 72 6f 75 70     if( p->pGroup
37330 42 79 3d 3d 30 20 26 26 20 70 2d 3e 70 48 61 76  By==0 && p->pHav
37340 69 6e 67 3d 3d 30 20 26 26 20 73 41 67 67 49 6e  ing==0 && sAggIn
37350 66 6f 2e 6e 46 75 6e 63 3d 3d 31 20 29 7b 0a 20  fo.nFunc==1 ){. 
37360 20 20 20 20 20 6d 69 6e 4d 61 78 46 6c 61 67 20       minMaxFlag 
37370 3d 20 6d 69 6e 4d 61 78 51 75 65 72 79 28 64 62  = minMaxQuery(db
37380 2c 20 73 41 67 67 49 6e 66 6f 2e 61 46 75 6e 63  , sAggInfo.aFunc
37390 5b 30 5d 2e 70 45 78 70 72 2c 20 26 70 4d 69 6e  [0].pExpr, &pMin
373a0 4d 61 78 4f 72 64 65 72 42 79 29 3b 0a 20 20 20  MaxOrderBy);.   
373b0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6d 69   }else{.      mi
373c0 6e 4d 61 78 46 6c 61 67 20 3d 20 57 48 45 52 45  nMaxFlag = WHERE
373d0 5f 4f 52 44 45 52 42 59 5f 4e 4f 52 4d 41 4c 3b  _ORDERBY_NORMAL;
373e0 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69  .    }.    for(i
373f0 3d 30 3b 20 69 3c 73 41 67 67 49 6e 66 6f 2e 6e  =0; i<sAggInfo.n
37400 46 75 6e 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Func; i++){.    
37410 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20    Expr *pExpr = 
37420 73 41 67 67 49 6e 66 6f 2e 61 46 75 6e 63 5b 69  sAggInfo.aFunc[i
37430 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 61  ].pExpr;.      a
37440 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50  ssert( !ExprHasP
37450 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
37460 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a  P_xIsSelect) );.
37470 20 20 20 20 20 20 73 4e 43 2e 6e 63 46 6c 61 67        sNC.ncFlag
37480 73 20 7c 3d 20 4e 43 5f 49 6e 41 67 67 46 75 6e  s |= NC_InAggFun
37490 63 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  c;.      sqlite3
374a0 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 4c 69  ExprAnalyzeAggLi
374b0 73 74 28 26 73 4e 43 2c 20 70 45 78 70 72 2d 3e  st(&sNC, pExpr->
374c0 78 2e 70 4c 69 73 74 29 3b 0a 23 69 66 6e 64 65  x.pList);.#ifnde
374d0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 49  f SQLITE_OMIT_WI
374e0 4e 44 4f 57 46 55 4e 43 0a 20 20 20 20 20 20 61  NDOWFUNC.      a
374f0 73 73 65 72 74 28 20 21 49 73 57 69 6e 64 6f 77  ssert( !IsWindow
37500 46 75 6e 63 28 70 45 78 70 72 29 20 29 3b 0a 20  Func(pExpr) );. 
37510 20 20 20 20 20 69 66 28 20 45 78 70 72 48 61 73       if( ExprHas
37520 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
37530 45 50 5f 57 69 6e 46 75 6e 63 29 20 29 7b 0a 20  EP_WinFunc) ){. 
37540 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
37550 70 72 41 6e 61 6c 79 7a 65 41 67 67 72 65 67 61  prAnalyzeAggrega
37560 74 65 73 28 26 73 4e 43 2c 20 70 45 78 70 72 2d  tes(&sNC, pExpr-
37570 3e 79 2e 70 57 69 6e 2d 3e 70 46 69 6c 74 65 72  >y.pWin->pFilter
37580 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69  );.      }.#endi
37590 66 0a 20 20 20 20 20 20 73 4e 43 2e 6e 63 46 6c  f.      sNC.ncFl
375a0 61 67 73 20 26 3d 20 7e 4e 43 5f 49 6e 41 67 67  ags &= ~NC_InAgg
375b0 46 75 6e 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Func;.    }.    
375c0 73 41 67 67 49 6e 66 6f 2e 6d 78 52 65 67 20 3d  sAggInfo.mxReg =
375d0 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20   pParse->nMem;. 
375e0 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f     if( db->mallo
375f0 63 46 61 69 6c 65 64 20 29 20 67 6f 74 6f 20 73  cFailed ) goto s
37600 65 6c 65 63 74 5f 65 6e 64 3b 0a 23 69 66 20 53  elect_end;.#if S
37610 45 4c 45 43 54 54 52 41 43 45 5f 45 4e 41 42 4c  ELECTTRACE_ENABL
37620 45 44 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  ED.    if( sqlit
37630 65 33 53 65 6c 65 63 74 54 72 61 63 65 20 26 20  e3SelectTrace & 
37640 30 78 34 30 30 20 29 7b 0a 20 20 20 20 20 20 69  0x400 ){.      i
37650 6e 74 20 69 69 3b 0a 20 20 20 20 20 20 53 45 4c  nt ii;.      SEL
37660 45 43 54 54 52 41 43 45 28 30 78 34 30 30 2c 70  ECTTRACE(0x400,p
37670 50 61 72 73 65 2c 70 2c 28 22 41 66 74 65 72 20  Parse,p,("After 
37680 61 67 67 72 65 67 61 74 65 20 61 6e 61 6c 79 73  aggregate analys
37690 69 73 3a 5c 6e 22 29 29 3b 0a 20 20 20 20 20 20  is:\n"));.      
376a0 73 71 6c 69 74 65 33 54 72 65 65 56 69 65 77 53  sqlite3TreeViewS
376b0 65 6c 65 63 74 28 30 2c 20 70 2c 20 30 29 3b 0a  elect(0, p, 0);.
376c0 20 20 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20        for(ii=0; 
376d0 69 69 3c 73 41 67 67 49 6e 66 6f 2e 6e 43 6f 6c  ii<sAggInfo.nCol
376e0 75 6d 6e 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20  umn; ii++){.    
376f0 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
37700 50 72 69 6e 74 66 28 22 61 67 67 2d 63 6f 6c 75  Printf("agg-colu
37710 6d 6e 5b 25 64 5d 20 69 4d 65 6d 3d 25 64 5c 6e  mn[%d] iMem=%d\n
37720 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ",.            i
37730 69 2c 20 73 41 67 67 49 6e 66 6f 2e 61 43 6f 6c  i, sAggInfo.aCol
37740 5b 69 69 5d 2e 69 4d 65 6d 29 3b 0a 20 20 20 20  [ii].iMem);.    
37750 20 20 20 20 73 71 6c 69 74 65 33 54 72 65 65 56      sqlite3TreeV
37760 69 65 77 45 78 70 72 28 30 2c 20 73 41 67 67 49  iewExpr(0, sAggI
37770 6e 66 6f 2e 61 43 6f 6c 5b 69 69 5d 2e 70 45 78  nfo.aCol[ii].pEx
37780 70 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a  pr, 0);.      }.
37790 20 20 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20        for(ii=0; 
377a0 69 69 3c 73 41 67 67 49 6e 66 6f 2e 6e 46 75 6e  ii<sAggInfo.nFun
377b0 63 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20  c; ii++){.      
377c0 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
377d0 69 6e 74 66 28 22 61 67 67 2d 66 75 6e 63 5b 25  intf("agg-func[%
377e0 64 5d 3a 20 69 4d 65 6d 3d 25 64 5c 6e 22 2c 0a  d]: iMem=%d\n",.
377f0 20 20 20 20 20 20 20 20 20 20 20 20 69 69 2c 20              ii, 
37800 73 41 67 67 49 6e 66 6f 2e 61 46 75 6e 63 5b 69  sAggInfo.aFunc[i
37810 69 5d 2e 69 4d 65 6d 29 3b 0a 20 20 20 20 20 20  i].iMem);.      
37820 20 20 73 71 6c 69 74 65 33 54 72 65 65 56 69 65    sqlite3TreeVie
37830 77 45 78 70 72 28 30 2c 20 73 41 67 67 49 6e 66  wExpr(0, sAggInf
37840 6f 2e 61 46 75 6e 63 5b 69 69 5d 2e 70 45 78 70  o.aFunc[ii].pExp
37850 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20  r, 0);.      }. 
37860 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 0a 20 20     }.#endif...  
37870 20 20 2f 2a 20 50 72 6f 63 65 73 73 69 6e 67 20    /* Processing 
37880 66 6f 72 20 61 67 67 72 65 67 61 74 65 73 20 77  for aggregates w
37890 69 74 68 20 47 52 4f 55 50 20 42 59 20 69 73 20  ith GROUP BY is 
378a0 76 65 72 79 20 64 69 66 66 65 72 65 6e 74 20 61  very different a
378b0 6e 64 0a 20 20 20 20 2a 2a 20 6d 75 63 68 20 6d  nd.    ** much m
378c0 6f 72 65 20 63 6f 6d 70 6c 65 78 20 74 68 61 6e  ore complex than
378d0 20 61 67 67 72 65 67 61 74 65 73 20 77 69 74 68   aggregates with
378e0 6f 75 74 20 61 20 47 52 4f 55 50 20 42 59 2e 0a  out a GROUP BY..
378f0 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
37900 47 72 6f 75 70 42 79 20 29 7b 0a 20 20 20 20 20  GroupBy ){.     
37910 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e   KeyInfo *pKeyIn
37920 66 6f 3b 20 20 2f 2a 20 4b 65 79 69 6e 67 20 69  fo;  /* Keying i
37930 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20 74  nformation for t
37940 68 65 20 67 72 6f 75 70 20 62 79 20 63 6c 61 75  he group by clau
37950 73 65 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  se */.      int 
37960 61 64 64 72 31 3b 20 20 20 20 20 20 20 20 20 20  addr1;          
37970 2f 2a 20 41 2d 76 73 2d 42 20 63 6f 6d 70 61 72  /* A-vs-B compar
37980 69 73 69 6f 6e 20 6a 75 6d 70 20 2a 2f 0a 20 20  ision jump */.  
37990 20 20 20 20 69 6e 74 20 61 64 64 72 4f 75 74 70      int addrOutp
379a0 75 74 52 6f 77 3b 20 20 2f 2a 20 53 74 61 72 74  utRow;  /* Start
379b0 20 6f 66 20 73 75 62 72 6f 75 74 69 6e 65 20 74   of subroutine t
379c0 68 61 74 20 6f 75 74 70 75 74 73 20 61 20 72 65  hat outputs a re
379d0 73 75 6c 74 20 72 6f 77 20 2a 2f 0a 20 20 20 20  sult row */.    
379e0 20 20 69 6e 74 20 72 65 67 4f 75 74 70 75 74 52    int regOutputR
379f0 6f 77 3b 20 20 20 2f 2a 20 52 65 74 75 72 6e 20  ow;   /* Return 
37a00 61 64 64 72 65 73 73 20 72 65 67 69 73 74 65 72  address register
37a10 20 66 6f 72 20 6f 75 74 70 75 74 20 73 75 62 72   for output subr
37a20 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 20 20 20 20  outine */.      
37a30 69 6e 74 20 61 64 64 72 53 65 74 41 62 6f 72 74  int addrSetAbort
37a40 3b 20 20 20 2f 2a 20 53 65 74 20 74 68 65 20 61  ;   /* Set the a
37a50 62 6f 72 74 20 66 6c 61 67 20 61 6e 64 20 72 65  bort flag and re
37a60 74 75 72 6e 20 2a 2f 0a 20 20 20 20 20 20 69 6e  turn */.      in
37a70 74 20 61 64 64 72 54 6f 70 4f 66 4c 6f 6f 70 3b  t addrTopOfLoop;
37a80 20 20 2f 2a 20 54 6f 70 20 6f 66 20 74 68 65 20    /* Top of the 
37a90 69 6e 70 75 74 20 6c 6f 6f 70 20 2a 2f 0a 20 20  input loop */.  
37aa0 20 20 20 20 69 6e 74 20 61 64 64 72 53 6f 72 74      int addrSort
37ab0 69 6e 67 49 64 78 3b 20 2f 2a 20 54 68 65 20 4f  ingIdx; /* The O
37ac0 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 20  P_OpenEphemeral 
37ad0 66 6f 72 20 74 68 65 20 73 6f 72 74 69 6e 67 20  for the sorting 
37ae0 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 20 20 69  index */.      i
37af0 6e 74 20 61 64 64 72 52 65 73 65 74 3b 20 20 20  nt addrReset;   
37b00 20 20 20 2f 2a 20 53 75 62 72 6f 75 74 69 6e 65     /* Subroutine
37b10 20 66 6f 72 20 72 65 73 65 74 74 69 6e 67 20 74   for resetting t
37b20 68 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 20 2a  he accumulator *
37b30 2f 0a 20 20 20 20 20 20 69 6e 74 20 72 65 67 52  /.      int regR
37b40 65 73 65 74 3b 20 20 20 20 20 20 20 2f 2a 20 52  eset;       /* R
37b50 65 74 75 72 6e 20 61 64 64 72 65 73 73 20 72 65  eturn address re
37b60 67 69 73 74 65 72 20 66 6f 72 20 72 65 73 65 74  gister for reset
37b70 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 0a   subroutine */..
37b80 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72        /* If ther
37b90 65 20 69 73 20 61 20 47 52 4f 55 50 20 42 59 20  e is a GROUP BY 
37ba0 63 6c 61 75 73 65 20 77 65 20 6d 69 67 68 74 20  clause we might 
37bb0 6e 65 65 64 20 61 20 73 6f 72 74 69 6e 67 20 69  need a sorting i
37bc0 6e 64 65 78 20 74 6f 0a 20 20 20 20 20 20 2a 2a  ndex to.      **
37bd0 20 69 6d 70 6c 65 6d 65 6e 74 20 69 74 2e 20 20   implement it.  
37be0 41 6c 6c 6f 63 61 74 65 20 74 68 61 74 20 73 6f  Allocate that so
37bf0 72 74 69 6e 67 20 69 6e 64 65 78 20 6e 6f 77 2e  rting index now.
37c00 20 20 49 66 20 69 74 20 74 75 72 6e 73 20 6f 75    If it turns ou
37c10 74 0a 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20  t.      ** that 
37c20 77 65 20 64 6f 20 6e 6f 74 20 6e 65 65 64 20 69  we do not need i
37c30 74 20 61 66 74 65 72 20 61 6c 6c 2c 20 74 68 65  t after all, the
37c40 20 4f 50 5f 53 6f 72 74 65 72 4f 70 65 6e 20 69   OP_SorterOpen i
37c50 6e 73 74 72 75 63 74 69 6f 6e 0a 20 20 20 20 20  nstruction.     
37c60 20 2a 2a 20 77 69 6c 6c 20 62 65 20 63 6f 6e 76   ** will be conv
37c70 65 72 74 65 64 20 69 6e 74 6f 20 61 20 4e 6f 6f  erted into a Noo
37c80 70 2e 20 20 0a 20 20 20 20 20 20 2a 2f 0a 20 20  p.  .      */.  
37c90 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72      sAggInfo.sor
37ca0 74 69 6e 67 49 64 78 20 3d 20 70 50 61 72 73 65  tingIdx = pParse
37cb0 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20  ->nTab++;.      
37cc0 70 4b 65 79 49 6e 66 6f 20 3d 20 73 71 6c 69 74  pKeyInfo = sqlit
37cd0 65 33 4b 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70  e3KeyInfoFromExp
37ce0 72 4c 69 73 74 28 70 50 61 72 73 65 2c 70 47 72  rList(pParse,pGr
37cf0 6f 75 70 42 79 2c 30 2c 73 41 67 67 49 6e 66 6f  oupBy,0,sAggInfo
37d00 2e 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20  .nColumn);.     
37d10 20 61 64 64 72 53 6f 72 74 69 6e 67 49 64 78 20   addrSortingIdx 
37d20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
37d30 4f 70 34 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72  Op4(v, OP_Sorter
37d40 4f 70 65 6e 2c 20 0a 20 20 20 20 20 20 20 20 20  Open, .         
37d50 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e   sAggInfo.sortin
37d60 67 49 64 78 2c 20 73 41 67 67 49 6e 66 6f 2e 6e  gIdx, sAggInfo.n
37d70 53 6f 72 74 69 6e 67 43 6f 6c 75 6d 6e 2c 20 0a  SortingColumn, .
37d80 20 20 20 20 20 20 20 20 20 20 30 2c 20 28 63 68            0, (ch
37d90 61 72 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50 34  ar*)pKeyInfo, P4
37da0 5f 4b 45 59 49 4e 46 4f 29 3b 0a 0a 20 20 20 20  _KEYINFO);..    
37db0 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20    /* Initialize 
37dc0 6d 65 6d 6f 72 79 20 6c 6f 63 61 74 69 6f 6e 73  memory locations
37dd0 20 75 73 65 64 20 62 79 20 47 52 4f 55 50 20 42   used by GROUP B
37de0 59 20 61 67 67 72 65 67 61 74 65 20 70 72 6f 63  Y aggregate proc
37df0 65 73 73 69 6e 67 0a 20 20 20 20 20 20 2a 2f 0a  essing.      */.
37e00 20 20 20 20 20 20 69 55 73 65 46 6c 61 67 20 3d        iUseFlag =
37e10 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
37e20 0a 20 20 20 20 20 20 69 41 62 6f 72 74 46 6c 61  .      iAbortFla
37e30 67 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  g = ++pParse->nM
37e40 65 6d 3b 0a 20 20 20 20 20 20 72 65 67 4f 75 74  em;.      regOut
37e50 70 75 74 52 6f 77 20 3d 20 2b 2b 70 50 61 72 73  putRow = ++pPars
37e60 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 61  e->nMem;.      a
37e70 64 64 72 4f 75 74 70 75 74 52 6f 77 20 3d 20 73  ddrOutputRow = s
37e80 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
37e90 62 65 6c 28 70 50 61 72 73 65 29 3b 0a 20 20 20  bel(pParse);.   
37ea0 20 20 20 72 65 67 52 65 73 65 74 20 3d 20 2b 2b     regReset = ++
37eb0 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
37ec0 20 20 20 20 61 64 64 72 52 65 73 65 74 20 3d 20      addrReset = 
37ed0 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
37ee0 61 62 65 6c 28 70 50 61 72 73 65 29 3b 0a 20 20  abel(pParse);.  
37ef0 20 20 20 20 69 41 4d 65 6d 20 3d 20 70 50 61 72      iAMem = pPar
37f00 73 65 2d 3e 6e 4d 65 6d 20 2b 20 31 3b 0a 20 20  se->nMem + 1;.  
37f10 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d      pParse->nMem
37f20 20 2b 3d 20 70 47 72 6f 75 70 42 79 2d 3e 6e 45   += pGroupBy->nE
37f30 78 70 72 3b 0a 20 20 20 20 20 20 69 42 4d 65 6d  xpr;.      iBMem
37f40 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20   = pParse->nMem 
37f50 2b 20 31 3b 0a 20 20 20 20 20 20 70 50 61 72 73  + 1;.      pPars
37f60 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 70 47 72 6f 75  e->nMem += pGrou
37f70 70 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20  pBy->nExpr;.    
37f80 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
37f90 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  Op2(v, OP_Intege
37fa0 72 2c 20 30 2c 20 69 41 62 6f 72 74 46 6c 61 67  r, 0, iAbortFlag
37fb0 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d  );.      VdbeCom
37fc0 6d 65 6e 74 28 28 76 2c 20 22 63 6c 65 61 72 20  ment((v, "clear 
37fd0 61 62 6f 72 74 20 66 6c 61 67 22 29 29 3b 0a 20  abort flag"));. 
37fe0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
37ff0 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4e 75 6c  AddOp3(v, OP_Nul
38000 6c 2c 20 30 2c 20 69 41 4d 65 6d 2c 20 69 41 4d  l, 0, iAMem, iAM
38010 65 6d 2b 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78  em+pGroupBy->nEx
38020 70 72 2d 31 29 3b 0a 0a 20 20 20 20 20 20 2f 2a  pr-1);..      /*
38030 20 42 65 67 69 6e 20 61 20 6c 6f 6f 70 20 74 68   Begin a loop th
38040 61 74 20 77 69 6c 6c 20 65 78 74 72 61 63 74 20  at will extract 
38050 61 6c 6c 20 73 6f 75 72 63 65 20 72 6f 77 73 20  all source rows 
38060 69 6e 20 47 52 4f 55 50 20 42 59 20 6f 72 64 65  in GROUP BY orde
38070 72 2e 0a 20 20 20 20 20 20 2a 2a 20 54 68 69 73  r..      ** This
38080 20 6d 69 67 68 74 20 69 6e 76 6f 6c 76 65 20 74   might involve t
38090 77 6f 20 73 65 70 61 72 61 74 65 20 6c 6f 6f 70  wo separate loop
380a0 73 20 77 69 74 68 20 61 6e 20 4f 50 5f 53 6f 72  s with an OP_Sor
380b0 74 20 69 6e 20 62 65 74 77 65 65 6e 2c 20 6f 72  t in between, or
380c0 0a 20 20 20 20 20 20 2a 2a 20 69 74 20 6d 69 67  .      ** it mig
380d0 68 74 20 62 65 20 61 20 73 69 6e 67 6c 65 20 6c  ht be a single l
380e0 6f 6f 70 20 74 68 61 74 20 75 73 65 73 20 61 6e  oop that uses an
380f0 20 69 6e 64 65 78 20 74 6f 20 65 78 74 72 61 63   index to extrac
38100 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a 20 20  t information.  
38110 20 20 20 20 2a 2a 20 69 6e 20 74 68 65 20 72 69      ** in the ri
38120 67 68 74 20 6f 72 64 65 72 20 74 6f 20 62 65 67  ght order to beg
38130 69 6e 20 77 69 74 68 2e 0a 20 20 20 20 20 20 2a  in with..      *
38140 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  /.      sqlite3V
38150 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
38160 47 6f 73 75 62 2c 20 72 65 67 52 65 73 65 74 2c  Gosub, regReset,
38170 20 61 64 64 72 52 65 73 65 74 29 3b 0a 20 20 20   addrReset);.   
38180 20 20 20 53 45 4c 45 43 54 54 52 41 43 45 28 31     SELECTTRACE(1
38190 2c 70 50 61 72 73 65 2c 70 2c 28 22 57 68 65 72  ,pParse,p,("Wher
381a0 65 42 65 67 69 6e 5c 6e 22 29 29 3b 0a 20 20 20  eBegin\n"));.   
381b0 20 20 20 70 57 49 6e 66 6f 20 3d 20 73 71 6c 69     pWInfo = sqli
381c0 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 70 50  te3WhereBegin(pP
381d0 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20  arse, pTabList, 
381e0 70 57 68 65 72 65 2c 20 70 47 72 6f 75 70 42 79  pWhere, pGroupBy
381f0 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 57  , 0,.          W
38200 48 45 52 45 5f 47 52 4f 55 50 42 59 20 7c 20 28  HERE_GROUPBY | (
38210 6f 72 64 65 72 42 79 47 72 70 20 3f 20 57 48 45  orderByGrp ? WHE
38220 52 45 5f 53 4f 52 54 42 59 47 52 4f 55 50 20 3a  RE_SORTBYGROUP :
38230 20 30 29 2c 20 30 0a 20 20 20 20 20 20 29 3b 0a   0), 0.      );.
38240 20 20 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f        if( pWInfo
38250 3d 3d 30 20 29 20 67 6f 74 6f 20 73 65 6c 65 63  ==0 ) goto selec
38260 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 69 66 28  t_end;.      if(
38270 20 73 71 6c 69 74 65 33 57 68 65 72 65 49 73 4f   sqlite3WhereIsO
38280 72 64 65 72 65 64 28 70 57 49 6e 66 6f 29 3d 3d  rdered(pWInfo)==
38290 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 20  pGroupBy->nExpr 
382a0 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ){.        /* Th
382b0 65 20 6f 70 74 69 6d 69 7a 65 72 20 69 73 20 61  e optimizer is a
382c0 62 6c 65 20 74 6f 20 64 65 6c 69 76 65 72 20 72  ble to deliver r
382d0 6f 77 73 20 69 6e 20 67 72 6f 75 70 20 62 79 20  ows in group by 
382e0 6f 72 64 65 72 20 73 6f 0a 20 20 20 20 20 20 20  order so.       
382f0 20 2a 2a 20 77 65 20 64 6f 20 6e 6f 74 20 68 61   ** we do not ha
38300 76 65 20 74 6f 20 73 6f 72 74 2e 20 20 54 68 65  ve to sort.  The
38310 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61   OP_OpenEphemera
38320 6c 20 74 61 62 6c 65 20 77 69 6c 6c 20 62 65 0a  l table will be.
38330 20 20 20 20 20 20 20 20 2a 2a 20 63 61 6e 63 65          ** cance
38340 6c 6c 65 64 20 6c 61 74 65 72 20 62 65 63 61 75  lled later becau
38350 73 65 20 77 65 20 73 74 69 6c 6c 20 6e 65 65 64  se we still need
38360 20 74 6f 20 75 73 65 20 74 68 65 20 70 4b 65 79   to use the pKey
38370 49 6e 66 6f 0a 20 20 20 20 20 20 20 20 2a 2f 0a  Info.        */.
38380 20 20 20 20 20 20 20 20 67 72 6f 75 70 42 79 53          groupByS
38390 6f 72 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  ort = 0;.      }
383a0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a  else{.        /*
383b0 20 52 6f 77 73 20 61 72 65 20 63 6f 6d 69 6e 67   Rows are coming
383c0 20 6f 75 74 20 69 6e 20 75 6e 64 65 74 65 72 6d   out in undeterm
383d0 69 6e 65 64 20 6f 72 64 65 72 2e 20 20 57 65 20  ined order.  We 
383e0 68 61 76 65 20 74 6f 20 70 75 73 68 0a 20 20 20  have to push.   
383f0 20 20 20 20 20 2a 2a 20 65 61 63 68 20 72 6f 77       ** each row
38400 20 69 6e 74 6f 20 61 20 73 6f 72 74 69 6