/ Hex Artifact Content
Login

Artifact ed6192ddd09a97169cb1c6d732b26c0f647b72d5fa8ca401c7ee1180fbbe521a:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ******.** This f
0180: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 43 20 63  ile contains C c
0190: 6f 64 65 20 72 6f 75 74 69 6e 65 73 20 74 68 61  ode routines tha
01a0: 74 20 61 72 65 20 63 61 6c 6c 65 64 20 62 79 20  t are called by 
01b0: 74 68 65 20 70 61 72 73 65 72 0a 2a 2a 20 74 6f  the parser.** to
01c0: 20 68 61 6e 64 6c 65 20 53 45 4c 45 43 54 20 73   handle SELECT s
01d0: 74 61 74 65 6d 65 6e 74 73 20 69 6e 20 53 51 4c  tatements in SQL
01e0: 69 74 65 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65  ite..*/.#include
01f0: 20 22 73 71 6c 69 74 65 49 6e 74 2e 68 22 0a 0a   "sqliteInt.h"..
0200: 2f 2a 0a 2a 2a 20 54 72 61 63 65 20 6f 75 74 70  /*.** Trace outp
0210: 75 74 20 6d 61 63 72 6f 73 0a 2a 2f 0a 23 69 66  ut macros.*/.#if
0220: 20 53 45 4c 45 43 54 54 52 41 43 45 5f 45 4e 41   SELECTTRACE_ENA
0230: 42 4c 45 44 0a 2f 2a 2a 2a 2f 20 69 6e 74 20 73  BLED./***/ int s
0240: 71 6c 69 74 65 33 53 65 6c 65 63 74 54 72 61 63  qlite3SelectTrac
0250: 65 20 3d 20 30 3b 0a 23 20 64 65 66 69 6e 65 20  e = 0;.# define 
0260: 53 45 4c 45 43 54 54 52 41 43 45 28 4b 2c 50 2c  SELECTTRACE(K,P,
0270: 53 2c 58 29 20 20 5c 0a 20 20 69 66 28 73 71 6c  S,X)  \.  if(sql
0280: 69 74 65 33 53 65 6c 65 63 74 54 72 61 63 65 26  ite3SelectTrace&
0290: 28 4b 29 29 20 20 20 5c 0a 20 20 20 20 73 71 6c  (K))   \.    sql
02a0: 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
02b0: 22 25 75 2f 25 64 2f 25 70 3a 20 22 2c 28 53 29  "%u/%d/%p: ",(S)
02c0: 2d 3e 73 65 6c 49 64 2c 28 50 29 2d 3e 61 64 64  ->selId,(P)->add
02d0: 72 45 78 70 6c 61 69 6e 2c 28 53 29 29 2c 5c 0a  rExplain,(S)),\.
02e0: 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
02f0: 50 72 69 6e 74 66 20 58 0a 23 65 6c 73 65 0a 23  Printf X.#else.#
0300: 20 64 65 66 69 6e 65 20 53 45 4c 45 43 54 54 52   define SELECTTR
0310: 41 43 45 28 4b 2c 50 2c 53 2c 58 29 0a 23 65 6e  ACE(K,P,S,X).#en
0320: 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69  dif.../*.** An i
0330: 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66  nstance of the f
0340: 6f 6c 6c 6f 77 69 6e 67 20 6f 62 6a 65 63 74 20  ollowing object 
0350: 69 73 20 75 73 65 64 20 74 6f 20 72 65 63 6f 72  is used to recor
0360: 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62  d information ab
0370: 6f 75 74 0a 2a 2a 20 68 6f 77 20 74 6f 20 70 72  out.** how to pr
0380: 6f 63 65 73 73 20 74 68 65 20 44 49 53 54 49 4e  ocess the DISTIN
0390: 43 54 20 6b 65 79 77 6f 72 64 2c 20 74 6f 20 73  CT keyword, to s
03a0: 69 6d 70 6c 69 66 79 20 70 61 73 73 69 6e 67 20  implify passing 
03b0: 74 68 61 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  that information
03c0: 0a 2a 2a 20 69 6e 74 6f 20 74 68 65 20 73 65 6c  .** into the sel
03d0: 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 29 20 72  ectInnerLoop() r
03e0: 6f 75 74 69 6e 65 2e 0a 2a 2f 0a 74 79 70 65 64  outine..*/.typed
03f0: 65 66 20 73 74 72 75 63 74 20 44 69 73 74 69 6e  ef struct Distin
0400: 63 74 43 74 78 20 44 69 73 74 69 6e 63 74 43 74  ctCtx DistinctCt
0410: 78 3b 0a 73 74 72 75 63 74 20 44 69 73 74 69 6e  x;.struct Distin
0420: 63 74 43 74 78 20 7b 0a 20 20 75 38 20 69 73 54  ctCtx {.  u8 isT
0430: 6e 63 74 3b 20 20 20 20 20 20 2f 2a 20 54 72 75  nct;      /* Tru
0440: 65 20 69 66 20 74 68 65 20 44 49 53 54 49 4e 43  e if the DISTINC
0450: 54 20 6b 65 79 77 6f 72 64 20 69 73 20 70 72 65  T keyword is pre
0460: 73 65 6e 74 20 2a 2f 0a 20 20 75 38 20 65 54 6e  sent */.  u8 eTn
0470: 63 74 54 79 70 65 3b 20 20 20 2f 2a 20 4f 6e 65  ctType;   /* One
0480: 20 6f 66 20 74 68 65 20 57 48 45 52 45 5f 44 49   of the WHERE_DI
0490: 53 54 49 4e 43 54 5f 2a 20 6f 70 65 72 61 74 6f  STINCT_* operato
04a0: 72 73 20 2a 2f 0a 20 20 69 6e 74 20 74 61 62 54  rs */.  int tabT
04b0: 6e 63 74 3b 20 20 20 20 2f 2a 20 45 70 68 65 6d  nct;    /* Ephem
04c0: 65 72 61 6c 20 74 61 62 6c 65 20 75 73 65 64 20  eral table used 
04d0: 66 6f 72 20 44 49 53 54 49 4e 43 54 20 70 72 6f  for DISTINCT pro
04e0: 63 65 73 73 69 6e 67 20 2a 2f 0a 20 20 69 6e 74  cessing */.  int
04f0: 20 61 64 64 72 54 6e 63 74 3b 20 20 20 2f 2a 20   addrTnct;   /* 
0500: 41 64 64 72 65 73 73 20 6f 66 20 4f 50 5f 4f 70  Address of OP_Op
0510: 65 6e 45 70 68 65 6d 65 72 61 6c 20 6f 70 63 6f  enEphemeral opco
0520: 64 65 20 66 6f 72 20 74 61 62 54 6e 63 74 20 2a  de for tabTnct *
0530: 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69  /.};../*.** An i
0540: 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66  nstance of the f
0550: 6f 6c 6c 6f 77 69 6e 67 20 6f 62 6a 65 63 74 20  ollowing object 
0560: 69 73 20 75 73 65 64 20 74 6f 20 72 65 63 6f 72  is used to recor
0570: 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62  d information ab
0580: 6f 75 74 0a 2a 2a 20 74 68 65 20 4f 52 44 45 52  out.** the ORDER
0590: 20 42 59 20 28 6f 72 20 47 52 4f 55 50 20 42 59   BY (or GROUP BY
05a0: 29 20 63 6c 61 75 73 65 20 6f 66 20 71 75 65 72  ) clause of quer
05b0: 79 20 69 73 20 62 65 69 6e 67 20 63 6f 64 65 64  y is being coded
05c0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 44 65 66  ..**.** The aDef
05d0: 65 72 5b 5d 20 61 72 72 61 79 20 69 73 20 75 73  er[] array is us
05e0: 65 64 20 62 79 20 74 68 65 20 73 6f 72 74 65 72  ed by the sorter
05f0: 2d 72 65 66 65 72 65 6e 63 65 73 20 6f 70 74 69  -references opti
0600: 6d 69 7a 61 74 69 6f 6e 2e 20 46 6f 72 0a 2a 2a  mization. For.**
0610: 20 65 78 61 6d 70 6c 65 2c 20 61 73 73 75 6d 69   example, assumi
0620: 6e 67 20 74 68 65 72 65 20 69 73 20 6e 6f 20 69  ng there is no i
0630: 6e 64 65 78 20 74 68 61 74 20 63 61 6e 20 62 65  ndex that can be
0640: 20 75 73 65 64 20 66 6f 72 20 74 68 65 20 4f 52   used for the OR
0650: 44 45 52 20 42 59 2c 0a 2a 2a 20 66 6f 72 20 74  DER BY,.** for t
0660: 68 65 20 71 75 65 72 79 3a 0a 2a 2a 0a 2a 2a 20  he query:.**.** 
0670: 20 20 20 20 53 45 4c 45 43 54 20 61 2c 20 62 69      SELECT a, bi
0680: 67 62 6c 6f 62 20 46 52 4f 4d 20 74 31 20 4f 52  gblob FROM t1 OR
0690: 44 45 52 20 42 59 20 61 20 4c 49 4d 49 54 20 31  DER BY a LIMIT 1
06a0: 30 3b 0a 2a 2a 0a 2a 2a 20 69 74 20 6d 61 79 20  0;.**.** it may 
06b0: 62 65 20 6d 6f 72 65 20 65 66 66 69 63 69 65 6e  be more efficien
06c0: 74 20 74 6f 20 61 64 64 20 6a 75 73 74 20 74 68  t to add just th
06d0: 65 20 22 61 22 20 76 61 6c 75 65 73 20 74 6f 20  e "a" values to 
06e0: 74 68 65 20 73 6f 72 74 65 72 2c 20 61 6e 64 0a  the sorter, and.
06f0: 2a 2a 20 72 65 74 72 69 65 76 65 20 74 68 65 20  ** retrieve the 
0700: 61 73 73 6f 63 69 61 74 65 64 20 22 62 69 67 62  associated "bigb
0710: 6c 6f 62 22 20 76 61 6c 75 65 73 20 64 69 72 65  lob" values dire
0720: 63 74 6c 79 20 66 72 6f 6d 20 74 61 62 6c 65 20  ctly from table 
0730: 74 31 20 61 73 20 74 68 65 0a 2a 2a 20 31 30 20  t1 as the.** 10 
0740: 73 6d 61 6c 6c 65 73 74 20 22 61 22 20 76 61 6c  smallest "a" val
0750: 75 65 73 20 61 72 65 20 65 78 74 72 61 63 74 65  ues are extracte
0760: 64 20 66 72 6f 6d 20 74 68 65 20 73 6f 72 74 65  d from the sorte
0770: 72 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68  r..**.** When th
0780: 65 20 73 6f 72 74 65 72 2d 72 65 66 65 72 65 6e  e sorter-referen
0790: 63 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20  ce optimization 
07a0: 69 73 20 75 73 65 64 2c 20 74 68 65 72 65 20 69  is used, there i
07b0: 73 20 6f 6e 65 20 65 6e 74 72 79 20 69 6e 20 74  s one entry in t
07c0: 68 65 0a 2a 2a 20 61 44 65 66 65 72 5b 5d 20 61  he.** aDefer[] a
07d0: 72 72 61 79 20 66 6f 72 20 65 61 63 68 20 64 61  rray for each da
07e0: 74 61 62 61 73 65 20 74 61 62 6c 65 20 74 68 61  tabase table tha
07f0: 74 20 6d 61 79 20 62 65 20 72 65 61 64 20 61 73  t may be read as
0800: 20 76 61 6c 75 65 73 20 61 72 65 0a 2a 2a 20 65   values are.** e
0810: 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20 74 68  xtracted from th
0820: 65 20 73 6f 72 74 65 72 2e 0a 2a 2f 0a 74 79 70  e sorter..*/.typ
0830: 65 64 65 66 20 73 74 72 75 63 74 20 53 6f 72 74  edef struct Sort
0840: 43 74 78 20 53 6f 72 74 43 74 78 3b 0a 73 74 72  Ctx SortCtx;.str
0850: 75 63 74 20 53 6f 72 74 43 74 78 20 7b 0a 20 20  uct SortCtx {.  
0860: 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72  ExprList *pOrder
0870: 42 79 3b 20 20 20 2f 2a 20 54 68 65 20 4f 52 44  By;   /* The ORD
0880: 45 52 20 42 59 20 28 6f 72 20 47 52 4f 55 50 20  ER BY (or GROUP 
0890: 42 59 20 63 6c 61 75 73 65 29 20 2a 2f 0a 20 20  BY clause) */.  
08a0: 69 6e 74 20 6e 4f 42 53 61 74 3b 20 20 20 20 20  int nOBSat;     
08b0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
08c0: 6f 66 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d  of ORDER BY term
08d0: 73 20 73 61 74 69 73 66 69 65 64 20 62 79 20 69  s satisfied by i
08e0: 6e 64 69 63 65 73 20 2a 2f 0a 20 20 69 6e 74 20  ndices */.  int 
08f0: 69 45 43 75 72 73 6f 72 3b 20 20 20 20 20 20 20  iECursor;       
0900: 20 20 2f 2a 20 43 75 72 73 6f 72 20 6e 75 6d 62    /* Cursor numb
0910: 65 72 20 66 6f 72 20 74 68 65 20 73 6f 72 74 65  er for the sorte
0920: 72 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 52 65  r */.  int regRe
0930: 74 75 72 6e 3b 20 20 20 20 20 20 20 20 2f 2a 20  turn;        /* 
0940: 52 65 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67  Register holding
0950: 20 62 6c 6f 63 6b 2d 6f 75 74 70 75 74 20 72 65   block-output re
0960: 74 75 72 6e 20 61 64 64 72 65 73 73 20 2a 2f 0a  turn address */.
0970: 20 20 69 6e 74 20 6c 61 62 65 6c 42 6b 4f 75 74    int labelBkOut
0980: 3b 20 20 20 20 20 20 20 2f 2a 20 53 74 61 72 74  ;       /* Start
0990: 20 6c 61 62 65 6c 20 66 6f 72 20 74 68 65 20 62   label for the b
09a0: 6c 6f 63 6b 2d 6f 75 74 70 75 74 20 73 75 62 72  lock-output subr
09b0: 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20  outine */.  int 
09c0: 61 64 64 72 53 6f 72 74 49 6e 64 65 78 3b 20 20  addrSortIndex;  
09d0: 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20    /* Address of 
09e0: 74 68 65 20 4f 50 5f 53 6f 72 74 65 72 4f 70 65  the OP_SorterOpe
09f0: 6e 20 6f 72 20 4f 50 5f 4f 70 65 6e 45 70 68 65  n or OP_OpenEphe
0a00: 6d 65 72 61 6c 20 2a 2f 0a 20 20 69 6e 74 20 6c  meral */.  int l
0a10: 61 62 65 6c 44 6f 6e 65 3b 20 20 20 20 20 20 20  abelDone;       
0a20: 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 77 68   /* Jump here wh
0a30: 65 6e 20 64 6f 6e 65 2c 20 65 78 3a 20 4c 49 4d  en done, ex: LIM
0a40: 49 54 20 72 65 61 63 68 65 64 20 2a 2f 0a 20 20  IT reached */.  
0a50: 69 6e 74 20 6c 61 62 65 6c 4f 42 4c 6f 70 74 3b  int labelOBLopt;
0a60: 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65        /* Jump he
0a70: 72 65 20 77 68 65 6e 20 73 6f 72 74 65 72 20 69  re when sorter i
0a80: 73 20 66 75 6c 6c 20 2a 2f 0a 20 20 75 38 20 73  s full */.  u8 s
0a90: 6f 72 74 46 6c 61 67 73 3b 20 20 20 20 20 20 20  ortFlags;       
0aa0: 20 20 2f 2a 20 5a 65 72 6f 20 6f 72 20 6d 6f 72    /* Zero or mor
0ab0: 65 20 53 4f 52 54 46 4c 41 47 5f 2a 20 62 69 74  e SORTFLAG_* bit
0ac0: 73 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  s */.#ifdef SQLI
0ad0: 54 45 5f 45 4e 41 42 4c 45 5f 53 4f 52 54 45 52  TE_ENABLE_SORTER
0ae0: 5f 52 45 46 45 52 45 4e 43 45 53 0a 20 20 75 38  _REFERENCES.  u8
0af0: 20 6e 44 65 66 65 72 3b 20 20 20 20 20 20 20 20   nDefer;        
0b00: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
0b10: 20 76 61 6c 69 64 20 65 6e 74 72 69 65 73 20 69   valid entries i
0b20: 6e 20 61 44 65 66 65 72 5b 5d 20 2a 2f 0a 20 20  n aDefer[] */.  
0b30: 73 74 72 75 63 74 20 44 65 66 65 72 72 65 64 43  struct DeferredC
0b40: 73 72 20 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a  sr {.    Table *
0b50: 70 54 61 62 3b 20 20 20 20 20 20 20 20 2f 2a 20  pTab;        /* 
0b60: 54 61 62 6c 65 20 64 65 66 69 6e 69 74 69 6f 6e  Table definition
0b70: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 43 73 72   */.    int iCsr
0b80: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43  ;           /* C
0b90: 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 66 6f 72  ursor number for
0ba0: 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 69 6e   table */.    in
0bb0: 74 20 6e 4b 65 79 3b 20 20 20 20 20 20 20 20 20  t nKey;         
0bc0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 50    /* Number of P
0bd0: 4b 20 63 6f 6c 75 6d 6e 73 20 66 6f 72 20 74 61  K columns for ta
0be0: 62 6c 65 20 70 54 61 62 20 28 3e 3d 31 29 20 2a  ble pTab (>=1) *
0bf0: 2f 0a 20 20 7d 20 61 44 65 66 65 72 5b 34 5d 3b  /.  } aDefer[4];
0c00: 0a 23 65 6e 64 69 66 0a 20 20 73 74 72 75 63 74  .#endif.  struct
0c10: 20 52 6f 77 4c 6f 61 64 49 6e 66 6f 20 2a 70 44   RowLoadInfo *pD
0c20: 65 66 65 72 72 65 64 52 6f 77 4c 6f 61 64 3b 20  eferredRowLoad; 
0c30: 20 2f 2a 20 44 65 66 65 72 72 65 64 20 72 6f 77   /* Deferred row
0c40: 20 6c 6f 61 64 69 6e 67 20 69 6e 66 6f 20 6f 72   loading info or
0c50: 20 4e 55 4c 4c 20 2a 2f 0a 7d 3b 0a 23 64 65 66   NULL */.};.#def
0c60: 69 6e 65 20 53 4f 52 54 46 4c 41 47 5f 55 73 65  ine SORTFLAG_Use
0c70: 53 6f 72 74 65 72 20 20 30 78 30 31 20 20 20 2f  Sorter  0x01   /
0c80: 2a 20 55 73 65 20 53 6f 72 74 65 72 4f 70 65 6e  * Use SorterOpen
0c90: 20 69 6e 73 74 65 61 64 20 6f 66 20 4f 70 65 6e   instead of Open
0ca0: 45 70 68 65 6d 65 72 61 6c 20 2a 2f 0a 0a 2f 2a  Ephemeral */../*
0cb0: 0a 2a 2a 20 44 65 6c 65 74 65 20 61 6c 6c 20 74  .** Delete all t
0cc0: 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 20  he content of a 
0cd0: 53 65 6c 65 63 74 20 73 74 72 75 63 74 75 72 65  Select structure
0ce0: 2e 20 20 44 65 61 6c 6c 6f 63 61 74 65 20 74 68  .  Deallocate th
0cf0: 65 20 73 74 72 75 63 74 75 72 65 0a 2a 2a 20 69  e structure.** i
0d00: 74 73 65 6c 66 20 6f 6e 6c 79 20 69 66 20 62 46  tself only if bF
0d10: 72 65 65 20 69 73 20 74 72 75 65 2e 0a 2a 2f 0a  ree is true..*/.
0d20: 73 74 61 74 69 63 20 76 6f 69 64 20 63 6c 65 61  static void clea
0d30: 72 53 65 6c 65 63 74 28 73 71 6c 69 74 65 33 20  rSelect(sqlite3 
0d40: 2a 64 62 2c 20 53 65 6c 65 63 74 20 2a 70 2c 20  *db, Select *p, 
0d50: 69 6e 74 20 62 46 72 65 65 29 7b 0a 20 20 77 68  int bFree){.  wh
0d60: 69 6c 65 28 20 70 20 29 7b 0a 20 20 20 20 53 65  ile( p ){.    Se
0d70: 6c 65 63 74 20 2a 70 50 72 69 6f 72 20 3d 20 70  lect *pPrior = p
0d80: 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 73 71  ->pPrior;.    sq
0d90: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c  lite3ExprListDel
0da0: 65 74 65 28 64 62 2c 20 70 2d 3e 70 45 4c 69 73  ete(db, p->pELis
0db0: 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 53  t);.    sqlite3S
0dc0: 72 63 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c  rcListDelete(db,
0dd0: 20 70 2d 3e 70 53 72 63 29 3b 0a 20 20 20 20 73   p->pSrc);.    s
0de0: 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
0df0: 28 64 62 2c 20 70 2d 3e 70 57 68 65 72 65 29 3b  (db, p->pWhere);
0e00: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
0e10: 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70  ListDelete(db, p
0e20: 2d 3e 70 47 72 6f 75 70 42 79 29 3b 0a 20 20 20  ->pGroupBy);.   
0e30: 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
0e40: 74 65 28 64 62 2c 20 70 2d 3e 70 48 61 76 69 6e  te(db, p->pHavin
0e50: 67 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  g);.    sqlite3E
0e60: 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62  xprListDelete(db
0e70: 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79 29 3b 0a  , p->pOrderBy);.
0e80: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44      sqlite3ExprD
0e90: 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 4c 69  elete(db, p->pLi
0ea0: 6d 69 74 29 3b 0a 23 69 66 6e 64 65 66 20 53 51  mit);.#ifndef SQ
0eb0: 4c 49 54 45 5f 4f 4d 49 54 5f 57 49 4e 44 4f 57  LITE_OMIT_WINDOW
0ec0: 46 55 4e 43 0a 20 20 20 20 69 66 28 20 4f 4b 5f  FUNC.    if( OK_
0ed0: 49 46 5f 41 4c 57 41 59 53 5f 54 52 55 45 28 70  IF_ALWAYS_TRUE(p
0ee0: 2d 3e 70 57 69 6e 44 65 66 6e 29 20 29 7b 0a 20  ->pWinDefn) ){. 
0ef0: 20 20 20 20 20 73 71 6c 69 74 65 33 57 69 6e 64       sqlite3Wind
0f00: 6f 77 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c  owListDelete(db,
0f10: 20 70 2d 3e 70 57 69 6e 44 65 66 6e 29 3b 0a 20   p->pWinDefn);. 
0f20: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
0f30: 69 66 28 20 4f 4b 5f 49 46 5f 41 4c 57 41 59 53  if( OK_IF_ALWAYS
0f40: 5f 54 52 55 45 28 70 2d 3e 70 57 69 74 68 29 20  _TRUE(p->pWith) 
0f50: 29 20 73 71 6c 69 74 65 33 57 69 74 68 44 65 6c  ) sqlite3WithDel
0f60: 65 74 65 28 64 62 2c 20 70 2d 3e 70 57 69 74 68  ete(db, p->pWith
0f70: 29 3b 0a 20 20 20 20 69 66 28 20 62 46 72 65 65  );.    if( bFree
0f80: 20 29 20 73 71 6c 69 74 65 33 44 62 46 72 65 65   ) sqlite3DbFree
0f90: 4e 4e 28 64 62 2c 20 70 29 3b 0a 20 20 20 20 70  NN(db, p);.    p
0fa0: 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20 20 62   = pPrior;.    b
0fb0: 46 72 65 65 20 3d 20 31 3b 0a 20 20 7d 0a 7d 0a  Free = 1;.  }.}.
0fc0: 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a  ./*.** Initializ
0fd0: 65 20 61 20 53 65 6c 65 63 74 44 65 73 74 20 73  e a SelectDest s
0fe0: 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 76 6f 69  tructure..*/.voi
0ff0: 64 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44  d sqlite3SelectD
1000: 65 73 74 49 6e 69 74 28 53 65 6c 65 63 74 44 65  estInit(SelectDe
1010: 73 74 20 2a 70 44 65 73 74 2c 20 69 6e 74 20 65  st *pDest, int e
1020: 44 65 73 74 2c 20 69 6e 74 20 69 50 61 72 6d 29  Dest, int iParm)
1030: 7b 0a 20 20 70 44 65 73 74 2d 3e 65 44 65 73 74  {.  pDest->eDest
1040: 20 3d 20 28 75 38 29 65 44 65 73 74 3b 0a 20 20   = (u8)eDest;.  
1050: 70 44 65 73 74 2d 3e 69 53 44 50 61 72 6d 20 3d  pDest->iSDParm =
1060: 20 69 50 61 72 6d 3b 0a 20 20 70 44 65 73 74 2d   iParm;.  pDest-
1070: 3e 7a 41 66 66 53 64 73 74 20 3d 20 30 3b 0a 20  >zAffSdst = 0;. 
1080: 20 70 44 65 73 74 2d 3e 69 53 64 73 74 20 3d 20   pDest->iSdst = 
1090: 30 3b 0a 20 20 70 44 65 73 74 2d 3e 6e 53 64 73  0;.  pDest->nSds
10a0: 74 20 3d 20 30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  t = 0;.}.../*.**
10b0: 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20   Allocate a new 
10c0: 53 65 6c 65 63 74 20 73 74 72 75 63 74 75 72 65  Select structure
10d0: 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20 70 6f   and return a po
10e0: 69 6e 74 65 72 20 74 6f 20 74 68 61 74 0a 2a 2a  inter to that.**
10f0: 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 53   structure..*/.S
1100: 65 6c 65 63 74 20 2a 73 71 6c 69 74 65 33 53 65  elect *sqlite3Se
1110: 6c 65 63 74 4e 65 77 28 0a 20 20 50 61 72 73 65  lectNew(.  Parse
1120: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
1130: 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
1140: 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  ext */.  ExprLis
1150: 74 20 2a 70 45 4c 69 73 74 2c 20 20 20 20 20 2f  t *pEList,     /
1160: 2a 20 77 68 69 63 68 20 63 6f 6c 75 6d 6e 73 20  * which columns 
1170: 74 6f 20 69 6e 63 6c 75 64 65 20 69 6e 20 74 68  to include in th
1180: 65 20 72 65 73 75 6c 74 20 2a 2f 0a 20 20 53 72  e result */.  Sr
1190: 63 4c 69 73 74 20 2a 70 53 72 63 2c 20 20 20 20  cList *pSrc,    
11a0: 20 20 20 20 2f 2a 20 74 68 65 20 46 52 4f 4d 20      /* the FROM 
11b0: 63 6c 61 75 73 65 20 2d 2d 20 77 68 69 63 68 20  clause -- which 
11c0: 74 61 62 6c 65 73 20 74 6f 20 73 63 61 6e 20 2a  tables to scan *
11d0: 2f 0a 20 20 45 78 70 72 20 2a 70 57 68 65 72 65  /.  Expr *pWhere
11e0: 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 74 68 65  ,         /* the
11f0: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f   WHERE clause */
1200: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 47 72  .  ExprList *pGr
1210: 6f 75 70 42 79 2c 20 20 20 2f 2a 20 74 68 65 20  oupBy,   /* the 
1220: 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 20  GROUP BY clause 
1230: 2a 2f 0a 20 20 45 78 70 72 20 2a 70 48 61 76 69  */.  Expr *pHavi
1240: 6e 67 2c 20 20 20 20 20 20 20 20 2f 2a 20 74 68  ng,        /* th
1250: 65 20 48 41 56 49 4e 47 20 63 6c 61 75 73 65 20  e HAVING clause 
1260: 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
1270: 4f 72 64 65 72 42 79 2c 20 20 20 2f 2a 20 74 68  OrderBy,   /* th
1280: 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
1290: 65 20 2a 2f 0a 20 20 75 33 32 20 73 65 6c 46 6c  e */.  u32 selFl
12a0: 61 67 73 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  ags,         /* 
12b0: 46 6c 61 67 20 70 61 72 61 6d 65 74 65 72 73 2c  Flag parameters,
12c0: 20 73 75 63 68 20 61 73 20 53 46 5f 44 69 73 74   such as SF_Dist
12d0: 69 6e 63 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a  inct */.  Expr *
12e0: 70 4c 69 6d 69 74 20 20 20 20 20 20 20 20 20 20  pLimit          
12f0: 2f 2a 20 4c 49 4d 49 54 20 76 61 6c 75 65 2e 20  /* LIMIT value. 
1300: 20 4e 55 4c 4c 20 6d 65 61 6e 73 20 6e 6f 74 20   NULL means not 
1310: 75 73 65 64 20 2a 2f 0a 29 7b 0a 20 20 53 65 6c  used */.){.  Sel
1320: 65 63 74 20 2a 70 4e 65 77 3b 0a 20 20 53 65 6c  ect *pNew;.  Sel
1330: 65 63 74 20 73 74 61 6e 64 69 6e 3b 0a 20 20 70  ect standin;.  p
1340: 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  New = sqlite3DbM
1350: 61 6c 6c 6f 63 52 61 77 4e 4e 28 70 50 61 72 73  allocRawNN(pPars
1360: 65 2d 3e 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70  e->db, sizeof(*p
1370: 4e 65 77 29 20 29 3b 0a 20 20 69 66 28 20 70 4e  New) );.  if( pN
1380: 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73 73  ew==0 ){.    ass
1390: 65 72 74 28 20 70 50 61 72 73 65 2d 3e 64 62 2d  ert( pParse->db-
13a0: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b  >mallocFailed );
13b0: 0a 20 20 20 20 70 4e 65 77 20 3d 20 26 73 74 61  .    pNew = &sta
13c0: 6e 64 69 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20  ndin;.  }.  if( 
13d0: 70 45 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20  pEList==0 ){.   
13e0: 20 70 45 4c 69 73 74 20 3d 20 73 71 6c 69 74 65   pEList = sqlite
13f0: 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28  3ExprListAppend(
1400: 70 50 61 72 73 65 2c 20 30 2c 0a 20 20 20 20 20  pParse, 0,.     
1410: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1420: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
1430: 6c 69 74 65 33 45 78 70 72 28 70 50 61 72 73 65  lite3Expr(pParse
1440: 2d 3e 64 62 2c 54 4b 5f 41 53 54 45 52 49 53 4b  ->db,TK_ASTERISK
1450: 2c 30 29 29 3b 0a 20 20 7d 0a 20 20 70 4e 65 77  ,0));.  }.  pNew
1460: 2d 3e 70 45 4c 69 73 74 20 3d 20 70 45 4c 69 73  ->pEList = pELis
1470: 74 3b 0a 20 20 70 4e 65 77 2d 3e 6f 70 20 3d 20  t;.  pNew->op = 
1480: 54 4b 5f 53 45 4c 45 43 54 3b 0a 20 20 70 4e 65  TK_SELECT;.  pNe
1490: 77 2d 3e 73 65 6c 46 6c 61 67 73 20 3d 20 73 65  w->selFlags = se
14a0: 6c 46 6c 61 67 73 3b 0a 20 20 70 4e 65 77 2d 3e  lFlags;.  pNew->
14b0: 69 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 70 4e  iLimit = 0;.  pN
14c0: 65 77 2d 3e 69 4f 66 66 73 65 74 20 3d 20 30 3b  ew->iOffset = 0;
14d0: 0a 20 20 70 4e 65 77 2d 3e 73 65 6c 49 64 20 3d  .  pNew->selId =
14e0: 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 53 65 6c 65   ++pParse->nSele
14f0: 63 74 3b 0a 20 20 70 4e 65 77 2d 3e 61 64 64 72  ct;.  pNew->addr
1500: 4f 70 65 6e 45 70 68 6d 5b 30 5d 20 3d 20 2d 31  OpenEphm[0] = -1
1510: 3b 0a 20 20 70 4e 65 77 2d 3e 61 64 64 72 4f 70  ;.  pNew->addrOp
1520: 65 6e 45 70 68 6d 5b 31 5d 20 3d 20 2d 31 3b 0a  enEphm[1] = -1;.
1530: 20 20 70 4e 65 77 2d 3e 6e 53 65 6c 65 63 74 52    pNew->nSelectR
1540: 6f 77 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 53  ow = 0;.  if( pS
1550: 72 63 3d 3d 30 20 29 20 70 53 72 63 20 3d 20 73  rc==0 ) pSrc = s
1560: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65  qlite3DbMallocZe
1570: 72 6f 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 73  ro(pParse->db, s
1580: 69 7a 65 6f 66 28 2a 70 53 72 63 29 29 3b 0a 20  izeof(*pSrc));. 
1590: 20 70 4e 65 77 2d 3e 70 53 72 63 20 3d 20 70 53   pNew->pSrc = pS
15a0: 72 63 3b 0a 20 20 70 4e 65 77 2d 3e 70 57 68 65  rc;.  pNew->pWhe
15b0: 72 65 20 3d 20 70 57 68 65 72 65 3b 0a 20 20 70  re = pWhere;.  p
15c0: 4e 65 77 2d 3e 70 47 72 6f 75 70 42 79 20 3d 20  New->pGroupBy = 
15d0: 70 47 72 6f 75 70 42 79 3b 0a 20 20 70 4e 65 77  pGroupBy;.  pNew
15e0: 2d 3e 70 48 61 76 69 6e 67 20 3d 20 70 48 61 76  ->pHaving = pHav
15f0: 69 6e 67 3b 0a 20 20 70 4e 65 77 2d 3e 70 4f 72  ing;.  pNew->pOr
1600: 64 65 72 42 79 20 3d 20 70 4f 72 64 65 72 42 79  derBy = pOrderBy
1610: 3b 0a 20 20 70 4e 65 77 2d 3e 70 50 72 69 6f 72  ;.  pNew->pPrior
1620: 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 70 4e   = 0;.  pNew->pN
1630: 65 78 74 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d  ext = 0;.  pNew-
1640: 3e 70 4c 69 6d 69 74 20 3d 20 70 4c 69 6d 69 74  >pLimit = pLimit
1650: 3b 0a 20 20 70 4e 65 77 2d 3e 70 57 69 74 68 20  ;.  pNew->pWith 
1660: 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  = 0;.#ifndef SQL
1670: 49 54 45 5f 4f 4d 49 54 5f 57 49 4e 44 4f 57 46  ITE_OMIT_WINDOWF
1680: 55 4e 43 0a 20 20 70 4e 65 77 2d 3e 70 57 69 6e  UNC.  pNew->pWin
1690: 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 70 57   = 0;.  pNew->pW
16a0: 69 6e 44 65 66 6e 20 3d 20 30 3b 0a 23 65 6e 64  inDefn = 0;.#end
16b0: 69 66 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  if.  if( pParse-
16c0: 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
16d0: 64 20 29 20 7b 0a 20 20 20 20 63 6c 65 61 72 53  d ) {.    clearS
16e0: 65 6c 65 63 74 28 70 50 61 72 73 65 2d 3e 64 62  elect(pParse->db
16f0: 2c 20 70 4e 65 77 2c 20 70 4e 65 77 21 3d 26 73  , pNew, pNew!=&s
1700: 74 61 6e 64 69 6e 29 3b 0a 20 20 20 20 70 4e 65  tandin);.    pNe
1710: 77 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a  w = 0;.  }else{.
1720: 20 20 20 20 61 73 73 65 72 74 28 20 70 4e 65 77      assert( pNew
1730: 2d 3e 70 53 72 63 21 3d 30 20 7c 7c 20 70 50 61  ->pSrc!=0 || pPa
1740: 72 73 65 2d 3e 6e 45 72 72 3e 30 20 29 3b 0a 20  rse->nErr>0 );. 
1750: 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 4e 65   }.  assert( pNe
1760: 77 21 3d 26 73 74 61 6e 64 69 6e 20 29 3b 0a 20  w!=&standin );. 
1770: 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a   return pNew;.}.
1780: 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 74  ../*.** Delete t
1790: 68 65 20 67 69 76 65 6e 20 53 65 6c 65 63 74 20  he given Select 
17a0: 73 74 72 75 63 74 75 72 65 20 61 6e 64 20 61 6c  structure and al
17b0: 6c 20 6f 66 20 69 74 73 20 73 75 62 73 74 72 75  l of its substru
17c0: 63 74 75 72 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20  ctures..*/.void 
17d0: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c  sqlite3SelectDel
17e0: 65 74 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  ete(sqlite3 *db,
17f0: 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 69   Select *p){.  i
1800: 66 28 20 4f 4b 5f 49 46 5f 41 4c 57 41 59 53 5f  f( OK_IF_ALWAYS_
1810: 54 52 55 45 28 70 29 20 29 20 63 6c 65 61 72 53  TRUE(p) ) clearS
1820: 65 6c 65 63 74 28 64 62 2c 20 70 2c 20 31 29 3b  elect(db, p, 1);
1830: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
1840: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
1850: 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 53 45 4c  e right-most SEL
1860: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 69 6e  ECT statement in
1870: 20 61 20 63 6f 6d 70 6f 75 6e 64 2e 0a 2a 2f 0a   a compound..*/.
1880: 73 74 61 74 69 63 20 53 65 6c 65 63 74 20 2a 66  static Select *f
1890: 69 6e 64 52 69 67 68 74 6d 6f 73 74 28 53 65 6c  indRightmost(Sel
18a0: 65 63 74 20 2a 70 29 7b 0a 20 20 77 68 69 6c 65  ect *p){.  while
18b0: 28 20 70 2d 3e 70 4e 65 78 74 20 29 20 70 20 3d  ( p->pNext ) p =
18c0: 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 72 65 74   p->pNext;.  ret
18d0: 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn p;.}../*.** 
18e0: 47 69 76 65 6e 20 31 20 74 6f 20 33 20 69 64 65  Given 1 to 3 ide
18f0: 6e 74 69 66 69 65 72 73 20 70 72 65 63 65 64 69  ntifiers precedi
1900: 6e 67 20 74 68 65 20 4a 4f 49 4e 20 6b 65 79 77  ng the JOIN keyw
1910: 6f 72 64 2c 20 64 65 74 65 72 6d 69 6e 65 20 74  ord, determine t
1920: 68 65 0a 2a 2a 20 74 79 70 65 20 6f 66 20 6a 6f  he.** type of jo
1930: 69 6e 2e 20 20 52 65 74 75 72 6e 20 61 6e 20 69  in.  Return an i
1940: 6e 74 65 67 65 72 20 63 6f 6e 73 74 61 6e 74 20  nteger constant 
1950: 74 68 61 74 20 65 78 70 72 65 73 73 65 73 20 74  that expresses t
1960: 68 61 74 20 74 79 70 65 0a 2a 2a 20 69 6e 20 74  hat type.** in t
1970: 65 72 6d 73 20 6f 66 20 74 68 65 20 66 6f 6c 6c  erms of the foll
1980: 6f 77 69 6e 67 20 62 69 74 20 76 61 6c 75 65 73  owing bit values
1990: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 4a 54 5f 49  :.**.**     JT_I
19a0: 4e 4e 45 52 0a 2a 2a 20 20 20 20 20 4a 54 5f 43  NNER.**     JT_C
19b0: 52 4f 53 53 0a 2a 2a 20 20 20 20 20 4a 54 5f 4f  ROSS.**     JT_O
19c0: 55 54 45 52 0a 2a 2a 20 20 20 20 20 4a 54 5f 4e  UTER.**     JT_N
19d0: 41 54 55 52 41 4c 0a 2a 2a 20 20 20 20 20 4a 54  ATURAL.**     JT
19e0: 5f 4c 45 46 54 0a 2a 2a 20 20 20 20 20 4a 54 5f  _LEFT.**     JT_
19f0: 52 49 47 48 54 0a 2a 2a 0a 2a 2a 20 41 20 66 75  RIGHT.**.** A fu
1a00: 6c 6c 20 6f 75 74 65 72 20 6a 6f 69 6e 20 69 73  ll outer join is
1a10: 20 74 68 65 20 63 6f 6d 62 69 6e 61 74 69 6f 6e   the combination
1a20: 20 6f 66 20 4a 54 5f 4c 45 46 54 20 61 6e 64 20   of JT_LEFT and 
1a30: 4a 54 5f 52 49 47 48 54 2e 0a 2a 2a 0a 2a 2a 20  JT_RIGHT..**.** 
1a40: 49 66 20 61 6e 20 69 6c 6c 65 67 61 6c 20 6f 72  If an illegal or
1a50: 20 75 6e 73 75 70 70 6f 72 74 65 64 20 6a 6f 69   unsupported joi
1a60: 6e 20 74 79 70 65 20 69 73 20 73 65 65 6e 2c 20  n type is seen, 
1a70: 74 68 65 6e 20 73 74 69 6c 6c 20 72 65 74 75 72  then still retur
1a80: 6e 0a 2a 2a 20 61 20 6a 6f 69 6e 20 74 79 70 65  n.** a join type
1a90: 2c 20 62 75 74 20 70 75 74 20 61 6e 20 65 72 72  , but put an err
1aa0: 6f 72 20 69 6e 20 74 68 65 20 70 50 61 72 73 65  or in the pParse
1ab0: 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 69   structure..*/.i
1ac0: 6e 74 20 73 71 6c 69 74 65 33 4a 6f 69 6e 54 79  nt sqlite3JoinTy
1ad0: 70 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  pe(Parse *pParse
1ae0: 2c 20 54 6f 6b 65 6e 20 2a 70 41 2c 20 54 6f 6b  , Token *pA, Tok
1af0: 65 6e 20 2a 70 42 2c 20 54 6f 6b 65 6e 20 2a 70  en *pB, Token *p
1b00: 43 29 7b 0a 20 20 69 6e 74 20 6a 6f 69 6e 74 79  C){.  int jointy
1b10: 70 65 20 3d 20 30 3b 0a 20 20 54 6f 6b 65 6e 20  pe = 0;.  Token 
1b20: 2a 61 70 41 6c 6c 5b 33 5d 3b 0a 20 20 54 6f 6b  *apAll[3];.  Tok
1b30: 65 6e 20 2a 70 3b 0a 20 20 20 20 20 20 20 20 20  en *p;.         
1b40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b50: 20 20 20 20 2f 2a 20 20 20 30 31 32 33 34 35 36      /*   0123456
1b60: 37 38 39 20 31 32 33 34 35 36 37 38 39 20 31 32  789 123456789 12
1b70: 33 34 35 36 37 38 39 20 31 32 33 20 2a 2f 0a 20  3456789 123 */. 
1b80: 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68   static const ch
1b90: 61 72 20 7a 4b 65 79 54 65 78 74 5b 5d 20 3d 20  ar zKeyText[] = 
1ba0: 22 6e 61 74 75 72 61 6c 65 66 74 6f 75 74 65 72  "naturaleftouter
1bb0: 69 67 68 74 66 75 6c 6c 69 6e 6e 65 72 63 72 6f  ightfullinnercro
1bc0: 73 73 22 3b 0a 20 20 73 74 61 74 69 63 20 63 6f  ss";.  static co
1bd0: 6e 73 74 20 73 74 72 75 63 74 20 7b 0a 20 20 20  nst struct {.   
1be0: 20 75 38 20 69 3b 20 20 20 20 20 20 20 20 2f 2a   u8 i;        /*
1bf0: 20 42 65 67 69 6e 6e 69 6e 67 20 6f 66 20 6b 65   Beginning of ke
1c00: 79 77 6f 72 64 20 74 65 78 74 20 69 6e 20 7a 4b  yword text in zK
1c10: 65 79 54 65 78 74 5b 5d 20 2a 2f 0a 20 20 20 20  eyText[] */.    
1c20: 75 38 20 6e 43 68 61 72 3b 20 20 20 20 2f 2a 20  u8 nChar;    /* 
1c30: 4c 65 6e 67 74 68 20 6f 66 20 74 68 65 20 6b 65  Length of the ke
1c40: 79 77 6f 72 64 20 69 6e 20 63 68 61 72 61 63 74  yword in charact
1c50: 65 72 73 20 2a 2f 0a 20 20 20 20 75 38 20 63 6f  ers */.    u8 co
1c60: 64 65 3b 20 20 20 20 20 2f 2a 20 4a 6f 69 6e 20  de;     /* Join 
1c70: 74 79 70 65 20 6d 61 73 6b 20 2a 2f 0a 20 20 7d  type mask */.  }
1c80: 20 61 4b 65 79 77 6f 72 64 5b 5d 20 3d 20 7b 0a   aKeyword[] = {.
1c90: 20 20 20 20 2f 2a 20 6e 61 74 75 72 61 6c 20 2a      /* natural *
1ca0: 2f 20 7b 20 30 2c 20 20 37 2c 20 4a 54 5f 4e 41  / { 0,  7, JT_NA
1cb0: 54 55 52 41 4c 20 20 20 20 20 20 20 20 20 20 20  TURAL           
1cc0: 20 20 20 20 20 7d 2c 0a 20 20 20 20 2f 2a 20 6c       },.    /* l
1cd0: 65 66 74 20 20 20 20 2a 2f 20 7b 20 36 2c 20 20  eft    */ { 6,  
1ce0: 34 2c 20 4a 54 5f 4c 45 46 54 7c 4a 54 5f 4f 55  4, JT_LEFT|JT_OU
1cf0: 54 45 52 20 20 20 20 20 20 20 20 20 20 7d 2c 0a  TER          },.
1d00: 20 20 20 20 2f 2a 20 6f 75 74 65 72 20 20 20 2a      /* outer   *
1d10: 2f 20 7b 20 31 30 2c 20 35 2c 20 4a 54 5f 4f 55  / { 10, 5, JT_OU
1d20: 54 45 52 20 20 20 20 20 20 20 20 20 20 20 20 20  TER             
1d30: 20 20 20 20 20 7d 2c 0a 20 20 20 20 2f 2a 20 72       },.    /* r
1d40: 69 67 68 74 20 20 20 2a 2f 20 7b 20 31 34 2c 20  ight   */ { 14, 
1d50: 35 2c 20 4a 54 5f 52 49 47 48 54 7c 4a 54 5f 4f  5, JT_RIGHT|JT_O
1d60: 55 54 45 52 20 20 20 20 20 20 20 20 20 7d 2c 0a  UTER         },.
1d70: 20 20 20 20 2f 2a 20 66 75 6c 6c 20 20 20 20 2a      /* full    *
1d80: 2f 20 7b 20 31 39 2c 20 34 2c 20 4a 54 5f 4c 45  / { 19, 4, JT_LE
1d90: 46 54 7c 4a 54 5f 52 49 47 48 54 7c 4a 54 5f 4f  FT|JT_RIGHT|JT_O
1da0: 55 54 45 52 20 7d 2c 0a 20 20 20 20 2f 2a 20 69  UTER },.    /* i
1db0: 6e 6e 65 72 20 20 20 2a 2f 20 7b 20 32 33 2c 20  nner   */ { 23, 
1dc0: 35 2c 20 4a 54 5f 49 4e 4e 45 52 20 20 20 20 20  5, JT_INNER     
1dd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a               },.
1de0: 20 20 20 20 2f 2a 20 63 72 6f 73 73 20 20 20 2a      /* cross   *
1df0: 2f 20 7b 20 32 38 2c 20 35 2c 20 4a 54 5f 49 4e  / { 28, 5, JT_IN
1e00: 4e 45 52 7c 4a 54 5f 43 52 4f 53 53 20 20 20 20  NER|JT_CROSS    
1e10: 20 20 20 20 20 7d 2c 0a 20 20 7d 3b 0a 20 20 69       },.  };.  i
1e20: 6e 74 20 69 2c 20 6a 3b 0a 20 20 61 70 41 6c 6c  nt i, j;.  apAll
1e30: 5b 30 5d 20 3d 20 70 41 3b 0a 20 20 61 70 41 6c  [0] = pA;.  apAl
1e40: 6c 5b 31 5d 20 3d 20 70 42 3b 0a 20 20 61 70 41  l[1] = pB;.  apA
1e50: 6c 6c 5b 32 5d 20 3d 20 70 43 3b 0a 20 20 66 6f  ll[2] = pC;.  fo
1e60: 72 28 69 3d 30 3b 20 69 3c 33 20 26 26 20 61 70  r(i=0; i<3 && ap
1e70: 41 6c 6c 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20  All[i]; i++){.  
1e80: 20 20 70 20 3d 20 61 70 41 6c 6c 5b 69 5d 3b 0a    p = apAll[i];.
1e90: 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 41      for(j=0; j<A
1ea0: 72 72 61 79 53 69 7a 65 28 61 4b 65 79 77 6f 72  rraySize(aKeywor
1eb0: 64 29 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  d); j++){.      
1ec0: 69 66 28 20 70 2d 3e 6e 3d 3d 61 4b 65 79 77 6f  if( p->n==aKeywo
1ed0: 72 64 5b 6a 5d 2e 6e 43 68 61 72 20 0a 20 20 20  rd[j].nChar .   
1ee0: 20 20 20 20 20 20 20 26 26 20 73 71 6c 69 74 65         && sqlite
1ef0: 33 53 74 72 4e 49 43 6d 70 28 28 63 68 61 72 2a  3StrNICmp((char*
1f00: 29 70 2d 3e 7a 2c 20 26 7a 4b 65 79 54 65 78 74  )p->z, &zKeyText
1f10: 5b 61 4b 65 79 77 6f 72 64 5b 6a 5d 2e 69 5d 2c  [aKeyword[j].i],
1f20: 20 70 2d 3e 6e 29 3d 3d 30 20 29 7b 0a 20 20 20   p->n)==0 ){.   
1f30: 20 20 20 20 20 6a 6f 69 6e 74 79 70 65 20 7c 3d       jointype |=
1f40: 20 61 4b 65 79 77 6f 72 64 5b 6a 5d 2e 63 6f 64   aKeyword[j].cod
1f50: 65 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  e;.        break
1f60: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1f70: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 3d      testcase( j=
1f80: 3d 30 20 7c 7c 20 6a 3d 3d 31 20 7c 7c 20 6a 3d  =0 || j==1 || j=
1f90: 3d 32 20 7c 7c 20 6a 3d 3d 33 20 7c 7c 20 6a 3d  =2 || j==3 || j=
1fa0: 3d 34 20 7c 7c 20 6a 3d 3d 35 20 7c 7c 20 6a 3d  =4 || j==5 || j=
1fb0: 3d 36 20 29 3b 0a 20 20 20 20 69 66 28 20 6a 3e  =6 );.    if( j>
1fc0: 3d 41 72 72 61 79 53 69 7a 65 28 61 4b 65 79 77  =ArraySize(aKeyw
1fd0: 6f 72 64 29 20 29 7b 0a 20 20 20 20 20 20 6a 6f  ord) ){.      jo
1fe0: 69 6e 74 79 70 65 20 7c 3d 20 4a 54 5f 45 52 52  intype |= JT_ERR
1ff0: 4f 52 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  OR;.      break;
2000: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
2010: 0a 20 20 20 20 20 28 6a 6f 69 6e 74 79 70 65 20  .     (jointype 
2020: 26 20 28 4a 54 5f 49 4e 4e 45 52 7c 4a 54 5f 4f  & (JT_INNER|JT_O
2030: 55 54 45 52 29 29 3d 3d 28 4a 54 5f 49 4e 4e 45  UTER))==(JT_INNE
2040: 52 7c 4a 54 5f 4f 55 54 45 52 29 20 7c 7c 0a 20  R|JT_OUTER) ||. 
2050: 20 20 20 20 28 6a 6f 69 6e 74 79 70 65 20 26 20      (jointype & 
2060: 4a 54 5f 45 52 52 4f 52 29 21 3d 30 0a 20 20 29  JT_ERROR)!=0.  )
2070: 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  {.    const char
2080: 20 2a 7a 53 70 20 3d 20 22 20 22 3b 0a 20 20 20   *zSp = " ";.   
2090: 20 61 73 73 65 72 74 28 20 70 42 21 3d 30 20 29   assert( pB!=0 )
20a0: 3b 0a 20 20 20 20 69 66 28 20 70 43 3d 3d 30 20  ;.    if( pC==0 
20b0: 29 7b 20 7a 53 70 2b 2b 3b 20 7d 0a 20 20 20 20  ){ zSp++; }.    
20c0: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
20d0: 70 50 61 72 73 65 2c 20 22 75 6e 6b 6e 6f 77 6e  pParse, "unknown
20e0: 20 6f 72 20 75 6e 73 75 70 70 6f 72 74 65 64 20   or unsupported 
20f0: 6a 6f 69 6e 20 74 79 70 65 3a 20 22 0a 20 20 20  join type: ".   
2100: 20 20 20 20 22 25 54 20 25 54 25 73 25 54 22 2c      "%T %T%s%T",
2110: 20 70 41 2c 20 70 42 2c 20 7a 53 70 2c 20 70 43   pA, pB, zSp, pC
2120: 29 3b 0a 20 20 20 20 6a 6f 69 6e 74 79 70 65 20  );.    jointype 
2130: 3d 20 4a 54 5f 49 4e 4e 45 52 3b 0a 20 20 7d 65  = JT_INNER;.  }e
2140: 6c 73 65 20 69 66 28 20 28 6a 6f 69 6e 74 79 70  lse if( (jointyp
2150: 65 20 26 20 4a 54 5f 4f 55 54 45 52 29 21 3d 30  e & JT_OUTER)!=0
2160: 20 0a 20 20 20 20 20 20 20 20 20 26 26 20 28 6a   .         && (j
2170: 6f 69 6e 74 79 70 65 20 26 20 28 4a 54 5f 4c 45  ointype & (JT_LE
2180: 46 54 7c 4a 54 5f 52 49 47 48 54 29 29 21 3d 4a  FT|JT_RIGHT))!=J
2190: 54 5f 4c 45 46 54 20 29 7b 0a 20 20 20 20 73 71  T_LEFT ){.    sq
21a0: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
21b0: 61 72 73 65 2c 20 0a 20 20 20 20 20 20 22 52 49  arse, .      "RI
21c0: 47 48 54 20 61 6e 64 20 46 55 4c 4c 20 4f 55 54  GHT and FULL OUT
21d0: 45 52 20 4a 4f 49 4e 73 20 61 72 65 20 6e 6f 74  ER JOINs are not
21e0: 20 63 75 72 72 65 6e 74 6c 79 20 73 75 70 70 6f   currently suppo
21f0: 72 74 65 64 22 29 3b 0a 20 20 20 20 6a 6f 69 6e  rted");.    join
2200: 74 79 70 65 20 3d 20 4a 54 5f 49 4e 4e 45 52 3b  type = JT_INNER;
2210: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6a 6f  .  }.  return jo
2220: 69 6e 74 79 70 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  intype;.}../*.**
2230: 20 52 65 74 75 72 6e 20 74 68 65 20 69 6e 64 65   Return the inde
2240: 78 20 6f 66 20 61 20 63 6f 6c 75 6d 6e 20 69 6e  x of a column in
2250: 20 61 20 74 61 62 6c 65 2e 20 20 52 65 74 75 72   a table.  Retur
2260: 6e 20 2d 31 20 69 66 20 74 68 65 20 63 6f 6c 75  n -1 if the colu
2270: 6d 6e 0a 2a 2a 20 69 73 20 6e 6f 74 20 63 6f 6e  mn.** is not con
2280: 74 61 69 6e 65 64 20 69 6e 20 74 68 65 20 74 61  tained in the ta
2290: 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ble..*/.static i
22a0: 6e 74 20 63 6f 6c 75 6d 6e 49 6e 64 65 78 28 54  nt columnIndex(T
22b0: 61 62 6c 65 20 2a 70 54 61 62 2c 20 63 6f 6e 73  able *pTab, cons
22c0: 74 20 63 68 61 72 20 2a 7a 43 6f 6c 29 7b 0a 20  t char *zCol){. 
22d0: 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d   int i;.  for(i=
22e0: 30 3b 20 69 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b  0; i<pTab->nCol;
22f0: 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 73   i++){.    if( s
2300: 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 54  qlite3StrICmp(pT
2310: 61 62 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 4e 61 6d  ab->aCol[i].zNam
2320: 65 2c 20 7a 43 6f 6c 29 3d 3d 30 20 29 20 72 65  e, zCol)==0 ) re
2330: 74 75 72 6e 20 69 3b 0a 20 20 7d 0a 20 20 72 65  turn i;.  }.  re
2340: 74 75 72 6e 20 2d 31 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn -1;.}../*.*
2350: 2a 20 53 65 61 72 63 68 20 74 68 65 20 66 69 72  * Search the fir
2360: 73 74 20 4e 20 74 61 62 6c 65 73 20 69 6e 20 70  st N tables in p
2370: 53 72 63 2c 20 66 72 6f 6d 20 6c 65 66 74 20 74  Src, from left t
2380: 6f 20 72 69 67 68 74 2c 20 6c 6f 6f 6b 69 6e 67  o right, looking
2390: 20 66 6f 72 20 61 0a 2a 2a 20 74 61 62 6c 65 20   for a.** table 
23a0: 74 68 61 74 20 68 61 73 20 61 20 63 6f 6c 75 6d  that has a colum
23b0: 6e 20 6e 61 6d 65 64 20 7a 43 6f 6c 2e 20 20 0a  n named zCol.  .
23c0: 2a 2a 0a 2a 2a 20 57 68 65 6e 20 66 6f 75 6e 64  **.** When found
23d0: 2c 20 73 65 74 20 2a 70 69 54 61 62 20 61 6e 64  , set *piTab and
23e0: 20 2a 70 69 43 6f 6c 20 74 6f 20 74 68 65 20 74   *piCol to the t
23f0: 61 62 6c 65 20 69 6e 64 65 78 20 61 6e 64 20 63  able index and c
2400: 6f 6c 75 6d 6e 20 69 6e 64 65 78 0a 2a 2a 20 6f  olumn index.** o
2410: 66 20 74 68 65 20 6d 61 74 63 68 69 6e 67 20 63  f the matching c
2420: 6f 6c 75 6d 6e 20 61 6e 64 20 72 65 74 75 72 6e  olumn and return
2430: 20 54 52 55 45 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   TRUE..**.** If 
2440: 6e 6f 74 20 66 6f 75 6e 64 2c 20 72 65 74 75 72  not found, retur
2450: 6e 20 46 41 4c 53 45 2e 0a 2a 2f 0a 73 74 61 74  n FALSE..*/.stat
2460: 69 63 20 69 6e 74 20 74 61 62 6c 65 41 6e 64 43  ic int tableAndC
2470: 6f 6c 75 6d 6e 49 6e 64 65 78 28 0a 20 20 53 72  olumnIndex(.  Sr
2480: 63 4c 69 73 74 20 2a 70 53 72 63 2c 20 20 20 20  cList *pSrc,    
2490: 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 74     /* Array of t
24a0: 61 62 6c 65 73 20 74 6f 20 73 65 61 72 63 68 20  ables to search 
24b0: 2a 2f 0a 20 20 69 6e 74 20 4e 2c 20 20 20 20 20  */.  int N,     
24c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
24d0: 62 65 72 20 6f 66 20 74 61 62 6c 65 73 20 69 6e  ber of tables in
24e0: 20 70 53 72 63 2d 3e 61 5b 5d 20 74 6f 20 73 65   pSrc->a[] to se
24f0: 61 72 63 68 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  arch */.  const 
2500: 63 68 61 72 20 2a 7a 43 6f 6c 2c 20 20 20 20 2f  char *zCol,    /
2510: 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 63 6f  * Name of the co
2520: 6c 75 6d 6e 20 77 65 20 61 72 65 20 6c 6f 6f 6b  lumn we are look
2530: 69 6e 67 20 66 6f 72 20 2a 2f 0a 20 20 69 6e 74  ing for */.  int
2540: 20 2a 70 69 54 61 62 2c 20 20 20 20 20 20 20 20   *piTab,        
2550: 20 20 2f 2a 20 57 72 69 74 65 20 69 6e 64 65 78    /* Write index
2560: 20 6f 66 20 70 53 72 63 2d 3e 61 5b 5d 20 68 65   of pSrc->a[] he
2570: 72 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 69 43  re */.  int *piC
2580: 6f 6c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ol           /* 
2590: 57 72 69 74 65 20 69 6e 64 65 78 20 6f 66 20 70  Write index of p
25a0: 53 72 63 2d 3e 61 5b 2a 70 69 54 61 62 5d 2e 70  Src->a[*piTab].p
25b0: 54 61 62 2d 3e 61 43 6f 6c 5b 5d 20 68 65 72 65  Tab->aCol[] here
25c0: 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 20   */.){.  int i; 
25d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
25e0: 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65   For looping ove
25f0: 72 20 74 61 62 6c 65 73 20 69 6e 20 70 53 72 63  r tables in pSrc
2600: 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 3b 20   */.  int iCol; 
2610: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
2620: 64 65 78 20 6f 66 20 63 6f 6c 75 6d 6e 20 6d 61  dex of column ma
2630: 74 63 68 69 6e 67 20 7a 43 6f 6c 20 2a 2f 0a 0a  tching zCol */..
2640: 20 20 61 73 73 65 72 74 28 20 28 70 69 54 61 62    assert( (piTab
2650: 3d 3d 30 29 3d 3d 28 70 69 43 6f 6c 3d 3d 30 29  ==0)==(piCol==0)
2660: 20 29 3b 20 20 2f 2a 20 42 6f 74 68 20 6f 72 20   );  /* Both or 
2670: 6e 65 69 74 68 65 72 20 61 72 65 20 4e 55 4c 4c  neither are NULL
2680: 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   */.  for(i=0; i
2690: 3c 4e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 43  <N; i++){.    iC
26a0: 6f 6c 20 3d 20 63 6f 6c 75 6d 6e 49 6e 64 65 78  ol = columnIndex
26b0: 28 70 53 72 63 2d 3e 61 5b 69 5d 2e 70 54 61 62  (pSrc->a[i].pTab
26c0: 2c 20 7a 43 6f 6c 29 3b 0a 20 20 20 20 69 66 28  , zCol);.    if(
26d0: 20 69 43 6f 6c 3e 3d 30 20 29 7b 0a 20 20 20 20   iCol>=0 ){.    
26e0: 20 20 69 66 28 20 70 69 54 61 62 20 29 7b 0a 20    if( piTab ){. 
26f0: 20 20 20 20 20 20 20 2a 70 69 54 61 62 20 3d 20         *piTab = 
2700: 69 3b 0a 20 20 20 20 20 20 20 20 2a 70 69 43 6f  i;.        *piCo
2710: 6c 20 3d 20 69 43 6f 6c 3b 0a 20 20 20 20 20 20  l = iCol;.      
2720: 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31  }.      return 1
2730: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
2740: 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
2750: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
2760: 73 20 75 73 65 64 20 74 6f 20 61 64 64 20 74 65  s used to add te
2770: 72 6d 73 20 69 6d 70 6c 69 65 64 20 62 79 20 4a  rms implied by J
2780: 4f 49 4e 20 73 79 6e 74 61 78 20 74 6f 20 74 68  OIN syntax to th
2790: 65 0a 2a 2a 20 57 48 45 52 45 20 63 6c 61 75 73  e.** WHERE claus
27a0: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6f 66 20  e expression of 
27b0: 61 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  a SELECT stateme
27c0: 6e 74 2e 20 54 68 65 20 6e 65 77 20 74 65 72 6d  nt. The new term
27d0: 2c 20 77 68 69 63 68 0a 2a 2a 20 69 73 20 41 4e  , which.** is AN
27e0: 44 65 64 20 77 69 74 68 20 74 68 65 20 65 78 69  Ded with the exi
27f0: 73 74 69 6e 67 20 57 48 45 52 45 20 63 6c 61 75  sting WHERE clau
2800: 73 65 2c 20 69 73 20 6f 66 20 74 68 65 20 66 6f  se, is of the fo
2810: 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 28 74 61  rm:.**.**    (ta
2820: 62 31 2e 63 6f 6c 31 20 3d 20 74 61 62 32 2e 63  b1.col1 = tab2.c
2830: 6f 6c 32 29 0a 2a 2a 0a 2a 2a 20 77 68 65 72 65  ol2).**.** where
2840: 20 74 61 62 31 20 69 73 20 74 68 65 20 69 53 72   tab1 is the iSr
2850: 63 27 74 68 20 74 61 62 6c 65 20 69 6e 20 53 72  c'th table in Sr
2860: 63 4c 69 73 74 20 70 53 72 63 20 61 6e 64 20 74  cList pSrc and t
2870: 61 62 32 20 69 73 20 74 68 65 20 0a 2a 2a 20 28  ab2 is the .** (
2880: 69 53 72 63 2b 31 29 27 74 68 2e 20 43 6f 6c 75  iSrc+1)'th. Colu
2890: 6d 6e 20 63 6f 6c 31 20 69 73 20 63 6f 6c 75 6d  mn col1 is colum
28a0: 6e 20 69 43 6f 6c 4c 65 66 74 20 6f 66 20 74 61  n iColLeft of ta
28b0: 62 31 2c 20 61 6e 64 20 63 6f 6c 32 20 69 73 0a  b1, and col2 is.
28c0: 2a 2a 20 63 6f 6c 75 6d 6e 20 69 43 6f 6c 52 69  ** column iColRi
28d0: 67 68 74 20 6f 66 20 74 61 62 32 2e 0a 2a 2f 0a  ght of tab2..*/.
28e0: 73 74 61 74 69 63 20 76 6f 69 64 20 61 64 64 57  static void addW
28f0: 68 65 72 65 54 65 72 6d 28 0a 20 20 50 61 72 73  hereTerm(.  Pars
2900: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
2910: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
2920: 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
2930: 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72  /.  SrcList *pSr
2940: 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
2950: 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 74      /* List of t
2960: 61 62 6c 65 73 20 69 6e 20 46 52 4f 4d 20 63 6c  ables in FROM cl
2970: 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69 4c  ause */.  int iL
2980: 65 66 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  eft,            
2990: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
29a0: 65 78 20 6f 66 20 66 69 72 73 74 20 74 61 62 6c  ex of first tabl
29b0: 65 20 74 6f 20 6a 6f 69 6e 20 69 6e 20 70 53 72  e to join in pSr
29c0: 63 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 4c  c */.  int iColL
29d0: 65 66 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  eft,            
29e0: 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
29f0: 6f 66 20 63 6f 6c 75 6d 6e 20 69 6e 20 66 69 72  of column in fir
2a00: 73 74 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e  st table */.  in
2a10: 74 20 69 52 69 67 68 74 2c 20 20 20 20 20 20 20  t iRight,       
2a20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2a30: 20 49 6e 64 65 78 20 6f 66 20 73 65 63 6f 6e 64   Index of second
2a40: 20 74 61 62 6c 65 20 69 6e 20 70 53 72 63 20 2a   table in pSrc *
2a50: 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 52 69 67 68  /.  int iColRigh
2a60: 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t,              
2a70: 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20      /* Index of 
2a80: 63 6f 6c 75 6d 6e 20 69 6e 20 73 65 63 6f 6e 64  column in second
2a90: 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20   table */.  int 
2aa0: 69 73 4f 75 74 65 72 4a 6f 69 6e 2c 20 20 20 20  isOuterJoin,    
2ab0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
2ac0: 72 75 65 20 69 66 20 74 68 69 73 20 69 73 20 61  rue if this is a
2ad0: 6e 20 4f 55 54 45 52 20 6a 6f 69 6e 20 2a 2f 0a  n OUTER join */.
2ae0: 20 20 45 78 70 72 20 2a 2a 70 70 57 68 65 72 65    Expr **ppWhere
2af0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b00: 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 54 68 65    /* IN/OUT: The
2b10: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 6f   WHERE clause to
2b20: 20 61 64 64 20 74 6f 20 2a 2f 0a 29 7b 0a 20 20   add to */.){.  
2b30: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
2b40: 61 72 73 65 2d 3e 64 62 3b 0a 20 20 45 78 70 72  arse->db;.  Expr
2b50: 20 2a 70 45 31 3b 0a 20 20 45 78 70 72 20 2a 70   *pE1;.  Expr *p
2b60: 45 32 3b 0a 20 20 45 78 70 72 20 2a 70 45 71 3b  E2;.  Expr *pEq;
2b70: 0a 0a 20 20 61 73 73 65 72 74 28 20 69 4c 65 66  ..  assert( iLef
2b80: 74 3c 69 52 69 67 68 74 20 29 3b 0a 20 20 61 73  t<iRight );.  as
2b90: 73 65 72 74 28 20 70 53 72 63 2d 3e 6e 53 72 63  sert( pSrc->nSrc
2ba0: 3e 69 52 69 67 68 74 20 29 3b 0a 20 20 61 73 73  >iRight );.  ass
2bb0: 65 72 74 28 20 70 53 72 63 2d 3e 61 5b 69 4c 65  ert( pSrc->a[iLe
2bc0: 66 74 5d 2e 70 54 61 62 20 29 3b 0a 20 20 61 73  ft].pTab );.  as
2bd0: 73 65 72 74 28 20 70 53 72 63 2d 3e 61 5b 69 52  sert( pSrc->a[iR
2be0: 69 67 68 74 5d 2e 70 54 61 62 20 29 3b 0a 0a 20  ight].pTab );.. 
2bf0: 20 70 45 31 20 3d 20 73 71 6c 69 74 65 33 43 72   pE1 = sqlite3Cr
2c00: 65 61 74 65 43 6f 6c 75 6d 6e 45 78 70 72 28 64  eateColumnExpr(d
2c10: 62 2c 20 70 53 72 63 2c 20 69 4c 65 66 74 2c 20  b, pSrc, iLeft, 
2c20: 69 43 6f 6c 4c 65 66 74 29 3b 0a 20 20 70 45 32  iColLeft);.  pE2
2c30: 20 3d 20 73 71 6c 69 74 65 33 43 72 65 61 74 65   = sqlite3Create
2c40: 43 6f 6c 75 6d 6e 45 78 70 72 28 64 62 2c 20 70  ColumnExpr(db, p
2c50: 53 72 63 2c 20 69 52 69 67 68 74 2c 20 69 43 6f  Src, iRight, iCo
2c60: 6c 52 69 67 68 74 29 3b 0a 0a 20 20 70 45 71 20  lRight);..  pEq 
2c70: 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70  = sqlite3PExpr(p
2c80: 50 61 72 73 65 2c 20 54 4b 5f 45 51 2c 20 70 45  Parse, TK_EQ, pE
2c90: 31 2c 20 70 45 32 29 3b 0a 20 20 69 66 28 20 70  1, pE2);.  if( p
2ca0: 45 71 20 26 26 20 69 73 4f 75 74 65 72 4a 6f 69  Eq && isOuterJoi
2cb0: 6e 20 29 7b 0a 20 20 20 20 45 78 70 72 53 65 74  n ){.    ExprSet
2cc0: 50 72 6f 70 65 72 74 79 28 70 45 71 2c 20 45 50  Property(pEq, EP
2cd0: 5f 46 72 6f 6d 4a 6f 69 6e 29 3b 0a 20 20 20 20  _FromJoin);.    
2ce0: 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73  assert( !ExprHas
2cf0: 50 72 6f 70 65 72 74 79 28 70 45 71 2c 20 45 50  Property(pEq, EP
2d00: 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 52 65  _TokenOnly|EP_Re
2d10: 64 75 63 65 64 29 20 29 3b 0a 20 20 20 20 45 78  duced) );.    Ex
2d20: 70 72 53 65 74 56 56 41 50 72 6f 70 65 72 74 79  prSetVVAProperty
2d30: 28 70 45 71 2c 20 45 50 5f 4e 6f 52 65 64 75 63  (pEq, EP_NoReduc
2d40: 65 29 3b 0a 20 20 20 20 70 45 71 2d 3e 69 52 69  e);.    pEq->iRi
2d50: 67 68 74 4a 6f 69 6e 54 61 62 6c 65 20 3d 20 28  ghtJoinTable = (
2d60: 69 31 36 29 70 45 32 2d 3e 69 54 61 62 6c 65 3b  i16)pE2->iTable;
2d70: 0a 20 20 7d 0a 20 20 2a 70 70 57 68 65 72 65 20  .  }.  *ppWhere 
2d80: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 64  = sqlite3ExprAnd
2d90: 28 64 62 2c 20 2a 70 70 57 68 65 72 65 2c 20 70  (db, *ppWhere, p
2da0: 45 71 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  Eq);.}../*.** Se
2db0: 74 20 74 68 65 20 45 50 5f 46 72 6f 6d 4a 6f 69  t the EP_FromJoi
2dc0: 6e 20 70 72 6f 70 65 72 74 79 20 6f 6e 20 61 6c  n property on al
2dd0: 6c 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 67  l terms of the g
2de0: 69 76 65 6e 20 65 78 70 72 65 73 73 69 6f 6e 2e  iven expression.
2df0: 0a 2a 2a 20 41 6e 64 20 73 65 74 20 74 68 65 20  .** And set the 
2e00: 45 78 70 72 2e 69 52 69 67 68 74 4a 6f 69 6e 54  Expr.iRightJoinT
2e10: 61 62 6c 65 20 74 6f 20 69 54 61 62 6c 65 20 66  able to iTable f
2e20: 6f 72 20 65 76 65 72 79 20 74 65 72 6d 20 69 6e  or every term in
2e30: 20 74 68 65 0a 2a 2a 20 65 78 70 72 65 73 73 69   the.** expressi
2e40: 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 45 50  on..**.** The EP
2e50: 5f 46 72 6f 6d 4a 6f 69 6e 20 70 72 6f 70 65 72  _FromJoin proper
2e60: 74 79 20 69 73 20 75 73 65 64 20 6f 6e 20 74 65  ty is used on te
2e70: 72 6d 73 20 6f 66 20 61 6e 20 65 78 70 72 65 73  rms of an expres
2e80: 73 69 6f 6e 20 74 6f 20 74 65 6c 6c 0a 2a 2a 20  sion to tell.** 
2e90: 74 68 65 20 4c 45 46 54 20 4f 55 54 45 52 20 4a  the LEFT OUTER J
2ea0: 4f 49 4e 20 70 72 6f 63 65 73 73 69 6e 67 20 6c  OIN processing l
2eb0: 6f 67 69 63 20 74 68 61 74 20 74 68 69 73 20 74  ogic that this t
2ec0: 65 72 6d 20 69 73 20 70 61 72 74 20 6f 66 20 74  erm is part of t
2ed0: 68 65 0a 2a 2a 20 6a 6f 69 6e 20 72 65 73 74 72  he.** join restr
2ee0: 69 63 74 69 6f 6e 20 73 70 65 63 69 66 69 65 64  iction specified
2ef0: 20 69 6e 20 74 68 65 20 4f 4e 20 6f 72 20 55 53   in the ON or US
2f00: 49 4e 47 20 63 6c 61 75 73 65 20 61 6e 64 20 6e  ING clause and n
2f10: 6f 74 20 61 20 70 61 72 74 0a 2a 2a 20 6f 66 20  ot a part.** of 
2f20: 74 68 65 20 6d 6f 72 65 20 67 65 6e 65 72 61 6c  the more general
2f30: 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e 20 20   WHERE clause.  
2f40: 54 68 65 73 65 20 74 65 72 6d 73 20 61 72 65 20  These terms are 
2f50: 6d 6f 76 65 64 20 6f 76 65 72 20 74 6f 20 74 68  moved over to th
2f60: 65 0a 2a 2a 20 57 48 45 52 45 20 63 6c 61 75 73  e.** WHERE claus
2f70: 65 20 64 75 72 69 6e 67 20 6a 6f 69 6e 20 70 72  e during join pr
2f80: 6f 63 65 73 73 69 6e 67 20 62 75 74 20 77 65 20  ocessing but we 
2f90: 6e 65 65 64 20 74 6f 20 72 65 6d 65 6d 62 65 72  need to remember
2fa0: 20 74 68 61 74 20 74 68 65 79 0a 2a 2a 20 6f 72   that they.** or
2fb0: 69 67 69 6e 61 74 65 64 20 69 6e 20 74 68 65 20  iginated in the 
2fc0: 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75  ON or USING clau
2fd0: 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 45 78  se..**.** The Ex
2fe0: 70 72 2e 69 52 69 67 68 74 4a 6f 69 6e 54 61 62  pr.iRightJoinTab
2ff0: 6c 65 20 74 65 6c 6c 73 20 74 68 65 20 57 48 45  le tells the WHE
3000: 52 45 20 63 6c 61 75 73 65 20 70 72 6f 63 65 73  RE clause proces
3010: 73 69 6e 67 20 74 68 61 74 20 74 68 65 0a 2a 2a  sing that the.**
3020: 20 65 78 70 72 65 73 73 69 6f 6e 20 64 65 70 65   expression depe
3030: 6e 64 73 20 6f 6e 20 74 61 62 6c 65 20 69 52 69  nds on table iRi
3040: 67 68 74 4a 6f 69 6e 54 61 62 6c 65 20 65 76 65  ghtJoinTable eve
3050: 6e 20 69 66 20 74 68 61 74 20 74 61 62 6c 65 20  n if that table 
3060: 69 73 20 6e 6f 74 0a 2a 2a 20 65 78 70 6c 69 63  is not.** explic
3070: 69 74 6c 79 20 6d 65 6e 74 69 6f 6e 65 64 20 69  itly mentioned i
3080: 6e 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  n the expression
3090: 2e 20 20 54 68 61 74 20 69 6e 66 6f 72 6d 61 74  .  That informat
30a0: 69 6f 6e 20 69 73 20 6e 65 65 64 65 64 0a 2a 2a  ion is needed.**
30b0: 20 66 6f 72 20 63 61 73 65 73 20 6c 69 6b 65 20   for cases like 
30c0: 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 53  this:.**.**    S
30d0: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20  ELECT * FROM t1 
30e0: 4c 45 46 54 20 4a 4f 49 4e 20 74 32 20 4f 4e 20  LEFT JOIN t2 ON 
30f0: 74 31 2e 61 3d 74 32 2e 62 20 41 4e 44 20 74 31  t1.a=t2.b AND t1
3100: 2e 78 3d 35 0a 2a 2a 0a 2a 2a 20 54 68 65 20 77  .x=5.**.** The w
3110: 68 65 72 65 20 63 6c 61 75 73 65 20 6e 65 65 64  here clause need
3120: 73 20 74 6f 20 64 65 66 65 72 20 74 68 65 20 68  s to defer the h
3130: 61 6e 64 6c 69 6e 67 20 6f 66 20 74 68 65 20 74  andling of the t
3140: 31 2e 78 3d 35 0a 2a 2a 20 74 65 72 6d 20 75 6e  1.x=5.** term un
3150: 74 69 6c 20 61 66 74 65 72 20 74 68 65 20 74 32  til after the t2
3160: 20 6c 6f 6f 70 20 6f 66 20 74 68 65 20 6a 6f 69   loop of the joi
3170: 6e 2e 20 20 49 6e 20 74 68 61 74 20 77 61 79 2c  n.  In that way,
3180: 20 61 0a 2a 2a 20 4e 55 4c 4c 20 74 32 20 72 6f   a.** NULL t2 ro
3190: 77 20 77 69 6c 6c 20 62 65 20 69 6e 73 65 72 74  w will be insert
31a0: 65 64 20 77 68 65 6e 65 76 65 72 20 74 31 2e 78  ed whenever t1.x
31b0: 21 3d 35 2e 20 20 49 66 20 77 65 20 64 6f 20 6e  !=5.  If we do n
31c0: 6f 74 0a 2a 2a 20 64 65 66 65 72 20 74 68 65 20  ot.** defer the 
31d0: 68 61 6e 64 6c 69 6e 67 20 6f 66 20 74 31 2e 78  handling of t1.x
31e0: 3d 35 2c 20 69 74 20 77 69 6c 6c 20 62 65 20 70  =5, it will be p
31f0: 72 6f 63 65 73 73 65 64 20 69 6d 6d 65 64 69 61  rocessed immedia
3200: 74 65 6c 79 0a 2a 2a 20 61 66 74 65 72 20 74 68  tely.** after th
3210: 65 20 74 31 20 6c 6f 6f 70 20 61 6e 64 20 72 6f  e t1 loop and ro
3220: 77 73 20 77 69 74 68 20 74 31 2e 78 21 3d 35 20  ws with t1.x!=5 
3230: 77 69 6c 6c 20 6e 65 76 65 72 20 61 70 70 65 61  will never appea
3240: 72 20 69 6e 0a 2a 2a 20 74 68 65 20 6f 75 74 70  r in.** the outp
3250: 75 74 2c 20 77 68 69 63 68 20 69 73 20 69 6e 63  ut, which is inc
3260: 6f 72 72 65 63 74 2e 0a 2a 2f 0a 73 74 61 74 69  orrect..*/.stati
3270: 63 20 76 6f 69 64 20 73 65 74 4a 6f 69 6e 45 78  c void setJoinEx
3280: 70 72 28 45 78 70 72 20 2a 70 2c 20 69 6e 74 20  pr(Expr *p, int 
3290: 69 54 61 62 6c 65 29 7b 0a 20 20 77 68 69 6c 65  iTable){.  while
32a0: 28 20 70 20 29 7b 0a 20 20 20 20 45 78 70 72 53  ( p ){.    ExprS
32b0: 65 74 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50  etProperty(p, EP
32c0: 5f 46 72 6f 6d 4a 6f 69 6e 29 3b 0a 20 20 20 20  _FromJoin);.    
32d0: 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73  assert( !ExprHas
32e0: 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 54  Property(p, EP_T
32f0: 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 52 65 64 75  okenOnly|EP_Redu
3300: 63 65 64 29 20 29 3b 0a 20 20 20 20 45 78 70 72  ced) );.    Expr
3310: 53 65 74 56 56 41 50 72 6f 70 65 72 74 79 28 70  SetVVAProperty(p
3320: 2c 20 45 50 5f 4e 6f 52 65 64 75 63 65 29 3b 0a  , EP_NoReduce);.
3330: 20 20 20 20 70 2d 3e 69 52 69 67 68 74 4a 6f 69      p->iRightJoi
3340: 6e 54 61 62 6c 65 20 3d 20 28 69 31 36 29 69 54  nTable = (i16)iT
3350: 61 62 6c 65 3b 0a 20 20 20 20 69 66 28 20 70 2d  able;.    if( p-
3360: 3e 6f 70 3d 3d 54 4b 5f 46 55 4e 43 54 49 4f 4e  >op==TK_FUNCTION
3370: 20 26 26 20 70 2d 3e 78 2e 70 4c 69 73 74 20 29   && p->x.pList )
3380: 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20  {.      int i;. 
3390: 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
33a0: 70 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70  p->x.pList->nExp
33b0: 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  r; i++){.       
33c0: 20 73 65 74 4a 6f 69 6e 45 78 70 72 28 70 2d 3e   setJoinExpr(p->
33d0: 78 2e 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45  x.pList->a[i].pE
33e0: 78 70 72 2c 20 69 54 61 62 6c 65 29 3b 0a 20 20  xpr, iTable);.  
33f0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
3400: 73 65 74 4a 6f 69 6e 45 78 70 72 28 70 2d 3e 70  setJoinExpr(p->p
3410: 4c 65 66 74 2c 20 69 54 61 62 6c 65 29 3b 0a 20  Left, iTable);. 
3420: 20 20 20 70 20 3d 20 70 2d 3e 70 52 69 67 68 74     p = p->pRight
3430: 3b 0a 20 20 7d 20 0a 7d 0a 0a 2f 2a 20 55 6e 64  ;.  } .}../* Und
3440: 6f 20 74 68 65 20 77 6f 72 6b 20 6f 66 20 73 65  o the work of se
3450: 74 4a 6f 69 6e 45 78 70 72 28 29 2e 20 20 49 6e  tJoinExpr().  In
3460: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
3470: 74 72 65 65 20 70 2c 20 63 6f 6e 76 65 72 74 20  tree p, convert 
3480: 65 76 65 72 79 0a 2a 2a 20 74 65 72 6d 20 74 68  every.** term th
3490: 61 74 20 69 73 20 6d 61 72 6b 65 64 20 77 69 74  at is marked wit
34a0: 68 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 20 61 6e  h EP_FromJoin an
34b0: 64 20 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c  d iRightJoinTabl
34c0: 65 3d 3d 69 54 61 62 6c 65 20 69 6e 74 6f 0a 2a  e==iTable into.*
34d0: 2a 20 61 6e 20 6f 72 64 69 6e 61 72 79 20 74 65  * an ordinary te
34e0: 72 6d 20 74 68 61 74 20 6f 6d 69 74 73 20 74 68  rm that omits th
34f0: 65 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 20 6d 61  e EP_FromJoin ma
3500: 72 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 68  rk..**.** This h
3510: 61 70 70 65 6e 73 20 77 68 65 6e 20 61 20 4c 45  appens when a LE
3520: 46 54 20 4a 4f 49 4e 20 69 73 20 73 69 6d 70 6c  FT JOIN is simpl
3530: 69 66 69 65 64 20 69 6e 74 6f 20 61 6e 20 6f 72  ified into an or
3540: 64 69 6e 61 72 79 20 4a 4f 49 4e 2e 0a 2a 2f 0a  dinary JOIN..*/.
3550: 73 74 61 74 69 63 20 76 6f 69 64 20 75 6e 73 65  static void unse
3560: 74 4a 6f 69 6e 45 78 70 72 28 45 78 70 72 20 2a  tJoinExpr(Expr *
3570: 70 2c 20 69 6e 74 20 69 54 61 62 6c 65 29 7b 0a  p, int iTable){.
3580: 20 20 77 68 69 6c 65 28 20 70 20 29 7b 0a 20 20    while( p ){.  
3590: 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f    if( ExprHasPro
35a0: 70 65 72 74 79 28 70 2c 20 45 50 5f 46 72 6f 6d  perty(p, EP_From
35b0: 4a 6f 69 6e 29 0a 20 20 20 20 20 26 26 20 28 69  Join).     && (i
35c0: 54 61 62 6c 65 3c 30 20 7c 7c 20 70 2d 3e 69 52  Table<0 || p->iR
35d0: 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 3d 3d 69  ightJoinTable==i
35e0: 54 61 62 6c 65 29 20 29 7b 0a 20 20 20 20 20 20  Table) ){.      
35f0: 45 78 70 72 43 6c 65 61 72 50 72 6f 70 65 72 74  ExprClearPropert
3600: 79 28 70 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e  y(p, EP_FromJoin
3610: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
3620: 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 46 55 4e 43 54   p->op==TK_FUNCT
3630: 49 4f 4e 20 26 26 20 70 2d 3e 78 2e 70 4c 69 73  ION && p->x.pLis
3640: 74 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  t ){.      int i
3650: 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  ;.      for(i=0;
3660: 20 69 3c 70 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e   i<p->x.pList->n
3670: 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Expr; i++){.    
3680: 20 20 20 20 75 6e 73 65 74 4a 6f 69 6e 45 78 70      unsetJoinExp
3690: 72 28 70 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b  r(p->x.pList->a[
36a0: 69 5d 2e 70 45 78 70 72 2c 20 69 54 61 62 6c 65  i].pExpr, iTable
36b0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
36c0: 0a 20 20 20 20 75 6e 73 65 74 4a 6f 69 6e 45 78  .    unsetJoinEx
36d0: 70 72 28 70 2d 3e 70 4c 65 66 74 2c 20 69 54 61  pr(p->pLeft, iTa
36e0: 62 6c 65 29 3b 0a 20 20 20 20 70 20 3d 20 70 2d  ble);.    p = p-
36f0: 3e 70 52 69 67 68 74 3b 0a 20 20 7d 20 0a 7d 0a  >pRight;.  } .}.
3700: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
3710: 69 6e 65 20 70 72 6f 63 65 73 73 65 73 20 74 68  ine processes th
3720: 65 20 6a 6f 69 6e 20 69 6e 66 6f 72 6d 61 74 69  e join informati
3730: 6f 6e 20 66 6f 72 20 61 20 53 45 4c 45 43 54 20  on for a SELECT 
3740: 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 4f 4e  statement..** ON
3750: 20 61 6e 64 20 55 53 49 4e 47 20 63 6c 61 75 73   and USING claus
3760: 65 73 20 61 72 65 20 63 6f 6e 76 65 72 74 65 64  es are converted
3770: 20 69 6e 74 6f 20 65 78 74 72 61 20 74 65 72 6d   into extra term
3780: 73 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 63  s of the WHERE c
3790: 6c 61 75 73 65 2e 0a 2a 2a 20 4e 41 54 55 52 41  lause..** NATURA
37a0: 4c 20 6a 6f 69 6e 73 20 61 6c 73 6f 20 63 72 65  L joins also cre
37b0: 61 74 65 20 65 78 74 72 61 20 57 48 45 52 45 20  ate extra WHERE 
37c0: 63 6c 61 75 73 65 20 74 65 72 6d 73 2e 0a 2a 2a  clause terms..**
37d0: 0a 2a 2a 20 54 68 65 20 74 65 72 6d 73 20 6f 66  .** The terms of
37e0: 20 61 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 61   a FROM clause a
37f0: 72 65 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20  re contained in 
3800: 74 68 65 20 53 65 6c 65 63 74 2e 70 53 72 63 20  the Select.pSrc 
3810: 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a 20 54 68  structure..** Th
3820: 65 20 6c 65 66 74 20 6d 6f 73 74 20 74 61 62 6c  e left most tabl
3830: 65 20 69 73 20 74 68 65 20 66 69 72 73 74 20 65  e is the first e
3840: 6e 74 72 79 20 69 6e 20 53 65 6c 65 63 74 2e 70  ntry in Select.p
3850: 53 72 63 2e 20 20 54 68 65 20 72 69 67 68 74 2d  Src.  The right-
3860: 6d 6f 73 74 0a 2a 2a 20 74 61 62 6c 65 20 69 73  most.** table is
3870: 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79 2e   the last entry.
3880: 20 20 54 68 65 20 6a 6f 69 6e 20 6f 70 65 72 61    The join opera
3890: 74 6f 72 20 69 73 20 68 65 6c 64 20 69 6e 20 74  tor is held in t
38a0: 68 65 20 65 6e 74 72 79 20 74 6f 0a 2a 2a 20 74  he entry to.** t
38b0: 68 65 20 6c 65 66 74 2e 20 20 54 68 75 73 20 65  he left.  Thus e
38c0: 6e 74 72 79 20 30 20 63 6f 6e 74 61 69 6e 73 20  ntry 0 contains 
38d0: 74 68 65 20 6a 6f 69 6e 20 6f 70 65 72 61 74 6f  the join operato
38e0: 72 20 66 6f 72 20 74 68 65 20 6a 6f 69 6e 20 62  r for the join b
38f0: 65 74 77 65 65 6e 0a 2a 2a 20 65 6e 74 72 69 65  etween.** entrie
3900: 73 20 30 20 61 6e 64 20 31 2e 20 20 41 6e 79 20  s 0 and 1.  Any 
3910: 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75  ON or USING clau
3920: 73 65 73 20 61 73 73 6f 63 69 61 74 65 64 20 77  ses associated w
3930: 69 74 68 20 74 68 65 20 6a 6f 69 6e 20 61 72 65  ith the join are
3940: 0a 2a 2a 20 61 6c 73 6f 20 61 74 74 61 63 68 65  .** also attache
3950: 64 20 74 6f 20 74 68 65 20 6c 65 66 74 20 65 6e  d to the left en
3960: 74 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  try..**.** This 
3970: 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20  routine returns 
3980: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 72  the number of er
3990: 72 6f 72 73 20 65 6e 63 6f 75 6e 74 65 72 65 64  rors encountered
39a0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
39b0: 73 71 6c 69 74 65 50 72 6f 63 65 73 73 4a 6f 69  sqliteProcessJoi
39c0: 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  n(Parse *pParse,
39d0: 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 53   Select *p){.  S
39e0: 72 63 4c 69 73 74 20 2a 70 53 72 63 3b 20 20 20  rcList *pSrc;   
39f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3a00: 2a 20 41 6c 6c 20 74 61 62 6c 65 73 20 69 6e 20  * All tables in 
3a10: 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
3a20: 2a 2f 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 20 20  */.  int i, j;  
3a30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3a40: 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
3a50: 6e 74 65 72 73 20 2a 2f 0a 20 20 73 74 72 75 63  nters */.  struc
3a60: 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
3a70: 70 4c 65 66 74 3b 20 20 20 20 20 2f 2a 20 4c 65  pLeft;     /* Le
3a80: 66 74 20 74 61 62 6c 65 20 62 65 69 6e 67 20 6a  ft table being j
3a90: 6f 69 6e 65 64 20 2a 2f 0a 20 20 73 74 72 75 63  oined */.  struc
3aa0: 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
3ab0: 70 52 69 67 68 74 3b 20 20 20 20 2f 2a 20 52 69  pRight;    /* Ri
3ac0: 67 68 74 20 74 61 62 6c 65 20 62 65 69 6e 67 20  ght table being 
3ad0: 6a 6f 69 6e 65 64 20 2a 2f 0a 0a 20 20 70 53 72  joined */..  pSr
3ae0: 63 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 70  c = p->pSrc;.  p
3af0: 4c 65 66 74 20 3d 20 26 70 53 72 63 2d 3e 61 5b  Left = &pSrc->a[
3b00: 30 5d 3b 0a 20 20 70 52 69 67 68 74 20 3d 20 26  0];.  pRight = &
3b10: 70 4c 65 66 74 5b 31 5d 3b 0a 20 20 66 6f 72 28  pLeft[1];.  for(
3b20: 69 3d 30 3b 20 69 3c 70 53 72 63 2d 3e 6e 53 72  i=0; i<pSrc->nSr
3b30: 63 2d 31 3b 20 69 2b 2b 2c 20 70 52 69 67 68 74  c-1; i++, pRight
3b40: 2b 2b 2c 20 70 4c 65 66 74 2b 2b 29 7b 0a 20 20  ++, pLeft++){.  
3b50: 20 20 54 61 62 6c 65 20 2a 70 52 69 67 68 74 54    Table *pRightT
3b60: 61 62 20 3d 20 70 52 69 67 68 74 2d 3e 70 54 61  ab = pRight->pTa
3b70: 62 3b 0a 20 20 20 20 69 6e 74 20 69 73 4f 75 74  b;.    int isOut
3b80: 65 72 3b 0a 0a 20 20 20 20 69 66 28 20 4e 45 56  er;..    if( NEV
3b90: 45 52 28 70 4c 65 66 74 2d 3e 70 54 61 62 3d 3d  ER(pLeft->pTab==
3ba0: 30 20 7c 7c 20 70 52 69 67 68 74 54 61 62 3d 3d  0 || pRightTab==
3bb0: 30 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  0) ) continue;. 
3bc0: 20 20 20 69 73 4f 75 74 65 72 20 3d 20 28 70 52     isOuter = (pR
3bd0: 69 67 68 74 2d 3e 66 67 2e 6a 6f 69 6e 74 79 70  ight->fg.jointyp
3be0: 65 20 26 20 4a 54 5f 4f 55 54 45 52 29 21 3d 30  e & JT_OUTER)!=0
3bf0: 3b 0a 0a 20 20 20 20 2f 2a 20 57 68 65 6e 20 74  ;..    /* When t
3c00: 68 65 20 4e 41 54 55 52 41 4c 20 6b 65 79 77 6f  he NATURAL keywo
3c10: 72 64 20 69 73 20 70 72 65 73 65 6e 74 2c 20 61  rd is present, a
3c20: 64 64 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  dd WHERE clause 
3c30: 74 65 72 6d 73 20 66 6f 72 0a 20 20 20 20 2a 2a  terms for.    **
3c40: 20 65 76 65 72 79 20 63 6f 6c 75 6d 6e 20 74 68   every column th
3c50: 61 74 20 74 68 65 20 74 77 6f 20 74 61 62 6c 65  at the two table
3c60: 73 20 68 61 76 65 20 69 6e 20 63 6f 6d 6d 6f 6e  s have in common
3c70: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
3c80: 20 70 52 69 67 68 74 2d 3e 66 67 2e 6a 6f 69 6e   pRight->fg.join
3c90: 74 79 70 65 20 26 20 4a 54 5f 4e 41 54 55 52 41  type & JT_NATURA
3ca0: 4c 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  L ){.      if( p
3cb0: 52 69 67 68 74 2d 3e 70 4f 6e 20 7c 7c 20 70 52  Right->pOn || pR
3cc0: 69 67 68 74 2d 3e 70 55 73 69 6e 67 20 29 7b 0a  ight->pUsing ){.
3cd0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
3ce0: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
3cf0: 22 61 20 4e 41 54 55 52 41 4c 20 6a 6f 69 6e 20  "a NATURAL join 
3d00: 6d 61 79 20 6e 6f 74 20 68 61 76 65 20 22 0a 20  may not have ". 
3d10: 20 20 20 20 20 20 20 20 20 20 22 61 6e 20 4f 4e            "an ON
3d20: 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65   or USING clause
3d30: 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 72  ", 0);.        r
3d40: 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d  eturn 1;.      }
3d50: 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20  .      for(j=0; 
3d60: 6a 3c 70 52 69 67 68 74 54 61 62 2d 3e 6e 43 6f  j<pRightTab->nCo
3d70: 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20  l; j++){.       
3d80: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 20 20 20   char *zName;   
3d90: 2f 2a 20 4e 61 6d 65 20 6f 66 20 63 6f 6c 75 6d  /* Name of colum
3da0: 6e 20 69 6e 20 74 68 65 20 72 69 67 68 74 20 74  n in the right t
3db0: 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20 20  able */.        
3dc0: 69 6e 74 20 69 4c 65 66 74 3b 20 20 20 20 20 2f  int iLeft;     /
3dd0: 2a 20 4d 61 74 63 68 69 6e 67 20 6c 65 66 74 20  * Matching left 
3de0: 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20  table */.       
3df0: 20 69 6e 74 20 69 4c 65 66 74 43 6f 6c 3b 20 20   int iLeftCol;  
3e00: 2f 2a 20 4d 61 74 63 68 69 6e 67 20 63 6f 6c 75  /* Matching colu
3e10: 6d 6e 20 69 6e 20 74 68 65 20 6c 65 66 74 20 74  mn in the left t
3e20: 61 62 6c 65 20 2a 2f 0a 0a 20 20 20 20 20 20 20  able */..       
3e30: 20 7a 4e 61 6d 65 20 3d 20 70 52 69 67 68 74 54   zName = pRightT
3e40: 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d  ab->aCol[j].zNam
3e50: 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 74  e;.        if( t
3e60: 61 62 6c 65 41 6e 64 43 6f 6c 75 6d 6e 49 6e 64  ableAndColumnInd
3e70: 65 78 28 70 53 72 63 2c 20 69 2b 31 2c 20 7a 4e  ex(pSrc, i+1, zN
3e80: 61 6d 65 2c 20 26 69 4c 65 66 74 2c 20 26 69 4c  ame, &iLeft, &iL
3e90: 65 66 74 43 6f 6c 29 20 29 7b 0a 20 20 20 20 20  eftCol) ){.     
3ea0: 20 20 20 20 20 61 64 64 57 68 65 72 65 54 65 72       addWhereTer
3eb0: 6d 28 70 50 61 72 73 65 2c 20 70 53 72 63 2c 20  m(pParse, pSrc, 
3ec0: 69 4c 65 66 74 2c 20 69 4c 65 66 74 43 6f 6c 2c  iLeft, iLeftCol,
3ed0: 20 69 2b 31 2c 20 6a 2c 0a 20 20 20 20 20 20 20   i+1, j,.       
3ee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3ef0: 69 73 4f 75 74 65 72 2c 20 26 70 2d 3e 70 57 68  isOuter, &p->pWh
3f00: 65 72 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  ere);.        }.
3f10: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
3f20: 20 20 20 2f 2a 20 44 69 73 61 6c 6c 6f 77 20 62     /* Disallow b
3f30: 6f 74 68 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47  oth ON and USING
3f40: 20 63 6c 61 75 73 65 73 20 69 6e 20 74 68 65 20   clauses in the 
3f50: 73 61 6d 65 20 6a 6f 69 6e 0a 20 20 20 20 2a 2f  same join.    */
3f60: 0a 20 20 20 20 69 66 28 20 70 52 69 67 68 74 2d  .    if( pRight-
3f70: 3e 70 4f 6e 20 26 26 20 70 52 69 67 68 74 2d 3e  >pOn && pRight->
3f80: 70 55 73 69 6e 67 20 29 7b 0a 20 20 20 20 20 20  pUsing ){.      
3f90: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
3fa0: 70 50 61 72 73 65 2c 20 22 63 61 6e 6e 6f 74 20  pParse, "cannot 
3fb0: 68 61 76 65 20 62 6f 74 68 20 4f 4e 20 61 6e 64  have both ON and
3fc0: 20 55 53 49 4e 47 20 22 0a 20 20 20 20 20 20 20   USING ".       
3fd0: 20 22 63 6c 61 75 73 65 73 20 69 6e 20 74 68 65   "clauses in the
3fe0: 20 73 61 6d 65 20 6a 6f 69 6e 22 29 3b 0a 20 20   same join");.  
3ff0: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
4000: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 64 64 20    }..    /* Add 
4010: 74 68 65 20 4f 4e 20 63 6c 61 75 73 65 20 74 6f  the ON clause to
4020: 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
4030: 57 48 45 52 45 20 63 6c 61 75 73 65 2c 20 63 6f  WHERE clause, co
4040: 6e 6e 65 63 74 65 64 20 62 79 0a 20 20 20 20 2a  nnected by.    *
4050: 2a 20 61 6e 20 41 4e 44 20 6f 70 65 72 61 74 6f  * an AND operato
4060: 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  r..    */.    if
4070: 28 20 70 52 69 67 68 74 2d 3e 70 4f 6e 20 29 7b  ( pRight->pOn ){
4080: 0a 20 20 20 20 20 20 69 66 28 20 69 73 4f 75 74  .      if( isOut
4090: 65 72 20 29 20 73 65 74 4a 6f 69 6e 45 78 70 72  er ) setJoinExpr
40a0: 28 70 52 69 67 68 74 2d 3e 70 4f 6e 2c 20 70 52  (pRight->pOn, pR
40b0: 69 67 68 74 2d 3e 69 43 75 72 73 6f 72 29 3b 0a  ight->iCursor);.
40c0: 20 20 20 20 20 20 70 2d 3e 70 57 68 65 72 65 20        p->pWhere 
40d0: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 64  = sqlite3ExprAnd
40e0: 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 2d 3e  (pParse->db, 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 76 29 3b 0a 20  eMakeLabel(v);. 
5710: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
5720: 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c  ExprList(pParse,
5730: 20 70 53 6f 72 74 2d 3e 70 4f 72 64 65 72 42 79   pSort->pOrderBy
5740: 2c 20 72 65 67 42 61 73 65 2c 20 72 65 67 4f 72  , regBase, regOr
5750: 69 67 44 61 74 61 2c 0a 20 20 20 20 20 20 20 20  igData,.        
5760: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5770: 20 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f 44 55    SQLITE_ECEL_DU
5780: 50 20 7c 20 28 72 65 67 4f 72 69 67 44 61 74 61  P | (regOrigData
5790: 3f 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f 52 45  ? SQLITE_ECEL_RE
57a0: 46 20 3a 20 30 29 29 3b 0a 20 20 69 66 28 20 62  F : 0));.  if( b
57b0: 53 65 71 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  Seq ){.    sqlit
57c0: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
57d0: 4f 50 5f 53 65 71 75 65 6e 63 65 2c 20 70 53 6f  OP_Sequence, pSo
57e0: 72 74 2d 3e 69 45 43 75 72 73 6f 72 2c 20 72 65  rt->iECursor, re
57f0: 67 42 61 73 65 2b 6e 45 78 70 72 29 3b 0a 20 20  gBase+nExpr);.  
5800: 7d 0a 20 20 69 66 28 20 6e 50 72 65 66 69 78 52  }.  if( nPrefixR
5810: 65 67 3d 3d 30 20 26 26 20 6e 44 61 74 61 3e 30  eg==0 && nData>0
5820: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
5830: 78 70 72 43 6f 64 65 4d 6f 76 65 28 70 50 61 72  xprCodeMove(pPar
5840: 73 65 2c 20 72 65 67 44 61 74 61 2c 20 72 65 67  se, regData, reg
5850: 42 61 73 65 2b 6e 45 78 70 72 2b 62 53 65 71 2c  Base+nExpr+bSeq,
5860: 20 6e 44 61 74 61 29 3b 0a 20 20 7d 0a 20 20 69   nData);.  }.  i
5870: 66 28 20 6e 4f 42 53 61 74 3e 30 20 29 7b 0a 20  f( nOBSat>0 ){. 
5880: 20 20 20 69 6e 74 20 72 65 67 50 72 65 76 4b 65     int regPrevKe
5890: 79 3b 20 20 20 2f 2a 20 54 68 65 20 66 69 72 73  y;   /* The firs
58a0: 74 20 6e 4f 42 53 61 74 20 63 6f 6c 75 6d 6e 73  t nOBSat columns
58b0: 20 6f 66 20 74 68 65 20 70 72 65 76 69 6f 75 73   of the previous
58c0: 20 72 6f 77 20 2a 2f 0a 20 20 20 20 69 6e 74 20   row */.    int 
58d0: 61 64 64 72 46 69 72 73 74 3b 20 20 20 20 2f 2a  addrFirst;    /*
58e0: 20 41 64 64 72 65 73 73 20 6f 66 20 74 68 65 20   Address of the 
58f0: 4f 50 5f 49 66 4e 6f 74 20 6f 70 63 6f 64 65 20  OP_IfNot opcode 
5900: 2a 2f 0a 20 20 20 20 69 6e 74 20 61 64 64 72 4a  */.    int addrJ
5910: 6d 70 3b 20 20 20 20 20 20 2f 2a 20 41 64 64 72  mp;      /* Addr
5920: 65 73 73 20 6f 66 20 74 68 65 20 4f 50 5f 4a 75  ess of the OP_Ju
5930: 6d 70 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 20  mp opcode */.   
5940: 20 56 64 62 65 4f 70 20 2a 70 4f 70 3b 20 20 20   VdbeOp *pOp;   
5950: 20 20 20 2f 2a 20 4f 70 63 6f 64 65 20 74 68 61     /* Opcode tha
5960: 74 20 6f 70 65 6e 73 20 74 68 65 20 73 6f 72 74  t opens the sort
5970: 65 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 4b  er */.    int nK
5980: 65 79 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  ey;         /* N
5990: 75 6d 62 65 72 20 6f 66 20 73 6f 72 74 69 6e 67  umber of sorting
59a0: 20 6b 65 79 20 63 6f 6c 75 6d 6e 73 2c 20 69 6e   key columns, in
59b0: 63 6c 75 64 69 6e 67 20 4f 50 5f 53 65 71 75 65  cluding OP_Seque
59c0: 6e 63 65 20 2a 2f 0a 20 20 20 20 4b 65 79 49 6e  nce */.    KeyIn
59d0: 66 6f 20 2a 70 4b 49 3b 20 20 20 20 20 2f 2a 20  fo *pKI;     /* 
59e0: 4f 72 69 67 69 6e 61 6c 20 4b 65 79 49 6e 66 6f  Original KeyInfo
59f0: 20 6f 6e 20 74 68 65 20 73 6f 72 74 65 72 20 74   on the sorter t
5a00: 61 62 6c 65 20 2a 2f 0a 0a 20 20 20 20 72 65 67  able */..    reg
5a10: 52 65 63 6f 72 64 20 3d 20 6d 61 6b 65 53 6f 72  Record = makeSor
5a20: 74 65 72 52 65 63 6f 72 64 28 70 50 61 72 73 65  terRecord(pParse
5a30: 2c 20 70 53 6f 72 74 2c 20 70 53 65 6c 65 63 74  , pSort, pSelect
5a40: 2c 20 72 65 67 42 61 73 65 2c 20 6e 42 61 73 65  , regBase, nBase
5a50: 29 3b 0a 20 20 20 20 72 65 67 50 72 65 76 4b 65  );.    regPrevKe
5a60: 79 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  y = pParse->nMem
5a70: 2b 31 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e  +1;.    pParse->
5a80: 6e 4d 65 6d 20 2b 3d 20 70 53 6f 72 74 2d 3e 6e  nMem += pSort->n
5a90: 4f 42 53 61 74 3b 0a 20 20 20 20 6e 4b 65 79 20  OBSat;.    nKey 
5aa0: 3d 20 6e 45 78 70 72 20 2d 20 70 53 6f 72 74 2d  = nExpr - pSort-
5ab0: 3e 6e 4f 42 53 61 74 20 2b 20 62 53 65 71 3b 0a  >nOBSat + bSeq;.
5ac0: 20 20 20 20 69 66 28 20 62 53 65 71 20 29 7b 0a      if( bSeq ){.
5ad0: 20 20 20 20 20 20 61 64 64 72 46 69 72 73 74 20        addrFirst 
5ae0: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
5af0: 4f 70 31 28 76 2c 20 4f 50 5f 49 66 4e 6f 74 2c  Op1(v, OP_IfNot,
5b00: 20 72 65 67 42 61 73 65 2b 6e 45 78 70 72 29 3b   regBase+nExpr);
5b10: 20 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20   .    }else{.   
5b20: 20 20 20 61 64 64 72 46 69 72 73 74 20 3d 20 73     addrFirst = s
5b30: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
5b40: 28 76 2c 20 4f 50 5f 53 65 71 75 65 6e 63 65 54  (v, OP_SequenceT
5b50: 65 73 74 2c 20 70 53 6f 72 74 2d 3e 69 45 43 75  est, pSort->iECu
5b60: 72 73 6f 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20  rsor);.    }.   
5b70: 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
5b80: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
5b90: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f  eAddOp3(v, OP_Co
5ba0: 6d 70 61 72 65 2c 20 72 65 67 50 72 65 76 4b 65  mpare, regPrevKe
5bb0: 79 2c 20 72 65 67 42 61 73 65 2c 20 70 53 6f 72  y, regBase, pSor
5bc0: 74 2d 3e 6e 4f 42 53 61 74 29 3b 0a 20 20 20 20  t->nOBSat);.    
5bd0: 70 4f 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62  pOp = sqlite3Vdb
5be0: 65 47 65 74 4f 70 28 76 2c 20 70 53 6f 72 74 2d  eGetOp(v, pSort-
5bf0: 3e 61 64 64 72 53 6f 72 74 49 6e 64 65 78 29 3b  >addrSortIndex);
5c00: 0a 20 20 20 20 69 66 28 20 70 50 61 72 73 65 2d  .    if( pParse-
5c10: 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
5c20: 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20  d ) return;.    
5c30: 70 4f 70 2d 3e 70 32 20 3d 20 6e 4b 65 79 20 2b  pOp->p2 = nKey +
5c40: 20 6e 44 61 74 61 3b 0a 20 20 20 20 70 4b 49 20   nData;.    pKI 
5c50: 3d 20 70 4f 70 2d 3e 70 34 2e 70 4b 65 79 49 6e  = pOp->p4.pKeyIn
5c60: 66 6f 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 70  fo;.    memset(p
5c70: 4b 49 2d 3e 61 53 6f 72 74 4f 72 64 65 72 2c 20  KI->aSortOrder, 
5c80: 30 2c 20 70 4b 49 2d 3e 6e 4b 65 79 46 69 65 6c  0, pKI->nKeyFiel
5c90: 64 29 3b 20 2f 2a 20 4d 61 6b 65 73 20 4f 50 5f  d); /* Makes OP_
5ca0: 4a 75 6d 70 20 74 65 73 74 61 62 6c 65 20 2a 2f  Jump testable */
5cb0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
5cc0: 43 68 61 6e 67 65 50 34 28 76 2c 20 2d 31 2c 20  ChangeP4(v, -1, 
5cd0: 28 63 68 61 72 2a 29 70 4b 49 2c 20 50 34 5f 4b  (char*)pKI, P4_K
5ce0: 45 59 49 4e 46 4f 29 3b 0a 20 20 20 20 74 65 73  EYINFO);.    tes
5cf0: 74 63 61 73 65 28 20 70 4b 49 2d 3e 6e 41 6c 6c  tcase( pKI->nAll
5d00: 46 69 65 6c 64 20 3e 20 70 4b 49 2d 3e 6e 4b 65  Field > pKI->nKe
5d10: 79 46 69 65 6c 64 2b 32 20 29 3b 0a 20 20 20 20  yField+2 );.    
5d20: 70 4f 70 2d 3e 70 34 2e 70 4b 65 79 49 6e 66 6f  pOp->p4.pKeyInfo
5d30: 20 3d 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66   = sqlite3KeyInf
5d40: 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 70 50  oFromExprList(pP
5d50: 61 72 73 65 2c 70 53 6f 72 74 2d 3e 70 4f 72 64  arse,pSort->pOrd
5d60: 65 72 42 79 2c 6e 4f 42 53 61 74 2c 0a 20 20 20  erBy,nOBSat,.   
5d70: 20 20 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 70 4b 49 2d 3e 6e 41 6c          pKI->nAl
5da0: 6c 46 69 65 6c 64 2d 70 4b 49 2d 3e 6e 4b 65 79  lField-pKI->nKey
5db0: 46 69 65 6c 64 2d 31 29 3b 0a 20 20 20 20 61 64  Field-1);.    ad
5dc0: 64 72 4a 6d 70 20 3d 20 73 71 6c 69 74 65 33 56  drJmp = sqlite3V
5dd0: 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
5de0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
5df0: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4a  beAddOp3(v, OP_J
5e00: 75 6d 70 2c 20 61 64 64 72 4a 6d 70 2b 31 2c 20  ump, addrJmp+1, 
5e10: 30 2c 20 61 64 64 72 4a 6d 70 2b 31 29 3b 20 56  0, addrJmp+1); V
5e20: 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
5e30: 20 20 20 20 70 53 6f 72 74 2d 3e 6c 61 62 65 6c      pSort->label
5e40: 42 6b 4f 75 74 20 3d 20 73 71 6c 69 74 65 33 56  BkOut = sqlite3V
5e50: 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
5e60: 0a 20 20 20 20 70 53 6f 72 74 2d 3e 72 65 67 52  .    pSort->regR
5e70: 65 74 75 72 6e 20 3d 20 2b 2b 70 50 61 72 73 65  eturn = ++pParse
5e80: 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 73 71 6c 69  ->nMem;.    sqli
5e90: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
5ea0: 20 4f 50 5f 47 6f 73 75 62 2c 20 70 53 6f 72 74   OP_Gosub, pSort
5eb0: 2d 3e 72 65 67 52 65 74 75 72 6e 2c 20 70 53 6f  ->regReturn, pSo
5ec0: 72 74 2d 3e 6c 61 62 65 6c 42 6b 4f 75 74 29 3b  rt->labelBkOut);
5ed0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
5ee0: 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 73  AddOp1(v, OP_Res
5ef0: 65 74 53 6f 72 74 65 72 2c 20 70 53 6f 72 74 2d  etSorter, pSort-
5f00: 3e 69 45 43 75 72 73 6f 72 29 3b 0a 20 20 20 20  >iECursor);.    
5f10: 69 66 28 20 69 4c 69 6d 69 74 20 29 7b 0a 20 20  if( iLimit ){.  
5f20: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
5f30: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66 4e 6f  ddOp2(v, OP_IfNo
5f40: 74 2c 20 69 4c 69 6d 69 74 2c 20 70 53 6f 72 74  t, iLimit, pSort
5f50: 2d 3e 6c 61 62 65 6c 44 6f 6e 65 29 3b 0a 20 20  ->labelDone);.  
5f60: 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
5f70: 28 76 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  (v);.    }.    s
5f80: 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
5f90: 72 65 28 76 2c 20 61 64 64 72 46 69 72 73 74 29  re(v, addrFirst)
5fa0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  ;.    sqlite3Exp
5fb0: 72 43 6f 64 65 4d 6f 76 65 28 70 50 61 72 73 65  rCodeMove(pParse
5fc0: 2c 20 72 65 67 42 61 73 65 2c 20 72 65 67 50 72  , regBase, regPr
5fd0: 65 76 4b 65 79 2c 20 70 53 6f 72 74 2d 3e 6e 4f  evKey, pSort->nO
5fe0: 42 53 61 74 29 3b 0a 20 20 20 20 73 71 6c 69 74  BSat);.    sqlit
5ff0: 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
6000: 2c 20 61 64 64 72 4a 6d 70 29 3b 0a 20 20 7d 0a  , addrJmp);.  }.
6010: 20 20 69 66 28 20 69 4c 69 6d 69 74 20 29 7b 0a    if( iLimit ){.
6020: 20 20 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70      /* At this p
6030: 6f 69 6e 74 20 74 68 65 20 76 61 6c 75 65 73 20  oint the values 
6040: 66 6f 72 20 74 68 65 20 6e 65 77 20 73 6f 72 74  for the new sort
6050: 65 72 20 65 6e 74 72 79 20 61 72 65 20 73 74 6f  er entry are sto
6060: 72 65 64 0a 20 20 20 20 2a 2a 20 69 6e 20 61 6e  red.    ** in an
6070: 20 61 72 72 61 79 20 6f 66 20 72 65 67 69 73 74   array of regist
6080: 65 72 73 2e 20 54 68 65 79 20 6e 65 65 64 20 74  ers. They need t
6090: 6f 20 62 65 20 63 6f 6d 70 6f 73 65 64 20 69 6e  o be composed in
60a0: 74 6f 20 61 20 72 65 63 6f 72 64 0a 20 20 20 20  to a record.    
60b0: 2a 2a 20 61 6e 64 20 69 6e 73 65 72 74 65 64 20  ** and inserted 
60c0: 69 6e 74 6f 20 74 68 65 20 73 6f 72 74 65 72 20  into the sorter 
60d0: 69 66 20 65 69 74 68 65 72 20 28 61 29 20 74 68  if either (a) th
60e0: 65 72 65 20 61 72 65 20 63 75 72 72 65 6e 74 6c  ere are currentl
60f0: 79 0a 20 20 20 20 2a 2a 20 6c 65 73 73 20 74 68  y.    ** less th
6100: 61 6e 20 4c 49 4d 49 54 2b 4f 46 46 53 45 54 20  an LIMIT+OFFSET 
6110: 69 74 65 6d 73 20 6f 72 20 28 62 29 20 74 68 65  items or (b) the
6120: 20 6e 65 77 20 72 65 63 6f 72 64 20 69 73 20 73   new record is s
6130: 6d 61 6c 6c 65 72 20 74 68 61 6e 20 0a 20 20 20  maller than .   
6140: 20 2a 2a 20 74 68 65 20 6c 61 72 67 65 73 74 20   ** the largest 
6150: 72 65 63 6f 72 64 20 63 75 72 72 65 6e 74 6c 79  record currently
6160: 20 69 6e 20 74 68 65 20 73 6f 72 74 65 72 2e 20   in the sorter. 
6170: 49 66 20 28 62 29 20 69 73 20 74 72 75 65 20 61  If (b) is true a
6180: 6e 64 20 74 68 65 72 65 0a 20 20 20 20 2a 2a 20  nd there.    ** 
6190: 61 72 65 20 61 6c 72 65 61 64 79 20 4c 49 4d 49  are already LIMI
61a0: 54 2b 4f 46 46 53 45 54 20 69 74 65 6d 73 20 69  T+OFFSET items i
61b0: 6e 20 74 68 65 20 73 6f 72 74 65 72 2c 20 64 65  n the sorter, de
61c0: 6c 65 74 65 20 74 68 65 20 6c 61 72 67 65 73 74  lete the largest
61d0: 0a 20 20 20 20 2a 2a 20 65 6e 74 72 79 20 62 65  .    ** entry be
61e0: 66 6f 72 65 20 69 6e 73 65 72 74 69 6e 67 20 74  fore inserting t
61f0: 68 65 20 6e 65 77 20 6f 6e 65 2e 20 54 68 69 73  he new one. This
6200: 20 77 61 79 20 74 68 65 72 65 20 61 72 65 20 6e   way there are n
6210: 65 76 65 72 20 6d 6f 72 65 20 0a 20 20 20 20 2a  ever more .    *
6220: 2a 20 74 68 61 6e 20 4c 49 4d 49 54 2b 4f 46 46  * than LIMIT+OFF
6230: 53 45 54 20 69 74 65 6d 73 20 69 6e 20 74 68 65  SET items in the
6240: 20 73 6f 72 74 65 72 2e 0a 20 20 20 20 2a 2a 0a   sorter..    **.
6250: 20 20 20 20 2a 2a 20 49 66 20 74 68 65 20 6e 65      ** If the ne
6260: 77 20 72 65 63 6f 72 64 20 64 6f 65 73 20 6e 6f  w record does no
6270: 74 20 6e 65 65 64 20 74 6f 20 62 65 20 69 6e 73  t need to be ins
6280: 65 72 74 65 64 20 69 6e 74 6f 20 74 68 65 20 73  erted into the s
6290: 6f 72 74 65 72 2c 0a 20 20 20 20 2a 2a 20 6a 75  orter,.    ** ju
62a0: 6d 70 20 74 6f 20 74 68 65 20 6e 65 78 74 20 69  mp to the next i
62b0: 74 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  teration of the 
62c0: 6c 6f 6f 70 2e 20 49 66 20 74 68 65 20 70 53 6f  loop. If the pSo
62d0: 72 74 2d 3e 6c 61 62 65 6c 4f 42 4c 6f 70 74 0a  rt->labelOBLopt.
62e0: 20 20 20 20 2a 2a 20 76 61 6c 75 65 20 69 73 20      ** value is 
62f0: 6e 6f 74 20 7a 65 72 6f 2c 20 74 68 65 6e 20 69  not zero, then i
6300: 74 20 69 73 20 61 20 6c 61 62 65 6c 20 6f 66 20  t is a label of 
6310: 77 68 65 72 65 20 74 6f 20 6a 75 6d 70 2e 20 20  where to jump.  
6320: 4f 74 68 65 72 77 69 73 65 2c 0a 20 20 20 20 2a  Otherwise,.    *
6330: 2a 20 6a 75 73 74 20 62 79 70 61 73 73 20 74 68  * just bypass th
6340: 65 20 72 6f 77 20 69 6e 73 65 72 74 20 6c 6f 67  e row insert log
6350: 69 63 2e 20 20 53 65 65 20 74 68 65 20 68 65 61  ic.  See the hea
6360: 64 65 72 20 63 6f 6d 6d 65 6e 74 20 6f 6e 20 74  der comment on t
6370: 68 65 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65  he.    ** sqlite
6380: 33 57 68 65 72 65 4f 72 64 65 72 42 79 4c 69 6d  3WhereOrderByLim
6390: 69 74 4f 70 74 4c 61 62 65 6c 28 29 20 66 75 6e  itOptLabel() fun
63a0: 63 74 69 6f 6e 20 66 6f 72 20 61 64 64 69 74 69  ction for additi
63b0: 6f 6e 61 6c 20 69 6e 66 6f 2e 0a 20 20 20 20 2a  onal info..    *
63c0: 2f 0a 20 20 20 20 69 6e 74 20 69 43 73 72 20 3d  /.    int iCsr =
63d0: 20 70 53 6f 72 74 2d 3e 69 45 43 75 72 73 6f 72   pSort->iECursor
63e0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
63f0: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66  eAddOp2(v, OP_If
6400: 4e 6f 74 5a 65 72 6f 2c 20 69 4c 69 6d 69 74 2c  NotZero, iLimit,
6410: 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
6420: 65 6e 74 41 64 64 72 28 76 29 2b 34 29 3b 0a 20  entAddr(v)+4);. 
6430: 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28     VdbeCoverage(
6440: 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  v);.    sqlite3V
6450: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
6460: 4c 61 73 74 2c 20 69 43 73 72 2c 20 30 29 3b 0a  Last, iCsr, 0);.
6470: 20 20 20 20 69 53 6b 69 70 20 3d 20 73 71 6c 69      iSkip = sqli
6480: 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74  te3VdbeAddOp4Int
6490: 28 76 2c 20 4f 50 5f 49 64 78 4c 45 2c 0a 20 20  (v, OP_IdxLE,.  
64a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
64b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
64c0: 43 73 72 2c 20 30 2c 20 72 65 67 42 61 73 65 2b  Csr, 0, regBase+
64d0: 6e 4f 42 53 61 74 2c 20 6e 45 78 70 72 2d 6e 4f  nOBSat, nExpr-nO
64e0: 42 53 61 74 29 3b 0a 20 20 20 20 56 64 62 65 43  BSat);.    VdbeC
64f0: 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
6500: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
6510: 31 28 76 2c 20 4f 50 5f 44 65 6c 65 74 65 2c 20  1(v, OP_Delete, 
6520: 69 43 73 72 29 3b 0a 20 20 7d 0a 20 20 69 66 28  iCsr);.  }.  if(
6530: 20 72 65 67 52 65 63 6f 72 64 3d 3d 30 20 29 7b   regRecord==0 ){
6540: 0a 20 20 20 20 72 65 67 52 65 63 6f 72 64 20 3d  .    regRecord =
6550: 20 6d 61 6b 65 53 6f 72 74 65 72 52 65 63 6f 72   makeSorterRecor
6560: 64 28 70 50 61 72 73 65 2c 20 70 53 6f 72 74 2c  d(pParse, pSort,
6570: 20 70 53 65 6c 65 63 74 2c 20 72 65 67 42 61 73   pSelect, regBas
6580: 65 2c 20 6e 42 61 73 65 29 3b 0a 20 20 7d 0a 20  e, nBase);.  }. 
6590: 20 69 66 28 20 70 53 6f 72 74 2d 3e 73 6f 72 74   if( pSort->sort
65a0: 46 6c 61 67 73 20 26 20 53 4f 52 54 46 4c 41 47  Flags & SORTFLAG
65b0: 5f 55 73 65 53 6f 72 74 65 72 20 29 7b 0a 20 20  _UseSorter ){.  
65c0: 20 20 6f 70 20 3d 20 4f 50 5f 53 6f 72 74 65 72    op = OP_Sorter
65d0: 49 6e 73 65 72 74 3b 0a 20 20 7d 65 6c 73 65 7b  Insert;.  }else{
65e0: 0a 20 20 20 20 6f 70 20 3d 20 4f 50 5f 49 64 78  .    op = OP_Idx
65f0: 49 6e 73 65 72 74 3b 0a 20 20 7d 0a 20 20 73 71  Insert;.  }.  sq
6600: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 49  lite3VdbeAddOp4I
6610: 6e 74 28 76 2c 20 6f 70 2c 20 70 53 6f 72 74 2d  nt(v, op, pSort-
6620: 3e 69 45 43 75 72 73 6f 72 2c 20 72 65 67 52 65  >iECursor, regRe
6630: 63 6f 72 64 2c 0a 20 20 20 20 20 20 20 20 20 20  cord,.          
6640: 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65 67               reg
6650: 42 61 73 65 2b 6e 4f 42 53 61 74 2c 20 6e 42 61  Base+nOBSat, nBa
6660: 73 65 2d 6e 4f 42 53 61 74 29 3b 0a 20 20 69 66  se-nOBSat);.  if
6670: 28 20 69 53 6b 69 70 20 29 7b 0a 20 20 20 20 73  ( iSkip ){.    s
6680: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
6690: 50 32 28 76 2c 20 69 53 6b 69 70 2c 0a 20 20 20  P2(v, iSkip,.   
66a0: 20 20 20 20 20 20 70 53 6f 72 74 2d 3e 6c 61 62        pSort->lab
66b0: 65 6c 4f 42 4c 6f 70 74 20 3f 20 70 53 6f 72 74  elOBLopt ? pSort
66c0: 2d 3e 6c 61 62 65 6c 4f 42 4c 6f 70 74 20 3a 20  ->labelOBLopt : 
66d0: 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
66e0: 6e 74 41 64 64 72 28 76 29 29 3b 0a 20 20 7d 0a  ntAddr(v));.  }.
66f0: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 63 6f 64  }../*.** Add cod
6700: 65 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74  e to implement t
6710: 68 65 20 4f 46 46 53 45 54 0a 2a 2f 0a 73 74 61  he OFFSET.*/.sta
6720: 74 69 63 20 76 6f 69 64 20 63 6f 64 65 4f 66 66  tic void codeOff
6730: 73 65 74 28 0a 20 20 56 64 62 65 20 2a 76 2c 20  set(.  Vdbe *v, 
6740: 20 20 20 20 20 20 20 20 20 2f 2a 20 47 65 6e 65           /* Gene
6750: 72 61 74 65 20 63 6f 64 65 20 69 6e 74 6f 20 74  rate code into t
6760: 68 69 73 20 56 4d 20 2a 2f 0a 20 20 69 6e 74 20  his VM */.  int 
6770: 69 4f 66 66 73 65 74 2c 20 20 20 20 20 20 2f 2a  iOffset,      /*
6780: 20 52 65 67 69 73 74 65 72 20 68 6f 6c 64 69 6e   Register holdin
6790: 67 20 74 68 65 20 6f 66 66 73 65 74 20 63 6f 75  g the offset cou
67a0: 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 69 43  nter */.  int iC
67b0: 6f 6e 74 69 6e 75 65 20 20 20 20 20 2f 2a 20 4a  ontinue     /* J
67c0: 75 6d 70 20 68 65 72 65 20 74 6f 20 73 6b 69 70  ump here to skip
67d0: 20 74 68 65 20 63 75 72 72 65 6e 74 20 72 65 63   the current rec
67e0: 6f 72 64 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20  ord */.){.  if( 
67f0: 69 4f 66 66 73 65 74 3e 30 20 29 7b 0a 20 20 20  iOffset>0 ){.   
6800: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
6810: 70 33 28 76 2c 20 4f 50 5f 49 66 50 6f 73 2c 20  p3(v, OP_IfPos, 
6820: 69 4f 66 66 73 65 74 2c 20 69 43 6f 6e 74 69 6e  iOffset, iContin
6830: 75 65 2c 20 31 29 3b 20 56 64 62 65 43 6f 76 65  ue, 1); VdbeCove
6840: 72 61 67 65 28 76 29 3b 0a 20 20 20 20 56 64 62  rage(v);.    Vdb
6850: 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4f 46  eComment((v, "OF
6860: 46 53 45 54 22 29 29 3b 0a 20 20 7d 0a 7d 0a 0a  FSET"));.  }.}..
6870: 2f 2a 0a 2a 2a 20 41 64 64 20 63 6f 64 65 20 74  /*.** Add code t
6880: 68 61 74 20 77 69 6c 6c 20 63 68 65 63 6b 20 74  hat will check t
6890: 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65 20  o make sure the 
68a0: 4e 20 72 65 67 69 73 74 65 72 73 20 73 74 61 72  N registers star
68b0: 74 69 6e 67 20 61 74 20 69 4d 65 6d 0a 2a 2a 20  ting at iMem.** 
68c0: 66 6f 72 6d 20 61 20 64 69 73 74 69 6e 63 74 20  form a distinct 
68d0: 65 6e 74 72 79 2e 20 20 69 54 61 62 20 69 73 20  entry.  iTab is 
68e0: 61 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 20  a sorting index 
68f0: 74 68 61 74 20 68 6f 6c 64 73 20 70 72 65 76 69  that holds previ
6900: 6f 75 73 6c 79 0a 2a 2a 20 73 65 65 6e 20 63 6f  ously.** seen co
6910: 6d 62 69 6e 61 74 69 6f 6e 73 20 6f 66 20 74 68  mbinations of th
6920: 65 20 4e 20 76 61 6c 75 65 73 2e 20 20 41 20 6e  e N values.  A n
6930: 65 77 20 65 6e 74 72 79 20 69 73 20 6d 61 64 65  ew entry is made
6940: 20 69 6e 20 69 54 61 62 0a 2a 2a 20 69 66 20 74   in iTab.** if t
6950: 68 65 20 63 75 72 72 65 6e 74 20 4e 20 76 61 6c  he current N val
6960: 75 65 73 20 61 72 65 20 6e 65 77 2e 0a 2a 2a 0a  ues are new..**.
6970: 2a 2a 20 41 20 6a 75 6d 70 20 74 6f 20 61 64 64  ** A jump to add
6980: 72 52 65 70 65 61 74 20 69 73 20 6d 61 64 65 20  rRepeat is made 
6990: 61 6e 64 20 74 68 65 20 4e 2b 31 20 76 61 6c 75  and the N+1 valu
69a0: 65 73 20 61 72 65 20 70 6f 70 70 65 64 20 66 72  es are popped fr
69b0: 6f 6d 20 74 68 65 0a 2a 2a 20 73 74 61 63 6b 20  om the.** stack 
69c0: 69 66 20 74 68 65 20 74 6f 70 20 4e 20 65 6c 65  if the top N ele
69d0: 6d 65 6e 74 73 20 61 72 65 20 6e 6f 74 20 64 69  ments are not di
69e0: 73 74 69 6e 63 74 2e 0a 2a 2f 0a 73 74 61 74 69  stinct..*/.stati
69f0: 63 20 76 6f 69 64 20 63 6f 64 65 44 69 73 74 69  c void codeDisti
6a00: 6e 63 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50  nct(.  Parse *pP
6a10: 61 72 73 65 2c 20 20 20 20 20 2f 2a 20 50 61 72  arse,     /* Par
6a20: 73 69 6e 67 20 61 6e 64 20 63 6f 64 65 20 67 65  sing and code ge
6a30: 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74 65 78 74  nerating context
6a40: 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 2c 20   */.  int iTab, 
6a50: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 73 6f           /* A so
6a60: 72 74 69 6e 67 20 69 6e 64 65 78 20 75 73 65 64  rting index used
6a70: 20 74 6f 20 74 65 73 74 20 66 6f 72 20 64 69 73   to test for dis
6a80: 74 69 6e 63 74 6e 65 73 73 20 2a 2f 0a 20 20 69  tinctness */.  i
6a90: 6e 74 20 61 64 64 72 52 65 70 65 61 74 2c 20 20  nt addrRepeat,  
6aa0: 20 20 2f 2a 20 4a 75 6d 70 20 74 6f 20 68 65 72    /* Jump to her
6ab0: 65 20 69 66 20 6e 6f 74 20 64 69 73 74 69 6e 63  e if not distinc
6ac0: 74 20 2a 2f 0a 20 20 69 6e 74 20 4e 2c 20 20 20  t */.  int N,   
6ad0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
6ae0: 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20  ber of elements 
6af0: 2a 2f 0a 20 20 69 6e 74 20 69 4d 65 6d 20 20 20  */.  int iMem   
6b00: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
6b10: 20 65 6c 65 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20   element */.){. 
6b20: 20 56 64 62 65 20 2a 76 3b 0a 20 20 69 6e 74 20   Vdbe *v;.  int 
6b30: 72 31 3b 0a 0a 20 20 76 20 3d 20 70 50 61 72 73  r1;..  v = pPars
6b40: 65 2d 3e 70 56 64 62 65 3b 0a 20 20 72 31 20 3d  e->pVdbe;.  r1 =
6b50: 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
6b60: 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 73 71  eg(pParse);.  sq
6b70: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 49  lite3VdbeAddOp4I
6b80: 6e 74 28 76 2c 20 4f 50 5f 46 6f 75 6e 64 2c 20  nt(v, OP_Found, 
6b90: 69 54 61 62 2c 20 61 64 64 72 52 65 70 65 61 74  iTab, addrRepeat
6ba0: 2c 20 69 4d 65 6d 2c 20 4e 29 3b 20 56 64 62 65  , iMem, N); Vdbe
6bb0: 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 73  Coverage(v);.  s
6bc0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
6bd0: 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72  (v, OP_MakeRecor
6be0: 64 2c 20 69 4d 65 6d 2c 20 4e 2c 20 72 31 29 3b  d, iMem, N, r1);
6bf0: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
6c00: 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 49 64  dOp4Int(v, OP_Id
6c10: 78 49 6e 73 65 72 74 2c 20 69 54 61 62 2c 20 72  xInsert, iTab, r
6c20: 31 2c 20 69 4d 65 6d 2c 20 4e 29 3b 0a 20 20 73  1, iMem, N);.  s
6c30: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
6c40: 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f 55 53 45  P5(v, OPFLAG_USE
6c50: 53 45 45 4b 52 45 53 55 4c 54 29 3b 0a 20 20 73  SEEKRESULT);.  s
6c60: 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
6c70: 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 31 29  pReg(pParse, r1)
6c80: 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  ;.}..#ifdef SQLI
6c90: 54 45 5f 45 4e 41 42 4c 45 5f 53 4f 52 54 45 52  TE_ENABLE_SORTER
6ca0: 5f 52 45 46 45 52 45 4e 43 45 53 0a 2f 2a 0a 2a  _REFERENCES./*.*
6cb0: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
6cc0: 69 73 20 63 61 6c 6c 65 64 20 61 73 20 70 61 72  is called as par
6cd0: 74 20 6f 66 20 69 6e 6e 65 72 2d 6c 6f 6f 70 20  t of inner-loop 
6ce0: 67 65 6e 65 72 61 74 69 6f 6e 20 66 6f 72 20 61  generation for a
6cf0: 20 53 45 4c 45 43 54 0a 2a 2a 20 73 74 61 74 65   SELECT.** state
6d00: 6d 65 6e 74 20 77 69 74 68 20 61 6e 20 4f 52 44  ment with an ORD
6d10: 45 52 20 42 59 20 74 68 61 74 20 69 73 20 6e 6f  ER BY that is no
6d20: 74 20 6f 70 74 69 6d 69 7a 65 64 20 62 79 20 61  t optimized by a
6d30: 6e 20 69 6e 64 65 78 2e 20 49 74 20 0a 2a 2a 20  n index. It .** 
6d40: 64 65 74 65 72 6d 69 6e 65 73 20 74 68 65 20 65  determines the e
6d50: 78 70 72 65 73 73 69 6f 6e 73 2c 20 69 66 20 61  xpressions, if a
6d60: 6e 79 2c 20 74 68 61 74 20 74 68 65 20 73 6f 72  ny, that the sor
6d70: 74 65 72 2d 72 65 66 65 72 65 6e 63 65 20 0a 2a  ter-reference .*
6d80: 2a 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 73  * optimization s
6d90: 68 6f 75 6c 64 20 62 65 20 75 73 65 64 20 66 6f  hould be used fo
6da0: 72 2e 20 54 68 65 20 73 6f 72 74 65 72 2d 72 65  r. The sorter-re
6db0: 66 65 72 65 6e 63 65 20 6f 70 74 69 6d 69 7a 61  ference optimiza
6dc0: 74 69 6f 6e 0a 2a 2a 20 69 73 20 75 73 65 64 20  tion.** is used 
6dd0: 66 6f 72 20 53 45 4c 45 43 54 20 71 75 65 72 69  for SELECT queri
6de0: 65 73 20 6c 69 6b 65 3a 0a 2a 2a 0a 2a 2a 20 20  es like:.**.**  
6df0: 20 53 45 4c 45 43 54 20 61 2c 20 62 69 67 62 6c   SELECT a, bigbl
6e00: 6f 62 20 46 52 4f 4d 20 74 31 20 4f 52 44 45 52  ob FROM t1 ORDER
6e10: 20 42 59 20 61 20 4c 49 4d 49 54 20 31 30 0a 2a   BY a LIMIT 10.*
6e20: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6f 70 74 69  *.** If the opti
6e30: 6d 69 7a 61 74 69 6f 6e 20 69 73 20 75 73 65 64  mization is used
6e40: 20 66 6f 72 20 65 78 70 72 65 73 73 69 6f 6e 20   for expression 
6e50: 22 62 69 67 62 6c 6f 62 22 2c 20 74 68 65 6e 20  "bigblob", then 
6e60: 69 6e 73 74 65 61 64 20 6f 66 0a 2a 2a 20 73 74  instead of.** st
6e70: 6f 72 69 6e 67 20 76 61 6c 75 65 73 20 72 65 61  oring values rea
6e80: 64 20 66 72 6f 6d 20 74 68 61 74 20 63 6f 6c 75  d from that colu
6e90: 6d 6e 20 69 6e 20 74 68 65 20 73 6f 72 74 65 72  mn in the sorter
6ea0: 20 72 65 63 6f 72 64 73 2c 20 74 68 65 20 50 4b   records, the PK
6eb0: 20 6f 66 0a 2a 2a 20 74 68 65 20 72 6f 77 20 66   of.** the row f
6ec0: 72 6f 6d 20 74 61 62 6c 65 20 74 31 20 69 73 20  rom table t1 is 
6ed0: 73 74 6f 72 65 64 20 69 6e 73 74 65 61 64 2e 20  stored instead. 
6ee0: 54 68 65 6e 2c 20 61 73 20 72 65 63 6f 72 64 73  Then, as records
6ef0: 20 61 72 65 20 65 78 74 72 61 63 74 65 64 20 66   are extracted f
6f00: 72 6f 6d 0a 2a 2a 20 74 68 65 20 73 6f 72 74 65  rom.** the sorte
6f10: 72 20 74 6f 20 72 65 74 75 72 6e 20 74 6f 20 74  r to return to t
6f20: 68 65 20 75 73 65 72 2c 20 74 68 65 20 72 65 71  he user, the req
6f30: 75 69 72 65 64 20 76 61 6c 75 65 20 6f 66 20 62  uired value of b
6f40: 69 67 62 6c 6f 62 20 69 73 0a 2a 2a 20 72 65 74  igblob is.** ret
6f50: 72 69 65 76 65 64 20 64 69 72 65 63 74 6c 79 20  rieved directly 
6f60: 66 72 6f 6d 20 74 61 62 6c 65 20 74 31 2e 20 49  from table t1. I
6f70: 66 20 74 68 65 20 76 61 6c 75 65 73 20 61 72 65  f the values are
6f80: 20 76 65 72 79 20 6c 61 72 67 65 2c 20 74 68 69   very large, thi
6f90: 73 20 0a 2a 2a 20 63 61 6e 20 62 65 20 6d 6f 72  s .** can be mor
6fa0: 65 20 65 66 66 69 63 69 65 6e 74 20 74 68 61 6e  e efficient than
6fb0: 20 73 74 6f 72 69 6e 67 20 74 68 65 6d 20 64 69   storing them di
6fc0: 72 65 63 74 6c 79 20 69 6e 20 74 68 65 20 73 6f  rectly in the so
6fd0: 72 74 65 72 20 72 65 63 6f 72 64 73 2e 0a 2a 2a  rter records..**
6fe0: 0a 2a 2a 20 54 68 65 20 45 78 70 72 4c 69 73 74  .** The ExprList
6ff0: 5f 69 74 65 6d 2e 62 53 6f 72 74 65 72 52 65 66  _item.bSorterRef
7000: 20 66 6c 61 67 20 69 73 20 73 65 74 20 66 6f 72   flag is set for
7010: 20 65 61 63 68 20 65 78 70 72 65 73 73 69 6f 6e   each expression
7020: 20 69 6e 20 70 45 4c 69 73 74 20 0a 2a 2a 20 66   in pEList .** f
7030: 6f 72 20 77 68 69 63 68 20 74 68 65 20 73 6f 72  or which the sor
7040: 74 65 72 2d 72 65 66 65 72 65 6e 63 65 20 6f 70  ter-reference op
7050: 74 69 6d 69 7a 61 74 69 6f 6e 20 73 68 6f 75 6c  timization shoul
7060: 64 20 62 65 20 65 6e 61 62 6c 65 64 2e 20 0a 2a  d be enabled. .*
7070: 2a 20 41 64 64 69 74 69 6f 6e 61 6c 6c 79 2c 20  * Additionally, 
7080: 74 68 65 20 70 53 6f 72 74 2d 3e 61 44 65 66 65  the pSort->aDefe
7090: 72 5b 5d 20 61 72 72 61 79 20 69 73 20 70 6f 70  r[] array is pop
70a0: 75 6c 61 74 65 64 20 77 69 74 68 20 65 6e 74 72  ulated with entr
70b0: 69 65 73 0a 2a 2a 20 66 6f 72 20 61 6c 6c 20 63  ies.** for all c
70c0: 75 72 73 6f 72 73 20 72 65 71 75 69 72 65 64 20  ursors required 
70d0: 74 6f 20 65 76 61 6c 75 61 74 65 20 61 6c 6c 20  to evaluate all 
70e0: 73 65 6c 65 63 74 65 64 20 65 78 70 72 65 73 73  selected express
70f0: 69 6f 6e 73 2e 20 46 69 6e 61 6c 6c 79 2e 0a 2a  ions. Finally..*
7100: 2a 20 6f 75 74 70 75 74 20 76 61 72 69 61 62 6c  * output variabl
7110: 65 20 28 2a 70 70 45 78 74 72 61 29 20 69 73 20  e (*ppExtra) is 
7120: 73 65 74 20 74 6f 20 61 6e 20 65 78 70 72 65 73  set to an expres
7130: 73 69 6f 6e 20 6c 69 73 74 20 63 6f 6e 74 61 69  sion list contai
7140: 6e 69 6e 67 0a 2a 2a 20 65 78 70 72 65 73 73 69  ning.** expressi
7150: 6f 6e 73 20 66 6f 72 20 61 6c 6c 20 65 78 74 72  ons for all extr
7160: 61 20 50 4b 20 76 61 6c 75 65 73 20 74 68 61 74  a PK values that
7170: 20 73 68 6f 75 6c 64 20 62 65 20 73 74 6f 72 65   should be store
7180: 64 20 69 6e 20 74 68 65 0a 2a 2a 20 73 6f 72 74  d in the.** sort
7190: 65 72 20 72 65 63 6f 72 64 73 2e 0a 2a 2f 0a 73  er records..*/.s
71a0: 74 61 74 69 63 20 76 6f 69 64 20 73 65 6c 65 63  tatic void selec
71b0: 74 45 78 70 72 44 65 66 65 72 28 0a 20 20 50 61  tExprDefer(.  Pa
71c0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
71d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
71e0: 20 4c 65 61 76 65 20 61 6e 79 20 65 72 72 6f 72   Leave any error
71f0: 20 68 65 72 65 20 2a 2f 0a 20 20 53 6f 72 74 43   here */.  SortC
7200: 74 78 20 2a 70 53 6f 72 74 2c 20 20 20 20 20 20  tx *pSort,      
7210: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 6f             /* So
7220: 72 74 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  rter context */.
7230: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69    ExprList *pELi
7240: 73 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  st,             
7250: 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 73    /* Expressions
7260: 20 64 65 73 74 69 6e 65 64 20 66 6f 72 20 73 6f   destined for so
7270: 72 74 65 72 20 2a 2f 0a 20 20 45 78 70 72 4c 69  rter */.  ExprLi
7280: 73 74 20 2a 2a 70 70 45 78 74 72 61 20 20 20 20  st **ppExtra    
7290: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 70            /* Exp
72a0: 72 65 73 73 69 6f 6e 73 20 74 6f 20 61 70 70 65  ressions to appe
72b0: 6e 64 20 74 6f 20 73 6f 72 74 65 72 20 72 65 63  nd to sorter rec
72c0: 6f 72 64 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ord */.){.  int 
72d0: 69 3b 0a 20 20 69 6e 74 20 6e 44 65 66 65 72 20  i;.  int nDefer 
72e0: 3d 20 30 3b 0a 20 20 45 78 70 72 4c 69 73 74 20  = 0;.  ExprList 
72f0: 2a 70 45 78 74 72 61 20 3d 20 30 3b 0a 20 20 66  *pExtra = 0;.  f
7300: 6f 72 28 69 3d 30 3b 20 69 3c 70 45 4c 69 73 74  or(i=0; i<pEList
7310: 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20  ->nExpr; i++){. 
7320: 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69     struct ExprLi
7330: 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d  st_item *pItem =
7340: 20 26 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 3b 0a   &pEList->a[i];.
7350: 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 75      if( pItem->u
7360: 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 3d 3d  .x.iOrderByCol==
7370: 30 20 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20  0 ){.      Expr 
7380: 2a 70 45 78 70 72 20 3d 20 70 49 74 65 6d 2d 3e  *pExpr = pItem->
7390: 70 45 78 70 72 3b 0a 20 20 20 20 20 20 54 61 62  pExpr;.      Tab
73a0: 6c 65 20 2a 70 54 61 62 20 3d 20 70 45 78 70 72  le *pTab = pExpr
73b0: 2d 3e 70 54 61 62 3b 0a 20 20 20 20 20 20 69 66  ->pTab;.      if
73c0: 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ( pExpr->op==TK_
73d0: 43 4f 4c 55 4d 4e 20 26 26 20 70 45 78 70 72 2d  COLUMN && pExpr-
73e0: 3e 69 43 6f 6c 75 6d 6e 3e 3d 30 20 26 26 20 70  >iColumn>=0 && p
73f0: 54 61 62 20 26 26 20 21 49 73 56 69 72 74 75 61  Tab && !IsVirtua
7400: 6c 28 70 54 61 62 29 0a 20 20 20 20 20 20 20 26  l(pTab).       &
7410: 26 20 28 70 54 61 62 2d 3e 61 43 6f 6c 5b 70 45  & (pTab->aCol[pE
7420: 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 5d 2e 63 6f  xpr->iColumn].co
7430: 6c 46 6c 61 67 73 20 26 20 43 4f 4c 46 4c 41 47  lFlags & COLFLAG
7440: 5f 53 4f 52 54 45 52 52 45 46 29 0a 20 20 20 20  _SORTERREF).    
7450: 20 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74    ){.        int
7460: 20 6a 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28   j;.        for(
7470: 6a 3d 30 3b 20 6a 3c 6e 44 65 66 65 72 3b 20 6a  j=0; j<nDefer; j
7480: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  ++){.          i
7490: 66 28 20 70 53 6f 72 74 2d 3e 61 44 65 66 65 72  f( pSort->aDefer
74a0: 5b 6a 5d 2e 69 43 73 72 3d 3d 70 45 78 70 72 2d  [j].iCsr==pExpr-
74b0: 3e 69 54 61 62 6c 65 20 29 20 62 72 65 61 6b 3b  >iTable ) break;
74c0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
74d0: 20 20 20 69 66 28 20 6a 3d 3d 6e 44 65 66 65 72     if( j==nDefer
74e0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66   ){.          if
74f0: 28 20 6e 44 65 66 65 72 3d 3d 41 72 72 61 79 53  ( nDefer==ArrayS
7500: 69 7a 65 28 70 53 6f 72 74 2d 3e 61 44 65 66 65  ize(pSort->aDefe
7510: 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  r) ){.          
7520: 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
7530: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
7540: 20 20 20 20 20 20 20 20 20 69 6e 74 20 6e 4b 65           int nKe
7550: 79 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20  y = 1;.         
7560: 20 20 20 69 6e 74 20 6b 3b 0a 20 20 20 20 20 20     int k;.      
7570: 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70 50 6b        Index *pPk
7580: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
7590: 20 20 69 66 28 20 21 48 61 73 52 6f 77 69 64 28    if( !HasRowid(
75a0: 70 54 61 62 29 20 29 7b 0a 20 20 20 20 20 20 20  pTab) ){.       
75b0: 20 20 20 20 20 20 20 70 50 6b 20 3d 20 73 71 6c         pPk = sql
75c0: 69 74 65 33 50 72 69 6d 61 72 79 4b 65 79 49 6e  ite3PrimaryKeyIn
75d0: 64 65 78 28 70 54 61 62 29 3b 0a 20 20 20 20 20  dex(pTab);.     
75e0: 20 20 20 20 20 20 20 20 20 6e 4b 65 79 20 3d 20           nKey = 
75f0: 70 50 6b 2d 3e 6e 4b 65 79 43 6f 6c 3b 0a 20 20  pPk->nKeyCol;.  
7600: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
7610: 20 20 20 20 20 20 20 20 66 6f 72 28 6b 3d 30 3b          for(k=0;
7620: 20 6b 3c 6e 4b 65 79 3b 20 6b 2b 2b 29 7b 0a 20   k<nKey; k++){. 
7630: 20 20 20 20 20 20 20 20 20 20 20 20 20 45 78 70               Exp
7640: 72 20 2a 70 4e 65 77 20 3d 20 73 71 6c 69 74 65  r *pNew = sqlite
7650: 33 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 54  3PExpr(pParse, T
7660: 4b 5f 43 4f 4c 55 4d 4e 2c 20 30 2c 20 30 29 3b  K_COLUMN, 0, 0);
7670: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
7680: 66 28 20 70 4e 65 77 20 29 7b 0a 20 20 20 20 20  f( pNew ){.     
7690: 20 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d             pNew-
76a0: 3e 69 54 61 62 6c 65 20 3d 20 70 45 78 70 72 2d  >iTable = pExpr-
76b0: 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20 20 20 20  >iTable;.       
76c0: 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 70           pNew->p
76d0: 54 61 62 20 3d 20 70 45 78 70 72 2d 3e 70 54 61  Tab = pExpr->pTa
76e0: 62 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  b;.             
76f0: 20 20 20 70 4e 65 77 2d 3e 69 43 6f 6c 75 6d 6e     pNew->iColumn
7700: 20 3d 20 70 50 6b 20 3f 20 70 50 6b 2d 3e 61 69   = pPk ? pPk->ai
7710: 43 6f 6c 75 6d 6e 5b 6b 5d 20 3a 20 2d 31 3b 0a  Column[k] : -1;.
7720: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7730: 70 45 78 74 72 61 20 3d 20 73 71 6c 69 74 65 33  pExtra = sqlite3
7740: 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70  ExprListAppend(p
7750: 50 61 72 73 65 2c 20 70 45 78 74 72 61 2c 20 70  Parse, pExtra, p
7760: 4e 65 77 29 3b 0a 20 20 20 20 20 20 20 20 20 20  New);.          
7770: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
7780: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
7790: 70 53 6f 72 74 2d 3e 61 44 65 66 65 72 5b 6e 44  pSort->aDefer[nD
77a0: 65 66 65 72 5d 2e 70 54 61 62 20 3d 20 70 45 78  efer].pTab = pEx
77b0: 70 72 2d 3e 70 54 61 62 3b 0a 20 20 20 20 20 20  pr->pTab;.      
77c0: 20 20 20 20 20 20 70 53 6f 72 74 2d 3e 61 44 65        pSort->aDe
77d0: 66 65 72 5b 6e 44 65 66 65 72 5d 2e 69 43 73 72  fer[nDefer].iCsr
77e0: 20 3d 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65   = pExpr->iTable
77f0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 53  ;.            pS
7800: 6f 72 74 2d 3e 61 44 65 66 65 72 5b 6e 44 65 66  ort->aDefer[nDef
7810: 65 72 5d 2e 6e 4b 65 79 20 3d 20 6e 4b 65 79 3b  er].nKey = nKey;
7820: 0a 20 20 20 20 20 20 20 20 20 20 20 20 6e 44 65  .            nDe
7830: 66 65 72 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20  fer++;.         
7840: 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
7850: 20 20 20 20 20 70 49 74 65 6d 2d 3e 62 53 6f 72       pItem->bSor
7860: 74 65 72 52 65 66 20 3d 20 31 3b 0a 20 20 20 20  terRef = 1;.    
7870: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
7880: 70 53 6f 72 74 2d 3e 6e 44 65 66 65 72 20 3d 20  pSort->nDefer = 
7890: 28 75 38 29 6e 44 65 66 65 72 3b 0a 20 20 2a 70  (u8)nDefer;.  *p
78a0: 70 45 78 74 72 61 20 3d 20 70 45 78 74 72 61 3b  pExtra = pExtra;
78b0: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
78c0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 67 65   This routine ge
78d0: 6e 65 72 61 74 65 73 20 74 68 65 20 63 6f 64 65  nerates the code
78e0: 20 66 6f 72 20 74 68 65 20 69 6e 73 69 64 65 20   for the inside 
78f0: 6f 66 20 74 68 65 20 69 6e 6e 65 72 20 6c 6f 6f  of the inner loo
7900: 70 0a 2a 2a 20 6f 66 20 61 20 53 45 4c 45 43 54  p.** of a SELECT
7910: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 72 63 54 61  ..**.** If srcTa
7920: 62 20 69 73 20 6e 65 67 61 74 69 76 65 2c 20 74  b is negative, t
7930: 68 65 6e 20 74 68 65 20 70 2d 3e 70 45 4c 69 73  hen the p->pELis
7940: 74 20 65 78 70 72 65 73 73 69 6f 6e 73 0a 2a 2a  t expressions.**
7950: 20 61 72 65 20 65 76 61 6c 75 61 74 65 64 20 69   are evaluated i
7960: 6e 20 6f 72 64 65 72 20 74 6f 20 67 65 74 20 74  n order to get t
7970: 68 65 20 64 61 74 61 20 66 6f 72 20 74 68 69 73  he data for this
7980: 20 72 6f 77 2e 20 20 49 66 20 73 72 63 54 61 62   row.  If srcTab
7990: 20 69 73 0a 2a 2a 20 7a 65 72 6f 20 6f 72 20 6d   is.** zero or m
79a0: 6f 72 65 2c 20 74 68 65 6e 20 64 61 74 61 20 69  ore, then data i
79b0: 73 20 70 75 6c 6c 65 64 20 66 72 6f 6d 20 73 72  s pulled from sr
79c0: 63 54 61 62 20 61 6e 64 20 70 2d 3e 70 45 4c 69  cTab and p->pELi
79d0: 73 74 20 69 73 20 75 73 65 64 20 6f 6e 6c 79 20  st is used only 
79e0: 0a 2a 2a 20 74 6f 20 67 65 74 20 74 68 65 20 6e  .** to get the n
79f0: 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73  umber of columns
7a00: 20 61 6e 64 20 74 68 65 20 63 6f 6c 6c 61 74 69   and the collati
7a10: 6f 6e 20 73 65 71 75 65 6e 63 65 20 66 6f 72 20  on sequence for 
7a20: 65 61 63 68 20 63 6f 6c 75 6d 6e 2e 0a 2a 2f 0a  each column..*/.
7a30: 73 74 61 74 69 63 20 76 6f 69 64 20 73 65 6c 65  static void sele
7a40: 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 0a 20 20 50  ctInnerLoop(.  P
7a50: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
7a60: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61         /* The pa
7a70: 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  rser context */.
7a80: 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20    Select *p,    
7a90: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
7aa0: 20 63 6f 6d 70 6c 65 74 65 20 73 65 6c 65 63 74   complete select
7ab0: 20 73 74 61 74 65 6d 65 6e 74 20 62 65 69 6e 67   statement being
7ac0: 20 63 6f 64 65 64 20 2a 2f 0a 20 20 69 6e 74 20   coded */.  int 
7ad0: 73 72 63 54 61 62 2c 20 20 20 20 20 20 20 20 20  srcTab,         
7ae0: 20 20 20 20 2f 2a 20 50 75 6c 6c 20 64 61 74 61      /* Pull data
7af0: 20 66 72 6f 6d 20 74 68 69 73 20 74 61 62 6c 65   from this table
7b00: 20 69 66 20 6e 6f 6e 2d 6e 65 67 61 74 69 76 65   if non-negative
7b10: 20 2a 2f 0a 20 20 53 6f 72 74 43 74 78 20 2a 70   */.  SortCtx *p
7b20: 53 6f 72 74 2c 20 20 20 20 20 20 20 20 20 2f 2a  Sort,         /*
7b30: 20 49 66 20 6e 6f 74 20 4e 55 4c 4c 2c 20 69 6e   If not NULL, in
7b40: 66 6f 20 6f 6e 20 68 6f 77 20 74 6f 20 70 72 6f  fo on how to pro
7b50: 63 65 73 73 20 4f 52 44 45 52 20 42 59 20 2a 2f  cess ORDER BY */
7b60: 0a 20 20 44 69 73 74 69 6e 63 74 43 74 78 20 2a  .  DistinctCtx *
7b70: 70 44 69 73 74 69 6e 63 74 2c 20 2f 2a 20 49 66  pDistinct, /* If
7b80: 20 6e 6f 74 20 4e 55 4c 4c 2c 20 69 6e 66 6f 20   not NULL, info 
7b90: 6f 6e 20 68 6f 77 20 74 6f 20 70 72 6f 63 65 73  on how to proces
7ba0: 73 20 44 49 53 54 49 4e 43 54 20 2a 2f 0a 20 20  s DISTINCT */.  
7bb0: 53 65 6c 65 63 74 44 65 73 74 20 2a 70 44 65 73  SelectDest *pDes
7bc0: 74 2c 20 20 20 20 20 20 2f 2a 20 48 6f 77 20 74  t,      /* How t
7bd0: 6f 20 64 69 73 70 6f 73 65 20 6f 66 20 74 68 65  o dispose of the
7be0: 20 72 65 73 75 6c 74 73 20 2a 2f 0a 20 20 69 6e   results */.  in
7bf0: 74 20 69 43 6f 6e 74 69 6e 75 65 2c 20 20 20 20  t iContinue,    
7c00: 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65        /* Jump he
7c10: 72 65 20 74 6f 20 63 6f 6e 74 69 6e 75 65 20 77  re to continue w
7c20: 69 74 68 20 6e 65 78 74 20 72 6f 77 20 2a 2f 0a  ith next row */.
7c30: 20 20 69 6e 74 20 69 42 72 65 61 6b 20 20 20 20    int iBreak    
7c40: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d            /* Jum
7c50: 70 20 68 65 72 65 20 74 6f 20 62 72 65 61 6b 20  p here to break 
7c60: 6f 75 74 20 6f 66 20 74 68 65 20 69 6e 6e 65 72  out of the inner
7c70: 20 6c 6f 6f 70 20 2a 2f 0a 29 7b 0a 20 20 56 64   loop */.){.  Vd
7c80: 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
7c90: 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b 0a  pVdbe;.  int i;.
7ca0: 20 20 69 6e 74 20 68 61 73 44 69 73 74 69 6e 63    int hasDistinc
7cb0: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  t;            /*
7cc0: 20 54 72 75 65 20 69 66 20 74 68 65 20 44 49 53   True if the DIS
7cd0: 54 49 4e 43 54 20 6b 65 79 77 6f 72 64 20 69 73  TINCT keyword is
7ce0: 20 70 72 65 73 65 6e 74 20 2a 2f 0a 20 20 69 6e   present */.  in
7cf0: 74 20 65 44 65 73 74 20 3d 20 70 44 65 73 74 2d  t eDest = pDest-
7d00: 3e 65 44 65 73 74 3b 20 20 20 2f 2a 20 48 6f 77  >eDest;   /* How
7d10: 20 74 6f 20 64 69 73 70 6f 73 65 20 6f 66 20 72   to dispose of r
7d20: 65 73 75 6c 74 73 20 2a 2f 0a 20 20 69 6e 74 20  esults */.  int 
7d30: 69 50 61 72 6d 20 3d 20 70 44 65 73 74 2d 3e 69  iParm = pDest->i
7d40: 53 44 50 61 72 6d 3b 20 2f 2a 20 46 69 72 73 74  SDParm; /* First
7d50: 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 64 69 73   argument to dis
7d60: 70 6f 73 61 6c 20 6d 65 74 68 6f 64 20 2a 2f 0a  posal method */.
7d70: 20 20 69 6e 74 20 6e 52 65 73 75 6c 74 43 6f 6c    int nResultCol
7d80: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
7d90: 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 73 75 6c   Number of resul
7da0: 74 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 69  t columns */.  i
7db0: 6e 74 20 6e 50 72 65 66 69 78 52 65 67 20 3d 20  nt nPrefixReg = 
7dc0: 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75  0;         /* Nu
7dd0: 6d 62 65 72 20 6f 66 20 65 78 74 72 61 20 72 65  mber of extra re
7de0: 67 69 73 74 65 72 73 20 62 65 66 6f 72 65 20 72  gisters before r
7df0: 65 67 52 65 73 75 6c 74 20 2a 2f 0a 20 20 52 6f  egResult */.  Ro
7e00: 77 4c 6f 61 64 49 6e 66 6f 20 73 52 6f 77 4c 6f  wLoadInfo sRowLo
7e10: 61 64 49 6e 66 6f 3b 20 20 20 2f 2a 20 49 6e 66  adInfo;   /* Inf
7e20: 6f 20 66 6f 72 20 64 65 66 65 72 72 65 64 20 72  o for deferred r
7e30: 6f 77 20 6c 6f 61 64 69 6e 67 20 2a 2f 0a 0a 20  ow loading */.. 
7e40: 20 2f 2a 20 55 73 75 61 6c 6c 79 2c 20 72 65 67   /* Usually, reg
7e50: 52 65 73 75 6c 74 20 69 73 20 74 68 65 20 66 69  Result is the fi
7e60: 72 73 74 20 63 65 6c 6c 20 69 6e 20 61 6e 20 61  rst cell in an a
7e70: 72 72 61 79 20 6f 66 20 6d 65 6d 6f 72 79 20 63  rray of memory c
7e80: 65 6c 6c 73 0a 20 20 2a 2a 20 63 6f 6e 74 61 69  ells.  ** contai
7e90: 6e 69 6e 67 20 74 68 65 20 63 75 72 72 65 6e 74  ning the current
7ea0: 20 72 65 73 75 6c 74 20 72 6f 77 2e 20 49 6e 20   result row. In 
7eb0: 74 68 69 73 20 63 61 73 65 20 72 65 67 4f 72 69  this case regOri
7ec0: 67 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 0a  g is set to the.
7ed0: 20 20 2a 2a 20 73 61 6d 65 20 76 61 6c 75 65 2e    ** same value.
7ee0: 20 48 6f 77 65 76 65 72 2c 20 69 66 20 74 68 65   However, if the
7ef0: 20 72 65 73 75 6c 74 73 20 61 72 65 20 62 65 69   results are bei
7f00: 6e 67 20 73 65 6e 74 20 74 6f 20 74 68 65 20 73  ng sent to the s
7f10: 6f 72 74 65 72 2c 20 74 68 65 0a 20 20 2a 2a 20  orter, the.  ** 
7f20: 76 61 6c 75 65 73 20 66 6f 72 20 61 6e 79 20 65  values for any e
7f30: 78 70 72 65 73 73 69 6f 6e 73 20 74 68 61 74 20  xpressions that 
7f40: 61 72 65 20 61 6c 73 6f 20 70 61 72 74 20 6f 66  are also part of
7f50: 20 74 68 65 20 73 6f 72 74 2d 6b 65 79 20 61 72   the sort-key ar
7f60: 65 20 6f 6d 69 74 74 65 64 0a 20 20 2a 2a 20 66  e omitted.  ** f
7f70: 72 6f 6d 20 74 68 69 73 20 61 72 72 61 79 2e 20  rom this array. 
7f80: 49 6e 20 74 68 69 73 20 63 61 73 65 20 72 65 67  In this case reg
7f90: 4f 72 69 67 20 69 73 20 73 65 74 20 74 6f 20 7a  Orig is set to z
7fa0: 65 72 6f 2e 20 20 2a 2f 0a 20 20 69 6e 74 20 72  ero.  */.  int r
7fb0: 65 67 52 65 73 75 6c 74 3b 20 20 20 20 20 20 20  egResult;       
7fc0: 20 20 20 20 20 20 20 2f 2a 20 53 74 61 72 74 20         /* Start 
7fd0: 6f 66 20 6d 65 6d 6f 72 79 20 68 6f 6c 64 69 6e  of memory holdin
7fe0: 67 20 63 75 72 72 65 6e 74 20 72 65 73 75 6c 74  g current result
7ff0: 73 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 4f 72  s */.  int regOr
8000: 69 67 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ig;             
8010: 20 20 20 2f 2a 20 53 74 61 72 74 20 6f 66 20 6d     /* Start of m
8020: 65 6d 6f 72 79 20 68 6f 6c 64 69 6e 67 20 66 75  emory holding fu
8030: 6c 6c 20 72 65 73 75 6c 74 20 28 6f 72 20 30 29  ll result (or 0)
8040: 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 76   */..  assert( v
8050: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d   );.  assert( p-
8060: 3e 70 45 4c 69 73 74 21 3d 30 20 29 3b 0a 20 20  >pEList!=0 );.  
8070: 68 61 73 44 69 73 74 69 6e 63 74 20 3d 20 70 44  hasDistinct = pD
8080: 69 73 74 69 6e 63 74 20 3f 20 70 44 69 73 74 69  istinct ? pDisti
8090: 6e 63 74 2d 3e 65 54 6e 63 74 54 79 70 65 20 3a  nct->eTnctType :
80a0: 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f   WHERE_DISTINCT_
80b0: 4e 4f 4f 50 3b 0a 20 20 69 66 28 20 70 53 6f 72  NOOP;.  if( pSor
80c0: 74 20 26 26 20 70 53 6f 72 74 2d 3e 70 4f 72 64  t && pSort->pOrd
80d0: 65 72 42 79 3d 3d 30 20 29 20 70 53 6f 72 74 20  erBy==0 ) pSort 
80e0: 3d 20 30 3b 0a 20 20 69 66 28 20 70 53 6f 72 74  = 0;.  if( pSort
80f0: 3d 3d 30 20 26 26 20 21 68 61 73 44 69 73 74 69  ==0 && !hasDisti
8100: 6e 63 74 20 29 7b 0a 20 20 20 20 61 73 73 65 72  nct ){.    asser
8110: 74 28 20 69 43 6f 6e 74 69 6e 75 65 21 3d 30 20  t( iContinue!=0 
8120: 29 3b 0a 20 20 20 20 63 6f 64 65 4f 66 66 73 65  );.    codeOffse
8130: 74 28 76 2c 20 70 2d 3e 69 4f 66 66 73 65 74 2c  t(v, p->iOffset,
8140: 20 69 43 6f 6e 74 69 6e 75 65 29 3b 0a 20 20 7d   iContinue);.  }
8150: 0a 0a 20 20 2f 2a 20 50 75 6c 6c 20 74 68 65 20  ..  /* Pull the 
8160: 72 65 71 75 65 73 74 65 64 20 63 6f 6c 75 6d 6e  requested column
8170: 73 2e 0a 20 20 2a 2f 0a 20 20 6e 52 65 73 75 6c  s..  */.  nResul
8180: 74 43 6f 6c 20 3d 20 70 2d 3e 70 45 4c 69 73 74  tCol = p->pEList
8190: 2d 3e 6e 45 78 70 72 3b 0a 0a 20 20 69 66 28 20  ->nExpr;..  if( 
81a0: 70 44 65 73 74 2d 3e 69 53 64 73 74 3d 3d 30 20  pDest->iSdst==0 
81b0: 29 7b 0a 20 20 20 20 69 66 28 20 70 53 6f 72 74  ){.    if( pSort
81c0: 20 29 7b 0a 20 20 20 20 20 20 6e 50 72 65 66 69   ){.      nPrefi
81d0: 78 52 65 67 20 3d 20 70 53 6f 72 74 2d 3e 70 4f  xReg = pSort->pO
81e0: 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 0a 20  rderBy->nExpr;. 
81f0: 20 20 20 20 20 69 66 28 20 21 28 70 53 6f 72 74       if( !(pSort
8200: 2d 3e 73 6f 72 74 46 6c 61 67 73 20 26 20 53 4f  ->sortFlags & SO
8210: 52 54 46 4c 41 47 5f 55 73 65 53 6f 72 74 65 72  RTFLAG_UseSorter
8220: 29 20 29 20 6e 50 72 65 66 69 78 52 65 67 2b 2b  ) ) nPrefixReg++
8230: 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e  ;.      pParse->
8240: 6e 4d 65 6d 20 2b 3d 20 6e 50 72 65 66 69 78 52  nMem += nPrefixR
8250: 65 67 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 44  eg;.    }.    pD
8260: 65 73 74 2d 3e 69 53 64 73 74 20 3d 20 70 50 61  est->iSdst = pPa
8270: 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20  rse->nMem+1;.   
8280: 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d   pParse->nMem +=
8290: 20 6e 52 65 73 75 6c 74 43 6f 6c 3b 0a 20 20 7d   nResultCol;.  }
82a0: 65 6c 73 65 20 69 66 28 20 70 44 65 73 74 2d 3e  else if( pDest->
82b0: 69 53 64 73 74 2b 6e 52 65 73 75 6c 74 43 6f 6c  iSdst+nResultCol
82c0: 20 3e 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20   > pParse->nMem 
82d0: 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 69  ){.    /* This i
82e0: 73 20 61 6e 20 65 72 72 6f 72 20 63 6f 6e 64 69  s an error condi
82f0: 74 69 6f 6e 20 74 68 61 74 20 63 61 6e 20 72 65  tion that can re
8300: 73 75 6c 74 2c 20 66 6f 72 20 65 78 61 6d 70 6c  sult, for exampl
8310: 65 2c 20 77 68 65 6e 20 61 20 53 45 4c 45 43 54  e, when a SELECT
8320: 0a 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20 72  .    ** on the r
8330: 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20 6f  ight-hand side o
8340: 66 20 61 6e 20 49 4e 53 45 52 54 20 63 6f 6e 74  f an INSERT cont
8350: 61 69 6e 73 20 6d 6f 72 65 20 72 65 73 75 6c 74  ains more result
8360: 20 63 6f 6c 75 6d 6e 73 20 74 68 61 6e 0a 20 20   columns than.  
8370: 20 20 2a 2a 20 74 68 65 72 65 20 61 72 65 20 63    ** there are c
8380: 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 74 61  olumns in the ta
8390: 62 6c 65 20 6f 6e 20 74 68 65 20 6c 65 66 74 2e  ble on the left.
83a0: 20 20 54 68 65 20 65 72 72 6f 72 20 77 69 6c 6c    The error will
83b0: 20 62 65 20 63 61 75 67 68 74 0a 20 20 20 20 2a   be caught.    *
83c0: 2a 20 61 6e 64 20 72 65 70 6f 72 74 65 64 20 6c  * and reported l
83d0: 61 74 65 72 2e 20 20 42 75 74 20 77 65 20 6e 65  ater.  But we ne
83e0: 65 64 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20  ed to make sure 
83f0: 65 6e 6f 75 67 68 20 6d 65 6d 6f 72 79 20 69 73  enough memory is
8400: 20 61 6c 6c 6f 63 61 74 65 64 0a 20 20 20 20 2a   allocated.    *
8410: 2a 20 74 6f 20 61 76 6f 69 64 20 6f 74 68 65 72  * to avoid other
8420: 20 73 70 75 72 69 6f 75 73 20 65 72 72 6f 72 73   spurious errors
8430: 20 69 6e 20 74 68 65 20 6d 65 61 6e 74 69 6d 65   in the meantime
8440: 2e 20 2a 2f 0a 20 20 20 20 70 50 61 72 73 65 2d  . */.    pParse-
8450: 3e 6e 4d 65 6d 20 2b 3d 20 6e 52 65 73 75 6c 74  >nMem += nResult
8460: 43 6f 6c 3b 0a 20 20 7d 0a 20 20 70 44 65 73 74  Col;.  }.  pDest
8470: 2d 3e 6e 53 64 73 74 20 3d 20 6e 52 65 73 75 6c  ->nSdst = nResul
8480: 74 43 6f 6c 3b 0a 20 20 72 65 67 4f 72 69 67 20  tCol;.  regOrig 
8490: 3d 20 72 65 67 52 65 73 75 6c 74 20 3d 20 70 44  = regResult = pD
84a0: 65 73 74 2d 3e 69 53 64 73 74 3b 0a 20 20 69 66  est->iSdst;.  if
84b0: 28 20 73 72 63 54 61 62 3e 3d 30 20 29 7b 0a 20  ( srcTab>=0 ){. 
84c0: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 52     for(i=0; i<nR
84d0: 65 73 75 6c 74 43 6f 6c 3b 20 69 2b 2b 29 7b 0a  esultCol; i++){.
84e0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
84f0: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f  eAddOp3(v, OP_Co
8500: 6c 75 6d 6e 2c 20 73 72 63 54 61 62 2c 20 69 2c  lumn, srcTab, i,
8510: 20 72 65 67 52 65 73 75 6c 74 2b 69 29 3b 0a 20   regResult+i);. 
8520: 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
8530: 28 28 76 2c 20 22 25 73 22 2c 20 70 2d 3e 70 45  ((v, "%s", p->pE
8540: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65  List->a[i].zName
8550: 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  ));.    }.  }els
8560: 65 20 69 66 28 20 65 44 65 73 74 21 3d 53 52 54  e if( eDest!=SRT
8570: 5f 45 78 69 73 74 73 20 29 7b 0a 23 69 66 64 65  _Exists ){.#ifde
8580: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
8590: 53 4f 52 54 45 52 5f 52 45 46 45 52 45 4e 43 45  SORTER_REFERENCE
85a0: 53 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a  S.    ExprList *
85b0: 70 45 78 74 72 61 20 3d 20 30 3b 0a 23 65 6e 64  pExtra = 0;.#end
85c0: 69 66 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  if.    /* If the
85d0: 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 69 73 20   destination is 
85e0: 61 6e 20 45 58 49 53 54 53 28 2e 2e 2e 29 20 65  an EXISTS(...) e
85f0: 78 70 72 65 73 73 69 6f 6e 2c 20 74 68 65 20 61  xpression, the a
8600: 63 74 75 61 6c 0a 20 20 20 20 2a 2a 20 76 61 6c  ctual.    ** val
8610: 75 65 73 20 72 65 74 75 72 6e 65 64 20 62 79 20  ues returned by 
8620: 74 68 65 20 53 45 4c 45 43 54 20 61 72 65 20 6e  the SELECT are n
8630: 6f 74 20 72 65 71 75 69 72 65 64 2e 0a 20 20 20  ot required..   
8640: 20 2a 2f 0a 20 20 20 20 75 38 20 65 63 65 6c 46   */.    u8 ecelF
8650: 6c 61 67 73 3b 20 20 20 20 2f 2a 20 22 65 63 65  lags;    /* "ece
8660: 6c 22 20 69 73 20 61 6e 20 61 62 62 72 65 76 69  l" is an abbrevi
8670: 61 74 69 6f 6e 20 6f 66 20 22 45 78 70 72 43 6f  ation of "ExprCo
8680: 64 65 45 78 70 72 4c 69 73 74 22 20 2a 2f 0a 20  deExprList" */. 
8690: 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c     ExprList *pEL
86a0: 69 73 74 3b 0a 20 20 20 20 69 66 28 20 65 44 65  ist;.    if( eDe
86b0: 73 74 3d 3d 53 52 54 5f 4d 65 6d 20 7c 7c 20 65  st==SRT_Mem || e
86c0: 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74  Dest==SRT_Output
86d0: 20 7c 7c 20 65 44 65 73 74 3d 3d 53 52 54 5f 43   || eDest==SRT_C
86e0: 6f 72 6f 75 74 69 6e 65 20 29 7b 0a 20 20 20 20  oroutine ){.    
86f0: 20 20 65 63 65 6c 46 6c 61 67 73 20 3d 20 53 51    ecelFlags = SQ
8700: 4c 49 54 45 5f 45 43 45 4c 5f 44 55 50 3b 0a 20  LITE_ECEL_DUP;. 
8710: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
8720: 65 63 65 6c 46 6c 61 67 73 20 3d 20 30 3b 0a 20  ecelFlags = 0;. 
8730: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 53 6f     }.    if( pSo
8740: 72 74 20 26 26 20 68 61 73 44 69 73 74 69 6e 63  rt && hasDistinc
8750: 74 3d 3d 30 20 26 26 20 65 44 65 73 74 21 3d 53  t==0 && eDest!=S
8760: 52 54 5f 45 70 68 65 6d 54 61 62 20 26 26 20 65  RT_EphemTab && e
8770: 44 65 73 74 21 3d 53 52 54 5f 54 61 62 6c 65 20  Dest!=SRT_Table 
8780: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 46 6f 72 20  ){.      /* For 
8790: 65 61 63 68 20 65 78 70 72 65 73 73 69 6f 6e 20  each expression 
87a0: 69 6e 20 70 2d 3e 70 45 4c 69 73 74 20 74 68 61  in p->pEList tha
87b0: 74 20 69 73 20 61 20 63 6f 70 79 20 6f 66 20 61  t is a copy of a
87c0: 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 0a  n expression in.
87d0: 20 20 20 20 20 20 2a 2a 20 74 68 65 20 4f 52 44        ** the ORD
87e0: 45 52 20 42 59 20 63 6c 61 75 73 65 20 28 70 53  ER BY clause (pS
87f0: 6f 72 74 2d 3e 70 4f 72 64 65 72 42 79 29 2c 20  ort->pOrderBy), 
8800: 73 65 74 20 74 68 65 20 61 73 73 6f 63 69 61 74  set the associat
8810: 65 64 20 0a 20 20 20 20 20 20 2a 2a 20 69 4f 72  ed .      ** iOr
8820: 64 65 72 42 79 43 6f 6c 20 76 61 6c 75 65 20 74  derByCol value t
8830: 6f 20 6f 6e 65 20 6d 6f 72 65 20 74 68 61 6e 20  o one more than 
8840: 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65  the index of the
8850: 20 4f 52 44 45 52 20 42 59 20 0a 20 20 20 20 20   ORDER BY .     
8860: 20 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 77   ** expression w
8870: 69 74 68 69 6e 20 74 68 65 20 73 6f 72 74 2d 6b  ithin the sort-k
8880: 65 79 20 74 68 61 74 20 70 75 73 68 4f 6e 74 6f  ey that pushOnto
8890: 53 6f 72 74 65 72 28 29 20 77 69 6c 6c 20 67 65  Sorter() will ge
88a0: 6e 65 72 61 74 65 2e 0a 20 20 20 20 20 20 2a 2a  nerate..      **
88b0: 20 54 68 69 73 20 61 6c 6c 6f 77 73 20 74 68 65   This allows the
88c0: 20 70 2d 3e 70 45 4c 69 73 74 20 66 69 65 6c 64   p->pEList field
88d0: 20 74 6f 20 62 65 20 6f 6d 69 74 74 65 64 20 66   to be omitted f
88e0: 72 6f 6d 20 74 68 65 20 73 6f 72 74 65 64 20 72  rom the sorted r
88f0: 65 63 6f 72 64 2c 0a 20 20 20 20 20 20 2a 2a 20  ecord,.      ** 
8900: 73 61 76 69 6e 67 20 73 70 61 63 65 20 61 6e 64  saving space and
8910: 20 43 50 55 20 63 79 63 6c 65 73 2e 20 20 2a 2f   CPU cycles.  */
8920: 0a 20 20 20 20 20 20 65 63 65 6c 46 6c 61 67 73  .      ecelFlags
8930: 20 7c 3d 20 28 53 51 4c 49 54 45 5f 45 43 45 4c   |= (SQLITE_ECEL
8940: 5f 4f 4d 49 54 52 45 46 7c 53 51 4c 49 54 45 5f  _OMITREF|SQLITE_
8950: 45 43 45 4c 5f 52 45 46 29 3b 0a 0a 20 20 20 20  ECEL_REF);..    
8960: 20 20 66 6f 72 28 69 3d 70 53 6f 72 74 2d 3e 6e    for(i=pSort->n
8970: 4f 42 53 61 74 3b 20 69 3c 70 53 6f 72 74 2d 3e  OBSat; i<pSort->
8980: 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b  pOrderBy->nExpr;
8990: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69   i++){.        i
89a0: 6e 74 20 6a 3b 0a 20 20 20 20 20 20 20 20 69 66  nt j;.        if
89b0: 28 20 28 6a 20 3d 20 70 53 6f 72 74 2d 3e 70 4f  ( (j = pSort->pO
89c0: 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 75 2e 78  rderBy->a[i].u.x
89d0: 2e 69 4f 72 64 65 72 42 79 43 6f 6c 29 3e 30 20  .iOrderByCol)>0 
89e0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e  ){.          p->
89f0: 70 45 4c 69 73 74 2d 3e 61 5b 6a 2d 31 5d 2e 75  pEList->a[j-1].u
8a00: 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 20 3d  .x.iOrderByCol =
8a10: 20 69 2b 31 2d 70 53 6f 72 74 2d 3e 6e 4f 42 53   i+1-pSort->nOBS
8a20: 61 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  at;.        }.  
8a30: 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c      }.#ifdef SQL
8a40: 49 54 45 5f 45 4e 41 42 4c 45 5f 53 4f 52 54 45  ITE_ENABLE_SORTE
8a50: 52 5f 52 45 46 45 52 45 4e 43 45 53 0a 20 20 20  R_REFERENCES.   
8a60: 20 20 20 73 65 6c 65 63 74 45 78 70 72 44 65 66     selectExprDef
8a70: 65 72 28 70 50 61 72 73 65 2c 20 70 53 6f 72 74  er(pParse, pSort
8a80: 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20 26 70 45  , p->pEList, &pE
8a90: 78 74 72 61 29 3b 0a 20 20 20 20 20 20 69 66 28  xtra);.      if(
8aa0: 20 70 45 78 74 72 61 20 26 26 20 70 50 61 72 73   pExtra && pPars
8ab0: 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  e->db->mallocFai
8ac0: 6c 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  led==0 ){.      
8ad0: 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72    /* If there ar
8ae0: 65 20 61 6e 79 20 65 78 74 72 61 20 50 4b 20 63  e any extra PK c
8af0: 6f 6c 75 6d 6e 73 20 74 6f 20 61 64 64 20 74 6f  olumns to add to
8b00: 20 74 68 65 20 73 6f 72 74 65 72 20 72 65 63 6f   the sorter reco
8b10: 72 64 73 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20  rds,.        ** 
8b20: 61 6c 6c 6f 63 61 74 65 20 65 78 74 72 61 20 6d  allocate extra m
8b30: 65 6d 6f 72 79 20 63 65 6c 6c 73 20 61 6e 64 20  emory cells and 
8b40: 61 64 6a 75 73 74 20 74 68 65 20 4f 70 65 6e 45  adjust the OpenE
8b50: 70 68 65 6d 65 72 61 6c 20 0a 20 20 20 20 20 20  phemeral .      
8b60: 20 20 2a 2a 20 69 6e 73 74 72 75 63 74 69 6f 6e    ** instruction
8b70: 20 74 6f 20 61 63 63 6f 75 6e 74 20 66 6f 72 20   to account for 
8b80: 74 68 65 20 6c 61 72 67 65 72 20 72 65 63 6f 72  the larger recor
8b90: 64 73 2e 20 54 68 69 73 20 69 73 20 6f 6e 6c 79  ds. This is only
8ba0: 0a 20 20 20 20 20 20 20 20 2a 2a 20 72 65 71 75  .        ** requ
8bb0: 69 72 65 64 20 69 66 20 74 68 65 72 65 20 61 72  ired if there ar
8bc0: 65 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 57 49  e one or more WI
8bd0: 54 48 4f 55 54 20 52 4f 57 49 44 20 74 61 62 6c  THOUT ROWID tabl
8be0: 65 73 20 77 69 74 68 0a 20 20 20 20 20 20 20 20  es with.        
8bf0: 2a 2a 20 63 6f 6d 70 6f 73 69 74 65 20 70 72 69  ** composite pri
8c00: 6d 61 72 79 20 6b 65 79 73 20 69 6e 20 74 68 65  mary keys in the
8c10: 20 53 6f 72 74 43 74 78 2e 61 44 65 66 65 72 5b   SortCtx.aDefer[
8c20: 5d 20 61 72 72 61 79 2e 20 20 2a 2f 0a 20 20 20  ] array.  */.   
8c30: 20 20 20 20 20 56 64 62 65 4f 70 20 2a 70 4f 70       VdbeOp *pOp
8c40: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 47 65   = sqlite3VdbeGe
8c50: 74 4f 70 28 76 2c 20 70 53 6f 72 74 2d 3e 61 64  tOp(v, pSort->ad
8c60: 64 72 53 6f 72 74 49 6e 64 65 78 29 3b 0a 20 20  drSortIndex);.  
8c70: 20 20 20 20 20 20 70 4f 70 2d 3e 70 32 20 2b 3d        pOp->p2 +=
8c80: 20 28 70 45 78 74 72 61 2d 3e 6e 45 78 70 72 20   (pExtra->nExpr 
8c90: 2d 20 70 53 6f 72 74 2d 3e 6e 44 65 66 65 72 29  - pSort->nDefer)
8ca0: 3b 0a 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 70  ;.        pOp->p
8cb0: 34 2e 70 4b 65 79 49 6e 66 6f 2d 3e 6e 41 6c 6c  4.pKeyInfo->nAll
8cc0: 46 69 65 6c 64 20 2b 3d 20 28 70 45 78 74 72 61  Field += (pExtra
8cd0: 2d 3e 6e 45 78 70 72 20 2d 20 70 53 6f 72 74 2d  ->nExpr - pSort-
8ce0: 3e 6e 44 65 66 65 72 29 3b 0a 20 20 20 20 20 20  >nDefer);.      
8cf0: 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b    pParse->nMem +
8d00: 3d 20 70 45 78 74 72 61 2d 3e 6e 45 78 70 72 3b  = pExtra->nExpr;
8d10: 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  .      }.#endif.
8d20: 0a 20 20 20 20 20 20 2f 2a 20 41 64 6a 75 73 74  .      /* Adjust
8d30: 20 6e 52 65 73 75 6c 74 43 6f 6c 20 74 6f 20 61   nResultCol to a
8d40: 63 63 6f 75 6e 74 20 66 6f 72 20 63 6f 6c 75 6d  ccount for colum
8d50: 6e 73 20 74 68 61 74 20 61 72 65 20 6f 6d 69 74  ns that are omit
8d60: 74 65 64 0a 20 20 20 20 20 20 2a 2a 20 66 72 6f  ted.      ** fro
8d70: 6d 20 74 68 65 20 73 6f 72 74 65 72 20 62 79 20  m the sorter by 
8d80: 74 68 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  the optimization
8d90: 73 20 69 6e 20 74 68 69 73 20 62 72 61 6e 63 68  s in this branch
8da0: 20 2a 2f 0a 20 20 20 20 20 20 70 45 4c 69 73 74   */.      pEList
8db0: 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 20 20   = p->pEList;.  
8dc0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
8dd0: 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b  EList->nExpr; i+
8de0: 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  +){.        if( 
8df0: 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 75 2e 78  pEList->a[i].u.x
8e00: 2e 69 4f 72 64 65 72 42 79 43 6f 6c 3e 30 0a 23  .iOrderByCol>0.#
8e10: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
8e20: 42 4c 45 5f 53 4f 52 54 45 52 5f 52 45 46 45 52  BLE_SORTER_REFER
8e30: 45 4e 43 45 53 0a 20 20 20 20 20 20 20 20 20 7c  ENCES.         |
8e40: 7c 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 62  | pEList->a[i].b
8e50: 53 6f 72 74 65 72 52 65 66 0a 23 65 6e 64 69 66  SorterRef.#endif
8e60: 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20  .        ){.    
8e70: 20 20 20 20 20 20 6e 52 65 73 75 6c 74 43 6f 6c        nResultCol
8e80: 2d 2d 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65  --;.          re
8e90: 67 4f 72 69 67 20 3d 20 30 3b 0a 20 20 20 20 20  gOrig = 0;.     
8ea0: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20     }.      }..  
8eb0: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65      testcase( re
8ec0: 67 4f 72 69 67 20 29 3b 0a 20 20 20 20 20 20 74  gOrig );.      t
8ed0: 65 73 74 63 61 73 65 28 20 65 44 65 73 74 3d 3d  estcase( eDest==
8ee0: 53 52 54 5f 53 65 74 20 29 3b 0a 20 20 20 20 20  SRT_Set );.     
8ef0: 20 74 65 73 74 63 61 73 65 28 20 65 44 65 73 74   testcase( eDest
8f00: 3d 3d 53 52 54 5f 4d 65 6d 20 29 3b 0a 20 20 20  ==SRT_Mem );.   
8f10: 20 20 20 74 65 73 74 63 61 73 65 28 20 65 44 65     testcase( eDe
8f20: 73 74 3d 3d 53 52 54 5f 43 6f 72 6f 75 74 69 6e  st==SRT_Coroutin
8f30: 65 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  e );.      testc
8f40: 61 73 65 28 20 65 44 65 73 74 3d 3d 53 52 54 5f  ase( eDest==SRT_
8f50: 4f 75 74 70 75 74 20 29 3b 0a 20 20 20 20 20 20  Output );.      
8f60: 61 73 73 65 72 74 28 20 65 44 65 73 74 3d 3d 53  assert( eDest==S
8f70: 52 54 5f 53 65 74 20 7c 7c 20 65 44 65 73 74 3d  RT_Set || eDest=
8f80: 3d 53 52 54 5f 4d 65 6d 20 0a 20 20 20 20 20 20  =SRT_Mem .      
8f90: 20 20 20 20 20 7c 7c 20 65 44 65 73 74 3d 3d 53       || eDest==S
8fa0: 52 54 5f 43 6f 72 6f 75 74 69 6e 65 20 7c 7c 20  RT_Coroutine || 
8fb0: 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75  eDest==SRT_Outpu
8fc0: 74 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  t );.    }.    s
8fd0: 52 6f 77 4c 6f 61 64 49 6e 66 6f 2e 72 65 67 52  RowLoadInfo.regR
8fe0: 65 73 75 6c 74 20 3d 20 72 65 67 52 65 73 75 6c  esult = regResul
8ff0: 74 3b 0a 20 20 20 20 73 52 6f 77 4c 6f 61 64 49  t;.    sRowLoadI
9000: 6e 66 6f 2e 65 63 65 6c 46 6c 61 67 73 20 3d 20  nfo.ecelFlags = 
9010: 65 63 65 6c 46 6c 61 67 73 3b 0a 23 69 66 64 65  ecelFlags;.#ifde
9020: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
9030: 53 4f 52 54 45 52 5f 52 45 46 45 52 45 4e 43 45  SORTER_REFERENCE
9040: 53 0a 20 20 20 20 73 52 6f 77 4c 6f 61 64 49 6e  S.    sRowLoadIn
9050: 66 6f 2e 70 45 78 74 72 61 20 3d 20 70 45 78 74  fo.pExtra = pExt
9060: 72 61 3b 0a 20 20 20 20 73 52 6f 77 4c 6f 61 64  ra;.    sRowLoad
9070: 49 6e 66 6f 2e 72 65 67 45 78 74 72 61 52 65 73  Info.regExtraRes
9080: 75 6c 74 20 3d 20 72 65 67 52 65 73 75 6c 74 20  ult = regResult 
9090: 2b 20 6e 52 65 73 75 6c 74 43 6f 6c 3b 0a 20 20  + nResultCol;.  
90a0: 20 20 69 66 28 20 70 45 78 74 72 61 20 29 20 6e    if( pExtra ) n
90b0: 52 65 73 75 6c 74 43 6f 6c 20 2b 3d 20 70 45 78  ResultCol += pEx
90c0: 74 72 61 2d 3e 6e 45 78 70 72 3b 0a 23 65 6e 64  tra->nExpr;.#end
90d0: 69 66 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 4c  if.    if( p->iL
90e0: 69 6d 69 74 0a 20 20 20 20 20 26 26 20 28 65 63  imit.     && (ec
90f0: 65 6c 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45  elFlags & SQLITE
9100: 5f 45 43 45 4c 5f 4f 4d 49 54 52 45 46 29 21 3d  _ECEL_OMITREF)!=
9110: 30 20 0a 20 20 20 20 20 26 26 20 6e 50 72 65 66  0 .     && nPref
9120: 69 78 52 65 67 3e 30 0a 20 20 20 20 29 7b 0a 20  ixReg>0.    ){. 
9130: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 53 6f       assert( pSo
9140: 72 74 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 61  rt!=0 );.      a
9150: 73 73 65 72 74 28 20 68 61 73 44 69 73 74 69 6e  ssert( hasDistin
9160: 63 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70  ct==0 );.      p
9170: 53 6f 72 74 2d 3e 70 44 65 66 65 72 72 65 64 52  Sort->pDeferredR
9180: 6f 77 4c 6f 61 64 20 3d 20 26 73 52 6f 77 4c 6f  owLoad = &sRowLo
9190: 61 64 49 6e 66 6f 3b 0a 20 20 20 20 20 20 72 65  adInfo;.      re
91a0: 67 4f 72 69 67 20 3d 20 30 3b 0a 20 20 20 20 7d  gOrig = 0;.    }
91b0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 6e 65  else{.      inne
91c0: 72 4c 6f 6f 70 4c 6f 61 64 52 6f 77 28 70 50 61  rLoopLoadRow(pPa
91d0: 72 73 65 2c 20 70 2c 20 26 73 52 6f 77 4c 6f 61  rse, p, &sRowLoa
91e0: 64 49 6e 66 6f 29 3b 0a 20 20 20 20 7d 0a 20 20  dInfo);.    }.  
91f0: 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 44  }..  /* If the D
9200: 49 53 54 49 4e 43 54 20 6b 65 79 77 6f 72 64 20  ISTINCT keyword 
9210: 77 61 73 20 70 72 65 73 65 6e 74 20 6f 6e 20 74  was present on t
9220: 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  he SELECT statem
9230: 65 6e 74 0a 20 20 2a 2a 20 61 6e 64 20 74 68 69  ent.  ** and thi
9240: 73 20 72 6f 77 20 68 61 73 20 62 65 65 6e 20 73  s row has been s
9250: 65 65 6e 20 62 65 66 6f 72 65 2c 20 74 68 65 6e  een before, then
9260: 20 64 6f 20 6e 6f 74 20 6d 61 6b 65 20 74 68 69   do not make thi
9270: 73 20 72 6f 77 0a 20 20 2a 2a 20 70 61 72 74 20  s row.  ** part 
9280: 6f 66 20 74 68 65 20 72 65 73 75 6c 74 2e 0a 20  of the result.. 
9290: 20 2a 2f 0a 20 20 69 66 28 20 68 61 73 44 69 73   */.  if( hasDis
92a0: 74 69 6e 63 74 20 29 7b 0a 20 20 20 20 73 77 69  tinct ){.    swi
92b0: 74 63 68 28 20 70 44 69 73 74 69 6e 63 74 2d 3e  tch( pDistinct->
92c0: 65 54 6e 63 74 54 79 70 65 20 29 7b 0a 20 20 20  eTnctType ){.   
92d0: 20 20 20 63 61 73 65 20 57 48 45 52 45 5f 44 49     case WHERE_DI
92e0: 53 54 49 4e 43 54 5f 4f 52 44 45 52 45 44 3a 20  STINCT_ORDERED: 
92f0: 7b 0a 20 20 20 20 20 20 20 20 56 64 62 65 4f 70  {.        VdbeOp
9300: 20 2a 70 4f 70 3b 20 20 20 20 20 20 20 20 20 20   *pOp;          
9310: 20 20 2f 2a 20 4e 6f 20 6c 6f 6e 67 65 72 20 72    /* No longer r
9320: 65 71 75 69 72 65 64 20 4f 70 65 6e 45 70 68 65  equired OpenEphe
9330: 6d 65 72 61 6c 20 69 6e 73 74 72 2e 20 2a 2f 0a  meral instr. */.
9340: 20 20 20 20 20 20 20 20 69 6e 74 20 69 4a 75 6d          int iJum
9350: 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p;              
9360: 2f 2a 20 4a 75 6d 70 20 64 65 73 74 69 6e 61 74  /* Jump destinat
9370: 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 69  ion */.        i
9380: 6e 74 20 72 65 67 50 72 65 76 3b 20 20 20 20 20  nt regPrev;     
9390: 20 20 20 20 20 20 20 2f 2a 20 50 72 65 76 69 6f         /* Previo
93a0: 75 73 20 72 6f 77 20 63 6f 6e 74 65 6e 74 20 2a  us row content *
93b0: 2f 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 6c  /..        /* Al
93c0: 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66 6f 72  locate space for
93d0: 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 72 6f   the previous ro
93e0: 77 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 65 67  w */.        reg
93f0: 50 72 65 76 20 3d 20 70 50 61 72 73 65 2d 3e 6e  Prev = pParse->n
9400: 4d 65 6d 2b 31 3b 0a 20 20 20 20 20 20 20 20 70  Mem+1;.        p
9410: 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e  Parse->nMem += n
9420: 52 65 73 75 6c 74 43 6f 6c 3b 0a 0a 20 20 20 20  ResultCol;..    
9430: 20 20 20 20 2f 2a 20 43 68 61 6e 67 65 20 74 68      /* Change th
9440: 65 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72  e OP_OpenEphemer
9450: 61 6c 20 63 6f 64 65 64 20 65 61 72 6c 69 65 72  al coded earlier
9460: 20 74 6f 20 61 6e 20 4f 50 5f 4e 75 6c 6c 0a 20   to an OP_Null. 
9470: 20 20 20 20 20 20 20 2a 2a 20 73 65 74 73 20 74         ** sets t
9480: 68 65 20 4d 45 4d 5f 43 6c 65 61 72 65 64 20 62  he MEM_Cleared b
9490: 69 74 20 6f 6e 20 74 68 65 20 66 69 72 73 74 20  it on the first 
94a0: 72 65 67 69 73 74 65 72 20 6f 66 20 74 68 65 0a  register of the.
94b0: 20 20 20 20 20 20 20 20 2a 2a 20 70 72 65 76 69          ** previ
94c0: 6f 75 73 20 76 61 6c 75 65 2e 20 20 54 68 69 73  ous value.  This
94d0: 20 77 69 6c 6c 20 63 61 75 73 65 20 74 68 65 20   will cause the 
94e0: 4f 50 5f 4e 65 20 62 65 6c 6f 77 20 74 6f 20 61  OP_Ne below to a
94f0: 6c 77 61 79 73 0a 20 20 20 20 20 20 20 20 2a 2a  lways.        **
9500: 20 66 61 69 6c 20 6f 6e 20 74 68 65 20 66 69 72   fail on the fir
9510: 73 74 20 69 74 65 72 61 74 69 6f 6e 20 6f 66 20  st iteration of 
9520: 74 68 65 20 6c 6f 6f 70 20 65 76 65 6e 20 69 66  the loop even if
9530: 20 74 68 65 20 66 69 72 73 74 0a 20 20 20 20 20   the first.     
9540: 20 20 20 2a 2a 20 72 6f 77 20 69 73 20 61 6c 6c     ** row is all
9550: 20 4e 55 4c 4c 73 2e 0a 20 20 20 20 20 20 20 20   NULLs..        
9560: 2a 2f 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  */.        sqlit
9570: 65 33 56 64 62 65 43 68 61 6e 67 65 54 6f 4e 6f  e3VdbeChangeToNo
9580: 6f 70 28 76 2c 20 70 44 69 73 74 69 6e 63 74 2d  op(v, pDistinct-
9590: 3e 61 64 64 72 54 6e 63 74 29 3b 0a 20 20 20 20  >addrTnct);.    
95a0: 20 20 20 20 70 4f 70 20 3d 20 73 71 6c 69 74 65      pOp = sqlite
95b0: 33 56 64 62 65 47 65 74 4f 70 28 76 2c 20 70 44  3VdbeGetOp(v, pD
95c0: 69 73 74 69 6e 63 74 2d 3e 61 64 64 72 54 6e 63  istinct->addrTnc
95d0: 74 29 3b 0a 20 20 20 20 20 20 20 20 70 4f 70 2d  t);.        pOp-
95e0: 3e 6f 70 63 6f 64 65 20 3d 20 4f 50 5f 4e 75 6c  >opcode = OP_Nul
95f0: 6c 3b 0a 20 20 20 20 20 20 20 20 70 4f 70 2d 3e  l;.        pOp->
9600: 70 31 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  p1 = 1;.        
9610: 70 4f 70 2d 3e 70 32 20 3d 20 72 65 67 50 72 65  pOp->p2 = regPre
9620: 76 3b 0a 0a 20 20 20 20 20 20 20 20 69 4a 75 6d  v;..        iJum
9630: 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  p = sqlite3VdbeC
9640: 75 72 72 65 6e 74 41 64 64 72 28 76 29 20 2b 20  urrentAddr(v) + 
9650: 6e 52 65 73 75 6c 74 43 6f 6c 3b 0a 20 20 20 20  nResultCol;.    
9660: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
9670: 52 65 73 75 6c 74 43 6f 6c 3b 20 69 2b 2b 29 7b  ResultCol; i++){
9680: 0a 20 20 20 20 20 20 20 20 20 20 43 6f 6c 6c 53  .          CollS
9690: 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 73 71 6c 69  eq *pColl = sqli
96a0: 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70  te3ExprCollSeq(p
96b0: 50 61 72 73 65 2c 20 70 2d 3e 70 45 4c 69 73 74  Parse, p->pEList
96c0: 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20  ->a[i].pExpr);. 
96d0: 20 20 20 20 20 20 20 20 20 69 66 28 20 69 3c 6e           if( i<n
96e0: 52 65 73 75 6c 74 43 6f 6c 2d 31 20 29 7b 0a 20  ResultCol-1 ){. 
96f0: 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
9700: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
9710: 4f 50 5f 4e 65 2c 20 72 65 67 52 65 73 75 6c 74  OP_Ne, regResult
9720: 2b 69 2c 20 69 4a 75 6d 70 2c 20 72 65 67 50 72  +i, iJump, regPr
9730: 65 76 2b 69 29 3b 0a 20 20 20 20 20 20 20 20 20  ev+i);.         
9740: 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28     VdbeCoverage(
9750: 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65  v);.          }e
9760: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
9770: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
9780: 70 33 28 76 2c 20 4f 50 5f 45 71 2c 20 72 65 67  p3(v, OP_Eq, reg
9790: 52 65 73 75 6c 74 2b 69 2c 20 69 43 6f 6e 74 69  Result+i, iConti
97a0: 6e 75 65 2c 20 72 65 67 50 72 65 76 2b 69 29 3b  nue, regPrev+i);
97b0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 56 64 62  .            Vdb
97c0: 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
97d0: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
97e0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
97f0: 43 68 61 6e 67 65 50 34 28 76 2c 20 2d 31 2c 20  ChangeP4(v, -1, 
9800: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 70 43  (const char *)pC
9810: 6f 6c 6c 2c 20 50 34 5f 43 4f 4c 4c 53 45 51 29  oll, P4_COLLSEQ)
9820: 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
9830: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28  te3VdbeChangeP5(
9840: 76 2c 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51  v, SQLITE_NULLEQ
9850: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
9860: 20 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c       assert( sql
9870: 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
9880: 64 64 72 28 76 29 3d 3d 69 4a 75 6d 70 20 7c 7c  ddr(v)==iJump ||
9890: 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c   pParse->db->mal
98a0: 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20  locFailed );.   
98b0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
98c0: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 70  AddOp3(v, OP_Cop
98d0: 79 2c 20 72 65 67 52 65 73 75 6c 74 2c 20 72 65  y, regResult, re
98e0: 67 50 72 65 76 2c 20 6e 52 65 73 75 6c 74 43 6f  gPrev, nResultCo
98f0: 6c 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 62 72  l-1);.        br
9900: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  eak;.      }..  
9910: 20 20 20 20 63 61 73 65 20 57 48 45 52 45 5f 44      case WHERE_D
9920: 49 53 54 49 4e 43 54 5f 55 4e 49 51 55 45 3a 20  ISTINCT_UNIQUE: 
9930: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
9940: 33 56 64 62 65 43 68 61 6e 67 65 54 6f 4e 6f 6f  3VdbeChangeToNoo
9950: 70 28 76 2c 20 70 44 69 73 74 69 6e 63 74 2d 3e  p(v, pDistinct->
9960: 61 64 64 72 54 6e 63 74 29 3b 0a 20 20 20 20 20  addrTnct);.     
9970: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
9980: 7d 0a 0a 20 20 20 20 20 20 64 65 66 61 75 6c 74  }..      default
9990: 3a 20 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65  : {.        asse
99a0: 72 74 28 20 70 44 69 73 74 69 6e 63 74 2d 3e 65  rt( pDistinct->e
99b0: 54 6e 63 74 54 79 70 65 3d 3d 57 48 45 52 45 5f  TnctType==WHERE_
99c0: 44 49 53 54 49 4e 43 54 5f 55 4e 4f 52 44 45 52  DISTINCT_UNORDER
99d0: 45 44 20 29 3b 0a 20 20 20 20 20 20 20 20 63 6f  ED );.        co
99e0: 64 65 44 69 73 74 69 6e 63 74 28 70 50 61 72 73  deDistinct(pPars
99f0: 65 2c 20 70 44 69 73 74 69 6e 63 74 2d 3e 74 61  e, pDistinct->ta
9a00: 62 54 6e 63 74 2c 20 69 43 6f 6e 74 69 6e 75 65  bTnct, iContinue
9a10: 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 2c 0a 20 20  , nResultCol,.  
9a20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9a30: 20 20 20 72 65 67 52 65 73 75 6c 74 29 3b 0a 20     regResult);. 
9a40: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
9a50: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
9a60: 69 66 28 20 70 53 6f 72 74 3d 3d 30 20 29 7b 0a  if( pSort==0 ){.
9a70: 20 20 20 20 20 20 63 6f 64 65 4f 66 66 73 65 74        codeOffset
9a80: 28 76 2c 20 70 2d 3e 69 4f 66 66 73 65 74 2c 20  (v, p->iOffset, 
9a90: 69 43 6f 6e 74 69 6e 75 65 29 3b 0a 20 20 20 20  iContinue);.    
9aa0: 7d 0a 20 20 7d 0a 0a 20 20 73 77 69 74 63 68 28  }.  }..  switch(
9ab0: 20 65 44 65 73 74 20 29 7b 0a 20 20 20 20 2f 2a   eDest ){.    /*
9ac0: 20 49 6e 20 74 68 69 73 20 6d 6f 64 65 2c 20 77   In this mode, w
9ad0: 72 69 74 65 20 65 61 63 68 20 71 75 65 72 79 20  rite each query 
9ae0: 72 65 73 75 6c 74 20 74 6f 20 74 68 65 20 6b 65  result to the ke
9af0: 79 20 6f 66 20 74 68 65 20 74 65 6d 70 6f 72 61  y of the tempora
9b00: 72 79 0a 20 20 20 20 2a 2a 20 74 61 62 6c 65 20  ry.    ** table 
9b10: 69 50 61 72 6d 2e 0a 20 20 20 20 2a 2f 0a 23 69  iParm..    */.#i
9b20: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
9b30: 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43  T_COMPOUND_SELEC
9b40: 54 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 55  T.    case SRT_U
9b50: 6e 69 6f 6e 3a 20 7b 0a 20 20 20 20 20 20 69 6e  nion: {.      in
9b60: 74 20 72 31 3b 0a 20 20 20 20 20 20 72 31 20 3d  t r1;.      r1 =
9b70: 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
9b80: 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  eg(pParse);.    
9b90: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
9ba0: 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65  Op3(v, OP_MakeRe
9bb0: 63 6f 72 64 2c 20 72 65 67 52 65 73 75 6c 74 2c  cord, regResult,
9bc0: 20 6e 52 65 73 75 6c 74 43 6f 6c 2c 20 72 31 29   nResultCol, r1)
9bd0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
9be0: 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20  dbeAddOp4Int(v, 
9bf0: 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 69 50  OP_IdxInsert, iP
9c00: 61 72 6d 2c 20 72 31 2c 20 72 65 67 52 65 73 75  arm, r1, regResu
9c10: 6c 74 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 29 3b  lt, nResultCol);
9c20: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65  .      sqlite3Re
9c30: 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
9c40: 72 73 65 2c 20 72 31 29 3b 0a 20 20 20 20 20 20  rse, r1);.      
9c50: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20  break;.    }..  
9c60: 20 20 2f 2a 20 43 6f 6e 73 74 72 75 63 74 20 61    /* Construct a
9c70: 20 72 65 63 6f 72 64 20 66 72 6f 6d 20 74 68 65   record from the
9c80: 20 71 75 65 72 79 20 72 65 73 75 6c 74 2c 20 62   query result, b
9c90: 75 74 20 69 6e 73 74 65 61 64 20 6f 66 0a 20 20  ut instead of.  
9ca0: 20 20 2a 2a 20 73 61 76 69 6e 67 20 74 68 61 74    ** saving that
9cb0: 20 72 65 63 6f 72 64 2c 20 75 73 65 20 69 74 20   record, use it 
9cc0: 61 73 20 61 20 6b 65 79 20 74 6f 20 64 65 6c 65  as a key to dele
9cd0: 74 65 20 65 6c 65 6d 65 6e 74 73 20 66 72 6f 6d  te elements from
9ce0: 0a 20 20 20 20 2a 2a 20 74 68 65 20 74 65 6d 70  .    ** the temp
9cf0: 6f 72 61 72 79 20 74 61 62 6c 65 20 69 50 61 72  orary table iPar
9d00: 6d 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61  m..    */.    ca
9d10: 73 65 20 53 52 54 5f 45 78 63 65 70 74 3a 20 7b  se SRT_Except: {
9d20: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
9d30: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49  beAddOp3(v, OP_I
9d40: 64 78 44 65 6c 65 74 65 2c 20 69 50 61 72 6d 2c  dxDelete, iParm,
9d50: 20 72 65 67 52 65 73 75 6c 74 2c 20 6e 52 65 73   regResult, nRes
9d60: 75 6c 74 43 6f 6c 29 3b 0a 20 20 20 20 20 20 62  ultCol);.      b
9d70: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  reak;.    }.#end
9d80: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
9d90: 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43  T_COMPOUND_SELEC
9da0: 54 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 53 74 6f  T */..    /* Sto
9db0: 72 65 20 74 68 65 20 72 65 73 75 6c 74 20 61 73  re the result as
9dc0: 20 64 61 74 61 20 75 73 69 6e 67 20 61 20 75 6e   data using a un
9dd0: 69 71 75 65 20 6b 65 79 2e 0a 20 20 20 20 2a 2f  ique key..    */
9de0: 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 46 69  .    case SRT_Fi
9df0: 66 6f 3a 0a 20 20 20 20 63 61 73 65 20 53 52 54  fo:.    case SRT
9e00: 5f 44 69 73 74 46 69 66 6f 3a 0a 20 20 20 20 63  _DistFifo:.    c
9e10: 61 73 65 20 53 52 54 5f 54 61 62 6c 65 3a 0a 20  ase SRT_Table:. 
9e20: 20 20 20 63 61 73 65 20 53 52 54 5f 45 70 68 65     case SRT_Ephe
9e30: 6d 54 61 62 3a 20 7b 0a 20 20 20 20 20 20 69 6e  mTab: {.      in
9e40: 74 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65  t r1 = sqlite3Ge
9e50: 74 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73  tTempRange(pPars
9e60: 65 2c 20 6e 50 72 65 66 69 78 52 65 67 2b 31 29  e, nPrefixReg+1)
9e70: 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
9e80: 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 54 61 62  ( eDest==SRT_Tab
9e90: 6c 65 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  le );.      test
9ea0: 63 61 73 65 28 20 65 44 65 73 74 3d 3d 53 52 54  case( eDest==SRT
9eb0: 5f 45 70 68 65 6d 54 61 62 20 29 3b 0a 20 20 20  _EphemTab );.   
9ec0: 20 20 20 74 65 73 74 63 61 73 65 28 20 65 44 65     testcase( eDe
9ed0: 73 74 3d 3d 53 52 54 5f 46 69 66 6f 20 29 3b 0a  st==SRT_Fifo );.
9ee0: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
9ef0: 65 44 65 73 74 3d 3d 53 52 54 5f 44 69 73 74 46  eDest==SRT_DistF
9f00: 69 66 6f 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  ifo );.      sql
9f10: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
9f20: 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c  , OP_MakeRecord,
9f30: 20 72 65 67 52 65 73 75 6c 74 2c 20 6e 52 65 73   regResult, nRes
9f40: 75 6c 74 43 6f 6c 2c 20 72 31 2b 6e 50 72 65 66  ultCol, r1+nPref
9f50: 69 78 52 65 67 29 3b 0a 23 69 66 6e 64 65 66 20  ixReg);.#ifndef 
9f60: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 54 45 0a  SQLITE_OMIT_CTE.
9f70: 20 20 20 20 20 20 69 66 28 20 65 44 65 73 74 3d        if( eDest=
9f80: 3d 53 52 54 5f 44 69 73 74 46 69 66 6f 20 29 7b  =SRT_DistFifo ){
9f90: 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74  .        /* If t
9fa0: 68 65 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 69  he destination i
9fb0: 73 20 44 69 73 74 46 69 66 6f 2c 20 74 68 65 6e  s DistFifo, then
9fc0: 20 63 75 72 73 6f 72 20 28 69 50 61 72 6d 2b 31   cursor (iParm+1
9fd0: 29 20 69 73 20 6f 70 65 6e 0a 20 20 20 20 20 20  ) is open.      
9fe0: 20 20 2a 2a 20 6f 6e 20 61 6e 20 65 70 68 65 6d    ** on an ephem
9ff0: 65 72 61 6c 20 69 6e 64 65 78 2e 20 49 66 20 74  eral index. If t
a000: 68 65 20 63 75 72 72 65 6e 74 20 72 6f 77 20 69  he current row i
a010: 73 20 61 6c 72 65 61 64 79 20 70 72 65 73 65 6e  s already presen
a020: 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 20  t.        ** in 
a030: 74 68 65 20 69 6e 64 65 78 2c 20 64 6f 20 6e 6f  the index, do no
a040: 74 20 77 72 69 74 65 20 69 74 20 74 6f 20 74 68  t write it to th
a050: 65 20 6f 75 74 70 75 74 2e 20 49 66 20 6e 6f 74  e output. If not
a060: 2c 20 61 64 64 20 74 68 65 0a 20 20 20 20 20 20  , add the.      
a070: 20 20 2a 2a 20 63 75 72 72 65 6e 74 20 72 6f 77    ** current row
a080: 20 74 6f 20 74 68 65 20 69 6e 64 65 78 20 61 6e   to the index an
a090: 64 20 70 72 6f 63 65 65 64 20 77 69 74 68 20 77  d proceed with w
a0a0: 72 69 74 69 6e 67 20 69 74 20 74 6f 20 74 68 65  riting it to the
a0b0: 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 75 74 70  .        ** outp
a0c0: 75 74 20 74 61 62 6c 65 20 61 73 20 77 65 6c 6c  ut table as well
a0d0: 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e  .  */.        in
a0e0: 74 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33  t addr = sqlite3
a0f0: 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
a100: 76 29 20 2b 20 34 3b 0a 20 20 20 20 20 20 20 20  v) + 4;.        
a110: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
a120: 34 49 6e 74 28 76 2c 20 4f 50 5f 46 6f 75 6e 64  4Int(v, OP_Found
a130: 2c 20 69 50 61 72 6d 2b 31 2c 20 61 64 64 72 2c  , iParm+1, addr,
a140: 20 72 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 20   r1, 0);.       
a150: 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
a160: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
a170: 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76  3VdbeAddOp4Int(v
a180: 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20  , OP_IdxInsert, 
a190: 69 50 61 72 6d 2b 31 2c 20 72 31 2c 72 65 67 52  iParm+1, r1,regR
a1a0: 65 73 75 6c 74 2c 6e 52 65 73 75 6c 74 43 6f 6c  esult,nResultCol
a1b0: 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
a1c0: 74 28 20 70 53 6f 72 74 3d 3d 30 20 29 3b 0a 20  t( pSort==0 );. 
a1d0: 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20       }.#endif.  
a1e0: 20 20 20 20 69 66 28 20 70 53 6f 72 74 20 29 7b      if( pSort ){
a1f0: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
a200: 20 72 65 67 52 65 73 75 6c 74 3d 3d 72 65 67 4f   regResult==regO
a210: 72 69 67 20 29 3b 0a 20 20 20 20 20 20 20 20 70  rig );.        p
a220: 75 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28 70 50  ushOntoSorter(pP
a230: 61 72 73 65 2c 20 70 53 6f 72 74 2c 20 70 2c 20  arse, pSort, p, 
a240: 72 31 2b 6e 50 72 65 66 69 78 52 65 67 2c 20 72  r1+nPrefixReg, r
a250: 65 67 4f 72 69 67 2c 20 31 2c 20 6e 50 72 65 66  egOrig, 1, nPref
a260: 69 78 52 65 67 29 3b 0a 20 20 20 20 20 20 7d 65  ixReg);.      }e
a270: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  lse{.        int
a280: 20 72 32 20 3d 20 73 71 6c 69 74 65 33 47 65 74   r2 = sqlite3Get
a290: 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b  TempReg(pParse);
a2a0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
a2b0: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
a2c0: 5f 4e 65 77 52 6f 77 69 64 2c 20 69 50 61 72 6d  _NewRowid, iParm
a2d0: 2c 20 72 32 29 3b 0a 20 20 20 20 20 20 20 20 73  , r2);.        s
a2e0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
a2f0: 28 76 2c 20 4f 50 5f 49 6e 73 65 72 74 2c 20 69  (v, OP_Insert, i
a300: 50 61 72 6d 2c 20 72 31 2c 20 72 32 29 3b 0a 20  Parm, r1, r2);. 
a310: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
a320: 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50  beChangeP5(v, OP
a330: 46 4c 41 47 5f 41 50 50 45 4e 44 29 3b 0a 20 20  FLAG_APPEND);.  
a340: 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c        sqlite3Rel
a350: 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
a360: 73 65 2c 20 72 32 29 3b 0a 20 20 20 20 20 20 7d  se, r2);.      }
a370: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65  .      sqlite3Re
a380: 6c 65 61 73 65 54 65 6d 70 52 61 6e 67 65 28 70  leaseTempRange(p
a390: 50 61 72 73 65 2c 20 72 31 2c 20 6e 50 72 65 66  Parse, r1, nPref
a3a0: 69 78 52 65 67 2b 31 29 3b 0a 20 20 20 20 20 20  ixReg+1);.      
a3b0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 23 69  break;.    }..#i
a3c0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
a3d0: 54 5f 53 55 42 51 55 45 52 59 0a 20 20 20 20 2f  T_SUBQUERY.    /
a3e0: 2a 20 49 66 20 77 65 20 61 72 65 20 63 72 65 61  * If we are crea
a3f0: 74 69 6e 67 20 61 20 73 65 74 20 66 6f 72 20 61  ting a set for a
a400: 6e 20 22 65 78 70 72 20 49 4e 20 28 53 45 4c 45  n "expr IN (SELE
a410: 43 54 20 2e 2e 2e 29 22 20 63 6f 6e 73 74 72 75  CT ...)" constru
a420: 63 74 2c 0a 20 20 20 20 2a 2a 20 74 68 65 6e 20  ct,.    ** then 
a430: 74 68 65 72 65 20 73 68 6f 75 6c 64 20 62 65 20  there should be 
a440: 61 20 73 69 6e 67 6c 65 20 69 74 65 6d 20 6f 6e  a single item on
a450: 20 74 68 65 20 73 74 61 63 6b 2e 20 20 57 72 69   the stack.  Wri
a460: 74 65 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 69  te this.    ** i
a470: 74 65 6d 20 69 6e 74 6f 20 74 68 65 20 73 65 74  tem into the set
a480: 20 74 61 62 6c 65 20 77 69 74 68 20 62 6f 67 75   table with bogu
a490: 73 20 64 61 74 61 2e 0a 20 20 20 20 2a 2f 0a 20  s data..    */. 
a4a0: 20 20 20 63 61 73 65 20 53 52 54 5f 53 65 74 3a     case SRT_Set:
a4b0: 20 7b 0a 20 20 20 20 20 20 69 66 28 20 70 53 6f   {.      if( pSo
a4c0: 72 74 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  rt ){.        /*
a4d0: 20 41 74 20 66 69 72 73 74 20 67 6c 61 6e 63 65   At first glance
a4e0: 20 79 6f 75 20 77 6f 75 6c 64 20 74 68 69 6e 6b   you would think
a4f0: 20 77 65 20 63 6f 75 6c 64 20 6f 70 74 69 6d 69   we could optimi
a500: 7a 65 20 6f 75 74 20 74 68 65 0a 20 20 20 20 20  ze out the.     
a510: 20 20 20 2a 2a 20 4f 52 44 45 52 20 42 59 20 69     ** ORDER BY i
a520: 6e 20 74 68 69 73 20 63 61 73 65 20 73 69 6e 63  n this case sinc
a530: 65 20 74 68 65 20 6f 72 64 65 72 20 6f 66 20 65  e the order of e
a540: 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20 73 65  ntries in the se
a550: 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 64 6f 65  t.        ** doe
a560: 73 20 6e 6f 74 20 6d 61 74 74 65 72 2e 20 20 42  s not matter.  B
a570: 75 74 20 74 68 65 72 65 20 6d 69 67 68 74 20 62  ut there might b
a580: 65 20 61 20 4c 49 4d 49 54 20 63 6c 61 75 73 65  e a LIMIT clause
a590: 2c 20 69 6e 20 77 68 69 63 68 0a 20 20 20 20 20  , in which.     
a5a0: 20 20 20 2a 2a 20 63 61 73 65 20 74 68 65 20 6f     ** case the o
a5b0: 72 64 65 72 20 64 6f 65 73 20 6d 61 74 74 65 72  rder does matter
a5c0: 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 75 73 68   */.        push
a5d0: 4f 6e 74 6f 53 6f 72 74 65 72 28 0a 20 20 20 20  OntoSorter(.    
a5e0: 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2c 20          pParse, 
a5f0: 70 53 6f 72 74 2c 20 70 2c 20 72 65 67 52 65 73  pSort, p, regRes
a600: 75 6c 74 2c 20 72 65 67 4f 72 69 67 2c 20 6e 52  ult, regOrig, nR
a610: 65 73 75 6c 74 43 6f 6c 2c 20 6e 50 72 65 66 69  esultCol, nPrefi
a620: 78 52 65 67 29 3b 0a 20 20 20 20 20 20 7d 65 6c  xReg);.      }el
a630: 73 65 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  se{.        int 
a640: 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  r1 = sqlite3GetT
a650: 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a  empReg(pParse);.
a660: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
a670: 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
a680: 70 44 65 73 74 2d 3e 7a 41 66 66 53 64 73 74 29  pDest->zAffSdst)
a690: 3d 3d 6e 52 65 73 75 6c 74 43 6f 6c 20 29 3b 0a  ==nResultCol );.
a6a0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
a6b0: 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
a6c0: 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 65 67 52  MakeRecord, regR
a6d0: 65 73 75 6c 74 2c 20 6e 52 65 73 75 6c 74 43 6f  esult, nResultCo
a6e0: 6c 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  l, .            
a6f0: 72 31 2c 20 70 44 65 73 74 2d 3e 7a 41 66 66 53  r1, pDest->zAffS
a700: 64 73 74 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 29  dst, nResultCol)
a710: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
a720: 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76  3VdbeAddOp4Int(v
a730: 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20  , OP_IdxInsert, 
a740: 69 50 61 72 6d 2c 20 72 31 2c 20 72 65 67 52 65  iParm, r1, regRe
a750: 73 75 6c 74 2c 20 6e 52 65 73 75 6c 74 43 6f 6c  sult, nResultCol
a760: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
a770: 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
a780: 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 20 20  (pParse, r1);.  
a790: 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
a7a0: 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  k;.    }..    /*
a7b0: 20 49 66 20 61 6e 79 20 72 6f 77 20 65 78 69 73   If any row exis
a7c0: 74 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20  t in the result 
a7d0: 73 65 74 2c 20 72 65 63 6f 72 64 20 74 68 61 74  set, record that
a7e0: 20 66 61 63 74 20 61 6e 64 20 61 62 6f 72 74 2e   fact and abort.
a7f0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65  .    */.    case
a800: 20 53 52 54 5f 45 78 69 73 74 73 3a 20 7b 0a 20   SRT_Exists: {. 
a810: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
a820: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74  AddOp2(v, OP_Int
a830: 65 67 65 72 2c 20 31 2c 20 69 50 61 72 6d 29 3b  eger, 1, iParm);
a840: 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 4c 49  .      /* The LI
a850: 4d 49 54 20 63 6c 61 75 73 65 20 77 69 6c 6c 20  MIT clause will 
a860: 74 65 72 6d 69 6e 61 74 65 20 74 68 65 20 6c 6f  terminate the lo
a870: 6f 70 20 66 6f 72 20 75 73 20 2a 2f 0a 20 20 20  op for us */.   
a880: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
a890: 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20  .    /* If this 
a8a0: 69 73 20 61 20 73 63 61 6c 61 72 20 73 65 6c 65  is a scalar sele
a8b0: 63 74 20 74 68 61 74 20 69 73 20 70 61 72 74 20  ct that is part 
a8c0: 6f 66 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e  of an expression
a8d0: 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20 73 74  , then.    ** st
a8e0: 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 73 20  ore the results 
a8f0: 69 6e 20 74 68 65 20 61 70 70 72 6f 70 72 69 61  in the appropria
a900: 74 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 6f  te memory cell o
a910: 72 20 61 72 72 61 79 20 6f 66 20 0a 20 20 20 20  r array of .    
a920: 2a 2a 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20  ** memory cells 
a930: 61 6e 64 20 62 72 65 61 6b 20 6f 75 74 20 6f 66  and break out of
a940: 20 74 68 65 20 73 63 61 6e 20 6c 6f 6f 70 2e 0a   the scan loop..
a950: 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20      */.    case 
a960: 53 52 54 5f 4d 65 6d 3a 20 7b 0a 20 20 20 20 20  SRT_Mem: {.     
a970: 20 69 66 28 20 70 53 6f 72 74 20 29 7b 0a 20 20   if( pSort ){.  
a980: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 52        assert( nR
a990: 65 73 75 6c 74 43 6f 6c 3c 3d 70 44 65 73 74 2d  esultCol<=pDest-
a9a0: 3e 6e 53 64 73 74 20 29 3b 0a 20 20 20 20 20 20  >nSdst );.      
a9b0: 20 20 70 75 73 68 4f 6e 74 6f 53 6f 72 74 65 72    pushOntoSorter
a9c0: 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 50  (.            pP
a9d0: 61 72 73 65 2c 20 70 53 6f 72 74 2c 20 70 2c 20  arse, pSort, p, 
a9e0: 72 65 67 52 65 73 75 6c 74 2c 20 72 65 67 4f 72  regResult, regOr
a9f0: 69 67 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 2c 20  ig, nResultCol, 
aa00: 6e 50 72 65 66 69 78 52 65 67 29 3b 0a 20 20 20  nPrefixReg);.   
aa10: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
aa20: 20 20 61 73 73 65 72 74 28 20 6e 52 65 73 75 6c    assert( nResul
aa30: 74 43 6f 6c 3d 3d 70 44 65 73 74 2d 3e 6e 53 64  tCol==pDest->nSd
aa40: 73 74 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73  st );.        as
aa50: 73 65 72 74 28 20 72 65 67 52 65 73 75 6c 74 3d  sert( regResult=
aa60: 3d 69 50 61 72 6d 20 29 3b 0a 20 20 20 20 20 20  =iParm );.      
aa70: 20 20 2f 2a 20 54 68 65 20 4c 49 4d 49 54 20 63    /* The LIMIT c
aa80: 6c 61 75 73 65 20 77 69 6c 6c 20 6a 75 6d 70 20  lause will jump 
aa90: 6f 75 74 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20  out of the loop 
aaa0: 66 6f 72 20 75 73 20 2a 2f 0a 20 20 20 20 20 20  for us */.      
aab0: 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
aac0: 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 23     }.#endif /* #
aad0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
aae0: 49 54 5f 53 55 42 51 55 45 52 59 20 2a 2f 0a 0a  IT_SUBQUERY */..
aaf0: 20 20 20 20 63 61 73 65 20 53 52 54 5f 43 6f 72      case SRT_Cor
ab00: 6f 75 74 69 6e 65 3a 20 20 20 20 20 20 20 2f 2a  outine:       /*
ab10: 20 53 65 6e 64 20 64 61 74 61 20 74 6f 20 61 20   Send data to a 
ab20: 63 6f 2d 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20  co-routine */.  
ab30: 20 20 63 61 73 65 20 53 52 54 5f 4f 75 74 70 75    case SRT_Outpu
ab40: 74 3a 20 7b 20 20 20 20 20 20 20 20 2f 2a 20 52  t: {        /* R
ab50: 65 74 75 72 6e 20 74 68 65 20 72 65 73 75 6c 74  eturn the result
ab60: 73 20 2a 2f 0a 20 20 20 20 20 20 74 65 73 74 63  s */.      testc
ab70: 61 73 65 28 20 65 44 65 73 74 3d 3d 53 52 54 5f  ase( eDest==SRT_
ab80: 43 6f 72 6f 75 74 69 6e 65 20 29 3b 0a 20 20 20  Coroutine );.   
ab90: 20 20 20 74 65 73 74 63 61 73 65 28 20 65 44 65     testcase( eDe
aba0: 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20 29  st==SRT_Output )
abb0: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 53 6f 72  ;.      if( pSor
abc0: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 70 75 73  t ){.        pus
abd0: 68 4f 6e 74 6f 53 6f 72 74 65 72 28 70 50 61 72  hOntoSorter(pPar
abe0: 73 65 2c 20 70 53 6f 72 74 2c 20 70 2c 20 72 65  se, pSort, p, re
abf0: 67 52 65 73 75 6c 74 2c 20 72 65 67 4f 72 69 67  gResult, regOrig
ac00: 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 2c 0a 20 20  , nResultCol,.  
ac10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ac20: 20 20 20 20 20 6e 50 72 65 66 69 78 52 65 67 29       nPrefixReg)
ac30: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
ac40: 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 43 6f 72  ( eDest==SRT_Cor
ac50: 6f 75 74 69 6e 65 20 29 7b 0a 20 20 20 20 20 20  outine ){.      
ac60: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
ac70: 4f 70 31 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c  Op1(v, OP_Yield,
ac80: 20 70 44 65 73 74 2d 3e 69 53 44 50 61 72 6d 29   pDest->iSDParm)
ac90: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
aca0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
acb0: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52  beAddOp2(v, OP_R
acc0: 65 73 75 6c 74 52 6f 77 2c 20 72 65 67 52 65 73  esultRow, regRes
acd0: 75 6c 74 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 29  ult, nResultCol)
ace0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
acf0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 23 69  break;.    }..#i
ad00: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
ad10: 54 5f 43 54 45 0a 20 20 20 20 2f 2a 20 57 72 69  T_CTE.    /* Wri
ad20: 74 65 20 74 68 65 20 72 65 73 75 6c 74 73 20 69  te the results i
ad30: 6e 74 6f 20 61 20 70 72 69 6f 72 69 74 79 20 71  nto a priority q
ad40: 75 65 75 65 20 74 68 61 74 20 69 73 20 6f 72 64  ueue that is ord
ad50: 65 72 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 0a  er according to.
ad60: 20 20 20 20 2a 2a 20 70 44 65 73 74 2d 3e 70 4f      ** pDest->pO
ad70: 72 64 65 72 42 79 20 28 69 6e 20 70 53 4f 29 2e  rderBy (in pSO).
ad80: 20 20 70 44 65 73 74 2d 3e 69 53 44 50 61 72 6d    pDest->iSDParm
ad90: 20 28 69 6e 20 69 50 61 72 6d 29 20 69 73 20 74   (in iParm) is t
ada0: 68 65 20 63 75 72 73 6f 72 20 66 6f 72 20 61 6e  he cursor for an
adb0: 0a 20 20 20 20 2a 2a 20 69 6e 64 65 78 20 77 69  .    ** index wi
adc0: 74 68 20 70 53 4f 2d 3e 6e 45 78 70 72 2b 32 20  th pSO->nExpr+2 
add0: 63 6f 6c 75 6d 6e 73 2e 20 20 42 75 69 6c 64 20  columns.  Build 
ade0: 61 20 6b 65 79 20 75 73 69 6e 67 20 70 53 4f 20  a key using pSO 
adf0: 66 6f 72 20 74 68 65 20 66 69 72 73 74 0a 20 20  for the first.  
ae00: 20 20 2a 2a 20 70 53 4f 2d 3e 6e 45 78 70 72 20    ** pSO->nExpr 
ae10: 63 6f 6c 75 6d 6e 73 2c 20 74 68 65 6e 20 6d 61  columns, then ma
ae20: 6b 65 20 73 75 72 65 20 61 6c 6c 20 6b 65 79 73  ke sure all keys
ae30: 20 61 72 65 20 75 6e 69 71 75 65 20 62 79 20 61   are unique by a
ae40: 64 64 69 6e 67 20 61 0a 20 20 20 20 2a 2a 20 66  dding a.    ** f
ae50: 69 6e 61 6c 20 4f 50 5f 53 65 71 75 65 6e 63 65  inal OP_Sequence
ae60: 20 63 6f 6c 75 6d 6e 2e 20 20 54 68 65 20 6c 61   column.  The la
ae70: 73 74 20 63 6f 6c 75 6d 6e 20 69 73 20 74 68 65  st column is the
ae80: 20 72 65 63 6f 72 64 20 61 73 20 61 20 62 6c 6f   record as a blo
ae90: 62 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61  b..    */.    ca
aea0: 73 65 20 53 52 54 5f 44 69 73 74 51 75 65 75 65  se SRT_DistQueue
aeb0: 3a 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 51  :.    case SRT_Q
aec0: 75 65 75 65 3a 20 7b 0a 20 20 20 20 20 20 69 6e  ueue: {.      in
aed0: 74 20 6e 4b 65 79 3b 0a 20 20 20 20 20 20 69 6e  t nKey;.      in
aee0: 74 20 72 31 2c 20 72 32 2c 20 72 33 3b 0a 20 20  t r1, r2, r3;.  
aef0: 20 20 20 20 69 6e 74 20 61 64 64 72 54 65 73 74      int addrTest
af00: 20 3d 20 30 3b 0a 20 20 20 20 20 20 45 78 70 72   = 0;.      Expr
af10: 4c 69 73 74 20 2a 70 53 4f 3b 0a 20 20 20 20 20  List *pSO;.     
af20: 20 70 53 4f 20 3d 20 70 44 65 73 74 2d 3e 70 4f   pSO = pDest->pO
af30: 72 64 65 72 42 79 3b 0a 20 20 20 20 20 20 61 73  rderBy;.      as
af40: 73 65 72 74 28 20 70 53 4f 20 29 3b 0a 20 20 20  sert( pSO );.   
af50: 20 20 20 6e 4b 65 79 20 3d 20 70 53 4f 2d 3e 6e     nKey = pSO->n
af60: 45 78 70 72 3b 0a 20 20 20 20 20 20 72 31 20 3d  Expr;.      r1 =
af70: 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
af80: 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  eg(pParse);.    
af90: 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33 47 65    r2 = sqlite3Ge
afa0: 74 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73  tTempRange(pPars
afb0: 65 2c 20 6e 4b 65 79 2b 32 29 3b 0a 20 20 20 20  e, nKey+2);.    
afc0: 20 20 72 33 20 3d 20 72 32 2b 6e 4b 65 79 2b 31    r3 = r2+nKey+1
afd0: 3b 0a 20 20 20 20 20 20 69 66 28 20 65 44 65 73  ;.      if( eDes
afe0: 74 3d 3d 53 52 54 5f 44 69 73 74 51 75 65 75 65  t==SRT_DistQueue
aff0: 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49   ){.        /* I
b000: 66 20 74 68 65 20 64 65 73 74 69 6e 61 74 69 6f  f the destinatio
b010: 6e 20 69 73 20 44 69 73 74 51 75 65 75 65 2c 20  n is DistQueue, 
b020: 74 68 65 6e 20 63 75 72 73 6f 72 20 28 69 50 61  then cursor (iPa
b030: 72 6d 2b 31 29 20 69 73 20 6f 70 65 6e 0a 20 20  rm+1) is open.  
b040: 20 20 20 20 20 20 2a 2a 20 6f 6e 20 61 20 73 65        ** on a se
b050: 63 6f 6e 64 20 65 70 68 65 6d 65 72 61 6c 20 69  cond ephemeral i
b060: 6e 64 65 78 20 74 68 61 74 20 68 6f 6c 64 73 20  ndex that holds 
b070: 61 6c 6c 20 76 61 6c 75 65 73 20 65 76 65 72 79  all values every
b080: 20 70 72 65 76 69 6f 75 73 6c 79 0a 20 20 20 20   previously.    
b090: 20 20 20 20 2a 2a 20 61 64 64 65 64 20 74 6f 20      ** added to 
b0a0: 74 68 65 20 71 75 65 75 65 2e 20 2a 2f 0a 20 20  the queue. */.  
b0b0: 20 20 20 20 20 20 61 64 64 72 54 65 73 74 20 3d        addrTest =
b0c0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
b0d0: 70 34 49 6e 74 28 76 2c 20 4f 50 5f 46 6f 75 6e  p4Int(v, OP_Foun
b0e0: 64 2c 20 69 50 61 72 6d 2b 31 2c 20 30 2c 20 0a  d, iParm+1, 0, .
b0f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b100: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b110: 20 20 20 20 20 20 20 20 72 65 67 52 65 73 75 6c          regResul
b120: 74 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 29 3b 0a  t, nResultCol);.
b130: 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 76 65          VdbeCove
b140: 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 7d  rage(v);.      }
b150: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
b160: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d  beAddOp3(v, OP_M
b170: 61 6b 65 52 65 63 6f 72 64 2c 20 72 65 67 52 65  akeRecord, regRe
b180: 73 75 6c 74 2c 20 6e 52 65 73 75 6c 74 43 6f 6c  sult, nResultCol
b190: 2c 20 72 33 29 3b 0a 20 20 20 20 20 20 69 66 28  , r3);.      if(
b1a0: 20 65 44 65 73 74 3d 3d 53 52 54 5f 44 69 73 74   eDest==SRT_Dist
b1b0: 51 75 65 75 65 20 29 7b 0a 20 20 20 20 20 20 20  Queue ){.       
b1c0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
b1d0: 70 32 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65  p2(v, OP_IdxInse
b1e0: 72 74 2c 20 69 50 61 72 6d 2b 31 2c 20 72 33 29  rt, iParm+1, r3)
b1f0: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
b200: 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c  3VdbeChangeP5(v,
b210: 20 4f 50 46 4c 41 47 5f 55 53 45 53 45 45 4b 52   OPFLAG_USESEEKR
b220: 45 53 55 4c 54 29 3b 0a 20 20 20 20 20 20 7d 0a  ESULT);.      }.
b230: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
b240: 3c 6e 4b 65 79 3b 20 69 2b 2b 29 7b 0a 20 20 20  <nKey; i++){.   
b250: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
b260: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 43 6f  AddOp2(v, OP_SCo
b270: 70 79 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  py,.            
b280: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65                re
b290: 67 52 65 73 75 6c 74 20 2b 20 70 53 4f 2d 3e 61  gResult + pSO->a
b2a0: 5b 69 5d 2e 75 2e 78 2e 69 4f 72 64 65 72 42 79  [i].u.x.iOrderBy
b2b0: 43 6f 6c 20 2d 20 31 2c 0a 20 20 20 20 20 20 20  Col - 1,.       
b2c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b2d0: 20 20 20 72 32 2b 69 29 3b 0a 20 20 20 20 20 20     r2+i);.      
b2e0: 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  }.      sqlite3V
b2f0: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
b300: 53 65 71 75 65 6e 63 65 2c 20 69 50 61 72 6d 2c  Sequence, iParm,
b310: 20 72 32 2b 6e 4b 65 79 29 3b 0a 20 20 20 20 20   r2+nKey);.     
b320: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
b330: 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63  p3(v, OP_MakeRec
b340: 6f 72 64 2c 20 72 32 2c 20 6e 4b 65 79 2b 32 2c  ord, r2, nKey+2,
b350: 20 72 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69   r1);.      sqli
b360: 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74  te3VdbeAddOp4Int
b370: 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74  (v, OP_IdxInsert
b380: 2c 20 69 50 61 72 6d 2c 20 72 31 2c 20 72 32 2c  , iParm, r1, r2,
b390: 20 6e 4b 65 79 2b 32 29 3b 0a 20 20 20 20 20 20   nKey+2);.      
b3a0: 69 66 28 20 61 64 64 72 54 65 73 74 20 29 20 73  if( addrTest ) s
b3b0: 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
b3c0: 72 65 28 76 2c 20 61 64 64 72 54 65 73 74 29 3b  re(v, addrTest);
b3d0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65  .      sqlite3Re
b3e0: 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
b3f0: 72 73 65 2c 20 72 31 29 3b 0a 20 20 20 20 20 20  rse, r1);.      
b400: 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
b410: 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20  mpRange(pParse, 
b420: 72 32 2c 20 6e 4b 65 79 2b 32 29 3b 0a 20 20 20  r2, nKey+2);.   
b430: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
b440: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
b450: 5f 4f 4d 49 54 5f 43 54 45 20 2a 2f 0a 0a 0a 0a  _OMIT_CTE */....
b460: 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
b470: 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52  ITE_OMIT_TRIGGER
b480: 29 0a 20 20 20 20 2f 2a 20 44 69 73 63 61 72 64  ).    /* Discard
b490: 20 74 68 65 20 72 65 73 75 6c 74 73 2e 20 20 54   the results.  T
b4a0: 68 69 73 20 69 73 20 75 73 65 64 20 66 6f 72 20  his is used for 
b4b0: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
b4c0: 73 20 69 6e 73 69 64 65 0a 20 20 20 20 2a 2a 20  s inside.    ** 
b4d0: 74 68 65 20 62 6f 64 79 20 6f 66 20 61 20 54 52  the body of a TR
b4e0: 49 47 47 45 52 2e 20 20 54 68 65 20 70 75 72 70  IGGER.  The purp
b4f0: 6f 73 65 20 6f 66 20 73 75 63 68 20 73 65 6c 65  ose of such sele
b500: 63 74 73 20 69 73 20 74 6f 20 63 61 6c 6c 0a 20  cts is to call. 
b510: 20 20 20 2a 2a 20 75 73 65 72 2d 64 65 66 69 6e     ** user-defin
b520: 65 64 20 66 75 6e 63 74 69 6f 6e 73 20 74 68 61  ed functions tha
b530: 74 20 68 61 76 65 20 73 69 64 65 20 65 66 66 65  t have side effe
b540: 63 74 73 2e 20 20 57 65 20 64 6f 20 6e 6f 74 20  cts.  We do not 
b550: 63 61 72 65 0a 20 20 20 20 2a 2a 20 61 62 6f 75  care.    ** abou
b560: 74 20 74 68 65 20 61 63 74 75 61 6c 20 72 65 73  t the actual res
b570: 75 6c 74 73 20 6f 66 20 74 68 65 20 73 65 6c 65  ults of the sele
b580: 63 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64  ct..    */.    d
b590: 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20  efault: {.      
b5a0: 61 73 73 65 72 74 28 20 65 44 65 73 74 3d 3d 53  assert( eDest==S
b5b0: 52 54 5f 44 69 73 63 61 72 64 20 29 3b 0a 20 20  RT_Discard );.  
b5c0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
b5d0: 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 20 20 2f  .#endif.  }..  /
b5e0: 2a 20 4a 75 6d 70 20 74 6f 20 74 68 65 20 65 6e  * Jump to the en
b5f0: 64 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 69 66  d of the loop if
b600: 20 74 68 65 20 4c 49 4d 49 54 20 69 73 20 72 65   the LIMIT is re
b610: 61 63 68 65 64 2e 20 20 45 78 63 65 70 74 2c 20  ached.  Except, 
b620: 69 66 0a 20 20 2a 2a 20 74 68 65 72 65 20 69 73  if.  ** there is
b630: 20 61 20 73 6f 72 74 65 72 2c 20 69 6e 20 77 68   a sorter, in wh
b640: 69 63 68 20 63 61 73 65 20 74 68 65 20 73 6f 72  ich case the sor
b650: 74 65 72 20 68 61 73 20 61 6c 72 65 61 64 79 20  ter has already 
b660: 6c 69 6d 69 74 65 64 0a 20 20 2a 2a 20 74 68 65  limited.  ** the
b670: 20 6f 75 74 70 75 74 20 66 6f 72 20 75 73 2e 0a   output for us..
b680: 20 20 2a 2f 0a 20 20 69 66 28 20 70 53 6f 72 74    */.  if( pSort
b690: 3d 3d 30 20 26 26 20 70 2d 3e 69 4c 69 6d 69 74  ==0 && p->iLimit
b6a0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
b6b0: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
b6c0: 44 65 63 72 4a 75 6d 70 5a 65 72 6f 2c 20 70 2d  DecrJumpZero, p-
b6d0: 3e 69 4c 69 6d 69 74 2c 20 69 42 72 65 61 6b 29  >iLimit, iBreak)
b6e0: 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
b6f0: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
b700: 41 6c 6c 6f 63 61 74 65 20 61 20 4b 65 79 49 6e  Allocate a KeyIn
b710: 66 6f 20 6f 62 6a 65 63 74 20 73 75 66 66 69 63  fo object suffic
b720: 69 65 6e 74 20 66 6f 72 20 61 6e 20 69 6e 64 65  ient for an inde
b730: 78 20 6f 66 20 4e 20 6b 65 79 20 63 6f 6c 75 6d  x of N key colum
b740: 6e 73 20 61 6e 64 0a 2a 2a 20 58 20 65 78 74 72  ns and.** X extr
b750: 61 20 63 6f 6c 75 6d 6e 73 2e 0a 2a 2f 0a 4b 65  a columns..*/.Ke
b760: 79 49 6e 66 6f 20 2a 73 71 6c 69 74 65 33 4b 65  yInfo *sqlite3Ke
b770: 79 49 6e 66 6f 41 6c 6c 6f 63 28 73 71 6c 69 74  yInfoAlloc(sqlit
b780: 65 33 20 2a 64 62 2c 20 69 6e 74 20 4e 2c 20 69  e3 *db, int N, i
b790: 6e 74 20 58 29 7b 0a 20 20 69 6e 74 20 6e 45 78  nt X){.  int nEx
b7a0: 74 72 61 20 3d 20 28 4e 2b 58 29 2a 28 73 69 7a  tra = (N+X)*(siz
b7b0: 65 6f 66 28 43 6f 6c 6c 53 65 71 2a 29 2b 31 29  eof(CollSeq*)+1)
b7c0: 20 2d 20 73 69 7a 65 6f 66 28 43 6f 6c 6c 53 65   - sizeof(CollSe
b7d0: 71 2a 29 3b 0a 20 20 4b 65 79 49 6e 66 6f 20 2a  q*);.  KeyInfo *
b7e0: 70 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  p = sqlite3DbMal
b7f0: 6c 6f 63 52 61 77 4e 4e 28 64 62 2c 20 73 69 7a  locRawNN(db, siz
b800: 65 6f 66 28 4b 65 79 49 6e 66 6f 29 20 2b 20 6e  eof(KeyInfo) + n
b810: 45 78 74 72 61 29 3b 0a 20 20 69 66 28 20 70 20  Extra);.  if( p 
b820: 29 7b 0a 20 20 20 20 70 2d 3e 61 53 6f 72 74 4f  ){.    p->aSortO
b830: 72 64 65 72 20 3d 20 28 75 38 2a 29 26 70 2d 3e  rder = (u8*)&p->
b840: 61 43 6f 6c 6c 5b 4e 2b 58 5d 3b 0a 20 20 20 20  aColl[N+X];.    
b850: 70 2d 3e 6e 4b 65 79 46 69 65 6c 64 20 3d 20 28  p->nKeyField = (
b860: 75 31 36 29 4e 3b 0a 20 20 20 20 70 2d 3e 6e 41  u16)N;.    p->nA
b870: 6c 6c 46 69 65 6c 64 20 3d 20 28 75 31 36 29 28  llField = (u16)(
b880: 4e 2b 58 29 3b 0a 20 20 20 20 70 2d 3e 65 6e 63  N+X);.    p->enc
b890: 20 3d 20 45 4e 43 28 64 62 29 3b 0a 20 20 20 20   = ENC(db);.    
b8a0: 70 2d 3e 64 62 20 3d 20 64 62 3b 0a 20 20 20 20  p->db = db;.    
b8b0: 70 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20 20  p->nRef = 1;.   
b8c0: 20 6d 65 6d 73 65 74 28 26 70 5b 31 5d 2c 20 30   memset(&p[1], 0
b8d0: 2c 20 6e 45 78 74 72 61 29 3b 0a 20 20 7d 65 6c  , nExtra);.  }el
b8e0: 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f  se{.    sqlite3O
b8f0: 6f 6d 46 61 75 6c 74 28 64 62 29 3b 0a 20 20 7d  omFault(db);.  }
b900: 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a  .  return p;.}..
b910: 2f 2a 0a 2a 2a 20 44 65 61 6c 6c 6f 63 61 74 65  /*.** Deallocate
b920: 20 61 20 4b 65 79 49 6e 66 6f 20 6f 62 6a 65 63   a KeyInfo objec
b930: 74 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  t.*/.void sqlite
b940: 33 4b 65 79 49 6e 66 6f 55 6e 72 65 66 28 4b 65  3KeyInfoUnref(Ke
b950: 79 49 6e 66 6f 20 2a 70 29 7b 0a 20 20 69 66 28  yInfo *p){.  if(
b960: 20 70 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74   p ){.    assert
b970: 28 20 70 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 20  ( p->nRef>0 );. 
b980: 20 20 20 70 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20     p->nRef--;.  
b990: 20 20 69 66 28 20 70 2d 3e 6e 52 65 66 3d 3d 30    if( p->nRef==0
b9a0: 20 29 20 73 71 6c 69 74 65 33 44 62 46 72 65 65   ) sqlite3DbFree
b9b0: 4e 4e 28 70 2d 3e 64 62 2c 20 70 29 3b 0a 20 20  NN(p->db, p);.  
b9c0: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20  }.}../*.** Make 
b9d0: 61 20 6e 65 77 20 70 6f 69 6e 74 65 72 20 74 6f  a new pointer to
b9e0: 20 61 20 4b 65 79 49 6e 66 6f 20 6f 62 6a 65 63   a KeyInfo objec
b9f0: 74 0a 2a 2f 0a 4b 65 79 49 6e 66 6f 20 2a 73 71  t.*/.KeyInfo *sq
ba00: 6c 69 74 65 33 4b 65 79 49 6e 66 6f 52 65 66 28  lite3KeyInfoRef(
ba10: 4b 65 79 49 6e 66 6f 20 2a 70 29 7b 0a 20 20 69  KeyInfo *p){.  i
ba20: 66 28 20 70 20 29 7b 0a 20 20 20 20 61 73 73 65  f( p ){.    asse
ba30: 72 74 28 20 70 2d 3e 6e 52 65 66 3e 30 20 29 3b  rt( p->nRef>0 );
ba40: 0a 20 20 20 20 70 2d 3e 6e 52 65 66 2b 2b 3b 0a  .    p->nRef++;.
ba50: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a    }.  return p;.
ba60: 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  }..#ifdef SQLITE
ba70: 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 52 65 74  _DEBUG./*.** Ret
ba80: 75 72 6e 20 54 52 55 45 20 69 66 20 61 20 4b 65  urn TRUE if a Ke
ba90: 79 49 6e 66 6f 20 6f 62 6a 65 63 74 20 63 61 6e  yInfo object can
baa0: 20 62 65 20 63 68 61 6e 67 65 2e 20 20 54 68 65   be change.  The
bab0: 20 4b 65 79 49 6e 66 6f 20 6f 62 6a 65 63 74 0a   KeyInfo object.
bac0: 2a 2a 20 63 61 6e 20 6f 6e 6c 79 20 62 65 20 63  ** can only be c
bad0: 68 61 6e 67 65 64 20 69 66 20 74 68 69 73 20 69  hanged if this i
bae0: 73 20 6a 75 73 74 20 61 20 73 69 6e 67 6c 65 20  s just a single 
baf0: 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65  reference to the
bb00: 20 6f 62 6a 65 63 74 2e 0a 2a 2a 0a 2a 2a 20 54   object..**.** T
bb10: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75  his routine is u
bb20: 73 65 64 20 6f 6e 6c 79 20 69 6e 73 69 64 65 20  sed only inside 
bb30: 6f 66 20 61 73 73 65 72 74 28 29 20 73 74 61 74  of assert() stat
bb40: 65 6d 65 6e 74 73 2e 0a 2a 2f 0a 69 6e 74 20 73  ements..*/.int s
bb50: 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 49 73 57  qlite3KeyInfoIsW
bb60: 72 69 74 65 61 62 6c 65 28 4b 65 79 49 6e 66 6f  riteable(KeyInfo
bb70: 20 2a 70 29 7b 20 72 65 74 75 72 6e 20 70 2d 3e   *p){ return p->
bb80: 6e 52 65 66 3d 3d 31 3b 20 7d 0a 23 65 6e 64 69  nRef==1; }.#endi
bb90: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 44 45 42 55  f /* SQLITE_DEBU
bba0: 47 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65  G */../*.** Give
bbb0: 6e 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  n an expression 
bbc0: 6c 69 73 74 2c 20 67 65 6e 65 72 61 74 65 20 61  list, generate a
bbd0: 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75   KeyInfo structu
bbe0: 72 65 20 74 68 61 74 20 72 65 63 6f 72 64 73 0a  re that records.
bbf0: 2a 2a 20 74 68 65 20 63 6f 6c 6c 61 74 69 6e 67  ** the collating
bc00: 20 73 65 71 75 65 6e 63 65 20 66 6f 72 20 65 61   sequence for ea
bc10: 63 68 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e  ch expression in
bc20: 20 74 68 61 74 20 65 78 70 72 65 73 73 69 6f 6e   that expression
bc30: 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   list..**.** If 
bc40: 74 68 65 20 45 78 70 72 4c 69 73 74 20 69 73 20  the ExprList is 
bc50: 61 6e 20 4f 52 44 45 52 20 42 59 20 6f 72 20 47  an ORDER BY or G
bc60: 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 20 74  ROUP BY clause t
bc70: 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74 69 6e  hen the resultin
bc80: 67 0a 2a 2a 20 4b 65 79 49 6e 66 6f 20 73 74 72  g.** KeyInfo str
bc90: 75 63 74 75 72 65 20 69 73 20 61 70 70 72 6f 70  ucture is approp
bca0: 72 69 61 74 65 20 66 6f 72 20 69 6e 69 74 69 61  riate for initia
bcb0: 6c 69 7a 69 6e 67 20 61 20 76 69 72 74 75 61 6c  lizing a virtual
bcc0: 20 69 6e 64 65 78 20 74 6f 0a 2a 2a 20 69 6d 70   index to.** imp
bcd0: 6c 65 6d 65 6e 74 20 74 68 61 74 20 63 6c 61 75  lement that clau
bce0: 73 65 2e 20 20 49 66 20 74 68 65 20 45 78 70 72  se.  If the Expr
bcf0: 4c 69 73 74 20 69 73 20 74 68 65 20 72 65 73 75  List is the resu
bd00: 6c 74 20 73 65 74 20 6f 66 20 61 20 53 45 4c 45  lt set of a SELE
bd10: 43 54 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20 4b  CT.** then the K
bd20: 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65  eyInfo structure
bd30: 20 69 73 20 61 70 70 72 6f 70 72 69 61 74 65 20   is appropriate 
bd40: 66 6f 72 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67  for initializing
bd50: 20 61 20 76 69 72 74 75 61 6c 0a 2a 2a 20 69 6e   a virtual.** in
bd60: 64 65 78 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74  dex to implement
bd70: 20 61 20 44 49 53 54 49 4e 43 54 20 74 65 73 74   a DISTINCT test
bd80: 2e 0a 2a 2a 0a 2a 2a 20 53 70 61 63 65 20 74 6f  ..**.** Space to
bd90: 20 68 6f 6c 64 20 74 68 65 20 4b 65 79 49 6e 66   hold the KeyInf
bda0: 6f 20 73 74 72 75 63 74 75 72 65 20 69 73 20 6f  o structure is o
bdb0: 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 6d 61 6c  btained from mal
bdc0: 6c 6f 63 2e 20 20 54 68 65 20 63 61 6c 6c 69 6e  loc.  The callin
bdd0: 67 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 69 73  g.** function is
bde0: 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72   responsible for
bdf0: 20 73 65 65 69 6e 67 20 74 68 61 74 20 74 68 69   seeing that thi
be00: 73 20 73 74 72 75 63 74 75 72 65 20 69 73 20 65  s structure is e
be10: 76 65 6e 74 75 61 6c 6c 79 0a 2a 2a 20 66 72 65  ventually.** fre
be20: 65 64 2e 0a 2a 2f 0a 4b 65 79 49 6e 66 6f 20 2a  ed..*/.KeyInfo *
be30: 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 46 72  sqlite3KeyInfoFr
be40: 6f 6d 45 78 70 72 4c 69 73 74 28 0a 20 20 50 61  omExprList(.  Pa
be50: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
be60: 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
be70: 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c  ntext */.  ExprL
be80: 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20 20 20  ist *pList,     
be90: 2f 2a 20 46 6f 72 6d 20 74 68 65 20 4b 65 79 49  /* Form the KeyI
bea0: 6e 66 6f 20 6f 62 6a 65 63 74 20 66 72 6f 6d 20  nfo object from 
beb0: 74 68 69 73 20 45 78 70 72 4c 69 73 74 20 2a 2f  this ExprList */
bec0: 0a 20 20 69 6e 74 20 69 53 74 61 72 74 2c 20 20  .  int iStart,  
bed0: 20 20 20 20 20 20 20 20 2f 2a 20 42 65 67 69 6e          /* Begin
bee0: 20 77 69 74 68 20 74 68 69 73 20 63 6f 6c 75 6d   with this colum
bef0: 6e 20 6f 66 20 70 4c 69 73 74 20 2a 2f 0a 20 20  n of pList */.  
bf00: 69 6e 74 20 6e 45 78 74 72 61 20 20 20 20 20 20  int nExtra      
bf10: 20 20 20 20 20 2f 2a 20 41 64 64 20 74 68 69 73       /* Add this
bf20: 20 6d 61 6e 79 20 65 78 74 72 61 20 63 6f 6c 75   many extra colu
bf30: 6d 6e 73 20 74 6f 20 74 68 65 20 65 6e 64 20 2a  mns to the end *
bf40: 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 45 78 70 72  /.){.  int nExpr
bf50: 3b 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 49 6e  ;.  KeyInfo *pIn
bf60: 66 6f 3b 0a 20 20 73 74 72 75 63 74 20 45 78 70  fo;.  struct Exp
bf70: 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  rList_item *pIte
bf80: 6d 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  m;.  sqlite3 *db
bf90: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
bfa0: 20 69 6e 74 20 69 3b 0a 0a 20 20 6e 45 78 70 72   int i;..  nExpr
bfb0: 20 3d 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b   = pList->nExpr;
bfc0: 0a 20 20 70 49 6e 66 6f 20 3d 20 73 71 6c 69 74  .  pInfo = sqlit
bfd0: 65 33 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63 28 64  e3KeyInfoAlloc(d
bfe0: 62 2c 20 6e 45 78 70 72 2d 69 53 74 61 72 74 2c  b, nExpr-iStart,
bff0: 20 6e 45 78 74 72 61 2b 31 29 3b 0a 20 20 69 66   nExtra+1);.  if
c000: 28 20 70 49 6e 66 6f 20 29 7b 0a 20 20 20 20 61  ( pInfo ){.    a
c010: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 4b 65  ssert( sqlite3Ke
c020: 79 49 6e 66 6f 49 73 57 72 69 74 65 61 62 6c 65  yInfoIsWriteable
c030: 28 70 49 6e 66 6f 29 20 29 3b 0a 20 20 20 20 66  (pInfo) );.    f
c040: 6f 72 28 69 3d 69 53 74 61 72 74 2c 20 70 49 74  or(i=iStart, pIt
c050: 65 6d 3d 70 4c 69 73 74 2d 3e 61 2b 69 53 74 61  em=pList->a+iSta
c060: 72 74 3b 20 69 3c 6e 45 78 70 72 3b 20 69 2b 2b  rt; i<nExpr; i++
c070: 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20  , pItem++){.    
c080: 20 20 70 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 69    pInfo->aColl[i
c090: 2d 69 53 74 61 72 74 5d 20 3d 20 73 71 6c 69 74  -iStart] = sqlit
c0a0: 65 33 45 78 70 72 4e 4e 43 6f 6c 6c 53 65 71 28  e3ExprNNCollSeq(
c0b0: 70 50 61 72 73 65 2c 20 70 49 74 65 6d 2d 3e 70  pParse, pItem->p
c0c0: 45 78 70 72 29 3b 0a 20 20 20 20 20 20 70 49 6e  Expr);.      pIn
c0d0: 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69  fo->aSortOrder[i
c0e0: 2d 69 53 74 61 72 74 5d 20 3d 20 70 49 74 65 6d  -iStart] = pItem
c0f0: 2d 3e 73 6f 72 74 4f 72 64 65 72 3b 0a 20 20 20  ->sortOrder;.   
c100: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
c110: 70 49 6e 66 6f 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  pInfo;.}../*.** 
c120: 4e 61 6d 65 20 6f 66 20 74 68 65 20 63 6f 6e 6e  Name of the conn
c130: 65 63 74 69 6f 6e 20 6f 70 65 72 61 74 6f 72 2c  ection operator,
c140: 20 75 73 65 64 20 66 6f 72 20 65 72 72 6f 72 20   used for error 
c150: 6d 65 73 73 61 67 65 73 2e 0a 2a 2f 0a 73 74 61  messages..*/.sta
c160: 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  tic const char *
c170: 73 65 6c 65 63 74 4f 70 4e 61 6d 65 28 69 6e 74  selectOpName(int
c180: 20 69 64 29 7b 0a 20 20 63 68 61 72 20 2a 7a 3b   id){.  char *z;
c190: 0a 20 20 73 77 69 74 63 68 28 20 69 64 20 29 7b  .  switch( id ){
c1a0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 4c 4c  .    case TK_ALL
c1b0: 3a 20 20 20 20 20 20 20 7a 20 3d 20 22 55 4e 49  :       z = "UNI
c1c0: 4f 4e 20 41 4c 4c 22 3b 20 20 20 62 72 65 61 6b  ON ALL";   break
c1d0: 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e  ;.    case TK_IN
c1e0: 54 45 52 53 45 43 54 3a 20 7a 20 3d 20 22 49 4e  TERSECT: z = "IN
c1f0: 54 45 52 53 45 43 54 22 3b 20 20 20 62 72 65 61  TERSECT";   brea
c200: 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45  k;.    case TK_E
c210: 58 43 45 50 54 3a 20 20 20 20 7a 20 3d 20 22 45  XCEPT:    z = "E
c220: 58 43 45 50 54 22 3b 20 20 20 20 20 20 62 72 65  XCEPT";      bre
c230: 61 6b 3b 0a 20 20 20 20 64 65 66 61 75 6c 74 3a  ak;.    default:
c240: 20 20 20 20 20 20 20 20 20 20 20 7a 20 3d 20 22             z = "
c250: 55 4e 49 4f 4e 22 3b 20 20 20 20 20 20 20 62 72  UNION";       br
c260: 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  eak;.  }.  retur
c270: 6e 20 7a 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20  n z;.}..#ifndef 
c280: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c  SQLITE_OMIT_EXPL
c290: 41 49 4e 0a 2f 2a 0a 2a 2a 20 55 6e 6c 65 73 73  AIN./*.** Unless
c2a0: 20 61 6e 20 22 45 58 50 4c 41 49 4e 20 51 55 45   an "EXPLAIN QUE
c2b0: 52 59 20 50 4c 41 4e 22 20 63 6f 6d 6d 61 6e 64  RY PLAN" command
c2c0: 20 69 73 20 62 65 69 6e 67 20 70 72 6f 63 65 73   is being proces
c2d0: 73 65 64 2c 20 74 68 69 73 20 66 75 6e 63 74 69  sed, this functi
c2e0: 6f 6e 0a 2a 2a 20 69 73 20 61 20 6e 6f 2d 6f 70  on.** is a no-op
c2f0: 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 74 20  . Otherwise, it 
c300: 61 64 64 73 20 61 20 73 69 6e 67 6c 65 20 72 6f  adds a single ro
c310: 77 20 6f 66 20 6f 75 74 70 75 74 20 74 6f 20 74  w of output to t
c320: 68 65 20 45 51 50 20 72 65 73 75 6c 74 2c 0a 2a  he EQP result,.*
c330: 2a 20 77 68 65 72 65 20 74 68 65 20 63 61 70 74  * where the capt
c340: 69 6f 6e 20 69 73 20 6f 66 20 74 68 65 20 66 6f  ion is of the fo
c350: 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 22 55 53 45  rm:.**.**   "USE
c360: 20 54 45 4d 50 20 42 2d 54 52 45 45 20 46 4f 52   TEMP B-TREE FOR
c370: 20 78 78 78 22 0a 2a 2a 0a 2a 2a 20 77 68 65 72   xxx".**.** wher
c380: 65 20 78 78 78 20 69 73 20 6f 6e 65 20 6f 66 20  e xxx is one of 
c390: 22 44 49 53 54 49 4e 43 54 22 2c 20 22 4f 52 44  "DISTINCT", "ORD
c3a0: 45 52 20 42 59 22 20 6f 72 20 22 47 52 4f 55 50  ER BY" or "GROUP
c3b0: 20 42 59 22 2e 20 45 78 61 63 74 6c 79 20 77 68   BY". Exactly wh
c3c0: 69 63 68 0a 2a 2a 20 69 73 20 64 65 74 65 72 6d  ich.** is determ
c3d0: 69 6e 65 64 20 62 79 20 74 68 65 20 7a 55 73 61  ined by the zUsa
c3e0: 67 65 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a  ge argument..*/.
c3f0: 73 74 61 74 69 63 20 76 6f 69 64 20 65 78 70 6c  static void expl
c400: 61 69 6e 54 65 6d 70 54 61 62 6c 65 28 50 61 72  ainTempTable(Par
c410: 73 65 20 2a 70 50 61 72 73 65 2c 20 63 6f 6e 73  se *pParse, cons
c420: 74 20 63 68 61 72 20 2a 7a 55 73 61 67 65 29 7b  t char *zUsage){
c430: 0a 20 20 45 78 70 6c 61 69 6e 51 75 65 72 79 50  .  ExplainQueryP
c440: 6c 61 6e 28 28 70 50 61 72 73 65 2c 20 30 2c 20  lan((pParse, 0, 
c450: 22 55 53 45 20 54 45 4d 50 20 42 2d 54 52 45 45  "USE TEMP B-TREE
c460: 20 46 4f 52 20 25 73 22 2c 20 7a 55 73 61 67 65   FOR %s", zUsage
c470: 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 73 73  ));.}../*.** Ass
c480: 69 67 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 62  ign expression b
c490: 20 74 6f 20 6c 76 61 6c 75 65 20 61 2e 20 41 20   to lvalue a. A 
c4a0: 73 65 63 6f 6e 64 2c 20 6e 6f 2d 6f 70 2c 20 76  second, no-op, v
c4b0: 65 72 73 69 6f 6e 20 6f 66 20 74 68 69 73 20 6d  ersion of this m
c4c0: 61 63 72 6f 0a 2a 2a 20 69 73 20 70 72 6f 76 69  acro.** is provi
c4d0: 64 65 64 20 77 68 65 6e 20 53 51 4c 49 54 45 5f  ded when SQLITE_
c4e0: 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 20 69 73 20  OMIT_EXPLAIN is 
c4f0: 64 65 66 69 6e 65 64 2e 20 54 68 69 73 20 61 6c  defined. This al
c500: 6c 6f 77 73 20 74 68 65 20 63 6f 64 65 0a 2a 2a  lows the code.**
c510: 20 69 6e 20 73 71 6c 69 74 65 33 53 65 6c 65 63   in sqlite3Selec
c520: 74 28 29 20 74 6f 20 61 73 73 69 67 6e 20 76 61  t() to assign va
c530: 6c 75 65 73 20 74 6f 20 73 74 72 75 63 74 75 72  lues to structur
c540: 65 20 6d 65 6d 62 65 72 20 76 61 72 69 61 62 6c  e member variabl
c550: 65 73 20 74 68 61 74 0a 2a 2a 20 6f 6e 6c 79 20  es that.** only 
c560: 65 78 69 73 74 20 69 66 20 53 51 4c 49 54 45 5f  exist if SQLITE_
c570: 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 20 69 73 20  OMIT_EXPLAIN is 
c580: 6e 6f 74 20 64 65 66 69 6e 65 64 20 77 69 74 68  not defined with
c590: 6f 75 74 20 70 6f 6c 6c 75 74 69 6e 67 20 74 68  out polluting th
c5a0: 65 0a 2a 2a 20 63 6f 64 65 20 77 69 74 68 20 23  e.** code with #
c5b0: 69 66 6e 64 65 66 20 64 69 72 65 63 74 69 76 65  ifndef directive
c5c0: 73 2e 0a 2a 2f 0a 23 20 64 65 66 69 6e 65 20 65  s..*/.# define e
c5d0: 78 70 6c 61 69 6e 53 65 74 49 6e 74 65 67 65 72  xplainSetInteger
c5e0: 28 61 2c 20 62 29 20 61 20 3d 20 62 0a 0a 23 65  (a, b) a = b..#e
c5f0: 6c 73 65 0a 2f 2a 20 4e 6f 2d 6f 70 20 76 65 72  lse./* No-op ver
c600: 73 69 6f 6e 73 20 6f 66 20 74 68 65 20 65 78 70  sions of the exp
c610: 6c 61 69 6e 58 58 58 28 29 20 66 75 6e 63 74 69  lainXXX() functi
c620: 6f 6e 73 20 61 6e 64 20 6d 61 63 72 6f 73 2e 20  ons and macros. 
c630: 2a 2f 0a 23 20 64 65 66 69 6e 65 20 65 78 70 6c  */.# define expl
c640: 61 69 6e 54 65 6d 70 54 61 62 6c 65 28 79 2c 7a  ainTempTable(y,z
c650: 29 0a 23 20 64 65 66 69 6e 65 20 65 78 70 6c 61  ).# define expla
c660: 69 6e 53 65 74 49 6e 74 65 67 65 72 28 79 2c 7a  inSetInteger(y,z
c670: 29 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a  ).#endif.../*.**
c680: 20 49 66 20 74 68 65 20 69 6e 6e 65 72 20 6c 6f   If the inner lo
c690: 6f 70 20 77 61 73 20 67 65 6e 65 72 61 74 65 64  op was generated
c6a0: 20 75 73 69 6e 67 20 61 20 6e 6f 6e 2d 6e 75 6c   using a non-nul
c6b0: 6c 20 70 4f 72 64 65 72 42 79 20 61 72 67 75 6d  l pOrderBy argum
c6c0: 65 6e 74 2c 0a 2a 2a 20 74 68 65 6e 20 74 68 65  ent,.** then the
c6d0: 20 72 65 73 75 6c 74 73 20 77 65 72 65 20 70 6c   results were pl
c6e0: 61 63 65 64 20 69 6e 20 61 20 73 6f 72 74 65 72  aced in a sorter
c6f0: 2e 20 20 41 66 74 65 72 20 74 68 65 20 6c 6f 6f  .  After the loo
c700: 70 20 69 73 20 74 65 72 6d 69 6e 61 74 65 64 0a  p is terminated.
c710: 2a 2a 20 77 65 20 6e 65 65 64 20 74 6f 20 72 75  ** we need to ru
c720: 6e 20 74 68 65 20 73 6f 72 74 65 72 20 61 6e 64  n the sorter and
c730: 20 6f 75 74 70 75 74 20 74 68 65 20 72 65 73 75   output the resu
c740: 6c 74 73 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77  lts.  The follow
c750: 69 6e 67 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 67  ing.** routine g
c760: 65 6e 65 72 61 74 65 73 20 74 68 65 20 63 6f 64  enerates the cod
c770: 65 20 6e 65 65 64 65 64 20 74 6f 20 64 6f 20 74  e needed to do t
c780: 68 61 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  hat..*/.static v
c790: 6f 69 64 20 67 65 6e 65 72 61 74 65 53 6f 72 74  oid generateSort
c7a0: 54 61 69 6c 28 0a 20 20 50 61 72 73 65 20 2a 70  Tail(.  Parse *p
c7b0: 50 61 72 73 65 2c 20 20 20 20 2f 2a 20 50 61 72  Parse,    /* Par
c7c0: 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
c7d0: 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20    Select *p,    
c7e0: 20 20 20 20 2f 2a 20 54 68 65 20 53 45 4c 45 43      /* The SELEC
c7f0: 54 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20  T statement */. 
c800: 20 53 6f 72 74 43 74 78 20 2a 70 53 6f 72 74 2c   SortCtx *pSort,
c810: 20 20 20 2f 2a 20 49 6e 66 6f 72 6d 61 74 69 6f     /* Informatio
c820: 6e 20 6f 6e 20 74 68 65 20 4f 52 44 45 52 20 42  n on the ORDER B
c830: 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e  Y clause */.  in
c840: 74 20 6e 43 6f 6c 75 6d 6e 2c 20 20 20 20 20 20  t nColumn,      
c850: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c  /* Number of col
c860: 75 6d 6e 73 20 6f 66 20 64 61 74 61 20 2a 2f 0a  umns of data */.
c870: 20 20 53 65 6c 65 63 74 44 65 73 74 20 2a 70 44    SelectDest *pD
c880: 65 73 74 20 2f 2a 20 57 72 69 74 65 20 74 68 65  est /* Write the
c890: 20 73 6f 72 74 65 64 20 72 65 73 75 6c 74 73 20   sorted results 
c8a0: 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 56 64 62  here */.){.  Vdb
c8b0: 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
c8c0: 56 64 62 65 3b 20 20 20 20 20 20 20 20 20 20 20  Vdbe;           
c8d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
c8e0: 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d   prepared statem
c8f0: 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64  ent */.  int add
c900: 72 42 72 65 61 6b 20 3d 20 70 53 6f 72 74 2d 3e  rBreak = pSort->
c910: 6c 61 62 65 6c 44 6f 6e 65 3b 20 20 20 20 20 20  labelDone;      
c920: 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65        /* Jump he
c930: 72 65 20 74 6f 20 65 78 69 74 20 6c 6f 6f 70 20  re to exit loop 
c940: 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 43 6f 6e  */.  int addrCon
c950: 74 69 6e 75 65 20 3d 20 73 71 6c 69 74 65 33 56  tinue = sqlite3V
c960: 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
c970: 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 66    /* Jump here f
c980: 6f 72 20 6e 65 78 74 20 63 79 63 6c 65 20 2a 2f  or next cycle */
c990: 0a 20 20 69 6e 74 20 61 64 64 72 3b 20 20 20 20  .  int addr;    
c9a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c9b0: 20 20 20 2f 2a 20 54 6f 70 20 6f 66 20 6f 75 74     /* Top of out
c9c0: 70 75 74 20 6c 6f 6f 70 2e 20 4a 75 6d 70 20 66  put loop. Jump f
c9d0: 6f 72 20 4e 65 78 74 2e 20 2a 2f 0a 20 20 69 6e  or Next. */.  in
c9e0: 74 20 61 64 64 72 4f 6e 63 65 20 3d 20 30 3b 0a  t addrOnce = 0;.
c9f0: 20 20 69 6e 74 20 69 54 61 62 3b 0a 20 20 45 78    int iTab;.  Ex
ca00: 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79  prList *pOrderBy
ca10: 20 3d 20 70 53 6f 72 74 2d 3e 70 4f 72 64 65 72   = pSort->pOrder
ca20: 42 79 3b 0a 20 20 69 6e 74 20 65 44 65 73 74 20  By;.  int eDest 
ca30: 3d 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3b 0a  = pDest->eDest;.
ca40: 20 20 69 6e 74 20 69 50 61 72 6d 20 3d 20 70 44    int iParm = pD
ca50: 65 73 74 2d 3e 69 53 44 50 61 72 6d 3b 0a 20 20  est->iSDParm;.  
ca60: 69 6e 74 20 72 65 67 52 6f 77 3b 0a 20 20 69 6e  int regRow;.  in
ca70: 74 20 72 65 67 52 6f 77 69 64 3b 0a 20 20 69 6e  t regRowid;.  in
ca80: 74 20 69 43 6f 6c 3b 0a 20 20 69 6e 74 20 6e 4b  t iCol;.  int nK
ca90: 65 79 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ey;             
caa0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
cab0: 62 65 72 20 6f 66 20 6b 65 79 20 63 6f 6c 75 6d  ber of key colum
cac0: 6e 73 20 69 6e 20 73 6f 72 74 65 72 20 72 65 63  ns in sorter rec
cad0: 6f 72 64 20 2a 2f 0a 20 20 69 6e 74 20 69 53 6f  ord */.  int iSo
cae0: 72 74 54 61 62 3b 20 20 20 20 20 20 20 20 20 20  rtTab;          
caf0: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 6f 72 74           /* Sort
cb00: 65 72 20 63 75 72 73 6f 72 20 74 6f 20 72 65 61  er cursor to rea
cb10: 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20  d from */.  int 
cb20: 69 3b 0a 20 20 69 6e 74 20 62 53 65 71 3b 20 20  i;.  int bSeq;  
cb30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cb40: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
cb50: 73 6f 72 74 65 72 20 72 65 63 6f 72 64 20 69 6e  sorter record in
cb60: 63 6c 75 64 65 73 20 73 65 71 2e 20 6e 6f 2e 20  cludes seq. no. 
cb70: 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 66 4b 65 79  */.  int nRefKey
cb80: 20 3d 20 30 3b 0a 20 20 73 74 72 75 63 74 20 45   = 0;.  struct E
cb90: 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 61 4f  xprList_item *aO
cba0: 75 74 45 78 20 3d 20 70 2d 3e 70 45 4c 69 73 74  utEx = p->pEList
cbb0: 2d 3e 61 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  ->a;..  assert( 
cbc0: 61 64 64 72 42 72 65 61 6b 3c 30 20 29 3b 0a 20  addrBreak<0 );. 
cbd0: 20 69 66 28 20 70 53 6f 72 74 2d 3e 6c 61 62 65   if( pSort->labe
cbe0: 6c 42 6b 4f 75 74 20 29 7b 0a 20 20 20 20 73 71  lBkOut ){.    sq
cbf0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
cc00: 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 70 53 6f  v, OP_Gosub, pSo
cc10: 72 74 2d 3e 72 65 67 52 65 74 75 72 6e 2c 20 70  rt->regReturn, p
cc20: 53 6f 72 74 2d 3e 6c 61 62 65 6c 42 6b 4f 75 74  Sort->labelBkOut
cc30: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
cc40: 62 65 47 6f 74 6f 28 76 2c 20 61 64 64 72 42 72  beGoto(v, addrBr
cc50: 65 61 6b 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  eak);.    sqlite
cc60: 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
cc70: 6c 28 76 2c 20 70 53 6f 72 74 2d 3e 6c 61 62 65  l(v, pSort->labe
cc80: 6c 42 6b 4f 75 74 29 3b 0a 20 20 7d 0a 0a 23 69  lBkOut);.  }..#i
cc90: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
cca0: 4c 45 5f 53 4f 52 54 45 52 5f 52 45 46 45 52 45  LE_SORTER_REFERE
ccb0: 4e 43 45 53 0a 20 20 2f 2a 20 4f 70 65 6e 20 61  NCES.  /* Open a
ccc0: 6e 79 20 63 75 72 73 6f 72 73 20 6e 65 65 64 65  ny cursors neede
ccd0: 64 20 66 6f 72 20 73 6f 72 74 65 72 2d 72 65 66  d for sorter-ref
cce0: 65 72 65 6e 63 65 20 65 78 70 72 65 73 73 69 6f  erence expressio
ccf0: 6e 73 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b  ns */.  for(i=0;
cd00: 20 69 3c 70 53 6f 72 74 2d 3e 6e 44 65 66 65 72   i<pSort->nDefer
cd10: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 54 61 62 6c  ; i++){.    Tabl
cd20: 65 20 2a 70 54 61 62 20 3d 20 70 53 6f 72 74 2d  e *pTab = pSort-
cd30: 3e 61 44 65 66 65 72 5b 69 5d 2e 70 54 61 62 3b  >aDefer[i].pTab;
cd40: 0a 20 20 20 20 69 6e 74 20 69 44 62 20 3d 20 73  .    int iDb = s
cd50: 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e  qlite3SchemaToIn
cd60: 64 65 78 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  dex(pParse->db, 
cd70: 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a  pTab->pSchema);.
cd80: 20 20 20 20 73 71 6c 69 74 65 33 4f 70 65 6e 54      sqlite3OpenT
cd90: 61 62 6c 65 28 70 50 61 72 73 65 2c 20 70 53 6f  able(pParse, pSo
cda0: 72 74 2d 3e 61 44 65 66 65 72 5b 69 5d 2e 69 43  rt->aDefer[i].iC
cdb0: 73 72 2c 20 69 44 62 2c 20 70 54 61 62 2c 20 4f  sr, iDb, pTab, O
cdc0: 50 5f 4f 70 65 6e 52 65 61 64 29 3b 0a 20 20 20  P_OpenRead);.   
cdd0: 20 6e 52 65 66 4b 65 79 20 3d 20 4d 41 58 28 6e   nRefKey = MAX(n
cde0: 52 65 66 4b 65 79 2c 20 70 53 6f 72 74 2d 3e 61  RefKey, pSort->a
cdf0: 44 65 66 65 72 5b 69 5d 2e 6e 4b 65 79 29 3b 0a  Defer[i].nKey);.
ce00: 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 69 54    }.#endif..  iT
ce10: 61 62 20 3d 20 70 53 6f 72 74 2d 3e 69 45 43 75  ab = pSort->iECu
ce20: 72 73 6f 72 3b 0a 20 20 69 66 28 20 65 44 65 73  rsor;.  if( eDes
ce30: 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20 7c 7c  t==SRT_Output ||
ce40: 20 65 44 65 73 74 3d 3d 53 52 54 5f 43 6f 72 6f   eDest==SRT_Coro
ce50: 75 74 69 6e 65 20 7c 7c 20 65 44 65 73 74 3d 3d  utine || eDest==
ce60: 53 52 54 5f 4d 65 6d 20 29 7b 0a 20 20 20 20 72  SRT_Mem ){.    r
ce70: 65 67 52 6f 77 69 64 20 3d 20 30 3b 0a 20 20 20  egRowid = 0;.   
ce80: 20 72 65 67 52 6f 77 20 3d 20 70 44 65 73 74 2d   regRow = pDest-
ce90: 3e 69 53 64 73 74 3b 0a 20 20 7d 65 6c 73 65 7b  >iSdst;.  }else{
cea0: 0a 20 20 20 20 72 65 67 52 6f 77 69 64 20 3d 20  .    regRowid = 
ceb0: 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65  sqlite3GetTempRe
cec0: 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 72  g(pParse);.    r
ced0: 65 67 52 6f 77 20 3d 20 73 71 6c 69 74 65 33 47  egRow = sqlite3G
cee0: 65 74 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72  etTempRange(pPar
cef0: 73 65 2c 20 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20  se, nColumn);.  
cf00: 7d 0a 20 20 6e 4b 65 79 20 3d 20 70 4f 72 64 65  }.  nKey = pOrde
cf10: 72 42 79 2d 3e 6e 45 78 70 72 20 2d 20 70 53 6f  rBy->nExpr - pSo
cf20: 72 74 2d 3e 6e 4f 42 53 61 74 3b 0a 20 20 69 66  rt->nOBSat;.  if
cf30: 28 20 70 53 6f 72 74 2d 3e 73 6f 72 74 46 6c 61  ( pSort->sortFla
cf40: 67 73 20 26 20 53 4f 52 54 46 4c 41 47 5f 55 73  gs & SORTFLAG_Us
cf50: 65 53 6f 72 74 65 72 20 29 7b 0a 20 20 20 20 69  eSorter ){.    i
cf60: 6e 74 20 72 65 67 53 6f 72 74 4f 75 74 20 3d 20  nt regSortOut = 
cf70: 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
cf80: 20 20 20 20 69 53 6f 72 74 54 61 62 20 3d 20 70      iSortTab = p
cf90: 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20  Parse->nTab++;. 
cfa0: 20 20 20 69 66 28 20 70 53 6f 72 74 2d 3e 6c 61     if( pSort->la
cfb0: 62 65 6c 42 6b 4f 75 74 20 29 7b 0a 20 20 20 20  belBkOut ){.    
cfc0: 20 20 61 64 64 72 4f 6e 63 65 20 3d 20 73 71 6c    addrOnce = sql
cfd0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 30 28 76  ite3VdbeAddOp0(v
cfe0: 2c 20 4f 50 5f 4f 6e 63 65 29 3b 20 56 64 62 65  , OP_Once); Vdbe
cff0: 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
d000: 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64   }.    sqlite3Vd
d010: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4f  beAddOp3(v, OP_O
d020: 70 65 6e 50 73 65 75 64 6f 2c 20 69 53 6f 72 74  penPseudo, iSort
d030: 54 61 62 2c 20 72 65 67 53 6f 72 74 4f 75 74 2c  Tab, regSortOut,
d040: 20 0a 20 20 20 20 20 20 20 20 6e 4b 65 79 2b 31   .        nKey+1
d050: 2b 6e 43 6f 6c 75 6d 6e 2b 6e 52 65 66 4b 65 79  +nColumn+nRefKey
d060: 29 3b 0a 20 20 20 20 69 66 28 20 61 64 64 72 4f  );.    if( addrO
d070: 6e 63 65 20 29 20 73 71 6c 69 74 65 33 56 64 62  nce ) sqlite3Vdb
d080: 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64  eJumpHere(v, add
d090: 72 4f 6e 63 65 29 3b 0a 20 20 20 20 61 64 64 72  rOnce);.    addr
d0a0: 20 3d 20 31 20 2b 20 73 71 6c 69 74 65 33 56 64   = 1 + sqlite3Vd
d0b0: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53  beAddOp2(v, OP_S
d0c0: 6f 72 74 65 72 53 6f 72 74 2c 20 69 54 61 62 2c  orterSort, iTab,
d0d0: 20 61 64 64 72 42 72 65 61 6b 29 3b 0a 20 20 20   addrBreak);.   
d0e0: 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
d0f0: 3b 0a 20 20 20 20 63 6f 64 65 4f 66 66 73 65 74  ;.    codeOffset
d100: 28 76 2c 20 70 2d 3e 69 4f 66 66 73 65 74 2c 20  (v, p->iOffset, 
d110: 61 64 64 72 43 6f 6e 74 69 6e 75 65 29 3b 0a 20  addrContinue);. 
d120: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
d130: 64 4f 70 33 28 76 2c 20 4f 50 5f 53 6f 72 74 65  dOp3(v, OP_Sorte
d140: 72 44 61 74 61 2c 20 69 54 61 62 2c 20 72 65 67  rData, iTab, reg
d150: 53 6f 72 74 4f 75 74 2c 20 69 53 6f 72 74 54 61  SortOut, iSortTa
d160: 62 29 3b 0a 20 20 20 20 62 53 65 71 20 3d 20 30  b);.    bSeq = 0
d170: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61  ;.  }else{.    a
d180: 64 64 72 20 3d 20 31 20 2b 20 73 71 6c 69 74 65  ddr = 1 + sqlite
d190: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
d1a0: 50 5f 53 6f 72 74 2c 20 69 54 61 62 2c 20 61 64  P_Sort, iTab, ad
d1b0: 64 72 42 72 65 61 6b 29 3b 20 56 64 62 65 43 6f  drBreak); VdbeCo
d1c0: 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 63  verage(v);.    c
d1d0: 6f 64 65 4f 66 66 73 65 74 28 76 2c 20 70 2d 3e  odeOffset(v, p->
d1e0: 69 4f 66 66 73 65 74 2c 20 61 64 64 72 43 6f 6e  iOffset, addrCon
d1f0: 74 69 6e 75 65 29 3b 0a 20 20 20 20 69 53 6f 72  tinue);.    iSor
d200: 74 54 61 62 20 3d 20 69 54 61 62 3b 0a 20 20 20  tTab = iTab;.   
d210: 20 62 53 65 71 20 3d 20 31 3b 0a 20 20 7d 0a 20   bSeq = 1;.  }. 
d220: 20 66 6f 72 28 69 3d 30 2c 20 69 43 6f 6c 3d 6e   for(i=0, iCol=n
d230: 4b 65 79 2b 62 53 65 71 2d 31 3b 20 69 3c 6e 43  Key+bSeq-1; i<nC
d240: 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 23 69 66  olumn; i++){.#if
d250: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
d260: 45 5f 53 4f 52 54 45 52 5f 52 45 46 45 52 45 4e  E_SORTER_REFEREN
d270: 43 45 53 0a 20 20 20 20 69 66 28 20 61 4f 75 74  CES.    if( aOut
d280: 45 78 5b 69 5d 2e 62 53 6f 72 74 65 72 52 65 66  Ex[i].bSorterRef
d290: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 23 65 6e   ) continue;.#en
d2a0: 64 69 66 0a 20 20 20 20 69 66 28 20 61 4f 75 74  dif.    if( aOut
d2b0: 45 78 5b 69 5d 2e 75 2e 78 2e 69 4f 72 64 65 72  Ex[i].u.x.iOrder
d2c0: 42 79 43 6f 6c 3d 3d 30 20 29 20 69 43 6f 6c 2b  ByCol==0 ) iCol+
d2d0: 2b 3b 0a 20 20 7d 0a 23 69 66 64 65 66 20 53 51  +;.  }.#ifdef SQ
d2e0: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 4f 52 54  LITE_ENABLE_SORT
d2f0: 45 52 5f 52 45 46 45 52 45 4e 43 45 53 0a 20 20  ER_REFERENCES.  
d300: 69 66 28 20 70 53 6f 72 74 2d 3e 6e 44 65 66 65  if( pSort->nDefe
d310: 72 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 4b 65  r ){.    int iKe
d320: 79 20 3d 20 69 43 6f 6c 2b 31 3b 0a 20 20 20 20  y = iCol+1;.    
d330: 69 6e 74 20 72 65 67 4b 65 79 20 3d 20 73 71 6c  int regKey = sql
d340: 69 74 65 33 47 65 74 54 65 6d 70 52 61 6e 67 65  ite3GetTempRange
d350: 28 70 50 61 72 73 65 2c 20 6e 52 65 66 4b 65 79  (pParse, nRefKey
d360: 29 3b 0a 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  );..    for(i=0;
d370: 20 69 3c 70 53 6f 72 74 2d 3e 6e 44 65 66 65 72   i<pSort->nDefer
d380: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e  ; i++){.      in
d390: 74 20 69 43 73 72 20 3d 20 70 53 6f 72 74 2d 3e  t iCsr = pSort->
d3a0: 61 44 65 66 65 72 5b 69 5d 2e 69 43 73 72 3b 0a  aDefer[i].iCsr;.
d3b0: 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61        Table *pTa
d3c0: 62 20 3d 20 70 53 6f 72 74 2d 3e 61 44 65 66 65  b = pSort->aDefe
d3d0: 72 5b 69 5d 2e 70 54 61 62 3b 0a 20 20 20 20 20  r[i].pTab;.     
d3e0: 20 69 6e 74 20 6e 4b 65 79 20 3d 20 70 53 6f 72   int nKey = pSor
d3f0: 74 2d 3e 61 44 65 66 65 72 5b 69 5d 2e 6e 4b 65  t->aDefer[i].nKe
d400: 79 3b 0a 0a 20 20 20 20 20 20 73 71 6c 69 74 65  y;..      sqlite
d410: 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
d420: 50 5f 4e 75 6c 6c 52 6f 77 2c 20 69 43 73 72 29  P_NullRow, iCsr)
d430: 3b 0a 20 20 20 20 20 20 69 66 28 20 48 61 73 52  ;.      if( HasR
d440: 6f 77 69 64 28 70 54 61 62 29 20 29 7b 0a 20 20  owid(pTab) ){.  
d450: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
d460: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f  eAddOp3(v, OP_Co
d470: 6c 75 6d 6e 2c 20 69 53 6f 72 74 54 61 62 2c 20  lumn, iSortTab, 
d480: 69 4b 65 79 2b 2b 2c 20 72 65 67 4b 65 79 29 3b  iKey++, regKey);
d490: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
d4a0: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
d4b0: 5f 53 65 65 6b 52 6f 77 69 64 2c 20 69 43 73 72  _SeekRowid, iCsr
d4c0: 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  , .            s
d4d0: 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
d4e0: 74 41 64 64 72 28 76 29 2b 31 2c 20 72 65 67 4b  tAddr(v)+1, regK
d4f0: 65 79 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ey);.      }else
d500: 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6b 3b  {.        int k;
d510: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 4a 6d  .        int iJm
d520: 70 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  p;.        asser
d530: 74 28 20 73 71 6c 69 74 65 33 50 72 69 6d 61 72  t( sqlite3Primar
d540: 79 4b 65 79 49 6e 64 65 78 28 70 54 61 62 29 2d  yKeyIndex(pTab)-
d550: 3e 6e 4b 65 79 43 6f 6c 3d 3d 6e 4b 65 79 20 29  >nKeyCol==nKey )
d560: 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 6b 3d  ;.        for(k=
d570: 30 3b 20 6b 3c 6e 4b 65 79 3b 20 6b 2b 2b 29 7b  0; k<nKey; k++){
d580: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
d590: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
d5a0: 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69 53 6f 72 74  OP_Column, iSort
d5b0: 54 61 62 2c 20 69 4b 65 79 2b 2b 2c 20 72 65 67  Tab, iKey++, reg
d5c0: 4b 65 79 2b 6b 29 3b 0a 20 20 20 20 20 20 20 20  Key+k);.        
d5d0: 7d 0a 20 20 20 20 20 20 20 20 69 4a 6d 70 20 3d  }.        iJmp =
d5e0: 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
d5f0: 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20  entAddr(v);.    
d600: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
d610: 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 53  ddOp4Int(v, OP_S
d620: 65 65 6b 47 45 2c 20 69 43 73 72 2c 20 69 4a 6d  eekGE, iCsr, iJm
d630: 70 2b 32 2c 20 72 65 67 4b 65 79 2c 20 6e 4b 65  p+2, regKey, nKe
d640: 79 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  y);.        sqli
d650: 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74  te3VdbeAddOp4Int
d660: 28 76 2c 20 4f 50 5f 49 64 78 4c 45 2c 20 69 43  (v, OP_IdxLE, iC
d670: 73 72 2c 20 69 4a 6d 70 2b 33 2c 20 72 65 67 4b  sr, iJmp+3, regK
d680: 65 79 2c 20 6e 4b 65 79 29 3b 0a 20 20 20 20 20  ey, nKey);.     
d690: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
d6a0: 64 4f 70 31 28 76 2c 20 4f 50 5f 4e 75 6c 6c 52  dOp1(v, OP_NullR
d6b0: 6f 77 2c 20 69 43 73 72 29 3b 0a 20 20 20 20 20  ow, iCsr);.     
d6c0: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c   }.    }.    sql
d6d0: 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
d6e0: 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72 65 67  ange(pParse, reg
d6f0: 4b 65 79 2c 20 6e 52 65 66 4b 65 79 29 3b 0a 20  Key, nRefKey);. 
d700: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 66 6f 72 28   }.#endif.  for(
d710: 69 3d 6e 43 6f 6c 75 6d 6e 2d 31 3b 20 69 3e 3d  i=nColumn-1; i>=
d720: 30 3b 20 69 2d 2d 29 7b 0a 23 69 66 64 65 66 20  0; i--){.#ifdef 
d730: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 4f  SQLITE_ENABLE_SO
d740: 52 54 45 52 5f 52 45 46 45 52 45 4e 43 45 53 0a  RTER_REFERENCES.
d750: 20 20 20 20 69 66 28 20 61 4f 75 74 45 78 5b 69      if( aOutEx[i
d760: 5d 2e 62 53 6f 72 74 65 72 52 65 66 20 29 7b 0a  ].bSorterRef ){.
d770: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
d780: 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 61 4f  rCode(pParse, aO
d790: 75 74 45 78 5b 69 5d 2e 70 45 78 70 72 2c 20 72  utEx[i].pExpr, r
d7a0: 65 67 52 6f 77 2b 69 29 3b 0a 20 20 20 20 7d 65  egRow+i);.    }e
d7b0: 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 20 20 7b  lse.#endif.    {
d7c0: 0a 20 20 20 20 20 20 69 6e 74 20 69 52 65 61 64  .      int iRead
d7d0: 3b 0a 20 20 20 20 20 20 69 66 28 20 61 4f 75 74  ;.      if( aOut
d7e0: 45 78 5b 69 5d 2e 75 2e 78 2e 69 4f 72 64 65 72  Ex[i].u.x.iOrder
d7f0: 42 79 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20 20  ByCol ){.       
d800: 20 69 52 65 61 64 20 3d 20 61 4f 75 74 45 78 5b   iRead = aOutEx[
d810: 69 5d 2e 75 2e 78 2e 69 4f 72 64 65 72 42 79 43  i].u.x.iOrderByC
d820: 6f 6c 2d 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73  ol-1;.      }els
d830: 65 7b 0a 20 20 20 20 20 20 20 20 69 52 65 61 64  e{.        iRead
d840: 20 3d 20 69 43 6f 6c 2d 2d 3b 0a 20 20 20 20 20   = iCol--;.     
d850: 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
d860: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
d870: 5f 43 6f 6c 75 6d 6e 2c 20 69 53 6f 72 74 54 61  _Column, iSortTa
d880: 62 2c 20 69 52 65 61 64 2c 20 72 65 67 52 6f 77  b, iRead, regRow
d890: 2b 69 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  +i);.      VdbeC
d8a0: 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 25 73 22 2c  omment((v, "%s",
d8b0: 20 61 4f 75 74 45 78 5b 69 5d 2e 7a 4e 61 6d 65   aOutEx[i].zName
d8c0: 3f 61 4f 75 74 45 78 5b 69 5d 2e 7a 4e 61 6d 65  ?aOutEx[i].zName
d8d0: 20 3a 20 61 4f 75 74 45 78 5b 69 5d 2e 7a 53 70   : aOutEx[i].zSp
d8e0: 61 6e 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  an));.    }.  }.
d8f0: 20 20 73 77 69 74 63 68 28 20 65 44 65 73 74 20    switch( eDest 
d900: 29 7b 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f  ){.    case SRT_
d910: 54 61 62 6c 65 3a 0a 20 20 20 20 63 61 73 65 20  Table:.    case 
d920: 53 52 54 5f 45 70 68 65 6d 54 61 62 3a 20 7b 0a  SRT_EphemTab: {.
d930: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
d940: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65  eAddOp2(v, OP_Ne
d950: 77 52 6f 77 69 64 2c 20 69 50 61 72 6d 2c 20 72  wRowid, iParm, r
d960: 65 67 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20  egRowid);.      
d970: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
d980: 33 28 76 2c 20 4f 50 5f 49 6e 73 65 72 74 2c 20  3(v, OP_Insert, 
d990: 69 50 61 72 6d 2c 20 72 65 67 52 6f 77 2c 20 72  iParm, regRow, r
d9a0: 65 67 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20  egRowid);.      
d9b0: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
d9c0: 65 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f 41 50  eP5(v, OPFLAG_AP
d9d0: 50 45 4e 44 29 3b 0a 20 20 20 20 20 20 62 72 65  PEND);.      bre
d9e0: 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65  ak;.    }.#ifnde
d9f0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  f SQLITE_OMIT_SU
da00: 42 51 55 45 52 59 0a 20 20 20 20 63 61 73 65 20  BQUERY.    case 
da10: 53 52 54 5f 53 65 74 3a 20 7b 0a 20 20 20 20 20  SRT_Set: {.     
da20: 20 61 73 73 65 72 74 28 20 6e 43 6f 6c 75 6d 6e   assert( nColumn
da30: 3d 3d 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  ==sqlite3Strlen3
da40: 30 28 70 44 65 73 74 2d 3e 7a 41 66 66 53 64 73  0(pDest->zAffSds
da50: 74 29 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  t) );.      sqli
da60: 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
da70: 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20   OP_MakeRecord, 
da80: 72 65 67 52 6f 77 2c 20 6e 43 6f 6c 75 6d 6e 2c  regRow, nColumn,
da90: 20 72 65 67 52 6f 77 69 64 2c 0a 20 20 20 20 20   regRowid,.     
daa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dab0: 20 20 20 70 44 65 73 74 2d 3e 7a 41 66 66 53 64     pDest->zAffSd
dac0: 73 74 2c 20 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20  st, nColumn);.  
dad0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
dae0: 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 49  ddOp4Int(v, OP_I
daf0: 64 78 49 6e 73 65 72 74 2c 20 69 50 61 72 6d 2c  dxInsert, iParm,
db00: 20 72 65 67 52 6f 77 69 64 2c 20 72 65 67 52 6f   regRowid, regRo
db10: 77 2c 20 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20  w, nColumn);.   
db20: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
db30: 20 20 20 20 63 61 73 65 20 53 52 54 5f 4d 65 6d      case SRT_Mem
db40: 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65  : {.      /* The
db50: 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 20 77 69   LIMIT clause wi
db60: 6c 6c 20 74 65 72 6d 69 6e 61 74 65 20 74 68 65  ll terminate the
db70: 20 6c 6f 6f 70 20 66 6f 72 20 75 73 20 2a 2f 0a   loop for us */.
db80: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
db90: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 64 65   }.#endif.    de
dba0: 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 61  fault: {.      a
dbb0: 73 73 65 72 74 28 20 65 44 65 73 74 3d 3d 53 52  ssert( eDest==SR
dbc0: 54 5f 4f 75 74 70 75 74 20 7c 7c 20 65 44 65 73  T_Output || eDes
dbd0: 74 3d 3d 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65  t==SRT_Coroutine
dbe0: 20 29 3b 20 0a 20 20 20 20 20 20 74 65 73 74 63   ); .      testc
dbf0: 61 73 65 28 20 65 44 65 73 74 3d 3d 53 52 54 5f  ase( eDest==SRT_
dc00: 4f 75 74 70 75 74 20 29 3b 0a 20 20 20 20 20 20  Output );.      
dc10: 74 65 73 74 63 61 73 65 28 20 65 44 65 73 74 3d  testcase( eDest=
dc20: 3d 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 20 29  =SRT_Coroutine )
dc30: 3b 0a 20 20 20 20 20 20 69 66 28 20 65 44 65 73  ;.      if( eDes
dc40: 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20 29 7b  t==SRT_Output ){
dc50: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
dc60: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
dc70: 5f 52 65 73 75 6c 74 52 6f 77 2c 20 70 44 65 73  _ResultRow, pDes
dc80: 74 2d 3e 69 53 64 73 74 2c 20 6e 43 6f 6c 75 6d  t->iSdst, nColum
dc90: 6e 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  n);.      }else{
dca0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
dcb0: 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
dcc0: 5f 59 69 65 6c 64 2c 20 70 44 65 73 74 2d 3e 69  _Yield, pDest->i
dcd0: 53 44 50 61 72 6d 29 3b 0a 20 20 20 20 20 20 7d  SDParm);.      }
dce0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
dcf0: 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 72 65    }.  }.  if( re
dd00: 67 52 6f 77 69 64 20 29 7b 0a 20 20 20 20 69 66  gRowid ){.    if
dd10: 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 53 65 74  ( eDest==SRT_Set
dd20: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
dd30: 33 52 65 6c 65 61 73 65 54 65 6d 70 52 61 6e 67  3ReleaseTempRang
dd40: 65 28 70 50 61 72 73 65 2c 20 72 65 67 52 6f 77  e(pParse, regRow
dd50: 2c 20 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20  , nColumn);.    
dd60: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c  }else{.      sql
dd70: 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
dd80: 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 52 6f  eg(pParse, regRo
dd90: 77 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  w);.    }.    sq
dda0: 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
ddb0: 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 52  Reg(pParse, regR
ddc0: 6f 77 69 64 29 3b 0a 20 20 7d 0a 20 20 2f 2a 20  owid);.  }.  /* 
ddd0: 54 68 65 20 62 6f 74 74 6f 6d 20 6f 66 20 74 68  The bottom of th
dde0: 65 20 6c 6f 6f 70 0a 20 20 2a 2f 0a 20 20 73 71  e loop.  */.  sq
ddf0: 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
de00: 4c 61 62 65 6c 28 76 2c 20 61 64 64 72 43 6f 6e  Label(v, addrCon
de10: 74 69 6e 75 65 29 3b 0a 20 20 69 66 28 20 70 53  tinue);.  if( pS
de20: 6f 72 74 2d 3e 73 6f 72 74 46 6c 61 67 73 20 26  ort->sortFlags &
de30: 20 53 4f 52 54 46 4c 41 47 5f 55 73 65 53 6f 72   SORTFLAG_UseSor
de40: 74 65 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ter ){.    sqlit
de50: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
de60: 4f 50 5f 53 6f 72 74 65 72 4e 65 78 74 2c 20 69  OP_SorterNext, i
de70: 54 61 62 2c 20 61 64 64 72 29 3b 20 56 64 62 65  Tab, addr); Vdbe
de80: 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 7d  Coverage(v);.  }
de90: 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65  else{.    sqlite
dea0: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
deb0: 50 5f 4e 65 78 74 2c 20 69 54 61 62 2c 20 61 64  P_Next, iTab, ad
dec0: 64 72 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  dr); VdbeCoverag
ded0: 65 28 76 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  e(v);.  }.  if( 
dee0: 70 53 6f 72 74 2d 3e 72 65 67 52 65 74 75 72 6e  pSort->regReturn
def0: 20 29 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   ) sqlite3VdbeAd
df00: 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 74 75 72  dOp1(v, OP_Retur
df10: 6e 2c 20 70 53 6f 72 74 2d 3e 72 65 67 52 65 74  n, pSort->regRet
df20: 75 72 6e 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  urn);.  sqlite3V
df30: 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
df40: 76 2c 20 61 64 64 72 42 72 65 61 6b 29 3b 0a 7d  v, addrBreak);.}
df50: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61  ../*.** Return a
df60: 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 73 74   pointer to a st
df70: 72 69 6e 67 20 63 6f 6e 74 61 69 6e 69 6e 67 20  ring containing 
df80: 74 68 65 20 27 64 65 63 6c 61 72 61 74 69 6f 6e  the 'declaration
df90: 20 74 79 70 65 27 20 6f 66 20 74 68 65 0a 2a 2a   type' of the.**
dfa0: 20 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70   expression pExp
dfb0: 72 2e 20 54 68 65 20 73 74 72 69 6e 67 20 6d 61  r. The string ma
dfc0: 79 20 62 65 20 74 72 65 61 74 65 64 20 61 73 20  y be treated as 
dfd0: 73 74 61 74 69 63 20 62 79 20 74 68 65 20 63 61  static by the ca
dfe0: 6c 6c 65 72 2e 0a 2a 2a 0a 2a 2a 20 41 6c 73 6f  ller..**.** Also
dff0: 20 74 72 79 20 74 6f 20 65 73 74 69 6d 61 74 65   try to estimate
e000: 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
e010: 20 72 65 74 75 72 6e 65 64 20 76 61 6c 75 65 20   returned value 
e020: 61 6e 64 20 72 65 74 75 72 6e 20 74 68 61 74 0a  and return that.
e030: 2a 2a 20 72 65 73 75 6c 74 20 69 6e 20 2a 70 45  ** result in *pE
e040: 73 74 57 69 64 74 68 2e 0a 2a 2a 0a 2a 2a 20 54  stWidth..**.** T
e050: 68 65 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 74  he declaration t
e060: 79 70 65 20 69 73 20 74 68 65 20 65 78 61 63 74  ype is the exact
e070: 20 64 61 74 61 74 79 70 65 20 64 65 66 69 6e 69   datatype defini
e080: 74 69 6f 6e 20 65 78 74 72 61 63 74 65 64 20 66  tion extracted f
e090: 72 6f 6d 20 74 68 65 0a 2a 2a 20 6f 72 69 67 69  rom the.** origi
e0a0: 6e 61 6c 20 43 52 45 41 54 45 20 54 41 42 4c 45  nal CREATE TABLE
e0b0: 20 73 74 61 74 65 6d 65 6e 74 20 69 66 20 74 68   statement if th
e0c0: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  e expression is 
e0d0: 61 20 63 6f 6c 75 6d 6e 2e 20 54 68 65 0a 2a 2a  a column. The.**
e0e0: 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 74 79 70   declaration typ
e0f0: 65 20 66 6f 72 20 61 20 52 4f 57 49 44 20 66 69  e for a ROWID fi
e100: 65 6c 64 20 69 73 20 49 4e 54 45 47 45 52 2e 20  eld is INTEGER. 
e110: 45 78 61 63 74 6c 79 20 77 68 65 6e 20 61 6e 20  Exactly when an 
e120: 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 69 73  expression.** is
e130: 20 63 6f 6e 73 69 64 65 72 65 64 20 61 20 63 6f   considered a co
e140: 6c 75 6d 6e 20 63 61 6e 20 62 65 20 63 6f 6d 70  lumn can be comp
e150: 6c 65 78 20 69 6e 20 74 68 65 20 70 72 65 73 65  lex in the prese
e160: 6e 63 65 20 6f 66 20 73 75 62 71 75 65 72 69 65  nce of subquerie
e170: 73 2e 20 54 68 65 0a 2a 2a 20 72 65 73 75 6c 74  s. The.** result
e180: 2d 73 65 74 20 65 78 70 72 65 73 73 69 6f 6e 20  -set expression 
e190: 69 6e 20 61 6c 6c 20 6f 66 20 74 68 65 20 66 6f  in all of the fo
e1a0: 6c 6c 6f 77 69 6e 67 20 53 45 4c 45 43 54 20 73  llowing SELECT s
e1b0: 74 61 74 65 6d 65 6e 74 73 20 69 73 20 0a 2a 2a  tatements is .**
e1c0: 20 63 6f 6e 73 69 64 65 72 65 64 20 61 20 63 6f   considered a co
e1d0: 6c 75 6d 6e 20 62 79 20 74 68 69 73 20 66 75 6e  lumn by this fun
e1e0: 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 53  ction..**.**   S
e1f0: 45 4c 45 43 54 20 63 6f 6c 20 46 52 4f 4d 20 74  ELECT col FROM t
e200: 62 6c 3b 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20  bl;.**   SELECT 
e210: 28 53 45 4c 45 43 54 20 63 6f 6c 20 46 52 4f 4d  (SELECT col FROM
e220: 20 74 62 6c 3b 0a 2a 2a 20 20 20 53 45 4c 45 43   tbl;.**   SELEC
e230: 54 20 28 53 45 4c 45 43 54 20 63 6f 6c 20 46 52  T (SELECT col FR
e240: 4f 4d 20 74 62 6c 29 3b 0a 2a 2a 20 20 20 53 45  OM tbl);.**   SE
e250: 4c 45 43 54 20 61 62 63 20 46 52 4f 4d 20 28 53  LECT abc FROM (S
e260: 45 4c 45 43 54 20 63 6f 6c 20 41 53 20 61 62 63  ELECT col AS abc
e270: 20 46 52 4f 4d 20 74 62 6c 29 3b 0a 2a 2a 20 0a   FROM tbl);.** .
e280: 2a 2a 20 54 68 65 20 64 65 63 6c 61 72 61 74 69  ** The declarati
e290: 6f 6e 20 74 79 70 65 20 66 6f 72 20 61 6e 79 20  on type for any 
e2a0: 65 78 70 72 65 73 73 69 6f 6e 20 6f 74 68 65 72  expression other
e2b0: 20 74 68 61 6e 20 61 20 63 6f 6c 75 6d 6e 20 69   than a column i
e2c0: 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68  s NULL..**.** Th
e2d0: 69 73 20 72 6f 75 74 69 6e 65 20 68 61 73 20 65  is routine has e
e2e0: 69 74 68 65 72 20 33 20 6f 72 20 36 20 70 61 72  ither 3 or 6 par
e2f0: 61 6d 65 74 65 72 73 20 64 65 70 65 6e 64 69 6e  ameters dependin
e300: 67 20 6f 6e 20 77 68 65 74 68 65 72 20 6f 72 20  g on whether or 
e310: 6e 6f 74 0a 2a 2a 20 74 68 65 20 53 51 4c 49 54  not.** the SQLIT
e320: 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f  E_ENABLE_COLUMN_
e330: 4d 45 54 41 44 41 54 41 20 63 6f 6d 70 69 6c 65  METADATA compile
e340: 2d 74 69 6d 65 20 6f 70 74 69 6f 6e 20 69 73 20  -time option is 
e350: 75 73 65 64 2e 0a 2a 2f 0a 23 69 66 64 65 66 20  used..*/.#ifdef 
e360: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f  SQLITE_ENABLE_CO
e370: 4c 55 4d 4e 5f 4d 45 54 41 44 41 54 41 0a 23 20  LUMN_METADATA.# 
e380: 64 65 66 69 6e 65 20 63 6f 6c 75 6d 6e 54 79 70  define columnTyp
e390: 65 28 41 2c 42 2c 43 2c 44 2c 45 29 20 63 6f 6c  e(A,B,C,D,E) col
e3a0: 75 6d 6e 54 79 70 65 49 6d 70 6c 28 41 2c 42 2c  umnTypeImpl(A,B,
e3b0: 43 2c 44 2c 45 29 0a 23 65 6c 73 65 20 2f 2a 20  C,D,E).#else /* 
e3c0: 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
e3d0: 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e  TE_ENABLE_COLUMN
e3e0: 5f 4d 45 54 41 44 41 54 41 29 20 2a 2f 0a 23 20  _METADATA) */.# 
e3f0: 64 65 66 69 6e 65 20 63 6f 6c 75 6d 6e 54 79 70  define columnTyp
e400: 65 28 41 2c 42 2c 43 2c 44 2c 45 29 20 63 6f 6c  e(A,B,C,D,E) col
e410: 75 6d 6e 54 79 70 65 49 6d 70 6c 28 41 2c 42 29  umnTypeImpl(A,B)
e420: 0a 23 65 6e 64 69 66 0a 73 74 61 74 69 63 20 63  .#endif.static c
e430: 6f 6e 73 74 20 63 68 61 72 20 2a 63 6f 6c 75 6d  onst char *colum
e440: 6e 54 79 70 65 49 6d 70 6c 28 0a 20 20 4e 61 6d  nTypeImpl(.  Nam
e450: 65 43 6f 6e 74 65 78 74 20 2a 70 4e 43 2c 20 0a  eContext *pNC, .
e460: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 45  #ifndef SQLITE_E
e470: 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54  NABLE_COLUMN_MET
e480: 41 44 41 54 41 0a 20 20 45 78 70 72 20 2a 70 45  ADATA.  Expr *pE
e490: 78 70 72 0a 23 65 6c 73 65 0a 20 20 45 78 70 72  xpr.#else.  Expr
e4a0: 20 2a 70 45 78 70 72 2c 0a 20 20 63 6f 6e 73 74   *pExpr,.  const
e4b0: 20 63 68 61 72 20 2a 2a 70 7a 4f 72 69 67 44 62   char **pzOrigDb
e4c0: 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ,.  const char *
e4d0: 2a 70 7a 4f 72 69 67 54 61 62 2c 0a 20 20 63 6f  *pzOrigTab,.  co
e4e0: 6e 73 74 20 63 68 61 72 20 2a 2a 70 7a 4f 72 69  nst char **pzOri
e4f0: 67 43 6f 6c 0a 23 65 6e 64 69 66 0a 29 7b 0a 20  gCol.#endif.){. 
e500: 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 54 79   char const *zTy
e510: 70 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6a 3b  pe = 0;.  int j;
e520: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
e530: 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54  NABLE_COLUMN_MET
e540: 41 44 41 54 41 0a 20 20 63 68 61 72 20 63 6f 6e  ADATA.  char con
e550: 73 74 20 2a 7a 4f 72 69 67 44 62 20 3d 20 30 3b  st *zOrigDb = 0;
e560: 0a 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a  .  char const *z
e570: 4f 72 69 67 54 61 62 20 3d 20 30 3b 0a 20 20 63  OrigTab = 0;.  c
e580: 68 61 72 20 63 6f 6e 73 74 20 2a 7a 4f 72 69 67  har const *zOrig
e590: 43 6f 6c 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a  Col = 0;.#endif.
e5a0: 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72  .  assert( pExpr
e5b0: 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
e5c0: 20 70 4e 43 2d 3e 70 53 72 63 4c 69 73 74 21 3d   pNC->pSrcList!=
e5d0: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
e5e0: 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 41 47 47  Expr->op!=TK_AGG
e5f0: 5f 43 4f 4c 55 4d 4e 20 29 3b 20 20 2f 2a 20 54  _COLUMN );  /* T
e600: 68 69 73 20 72 6f 75 74 69 6e 65 20 72 75 6e 65  his routine rune
e610: 73 20 62 65 66 6f 72 65 20 61 67 67 72 65 67 61  s before aggrega
e620: 74 65 73 0a 20 20 20 20 20 20 20 20 20 20 20 20  tes.            
e630: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e640: 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61 72             ** ar
e650: 65 20 70 72 6f 63 65 73 73 65 64 20 2a 2f 0a 20  e processed */. 
e660: 20 73 77 69 74 63 68 28 20 70 45 78 70 72 2d 3e   switch( pExpr->
e670: 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54  op ){.    case T
e680: 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20  K_COLUMN: {.    
e690: 20 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73    /* The express
e6a0: 69 6f 6e 20 69 73 20 61 20 63 6f 6c 75 6d 6e 2e  ion is a column.
e6b0: 20 4c 6f 63 61 74 65 20 74 68 65 20 74 61 62 6c   Locate the tabl
e6c0: 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69 73 20  e the column is 
e6d0: 62 65 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 65  being.      ** e
e6e0: 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20 69 6e  xtracted from in
e6f0: 20 4e 61 6d 65 43 6f 6e 74 65 78 74 2e 70 53 72   NameContext.pSr
e700: 63 4c 69 73 74 2e 20 54 68 69 73 20 74 61 62 6c  cList. This tabl
e710: 65 20 6d 61 79 20 62 65 20 72 65 61 6c 0a 20 20  e may be real.  
e720: 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20      ** database 
e730: 74 61 62 6c 65 20 6f 72 20 61 20 73 75 62 71 75  table or a subqu
e740: 65 72 79 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ery..      */.  
e750: 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20      Table *pTab 
e760: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
e770: 2f 2a 20 54 61 62 6c 65 20 73 74 72 75 63 74 75  /* Table structu
e780: 72 65 20 63 6f 6c 75 6d 6e 20 69 73 20 65 78 74  re column is ext
e790: 72 61 63 74 65 64 20 66 72 6f 6d 20 2a 2f 0a 20  racted from */. 
e7a0: 20 20 20 20 20 53 65 6c 65 63 74 20 2a 70 53 20       Select *pS 
e7b0: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
e7c0: 20 2f 2a 20 53 65 6c 65 63 74 20 74 68 65 20 63   /* Select the c
e7d0: 6f 6c 75 6d 6e 20 69 73 20 65 78 74 72 61 63 74  olumn is extract
e7e0: 65 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 20 20 20  ed from */.     
e7f0: 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70 45 78 70   int iCol = pExp
e800: 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 20 20 2f 2a 20  r->iColumn;  /* 
e810: 49 6e 64 65 78 20 6f 66 20 63 6f 6c 75 6d 6e 20  Index of column 
e820: 69 6e 20 70 54 61 62 20 2a 2f 0a 20 20 20 20 20  in pTab */.     
e830: 20 77 68 69 6c 65 28 20 70 4e 43 20 26 26 20 21   while( pNC && !
e840: 70 54 61 62 20 29 7b 0a 20 20 20 20 20 20 20 20  pTab ){.        
e850: 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73  SrcList *pTabLis
e860: 74 20 3d 20 70 4e 43 2d 3e 70 53 72 63 4c 69 73  t = pNC->pSrcLis
e870: 74 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 6a  t;.        for(j
e880: 3d 30 3b 6a 3c 70 54 61 62 4c 69 73 74 2d 3e 6e  =0;j<pTabList->n
e890: 53 72 63 20 26 26 20 70 54 61 62 4c 69 73 74 2d  Src && pTabList-
e8a0: 3e 61 5b 6a 5d 2e 69 43 75 72 73 6f 72 21 3d 70  >a[j].iCursor!=p
e8b0: 45 78 70 72 2d 3e 69 54 61 62 6c 65 3b 6a 2b 2b  Expr->iTable;j++
e8c0: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6a  );.        if( j
e8d0: 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 20  <pTabList->nSrc 
e8e0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 54 61  ){.          pTa
e8f0: 62 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b  b = pTabList->a[
e900: 6a 5d 2e 70 54 61 62 3b 0a 20 20 20 20 20 20 20  j].pTab;.       
e910: 20 20 20 70 53 20 3d 20 70 54 61 62 4c 69 73 74     pS = pTabList
e920: 2d 3e 61 5b 6a 5d 2e 70 53 65 6c 65 63 74 3b 0a  ->a[j].pSelect;.
e930: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
e940: 20 20 20 20 20 20 20 20 20 70 4e 43 20 3d 20 70           pNC = p
e950: 4e 43 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20  NC->pNext;.     
e960: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20     }.      }..  
e970: 20 20 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20      if( pTab==0 
e980: 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 74  ){.        /* At
e990: 20 6f 6e 65 20 74 69 6d 65 2c 20 63 6f 64 65 20   one time, code 
e9a0: 73 75 63 68 20 61 73 20 22 53 45 4c 45 43 54 20  such as "SELECT 
e9b0: 6e 65 77 2e 78 22 20 77 69 74 68 69 6e 20 61 20  new.x" within a 
e9c0: 74 72 69 67 67 65 72 20 77 6f 75 6c 64 0a 20 20  trigger would.  
e9d0: 20 20 20 20 20 20 2a 2a 20 63 61 75 73 65 20 74        ** cause t
e9e0: 68 69 73 20 63 6f 6e 64 69 74 69 6f 6e 20 74 6f  his condition to
e9f0: 20 72 75 6e 2e 20 20 53 69 6e 63 65 20 74 68 65   run.  Since the
ea00: 6e 2c 20 77 65 20 68 61 76 65 20 72 65 73 74 72  n, we have restr
ea10: 75 63 74 75 72 65 64 20 68 6f 77 0a 20 20 20 20  uctured how.    
ea20: 20 20 20 20 2a 2a 20 74 72 69 67 67 65 72 20 63      ** trigger c
ea30: 6f 64 65 20 69 73 20 67 65 6e 65 72 61 74 65 64  ode is generated
ea40: 20 61 6e 64 20 73 6f 20 74 68 69 73 20 63 6f 6e   and so this con
ea50: 64 69 74 69 6f 6e 20 69 73 20 6e 6f 20 6c 6f 6e  dition is no lon
ea60: 67 65 72 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  ger .        ** 
ea70: 70 6f 73 73 69 62 6c 65 2e 20 48 6f 77 65 76 65  possible. Howeve
ea80: 72 2c 20 69 74 20 63 61 6e 20 73 74 69 6c 6c 20  r, it can still 
ea90: 62 65 20 74 72 75 65 20 66 6f 72 20 73 74 61 74  be true for stat
eaa0: 65 6d 65 6e 74 73 20 6c 69 6b 65 0a 20 20 20 20  ements like.    
eab0: 20 20 20 20 2a 2a 20 74 68 65 20 66 6f 6c 6c 6f      ** the follo
eac0: 77 69 6e 67 3a 0a 20 20 20 20 20 20 20 20 2a 2a  wing:.        **
ead0: 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 43 52  .        **   CR
eae0: 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 63 6f  EATE TABLE t1(co
eaf0: 6c 20 49 4e 54 45 47 45 52 29 3b 0a 20 20 20 20  l INTEGER);.    
eb00: 20 20 20 20 2a 2a 20 20 20 53 45 4c 45 43 54 20      **   SELECT 
eb10: 28 53 45 4c 45 43 54 20 74 31 2e 63 6f 6c 29 20  (SELECT t1.col) 
eb20: 46 52 4f 4d 20 46 52 4f 4d 20 74 31 3b 0a 20 20  FROM FROM t1;.  
eb30: 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
eb40: 20 2a 2a 20 77 68 65 6e 20 63 6f 6c 75 6d 6e 54   ** when columnT
eb50: 79 70 65 28 29 20 69 73 20 63 61 6c 6c 65 64 20  ype() is called 
eb60: 6f 6e 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  on the expressio
eb70: 6e 20 22 74 31 2e 63 6f 6c 22 20 69 6e 20 74 68  n "t1.col" in th
eb80: 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 75  e .        ** su
eb90: 62 2d 73 65 6c 65 63 74 2e 20 49 6e 20 74 68 69  b-select. In thi
eba0: 73 20 63 61 73 65 2c 20 73 65 74 20 74 68 65 20  s case, set the 
ebb0: 63 6f 6c 75 6d 6e 20 74 79 70 65 20 74 6f 20 4e  column type to N
ebc0: 55 4c 4c 2c 20 65 76 65 6e 0a 20 20 20 20 20 20  ULL, even.      
ebd0: 20 20 2a 2a 20 74 68 6f 75 67 68 20 69 74 20 73    ** though it s
ebe0: 68 6f 75 6c 64 20 72 65 61 6c 6c 79 20 62 65 20  hould really be 
ebf0: 22 49 4e 54 45 47 45 52 22 2e 0a 20 20 20 20 20  "INTEGER"..     
ec00: 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a     **.        **
ec10: 20 54 68 69 73 20 69 73 20 6e 6f 74 20 61 20 70   This is not a p
ec20: 72 6f 62 6c 65 6d 2c 20 61 73 20 74 68 65 20 63  roblem, as the c
ec30: 6f 6c 75 6d 6e 20 74 79 70 65 20 6f 66 20 22 74  olumn type of "t
ec40: 31 2e 63 6f 6c 22 20 69 73 20 6e 65 76 65 72 0a  1.col" is never.
ec50: 20 20 20 20 20 20 20 20 2a 2a 20 75 73 65 64 2e          ** used.
ec60: 20 57 68 65 6e 20 63 6f 6c 75 6d 6e 54 79 70 65   When columnType
ec70: 28 29 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e 20  () is called on 
ec80: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 0a  the expression .
ec90: 20 20 20 20 20 20 20 20 2a 2a 20 22 28 53 45 4c          ** "(SEL
eca0: 45 43 54 20 74 31 2e 63 6f 6c 29 22 2c 20 74 68  ECT t1.col)", th
ecb0: 65 20 63 6f 72 72 65 63 74 20 74 79 70 65 20 69  e correct type i
ecc0: 73 20 72 65 74 75 72 6e 65 64 20 28 73 65 65 20  s returned (see 
ecd0: 74 68 65 20 54 4b 5f 53 45 4c 45 43 54 0a 20 20  the TK_SELECT.  
ece0: 20 20 20 20 20 20 2a 2a 20 62 72 61 6e 63 68 20        ** branch 
ecf0: 62 65 6c 6f 77 2e 20 20 2a 2f 0a 20 20 20 20 20  below.  */.     
ed00: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
ed10: 7d 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  }..      assert(
ed20: 20 70 54 61 62 20 26 26 20 70 45 78 70 72 2d 3e   pTab && pExpr->
ed30: 70 54 61 62 3d 3d 70 54 61 62 20 29 3b 0a 20 20  pTab==pTab );.  
ed40: 20 20 20 20 69 66 28 20 70 53 20 29 7b 0a 20 20      if( pS ){.  
ed50: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 22 74 61        /* The "ta
ed60: 62 6c 65 22 20 69 73 20 61 63 74 75 61 6c 6c 79  ble" is actually
ed70: 20 61 20 73 75 62 2d 73 65 6c 65 63 74 20 6f 72   a sub-select or
ed80: 20 61 20 76 69 65 77 20 69 6e 20 74 68 65 20 46   a view in the F
ed90: 52 4f 4d 20 63 6c 61 75 73 65 0a 20 20 20 20 20  ROM clause.     
eda0: 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 53 45 4c     ** of the SEL
edb0: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 20 52  ECT statement. R
edc0: 65 74 75 72 6e 20 74 68 65 20 64 65 63 6c 61 72  eturn the declar
edd0: 61 74 69 6f 6e 20 74 79 70 65 20 61 6e 64 20 6f  ation type and o
ede0: 72 69 67 69 6e 0a 20 20 20 20 20 20 20 20 2a 2a  rigin.        **
edf0: 20 64 61 74 61 20 66 6f 72 20 74 68 65 20 72 65   data for the re
ee00: 73 75 6c 74 2d 73 65 74 20 63 6f 6c 75 6d 6e 20  sult-set column 
ee10: 6f 66 20 74 68 65 20 73 75 62 2d 73 65 6c 65 63  of the sub-selec
ee20: 74 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  t..        */.  
ee30: 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3e 3d        if( iCol>=
ee40: 30 20 26 26 20 69 43 6f 6c 3c 70 53 2d 3e 70 45  0 && iCol<pS->pE
ee50: 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20  List->nExpr ){. 
ee60: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 69           /* If i
ee70: 43 6f 6c 20 69 73 20 6c 65 73 73 20 74 68 61 6e  Col is less than
ee80: 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20   zero, then the 
ee90: 65 78 70 72 65 73 73 69 6f 6e 20 72 65 71 75 65  expression reque
eea0: 73 74 73 20 74 68 65 0a 20 20 20 20 20 20 20 20  sts the.        
eeb0: 20 20 2a 2a 20 72 6f 77 69 64 20 6f 66 20 74 68    ** rowid of th
eec0: 65 20 73 75 62 2d 73 65 6c 65 63 74 20 6f 72 20  e sub-select or 
eed0: 76 69 65 77 2e 20 54 68 69 73 20 65 78 70 72 65  view. This expre
eee0: 73 73 69 6f 6e 20 69 73 20 6c 65 67 61 6c 20 28  ssion is legal (
eef0: 73 65 65 20 0a 20 20 20 20 20 20 20 20 20 20 2a  see .          *
ef00: 2a 20 74 65 73 74 20 63 61 73 65 20 6d 69 73 63  * test case misc
ef10: 32 2e 32 2e 32 29 20 2d 20 69 74 20 61 6c 77 61  2.2.2) - it alwa
ef20: 79 73 20 65 76 61 6c 75 61 74 65 73 20 74 6f 20  ys evaluates to 
ef30: 4e 55 4c 4c 2e 0a 20 20 20 20 20 20 20 20 20 20  NULL..          
ef40: 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 4e 61 6d  */.          Nam
ef50: 65 43 6f 6e 74 65 78 74 20 73 4e 43 3b 0a 20 20  eContext sNC;.  
ef60: 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 20          Expr *p 
ef70: 3d 20 70 53 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b  = pS->pEList->a[
ef80: 69 43 6f 6c 5d 2e 70 45 78 70 72 3b 0a 20 20 20  iCol].pExpr;.   
ef90: 20 20 20 20 20 20 20 73 4e 43 2e 70 53 72 63 4c         sNC.pSrcL
efa0: 69 73 74 20 3d 20 70 53 2d 3e 70 53 72 63 3b 0a  ist = pS->pSrc;.
efb0: 20 20 20 20 20 20 20 20 20 20 73 4e 43 2e 70 4e            sNC.pN
efc0: 65 78 74 20 3d 20 70 4e 43 3b 0a 20 20 20 20 20  ext = pNC;.     
efd0: 20 20 20 20 20 73 4e 43 2e 70 50 61 72 73 65 20       sNC.pParse 
efe0: 3d 20 70 4e 43 2d 3e 70 50 61 72 73 65 3b 0a 20  = pNC->pParse;. 
eff0: 20 20 20 20 20 20 20 20 20 7a 54 79 70 65 20 3d           zType =
f000: 20 63 6f 6c 75 6d 6e 54 79 70 65 28 26 73 4e 43   columnType(&sNC
f010: 2c 20 70 2c 26 7a 4f 72 69 67 44 62 2c 26 7a 4f  , p,&zOrigDb,&zO
f020: 72 69 67 54 61 62 2c 26 7a 4f 72 69 67 43 6f 6c  rigTab,&zOrigCol
f030: 29 3b 20 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ); .        }.  
f040: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
f050: 20 20 20 2f 2a 20 41 20 72 65 61 6c 20 74 61 62     /* A real tab
f060: 6c 65 20 6f 72 20 61 20 43 54 45 20 74 61 62 6c  le or a CTE tabl
f070: 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73  e */.        ass
f080: 65 72 74 28 20 21 70 53 20 29 3b 0a 23 69 66 64  ert( !pS );.#ifd
f090: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
f0a0: 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41 54 41  _COLUMN_METADATA
f0b0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 43 6f  .        if( iCo
f0c0: 6c 3c 30 20 29 20 69 43 6f 6c 20 3d 20 70 54 61  l<0 ) iCol = pTa
f0d0: 62 2d 3e 69 50 4b 65 79 3b 0a 20 20 20 20 20 20  b->iPKey;.      
f0e0: 20 20 61 73 73 65 72 74 28 20 69 43 6f 6c 3d 3d    assert( iCol==
f0f0: 58 4e 5f 52 4f 57 49 44 20 7c 7c 20 28 69 43 6f  XN_ROWID || (iCo
f100: 6c 3e 3d 30 20 26 26 20 69 43 6f 6c 3c 70 54 61  l>=0 && iCol<pTa
f110: 62 2d 3e 6e 43 6f 6c 29 20 29 3b 0a 20 20 20 20  b->nCol) );.    
f120: 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 29      if( iCol<0 )
f130: 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 54 79 70  {.          zTyp
f140: 65 20 3d 20 22 49 4e 54 45 47 45 52 22 3b 0a 20  e = "INTEGER";. 
f150: 20 20 20 20 20 20 20 20 20 7a 4f 72 69 67 43 6f           zOrigCo
f160: 6c 20 3d 20 22 72 6f 77 69 64 22 3b 0a 20 20 20  l = "rowid";.   
f170: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
f180: 20 20 20 20 20 20 7a 4f 72 69 67 43 6f 6c 20 3d        zOrigCol =
f190: 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c   pTab->aCol[iCol
f1a0: 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20  ].zName;.       
f1b0: 20 20 20 7a 54 79 70 65 20 3d 20 73 71 6c 69 74     zType = sqlit
f1c0: 65 33 43 6f 6c 75 6d 6e 54 79 70 65 28 26 70 54  e3ColumnType(&pT
f1d0: 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2c 30  ab->aCol[iCol],0
f1e0: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
f1f0: 20 20 20 20 20 7a 4f 72 69 67 54 61 62 20 3d 20       zOrigTab = 
f200: 70 54 61 62 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20  pTab->zName;.   
f210: 20 20 20 20 20 69 66 28 20 70 4e 43 2d 3e 70 50       if( pNC->pP
f220: 61 72 73 65 20 26 26 20 70 54 61 62 2d 3e 70 53  arse && pTab->pS
f230: 63 68 65 6d 61 20 29 7b 0a 20 20 20 20 20 20 20  chema ){.       
f240: 20 20 20 69 6e 74 20 69 44 62 20 3d 20 73 71 6c     int iDb = sql
f250: 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65  ite3SchemaToInde
f260: 78 28 70 4e 43 2d 3e 70 50 61 72 73 65 2d 3e 64  x(pNC->pParse->d
f270: 62 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61  b, pTab->pSchema
f280: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7a 4f 72  );.          zOr
f290: 69 67 44 62 20 3d 20 70 4e 43 2d 3e 70 50 61 72  igDb = pNC->pPar
f2a0: 73 65 2d 3e 64 62 2d 3e 61 44 62 5b 69 44 62 5d  se->db->aDb[iDb]
f2b0: 2e 7a 44 62 53 4e 61 6d 65 3b 0a 20 20 20 20 20  .zDbSName;.     
f2c0: 20 20 20 7d 0a 23 65 6c 73 65 0a 20 20 20 20 20     }.#else.     
f2d0: 20 20 20 61 73 73 65 72 74 28 20 69 43 6f 6c 3d     assert( iCol=
f2e0: 3d 58 4e 5f 52 4f 57 49 44 20 7c 7c 20 28 69 43  =XN_ROWID || (iC
f2f0: 6f 6c 3e 3d 30 20 26 26 20 69 43 6f 6c 3c 70 54  ol>=0 && iCol<pT
f300: 61 62 2d 3e 6e 43 6f 6c 29 20 29 3b 0a 20 20 20  ab->nCol) );.   
f310: 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20       if( iCol<0 
f320: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 54 79  ){.          zTy
f330: 70 65 20 3d 20 22 49 4e 54 45 47 45 52 22 3b 0a  pe = "INTEGER";.
f340: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
f350: 20 20 20 20 20 20 20 20 20 7a 54 79 70 65 20 3d           zType =
f360: 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 54 79   sqlite3ColumnTy
f370: 70 65 28 26 70 54 61 62 2d 3e 61 43 6f 6c 5b 69  pe(&pTab->aCol[i
f380: 43 6f 6c 5d 2c 30 29 3b 0a 20 20 20 20 20 20 20  Col],0);.       
f390: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20   }.#endif.      
f3a0: 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
f3b0: 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c     }.#ifndef SQL
f3c0: 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
f3d0: 59 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 45  Y.    case TK_SE
f3e0: 4c 45 43 54 3a 20 7b 0a 20 20 20 20 20 20 2f 2a  LECT: {.      /*
f3f0: 20 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   The expression 
f400: 69 73 20 61 20 73 75 62 2d 73 65 6c 65 63 74 2e  is a sub-select.
f410: 20 52 65 74 75 72 6e 20 74 68 65 20 64 65 63 6c   Return the decl
f420: 61 72 61 74 69 6f 6e 20 74 79 70 65 20 61 6e 64  aration type and
f430: 0a 20 20 20 20 20 20 2a 2a 20 6f 72 69 67 69 6e  .      ** origin
f440: 20 69 6e 66 6f 20 66 6f 72 20 74 68 65 20 73 69   info for the si
f450: 6e 67 6c 65 20 63 6f 6c 75 6d 6e 20 69 6e 20 74  ngle column in t
f460: 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66  he result set of
f470: 20 74 68 65 20 53 45 4c 45 43 54 0a 20 20 20 20   the SELECT.    
f480: 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 2e 0a    ** statement..
f490: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 4e        */.      N
f4a0: 61 6d 65 43 6f 6e 74 65 78 74 20 73 4e 43 3b 0a  ameContext sNC;.
f4b0: 20 20 20 20 20 20 53 65 6c 65 63 74 20 2a 70 53        Select *pS
f4c0: 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c   = pExpr->x.pSel
f4d0: 65 63 74 3b 0a 20 20 20 20 20 20 45 78 70 72 20  ect;.      Expr 
f4e0: 2a 70 20 3d 20 70 53 2d 3e 70 45 4c 69 73 74 2d  *p = pS->pEList-
f4f0: 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20 20  >a[0].pExpr;.   
f500: 20 20 20 61 73 73 65 72 74 28 20 45 78 70 72 48     assert( ExprH
f510: 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  asProperty(pExpr
f520: 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20  , EP_xIsSelect) 
f530: 29 3b 0a 20 20 20 20 20 20 73 4e 43 2e 70 53 72  );.      sNC.pSr
f540: 63 4c 69 73 74 20 3d 20 70 53 2d 3e 70 53 72 63  cList = pS->pSrc
f550: 3b 0a 20 20 20 20 20 20 73 4e 43 2e 70 4e 65 78  ;.      sNC.pNex
f560: 74 20 3d 20 70 4e 43 3b 0a 20 20 20 20 20 20 73  t = pNC;.      s
f570: 4e 43 2e 70 50 61 72 73 65 20 3d 20 70 4e 43 2d  NC.pParse = pNC-
f580: 3e 70 50 61 72 73 65 3b 0a 20 20 20 20 20 20 7a  >pParse;.      z
f590: 54 79 70 65 20 3d 20 63 6f 6c 75 6d 6e 54 79 70  Type = columnTyp
f5a0: 65 28 26 73 4e 43 2c 20 70 2c 20 26 7a 4f 72 69  e(&sNC, p, &zOri
f5b0: 67 44 62 2c 20 26 7a 4f 72 69 67 54 61 62 2c 20  gDb, &zOrigTab, 
f5c0: 26 7a 4f 72 69 67 43 6f 6c 29 3b 20 0a 20 20 20  &zOrigCol); .   
f5d0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
f5e0: 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 23 69 66 64  #endif.  }..#ifd
f5f0: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
f600: 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41 54 41  _COLUMN_METADATA
f610: 20 20 0a 20 20 69 66 28 20 70 7a 4f 72 69 67 44    .  if( pzOrigD
f620: 62 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  b ){.    assert(
f630: 20 70 7a 4f 72 69 67 54 61 62 20 26 26 20 70 7a   pzOrigTab && pz
f640: 4f 72 69 67 43 6f 6c 20 29 3b 0a 20 20 20 20 2a  OrigCol );.    *
f650: 70 7a 4f 72 69 67 44 62 20 3d 20 7a 4f 72 69 67  pzOrigDb = zOrig
f660: 44 62 3b 0a 20 20 20 20 2a 70 7a 4f 72 69 67 54  Db;.    *pzOrigT
f670: 61 62 20 3d 20 7a 4f 72 69 67 54 61 62 3b 0a 20  ab = zOrigTab;. 
f680: 20 20 20 2a 70 7a 4f 72 69 67 43 6f 6c 20 3d 20     *pzOrigCol = 
f690: 7a 4f 72 69 67 43 6f 6c 3b 0a 20 20 7d 0a 23 65  zOrigCol;.  }.#e
f6a0: 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 7a 54  ndif.  return zT
f6b0: 79 70 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  ype;.}../*.** Ge
f6c0: 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74  nerate code that
f6d0: 20 77 69 6c 6c 20 74 65 6c 6c 20 74 68 65 20 56   will tell the V
f6e0: 44 42 45 20 74 68 65 20 64 65 63 6c 61 72 61 74  DBE the declarat
f6f0: 69 6f 6e 20 74 79 70 65 73 20 6f 66 20 63 6f 6c  ion types of col
f700: 75 6d 6e 73 0a 2a 2a 20 69 6e 20 74 68 65 20 72  umns.** in the r
f710: 65 73 75 6c 74 20 73 65 74 2e 0a 2a 2f 0a 73 74  esult set..*/.st
f720: 61 74 69 63 20 76 6f 69 64 20 67 65 6e 65 72 61  atic void genera
f730: 74 65 43 6f 6c 75 6d 6e 54 79 70 65 73 28 0a 20  teColumnTypes(. 
f740: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
f750: 20 20 20 20 20 2f 2a 20 50 61 72 73 65 72 20 63       /* Parser c
f760: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 72 63 4c  ontext */.  SrcL
f770: 69 73 74 20 2a 70 54 61 62 4c 69 73 74 2c 20 20  ist *pTabList,  
f780: 2f 2a 20 4c 69 73 74 20 6f 66 20 74 61 62 6c 65  /* List of table
f790: 73 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  s */.  ExprList 
f7a0: 2a 70 45 4c 69 73 74 20 20 20 20 2f 2a 20 45 78  *pEList    /* Ex
f7b0: 70 72 65 73 73 69 6f 6e 73 20 64 65 66 69 6e 69  pressions defini
f7c0: 6e 67 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  ng the result se
f7d0: 74 20 2a 2f 0a 29 7b 0a 23 69 66 6e 64 65 66 20  t */.){.#ifndef 
f7e0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 45 43 4c  SQLITE_OMIT_DECL
f7f0: 54 59 50 45 0a 20 20 56 64 62 65 20 2a 76 20 3d  TYPE.  Vdbe *v =
f800: 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a   pParse->pVdbe;.
f810: 20 20 69 6e 74 20 69 3b 0a 20 20 4e 61 6d 65 43    int i;.  NameC
f820: 6f 6e 74 65 78 74 20 73 4e 43 3b 0a 20 20 73 4e  ontext sNC;.  sN
f830: 43 2e 70 53 72 63 4c 69 73 74 20 3d 20 70 54 61  C.pSrcList = pTa
f840: 62 4c 69 73 74 3b 0a 20 20 73 4e 43 2e 70 50 61  bList;.  sNC.pPa
f850: 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20  rse = pParse;.  
f860: 73 4e 43 2e 70 4e 65 78 74 20 3d 20 30 3b 0a 20  sNC.pNext = 0;. 
f870: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 45 4c 69   for(i=0; i<pELi
f880: 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b  st->nExpr; i++){
f890: 0a 20 20 20 20 45 78 70 72 20 2a 70 20 3d 20 70  .    Expr *p = p
f8a0: 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70  EList->a[i].pExp
f8b0: 72 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  r;.    const cha
f8c0: 72 20 2a 7a 54 79 70 65 3b 0a 23 69 66 64 65 66  r *zType;.#ifdef
f8d0: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43   SQLITE_ENABLE_C
f8e0: 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41 54 41 0a 20  OLUMN_METADATA. 
f8f0: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
f900: 4f 72 69 67 44 62 20 3d 20 30 3b 0a 20 20 20 20  OrigDb = 0;.    
f910: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f 72 69  const char *zOri
f920: 67 54 61 62 20 3d 20 30 3b 0a 20 20 20 20 63 6f  gTab = 0;.    co
f930: 6e 73 74 20 63 68 61 72 20 2a 7a 4f 72 69 67 43  nst char *zOrigC
f940: 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 7a 54 79 70  ol = 0;.    zTyp
f950: 65 20 3d 20 63 6f 6c 75 6d 6e 54 79 70 65 28 26  e = columnType(&
f960: 73 4e 43 2c 20 70 2c 20 26 7a 4f 72 69 67 44 62  sNC, p, &zOrigDb
f970: 2c 20 26 7a 4f 72 69 67 54 61 62 2c 20 26 7a 4f  , &zOrigTab, &zO
f980: 72 69 67 43 6f 6c 29 3b 0a 0a 20 20 20 20 2f 2a  rigCol);..    /*
f990: 20 54 68 65 20 76 64 62 65 20 6d 75 73 74 20 6d   The vdbe must m
f9a0: 61 6b 65 20 69 74 73 20 6f 77 6e 20 63 6f 70 79  ake its own copy
f9b0: 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 2d 74   of the column-t
f9c0: 79 70 65 20 61 6e 64 20 6f 74 68 65 72 20 0a 20  ype and other . 
f9d0: 20 20 20 2a 2a 20 63 6f 6c 75 6d 6e 20 73 70 65     ** column spe
f9e0: 63 69 66 69 63 20 73 74 72 69 6e 67 73 2c 20 69  cific strings, i
f9f0: 6e 20 63 61 73 65 20 74 68 65 20 73 63 68 65 6d  n case the schem
fa00: 61 20 69 73 20 72 65 73 65 74 20 62 65 66 6f 72  a is reset befor
fa10: 65 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 76 69  e this.    ** vi
fa20: 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 20 69 73  rtual machine is
fa30: 20 64 65 6c 65 74 65 64 2e 0a 20 20 20 20 2a 2f   deleted..    */
fa40: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
fa50: 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c  SetColName(v, i,
fa60: 20 43 4f 4c 4e 41 4d 45 5f 44 41 54 41 42 41 53   COLNAME_DATABAS
fa70: 45 2c 20 7a 4f 72 69 67 44 62 2c 20 53 51 4c 49  E, zOrigDb, SQLI
fa80: 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20  TE_TRANSIENT);. 
fa90: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65     sqlite3VdbeSe
faa0: 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43  tColName(v, i, C
fab0: 4f 4c 4e 41 4d 45 5f 54 41 42 4c 45 2c 20 7a 4f  OLNAME_TABLE, zO
fac0: 72 69 67 54 61 62 2c 20 53 51 4c 49 54 45 5f 54  rigTab, SQLITE_T
fad0: 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20 73  RANSIENT);.    s
fae0: 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c  qlite3VdbeSetCol
faf0: 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41  Name(v, i, COLNA
fb00: 4d 45 5f 43 4f 4c 55 4d 4e 2c 20 7a 4f 72 69 67  ME_COLUMN, zOrig
fb10: 43 6f 6c 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e  Col, SQLITE_TRAN
fb20: 53 49 45 4e 54 29 3b 0a 23 65 6c 73 65 0a 20 20  SIENT);.#else.  
fb30: 20 20 7a 54 79 70 65 20 3d 20 63 6f 6c 75 6d 6e    zType = column
fb40: 54 79 70 65 28 26 73 4e 43 2c 20 70 2c 20 30 2c  Type(&sNC, p, 0,
fb50: 20 30 2c 20 30 29 3b 0a 23 65 6e 64 69 66 0a 20   0, 0);.#endif. 
fb60: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65     sqlite3VdbeSe
fb70: 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43  tColName(v, i, C
fb80: 4f 4c 4e 41 4d 45 5f 44 45 43 4c 54 59 50 45 2c  OLNAME_DECLTYPE,
fb90: 20 7a 54 79 70 65 2c 20 53 51 4c 49 54 45 5f 54   zType, SQLITE_T
fba0: 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 7d 0a 23  RANSIENT);.  }.#
fbb0: 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65  endif /* !define
fbc0: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 45  d(SQLITE_OMIT_DE
fbd0: 43 4c 54 59 50 45 29 20 2a 2f 0a 7d 0a 0a 0a 2f  CLTYPE) */.}.../
fbe0: 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 74 68 65  *.** Compute the
fbf0: 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 66 6f   column names fo
fc00: 72 20 61 20 53 45 4c 45 43 54 20 73 74 61 74 65  r a SELECT state
fc10: 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ment..**.** The 
fc20: 6f 6e 6c 79 20 67 75 61 72 61 6e 74 65 65 20 74  only guarantee t
fc30: 68 61 74 20 53 51 4c 69 74 65 20 6d 61 6b 65 73  hat SQLite makes
fc40: 20 61 62 6f 75 74 20 63 6f 6c 75 6d 6e 20 6e 61   about column na
fc50: 6d 65 73 20 69 73 20 74 68 61 74 20 69 66 20 74  mes is that if t
fc60: 68 65 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 68 61 73  he.** column has
fc70: 20 61 6e 20 41 53 20 63 6c 61 75 73 65 20 61 73   an AS clause as
fc80: 73 69 67 6e 69 6e 67 20 69 74 20 61 20 6e 61 6d  signing it a nam
fc90: 65 2c 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20  e, that will be 
fca0: 74 68 65 20 6e 61 6d 65 20 75 73 65 64 2e 0a 2a  the name used..*
fcb0: 2a 20 54 68 61 74 20 69 73 20 74 68 65 20 6f 6e  * That is the on
fcc0: 6c 79 20 64 6f 63 75 6d 65 6e 74 65 64 20 67 75  ly documented gu
fcd0: 61 72 61 6e 74 65 65 2e 20 20 48 6f 77 65 76 65  arantee.  Howeve
fce0: 72 2c 20 63 6f 75 6e 74 6c 65 73 73 20 61 70 70  r, countless app
fcf0: 6c 69 63 61 74 69 6f 6e 73 0a 2a 2a 20 64 65 76  lications.** dev
fd00: 65 6c 6f 70 65 64 20 6f 76 65 72 20 74 68 65 20  eloped over the 
fd10: 79 65 61 72 73 20 68 61 76 65 20 6d 61 64 65 20  years have made 
fd20: 62 61 73 65 6c 65 73 73 20 61 73 73 75 6d 70 74  baseless assumpt
fd30: 69 6f 6e 73 20 61 62 6f 75 74 20 63 6f 6c 75 6d  ions about colum
fd40: 6e 20 6e 61 6d 65 73 0a 2a 2a 20 61 6e 64 20 77  n names.** and w
fd50: 69 6c 6c 20 62 72 65 61 6b 20 69 66 20 74 68 6f  ill break if tho
fd60: 73 65 20 61 73 73 75 6d 70 74 69 6f 6e 73 20 63  se assumptions c
fd70: 68 61 6e 67 65 73 2e 20 20 48 65 6e 63 65 2c 20  hanges.  Hence, 
fd80: 75 73 65 20 65 78 74 72 65 6d 65 20 63 61 75 74  use extreme caut
fd90: 69 6f 6e 0a 2a 2a 20 77 68 65 6e 20 6d 6f 64 69  ion.** when modi
fda0: 66 79 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69  fying this routi
fdb0: 6e 65 20 74 6f 20 61 76 6f 69 64 20 62 72 65 61  ne to avoid brea
fdc0: 6b 69 6e 67 20 6c 65 67 61 63 79 2e 0a 2a 2a 0a  king legacy..**.
fdd0: 2a 2a 20 53 65 65 20 41 6c 73 6f 3a 20 73 71 6c  ** See Also: sql
fde0: 69 74 65 33 43 6f 6c 75 6d 6e 73 46 72 6f 6d 45  ite3ColumnsFromE
fdf0: 78 70 72 4c 69 73 74 28 29 0a 2a 2a 0a 2a 2a 20  xprList().**.** 
fe00: 54 68 65 20 50 52 41 47 4d 41 20 73 68 6f 72 74  The PRAGMA short
fe10: 5f 63 6f 6c 75 6d 6e 5f 6e 61 6d 65 73 20 61 6e  _column_names an
fe20: 64 20 50 52 41 47 4d 41 20 66 75 6c 6c 5f 63 6f  d PRAGMA full_co
fe30: 6c 75 6d 6e 5f 6e 61 6d 65 73 20 73 65 74 74 69  lumn_names setti
fe40: 6e 67 73 20 61 72 65 0a 2a 2a 20 64 65 70 72 65  ngs are.** depre
fe50: 63 61 74 65 64 2e 20 20 54 68 65 20 64 65 66 61  cated.  The defa
fe60: 75 6c 74 20 73 65 74 74 69 6e 67 20 69 73 20 73  ult setting is s
fe70: 68 6f 72 74 3d 4f 4e 2c 20 66 75 6c 6c 3d 4f 46  hort=ON, full=OF
fe80: 46 2e 20 20 39 39 2e 39 25 20 6f 66 20 61 6c 6c  F.  99.9% of all
fe90: 0a 2a 2a 20 61 70 70 6c 69 63 61 74 69 6f 6e 73  .** applications
fea0: 20 73 68 6f 75 6c 64 20 6f 70 65 72 61 74 65 20   should operate 
feb0: 74 68 69 73 20 77 61 79 2e 20 20 4e 65 76 65 72  this way.  Never
fec0: 74 68 65 6c 65 73 73 2c 20 77 65 20 6e 65 65 64  theless, we need
fed0: 20 74 6f 20 73 75 70 70 6f 72 74 20 74 68 65 0a   to support the.
fee0: 2a 2a 20 6f 74 68 65 72 20 6d 6f 64 65 73 20 66  ** other modes f
fef0: 6f 72 20 6c 65 67 61 63 79 3a 0a 2a 2a 0a 2a 2a  or legacy:.**.**
ff00: 20 20 20 20 73 68 6f 72 74 3d 4f 46 46 2c 20 66      short=OFF, f
ff10: 75 6c 6c 3d 4f 46 46 3a 20 20 20 20 20 20 43 6f  ull=OFF:      Co
ff20: 6c 75 6d 6e 20 6e 61 6d 65 20 69 73 20 74 68 65  lumn name is the
ff30: 20 74 65 78 74 20 6f 66 20 74 68 65 20 65 78 70   text of the exp
ff40: 72 65 73 73 69 6f 6e 20 68 61 73 20 69 74 0a 2a  ression has it.*
ff50: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
ff60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f                 o
ff70: 72 69 67 69 6e 61 6c 6c 79 20 61 70 70 65 61 72  riginally appear
ff80: 73 20 69 6e 20 74 68 65 20 53 45 4c 45 43 54 20  s in the SELECT 
ff90: 73 74 61 74 65 6d 65 6e 74 2e 20 20 49 6e 0a 2a  statement.  In.*
ffa0: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
ffb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f                 o
ffc0: 74 68 65 72 20 77 6f 72 64 73 2c 20 74 68 65 20  ther words, the 
ffd0: 7a 53 70 61 6e 20 6f 66 20 74 68 65 20 72 65 73  zSpan of the res
ffe0: 75 6c 74 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a  ult expression..
fff0: 2a 2a 0a 2a 2a 20 20 20 20 73 68 6f 72 74 3d 4f  **.**    short=O
10000 4e 2c 20 66 75 6c 6c 3d 4f 46 46 3a 20 20 20 20  N, full=OFF:    
10010 20 20 20 28 54 68 69 73 20 69 73 20 74 68 65 20     (This is the 
10020 64 65 66 61 75 6c 74 20 73 65 74 74 69 6e 67 29  default setting)
10030 2e 20 20 49 66 20 74 68 65 20 72 65 73 75 6c 74  .  If the result
10040 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
10050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10060 20 72 65 66 65 72 73 20 64 69 72 65 63 74 6c 79   refers directly
10070 20 74 6f 20 61 20 74 61 62 6c 65 20 63 6f 6c 75   to a table colu
10080 6d 6e 2c 20 74 68 65 6e 20 74 68 65 0a 2a 2a 20  mn, then the.** 
10090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
100a0 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65 73               res
100b0 75 6c 74 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20  ult column name 
100c0 69 73 20 6a 75 73 74 20 74 68 65 20 74 61 62 6c  is just the tabl
100d0 65 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 20 20 20 20  e column.**     
100e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
100f0 20 20 20 20 20 20 20 20 20 6e 61 6d 65 3a 20 43           name: C
10100 4f 4c 55 4d 4e 2e 20 20 4f 74 68 65 72 77 69 73  OLUMN.  Otherwis
10110 65 20 75 73 65 20 7a 53 70 61 6e 2e 0a 2a 2a 0a  e use zSpan..**.
10120 2a 2a 20 20 20 20 66 75 6c 6c 3d 4f 4e 2c 20 73  **    full=ON, s
10130 68 6f 72 74 3d 41 4e 59 3a 20 20 20 20 20 20 20  hort=ANY:       
10140 49 66 20 74 68 65 20 72 65 73 75 6c 74 20 72 65  If the result re
10150 66 65 72 73 20 64 69 72 65 63 74 6c 79 20 74 6f  fers directly to
10160 20 61 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 2c   a table column,
10170 0a 2a 2a 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 20 20 20 20 20                  
10190 20 74 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74   then the result
101a0 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 77 69 74   column name wit
101b0 68 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65  h the table name
101c0 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
101d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
101e0 20 70 72 65 66 69 78 2c 20 65 78 3a 20 54 41 42   prefix, ex: TAB
101f0 4c 45 2e 43 4f 4c 55 4d 4e 2e 20 20 4f 74 68 65  LE.COLUMN.  Othe
10200 72 77 69 73 65 20 75 73 65 20 7a 53 70 61 6e 2e  rwise use zSpan.
10210 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
10220 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61  generateColumnNa
10230 6d 65 73 28 0a 20 20 50 61 72 73 65 20 2a 70 50  mes(.  Parse *pP
10240 61 72 73 65 2c 20 20 20 20 20 20 2f 2a 20 50 61  arse,      /* Pa
10250 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  rser context */.
10260 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63    Select *pSelec
10270 74 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74  t     /* Generat
10280 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 66  e column names f
10290 6f 72 20 74 68 69 73 20 53 45 4c 45 43 54 20 73  or this SELECT s
102a0 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20  tatement */.){. 
102b0 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
102c0 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20  e->pVdbe;.  int 
102d0 69 3b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62  i;.  Table *pTab
102e0 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61  ;.  SrcList *pTa
102f0 62 4c 69 73 74 3b 0a 20 20 45 78 70 72 4c 69 73  bList;.  ExprLis
10300 74 20 2a 70 45 4c 69 73 74 3b 0a 20 20 73 71 6c  t *pEList;.  sql
10310 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
10320 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 66 75 6c  e->db;.  int ful
10330 6c 4e 61 6d 65 3b 20 20 20 20 2f 2a 20 54 41 42  lName;    /* TAB
10340 4c 45 2e 43 4f 4c 55 4d 4e 20 69 66 20 6e 6f 20  LE.COLUMN if no 
10350 41 53 20 63 6c 61 75 73 65 20 61 6e 64 20 69 73  AS clause and is
10360 20 61 20 64 69 72 65 63 74 20 74 61 62 6c 65 20   a direct table 
10370 72 65 66 20 2a 2f 0a 20 20 69 6e 74 20 73 72 63  ref */.  int src
10380 4e 61 6d 65 3b 20 20 20 20 20 2f 2a 20 43 4f 4c  Name;     /* COL
10390 55 4d 4e 20 6f 72 20 54 41 42 4c 45 2e 43 4f 4c  UMN or TABLE.COL
103a0 55 4d 4e 20 69 66 20 6e 6f 20 41 53 20 63 6c 61  UMN if no AS cla
103b0 75 73 65 20 61 6e 64 20 69 73 20 64 69 72 65 63  use and is direc
103c0 74 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51  t */..#ifndef SQ
103d0 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49  LITE_OMIT_EXPLAI
103e0 4e 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69  N.  /* If this i
103f0 73 20 61 6e 20 45 58 50 4c 41 49 4e 2c 20 73 6b  s an EXPLAIN, sk
10400 69 70 20 74 68 69 73 20 73 74 65 70 20 2a 2f 0a  ip this step */.
10410 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 65 78    if( pParse->ex
10420 70 6c 61 69 6e 20 29 7b 0a 20 20 20 20 72 65 74  plain ){.    ret
10430 75 72 6e 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  urn;.  }.#endif.
10440 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 63  .  if( pParse->c
10450 6f 6c 4e 61 6d 65 73 53 65 74 20 29 20 72 65 74  olNamesSet ) ret
10460 75 72 6e 3b 0a 20 20 2f 2a 20 43 6f 6c 75 6d 6e  urn;.  /* Column
10470 20 6e 61 6d 65 73 20 61 72 65 20 64 65 74 65 72   names are deter
10480 6d 69 6e 65 64 20 62 79 20 74 68 65 20 6c 65 66  mined by the lef
10490 74 2d 6d 6f 73 74 20 74 65 72 6d 20 6f 66 20 61  t-most term of a
104a0 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74   compound select
104b0 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20 70 53 65   */.  while( pSe
104c0 6c 65 63 74 2d 3e 70 50 72 69 6f 72 20 29 20 70  lect->pPrior ) p
104d0 53 65 6c 65 63 74 20 3d 20 70 53 65 6c 65 63 74  Select = pSelect
104e0 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 53 45 4c 45  ->pPrior;.  SELE
104f0 43 54 54 52 41 43 45 28 31 2c 70 50 61 72 73 65  CTTRACE(1,pParse
10500 2c 70 53 65 6c 65 63 74 2c 28 22 67 65 6e 65 72  ,pSelect,("gener
10510 61 74 69 6e 67 20 63 6f 6c 75 6d 6e 20 6e 61 6d  ating column nam
10520 65 73 5c 6e 22 29 29 3b 0a 20 20 70 54 61 62 4c  es\n"));.  pTabL
10530 69 73 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70  ist = pSelect->p
10540 53 72 63 3b 0a 20 20 70 45 4c 69 73 74 20 3d 20  Src;.  pEList = 
10550 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 3b  pSelect->pEList;
10560 0a 20 20 61 73 73 65 72 74 28 20 76 21 3d 30 20  .  assert( v!=0 
10570 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 54 61  );.  assert( pTa
10580 62 4c 69 73 74 21 3d 30 20 29 3b 0a 20 20 70 50  bList!=0 );.  pP
10590 61 72 73 65 2d 3e 63 6f 6c 4e 61 6d 65 73 53 65  arse->colNamesSe
105a0 74 20 3d 20 31 3b 0a 20 20 66 75 6c 6c 4e 61 6d  t = 1;.  fullNam
105b0 65 20 3d 20 28 64 62 2d 3e 66 6c 61 67 73 20 26  e = (db->flags &
105c0 20 53 51 4c 49 54 45 5f 46 75 6c 6c 43 6f 6c 4e   SQLITE_FullColN
105d0 61 6d 65 73 29 21 3d 30 3b 0a 20 20 73 72 63 4e  ames)!=0;.  srcN
105e0 61 6d 65 20 3d 20 28 64 62 2d 3e 66 6c 61 67 73  ame = (db->flags
105f0 20 26 20 53 51 4c 49 54 45 5f 53 68 6f 72 74 43   & SQLITE_ShortC
10600 6f 6c 4e 61 6d 65 73 29 21 3d 30 20 7c 7c 20 66  olNames)!=0 || f
10610 75 6c 6c 4e 61 6d 65 3b 0a 20 20 73 71 6c 69 74  ullName;.  sqlit
10620 65 33 56 64 62 65 53 65 74 4e 75 6d 43 6f 6c 73  e3VdbeSetNumCols
10630 28 76 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70  (v, pEList->nExp
10640 72 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  r);.  for(i=0; i
10650 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20  <pEList->nExpr; 
10660 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a  i++){.    Expr *
10670 70 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d  p = pEList->a[i]
10680 2e 70 45 78 70 72 3b 0a 0a 20 20 20 20 61 73 73  .pExpr;..    ass
10690 65 72 74 28 20 70 21 3d 30 20 29 3b 0a 20 20 20  ert( p!=0 );.   
106a0 20 61 73 73 65 72 74 28 20 70 2d 3e 6f 70 21 3d   assert( p->op!=
106b0 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 29 3b  TK_AGG_COLUMN );
106c0 20 20 2f 2a 20 41 67 67 20 70 72 6f 63 65 73 73    /* Agg process
106d0 69 6e 67 20 68 61 73 20 6e 6f 74 20 72 75 6e 20  ing has not run 
106e0 79 65 74 20 2a 2f 0a 20 20 20 20 61 73 73 65 72  yet */.    asser
106f0 74 28 20 70 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c  t( p->op!=TK_COL
10700 55 4d 4e 20 7c 7c 20 70 2d 3e 70 54 61 62 21 3d  UMN || p->pTab!=
10710 30 20 29 3b 20 2f 2a 20 43 6f 76 65 72 69 6e 67  0 ); /* Covering
10720 20 69 64 78 20 6e 6f 74 20 79 65 74 20 63 6f 64   idx not yet cod
10730 65 64 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 45  ed */.    if( pE
10740 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65  List->a[i].zName
10750 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 6e 20   ){.      /* An 
10760 41 53 20 63 6c 61 75 73 65 20 61 6c 77 61 79 73  AS clause always
10770 20 74 61 6b 65 73 20 66 69 72 73 74 20 70 72 69   takes first pri
10780 6f 72 69 74 79 20 2a 2f 0a 20 20 20 20 20 20 63  ority */.      c
10790 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 70 45 4c  har *zName = pEL
107a0 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 3b  ist->a[i].zName;
107b0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
107c0 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20  beSetColName(v, 
107d0 69 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c  i, COLNAME_NAME,
107e0 20 7a 4e 61 6d 65 2c 20 53 51 4c 49 54 45 5f 54   zName, SQLITE_T
107f0 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20 7d  RANSIENT);.    }
10800 65 6c 73 65 20 69 66 28 20 73 72 63 4e 61 6d 65  else if( srcName
10810 20 26 26 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f   && p->op==TK_CO
10820 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 20 20 63 68  LUMN ){.      ch
10830 61 72 20 2a 7a 43 6f 6c 3b 0a 20 20 20 20 20 20  ar *zCol;.      
10840 69 6e 74 20 69 43 6f 6c 20 3d 20 70 2d 3e 69 43  int iCol = p->iC
10850 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 70 54 61  olumn;.      pTa
10860 62 20 3d 20 70 2d 3e 70 54 61 62 3b 0a 20 20 20  b = p->pTab;.   
10870 20 20 20 61 73 73 65 72 74 28 20 70 54 61 62 21     assert( pTab!
10880 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  =0 );.      if( 
10890 69 43 6f 6c 3c 30 20 29 20 69 43 6f 6c 20 3d 20  iCol<0 ) iCol = 
108a0 70 54 61 62 2d 3e 69 50 4b 65 79 3b 0a 20 20 20  pTab->iPKey;.   
108b0 20 20 20 61 73 73 65 72 74 28 20 69 43 6f 6c 3d     assert( iCol=
108c0 3d 2d 31 20 7c 7c 20 28 69 43 6f 6c 3e 3d 30 20  =-1 || (iCol>=0 
108d0 26 26 20 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43  && iCol<pTab->nC
108e0 6f 6c 29 20 29 3b 0a 20 20 20 20 20 20 69 66 28  ol) );.      if(
108f0 20 69 43 6f 6c 3c 30 20 29 7b 0a 20 20 20 20 20   iCol<0 ){.     
10900 20 20 20 7a 43 6f 6c 20 3d 20 22 72 6f 77 69 64     zCol = "rowid
10910 22 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  ";.      }else{.
10920 20 20 20 20 20 20 20 20 7a 43 6f 6c 20 3d 20 70          zCol = p
10930 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e  Tab->aCol[iCol].
10940 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 7d 0a 20  zName;.      }. 
10950 20 20 20 20 20 69 66 28 20 66 75 6c 6c 4e 61 6d       if( fullNam
10960 65 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61  e ){.        cha
10970 72 20 2a 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20  r *zName = 0;.  
10980 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71        zName = sq
10990 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c  lite3MPrintf(db,
109a0 20 22 25 73 2e 25 73 22 2c 20 70 54 61 62 2d 3e   "%s.%s", pTab->
109b0 7a 4e 61 6d 65 2c 20 7a 43 6f 6c 29 3b 0a 20 20  zName, zCol);.  
109c0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
109d0 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69  eSetColName(v, i
109e0 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20  , COLNAME_NAME, 
109f0 7a 4e 61 6d 65 2c 20 53 51 4c 49 54 45 5f 44 59  zName, SQLITE_DY
10a00 4e 41 4d 49 43 29 3b 0a 20 20 20 20 20 20 7d 65  NAMIC);.      }e
10a10 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  lse{.        sql
10a20 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61  ite3VdbeSetColNa
10a30 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45  me(v, i, COLNAME
10a40 5f 4e 41 4d 45 2c 20 7a 43 6f 6c 2c 20 53 51 4c  _NAME, zCol, SQL
10a50 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a  ITE_TRANSIENT);.
10a60 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
10a70 65 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63  e{.      const c
10a80 68 61 72 20 2a 7a 20 3d 20 70 45 4c 69 73 74 2d  har *z = pEList-
10a90 3e 61 5b 69 5d 2e 7a 53 70 61 6e 3b 0a 20 20 20  >a[i].zSpan;.   
10aa0 20 20 20 7a 20 3d 20 7a 3d 3d 30 20 3f 20 73 71     z = z==0 ? sq
10ab0 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c  lite3MPrintf(db,
10ac0 20 22 63 6f 6c 75 6d 6e 25 64 22 2c 20 69 2b 31   "column%d", i+1
10ad0 29 20 3a 20 73 71 6c 69 74 65 33 44 62 53 74 72  ) : sqlite3DbStr
10ae0 44 75 70 28 64 62 2c 20 7a 29 3b 0a 20 20 20 20  Dup(db, z);.    
10af0 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74    sqlite3VdbeSet
10b00 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f  ColName(v, i, CO
10b10 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20 7a 2c 20 53  LNAME_NAME, z, S
10b20 51 4c 49 54 45 5f 44 59 4e 41 4d 49 43 29 3b 0a  QLITE_DYNAMIC);.
10b30 20 20 20 20 7d 0a 20 20 7d 0a 20 20 67 65 6e 65      }.  }.  gene
10b40 72 61 74 65 43 6f 6c 75 6d 6e 54 79 70 65 73 28  rateColumnTypes(
10b50 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74  pParse, pTabList
10b60 2c 20 70 45 4c 69 73 74 29 3b 0a 7d 0a 0a 2f 2a  , pEList);.}../*
10b70 0a 2a 2a 20 47 69 76 65 6e 20 61 6e 20 65 78 70  .** Given an exp
10b80 72 65 73 73 69 6f 6e 20 6c 69 73 74 20 28 77 68  ression list (wh
10b90 69 63 68 20 69 73 20 72 65 61 6c 6c 79 20 74 68  ich is really th
10ba0 65 20 6c 69 73 74 20 6f 66 20 65 78 70 72 65 73  e list of expres
10bb0 73 69 6f 6e 73 0a 2a 2a 20 74 68 61 74 20 66 6f  sions.** that fo
10bc0 72 6d 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  rm the result se
10bd0 74 20 6f 66 20 61 20 53 45 4c 45 43 54 20 73 74  t of a SELECT st
10be0 61 74 65 6d 65 6e 74 29 20 63 6f 6d 70 75 74 65  atement) compute
10bf0 20 61 70 70 72 6f 70 72 69 61 74 65 0a 2a 2a 20   appropriate.** 
10c00 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 66 6f 72  column names for
10c10 20 61 20 74 61 62 6c 65 20 74 68 61 74 20 77 6f   a table that wo
10c20 75 6c 64 20 68 6f 6c 64 20 74 68 65 20 65 78 70  uld hold the exp
10c30 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2a  ression list..**
10c40 0a 2a 2a 20 41 6c 6c 20 63 6f 6c 75 6d 6e 20 6e  .** All column n
10c50 61 6d 65 73 20 77 69 6c 6c 20 62 65 20 75 6e 69  ames will be uni
10c60 71 75 65 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20  que..**.** Only 
10c70 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73  the column names
10c80 20 61 72 65 20 63 6f 6d 70 75 74 65 64 2e 20 20   are computed.  
10c90 43 6f 6c 75 6d 6e 2e 7a 54 79 70 65 2c 20 43 6f  Column.zType, Co
10ca0 6c 75 6d 6e 2e 7a 43 6f 6c 6c 2c 0a 2a 2a 20 61  lumn.zColl,.** a
10cb0 6e 64 20 6f 74 68 65 72 20 66 69 65 6c 64 73 20  nd other fields 
10cc0 6f 66 20 43 6f 6c 75 6d 6e 20 61 72 65 20 7a 65  of Column are ze
10cd0 72 6f 65 64 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75  roed..**.** Retu
10ce0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20  rn SQLITE_OK on 
10cf0 73 75 63 63 65 73 73 2e 20 20 49 66 20 61 20 6d  success.  If a m
10d00 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e  emory allocation
10d10 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 0a 2a   error occurs,.*
10d20 2a 20 73 74 6f 72 65 20 4e 55 4c 4c 20 69 6e 20  * store NULL in 
10d30 2a 70 61 43 6f 6c 20 61 6e 64 20 30 20 69 6e 20  *paCol and 0 in 
10d40 2a 70 6e 43 6f 6c 20 61 6e 64 20 72 65 74 75 72  *pnCol and retur
10d50 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2e 0a  n SQLITE_NOMEM..
10d60 2a 2a 0a 2a 2a 20 54 68 65 20 6f 6e 6c 79 20 67  **.** The only g
10d70 75 61 72 61 6e 74 65 65 20 74 68 61 74 20 53 51  uarantee that SQ
10d80 4c 69 74 65 20 6d 61 6b 65 73 20 61 62 6f 75 74  Lite makes about
10d90 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 69 73   column names is
10da0 20 74 68 61 74 20 69 66 20 74 68 65 0a 2a 2a 20   that if the.** 
10db0 63 6f 6c 75 6d 6e 20 68 61 73 20 61 6e 20 41 53  column has an AS
10dc0 20 63 6c 61 75 73 65 20 61 73 73 69 67 6e 69 6e   clause assignin
10dd0 67 20 69 74 20 61 20 6e 61 6d 65 2c 20 74 68 61  g it a name, tha
10de0 74 20 77 69 6c 6c 20 62 65 20 74 68 65 20 6e 61  t will be the na
10df0 6d 65 20 75 73 65 64 2e 0a 2a 2a 20 54 68 61 74  me used..** That
10e00 20 69 73 20 74 68 65 20 6f 6e 6c 79 20 64 6f 63   is the only doc
10e10 75 6d 65 6e 74 65 64 20 67 75 61 72 61 6e 74 65  umented guarante
10e20 65 2e 20 20 48 6f 77 65 76 65 72 2c 20 63 6f 75  e.  However, cou
10e30 6e 74 6c 65 73 73 20 61 70 70 6c 69 63 61 74 69  ntless applicati
10e40 6f 6e 73 0a 2a 2a 20 64 65 76 65 6c 6f 70 65 64  ons.** developed
10e50 20 6f 76 65 72 20 74 68 65 20 79 65 61 72 73 20   over the years 
10e60 68 61 76 65 20 6d 61 64 65 20 62 61 73 65 6c 65  have made basele
10e70 73 73 20 61 73 73 75 6d 70 74 69 6f 6e 73 20 61  ss assumptions a
10e80 62 6f 75 74 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65  bout column name
10e90 73 0a 2a 2a 20 61 6e 64 20 77 69 6c 6c 20 62 72  s.** and will br
10ea0 65 61 6b 20 69 66 20 74 68 6f 73 65 20 61 73 73  eak if those ass
10eb0 75 6d 70 74 69 6f 6e 73 20 63 68 61 6e 67 65 73  umptions changes
10ec0 2e 20 20 48 65 6e 63 65 2c 20 75 73 65 20 65 78  .  Hence, use ex
10ed0 74 72 65 6d 65 20 63 61 75 74 69 6f 6e 0a 2a 2a  treme caution.**
10ee0 20 77 68 65 6e 20 6d 6f 64 69 66 79 69 6e 67 20   when modifying 
10ef0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 74 6f 20  this routine to 
10f00 61 76 6f 69 64 20 62 72 65 61 6b 69 6e 67 20 6c  avoid breaking l
10f10 65 67 61 63 79 2e 0a 2a 2a 0a 2a 2a 20 53 65 65  egacy..**.** See
10f20 20 41 6c 73 6f 3a 20 67 65 6e 65 72 61 74 65 43   Also: generateC
10f30 6f 6c 75 6d 6e 4e 61 6d 65 73 28 29 0a 2a 2f 0a  olumnNames().*/.
10f40 69 6e 74 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d  int sqlite3Colum
10f50 6e 73 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 0a  nsFromExprList(.
10f60 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
10f70 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72            /* Par
10f80 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
10f90 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69    ExprList *pELi
10fa0 73 74 2c 20 20 20 20 20 20 20 2f 2a 20 45 78 70  st,       /* Exp
10fb0 72 20 6c 69 73 74 20 66 72 6f 6d 20 77 68 69 63  r list from whic
10fc0 68 20 74 6f 20 64 65 72 69 76 65 20 63 6f 6c 75  h to derive colu
10fd0 6d 6e 20 6e 61 6d 65 73 20 2a 2f 0a 20 20 69 31  mn names */.  i1
10fe0 36 20 2a 70 6e 43 6f 6c 2c 20 20 20 20 20 20 20  6 *pnCol,       
10ff0 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74        /* Write t
11000 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c  he number of col
11010 75 6d 6e 73 20 68 65 72 65 20 2a 2f 0a 20 20 43  umns here */.  C
11020 6f 6c 75 6d 6e 20 2a 2a 70 61 43 6f 6c 20 20 20  olumn **paCol   
11030 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20         /* Write 
11040 74 68 65 20 6e 65 77 20 63 6f 6c 75 6d 6e 20 6c  the new column l
11050 69 73 74 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20  ist here */.){. 
11060 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
11070 50 61 72 73 65 2d 3e 64 62 3b 20 20 20 2f 2a 20  Parse->db;   /* 
11080 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  Database connect
11090 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 2c 20  ion */.  int i, 
110a0 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  j;              
110b0 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
110c0 6e 74 65 72 73 20 2a 2f 0a 20 20 75 33 32 20 63  nters */.  u32 c
110d0 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  nt;             
110e0 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
110f0 61 64 64 65 64 20 74 6f 20 6d 61 6b 65 20 74 68  added to make th
11100 65 20 6e 61 6d 65 20 75 6e 69 71 75 65 20 2a 2f  e name unique */
11110 0a 20 20 43 6f 6c 75 6d 6e 20 2a 61 43 6f 6c 2c  .  Column *aCol,
11120 20 2a 70 43 6f 6c 3b 20 20 20 20 20 20 20 20 2f   *pCol;        /
11130 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76  * For looping ov
11140 65 72 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e  er result column
11150 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c 3b  s */.  int nCol;
11160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11170 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
11180 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 72  columns in the r
11190 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 20 20 63  esult set */.  c
111a0 68 61 72 20 2a 7a 4e 61 6d 65 3b 20 20 20 20 20  har *zName;     
111b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
111c0 6c 75 6d 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 69  lumn name */.  i
111d0 6e 74 20 6e 4e 61 6d 65 3b 20 20 20 20 20 20 20  nt nName;       
111e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
111f0 7a 65 20 6f 66 20 6e 61 6d 65 20 69 6e 20 7a 4e  ze of name in zN
11200 61 6d 65 5b 5d 20 2a 2f 0a 20 20 48 61 73 68 20  ame[] */.  Hash 
11210 68 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ht;             
11220 20 20 20 20 20 20 20 2f 2a 20 48 61 73 68 20 74         /* Hash t
11230 61 62 6c 65 20 6f 66 20 63 6f 6c 75 6d 6e 20 6e  able of column n
11240 61 6d 65 73 20 2a 2f 0a 0a 20 20 73 71 6c 69 74  ames */..  sqlit
11250 65 33 48 61 73 68 49 6e 69 74 28 26 68 74 29 3b  e3HashInit(&ht);
11260 0a 20 20 69 66 28 20 70 45 4c 69 73 74 20 29 7b  .  if( pEList ){
11270 0a 20 20 20 20 6e 43 6f 6c 20 3d 20 70 45 4c 69  .    nCol = pELi
11280 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 61  st->nExpr;.    a
11290 43 6f 6c 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  Col = sqlite3DbM
112a0 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69  allocZero(db, si
112b0 7a 65 6f 66 28 61 43 6f 6c 5b 30 5d 29 2a 6e 43  zeof(aCol[0])*nC
112c0 6f 6c 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  ol);.    testcas
112d0 65 28 20 61 43 6f 6c 3d 3d 30 20 29 3b 0a 20 20  e( aCol==0 );.  
112e0 20 20 69 66 28 20 6e 43 6f 6c 3e 33 32 37 36 37    if( nCol>32767
112f0 20 29 20 6e 43 6f 6c 20 3d 20 33 32 37 36 37 3b   ) nCol = 32767;
11300 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 43  .  }else{.    nC
11310 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 61 43 6f 6c  ol = 0;.    aCol
11320 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 61 73 73 65   = 0;.  }.  asse
11330 72 74 28 20 6e 43 6f 6c 3d 3d 28 69 31 36 29 6e  rt( nCol==(i16)n
11340 43 6f 6c 20 29 3b 0a 20 20 2a 70 6e 43 6f 6c 20  Col );.  *pnCol 
11350 3d 20 6e 43 6f 6c 3b 0a 20 20 2a 70 61 43 6f 6c  = nCol;.  *paCol
11360 20 3d 20 61 43 6f 6c 3b 0a 0a 20 20 66 6f 72 28   = aCol;..  for(
11370 69 3d 30 2c 20 70 43 6f 6c 3d 61 43 6f 6c 3b 20  i=0, pCol=aCol; 
11380 69 3c 6e 43 6f 6c 20 26 26 20 21 64 62 2d 3e 6d  i<nCol && !db->m
11390 61 6c 6c 6f 63 46 61 69 6c 65 64 3b 20 69 2b 2b  allocFailed; i++
113a0 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 2f  , pCol++){.    /
113b0 2a 20 47 65 74 20 61 6e 20 61 70 70 72 6f 70 72  * Get an appropr
113c0 69 61 74 65 20 6e 61 6d 65 20 66 6f 72 20 74 68  iate name for th
113d0 65 20 63 6f 6c 75 6d 6e 0a 20 20 20 20 2a 2f 0a  e column.    */.
113e0 20 20 20 20 69 66 28 20 28 7a 4e 61 6d 65 20 3d      if( (zName =
113f0 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e   pEList->a[i].zN
11400 61 6d 65 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  ame)!=0 ){.     
11410 20 2f 2a 20 49 66 20 74 68 65 20 63 6f 6c 75 6d   /* If the colum
11420 6e 20 63 6f 6e 74 61 69 6e 73 20 61 6e 20 22 41  n contains an "A
11430 53 20 3c 6e 61 6d 65 3e 22 20 70 68 72 61 73 65  S <name>" phrase
11440 2c 20 75 73 65 20 3c 6e 61 6d 65 3e 20 61 73 20  , use <name> as 
11450 74 68 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20  the name */.    
11460 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 45 78 70  }else{.      Exp
11470 72 20 2a 70 43 6f 6c 45 78 70 72 20 3d 20 73 71  r *pColExpr = sq
11480 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c  lite3ExprSkipCol
11490 6c 61 74 65 28 70 45 4c 69 73 74 2d 3e 61 5b 69  late(pEList->a[i
114a0 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20  ].pExpr);.      
114b0 77 68 69 6c 65 28 20 70 43 6f 6c 45 78 70 72 2d  while( pColExpr-
114c0 3e 6f 70 3d 3d 54 4b 5f 44 4f 54 20 29 7b 0a 20  >op==TK_DOT ){. 
114d0 20 20 20 20 20 20 20 70 43 6f 6c 45 78 70 72 20         pColExpr 
114e0 3d 20 70 43 6f 6c 45 78 70 72 2d 3e 70 52 69 67  = pColExpr->pRig
114f0 68 74 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  ht;.        asse
11500 72 74 28 20 70 43 6f 6c 45 78 70 72 21 3d 30 20  rt( pColExpr!=0 
11510 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
11520 20 61 73 73 65 72 74 28 20 70 43 6f 6c 45 78 70   assert( pColExp
11530 72 2d 3e 6f 70 21 3d 54 4b 5f 41 47 47 5f 43 4f  r->op!=TK_AGG_CO
11540 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20 69 66  LUMN );.      if
11550 28 20 70 43 6f 6c 45 78 70 72 2d 3e 6f 70 3d 3d  ( pColExpr->op==
11560 54 4b 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20  TK_COLUMN ){.   
11570 20 20 20 20 20 2f 2a 20 46 6f 72 20 63 6f 6c 75       /* For colu
11580 6d 6e 73 20 75 73 65 20 74 68 65 20 63 6f 6c 75  mns use the colu
11590 6d 6e 20 6e 61 6d 65 20 6e 61 6d 65 20 2a 2f 0a  mn name name */.
115a0 20 20 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6c          int iCol
115b0 20 3d 20 70 43 6f 6c 45 78 70 72 2d 3e 69 43 6f   = pColExpr->iCo
115c0 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 20 20 54 61  lumn;.        Ta
115d0 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 43 6f 6c  ble *pTab = pCol
115e0 45 78 70 72 2d 3e 70 54 61 62 3b 0a 20 20 20 20  Expr->pTab;.    
115f0 20 20 20 20 61 73 73 65 72 74 28 20 70 54 61 62      assert( pTab
11600 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69  !=0 );.        i
11610 66 28 20 69 43 6f 6c 3c 30 20 29 20 69 43 6f 6c  f( iCol<0 ) iCol
11620 20 3d 20 70 54 61 62 2d 3e 69 50 4b 65 79 3b 0a   = pTab->iPKey;.
11630 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20          zName = 
11640 69 43 6f 6c 3e 3d 30 20 3f 20 70 54 61 62 2d 3e  iCol>=0 ? pTab->
11650 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65  aCol[iCol].zName
11660 20 3a 20 22 72 6f 77 69 64 22 3b 0a 20 20 20 20   : "rowid";.    
11670 20 20 7d 65 6c 73 65 20 69 66 28 20 70 43 6f 6c    }else if( pCol
11680 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 44 20  Expr->op==TK_ID 
11690 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ){.        asser
116a0 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  t( !ExprHasPrope
116b0 72 74 79 28 70 43 6f 6c 45 78 70 72 2c 20 45 50  rty(pColExpr, EP
116c0 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20 20  _IntValue) );.  
116d0 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 70 43        zName = pC
116e0 6f 6c 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e  olExpr->u.zToken
116f0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
11700 20 20 20 20 20 20 20 2f 2a 20 55 73 65 20 74 68         /* Use th
11710 65 20 6f 72 69 67 69 6e 61 6c 20 74 65 78 74 20  e original text 
11720 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 65 78  of the column ex
11730 70 72 65 73 73 69 6f 6e 20 61 73 20 69 74 73 20  pression as its 
11740 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 20 20 20 20  name */.        
11750 7a 4e 61 6d 65 20 3d 20 70 45 4c 69 73 74 2d 3e  zName = pEList->
11760 61 5b 69 5d 2e 7a 53 70 61 6e 3b 0a 20 20 20 20  a[i].zSpan;.    
11770 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
11780 28 20 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20  ( zName ){.     
11790 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33   zName = sqlite3
117a0 44 62 53 74 72 44 75 70 28 64 62 2c 20 7a 4e 61  DbStrDup(db, zNa
117b0 6d 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  me);.    }else{.
117c0 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71        zName = sq
117d0 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c  lite3MPrintf(db,
117e0 22 63 6f 6c 75 6d 6e 25 64 22 2c 69 2b 31 29 3b  "column%d",i+1);
117f0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4d  .    }..    /* M
11800 61 6b 65 20 73 75 72 65 20 74 68 65 20 63 6f 6c  ake sure the col
11810 75 6d 6e 20 6e 61 6d 65 20 69 73 20 75 6e 69 71  umn name is uniq
11820 75 65 2e 20 20 49 66 20 74 68 65 20 6e 61 6d 65  ue.  If the name
11830 20 69 73 20 6e 6f 74 20 75 6e 69 71 75 65 2c 0a   is not unique,.
11840 20 20 20 20 2a 2a 20 61 70 70 65 6e 64 20 61 6e      ** append an
11850 20 69 6e 74 65 67 65 72 20 74 6f 20 74 68 65 20   integer to the 
11860 6e 61 6d 65 20 73 6f 20 74 68 61 74 20 69 74 20  name so that it 
11870 62 65 63 6f 6d 65 73 20 75 6e 69 71 75 65 2e 0a  becomes unique..
11880 20 20 20 20 2a 2f 0a 20 20 20 20 63 6e 74 20 3d      */.    cnt =
11890 20 30 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 7a   0;.    while( z
118a0 4e 61 6d 65 20 26 26 20 73 71 6c 69 74 65 33 48  Name && sqlite3H
118b0 61 73 68 46 69 6e 64 28 26 68 74 2c 20 7a 4e 61  ashFind(&ht, zNa
118c0 6d 65 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  me)!=0 ){.      
118d0 6e 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 53  nName = sqlite3S
118e0 74 72 6c 65 6e 33 30 28 7a 4e 61 6d 65 29 3b 0a  trlen30(zName);.
118f0 20 20 20 20 20 20 69 66 28 20 6e 4e 61 6d 65 3e        if( nName>
11900 30 20 29 7b 0a 20 20 20 20 20 20 20 20 66 6f 72  0 ){.        for
11910 28 6a 3d 6e 4e 61 6d 65 2d 31 3b 20 6a 3e 30 20  (j=nName-1; j>0 
11920 26 26 20 73 71 6c 69 74 65 33 49 73 64 69 67 69  && sqlite3Isdigi
11930 74 28 7a 4e 61 6d 65 5b 6a 5d 29 3b 20 6a 2d 2d  t(zName[j]); j--
11940 29 7b 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20  ){}.        if( 
11950 7a 4e 61 6d 65 5b 6a 5d 3d 3d 27 3a 27 20 29 20  zName[j]==':' ) 
11960 6e 4e 61 6d 65 20 3d 20 6a 3b 0a 20 20 20 20 20  nName = j;.     
11970 20 7d 0a 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d   }.      zName =
11980 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28   sqlite3MPrintf(
11990 64 62 2c 20 22 25 2e 2a 7a 3a 25 75 22 2c 20 6e  db, "%.*z:%u", n
119a0 4e 61 6d 65 2c 20 7a 4e 61 6d 65 2c 20 2b 2b 63  Name, zName, ++c
119b0 6e 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 63  nt);.      if( c
119c0 6e 74 3e 33 20 29 20 73 71 6c 69 74 65 33 5f 72  nt>3 ) sqlite3_r
119d0 61 6e 64 6f 6d 6e 65 73 73 28 73 69 7a 65 6f 66  andomness(sizeof
119e0 28 63 6e 74 29 2c 20 26 63 6e 74 29 3b 0a 20 20  (cnt), &cnt);.  
119f0 20 20 7d 0a 20 20 20 20 70 43 6f 6c 2d 3e 7a 4e    }.    pCol->zN
11a00 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20 20  ame = zName;.   
11a10 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 50 72   sqlite3ColumnPr
11a20 6f 70 65 72 74 69 65 73 46 72 6f 6d 4e 61 6d 65  opertiesFromName
11a30 28 30 2c 20 70 43 6f 6c 29 3b 0a 20 20 20 20 69  (0, pCol);.    i
11a40 66 28 20 7a 4e 61 6d 65 20 26 26 20 73 71 6c 69  f( zName && sqli
11a50 74 65 33 48 61 73 68 49 6e 73 65 72 74 28 26 68  te3HashInsert(&h
11a60 74 2c 20 7a 4e 61 6d 65 2c 20 70 43 6f 6c 29 3d  t, zName, pCol)=
11a70 3d 70 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20 73  =pCol ){.      s
11a80 71 6c 69 74 65 33 4f 6f 6d 46 61 75 6c 74 28 64  qlite3OomFault(d
11a90 62 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  b);.    }.  }.  
11aa0 73 71 6c 69 74 65 33 48 61 73 68 43 6c 65 61 72  sqlite3HashClear
11ab0 28 26 68 74 29 3b 0a 20 20 69 66 28 20 64 62 2d  (&ht);.  if( db-
11ac0 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b  >mallocFailed ){
11ad0 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c  .    for(j=0; j<
11ae0 69 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 73  i; j++){.      s
11af0 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
11b00 20 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 29 3b   aCol[j].zName);
11b10 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
11b20 65 33 44 62 46 72 65 65 28 64 62 2c 20 61 43 6f  e3DbFree(db, aCo
11b30 6c 29 3b 0a 20 20 20 20 2a 70 61 43 6f 6c 20 3d  l);.    *paCol =
11b40 20 30 3b 0a 20 20 20 20 2a 70 6e 43 6f 6c 20 3d   0;.    *pnCol =
11b50 20 30 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   0;.    return S
11b60 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54  QLITE_NOMEM_BKPT
11b70 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
11b80 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
11b90 2a 2a 20 41 64 64 20 74 79 70 65 20 61 6e 64 20  ** Add type and 
11ba0 63 6f 6c 6c 61 74 69 6f 6e 20 69 6e 66 6f 72 6d  collation inform
11bb0 61 74 69 6f 6e 20 74 6f 20 61 20 63 6f 6c 75 6d  ation to a colum
11bc0 6e 20 6c 69 73 74 20 62 61 73 65 64 20 6f 6e 0a  n list based on.
11bd0 2a 2a 20 61 20 53 45 4c 45 43 54 20 73 74 61 74  ** a SELECT stat
11be0 65 6d 65 6e 74 2e 0a 2a 2a 20 0a 2a 2a 20 54 68  ement..** .** Th
11bf0 65 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 20 70 72  e column list pr
11c00 65 73 75 6d 61 62 6c 79 20 63 61 6d 65 20 66 72  esumably came fr
11c10 6f 6d 20 73 65 6c 65 63 74 43 6f 6c 75 6d 6e 4e  om selectColumnN
11c20 61 6d 65 73 46 72 6f 6d 45 78 70 72 4c 69 73 74  amesFromExprList
11c30 28 29 2e 0a 2a 2a 20 54 68 65 20 63 6f 6c 75 6d  ()..** The colum
11c40 6e 20 6c 69 73 74 20 68 61 73 20 6f 6e 6c 79 20  n list has only 
11c50 6e 61 6d 65 73 2c 20 6e 6f 74 20 74 79 70 65 73  names, not types
11c60 20 6f 72 20 63 6f 6c 6c 61 74 69 6f 6e 73 2e 20   or collations. 
11c70 20 54 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65   This.** routine
11c80 20 67 6f 65 73 20 74 68 72 6f 75 67 68 20 61 6e   goes through an
11c90 64 20 61 64 64 73 20 74 68 65 20 74 79 70 65 73  d adds the types
11ca0 20 61 6e 64 20 63 6f 6c 6c 61 74 69 6f 6e 73 2e   and collations.
11cb0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
11cc0 69 6e 65 20 72 65 71 75 69 72 65 73 20 74 68 61  ine requires tha
11cd0 74 20 61 6c 6c 20 69 64 65 6e 74 69 66 69 65 72  t all identifier
11ce0 73 20 69 6e 20 74 68 65 20 53 45 4c 45 43 54 0a  s in the SELECT.
11cf0 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 62 65 20  ** statement be 
11d00 72 65 73 6f 6c 76 65 64 2e 0a 2a 2f 0a 76 6f 69  resolved..*/.voi
11d10 64 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 41  d sqlite3SelectA
11d20 64 64 43 6f 6c 75 6d 6e 54 79 70 65 41 6e 64 43  ddColumnTypeAndC
11d30 6f 6c 6c 61 74 69 6f 6e 28 0a 20 20 50 61 72 73  ollation(.  Pars
11d40 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
11d50 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
11d60 74 65 78 74 73 20 2a 2f 0a 20 20 54 61 62 6c 65  texts */.  Table
11d70 20 2a 70 54 61 62 2c 20 20 20 20 20 20 20 20 20   *pTab,         
11d80 20 2f 2a 20 41 64 64 20 63 6f 6c 75 6d 6e 20 74   /* Add column t
11d90 79 70 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ype information 
11da0 74 6f 20 74 68 69 73 20 74 61 62 6c 65 20 2a 2f  to this table */
11db0 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65  .  Select *pSele
11dc0 63 74 20 20 20 20 20 20 20 2f 2a 20 53 45 4c 45  ct       /* SELE
11dd0 43 54 20 75 73 65 64 20 74 6f 20 64 65 74 65 72  CT used to deter
11de0 6d 69 6e 65 20 74 79 70 65 73 20 61 6e 64 20 63  mine types and c
11df0 6f 6c 6c 61 74 69 6f 6e 73 20 2a 2f 0a 29 7b 0a  ollations */.){.
11e00 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
11e10 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 4e 61  pParse->db;.  Na
11e20 6d 65 43 6f 6e 74 65 78 74 20 73 4e 43 3b 0a 20  meContext sNC;. 
11e30 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20   Column *pCol;. 
11e40 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b   CollSeq *pColl;
11e50 0a 20 20 69 6e 74 20 69 3b 0a 20 20 45 78 70 72  .  int i;.  Expr
11e60 20 2a 70 3b 0a 20 20 73 74 72 75 63 74 20 45 78   *p;.  struct Ex
11e70 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 61 3b 0a  prList_item *a;.
11e80 0a 20 20 61 73 73 65 72 74 28 20 70 53 65 6c 65  .  assert( pSele
11e90 63 74 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  ct!=0 );.  asser
11ea0 74 28 20 28 70 53 65 6c 65 63 74 2d 3e 73 65 6c  t( (pSelect->sel
11eb0 46 6c 61 67 73 20 26 20 53 46 5f 52 65 73 6f 6c  Flags & SF_Resol
11ec0 76 65 64 29 21 3d 30 20 29 3b 0a 20 20 61 73 73  ved)!=0 );.  ass
11ed0 65 72 74 28 20 70 54 61 62 2d 3e 6e 43 6f 6c 3d  ert( pTab->nCol=
11ee0 3d 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74  =pSelect->pEList
11ef0 2d 3e 6e 45 78 70 72 20 7c 7c 20 64 62 2d 3e 6d  ->nExpr || db->m
11f00 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20  allocFailed );. 
11f10 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   if( db->mallocF
11f20 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a  ailed ) return;.
11f30 20 20 6d 65 6d 73 65 74 28 26 73 4e 43 2c 20 30    memset(&sNC, 0
11f40 2c 20 73 69 7a 65 6f 66 28 73 4e 43 29 29 3b 0a  , sizeof(sNC));.
11f50 20 20 73 4e 43 2e 70 53 72 63 4c 69 73 74 20 3d    sNC.pSrcList =
11f60 20 70 53 65 6c 65 63 74 2d 3e 70 53 72 63 3b 0a   pSelect->pSrc;.
11f70 20 20 61 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70    a = pSelect->p
11f80 45 4c 69 73 74 2d 3e 61 3b 0a 20 20 66 6f 72 28  EList->a;.  for(
11f90 69 3d 30 2c 20 70 43 6f 6c 3d 70 54 61 62 2d 3e  i=0, pCol=pTab->
11fa0 61 43 6f 6c 3b 20 69 3c 70 54 61 62 2d 3e 6e 43  aCol; i<pTab->nC
11fb0 6f 6c 3b 20 69 2b 2b 2c 20 70 43 6f 6c 2b 2b 29  ol; i++, pCol++)
11fc0 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  {.    const char
11fd0 20 2a 7a 54 79 70 65 3b 0a 20 20 20 20 69 6e 74   *zType;.    int
11fe0 20 6e 2c 20 6d 3b 0a 20 20 20 20 70 20 3d 20 61   n, m;.    p = a
11ff0 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 7a  [i].pExpr;.    z
12000 54 79 70 65 20 3d 20 63 6f 6c 75 6d 6e 54 79 70  Type = columnTyp
12010 65 28 26 73 4e 43 2c 20 70 2c 20 30 2c 20 30 2c  e(&sNC, p, 0, 0,
12020 20 30 29 3b 0a 20 20 20 20 2f 2a 20 70 43 6f 6c   0);.    /* pCol
12030 2d 3e 73 7a 45 73 74 20 3d 20 2e 2e 2e 20 2f 2f  ->szEst = ... //
12040 20 43 6f 6c 75 6d 6e 20 73 69 7a 65 20 65 73 74   Column size est
12050 20 66 6f 72 20 53 45 4c 45 43 54 20 74 61 62 6c   for SELECT tabl
12060 65 73 20 6e 65 76 65 72 20 75 73 65 64 20 2a 2f  es never used */
12070 0a 20 20 20 20 70 43 6f 6c 2d 3e 61 66 66 69 6e  .    pCol->affin
12080 69 74 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ity = sqlite3Exp
12090 72 41 66 66 69 6e 69 74 79 28 70 29 3b 0a 20 20  rAffinity(p);.  
120a0 20 20 69 66 28 20 7a 54 79 70 65 20 29 7b 0a 20    if( zType ){. 
120b0 20 20 20 20 20 6d 20 3d 20 73 71 6c 69 74 65 33       m = sqlite3
120c0 53 74 72 6c 65 6e 33 30 28 7a 54 79 70 65 29 3b  Strlen30(zType);
120d0 0a 20 20 20 20 20 20 6e 20 3d 20 73 71 6c 69 74  .      n = sqlit
120e0 65 33 53 74 72 6c 65 6e 33 30 28 70 43 6f 6c 2d  e3Strlen30(pCol-
120f0 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 70  >zName);.      p
12100 43 6f 6c 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c  Col->zName = sql
12110 69 74 65 33 44 62 52 65 61 6c 6c 6f 63 4f 72 46  ite3DbReallocOrF
12120 72 65 65 28 64 62 2c 20 70 43 6f 6c 2d 3e 7a 4e  ree(db, pCol->zN
12130 61 6d 65 2c 20 6e 2b 6d 2b 32 29 3b 0a 20 20 20  ame, n+m+2);.   
12140 20 20 20 69 66 28 20 70 43 6f 6c 2d 3e 7a 4e 61     if( pCol->zNa
12150 6d 65 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 65  me ){.        me
12160 6d 63 70 79 28 26 70 43 6f 6c 2d 3e 7a 4e 61 6d  mcpy(&pCol->zNam
12170 65 5b 6e 2b 31 5d 2c 20 7a 54 79 70 65 2c 20 6d  e[n+1], zType, m
12180 2b 31 29 3b 0a 20 20 20 20 20 20 20 20 70 43 6f  +1);.        pCo
12190 6c 2d 3e 63 6f 6c 46 6c 61 67 73 20 7c 3d 20 43  l->colFlags |= C
121a0 4f 4c 46 4c 41 47 5f 48 41 53 54 59 50 45 3b 0a  OLFLAG_HASTYPE;.
121b0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
121c0 20 20 69 66 28 20 70 43 6f 6c 2d 3e 61 66 66 69    if( pCol->affi
121d0 6e 69 74 79 3d 3d 30 20 29 20 70 43 6f 6c 2d 3e  nity==0 ) pCol->
121e0 61 66 66 69 6e 69 74 79 20 3d 20 53 51 4c 49 54  affinity = SQLIT
121f0 45 5f 41 46 46 5f 42 4c 4f 42 3b 0a 20 20 20 20  E_AFF_BLOB;.    
12200 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45  pColl = sqlite3E
12210 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  xprCollSeq(pPars
12220 65 2c 20 70 29 3b 0a 20 20 20 20 69 66 28 20 70  e, p);.    if( p
12230 43 6f 6c 6c 20 26 26 20 70 43 6f 6c 2d 3e 7a 43  Coll && pCol->zC
12240 6f 6c 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  oll==0 ){.      
12250 70 43 6f 6c 2d 3e 7a 43 6f 6c 6c 20 3d 20 73 71  pCol->zColl = sq
12260 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62  lite3DbStrDup(db
12270 2c 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 29 3b  , pColl->zName);
12280 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 54 61  .    }.  }.  pTa
12290 62 2d 3e 73 7a 54 61 62 52 6f 77 20 3d 20 31 3b  b->szTabRow = 1;
122a0 20 2f 2a 20 41 6e 79 20 6e 6f 6e 2d 7a 65 72 6f   /* Any non-zero
122b0 20 76 61 6c 75 65 20 77 6f 72 6b 73 20 2a 2f 0a   value works */.
122c0 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61  }../*.** Given a
122d0 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
122e0 74 2c 20 67 65 6e 65 72 61 74 65 20 61 20 54 61  t, generate a Ta
122f0 62 6c 65 20 73 74 72 75 63 74 75 72 65 20 74 68  ble structure th
12300 61 74 20 64 65 73 63 72 69 62 65 73 0a 2a 2a 20  at describes.** 
12310 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 6f  the result set o
12320 66 20 74 68 61 74 20 53 45 4c 45 43 54 2e 0a 2a  f that SELECT..*
12330 2f 0a 54 61 62 6c 65 20 2a 73 71 6c 69 74 65 33  /.Table *sqlite3
12340 52 65 73 75 6c 74 53 65 74 4f 66 53 65 6c 65 63  ResultSetOfSelec
12350 74 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  t(Parse *pParse,
12360 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74   Select *pSelect
12370 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62  ){.  Table *pTab
12380 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  ;.  sqlite3 *db 
12390 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
123a0 69 6e 74 20 73 61 76 65 64 46 6c 61 67 73 3b 0a  int savedFlags;.
123b0 0a 20 20 73 61 76 65 64 46 6c 61 67 73 20 3d 20  .  savedFlags = 
123c0 64 62 2d 3e 66 6c 61 67 73 3b 0a 20 20 64 62 2d  db->flags;.  db-
123d0 3e 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49 54  >flags &= ~SQLIT
123e0 45 5f 46 75 6c 6c 43 6f 6c 4e 61 6d 65 73 3b 0a  E_FullColNames;.
123f0 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53    db->flags |= S
12400 51 4c 49 54 45 5f 53 68 6f 72 74 43 6f 6c 4e 61  QLITE_ShortColNa
12410 6d 65 73 3b 0a 20 20 73 71 6c 69 74 65 33 53 65  mes;.  sqlite3Se
12420 6c 65 63 74 50 72 65 70 28 70 50 61 72 73 65 2c  lectPrep(pParse,
12430 20 70 53 65 6c 65 63 74 2c 20 30 29 3b 0a 20 20   pSelect, 0);.  
12440 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72  if( pParse->nErr
12450 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 77   ) return 0;.  w
12460 68 69 6c 65 28 20 70 53 65 6c 65 63 74 2d 3e 70  hile( pSelect->p
12470 50 72 69 6f 72 20 29 20 70 53 65 6c 65 63 74 20  Prior ) pSelect 
12480 3d 20 70 53 65 6c 65 63 74 2d 3e 70 50 72 69 6f  = pSelect->pPrio
12490 72 3b 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20 3d  r;.  db->flags =
124a0 20 73 61 76 65 64 46 6c 61 67 73 3b 0a 20 20 70   savedFlags;.  p
124b0 54 61 62 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  Tab = sqlite3DbM
124c0 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69  allocZero(db, si
124d0 7a 65 6f 66 28 54 61 62 6c 65 29 20 29 3b 0a 20  zeof(Table) );. 
124e0 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29 7b 0a   if( pTab==0 ){.
124f0 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
12500 7d 0a 20 20 2f 2a 20 54 68 65 20 73 71 6c 69 74  }.  /* The sqlit
12510 65 33 52 65 73 75 6c 74 53 65 74 4f 66 53 65 6c  e3ResultSetOfSel
12520 65 63 74 28 29 20 69 73 20 6f 6e 6c 79 20 75 73  ect() is only us
12530 65 64 20 6e 20 63 6f 6e 74 65 78 74 73 20 77 68  ed n contexts wh
12540 65 72 65 20 6c 6f 6f 6b 61 73 69 64 65 0a 20 20  ere lookaside.  
12550 2a 2a 20 69 73 20 64 69 73 61 62 6c 65 64 20 2a  ** is disabled *
12560 2f 0a 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e  /.  assert( db->
12570 6c 6f 6f 6b 61 73 69 64 65 2e 62 44 69 73 61 62  lookaside.bDisab
12580 6c 65 20 29 3b 0a 20 20 70 54 61 62 2d 3e 6e 54  le );.  pTab->nT
12590 61 62 52 65 66 20 3d 20 31 3b 0a 20 20 70 54 61  abRef = 1;.  pTa
125a0 62 2d 3e 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20  b->zName = 0;.  
125b0 70 54 61 62 2d 3e 6e 52 6f 77 4c 6f 67 45 73 74  pTab->nRowLogEst
125c0 20 3d 20 32 30 30 3b 20 61 73 73 65 72 74 28 20   = 200; assert( 
125d0 32 30 30 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45  200==sqlite3LogE
125e0 73 74 28 31 30 34 38 35 37 36 29 20 29 3b 0a 20  st(1048576) );. 
125f0 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 73 46   sqlite3ColumnsF
12600 72 6f 6d 45 78 70 72 4c 69 73 74 28 70 50 61 72  romExprList(pPar
12610 73 65 2c 20 70 53 65 6c 65 63 74 2d 3e 70 45 4c  se, pSelect->pEL
12620 69 73 74 2c 20 26 70 54 61 62 2d 3e 6e 43 6f 6c  ist, &pTab->nCol
12630 2c 20 26 70 54 61 62 2d 3e 61 43 6f 6c 29 3b 0a  , &pTab->aCol);.
12640 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 41    sqlite3SelectA
12650 64 64 43 6f 6c 75 6d 6e 54 79 70 65 41 6e 64 43  ddColumnTypeAndC
12660 6f 6c 6c 61 74 69 6f 6e 28 70 50 61 72 73 65 2c  ollation(pParse,
12670 20 70 54 61 62 2c 20 70 53 65 6c 65 63 74 29 3b   pTab, pSelect);
12680 0a 20 20 70 54 61 62 2d 3e 69 50 4b 65 79 20 3d  .  pTab->iPKey =
12690 20 2d 31 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d   -1;.  if( db->m
126a0 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20  allocFailed ){. 
126b0 20 20 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65     sqlite3Delete
126c0 54 61 62 6c 65 28 64 62 2c 20 70 54 61 62 29 3b  Table(db, pTab);
126d0 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
126e0 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 54 61 62   }.  return pTab
126f0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61  ;.}../*.** Get a
12700 20 56 44 42 45 20 66 6f 72 20 74 68 65 20 67 69   VDBE for the gi
12710 76 65 6e 20 70 61 72 73 65 72 20 63 6f 6e 74 65  ven parser conte
12720 78 74 2e 20 20 43 72 65 61 74 65 20 61 20 6e 65  xt.  Create a ne
12730 77 20 6f 6e 65 20 69 66 20 6e 65 63 65 73 73 61  w one if necessa
12740 72 79 2e 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72  ry..** If an err
12750 6f 72 20 6f 63 63 75 72 73 2c 20 72 65 74 75 72  or occurs, retur
12760 6e 20 4e 55 4c 4c 20 61 6e 64 20 6c 65 61 76 65  n NULL and leave
12770 20 61 20 6d 65 73 73 61 67 65 20 69 6e 20 70 50   a message in pP
12780 61 72 73 65 2e 0a 2a 2f 0a 56 64 62 65 20 2a 73  arse..*/.Vdbe *s
12790 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 50 61  qlite3GetVdbe(Pa
127a0 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20  rse *pParse){.  
127b0 69 66 28 20 70 50 61 72 73 65 2d 3e 70 56 64 62  if( pParse->pVdb
127c0 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  e ){.    return 
127d0 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20  pParse->pVdbe;. 
127e0 20 7d 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d   }.  if( pParse-
127f0 3e 70 54 6f 70 6c 65 76 65 6c 3d 3d 30 0a 20 20  >pToplevel==0.  
12800 20 26 26 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e   && Optimization
12810 45 6e 61 62 6c 65 64 28 70 50 61 72 73 65 2d 3e  Enabled(pParse->
12820 64 62 2c 53 51 4c 49 54 45 5f 46 61 63 74 6f 72  db,SQLITE_Factor
12830 4f 75 74 43 6f 6e 73 74 29 0a 20 20 29 7b 0a 20  OutConst).  ){. 
12840 20 20 20 70 50 61 72 73 65 2d 3e 6f 6b 43 6f 6e     pParse->okCon
12850 73 74 46 61 63 74 6f 72 20 3d 20 31 3b 0a 20 20  stFactor = 1;.  
12860 7d 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  }.  return sqlit
12870 65 33 56 64 62 65 43 72 65 61 74 65 28 70 50 61  e3VdbeCreate(pPa
12880 72 73 65 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  rse);.}.../*.** 
12890 43 6f 6d 70 75 74 65 20 74 68 65 20 69 4c 69 6d  Compute the iLim
128a0 69 74 20 61 6e 64 20 69 4f 66 66 73 65 74 20 66  it and iOffset f
128b0 69 65 6c 64 73 20 6f 66 20 74 68 65 20 53 45 4c  ields of the SEL
128c0 45 43 54 20 62 61 73 65 64 20 6f 6e 20 74 68 65  ECT based on the
128d0 0a 2a 2a 20 70 4c 69 6d 69 74 20 65 78 70 72 65  .** pLimit expre
128e0 73 73 69 6f 6e 73 2e 20 20 70 4c 69 6d 69 74 2d  ssions.  pLimit-
128f0 3e 70 4c 65 66 74 20 61 6e 64 20 70 4c 69 6d 69  >pLeft and pLimi
12900 74 2d 3e 70 52 69 67 68 74 20 68 6f 6c 64 20 74  t->pRight hold t
12910 68 65 20 65 78 70 72 65 73 73 69 6f 6e 73 0a 2a  he expressions.*
12920 2a 20 74 68 61 74 20 61 70 70 65 61 72 20 69 6e  * that appear in
12930 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 53 51   the original SQ
12940 4c 20 73 74 61 74 65 6d 65 6e 74 20 61 66 74 65  L statement afte
12950 72 20 74 68 65 20 4c 49 4d 49 54 20 61 6e 64 20  r the LIMIT and 
12960 4f 46 46 53 45 54 0a 2a 2a 20 6b 65 79 77 6f 72  OFFSET.** keywor
12970 64 73 2e 20 20 4f 72 20 4e 55 4c 4c 20 69 66 20  ds.  Or NULL if 
12980 74 68 6f 73 65 20 6b 65 79 77 6f 72 64 73 20 61  those keywords a
12990 72 65 20 6f 6d 69 74 74 65 64 2e 20 69 4c 69 6d  re omitted. iLim
129a0 69 74 20 61 6e 64 20 69 4f 66 66 73 65 74 20 0a  it and iOffset .
129b0 2a 2a 20 61 72 65 20 74 68 65 20 69 6e 74 65 67  ** are the integ
129c0 65 72 20 6d 65 6d 6f 72 79 20 72 65 67 69 73 74  er memory regist
129d0 65 72 20 6e 75 6d 62 65 72 73 20 66 6f 72 20 63  er numbers for c
129e0 6f 75 6e 74 65 72 73 20 75 73 65 64 20 74 6f 20  ounters used to 
129f0 63 6f 6d 70 75 74 65 20 0a 2a 2a 20 74 68 65 20  compute .** the 
12a00 6c 69 6d 69 74 20 61 6e 64 20 6f 66 66 73 65 74  limit and offset
12a10 2e 20 20 49 66 20 74 68 65 72 65 20 69 73 20 6e  .  If there is n
12a20 6f 20 6c 69 6d 69 74 20 61 6e 64 2f 6f 72 20 6f  o limit and/or o
12a30 66 66 73 65 74 2c 20 74 68 65 6e 20 0a 2a 2a 20  ffset, then .** 
12a40 69 4c 69 6d 69 74 20 61 6e 64 20 69 4f 66 66 73  iLimit and iOffs
12a50 65 74 20 61 72 65 20 6e 65 67 61 74 69 76 65 2e  et are negative.
12a60 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
12a70 69 6e 65 20 63 68 61 6e 67 65 73 20 74 68 65 20  ine changes the 
12a80 76 61 6c 75 65 73 20 6f 66 20 69 4c 69 6d 69 74  values of iLimit
12a90 20 61 6e 64 20 69 4f 66 66 73 65 74 20 6f 6e 6c   and iOffset onl
12aa0 79 20 69 66 0a 2a 2a 20 61 20 6c 69 6d 69 74 20  y if.** a limit 
12ab0 6f 72 20 6f 66 66 73 65 74 20 69 73 20 64 65 66  or offset is def
12ac0 69 6e 65 64 20 62 79 20 70 4c 69 6d 69 74 2d 3e  ined by pLimit->
12ad0 70 4c 65 66 74 20 61 6e 64 20 70 4c 69 6d 69 74  pLeft and pLimit
12ae0 2d 3e 70 52 69 67 68 74 2e 20 20 69 4c 69 6d 69  ->pRight.  iLimi
12af0 74 0a 2a 2a 20 61 6e 64 20 69 4f 66 66 73 65 74  t.** and iOffset
12b00 20 73 68 6f 75 6c 64 20 68 61 76 65 20 62 65 65   should have bee
12b10 6e 20 70 72 65 73 65 74 20 74 6f 20 61 70 70 72  n preset to appr
12b20 6f 70 72 69 61 74 65 20 64 65 66 61 75 6c 74 20  opriate default 
12b30 76 61 6c 75 65 73 20 28 7a 65 72 6f 29 0a 2a 2a  values (zero).**
12b40 20 70 72 69 6f 72 20 74 6f 20 63 61 6c 6c 69 6e   prior to callin
12b50 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a  g this routine..
12b60 2a 2a 0a 2a 2a 20 54 68 65 20 69 4f 66 66 73 65  **.** The iOffse
12b70 74 20 72 65 67 69 73 74 65 72 20 28 69 66 20 69  t register (if i
12b80 74 20 65 78 69 73 74 73 29 20 69 73 20 69 6e 69  t exists) is ini
12b90 74 69 61 6c 69 7a 65 64 20 74 6f 20 74 68 65 20  tialized to the 
12ba0 76 61 6c 75 65 0a 2a 2a 20 6f 66 20 74 68 65 20  value.** of the 
12bb0 4f 46 46 53 45 54 2e 20 20 54 68 65 20 69 4c 69  OFFSET.  The iLi
12bc0 6d 69 74 20 72 65 67 69 73 74 65 72 20 69 73 20  mit register is 
12bd0 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 4c  initialized to L
12be0 49 4d 49 54 2e 20 20 52 65 67 69 73 74 65 72 0a  IMIT.  Register.
12bf0 2a 2a 20 69 4f 66 66 73 65 74 2b 31 20 69 73 20  ** iOffset+1 is 
12c00 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 4c  initialized to L
12c10 49 4d 49 54 2b 4f 46 46 53 45 54 2e 0a 2a 2a 0a  IMIT+OFFSET..**.
12c20 2a 2a 20 4f 6e 6c 79 20 69 66 20 70 4c 69 6d 69  ** Only if pLimi
12c30 74 2d 3e 70 4c 65 66 74 21 3d 30 20 64 6f 20 74  t->pLeft!=0 do t
12c40 68 65 20 6c 69 6d 69 74 20 72 65 67 69 73 74 65  he limit registe
12c50 72 73 20 67 65 74 0a 2a 2a 20 72 65 64 65 66 69  rs get.** redefi
12c60 6e 65 64 2e 20 20 54 68 65 20 55 4e 49 4f 4e 20  ned.  The UNION 
12c70 41 4c 4c 20 6f 70 65 72 61 74 6f 72 20 75 73 65  ALL operator use
12c80 73 20 74 68 69 73 20 70 72 6f 70 65 72 74 79 20  s this property 
12c90 74 6f 20 66 6f 72 63 65 0a 2a 2a 20 74 68 65 20  to force.** the 
12ca0 72 65 75 73 65 20 6f 66 20 74 68 65 20 73 61 6d  reuse of the sam
12cb0 65 20 6c 69 6d 69 74 20 61 6e 64 20 6f 66 66 73  e limit and offs
12cc0 65 74 20 72 65 67 69 73 74 65 72 73 20 61 63 72  et registers acr
12cd0 6f 73 73 20 6d 75 6c 74 69 70 6c 65 0a 2a 2a 20  oss multiple.** 
12ce0 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
12cf0 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  s..*/.static voi
12d00 64 20 63 6f 6d 70 75 74 65 4c 69 6d 69 74 52 65  d computeLimitRe
12d10 67 69 73 74 65 72 73 28 50 61 72 73 65 20 2a 70  gisters(Parse *p
12d20 50 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70  Parse, Select *p
12d30 2c 20 69 6e 74 20 69 42 72 65 61 6b 29 7b 0a 20  , int iBreak){. 
12d40 20 56 64 62 65 20 2a 76 20 3d 20 30 3b 0a 20 20   Vdbe *v = 0;.  
12d50 69 6e 74 20 69 4c 69 6d 69 74 20 3d 20 30 3b 0a  int iLimit = 0;.
12d60 20 20 69 6e 74 20 69 4f 66 66 73 65 74 3b 0a 20    int iOffset;. 
12d70 20 69 6e 74 20 6e 3b 0a 20 20 45 78 70 72 20 2a   int n;.  Expr *
12d80 70 4c 69 6d 69 74 20 3d 20 70 2d 3e 70 4c 69 6d  pLimit = p->pLim
12d90 69 74 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 69 4c  it;..  if( p->iL
12da0 69 6d 69 74 20 29 20 72 65 74 75 72 6e 3b 0a 0a  imit ) return;..
12db0 20 20 2f 2a 20 0a 20 20 2a 2a 20 22 4c 49 4d 49    /* .  ** "LIMI
12dc0 54 20 2d 31 22 20 61 6c 77 61 79 73 20 73 68 6f  T -1" always sho
12dd0 77 73 20 61 6c 6c 20 72 6f 77 73 2e 20 20 54 68  ws all rows.  Th
12de0 65 72 65 20 69 73 20 73 6f 6d 65 0a 20 20 2a 2a  ere is some.  **
12df0 20 63 6f 6e 74 72 6f 76 65 72 73 79 20 61 62 6f   controversy abo
12e00 75 74 20 77 68 61 74 20 74 68 65 20 63 6f 72 72  ut what the corr
12e10 65 63 74 20 62 65 68 61 76 69 6f 72 20 73 68 6f  ect behavior sho
12e20 75 6c 64 20 62 65 2e 0a 20 20 2a 2a 20 54 68 65  uld be..  ** The
12e30 20 63 75 72 72 65 6e 74 20 69 6d 70 6c 65 6d 65   current impleme
12e40 6e 74 61 74 69 6f 6e 20 69 6e 74 65 72 70 72 65  ntation interpre
12e50 74 73 20 22 4c 49 4d 49 54 20 30 22 20 74 6f 20  ts "LIMIT 0" to 
12e60 6d 65 61 6e 0a 20 20 2a 2a 20 6e 6f 20 72 6f 77  mean.  ** no row
12e70 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 4c  s..  */.  if( pL
12e80 69 6d 69 74 20 29 7b 0a 20 20 20 20 61 73 73 65  imit ){.    asse
12e90 72 74 28 20 70 4c 69 6d 69 74 2d 3e 6f 70 3d 3d  rt( pLimit->op==
12ea0 54 4b 5f 4c 49 4d 49 54 20 29 3b 0a 20 20 20 20  TK_LIMIT );.    
12eb0 61 73 73 65 72 74 28 20 70 4c 69 6d 69 74 2d 3e  assert( pLimit->
12ec0 70 4c 65 66 74 21 3d 30 20 29 3b 0a 20 20 20 20  pLeft!=0 );.    
12ed0 70 2d 3e 69 4c 69 6d 69 74 20 3d 20 69 4c 69 6d  p->iLimit = iLim
12ee0 69 74 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  it = ++pParse->n
12ef0 4d 65 6d 3b 0a 20 20 20 20 76 20 3d 20 73 71 6c  Mem;.    v = sql
12f00 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72  ite3GetVdbe(pPar
12f10 73 65 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  se);.    assert(
12f20 20 76 21 3d 30 20 29 3b 0a 20 20 20 20 69 66 28   v!=0 );.    if(
12f30 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 49 6e   sqlite3ExprIsIn
12f40 74 65 67 65 72 28 70 4c 69 6d 69 74 2d 3e 70 4c  teger(pLimit->pL
12f50 65 66 74 2c 20 26 6e 29 20 29 7b 0a 20 20 20 20  eft, &n) ){.    
12f60 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
12f70 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  Op2(v, OP_Intege
12f80 72 2c 20 6e 2c 20 69 4c 69 6d 69 74 29 3b 0a 20  r, n, iLimit);. 
12f90 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
12fa0 28 28 76 2c 20 22 4c 49 4d 49 54 20 63 6f 75 6e  ((v, "LIMIT coun
12fb0 74 65 72 22 29 29 3b 0a 20 20 20 20 20 20 69 66  ter"));.      if
12fc0 28 20 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ( n==0 ){.      
12fd0 20 20 73 71 6c 69 74 65 33 56 64 62 65 47 6f 74    sqlite3VdbeGot
12fe0 6f 28 76 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20  o(v, iBreak);.  
12ff0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 3e      }else if( n>
13000 3d 30 20 26 26 20 70 2d 3e 6e 53 65 6c 65 63 74  =0 && p->nSelect
13010 52 6f 77 3e 73 71 6c 69 74 65 33 4c 6f 67 45 73  Row>sqlite3LogEs
13020 74 28 28 75 36 34 29 6e 29 20 29 7b 0a 20 20 20  t((u64)n) ){.   
13030 20 20 20 20 20 70 2d 3e 6e 53 65 6c 65 63 74 52       p->nSelectR
13040 6f 77 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45  ow = sqlite3LogE
13050 73 74 28 28 75 36 34 29 6e 29 3b 0a 20 20 20 20  st((u64)n);.    
13060 20 20 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20      p->selFlags 
13070 7c 3d 20 53 46 5f 46 69 78 65 64 4c 69 6d 69 74  |= SF_FixedLimit
13080 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
13090 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  lse{.      sqlit
130a0 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73  e3ExprCode(pPars
130b0 65 2c 20 70 4c 69 6d 69 74 2d 3e 70 4c 65 66 74  e, pLimit->pLeft
130c0 2c 20 69 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20  , iLimit);.     
130d0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
130e0 70 31 28 76 2c 20 4f 50 5f 4d 75 73 74 42 65 49  p1(v, OP_MustBeI
130f0 6e 74 2c 20 69 4c 69 6d 69 74 29 3b 20 56 64 62  nt, iLimit); Vdb
13100 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
13110 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
13120 28 76 2c 20 22 4c 49 4d 49 54 20 63 6f 75 6e 74  (v, "LIMIT count
13130 65 72 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c  er"));.      sql
13140 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
13150 2c 20 4f 50 5f 49 66 4e 6f 74 2c 20 69 4c 69 6d  , OP_IfNot, iLim
13160 69 74 2c 20 69 42 72 65 61 6b 29 3b 20 56 64 62  it, iBreak); Vdb
13170 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
13180 20 20 7d 0a 20 20 20 20 69 66 28 20 70 4c 69 6d    }.    if( pLim
13190 69 74 2d 3e 70 52 69 67 68 74 20 29 7b 0a 20 20  it->pRight ){.  
131a0 20 20 20 20 70 2d 3e 69 4f 66 66 73 65 74 20 3d      p->iOffset =
131b0 20 69 4f 66 66 73 65 74 20 3d 20 2b 2b 70 50 61   iOffset = ++pPa
131c0 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20  rse->nMem;.     
131d0 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 2b 3b   pParse->nMem++;
131e0 20 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61     /* Allocate a
131f0 6e 20 65 78 74 72 61 20 72 65 67 69 73 74 65 72  n extra register
13200 20 66 6f 72 20 6c 69 6d 69 74 2b 6f 66 66 73 65   for limit+offse
13210 74 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74  t */.      sqlit
13220 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73  e3ExprCode(pPars
13230 65 2c 20 70 4c 69 6d 69 74 2d 3e 70 52 69 67 68  e, pLimit->pRigh
13240 74 2c 20 69 4f 66 66 73 65 74 29 3b 0a 20 20 20  t, iOffset);.   
13250 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
13260 64 4f 70 31 28 76 2c 20 4f 50 5f 4d 75 73 74 42  dOp1(v, OP_MustB
13270 65 49 6e 74 2c 20 69 4f 66 66 73 65 74 29 3b 20  eInt, iOffset); 
13280 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
13290 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65  .      VdbeComme
132a0 6e 74 28 28 76 2c 20 22 4f 46 46 53 45 54 20 63  nt((v, "OFFSET c
132b0 6f 75 6e 74 65 72 22 29 29 3b 0a 20 20 20 20 20  ounter"));.     
132c0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
132d0 70 33 28 76 2c 20 4f 50 5f 4f 66 66 73 65 74 4c  p3(v, OP_OffsetL
132e0 69 6d 69 74 2c 20 69 4c 69 6d 69 74 2c 20 69 4f  imit, iLimit, iO
132f0 66 66 73 65 74 2b 31 2c 20 69 4f 66 66 73 65 74  ffset+1, iOffset
13300 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d  );.      VdbeCom
13310 6d 65 6e 74 28 28 76 2c 20 22 4c 49 4d 49 54 2b  ment((v, "LIMIT+
13320 4f 46 46 53 45 54 22 29 29 3b 0a 20 20 20 20 7d  OFFSET"));.    }
13330 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66 20  .  }.}..#ifndef 
13340 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50  SQLITE_OMIT_COMP
13350 4f 55 4e 44 5f 53 45 4c 45 43 54 0a 2f 2a 0a 2a  OUND_SELECT./*.*
13360 2a 20 52 65 74 75 72 6e 20 74 68 65 20 61 70 70  * Return the app
13370 72 6f 70 72 69 61 74 65 20 63 6f 6c 6c 61 74 69  ropriate collati
13380 6e 67 20 73 65 71 75 65 6e 63 65 20 66 6f 72 20  ng sequence for 
13390 74 68 65 20 69 43 6f 6c 2d 74 68 20 63 6f 6c 75  the iCol-th colu
133a0 6d 6e 20 6f 66 0a 2a 2a 20 74 68 65 20 72 65 73  mn of.** the res
133b0 75 6c 74 20 73 65 74 20 66 6f 72 20 74 68 65 20  ult set for the 
133c0 63 6f 6d 70 6f 75 6e 64 2d 73 65 6c 65 63 74 20  compound-select 
133d0 73 74 61 74 65 6d 65 6e 74 20 22 70 22 2e 20 20  statement "p".  
133e0 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 0a 2a  Return NULL if.*
133f0 2a 20 74 68 65 20 63 6f 6c 75 6d 6e 20 68 61 73  * the column has
13400 20 6e 6f 20 64 65 66 61 75 6c 74 20 63 6f 6c 6c   no default coll
13410 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 2e 0a  ating sequence..
13420 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 6c 6c 61 74  **.** The collat
13430 69 6e 67 20 73 65 71 75 65 6e 63 65 20 66 6f 72  ing sequence for
13440 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 73 65   the compound se
13450 6c 65 63 74 20 69 73 20 74 61 6b 65 6e 20 66 72  lect is taken fr
13460 6f 6d 20 74 68 65 0a 2a 2a 20 6c 65 66 74 2d 6d  om the.** left-m
13470 6f 73 74 20 74 65 72 6d 20 6f 66 20 74 68 65 20  ost term of the 
13480 73 65 6c 65 63 74 20 74 68 61 74 20 68 61 73 20  select that has 
13490 61 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  a collating sequ
134a0 65 6e 63 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ence..*/.static 
134b0 43 6f 6c 6c 53 65 71 20 2a 6d 75 6c 74 69 53 65  CollSeq *multiSe
134c0 6c 65 63 74 43 6f 6c 6c 53 65 71 28 50 61 72 73  lectCollSeq(Pars
134d0 65 20 2a 70 50 61 72 73 65 2c 20 53 65 6c 65 63  e *pParse, Selec
134e0 74 20 2a 70 2c 20 69 6e 74 20 69 43 6f 6c 29 7b  t *p, int iCol){
134f0 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 52 65 74  .  CollSeq *pRet
13500 3b 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 69 6f  ;.  if( p->pPrio
13510 72 20 29 7b 0a 20 20 20 20 70 52 65 74 20 3d 20  r ){.    pRet = 
13520 6d 75 6c 74 69 53 65 6c 65 63 74 43 6f 6c 6c 53  multiSelectCollS
13530 65 71 28 70 50 61 72 73 65 2c 20 70 2d 3e 70 50  eq(pParse, p->pP
13540 72 69 6f 72 2c 20 69 43 6f 6c 29 3b 0a 20 20 7d  rior, iCol);.  }
13550 65 6c 73 65 7b 0a 20 20 20 20 70 52 65 74 20 3d  else{.    pRet =
13560 20 30 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74   0;.  }.  assert
13570 28 20 69 43 6f 6c 3e 3d 30 20 29 3b 0a 20 20 2f  ( iCol>=0 );.  /
13580 2a 20 69 43 6f 6c 20 6d 75 73 74 20 62 65 20 6c  * iCol must be l
13590 65 73 73 20 74 68 61 6e 20 70 2d 3e 70 45 4c 69  ess than p->pELi
135a0 73 74 2d 3e 6e 45 78 70 72 2e 20 20 4f 74 68 65  st->nExpr.  Othe
135b0 72 77 69 73 65 20 61 6e 20 65 72 72 6f 72 20 77  rwise an error w
135c0 6f 75 6c 64 0a 20 20 2a 2a 20 68 61 76 65 20 62  ould.  ** have b
135d0 65 65 6e 20 74 68 72 6f 77 6e 20 64 75 72 69 6e  een thrown durin
135e0 67 20 6e 61 6d 65 20 72 65 73 6f 6c 75 74 69 6f  g name resolutio
135f0 6e 20 61 6e 64 20 77 65 20 77 6f 75 6c 64 20 6e  n and we would n
13600 6f 74 20 68 61 76 65 20 67 6f 74 74 65 6e 0a 20  ot have gotten. 
13610 20 2a 2a 20 74 68 69 73 20 66 61 72 20 2a 2f 0a   ** this far */.
13620 20 20 69 66 28 20 70 52 65 74 3d 3d 30 20 26 26    if( pRet==0 &&
13630 20 41 4c 57 41 59 53 28 69 43 6f 6c 3c 70 2d 3e   ALWAYS(iCol<p->
13640 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29 20 29  pEList->nExpr) )
13650 7b 0a 20 20 20 20 70 52 65 74 20 3d 20 73 71 6c  {.    pRet = sql
13660 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28  ite3ExprCollSeq(
13670 70 50 61 72 73 65 2c 20 70 2d 3e 70 45 4c 69 73  pParse, p->pELis
13680 74 2d 3e 61 5b 69 43 6f 6c 5d 2e 70 45 78 70 72  t->a[iCol].pExpr
13690 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
136a0 70 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  pRet;.}../*.** T
136b0 68 65 20 73 65 6c 65 63 74 20 73 74 61 74 65 6d  he select statem
136c0 65 6e 74 20 70 61 73 73 65 64 20 61 73 20 74 68  ent passed as th
136d0 65 20 73 65 63 6f 6e 64 20 70 61 72 61 6d 65 74  e second paramet
136e0 65 72 20 69 73 20 61 20 63 6f 6d 70 6f 75 6e 64  er is a compound
136f0 20 53 45 4c 45 43 54 0a 2a 2a 20 77 69 74 68 20   SELECT.** with 
13700 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  an ORDER BY clau
13710 73 65 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f  se. This functio
13720 6e 20 61 6c 6c 6f 63 61 74 65 73 20 61 6e 64 20  n allocates and 
13730 72 65 74 75 72 6e 73 20 61 20 4b 65 79 49 6e 66  returns a KeyInf
13740 6f 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 20 73  o.** structure s
13750 75 69 74 61 62 6c 65 20 66 6f 72 20 69 6d 70 6c  uitable for impl
13760 65 6d 65 6e 74 69 6e 67 20 74 68 65 20 4f 52 44  ementing the ORD
13770 45 52 20 42 59 2e 0a 2a 2a 0a 2a 2a 20 53 70 61  ER BY..**.** Spa
13780 63 65 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 4b  ce to hold the K
13790 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65  eyInfo structure
137a0 20 69 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f   is obtained fro
137b0 6d 20 6d 61 6c 6c 6f 63 2e 20 54 68 65 20 63 61  m malloc. The ca
137c0 6c 6c 69 6e 67 0a 2a 2a 20 66 75 6e 63 74 69 6f  lling.** functio
137d0 6e 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65  n is responsible
137e0 20 66 6f 72 20 65 6e 73 75 72 69 6e 67 20 74 68   for ensuring th
137f0 61 74 20 74 68 69 73 20 73 74 72 75 63 74 75 72  at this structur
13800 65 20 69 73 20 65 76 65 6e 74 75 61 6c 6c 79 0a  e is eventually.
13810 2a 2a 20 66 72 65 65 64 2e 0a 2a 2f 0a 73 74 61  ** freed..*/.sta
13820 74 69 63 20 4b 65 79 49 6e 66 6f 20 2a 6d 75 6c  tic KeyInfo *mul
13830 74 69 53 65 6c 65 63 74 4f 72 64 65 72 42 79 4b  tiSelectOrderByK
13840 65 79 49 6e 66 6f 28 50 61 72 73 65 20 2a 70 50  eyInfo(Parse *pP
13850 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 2c  arse, Select *p,
13860 20 69 6e 74 20 6e 45 78 74 72 61 29 7b 0a 20 20   int nExtra){.  
13870 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72  ExprList *pOrder
13880 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79  By = p->pOrderBy
13890 3b 0a 20 20 69 6e 74 20 6e 4f 72 64 65 72 42 79  ;.  int nOrderBy
138a0 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79 2d 3e   = p->pOrderBy->
138b0 6e 45 78 70 72 3b 0a 20 20 73 71 6c 69 74 65 33  nExpr;.  sqlite3
138c0 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
138d0 62 3b 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 52  b;.  KeyInfo *pR
138e0 65 74 20 3d 20 73 71 6c 69 74 65 33 4b 65 79 49  et = sqlite3KeyI
138f0 6e 66 6f 41 6c 6c 6f 63 28 64 62 2c 20 6e 4f 72  nfoAlloc(db, nOr
13900 64 65 72 42 79 2b 6e 45 78 74 72 61 2c 20 31 29  derBy+nExtra, 1)
13910 3b 0a 20 20 69 66 28 20 70 52 65 74 20 29 7b 0a  ;.  if( pRet ){.
13920 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66      int i;.    f
13930 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f 72 64 65 72  or(i=0; i<nOrder
13940 42 79 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  By; i++){.      
13950 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f  struct ExprList_
13960 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70  item *pItem = &p
13970 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 3b 0a 20  OrderBy->a[i];. 
13980 20 20 20 20 20 45 78 70 72 20 2a 70 54 65 72 6d       Expr *pTerm
13990 20 3d 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 3b   = pItem->pExpr;
139a0 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a  .      CollSeq *
139b0 70 43 6f 6c 6c 3b 0a 0a 20 20 20 20 20 20 69 66  pColl;..      if
139c0 28 20 70 54 65 72 6d 2d 3e 66 6c 61 67 73 20 26  ( pTerm->flags &
139d0 20 45 50 5f 43 6f 6c 6c 61 74 65 20 29 7b 0a 20   EP_Collate ){. 
139e0 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73         pColl = s
139f0 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65  qlite3ExprCollSe
13a00 71 28 70 50 61 72 73 65 2c 20 70 54 65 72 6d 29  q(pParse, pTerm)
13a10 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
13a20 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 6d         pColl = m
13a30 75 6c 74 69 53 65 6c 65 63 74 43 6f 6c 6c 53 65  ultiSelectCollSe
13a40 71 28 70 50 61 72 73 65 2c 20 70 2c 20 70 49 74  q(pParse, p, pIt
13a50 65 6d 2d 3e 75 2e 78 2e 69 4f 72 64 65 72 42 79  em->u.x.iOrderBy
13a60 43 6f 6c 2d 31 29 3b 0a 20 20 20 20 20 20 20 20  Col-1);.        
13a70 69 66 28 20 70 43 6f 6c 6c 3d 3d 30 20 29 20 70  if( pColl==0 ) p
13a80 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44 66 6c 74  Coll = db->pDflt
13a90 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20 70 4f  Coll;.        pO
13aa0 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78  rderBy->a[i].pEx
13ab0 70 72 20 3d 0a 20 20 20 20 20 20 20 20 20 20 73  pr =.          s
13ac0 71 6c 69 74 65 33 45 78 70 72 41 64 64 43 6f 6c  qlite3ExprAddCol
13ad0 6c 61 74 65 53 74 72 69 6e 67 28 70 50 61 72 73  lateString(pPars
13ae0 65 2c 20 70 54 65 72 6d 2c 20 70 43 6f 6c 6c 2d  e, pTerm, pColl-
13af0 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d  >zName);.      }
13b00 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73  .      assert( s
13b10 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 49 73 57  qlite3KeyInfoIsW
13b20 72 69 74 65 61 62 6c 65 28 70 52 65 74 29 20 29  riteable(pRet) )
13b30 3b 0a 20 20 20 20 20 20 70 52 65 74 2d 3e 61 43  ;.      pRet->aC
13b40 6f 6c 6c 5b 69 5d 20 3d 20 70 43 6f 6c 6c 3b 0a  oll[i] = pColl;.
13b50 20 20 20 20 20 20 70 52 65 74 2d 3e 61 53 6f 72        pRet->aSor
13b60 74 4f 72 64 65 72 5b 69 5d 20 3d 20 70 4f 72 64  tOrder[i] = pOrd
13b70 65 72 42 79 2d 3e 61 5b 69 5d 2e 73 6f 72 74 4f  erBy->a[i].sortO
13b80 72 64 65 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  rder;.    }.  }.
13b90 0a 20 20 72 65 74 75 72 6e 20 70 52 65 74 3b 0a  .  return pRet;.
13ba0 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
13bb0 45 5f 4f 4d 49 54 5f 43 54 45 0a 2f 2a 0a 2a 2a  E_OMIT_CTE./*.**
13bc0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 67 65   This routine ge
13bd0 6e 65 72 61 74 65 73 20 56 44 42 45 20 63 6f 64  nerates VDBE cod
13be0 65 20 74 6f 20 63 6f 6d 70 75 74 65 20 74 68 65  e to compute the
13bf0 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 20 57 49   content of a WI
13c00 54 48 20 52 45 43 55 52 53 49 56 45 0a 2a 2a 20  TH RECURSIVE.** 
13c10 71 75 65 72 79 20 6f 66 20 74 68 65 20 66 6f 72  query of the for
13c20 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 3c 72 65 63 75  m:.**.**   <recu
13c30 72 73 69 76 65 2d 74 61 62 6c 65 3e 20 41 53 20  rsive-table> AS 
13c40 28 3c 73 65 74 75 70 2d 71 75 65 72 79 3e 20 55  (<setup-query> U
13c50 4e 49 4f 4e 20 5b 41 4c 4c 5d 20 3c 72 65 63 75  NION [ALL] <recu
13c60 72 73 69 76 65 2d 71 75 65 72 79 3e 29 0a 2a 2a  rsive-query>).**
13c70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13c80 20 20 20 20 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f           \______
13c90 5f 5f 5f 5f 5f 2f 20 20 20 20 20 20 20 20 20 20  _____/          
13ca0 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f     \____________
13cb0 5f 5f 5f 2f 0a 2a 2a 20 20 20 20 20 20 20 20 20  ___/.**         
13cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13cd0 20 20 70 2d 3e 70 50 72 69 6f 72 20 20 20 20 20    p->pPrior     
13ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13cf0 20 70 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 65 72   p.**.**.** Ther
13d00 65 20 69 73 20 65 78 61 63 74 6c 79 20 6f 6e 65  e is exactly one
13d10 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68   reference to th
13d20 65 20 72 65 63 75 72 73 69 76 65 2d 74 61 62 6c  e recursive-tabl
13d30 65 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c  e in the FROM cl
13d40 61 75 73 65 0a 2a 2a 20 6f 66 20 72 65 63 75 72  ause.** of recur
13d50 73 69 76 65 2d 71 75 65 72 79 2c 20 6d 61 72 6b  sive-query, mark
13d60 65 64 20 77 69 74 68 20 74 68 65 20 53 72 63 4c  ed with the SrcL
13d70 69 73 74 2d 3e 61 5b 5d 2e 66 67 2e 69 73 52 65  ist->a[].fg.isRe
13d80 63 75 72 73 69 76 65 20 66 6c 61 67 2e 0a 2a 2a  cursive flag..**
13d90 0a 2a 2a 20 54 68 65 20 73 65 74 75 70 2d 71 75  .** The setup-qu
13da0 65 72 79 20 72 75 6e 73 20 6f 6e 63 65 20 74 6f  ery runs once to
13db0 20 67 65 6e 65 72 61 74 65 20 61 6e 20 69 6e 69   generate an ini
13dc0 74 69 61 6c 20 73 65 74 20 6f 66 20 72 6f 77 73  tial set of rows
13dd0 20 74 68 61 74 20 67 6f 0a 2a 2a 20 69 6e 74 6f   that go.** into
13de0 20 61 20 51 75 65 75 65 20 74 61 62 6c 65 2e 20   a Queue table. 
13df0 20 52 6f 77 73 20 61 72 65 20 65 78 74 72 61 63   Rows are extrac
13e00 74 65 64 20 66 72 6f 6d 20 74 68 65 20 51 75 65  ted from the Que
13e10 75 65 20 74 61 62 6c 65 20 6f 6e 65 20 62 79 0a  ue table one by.
13e20 2a 2a 20 6f 6e 65 2e 20 20 45 61 63 68 20 72 6f  ** one.  Each ro
13e30 77 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d  w extracted from
13e40 20 51 75 65 75 65 20 69 73 20 6f 75 74 70 75 74   Queue is output
13e50 20 74 6f 20 70 44 65 73 74 2e 20 20 54 68 65 6e   to pDest.  Then
13e60 20 74 68 65 20 73 69 6e 67 6c 65 0a 2a 2a 20 65   the single.** e
13e70 78 74 72 61 63 74 65 64 20 72 6f 77 20 28 6e 6f  xtracted row (no
13e80 77 20 69 6e 20 74 68 65 20 69 43 75 72 72 65 6e  w in the iCurren
13e90 74 20 74 61 62 6c 65 29 20 62 65 63 6f 6d 65 73  t table) becomes
13ea0 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20   the content of 
13eb0 74 68 65 0a 2a 2a 20 72 65 63 75 72 73 69 76 65  the.** recursive
13ec0 2d 74 61 62 6c 65 20 66 6f 72 20 61 20 72 65 63  -table for a rec
13ed0 75 72 73 69 76 65 2d 71 75 65 72 79 20 72 75 6e  ursive-query run
13ee0 2e 20 20 54 68 65 20 6f 75 74 70 75 74 20 6f 66  .  The output of
13ef0 20 74 68 65 20 72 65 63 75 72 73 69 76 65 2d 71   the recursive-q
13f00 75 65 72 79 0a 2a 2a 20 69 73 20 61 64 64 65 64  uery.** is added
13f10 20 62 61 63 6b 20 69 6e 74 6f 20 74 68 65 20 51   back into the Q
13f20 75 65 75 65 20 74 61 62 6c 65 2e 20 20 54 68 65  ueue table.  The
13f30 6e 20 61 6e 6f 74 68 65 72 20 72 6f 77 20 69 73  n another row is
13f40 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20   extracted from 
13f50 51 75 65 75 65 0a 2a 2a 20 61 6e 64 20 74 68 65  Queue.** and the
13f60 20 69 74 65 72 61 74 69 6f 6e 20 63 6f 6e 74 69   iteration conti
13f70 6e 75 65 73 20 75 6e 74 69 6c 20 74 68 65 20 51  nues until the Q
13f80 75 65 75 65 20 74 61 62 6c 65 20 69 73 20 65 6d  ueue table is em
13f90 70 74 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  pty..**.** If th
13fa0 65 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79  e compound query
13fb0 20 6f 70 65 72 61 74 6f 72 20 69 73 20 55 4e 49   operator is UNI
13fc0 4f 4e 20 74 68 65 6e 20 6e 6f 20 64 75 70 6c 69  ON then no dupli
13fd0 63 61 74 65 20 72 6f 77 73 20 61 72 65 20 65 76  cate rows are ev
13fe0 65 72 0a 2a 2a 20 69 6e 73 65 72 74 65 64 20 69  er.** inserted i
13ff0 6e 74 6f 20 74 68 65 20 51 75 65 75 65 20 74 61  nto the Queue ta
14000 62 6c 65 2e 20 20 54 68 65 20 69 44 69 73 74 69  ble.  The iDisti
14010 6e 63 74 20 74 61 62 6c 65 20 6b 65 65 70 73 20  nct table keeps 
14020 61 20 63 6f 70 79 20 6f 66 20 61 6c 6c 20 72 6f  a copy of all ro
14030 77 73 0a 2a 2a 20 74 68 61 74 20 68 61 76 65 20  ws.** that have 
14040 65 76 65 72 20 62 65 65 6e 20 69 6e 73 65 72 74  ever been insert
14050 65 64 20 69 6e 74 6f 20 51 75 65 75 65 20 61 6e  ed into Queue an
14060 64 20 63 61 75 73 65 73 20 64 75 70 6c 69 63 61  d causes duplica
14070 74 65 73 20 74 6f 20 62 65 0a 2a 2a 20 64 69 73  tes to be.** dis
14080 63 61 72 64 65 64 2e 20 20 49 66 20 74 68 65 20  carded.  If the 
14090 6f 70 65 72 61 74 6f 72 20 69 73 20 55 4e 49 4f  operator is UNIO
140a0 4e 20 41 4c 4c 2c 20 74 68 65 6e 20 64 75 70 6c  N ALL, then dupl
140b0 69 63 61 74 65 73 20 61 72 65 20 61 6c 6c 6f 77  icates are allow
140c0 65 64 2e 0a 2a 2a 20 0a 2a 2a 20 49 66 20 74 68  ed..** .** If th
140d0 65 20 71 75 65 72 79 20 68 61 73 20 61 6e 20 4f  e query has an O
140e0 52 44 45 52 20 42 59 2c 20 74 68 65 6e 20 65 6e  RDER BY, then en
140f0 74 72 69 65 73 20 69 6e 20 74 68 65 20 51 75 65  tries in the Que
14100 75 65 20 74 61 62 6c 65 20 61 72 65 20 6b 65 70  ue table are kep
14110 74 20 69 6e 0a 2a 2a 20 4f 52 44 45 52 20 42 59  t in.** ORDER BY
14120 20 6f 72 64 65 72 20 61 6e 64 20 74 68 65 20 66   order and the f
14130 69 72 73 74 20 65 6e 74 72 79 20 69 73 20 65 78  irst entry is ex
14140 74 72 61 63 74 65 64 20 66 6f 72 20 65 61 63 68  tracted for each
14150 20 63 79 63 6c 65 2e 20 20 57 69 74 68 6f 75 74   cycle.  Without
14160 0a 2a 2a 20 61 6e 20 4f 52 44 45 52 20 42 59 2c  .** an ORDER BY,
14170 20 74 68 65 20 51 75 65 75 65 20 74 61 62 6c 65   the Queue table
14180 20 69 73 20 6a 75 73 74 20 61 20 46 49 46 4f 2e   is just a FIFO.
14190 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 4c 49 4d 49  .**.** If a LIMI
141a0 54 20 63 6c 61 75 73 65 20 69 73 20 70 72 6f 76  T clause is prov
141b0 69 64 65 64 2c 20 74 68 65 6e 20 74 68 65 20 69  ided, then the i
141c0 74 65 72 61 74 69 6f 6e 20 73 74 6f 70 73 20 61  teration stops a
141d0 66 74 65 72 20 4c 49 4d 49 54 20 72 6f 77 73 0a  fter LIMIT rows.
141e0 2a 2a 20 68 61 76 65 20 62 65 65 6e 20 6f 75 74  ** have been out
141f0 70 75 74 20 74 6f 20 70 44 65 73 74 2e 20 20 41  put to pDest.  A
14200 20 4c 49 4d 49 54 20 6f 66 20 7a 65 72 6f 20 6d   LIMIT of zero m
14210 65 61 6e 73 20 74 6f 20 6f 75 74 70 75 74 20 6e  eans to output n
14220 6f 20 72 6f 77 73 20 61 6e 64 20 61 0a 2a 2a 20  o rows and a.** 
14230 6e 65 67 61 74 69 76 65 20 4c 49 4d 49 54 20 6d  negative LIMIT m
14240 65 61 6e 73 20 74 6f 20 6f 75 74 70 75 74 20 61  eans to output a
14250 6c 6c 20 72 6f 77 73 2e 20 20 49 66 20 74 68 65  ll rows.  If the
14260 72 65 20 69 73 20 61 6c 73 6f 20 61 6e 20 4f 46  re is also an OF
14270 46 53 45 54 20 63 6c 61 75 73 65 0a 2a 2a 20 77  FSET clause.** w
14280 69 74 68 20 61 20 70 6f 73 69 74 69 76 65 20 76  ith a positive v
14290 61 6c 75 65 2c 20 74 68 65 6e 20 74 68 65 20 66  alue, then the f
142a0 69 72 73 74 20 4f 46 46 53 45 54 20 6f 75 74 70  irst OFFSET outp
142b0 75 74 73 20 61 72 65 20 64 69 73 63 61 72 64 65  uts are discarde
142c0 64 20 72 61 74 68 65 72 0a 2a 2a 20 74 68 61 6e  d rather.** than
142d0 20 62 65 69 6e 67 20 73 65 6e 74 20 74 6f 20 70   being sent to p
142e0 44 65 73 74 2e 20 20 54 68 65 20 4c 49 4d 49 54  Dest.  The LIMIT
142f0 20 63 6f 75 6e 74 20 64 6f 65 73 20 6e 6f 74 20   count does not 
14300 62 65 67 69 6e 20 75 6e 74 69 6c 20 61 66 74 65  begin until afte
14310 72 20 4f 46 46 53 45 54 0a 2a 2a 20 72 6f 77 73  r OFFSET.** rows
14320 20 68 61 76 65 20 62 65 65 6e 20 73 6b 69 70 70   have been skipp
14330 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ed..*/.static vo
14340 69 64 20 67 65 6e 65 72 61 74 65 57 69 74 68 52  id generateWithR
14350 65 63 75 72 73 69 76 65 51 75 65 72 79 28 0a 20  ecursiveQuery(. 
14360 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
14370 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e         /* Parsin
14380 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53  g context */.  S
14390 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20  elect *p,       
143a0 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65 63 75       /* The recu
143b0 72 73 69 76 65 20 53 45 4c 45 43 54 20 74 6f 20  rsive SELECT to 
143c0 62 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20 53 65  be coded */.  Se
143d0 6c 65 63 74 44 65 73 74 20 2a 70 44 65 73 74 20  lectDest *pDest 
143e0 20 20 20 20 2f 2a 20 57 68 61 74 20 74 6f 20 64      /* What to d
143f0 6f 20 77 69 74 68 20 71 75 65 72 79 20 72 65 73  o with query res
14400 75 6c 74 73 20 2a 2f 0a 29 7b 0a 20 20 53 72 63  ults */.){.  Src
14410 4c 69 73 74 20 2a 70 53 72 63 20 3d 20 70 2d 3e  List *pSrc = p->
14420 70 53 72 63 3b 20 20 20 20 20 20 2f 2a 20 54 68  pSrc;      /* Th
14430 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66  e FROM clause of
14440 20 74 68 65 20 72 65 63 75 72 73 69 76 65 20 71   the recursive q
14450 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20 6e 43  uery */.  int nC
14460 6f 6c 20 3d 20 70 2d 3e 70 45 4c 69 73 74 2d 3e  ol = p->pEList->
14470 6e 45 78 70 72 3b 20 20 2f 2a 20 4e 75 6d 62 65  nExpr;  /* Numbe
14480 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20  r of columns in 
14490 74 68 65 20 72 65 63 75 72 73 69 76 65 20 74 61  the recursive ta
144a0 62 6c 65 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76  ble */.  Vdbe *v
144b0 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
144c0 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 72  ;      /* The pr
144d0 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74  epared statement
144e0 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74   under construct
144f0 69 6f 6e 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20  ion */.  Select 
14500 2a 70 53 65 74 75 70 20 3d 20 70 2d 3e 70 50 72  *pSetup = p->pPr
14510 69 6f 72 3b 20 20 20 2f 2a 20 54 68 65 20 73 65  ior;   /* The se
14520 74 75 70 20 71 75 65 72 79 20 2a 2f 0a 20 20 69  tup query */.  i
14530 6e 74 20 61 64 64 72 54 6f 70 3b 20 20 20 20 20  nt addrTop;     
14540 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
14550 54 6f 70 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20  Top of the loop 
14560 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 43 6f 6e  */.  int addrCon
14570 74 2c 20 61 64 64 72 42 72 65 61 6b 3b 20 20 20  t, addrBreak;   
14580 20 20 20 2f 2a 20 43 4f 4e 54 49 4e 55 45 20 61     /* CONTINUE a
14590 6e 64 20 42 52 45 41 4b 20 61 64 64 72 65 73 73  nd BREAK address
145a0 65 73 20 2a 2f 0a 20 20 69 6e 74 20 69 43 75 72  es */.  int iCur
145b0 72 65 6e 74 20 3d 20 30 3b 20 20 20 20 20 20 20  rent = 0;       
145c0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 43 75 72        /* The Cur
145d0 72 65 6e 74 20 74 61 62 6c 65 20 2a 2f 0a 20 20  rent table */.  
145e0 69 6e 74 20 72 65 67 43 75 72 72 65 6e 74 3b 20  int regCurrent; 
145f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
14600 20 52 65 67 69 73 74 65 72 20 68 6f 6c 64 69 6e   Register holdin
14610 67 20 43 75 72 72 65 6e 74 20 74 61 62 6c 65 20  g Current table 
14620 2a 2f 0a 20 20 69 6e 74 20 69 51 75 65 75 65 3b  */.  int iQueue;
14630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14640 20 20 20 2f 2a 20 54 68 65 20 51 75 65 75 65 20     /* The Queue 
14650 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69  table */.  int i
14660 44 69 73 74 69 6e 63 74 20 3d 20 30 3b 20 20 20  Distinct = 0;   
14670 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 20 65           /* To e
14680 6e 73 75 72 65 20 75 6e 69 71 75 65 20 72 65 73  nsure unique res
14690 75 6c 74 73 20 69 66 20 55 4e 49 4f 4e 20 2a 2f  ults if UNION */
146a0 0a 20 20 69 6e 74 20 65 44 65 73 74 20 3d 20 53  .  int eDest = S
146b0 52 54 5f 46 69 66 6f 3b 20 20 20 20 20 20 20 20  RT_Fifo;        
146c0 20 2f 2a 20 48 6f 77 20 74 6f 20 77 72 69 74 65   /* How to write
146d0 20 74 6f 20 51 75 65 75 65 20 2a 2f 0a 20 20 53   to Queue */.  S
146e0 65 6c 65 63 74 44 65 73 74 20 64 65 73 74 51 75  electDest destQu
146f0 65 75 65 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  eue;         /* 
14700 53 65 6c 65 63 74 44 65 73 74 20 74 61 72 67 65  SelectDest targe
14710 74 74 69 6e 67 20 74 68 65 20 51 75 65 75 65 20  tting the Queue 
14720 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69  table */.  int i
14730 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
14740 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
14750 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e   counter */.  in
14760 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
14770 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
14780 65 73 75 6c 74 20 63 6f 64 65 20 2a 2f 0a 20 20  esult code */.  
14790 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72  ExprList *pOrder
147a0 42 79 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  By;           /*
147b0 20 54 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   The ORDER BY cl
147c0 61 75 73 65 20 2a 2f 0a 20 20 45 78 70 72 20 2a  ause */.  Expr *
147d0 70 4c 69 6d 69 74 3b 20 20 20 20 20 20 20 20 20  pLimit;         
147e0 20 20 20 20 20 20 20 20 2f 2a 20 53 61 76 65 64          /* Saved
147f0 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46 53 45   LIMIT and OFFSE
14800 54 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 4c 69  T */.  int regLi
14810 6d 69 74 2c 20 72 65 67 4f 66 66 73 65 74 3b 20  mit, regOffset; 
14820 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72       /* Register
14830 73 20 75 73 65 64 20 62 79 20 4c 49 4d 49 54 20  s used by LIMIT 
14840 61 6e 64 20 4f 46 46 53 45 54 20 2a 2f 0a 0a 20  and OFFSET */.. 
14850 20 2f 2a 20 4f 62 74 61 69 6e 20 61 75 74 68 6f   /* Obtain autho
14860 72 69 7a 61 74 69 6f 6e 20 74 6f 20 64 6f 20 61  rization to do a
14870 20 72 65 63 75 72 73 69 76 65 20 71 75 65 72 79   recursive query
14880 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69 74 65   */.  if( sqlite
14890 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73  3AuthCheck(pPars
148a0 65 2c 20 53 51 4c 49 54 45 5f 52 45 43 55 52 53  e, SQLITE_RECURS
148b0 49 56 45 2c 20 30 2c 20 30 2c 20 30 29 20 29 20  IVE, 0, 0, 0) ) 
148c0 72 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20 50 72  return;..  /* Pr
148d0 6f 63 65 73 73 20 74 68 65 20 4c 49 4d 49 54 20  ocess the LIMIT 
148e0 61 6e 64 20 4f 46 46 53 45 54 20 63 6c 61 75 73  and OFFSET claus
148f0 65 73 2c 20 69 66 20 74 68 65 79 20 65 78 69 73  es, if they exis
14900 74 20 2a 2f 0a 20 20 61 64 64 72 42 72 65 61 6b  t */.  addrBreak
14910 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
14920 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 70 2d  keLabel(v);.  p-
14930 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 33 32  >nSelectRow = 32
14940 30 3b 20 20 2f 2a 20 34 20 62 69 6c 6c 69 6f 6e  0;  /* 4 billion
14950 20 72 6f 77 73 20 2a 2f 0a 20 20 63 6f 6d 70 75   rows */.  compu
14960 74 65 4c 69 6d 69 74 52 65 67 69 73 74 65 72 73  teLimitRegisters
14970 28 70 50 61 72 73 65 2c 20 70 2c 20 61 64 64 72  (pParse, p, addr
14980 42 72 65 61 6b 29 3b 0a 20 20 70 4c 69 6d 69 74  Break);.  pLimit
14990 20 3d 20 70 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20   = p->pLimit;.  
149a0 72 65 67 4c 69 6d 69 74 20 3d 20 70 2d 3e 69 4c  regLimit = p->iL
149b0 69 6d 69 74 3b 0a 20 20 72 65 67 4f 66 66 73 65  imit;.  regOffse
149c0 74 20 3d 20 70 2d 3e 69 4f 66 66 73 65 74 3b 0a  t = p->iOffset;.
149d0 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b    p->pLimit = 0;
149e0 0a 20 20 70 2d 3e 69 4c 69 6d 69 74 20 3d 20 70  .  p->iLimit = p
149f0 2d 3e 69 4f 66 66 73 65 74 20 3d 20 30 3b 0a 20  ->iOffset = 0;. 
14a00 20 70 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e 70   pOrderBy = p->p
14a10 4f 72 64 65 72 42 79 3b 0a 0a 20 20 2f 2a 20 4c  OrderBy;..  /* L
14a20 6f 63 61 74 65 20 74 68 65 20 63 75 72 73 6f 72  ocate the cursor
14a30 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 43   number of the C
14a40 75 72 72 65 6e 74 20 74 61 62 6c 65 20 2a 2f 0a  urrent table */.
14a50 20 20 66 6f 72 28 69 3d 30 3b 20 41 4c 57 41 59    for(i=0; ALWAY
14a60 53 28 69 3c 70 53 72 63 2d 3e 6e 53 72 63 29 3b  S(i<pSrc->nSrc);
14a70 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70   i++){.    if( p
14a80 53 72 63 2d 3e 61 5b 69 5d 2e 66 67 2e 69 73 52  Src->a[i].fg.isR
14a90 65 63 75 72 73 69 76 65 20 29 7b 0a 20 20 20 20  ecursive ){.    
14aa0 20 20 69 43 75 72 72 65 6e 74 20 3d 20 70 53 72    iCurrent = pSr
14ab0 63 2d 3e 61 5b 69 5d 2e 69 43 75 72 73 6f 72 3b  c->a[i].iCursor;
14ac0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
14ad0 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 6c    }.  }..  /* Al
14ae0 6c 6f 63 61 74 65 20 63 75 72 73 6f 72 73 20 6e  locate cursors n
14af0 75 6d 62 65 72 73 20 66 6f 72 20 51 75 65 75 65  umbers for Queue
14b00 20 61 6e 64 20 44 69 73 74 69 6e 63 74 2e 20 20   and Distinct.  
14b10 54 68 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65  The cursor numbe
14b20 72 20 66 6f 72 0a 20 20 2a 2a 20 74 68 65 20 44  r for.  ** the D
14b30 69 73 74 69 6e 63 74 20 74 61 62 6c 65 20 6d 75  istinct table mu
14b40 73 74 20 62 65 20 65 78 61 63 74 6c 79 20 6f 6e  st be exactly on
14b50 65 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 51  e greater than Q
14b60 75 65 75 65 20 69 6e 20 6f 72 64 65 72 0a 20 20  ueue in order.  
14b70 2a 2a 20 66 6f 72 20 74 68 65 20 53 52 54 5f 44  ** for the SRT_D
14b80 69 73 74 46 69 66 6f 20 61 6e 64 20 53 52 54 5f  istFifo and SRT_
14b90 44 69 73 74 51 75 65 75 65 20 64 65 73 74 69 6e  DistQueue destin
14ba0 61 74 69 6f 6e 73 20 74 6f 20 77 6f 72 6b 2e 20  ations to work. 
14bb0 2a 2f 0a 20 20 69 51 75 65 75 65 20 3d 20 70 50  */.  iQueue = pP
14bc0 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20  arse->nTab++;.  
14bd0 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 4e  if( p->op==TK_UN
14be0 49 4f 4e 20 29 7b 0a 20 20 20 20 65 44 65 73 74  ION ){.    eDest
14bf0 20 3d 20 70 4f 72 64 65 72 42 79 20 3f 20 53 52   = pOrderBy ? SR
14c00 54 5f 44 69 73 74 51 75 65 75 65 20 3a 20 53 52  T_DistQueue : SR
14c10 54 5f 44 69 73 74 46 69 66 6f 3b 0a 20 20 20 20  T_DistFifo;.    
14c20 69 44 69 73 74 69 6e 63 74 20 3d 20 70 50 61 72  iDistinct = pPar
14c30 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 7d 65  se->nTab++;.  }e
14c40 6c 73 65 7b 0a 20 20 20 20 65 44 65 73 74 20 3d  lse{.    eDest =
14c50 20 70 4f 72 64 65 72 42 79 20 3f 20 53 52 54 5f   pOrderBy ? SRT_
14c60 51 75 65 75 65 20 3a 20 53 52 54 5f 46 69 66 6f  Queue : SRT_Fifo
14c70 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 53  ;.  }.  sqlite3S
14c80 65 6c 65 63 74 44 65 73 74 49 6e 69 74 28 26 64  electDestInit(&d
14c90 65 73 74 51 75 65 75 65 2c 20 65 44 65 73 74 2c  estQueue, eDest,
14ca0 20 69 51 75 65 75 65 29 3b 0a 0a 20 20 2f 2a 20   iQueue);..  /* 
14cb0 41 6c 6c 6f 63 61 74 65 20 63 75 72 73 6f 72 73  Allocate cursors
14cc0 20 66 6f 72 20 43 75 72 72 65 6e 74 2c 20 51 75   for Current, Qu
14cd0 65 75 65 2c 20 61 6e 64 20 44 69 73 74 69 6e 63  eue, and Distinc
14ce0 74 2e 20 2a 2f 0a 20 20 72 65 67 43 75 72 72 65  t. */.  regCurre
14cf0 6e 74 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  nt = ++pParse->n
14d00 4d 65 6d 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  Mem;.  sqlite3Vd
14d10 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4f  beAddOp3(v, OP_O
14d20 70 65 6e 50 73 65 75 64 6f 2c 20 69 43 75 72 72  penPseudo, iCurr
14d30 65 6e 74 2c 20 72 65 67 43 75 72 72 65 6e 74 2c  ent, regCurrent,
14d40 20 6e 43 6f 6c 29 3b 0a 20 20 69 66 28 20 70 4f   nCol);.  if( pO
14d50 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 4b 65  rderBy ){.    Ke
14d60 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 20  yInfo *pKeyInfo 
14d70 3d 20 6d 75 6c 74 69 53 65 6c 65 63 74 4f 72 64  = multiSelectOrd
14d80 65 72 42 79 4b 65 79 49 6e 66 6f 28 70 50 61 72  erByKeyInfo(pPar
14d90 73 65 2c 20 70 2c 20 31 29 3b 0a 20 20 20 20 73  se, p, 1);.    s
14da0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
14db0 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d  (v, OP_OpenEphem
14dc0 65 72 61 6c 2c 20 69 51 75 65 75 65 2c 20 70 4f  eral, iQueue, pO
14dd0 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 2b 32 2c  rderBy->nExpr+2,
14de0 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20   0,.            
14df0 20 20 20 20 20 20 20 20 20 20 28 63 68 61 72 2a            (char*
14e00 29 70 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45  )pKeyInfo, P4_KE
14e10 59 49 4e 46 4f 29 3b 0a 20 20 20 20 64 65 73 74  YINFO);.    dest
14e20 51 75 65 75 65 2e 70 4f 72 64 65 72 42 79 20 3d  Queue.pOrderBy =
14e30 20 70 4f 72 64 65 72 42 79 3b 0a 20 20 7d 65 6c   pOrderBy;.  }el
14e40 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  se{.    sqlite3V
14e50 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
14e60 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 69  OpenEphemeral, i
14e70 51 75 65 75 65 2c 20 6e 43 6f 6c 29 3b 0a 20 20  Queue, nCol);.  
14e80 7d 0a 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28  }.  VdbeComment(
14e90 28 76 2c 20 22 51 75 65 75 65 20 74 61 62 6c 65  (v, "Queue table
14ea0 22 29 29 3b 0a 20 20 69 66 28 20 69 44 69 73 74  "));.  if( iDist
14eb0 69 6e 63 74 20 29 7b 0a 20 20 20 20 70 2d 3e 61  inct ){.    p->a
14ec0 64 64 72 4f 70 65 6e 45 70 68 6d 5b 30 5d 20 3d  ddrOpenEphm[0] =
14ed0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
14ee0 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68  p2(v, OP_OpenEph
14ef0 65 6d 65 72 61 6c 2c 20 69 44 69 73 74 69 6e 63  emeral, iDistinc
14f00 74 2c 20 30 29 3b 0a 20 20 20 20 70 2d 3e 73 65  t, 0);.    p->se
14f10 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f 55 73 65  lFlags |= SF_Use
14f20 73 45 70 68 65 6d 65 72 61 6c 3b 0a 20 20 7d 0a  sEphemeral;.  }.
14f30 0a 20 20 2f 2a 20 44 65 74 61 63 68 20 74 68 65  .  /* Detach the
14f40 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
14f50 20 66 72 6f 6d 20 74 68 65 20 63 6f 6d 70 6f 75   from the compou
14f60 6e 64 20 53 45 4c 45 43 54 20 2a 2f 0a 20 20 70  nd SELECT */.  p
14f70 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a  ->pOrderBy = 0;.
14f80 0a 20 20 2f 2a 20 53 74 6f 72 65 20 74 68 65 20  .  /* Store the 
14f90 72 65 73 75 6c 74 73 20 6f 66 20 74 68 65 20 73  results of the s
14fa0 65 74 75 70 2d 71 75 65 72 79 20 69 6e 20 51 75  etup-query in Qu
14fb0 65 75 65 2e 20 2a 2f 0a 20 20 70 53 65 74 75 70  eue. */.  pSetup
14fc0 2d 3e 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 45  ->pNext = 0;.  E
14fd0 78 70 6c 61 69 6e 51 75 65 72 79 50 6c 61 6e 28  xplainQueryPlan(
14fe0 28 70 50 61 72 73 65 2c 20 31 2c 20 22 53 45 54  (pParse, 1, "SET
14ff0 55 50 22 29 29 3b 0a 20 20 72 63 20 3d 20 73 71  UP"));.  rc = sq
15000 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72  lite3Select(pPar
15010 73 65 2c 20 70 53 65 74 75 70 2c 20 26 64 65 73  se, pSetup, &des
15020 74 51 75 65 75 65 29 3b 0a 20 20 70 53 65 74 75  tQueue);.  pSetu
15030 70 2d 3e 70 4e 65 78 74 20 3d 20 70 3b 0a 20 20  p->pNext = p;.  
15040 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 65 6e  if( rc ) goto en
15050 64 5f 6f 66 5f 72 65 63 75 72 73 69 76 65 5f 71  d_of_recursive_q
15060 75 65 72 79 3b 0a 0a 20 20 2f 2a 20 46 69 6e 64  uery;..  /* Find
15070 20 74 68 65 20 6e 65 78 74 20 72 6f 77 20 69 6e   the next row in
15080 20 74 68 65 20 51 75 65 75 65 20 61 6e 64 20 6f   the Queue and o
15090 75 74 70 75 74 20 74 68 61 74 20 72 6f 77 20 2a  utput that row *
150a0 2f 0a 20 20 61 64 64 72 54 6f 70 20 3d 20 73 71  /.  addrTop = sq
150b0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
150c0 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 69 51  v, OP_Rewind, iQ
150d0 75 65 75 65 2c 20 61 64 64 72 42 72 65 61 6b 29  ueue, addrBreak)
150e0 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
150f0 29 3b 0a 0a 20 20 2f 2a 20 54 72 61 6e 73 66 65  );..  /* Transfe
15100 72 20 74 68 65 20 6e 65 78 74 20 72 6f 77 20 69  r the next row i
15110 6e 20 51 75 65 75 65 20 6f 76 65 72 20 74 6f 20  n Queue over to 
15120 43 75 72 72 65 6e 74 20 2a 2f 0a 20 20 73 71 6c  Current */.  sql
15130 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
15140 2c 20 4f 50 5f 4e 75 6c 6c 52 6f 77 2c 20 69 43  , OP_NullRow, iC
15150 75 72 72 65 6e 74 29 3b 20 2f 2a 20 54 6f 20 72  urrent); /* To r
15160 65 73 65 74 20 63 6f 6c 75 6d 6e 20 63 61 63 68  eset column cach
15170 65 20 2a 2f 0a 20 20 69 66 28 20 70 4f 72 64 65  e */.  if( pOrde
15180 72 42 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  rBy ){.    sqlit
15190 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
151a0 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69 51 75 65 75  OP_Column, iQueu
151b0 65 2c 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78  e, pOrderBy->nEx
151c0 70 72 2b 31 2c 20 72 65 67 43 75 72 72 65 6e 74  pr+1, regCurrent
151d0 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
151e0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
151f0 32 28 76 2c 20 4f 50 5f 52 6f 77 44 61 74 61 2c  2(v, OP_RowData,
15200 20 69 51 75 65 75 65 2c 20 72 65 67 43 75 72 72   iQueue, regCurr
15210 65 6e 74 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  ent);.  }.  sqli
15220 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
15230 20 4f 50 5f 44 65 6c 65 74 65 2c 20 69 51 75 65   OP_Delete, iQue
15240 75 65 29 3b 0a 0a 20 20 2f 2a 20 4f 75 74 70 75  ue);..  /* Outpu
15250 74 20 74 68 65 20 73 69 6e 67 6c 65 20 72 6f 77  t the single row
15260 20 69 6e 20 43 75 72 72 65 6e 74 20 2a 2f 0a 20   in Current */. 
15270 20 61 64 64 72 43 6f 6e 74 20 3d 20 73 71 6c 69   addrCont = sqli
15280 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
15290 28 76 29 3b 0a 20 20 63 6f 64 65 4f 66 66 73 65  (v);.  codeOffse
152a0 74 28 76 2c 20 72 65 67 4f 66 66 73 65 74 2c 20  t(v, regOffset, 
152b0 61 64 64 72 43 6f 6e 74 29 3b 0a 20 20 73 65 6c  addrCont);.  sel
152c0 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61  ectInnerLoop(pPa
152d0 72 73 65 2c 20 70 2c 20 69 43 75 72 72 65 6e 74  rse, p, iCurrent
152e0 2c 0a 20 20 20 20 20 20 30 2c 20 30 2c 20 70 44  ,.      0, 0, pD
152f0 65 73 74 2c 20 61 64 64 72 43 6f 6e 74 2c 20 61  est, addrCont, a
15300 64 64 72 42 72 65 61 6b 29 3b 0a 20 20 69 66 28  ddrBreak);.  if(
15310 20 72 65 67 4c 69 6d 69 74 20 29 7b 0a 20 20 20   regLimit ){.   
15320 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
15330 70 32 28 76 2c 20 4f 50 5f 44 65 63 72 4a 75 6d  p2(v, OP_DecrJum
15340 70 5a 65 72 6f 2c 20 72 65 67 4c 69 6d 69 74 2c  pZero, regLimit,
15350 20 61 64 64 72 42 72 65 61 6b 29 3b 0a 20 20 20   addrBreak);.   
15360 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
15370 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56  ;.  }.  sqlite3V
15380 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
15390 76 2c 20 61 64 64 72 43 6f 6e 74 29 3b 0a 0a 20  v, addrCont);.. 
153a0 20 2f 2a 20 45 78 65 63 75 74 65 20 74 68 65 20   /* Execute the 
153b0 72 65 63 75 72 73 69 76 65 20 53 45 4c 45 43 54  recursive SELECT
153c0 20 74 61 6b 69 6e 67 20 74 68 65 20 73 69 6e 67   taking the sing
153d0 6c 65 20 72 6f 77 20 69 6e 20 43 75 72 72 65 6e  le row in Curren
153e0 74 20 61 73 0a 20 20 2a 2a 20 74 68 65 20 76 61  t as.  ** the va
153f0 6c 75 65 20 66 6f 72 20 74 68 65 20 72 65 63 75  lue for the recu
15400 72 73 69 76 65 2d 74 61 62 6c 65 2e 20 53 74 6f  rsive-table. Sto
15410 72 65 20 74 68 65 20 72 65 73 75 6c 74 73 20 69  re the results i
15420 6e 20 74 68 65 20 51 75 65 75 65 2e 0a 20 20 2a  n the Queue..  *
15430 2f 0a 20 20 69 66 28 20 70 2d 3e 73 65 6c 46 6c  /.  if( p->selFl
15440 61 67 73 20 26 20 53 46 5f 41 67 67 72 65 67 61  ags & SF_Aggrega
15450 74 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  te ){.    sqlite
15460 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
15470 2c 20 22 72 65 63 75 72 73 69 76 65 20 61 67 67  , "recursive agg
15480 72 65 67 61 74 65 20 71 75 65 72 69 65 73 20 6e  regate queries n
15490 6f 74 20 73 75 70 70 6f 72 74 65 64 22 29 3b 0a  ot supported");.
154a0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 2d 3e    }else{.    p->
154b0 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20  pPrior = 0;.    
154c0 45 78 70 6c 61 69 6e 51 75 65 72 79 50 6c 61 6e  ExplainQueryPlan
154d0 28 28 70 50 61 72 73 65 2c 20 31 2c 20 22 52 45  ((pParse, 1, "RE
154e0 43 55 52 53 49 56 45 20 53 54 45 50 22 29 29 3b  CURSIVE STEP"));
154f0 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65  .    sqlite3Sele
15500 63 74 28 70 50 61 72 73 65 2c 20 70 2c 20 26 64  ct(pParse, p, &d
15510 65 73 74 51 75 65 75 65 29 3b 0a 20 20 20 20 61  estQueue);.    a
15520 73 73 65 72 74 28 20 70 2d 3e 70 50 72 69 6f 72  ssert( p->pPrior
15530 3d 3d 30 20 29 3b 0a 20 20 20 20 70 2d 3e 70 50  ==0 );.    p->pP
15540 72 69 6f 72 20 3d 20 70 53 65 74 75 70 3b 0a 20  rior = pSetup;. 
15550 20 7d 0a 0a 20 20 2f 2a 20 4b 65 65 70 20 72 75   }..  /* Keep ru
15560 6e 6e 69 6e 67 20 74 68 65 20 6c 6f 6f 70 20 75  nning the loop u
15570 6e 74 69 6c 20 74 68 65 20 51 75 65 75 65 20 69  ntil the Queue i
15580 73 20 65 6d 70 74 79 20 2a 2f 0a 20 20 73 71 6c  s empty */.  sql
15590 69 74 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20  ite3VdbeGoto(v, 
155a0 61 64 64 72 54 6f 70 29 3b 0a 20 20 73 71 6c 69  addrTop);.  sqli
155b0 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
155c0 62 65 6c 28 76 2c 20 61 64 64 72 42 72 65 61 6b  bel(v, addrBreak
155d0 29 3b 0a 0a 65 6e 64 5f 6f 66 5f 72 65 63 75 72  );..end_of_recur
155e0 73 69 76 65 5f 71 75 65 72 79 3a 0a 20 20 73 71  sive_query:.  sq
155f0 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c  lite3ExprListDel
15600 65 74 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ete(pParse->db, 
15610 70 2d 3e 70 4f 72 64 65 72 42 79 29 3b 0a 20 20  p->pOrderBy);.  
15620 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 70 4f  p->pOrderBy = pO
15630 72 64 65 72 42 79 3b 0a 20 20 70 2d 3e 70 4c 69  rderBy;.  p->pLi
15640 6d 69 74 20 3d 20 70 4c 69 6d 69 74 3b 0a 20 20  mit = pLimit;.  
15650 72 65 74 75 72 6e 3b 0a 7d 0a 23 65 6e 64 69 66  return;.}.#endif
15660 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
15670 43 54 45 20 2a 2f 0a 0a 2f 2a 20 46 6f 72 77 61  CTE */../* Forwa
15680 72 64 20 72 65 66 65 72 65 6e 63 65 73 20 2a 2f  rd references */
15690 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 75 6c 74  .static int mult
156a0 69 53 65 6c 65 63 74 4f 72 64 65 72 42 79 28 0a  iSelectOrderBy(.
156b0 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
156c0 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69          /* Parsi
156d0 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
156e0 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20  Select *p,      
156f0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 69 67        /* The rig
15700 68 74 2d 6d 6f 73 74 20 6f 66 20 53 45 4c 45 43  ht-most of SELEC
15710 54 73 20 74 6f 20 62 65 20 63 6f 64 65 64 20 2a  Ts to be coded *
15720 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 2a  /.  SelectDest *
15730 70 44 65 73 74 20 20 20 20 20 2f 2a 20 57 68 61  pDest     /* Wha
15740 74 20 74 6f 20 64 6f 20 77 69 74 68 20 71 75 65  t to do with que
15750 72 79 20 72 65 73 75 6c 74 73 20 2a 2f 0a 29 3b  ry results */.);
15760 0a 0a 2f 2a 0a 2a 2a 20 48 61 6e 64 6c 65 20 74  ../*.** Handle t
15770 68 65 20 73 70 65 63 69 61 6c 20 63 61 73 65 20  he special case 
15780 6f 66 20 61 20 63 6f 6d 70 6f 75 6e 64 2d 73 65  of a compound-se
15790 6c 65 63 74 20 74 68 61 74 20 6f 72 69 67 69 6e  lect that origin
157a0 61 74 65 73 20 66 72 6f 6d 20 61 0a 2a 2a 20 56  ates from a.** V
157b0 41 4c 55 45 53 20 63 6c 61 75 73 65 2e 20 20 42  ALUES clause.  B
157c0 79 20 68 61 6e 64 6c 69 6e 67 20 74 68 69 73 20  y handling this 
157d0 61 73 20 61 20 73 70 65 63 69 61 6c 20 63 61 73  as a special cas
157e0 65 2c 20 77 65 20 61 76 6f 69 64 20 64 65 65 70  e, we avoid deep
157f0 0a 2a 2a 20 72 65 63 75 72 73 69 6f 6e 2c 20 61  .** recursion, a
15800 6e 64 20 74 68 75 73 20 64 6f 20 6e 6f 74 20 6e  nd thus do not n
15810 65 65 64 20 74 6f 20 65 6e 66 6f 72 63 65 20 74  eed to enforce t
15820 68 65 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f  he SQLITE_LIMIT_
15830 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 0a  COMPOUND_SELECT.
15840 2a 2a 20 6f 6e 20 61 20 56 41 4c 55 45 53 20 63  ** on a VALUES c
15850 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 42 65 63  lause..**.** Bec
15860 61 75 73 65 20 74 68 65 20 53 65 6c 65 63 74 20  ause the Select 
15870 6f 62 6a 65 63 74 20 6f 72 69 67 69 6e 61 74 65  object originate
15880 73 20 66 72 6f 6d 20 61 20 56 41 4c 55 45 53 20  s from a VALUES 
15890 63 6c 61 75 73 65 3a 0a 2a 2a 20 20 20 28 31 29  clause:.**   (1)
158a0 20 54 68 65 72 65 20 69 73 20 6e 6f 20 4c 49 4d   There is no LIM
158b0 49 54 20 6f 72 20 4f 46 46 53 45 54 20 6f 72 20  IT or OFFSET or 
158c0 65 6c 73 65 20 74 68 65 72 65 20 69 73 20 61 20  else there is a 
158d0 4c 49 4d 49 54 20 6f 66 20 65 78 61 63 74 6c 79  LIMIT of exactly
158e0 20 31 0a 2a 2a 20 20 20 28 32 29 20 41 6c 6c 20   1.**   (2) All 
158f0 74 65 72 6d 73 20 61 72 65 20 55 4e 49 4f 4e 20  terms are UNION 
15900 41 4c 4c 0a 2a 2a 20 20 20 28 33 29 20 54 68 65  ALL.**   (3) The
15910 72 65 20 69 73 20 6e 6f 20 4f 52 44 45 52 20 42  re is no ORDER B
15920 59 20 63 6c 61 75 73 65 0a 2a 2a 0a 2a 2a 20 54  Y clause.**.** T
15930 68 65 20 22 4c 49 4d 49 54 20 6f 66 20 65 78 61  he "LIMIT of exa
15940 63 74 6c 79 20 31 22 20 63 61 73 65 20 6f 66 20  ctly 1" case of 
15950 63 6f 6e 64 69 74 69 6f 6e 20 28 31 29 20 63 6f  condition (1) co
15960 6d 65 73 20 61 62 6f 75 74 20 77 68 65 6e 20 61  mes about when a
15970 20 56 41 4c 55 45 53 0a 2a 2a 20 63 6c 61 75 73   VALUES.** claus
15980 65 20 6f 63 63 75 72 73 20 77 69 74 68 69 6e 20  e occurs within 
15990 73 63 61 6c 61 72 20 65 78 70 72 65 73 73 69 6f  scalar expressio
159a0 6e 20 28 65 78 3a 20 22 53 45 4c 45 43 54 20 28  n (ex: "SELECT (
159b0 56 41 4c 55 45 53 28 31 29 2c 28 32 29 2c 28 33  VALUES(1),(2),(3
159c0 29 29 22 29 2e 0a 2a 2a 20 54 68 65 20 73 71 6c  ))")..** The sql
159d0 69 74 65 33 43 6f 64 65 53 75 62 73 65 6c 65 63  ite3CodeSubselec
159e0 74 20 77 69 6c 6c 20 68 61 76 65 20 61 64 64 65  t will have adde
159f0 64 20 74 68 65 20 4c 49 4d 49 54 20 31 20 63 6c  d the LIMIT 1 cl
15a00 61 75 73 65 20 69 6e 20 74 68 74 20 63 61 73 65  ause in tht case
15a10 2e 0a 2a 2a 20 53 69 6e 63 65 20 74 68 65 20 6c  ..** Since the l
15a20 69 6d 69 74 20 69 73 20 65 78 61 63 74 6c 79 20  imit is exactly 
15a30 31 2c 20 77 65 20 6f 6e 6c 79 20 6e 65 65 64 20  1, we only need 
15a40 74 6f 20 65 76 61 6c 75 74 65 73 20 74 68 65 20  to evalutes the 
15a50 6c 65 66 74 2d 6d 6f 73 74 20 56 41 4c 55 45 53  left-most VALUES
15a60 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
15a70 6d 75 6c 74 69 53 65 6c 65 63 74 56 61 6c 75 65  multiSelectValue
15a80 73 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  s(.  Parse *pPar
15a90 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 61  se,        /* Pa
15aa0 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
15ab0 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20  .  Select *p,   
15ac0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
15ad0 72 69 67 68 74 2d 6d 6f 73 74 20 6f 66 20 53 45  right-most of SE
15ae0 4c 45 43 54 73 20 74 6f 20 62 65 20 63 6f 64 65  LECTs to be code
15af0 64 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73  d */.  SelectDes
15b00 74 20 2a 70 44 65 73 74 20 20 20 20 20 2f 2a 20  t *pDest     /* 
15b10 57 68 61 74 20 74 6f 20 64 6f 20 77 69 74 68 20  What to do with 
15b20 71 75 65 72 79 20 72 65 73 75 6c 74 73 20 2a 2f  query results */
15b30 0a 29 7b 0a 20 20 69 6e 74 20 6e 52 6f 77 20 3d  .){.  int nRow =
15b40 20 31 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 30   1;.  int rc = 0
15b50 3b 0a 20 20 69 6e 74 20 62 53 68 6f 77 41 6c 6c  ;.  int bShowAll
15b60 20 3d 20 70 2d 3e 70 4c 69 6d 69 74 3d 3d 30 3b   = p->pLimit==0;
15b70 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 73 65  .  assert( p->se
15b80 6c 46 6c 61 67 73 20 26 20 53 46 5f 4d 75 6c 74  lFlags & SF_Mult
15b90 69 56 61 6c 75 65 20 29 3b 0a 20 20 64 6f 7b 0a  iValue );.  do{.
15ba0 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 73      assert( p->s
15bb0 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 56 61 6c  elFlags & SF_Val
15bc0 75 65 73 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ues );.    asser
15bd0 74 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c  t( p->op==TK_ALL
15be0 20 7c 7c 20 28 70 2d 3e 6f 70 3d 3d 54 4b 5f 53   || (p->op==TK_S
15bf0 45 4c 45 43 54 20 26 26 20 70 2d 3e 70 50 72 69  ELECT && p->pPri
15c00 6f 72 3d 3d 30 29 20 29 3b 0a 20 20 20 20 61 73  or==0) );.    as
15c10 73 65 72 74 28 20 70 2d 3e 70 4e 65 78 74 3d 3d  sert( p->pNext==
15c20 30 20 7c 7c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e  0 || p->pEList->
15c30 6e 45 78 70 72 3d 3d 70 2d 3e 70 4e 65 78 74 2d  nExpr==p->pNext-
15c40 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29  >pEList->nExpr )
15c50 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 50 72  ;.    if( p->pPr
15c60 69 6f 72 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a  ior==0 ) break;.
15c70 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70      assert( p->p
15c80 50 72 69 6f 72 2d 3e 70 4e 65 78 74 3d 3d 70 20  Prior->pNext==p 
15c90 29 3b 0a 20 20 20 20 70 20 3d 20 70 2d 3e 70 50  );.    p = p->pP
15ca0 72 69 6f 72 3b 0a 20 20 20 20 6e 52 6f 77 20 2b  rior;.    nRow +
15cb0 3d 20 62 53 68 6f 77 41 6c 6c 3b 0a 20 20 7d 77  = bShowAll;.  }w
15cc0 68 69 6c 65 28 31 29 3b 0a 20 20 45 78 70 6c 61  hile(1);.  Expla
15cd0 69 6e 51 75 65 72 79 50 6c 61 6e 28 28 70 50 61  inQueryPlan((pPa
15ce0 72 73 65 2c 20 30 2c 20 22 53 43 41 4e 20 25 64  rse, 0, "SCAN %d
15cf0 20 43 4f 4e 53 54 41 4e 54 20 52 4f 57 25 73 22   CONSTANT ROW%s"
15d00 2c 20 6e 52 6f 77 2c 0a 20 20 20 20 20 20 20 20  , nRow,.        
15d10 20 20 20 20 20 20 20 20 20 20 20 20 6e 52 6f 77              nRow
15d20 3d 3d 31 20 3f 20 22 22 20 3a 20 22 53 22 29 29  ==1 ? "" : "S"))
15d30 3b 0a 20 20 77 68 69 6c 65 28 20 70 20 29 7b 0a  ;.  while( p ){.
15d40 20 20 20 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c      selectInnerL
15d50 6f 6f 70 28 70 50 61 72 73 65 2c 20 70 2c 20 2d  oop(pParse, p, -
15d60 31 2c 20 30 2c 20 30 2c 20 70 44 65 73 74 2c 20  1, 0, 0, pDest, 
15d70 31 2c 20 31 29 3b 0a 20 20 20 20 69 66 28 20 21  1, 1);.    if( !
15d80 62 53 68 6f 77 41 6c 6c 20 29 20 62 72 65 61 6b  bShowAll ) break
15d90 3b 0a 20 20 20 20 70 2d 3e 6e 53 65 6c 65 63 74  ;.    p->nSelect
15da0 52 6f 77 20 3d 20 6e 52 6f 77 3b 0a 20 20 20 20  Row = nRow;.    
15db0 70 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20  p = p->pNext;.  
15dc0 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
15dd0 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
15de0 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74  tine is called t
15df0 6f 20 70 72 6f 63 65 73 73 20 61 20 63 6f 6d 70  o process a comp
15e00 6f 75 6e 64 20 71 75 65 72 79 20 66 6f 72 6d 20  ound query form 
15e10 66 72 6f 6d 0a 2a 2a 20 74 77 6f 20 6f 72 20 6d  from.** two or m
15e20 6f 72 65 20 73 65 70 61 72 61 74 65 20 71 75 65  ore separate que
15e30 72 69 65 73 20 75 73 69 6e 67 20 55 4e 49 4f 4e  ries using UNION
15e40 2c 20 55 4e 49 4f 4e 20 41 4c 4c 2c 20 45 58 43  , UNION ALL, EXC
15e50 45 50 54 2c 20 6f 72 0a 2a 2a 20 49 4e 54 45 52  EPT, or.** INTER
15e60 53 45 43 54 0a 2a 2a 0a 2a 2a 20 22 70 22 20 70  SECT.**.** "p" p
15e70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 72 69 67  oints to the rig
15e80 68 74 2d 6d 6f 73 74 20 6f 66 20 74 68 65 20 74  ht-most of the t
15e90 77 6f 20 71 75 65 72 69 65 73 2e 20 20 74 68 65  wo queries.  the
15ea0 20 71 75 65 72 79 20 6f 6e 20 74 68 65 0a 2a 2a   query on the.**
15eb0 20 6c 65 66 74 20 69 73 20 70 2d 3e 70 50 72 69   left is p->pPri
15ec0 6f 72 2e 20 20 54 68 65 20 6c 65 66 74 20 71 75  or.  The left qu
15ed0 65 72 79 20 63 6f 75 6c 64 20 61 6c 73 6f 20 62  ery could also b
15ee0 65 20 61 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65  e a compound que
15ef0 72 79 0a 2a 2a 20 69 6e 20 77 68 69 63 68 20 63  ry.** in which c
15f00 61 73 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ase this routine
15f10 20 77 69 6c 6c 20 62 65 20 63 61 6c 6c 65 64 20   will be called 
15f20 72 65 63 75 72 73 69 76 65 6c 79 2e 20 0a 2a 2a  recursively. .**
15f30 0a 2a 2a 20 54 68 65 20 72 65 73 75 6c 74 73 20  .** The results 
15f40 6f 66 20 74 68 65 20 74 6f 74 61 6c 20 71 75 65  of the total que
15f50 72 79 20 61 72 65 20 74 6f 20 62 65 20 77 72 69  ry are to be wri
15f60 74 74 65 6e 20 69 6e 74 6f 20 61 20 64 65 73 74  tten into a dest
15f70 69 6e 61 74 69 6f 6e 0a 2a 2a 20 6f 66 20 74 79  ination.** of ty
15f80 70 65 20 65 44 65 73 74 20 77 69 74 68 20 70 61  pe eDest with pa
15f90 72 61 6d 65 74 65 72 20 69 50 61 72 6d 2e 0a 2a  rameter iParm..*
15fa0 2a 0a 2a 2a 20 45 78 61 6d 70 6c 65 20 31 3a 20  *.** Example 1: 
15fb0 20 43 6f 6e 73 69 64 65 72 20 61 20 74 68 72 65   Consider a thre
15fc0 65 2d 77 61 79 20 63 6f 6d 70 6f 75 6e 64 20 53  e-way compound S
15fd0 51 4c 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a  QL statement..**
15fe0 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 61  .**     SELECT a
15ff0 20 46 52 4f 4d 20 74 31 20 55 4e 49 4f 4e 20 53   FROM t1 UNION S
16000 45 4c 45 43 54 20 62 20 46 52 4f 4d 20 74 32 20  ELECT b FROM t2 
16010 55 4e 49 4f 4e 20 53 45 4c 45 43 54 20 63 20 46  UNION SELECT c F
16020 52 4f 4d 20 74 33 0a 2a 2a 0a 2a 2a 20 54 68 69  ROM t3.**.** Thi
16030 73 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 70  s statement is p
16040 61 72 73 65 64 20 75 70 20 61 73 20 66 6f 6c 6c  arsed up as foll
16050 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53  ows:.**.**     S
16060 45 4c 45 43 54 20 63 20 46 52 4f 4d 20 74 33 0a  ELECT c FROM t3.
16070 2a 2a 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20  **      |.**    
16080 20 20 60 2d 2d 2d 2d 2d 3e 20 20 53 45 4c 45 43    `----->  SELEC
16090 54 20 62 20 46 52 4f 4d 20 74 32 0a 2a 2a 20 20  T b FROM t2.**  
160a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 0a                |.
160b0 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
160c0 20 20 60 2d 2d 2d 2d 2d 2d 3e 20 20 53 45 4c 45    `------>  SELE
160d0 43 54 20 61 20 46 52 4f 4d 20 74 31 0a 2a 2a 0a  CT a FROM t1.**.
160e0 2a 2a 20 54 68 65 20 61 72 72 6f 77 73 20 69 6e  ** The arrows in
160f0 20 74 68 65 20 64 69 61 67 72 61 6d 20 61 62 6f   the diagram abo
16100 76 65 20 72 65 70 72 65 73 65 6e 74 20 74 68 65  ve represent the
16110 20 53 65 6c 65 63 74 2e 70 50 72 69 6f 72 20 70   Select.pPrior p
16120 6f 69 6e 74 65 72 2e 0a 2a 2a 20 53 6f 20 69 66  ointer..** So if
16130 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
16140 20 63 61 6c 6c 65 64 20 77 69 74 68 20 70 20 65   called with p e
16150 71 75 61 6c 20 74 6f 20 74 68 65 20 74 33 20 71  qual to the t3 q
16160 75 65 72 79 2c 20 74 68 65 6e 0a 2a 2a 20 70 50  uery, then.** pP
16170 72 69 6f 72 20 77 69 6c 6c 20 62 65 20 74 68 65  rior will be the
16180 20 74 32 20 71 75 65 72 79 2e 20 20 70 2d 3e 6f   t2 query.  p->o
16190 70 20 77 69 6c 6c 20 62 65 20 54 4b 5f 55 4e 49  p will be TK_UNI
161a0 4f 4e 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e  ON in this case.
161b0 0a 2a 2a 0a 2a 2a 20 4e 6f 74 69 63 65 20 74 68  .**.** Notice th
161c0 61 74 20 62 65 63 61 75 73 65 20 6f 66 20 74 68  at because of th
161d0 65 20 77 61 79 20 53 51 4c 69 74 65 20 70 61 72  e way SQLite par
161e0 73 65 73 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c  ses compound SEL
161f0 45 43 54 73 2c 20 74 68 65 0a 2a 2a 20 69 6e 64  ECTs, the.** ind
16200 69 76 69 64 75 61 6c 20 73 65 6c 65 63 74 73 20  ividual selects 
16210 61 6c 77 61 79 73 20 67 72 6f 75 70 20 66 72 6f  always group fro
16220 6d 20 6c 65 66 74 20 74 6f 20 72 69 67 68 74 2e  m left to right.
16230 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d  .*/.static int m
16240 75 6c 74 69 53 65 6c 65 63 74 28 0a 20 20 50 61  ultiSelect(.  Pa
16250 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
16260 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63      /* Parsing c
16270 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65  ontext */.  Sele
16280 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  ct *p,          
16290 20 20 2f 2a 20 54 68 65 20 72 69 67 68 74 2d 6d    /* The right-m
162a0 6f 73 74 20 6f 66 20 53 45 4c 45 43 54 73 20 74  ost of SELECTs t
162b0 6f 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20  o be coded */.  
162c0 53 65 6c 65 63 74 44 65 73 74 20 2a 70 44 65 73  SelectDest *pDes
162d0 74 20 20 20 20 20 2f 2a 20 57 68 61 74 20 74 6f  t     /* What to
162e0 20 64 6f 20 77 69 74 68 20 71 75 65 72 79 20 72   do with query r
162f0 65 73 75 6c 74 73 20 2a 2f 0a 29 7b 0a 20 20 69  esults */.){.  i
16300 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
16310 4b 3b 20 20 20 2f 2a 20 53 75 63 63 65 73 73 20  K;   /* Success 
16320 63 6f 64 65 20 66 72 6f 6d 20 61 20 73 75 62 72  code from a subr
16330 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 53 65 6c 65  outine */.  Sele
16340 63 74 20 2a 70 50 72 69 6f 72 3b 20 20 20 20 20  ct *pPrior;     
16350 20 20 2f 2a 20 41 6e 6f 74 68 65 72 20 53 45 4c    /* Another SEL
16360 45 43 54 20 69 6d 6d 65 64 69 61 74 65 6c 79 20  ECT immediately 
16370 74 6f 20 6f 75 72 20 6c 65 66 74 20 2a 2f 0a 20  to our left */. 
16380 20 56 64 62 65 20 2a 76 3b 20 20 20 20 20 20 20   Vdbe *v;       
16390 20 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61         /* Genera
163a0 74 65 20 63 6f 64 65 20 74 6f 20 74 68 69 73 20  te code to this 
163b0 56 44 42 45 20 2a 2f 0a 20 20 53 65 6c 65 63 74  VDBE */.  Select
163c0 44 65 73 74 20 64 65 73 74 3b 20 20 20 20 20 20  Dest dest;      
163d0 2f 2a 20 41 6c 74 65 72 6e 61 74 69 76 65 20 64  /* Alternative d
163e0 61 74 61 20 64 65 73 74 69 6e 61 74 69 6f 6e 20  ata destination 
163f0 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 44 65  */.  Select *pDe
16400 6c 65 74 65 20 3d 20 30 3b 20 20 2f 2a 20 43 68  lete = 0;  /* Ch
16410 61 69 6e 20 6f 66 20 73 69 6d 70 6c 65 20 73 65  ain of simple se
16420 6c 65 63 74 73 20 74 6f 20 64 65 6c 65 74 65 20  lects to delete 
16430 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  */.  sqlite3 *db
16440 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61  ;          /* Da
16450 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
16460 6e 20 2a 2f 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20  n */..  /* Make 
16470 73 75 72 65 20 74 68 65 72 65 20 69 73 20 6e 6f  sure there is no
16480 20 4f 52 44 45 52 20 42 59 20 6f 72 20 4c 49 4d   ORDER BY or LIM
16490 49 54 20 63 6c 61 75 73 65 20 6f 6e 20 70 72 69  IT clause on pri
164a0 6f 72 20 53 45 4c 45 43 54 73 2e 20 20 4f 6e 6c  or SELECTs.  Onl
164b0 79 0a 20 20 2a 2a 20 74 68 65 20 6c 61 73 74 20  y.  ** the last 
164c0 28 72 69 67 68 74 2d 6d 6f 73 74 29 20 53 45 4c  (right-most) SEL
164d0 45 43 54 20 69 6e 20 74 68 65 20 73 65 72 69 65  ECT in the serie
164e0 73 20 6d 61 79 20 68 61 76 65 20 61 6e 20 4f 52  s may have an OR
164f0 44 45 52 20 42 59 20 6f 72 20 4c 49 4d 49 54 2e  DER BY or LIMIT.
16500 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
16510 70 20 26 26 20 70 2d 3e 70 50 72 69 6f 72 20 29  p && p->pPrior )
16520 3b 20 20 2f 2a 20 43 61 6c 6c 69 6e 67 20 66 75  ;  /* Calling fu
16530 6e 63 74 69 6f 6e 20 67 75 61 72 61 6e 74 65 65  nction guarantee
16540 73 20 74 68 69 73 20 6d 75 63 68 20 2a 2f 0a 20  s this much */. 
16550 20 61 73 73 65 72 74 28 20 28 70 2d 3e 73 65 6c   assert( (p->sel
16560 46 6c 61 67 73 20 26 20 53 46 5f 52 65 63 75 72  Flags & SF_Recur
16570 73 69 76 65 29 3d 3d 30 20 7c 7c 20 70 2d 3e 6f  sive)==0 || p->o
16580 70 3d 3d 54 4b 5f 41 4c 4c 20 7c 7c 20 70 2d 3e  p==TK_ALL || p->
16590 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29 3b 0a  op==TK_UNION );.
165a0 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64    db = pParse->d
165b0 62 3b 0a 20 20 70 50 72 69 6f 72 20 3d 20 70 2d  b;.  pPrior = p-
165c0 3e 70 50 72 69 6f 72 3b 0a 20 20 64 65 73 74 20  >pPrior;.  dest 
165d0 3d 20 2a 70 44 65 73 74 3b 0a 20 20 69 66 28 20  = *pDest;.  if( 
165e0 70 50 72 69 6f 72 2d 3e 70 4f 72 64 65 72 42 79  pPrior->pOrderBy
165f0 20 7c 7c 20 70 50 72 69 6f 72 2d 3e 70 4c 69 6d   || pPrior->pLim
16600 69 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  it ){.    sqlite
16610 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
16620 2c 22 25 73 20 63 6c 61 75 73 65 20 73 68 6f 75  ,"%s clause shou
16630 6c 64 20 63 6f 6d 65 20 61 66 74 65 72 20 25 73  ld come after %s
16640 20 6e 6f 74 20 62 65 66 6f 72 65 22 2c 0a 20 20   not before",.  
16650 20 20 20 20 70 50 72 69 6f 72 2d 3e 70 4f 72 64      pPrior->pOrd
16660 65 72 42 79 21 3d 30 20 3f 20 22 4f 52 44 45 52  erBy!=0 ? "ORDER
16670 20 42 59 22 20 3a 20 22 4c 49 4d 49 54 22 2c 20   BY" : "LIMIT", 
16680 73 65 6c 65 63 74 4f 70 4e 61 6d 65 28 70 2d 3e  selectOpName(p->
16690 6f 70 29 29 3b 0a 20 20 20 20 72 63 20 3d 20 31  op));.    rc = 1
166a0 3b 0a 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69  ;.    goto multi
166b0 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d  _select_end;.  }
166c0 0a 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47  ..  v = sqlite3G
166d0 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a  etVdbe(pParse);.
166e0 20 20 61 73 73 65 72 74 28 20 76 21 3d 30 20 29    assert( v!=0 )
166f0 3b 20 20 2f 2a 20 54 68 65 20 56 44 42 45 20 61  ;  /* The VDBE a
16700 6c 72 65 61 64 79 20 63 72 65 61 74 65 64 20 62  lready created b
16710 79 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69  y calling functi
16720 6f 6e 20 2a 2f 0a 0a 20 20 2f 2a 20 43 72 65 61  on */..  /* Crea
16730 74 65 20 74 68 65 20 64 65 73 74 69 6e 61 74 69  te the destinati
16740 6f 6e 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  on temporary tab
16750 6c 65 20 69 66 20 6e 65 63 65 73 73 61 72 79 0a  le if necessary.
16760 20 20 2a 2f 0a 20 20 69 66 28 20 64 65 73 74 2e    */.  if( dest.
16770 65 44 65 73 74 3d 3d 53 52 54 5f 45 70 68 65 6d  eDest==SRT_Ephem
16780 54 61 62 20 29 7b 0a 20 20 20 20 61 73 73 65 72  Tab ){.    asser
16790 74 28 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a  t( p->pEList );.
167a0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
167b0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e  ddOp2(v, OP_Open
167c0 45 70 68 65 6d 65 72 61 6c 2c 20 64 65 73 74 2e  Ephemeral, dest.
167d0 69 53 44 50 61 72 6d 2c 20 70 2d 3e 70 45 4c 69  iSDParm, p->pELi
167e0 73 74 2d 3e 6e 45 78 70 72 29 3b 0a 20 20 20 20  st->nExpr);.    
167f0 64 65 73 74 2e 65 44 65 73 74 20 3d 20 53 52 54  dest.eDest = SRT
16800 5f 54 61 62 6c 65 3b 0a 20 20 7d 0a 0a 20 20 2f  _Table;.  }..  /
16810 2a 20 53 70 65 63 69 61 6c 20 68 61 6e 64 6c 69  * Special handli
16820 6e 67 20 66 6f 72 20 61 20 63 6f 6d 70 6f 75 6e  ng for a compoun
16830 64 2d 73 65 6c 65 63 74 20 74 68 61 74 20 6f 72  d-select that or
16840 69 67 69 6e 61 74 65 73 20 61 73 20 61 20 56 41  iginates as a VA
16850 4c 55 45 53 20 63 6c 61 75 73 65 2e 0a 20 20 2a  LUES clause..  *
16860 2f 0a 20 20 69 66 28 20 70 2d 3e 73 65 6c 46 6c  /.  if( p->selFl
16870 61 67 73 20 26 20 53 46 5f 4d 75 6c 74 69 56 61  ags & SF_MultiVa
16880 6c 75 65 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  lue ){.    rc = 
16890 6d 75 6c 74 69 53 65 6c 65 63 74 56 61 6c 75 65  multiSelectValue
168a0 73 28 70 50 61 72 73 65 2c 20 70 2c 20 26 64 65  s(pParse, p, &de
168b0 73 74 29 3b 0a 20 20 20 20 67 6f 74 6f 20 6d 75  st);.    goto mu
168c0 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  lti_select_end;.
168d0 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73    }..  /* Make s
168e0 75 72 65 20 61 6c 6c 20 53 45 4c 45 43 54 73 20  ure all SELECTs 
168f0 69 6e 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  in the statement
16900 20 68 61 76 65 20 74 68 65 20 73 61 6d 65 20 6e   have the same n
16910 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74  umber of element
16920 73 0a 20 20 2a 2a 20 69 6e 20 74 68 65 69 72 20  s.  ** in their 
16930 72 65 73 75 6c 74 20 73 65 74 73 2e 0a 20 20 2a  result sets..  *
16940 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70  /.  assert( p->p
16950 45 4c 69 73 74 20 26 26 20 70 50 72 69 6f 72 2d  EList && pPrior-
16960 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20 61 73 73  >pEList );.  ass
16970 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 2d 3e  ert( p->pEList->
16980 6e 45 78 70 72 3d 3d 70 50 72 69 6f 72 2d 3e 70  nExpr==pPrior->p
16990 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 3b 0a  EList->nExpr );.
169a0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
169b0 4f 4d 49 54 5f 43 54 45 0a 20 20 69 66 28 20 70  OMIT_CTE.  if( p
169c0 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f  ->selFlags & SF_
169d0 52 65 63 75 72 73 69 76 65 20 29 7b 0a 20 20 20  Recursive ){.   
169e0 20 67 65 6e 65 72 61 74 65 57 69 74 68 52 65 63   generateWithRec
169f0 75 72 73 69 76 65 51 75 65 72 79 28 70 50 61 72  ursiveQuery(pPar
16a00 73 65 2c 20 70 2c 20 26 64 65 73 74 29 3b 0a 20  se, p, &dest);. 
16a10 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 0a 20   }else.#endif.. 
16a20 20 2f 2a 20 43 6f 6d 70 6f 75 6e 64 20 53 45 4c   /* Compound SEL
16a30 45 43 54 73 20 74 68 61 74 20 68 61 76 65 20 61  ECTs that have a
16a40 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  n ORDER BY claus
16a50 65 20 61 72 65 20 68 61 6e 64 6c 65 64 20 73 65  e are handled se
16a60 70 61 72 61 74 65 6c 79 2e 0a 20 20 2a 2f 0a 20  parately..  */. 
16a70 20 69 66 28 20 70 2d 3e 70 4f 72 64 65 72 42 79   if( p->pOrderBy
16a80 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 6d   ){.    return m
16a90 75 6c 74 69 53 65 6c 65 63 74 4f 72 64 65 72 42  ultiSelectOrderB
16aa0 79 28 70 50 61 72 73 65 2c 20 70 2c 20 70 44 65  y(pParse, p, pDe
16ab0 73 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 0a 23  st);.  }else{..#
16ac0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
16ad0 49 54 5f 45 58 50 4c 41 49 4e 0a 20 20 20 20 69  IT_EXPLAIN.    i
16ae0 66 28 20 70 50 72 69 6f 72 2d 3e 70 50 72 69 6f  f( pPrior->pPrio
16af0 72 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 45 78  r==0 ){.      Ex
16b00 70 6c 61 69 6e 51 75 65 72 79 50 6c 61 6e 28 28  plainQueryPlan((
16b10 70 50 61 72 73 65 2c 20 31 2c 20 22 43 4f 4d 50  pParse, 1, "COMP
16b20 4f 55 4e 44 20 51 55 45 52 59 22 29 29 3b 0a 20  OUND QUERY"));. 
16b30 20 20 20 20 20 45 78 70 6c 61 69 6e 51 75 65 72       ExplainQuer
16b40 79 50 6c 61 6e 28 28 70 50 61 72 73 65 2c 20 31  yPlan((pParse, 1
16b50 2c 20 22 4c 45 46 54 2d 4d 4f 53 54 20 53 55 42  , "LEFT-MOST SUB
16b60 51 55 45 52 59 22 29 29 3b 0a 20 20 20 20 7d 0a  QUERY"));.    }.
16b70 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 47  #endif..    /* G
16b80 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72  enerate code for
16b90 20 74 68 65 20 6c 65 66 74 20 61 6e 64 20 72 69   the left and ri
16ba0 67 68 74 20 53 45 4c 45 43 54 20 73 74 61 74 65  ght SELECT state
16bb0 6d 65 6e 74 73 2e 0a 20 20 20 20 2a 2f 0a 20 20  ments..    */.  
16bc0 20 20 73 77 69 74 63 68 28 20 70 2d 3e 6f 70 20    switch( p->op 
16bd0 29 7b 0a 20 20 20 20 20 20 63 61 73 65 20 54 4b  ){.      case TK
16be0 5f 41 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 20 20  _ALL: {.        
16bf0 69 6e 74 20 61 64 64 72 20 3d 20 30 3b 0a 20 20  int addr = 0;.  
16c00 20 20 20 20 20 20 69 6e 74 20 6e 4c 69 6d 69 74        int nLimit
16c10 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
16c20 28 20 21 70 50 72 69 6f 72 2d 3e 70 4c 69 6d 69  ( !pPrior->pLimi
16c30 74 20 29 3b 0a 20 20 20 20 20 20 20 20 70 50 72  t );.        pPr
16c40 69 6f 72 2d 3e 69 4c 69 6d 69 74 20 3d 20 70 2d  ior->iLimit = p-
16c50 3e 69 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 20  >iLimit;.       
16c60 20 70 50 72 69 6f 72 2d 3e 69 4f 66 66 73 65 74   pPrior->iOffset
16c70 20 3d 20 70 2d 3e 69 4f 66 66 73 65 74 3b 0a 20   = p->iOffset;. 
16c80 20 20 20 20 20 20 20 70 50 72 69 6f 72 2d 3e 70         pPrior->p
16c90 4c 69 6d 69 74 20 3d 20 70 2d 3e 70 4c 69 6d 69  Limit = p->pLimi
16ca0 74 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  t;.        rc = 
16cb0 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50  sqlite3Select(pP
16cc0 61 72 73 65 2c 20 70 50 72 69 6f 72 2c 20 26 64  arse, pPrior, &d
16cd0 65 73 74 29 3b 0a 20 20 20 20 20 20 20 20 70 2d  est);.        p-
16ce0 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20  >pLimit = 0;.   
16cf0 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20       if( rc ){. 
16d00 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 75           goto mu
16d10 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  lti_select_end;.
16d20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
16d30 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b    p->pPrior = 0;
16d40 0a 20 20 20 20 20 20 20 20 70 2d 3e 69 4c 69 6d  .        p->iLim
16d50 69 74 20 3d 20 70 50 72 69 6f 72 2d 3e 69 4c 69  it = pPrior->iLi
16d60 6d 69 74 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e  mit;.        p->
16d70 69 4f 66 66 73 65 74 20 3d 20 70 50 72 69 6f 72  iOffset = pPrior
16d80 2d 3e 69 4f 66 66 73 65 74 3b 0a 20 20 20 20 20  ->iOffset;.     
16d90 20 20 20 69 66 28 20 70 2d 3e 69 4c 69 6d 69 74     if( p->iLimit
16da0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 64   ){.          ad
16db0 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  dr = sqlite3Vdbe
16dc0 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66 4e  AddOp1(v, OP_IfN
16dd0 6f 74 2c 20 70 2d 3e 69 4c 69 6d 69 74 29 3b 20  ot, p->iLimit); 
16de0 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
16df0 0a 20 20 20 20 20 20 20 20 20 20 56 64 62 65 43  .          VdbeC
16e00 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4a 75 6d 70  omment((v, "Jump
16e10 20 61 68 65 61 64 20 69 66 20 4c 49 4d 49 54 20   ahead if LIMIT 
16e20 72 65 61 63 68 65 64 22 29 29 3b 0a 20 20 20 20  reached"));.    
16e30 20 20 20 20 20 20 69 66 28 20 70 2d 3e 69 4f 66        if( p->iOf
16e40 66 73 65 74 20 29 7b 0a 20 20 20 20 20 20 20 20  fset ){.        
16e50 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
16e60 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4f 66 66 73  ddOp3(v, OP_Offs
16e70 65 74 4c 69 6d 69 74 2c 0a 20 20 20 20 20 20 20  etLimit,.       
16e80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16e90 20 20 20 20 20 20 20 70 2d 3e 69 4c 69 6d 69 74         p->iLimit
16ea0 2c 20 70 2d 3e 69 4f 66 66 73 65 74 2b 31 2c 20  , p->iOffset+1, 
16eb0 70 2d 3e 69 4f 66 66 73 65 74 29 3b 0a 20 20 20  p->iOffset);.   
16ec0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
16ed0 20 7d 0a 20 20 20 20 20 20 20 20 45 78 70 6c 61   }.        Expla
16ee0 69 6e 51 75 65 72 79 50 6c 61 6e 28 28 70 50 61  inQueryPlan((pPa
16ef0 72 73 65 2c 20 31 2c 20 22 55 4e 49 4f 4e 20 41  rse, 1, "UNION A
16f00 4c 4c 22 29 29 3b 0a 20 20 20 20 20 20 20 20 72  LL"));.        r
16f10 63 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63  c = sqlite3Selec
16f20 74 28 70 50 61 72 73 65 2c 20 70 2c 20 26 64 65  t(pParse, p, &de
16f30 73 74 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73  st);.        tes
16f40 74 63 61 73 65 28 20 72 63 21 3d 53 51 4c 49 54  tcase( rc!=SQLIT
16f50 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 20 20  E_OK );.        
16f60 70 44 65 6c 65 74 65 20 3d 20 70 2d 3e 70 50 72  pDelete = p->pPr
16f70 69 6f 72 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e  ior;.        p->
16f80 70 50 72 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b  pPrior = pPrior;
16f90 0a 20 20 20 20 20 20 20 20 70 2d 3e 6e 53 65 6c  .        p->nSel
16fa0 65 63 74 52 6f 77 20 3d 20 73 71 6c 69 74 65 33  ectRow = sqlite3
16fb0 4c 6f 67 45 73 74 41 64 64 28 70 2d 3e 6e 53 65  LogEstAdd(p->nSe
16fc0 6c 65 63 74 52 6f 77 2c 20 70 50 72 69 6f 72 2d  lectRow, pPrior-
16fd0 3e 6e 53 65 6c 65 63 74 52 6f 77 29 3b 0a 20 20  >nSelectRow);.  
16fe0 20 20 20 20 20 20 69 66 28 20 70 50 72 69 6f 72        if( pPrior
16ff0 2d 3e 70 4c 69 6d 69 74 0a 20 20 20 20 20 20 20  ->pLimit.       
17000 20 20 26 26 20 73 71 6c 69 74 65 33 45 78 70 72    && sqlite3Expr
17010 49 73 49 6e 74 65 67 65 72 28 70 50 72 69 6f 72  IsInteger(pPrior
17020 2d 3e 70 4c 69 6d 69 74 2d 3e 70 4c 65 66 74 2c  ->pLimit->pLeft,
17030 20 26 6e 4c 69 6d 69 74 29 0a 20 20 20 20 20 20   &nLimit).      
17040 20 20 20 26 26 20 6e 4c 69 6d 69 74 3e 30 20 26     && nLimit>0 &
17050 26 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20  & p->nSelectRow 
17060 3e 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28  > sqlite3LogEst(
17070 28 75 36 34 29 6e 4c 69 6d 69 74 29 20 0a 20 20  (u64)nLimit) .  
17080 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
17090 20 20 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77     p->nSelectRow
170a0 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74   = sqlite3LogEst
170b0 28 28 75 36 34 29 6e 4c 69 6d 69 74 29 3b 0a 20  ((u64)nLimit);. 
170c0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
170d0 20 69 66 28 20 61 64 64 72 20 29 7b 0a 20 20 20   if( addr ){.   
170e0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
170f0 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64  beJumpHere(v, ad
17100 64 72 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  dr);.        }. 
17110 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
17120 20 20 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65      }.      case
17130 20 54 4b 5f 45 58 43 45 50 54 3a 0a 20 20 20 20   TK_EXCEPT:.    
17140 20 20 63 61 73 65 20 54 4b 5f 55 4e 49 4f 4e 3a    case TK_UNION:
17150 20 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 75   {.        int u
17160 6e 69 6f 6e 54 61 62 3b 20 20 20 20 2f 2a 20 43  nionTab;    /* C
17170 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20  ursor number of 
17180 74 68 65 20 74 65 6d 70 20 74 61 62 6c 65 20 68  the temp table h
17190 6f 6c 64 69 6e 67 20 72 65 73 75 6c 74 20 2a 2f  olding result */
171a0 0a 20 20 20 20 20 20 20 20 75 38 20 6f 70 20 3d  .        u8 op =
171b0 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65   0;       /* One
171c0 20 6f 66 20 74 68 65 20 53 52 54 5f 20 6f 70 65   of the SRT_ ope
171d0 72 61 74 69 6f 6e 73 20 74 6f 20 61 70 70 6c 79  rations to apply
171e0 20 74 6f 20 73 65 6c 66 20 2a 2f 0a 20 20 20 20   to self */.    
171f0 20 20 20 20 69 6e 74 20 70 72 69 6f 72 4f 70 3b      int priorOp;
17200 20 20 20 20 20 2f 2a 20 54 68 65 20 53 52 54 5f       /* The SRT_
17210 20 6f 70 65 72 61 74 69 6f 6e 20 74 6f 20 61 70   operation to ap
17220 70 6c 79 20 74 6f 20 70 72 69 6f 72 20 73 65 6c  ply to prior sel
17230 65 63 74 73 20 2a 2f 0a 20 20 20 20 20 20 20 20  ects */.        
17240 45 78 70 72 20 2a 70 4c 69 6d 69 74 3b 20 20 20  Expr *pLimit;   
17250 20 2f 2a 20 53 61 76 65 64 20 76 61 6c 75 65 73   /* Saved values
17260 20 6f 66 20 70 2d 3e 6e 4c 69 6d 69 74 20 20 2a   of p->nLimit  *
17270 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 61 64  /.        int ad
17280 64 72 3b 0a 20 20 20 20 20 20 20 20 53 65 6c 65  dr;.        Sele
17290 63 74 44 65 73 74 20 75 6e 69 6f 6e 64 65 73 74  ctDest uniondest
172a0 3b 0a 20 20 0a 20 20 20 20 20 20 20 20 74 65 73  ;.  .        tes
172b0 74 63 61 73 65 28 20 70 2d 3e 6f 70 3d 3d 54 4b  tcase( p->op==TK
172c0 5f 45 58 43 45 50 54 20 29 3b 0a 20 20 20 20 20  _EXCEPT );.     
172d0 20 20 20 74 65 73 74 63 61 73 65 28 20 70 2d 3e     testcase( p->
172e0 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29 3b 0a  op==TK_UNION );.
172f0 20 20 20 20 20 20 20 20 70 72 69 6f 72 4f 70 20          priorOp 
17300 3d 20 53 52 54 5f 55 6e 69 6f 6e 3b 0a 20 20 20  = SRT_Union;.   
17310 20 20 20 20 20 69 66 28 20 64 65 73 74 2e 65 44       if( dest.eD
17320 65 73 74 3d 3d 70 72 69 6f 72 4f 70 20 29 7b 0a  est==priorOp ){.
17330 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 65 20            /* We 
17340 63 61 6e 20 72 65 75 73 65 20 61 20 74 65 6d 70  can reuse a temp
17350 6f 72 61 72 79 20 74 61 62 6c 65 20 67 65 6e 65  orary table gene
17360 72 61 74 65 64 20 62 79 20 61 20 53 45 4c 45 43  rated by a SELEC
17370 54 20 74 6f 20 6f 75 72 0a 20 20 20 20 20 20 20  T to our.       
17380 20 20 20 2a 2a 20 72 69 67 68 74 2e 0a 20 20 20     ** right..   
17390 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
173a0 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70      assert( p->p
173b0 4c 69 6d 69 74 3d 3d 30 20 29 3b 20 20 20 20 20  Limit==0 );     
173c0 20 2f 2a 20 4e 6f 74 20 61 6c 6c 6f 77 65 64 20   /* Not allowed 
173d0 6f 6e 20 6c 65 66 74 77 61 72 64 20 65 6c 65 6d  on leftward elem
173e0 65 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20 20 20  ents */.        
173f0 20 20 75 6e 69 6f 6e 54 61 62 20 3d 20 64 65 73    unionTab = des
17400 74 2e 69 53 44 50 61 72 6d 3b 0a 20 20 20 20 20  t.iSDParm;.     
17410 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
17420 20 20 20 20 2f 2a 20 57 65 20 77 69 6c 6c 20 6e      /* We will n
17430 65 65 64 20 74 6f 20 63 72 65 61 74 65 20 6f 75  eed to create ou
17440 72 20 6f 77 6e 20 74 65 6d 70 6f 72 61 72 79 20  r own temporary 
17450 74 61 62 6c 65 20 74 6f 20 68 6f 6c 64 20 74 68  table to hold th
17460 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69  e.          ** i
17470 6e 74 65 72 6d 65 64 69 61 74 65 20 72 65 73 75  ntermediate resu
17480 6c 74 73 2e 0a 20 20 20 20 20 20 20 20 20 20 2a  lts..          *
17490 2f 0a 20 20 20 20 20 20 20 20 20 20 75 6e 69 6f  /.          unio
174a0 6e 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 6e  nTab = pParse->n
174b0 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20  Tab++;.         
174c0 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4f 72 64   assert( p->pOrd
174d0 65 72 42 79 3d 3d 30 20 29 3b 0a 20 20 20 20 20  erBy==0 );.     
174e0 20 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69       addr = sqli
174f0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
17500 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61   OP_OpenEphemera
17510 6c 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 30 29 3b  l, unionTab, 0);
17520 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
17530 74 28 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70  t( p->addrOpenEp
17540 68 6d 5b 30 5d 20 3d 3d 20 2d 31 20 29 3b 0a 20  hm[0] == -1 );. 
17550 20 20 20 20 20 20 20 20 20 70 2d 3e 61 64 64 72           p->addr
17560 4f 70 65 6e 45 70 68 6d 5b 30 5d 20 3d 20 61 64  OpenEphm[0] = ad
17570 64 72 3b 0a 20 20 20 20 20 20 20 20 20 20 66 69  dr;.          fi
17580 6e 64 52 69 67 68 74 6d 6f 73 74 28 70 29 2d 3e  ndRightmost(p)->
17590 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f 55  selFlags |= SF_U
175a0 73 65 73 45 70 68 65 6d 65 72 61 6c 3b 0a 20 20  sesEphemeral;.  
175b0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
175c0 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20 20  p->pEList );.   
175d0 20 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 20 20       }.  .      
175e0 20 20 2f 2a 20 43 6f 64 65 20 74 68 65 20 53 45    /* Code the SE
175f0 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73 20  LECT statements 
17600 74 6f 20 6f 75 72 20 6c 65 66 74 0a 20 20 20 20  to our left.    
17610 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 61      */.        a
17620 73 73 65 72 74 28 20 21 70 50 72 69 6f 72 2d 3e  ssert( !pPrior->
17630 70 4f 72 64 65 72 42 79 20 29 3b 0a 20 20 20 20  pOrderBy );.    
17640 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63      sqlite3Selec
17650 74 44 65 73 74 49 6e 69 74 28 26 75 6e 69 6f 6e  tDestInit(&union
17660 64 65 73 74 2c 20 70 72 69 6f 72 4f 70 2c 20 75  dest, priorOp, u
17670 6e 69 6f 6e 54 61 62 29 3b 0a 20 20 20 20 20 20  nionTab);.      
17680 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53 65    rc = sqlite3Se
17690 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 50 72  lect(pParse, pPr
176a0 69 6f 72 2c 20 26 75 6e 69 6f 6e 64 65 73 74 29  ior, &uniondest)
176b0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
176c0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f   ){.          go
176d0 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f  to multi_select_
176e0 65 6e 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  end;.        }. 
176f0 20 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 64   .        /* Cod
17700 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 53 45  e the current SE
17710 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 0a 20  LECT statement. 
17720 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
17730 20 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f    if( p->op==TK_
17740 45 58 43 45 50 54 20 29 7b 0a 20 20 20 20 20 20  EXCEPT ){.      
17750 20 20 20 20 6f 70 20 3d 20 53 52 54 5f 45 78 63      op = SRT_Exc
17760 65 70 74 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  ept;.        }el
17770 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73  se{.          as
17780 73 65 72 74 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f  sert( p->op==TK_
17790 55 4e 49 4f 4e 20 29 3b 0a 20 20 20 20 20 20 20  UNION );.       
177a0 20 20 20 6f 70 20 3d 20 53 52 54 5f 55 6e 69 6f     op = SRT_Unio
177b0 6e 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  n;.        }.   
177c0 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d       p->pPrior =
177d0 20 30 3b 0a 20 20 20 20 20 20 20 20 70 4c 69 6d   0;.        pLim
177e0 69 74 20 3d 20 70 2d 3e 70 4c 69 6d 69 74 3b 0a  it = p->pLimit;.
177f0 20 20 20 20 20 20 20 20 70 2d 3e 70 4c 69 6d 69          p->pLimi
17800 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 75  t = 0;.        u
17810 6e 69 6f 6e 64 65 73 74 2e 65 44 65 73 74 20 3d  niondest.eDest =
17820 20 6f 70 3b 0a 20 20 20 20 20 20 20 20 45 78 70   op;.        Exp
17830 6c 61 69 6e 51 75 65 72 79 50 6c 61 6e 28 28 70  lainQueryPlan((p
17840 50 61 72 73 65 2c 20 31 2c 20 22 25 73 20 55 53  Parse, 1, "%s US
17850 49 4e 47 20 54 45 4d 50 20 42 2d 54 52 45 45 22  ING TEMP B-TREE"
17860 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
17870 20 20 20 20 20 20 20 20 20 20 20 20 73 65 6c 65              sele
17880 63 74 4f 70 4e 61 6d 65 28 70 2d 3e 6f 70 29 29  ctOpName(p->op))
17890 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  );.        rc = 
178a0 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50  sqlite3Select(pP
178b0 61 72 73 65 2c 20 70 2c 20 26 75 6e 69 6f 6e 64  arse, p, &uniond
178c0 65 73 74 29 3b 0a 20 20 20 20 20 20 20 20 74 65  est);.        te
178d0 73 74 63 61 73 65 28 20 72 63 21 3d 53 51 4c 49  stcase( rc!=SQLI
178e0 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 20  TE_OK );.       
178f0 20 2f 2a 20 51 75 65 72 79 20 66 6c 61 74 74 65   /* Query flatte
17900 6e 69 6e 67 20 69 6e 20 73 71 6c 69 74 65 33 53  ning in sqlite3S
17910 65 6c 65 63 74 28 29 20 6d 69 67 68 74 20 72 65  elect() might re
17920 66 69 6c 6c 20 70 2d 3e 70 4f 72 64 65 72 42 79  fill p->pOrderBy
17930 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 42 65 20  ..        ** Be 
17940 73 75 72 65 20 74 6f 20 64 65 6c 65 74 65 20 70  sure to delete p
17950 2d 3e 70 4f 72 64 65 72 42 79 2c 20 74 68 65 72  ->pOrderBy, ther
17960 65 66 6f 72 65 2c 20 74 6f 20 61 76 6f 69 64 20  efore, to avoid 
17970 61 20 6d 65 6d 6f 72 79 20 6c 65 61 6b 2e 20 2a  a memory leak. *
17980 2f 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  /.        sqlite
17990 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28  3ExprListDelete(
179a0 64 62 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79 29  db, p->pOrderBy)
179b0 3b 0a 20 20 20 20 20 20 20 20 70 44 65 6c 65 74  ;.        pDelet
179c0 65 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20  e = p->pPrior;. 
179d0 20 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72         p->pPrior
179e0 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20 20 20   = pPrior;.     
179f0 20 20 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d     p->pOrderBy =
17a00 20 30 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   0;.        if( 
17a10 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20  p->op==TK_UNION 
17a20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e  ){.          p->
17a30 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 73 71 6c  nSelectRow = sql
17a40 69 74 65 33 4c 6f 67 45 73 74 41 64 64 28 70 2d  ite3LogEstAdd(p-
17a50 3e 6e 53 65 6c 65 63 74 52 6f 77 2c 20 70 50 72  >nSelectRow, pPr
17a60 69 6f 72 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 29  ior->nSelectRow)
17a70 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
17a80 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44      sqlite3ExprD
17a90 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 4c 69  elete(db, p->pLi
17aa0 6d 69 74 29 3b 0a 20 20 20 20 20 20 20 20 70 2d  mit);.        p-
17ab0 3e 70 4c 69 6d 69 74 20 3d 20 70 4c 69 6d 69 74  >pLimit = pLimit
17ac0 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 69 4c 69  ;.        p->iLi
17ad0 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  mit = 0;.       
17ae0 20 70 2d 3e 69 4f 66 66 73 65 74 20 3d 20 30 3b   p->iOffset = 0;
17af0 0a 20 20 0a 20 20 20 20 20 20 20 20 2f 2a 20 43  .  .        /* C
17b00 6f 6e 76 65 72 74 20 74 68 65 20 64 61 74 61 20  onvert the data 
17b10 69 6e 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79  in the temporary
17b20 20 74 61 62 6c 65 20 69 6e 74 6f 20 77 68 61 74   table into what
17b30 65 76 65 72 20 66 6f 72 6d 0a 20 20 20 20 20 20  ever form.      
17b40 20 20 2a 2a 20 69 74 20 69 73 20 74 68 61 74 20    ** it is that 
17b50 77 65 20 63 75 72 72 65 6e 74 6c 79 20 6e 65 65  we currently nee
17b60 64 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  d..        */.  
17b70 20 20 20 20 20 20 61 73 73 65 72 74 28 20 75 6e        assert( un
17b80 69 6f 6e 54 61 62 3d 3d 64 65 73 74 2e 69 53 44  ionTab==dest.iSD
17b90 50 61 72 6d 20 7c 7c 20 64 65 73 74 2e 65 44 65  Parm || dest.eDe
17ba0 73 74 21 3d 70 72 69 6f 72 4f 70 20 29 3b 0a 20  st!=priorOp );. 
17bb0 20 20 20 20 20 20 20 69 66 28 20 64 65 73 74 2e         if( dest.
17bc0 65 44 65 73 74 21 3d 70 72 69 6f 72 4f 70 20 29  eDest!=priorOp )
17bd0 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20  {.          int 
17be0 69 43 6f 6e 74 2c 20 69 42 72 65 61 6b 2c 20 69  iCont, iBreak, i
17bf0 53 74 61 72 74 3b 0a 20 20 20 20 20 20 20 20 20  Start;.         
17c00 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69   assert( p->pELi
17c10 73 74 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  st );.          
17c20 69 42 72 65 61 6b 20 3d 20 73 71 6c 69 74 65 33  iBreak = sqlite3
17c30 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
17c40 3b 0a 20 20 20 20 20 20 20 20 20 20 69 43 6f 6e  ;.          iCon
17c50 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  t = sqlite3VdbeM
17c60 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20  akeLabel(v);.   
17c70 20 20 20 20 20 20 20 63 6f 6d 70 75 74 65 4c 69         computeLi
17c80 6d 69 74 52 65 67 69 73 74 65 72 73 28 70 50 61  mitRegisters(pPa
17c90 72 73 65 2c 20 70 2c 20 69 42 72 65 61 6b 29 3b  rse, p, iBreak);
17ca0 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
17cb0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
17cc0 4f 50 5f 52 65 77 69 6e 64 2c 20 75 6e 69 6f 6e  OP_Rewind, union
17cd0 54 61 62 2c 20 69 42 72 65 61 6b 29 3b 20 56 64  Tab, iBreak); Vd
17ce0 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
17cf0 20 20 20 20 20 20 20 20 20 69 53 74 61 72 74 20           iStart 
17d00 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  = sqlite3VdbeCur
17d10 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20  rentAddr(v);.   
17d20 20 20 20 20 20 20 20 73 65 6c 65 63 74 49 6e 6e         selectInn
17d30 65 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20 70  erLoop(pParse, p
17d40 2c 20 75 6e 69 6f 6e 54 61 62 2c 0a 20 20 20 20  , unionTab,.    
17d50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17d60 20 20 20 20 20 20 30 2c 20 30 2c 20 26 64 65 73        0, 0, &des
17d70 74 2c 20 69 43 6f 6e 74 2c 20 69 42 72 65 61 6b  t, iCont, iBreak
17d80 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
17d90 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
17da0 61 62 65 6c 28 76 2c 20 69 43 6f 6e 74 29 3b 0a  abel(v, iCont);.
17db0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
17dc0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
17dd0 50 5f 4e 65 78 74 2c 20 75 6e 69 6f 6e 54 61 62  P_Next, unionTab
17de0 2c 20 69 53 74 61 72 74 29 3b 20 56 64 62 65 43  , iStart); VdbeC
17df0 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
17e00 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
17e10 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
17e20 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20   iBreak);.      
17e30 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
17e40 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6c 6f 73  ddOp2(v, OP_Clos
17e50 65 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 30 29 3b  e, unionTab, 0);
17e60 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
17e70 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
17e80 7d 0a 20 20 20 20 20 20 64 65 66 61 75 6c 74 3a  }.      default:
17e90 20 61 73 73 65 72 74 28 20 70 2d 3e 6f 70 3d 3d   assert( p->op==
17ea0 54 4b 5f 49 4e 54 45 52 53 45 43 54 20 29 3b 20  TK_INTERSECT ); 
17eb0 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 74 61  {.        int ta
17ec0 62 31 2c 20 74 61 62 32 3b 0a 20 20 20 20 20 20  b1, tab2;.      
17ed0 20 20 69 6e 74 20 69 43 6f 6e 74 2c 20 69 42 72    int iCont, iBr
17ee0 65 61 6b 2c 20 69 53 74 61 72 74 3b 0a 20 20 20  eak, iStart;.   
17ef0 20 20 20 20 20 45 78 70 72 20 2a 70 4c 69 6d 69       Expr *pLimi
17f00 74 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 61  t;.        int a
17f10 64 64 72 3b 0a 20 20 20 20 20 20 20 20 53 65 6c  ddr;.        Sel
17f20 65 63 74 44 65 73 74 20 69 6e 74 65 72 73 65 63  ectDest intersec
17f30 74 64 65 73 74 3b 0a 20 20 20 20 20 20 20 20 69  tdest;.        i
17f40 6e 74 20 72 31 3b 0a 20 20 0a 20 20 20 20 20 20  nt r1;.  .      
17f50 20 20 2f 2a 20 49 4e 54 45 52 53 45 43 54 20 69    /* INTERSECT i
17f60 73 20 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d  s different from
17f70 20 74 68 65 20 6f 74 68 65 72 73 20 73 69 6e 63   the others sinc
17f80 65 20 69 74 20 72 65 71 75 69 72 65 73 0a 20 20  e it requires.  
17f90 20 20 20 20 20 20 2a 2a 20 74 77 6f 20 74 65 6d        ** two tem
17fa0 70 6f 72 61 72 79 20 74 61 62 6c 65 73 2e 20 20  porary tables.  
17fb0 48 65 6e 63 65 20 69 74 20 68 61 73 20 69 74 73  Hence it has its
17fc0 20 6f 77 6e 20 63 61 73 65 2e 20 20 42 65 67 69   own case.  Begi
17fd0 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 62 79 20  n.        ** by 
17fe0 61 6c 6c 6f 63 61 74 69 6e 67 20 74 68 65 20 74  allocating the t
17ff0 61 62 6c 65 73 20 77 65 20 77 69 6c 6c 20 6e 65  ables we will ne
18000 65 64 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  ed..        */. 
18010 20 20 20 20 20 20 20 74 61 62 31 20 3d 20 70 50         tab1 = pP
18020 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20  arse->nTab++;.  
18030 20 20 20 20 20 20 74 61 62 32 20 3d 20 70 50 61        tab2 = pPa
18040 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20  rse->nTab++;.   
18050 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
18060 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 3b 0a 20  pOrderBy==0 );. 
18070 20 0a 20 20 20 20 20 20 20 20 61 64 64 72 20 3d   .        addr =
18080 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
18090 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68  p2(v, OP_OpenEph
180a0 65 6d 65 72 61 6c 2c 20 74 61 62 31 2c 20 30 29  emeral, tab1, 0)
180b0 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
180c0 28 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68  ( p->addrOpenEph
180d0 6d 5b 30 5d 20 3d 3d 20 2d 31 20 29 3b 0a 20 20  m[0] == -1 );.  
180e0 20 20 20 20 20 20 70 2d 3e 61 64 64 72 4f 70 65        p->addrOpe
180f0 6e 45 70 68 6d 5b 30 5d 20 3d 20 61 64 64 72 3b  nEphm[0] = addr;
18100 0a 20 20 20 20 20 20 20 20 66 69 6e 64 52 69 67  .        findRig
18110 68 74 6d 6f 73 74 28 70 29 2d 3e 73 65 6c 46 6c  htmost(p)->selFl
18120 61 67 73 20 7c 3d 20 53 46 5f 55 73 65 73 45 70  ags |= SF_UsesEp
18130 68 65 6d 65 72 61 6c 3b 0a 20 20 20 20 20 20 20  hemeral;.       
18140 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69   assert( p->pELi
18150 73 74 20 29 3b 0a 20 20 0a 20 20 20 20 20 20 20  st );.  .       
18160 20 2f 2a 20 43 6f 64 65 20 74 68 65 20 53 45 4c   /* Code the SEL
18170 45 43 54 73 20 74 6f 20 6f 75 72 20 6c 65 66 74  ECTs to our left
18180 20 69 6e 74 6f 20 74 65 6d 70 6f 72 61 72 79 20   into temporary 
18190 74 61 62 6c 65 20 22 74 61 62 31 22 2e 0a 20 20  table "tab1"..  
181a0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
181b0 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65   sqlite3SelectDe
181c0 73 74 49 6e 69 74 28 26 69 6e 74 65 72 73 65 63  stInit(&intersec
181d0 74 64 65 73 74 2c 20 53 52 54 5f 55 6e 69 6f 6e  tdest, SRT_Union
181e0 2c 20 74 61 62 31 29 3b 0a 20 20 20 20 20 20 20  , tab1);.       
181f0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53 65 6c   rc = sqlite3Sel
18200 65 63 74 28 70 50 61 72 73 65 2c 20 70 50 72 69  ect(pParse, pPri
18210 6f 72 2c 20 26 69 6e 74 65 72 73 65 63 74 64 65  or, &intersectde
18220 73 74 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  st);.        if(
18230 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20   rc ){.         
18240 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65   goto multi_sele
18250 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 20 20  ct_end;.        
18260 7d 0a 20 20 0a 20 20 20 20 20 20 20 20 2f 2a 20  }.  .        /* 
18270 43 6f 64 65 20 74 68 65 20 63 75 72 72 65 6e 74  Code the current
18280 20 53 45 4c 45 43 54 20 69 6e 74 6f 20 74 65 6d   SELECT into tem
18290 70 6f 72 61 72 79 20 74 61 62 6c 65 20 22 74 61  porary table "ta
182a0 62 32 22 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  b2".        */. 
182b0 20 20 20 20 20 20 20 61 64 64 72 20 3d 20 73 71         addr = sq
182c0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
182d0 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65  v, OP_OpenEpheme
182e0 72 61 6c 2c 20 74 61 62 32 2c 20 30 29 3b 0a 20  ral, tab2, 0);. 
182f0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
18300 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 31  ->addrOpenEphm[1
18310 5d 20 3d 3d 20 2d 31 20 29 3b 0a 20 20 20 20 20  ] == -1 );.     
18320 20 20 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70     p->addrOpenEp
18330 68 6d 5b 31 5d 20 3d 20 61 64 64 72 3b 0a 20 20  hm[1] = addr;.  
18340 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20        p->pPrior 
18350 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70 4c 69  = 0;.        pLi
18360 6d 69 74 20 3d 20 70 2d 3e 70 4c 69 6d 69 74 3b  mit = p->pLimit;
18370 0a 20 20 20 20 20 20 20 20 70 2d 3e 70 4c 69 6d  .        p->pLim
18380 69 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  it = 0;.        
18390 69 6e 74 65 72 73 65 63 74 64 65 73 74 2e 69 53  intersectdest.iS
183a0 44 50 61 72 6d 20 3d 20 74 61 62 32 3b 0a 20 20  DParm = tab2;.  
183b0 20 20 20 20 20 20 45 78 70 6c 61 69 6e 51 75 65        ExplainQue
183c0 72 79 50 6c 61 6e 28 28 70 50 61 72 73 65 2c 20  ryPlan((pParse, 
183d0 31 2c 20 22 25 73 20 55 53 49 4e 47 20 54 45 4d  1, "%s USING TEM
183e0 50 20 42 2d 54 52 45 45 22 2c 0a 20 20 20 20 20  P B-TREE",.     
183f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18400 20 20 20 20 20 73 65 6c 65 63 74 4f 70 4e 61 6d       selectOpNam
18410 65 28 70 2d 3e 6f 70 29 29 29 3b 0a 20 20 20 20  e(p->op)));.    
18420 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
18430 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70  Select(pParse, p
18440 2c 20 26 69 6e 74 65 72 73 65 63 74 64 65 73 74  , &intersectdest
18450 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63  );.        testc
18460 61 73 65 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ase( rc!=SQLITE_
18470 4f 4b 20 29 3b 0a 20 20 20 20 20 20 20 20 70 44  OK );.        pD
18480 65 6c 65 74 65 20 3d 20 70 2d 3e 70 50 72 69 6f  elete = p->pPrio
18490 72 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 70 50  r;.        p->pP
184a0 72 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a 20  rior = pPrior;. 
184b0 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 6e 53         if( p->nS
184c0 65 6c 65 63 74 52 6f 77 3e 70 50 72 69 6f 72 2d  electRow>pPrior-
184d0 3e 6e 53 65 6c 65 63 74 52 6f 77 20 29 7b 0a 20  >nSelectRow ){. 
184e0 20 20 20 20 20 20 20 20 20 70 2d 3e 6e 53 65 6c           p->nSel
184f0 65 63 74 52 6f 77 20 3d 20 70 50 72 69 6f 72 2d  ectRow = pPrior-
18500 3e 6e 53 65 6c 65 63 74 52 6f 77 3b 0a 20 20 20  >nSelectRow;.   
18510 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73       }.        s
18520 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
18530 28 64 62 2c 20 70 2d 3e 70 4c 69 6d 69 74 29 3b  (db, p->pLimit);
18540 0a 20 20 20 20 20 20 20 20 70 2d 3e 70 4c 69 6d  .        p->pLim
18550 69 74 20 3d 20 70 4c 69 6d 69 74 3b 0a 20 20 0a  it = pLimit;.  .
18560 20 20 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72          /* Gener
18570 61 74 65 20 63 6f 64 65 20 74 6f 20 74 61 6b 65  ate code to take
18580 20 74 68 65 20 69 6e 74 65 72 73 65 63 74 69 6f   the intersectio
18590 6e 20 6f 66 20 74 68 65 20 74 77 6f 20 74 65 6d  n of the two tem
185a0 70 6f 72 61 72 79 0a 20 20 20 20 20 20 20 20 2a  porary.        *
185b0 2a 20 74 61 62 6c 65 73 2e 0a 20 20 20 20 20 20  * tables..      
185c0 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73    */.        ass
185d0 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 20 29  ert( p->pEList )
185e0 3b 0a 20 20 20 20 20 20 20 20 69 42 72 65 61 6b  ;.        iBreak
185f0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
18600 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20  keLabel(v);.    
18610 20 20 20 20 69 43 6f 6e 74 20 3d 20 73 71 6c 69      iCont = sqli
18620 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
18630 28 76 29 3b 0a 20 20 20 20 20 20 20 20 63 6f 6d  (v);.        com
18640 70 75 74 65 4c 69 6d 69 74 52 65 67 69 73 74 65  puteLimitRegiste
18650 72 73 28 70 50 61 72 73 65 2c 20 70 2c 20 69 42  rs(pParse, p, iB
18660 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 20 20 73  reak);.        s
18670 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
18680 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 74  (v, OP_Rewind, t
18690 61 62 31 2c 20 69 42 72 65 61 6b 29 3b 20 56 64  ab1, iBreak); Vd
186a0 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
186b0 20 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69         r1 = sqli
186c0 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50  te3GetTempReg(pP
186d0 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20 69  arse);.        i
186e0 53 74 61 72 74 20 3d 20 73 71 6c 69 74 65 33 56  Start = sqlite3V
186f0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
18700 52 6f 77 44 61 74 61 2c 20 74 61 62 31 2c 20 72  RowData, tab1, r
18710 31 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  1);.        sqli
18720 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74  te3VdbeAddOp4Int
18730 28 76 2c 20 4f 50 5f 4e 6f 74 46 6f 75 6e 64 2c  (v, OP_NotFound,
18740 20 74 61 62 32 2c 20 69 43 6f 6e 74 2c 20 72 31   tab2, iCont, r1
18750 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 56 64  , 0);.        Vd
18760 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
18770 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65         sqlite3Re
18780 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
18790 72 73 65 2c 20 72 31 29 3b 0a 20 20 20 20 20 20  rse, r1);.      
187a0 20 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f    selectInnerLoo
187b0 70 28 70 50 61 72 73 65 2c 20 70 2c 20 74 61 62  p(pParse, p, tab
187c0 31 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  1,.             
187d0 20 20 20 20 20 20 20 20 20 20 20 30 2c 20 30 2c             0, 0,
187e0 20 26 64 65 73 74 2c 20 69 43 6f 6e 74 2c 20 69   &dest, iCont, i
187f0 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 20 20  Break);.        
18800 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
18810 76 65 4c 61 62 65 6c 28 76 2c 20 69 43 6f 6e 74  veLabel(v, iCont
18820 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
18830 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
18840 4f 50 5f 4e 65 78 74 2c 20 74 61 62 31 2c 20 69  OP_Next, tab1, i
18850 53 74 61 72 74 29 3b 20 56 64 62 65 43 6f 76 65  Start); VdbeCove
18860 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20  rage(v);.       
18870 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
18880 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69 42 72 65  lveLabel(v, iBre
18890 61 6b 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  ak);.        sql
188a0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
188b0 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 74 61 62 32  , OP_Close, tab2
188c0 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71  , 0);.        sq
188d0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
188e0 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 74 61 62  v, OP_Close, tab
188f0 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 62  1, 0);.        b
18900 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
18910 20 20 7d 0a 20 20 0a 20 20 23 69 66 6e 64 65 66    }.  .  #ifndef
18920 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50   SQLITE_OMIT_EXP
18930 4c 41 49 4e 0a 20 20 20 20 69 66 28 20 70 2d 3e  LAIN.    if( p->
18940 70 4e 65 78 74 3d 3d 30 20 29 7b 0a 20 20 20 20  pNext==0 ){.    
18950 20 20 45 78 70 6c 61 69 6e 51 75 65 72 79 50 6c    ExplainQueryPl
18960 61 6e 50 6f 70 28 70 50 61 72 73 65 29 3b 0a 20  anPop(pParse);. 
18970 20 20 20 7d 0a 20 20 23 65 6e 64 69 66 0a 20 20     }.  #endif.  
18980 7d 0a 20 20 0a 20 20 2f 2a 20 43 6f 6d 70 75 74  }.  .  /* Comput
18990 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  e collating sequ
189a0 65 6e 63 65 73 20 75 73 65 64 20 62 79 20 0a 20  ences used by . 
189b0 20 2a 2a 20 74 65 6d 70 6f 72 61 72 79 20 74 61   ** temporary ta
189c0 62 6c 65 73 20 6e 65 65 64 65 64 20 74 6f 20 69  bles needed to i
189d0 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 63 6f 6d  mplement the com
189e0 70 6f 75 6e 64 20 73 65 6c 65 63 74 2e 0a 20 20  pound select..  
189f0 2a 2a 20 41 74 74 61 63 68 20 74 68 65 20 4b 65  ** Attach the Ke
18a00 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20  yInfo structure 
18a10 74 6f 20 61 6c 6c 20 74 65 6d 70 6f 72 61 72 79  to all temporary
18a20 20 74 61 62 6c 65 73 2e 0a 20 20 2a 2a 0a 20 20   tables..  **.  
18a30 2a 2a 20 54 68 69 73 20 73 65 63 74 69 6f 6e 20  ** This section 
18a40 69 73 20 72 75 6e 20 62 79 20 74 68 65 20 72 69  is run by the ri
18a50 67 68 74 2d 6d 6f 73 74 20 53 45 4c 45 43 54 20  ght-most SELECT 
18a60 73 74 61 74 65 6d 65 6e 74 20 6f 6e 6c 79 2e 0a  statement only..
18a70 20 20 2a 2a 20 53 45 4c 45 43 54 20 73 74 61 74    ** SELECT stat
18a80 65 6d 65 6e 74 73 20 74 6f 20 74 68 65 20 6c 65  ements to the le
18a90 66 74 20 61 6c 77 61 79 73 20 73 6b 69 70 20 74  ft always skip t
18aa0 68 69 73 20 70 61 72 74 2e 20 20 54 68 65 20 72  his part.  The r
18ab0 69 67 68 74 2d 6d 6f 73 74 0a 20 20 2a 2a 20 53  ight-most.  ** S
18ac0 45 4c 45 43 54 20 6d 69 67 68 74 20 61 6c 73 6f  ELECT might also
18ad0 20 73 6b 69 70 20 74 68 69 73 20 70 61 72 74 20   skip this part 
18ae0 69 66 20 69 74 20 68 61 73 20 6e 6f 20 4f 52 44  if it has no ORD
18af0 45 52 20 42 59 20 63 6c 61 75 73 65 20 61 6e 64  ER BY clause and
18b00 0a 20 20 2a 2a 20 6e 6f 20 74 65 6d 70 20 74 61  .  ** no temp ta
18b10 62 6c 65 73 20 61 72 65 20 72 65 71 75 69 72 65  bles are require
18b20 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d  d..  */.  if( p-
18b30 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 55  >selFlags & SF_U
18b40 73 65 73 45 70 68 65 6d 65 72 61 6c 20 29 7b 0a  sesEphemeral ){.
18b50 20 20 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20      int i;      
18b60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18b70 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
18b80 72 20 2a 2f 0a 20 20 20 20 4b 65 79 49 6e 66 6f  r */.    KeyInfo
18b90 20 2a 70 4b 65 79 49 6e 66 6f 3b 20 20 20 20 20   *pKeyInfo;     
18ba0 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 6c 61 74         /* Collat
18bb0 69 6e 67 20 73 65 71 75 65 6e 63 65 20 66 6f 72  ing sequence for
18bc0 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20   the result set 
18bd0 2a 2f 0a 20 20 20 20 53 65 6c 65 63 74 20 2a 70  */.    Select *p
18be0 4c 6f 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20  Loop;           
18bf0 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70       /* For loop
18c00 69 6e 67 20 74 68 72 6f 75 67 68 20 53 45 4c 45  ing through SELE
18c10 43 54 20 73 74 61 74 65 6d 65 6e 74 73 20 2a 2f  CT statements */
18c20 0a 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 2a 61  .    CollSeq **a
18c30 70 43 6f 6c 6c 3b 20 20 20 20 20 20 20 20 20 20  pColl;          
18c40 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e     /* For loopin
18c50 67 20 74 68 72 6f 75 67 68 20 70 4b 65 79 49 6e  g through pKeyIn
18c60 66 6f 2d 3e 61 43 6f 6c 6c 5b 5d 20 2a 2f 0a 20  fo->aColl[] */. 
18c70 20 20 20 69 6e 74 20 6e 43 6f 6c 3b 20 20 20 20     int nCol;    
18c80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18c90 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f   /* Number of co
18ca0 6c 75 6d 6e 73 20 69 6e 20 72 65 73 75 6c 74 20  lumns in result 
18cb0 73 65 74 20 2a 2f 0a 0a 20 20 20 20 61 73 73 65  set */..    asse
18cc0 72 74 28 20 70 2d 3e 70 4e 65 78 74 3d 3d 30 20  rt( p->pNext==0 
18cd0 29 3b 0a 20 20 20 20 6e 43 6f 6c 20 3d 20 70 2d  );.    nCol = p-
18ce0 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a  >pEList->nExpr;.
18cf0 20 20 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20 73      pKeyInfo = s
18d00 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 41 6c 6c  qlite3KeyInfoAll
18d10 6f 63 28 64 62 2c 20 6e 43 6f 6c 2c 20 31 29 3b  oc(db, nCol, 1);
18d20 0a 20 20 20 20 69 66 28 20 21 70 4b 65 79 49 6e  .    if( !pKeyIn
18d30 66 6f 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  fo ){.      rc =
18d40 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b   SQLITE_NOMEM_BK
18d50 50 54 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6d  PT;.      goto m
18d60 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b  ulti_select_end;
18d70 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69  .    }.    for(i
18d80 3d 30 2c 20 61 70 43 6f 6c 6c 3d 70 4b 65 79 49  =0, apColl=pKeyI
18d90 6e 66 6f 2d 3e 61 43 6f 6c 6c 3b 20 69 3c 6e 43  nfo->aColl; i<nC
18da0 6f 6c 3b 20 69 2b 2b 2c 20 61 70 43 6f 6c 6c 2b  ol; i++, apColl+
18db0 2b 29 7b 0a 20 20 20 20 20 20 2a 61 70 43 6f 6c  +){.      *apCol
18dc0 6c 20 3d 20 6d 75 6c 74 69 53 65 6c 65 63 74 43  l = multiSelectC
18dd0 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70  ollSeq(pParse, p
18de0 2c 20 69 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , i);.      if( 
18df0 30 3d 3d 2a 61 70 43 6f 6c 6c 20 29 7b 0a 20 20  0==*apColl ){.  
18e00 20 20 20 20 20 20 2a 61 70 43 6f 6c 6c 20 3d 20        *apColl = 
18e10 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20  db->pDfltColl;. 
18e20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
18e30 20 20 66 6f 72 28 70 4c 6f 6f 70 3d 70 3b 20 70    for(pLoop=p; p
18e40 4c 6f 6f 70 3b 20 70 4c 6f 6f 70 3d 70 4c 6f 6f  Loop; pLoop=pLoo
18e50 70 2d 3e 70 50 72 69 6f 72 29 7b 0a 20 20 20 20  p->pPrior){.    
18e60 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 32 3b 20    for(i=0; i<2; 
18e70 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  i++){.        in
18e80 74 20 61 64 64 72 20 3d 20 70 4c 6f 6f 70 2d 3e  t addr = pLoop->
18e90 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 69 5d 3b  addrOpenEphm[i];
18ea0 0a 20 20 20 20 20 20 20 20 69 66 28 20 61 64 64  .        if( add
18eb0 72 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  r<0 ){.         
18ec0 20 2f 2a 20 49 66 20 5b 30 5d 20 69 73 20 75 6e   /* If [0] is un
18ed0 75 73 65 64 20 74 68 65 6e 20 5b 31 5d 20 69 73  used then [1] is
18ee0 20 61 6c 73 6f 20 75 6e 75 73 65 64 2e 20 20 53   also unused.  S
18ef0 6f 20 77 65 20 63 61 6e 0a 20 20 20 20 20 20 20  o we can.       
18f00 20 20 20 2a 2a 20 61 6c 77 61 79 73 20 73 61 66     ** always saf
18f10 65 6c 79 20 61 62 6f 72 74 20 61 73 20 73 6f 6f  ely abort as soo
18f20 6e 20 61 73 20 74 68 65 20 66 69 72 73 74 20 75  n as the first u
18f30 6e 75 73 65 64 20 73 6c 6f 74 20 69 73 20 66 6f  nused slot is fo
18f40 75 6e 64 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  und */.         
18f50 20 61 73 73 65 72 74 28 20 70 4c 6f 6f 70 2d 3e   assert( pLoop->
18f60 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 31 5d 3c  addrOpenEphm[1]<
18f70 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62  0 );.          b
18f80 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  reak;.        }.
18f90 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
18fa0 64 62 65 43 68 61 6e 67 65 50 32 28 76 2c 20 61  dbeChangeP2(v, a
18fb0 64 64 72 2c 20 6e 43 6f 6c 29 3b 0a 20 20 20 20  ddr, nCol);.    
18fc0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
18fd0 68 61 6e 67 65 50 34 28 76 2c 20 61 64 64 72 2c  hangeP4(v, addr,
18fe0 20 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33 4b   (char*)sqlite3K
18ff0 65 79 49 6e 66 6f 52 65 66 28 70 4b 65 79 49 6e  eyInfoRef(pKeyIn
19000 66 6f 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20  fo),.           
19010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19020 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20   P4_KEYINFO);.  
19030 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 61 64 64        pLoop->add
19040 72 4f 70 65 6e 45 70 68 6d 5b 69 5d 20 3d 20 2d  rOpenEphm[i] = -
19050 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  1;.      }.    }
19060 0a 20 20 20 20 73 71 6c 69 74 65 33 4b 65 79 49  .    sqlite3KeyI
19070 6e 66 6f 55 6e 72 65 66 28 70 4b 65 79 49 6e 66  nfoUnref(pKeyInf
19080 6f 29 3b 0a 20 20 7d 0a 0a 6d 75 6c 74 69 5f 73  o);.  }..multi_s
19090 65 6c 65 63 74 5f 65 6e 64 3a 0a 20 20 70 44 65  elect_end:.  pDe
190a0 73 74 2d 3e 69 53 64 73 74 20 3d 20 64 65 73 74  st->iSdst = dest
190b0 2e 69 53 64 73 74 3b 0a 20 20 70 44 65 73 74 2d  .iSdst;.  pDest-
190c0 3e 6e 53 64 73 74 20 3d 20 64 65 73 74 2e 6e 53  >nSdst = dest.nS
190d0 64 73 74 3b 0a 20 20 73 71 6c 69 74 65 33 53 65  dst;.  sqlite3Se
190e0 6c 65 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70  lectDelete(db, p
190f0 44 65 6c 65 74 65 29 3b 0a 20 20 72 65 74 75 72  Delete);.  retur
19100 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  n rc;.}.#endif /
19110 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f  * SQLITE_OMIT_CO
19120 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 20 2a 2f  MPOUND_SELECT */
19130 0a 0a 2f 2a 0a 2a 2a 20 45 72 72 6f 72 20 6d 65  ../*.** Error me
19140 73 73 61 67 65 20 66 6f 72 20 77 68 65 6e 20 74  ssage for when t
19150 77 6f 20 6f 72 20 6d 6f 72 65 20 74 65 72 6d 73  wo or more terms
19160 20 6f 66 20 61 20 63 6f 6d 70 6f 75 6e 64 20 73   of a compound s
19170 65 6c 65 63 74 20 68 61 76 65 20 64 69 66 66 65  elect have diffe
19180 72 65 6e 74 0a 2a 2a 20 73 69 7a 65 20 72 65 73  rent.** size res
19190 75 6c 74 20 73 65 74 73 2e 0a 2a 2f 0a 76 6f 69  ult sets..*/.voi
191a0 64 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 57  d sqlite3SelectW
191b0 72 6f 6e 67 4e 75 6d 54 65 72 6d 73 45 72 72 6f  rongNumTermsErro
191c0 72 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  r(Parse *pParse,
191d0 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 69   Select *p){.  i
191e0 66 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26  f( p->selFlags &
191f0 20 53 46 5f 56 61 6c 75 65 73 20 29 7b 0a 20 20   SF_Values ){.  
19200 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
19210 67 28 70 50 61 72 73 65 2c 20 22 61 6c 6c 20 56  g(pParse, "all V
19220 41 4c 55 45 53 20 6d 75 73 74 20 68 61 76 65 20  ALUES must have 
19230 74 68 65 20 73 61 6d 65 20 6e 75 6d 62 65 72 20  the same number 
19240 6f 66 20 74 65 72 6d 73 22 29 3b 0a 20 20 7d 65  of terms");.  }e
19250 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  lse{.    sqlite3
19260 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
19270 20 22 53 45 4c 45 43 54 73 20 74 6f 20 74 68 65   "SELECTs to the
19280 20 6c 65 66 74 20 61 6e 64 20 72 69 67 68 74 20   left and right 
19290 6f 66 20 25 73 22 0a 20 20 20 20 20 20 22 20 64  of %s".      " d
192a0 6f 20 6e 6f 74 20 68 61 76 65 20 74 68 65 20 73  o not have the s
192b0 61 6d 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65  ame number of re
192c0 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 22 2c 20 73  sult columns", s
192d0 65 6c 65 63 74 4f 70 4e 61 6d 65 28 70 2d 3e 6f  electOpName(p->o
192e0 70 29 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  p));.  }.}../*.*
192f0 2a 20 43 6f 64 65 20 61 6e 20 6f 75 74 70 75 74  * Code an output
19300 20 73 75 62 72 6f 75 74 69 6e 65 20 66 6f 72 20   subroutine for 
19310 61 20 63 6f 72 6f 75 74 69 6e 65 20 69 6d 70 6c  a coroutine impl
19320 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 61 0a  ementation of a.
19330 2a 2a 20 53 45 4c 45 43 54 20 73 74 61 74 6d 65  ** SELECT statme
19340 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 61  nt..**.** The da
19350 74 61 20 74 6f 20 62 65 20 6f 75 74 70 75 74 20  ta to be output 
19360 69 73 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20  is contained in 
19370 70 49 6e 2d 3e 69 53 64 73 74 2e 20 20 54 68 65  pIn->iSdst.  The
19380 72 65 20 61 72 65 0a 2a 2a 20 70 49 6e 2d 3e 6e  re are.** pIn->n
19390 53 64 73 74 20 63 6f 6c 75 6d 6e 73 20 74 6f 20  Sdst columns to 
193a0 62 65 20 6f 75 74 70 75 74 2e 20 20 70 44 65 73  be output.  pDes
193b0 74 20 69 73 20 77 68 65 72 65 20 74 68 65 20 6f  t is where the o
193c0 75 74 70 75 74 20 73 68 6f 75 6c 64 0a 2a 2a 20  utput should.** 
193d0 62 65 20 73 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 72  be sent..**.** r
193e0 65 67 52 65 74 75 72 6e 20 69 73 20 74 68 65 20  egReturn is the 
193f0 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 72 65  number of the re
19400 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 74  gister holding t
19410 68 65 20 73 75 62 72 6f 75 74 69 6e 65 0a 2a 2a  he subroutine.**
19420 20 72 65 74 75 72 6e 20 61 64 64 72 65 73 73 2e   return address.
19430 0a 2a 2a 0a 2a 2a 20 49 66 20 72 65 67 50 72 65  .**.** If regPre
19440 76 3e 30 20 74 68 65 6e 20 69 74 20 69 73 20 74  v>0 then it is t
19450 68 65 20 66 69 72 73 74 20 72 65 67 69 73 74 65  he first registe
19460 72 20 69 6e 20 61 20 76 65 63 74 6f 72 20 74 68  r in a vector th
19470 61 74 0a 2a 2a 20 72 65 63 6f 72 64 73 20 74 68  at.** records th
19480 65 20 70 72 65 76 69 6f 75 73 20 6f 75 74 70 75  e previous outpu
19490 74 2e 20 20 6d 65 6d 5b 72 65 67 50 72 65 76 5d  t.  mem[regPrev]
194a0 20 69 73 20 61 20 66 6c 61 67 20 74 68 61 74 20   is a flag that 
194b0 69 73 20 66 61 6c 73 65 0a 2a 2a 20 69 66 20 74  is false.** if t
194c0 68 65 72 65 20 68 61 73 20 62 65 65 6e 20 6e 6f  here has been no
194d0 20 70 72 65 76 69 6f 75 73 20 6f 75 74 70 75 74   previous output
194e0 2e 20 20 49 66 20 72 65 67 50 72 65 76 3e 30 20  .  If regPrev>0 
194f0 74 68 65 6e 20 63 6f 64 65 20 69 73 0a 2a 2a 20  then code is.** 
19500 67 65 6e 65 72 61 74 65 64 20 74 6f 20 73 75 70  generated to sup
19510 70 72 65 73 73 20 64 75 70 6c 69 63 61 74 65 73  press duplicates
19520 2e 20 20 70 4b 65 79 49 6e 66 6f 20 69 73 20 75  .  pKeyInfo is u
19530 73 65 64 20 66 6f 72 20 63 6f 6d 70 61 72 69 6e  sed for comparin
19540 67 0a 2a 2a 20 6b 65 79 73 2e 0a 2a 2a 0a 2a 2a  g.** keys..**.**
19550 20 49 66 20 74 68 65 20 4c 49 4d 49 54 20 66 6f   If the LIMIT fo
19560 75 6e 64 20 69 6e 20 70 2d 3e 69 4c 69 6d 69 74  und in p->iLimit
19570 20 69 73 20 72 65 61 63 68 65 64 2c 20 6a 75 6d   is reached, jum
19580 70 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 74 6f  p immediately to
19590 0a 2a 2a 20 69 42 72 65 61 6b 2e 0a 2a 2f 0a 73  .** iBreak..*/.s
195a0 74 61 74 69 63 20 69 6e 74 20 67 65 6e 65 72 61  tatic int genera
195b0 74 65 4f 75 74 70 75 74 53 75 62 72 6f 75 74 69  teOutputSubrouti
195c0 6e 65 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  ne(.  Parse *pPa
195d0 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  rse,          /*
195e0 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
195f0 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c   */.  Select *p,
19600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
19610 20 54 68 65 20 53 45 4c 45 43 54 20 73 74 61 74   The SELECT stat
19620 65 6d 65 6e 74 20 2a 2f 0a 20 20 53 65 6c 65 63  ement */.  Selec
19630 74 44 65 73 74 20 2a 70 49 6e 2c 20 20 20 20 20  tDest *pIn,     
19640 20 20 20 2f 2a 20 43 6f 72 6f 75 74 69 6e 65 20     /* Coroutine 
19650 73 75 70 70 6c 79 69 6e 67 20 64 61 74 61 20 2a  supplying data *
19660 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 2a  /.  SelectDest *
19670 70 44 65 73 74 2c 20 20 20 20 20 20 2f 2a 20 57  pDest,      /* W
19680 68 65 72 65 20 74 6f 20 73 65 6e 64 20 74 68 65  here to send the
19690 20 64 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 72   data */.  int r
196a0 65 67 52 65 74 75 72 6e 2c 20 20 20 20 20 20 20  egReturn,       
196b0 20 20 20 2f 2a 20 54 68 65 20 72 65 74 75 72 6e     /* The return
196c0 20 61 64 64 72 65 73 73 20 72 65 67 69 73 74 65   address registe
196d0 72 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 50 72  r */.  int regPr
196e0 65 76 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  ev,            /
196f0 2a 20 50 72 65 76 69 6f 75 73 20 72 65 73 75 6c  * Previous resul
19700 74 20 72 65 67 69 73 74 65 72 2e 20 20 4e 6f 20  t register.  No 
19710 75 6e 69 71 75 65 6e 65 73 73 20 69 66 20 30 20  uniqueness if 0 
19720 2a 2f 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b  */.  KeyInfo *pK
19730 65 79 49 6e 66 6f 2c 20 20 20 20 20 20 2f 2a 20  eyInfo,      /* 
19740 46 6f 72 20 63 6f 6d 70 61 72 69 6e 67 20 77 69  For comparing wi
19750 74 68 20 70 72 65 76 69 6f 75 73 20 65 6e 74 72  th previous entr
19760 79 20 2a 2f 0a 20 20 69 6e 74 20 69 42 72 65 61  y */.  int iBrea
19770 6b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  k              /
19780 2a 20 4a 75 6d 70 20 68 65 72 65 20 69 66 20 77  * Jump here if w
19790 65 20 68 69 74 20 74 68 65 20 4c 49 4d 49 54 20  e hit the LIMIT 
197a0 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76 20  */.){.  Vdbe *v 
197b0 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
197c0 0a 20 20 69 6e 74 20 69 43 6f 6e 74 69 6e 75 65  .  int iContinue
197d0 3b 0a 20 20 69 6e 74 20 61 64 64 72 3b 0a 0a 20  ;.  int addr;.. 
197e0 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56   addr = sqlite3V
197f0 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
19800 29 3b 0a 20 20 69 43 6f 6e 74 69 6e 75 65 20 3d  );.  iContinue =
19810 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
19820 4c 61 62 65 6c 28 76 29 3b 0a 0a 20 20 2f 2a 20  Label(v);..  /* 
19830 53 75 70 70 72 65 73 73 20 64 75 70 6c 69 63 61  Suppress duplica
19840 74 65 73 20 66 6f 72 20 55 4e 49 4f 4e 2c 20 45  tes for UNION, E
19850 58 43 45 50 54 2c 20 61 6e 64 20 49 4e 54 45 52  XCEPT, and INTER
19860 53 45 43 54 20 0a 20 20 2a 2f 0a 20 20 69 66 28  SECT .  */.  if(
19870 20 72 65 67 50 72 65 76 20 29 7b 0a 20 20 20 20   regPrev ){.    
19880 69 6e 74 20 61 64 64 72 31 2c 20 61 64 64 72 32  int addr1, addr2
19890 3b 0a 20 20 20 20 61 64 64 72 31 20 3d 20 73 71  ;.    addr1 = sq
198a0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
198b0 76 2c 20 4f 50 5f 49 66 4e 6f 74 2c 20 72 65 67  v, OP_IfNot, reg
198c0 50 72 65 76 29 3b 20 56 64 62 65 43 6f 76 65 72  Prev); VdbeCover
198d0 61 67 65 28 76 29 3b 0a 20 20 20 20 61 64 64 72  age(v);.    addr
198e0 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  2 = sqlite3VdbeA
198f0 64 64 4f 70 34 28 76 2c 20 4f 50 5f 43 6f 6d 70  ddOp4(v, OP_Comp
19900 61 72 65 2c 20 70 49 6e 2d 3e 69 53 64 73 74 2c  are, pIn->iSdst,
19910 20 72 65 67 50 72 65 76 2b 31 2c 20 70 49 6e 2d   regPrev+1, pIn-
19920 3e 6e 53 64 73 74 2c 0a 20 20 20 20 20 20 20 20  >nSdst,.        
19930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19940 20 20 20 20 20 20 28 63 68 61 72 2a 29 73 71 6c        (char*)sql
19950 69 74 65 33 4b 65 79 49 6e 66 6f 52 65 66 28 70  ite3KeyInfoRef(p
19960 4b 65 79 49 6e 66 6f 29 2c 20 50 34 5f 4b 45 59  KeyInfo), P4_KEY
19970 49 4e 46 4f 29 3b 0a 20 20 20 20 73 71 6c 69 74  INFO);.    sqlit
19980 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
19990 4f 50 5f 4a 75 6d 70 2c 20 61 64 64 72 32 2b 32  OP_Jump, addr2+2
199a0 2c 20 69 43 6f 6e 74 69 6e 75 65 2c 20 61 64 64  , iContinue, add
199b0 72 32 2b 32 29 3b 20 56 64 62 65 43 6f 76 65 72  r2+2); VdbeCover
199c0 61 67 65 28 76 29 3b 0a 20 20 20 20 73 71 6c 69  age(v);.    sqli
199d0 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
199e0 76 2c 20 61 64 64 72 31 29 3b 0a 20 20 20 20 73  v, addr1);.    s
199f0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
19a00 28 76 2c 20 4f 50 5f 43 6f 70 79 2c 20 70 49 6e  (v, OP_Copy, pIn
19a10 2d 3e 69 53 64 73 74 2c 20 72 65 67 50 72 65 76  ->iSdst, regPrev
19a20 2b 31 2c 20 70 49 6e 2d 3e 6e 53 64 73 74 2d 31  +1, pIn->nSdst-1
19a30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
19a40 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
19a50 6e 74 65 67 65 72 2c 20 31 2c 20 72 65 67 50 72  nteger, 1, regPr
19a60 65 76 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  ev);.  }.  if( p
19a70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  Parse->db->mallo
19a80 63 46 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e  cFailed ) return
19a90 20 30 3b 0a 0a 20 20 2f 2a 20 53 75 70 70 72 65   0;..  /* Suppre
19aa0 73 73 20 74 68 65 20 66 69 72 73 74 20 4f 46 46  ss the first OFF
19ab0 53 45 54 20 65 6e 74 72 69 65 73 20 69 66 20 74  SET entries if t
19ac0 68 65 72 65 20 69 73 20 61 6e 20 4f 46 46 53 45  here is an OFFSE
19ad0 54 20 63 6c 61 75 73 65 0a 20 20 2a 2f 0a 20 20  T clause.  */.  
19ae0 63 6f 64 65 4f 66 66 73 65 74 28 76 2c 20 70 2d  codeOffset(v, p-
19af0 3e 69 4f 66 66 73 65 74 2c 20 69 43 6f 6e 74 69  >iOffset, iConti
19b00 6e 75 65 29 3b 0a 0a 20 20 61 73 73 65 72 74 28  nue);..  assert(
19b10 20 70 44 65 73 74 2d 3e 65 44 65 73 74 21 3d 53   pDest->eDest!=S
19b20 52 54 5f 45 78 69 73 74 73 20 29 3b 0a 20 20 61  RT_Exists );.  a
19b30 73 73 65 72 74 28 20 70 44 65 73 74 2d 3e 65 44  ssert( pDest->eD
19b40 65 73 74 21 3d 53 52 54 5f 54 61 62 6c 65 20 29  est!=SRT_Table )
19b50 3b 0a 20 20 73 77 69 74 63 68 28 20 70 44 65 73  ;.  switch( pDes
19b60 74 2d 3e 65 44 65 73 74 20 29 7b 0a 20 20 20 20  t->eDest ){.    
19b70 2f 2a 20 53 74 6f 72 65 20 74 68 65 20 72 65 73  /* Store the res
19b80 75 6c 74 20 61 73 20 64 61 74 61 20 75 73 69 6e  ult as data usin
19b90 67 20 61 20 75 6e 69 71 75 65 20 6b 65 79 2e 0a  g a unique key..
19ba0 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20      */.    case 
19bb0 53 52 54 5f 45 70 68 65 6d 54 61 62 3a 20 7b 0a  SRT_EphemTab: {.
19bc0 20 20 20 20 20 20 69 6e 74 20 72 31 20 3d 20 73        int r1 = s
19bd0 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67  qlite3GetTempReg
19be0 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
19bf0 69 6e 74 20 72 32 20 3d 20 73 71 6c 69 74 65 33  int r2 = sqlite3
19c00 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73  GetTempReg(pPars
19c10 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  e);.      sqlite
19c20 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
19c30 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 70 49  P_MakeRecord, pI
19c40 6e 2d 3e 69 53 64 73 74 2c 20 70 49 6e 2d 3e 6e  n->iSdst, pIn->n
19c50 53 64 73 74 2c 20 72 31 29 3b 0a 20 20 20 20 20  Sdst, r1);.     
19c60 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
19c70 70 32 28 76 2c 20 4f 50 5f 4e 65 77 52 6f 77 69  p2(v, OP_NewRowi
19c80 64 2c 20 70 44 65 73 74 2d 3e 69 53 44 50 61 72  d, pDest->iSDPar
19c90 6d 2c 20 72 32 29 3b 0a 20 20 20 20 20 20 73 71  m, r2);.      sq
19ca0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
19cb0 76 2c 20 4f 50 5f 49 6e 73 65 72 74 2c 20 70 44  v, OP_Insert, pD
19cc0 65 73 74 2d 3e 69 53 44 50 61 72 6d 2c 20 72 31  est->iSDParm, r1
19cd0 2c 20 72 32 29 3b 0a 20 20 20 20 20 20 73 71 6c  , r2);.      sql
19ce0 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35  ite3VdbeChangeP5
19cf0 28 76 2c 20 4f 50 46 4c 41 47 5f 41 50 50 45 4e  (v, OPFLAG_APPEN
19d00 44 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  D);.      sqlite
19d10 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
19d20 70 50 61 72 73 65 2c 20 72 32 29 3b 0a 20 20 20  pParse, r2);.   
19d30 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
19d40 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
19d50 20 72 31 29 3b 0a 20 20 20 20 20 20 62 72 65 61   r1);.      brea
19d60 6b 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 6e 64 65  k;.    }..#ifnde
19d70 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  f SQLITE_OMIT_SU
19d80 42 51 55 45 52 59 0a 20 20 20 20 2f 2a 20 49 66  BQUERY.    /* If
19d90 20 77 65 20 61 72 65 20 63 72 65 61 74 69 6e 67   we are creating
19da0 20 61 20 73 65 74 20 66 6f 72 20 61 6e 20 22 65   a set for an "e
19db0 78 70 72 20 49 4e 20 28 53 45 4c 45 43 54 20 2e  xpr IN (SELECT .
19dc0 2e 2e 29 22 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ..)"..    */.   
19dd0 20 63 61 73 65 20 53 52 54 5f 53 65 74 3a 20 7b   case SRT_Set: {
19de0 0a 20 20 20 20 20 20 69 6e 74 20 72 31 3b 0a 20  .      int r1;. 
19df0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
19e00 49 6e 2d 3e 6e 53 64 73 74 3e 31 20 29 3b 0a 20  In->nSdst>1 );. 
19e10 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65       r1 = sqlite
19e20 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72  3GetTempReg(pPar
19e30 73 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  se);.      sqlit
19e40 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
19e50 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 70  OP_MakeRecord, p
19e60 49 6e 2d 3e 69 53 64 73 74 2c 20 70 49 6e 2d 3e  In->iSdst, pIn->
19e70 6e 53 64 73 74 2c 20 0a 20 20 20 20 20 20 20 20  nSdst, .        
19e80 20 20 72 31 2c 20 70 44 65 73 74 2d 3e 7a 41 66    r1, pDest->zAf
19e90 66 53 64 73 74 2c 20 70 49 6e 2d 3e 6e 53 64 73  fSdst, pIn->nSds
19ea0 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
19eb0 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76  3VdbeAddOp4Int(v
19ec0 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20  , OP_IdxInsert, 
19ed0 70 44 65 73 74 2d 3e 69 53 44 50 61 72 6d 2c 20  pDest->iSDParm, 
19ee0 72 31 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  r1,.            
19ef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
19f00 49 6e 2d 3e 69 53 64 73 74 2c 20 70 49 6e 2d 3e  In->iSdst, pIn->
19f10 6e 53 64 73 74 29 3b 0a 20 20 20 20 20 20 73 71  nSdst);.      sq
19f20 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
19f30 52 65 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b  Reg(pParse, r1);
19f40 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
19f50 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74    }..    /* If t
19f60 68 69 73 20 69 73 20 61 20 73 63 61 6c 61 72 20  his is a scalar 
19f70 73 65 6c 65 63 74 20 74 68 61 74 20 69 73 20 70  select that is p
19f80 61 72 74 20 6f 66 20 61 6e 20 65 78 70 72 65 73  art of an expres
19f90 73 69 6f 6e 2c 20 74 68 65 6e 0a 20 20 20 20 2a  sion, then.    *
19fa0 2a 20 73 74 6f 72 65 20 74 68 65 20 72 65 73 75  * store the resu
19fb0 6c 74 73 20 69 6e 20 74 68 65 20 61 70 70 72 6f  lts in the appro
19fc0 70 72 69 61 74 65 20 6d 65 6d 6f 72 79 20 63 65  priate memory ce
19fd0 6c 6c 20 61 6e 64 20 62 72 65 61 6b 20 6f 75 74  ll and break out
19fe0 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 73  .    ** of the s
19ff0 63 61 6e 20 6c 6f 6f 70 2e 0a 20 20 20 20 2a 2f  can loop..    */
1a000 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 4d 65  .    case SRT_Me
1a010 6d 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72  m: {.      asser
1a020 74 28 20 70 49 6e 2d 3e 6e 53 64 73 74 3d 3d 31  t( pIn->nSdst==1
1a030 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72 72   || pParse->nErr
1a040 3e 30 20 29 3b 20 20 74 65 73 74 63 61 73 65 28  >0 );  testcase(
1a050 20 70 49 6e 2d 3e 6e 53 64 73 74 21 3d 31 20 29   pIn->nSdst!=1 )
1a060 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
1a070 78 70 72 43 6f 64 65 4d 6f 76 65 28 70 50 61 72  xprCodeMove(pPar
1a080 73 65 2c 20 70 49 6e 2d 3e 69 53 64 73 74 2c 20  se, pIn->iSdst, 
1a090 70 44 65 73 74 2d 3e 69 53 44 50 61 72 6d 2c 20  pDest->iSDParm, 
1a0a0 31 29 3b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65  1);.      /* The
1a0b0 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 20 77 69   LIMIT clause wi
1a0c0 6c 6c 20 6a 75 6d 70 20 6f 75 74 20 6f 66 20 74  ll jump out of t
1a0d0 68 65 20 6c 6f 6f 70 20 66 6f 72 20 75 73 20 2a  he loop for us *
1a0e0 2f 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  /.      break;. 
1a0f0 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 23     }.#endif /* #
1a100 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1a110 49 54 5f 53 55 42 51 55 45 52 59 20 2a 2f 0a 0a  IT_SUBQUERY */..
1a120 20 20 20 20 2f 2a 20 54 68 65 20 72 65 73 75 6c      /* The resul
1a130 74 73 20 61 72 65 20 73 74 6f 72 65 64 20 69 6e  ts are stored in
1a140 20 61 20 73 65 71 75 65 6e 63 65 20 6f 66 20 72   a sequence of r
1a150 65 67 69 73 74 65 72 73 0a 20 20 20 20 2a 2a 20  egisters.    ** 
1a160 73 74 61 72 74 69 6e 67 20 61 74 20 70 44 65 73  starting at pDes
1a170 74 2d 3e 69 53 64 73 74 2e 20 20 54 68 65 6e 20  t->iSdst.  Then 
1a180 74 68 65 20 63 6f 2d 72 6f 75 74 69 6e 65 20 79  the co-routine y
1a190 69 65 6c 64 73 2e 0a 20 20 20 20 2a 2f 0a 20 20  ields..    */.  
1a1a0 20 20 63 61 73 65 20 53 52 54 5f 43 6f 72 6f 75    case SRT_Corou
1a1b0 74 69 6e 65 3a 20 7b 0a 20 20 20 20 20 20 69 66  tine: {.      if
1a1c0 28 20 70 44 65 73 74 2d 3e 69 53 64 73 74 3d 3d  ( pDest->iSdst==
1a1d0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44 65  0 ){.        pDe
1a1e0 73 74 2d 3e 69 53 64 73 74 20 3d 20 73 71 6c 69  st->iSdst = sqli
1a1f0 74 65 33 47 65 74 54 65 6d 70 52 61 6e 67 65 28  te3GetTempRange(
1a200 70 50 61 72 73 65 2c 20 70 49 6e 2d 3e 6e 53 64  pParse, pIn->nSd
1a210 73 74 29 3b 0a 20 20 20 20 20 20 20 20 70 44 65  st);.        pDe
1a220 73 74 2d 3e 6e 53 64 73 74 20 3d 20 70 49 6e 2d  st->nSdst = pIn-
1a230 3e 6e 53 64 73 74 3b 0a 20 20 20 20 20 20 7d 0a  >nSdst;.      }.
1a240 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
1a250 72 43 6f 64 65 4d 6f 76 65 28 70 50 61 72 73 65  rCodeMove(pParse
1a260 2c 20 70 49 6e 2d 3e 69 53 64 73 74 2c 20 70 44  , pIn->iSdst, pD
1a270 65 73 74 2d 3e 69 53 64 73 74 2c 20 70 49 6e 2d  est->iSdst, pIn-
1a280 3e 6e 53 64 73 74 29 3b 0a 20 20 20 20 20 20 73  >nSdst);.      s
1a290 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
1a2a0 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 70 44  (v, OP_Yield, pD
1a2b0 65 73 74 2d 3e 69 53 44 50 61 72 6d 29 3b 0a 20  est->iSDParm);. 
1a2c0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1a2d0 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 6e 6f 6e  }..    /* If non
1a2e0 65 20 6f 66 20 74 68 65 20 61 62 6f 76 65 2c 20  e of the above, 
1a2f0 74 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74 20  then the result 
1a300 64 65 73 74 69 6e 61 74 69 6f 6e 20 6d 75 73 74  destination must
1a310 20 62 65 0a 20 20 20 20 2a 2a 20 53 52 54 5f 4f   be.    ** SRT_O
1a320 75 74 70 75 74 2e 20 20 54 68 69 73 20 72 6f 75  utput.  This rou
1a330 74 69 6e 65 20 69 73 20 6e 65 76 65 72 20 63 61  tine is never ca
1a340 6c 6c 65 64 20 77 69 74 68 20 61 6e 79 20 6f 74  lled with any ot
1a350 68 65 72 0a 20 20 20 20 2a 2a 20 64 65 73 74 69  her.    ** desti
1a360 6e 61 74 69 6f 6e 20 6f 74 68 65 72 20 74 68 61  nation other tha
1a370 6e 20 74 68 65 20 6f 6e 65 73 20 68 61 6e 64 6c  n the ones handl
1a380 65 64 20 61 62 6f 76 65 20 6f 72 20 53 52 54 5f  ed above or SRT_
1a390 4f 75 74 70 75 74 2e 0a 20 20 20 20 2a 2a 0a 20  Output..    **. 
1a3a0 20 20 20 2a 2a 20 46 6f 72 20 53 52 54 5f 4f 75     ** For SRT_Ou
1a3b0 74 70 75 74 2c 20 72 65 73 75 6c 74 73 20 61 72  tput, results ar
1a3c0 65 20 73 74 6f 72 65 64 20 69 6e 20 61 20 73 65  e stored in a se
1a3d0 71 75 65 6e 63 65 20 6f 66 20 72 65 67 69 73 74  quence of regist
1a3e0 65 72 73 2e 20 20 0a 20 20 20 20 2a 2a 20 54 68  ers.  .    ** Th
1a3f0 65 6e 20 74 68 65 20 4f 50 5f 52 65 73 75 6c 74  en the OP_Result
1a400 52 6f 77 20 6f 70 63 6f 64 65 20 69 73 20 75 73  Row opcode is us
1a410 65 64 20 74 6f 20 63 61 75 73 65 20 73 71 6c 69  ed to cause sqli
1a420 74 65 33 5f 73 74 65 70 28 29 20 74 6f 0a 20 20  te3_step() to.  
1a430 20 20 2a 2a 20 72 65 74 75 72 6e 20 74 68 65 20    ** return the 
1a440 6e 65 78 74 20 72 6f 77 20 6f 66 20 72 65 73 75  next row of resu
1a450 6c 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64  lt..    */.    d
1a460 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20  efault: {.      
1a470 61 73 73 65 72 74 28 20 70 44 65 73 74 2d 3e 65  assert( pDest->e
1a480 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74  Dest==SRT_Output
1a490 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
1a4a0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
1a4b0 50 5f 52 65 73 75 6c 74 52 6f 77 2c 20 70 49 6e  P_ResultRow, pIn
1a4c0 2d 3e 69 53 64 73 74 2c 20 70 49 6e 2d 3e 6e 53  ->iSdst, pIn->nS
1a4d0 64 73 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61  dst);.      brea
1a4e0 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  k;.    }.  }..  
1a4f0 2f 2a 20 4a 75 6d 70 20 74 6f 20 74 68 65 20 65  /* Jump to the e
1a500 6e 64 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 69  nd of the loop i
1a510 66 20 74 68 65 20 4c 49 4d 49 54 20 69 73 20 72  f the LIMIT is r
1a520 65 61 63 68 65 64 2e 0a 20 20 2a 2f 0a 20 20 69  eached..  */.  i
1a530 66 28 20 70 2d 3e 69 4c 69 6d 69 74 20 29 7b 0a  f( p->iLimit ){.
1a540 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1a550 64 64 4f 70 32 28 76 2c 20 4f 50 5f 44 65 63 72  ddOp2(v, OP_Decr
1a560 4a 75 6d 70 5a 65 72 6f 2c 20 70 2d 3e 69 4c 69  JumpZero, p->iLi
1a570 6d 69 74 2c 20 69 42 72 65 61 6b 29 3b 20 56 64  mit, iBreak); Vd
1a580 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
1a590 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74   }..  /* Generat
1a5a0 65 20 74 68 65 20 73 75 62 72 6f 75 74 69 6e 65  e the subroutine
1a5b0 20 72 65 74 75 72 6e 0a 20 20 2a 2f 0a 20 20 73   return.  */.  s
1a5c0 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
1a5d0 65 4c 61 62 65 6c 28 76 2c 20 69 43 6f 6e 74 69  eLabel(v, iConti
1a5e0 6e 75 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  nue);.  sqlite3V
1a5f0 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
1a600 52 65 74 75 72 6e 2c 20 72 65 67 52 65 74 75 72  Return, regRetur
1a610 6e 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 61 64  n);..  return ad
1a620 64 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 74  dr;.}../*.** Alt
1a630 65 72 6e 61 74 69 76 65 20 63 6f 6d 70 6f 75 6e  ernative compoun
1a640 64 20 73 65 6c 65 63 74 20 63 6f 64 65 20 67 65  d select code ge
1a650 6e 65 72 61 74 6f 72 20 66 6f 72 20 63 61 73 65  nerator for case
1a660 73 20 77 68 65 6e 20 74 68 65 72 65 0a 2a 2a 20  s when there.** 
1a670 69 73 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63  is an ORDER BY c
1a680 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 57 65 20  lause..**.** We 
1a690 61 73 73 75 6d 65 20 61 20 71 75 65 72 79 20 6f  assume a query o
1a6a0 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
1a6b0 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  form:.**.**     
1a6c0 20 3c 73 65 6c 65 63 74 41 3e 20 20 3c 6f 70 65   <selectA>  <ope
1a6d0 72 61 74 6f 72 3e 20 20 3c 73 65 6c 65 63 74 42  rator>  <selectB
1a6e0 3e 20 20 4f 52 44 45 52 20 42 59 20 3c 6f 72 64  >  ORDER BY <ord
1a6f0 65 72 62 79 6c 69 73 74 3e 0a 2a 2a 0a 2a 2a 20  erbylist>.**.** 
1a700 3c 6f 70 65 72 61 74 6f 72 3e 20 69 73 20 6f 6e  <operator> is on
1a710 65 20 6f 66 20 55 4e 49 4f 4e 20 41 4c 4c 2c 20  e of UNION ALL, 
1a720 55 4e 49 4f 4e 2c 20 45 58 43 45 50 54 2c 20 6f  UNION, EXCEPT, o
1a730 72 20 49 4e 54 45 52 53 45 43 54 2e 20 20 54 68  r INTERSECT.  Th
1a740 65 20 69 64 65 61 0a 2a 2a 20 69 73 20 74 6f 20  e idea.** is to 
1a750 63 6f 64 65 20 62 6f 74 68 20 3c 73 65 6c 65 63  code both <selec
1a760 74 41 3e 20 61 6e 64 20 3c 73 65 6c 65 63 74 42  tA> and <selectB
1a770 3e 20 77 69 74 68 20 74 68 65 20 4f 52 44 45 52  > with the ORDER
1a780 20 42 59 20 63 6c 61 75 73 65 20 61 73 0a 2a 2a   BY clause as.**
1a790 20 63 6f 2d 72 6f 75 74 69 6e 65 73 2e 20 20 54   co-routines.  T
1a7a0 68 65 6e 20 72 75 6e 20 74 68 65 20 63 6f 2d 72  hen run the co-r
1a7b0 6f 75 74 69 6e 65 73 20 69 6e 20 70 61 72 61 6c  outines in paral
1a7c0 6c 65 6c 20 61 6e 64 20 6d 65 72 67 65 20 74 68  lel and merge th
1a7d0 65 20 72 65 73 75 6c 74 73 0a 2a 2a 20 69 6e 74  e results.** int
1a7e0 6f 20 74 68 65 20 6f 75 74 70 75 74 2e 20 20 49  o the output.  I
1a7f0 6e 20 61 64 64 69 74 69 6f 6e 20 74 6f 20 74 68  n addition to th
1a800 65 20 74 77 6f 20 63 6f 72 6f 75 74 69 6e 65 73  e two coroutines
1a810 20 28 63 61 6c 6c 65 64 20 73 65 6c 65 63 74 41   (called selectA
1a820 20 61 6e 64 0a 2a 2a 20 73 65 6c 65 63 74 42 29   and.** selectB)
1a830 20 74 68 65 72 65 20 61 72 65 20 37 20 73 75 62   there are 7 sub
1a840 72 6f 75 74 69 6e 65 73 3a 0a 2a 2a 0a 2a 2a 20  routines:.**.** 
1a850 20 20 20 6f 75 74 41 3a 20 20 20 20 4d 6f 76 65     outA:    Move
1a860 20 74 68 65 20 6f 75 74 70 75 74 20 6f 66 20 74   the output of t
1a870 68 65 20 73 65 6c 65 63 74 41 20 63 6f 72 6f 75  he selectA corou
1a880 74 69 6e 65 20 69 6e 74 6f 20 74 68 65 20 6f 75  tine into the ou
1a890 74 70 75 74 0a 2a 2a 20 20 20 20 20 20 20 20 20  tput.**         
1a8a0 20 20 20 20 6f 66 20 74 68 65 20 63 6f 6d 70 6f      of the compo
1a8b0 75 6e 64 20 71 75 65 72 79 2e 0a 2a 2a 0a 2a 2a  und query..**.**
1a8c0 20 20 20 20 6f 75 74 42 3a 20 20 20 20 4d 6f 76      outB:    Mov
1a8d0 65 20 74 68 65 20 6f 75 74 70 75 74 20 6f 66 20  e the output of 
1a8e0 74 68 65 20 73 65 6c 65 63 74 42 20 63 6f 72 6f  the selectB coro
1a8f0 75 74 69 6e 65 20 69 6e 74 6f 20 74 68 65 20 6f  utine into the o
1a900 75 74 70 75 74 0a 2a 2a 20 20 20 20 20 20 20 20  utput.**        
1a910 20 20 20 20 20 6f 66 20 74 68 65 20 63 6f 6d 70       of the comp
1a920 6f 75 6e 64 20 71 75 65 72 79 2e 20 20 28 4f 6e  ound query.  (On
1a930 6c 79 20 67 65 6e 65 72 61 74 65 64 20 66 6f 72  ly generated for
1a940 20 55 4e 49 4f 4e 20 61 6e 64 0a 2a 2a 20 20 20   UNION and.**   
1a950 20 20 20 20 20 20 20 20 20 20 55 4e 49 4f 4e 20            UNION 
1a960 41 4c 4c 2e 20 20 45 58 43 45 50 54 20 61 6e 64  ALL.  EXCEPT and
1a970 20 49 4e 53 45 52 54 53 45 43 54 20 6e 65 76 65   INSERTSECT neve
1a980 72 20 6f 75 74 70 75 74 20 61 20 72 6f 77 20 74  r output a row t
1a990 68 61 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  hat.**          
1a9a0 20 20 20 61 70 70 65 61 72 73 20 6f 6e 6c 79 20     appears only 
1a9b0 69 6e 20 42 2e 29 0a 2a 2a 0a 2a 2a 20 20 20 20  in B.).**.**    
1a9c0 41 6c 74 42 3a 20 20 20 20 43 61 6c 6c 65 64 20  AltB:    Called 
1a9d0 77 68 65 6e 20 74 68 65 72 65 20 69 73 20 64 61  when there is da
1a9e0 74 61 20 66 72 6f 6d 20 62 6f 74 68 20 63 6f 72  ta from both cor
1a9f0 6f 75 74 69 6e 65 73 20 61 6e 64 20 41 3c 42 2e  outines and A<B.
1aa00 0a 2a 2a 0a 2a 2a 20 20 20 20 41 65 71 42 3a 20  .**.**    AeqB: 
1aa10 20 20 20 43 61 6c 6c 65 64 20 77 68 65 6e 20 74     Called when t
1aa20 68 65 72 65 20 69 73 20 64 61 74 61 20 66 72 6f  here is data fro
1aa30 6d 20 62 6f 74 68 20 63 6f 72 6f 75 74 69 6e 65  m both coroutine
1aa40 73 20 61 6e 64 20 41 3d 3d 42 2e 0a 2a 2a 0a 2a  s and A==B..**.*
1aa50 2a 20 20 20 20 41 67 74 42 3a 20 20 20 20 43 61  *    AgtB:    Ca
1aa60 6c 6c 65 64 20 77 68 65 6e 20 74 68 65 72 65 20  lled when there 
1aa70 69 73 20 64 61 74 61 20 66 72 6f 6d 20 62 6f 74  is data from bot
1aa80 68 20 63 6f 72 6f 75 74 69 6e 65 73 20 61 6e 64  h coroutines and
1aa90 20 41 3e 42 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 45   A>B..**.**    E
1aaa0 6f 66 41 3a 20 20 20 20 43 61 6c 6c 65 64 20 77  ofA:    Called w
1aab0 68 65 6e 20 64 61 74 61 20 69 73 20 65 78 68 61  hen data is exha
1aac0 75 73 74 65 64 20 66 72 6f 6d 20 73 65 6c 65 63  usted from selec
1aad0 74 41 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 45 6f 66  tA..**.**    Eof
1aae0 42 3a 20 20 20 20 43 61 6c 6c 65 64 20 77 68 65  B:    Called whe
1aaf0 6e 20 64 61 74 61 20 69 73 20 65 78 68 61 75 73  n data is exhaus
1ab00 74 65 64 20 66 72 6f 6d 20 73 65 6c 65 63 74 42  ted from selectB
1ab10 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 6d 70 6c  ..**.** The impl
1ab20 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68  ementation of th
1ab30 65 20 6c 61 74 74 65 72 20 66 69 76 65 20 73 75  e latter five su
1ab40 62 72 6f 75 74 69 6e 65 73 20 64 65 70 65 6e 64  broutines depend
1ab50 20 6f 6e 20 77 68 69 63 68 20 0a 2a 2a 20 3c 6f   on which .** <o
1ab60 70 65 72 61 74 6f 72 3e 20 69 73 20 75 73 65 64  perator> is used
1ab70 3a 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  :.**.**.**      
1ab80 20 20 20 20 20 20 20 55 4e 49 4f 4e 20 41 4c 4c         UNION ALL
1ab90 20 20 20 20 20 20 20 20 20 55 4e 49 4f 4e 20 20           UNION  
1aba0 20 20 20 20 20 20 20 20 20 20 45 58 43 45 50 54            EXCEPT
1abb0 20 20 20 20 20 20 20 20 20 20 49 4e 54 45 52 53            INTERS
1abc0 45 43 54 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ECT.**          
1abd0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 2d  -------------  -
1abe0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1abf0 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d    --------------
1ac00 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d    --------------
1ac10 2d 2d 2d 0a 2a 2a 20 20 20 41 6c 74 42 3a 20 20  ---.**   AltB:  
1ac20 20 6f 75 74 41 2c 20 6e 65 78 74 41 20 20 20 20   outA, nextA    
1ac30 20 20 6f 75 74 41 2c 20 6e 65 78 74 41 20 20 20    outA, nextA   
1ac40 20 20 20 20 6f 75 74 41 2c 20 6e 65 78 74 41 20      outA, nextA 
1ac50 20 20 20 20 20 20 20 20 6e 65 78 74 41 0a 2a 2a          nextA.**
1ac60 0a 2a 2a 20 20 20 41 65 71 42 3a 20 20 20 6f 75  .**   AeqB:   ou
1ac70 74 41 2c 20 6e 65 78 74 41 20 20 20 20 20 20 20  tA, nextA       
1ac80 20 20 6e 65 78 74 41 20 20 20 20 20 20 20 20 20    nextA         
1ac90 20 20 20 20 6e 65 78 74 41 20 20 20 20 20 20 20      nextA       
1aca0 20 20 6f 75 74 41 2c 20 6e 65 78 74 41 0a 2a 2a    outA, nextA.**
1acb0 0a 2a 2a 20 20 20 41 67 74 42 3a 20 20 20 6f 75  .**   AgtB:   ou
1acc0 74 42 2c 20 6e 65 78 74 42 20 20 20 20 20 20 6f  tB, nextB      o
1acd0 75 74 42 2c 20 6e 65 78 74 42 20 20 20 20 20 20  utB, nextB      
1ace0 20 20 20 20 6e 65 78 74 42 20 20 20 20 20 20 20      nextB       
1acf0 20 20 20 20 20 6e 65 78 74 42 0a 2a 2a 0a 2a 2a       nextB.**.**
1ad00 20 20 20 45 6f 66 41 3a 20 20 20 6f 75 74 42 2c     EofA:   outB,
1ad10 20 6e 65 78 74 42 20 20 20 20 20 20 6f 75 74 42   nextB      outB
1ad20 2c 20 6e 65 78 74 42 20 20 20 20 20 20 20 20 20  , nextB         
1ad30 20 68 61 6c 74 20 20 20 20 20 20 20 20 20 20 20   halt           
1ad40 20 20 68 61 6c 74 0a 2a 2a 0a 2a 2a 20 20 20 45    halt.**.**   E
1ad50 6f 66 42 3a 20 20 20 6f 75 74 41 2c 20 6e 65 78  ofB:   outA, nex
1ad60 74 41 20 20 20 20 20 20 6f 75 74 41 2c 20 6e 65  tA      outA, ne
1ad70 78 74 41 20 20 20 20 20 20 20 6f 75 74 41 2c 20  xtA       outA, 
1ad80 6e 65 78 74 41 20 20 20 20 20 20 20 20 20 68 61  nextA         ha
1ad90 6c 74 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 65 20  lt.**.** In the 
1ada0 41 6c 74 42 2c 20 41 65 71 42 2c 20 61 6e 64 20  AltB, AeqB, and 
1adb0 41 67 74 42 20 73 75 62 72 6f 75 74 69 6e 65 73  AgtB subroutines
1adc0 2c 20 61 6e 20 45 4f 46 20 6f 6e 20 41 20 66 6f  , an EOF on A fo
1add0 6c 6c 6f 77 69 6e 67 20 6e 65 78 74 41 0a 2a 2a  llowing nextA.**
1ade0 20 63 61 75 73 65 73 20 61 6e 20 69 6d 6d 65 64   causes an immed
1adf0 69 61 74 65 20 6a 75 6d 70 20 74 6f 20 45 6f 66  iate jump to Eof
1ae00 41 20 61 6e 64 20 61 6e 20 45 4f 46 20 6f 6e 20  A and an EOF on 
1ae10 42 20 66 6f 6c 6c 6f 77 69 6e 67 20 6e 65 78 74  B following next
1ae20 42 20 63 61 75 73 65 73 0a 2a 2a 20 61 6e 20 69  B causes.** an i
1ae30 6d 6d 65 64 69 61 74 65 20 6a 75 6d 70 20 74 6f  mmediate jump to
1ae40 20 45 6f 66 42 2e 20 20 57 69 74 68 69 6e 20 45   EofB.  Within E
1ae50 6f 66 41 20 61 6e 64 20 45 6f 66 42 2c 20 61 6e  ofA and EofB, an
1ae60 64 20 45 4f 46 20 6f 6e 20 65 6e 74 72 79 20 6f  d EOF on entry o
1ae70 72 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 6e  r.** following n
1ae80 65 78 74 58 20 63 61 75 73 65 73 20 61 20 6a 75  extX causes a ju
1ae90 6d 70 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66  mp to the end of
1aea0 20 74 68 65 20 73 65 6c 65 63 74 20 70 72 6f 63   the select proc
1aeb0 65 73 73 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 44 75  essing..**.** Du
1aec0 70 6c 69 63 61 74 65 20 72 65 6d 6f 76 61 6c 20  plicate removal 
1aed0 69 6e 20 74 68 65 20 55 4e 49 4f 4e 2c 20 45 58  in the UNION, EX
1aee0 43 45 50 54 2c 20 61 6e 64 20 49 4e 54 45 52 53  CEPT, and INTERS
1aef0 45 43 54 20 63 61 73 65 73 20 69 73 20 68 61 6e  ECT cases is han
1af00 64 6c 65 64 0a 2a 2a 20 77 69 74 68 69 6e 20 74  dled.** within t
1af10 68 65 20 6f 75 74 70 75 74 20 73 75 62 72 6f 75  he output subrou
1af20 74 69 6e 65 2e 20 20 54 68 65 20 72 65 67 50 72  tine.  The regPr
1af30 65 76 20 72 65 67 69 73 74 65 72 20 73 65 74 20  ev register set 
1af40 68 6f 6c 64 73 20 74 68 65 20 70 72 65 76 69 6f  holds the previo
1af50 75 73 6c 79 0a 2a 2a 20 6f 75 74 70 75 74 20 76  usly.** output v
1af60 61 6c 75 65 2e 20 20 41 20 63 6f 6d 70 61 72 69  alue.  A compari
1af70 73 6f 6e 20 69 73 20 6d 61 64 65 20 61 67 61 69  son is made agai
1af80 6e 73 74 20 74 68 69 73 20 76 61 6c 75 65 20 61  nst this value a
1af90 6e 64 20 74 68 65 20 6f 75 74 70 75 74 0a 2a 2a  nd the output.**
1afa0 20 69 73 20 73 6b 69 70 70 65 64 20 69 66 20 74   is skipped if t
1afb0 68 65 20 6e 65 78 74 20 72 65 73 75 6c 74 73 20  he next results 
1afc0 77 6f 75 6c 64 20 62 65 20 74 68 65 20 73 61 6d  would be the sam
1afd0 65 20 61 73 20 74 68 65 20 70 72 65 76 69 6f 75  e as the previou
1afe0 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 6d 70  s..**.** The imp
1aff0 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 70 6c 61 6e  lementation plan
1b000 20 69 73 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74   is to implement
1b010 20 74 68 65 20 74 77 6f 20 63 6f 72 6f 75 74 69   the two corouti
1b020 6e 65 73 20 61 6e 64 20 73 65 76 65 6e 0a 2a 2a  nes and seven.**
1b030 20 73 75 62 72 6f 75 74 69 6e 65 73 20 66 69 72   subroutines fir
1b040 73 74 2c 20 74 68 65 6e 20 70 75 74 20 74 68 65  st, then put the
1b050 20 63 6f 6e 74 72 6f 6c 20 6c 6f 67 69 63 20 61   control logic a
1b060 74 20 74 68 65 20 62 6f 74 74 6f 6d 2e 20 20 4c  t the bottom.  L
1b070 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20  ike this:.**.** 
1b080 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 49 6e           goto In
1b090 69 74 0a 2a 2a 20 20 20 20 20 63 6f 41 3a 20 63  it.**     coA: c
1b0a0 6f 72 6f 75 74 69 6e 65 20 66 6f 72 20 6c 65 66  oroutine for lef
1b0b0 74 20 71 75 65 72 79 20 28 41 29 0a 2a 2a 20 20  t query (A).**  
1b0c0 20 20 20 63 6f 42 3a 20 63 6f 72 6f 75 74 69 6e     coB: coroutin
1b0d0 65 20 66 6f 72 20 72 69 67 68 74 20 71 75 65 72  e for right quer
1b0e0 79 20 28 42 29 0a 2a 2a 20 20 20 20 6f 75 74 41  y (B).**    outA
1b0f0 3a 20 6f 75 74 70 75 74 20 6f 6e 65 20 72 6f 77  : output one row
1b100 20 6f 66 20 41 0a 2a 2a 20 20 20 20 6f 75 74 42   of A.**    outB
1b110 3a 20 6f 75 74 70 75 74 20 6f 6e 65 20 72 6f 77  : output one row
1b120 20 6f 66 20 42 20 28 55 4e 49 4f 4e 20 61 6e 64   of B (UNION and
1b130 20 55 4e 49 4f 4e 20 41 4c 4c 20 6f 6e 6c 79 29   UNION ALL only)
1b140 0a 2a 2a 20 20 20 20 45 6f 66 41 3a 20 2e 2e 2e  .**    EofA: ...
1b150 0a 2a 2a 20 20 20 20 45 6f 66 42 3a 20 2e 2e 2e  .**    EofB: ...
1b160 0a 2a 2a 20 20 20 20 41 6c 74 42 3a 20 2e 2e 2e  .**    AltB: ...
1b170 0a 2a 2a 20 20 20 20 41 65 71 42 3a 20 2e 2e 2e  .**    AeqB: ...
1b180 0a 2a 2a 20 20 20 20 41 67 74 42 3a 20 2e 2e 2e  .**    AgtB: ...
1b190 0a 2a 2a 20 20 20 20 49 6e 69 74 3a 20 69 6e 69  .**    Init: ini
1b1a0 74 69 61 6c 69 7a 65 20 63 6f 72 6f 75 74 69 6e  tialize coroutin
1b1b0 65 20 72 65 67 69 73 74 65 72 73 0a 2a 2a 20 20  e registers.**  
1b1c0 20 20 20 20 20 20 20 20 79 69 65 6c 64 20 63 6f          yield co
1b1d0 41 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 69 66  A.**          if
1b1e0 20 65 6f 66 28 41 29 20 67 6f 74 6f 20 45 6f 66   eof(A) goto Eof
1b1f0 41 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 79 69  A.**          yi
1b200 65 6c 64 20 63 6f 42 0a 2a 2a 20 20 20 20 20 20  eld coB.**      
1b210 20 20 20 20 69 66 20 65 6f 66 28 42 29 20 67 6f      if eof(B) go
1b220 74 6f 20 45 6f 66 42 0a 2a 2a 20 20 20 20 43 6d  to EofB.**    Cm
1b230 70 72 3a 20 43 6f 6d 70 61 72 65 20 41 2c 20 42  pr: Compare A, B
1b240 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 4a 75 6d  .**          Jum
1b250 70 20 41 6c 74 42 2c 20 41 65 71 42 2c 20 41 67  p AltB, AeqB, Ag
1b260 74 42 0a 2a 2a 20 20 20 20 20 45 6e 64 3a 20 2e  tB.**     End: .
1b270 2e 2e 0a 2a 2a 0a 2a 2a 20 57 65 20 63 61 6c 6c  ...**.** We call
1b280 20 41 6c 74 42 2c 20 41 65 71 42 2c 20 41 67 74   AltB, AeqB, Agt
1b290 42 2c 20 45 6f 66 41 2c 20 61 6e 64 20 45 6f 66  B, EofA, and Eof
1b2a0 42 20 22 73 75 62 72 6f 75 74 69 6e 65 73 22 20  B "subroutines" 
1b2b0 62 75 74 20 74 68 65 79 20 61 72 65 20 6e 6f 74  but they are not
1b2c0 0a 2a 2a 20 61 63 74 75 61 6c 6c 79 20 63 61 6c  .** actually cal
1b2d0 6c 65 64 20 75 73 69 6e 67 20 47 6f 73 75 62 20  led using Gosub 
1b2e0 61 6e 64 20 74 68 65 79 20 64 6f 20 6e 6f 74 20  and they do not 
1b2f0 52 65 74 75 72 6e 2e 20 20 45 6f 66 41 20 61 6e  Return.  EofA an
1b300 64 20 45 6f 66 42 20 6c 6f 6f 70 0a 2a 2a 20 75  d EofB loop.** u
1b310 6e 74 69 6c 20 61 6c 6c 20 64 61 74 61 20 69 73  ntil all data is
1b320 20 65 78 68 61 75 73 74 65 64 20 74 68 65 6e 20   exhausted then 
1b330 6a 75 6d 70 20 74 6f 20 74 68 65 20 22 65 6e 64  jump to the "end
1b340 22 20 6c 61 62 65 2e 20 20 41 6c 74 42 2c 20 41  " labe.  AltB, A
1b350 65 71 42 2c 0a 2a 2a 20 61 6e 64 20 41 67 74 42  eqB,.** and AgtB
1b360 20 6a 75 6d 70 20 74 6f 20 65 69 74 68 65 72 20   jump to either 
1b370 4c 32 20 6f 72 20 74 6f 20 6f 6e 65 20 6f 66 20  L2 or to one of 
1b380 45 6f 66 41 20 6f 72 20 45 6f 66 42 2e 0a 2a 2f  EofA or EofB..*/
1b390 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1b3a0 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45  OMIT_COMPOUND_SE
1b3b0 4c 45 43 54 0a 73 74 61 74 69 63 20 69 6e 74 20  LECT.static int 
1b3c0 6d 75 6c 74 69 53 65 6c 65 63 74 4f 72 64 65 72  multiSelectOrder
1b3d0 42 79 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  By(.  Parse *pPa
1b3e0 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50  rse,        /* P
1b3f0 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
1b400 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20  /.  Select *p,  
1b410 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
1b420 20 72 69 67 68 74 2d 6d 6f 73 74 20 6f 66 20 53   right-most of S
1b430 45 4c 45 43 54 73 20 74 6f 20 62 65 20 63 6f 64  ELECTs to be cod
1b440 65 64 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65  ed */.  SelectDe
1b450 73 74 20 2a 70 44 65 73 74 20 20 20 20 20 2f 2a  st *pDest     /*
1b460 20 57 68 61 74 20 74 6f 20 64 6f 20 77 69 74 68   What to do with
1b470 20 71 75 65 72 79 20 72 65 73 75 6c 74 73 20 2a   query results *
1b480 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b  /.){.  int i, j;
1b490 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1b4a0 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f  Loop counters */
1b4b0 0a 20 20 53 65 6c 65 63 74 20 2a 70 50 72 69 6f  .  Select *pPrio
1b4c0 72 3b 20 20 20 20 20 20 20 2f 2a 20 41 6e 6f 74  r;       /* Anot
1b4d0 68 65 72 20 53 45 4c 45 43 54 20 69 6d 6d 65 64  her SELECT immed
1b4e0 69 61 74 65 6c 79 20 74 6f 20 6f 75 72 20 6c 65  iately to our le
1b4f0 66 74 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b  ft */.  Vdbe *v;
1b500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1b510 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
1b520 6f 20 74 68 69 73 20 56 44 42 45 20 2a 2f 0a 20  o this VDBE */. 
1b530 20 53 65 6c 65 63 74 44 65 73 74 20 64 65 73 74   SelectDest dest
1b540 41 3b 20 20 20 20 20 2f 2a 20 44 65 73 74 69 6e  A;     /* Destin
1b550 61 74 69 6f 6e 20 66 6f 72 20 63 6f 72 6f 75 74  ation for corout
1b560 69 6e 65 20 41 20 2a 2f 0a 20 20 53 65 6c 65 63  ine A */.  Selec
1b570 74 44 65 73 74 20 64 65 73 74 42 3b 20 20 20 20  tDest destB;    
1b580 20 2f 2a 20 44 65 73 74 69 6e 61 74 69 6f 6e 20   /* Destination 
1b590 66 6f 72 20 63 6f 72 6f 75 74 69 6e 65 20 42 20  for coroutine B 
1b5a0 2a 2f 0a 20 20 69 6e 74 20 72 65 67 41 64 64 72  */.  int regAddr
1b5b0 41 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64  A;         /* Ad
1b5c0 64 72 65 73 73 20 72 65 67 69 73 74 65 72 20 66  dress register f
1b5d0 6f 72 20 73 65 6c 65 63 74 2d 41 20 63 6f 72 6f  or select-A coro
1b5e0 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 72  utine */.  int r
1b5f0 65 67 41 64 64 72 42 3b 20 20 20 20 20 20 20 20  egAddrB;        
1b600 20 2f 2a 20 41 64 64 72 65 73 73 20 72 65 67 69   /* Address regi
1b610 73 74 65 72 20 66 6f 72 20 73 65 6c 65 63 74 2d  ster for select-
1b620 42 20 63 6f 72 6f 75 74 69 6e 65 20 2a 2f 0a 20  B coroutine */. 
1b630 20 69 6e 74 20 61 64 64 72 53 65 6c 65 63 74 41   int addrSelectA
1b640 3b 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73  ;      /* Addres
1b650 73 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74 2d  s of the select-
1b660 41 20 63 6f 72 6f 75 74 69 6e 65 20 2a 2f 0a 20  A coroutine */. 
1b670 20 69 6e 74 20 61 64 64 72 53 65 6c 65 63 74 42   int addrSelectB
1b680 3b 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73  ;      /* Addres
1b690 73 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74 2d  s of the select-
1b6a0 42 20 63 6f 72 6f 75 74 69 6e 65 20 2a 2f 0a 20  B coroutine */. 
1b6b0 20 69 6e 74 20 72 65 67 4f 75 74 41 3b 20 20 20   int regOutA;   
1b6c0 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73         /* Addres
1b6d0 73 20 72 65 67 69 73 74 65 72 20 66 6f 72 20 74  s register for t
1b6e0 68 65 20 6f 75 74 70 75 74 2d 41 20 73 75 62 72  he output-A subr
1b6f0 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20  outine */.  int 
1b700 72 65 67 4f 75 74 42 3b 20 20 20 20 20 20 20 20  regOutB;        
1b710 20 20 2f 2a 20 41 64 64 72 65 73 73 20 72 65 67    /* Address reg
1b720 69 73 74 65 72 20 66 6f 72 20 74 68 65 20 6f 75  ister for the ou
1b730 74 70 75 74 2d 42 20 73 75 62 72 6f 75 74 69 6e  tput-B subroutin
1b740 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 4f  e */.  int addrO
1b750 75 74 41 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  utA;         /* 
1b760 41 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 6f  Address of the o
1b770 75 74 70 75 74 2d 41 20 73 75 62 72 6f 75 74 69  utput-A subrouti
1b780 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72  ne */.  int addr
1b790 4f 75 74 42 20 3d 20 30 3b 20 20 20 20 20 2f 2a  OutB = 0;     /*
1b7a0 20 41 64 64 72 65 73 73 20 6f 66 20 74 68 65 20   Address of the 
1b7b0 6f 75 74 70 75 74 2d 42 20 73 75 62 72 6f 75 74  output-B subrout
1b7c0 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64  ine */.  int add
1b7d0 72 45 6f 66 41 3b 20 20 20 20 20 20 20 20 20 2f  rEofA;         /
1b7e0 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 68 65  * Address of the
1b7f0 20 73 65 6c 65 63 74 2d 41 2d 65 78 68 61 75 73   select-A-exhaus
1b800 74 65 64 20 73 75 62 72 6f 75 74 69 6e 65 20 2a  ted subroutine *
1b810 2f 0a 20 20 69 6e 74 20 61 64 64 72 45 6f 66 41  /.  int addrEofA
1b820 5f 6e 6f 42 3b 20 20 20 20 20 2f 2a 20 41 6c 74  _noB;     /* Alt
1b830 65 72 6e 61 74 65 20 61 64 64 72 45 6f 66 41 20  ernate addrEofA 
1b840 69 66 20 42 20 69 73 20 75 6e 69 6e 69 74 69 61  if B is uninitia
1b850 6c 69 7a 65 64 20 2a 2f 0a 20 20 69 6e 74 20 61  lized */.  int a
1b860 64 64 72 45 6f 66 42 3b 20 20 20 20 20 20 20 20  ddrEofB;        
1b870 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74   /* Address of t
1b880 68 65 20 73 65 6c 65 63 74 2d 42 2d 65 78 68 61  he select-B-exha
1b890 75 73 74 65 64 20 73 75 62 72 6f 75 74 69 6e 65  usted subroutine
1b8a0 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 41 6c   */.  int addrAl
1b8b0 74 42 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41  tB;         /* A
1b8c0 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 41 3c  ddress of the A<
1b8d0 42 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a  B subroutine */.
1b8e0 20 20 69 6e 74 20 61 64 64 72 41 65 71 42 3b 20    int addrAeqB; 
1b8f0 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65          /* Addre
1b900 73 73 20 6f 66 20 74 68 65 20 41 3d 3d 42 20 73  ss of the A==B s
1b910 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69  ubroutine */.  i
1b920 6e 74 20 61 64 64 72 41 67 74 42 3b 20 20 20 20  nt addrAgtB;    
1b930 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
1b940 6f 66 20 74 68 65 20 41 3e 42 20 73 75 62 72 6f  of the A>B subro
1b950 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 72  utine */.  int r
1b960 65 67 4c 69 6d 69 74 41 3b 20 20 20 20 20 20 20  egLimitA;       
1b970 20 2f 2a 20 4c 69 6d 69 74 20 72 65 67 69 73 74   /* Limit regist
1b980 65 72 20 66 6f 72 20 73 65 6c 65 63 74 2d 41 20  er for select-A 
1b990 2a 2f 0a 20 20 69 6e 74 20 72 65 67 4c 69 6d 69  */.  int regLimi
1b9a0 74 42 3b 20 20 20 20 20 20 20 20 2f 2a 20 4c 69  tB;        /* Li
1b9b0 6d 69 74 20 72 65 67 69 73 74 65 72 20 66 6f 72  mit register for
1b9c0 20 73 65 6c 65 63 74 2d 41 20 2a 2f 0a 20 20 69   select-A */.  i
1b9d0 6e 74 20 72 65 67 50 72 65 76 3b 20 20 20 20 20  nt regPrev;     
1b9e0 20 20 20 20 20 2f 2a 20 41 20 72 61 6e 67 65 20       /* A range 
1b9f0 6f 66 20 72 65 67 69 73 74 65 72 73 20 74 6f 20  of registers to 
1ba00 68 6f 6c 64 20 70 72 65 76 69 6f 75 73 20 6f 75  hold previous ou
1ba10 74 70 75 74 20 2a 2f 0a 20 20 69 6e 74 20 73 61  tput */.  int sa
1ba20 76 65 64 4c 69 6d 69 74 3b 20 20 20 20 20 20 20  vedLimit;       
1ba30 2f 2a 20 53 61 76 65 64 20 76 61 6c 75 65 20 6f  /* Saved value o
1ba40 66 20 70 2d 3e 69 4c 69 6d 69 74 20 2a 2f 0a 20  f p->iLimit */. 
1ba50 20 69 6e 74 20 73 61 76 65 64 4f 66 66 73 65 74   int savedOffset
1ba60 3b 20 20 20 20 20 20 2f 2a 20 53 61 76 65 64 20  ;      /* Saved 
1ba70 76 61 6c 75 65 20 6f 66 20 70 2d 3e 69 4f 66 66  value of p->iOff
1ba80 73 65 74 20 2a 2f 0a 20 20 69 6e 74 20 6c 61 62  set */.  int lab
1ba90 65 6c 43 6d 70 72 3b 20 20 20 20 20 20 20 20 2f  elCmpr;        /
1baa0 2a 20 4c 61 62 65 6c 20 66 6f 72 20 74 68 65 20  * Label for the 
1bab0 73 74 61 72 74 20 6f 66 20 74 68 65 20 6d 65 72  start of the mer
1bac0 67 65 20 61 6c 67 6f 72 69 74 68 6d 20 2a 2f 0a  ge algorithm */.
1bad0 20 20 69 6e 74 20 6c 61 62 65 6c 45 6e 64 3b 20    int labelEnd; 
1bae0 20 20 20 20 20 20 20 20 2f 2a 20 4c 61 62 65 6c          /* Label
1baf0 20 66 6f 72 20 74 68 65 20 65 6e 64 20 6f 66 20   for the end of 
1bb00 74 68 65 20 6f 76 65 72 61 6c 6c 20 53 45 4c 45  the overall SELE
1bb10 43 54 20 73 74 6d 74 20 2a 2f 0a 20 20 69 6e 74  CT stmt */.  int
1bb20 20 61 64 64 72 31 3b 20 20 20 20 20 20 20 20 20   addr1;         
1bb30 20 20 20 2f 2a 20 4a 75 6d 70 20 69 6e 73 74 72     /* Jump instr
1bb40 75 63 74 69 6f 6e 73 20 74 68 61 74 20 67 65 74  uctions that get
1bb50 20 72 65 74 61 72 67 65 74 74 65 64 20 2a 2f 0a   retargetted */.
1bb60 20 20 69 6e 74 20 6f 70 3b 20 20 20 20 20 20 20    int op;       
1bb70 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f          /* One o
1bb80 66 20 54 4b 5f 41 4c 4c 2c 20 54 4b 5f 55 4e 49  f TK_ALL, TK_UNI
1bb90 4f 4e 2c 20 54 4b 5f 45 58 43 45 50 54 2c 20 54  ON, TK_EXCEPT, T
1bba0 4b 5f 49 4e 54 45 52 53 45 43 54 20 2a 2f 0a 20  K_INTERSECT */. 
1bbb0 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 44 75   KeyInfo *pKeyDu
1bbc0 70 20 3d 20 30 3b 20 2f 2a 20 43 6f 6d 70 61 72  p = 0; /* Compar
1bbd0 69 73 6f 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  ison information
1bbe0 20 66 6f 72 20 64 75 70 6c 69 63 61 74 65 20 72   for duplicate r
1bbf0 65 6d 6f 76 61 6c 20 2a 2f 0a 20 20 4b 65 79 49  emoval */.  KeyI
1bc00 6e 66 6f 20 2a 70 4b 65 79 4d 65 72 67 65 3b 20  nfo *pKeyMerge; 
1bc10 20 20 2f 2a 20 43 6f 6d 70 61 72 69 73 6f 6e 20    /* Comparison 
1bc20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20  information for 
1bc30 6d 65 72 67 69 6e 67 20 72 6f 77 73 20 2a 2f 0a  merging rows */.
1bc40 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 20 20    sqlite3 *db;  
1bc50 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62          /* Datab
1bc60 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a  ase connection *
1bc70 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f  /.  ExprList *pO
1bc80 72 64 65 72 42 79 3b 20 20 20 2f 2a 20 54 68 65  rderBy;   /* The
1bc90 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
1bca0 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f 72 64 65 72   */.  int nOrder
1bcb0 42 79 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  By;         /* N
1bcc0 75 6d 62 65 72 20 6f 66 20 74 65 72 6d 73 20 69  umber of terms i
1bcd0 6e 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63  n the ORDER BY c
1bce0 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 2a  lause */.  int *
1bcf0 61 50 65 72 6d 75 74 65 3b 20 20 20 20 20 20 20  aPermute;       
1bd00 20 2f 2a 20 4d 61 70 70 69 6e 67 20 66 72 6f 6d   /* Mapping from
1bd10 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d 73 20   ORDER BY terms 
1bd20 74 6f 20 72 65 73 75 6c 74 20 73 65 74 20 63 6f  to result set co
1bd30 6c 75 6d 6e 73 20 2a 2f 0a 0a 20 20 61 73 73 65  lumns */..  asse
1bd40 72 74 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 21  rt( p->pOrderBy!
1bd50 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
1bd60 70 4b 65 79 44 75 70 3d 3d 30 20 29 3b 20 2f 2a  pKeyDup==0 ); /*
1bd70 20 22 4d 61 6e 61 67 65 64 22 20 63 6f 64 65 20   "Managed" code 
1bd80 6e 65 65 64 73 20 74 68 69 73 2e 20 20 54 69 63  needs this.  Tic
1bd90 6b 65 74 20 23 33 33 38 32 2e 20 2a 2f 0a 20 20  ket #3382. */.  
1bda0 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
1bdb0 0a 20 20 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  .  v = pParse->p
1bdc0 56 64 62 65 3b 0a 20 20 61 73 73 65 72 74 28 20  Vdbe;.  assert( 
1bdd0 76 21 3d 30 20 29 3b 20 20 20 20 20 20 20 2f 2a  v!=0 );       /*
1bde0 20 41 6c 72 65 61 64 79 20 74 68 72 6f 77 6e 20   Already thrown 
1bdf0 74 68 65 20 65 72 72 6f 72 20 69 66 20 56 44 42  the error if VDB
1be00 45 20 61 6c 6c 6f 63 20 66 61 69 6c 65 64 20 2a  E alloc failed *
1be10 2f 0a 20 20 6c 61 62 65 6c 45 6e 64 20 3d 20 73  /.  labelEnd = s
1be20 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
1be30 62 65 6c 28 76 29 3b 0a 20 20 6c 61 62 65 6c 43  bel(v);.  labelC
1be40 6d 70 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62  mpr = sqlite3Vdb
1be50 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 0a  eMakeLabel(v);..
1be60 0a 20 20 2f 2a 20 50 61 74 63 68 20 75 70 20 74  .  /* Patch up t
1be70 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
1be80 73 65 0a 20 20 2a 2f 0a 20 20 6f 70 20 3d 20 70  se.  */.  op = p
1be90 2d 3e 6f 70 3b 20 20 0a 20 20 70 50 72 69 6f 72  ->op;  .  pPrior
1bea0 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20   = p->pPrior;.  
1beb0 61 73 73 65 72 74 28 20 70 50 72 69 6f 72 2d 3e  assert( pPrior->
1bec0 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 3b 0a 20  pOrderBy==0 );. 
1bed0 20 70 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e 70   pOrderBy = p->p
1bee0 4f 72 64 65 72 42 79 3b 0a 20 20 61 73 73 65 72  OrderBy;.  asser
1bef0 74 28 20 70 4f 72 64 65 72 42 79 20 29 3b 0a 20  t( pOrderBy );. 
1bf00 20 6e 4f 72 64 65 72 42 79 20 3d 20 70 4f 72 64   nOrderBy = pOrd
1bf10 65 72 42 79 2d 3e 6e 45 78 70 72 3b 0a 0a 20 20  erBy->nExpr;..  
1bf20 2f 2a 20 46 6f 72 20 6f 70 65 72 61 74 6f 72 73  /* For operators
1bf30 20 6f 74 68 65 72 20 74 68 61 6e 20 55 4e 49 4f   other than UNIO
1bf40 4e 20 41 4c 4c 20 77 65 20 68 61 76 65 20 74 6f  N ALL we have to
1bf50 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 0a   make sure that.
1bf60 20 20 2a 2a 20 74 68 65 20 4f 52 44 45 52 20 42    ** the ORDER B
1bf70 59 20 63 6c 61 75 73 65 20 63 6f 76 65 72 73 20  Y clause covers 
1bf80 65 76 65 72 79 20 74 65 72 6d 20 6f 66 20 74 68  every term of th
1bf90 65 20 72 65 73 75 6c 74 20 73 65 74 2e 20 20 41  e result set.  A
1bfa0 64 64 0a 20 20 2a 2a 20 74 65 72 6d 73 20 74 6f  dd.  ** terms to
1bfb0 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   the ORDER BY cl
1bfc0 61 75 73 65 20 61 73 20 6e 65 63 65 73 73 61 72  ause as necessar
1bfd0 79 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6f 70  y..  */.  if( op
1bfe0 21 3d 54 4b 5f 41 4c 4c 20 29 7b 0a 20 20 20 20  !=TK_ALL ){.    
1bff0 66 6f 72 28 69 3d 31 3b 20 64 62 2d 3e 6d 61 6c  for(i=1; db->mal
1c000 6c 6f 63 46 61 69 6c 65 64 3d 3d 30 20 26 26 20  locFailed==0 && 
1c010 69 3c 3d 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45  i<=p->pEList->nE
1c020 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  xpr; i++){.     
1c030 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74   struct ExprList
1c040 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20  _item *pItem;.  
1c050 20 20 20 20 66 6f 72 28 6a 3d 30 2c 20 70 49 74      for(j=0, pIt
1c060 65 6d 3d 70 4f 72 64 65 72 42 79 2d 3e 61 3b 20  em=pOrderBy->a; 
1c070 6a 3c 6e 4f 72 64 65 72 42 79 3b 20 6a 2b 2b 2c  j<nOrderBy; j++,
1c080 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20   pItem++){.     
1c090 20 20 20 61 73 73 65 72 74 28 20 70 49 74 65 6d     assert( pItem
1c0a0 2d 3e 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f  ->u.x.iOrderByCo
1c0b0 6c 3e 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69  l>0 );.        i
1c0c0 66 28 20 70 49 74 65 6d 2d 3e 75 2e 78 2e 69 4f  f( pItem->u.x.iO
1c0d0 72 64 65 72 42 79 43 6f 6c 3d 3d 69 20 29 20 62  rderByCol==i ) b
1c0e0 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
1c0f0 20 20 20 20 69 66 28 20 6a 3d 3d 6e 4f 72 64 65      if( j==nOrde
1c100 72 42 79 20 29 7b 0a 20 20 20 20 20 20 20 20 45  rBy ){.        E
1c110 78 70 72 20 2a 70 4e 65 77 20 3d 20 73 71 6c 69  xpr *pNew = sqli
1c120 74 65 33 45 78 70 72 28 64 62 2c 20 54 4b 5f 49  te3Expr(db, TK_I
1c130 4e 54 45 47 45 52 2c 20 30 29 3b 0a 20 20 20 20  NTEGER, 0);.    
1c140 20 20 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20      if( pNew==0 
1c150 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
1c160 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20  NOMEM_BKPT;.    
1c170 20 20 20 20 70 4e 65 77 2d 3e 66 6c 61 67 73 20      pNew->flags 
1c180 7c 3d 20 45 50 5f 49 6e 74 56 61 6c 75 65 3b 0a  |= EP_IntValue;.
1c190 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e          pNew->u.
1c1a0 69 56 61 6c 75 65 20 3d 20 69 3b 0a 20 20 20 20  iValue = i;.    
1c1b0 20 20 20 20 70 2d 3e 70 4f 72 64 65 72 42 79 20      p->pOrderBy 
1c1c0 3d 20 70 4f 72 64 65 72 42 79 20 3d 20 73 71 6c  = pOrderBy = sql
1c1d0 69 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65  ite3ExprListAppe
1c1e0 6e 64 28 70 50 61 72 73 65 2c 20 70 4f 72 64 65  nd(pParse, pOrde
1c1f0 72 42 79 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20  rBy, pNew);.    
1c200 20 20 20 20 69 66 28 20 70 4f 72 64 65 72 42 79      if( pOrderBy
1c210 20 29 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 6e   ) pOrderBy->a[n
1c220 4f 72 64 65 72 42 79 2b 2b 5d 2e 75 2e 78 2e 69  OrderBy++].u.x.i
1c230 4f 72 64 65 72 42 79 43 6f 6c 20 3d 20 28 75 31  OrderByCol = (u1
1c240 36 29 69 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  6)i;.      }.   
1c250 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6d   }.  }..  /* Com
1c260 70 75 74 65 20 74 68 65 20 63 6f 6d 70 61 72 69  pute the compari
1c270 73 6f 6e 20 70 65 72 6d 75 74 61 74 69 6f 6e 20  son permutation 
1c280 61 6e 64 20 6b 65 79 69 6e 66 6f 20 74 68 61 74  and keyinfo that
1c290 20 69 73 20 75 73 65 64 20 77 69 74 68 0a 20 20   is used with.  
1c2a0 2a 2a 20 74 68 65 20 70 65 72 6d 75 74 61 74 69  ** the permutati
1c2b0 6f 6e 20 75 73 65 64 20 74 6f 20 64 65 74 65 72  on used to deter
1c2c0 6d 69 6e 65 20 69 66 20 74 68 65 20 6e 65 78 74  mine if the next
1c2d0 0a 20 20 2a 2a 20 72 6f 77 20 6f 66 20 72 65 73  .  ** row of res
1c2e0 75 6c 74 73 20 63 6f 6d 65 73 20 66 72 6f 6d 20  ults comes from 
1c2f0 73 65 6c 65 63 74 41 20 6f 72 20 73 65 6c 65 63  selectA or selec
1c300 74 42 2e 20 20 41 6c 73 6f 20 61 64 64 20 65 78  tB.  Also add ex
1c310 70 6c 69 63 69 74 0a 20 20 2a 2a 20 63 6f 6c 6c  plicit.  ** coll
1c320 61 74 69 6f 6e 73 20 74 6f 20 74 68 65 20 4f 52  ations to the OR
1c330 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 74 65  DER BY clause te
1c340 72 6d 73 20 73 6f 20 74 68 61 74 20 77 68 65 6e  rms so that when
1c350 20 74 68 65 20 73 75 62 71 75 65 72 69 65 73 0a   the subqueries.
1c360 20 20 2a 2a 20 74 6f 20 74 68 65 20 72 69 67 68    ** to the righ
1c370 74 20 61 6e 64 20 74 68 65 20 6c 65 66 74 20 61  t and the left a
1c380 72 65 20 65 76 61 6c 75 61 74 65 64 2c 20 74 68  re evaluated, th
1c390 65 79 20 75 73 65 20 74 68 65 20 63 6f 72 72 65  ey use the corre
1c3a0 63 74 0a 20 20 2a 2a 20 63 6f 6c 6c 61 74 69 6f  ct.  ** collatio
1c3b0 6e 2e 0a 20 20 2a 2f 0a 20 20 61 50 65 72 6d 75  n..  */.  aPermu
1c3c0 74 65 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  te = sqlite3DbMa
1c3d0 6c 6c 6f 63 52 61 77 4e 4e 28 64 62 2c 20 73 69  llocRawNN(db, si
1c3e0 7a 65 6f 66 28 69 6e 74 29 2a 28 6e 4f 72 64 65  zeof(int)*(nOrde
1c3f0 72 42 79 20 2b 20 31 29 29 3b 0a 20 20 69 66 28  rBy + 1));.  if(
1c400 20 61 50 65 72 6d 75 74 65 20 29 7b 0a 20 20 20   aPermute ){.   
1c410 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74   struct ExprList
1c420 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20  _item *pItem;.  
1c430 20 20 61 50 65 72 6d 75 74 65 5b 30 5d 20 3d 20    aPermute[0] = 
1c440 6e 4f 72 64 65 72 42 79 3b 0a 20 20 20 20 66 6f  nOrderBy;.    fo
1c450 72 28 69 3d 31 2c 20 70 49 74 65 6d 3d 70 4f 72  r(i=1, pItem=pOr
1c460 64 65 72 42 79 2d 3e 61 3b 20 69 3c 3d 6e 4f 72  derBy->a; i<=nOr
1c470 64 65 72 42 79 3b 20 69 2b 2b 2c 20 70 49 74 65  derBy; i++, pIte
1c480 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 61 73 73 65  m++){.      asse
1c490 72 74 28 20 70 49 74 65 6d 2d 3e 75 2e 78 2e 69  rt( pItem->u.x.i
1c4a0 4f 72 64 65 72 42 79 43 6f 6c 3e 30 20 29 3b 0a  OrderByCol>0 );.
1c4b0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49        assert( pI
1c4c0 74 65 6d 2d 3e 75 2e 78 2e 69 4f 72 64 65 72 42  tem->u.x.iOrderB
1c4d0 79 43 6f 6c 3c 3d 70 2d 3e 70 45 4c 69 73 74 2d  yCol<=p->pEList-
1c4e0 3e 6e 45 78 70 72 20 29 3b 0a 20 20 20 20 20 20  >nExpr );.      
1c4f0 61 50 65 72 6d 75 74 65 5b 69 5d 20 3d 20 70 49  aPermute[i] = pI
1c500 74 65 6d 2d 3e 75 2e 78 2e 69 4f 72 64 65 72 42  tem->u.x.iOrderB
1c510 79 43 6f 6c 20 2d 20 31 3b 0a 20 20 20 20 7d 0a  yCol - 1;.    }.
1c520 20 20 20 20 70 4b 65 79 4d 65 72 67 65 20 3d 20      pKeyMerge = 
1c530 6d 75 6c 74 69 53 65 6c 65 63 74 4f 72 64 65 72  multiSelectOrder
1c540 42 79 4b 65 79 49 6e 66 6f 28 70 50 61 72 73 65  ByKeyInfo(pParse
1c550 2c 20 70 2c 20 31 29 3b 0a 20 20 7d 65 6c 73 65  , p, 1);.  }else
1c560 7b 0a 20 20 20 20 70 4b 65 79 4d 65 72 67 65 20  {.    pKeyMerge 
1c570 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52  = 0;.  }..  /* R
1c580 65 61 74 74 61 63 68 20 74 68 65 20 4f 52 44 45  eattach the ORDE
1c590 52 20 42 59 20 63 6c 61 75 73 65 20 74 6f 20 74  R BY clause to t
1c5a0 68 65 20 71 75 65 72 79 2e 0a 20 20 2a 2f 0a 20  he query..  */. 
1c5b0 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 70   p->pOrderBy = p
1c5c0 4f 72 64 65 72 42 79 3b 0a 20 20 70 50 72 69 6f  OrderBy;.  pPrio
1c5d0 72 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 73 71  r->pOrderBy = sq
1c5e0 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70  lite3ExprListDup
1c5f0 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 4f 72  (pParse->db, pOr
1c600 64 65 72 42 79 2c 20 30 29 3b 0a 0a 20 20 2f 2a  derBy, 0);..  /*
1c610 20 41 6c 6c 6f 63 61 74 65 20 61 20 72 61 6e 67   Allocate a rang
1c620 65 20 6f 66 20 74 65 6d 70 6f 72 61 72 79 20 72  e of temporary r
1c630 65 67 69 73 74 65 72 73 20 61 6e 64 20 74 68 65  egisters and the
1c640 20 4b 65 79 49 6e 66 6f 20 6e 65 65 64 65 64 0a   KeyInfo needed.
1c650 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 6c 6f 67    ** for the log
1c660 69 63 20 74 68 61 74 20 72 65 6d 6f 76 65 73 20  ic that removes 
1c670 64 75 70 6c 69 63 61 74 65 20 72 65 73 75 6c 74  duplicate result
1c680 20 72 6f 77 73 20 77 68 65 6e 20 74 68 65 0a 20   rows when the. 
1c690 20 2a 2a 20 6f 70 65 72 61 74 6f 72 20 69 73 20   ** operator is 
1c6a0 55 4e 49 4f 4e 2c 20 45 58 43 45 50 54 2c 20 6f  UNION, EXCEPT, o
1c6b0 72 20 49 4e 54 45 52 53 45 43 54 20 28 62 75 74  r INTERSECT (but
1c6c0 20 6e 6f 74 20 55 4e 49 4f 4e 20 41 4c 4c 29 2e   not UNION ALL).
1c6d0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6f 70 3d 3d  .  */.  if( op==
1c6e0 54 4b 5f 41 4c 4c 20 29 7b 0a 20 20 20 20 72 65  TK_ALL ){.    re
1c6f0 67 50 72 65 76 20 3d 20 30 3b 0a 20 20 7d 65 6c  gPrev = 0;.  }el
1c700 73 65 7b 0a 20 20 20 20 69 6e 74 20 6e 45 78 70  se{.    int nExp
1c710 72 20 3d 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e  r = p->pEList->n
1c720 45 78 70 72 3b 0a 20 20 20 20 61 73 73 65 72 74  Expr;.    assert
1c730 28 20 6e 4f 72 64 65 72 42 79 3e 3d 6e 45 78 70  ( nOrderBy>=nExp
1c740 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  r || db->mallocF
1c750 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 72 65 67  ailed );.    reg
1c760 50 72 65 76 20 3d 20 70 50 61 72 73 65 2d 3e 6e  Prev = pParse->n
1c770 4d 65 6d 2b 31 3b 0a 20 20 20 20 70 50 61 72 73  Mem+1;.    pPars
1c780 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 45 78 70 72  e->nMem += nExpr
1c790 2b 31 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  +1;.    sqlite3V
1c7a0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
1c7b0 49 6e 74 65 67 65 72 2c 20 30 2c 20 72 65 67 50  Integer, 0, regP
1c7c0 72 65 76 29 3b 0a 20 20 20 20 70 4b 65 79 44 75  rev);.    pKeyDu
1c7d0 70 20 3d 20 73 71 6c 69 74 65 33 4b 65 79 49 6e  p = sqlite3KeyIn
1c7e0 66 6f 41 6c 6c 6f 63 28 64 62 2c 20 6e 45 78 70  foAlloc(db, nExp
1c7f0 72 2c 20 31 29 3b 0a 20 20 20 20 69 66 28 20 70  r, 1);.    if( p
1c800 4b 65 79 44 75 70 20 29 7b 0a 20 20 20 20 20 20  KeyDup ){.      
1c810 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 4b  assert( sqlite3K
1c820 65 79 49 6e 66 6f 49 73 57 72 69 74 65 61 62 6c  eyInfoIsWriteabl
1c830 65 28 70 4b 65 79 44 75 70 29 20 29 3b 0a 20 20  e(pKeyDup) );.  
1c840 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
1c850 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Expr; i++){.    
1c860 20 20 20 20 70 4b 65 79 44 75 70 2d 3e 61 43 6f      pKeyDup->aCo
1c870 6c 6c 5b 69 5d 20 3d 20 6d 75 6c 74 69 53 65 6c  ll[i] = multiSel
1c880 65 63 74 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  ectCollSeq(pPars
1c890 65 2c 20 70 2c 20 69 29 3b 0a 20 20 20 20 20 20  e, p, i);.      
1c8a0 20 20 70 4b 65 79 44 75 70 2d 3e 61 53 6f 72 74    pKeyDup->aSort
1c8b0 4f 72 64 65 72 5b 69 5d 20 3d 20 30 3b 0a 20 20  Order[i] = 0;.  
1c8c0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
1c8d0 20 0a 20 20 2f 2a 20 53 65 70 61 72 61 74 65 20   .  /* Separate 
1c8e0 74 68 65 20 6c 65 66 74 20 61 6e 64 20 74 68 65  the left and the
1c8f0 20 72 69 67 68 74 20 71 75 65 72 79 20 66 72 6f   right query fro
1c900 6d 20 6f 6e 65 20 61 6e 6f 74 68 65 72 0a 20 20  m one another.  
1c910 2a 2f 0a 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d  */.  p->pPrior =
1c920 20 30 3b 0a 20 20 70 50 72 69 6f 72 2d 3e 70 4e   0;.  pPrior->pN
1c930 65 78 74 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74  ext = 0;.  sqlit
1c940 65 33 52 65 73 6f 6c 76 65 4f 72 64 65 72 47 72  e3ResolveOrderGr
1c950 6f 75 70 42 79 28 70 50 61 72 73 65 2c 20 70 2c  oupBy(pParse, p,
1c960 20 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20 22 4f   p->pOrderBy, "O
1c970 52 44 45 52 22 29 3b 0a 20 20 69 66 28 20 70 50  RDER");.  if( pP
1c980 72 69 6f 72 2d 3e 70 50 72 69 6f 72 3d 3d 30 20  rior->pPrior==0 
1c990 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65  ){.    sqlite3Re
1c9a0 73 6f 6c 76 65 4f 72 64 65 72 47 72 6f 75 70 42  solveOrderGroupB
1c9b0 79 28 70 50 61 72 73 65 2c 20 70 50 72 69 6f 72  y(pParse, pPrior
1c9c0 2c 20 70 50 72 69 6f 72 2d 3e 70 4f 72 64 65 72  , pPrior->pOrder
1c9d0 42 79 2c 20 22 4f 52 44 45 52 22 29 3b 0a 20 20  By, "ORDER");.  
1c9e0 7d 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20  }..  /* Compute 
1c9f0 74 68 65 20 6c 69 6d 69 74 20 72 65 67 69 73 74  the limit regist
1ca00 65 72 73 20 2a 2f 0a 20 20 63 6f 6d 70 75 74 65  ers */.  compute
1ca10 4c 69 6d 69 74 52 65 67 69 73 74 65 72 73 28 70  LimitRegisters(p
1ca20 50 61 72 73 65 2c 20 70 2c 20 6c 61 62 65 6c 45  Parse, p, labelE
1ca30 6e 64 29 3b 0a 20 20 69 66 28 20 70 2d 3e 69 4c  nd);.  if( p->iL
1ca40 69 6d 69 74 20 26 26 20 6f 70 3d 3d 54 4b 5f 41  imit && op==TK_A
1ca50 4c 4c 20 29 7b 0a 20 20 20 20 72 65 67 4c 69 6d  LL ){.    regLim
1ca60 69 74 41 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  itA = ++pParse->
1ca70 6e 4d 65 6d 3b 0a 20 20 20 20 72 65 67 4c 69 6d  nMem;.    regLim
1ca80 69 74 42 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  itB = ++pParse->
1ca90 6e 4d 65 6d 3b 0a 20 20 20 20 73 71 6c 69 74 65  nMem;.    sqlite
1caa0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
1cab0 50 5f 43 6f 70 79 2c 20 70 2d 3e 69 4f 66 66 73  P_Copy, p->iOffs
1cac0 65 74 20 3f 20 70 2d 3e 69 4f 66 66 73 65 74 2b  et ? p->iOffset+
1cad0 31 20 3a 20 70 2d 3e 69 4c 69 6d 69 74 2c 0a 20  1 : p->iLimit,. 
1cae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1caf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cb00 20 72 65 67 4c 69 6d 69 74 41 29 3b 0a 20 20 20   regLimitA);.   
1cb10 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1cb20 70 32 28 76 2c 20 4f 50 5f 43 6f 70 79 2c 20 72  p2(v, OP_Copy, r
1cb30 65 67 4c 69 6d 69 74 41 2c 20 72 65 67 4c 69 6d  egLimitA, regLim
1cb40 69 74 42 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  itB);.  }else{. 
1cb50 20 20 20 72 65 67 4c 69 6d 69 74 41 20 3d 20 72     regLimitA = r
1cb60 65 67 4c 69 6d 69 74 42 20 3d 20 30 3b 0a 20 20  egLimitB = 0;.  
1cb70 7d 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 44  }.  sqlite3ExprD
1cb80 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 4c 69  elete(db, p->pLi
1cb90 6d 69 74 29 3b 0a 20 20 70 2d 3e 70 4c 69 6d 69  mit);.  p->pLimi
1cba0 74 20 3d 20 30 3b 0a 0a 20 20 72 65 67 41 64 64  t = 0;..  regAdd
1cbb0 72 41 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  rA = ++pParse->n
1cbc0 4d 65 6d 3b 0a 20 20 72 65 67 41 64 64 72 42 20  Mem;.  regAddrB 
1cbd0 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
1cbe0 3b 0a 20 20 72 65 67 4f 75 74 41 20 3d 20 2b 2b  ;.  regOutA = ++
1cbf0 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
1cc00 72 65 67 4f 75 74 42 20 3d 20 2b 2b 70 50 61 72  regOutB = ++pPar
1cc10 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 73 71 6c 69  se->nMem;.  sqli
1cc20 74 65 33 53 65 6c 65 63 74 44 65 73 74 49 6e 69  te3SelectDestIni
1cc30 74 28 26 64 65 73 74 41 2c 20 53 52 54 5f 43 6f  t(&destA, SRT_Co
1cc40 72 6f 75 74 69 6e 65 2c 20 72 65 67 41 64 64 72  routine, regAddr
1cc50 41 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c  A);.  sqlite3Sel
1cc60 65 63 74 44 65 73 74 49 6e 69 74 28 26 64 65 73  ectDestInit(&des
1cc70 74 42 2c 20 53 52 54 5f 43 6f 72 6f 75 74 69 6e  tB, SRT_Coroutin
1cc80 65 2c 20 72 65 67 41 64 64 72 42 29 3b 0a 0a 20  e, regAddrB);.. 
1cc90 20 45 78 70 6c 61 69 6e 51 75 65 72 79 50 6c 61   ExplainQueryPla
1cca0 6e 28 28 70 50 61 72 73 65 2c 20 31 2c 20 22 4d  n((pParse, 1, "M
1ccb0 45 52 47 45 20 28 25 73 29 22 2c 20 73 65 6c 65  ERGE (%s)", sele
1ccc0 63 74 4f 70 4e 61 6d 65 28 70 2d 3e 6f 70 29 29  ctOpName(p->op))
1ccd0 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74  );..  /* Generat
1cce0 65 20 61 20 63 6f 72 6f 75 74 69 6e 65 20 74 6f  e a coroutine to
1ccf0 20 65 76 61 6c 75 61 74 65 20 74 68 65 20 53 45   evaluate the SE
1cd00 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 74  LECT statement t
1cd10 6f 20 74 68 65 0a 20 20 2a 2a 20 6c 65 66 74 20  o the.  ** left 
1cd20 6f 66 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20  of the compound 
1cd30 6f 70 65 72 61 74 6f 72 20 2d 20 74 68 65 20 22  operator - the "
1cd40 41 22 20 73 65 6c 65 63 74 2e 0a 20 20 2a 2f 0a  A" select..  */.
1cd50 20 20 61 64 64 72 53 65 6c 65 63 74 41 20 3d 20    addrSelectA = 
1cd60 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
1cd70 6e 74 41 64 64 72 28 76 29 20 2b 20 31 3b 0a 20  ntAddr(v) + 1;. 
1cd80 20 61 64 64 72 31 20 3d 20 73 71 6c 69 74 65 33   addr1 = sqlite3
1cd90 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
1cda0 5f 49 6e 69 74 43 6f 72 6f 75 74 69 6e 65 2c 20  _InitCoroutine, 
1cdb0 72 65 67 41 64 64 72 41 2c 20 30 2c 20 61 64 64  regAddrA, 0, add
1cdc0 72 53 65 6c 65 63 74 41 29 3b 0a 20 20 56 64 62  rSelectA);.  Vdb
1cdd0 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 6c 65  eComment((v, "le
1cde0 66 74 20 53 45 4c 45 43 54 22 29 29 3b 0a 20 20  ft SELECT"));.  
1cdf0 70 50 72 69 6f 72 2d 3e 69 4c 69 6d 69 74 20 3d  pPrior->iLimit =
1ce00 20 72 65 67 4c 69 6d 69 74 41 3b 0a 20 20 45 78   regLimitA;.  Ex
1ce10 70 6c 61 69 6e 51 75 65 72 79 50 6c 61 6e 28 28  plainQueryPlan((
1ce20 70 50 61 72 73 65 2c 20 31 2c 20 22 4c 45 46 54  pParse, 1, "LEFT
1ce30 22 29 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 65  "));.  sqlite3Se
1ce40 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 50 72  lect(pParse, pPr
1ce50 69 6f 72 2c 20 26 64 65 73 74 41 29 3b 0a 20 20  ior, &destA);.  
1ce60 73 71 6c 69 74 65 33 56 64 62 65 45 6e 64 43 6f  sqlite3VdbeEndCo
1ce70 72 6f 75 74 69 6e 65 28 76 2c 20 72 65 67 41 64  routine(v, regAd
1ce80 64 72 41 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  drA);.  sqlite3V
1ce90 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61  dbeJumpHere(v, a
1cea0 64 64 72 31 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e  ddr1);..  /* Gen
1ceb0 65 72 61 74 65 20 61 20 63 6f 72 6f 75 74 69 6e  erate a coroutin
1cec0 65 20 74 6f 20 65 76 61 6c 75 61 74 65 20 74 68  e to evaluate th
1ced0 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  e SELECT stateme
1cee0 6e 74 20 6f 6e 20 0a 20 20 2a 2a 20 74 68 65 20  nt on .  ** the 
1cef0 72 69 67 68 74 20 2d 20 74 68 65 20 22 42 22 20  right - the "B" 
1cf00 73 65 6c 65 63 74 0a 20 20 2a 2f 0a 20 20 61 64  select.  */.  ad
1cf10 64 72 53 65 6c 65 63 74 42 20 3d 20 73 71 6c 69  drSelectB = sqli
1cf20 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
1cf30 64 72 28 76 29 20 2b 20 31 3b 0a 20 20 61 64 64  dr(v) + 1;.  add
1cf40 72 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  r1 = sqlite3Vdbe
1cf50 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 69  AddOp3(v, OP_Ini
1cf60 74 43 6f 72 6f 75 74 69 6e 65 2c 20 72 65 67 41  tCoroutine, regA
1cf70 64 64 72 42 2c 20 30 2c 20 61 64 64 72 53 65 6c  ddrB, 0, addrSel
1cf80 65 63 74 42 29 3b 0a 20 20 56 64 62 65 43 6f 6d  ectB);.  VdbeCom
1cf90 6d 65 6e 74 28 28 76 2c 20 22 72 69 67 68 74 20  ment((v, "right 
1cfa0 53 45 4c 45 43 54 22 29 29 3b 0a 20 20 73 61 76  SELECT"));.  sav
1cfb0 65 64 4c 69 6d 69 74 20 3d 20 70 2d 3e 69 4c 69  edLimit = p->iLi
1cfc0 6d 69 74 3b 0a 20 20 73 61 76 65 64 4f 66 66 73  mit;.  savedOffs
1cfd0 65 74 20 3d 20 70 2d 3e 69 4f 66 66 73 65 74 3b  et = p->iOffset;
1cfe0 0a 20 20 70 2d 3e 69 4c 69 6d 69 74 20 3d 20 72  .  p->iLimit = r
1cff0 65 67 4c 69 6d 69 74 42 3b 0a 20 20 70 2d 3e 69  egLimitB;.  p->i
1d000 4f 66 66 73 65 74 20 3d 20 30 3b 20 20 0a 20 20  Offset = 0;  .  
1d010 45 78 70 6c 61 69 6e 51 75 65 72 79 50 6c 61 6e  ExplainQueryPlan
1d020 28 28 70 50 61 72 73 65 2c 20 31 2c 20 22 52 49  ((pParse, 1, "RI
1d030 47 48 54 22 29 29 3b 0a 20 20 73 71 6c 69 74 65  GHT"));.  sqlite
1d040 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20  3Select(pParse, 
1d050 70 2c 20 26 64 65 73 74 42 29 3b 0a 20 20 70 2d  p, &destB);.  p-
1d060 3e 69 4c 69 6d 69 74 20 3d 20 73 61 76 65 64 4c  >iLimit = savedL
1d070 69 6d 69 74 3b 0a 20 20 70 2d 3e 69 4f 66 66 73  imit;.  p->iOffs
1d080 65 74 20 3d 20 73 61 76 65 64 4f 66 66 73 65 74  et = savedOffset
1d090 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 45  ;.  sqlite3VdbeE
1d0a0 6e 64 43 6f 72 6f 75 74 69 6e 65 28 76 2c 20 72  ndCoroutine(v, r
1d0b0 65 67 41 64 64 72 42 29 3b 0a 0a 20 20 2f 2a 20  egAddrB);..  /* 
1d0c0 47 65 6e 65 72 61 74 65 20 61 20 73 75 62 72 6f  Generate a subro
1d0d0 75 74 69 6e 65 20 74 68 61 74 20 6f 75 74 70 75  utine that outpu
1d0e0 74 73 20 74 68 65 20 63 75 72 72 65 6e 74 20 72  ts the current r
1d0f0 6f 77 20 6f 66 20 74 68 65 20 41 0a 20 20 2a 2a  ow of the A.  **
1d100 20 73 65 6c 65 63 74 20 61 73 20 74 68 65 20 6e   select as the n
1d110 65 78 74 20 6f 75 74 70 75 74 20 72 6f 77 20 6f  ext output row o
1d120 66 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 73  f the compound s
1d130 65 6c 65 63 74 2e 0a 20 20 2a 2f 0a 20 20 56 64  elect..  */.  Vd
1d140 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76  beNoopComment((v
1d150 2c 20 22 4f 75 74 70 75 74 20 72 6f 75 74 69 6e  , "Output routin
1d160 65 20 66 6f 72 20 41 22 29 29 3b 0a 20 20 61 64  e for A"));.  ad
1d170 64 72 4f 75 74 41 20 3d 20 67 65 6e 65 72 61 74  drOutA = generat
1d180 65 4f 75 74 70 75 74 53 75 62 72 6f 75 74 69 6e  eOutputSubroutin
1d190 65 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20  e(pParse,.      
1d1a0 20 20 20 20 20 20 20 20 20 20 20 70 2c 20 26 64             p, &d
1d1b0 65 73 74 41 2c 20 70 44 65 73 74 2c 20 72 65 67  estA, pDest, reg
1d1c0 4f 75 74 41 2c 0a 20 20 20 20 20 20 20 20 20 20  OutA,.          
1d1d0 20 20 20 20 20 20 20 72 65 67 50 72 65 76 2c 20         regPrev, 
1d1e0 70 4b 65 79 44 75 70 2c 20 6c 61 62 65 6c 45 6e  pKeyDup, labelEn
1d1f0 64 29 3b 0a 20 20 0a 20 20 2f 2a 20 47 65 6e 65  d);.  .  /* Gene
1d200 72 61 74 65 20 61 20 73 75 62 72 6f 75 74 69 6e  rate a subroutin
1d210 65 20 74 68 61 74 20 6f 75 74 70 75 74 73 20 74  e that outputs t
1d220 68 65 20 63 75 72 72 65 6e 74 20 72 6f 77 20 6f  he current row o
1d230 66 20 74 68 65 20 42 0a 20 20 2a 2a 20 73 65 6c  f the B.  ** sel
1d240 65 63 74 20 61 73 20 74 68 65 20 6e 65 78 74 20  ect as the next 
1d250 6f 75 74 70 75 74 20 72 6f 77 20 6f 66 20 74 68  output row of th
1d260 65 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63  e compound selec
1d270 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6f 70  t..  */.  if( op
1d280 3d 3d 54 4b 5f 41 4c 4c 20 7c 7c 20 6f 70 3d 3d  ==TK_ALL || op==
1d290 54 4b 5f 55 4e 49 4f 4e 20 29 7b 0a 20 20 20 20  TK_UNION ){.    
1d2a0 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28  VdbeNoopComment(
1d2b0 28 76 2c 20 22 4f 75 74 70 75 74 20 72 6f 75 74  (v, "Output rout
1d2c0 69 6e 65 20 66 6f 72 20 42 22 29 29 3b 0a 20 20  ine for B"));.  
1d2d0 20 20 61 64 64 72 4f 75 74 42 20 3d 20 67 65 6e    addrOutB = gen
1d2e0 65 72 61 74 65 4f 75 74 70 75 74 53 75 62 72 6f  erateOutputSubro
1d2f0 75 74 69 6e 65 28 70 50 61 72 73 65 2c 0a 20 20  utine(pParse,.  
1d300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
1d310 2c 20 26 64 65 73 74 42 2c 20 70 44 65 73 74 2c  , &destB, pDest,
1d320 20 72 65 67 4f 75 74 42 2c 0a 20 20 20 20 20 20   regOutB,.      
1d330 20 20 20 20 20 20 20 20 20 20 20 72 65 67 50 72             regPr
1d340 65 76 2c 20 70 4b 65 79 44 75 70 2c 20 6c 61 62  ev, pKeyDup, lab
1d350 65 6c 45 6e 64 29 3b 0a 20 20 7d 0a 20 20 73 71  elEnd);.  }.  sq
1d360 6c 69 74 65 33 4b 65 79 49 6e 66 6f 55 6e 72 65  lite3KeyInfoUnre
1d370 66 28 70 4b 65 79 44 75 70 29 3b 0a 0a 20 20 2f  f(pKeyDup);..  /
1d380 2a 20 47 65 6e 65 72 61 74 65 20 61 20 73 75 62  * Generate a sub
1d390 72 6f 75 74 69 6e 65 20 74 6f 20 72 75 6e 20 77  routine to run w
1d3a0 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74 73 20  hen the results 
1d3b0 66 72 6f 6d 20 73 65 6c 65 63 74 20 41 0a 20 20  from select A.  
1d3c0 2a 2a 20 61 72 65 20 65 78 68 61 75 73 74 65 64  ** are exhausted
1d3d0 20 61 6e 64 20 6f 6e 6c 79 20 64 61 74 61 20 69   and only data i
1d3e0 6e 20 73 65 6c 65 63 74 20 42 20 72 65 6d 61 69  n select B remai
1d3f0 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6f  ns..  */.  if( o
1d400 70 3d 3d 54 4b 5f 45 58 43 45 50 54 20 7c 7c 20  p==TK_EXCEPT || 
1d410 6f 70 3d 3d 54 4b 5f 49 4e 54 45 52 53 45 43 54  op==TK_INTERSECT
1d420 20 29 7b 0a 20 20 20 20 61 64 64 72 45 6f 66 41   ){.    addrEofA
1d430 5f 6e 6f 42 20 3d 20 61 64 64 72 45 6f 66 41 20  _noB = addrEofA 
1d440 3d 20 6c 61 62 65 6c 45 6e 64 3b 0a 20 20 7d 65  = labelEnd;.  }e
1d450 6c 73 65 7b 20 20 0a 20 20 20 20 56 64 62 65 4e  lse{  .    VdbeN
1d460 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  oopComment((v, "
1d470 65 6f 66 2d 41 20 73 75 62 72 6f 75 74 69 6e 65  eof-A subroutine
1d480 22 29 29 3b 0a 20 20 20 20 61 64 64 72 45 6f 66  "));.    addrEof
1d490 41 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  A = sqlite3VdbeA
1d4a0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75  ddOp2(v, OP_Gosu
1d4b0 62 2c 20 72 65 67 4f 75 74 42 2c 20 61 64 64 72  b, regOutB, addr
1d4c0 4f 75 74 42 29 3b 0a 20 20 20 20 61 64 64 72 45  OutB);.    addrE
1d4d0 6f 66 41 5f 6e 6f 42 20 3d 20 73 71 6c 69 74 65  ofA_noB = sqlite
1d4e0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
1d4f0 50 5f 59 69 65 6c 64 2c 20 72 65 67 41 64 64 72  P_Yield, regAddr
1d500 42 2c 20 6c 61 62 65 6c 45 6e 64 29 3b 0a 20 20  B, labelEnd);.  
1d510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d530 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28     VdbeCoverage(
1d540 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  v);.    sqlite3V
1d550 64 62 65 47 6f 74 6f 28 76 2c 20 61 64 64 72 45  dbeGoto(v, addrE
1d560 6f 66 41 29 3b 0a 20 20 20 20 70 2d 3e 6e 53 65  ofA);.    p->nSe
1d570 6c 65 63 74 52 6f 77 20 3d 20 73 71 6c 69 74 65  lectRow = sqlite
1d580 33 4c 6f 67 45 73 74 41 64 64 28 70 2d 3e 6e 53  3LogEstAdd(p->nS
1d590 65 6c 65 63 74 52 6f 77 2c 20 70 50 72 69 6f 72  electRow, pPrior
1d5a0 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 29 3b 0a 20  ->nSelectRow);. 
1d5b0 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74   }..  /* Generat
1d5c0 65 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20 74  e a subroutine t
1d5d0 6f 20 72 75 6e 20 77 68 65 6e 20 74 68 65 20 72  o run when the r
1d5e0 65 73 75 6c 74 73 20 66 72 6f 6d 20 73 65 6c 65  esults from sele
1d5f0 63 74 20 42 0a 20 20 2a 2a 20 61 72 65 20 65 78  ct B.  ** are ex
1d600 68 61 75 73 74 65 64 20 61 6e 64 20 6f 6e 6c 79  hausted and only
1d610 20 64 61 74 61 20 69 6e 20 73 65 6c 65 63 74 20   data in select 
1d620 41 20 72 65 6d 61 69 6e 73 2e 0a 20 20 2a 2f 0a  A remains..  */.
1d630 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 49 4e 54    if( op==TK_INT
1d640 45 52 53 45 43 54 20 29 7b 0a 20 20 20 20 61 64  ERSECT ){.    ad
1d650 64 72 45 6f 66 42 20 3d 20 61 64 64 72 45 6f 66  drEofB = addrEof
1d660 41 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6e 53  A;.    if( p->nS
1d670 65 6c 65 63 74 52 6f 77 20 3e 20 70 50 72 69 6f  electRow > pPrio
1d680 72 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 29 20  r->nSelectRow ) 
1d690 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20  p->nSelectRow = 
1d6a0 70 50 72 69 6f 72 2d 3e 6e 53 65 6c 65 63 74 52  pPrior->nSelectR
1d6b0 6f 77 3b 0a 20 20 7d 65 6c 73 65 7b 20 20 0a 20  ow;.  }else{  . 
1d6c0 20 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65     VdbeNoopComme
1d6d0 6e 74 28 28 76 2c 20 22 65 6f 66 2d 42 20 73 75  nt((v, "eof-B su
1d6e0 62 72 6f 75 74 69 6e 65 22 29 29 3b 0a 20 20 20  broutine"));.   
1d6f0 20 61 64 64 72 45 6f 66 42 20 3d 20 73 71 6c 69   addrEofB = sqli
1d700 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
1d710 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 4f 75   OP_Gosub, regOu
1d720 74 41 2c 20 61 64 64 72 4f 75 74 41 29 3b 0a 20  tA, addrOutA);. 
1d730 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1d740 64 4f 70 32 28 76 2c 20 4f 50 5f 59 69 65 6c 64  dOp2(v, OP_Yield
1d750 2c 20 72 65 67 41 64 64 72 41 2c 20 6c 61 62 65  , regAddrA, labe
1d760 6c 45 6e 64 29 3b 20 56 64 62 65 43 6f 76 65 72  lEnd); VdbeCover
1d770 61 67 65 28 76 29 3b 0a 20 20 20 20 73 71 6c 69  age(v);.    sqli
1d780 74 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 61  te3VdbeGoto(v, a
1d790 64 64 72 45 6f 66 42 29 3b 0a 20 20 7d 0a 0a 20  ddrEofB);.  }.. 
1d7a0 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64   /* Generate cod
1d7b0 65 20 74 6f 20 68 61 6e 64 6c 65 20 74 68 65 20  e to handle the 
1d7c0 63 61 73 65 20 6f 66 20 41 3c 42 0a 20 20 2a 2f  case of A<B.  */
1d7d0 0a 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65  .  VdbeNoopComme
1d7e0 6e 74 28 28 76 2c 20 22 41 2d 6c 74 2d 42 20 73  nt((v, "A-lt-B s
1d7f0 75 62 72 6f 75 74 69 6e 65 22 29 29 3b 0a 20 20  ubroutine"));.  
1d800 61 64 64 72 41 6c 74 42 20 3d 20 73 71 6c 69 74  addrAltB = sqlit
1d810 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
1d820 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 4f 75 74  OP_Gosub, regOut
1d830 41 2c 20 61 64 64 72 4f 75 74 41 29 3b 0a 20 20  A, addrOutA);.  
1d840 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1d850 32 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 72  2(v, OP_Yield, r
1d860 65 67 41 64 64 72 41 2c 20 61 64 64 72 45 6f 66  egAddrA, addrEof
1d870 41 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  A); VdbeCoverage
1d880 28 76 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  (v);.  sqlite3Vd
1d890 62 65 47 6f 74 6f 28 76 2c 20 6c 61 62 65 6c 43  beGoto(v, labelC
1d8a0 6d 70 72 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65  mpr);..  /* Gene
1d8b0 72 61 74 65 20 63 6f 64 65 20 74 6f 20 68 61 6e  rate code to han
1d8c0 64 6c 65 20 74 68 65 20 63 61 73 65 20 6f 66 20  dle the case of 
1d8d0 41 3d 3d 42 0a 20 20 2a 2f 0a 20 20 69 66 28 20  A==B.  */.  if( 
1d8e0 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 29 7b 0a 20 20  op==TK_ALL ){.  
1d8f0 20 20 61 64 64 72 41 65 71 42 20 3d 20 61 64 64    addrAeqB = add
1d900 72 41 6c 74 42 3b 0a 20 20 7d 65 6c 73 65 20 69  rAltB;.  }else i
1d910 66 28 20 6f 70 3d 3d 54 4b 5f 49 4e 54 45 52 53  f( op==TK_INTERS
1d920 45 43 54 20 29 7b 0a 20 20 20 20 61 64 64 72 41  ECT ){.    addrA
1d930 65 71 42 20 3d 20 61 64 64 72 41 6c 74 42 3b 0a  eqB = addrAltB;.
1d940 20 20 20 20 61 64 64 72 41 6c 74 42 2b 2b 3b 0a      addrAltB++;.
1d950 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 56 64 62    }else{.    Vdb
1d960 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c  eNoopComment((v,
1d970 20 22 41 2d 65 71 2d 42 20 73 75 62 72 6f 75 74   "A-eq-B subrout
1d980 69 6e 65 22 29 29 3b 0a 20 20 20 20 61 64 64 72  ine"));.    addr
1d990 41 65 71 42 20 3d 0a 20 20 20 20 73 71 6c 69 74  AeqB =.    sqlit
1d9a0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
1d9b0 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67 41 64 64  OP_Yield, regAdd
1d9c0 72 41 2c 20 61 64 64 72 45 6f 66 41 29 3b 20 56  rA, addrEofA); V
1d9d0 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
1d9e0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 47      sqlite3VdbeG
1d9f0 6f 74 6f 28 76 2c 20 6c 61 62 65 6c 43 6d 70 72  oto(v, labelCmpr
1da00 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e  );.  }..  /* Gen
1da10 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 68 61  erate code to ha
1da20 6e 64 6c 65 20 74 68 65 20 63 61 73 65 20 6f 66  ndle the case of
1da30 20 41 3e 42 0a 20 20 2a 2f 0a 20 20 56 64 62 65   A>B.  */.  Vdbe
1da40 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  NoopComment((v, 
1da50 22 41 2d 67 74 2d 42 20 73 75 62 72 6f 75 74 69  "A-gt-B subrouti
1da60 6e 65 22 29 29 3b 0a 20 20 61 64 64 72 41 67 74  ne"));.  addrAgt
1da70 42 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  B = sqlite3VdbeC
1da80 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20  urrentAddr(v);. 
1da90 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 41 4c 4c 20   if( op==TK_ALL 
1daa0 7c 7c 20 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20  || op==TK_UNION 
1dab0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
1dac0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47  beAddOp2(v, OP_G
1dad0 6f 73 75 62 2c 20 72 65 67 4f 75 74 42 2c 20 61  osub, regOutB, a
1dae0 64 64 72 4f 75 74 42 29 3b 0a 20 20 7d 0a 20 20  ddrOutB);.  }.  
1daf0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1db00 32 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 72  2(v, OP_Yield, r
1db10 65 67 41 64 64 72 42 2c 20 61 64 64 72 45 6f 66  egAddrB, addrEof
1db20 42 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  B); VdbeCoverage
1db30 28 76 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  (v);.  sqlite3Vd
1db40 62 65 47 6f 74 6f 28 76 2c 20 6c 61 62 65 6c 43  beGoto(v, labelC
1db50 6d 70 72 29 3b 0a 0a 20 20 2f 2a 20 54 68 69 73  mpr);..  /* This
1db60 20 63 6f 64 65 20 72 75 6e 73 20 6f 6e 63 65 20   code runs once 
1db70 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20 65 76  to initialize ev
1db80 65 72 79 74 68 69 6e 67 2e 0a 20 20 2a 2f 0a 20  erything..  */. 
1db90 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
1dba0 48 65 72 65 28 76 2c 20 61 64 64 72 31 29 3b 0a  Here(v, addr1);.
1dbb0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1dbc0 4f 70 32 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c  Op2(v, OP_Yield,
1dbd0 20 72 65 67 41 64 64 72 41 2c 20 61 64 64 72 45   regAddrA, addrE
1dbe0 6f 66 41 5f 6e 6f 42 29 3b 20 56 64 62 65 43 6f  ofA_noB); VdbeCo
1dbf0 76 65 72 61 67 65 28 76 29 3b 0a 20 20 73 71 6c  verage(v);.  sql
1dc00 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
1dc10 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67 41  , OP_Yield, regA
1dc20 64 64 72 42 2c 20 61 64 64 72 45 6f 66 42 29 3b  ddrB, addrEofB);
1dc30 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
1dc40 3b 0a 0a 20 20 2f 2a 20 49 6d 70 6c 65 6d 65 6e  ;..  /* Implemen
1dc50 74 20 74 68 65 20 6d 61 69 6e 20 6d 65 72 67 65  t the main merge
1dc60 20 6c 6f 6f 70 0a 20 20 2a 2f 0a 20 20 73 71 6c   loop.  */.  sql
1dc70 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
1dc80 61 62 65 6c 28 76 2c 20 6c 61 62 65 6c 43 6d 70  abel(v, labelCmp
1dc90 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  r);.  sqlite3Vdb
1dca0 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 50 65  eAddOp4(v, OP_Pe
1dcb0 72 6d 75 74 61 74 69 6f 6e 2c 20 30 2c 20 30 2c  rmutation, 0, 0,
1dcc0 20 30 2c 20 28 63 68 61 72 2a 29 61 50 65 72 6d   0, (char*)aPerm
1dcd0 75 74 65 2c 20 50 34 5f 49 4e 54 41 52 52 41 59  ute, P4_INTARRAY
1dce0 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
1dcf0 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 43 6f 6d  AddOp4(v, OP_Com
1dd00 70 61 72 65 2c 20 64 65 73 74 41 2e 69 53 64 73  pare, destA.iSds
1dd10 74 2c 20 64 65 73 74 42 2e 69 53 64 73 74 2c 20  t, destB.iSdst, 
1dd20 6e 4f 72 64 65 72 42 79 2c 0a 20 20 20 20 20 20  nOrderBy,.      
1dd30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dd40 20 20 20 28 63 68 61 72 2a 29 70 4b 65 79 4d 65     (char*)pKeyMe
1dd50 72 67 65 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29  rge, P4_KEYINFO)
1dd60 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 43  ;.  sqlite3VdbeC
1dd70 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41  hangeP5(v, OPFLA
1dd80 47 5f 50 45 52 4d 55 54 45 29 3b 0a 20 20 73 71  G_PERMUTE);.  sq
1dd90 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
1dda0 76 2c 20 4f 50 5f 4a 75 6d 70 2c 20 61 64 64 72  v, OP_Jump, addr
1ddb0 41 6c 74 42 2c 20 61 64 64 72 41 65 71 42 2c 20  AltB, addrAeqB, 
1ddc0 61 64 64 72 41 67 74 42 29 3b 20 56 64 62 65 43  addrAgtB); VdbeC
1ddd0 6f 76 65 72 61 67 65 28 76 29 3b 0a 0a 20 20 2f  overage(v);..  /
1dde0 2a 20 4a 75 6d 70 20 74 6f 20 74 68 65 20 74 68  * Jump to the th
1ddf0 69 73 20 70 6f 69 6e 74 20 69 6e 20 6f 72 64 65  is point in orde
1de00 72 20 74 6f 20 74 65 72 6d 69 6e 61 74 65 20 74  r to terminate t
1de10 68 65 20 71 75 65 72 79 2e 0a 20 20 2a 2f 0a 20  he query..  */. 
1de20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
1de30 6c 76 65 4c 61 62 65 6c 28 76 2c 20 6c 61 62 65  lveLabel(v, labe
1de40 6c 45 6e 64 29 3b 0a 0a 20 20 2f 2a 20 52 65 61  lEnd);..  /* Rea
1de50 73 73 65 6d 62 6c 79 20 74 68 65 20 63 6f 6d 70  ssembly the comp
1de60 6f 75 6e 64 20 71 75 65 72 79 20 73 6f 20 74 68  ound query so th
1de70 61 74 20 69 74 20 77 69 6c 6c 20 62 65 20 66 72  at it will be fr
1de80 65 65 64 20 63 6f 72 72 65 63 74 6c 79 0a 20 20  eed correctly.  
1de90 2a 2a 20 62 79 20 74 68 65 20 63 61 6c 6c 69 6e  ** by the callin
1dea0 67 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20  g function */.  
1deb0 69 66 28 20 70 2d 3e 70 50 72 69 6f 72 20 29 7b  if( p->pPrior ){
1dec0 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65  .    sqlite3Sele
1ded0 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e  ctDelete(db, p->
1dee0 70 50 72 69 6f 72 29 3b 0a 20 20 7d 0a 20 20 70  pPrior);.  }.  p
1def0 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50 72 69 6f  ->pPrior = pPrio
1df00 72 3b 0a 20 20 70 50 72 69 6f 72 2d 3e 70 4e 65  r;.  pPrior->pNe
1df10 78 74 20 3d 20 70 3b 0a 0a 20 20 2f 2a 2a 2a 20  xt = p;..  /*** 
1df20 54 42 44 3a 20 20 49 6e 73 65 72 74 20 73 75 62  TBD:  Insert sub
1df30 72 6f 75 74 69 6e 65 20 63 61 6c 6c 73 20 74 6f  routine calls to
1df40 20 63 6c 6f 73 65 20 63 75 72 73 6f 72 73 20 6f   close cursors o
1df50 6e 20 69 6e 63 6f 6d 70 6c 65 74 65 0a 20 20 2a  n incomplete.  *
1df60 2a 2a 2a 20 73 75 62 71 75 65 72 69 65 73 20 2a  *** subqueries *
1df70 2a 2a 2a 2f 0a 20 20 45 78 70 6c 61 69 6e 51 75  ***/.  ExplainQu
1df80 65 72 79 50 6c 61 6e 50 6f 70 28 70 50 61 72 73  eryPlanPop(pPars
1df90 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 50 61  e);.  return pPa
1dfa0 72 73 65 2d 3e 6e 45 72 72 21 3d 30 3b 0a 7d 0a  rse->nErr!=0;.}.
1dfb0 23 65 6e 64 69 66 0a 0a 23 69 66 20 21 64 65 66  #endif..#if !def
1dfc0 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
1dfd0 5f 53 55 42 51 55 45 52 59 29 20 7c 7c 20 21 64  _SUBQUERY) || !d
1dfe0 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
1dff0 49 54 5f 56 49 45 57 29 0a 0a 2f 2a 20 41 6e 20  IT_VIEW)../* An 
1e000 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20  instance of the 
1e010 53 75 62 73 74 43 6f 6e 74 65 78 74 20 6f 62 6a  SubstContext obj
1e020 65 63 74 20 64 65 73 63 72 69 62 65 73 20 61 6e  ect describes an
1e030 20 73 75 62 73 74 69 74 75 74 69 6f 6e 20 65 64   substitution ed
1e040 69 74 0a 2a 2a 20 74 6f 20 62 65 20 70 65 72 66  it.** to be perf
1e050 6f 72 6d 65 64 20 6f 6e 20 61 20 70 61 72 73 65  ormed on a parse
1e060 20 74 72 65 65 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c   tree..**.** All
1e070 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 63   references to c
1e080 6f 6c 75 6d 6e 73 20 69 6e 20 74 61 62 6c 65 20  olumns in table 
1e090 69 54 61 62 6c 65 20 61 72 65 20 74 6f 20 62 65  iTable are to be
1e0a0 20 72 65 70 6c 61 63 65 64 20 62 79 20 63 6f 72   replaced by cor
1e0b0 72 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20 65 78  responding.** ex
1e0c0 70 72 65 73 73 69 6f 6e 73 20 69 6e 20 70 45 4c  pressions in pEL
1e0d0 69 73 74 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20  ist..*/.typedef 
1e0e0 73 74 72 75 63 74 20 53 75 62 73 74 43 6f 6e 74  struct SubstCont
1e0f0 65 78 74 20 7b 0a 20 20 50 61 72 73 65 20 2a 70  ext {.  Parse *p
1e100 50 61 72 73 65 3b 20 20 20 20 20 20 20 20 20 20  Parse;          
1e110 20 20 2f 2a 20 54 68 65 20 70 61 72 73 69 6e 67    /* The parsing
1e120 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e   context */.  in
1e130 74 20 69 54 61 62 6c 65 3b 20 20 20 20 20 20 20  t iTable;       
1e140 20 20 20 20 20 20 20 20 2f 2a 20 52 65 70 6c 61          /* Repla
1e150 63 65 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f  ce references to
1e160 20 74 68 69 73 20 74 61 62 6c 65 20 2a 2f 0a 20   this table */. 
1e170 20 69 6e 74 20 69 4e 65 77 54 61 62 6c 65 3b 20   int iNewTable; 
1e180 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65             /* Ne
1e190 77 20 74 61 62 6c 65 20 6e 75 6d 62 65 72 20 2a  w table number *
1e1a0 2f 0a 20 20 69 6e 74 20 69 73 4c 65 66 74 4a 6f  /.  int isLeftJo
1e1b0 69 6e 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  in;           /*
1e1c0 20 41 64 64 20 54 4b 5f 49 46 5f 4e 55 4c 4c 5f   Add TK_IF_NULL_
1e1d0 52 4f 57 20 6f 70 63 6f 64 65 73 20 6f 6e 20 65  ROW opcodes on e
1e1e0 61 63 68 20 72 65 70 6c 61 63 65 6d 65 6e 74 20  ach replacement 
1e1f0 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
1e200 45 4c 69 73 74 3b 20 20 20 20 20 20 20 20 20 2f  EList;         /
1e210 2a 20 52 65 70 6c 61 63 65 6d 65 6e 74 20 65 78  * Replacement ex
1e220 70 72 65 73 73 69 6f 6e 73 20 2a 2f 0a 7d 20 53  pressions */.} S
1e230 75 62 73 74 43 6f 6e 74 65 78 74 3b 0a 0a 2f 2a  ubstContext;../*
1e240 20 46 6f 72 77 61 72 64 20 44 65 63 6c 61 72 61   Forward Declara
1e250 74 69 6f 6e 73 20 2a 2f 0a 73 74 61 74 69 63 20  tions */.static 
1e260 76 6f 69 64 20 73 75 62 73 74 45 78 70 72 4c 69  void substExprLi
1e270 73 74 28 53 75 62 73 74 43 6f 6e 74 65 78 74 2a  st(SubstContext*
1e280 2c 20 45 78 70 72 4c 69 73 74 2a 29 3b 0a 73 74  , ExprList*);.st
1e290 61 74 69 63 20 76 6f 69 64 20 73 75 62 73 74 53  atic void substS
1e2a0 65 6c 65 63 74 28 53 75 62 73 74 43 6f 6e 74 65  elect(SubstConte
1e2b0 78 74 2a 2c 20 53 65 6c 65 63 74 2a 2c 20 69 6e  xt*, Select*, in
1e2c0 74 29 3b 0a 0a 2f 2a 0a 2a 2a 20 53 63 61 6e 20  t);../*.** Scan 
1e2d0 74 68 72 6f 75 67 68 20 74 68 65 20 65 78 70 72  through the expr
1e2e0 65 73 73 69 6f 6e 20 70 45 78 70 72 2e 20 20 52  ession pExpr.  R
1e2f0 65 70 6c 61 63 65 20 65 76 65 72 79 20 72 65 66  eplace every ref
1e300 65 72 65 6e 63 65 20 74 6f 0a 2a 2a 20 61 20 63  erence to.** a c
1e310 6f 6c 75 6d 6e 20 69 6e 20 74 61 62 6c 65 20 6e  olumn in table n
1e320 75 6d 62 65 72 20 69 54 61 62 6c 65 20 77 69 74  umber iTable wit
1e330 68 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20  h a copy of the 
1e340 69 43 6f 6c 75 6d 6e 2d 74 68 0a 2a 2a 20 65 6e  iColumn-th.** en
1e350 74 72 79 20 69 6e 20 70 45 4c 69 73 74 2e 20 20  try in pEList.  
1e360 28 42 75 74 20 6c 65 61 76 65 20 72 65 66 65 72  (But leave refer
1e370 65 6e 63 65 73 20 74 6f 20 74 68 65 20 52 4f 57  ences to the ROW
1e380 49 44 20 63 6f 6c 75 6d 6e 20 0a 2a 2a 20 75 6e  ID column .** un
1e390 63 68 61 6e 67 65 64 2e 29 0a 2a 2a 0a 2a 2a 20  changed.).**.** 
1e3a0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
1e3b0 70 61 72 74 20 6f 66 20 74 68 65 20 66 6c 61 74  part of the flat
1e3c0 74 65 6e 69 6e 67 20 70 72 6f 63 65 64 75 72 65  tening procedure
1e3d0 2e 20 20 41 20 73 75 62 71 75 65 72 79 0a 2a 2a  .  A subquery.**
1e3e0 20 77 68 6f 73 65 20 72 65 73 75 6c 74 20 73 65   whose result se
1e3f0 74 20 69 73 20 64 65 66 69 6e 65 64 20 62 79 20  t is defined by 
1e400 70 45 4c 69 73 74 20 61 70 70 65 61 72 73 20 61  pEList appears a
1e410 73 20 65 6e 74 72 79 20 69 6e 20 74 68 65 0a 2a  s entry in the.*
1e420 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66  * FROM clause of
1e430 20 61 20 53 45 4c 45 43 54 20 73 75 63 68 20 74   a SELECT such t
1e440 68 61 74 20 74 68 65 20 56 44 42 45 20 63 75 72  hat the VDBE cur
1e450 73 6f 72 20 61 73 73 69 67 6e 65 64 20 74 6f 20  sor assigned to 
1e460 74 68 61 74 0a 2a 2a 20 46 4f 52 4d 20 63 6c 61  that.** FORM cla
1e470 75 73 65 20 65 6e 74 72 79 20 69 73 20 69 54 61  use entry is iTa
1e480 62 6c 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69  ble.  This routi
1e490 6e 65 20 6d 61 6b 65 73 20 74 68 65 20 6e 65 63  ne makes the nec
1e4a0 65 73 73 61 72 79 20 0a 2a 2a 20 63 68 61 6e 67  essary .** chang
1e4b0 65 73 20 74 6f 20 70 45 78 70 72 20 73 6f 20 74  es to pExpr so t
1e4c0 68 61 74 20 69 74 20 72 65 66 65 72 73 20 64 69  hat it refers di
1e4d0 72 65 63 74 6c 79 20 74 6f 20 74 68 65 20 73 6f  rectly to the so
1e4e0 75 72 63 65 20 74 61 62 6c 65 0a 2a 2a 20 6f 66  urce table.** of
1e4f0 20 74 68 65 20 73 75 62 71 75 65 72 79 20 72 61   the subquery ra
1e500 74 68 65 72 20 74 68 65 20 72 65 73 75 6c 74 20  ther the result 
1e510 73 65 74 20 6f 66 20 74 68 65 20 73 75 62 71 75  set of the subqu
1e520 65 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 45  ery..*/.static E
1e530 78 70 72 20 2a 73 75 62 73 74 45 78 70 72 28 0a  xpr *substExpr(.
1e540 20 20 53 75 62 73 74 43 6f 6e 74 65 78 74 20 2a    SubstContext *
1e550 70 53 75 62 73 74 2c 20 20 2f 2a 20 44 65 73 63  pSubst,  /* Desc
1e560 72 69 70 74 69 6f 6e 20 6f 66 20 74 68 65 20 73  ription of the s
1e570 75 62 73 74 69 74 75 74 69 6f 6e 20 2a 2f 0a 20  ubstitution */. 
1e580 20 45 78 70 72 20 2a 70 45 78 70 72 20 20 20 20   Expr *pExpr    
1e590 20 20 20 20 20 20 20 20 2f 2a 20 45 78 70 72 20          /* Expr 
1e5a0 69 6e 20 77 68 69 63 68 20 73 75 62 73 74 69 74  in which substit
1e5b0 75 74 69 6f 6e 20 6f 63 63 75 72 73 20 2a 2f 0a  ution occurs */.
1e5c0 29 7b 0a 20 20 69 66 28 20 70 45 78 70 72 3d 3d  ){.  if( pExpr==
1e5d0 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
1e5e0 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65  if( ExprHasPrope
1e5f0 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 46 72  rty(pExpr, EP_Fr
1e600 6f 6d 4a 6f 69 6e 29 0a 20 20 20 26 26 20 70 45  omJoin).   && pE
1e610 78 70 72 2d 3e 69 52 69 67 68 74 4a 6f 69 6e 54  xpr->iRightJoinT
1e620 61 62 6c 65 3d 3d 70 53 75 62 73 74 2d 3e 69 54  able==pSubst->iT
1e630 61 62 6c 65 0a 20 20 29 7b 0a 20 20 20 20 70 45  able.  ){.    pE
1e640 78 70 72 2d 3e 69 52 69 67 68 74 4a 6f 69 6e 54  xpr->iRightJoinT
1e650 61 62 6c 65 20 3d 20 70 53 75 62 73 74 2d 3e 69  able = pSubst->i
1e660 4e 65 77 54 61 62 6c 65 3b 0a 20 20 7d 0a 20 20  NewTable;.  }.  
1e670 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  if( pExpr->op==T
1e680 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20 70 45 78 70  K_COLUMN && pExp
1e690 72 2d 3e 69 54 61 62 6c 65 3d 3d 70 53 75 62 73  r->iTable==pSubs
1e6a0 74 2d 3e 69 54 61 62 6c 65 20 29 7b 0a 20 20 20  t->iTable ){.   
1e6b0 20 69 66 28 20 70 45 78 70 72 2d 3e 69 43 6f 6c   if( pExpr->iCol
1e6c0 75 6d 6e 3c 30 20 29 7b 0a 20 20 20 20 20 20 70  umn<0 ){.      p
1e6d0 45 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 4e 55  Expr->op = TK_NU
1e6e0 4c 4c 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  LL;.    }else{. 
1e6f0 20 20 20 20 20 45 78 70 72 20 2a 70 4e 65 77 3b       Expr *pNew;
1e700 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 43 6f  .      Expr *pCo
1e710 70 79 20 3d 20 70 53 75 62 73 74 2d 3e 70 45 4c  py = pSubst->pEL
1e720 69 73 74 2d 3e 61 5b 70 45 78 70 72 2d 3e 69 43  ist->a[pExpr->iC
1e730 6f 6c 75 6d 6e 5d 2e 70 45 78 70 72 3b 0a 20 20  olumn].pExpr;.  
1e740 20 20 20 20 45 78 70 72 20 69 66 4e 75 6c 6c 52      Expr ifNullR
1e750 6f 77 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  ow;.      assert
1e760 28 20 70 53 75 62 73 74 2d 3e 70 45 4c 69 73 74  ( pSubst->pEList
1e770 21 3d 30 20 26 26 20 70 45 78 70 72 2d 3e 69 43  !=0 && pExpr->iC
1e780 6f 6c 75 6d 6e 3c 70 53 75 62 73 74 2d 3e 70 45  olumn<pSubst->pE
1e790 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 3b 0a 20  List->nExpr );. 
1e7a0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78       assert( pEx
1e7b0 70 72 2d 3e 70 52 69 67 68 74 3d 3d 30 20 29 3b  pr->pRight==0 );
1e7c0 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
1e7d0 65 33 45 78 70 72 49 73 56 65 63 74 6f 72 28 70  e3ExprIsVector(p
1e7e0 43 6f 70 79 29 20 29 7b 0a 20 20 20 20 20 20 20  Copy) ){.       
1e7f0 20 73 71 6c 69 74 65 33 56 65 63 74 6f 72 45 72   sqlite3VectorEr
1e800 72 6f 72 4d 73 67 28 70 53 75 62 73 74 2d 3e 70  rorMsg(pSubst->p
1e810 50 61 72 73 65 2c 20 70 43 6f 70 79 29 3b 0a 20  Parse, pCopy);. 
1e820 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1e830 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20      sqlite3 *db 
1e840 3d 20 70 53 75 62 73 74 2d 3e 70 50 61 72 73 65  = pSubst->pParse
1e850 2d 3e 64 62 3b 0a 20 20 20 20 20 20 20 20 69 66  ->db;.        if
1e860 28 20 70 53 75 62 73 74 2d 3e 69 73 4c 65 66 74  ( pSubst->isLeft
1e870 4a 6f 69 6e 20 26 26 20 70 43 6f 70 79 2d 3e 6f  Join && pCopy->o
1e880 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 7b 0a  p!=TK_COLUMN ){.
1e890 20 20 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74            memset
1e8a0 28 26 69 66 4e 75 6c 6c 52 6f 77 2c 20 30 2c 20  (&ifNullRow, 0, 
1e8b0 73 69 7a 65 6f 66 28 69 66 4e 75 6c 6c 52 6f 77  sizeof(ifNullRow
1e8c0 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  ));.          if
1e8d0 4e 75 6c 6c 52 6f 77 2e 6f 70 20 3d 20 54 4b 5f  NullRow.op = TK_
1e8e0 49 46 5f 4e 55 4c 4c 5f 52 4f 57 3b 0a 20 20 20  IF_NULL_ROW;.   
1e8f0 20 20 20 20 20 20 20 69 66 4e 75 6c 6c 52 6f 77         ifNullRow
1e900 2e 70 4c 65 66 74 20 3d 20 70 43 6f 70 79 3b 0a  .pLeft = pCopy;.
1e910 20 20 20 20 20 20 20 20 20 20 69 66 4e 75 6c 6c            ifNull
1e920 52 6f 77 2e 69 54 61 62 6c 65 20 3d 20 70 53 75  Row.iTable = pSu
1e930 62 73 74 2d 3e 69 4e 65 77 54 61 62 6c 65 3b 0a  bst->iNewTable;.
1e940 20 20 20 20 20 20 20 20 20 20 70 43 6f 70 79 20            pCopy 
1e950 3d 20 26 69 66 4e 75 6c 6c 52 6f 77 3b 0a 20 20  = &ifNullRow;.  
1e960 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1e970 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 45 78  pNew = sqlite3Ex
1e980 70 72 44 75 70 28 64 62 2c 20 70 43 6f 70 79 2c  prDup(db, pCopy,
1e990 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28   0);.        if(
1e9a0 20 70 4e 65 77 20 26 26 20 70 53 75 62 73 74 2d   pNew && pSubst-
1e9b0 3e 69 73 4c 65 66 74 4a 6f 69 6e 20 29 7b 0a 20  >isLeftJoin ){. 
1e9c0 20 20 20 20 20 20 20 20 20 45 78 70 72 53 65 74           ExprSet
1e9d0 50 72 6f 70 65 72 74 79 28 70 4e 65 77 2c 20 45  Property(pNew, E
1e9e0 50 5f 43 61 6e 42 65 4e 75 6c 6c 29 3b 0a 20 20  P_CanBeNull);.  
1e9f0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1ea00 69 66 28 20 70 4e 65 77 20 26 26 20 45 78 70 72  if( pNew && Expr
1ea10 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
1ea20 72 2c 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29  r,EP_FromJoin) )
1ea30 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4e 65 77  {.          pNew
1ea40 2d 3e 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c  ->iRightJoinTabl
1ea50 65 20 3d 20 70 45 78 70 72 2d 3e 69 52 69 67 68  e = pExpr->iRigh
1ea60 74 4a 6f 69 6e 54 61 62 6c 65 3b 0a 20 20 20 20  tJoinTable;.    
1ea70 20 20 20 20 20 20 45 78 70 72 53 65 74 50 72 6f        ExprSetPro
1ea80 70 65 72 74 79 28 70 4e 65 77 2c 20 45 50 5f 46  perty(pNew, EP_F
1ea90 72 6f 6d 4a 6f 69 6e 29 3b 0a 20 20 20 20 20 20  romJoin);.      
1eaa0 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69    }.        sqli
1eab0 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62  te3ExprDelete(db
1eac0 2c 20 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20  , pExpr);.      
1ead0 20 20 70 45 78 70 72 20 3d 20 70 4e 65 77 3b 0a    pExpr = pNew;.
1eae0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
1eaf0 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66 28 20 70  }else{.    if( p
1eb00 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 46 5f  Expr->op==TK_IF_
1eb10 4e 55 4c 4c 5f 52 4f 57 20 26 26 20 70 45 78 70  NULL_ROW && pExp
1eb20 72 2d 3e 69 54 61 62 6c 65 3d 3d 70 53 75 62 73  r->iTable==pSubs
1eb30 74 2d 3e 69 54 61 62 6c 65 20 29 7b 0a 20 20 20  t->iTable ){.   
1eb40 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65     pExpr->iTable
1eb50 20 3d 20 70 53 75 62 73 74 2d 3e 69 4e 65 77 54   = pSubst->iNewT
1eb60 61 62 6c 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20  able;.    }.    
1eb70 70 45 78 70 72 2d 3e 70 4c 65 66 74 20 3d 20 73  pExpr->pLeft = s
1eb80 75 62 73 74 45 78 70 72 28 70 53 75 62 73 74 2c  ubstExpr(pSubst,
1eb90 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a   pExpr->pLeft);.
1eba0 20 20 20 20 70 45 78 70 72 2d 3e 70 52 69 67 68      pExpr->pRigh
1ebb0 74 20 3d 20 73 75 62 73 74 45 78 70 72 28 70 53  t = substExpr(pS
1ebc0 75 62 73 74 2c 20 70 45 78 70 72 2d 3e 70 52 69  ubst, pExpr->pRi
1ebd0 67 68 74 29 3b 0a 20 20 20 20 69 66 28 20 45 78  ght);.    if( Ex
1ebe0 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
1ebf0 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63  xpr, EP_xIsSelec
1ec00 74 29 20 29 7b 0a 20 20 20 20 20 20 73 75 62 73  t) ){.      subs
1ec10 74 53 65 6c 65 63 74 28 70 53 75 62 73 74 2c 20  tSelect(pSubst, 
1ec20 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74  pExpr->x.pSelect
1ec30 2c 20 31 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  , 1);.    }else{
1ec40 0a 20 20 20 20 20 20 73 75 62 73 74 45 78 70 72  .      substExpr
1ec50 4c 69 73 74 28 70 53 75 62 73 74 2c 20 70 45 78  List(pSubst, pEx
1ec60 70 72 2d 3e 78 2e 70 4c 69 73 74 29 3b 0a 20 20  pr->x.pList);.  
1ec70 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
1ec80 20 70 45 78 70 72 3b 0a 7d 0a 73 74 61 74 69 63   pExpr;.}.static
1ec90 20 76 6f 69 64 20 73 75 62 73 74 45 78 70 72 4c   void substExprL
1eca0 69 73 74 28 0a 20 20 53 75 62 73 74 43 6f 6e 74  ist(.  SubstCont
1ecb0 65 78 74 20 2a 70 53 75 62 73 74 2c 20 2f 2a 20  ext *pSubst, /* 
1ecc0 44 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 74  Description of t
1ecd0 68 65 20 73 75 62 73 74 69 74 75 74 69 6f 6e 20  he substitution 
1ece0 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
1ecf0 4c 69 73 74 20 20 20 20 20 20 20 2f 2a 20 4c 69  List       /* Li
1ed00 73 74 20 74 6f 20 73 63 61 6e 20 61 6e 64 20 69  st to scan and i
1ed10 6e 20 77 68 69 63 68 20 74 6f 20 6d 61 6b 65 20  n which to make 
1ed20 73 75 62 73 74 69 74 75 74 65 73 20 2a 2f 0a 29  substitutes */.)
1ed30 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28  {.  int i;.  if(
1ed40 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75   pList==0 ) retu
1ed50 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  rn;.  for(i=0; i
1ed60 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69  <pList->nExpr; i
1ed70 2b 2b 29 7b 0a 20 20 20 20 70 4c 69 73 74 2d 3e  ++){.    pList->
1ed80 61 5b 69 5d 2e 70 45 78 70 72 20 3d 20 73 75 62  a[i].pExpr = sub
1ed90 73 74 45 78 70 72 28 70 53 75 62 73 74 2c 20 70  stExpr(pSubst, p
1eda0 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  List->a[i].pExpr
1edb0 29 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20  );.  }.}.static 
1edc0 76 6f 69 64 20 73 75 62 73 74 53 65 6c 65 63 74  void substSelect
1edd0 28 0a 20 20 53 75 62 73 74 43 6f 6e 74 65 78 74  (.  SubstContext
1ede0 20 2a 70 53 75 62 73 74 2c 20 2f 2a 20 44 65 73   *pSubst, /* Des
1edf0 63 72 69 70 74 69 6f 6e 20 6f 66 20 74 68 65 20  cription of the 
1ee00 73 75 62 73 74 69 74 75 74 69 6f 6e 20 2a 2f 0a  substitution */.
1ee10 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20    Select *p,    
1ee20 20 20 20 20 20 20 20 20 2f 2a 20 53 45 4c 45 43          /* SELEC
1ee30 54 20 73 74 61 74 65 6d 65 6e 74 20 69 6e 20 77  T statement in w
1ee40 68 69 63 68 20 74 6f 20 6d 61 6b 65 20 73 75 62  hich to make sub
1ee50 73 74 69 74 75 74 69 6f 6e 73 20 2a 2f 0a 20 20  stitutions */.  
1ee60 69 6e 74 20 64 6f 50 72 69 6f 72 20 20 20 20 20  int doPrior     
1ee70 20 20 20 20 20 20 2f 2a 20 44 6f 20 73 75 62 73        /* Do subs
1ee80 74 69 74 75 74 65 73 20 6f 6e 20 70 2d 3e 70 50  titutes on p->pP
1ee90 72 69 6f 72 20 74 6f 6f 20 2a 2f 0a 29 7b 0a 20  rior too */.){. 
1eea0 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63 3b 0a   SrcList *pSrc;.
1eeb0 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
1eec0 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20  _item *pItem;.  
1eed0 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 21 70 20  int i;.  if( !p 
1eee0 29 20 72 65 74 75 72 6e 3b 0a 20 20 64 6f 7b 0a  ) return;.  do{.
1eef0 20 20 20 20 73 75 62 73 74 45 78 70 72 4c 69 73      substExprLis
1ef00 74 28 70 53 75 62 73 74 2c 20 70 2d 3e 70 45 4c  t(pSubst, p->pEL
1ef10 69 73 74 29 3b 0a 20 20 20 20 73 75 62 73 74 45  ist);.    substE
1ef20 78 70 72 4c 69 73 74 28 70 53 75 62 73 74 2c 20  xprList(pSubst, 
1ef30 70 2d 3e 70 47 72 6f 75 70 42 79 29 3b 0a 20 20  p->pGroupBy);.  
1ef40 20 20 73 75 62 73 74 45 78 70 72 4c 69 73 74 28    substExprList(
1ef50 70 53 75 62 73 74 2c 20 70 2d 3e 70 4f 72 64 65  pSubst, p->pOrde
1ef60 72 42 79 29 3b 0a 20 20 20 20 70 2d 3e 70 48 61  rBy);.    p->pHa
1ef70 76 69 6e 67 20 3d 20 73 75 62 73 74 45 78 70 72  ving = substExpr
1ef80 28 70 53 75 62 73 74 2c 20 70 2d 3e 70 48 61 76  (pSubst, p->pHav
1ef90 69 6e 67 29 3b 0a 20 20 20 20 70 2d 3e 70 57 68  ing);.    p->pWh
1efa0 65 72 65 20 3d 20 73 75 62 73 74 45 78 70 72 28  ere = substExpr(
1efb0 70 53 75 62 73 74 2c 20 70 2d 3e 70 57 68 65 72  pSubst, p->pWher
1efc0 65 29 3b 0a 20 20 20 20 70 53 72 63 20 3d 20 70  e);.    pSrc = p
1efd0 2d 3e 70 53 72 63 3b 0a 20 20 20 20 61 73 73 65  ->pSrc;.    asse
1efe0 72 74 28 20 70 53 72 63 21 3d 30 20 29 3b 0a 20  rt( pSrc!=0 );. 
1eff0 20 20 20 66 6f 72 28 69 3d 70 53 72 63 2d 3e 6e     for(i=pSrc->n
1f000 53 72 63 2c 20 70 49 74 65 6d 3d 70 53 72 63 2d  Src, pItem=pSrc-
1f010 3e 61 3b 20 69 3e 30 3b 20 69 2d 2d 2c 20 70 49  >a; i>0; i--, pI
1f020 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 73 75  tem++){.      su
1f030 62 73 74 53 65 6c 65 63 74 28 70 53 75 62 73 74  bstSelect(pSubst
1f040 2c 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74  , pItem->pSelect
1f050 2c 20 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 1);.      if( 
1f060 70 49 74 65 6d 2d 3e 66 67 2e 69 73 54 61 62 46  pItem->fg.isTabF
1f070 75 6e 63 20 29 7b 0a 20 20 20 20 20 20 20 20 73  unc ){.        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 49 74 65 6d 2d 3e 75 31 2e 70  bst, pItem->u1.p
1f0a0 46 75 6e 63 41 72 67 29 3b 0a 20 20 20 20 20 20  FuncArg);.      
1f0b0 7d 0a 20 20 20 20 7d 0a 20 20 7d 77 68 69 6c 65  }.    }.  }while
1f0c0 28 20 64 6f 50 72 69 6f 72 20 26 26 20 28 70 20  ( doPrior && (p 
1f0d0 3d 20 70 2d 3e 70 50 72 69 6f 72 29 21 3d 30 20  = p->pPrior)!=0 
1f0e0 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21  );.}.#endif /* !
1f0f0 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
1f100 4d 49 54 5f 53 55 42 51 55 45 52 59 29 20 7c 7c  MIT_SUBQUERY) ||
1f110 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
1f120 5f 4f 4d 49 54 5f 56 49 45 57 29 20 2a 2f 0a 0a  _OMIT_VIEW) */..
1f130 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
1f140 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
1f150 59 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53  Y) || !defined(S
1f160 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29  QLITE_OMIT_VIEW)
1f170 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
1f180 69 6e 65 20 61 74 74 65 6d 70 74 73 20 74 6f 20  ine attempts to 
1f190 66 6c 61 74 74 65 6e 20 73 75 62 71 75 65 72 69  flatten subqueri
1f1a0 65 73 20 61 73 20 61 20 70 65 72 66 6f 72 6d 61  es as a performa
1f1b0 6e 63 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  nce optimization
1f1c0 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  ..** This routin
1f1d0 65 20 72 65 74 75 72 6e 73 20 31 20 69 66 20 69  e returns 1 if i
1f1e0 74 20 6d 61 6b 65 73 20 63 68 61 6e 67 65 73 20  t makes changes 
1f1f0 61 6e 64 20 30 20 69 66 20 6e 6f 20 66 6c 61 74  and 0 if no flat
1f200 74 65 6e 69 6e 67 20 6f 63 63 75 72 73 2e 0a 2a  tening occurs..*
1f210 2a 0a 2a 2a 20 54 6f 20 75 6e 64 65 72 73 74 61  *.** To understa
1f220 6e 64 20 74 68 65 20 63 6f 6e 63 65 70 74 20 6f  nd the concept o
1f230 66 20 66 6c 61 74 74 65 6e 69 6e 67 2c 20 63 6f  f flattening, co
1f240 6e 73 69 64 65 72 20 74 68 65 20 66 6f 6c 6c 6f  nsider the follo
1f250 77 69 6e 67 0a 2a 2a 20 71 75 65 72 79 3a 0a 2a  wing.** query:.*
1f260 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20  *.**     SELECT 
1f270 61 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20 78  a FROM (SELECT x
1f280 2b 79 20 41 53 20 61 20 46 52 4f 4d 20 74 31 20  +y AS a FROM t1 
1f290 57 48 45 52 45 20 7a 3c 31 30 30 29 20 57 48 45  WHERE z<100) WHE
1f2a0 52 45 20 61 3e 35 0a 2a 2a 0a 2a 2a 20 54 68 65  RE a>5.**.** The
1f2b0 20 64 65 66 61 75 6c 74 20 77 61 79 20 6f 66 20   default way of 
1f2c0 69 6d 70 6c 65 6d 65 6e 74 69 6e 67 20 74 68 69  implementing thi
1f2d0 73 20 71 75 65 72 79 20 69 73 20 74 6f 20 65 78  s query is to ex
1f2e0 65 63 75 74 65 20 74 68 65 0a 2a 2a 20 73 75 62  ecute the.** sub
1f2f0 71 75 65 72 79 20 66 69 72 73 74 20 61 6e 64 20  query first and 
1f300 73 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74  store the result
1f310 73 20 69 6e 20 61 20 74 65 6d 70 6f 72 61 72 79  s in a temporary
1f320 20 74 61 62 6c 65 2c 20 74 68 65 6e 0a 2a 2a 20   table, then.** 
1f330 72 75 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75  run the outer qu
1f340 65 72 79 20 6f 6e 20 74 68 61 74 20 74 65 6d 70  ery on that temp
1f350 6f 72 61 72 79 20 74 61 62 6c 65 2e 20 20 54 68  orary table.  Th
1f360 69 73 20 72 65 71 75 69 72 65 73 20 74 77 6f 0a  is requires two.
1f370 2a 2a 20 70 61 73 73 65 73 20 6f 76 65 72 20 74  ** passes over t
1f380 68 65 20 64 61 74 61 2e 20 20 46 75 72 74 68 65  he data.  Furthe
1f390 72 6d 6f 72 65 2c 20 62 65 63 61 75 73 65 20 74  rmore, because t
1f3a0 68 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  he temporary tab
1f3b0 6c 65 0a 2a 2a 20 68 61 73 20 6e 6f 20 69 6e 64  le.** has no ind
1f3c0 69 63 65 73 2c 20 74 68 65 20 57 48 45 52 45 20  ices, the WHERE 
1f3d0 63 6c 61 75 73 65 20 6f 6e 20 74 68 65 20 6f 75  clause on the ou
1f3e0 74 65 72 20 71 75 65 72 79 20 63 61 6e 6e 6f 74  ter query cannot
1f3f0 20 62 65 0a 2a 2a 20 6f 70 74 69 6d 69 7a 65 64   be.** optimized
1f400 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
1f410 74 69 6e 65 20 61 74 74 65 6d 70 74 73 20 74 6f  tine attempts to
1f420 20 72 65 77 72 69 74 65 20 71 75 65 72 69 65 73   rewrite queries
1f430 20 73 75 63 68 20 61 73 20 74 68 65 20 61 62 6f   such as the abo
1f440 76 65 20 69 6e 74 6f 0a 2a 2a 20 61 20 73 69 6e  ve into.** a sin
1f450 67 6c 65 20 66 6c 61 74 20 73 65 6c 65 63 74 2c  gle flat select,
1f460 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a   like this:.**.*
1f470 2a 20 20 20 20 20 53 45 4c 45 43 54 20 78 2b 79  *     SELECT x+y
1f480 20 41 53 20 61 20 46 52 4f 4d 20 74 31 20 57 48   AS a FROM t1 WH
1f490 45 52 45 20 7a 3c 31 30 30 20 41 4e 44 20 61 3e  ERE z<100 AND a>
1f4a0 35 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 64 65  5.**.** The code
1f4b0 20 67 65 6e 65 72 61 74 65 64 20 66 6f 72 20 74   generated for t
1f4c0 68 69 73 20 73 69 6d 70 6c 69 66 69 63 61 74 69  his simplificati
1f4d0 6f 6e 20 67 69 76 65 73 20 74 68 65 20 73 61 6d  on gives the sam
1f4e0 65 20 72 65 73 75 6c 74 0a 2a 2a 20 62 75 74 20  e result.** but 
1f4f0 6f 6e 6c 79 20 68 61 73 20 74 6f 20 73 63 61 6e  only has to scan
1f500 20 74 68 65 20 64 61 74 61 20 6f 6e 63 65 2e 20   the data once. 
1f510 20 41 6e 64 20 62 65 63 61 75 73 65 20 69 6e 64   And because ind
1f520 69 63 65 73 20 6d 69 67 68 74 20 0a 2a 2a 20 65  ices might .** e
1f530 78 69 73 74 20 6f 6e 20 74 68 65 20 74 61 62 6c  xist on the tabl
1f540 65 20 74 31 2c 20 61 20 63 6f 6d 70 6c 65 74 65  e t1, a complete
1f550 20 73 63 61 6e 20 6f 66 20 74 68 65 20 64 61 74   scan of the dat
1f560 61 20 6d 69 67 68 74 20 62 65 0a 2a 2a 20 61 76  a might be.** av
1f570 6f 69 64 65 64 2e 0a 2a 2a 0a 2a 2a 20 46 6c 61  oided..**.** Fla
1f580 74 74 65 6e 69 6e 67 20 69 73 20 73 75 62 6a 65  ttening is subje
1f590 63 74 20 74 6f 20 74 68 65 20 66 6f 6c 6c 6f 77  ct to the follow
1f5a0 69 6e 67 20 63 6f 6e 73 74 72 61 69 6e 74 73 3a  ing constraints:
1f5b0 0a 2a 2a 0a 2a 2a 20 20 28 2a 2a 29 20 20 57 65  .**.**  (**)  We
1f5c0 20 6e 6f 20 6c 6f 6e 67 65 72 20 61 74 74 65 6d   no longer attem
1f5d0 70 74 20 74 6f 20 66 6c 61 74 74 65 6e 20 61 67  pt to flatten ag
1f5e0 67 72 65 67 61 74 65 20 73 75 62 71 75 65 72 69  gregate subqueri
1f5f0 65 73 2e 20 57 61 73 3a 0a 2a 2a 20 20 20 20 20  es. Was:.**     
1f600 20 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20     The subquery 
1f610 61 6e 64 20 74 68 65 20 6f 75 74 65 72 20 71 75  and the outer qu
1f620 65 72 79 20 63 61 6e 6e 6f 74 20 62 6f 74 68 20  ery cannot both 
1f630 62 65 20 61 67 67 72 65 67 61 74 65 73 2e 0a 2a  be aggregates..*
1f640 2a 0a 2a 2a 20 20 28 2a 2a 29 20 20 57 65 20 6e  *.**  (**)  We n
1f650 6f 20 6c 6f 6e 67 65 72 20 61 74 74 65 6d 70 74  o longer attempt
1f660 20 74 6f 20 66 6c 61 74 74 65 6e 20 61 67 67 72   to flatten aggr
1f670 65 67 61 74 65 20 73 75 62 71 75 65 72 69 65 73  egate subqueries
1f680 2e 20 57 61 73 3a 0a 2a 2a 20 20 20 20 20 20 20  . Was:.**       
1f690 20 28 32 29 20 49 66 20 74 68 65 20 73 75 62 71   (2) If the subq
1f6a0 75 65 72 79 20 69 73 20 61 6e 20 61 67 67 72 65  uery is an aggre
1f6b0 67 61 74 65 20 74 68 65 6e 0a 2a 2a 20 20 20 20  gate then.**    
1f6c0 20 20 20 20 28 32 61 29 20 74 68 65 20 6f 75 74      (2a) the out
1f6d0 65 72 20 71 75 65 72 79 20 6d 75 73 74 20 6e 6f  er query must no
1f6e0 74 20 62 65 20 61 20 6a 6f 69 6e 20 61 6e 64 0a  t be a join and.
1f6f0 2a 2a 20 20 20 20 20 20 20 20 28 32 62 29 20 74  **        (2b) t
1f700 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 6d  he outer query m
1f710 75 73 74 20 6e 6f 74 20 75 73 65 20 73 75 62 71  ust not use subq
1f720 75 65 72 69 65 73 0a 2a 2a 20 20 20 20 20 20 20  ueries.**       
1f730 20 20 20 20 20 20 6f 74 68 65 72 20 74 68 61 6e        other than
1f740 20 74 68 65 20 6f 6e 65 20 46 52 4f 4d 2d 63 6c   the one FROM-cl
1f750 61 75 73 65 20 73 75 62 71 75 65 72 79 20 74 68  ause subquery th
1f760 61 74 20 69 73 20 61 20 63 61 6e 64 69 64 61 74  at is a candidat
1f770 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  e.**            
1f780 20 66 6f 72 20 66 6c 61 74 74 65 6e 69 6e 67 2e   for flattening.
1f790 20 20 28 54 68 69 73 20 69 73 20 64 75 65 20 74    (This is due t
1f7a0 6f 20 74 69 63 6b 65 74 20 5b 32 66 37 31 37 30  o ticket [2f7170
1f7b0 64 37 33 62 66 39 61 62 66 38 30 5d 0a 2a 2a 20  d73bf9abf80].** 
1f7c0 20 20 20 20 20 20 20 20 20 20 20 20 66 72 6f 6d              from
1f7d0 20 32 30 31 35 2d 30 32 2d 30 39 2e 29 0a 2a 2a   2015-02-09.).**
1f7e0 0a 2a 2a 20 20 20 28 33 29 20 20 49 66 20 74 68  .**   (3)  If th
1f7f0 65 20 73 75 62 71 75 65 72 79 20 69 73 20 74 68  e subquery is th
1f800 65 20 72 69 67 68 74 20 6f 70 65 72 61 6e 64 20  e right operand 
1f810 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e 20 74  of a LEFT JOIN t
1f820 68 65 6e 0a 2a 2a 20 20 20 20 20 20 20 20 28 33  hen.**        (3
1f830 61 29 20 74 68 65 20 73 75 62 71 75 65 72 79 20  a) the subquery 
1f840 6d 61 79 20 6e 6f 74 20 62 65 20 61 20 6a 6f 69  may not be a joi
1f850 6e 20 61 6e 64 0a 2a 2a 20 20 20 20 20 20 20 20  n and.**        
1f860 28 33 62 29 20 74 68 65 20 46 52 4f 4d 20 63 6c  (3b) the FROM cl
1f870 61 75 73 65 20 6f 66 20 74 68 65 20 73 75 62 71  ause of the subq
1f880 75 65 72 79 20 6d 61 79 20 6e 6f 74 20 63 6f 6e  uery may not con
1f890 74 61 69 6e 20 61 20 76 69 72 74 75 61 6c 0a 2a  tain a virtual.*
1f8a0 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 74 61  *             ta
1f8b0 62 6c 65 20 61 6e 64 0a 2a 2a 20 20 20 20 20 20  ble and.**      
1f8c0 20 20 28 33 63 29 20 74 68 65 20 6f 75 74 65 72    (3c) the outer
1f8d0 20 71 75 65 72 79 20 6d 61 79 20 6e 6f 74 20 62   query may not b
1f8e0 65 20 61 6e 20 61 67 67 72 65 67 61 74 65 2e 0a  e an aggregate..
1f8f0 2a 2a 0a 2a 2a 20 20 20 28 34 29 20 20 54 68 65  **.**   (4)  The
1f900 20 73 75 62 71 75 65 72 79 20 63 61 6e 20 6e 6f   subquery can no
1f910 74 20 62 65 20 44 49 53 54 49 4e 43 54 2e 0a 2a  t be DISTINCT..*
1f920 2a 0a 2a 2a 20 20 28 2a 2a 29 20 20 41 74 20 6f  *.**  (**)  At o
1f930 6e 65 20 70 6f 69 6e 74 20 72 65 73 74 72 69 63  ne point restric
1f940 74 69 6f 6e 73 20 28 34 29 20 61 6e 64 20 28 35  tions (4) and (5
1f950 29 20 64 65 66 69 6e 65 64 20 61 20 73 75 62 73  ) defined a subs
1f960 65 74 20 6f 66 20 44 49 53 54 49 4e 43 54 0a 2a  et of DISTINCT.*
1f970 2a 20 20 20 20 20 20 20 20 73 75 62 2d 71 75 65  *        sub-que
1f980 72 69 65 73 20 74 68 61 74 20 77 65 72 65 20 65  ries that were e
1f990 78 63 6c 75 64 65 64 20 66 72 6f 6d 20 74 68 69  xcluded from thi
1f9a0 73 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 20  s optimization. 
1f9b0 52 65 73 74 72 69 63 74 69 6f 6e 20 0a 2a 2a 20  Restriction .** 
1f9c0 20 20 20 20 20 20 20 28 34 29 20 68 61 73 20 73         (4) has s
1f9d0 69 6e 63 65 20 62 65 65 6e 20 65 78 70 61 6e 64  ince been expand
1f9e0 65 64 20 74 6f 20 65 78 63 6c 75 64 65 20 61 6c  ed to exclude al
1f9f0 6c 20 44 49 53 54 49 4e 43 54 20 73 75 62 71 75  l DISTINCT subqu
1fa00 65 72 69 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 28 2a  eries..**.**  (*
1fa10 2a 29 20 20 57 65 20 6e 6f 20 6c 6f 6e 67 65 72  *)  We no longer
1fa20 20 61 74 74 65 6d 70 74 20 74 6f 20 66 6c 61 74   attempt to flat
1fa30 74 65 6e 20 61 67 67 72 65 67 61 74 65 20 73 75  ten aggregate su
1fa40 62 71 75 65 72 69 65 73 2e 20 20 57 61 73 3a 0a  bqueries.  Was:.
1fa50 2a 2a 20 20 20 20 20 20 20 20 49 66 20 74 68 65  **        If the
1fa60 20 73 75 62 71 75 65 72 79 20 69 73 20 61 67 67   subquery is agg
1fa70 72 65 67 61 74 65 2c 20 74 68 65 20 6f 75 74 65  regate, the oute
1fa80 72 20 71 75 65 72 79 20 6d 61 79 20 6e 6f 74 20  r query may not 
1fa90 62 65 20 44 49 53 54 49 4e 43 54 2e 0a 2a 2a 0a  be DISTINCT..**.
1faa0 2a 2a 20 20 20 28 37 29 20 20 54 68 65 20 73 75  **   (7)  The su
1fab0 62 71 75 65 72 79 20 6d 75 73 74 20 68 61 76 65  bquery must have
1fac0 20 61 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20   a FROM clause. 
1fad0 20 54 4f 44 4f 3a 20 20 46 6f 72 20 73 75 62 71   TODO:  For subq
1fae0 75 65 72 69 65 73 20 77 69 74 68 6f 75 74 0a 2a  ueries without.*
1faf0 2a 20 20 20 20 20 20 20 20 41 20 46 52 4f 4d 20  *        A FROM 
1fb00 63 6c 61 75 73 65 2c 20 63 6f 6e 73 69 64 65 72  clause, consider
1fb10 20 61 64 64 69 6e 67 20 61 20 46 52 4f 4d 20 63   adding a FROM c
1fb20 6c 61 75 73 65 20 77 69 74 68 20 74 68 65 20 73  lause with the s
1fb30 70 65 63 69 61 6c 0a 2a 2a 20 20 20 20 20 20 20  pecial.**       
1fb40 20 74 61 62 6c 65 20 73 71 6c 69 74 65 5f 6f 6e   table sqlite_on
1fb50 63 65 20 74 68 61 74 20 63 6f 6e 73 69 73 74 73  ce that consists
1fb60 20 6f 66 20 61 20 73 69 6e 67 6c 65 20 72 6f 77   of a single row
1fb70 20 63 6f 6e 74 61 69 6e 69 6e 67 20 61 0a 2a 2a   containing a.**
1fb80 20 20 20 20 20 20 20 20 73 69 6e 67 6c 65 20 4e          single N
1fb90 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 38 29  ULL..**.**   (8)
1fba0 20 20 49 66 20 74 68 65 20 73 75 62 71 75 65 72    If the subquer
1fbb0 79 20 75 73 65 73 20 4c 49 4d 49 54 20 74 68 65  y uses LIMIT the
1fbc0 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  n the outer quer
1fbd0 79 20 6d 61 79 20 6e 6f 74 20 62 65 20 61 20 6a  y may not be a j
1fbe0 6f 69 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 39 29  oin..**.**   (9)
1fbf0 20 20 49 66 20 74 68 65 20 73 75 62 71 75 65 72    If the subquer
1fc00 79 20 75 73 65 73 20 4c 49 4d 49 54 20 74 68 65  y uses LIMIT the
1fc10 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  n the outer quer
1fc20 79 20 6d 61 79 20 6e 6f 74 20 62 65 20 61 67 67  y may not be agg
1fc30 72 65 67 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 20 28  regate..**.**  (
1fc40 2a 2a 29 20 20 52 65 73 74 72 69 63 74 69 6f 6e  **)  Restriction
1fc50 20 28 31 30 29 20 77 61 73 20 72 65 6d 6f 76 65   (10) was remove
1fc60 64 20 66 72 6f 6d 20 74 68 65 20 63 6f 64 65 20  d from the code 
1fc70 6f 6e 20 32 30 30 35 2d 30 32 2d 30 35 20 62 75  on 2005-02-05 bu
1fc80 74 20 77 65 0a 2a 2a 20 20 20 20 20 20 20 20 61  t we.**        a
1fc90 63 63 69 64 65 6e 74 6c 79 20 63 61 72 72 69 65  ccidently carrie
1fca0 64 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20 66 6f  d the comment fo
1fcb0 72 77 61 72 64 20 75 6e 74 69 6c 20 32 30 31 34  rward until 2014
1fcc0 2d 30 39 2d 31 35 2e 20 20 4f 72 69 67 69 6e 61  -09-15.  Origina
1fcd0 6c 0a 2a 2a 20 20 20 20 20 20 20 20 63 6f 6e 73  l.**        cons
1fce0 74 72 61 69 6e 74 3a 20 22 49 66 20 74 68 65 20  traint: "If the 
1fcf0 73 75 62 71 75 65 72 79 20 69 73 20 61 67 67 72  subquery is aggr
1fd00 65 67 61 74 65 20 74 68 65 6e 20 74 68 65 20 6f  egate then the o
1fd10 75 74 65 72 20 71 75 65 72 79 20 0a 2a 2a 20 20  uter query .**  
1fd20 20 20 20 20 20 20 6d 61 79 20 6e 6f 74 20 75 73        may not us
1fd30 65 20 4c 49 4d 49 54 2e 22 0a 2a 2a 0a 2a 2a 20  e LIMIT.".**.** 
1fd40 20 28 31 31 29 20 20 54 68 65 20 73 75 62 71 75   (11)  The subqu
1fd50 65 72 79 20 61 6e 64 20 74 68 65 20 6f 75 74 65  ery and the oute
1fd60 72 20 71 75 65 72 79 20 6d 61 79 20 6e 6f 74 20  r query may not 
1fd70 62 6f 74 68 20 68 61 76 65 20 4f 52 44 45 52 20  both have ORDER 
1fd80 42 59 20 63 6c 61 75 73 65 73 2e 0a 2a 2a 0a 2a  BY clauses..**.*
1fd90 2a 20 20 28 2a 2a 29 20 20 4e 6f 74 20 69 6d 70  *  (**)  Not imp
1fda0 6c 65 6d 65 6e 74 65 64 2e 20 20 53 75 62 73 75  lemented.  Subsu
1fdb0 6d 65 64 20 69 6e 74 6f 20 72 65 73 74 72 69 63  med into restric
1fdc0 74 69 6f 6e 20 28 33 29 2e 20 20 57 61 73 20 70  tion (3).  Was p
1fdd0 72 65 76 69 6f 75 73 6c 79 0a 2a 2a 20 20 20 20  reviously.**    
1fde0 20 20 20 20 61 20 73 65 70 61 72 61 74 65 20 72      a separate r
1fdf0 65 73 74 72 69 63 74 69 6f 6e 20 64 65 72 69 76  estriction deriv
1fe00 69 6e 67 20 66 72 6f 6d 20 74 69 63 6b 65 74 20  ing from ticket 
1fe10 23 33 35 30 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 33  #350..**.**  (13
1fe20 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20  )  The subquery 
1fe30 61 6e 64 20 6f 75 74 65 72 20 71 75 65 72 79 20  and outer query 
1fe40 6d 61 79 20 6e 6f 74 20 62 6f 74 68 20 75 73 65  may not both use
1fe50 20 4c 49 4d 49 54 2e 0a 2a 2a 0a 2a 2a 20 20 28   LIMIT..**.**  (
1fe60 31 34 29 20 20 54 68 65 20 73 75 62 71 75 65 72  14)  The subquer
1fe70 79 20 6d 61 79 20 6e 6f 74 20 75 73 65 20 4f 46  y may not use OF
1fe80 46 53 45 54 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 35  FSET..**.**  (15
1fe90 29 20 20 49 66 20 74 68 65 20 6f 75 74 65 72 20  )  If the outer 
1fea0 71 75 65 72 79 20 69 73 20 70 61 72 74 20 6f 66  query is part of
1feb0 20 61 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65   a compound sele
1fec0 63 74 2c 20 74 68 65 6e 20 74 68 65 0a 2a 2a 20  ct, then the.** 
1fed0 20 20 20 20 20 20 20 73 75 62 71 75 65 72 79 20         subquery 
1fee0 6d 61 79 20 6e 6f 74 20 75 73 65 20 4c 49 4d 49  may not use LIMI
1fef0 54 2e 0a 2a 2a 20 20 20 20 20 20 20 20 28 53 65  T..**        (Se
1ff00 65 20 74 69 63 6b 65 74 20 23 32 33 33 39 20 61  e ticket #2339 a
1ff10 6e 64 20 74 69 63 6b 65 74 20 5b 30 32 61 38 65  nd ticket [02a8e
1ff20 38 31 64 34 34 5d 29 2e 0a 2a 2a 0a 2a 2a 20 20  81d44])..**.**  
1ff30 28 31 36 29 20 20 49 66 20 74 68 65 20 6f 75 74  (16)  If the out
1ff40 65 72 20 71 75 65 72 79 20 69 73 20 61 67 67 72  er query is aggr
1ff50 65 67 61 74 65 2c 20 74 68 65 6e 20 74 68 65 20  egate, then the 
1ff60 73 75 62 71 75 65 72 79 20 6d 61 79 20 6e 6f 74  subquery may not
1ff70 0a 2a 2a 20 20 20 20 20 20 20 20 75 73 65 20 4f  .**        use O
1ff80 52 44 45 52 20 42 59 2e 20 20 28 54 69 63 6b 65  RDER BY.  (Ticke
1ff90 74 20 23 32 39 34 32 29 20 20 54 68 69 73 20 75  t #2942)  This u
1ffa0 73 65 64 20 74 6f 20 6e 6f 74 20 6d 61 74 74 65  sed to not matte
1ffb0 72 0a 2a 2a 20 20 20 20 20 20 20 20 75 6e 74 69  r.**        unti
1ffc0 6c 20 77 65 20 69 6e 74 72 6f 64 75 63 65 64 20  l we introduced 
1ffd0 74 68 65 20 67 72 6f 75 70 5f 63 6f 6e 63 61 74  the group_concat
1ffe0 28 29 20 66 75 6e 63 74 69 6f 6e 2e 20 20 0a 2a  () function.  .*
1fff0 2a 0a 2a 2a 20 20 28 31 37 29 20 20 49 66 20 74  *.**  (17)  If t
20000 68 65 20 73 75 62 71 75 65 72 79 20 69 73 20 61  he subquery is a
20010 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74   compound select
20020 2c 20 74 68 65 6e 0a 2a 2a 20 20 20 20 20 20 20  , then.**       
20030 20 28 31 37 61 29 20 61 6c 6c 20 63 6f 6d 70 6f   (17a) all compo
20040 75 6e 64 20 6f 70 65 72 61 74 6f 72 73 20 6d 75  und operators mu
20050 73 74 20 62 65 20 61 20 55 4e 49 4f 4e 20 41 4c  st be a UNION AL
20060 4c 2c 20 61 6e 64 0a 2a 2a 20 20 20 20 20 20 20  L, and.**       
20070 20 28 31 37 62 29 20 6e 6f 20 74 65 72 6d 73 20   (17b) no terms 
20080 77 69 74 68 69 6e 20 74 68 65 20 73 75 62 71 75  within the subqu
20090 65 72 79 20 63 6f 6d 70 6f 75 6e 64 20 6d 61 79  ery compound may
200a0 20 62 65 20 61 67 67 72 65 67 61 74 65 0a 2a 2a   be aggregate.**
200b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 72                or
200c0 20 44 49 53 54 49 4e 43 54 2c 20 61 6e 64 0a 2a   DISTINCT, and.*
200d0 2a 20 20 20 20 20 20 20 20 28 31 37 63 29 20 65  *        (17c) e
200e0 76 65 72 79 20 74 65 72 6d 20 77 69 74 68 69 6e  very term within
200f0 20 74 68 65 20 73 75 62 71 75 65 72 79 20 63 6f   the subquery co
20100 6d 70 6f 75 6e 64 20 6d 75 73 74 20 68 61 76 65  mpound must have
20110 20 61 20 46 52 4f 4d 20 63 6c 61 75 73 65 0a 2a   a FROM clause.*
20120 2a 20 20 20 20 20 20 20 20 28 31 37 64 29 20 74  *        (17d) t
20130 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 6d  he outer query m
20140 61 79 20 6e 6f 74 20 62 65 0a 2a 2a 20 20 20 20  ay not be.**    
20150 20 20 20 20 20 20 20 20 20 20 28 31 37 64 31 29            (17d1)
20160 20 61 67 67 72 65 67 61 74 65 2c 20 6f 72 0a 2a   aggregate, or.*
20170 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28  *              (
20180 31 37 64 32 29 20 44 49 53 54 49 4e 43 54 2c 20  17d2) DISTINCT, 
20190 6f 72 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  or.**           
201a0 20 20 20 28 31 37 64 33 29 20 61 20 6a 6f 69 6e     (17d3) a join
201b0 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 54  ..**.**        T
201c0 68 65 20 70 61 72 65 6e 74 20 61 6e 64 20 73 75  he parent and su
201d0 62 2d 71 75 65 72 79 20 6d 61 79 20 63 6f 6e 74  b-query may cont
201e0 61 69 6e 20 57 48 45 52 45 20 63 6c 61 75 73 65  ain WHERE clause
201f0 73 2e 20 53 75 62 6a 65 63 74 20 74 6f 0a 2a 2a  s. Subject to.**
20200 20 20 20 20 20 20 20 20 72 75 6c 65 73 20 28 31          rules (1
20210 31 29 2c 20 28 31 33 29 20 61 6e 64 20 28 31 34  1), (13) and (14
20220 29 2c 20 74 68 65 79 20 6d 61 79 20 61 6c 73 6f  ), they may also
20230 20 63 6f 6e 74 61 69 6e 20 4f 52 44 45 52 20 42   contain ORDER B
20240 59 2c 0a 2a 2a 20 20 20 20 20 20 20 20 4c 49 4d  Y,.**        LIM
20250 49 54 20 61 6e 64 20 4f 46 46 53 45 54 20 63 6c  IT and OFFSET cl
20260 61 75 73 65 73 2e 20 20 54 68 65 20 73 75 62 71  auses.  The subq
20270 75 65 72 79 20 63 61 6e 6e 6f 74 20 75 73 65 20  uery cannot use 
20280 61 6e 79 20 63 6f 6d 70 6f 75 6e 64 0a 2a 2a 20  any compound.** 
20290 20 20 20 20 20 20 20 6f 70 65 72 61 74 6f 72 20         operator 
202a0 6f 74 68 65 72 20 74 68 61 6e 20 55 4e 49 4f 4e  other than UNION
202b0 20 41 4c 4c 20 62 65 63 61 75 73 65 20 61 6c 6c   ALL because all
202c0 20 74 68 65 20 6f 74 68 65 72 20 63 6f 6d 70 6f   the other compo
202d0 75 6e 64 0a 2a 2a 20 20 20 20 20 20 20 20 6f 70  und.**        op
202e0 65 72 61 74 6f 72 73 20 68 61 76 65 20 61 6e 20  erators have an 
202f0 69 6d 70 6c 69 65 64 20 44 49 53 54 49 4e 43 54  implied DISTINCT
20300 20 77 68 69 63 68 20 69 73 20 64 69 73 61 6c 6c   which is disall
20310 6f 77 65 64 20 62 79 0a 2a 2a 20 20 20 20 20 20  owed by.**      
20320 20 20 72 65 73 74 72 69 63 74 69 6f 6e 20 28 34    restriction (4
20330 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20  )..**.**        
20340 41 6c 73 6f 2c 20 65 61 63 68 20 63 6f 6d 70 6f  Also, each compo
20350 6e 65 6e 74 20 6f 66 20 74 68 65 20 73 75 62 2d  nent of the sub-
20360 71 75 65 72 79 20 6d 75 73 74 20 72 65 74 75 72  query must retur
20370 6e 20 74 68 65 20 73 61 6d 65 20 6e 75 6d 62 65  n the same numbe
20380 72 0a 2a 2a 20 20 20 20 20 20 20 20 6f 66 20 72  r.**        of r
20390 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 2e 20 54  esult columns. T
203a0 68 69 73 20 69 73 20 61 63 74 75 61 6c 6c 79 20  his is actually 
203b0 61 20 72 65 71 75 69 72 65 6d 65 6e 74 20 66 6f  a requirement fo
203c0 72 20 61 6e 79 20 63 6f 6d 70 6f 75 6e 64 0a 2a  r any compound.*
203d0 2a 20 20 20 20 20 20 20 20 53 45 4c 45 43 54 20  *        SELECT 
203e0 73 74 61 74 65 6d 65 6e 74 2c 20 62 75 74 20 61  statement, but a
203f0 6c 6c 20 74 68 65 20 63 6f 64 65 20 68 65 72 65  ll the code here
20400 20 64 6f 65 73 20 69 73 20 6d 61 6b 65 20 73 75   does is make su
20410 72 65 20 74 68 61 74 20 6e 6f 0a 2a 2a 20 20 20  re that no.**   
20420 20 20 20 20 20 73 75 63 68 20 28 69 6c 6c 65 67       such (illeg
20430 61 6c 29 20 73 75 62 2d 71 75 65 72 79 20 69 73  al) sub-query is
20440 20 66 6c 61 74 74 65 6e 65 64 2e 20 54 68 65 20   flattened. The 
20450 63 61 6c 6c 65 72 20 77 69 6c 6c 20 64 65 74 65  caller will dete
20460 63 74 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20  ct the.**       
20470 20 73 79 6e 74 61 78 20 65 72 72 6f 72 20 61 6e   syntax error an
20480 64 20 72 65 74 75 72 6e 20 61 20 64 65 74 61 69  d return a detai
20490 6c 65 64 20 6d 65 73 73 61 67 65 2e 0a 2a 2a 0a  led message..**.
204a0 2a 2a 20 20 28 31 38 29 20 20 49 66 20 74 68 65  **  (18)  If the
204b0 20 73 75 62 2d 71 75 65 72 79 20 69 73 20 61 20   sub-query is a 
204c0 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 2c  compound select,
204d0 20 74 68 65 6e 20 61 6c 6c 20 74 65 72 6d 73 20   then all terms 
204e0 6f 66 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20  of the.**       
204f0 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
20500 20 6f 66 20 74 68 65 20 70 61 72 65 6e 74 20 6d   of the parent m
20510 75 73 74 20 62 65 20 73 69 6d 70 6c 65 20 72 65  ust be simple re
20520 66 65 72 65 6e 63 65 73 20 74 6f 20 0a 2a 2a 20  ferences to .** 
20530 20 20 20 20 20 20 20 63 6f 6c 75 6d 6e 73 20 6f         columns o
20540 66 20 74 68 65 20 73 75 62 2d 71 75 65 72 79 2e  f the sub-query.
20550 0a 2a 2a 0a 2a 2a 20 20 28 31 39 29 20 20 49 66  .**.**  (19)  If
20560 20 74 68 65 20 73 75 62 71 75 65 72 79 20 75 73   the subquery us
20570 65 73 20 4c 49 4d 49 54 20 74 68 65 6e 20 74 68  es LIMIT then th
20580 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 6d 61  e outer query ma
20590 79 20 6e 6f 74 0a 2a 2a 20 20 20 20 20 20 20 20  y not.**        
205a0 68 61 76 65 20 61 20 57 48 45 52 45 20 63 6c 61  have a WHERE cla
205b0 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 20 28 32 30 29  use..**.**  (20)
205c0 20 20 49 66 20 74 68 65 20 73 75 62 2d 71 75 65    If the sub-que
205d0 72 79 20 69 73 20 61 20 63 6f 6d 70 6f 75 6e 64  ry is a compound
205e0 20 73 65 6c 65 63 74 2c 20 74 68 65 6e 20 69 74   select, then it
205f0 20 6d 75 73 74 20 6e 6f 74 20 75 73 65 0a 2a 2a   must not use.**
20600 20 20 20 20 20 20 20 20 61 6e 20 4f 52 44 45 52          an ORDER
20610 20 42 59 20 63 6c 61 75 73 65 2e 20 20 54 69 63   BY clause.  Tic
20620 6b 65 74 20 23 33 37 37 33 2e 20 20 57 65 20 63  ket #3773.  We c
20630 6f 75 6c 64 20 72 65 6c 61 78 20 74 68 69 73 20  ould relax this 
20640 63 6f 6e 73 74 72 61 69 6e 74 0a 2a 2a 20 20 20  constraint.**   
20650 20 20 20 20 20 73 6f 6d 65 77 68 61 74 20 62 79       somewhat by
20660 20 73 61 79 69 6e 67 20 74 68 61 74 20 74 68 65   saying that the
20670 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 4f 52   terms of the OR
20680 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 6d 75  DER BY clause mu
20690 73 74 0a 2a 2a 20 20 20 20 20 20 20 20 61 70 70  st.**        app
206a0 65 61 72 20 61 73 20 75 6e 6d 6f 64 69 66 69 65  ear as unmodifie
206b0 64 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73  d result columns
206c0 20 69 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75   in the outer qu
206d0 65 72 79 2e 20 20 42 75 74 20 77 65 0a 2a 2a 20  ery.  But we.** 
206e0 20 20 20 20 20 20 20 68 61 76 65 20 6f 74 68 65         have othe
206f0 72 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20  r optimizations 
20700 69 6e 20 6d 69 6e 64 20 74 6f 20 64 65 61 6c 20  in mind to deal 
20710 77 69 74 68 20 74 68 61 74 20 63 61 73 65 2e 0a  with that case..
20720 2a 2a 0a 2a 2a 20 20 28 32 31 29 20 20 49 66 20  **.**  (21)  If 
20730 74 68 65 20 73 75 62 71 75 65 72 79 20 75 73 65  the subquery use
20740 73 20 4c 49 4d 49 54 20 74 68 65 6e 20 74 68 65  s LIMIT then the
20750 20 6f 75 74 65 72 20 71 75 65 72 79 20 6d 61 79   outer query may
20760 20 6e 6f 74 20 62 65 0a 2a 2a 20 20 20 20 20 20   not be.**      
20770 20 20 44 49 53 54 49 4e 43 54 2e 20 20 28 53 65    DISTINCT.  (Se
20780 65 20 74 69 63 6b 65 74 20 5b 37 35 32 65 31 36  e ticket [752e16
20790 34 36 66 63 5d 29 2e 0a 2a 2a 0a 2a 2a 20 20 28  46fc])..**.**  (
207a0 32 32 29 20 20 54 68 65 20 73 75 62 71 75 65 72  22)  The subquer
207b0 79 20 6d 61 79 20 6e 6f 74 20 62 65 20 61 20 72  y may not be a r
207c0 65 63 75 72 73 69 76 65 20 43 54 45 2e 0a 2a 2a  ecursive CTE..**
207d0 0a 2a 2a 20 20 28 2a 2a 29 20 20 53 75 62 73 75  .**  (**)  Subsu
207e0 6d 65 64 20 69 6e 74 6f 20 72 65 73 74 72 69 63  med into restric
207f0 74 69 6f 6e 20 28 31 37 64 33 29 2e 20 20 57 61  tion (17d3).  Wa
20800 73 3a 20 49 66 20 74 68 65 20 6f 75 74 65 72 20  s: If the outer 
20810 71 75 65 72 79 20 69 73 0a 2a 2a 20 20 20 20 20  query is.**     
20820 20 20 20 61 20 72 65 63 75 72 73 69 76 65 20 43     a recursive C
20830 54 45 2c 20 74 68 65 6e 20 74 68 65 20 73 75 62  TE, then the sub
20840 2d 71 75 65 72 79 20 6d 61 79 20 6e 6f 74 20 62  -query may not b
20850 65 20 61 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65  e a compound que
20860 72 79 2e 0a 2a 2a 20 20 20 20 20 20 20 20 54 68  ry..**        Th
20870 69 73 20 72 65 73 74 72 69 63 74 69 6f 6e 20 69  is restriction i
20880 73 20 62 65 63 61 75 73 65 20 74 72 61 6e 73 66  s because transf
20890 6f 72 6d 69 6e 67 20 74 68 65 0a 2a 2a 20 20 20  orming the.**   
208a0 20 20 20 20 20 70 61 72 65 6e 74 20 74 6f 20 61       parent to a
208b0 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79 20   compound query 
208c0 63 6f 6e 66 75 73 65 73 20 74 68 65 20 63 6f 64  confuses the cod
208d0 65 20 74 68 61 74 20 68 61 6e 64 6c 65 73 0a 2a  e that handles.*
208e0 2a 20 20 20 20 20 20 20 20 72 65 63 75 72 73 69  *        recursi
208f0 76 65 20 71 75 65 72 69 65 73 20 69 6e 20 6d 75  ve queries in mu
20900 6c 74 69 53 65 6c 65 63 74 28 29 2e 0a 2a 2a 0a  ltiSelect()..**.
20910 2a 2a 20 20 28 2a 2a 29 20 20 57 65 20 6e 6f 20  **  (**)  We no 
20920 6c 6f 6e 67 65 72 20 61 74 74 65 6d 70 74 20 74  longer attempt t
20930 6f 20 66 6c 61 74 74 65 6e 20 61 67 67 72 65 67  o flatten aggreg
20940 61 74 65 20 73 75 62 71 75 65 72 69 65 73 2e 20  ate subqueries. 
20950 20 57 61 73 3a 0a 2a 2a 20 20 20 20 20 20 20 20   Was:.**        
20960 54 68 65 20 73 75 62 71 75 65 72 79 20 6d 61 79  The subquery may
20970 20 6e 6f 74 20 62 65 20 61 6e 20 61 67 67 72 65   not be an aggre
20980 67 61 74 65 20 74 68 61 74 20 75 73 65 73 20 74  gate that uses t
20990 68 65 20 62 75 69 6c 74 2d 69 6e 20 6d 69 6e 28  he built-in min(
209a0 29 20 6f 72 20 0a 2a 2a 20 20 20 20 20 20 20 20  ) or .**        
209b0 6f 72 20 6d 61 78 28 29 20 66 75 6e 63 74 69 6f  or max() functio
209c0 6e 73 2e 20 20 28 57 69 74 68 6f 75 74 20 74 68  ns.  (Without th
209d0 69 73 20 72 65 73 74 72 69 63 74 69 6f 6e 2c 20  is restriction, 
209e0 61 20 71 75 65 72 79 20 6c 69 6b 65 3a 0a 2a 2a  a query like:.**
209f0 20 20 20 20 20 20 20 20 22 53 45 4c 45 43 54 20          "SELECT 
20a00 78 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20 6d  x FROM (SELECT m
20a10 61 78 28 79 29 2c 20 78 20 46 52 4f 4d 20 74 31  ax(y), x FROM t1
20a20 29 22 20 77 6f 75 6c 64 20 6e 6f 74 20 6e 65 63  )" would not nec
20a30 65 73 73 61 72 69 6c 79 0a 2a 2a 20 20 20 20 20  essarily.**     
20a40 20 20 20 72 65 74 75 72 6e 20 74 68 65 20 76 61     return the va
20a50 6c 75 65 20 58 20 66 6f 72 20 77 68 69 63 68 20  lue X for which 
20a60 59 20 77 61 73 20 6d 61 78 69 6d 61 6c 2e 29 0a  Y was maximal.).
20a70 2a 2a 0a 2a 2a 20 20 28 32 35 29 20 20 49 66 20  **.**  (25)  If 
20a80 65 69 74 68 65 72 20 74 68 65 20 73 75 62 71 75  either the subqu
20a90 65 72 79 20 6f 72 20 74 68 65 20 70 61 72 65 6e  ery or the paren
20aa0 74 20 71 75 65 72 79 20 63 6f 6e 74 61 69 6e 73  t query contains
20ab0 20 61 20 77 69 6e 64 6f 77 0a 2a 2a 20 20 20 20   a window.**    
20ac0 20 20 20 20 66 75 6e 63 74 69 6f 6e 20 69 6e 20      function in 
20ad0 74 68 65 20 73 65 6c 65 63 74 20 6c 69 73 74 20  the select list 
20ae0 6f 72 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  or ORDER BY clau
20af0 73 65 2c 20 66 6c 61 74 74 65 6e 69 6e 67 0a 2a  se, flattening.*
20b00 2a 20 20 20 20 20 20 20 20 69 73 20 6e 6f 74 20  *        is not 
20b10 61 74 74 65 6d 70 74 65 64 2e 0a 2a 2a 0a 2a 2a  attempted..**.**
20b20 0a 2a 2a 20 49 6e 20 74 68 69 73 20 72 6f 75 74  .** In this rout
20b30 69 6e 65 2c 20 74 68 65 20 22 70 22 20 70 61 72  ine, the "p" par
20b40 61 6d 65 74 65 72 20 69 73 20 61 20 70 6f 69 6e  ameter is a poin
20b50 74 65 72 20 74 6f 20 74 68 65 20 6f 75 74 65 72  ter to the outer
20b60 20 71 75 65 72 79 2e 0a 2a 2a 20 54 68 65 20 73   query..** The s
20b70 75 62 71 75 65 72 79 20 69 73 20 70 2d 3e 70 53  ubquery is p->pS
20b80 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d 2e 20 20 69  rc->a[iFrom].  i
20b90 73 41 67 67 20 69 73 20 74 72 75 65 20 69 66 20  sAgg is true if 
20ba0 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 0a  the outer query.
20bb0 2a 2a 20 75 73 65 73 20 61 67 67 72 65 67 61 74  ** uses aggregat
20bc0 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 66 6c 61  es..**.** If fla
20bd0 74 74 65 6e 69 6e 67 20 69 73 20 6e 6f 74 20 61  ttening is not a
20be0 74 74 65 6d 70 74 65 64 2c 20 74 68 69 73 20 72  ttempted, this r
20bf0 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f  outine is a no-o
20c00 70 20 61 6e 64 20 72 65 74 75 72 6e 73 20 30 2e  p and returns 0.
20c10 0a 2a 2a 20 49 66 20 66 6c 61 74 74 65 6e 69 6e  .** If flattenin
20c20 67 20 69 73 20 61 74 74 65 6d 70 74 65 64 20 74  g is attempted t
20c30 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75  his routine retu
20c40 72 6e 73 20 31 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c  rns 1..**.** All
20c50 20 6f 66 20 74 68 65 20 65 78 70 72 65 73 73 69   of the expressi
20c60 6f 6e 20 61 6e 61 6c 79 73 69 73 20 6d 75 73 74  on analysis must
20c70 20 6f 63 63 75 72 20 6f 6e 20 62 6f 74 68 20 74   occur on both t
20c80 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 61  he outer query a
20c90 6e 64 0a 2a 2a 20 74 68 65 20 73 75 62 71 75 65  nd.** the subque
20ca0 72 79 20 62 65 66 6f 72 65 20 74 68 69 73 20 72  ry before this r
20cb0 6f 75 74 69 6e 65 20 72 75 6e 73 2e 0a 2a 2f 0a  outine runs..*/.
20cc0 73 74 61 74 69 63 20 69 6e 74 20 66 6c 61 74 74  static int flatt
20cd0 65 6e 53 75 62 71 75 65 72 79 28 0a 20 20 50 61  enSubquery(.  Pa
20ce0 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
20cf0 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
20d00 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63  ntext */.  Selec
20d10 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  t *p,           
20d20 2f 2a 20 54 68 65 20 70 61 72 65 6e 74 20 6f 72  /* The parent or
20d30 20 6f 75 74 65 72 20 53 45 4c 45 43 54 20 73 74   outer SELECT st
20d40 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74  atement */.  int
20d50 20 69 46 72 6f 6d 2c 20 20 20 20 20 20 20 20 20   iFrom,         
20d60 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e 20 70 2d    /* Index in p-
20d70 3e 70 53 72 63 2d 3e 61 5b 5d 20 6f 66 20 74 68  >pSrc->a[] of th
20d80 65 20 69 6e 6e 65 72 20 73 75 62 71 75 65 72 79  e inner subquery
20d90 20 2a 2f 0a 20 20 69 6e 74 20 69 73 41 67 67 20   */.  int isAgg 
20da0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
20db0 75 65 20 69 66 20 6f 75 74 65 72 20 53 45 4c 45  ue if outer SELE
20dc0 43 54 20 75 73 65 73 20 61 67 67 72 65 67 61 74  CT uses aggregat
20dd0 65 20 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 29  e functions */.)
20de0 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  {.  const char *
20df0 7a 53 61 76 65 64 41 75 74 68 43 6f 6e 74 65 78  zSavedAuthContex
20e00 74 20 3d 20 70 50 61 72 73 65 2d 3e 7a 41 75 74  t = pParse->zAut
20e10 68 43 6f 6e 74 65 78 74 3b 0a 20 20 53 65 6c 65  hContext;.  Sele
20e20 63 74 20 2a 70 50 61 72 65 6e 74 3b 20 20 20 20  ct *pParent;    
20e30 2f 2a 20 43 75 72 72 65 6e 74 20 55 4e 49 4f 4e  /* Current UNION
20e40 20 41 4c 4c 20 74 65 72 6d 20 6f 66 20 74 68 65   ALL term of the
20e50 20 6f 74 68 65 72 20 71 75 65 72 79 20 2a 2f 0a   other query */.
20e60 20 20 53 65 6c 65 63 74 20 2a 70 53 75 62 3b 20    Select *pSub; 
20e70 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 6e        /* The inn
20e80 65 72 20 71 75 65 72 79 20 6f 72 20 22 73 75 62  er query or "sub
20e90 71 75 65 72 79 22 20 2a 2f 0a 20 20 53 65 6c 65  query" */.  Sele
20ea0 63 74 20 2a 70 53 75 62 31 3b 20 20 20 20 20 20  ct *pSub1;      
20eb0 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 74 68  /* Pointer to th
20ec0 65 20 72 69 67 68 74 6d 6f 73 74 20 73 65 6c 65  e rightmost sele
20ed0 63 74 20 69 6e 20 73 75 62 2d 71 75 65 72 79 20  ct in sub-query 
20ee0 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53  */.  SrcList *pS
20ef0 72 63 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20  rc;      /* The 
20f00 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74  FROM clause of t
20f10 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 2a  he outer query *
20f20 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53 75  /.  SrcList *pSu
20f30 62 53 72 63 3b 20 20 20 2f 2a 20 54 68 65 20 46  bSrc;   /* The F
20f40 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68  ROM clause of th
20f50 65 20 73 75 62 71 75 65 72 79 20 2a 2f 0a 20 20  e subquery */.  
20f60 69 6e 74 20 69 50 61 72 65 6e 74 3b 20 20 20 20  int iParent;    
20f70 20 20 20 20 2f 2a 20 56 44 42 45 20 63 75 72 73      /* VDBE curs
20f80 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65  or number of the
20f90 20 70 53 75 62 20 72 65 73 75 6c 74 20 73 65 74   pSub result set
20fa0 20 74 65 6d 70 20 74 61 62 6c 65 20 2a 2f 0a 20   temp table */. 
20fb0 20 69 6e 74 20 69 4e 65 77 50 61 72 65 6e 74 20   int iNewParent 
20fc0 3d 20 2d 31 3b 2f 2a 20 52 65 70 6c 61 63 65 6d  = -1;/* Replacem
20fd0 65 6e 74 20 74 61 62 6c 65 20 66 6f 72 20 69 50  ent table for iP
20fe0 61 72 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 69  arent */.  int i
20ff0 73 4c 65 66 74 4a 6f 69 6e 20 3d 20 30 3b 20 2f  sLeftJoin = 0; /
21000 2a 20 54 72 75 65 20 69 66 20 70 53 75 62 20 69  * True if pSub i
21010 73 20 74 68 65 20 72 69 67 68 74 20 73 69 64 65  s the right side
21020 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e 20   of a LEFT JOIN 
21030 2a 2f 20 20 20 20 0a 20 20 69 6e 74 20 69 3b 20  */    .  int i; 
21040 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
21050 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  Loop counter */.
21060 20 20 45 78 70 72 20 2a 70 57 68 65 72 65 3b 20    Expr *pWhere; 
21070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21080 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20     /* The WHERE 
21090 63 6c 61 75 73 65 20 2a 2f 0a 20 20 73 74 72 75  clause */.  stru
210a0 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
210b0 2a 70 53 75 62 69 74 65 6d 3b 20 20 20 2f 2a 20  *pSubitem;   /* 
210c0 54 68 65 20 73 75 62 71 75 65 72 79 20 2a 2f 0a  The subquery */.
210d0 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
210e0 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 2f  pParse->db;..  /
210f0 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69  * Check to see i
21100 66 20 66 6c 61 74 74 65 6e 69 6e 67 20 69 73 20  f flattening is 
21110 70 65 72 6d 69 74 74 65 64 2e 20 20 52 65 74 75  permitted.  Retu
21120 72 6e 20 30 20 69 66 20 6e 6f 74 2e 0a 20 20 2a  rn 0 if not..  *
21130 2f 0a 20 20 61 73 73 65 72 74 28 20 70 21 3d 30  /.  assert( p!=0
21140 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d   );.  assert( p-
21150 3e 70 50 72 69 6f 72 3d 3d 30 20 29 3b 0a 20 20  >pPrior==0 );.  
21160 69 66 28 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e  if( Optimization
21170 44 69 73 61 62 6c 65 64 28 64 62 2c 20 53 51 4c  Disabled(db, SQL
21180 49 54 45 5f 51 75 65 72 79 46 6c 61 74 74 65 6e  ITE_QueryFlatten
21190 65 72 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  er) ) return 0;.
211a0 20 20 70 53 72 63 20 3d 20 70 2d 3e 70 53 72 63    pSrc = p->pSrc
211b0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 72 63  ;.  assert( pSrc
211c0 20 26 26 20 69 46 72 6f 6d 3e 3d 30 20 26 26 20   && iFrom>=0 && 
211d0 69 46 72 6f 6d 3c 70 53 72 63 2d 3e 6e 53 72 63  iFrom<pSrc->nSrc
211e0 20 29 3b 0a 20 20 70 53 75 62 69 74 65 6d 20 3d   );.  pSubitem =
211f0 20 26 70 53 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d   &pSrc->a[iFrom]
21200 3b 0a 20 20 69 50 61 72 65 6e 74 20 3d 20 70 53  ;.  iParent = pS
21210 75 62 69 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b  ubitem->iCursor;
21220 0a 20 20 70 53 75 62 20 3d 20 70 53 75 62 69 74  .  pSub = pSubit
21230 65 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a 20 20 61  em->pSelect;.  a
21240 73 73 65 72 74 28 20 70 53 75 62 21 3d 30 20 29  ssert( pSub!=0 )
21250 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ;..#ifndef SQLIT
21260 45 5f 4f 4d 49 54 5f 57 49 4e 44 4f 57 46 55 4e  E_OMIT_WINDOWFUN
21270 43 0a 20 20 69 66 28 20 70 2d 3e 70 57 69 6e 20  C.  if( p->pWin 
21280 7c 7c 20 70 53 75 62 2d 3e 70 57 69 6e 20 29 20  || pSub->pWin ) 
21290 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20  return 0;       
212a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
212b0 73 74 72 69 63 74 69 6f 6e 20 28 32 35 29 20 2a  striction (25) *
212c0 2f 0a 23 65 6e 64 69 66 0a 0a 20 20 70 53 75 62  /.#endif..  pSub
212d0 53 72 63 20 3d 20 70 53 75 62 2d 3e 70 53 72 63  Src = pSub->pSrc
212e0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 75 62  ;.  assert( pSub
212f0 53 72 63 20 29 3b 0a 20 20 2f 2a 20 50 72 69 6f  Src );.  /* Prio
21300 72 20 74 6f 20 76 65 72 73 69 6f 6e 20 33 2e 31  r to version 3.1
21310 2e 32 2c 20 77 68 65 6e 20 4c 49 4d 49 54 20 61  .2, when LIMIT a
21320 6e 64 20 4f 46 46 53 45 54 20 68 61 64 20 74 6f  nd OFFSET had to
21330 20 62 65 20 73 69 6d 70 6c 65 20 63 6f 6e 73 74   be simple const
21340 61 6e 74 73 2c 0a 20 20 2a 2a 20 6e 6f 74 20 61  ants,.  ** not a
21350 72 62 69 74 72 61 72 79 20 65 78 70 72 65 73 73  rbitrary express
21360 69 6f 6e 73 2c 20 77 65 20 61 6c 6c 6f 77 65 64  ions, we allowed
21370 20 73 6f 6d 65 20 63 6f 6d 62 69 6e 69 6e 67 20   some combining 
21380 6f 66 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46  of LIMIT and OFF
21390 53 45 54 0a 20 20 2a 2a 20 62 65 63 61 75 73 65  SET.  ** because
213a0 20 74 68 65 79 20 63 6f 75 6c 64 20 62 65 20 63   they could be c
213b0 6f 6d 70 75 74 65 64 20 61 74 20 63 6f 6d 70 69  omputed at compi
213c0 6c 65 2d 74 69 6d 65 2e 20 20 42 75 74 20 77 68  le-time.  But wh
213d0 65 6e 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46  en LIMIT and OFF
213e0 53 45 54 0a 20 20 2a 2a 20 62 65 63 61 6d 65 20  SET.  ** became 
213f0 61 72 62 69 74 72 61 72 79 20 65 78 70 72 65 73  arbitrary expres
21400 73 69 6f 6e 73 2c 20 77 65 20 77 65 72 65 20 66  sions, we were f
21410 6f 72 63 65 64 20 74 6f 20 61 64 64 20 72 65 73  orced to add res
21420 74 72 69 63 74 69 6f 6e 73 20 28 31 33 29 0a 20  trictions (13). 
21430 20 2a 2a 20 61 6e 64 20 28 31 34 29 2e 20 2a 2f   ** and (14). */
21440 0a 20 20 69 66 28 20 70 53 75 62 2d 3e 70 4c 69  .  if( pSub->pLi
21450 6d 69 74 20 26 26 20 70 2d 3e 70 4c 69 6d 69 74  mit && p->pLimit
21460 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20   ) return 0;    
21470 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73            /* Res
21480 74 72 69 63 74 69 6f 6e 20 28 31 33 29 20 2a 2f  triction (13) */
21490 0a 20 20 69 66 28 20 70 53 75 62 2d 3e 70 4c 69  .  if( pSub->pLi
214a0 6d 69 74 20 26 26 20 70 53 75 62 2d 3e 70 4c 69  mit && pSub->pLi
214b0 6d 69 74 2d 3e 70 52 69 67 68 74 20 29 20 72 65  mit->pRight ) re
214c0 74 75 72 6e 20 30 3b 20 20 20 2f 2a 20 52 65 73  turn 0;   /* Res
214d0 74 72 69 63 74 69 6f 6e 20 28 31 34 29 20 2a 2f  triction (14) */
214e0 0a 20 20 69 66 28 20 28 70 2d 3e 73 65 6c 46 6c  .  if( (p->selFl
214f0 61 67 73 20 26 20 53 46 5f 43 6f 6d 70 6f 75 6e  ags & SF_Compoun
21500 64 29 21 3d 30 20 26 26 20 70 53 75 62 2d 3e 70  d)!=0 && pSub->p
21510 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 72 65 74  Limit ){.    ret
21520 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20  urn 0;          
21530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21550 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e    /* Restriction
21560 20 28 31 35 29 20 2a 2f 0a 20 20 7d 0a 20 20 69   (15) */.  }.  i
21570 66 28 20 70 53 75 62 53 72 63 2d 3e 6e 53 72 63  f( pSubSrc->nSrc
21580 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 20  ==0 ) return 0; 
21590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
215a0 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63        /* Restric
215b0 74 69 6f 6e 20 28 37 29 20 20 2a 2f 0a 20 20 69  tion (7)  */.  i
215c0 66 28 20 70 53 75 62 2d 3e 73 65 6c 46 6c 61 67  f( pSub->selFlag
215d0 73 20 26 20 53 46 5f 44 69 73 74 69 6e 63 74 20  s & SF_Distinct 
215e0 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20  ) return 0;     
215f0 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63        /* Restric
21600 74 69 6f 6e 20 28 34 29 20 20 2a 2f 0a 20 20 69  tion (4)  */.  i
21610 66 28 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20  f( pSub->pLimit 
21620 26 26 20 28 70 53 72 63 2d 3e 6e 53 72 63 3e 31  && (pSrc->nSrc>1
21630 20 7c 7c 20 69 73 41 67 67 29 20 29 7b 0a 20 20   || isAgg) ){.  
21640 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20     return 0;    
21650 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74       /* Restrict
21660 69 6f 6e 73 20 28 38 29 28 39 29 20 2a 2f 0a 20  ions (8)(9) */. 
21670 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70 4f 72 64   }.  if( p->pOrd
21680 65 72 42 79 20 26 26 20 70 53 75 62 2d 3e 70 4f  erBy && pSub->pO
21690 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20 72  rderBy ){.     r
216a0 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20  eturn 0;        
216b0 20 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 2f 2a 20 52 65 73 74 72 69 63 74 69 6f     /* Restrictio
216e0 6e 20 28 31 31 29 20 2a 2f 0a 20 20 7d 0a 20 20  n (11) */.  }.  
216f0 69 66 28 20 69 73 41 67 67 20 26 26 20 70 53 75  if( isAgg && pSu
21700 62 2d 3e 70 4f 72 64 65 72 42 79 20 29 20 72 65  b->pOrderBy ) re
21710 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20  turn 0;         
21720 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69         /* Restri
21730 63 74 69 6f 6e 20 28 31 36 29 20 2a 2f 0a 20 20  ction (16) */.  
21740 69 66 28 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74  if( pSub->pLimit
21750 20 26 26 20 70 2d 3e 70 57 68 65 72 65 20 29 20   && p->pWhere ) 
21760 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20  return 0;       
21770 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69         /* Restri
21780 63 74 69 6f 6e 20 28 31 39 29 20 2a 2f 0a 20 20  ction (19) */.  
21790 69 66 28 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74  if( pSub->pLimit
217a0 20 26 26 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73   && (p->selFlags
217b0 20 26 20 53 46 5f 44 69 73 74 69 6e 63 74 29 21   & SF_Distinct)!
217c0 3d 30 20 29 7b 0a 20 20 20 20 20 72 65 74 75 72  =0 ){.     retur
217d0 6e 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  n 0;         /* 
217e0 52 65 73 74 72 69 63 74 69 6f 6e 20 28 32 31 29  Restriction (21)
217f0 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20 70 53   */.  }.  if( pS
21800 75 62 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 28  ub->selFlags & (
21810 53 46 5f 52 65 63 75 72 73 69 76 65 29 20 29 7b  SF_Recursive) ){
21820 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 2f  .    return 0; /
21830 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 73 20 28  * Restrictions (
21840 32 32 29 20 2a 2f 0a 20 20 7d 0a 0a 20 20 2f 2a  22) */.  }..  /*
21850 0a 20 20 2a 2a 20 49 66 20 74 68 65 20 73 75 62  .  ** If the sub
21860 71 75 65 72 79 20 69 73 20 74 68 65 20 72 69 67  query is the rig
21870 68 74 20 6f 70 65 72 61 6e 64 20 6f 66 20 61 20  ht operand of a 
21880 4c 45 46 54 20 4a 4f 49 4e 2c 20 74 68 65 6e 20  LEFT JOIN, then 
21890 74 68 65 0a 20 20 2a 2a 20 73 75 62 71 75 65 72  the.  ** subquer
218a0 79 20 6d 61 79 20 6e 6f 74 20 62 65 20 61 20 6a  y may not be a j
218b0 6f 69 6e 20 69 74 73 65 6c 66 20 28 33 61 29 2e  oin itself (3a).
218c0 20 45 78 61 6d 70 6c 65 20 6f 66 20 77 68 79 20   Example of why 
218d0 74 68 69 73 20 69 73 20 6e 6f 74 0a 20 20 2a 2a  this is not.  **
218e0 20 61 6c 6c 6f 77 65 64 3a 0a 20 20 2a 2a 0a 20   allowed:.  **. 
218f0 20 2a 2a 20 20 20 20 20 20 20 20 20 74 31 20 4c   **         t1 L
21900 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20 28  EFT OUTER JOIN (
21910 74 32 20 4a 4f 49 4e 20 74 33 29 0a 20 20 2a 2a  t2 JOIN t3).  **
21920 0a 20 20 2a 2a 20 49 66 20 77 65 20 66 6c 61 74  .  ** If we flat
21930 74 65 6e 20 74 68 65 20 61 62 6f 76 65 2c 20 77  ten the above, w
21940 65 20 77 6f 75 6c 64 20 67 65 74 0a 20 20 2a 2a  e would get.  **
21950 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20 28 74  .  **         (t
21960 31 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49  1 LEFT OUTER JOI
21970 4e 20 74 32 29 20 4a 4f 49 4e 20 74 33 0a 20 20  N t2) JOIN t3.  
21980 2a 2a 0a 20 20 2a 2a 20 77 68 69 63 68 20 69 73  **.  ** which is
21990 20 6e 6f 74 20 61 74 20 61 6c 6c 20 74 68 65 20   not at all the 
219a0 73 61 6d 65 20 74 68 69 6e 67 2e 0a 20 20 2a 2a  same thing..  **
219b0 0a 20 20 2a 2a 20 49 66 20 74 68 65 20 73 75 62  .  ** If the sub
219c0 71 75 65 72 79 20 69 73 20 74 68 65 20 72 69 67  query is the rig
219d0 68 74 20 6f 70 65 72 61 6e 64 20 6f 66 20 61 20  ht operand of a 
219e0 4c 45 46 54 20 4a 4f 49 4e 2c 20 74 68 65 6e 20  LEFT JOIN, then 
219f0 74 68 65 20 6f 75 74 65 72 0a 20 20 2a 2a 20 71  the outer.  ** q
21a00 75 65 72 79 20 63 61 6e 6e 6f 74 20 62 65 20 61  uery cannot be a
21a10 6e 20 61 67 67 72 65 67 61 74 65 2e 20 28 33 63  n aggregate. (3c
21a20 29 20 20 54 68 69 73 20 69 73 20 61 6e 20 61 72  )  This is an ar
21a30 74 69 66 61 63 74 20 6f 66 20 74 68 65 20 77 61  tifact of the wa
21a40 79 0a 20 20 2a 2a 20 61 67 67 72 65 67 61 74 65  y.  ** aggregate
21a50 73 20 61 72 65 20 70 72 6f 63 65 73 73 65 64 20  s are processed 
21a60 2d 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6d 65  - there is no me
21a70 63 68 61 6e 69 73 6d 20 74 6f 20 64 65 74 65 72  chanism to deter
21a80 6d 69 6e 65 20 69 66 0a 20 20 2a 2a 20 74 68 65  mine if.  ** the
21a90 20 4c 45 46 54 20 4a 4f 49 4e 20 74 61 62 6c 65   LEFT JOIN table
21aa0 20 73 68 6f 75 6c 64 20 62 65 20 61 6c 6c 2d 4e   should be all-N
21ab0 55 4c 4c 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 53  ULL..  **.  ** S
21ac0 65 65 20 61 6c 73 6f 20 74 69 63 6b 65 74 73 20  ee also tickets 
21ad0 23 33 30 36 2c 20 23 33 35 30 2c 20 61 6e 64 20  #306, #350, and 
21ae0 23 33 33 30 30 2e 0a 20 20 2a 2f 0a 20 20 69 66  #3300..  */.  if
21af0 28 20 28 70 53 75 62 69 74 65 6d 2d 3e 66 67 2e  ( (pSubitem->fg.
21b00 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 4f 55  jointype & JT_OU
21b10 54 45 52 29 21 3d 30 20 29 7b 0a 20 20 20 20 69  TER)!=0 ){.    i
21b20 73 4c 65 66 74 4a 6f 69 6e 20 3d 20 31 3b 0a 20  sLeftJoin = 1;. 
21b30 20 20 20 69 66 28 20 70 53 75 62 53 72 63 2d 3e     if( pSubSrc->
21b40 6e 53 72 63 3e 31 20 7c 7c 20 69 73 41 67 67 20  nSrc>1 || isAgg 
21b50 7c 7c 20 49 73 56 69 72 74 75 61 6c 28 70 53 75  || IsVirtual(pSu
21b60 62 53 72 63 2d 3e 61 5b 30 5d 2e 70 54 61 62 29  bSrc->a[0].pTab)
21b70 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 20 28 33   ){.      /*  (3
21b80 61 29 20 20 20 20 20 20 20 20 20 20 20 20 20 28  a)             (
21b90 33 63 29 20 20 20 20 20 28 33 62 29 20 2a 2f 0a  3c)     (3b) */.
21ba0 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a        return 0;.
21bb0 20 20 20 20 7d 0a 20 20 7d 0a 23 69 66 64 65 66      }.  }.#ifdef
21bc0 20 53 51 4c 49 54 45 5f 45 58 54 52 41 5f 49 46   SQLITE_EXTRA_IF
21bd0 4e 55 4c 4c 52 4f 57 0a 20 20 65 6c 73 65 20 69  NULLROW.  else i
21be0 66 28 20 69 46 72 6f 6d 3e 30 20 26 26 20 21 69  f( iFrom>0 && !i
21bf0 73 41 67 67 20 29 7b 0a 20 20 20 20 2f 2a 20 53  sAgg ){.    /* S
21c00 65 74 74 69 6e 67 20 69 73 4c 65 66 74 4a 6f 69  etting isLeftJoi
21c10 6e 20 74 6f 20 2d 31 20 63 61 75 73 65 73 20 4f  n to -1 causes O
21c20 50 5f 49 66 4e 75 6c 6c 52 6f 77 20 6f 70 63 6f  P_IfNullRow opco
21c30 64 65 73 20 74 6f 20 62 65 20 67 65 6e 65 72 61  des to be genera
21c40 74 65 64 20 66 6f 72 0a 20 20 20 20 2a 2a 20 65  ted for.    ** e
21c50 76 65 72 79 20 72 65 66 65 72 65 6e 63 65 20 74  very reference t
21c60 6f 20 61 6e 79 20 72 65 73 75 6c 74 20 63 6f 6c  o any result col
21c70 75 6d 6e 20 66 72 6f 6d 20 73 75 62 71 75 65 72  umn from subquer
21c80 79 20 69 6e 20 61 20 6a 6f 69 6e 2c 20 65 76 65  y in a join, eve
21c90 6e 0a 20 20 20 20 2a 2a 20 74 68 6f 75 67 68 20  n.    ** though 
21ca0 74 68 65 79 20 61 72 65 20 6e 6f 74 20 6e 65 63  they are not nec
21cb0 65 73 73 61 72 79 2e 20 20 54 68 69 73 20 77 69  essary.  This wi
21cc0 6c 6c 20 73 74 72 65 73 73 2d 74 65 73 74 20 74  ll stress-test t
21cd0 68 65 20 4f 50 5f 49 66 4e 75 6c 6c 52 6f 77 20  he OP_IfNullRow 
21ce0 0a 20 20 20 20 2a 2a 20 6f 70 63 6f 64 65 2e 20  .    ** opcode. 
21cf0 2a 2f 0a 20 20 20 20 69 73 4c 65 66 74 4a 6f 69  */.    isLeftJoi
21d00 6e 20 3d 20 2d 31 3b 0a 20 20 7d 0a 23 65 6e 64  n = -1;.  }.#end
21d10 69 66 0a 0a 20 20 2f 2a 20 52 65 73 74 72 69 63  if..  /* Restric
21d20 74 69 6f 6e 20 28 31 37 29 3a 20 49 66 20 74 68  tion (17): If th
21d30 65 20 73 75 62 2d 71 75 65 72 79 20 69 73 20 61  e sub-query is a
21d40 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54   compound SELECT
21d50 2c 20 74 68 65 6e 20 69 74 20 6d 75 73 74 0a 20  , then it must. 
21d60 20 2a 2a 20 75 73 65 20 6f 6e 6c 79 20 74 68 65   ** use only the
21d70 20 55 4e 49 4f 4e 20 41 4c 4c 20 6f 70 65 72 61   UNION ALL opera
21d80 74 6f 72 2e 20 41 6e 64 20 6e 6f 6e 65 20 6f 66  tor. And none of
21d90 20 74 68 65 20 73 69 6d 70 6c 65 20 73 65 6c 65   the simple sele
21da0 63 74 20 71 75 65 72 69 65 73 0a 20 20 2a 2a 20  ct queries.  ** 
21db0 74 68 61 74 20 6d 61 6b 65 20 75 70 20 74 68 65  that make up the
21dc0 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54   compound SELECT
21dd0 20 61 72 65 20 61 6c 6c 6f 77 65 64 20 74 6f 20   are allowed to 
21de0 62 65 20 61 67 67 72 65 67 61 74 65 20 6f 72 20  be aggregate or 
21df0 64 69 73 74 69 6e 63 74 0a 20 20 2a 2a 20 71 75  distinct.  ** qu
21e00 65 72 69 65 73 2e 0a 20 20 2a 2f 0a 20 20 69 66  eries..  */.  if
21e10 28 20 70 53 75 62 2d 3e 70 50 72 69 6f 72 20 29  ( pSub->pPrior )
21e20 7b 0a 20 20 20 20 69 66 28 20 70 53 75 62 2d 3e  {.    if( pSub->
21e30 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20  pOrderBy ){.    
21e40 20 20 72 65 74 75 72 6e 20 30 3b 20 20 2f 2a 20    return 0;  /* 
21e50 52 65 73 74 72 69 63 74 69 6f 6e 20 28 32 30 29  Restriction (20)
21e60 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 69 66   */.    }.    if
21e70 28 20 69 73 41 67 67 20 7c 7c 20 28 70 2d 3e 73  ( isAgg || (p->s
21e80 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 44 69 73  elFlags & SF_Dis
21e90 74 69 6e 63 74 29 21 3d 30 20 7c 7c 20 70 53 72  tinct)!=0 || pSr
21ea0 63 2d 3e 6e 53 72 63 21 3d 31 20 29 7b 0a 20 20  c->nSrc!=1 ){.  
21eb0 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 2f 2a      return 0; /*
21ec0 20 28 31 37 64 31 29 2c 20 28 31 37 64 32 29 2c   (17d1), (17d2),
21ed0 20 6f 72 20 28 31 37 64 33 29 20 2a 2f 0a 20 20   or (17d3) */.  
21ee0 20 20 7d 0a 20 20 20 20 66 6f 72 28 70 53 75 62    }.    for(pSub
21ef0 31 3d 70 53 75 62 3b 20 70 53 75 62 31 3b 20 70  1=pSub; pSub1; p
21f00 53 75 62 31 3d 70 53 75 62 31 2d 3e 70 50 72 69  Sub1=pSub1->pPri
21f10 6f 72 29 7b 0a 20 20 20 20 20 20 74 65 73 74 63  or){.      testc
21f20 61 73 65 28 20 28 70 53 75 62 31 2d 3e 73 65 6c  ase( (pSub1->sel
21f30 46 6c 61 67 73 20 26 20 28 53 46 5f 44 69 73 74  Flags & (SF_Dist
21f40 69 6e 63 74 7c 53 46 5f 41 67 67 72 65 67 61 74  inct|SF_Aggregat
21f50 65 29 29 3d 3d 53 46 5f 44 69 73 74 69 6e 63 74  e))==SF_Distinct
21f60 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
21f70 73 65 28 20 28 70 53 75 62 31 2d 3e 73 65 6c 46  se( (pSub1->selF
21f80 6c 61 67 73 20 26 20 28 53 46 5f 44 69 73 74 69  lags & (SF_Disti
21f90 6e 63 74 7c 53 46 5f 41 67 67 72 65 67 61 74 65  nct|SF_Aggregate
21fa0 29 29 3d 3d 53 46 5f 41 67 67 72 65 67 61 74 65  ))==SF_Aggregate
21fb0 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
21fc0 28 20 70 53 75 62 2d 3e 70 53 72 63 21 3d 30 20  ( pSub->pSrc!=0 
21fd0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
21fe0 20 70 53 75 62 2d 3e 70 45 4c 69 73 74 2d 3e 6e   pSub->pEList->n
21ff0 45 78 70 72 3d 3d 70 53 75 62 31 2d 3e 70 45 4c  Expr==pSub1->pEL
22000 69 73 74 2d 3e 6e 45 78 70 72 20 29 3b 0a 20 20  ist->nExpr );.  
22010 20 20 20 20 69 66 28 20 28 70 53 75 62 31 2d 3e      if( (pSub1->
22020 73 65 6c 46 6c 61 67 73 20 26 20 28 53 46 5f 44  selFlags & (SF_D
22030 69 73 74 69 6e 63 74 7c 53 46 5f 41 67 67 72 65  istinct|SF_Aggre
22040 67 61 74 65 29 29 21 3d 30 20 20 20 20 2f 2a 20  gate))!=0    /* 
22050 28 31 37 62 29 20 2a 2f 0a 20 20 20 20 20 20 20  (17b) */.       
22060 7c 7c 20 28 70 53 75 62 31 2d 3e 70 50 72 69 6f  || (pSub1->pPrio
22070 72 20 26 26 20 70 53 75 62 31 2d 3e 6f 70 21 3d  r && pSub1->op!=
22080 54 4b 5f 41 4c 4c 29 20 20 20 20 20 20 20 20 20  TK_ALL)         
22090 20 20 20 20 20 20 20 20 2f 2a 20 28 31 37 61 29          /* (17a)
220a0 20 2a 2f 0a 20 20 20 20 20 20 20 7c 7c 20 70 53   */.       || pS
220b0 75 62 31 2d 3e 70 53 72 63 2d 3e 6e 53 72 63 3c  ub1->pSrc->nSrc<
220c0 31 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  1               
220d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
220e0 20 20 20 2f 2a 20 28 31 37 63 29 20 2a 2f 0a 20     /* (17c) */. 
220f0 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
22100 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20  return 0;.      
22110 7d 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  }.      testcase
22120 28 20 70 53 75 62 31 2d 3e 70 53 72 63 2d 3e 6e  ( pSub1->pSrc->n
22130 53 72 63 3e 31 20 29 3b 0a 20 20 20 20 7d 0a 0a  Src>1 );.    }..
22140 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69      /* Restricti
22150 6f 6e 20 28 31 38 29 2e 20 2a 2f 0a 20 20 20 20  on (18). */.    
22160 69 66 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 20  if( p->pOrderBy 
22170 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 69 3b  ){.      int ii;
22180 0a 20 20 20 20 20 20 66 6f 72 28 69 69 3d 30 3b  .      for(ii=0;
22190 20 69 69 3c 70 2d 3e 70 4f 72 64 65 72 42 79 2d   ii<p->pOrderBy-
221a0 3e 6e 45 78 70 72 3b 20 69 69 2b 2b 29 7b 0a 20  >nExpr; ii++){. 
221b0 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70 4f         if( p->pO
221c0 72 64 65 72 42 79 2d 3e 61 5b 69 69 5d 2e 75 2e  rderBy->a[ii].u.
221d0 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 3d 3d 30  x.iOrderByCol==0
221e0 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20   ) return 0;.   
221f0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
22200 20 20 2f 2a 20 45 78 2d 72 65 73 74 72 69 63 74    /* Ex-restrict
22210 69 6f 6e 20 28 32 33 29 3a 0a 20 20 2a 2a 20 54  ion (23):.  ** T
22220 68 65 20 6f 6e 6c 79 20 77 61 79 20 74 68 61 74  he only way that
22230 20 74 68 65 20 72 65 63 75 72 73 69 76 65 20 70   the recursive p
22240 61 72 74 20 6f 66 20 61 20 43 54 45 20 63 61 6e  art of a CTE can
22250 20 63 6f 6e 74 61 69 6e 20 61 20 63 6f 6d 70 6f   contain a compo
22260 75 6e 64 0a 20 20 2a 2a 20 73 75 62 71 75 65 72  und.  ** subquer
22270 79 20 69 73 20 66 6f 72 20 74 68 65 20 73 75 62  y is for the sub
22280 71 75 65 72 79 20 74 6f 20 62 65 20 6f 6e 65 20  query to be one 
22290 74 65 72 6d 20 6f 66 20 61 20 6a 6f 69 6e 2e 20  term of a join. 
222a0 20 42 75 74 20 69 66 20 74 68 65 0a 20 20 2a 2a   But if the.  **
222b0 20 73 75 62 71 75 65 72 79 20 69 73 20 61 20 6a   subquery is a j
222c0 6f 69 6e 2c 20 74 68 65 6e 20 74 68 65 20 66 6c  oin, then the fl
222d0 61 74 74 65 6e 69 6e 67 20 68 61 73 20 61 6c 72  attening has alr
222e0 65 61 64 79 20 62 65 65 6e 20 73 74 6f 70 70 65  eady been stoppe
222f0 64 20 62 79 0a 20 20 2a 2a 20 72 65 73 74 72 69  d by.  ** restri
22300 63 74 69 6f 6e 20 28 31 37 64 33 29 0a 20 20 2a  ction (17d3).  *
22310 2f 0a 20 20 61 73 73 65 72 74 28 20 28 70 2d 3e  /.  assert( (p->
22320 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 52 65  selFlags & SF_Re
22330 63 75 72 73 69 76 65 29 3d 3d 30 20 7c 7c 20 70  cursive)==0 || p
22340 53 75 62 2d 3e 70 50 72 69 6f 72 3d 3d 30 20 29  Sub->pPrior==0 )
22350 3b 0a 0a 20 20 2f 2a 2a 2a 2a 2a 20 49 66 20 77  ;..  /***** If w
22360 65 20 72 65 61 63 68 20 74 68 69 73 20 70 6f 69  e reach this poi
22370 6e 74 2c 20 66 6c 61 74 74 65 6e 69 6e 67 20 69  nt, flattening i
22380 73 20 70 65 72 6d 69 74 74 65 64 2e 20 2a 2a 2a  s permitted. ***
22390 2a 2a 2f 0a 20 20 53 45 4c 45 43 54 54 52 41 43  **/.  SELECTTRAC
223a0 45 28 31 2c 70 50 61 72 73 65 2c 70 2c 28 22 66  E(1,pParse,p,("f
223b0 6c 61 74 74 65 6e 20 25 75 2e 25 70 20 66 72 6f  latten %u.%p fro
223c0 6d 20 74 65 72 6d 20 25 64 5c 6e 22 2c 0a 20 20  m term %d\n",.  
223d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
223e0 20 70 53 75 62 2d 3e 73 65 6c 49 64 2c 20 70 53   pSub->selId, pS
223f0 75 62 2c 20 69 46 72 6f 6d 29 29 3b 0a 0a 20 20  ub, iFrom));..  
22400 2f 2a 20 41 75 74 68 6f 72 69 7a 65 20 74 68 65  /* Authorize the
22410 20 73 75 62 71 75 65 72 79 20 2a 2f 0a 20 20 70   subquery */.  p
22420 50 61 72 73 65 2d 3e 7a 41 75 74 68 43 6f 6e 74  Parse->zAuthCont
22430 65 78 74 20 3d 20 70 53 75 62 69 74 65 6d 2d 3e  ext = pSubitem->
22440 7a 4e 61 6d 65 3b 0a 20 20 54 45 53 54 4f 4e 4c  zName;.  TESTONL
22450 59 28 69 20 3d 29 20 73 71 6c 69 74 65 33 41 75  Y(i =) sqlite3Au
22460 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20  thCheck(pParse, 
22470 53 51 4c 49 54 45 5f 53 45 4c 45 43 54 2c 20 30  SQLITE_SELECT, 0
22480 2c 20 30 2c 20 30 29 3b 0a 20 20 74 65 73 74 63  , 0, 0);.  testc
22490 61 73 65 28 20 69 3d 3d 53 51 4c 49 54 45 5f 44  ase( i==SQLITE_D
224a0 45 4e 59 20 29 3b 0a 20 20 70 50 61 72 73 65 2d  ENY );.  pParse-
224b0 3e 7a 41 75 74 68 43 6f 6e 74 65 78 74 20 3d 20  >zAuthContext = 
224c0 7a 53 61 76 65 64 41 75 74 68 43 6f 6e 74 65 78  zSavedAuthContex
224d0 74 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  t;..  /* If the 
224e0 73 75 62 2d 71 75 65 72 79 20 69 73 20 61 20 63  sub-query is a c
224f0 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 20 73  ompound SELECT s
22500 74 61 74 65 6d 65 6e 74 2c 20 74 68 65 6e 20 28  tatement, then (
22510 62 79 20 72 65 73 74 72 69 63 74 69 6f 6e 73 0a  by restrictions.
22520 20 20 2a 2a 20 31 37 20 61 6e 64 20 31 38 20 61    ** 17 and 18 a
22530 62 6f 76 65 29 20 69 74 20 6d 75 73 74 20 62 65  bove) it must be
22540 20 61 20 55 4e 49 4f 4e 20 41 4c 4c 20 61 6e 64   a UNION ALL and
22550 20 74 68 65 20 70 61 72 65 6e 74 20 71 75 65 72   the parent quer
22560 79 20 6d 75 73 74 20 0a 20 20 2a 2a 20 62 65 20  y must .  ** be 
22570 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a 20 20 2a  of the form:.  *
22580 2a 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c 45 43  *.  **     SELEC
22590 54 20 3c 65 78 70 72 2d 6c 69 73 74 3e 20 46 52  T <expr-list> FR
225a0 4f 4d 20 28 3c 73 75 62 2d 71 75 65 72 79 3e 29  OM (<sub-query>)
225b0 20 3c 77 68 65 72 65 2d 63 6c 61 75 73 65 3e 20   <where-clause> 
225c0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 66 6f 6c 6c 6f  .  **.  ** follo
225d0 77 65 64 20 62 79 20 61 6e 79 20 4f 52 44 45 52  wed by any ORDER
225e0 20 42 59 2c 20 4c 49 4d 49 54 20 61 6e 64 2f 6f   BY, LIMIT and/o
225f0 72 20 4f 46 46 53 45 54 20 63 6c 61 75 73 65 73  r OFFSET clauses
22600 2e 20 54 68 69 73 20 62 6c 6f 63 6b 0a 20 20 2a  . This block.  *
22610 2a 20 63 72 65 61 74 65 73 20 4e 2d 31 20 63 6f  * creates N-1 co
22620 70 69 65 73 20 6f 66 20 74 68 65 20 70 61 72 65  pies of the pare
22630 6e 74 20 71 75 65 72 79 20 77 69 74 68 6f 75 74  nt query without
22640 20 61 6e 79 20 4f 52 44 45 52 20 42 59 2c 20 4c   any ORDER BY, L
22650 49 4d 49 54 20 6f 72 20 0a 20 20 2a 2a 20 4f 46  IMIT or .  ** OF
22660 46 53 45 54 20 63 6c 61 75 73 65 73 20 61 6e 64  FSET clauses and
22670 20 6a 6f 69 6e 73 20 74 68 65 6d 20 74 6f 20 74   joins them to t
22680 68 65 20 6c 65 66 74 2d 68 61 6e 64 2d 73 69 64  he left-hand-sid
22690 65 20 6f 66 20 74 68 65 20 6f 72 69 67 69 6e 61  e of the origina
226a0 6c 0a 20 20 2a 2a 20 75 73 69 6e 67 20 55 4e 49  l.  ** using UNI
226b0 4f 4e 20 41 4c 4c 20 6f 70 65 72 61 74 6f 72 73  ON ALL operators
226c0 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 4e  . In this case N
226d0 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   is the number o
226e0 66 20 73 69 6d 70 6c 65 0a 20 20 2a 2a 20 73 65  f simple.  ** se
226f0 6c 65 63 74 20 73 74 61 74 65 6d 65 6e 74 73 20  lect statements 
22700 69 6e 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20  in the compound 
22710 73 75 62 2d 71 75 65 72 79 2e 0a 20 20 2a 2a 0a  sub-query..  **.
22720 20 20 2a 2a 20 45 78 61 6d 70 6c 65 3a 0a 20 20    ** Example:.  
22730 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c 45  **.  **     SELE
22740 43 54 20 61 2b 31 20 46 52 4f 4d 20 28 0a 20 20  CT a+1 FROM (.  
22750 2a 2a 20 20 20 20 20 20 20 20 53 45 4c 45 43 54  **        SELECT
22760 20 78 20 46 52 4f 4d 20 74 61 62 0a 20 20 2a 2a   x FROM tab.  **
22770 20 20 20 20 20 20 20 20 55 4e 49 4f 4e 20 41 4c          UNION AL
22780 4c 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 53 45  L.  **        SE
22790 4c 45 43 54 20 79 20 46 52 4f 4d 20 74 61 62 0a  LECT y FROM tab.
227a0 20 20 2a 2a 20 20 20 20 20 20 20 20 55 4e 49 4f    **        UNIO
227b0 4e 20 41 4c 4c 0a 20 20 2a 2a 20 20 20 20 20 20  N ALL.  **      
227c0 20 20 53 45 4c 45 43 54 20 61 62 73 28 7a 2a 32    SELECT abs(z*2
227d0 29 20 46 52 4f 4d 20 74 61 62 32 0a 20 20 2a 2a  ) FROM tab2.  **
227e0 20 20 20 20 20 29 20 57 48 45 52 45 20 61 21 3d       ) WHERE a!=
227f0 35 20 4f 52 44 45 52 20 42 59 20 31 0a 20 20 2a  5 ORDER BY 1.  *
22800 2a 0a 20 20 2a 2a 20 54 72 61 6e 73 66 6f 72 6d  *.  ** Transform
22810 65 64 20 69 6e 74 6f 3a 0a 20 20 2a 2a 0a 20 20  ed into:.  **.  
22820 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 78 2b  **     SELECT x+
22830 31 20 46 52 4f 4d 20 74 61 62 20 57 48 45 52 45  1 FROM tab WHERE
22840 20 78 2b 31 21 3d 35 0a 20 20 2a 2a 20 20 20 20   x+1!=5.  **    
22850 20 55 4e 49 4f 4e 20 41 4c 4c 0a 20 20 2a 2a 20   UNION ALL.  ** 
22860 20 20 20 20 53 45 4c 45 43 54 20 79 2b 31 20 46      SELECT y+1 F
22870 52 4f 4d 20 74 61 62 20 57 48 45 52 45 20 79 2b  ROM tab WHERE y+
22880 31 21 3d 35 0a 20 20 2a 2a 20 20 20 20 20 55 4e  1!=5.  **     UN
22890 49 4f 4e 20 41 4c 4c 0a 20 20 2a 2a 20 20 20 20  ION ALL.  **    
228a0 20 53 45 4c 45 43 54 20 61 62 73 28 7a 2a 32 29   SELECT abs(z*2)
228b0 2b 31 20 46 52 4f 4d 20 74 61 62 32 20 57 48 45  +1 FROM tab2 WHE
228c0 52 45 20 61 62 73 28 7a 2a 32 29 2b 31 21 3d 35  RE abs(z*2)+1!=5
228d0 0a 20 20 2a 2a 20 20 20 20 20 4f 52 44 45 52 20  .  **     ORDER 
228e0 42 59 20 31 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57  BY 1.  **.  ** W
228f0 65 20 63 61 6c 6c 20 74 68 69 73 20 74 68 65 20  e call this the 
22900 22 63 6f 6d 70 6f 75 6e 64 2d 73 75 62 71 75 65  "compound-subque
22910 72 79 20 66 6c 61 74 74 65 6e 69 6e 67 22 2e 0a  ry flattening"..
22920 20 20 2a 2f 0a 20 20 66 6f 72 28 70 53 75 62 3d    */.  for(pSub=
22930 70 53 75 62 2d 3e 70 50 72 69 6f 72 3b 20 70 53  pSub->pPrior; pS
22940 75 62 3b 20 70 53 75 62 3d 70 53 75 62 2d 3e 70  ub; pSub=pSub->p
22950 50 72 69 6f 72 29 7b 0a 20 20 20 20 53 65 6c 65  Prior){.    Sele
22960 63 74 20 2a 70 4e 65 77 3b 0a 20 20 20 20 45 78  ct *pNew;.    Ex
22970 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79  prList *pOrderBy
22980 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a   = p->pOrderBy;.
22990 20 20 20 20 45 78 70 72 20 2a 70 4c 69 6d 69 74      Expr *pLimit
229a0 20 3d 20 70 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20   = p->pLimit;.  
229b0 20 20 53 65 6c 65 63 74 20 2a 70 50 72 69 6f 72    Select *pPrior
229c0 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20   = p->pPrior;.  
229d0 20 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20    p->pOrderBy = 
229e0 30 3b 0a 20 20 20 20 70 2d 3e 70 53 72 63 20 3d  0;.    p->pSrc =
229f0 20 30 3b 0a 20 20 20 20 70 2d 3e 70 50 72 69 6f   0;.    p->pPrio
22a00 72 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 70 4c  r = 0;.    p->pL
22a10 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20 70 4e  imit = 0;.    pN
22a20 65 77 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65  ew = sqlite3Sele
22a30 63 74 44 75 70 28 64 62 2c 20 70 2c 20 30 29 3b  ctDup(db, p, 0);
22a40 0a 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d  .    p->pLimit =
22a50 20 70 4c 69 6d 69 74 3b 0a 20 20 20 20 70 2d 3e   pLimit;.    p->
22a60 70 4f 72 64 65 72 42 79 20 3d 20 70 4f 72 64 65  pOrderBy = pOrde
22a70 72 42 79 3b 0a 20 20 20 20 70 2d 3e 70 53 72 63  rBy;.    p->pSrc
22a80 20 3d 20 70 53 72 63 3b 0a 20 20 20 20 70 2d 3e   = pSrc;.    p->
22a90 6f 70 20 3d 20 54 4b 5f 41 4c 4c 3b 0a 20 20 20  op = TK_ALL;.   
22aa0 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a   if( pNew==0 ){.
22ab0 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20        p->pPrior 
22ac0 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20 20 7d 65  = pPrior;.    }e
22ad0 6c 73 65 7b 0a 20 20 20 20 20 20 70 4e 65 77 2d  lse{.      pNew-
22ae0 3e 70 50 72 69 6f 72 20 3d 20 70 50 72 69 6f 72  >pPrior = pPrior
22af0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50 72 69  ;.      if( pPri
22b00 6f 72 20 29 20 70 50 72 69 6f 72 2d 3e 70 4e 65  or ) pPrior->pNe
22b10 78 74 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 20  xt = pNew;.     
22b20 20 70 4e 65 77 2d 3e 70 4e 65 78 74 20 3d 20 70   pNew->pNext = p
22b30 3b 0a 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f  ;.      p->pPrio
22b40 72 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 20 20  r = pNew;.      
22b50 53 45 4c 45 43 54 54 52 41 43 45 28 32 2c 70 50  SELECTTRACE(2,pP
22b60 61 72 73 65 2c 70 2c 28 22 63 6f 6d 70 6f 75 6e  arse,p,("compoun
22b70 64 2d 73 75 62 71 75 65 72 79 20 66 6c 61 74 74  d-subquery flatt
22b80 65 6e 65 72 22 0a 20 20 20 20 20 20 20 20 20 20  ener".          
22b90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22ba0 20 20 20 20 22 20 63 72 65 61 74 65 73 20 25 75      " creates %u
22bb0 20 61 73 20 70 65 65 72 5c 6e 22 2c 70 4e 65 77   as peer\n",pNew
22bc0 2d 3e 73 65 6c 49 64 29 29 3b 0a 20 20 20 20 7d  ->selId));.    }
22bd0 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c  .    if( db->mal
22be0 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74 75  locFailed ) retu
22bf0 72 6e 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  rn 1;.  }..  /* 
22c00 42 65 67 69 6e 20 66 6c 61 74 74 65 6e 69 6e 67  Begin flattening
22c10 20 74 68 65 20 69 46 72 6f 6d 2d 74 68 20 65 6e   the iFrom-th en
22c20 74 72 79 20 6f 66 20 74 68 65 20 46 52 4f 4d 20  try of the FROM 
22c30 63 6c 61 75 73 65 20 0a 20 20 2a 2a 20 69 6e 20  clause .  ** in 
22c40 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 2e  the outer query.
22c50 0a 20 20 2a 2f 0a 20 20 70 53 75 62 20 3d 20 70  .  */.  pSub = p
22c60 53 75 62 31 20 3d 20 70 53 75 62 69 74 65 6d 2d  Sub1 = pSubitem-
22c70 3e 70 53 65 6c 65 63 74 3b 0a 0a 20 20 2f 2a 20  >pSelect;..  /* 
22c80 44 65 6c 65 74 65 20 74 68 65 20 74 72 61 6e 73  Delete the trans
22c90 69 65 6e 74 20 74 61 62 6c 65 20 73 74 72 75 63  ient table struc
22ca0 74 75 72 65 20 61 73 73 6f 63 69 61 74 65 64 20  ture associated 
22cb0 77 69 74 68 20 74 68 65 0a 20 20 2a 2a 20 73 75  with the.  ** su
22cc0 62 71 75 65 72 79 0a 20 20 2a 2f 0a 20 20 73 71  bquery.  */.  sq
22cd0 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
22ce0 70 53 75 62 69 74 65 6d 2d 3e 7a 44 61 74 61 62  pSubitem->zDatab
22cf0 61 73 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 44  ase);.  sqlite3D
22d00 62 46 72 65 65 28 64 62 2c 20 70 53 75 62 69 74  bFree(db, pSubit
22d10 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 73 71  em->zName);.  sq
22d20 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
22d30 70 53 75 62 69 74 65 6d 2d 3e 7a 41 6c 69 61 73  pSubitem->zAlias
22d40 29 3b 0a 20 20 70 53 75 62 69 74 65 6d 2d 3e 7a  );.  pSubitem->z
22d50 44 61 74 61 62 61 73 65 20 3d 20 30 3b 0a 20 20  Database = 0;.  
22d60 70 53 75 62 69 74 65 6d 2d 3e 7a 4e 61 6d 65 20  pSubitem->zName 
22d70 3d 20 30 3b 0a 20 20 70 53 75 62 69 74 65 6d 2d  = 0;.  pSubitem-
22d80 3e 7a 41 6c 69 61 73 20 3d 20 30 3b 0a 20 20 70  >zAlias = 0;.  p
22d90 53 75 62 69 74 65 6d 2d 3e 70 53 65 6c 65 63 74  Subitem->pSelect
22da0 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 44 65 66 65   = 0;..  /* Defe
22db0 72 20 64 65 6c 65 74 69 6e 67 20 74 68 65 20 54  r deleting the T
22dc0 61 62 6c 65 20 6f 62 6a 65 63 74 20 61 73 73 6f  able object asso
22dd0 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65 0a  ciated with the.
22de0 20 20 2a 2a 20 73 75 62 71 75 65 72 79 20 75 6e    ** subquery un
22df0 74 69 6c 20 63 6f 64 65 20 67 65 6e 65 72 61 74  til code generat
22e00 69 6f 6e 20 69 73 0a 20 20 2a 2a 20 63 6f 6d 70  ion is.  ** comp
22e10 6c 65 74 65 2c 20 73 69 6e 63 65 20 74 68 65 72  lete, since ther
22e20 65 20 6d 61 79 20 73 74 69 6c 6c 20 65 78 69 73  e may still exis
22e30 74 20 45 78 70 72 2e 70 54 61 62 20 65 6e 74 72  t Expr.pTab entr
22e40 69 65 73 20 74 68 61 74 0a 20 20 2a 2a 20 72 65  ies that.  ** re
22e50 66 65 72 20 74 6f 20 74 68 65 20 73 75 62 71 75  fer to the subqu
22e60 65 72 79 20 65 76 65 6e 20 61 66 74 65 72 20 66  ery even after f
22e70 6c 61 74 74 65 6e 69 6e 67 2e 20 20 54 69 63 6b  lattening.  Tick
22e80 65 74 20 23 33 33 34 36 2e 0a 20 20 2a 2a 0a 20  et #3346..  **. 
22e90 20 2a 2a 20 70 53 75 62 69 74 65 6d 2d 3e 70 54   ** pSubitem->pT
22ea0 61 62 20 69 73 20 61 6c 77 61 79 73 20 6e 6f 6e  ab is always non
22eb0 2d 4e 55 4c 4c 20 62 79 20 74 65 73 74 20 72 65  -NULL by test re
22ec0 73 74 72 69 63 74 69 6f 6e 73 20 61 6e 64 20 74  strictions and t
22ed0 65 73 74 73 20 61 62 6f 76 65 2e 0a 20 20 2a 2f  ests above..  */
22ee0 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28 70 53  .  if( ALWAYS(pS
22ef0 75 62 69 74 65 6d 2d 3e 70 54 61 62 21 3d 30 29  ubitem->pTab!=0)
22f00 20 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70   ){.    Table *p
22f10 54 61 62 54 6f 44 65 6c 20 3d 20 70 53 75 62 69  TabToDel = pSubi
22f20 74 65 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20 69  tem->pTab;.    i
22f30 66 28 20 70 54 61 62 54 6f 44 65 6c 2d 3e 6e 54  f( pTabToDel->nT
22f40 61 62 52 65 66 3d 3d 31 20 29 7b 0a 20 20 20 20  abRef==1 ){.    
22f50 20 20 50 61 72 73 65 20 2a 70 54 6f 70 6c 65 76    Parse *pToplev
22f60 65 6c 20 3d 20 73 71 6c 69 74 65 33 50 61 72 73  el = sqlite3Pars
22f70 65 54 6f 70 6c 65 76 65 6c 28 70 50 61 72 73 65  eToplevel(pParse
22f80 29 3b 0a 20 20 20 20 20 20 70 54 61 62 54 6f 44  );.      pTabToD
22f90 65 6c 2d 3e 70 4e 65 78 74 5a 6f 6d 62 69 65 20  el->pNextZombie 
22fa0 3d 20 70 54 6f 70 6c 65 76 65 6c 2d 3e 70 5a 6f  = pToplevel->pZo
22fb0 6d 62 69 65 54 61 62 3b 0a 20 20 20 20 20 20 70  mbieTab;.      p
22fc0 54 6f 70 6c 65 76 65 6c 2d 3e 70 5a 6f 6d 62 69  Toplevel->pZombi
22fd0 65 54 61 62 20 3d 20 70 54 61 62 54 6f 44 65 6c  eTab = pTabToDel
22fe0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
22ff0 20 20 20 70 54 61 62 54 6f 44 65 6c 2d 3e 6e 54     pTabToDel->nT
23000 61 62 52 65 66 2d 2d 3b 0a 20 20 20 20 7d 0a 20  abRef--;.    }. 
23010 20 20 20 70 53 75 62 69 74 65 6d 2d 3e 70 54 61     pSubitem->pTa
23020 62 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  b = 0;.  }..  /*
23030 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6c   The following l
23040 6f 6f 70 20 72 75 6e 73 20 6f 6e 63 65 20 66 6f  oop runs once fo
23050 72 20 65 61 63 68 20 74 65 72 6d 20 69 6e 20 61  r each term in a
23060 20 63 6f 6d 70 6f 75 6e 64 2d 73 75 62 71 75 65   compound-subque
23070 72 79 0a 20 20 2a 2a 20 66 6c 61 74 74 65 6e 69  ry.  ** flatteni
23080 6e 67 20 28 61 73 20 64 65 73 63 72 69 62 65 64  ng (as described
23090 20 61 62 6f 76 65 29 2e 20 20 49 66 20 77 65 20   above).  If we 
230a0 61 72 65 20 64 6f 69 6e 67 20 61 20 64 69 66 66  are doing a diff
230b0 65 72 65 6e 74 20 6b 69 6e 64 0a 20 20 2a 2a 20  erent kind.  ** 
230c0 6f 66 20 66 6c 61 74 74 65 6e 69 6e 67 20 2d 20  of flattening - 
230d0 61 20 66 6c 61 74 74 65 6e 69 6e 67 20 6f 74 68  a flattening oth
230e0 65 72 20 74 68 61 6e 20 61 20 63 6f 6d 70 6f 75  er than a compou
230f0 6e 64 2d 73 75 62 71 75 65 72 79 20 66 6c 61 74  nd-subquery flat
23100 74 65 6e 69 6e 67 20 2d 0a 20 20 2a 2a 20 74 68  tening -.  ** th
23110 65 6e 20 74 68 69 73 20 6c 6f 6f 70 20 6f 6e 6c  en this loop onl
23120 79 20 72 75 6e 73 20 6f 6e 63 65 2e 0a 20 20 2a  y runs once..  *
23130 2a 0a 20 20 2a 2a 20 54 68 69 73 20 6c 6f 6f 70  *.  ** This loop
23140 20 6d 6f 76 65 73 20 61 6c 6c 20 6f 66 20 74 68   moves all of th
23150 65 20 46 52 4f 4d 20 65 6c 65 6d 65 6e 74 73 20  e FROM elements 
23160 6f 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20  of the subquery 
23170 69 6e 74 6f 20 74 68 65 0a 20 20 2a 2a 20 74 68  into the.  ** th
23180 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66  e FROM clause of
23190 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
231a0 2e 20 20 42 65 66 6f 72 65 20 64 6f 69 6e 67 20  .  Before doing 
231b0 74 68 69 73 2c 20 72 65 6d 65 6d 62 65 72 0a 20  this, remember. 
231c0 20 2a 2a 20 74 68 65 20 63 75 72 73 6f 72 20 6e   ** the cursor n
231d0 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20 6f 72  umber for the or
231e0 69 67 69 6e 61 6c 20 6f 75 74 65 72 20 71 75 65  iginal outer que
231f0 72 79 20 46 52 4f 4d 20 65 6c 65 6d 65 6e 74 20  ry FROM element 
23200 69 6e 0a 20 20 2a 2a 20 69 50 61 72 65 6e 74 2e  in.  ** iParent.
23210 20 20 54 68 65 20 69 50 61 72 65 6e 74 20 63 75    The iParent cu
23220 72 73 6f 72 20 77 69 6c 6c 20 6e 65 76 65 72 20  rsor will never 
23230 62 65 20 75 73 65 64 2e 20 20 53 75 62 73 65 71  be used.  Subseq
23240 75 65 6e 74 20 63 6f 64 65 0a 20 20 2a 2a 20 77  uent code.  ** w
23250 69 6c 6c 20 73 63 61 6e 20 65 78 70 72 65 73 73  ill scan express
23260 69 6f 6e 73 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72  ions looking for
23270 20 69 50 61 72 65 6e 74 20 72 65 66 65 72 65 6e   iParent referen
23280 63 65 73 20 61 6e 64 20 72 65 70 6c 61 63 65 0a  ces and replace.
23290 20 20 2a 2a 20 74 68 6f 73 65 20 72 65 66 65 72    ** those refer
232a0 65 6e 63 65 73 20 77 69 74 68 20 65 78 70 72 65  ences with expre
232b0 73 73 69 6f 6e 73 20 74 68 61 74 20 72 65 73 6f  ssions that reso
232c0 6c 76 65 20 74 6f 20 74 68 65 20 73 75 62 71 75  lve to the subqu
232d0 65 72 79 20 46 52 4f 4d 0a 20 20 2a 2a 20 65 6c  ery FROM.  ** el
232e0 65 6d 65 6e 74 73 20 77 65 20 61 72 65 20 6e 6f  ements we are no
232f0 77 20 63 6f 70 79 69 6e 67 20 69 6e 2e 0a 20 20  w copying in..  
23300 2a 2f 0a 20 20 66 6f 72 28 70 50 61 72 65 6e 74  */.  for(pParent
23310 3d 70 3b 20 70 50 61 72 65 6e 74 3b 20 70 50 61  =p; pParent; pPa
23320 72 65 6e 74 3d 70 50 61 72 65 6e 74 2d 3e 70 50  rent=pParent->pP
23330 72 69 6f 72 2c 20 70 53 75 62 3d 70 53 75 62 2d  rior, pSub=pSub-
23340 3e 70 50 72 69 6f 72 29 7b 0a 20 20 20 20 69 6e  >pPrior){.    in
23350 74 20 6e 53 75 62 53 72 63 3b 0a 20 20 20 20 75  t nSubSrc;.    u
23360 38 20 6a 6f 69 6e 74 79 70 65 20 3d 20 30 3b 0a  8 jointype = 0;.
23370 20 20 20 20 70 53 75 62 53 72 63 20 3d 20 70 53      pSubSrc = pS
23380 75 62 2d 3e 70 53 72 63 3b 20 20 20 20 20 2f 2a  ub->pSrc;     /*
23390 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20   FROM clause of 
233a0 73 75 62 71 75 65 72 79 20 2a 2f 0a 20 20 20 20  subquery */.    
233b0 6e 53 75 62 53 72 63 20 3d 20 70 53 75 62 53 72  nSubSrc = pSubSr
233c0 63 2d 3e 6e 53 72 63 3b 20 20 2f 2a 20 4e 75 6d  c->nSrc;  /* Num
233d0 62 65 72 20 6f 66 20 74 65 72 6d 73 20 69 6e 20  ber of terms in 
233e0 73 75 62 71 75 65 72 79 20 46 52 4f 4d 20 63 6c  subquery FROM cl
233f0 61 75 73 65 20 2a 2f 0a 20 20 20 20 70 53 72 63  ause */.    pSrc
23400 20 3d 20 70 50 61 72 65 6e 74 2d 3e 70 53 72 63   = pParent->pSrc
23410 3b 20 20 20 20 20 2f 2a 20 46 52 4f 4d 20 63 6c  ;     /* FROM cl
23420 61 75 73 65 20 6f 66 20 74 68 65 20 6f 75 74 65  ause of the oute
23430 72 20 71 75 65 72 79 20 2a 2f 0a 0a 20 20 20 20  r query */..    
23440 69 66 28 20 70 53 72 63 20 29 7b 0a 20 20 20 20  if( pSrc ){.    
23450 20 20 61 73 73 65 72 74 28 20 70 50 61 72 65 6e    assert( pParen
23460 74 3d 3d 70 20 29 3b 20 20 2f 2a 20 46 69 72 73  t==p );  /* Firs
23470 74 20 74 69 6d 65 20 74 68 72 6f 75 67 68 20 74  t time through t
23480 68 65 20 6c 6f 6f 70 20 2a 2f 0a 20 20 20 20 20  he loop */.     
23490 20 6a 6f 69 6e 74 79 70 65 20 3d 20 70 53 75 62   jointype = pSub
234a0 69 74 65 6d 2d 3e 66 67 2e 6a 6f 69 6e 74 79 70  item->fg.jointyp
234b0 65 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  e;.    }else{.  
234c0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72      assert( pPar
234d0 65 6e 74 21 3d 70 20 29 3b 20 20 2f 2a 20 32 6e  ent!=p );  /* 2n
234e0 64 20 61 6e 64 20 73 75 62 73 65 71 75 65 6e 74  d and subsequent
234f0 20 74 69 6d 65 73 20 74 68 72 6f 75 67 68 20 74   times through t
23500 68 65 20 6c 6f 6f 70 20 2a 2f 0a 20 20 20 20 20  he loop */.     
23510 20 70 53 72 63 20 3d 20 70 50 61 72 65 6e 74 2d   pSrc = pParent-
23520 3e 70 53 72 63 20 3d 20 73 71 6c 69 74 65 33 53  >pSrc = sqlite3S
23530 72 63 4c 69 73 74 41 70 70 65 6e 64 28 64 62 2c  rcListAppend(db,
23540 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20   0, 0, 0);.     
23550 20 69 66 28 20 70 53 72 63 3d 3d 30 20 29 7b 0a   if( pSrc==0 ){.
23560 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
23570 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
23580 20 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61   );.        brea
23590 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  k;.      }.    }
235a0 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 73 75 62  ..    /* The sub
235b0 71 75 65 72 79 20 75 73 65 73 20 61 20 73 69 6e  query uses a sin
235c0 67 6c 65 20 73 6c 6f 74 20 6f 66 20 74 68 65 20  gle slot of the 
235d0 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74  FROM clause of t
235e0 68 65 20 6f 75 74 65 72 0a 20 20 20 20 2a 2a 20  he outer.    ** 
235f0 71 75 65 72 79 2e 20 20 49 66 20 74 68 65 20 73  query.  If the s
23600 75 62 71 75 65 72 79 20 68 61 73 20 6d 6f 72 65  ubquery has more
23610 20 74 68 61 6e 20 6f 6e 65 20 65 6c 65 6d 65 6e   than one elemen
23620 74 20 69 6e 20 69 74 73 20 46 52 4f 4d 20 63 6c  t in its FROM cl
23630 61 75 73 65 2c 0a 20 20 20 20 2a 2a 20 74 68 65  ause,.    ** the
23640 6e 20 65 78 70 61 6e 64 20 74 68 65 20 6f 75 74  n expand the out
23650 65 72 20 71 75 65 72 79 20 74 6f 20 6d 61 6b 65  er query to make
23660 20 73 70 61 63 65 20 66 6f 72 20 69 74 20 74 6f   space for it to
23670 20 68 6f 6c 64 20 61 6c 6c 20 65 6c 65 6d 65 6e   hold all elemen
23680 74 73 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65  ts.    ** of the
23690 20 73 75 62 71 75 65 72 79 2e 0a 20 20 20 20 2a   subquery..    *
236a0 2a 0a 20 20 20 20 2a 2a 20 45 78 61 6d 70 6c 65  *.    ** Example
236b0 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  :.    **.    ** 
236c0 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d     SELECT * FROM
236d0 20 74 61 62 41 2c 20 28 53 45 4c 45 43 54 20 2a   tabA, (SELECT *
236e0 20 46 52 4f 4d 20 73 75 62 31 2c 20 73 75 62 32   FROM sub1, sub2
236f0 29 2c 20 74 61 62 42 3b 0a 20 20 20 20 2a 2a 0a  ), tabB;.    **.
23700 20 20 20 20 2a 2a 20 54 68 65 20 6f 75 74 65 72      ** The outer
23710 20 71 75 65 72 79 20 68 61 73 20 33 20 73 6c 6f   query has 3 slo
23720 74 73 20 69 6e 20 69 74 73 20 46 52 4f 4d 20 63  ts in its FROM c
23730 6c 61 75 73 65 2e 20 20 4f 6e 65 20 73 6c 6f 74  lause.  One slot
23740 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 6f   of the.    ** o
23750 75 74 65 72 20 71 75 65 72 79 20 28 74 68 65 20  uter query (the 
23760 6d 69 64 64 6c 65 20 73 6c 6f 74 29 20 69 73 20  middle slot) is 
23770 75 73 65 64 20 62 79 20 74 68 65 20 73 75 62 71  used by the subq
23780 75 65 72 79 2e 20 20 54 68 65 20 6e 65 78 74 0a  uery.  The next.
23790 20 20 20 20 2a 2a 20 62 6c 6f 63 6b 20 6f 66 20      ** block of 
237a0 63 6f 64 65 20 77 69 6c 6c 20 65 78 70 61 6e 64  code will expand
237b0 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
237c0 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 6f 20   FROM clause to 
237d0 34 20 73 6c 6f 74 73 2e 0a 20 20 20 20 2a 2a 20  4 slots..    ** 
237e0 54 68 65 20 6d 69 64 64 6c 65 20 73 6c 6f 74 20  The middle slot 
237f0 69 73 20 65 78 70 61 6e 64 65 64 20 74 6f 20 74  is expanded to t
23800 77 6f 20 73 6c 6f 74 73 20 69 6e 20 6f 72 64 65  wo slots in orde
23810 72 20 74 6f 20 6d 61 6b 65 20 73 70 61 63 65 0a  r to make space.
23820 20 20 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 74      ** for the t
23830 77 6f 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20 74  wo elements in t
23840 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f  he FROM clause o
23850 66 20 74 68 65 20 73 75 62 71 75 65 72 79 2e 0a  f the subquery..
23860 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e      */.    if( n
23870 53 75 62 53 72 63 3e 31 20 29 7b 0a 20 20 20 20  SubSrc>1 ){.    
23880 20 20 70 50 61 72 65 6e 74 2d 3e 70 53 72 63 20    pParent->pSrc 
23890 3d 20 70 53 72 63 20 3d 20 73 71 6c 69 74 65 33  = pSrc = sqlite3
238a0 53 72 63 4c 69 73 74 45 6e 6c 61 72 67 65 28 64  SrcListEnlarge(d
238b0 62 2c 20 70 53 72 63 2c 20 6e 53 75 62 53 72 63  b, pSrc, nSubSrc
238c0 2d 31 2c 69 46 72 6f 6d 2b 31 29 3b 0a 20 20 20  -1,iFrom+1);.   
238d0 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f     if( db->mallo
238e0 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 20  cFailed ){.     
238f0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
23900 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
23910 54 72 61 6e 73 66 65 72 20 74 68 65 20 46 52 4f  Transfer the FRO
23920 4d 20 63 6c 61 75 73 65 20 74 65 72 6d 73 20 66  M clause terms f
23930 72 6f 6d 20 74 68 65 20 73 75 62 71 75 65 72 79  rom the subquery
23940 20 69 6e 74 6f 20 74 68 65 0a 20 20 20 20 2a 2a   into the.    **
23950 20 6f 75 74 65 72 20 71 75 65 72 79 2e 0a 20 20   outer query..  
23960 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30    */.    for(i=0
23970 3b 20 69 3c 6e 53 75 62 53 72 63 3b 20 69 2b 2b  ; i<nSubSrc; i++
23980 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
23990 49 64 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c  IdListDelete(db,
239a0 20 70 53 72 63 2d 3e 61 5b 69 2b 69 46 72 6f 6d   pSrc->a[i+iFrom
239b0 5d 2e 70 55 73 69 6e 67 29 3b 0a 20 20 20 20 20  ].pUsing);.     
239c0 20 61 73 73 65 72 74 28 20 70 53 72 63 2d 3e 61   assert( pSrc->a
239d0 5b 69 2b 69 46 72 6f 6d 5d 2e 66 67 2e 69 73 54  [i+iFrom].fg.isT
239e0 61 62 46 75 6e 63 3d 3d 30 20 29 3b 0a 20 20 20  abFunc==0 );.   
239f0 20 20 20 70 53 72 63 2d 3e 61 5b 69 2b 69 46 72     pSrc->a[i+iFr
23a00 6f 6d 5d 20 3d 20 70 53 75 62 53 72 63 2d 3e 61  om] = pSubSrc->a
23a10 5b 69 5d 3b 0a 20 20 20 20 20 20 69 4e 65 77 50  [i];.      iNewP
23a20 61 72 65 6e 74 20 3d 20 70 53 75 62 53 72 63 2d  arent = pSubSrc-
23a30 3e 61 5b 69 5d 2e 69 43 75 72 73 6f 72 3b 0a 20  >a[i].iCursor;. 
23a40 20 20 20 20 20 6d 65 6d 73 65 74 28 26 70 53 75       memset(&pSu
23a50 62 53 72 63 2d 3e 61 5b 69 5d 2c 20 30 2c 20 73  bSrc->a[i], 0, s
23a60 69 7a 65 6f 66 28 70 53 75 62 53 72 63 2d 3e 61  izeof(pSubSrc->a
23a70 5b 69 5d 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20  [i]));.    }.   
23a80 20 70 53 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d 2e   pSrc->a[iFrom].
23a90 66 67 2e 6a 6f 69 6e 74 79 70 65 20 3d 20 6a 6f  fg.jointype = jo
23aa0 69 6e 74 79 70 65 3b 0a 20 20 0a 20 20 20 20 2f  intype;.  .    /
23ab0 2a 20 4e 6f 77 20 62 65 67 69 6e 20 73 75 62 73  * Now begin subs
23ac0 74 69 74 75 74 69 6e 67 20 73 75 62 71 75 65 72  tituting subquer
23ad0 79 20 72 65 73 75 6c 74 20 73 65 74 20 65 78 70  y result set exp
23ae0 72 65 73 73 69 6f 6e 73 20 66 6f 72 20 0a 20 20  ressions for .  
23af0 20 20 2a 2a 20 72 65 66 65 72 65 6e 63 65 73 20    ** references 
23b00 74 6f 20 74 68 65 20 69 50 61 72 65 6e 74 20 69  to the iParent i
23b10 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  n the outer quer
23b20 79 2e 0a 20 20 20 20 2a 2a 20 0a 20 20 20 20 2a  y..    ** .    *
23b30 2a 20 45 78 61 6d 70 6c 65 3a 0a 20 20 20 20 2a  * Example:.    *
23b40 2a 0a 20 20 20 20 2a 2a 20 20 20 53 45 4c 45 43  *.    **   SELEC
23b50 54 20 61 2b 35 2c 20 62 2a 31 30 20 46 52 4f 4d  T a+5, b*10 FROM
23b60 20 28 53 45 4c 45 43 54 20 78 2a 33 20 41 53 20   (SELECT x*3 AS 
23b70 61 2c 20 79 2b 31 30 20 41 53 20 62 20 46 52 4f  a, y+10 AS b FRO
23b80 4d 20 74 31 29 20 57 48 45 52 45 20 61 3e 62 3b  M t1) WHERE a>b;
23b90 0a 20 20 20 20 2a 2a 20 20 20 5c 20 20 20 20 20  .    **   \     
23ba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23bb0 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 20 73  \_____________ s
23bc0 75 62 71 75 65 72 79 20 5f 5f 5f 5f 5f 5f 5f 5f  ubquery ________
23bd0 5f 5f 2f 20 20 20 20 20 20 20 20 20 20 2f 0a 20  __/          /. 
23be0 20 20 20 2a 2a 20 20 20 20 5c 5f 5f 5f 5f 5f 5f     **    \______
23bf0 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 20  _______________ 
23c00 6f 75 74 65 72 20 71 75 65 72 79 20 5f 5f 5f 5f  outer query ____
23c10 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
23c20 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 0a 20 20 20 20  __________/.    
23c30 2a 2a 0a 20 20 20 20 2a 2a 20 57 65 20 6c 6f 6f  **.    ** We loo
23c40 6b 20 61 74 20 65 76 65 72 79 20 65 78 70 72 65  k at every expre
23c50 73 73 69 6f 6e 20 69 6e 20 74 68 65 20 6f 75 74  ssion in the out
23c60 65 72 20 71 75 65 72 79 20 61 6e 64 20 65 76 65  er query and eve
23c70 72 79 20 70 6c 61 63 65 20 77 65 20 73 65 65 0a  ry place we see.
23c80 20 20 20 20 2a 2a 20 22 61 22 20 77 65 20 73 75      ** "a" we su
23c90 62 73 74 69 74 75 74 65 20 22 78 2a 33 22 20 61  bstitute "x*3" a
23ca0 6e 64 20 65 76 65 72 79 20 70 6c 61 63 65 20 77  nd every place w
23cb0 65 20 73 65 65 20 22 62 22 20 77 65 20 73 75 62  e see "b" we sub
23cc0 73 74 69 74 75 74 65 20 22 79 2b 31 30 22 2e 0a  stitute "y+10"..
23cd0 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
23ce0 53 75 62 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b  Sub->pOrderBy ){
23cf0 0a 20 20 20 20 20 20 2f 2a 20 41 74 20 74 68 69  .      /* At thi
23d00 73 20 70 6f 69 6e 74 2c 20 61 6e 79 20 6e 6f 6e  s point, any non
23d10 2d 7a 65 72 6f 20 69 4f 72 64 65 72 42 79 43 6f  -zero iOrderByCo
23d20 6c 20 76 61 6c 75 65 73 20 69 6e 64 69 63 61 74  l values indicat
23d30 65 20 74 68 61 74 20 74 68 65 0a 20 20 20 20 20  e that the.     
23d40 20 2a 2a 20 4f 52 44 45 52 20 42 59 20 63 6f 6c   ** ORDER BY col
23d50 75 6d 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 69  umn expression i
23d60 73 20 69 64 65 6e 74 69 63 61 6c 20 74 6f 20 74  s identical to t
23d70 68 65 20 69 4f 72 64 65 72 42 79 43 6f 6c 27 74  he iOrderByCol't
23d80 68 0a 20 20 20 20 20 20 2a 2a 20 65 78 70 72 65  h.      ** expre
23d90 73 73 69 6f 6e 20 72 65 74 75 72 6e 65 64 20 62  ssion returned b
23da0 79 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  y SELECT stateme
23db0 6e 74 20 70 53 75 62 2e 20 53 69 6e 63 65 20 74  nt pSub. Since t
23dc0 68 65 73 65 20 76 61 6c 75 65 73 0a 20 20 20 20  hese values.    
23dd0 20 20 2a 2a 20 64 6f 20 6e 6f 74 20 6e 65 63 65    ** do not nece
23de0 73 73 61 72 69 6c 79 20 63 6f 72 72 65 73 70 6f  ssarily correspo
23df0 6e 64 20 74 6f 20 63 6f 6c 75 6d 6e 73 20 69 6e  nd to columns in
23e00 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
23e10 74 20 70 50 61 72 65 6e 74 2c 0a 20 20 20 20 20  t pParent,.     
23e20 20 2a 2a 20 7a 65 72 6f 20 74 68 65 6d 20 62 65   ** zero them be
23e30 66 6f 72 65 20 74 72 61 6e 73 66 65 72 69 6e 67  fore transfering
23e40 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   the ORDER BY cl
23e50 61 75 73 65 2e 0a 20 20 20 20 20 20 2a 2a 0a 20  ause..      **. 
23e60 20 20 20 20 20 2a 2a 20 4e 6f 74 20 64 6f 69 6e       ** Not doin
23e70 67 20 74 68 69 73 20 6d 61 79 20 63 61 75 73 65  g this may cause
23e80 20 61 6e 20 65 72 72 6f 72 20 69 66 20 61 20 73   an error if a s
23e90 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 20 74  ubsequent call t
23ea0 6f 20 74 68 69 73 0a 20 20 20 20 20 20 2a 2a 20  o this.      ** 
23eb0 66 75 6e 63 74 69 6f 6e 20 61 74 74 65 6d 70 74  function attempt
23ec0 73 20 74 6f 20 66 6c 61 74 74 65 6e 20 61 20 63  s to flatten a c
23ed0 6f 6d 70 6f 75 6e 64 20 73 75 62 2d 71 75 65 72  ompound sub-quer
23ee0 79 20 69 6e 74 6f 20 70 50 61 72 65 6e 74 0a 20  y into pParent. 
23ef0 20 20 20 20 20 2a 2a 20 28 74 68 65 20 6f 6e 6c       ** (the onl
23f00 79 20 77 61 79 20 74 68 69 73 20 63 61 6e 20 68  y way this can h
23f10 61 70 70 65 6e 20 69 73 20 69 66 20 74 68 65 20  appen is if the 
23f20 63 6f 6d 70 6f 75 6e 64 20 73 75 62 2d 71 75 65  compound sub-que
23f30 72 79 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 63  ry is.      ** c
23f40 75 72 72 65 6e 74 6c 79 20 70 61 72 74 20 6f 66  urrently part of
23f50 20 70 53 75 62 2d 3e 70 53 72 63 29 2e 20 53 65   pSub->pSrc). Se
23f60 65 20 74 69 63 6b 65 74 20 5b 64 31 31 61 36 65  e ticket [d11a6e
23f70 39 30 38 66 5d 2e 20 20 2a 2f 0a 20 20 20 20 20  908f].  */.     
23f80 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65   ExprList *pOrde
23f90 72 42 79 20 3d 20 70 53 75 62 2d 3e 70 4f 72 64  rBy = pSub->pOrd
23fa0 65 72 42 79 3b 0a 20 20 20 20 20 20 66 6f 72 28  erBy;.      for(
23fb0 69 3d 30 3b 20 69 3c 70 4f 72 64 65 72 42 79 2d  i=0; i<pOrderBy-
23fc0 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20  >nExpr; i++){.  
23fd0 20 20 20 20 20 20 70 4f 72 64 65 72 42 79 2d 3e        pOrderBy->
23fe0 61 5b 69 5d 2e 75 2e 78 2e 69 4f 72 64 65 72 42  a[i].u.x.iOrderB
23ff0 79 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20  yCol = 0;.      
24000 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  }.      assert( 
24010 70 50 61 72 65 6e 74 2d 3e 70 4f 72 64 65 72 42  pParent->pOrderB
24020 79 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 50  y==0 );.      pP
24030 61 72 65 6e 74 2d 3e 70 4f 72 64 65 72 42 79 20  arent->pOrderBy 
24040 3d 20 70 4f 72 64 65 72 42 79 3b 0a 20 20 20 20  = pOrderBy;.    
24050 20 20 70 53 75 62 2d 3e 70 4f 72 64 65 72 42 79    pSub->pOrderBy
24060 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20   = 0;.    }.    
24070 70 57 68 65 72 65 20 3d 20 73 71 6c 69 74 65 33  pWhere = sqlite3
24080 45 78 70 72 44 75 70 28 64 62 2c 20 70 53 75 62  ExprDup(db, pSub
24090 2d 3e 70 57 68 65 72 65 2c 20 30 29 3b 0a 20 20  ->pWhere, 0);.  
240a0 20 20 69 66 28 20 69 73 4c 65 66 74 4a 6f 69 6e    if( isLeftJoin
240b0 3e 30 20 29 7b 0a 20 20 20 20 20 20 73 65 74 4a  >0 ){.      setJ
240c0 6f 69 6e 45 78 70 72 28 70 57 68 65 72 65 2c 20  oinExpr(pWhere, 
240d0 69 4e 65 77 50 61 72 65 6e 74 29 3b 0a 20 20 20  iNewParent);.   
240e0 20 7d 0a 20 20 20 20 70 50 61 72 65 6e 74 2d 3e   }.    pParent->
240f0 70 57 68 65 72 65 20 3d 20 73 71 6c 69 74 65 33  pWhere = sqlite3
24100 45 78 70 72 41 6e 64 28 64 62 2c 20 70 57 68 65  ExprAnd(db, pWhe
24110 72 65 2c 20 70 50 61 72 65 6e 74 2d 3e 70 57 68  re, pParent->pWh
24120 65 72 65 29 3b 0a 20 20 20 20 69 66 28 20 64 62  ere);.    if( db
24130 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 3d 3d  ->mallocFailed==
24140 30 20 29 7b 0a 20 20 20 20 20 20 53 75 62 73 74  0 ){.      Subst
24150 43 6f 6e 74 65 78 74 20 78 3b 0a 20 20 20 20 20  Context x;.     
24160 20 78 2e 70 50 61 72 73 65 20 3d 20 70 50 61 72   x.pParse = pPar
24170 73 65 3b 0a 20 20 20 20 20 20 78 2e 69 54 61 62  se;.      x.iTab
24180 6c 65 20 3d 20 69 50 61 72 65 6e 74 3b 0a 20 20  le = iParent;.  
24190 20 20 20 20 78 2e 69 4e 65 77 54 61 62 6c 65 20      x.iNewTable 
241a0 3d 20 69 4e 65 77 50 61 72 65 6e 74 3b 0a 20 20  = iNewParent;.  
241b0 20 20 20 20 78 2e 69 73 4c 65 66 74 4a 6f 69 6e      x.isLeftJoin
241c0 20 3d 20 69 73 4c 65 66 74 4a 6f 69 6e 3b 0a 20   = isLeftJoin;. 
241d0 20 20 20 20 20 78 2e 70 45 4c 69 73 74 20 3d 20       x.pEList = 
241e0 70 53 75 62 2d 3e 70 45 4c 69 73 74 3b 0a 20 20  pSub->pEList;.  
241f0 20 20 20 20 73 75 62 73 74 53 65 6c 65 63 74 28      substSelect(
24200 26 78 2c 20 70 50 61 72 65 6e 74 2c 20 30 29 3b  &x, pParent, 0);
24210 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a  .    }.  .    /*
24220 20 54 68 65 20 66 6c 61 74 74 65 6e 65 64 20 71   The flattened q
24230 75 65 72 79 20 69 73 20 64 69 73 74 69 6e 63 74  uery is distinct
24240 20 69 66 20 65 69 74 68 65 72 20 74 68 65 20 69   if either the i
24250 6e 6e 65 72 20 6f 72 20 74 68 65 0a 20 20 20 20  nner or the.    
24260 2a 2a 20 6f 75 74 65 72 20 71 75 65 72 79 20 69  ** outer query i
24270 73 20 64 69 73 74 69 6e 63 74 2e 20 0a 20 20 20  s distinct. .   
24280 20 2a 2f 0a 20 20 20 20 70 50 61 72 65 6e 74 2d   */.    pParent-
24290 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20 70 53 75  >selFlags |= pSu
242a0 62 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46  b->selFlags & SF
242b0 5f 44 69 73 74 69 6e 63 74 3b 0a 20 20 0a 20 20  _Distinct;.  .  
242c0 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 53 45 4c 45    /*.    ** SELE
242d0 43 54 20 2e 2e 2e 20 46 52 4f 4d 20 28 53 45 4c  CT ... FROM (SEL
242e0 45 43 54 20 2e 2e 2e 20 4c 49 4d 49 54 20 61 20  ECT ... LIMIT a 
242f0 4f 46 46 53 45 54 20 62 29 20 4c 49 4d 49 54 20  OFFSET b) LIMIT 
24300 78 20 4f 46 46 53 45 54 20 79 3b 0a 20 20 20 20  x OFFSET y;.    
24310 2a 2a 0a 20 20 20 20 2a 2a 20 4f 6e 65 20 69 73  **.    ** One is
24320 20 74 65 6d 70 74 65 64 20 74 6f 20 74 72 79 20   tempted to try 
24330 74 6f 20 61 64 64 20 61 20 61 6e 64 20 62 20 74  to add a and b t
24340 6f 20 63 6f 6d 62 69 6e 65 20 74 68 65 20 6c 69  o combine the li
24350 6d 69 74 73 2e 20 20 42 75 74 20 74 68 69 73 0a  mits.  But this.
24360 20 20 20 20 2a 2a 20 64 6f 65 73 20 6e 6f 74 20      ** does not 
24370 77 6f 72 6b 20 69 66 20 65 69 74 68 65 72 20 6c  work if either l
24380 69 6d 69 74 20 69 73 20 6e 65 67 61 74 69 76 65  imit is negative
24390 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
243a0 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20 29 7b   pSub->pLimit ){
243b0 0a 20 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e  .      pParent->
243c0 70 4c 69 6d 69 74 20 3d 20 70 53 75 62 2d 3e 70  pLimit = pSub->p
243d0 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 70 53 75  Limit;.      pSu
243e0 62 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20  b->pLimit = 0;. 
243f0 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46     }.  }..  /* F
24400 69 6e 69 61 6c 6c 79 2c 20 64 65 6c 65 74 65 20  inially, delete 
24410 77 68 61 74 20 69 73 20 6c 65 66 74 20 6f 66 20  what is left of 
24420 74 68 65 20 73 75 62 71 75 65 72 79 20 61 6e 64  the subquery and
24430 20 72 65 74 75 72 6e 0a 20 20 2a 2a 20 73 75 63   return.  ** suc
24440 63 65 73 73 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c  cess..  */.  sql
24450 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65  ite3SelectDelete
24460 28 64 62 2c 20 70 53 75 62 31 29 3b 0a 0a 23 69  (db, pSub1);..#i
24470 66 20 53 45 4c 45 43 54 54 52 41 43 45 5f 45 4e  f SELECTTRACE_EN
24480 41 42 4c 45 44 0a 20 20 69 66 28 20 73 71 6c 69  ABLED.  if( sqli
24490 74 65 33 53 65 6c 65 63 74 54 72 61 63 65 20 26  te3SelectTrace &
244a0 20 30 78 31 30 30 20 29 7b 0a 20 20 20 20 53 45   0x100 ){.    SE
244b0 4c 45 43 54 54 52 41 43 45 28 30 78 31 30 30 2c  LECTTRACE(0x100,
244c0 70 50 61 72 73 65 2c 70 2c 28 22 41 66 74 65 72  pParse,p,("After
244d0 20 66 6c 61 74 74 65 6e 69 6e 67 3a 5c 6e 22 29   flattening:\n")
244e0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 54 72  );.    sqlite3Tr
244f0 65 65 56 69 65 77 53 65 6c 65 63 74 28 30 2c 20  eeViewSelect(0, 
24500 70 2c 20 30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  p, 0);.  }.#endi
24510 66 0a 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d  f..  return 1;.}
24520 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69  .#endif /* !defi
24530 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
24540 53 55 42 51 55 45 52 59 29 20 7c 7c 20 21 64 65  SUBQUERY) || !de
24550 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
24560 54 5f 56 49 45 57 29 20 2a 2f 0a 0a 2f 2a 0a 2a  T_VIEW) */../*.*
24570 2a 20 41 20 73 74 72 75 63 74 75 72 65 20 74 6f  * A structure to
24580 20 6b 65 65 70 20 74 72 61 63 6b 20 6f 66 20 61   keep track of a
24590 6c 6c 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e  ll of the column
245a0 20 76 61 6c 75 65 73 20 74 68 61 74 20 66 69 78   values that fix
245b0 65 64 20 74 6f 0a 2a 2a 20 61 20 6b 6e 6f 77 6e  ed to.** a known
245c0 20 76 61 6c 75 65 20 64 75 65 20 74 6f 20 57 48   value due to WH
245d0 45 52 45 20 63 6c 61 75 73 65 20 63 6f 6e 73 74  ERE clause const
245e0 72 61 69 6e 74 73 20 6f 66 20 74 68 65 20 66 6f  raints of the fo
245f0 72 6d 20 43 4f 4c 55 4d 4e 3d 56 41 4c 55 45 2e  rm COLUMN=VALUE.
24600 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75  .*/.typedef stru
24610 63 74 20 57 68 65 72 65 43 6f 6e 73 74 20 57 68  ct WhereConst Wh
24620 65 72 65 43 6f 6e 73 74 3b 0a 73 74 72 75 63 74  ereConst;.struct
24630 20 57 68 65 72 65 43 6f 6e 73 74 20 7b 0a 20 20   WhereConst {.  
24640 50 61 72 73 65 20 2a 70 50 61 72 73 65 3b 20 20  Parse *pParse;  
24650 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
24660 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f  ext */.  int nCo
24670 6e 73 74 3b 20 20 20 20 20 20 2f 2a 20 4e 75 6d  nst;      /* Num
24680 62 65 72 20 66 6f 72 20 43 4f 4c 55 4d 4e 3d 43  ber for COLUMN=C
24690 4f 4e 53 54 41 4e 54 20 74 65 72 6d 73 20 2a 2f  ONSTANT terms */
246a0 0a 20 20 69 6e 74 20 6e 43 68 6e 67 3b 20 20 20  .  int nChng;   
246b0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
246c0 20 74 69 6d 65 73 20 61 20 63 6f 6e 73 74 61 6e   times a constan
246d0 74 20 69 73 20 70 72 6f 70 61 67 61 74 65 64 20  t is propagated 
246e0 2a 2f 0a 20 20 45 78 70 72 20 2a 2a 61 70 45 78  */.  Expr **apEx
246f0 70 72 3b 20 20 20 2f 2a 20 5b 69 2a 32 5d 20 69  pr;   /* [i*2] i
24700 73 20 43 4f 4c 55 4d 4e 20 61 6e 64 20 5b 69 2a  s COLUMN and [i*
24710 32 2b 31 5d 20 69 73 20 56 41 4c 55 45 20 2a 2f  2+1] is VALUE */
24720 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61  .};../*.** Add a
24730 20 6e 65 77 20 65 6e 74 72 79 20 74 6f 20 74 68   new entry to th
24740 65 20 70 43 6f 6e 73 74 20 6f 62 6a 65 63 74 0a  e pConst object.
24750 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63  */.static void c
24760 6f 6e 73 74 49 6e 73 65 72 74 28 0a 20 20 57 68  onstInsert(.  Wh
24770 65 72 65 43 6f 6e 73 74 20 2a 70 43 6f 6e 73 74  ereConst *pConst
24780 2c 0a 20 20 45 78 70 72 20 2a 70 43 6f 6c 75 6d  ,.  Expr *pColum
24790 6e 2c 0a 20 20 45 78 70 72 20 2a 70 56 61 6c 75  n,.  Expr *pValu
247a0 65 0a 29 7b 0a 0a 20 20 70 43 6f 6e 73 74 2d 3e  e.){..  pConst->
247b0 6e 43 6f 6e 73 74 2b 2b 3b 0a 20 20 70 43 6f 6e  nConst++;.  pCon
247c0 73 74 2d 3e 61 70 45 78 70 72 20 3d 20 73 71 6c  st->apExpr = sql
247d0 69 74 65 33 44 62 52 65 61 6c 6c 6f 63 4f 72 46  ite3DbReallocOrF
247e0 72 65 65 28 70 43 6f 6e 73 74 2d 3e 70 50 61 72  ree(pConst->pPar
247f0 73 65 2d 3e 64 62 2c 20 70 43 6f 6e 73 74 2d 3e  se->db, pConst->
24800 61 70 45 78 70 72 2c 0a 20 20 20 20 20 20 20 20  apExpr,.        
24810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24820 20 70 43 6f 6e 73 74 2d 3e 6e 43 6f 6e 73 74 2a   pConst->nConst*
24830 32 2a 73 69 7a 65 6f 66 28 45 78 70 72 2a 29 29  2*sizeof(Expr*))
24840 3b 0a 20 20 69 66 28 20 70 43 6f 6e 73 74 2d 3e  ;.  if( pConst->
24850 61 70 45 78 70 72 3d 3d 30 20 29 7b 0a 20 20 20  apExpr==0 ){.   
24860 20 70 43 6f 6e 73 74 2d 3e 6e 43 6f 6e 73 74 20   pConst->nConst 
24870 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = 0;.  }else{.  
24880 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f    if( ExprHasPro
24890 70 65 72 74 79 28 70 56 61 6c 75 65 2c 20 45 50  perty(pValue, EP
248a0 5f 46 69 78 65 64 43 6f 6c 29 20 29 20 70 56 61  _FixedCol) ) pVa
248b0 6c 75 65 20 3d 20 70 56 61 6c 75 65 2d 3e 70 4c  lue = pValue->pL
248c0 65 66 74 3b 0a 20 20 20 20 70 43 6f 6e 73 74 2d  eft;.    pConst-
248d0 3e 61 70 45 78 70 72 5b 70 43 6f 6e 73 74 2d 3e  >apExpr[pConst->
248e0 6e 43 6f 6e 73 74 2a 32 2d 32 5d 20 3d 20 70 43  nConst*2-2] = pC
248f0 6f 6c 75 6d 6e 3b 0a 20 20 20 20 70 43 6f 6e 73  olumn;.    pCons
24900 74 2d 3e 61 70 45 78 70 72 5b 70 43 6f 6e 73 74  t->apExpr[pConst
24910 2d 3e 6e 43 6f 6e 73 74 2a 32 2d 31 5d 20 3d 20  ->nConst*2-1] = 
24920 70 56 61 6c 75 65 3b 0a 20 20 7d 0a 7d 0a 0a 2f  pValue;.  }.}../
24930 2a 0a 2a 2a 20 46 69 6e 64 20 61 6c 6c 20 74 65  *.** Find all te
24940 72 6d 73 20 6f 66 20 43 4f 4c 55 4d 4e 3d 56 41  rms of COLUMN=VA
24950 4c 55 45 20 6f 72 20 56 41 4c 55 45 3d 43 4f 4c  LUE or VALUE=COL
24960 55 4d 4e 20 69 6e 20 70 45 78 70 72 20 77 68 65  UMN in pExpr whe
24970 72 65 20 56 41 4c 55 45 0a 2a 2a 20 69 73 20 61  re VALUE.** is a
24980 20 63 6f 6e 73 74 61 6e 74 20 65 78 70 72 65 73   constant expres
24990 73 69 6f 6e 20 61 6e 64 20 77 68 65 72 65 20 74  sion and where t
249a0 68 65 20 74 65 72 6d 20 6d 75 73 74 20 62 65 20  he term must be 
249b0 74 72 75 65 20 62 65 63 61 75 73 65 20 69 74 0a  true because it.
249c0 2a 2a 20 69 73 20 70 61 72 74 20 6f 66 20 74 68  ** is part of th
249d0 65 20 41 4e 44 2d 63 6f 6e 6e 65 63 74 65 64 20  e AND-connected 
249e0 74 65 72 6d 73 20 6f 66 20 74 68 65 20 65 78 70  terms of the exp
249f0 72 65 73 73 69 6f 6e 2e 20 20 46 6f 72 20 65 61  ression.  For ea
24a00 63 68 20 74 65 72 6d 0a 2a 2a 20 66 6f 75 6e 64  ch term.** found
24a10 2c 20 61 64 64 20 69 74 20 74 6f 20 74 68 65 20  , add it to the 
24a20 70 43 6f 6e 73 74 20 73 74 72 75 63 74 75 72 65  pConst structure
24a30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
24a40 20 66 69 6e 64 43 6f 6e 73 74 49 6e 57 68 65 72   findConstInWher
24a50 65 28 57 68 65 72 65 43 6f 6e 73 74 20 2a 70 43  e(WhereConst *pC
24a60 6f 6e 73 74 2c 20 45 78 70 72 20 2a 70 45 78 70  onst, Expr *pExp
24a70 72 29 7b 0a 20 20 45 78 70 72 20 2a 70 52 69 67  r){.  Expr *pRig
24a80 68 74 2c 20 2a 70 4c 65 66 74 3b 0a 20 20 69 66  ht, *pLeft;.  if
24a90 28 20 70 45 78 70 72 3d 3d 30 20 29 20 72 65 74  ( pExpr==0 ) ret
24aa0 75 72 6e 3b 0a 20 20 69 66 28 20 45 78 70 72 48  urn;.  if( ExprH
24ab0 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  asProperty(pExpr
24ac0 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29  , EP_FromJoin) )
24ad0 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 70   return;.  if( p
24ae0 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 4e 44  Expr->op==TK_AND
24af0 20 29 7b 0a 20 20 20 20 66 69 6e 64 43 6f 6e 73   ){.    findCons
24b00 74 49 6e 57 68 65 72 65 28 70 43 6f 6e 73 74 2c  tInWhere(pConst,
24b10 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 29 3b   pExpr->pRight);
24b20 0a 20 20 20 20 66 69 6e 64 43 6f 6e 73 74 49 6e  .    findConstIn
24b30 57 68 65 72 65 28 70 43 6f 6e 73 74 2c 20 70 45  Where(pConst, pE
24b40 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20  xpr->pLeft);.   
24b50 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69   return;.  }.  i
24b60 66 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b  f( pExpr->op!=TK
24b70 5f 45 51 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  _EQ ) return;.  
24b80 70 52 69 67 68 74 20 3d 20 70 45 78 70 72 2d 3e  pRight = pExpr->
24b90 70 52 69 67 68 74 3b 0a 20 20 70 4c 65 66 74 20  pRight;.  pLeft 
24ba0 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a  = pExpr->pLeft;.
24bb0 20 20 61 73 73 65 72 74 28 20 70 52 69 67 68 74    assert( pRight
24bc0 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
24bd0 20 70 4c 65 66 74 21 3d 30 20 29 3b 0a 20 20 69   pLeft!=0 );.  i
24be0 66 28 20 70 52 69 67 68 74 2d 3e 6f 70 3d 3d 54  f( pRight->op==T
24bf0 4b 5f 43 4f 4c 55 4d 4e 0a 20 20 20 26 26 20 21  K_COLUMN.   && !
24c00 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
24c10 70 52 69 67 68 74 2c 20 45 50 5f 46 69 78 65 64  pRight, EP_Fixed
24c20 43 6f 6c 29 0a 20 20 20 26 26 20 73 71 6c 69 74  Col).   && sqlit
24c30 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74  e3ExprIsConstant
24c40 28 70 4c 65 66 74 29 0a 20 20 20 26 26 20 73 71  (pLeft).   && sq
24c50 6c 69 74 65 33 49 73 42 69 6e 61 72 79 28 73 71  lite3IsBinary(sq
24c60 6c 69 74 65 33 42 69 6e 61 72 79 43 6f 6d 70 61  lite3BinaryCompa
24c70 72 65 43 6f 6c 6c 53 65 71 28 70 43 6f 6e 73 74  reCollSeq(pConst
24c80 2d 3e 70 50 61 72 73 65 2c 70 4c 65 66 74 2c 70  ->pParse,pLeft,p
24c90 52 69 67 68 74 29 29 0a 20 20 29 7b 0a 20 20 20  Right)).  ){.   
24ca0 20 63 6f 6e 73 74 49 6e 73 65 72 74 28 70 43 6f   constInsert(pCo
24cb0 6e 73 74 2c 20 70 52 69 67 68 74 2c 20 70 4c 65  nst, pRight, pLe
24cc0 66 74 29 3b 0a 20 20 7d 65 6c 73 65 0a 20 20 69  ft);.  }else.  i
24cd0 66 28 20 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b  f( pLeft->op==TK
24ce0 5f 43 4f 4c 55 4d 4e 0a 20 20 20 26 26 20 21 45  _COLUMN.   && !E
24cf0 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
24d00 4c 65 66 74 2c 20 45 50 5f 46 69 78 65 64 43 6f  Left, EP_FixedCo
24d10 6c 29 0a 20 20 20 26 26 20 73 71 6c 69 74 65 33  l).   && sqlite3
24d20 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 28 70  ExprIsConstant(p
24d30 52 69 67 68 74 29 0a 20 20 20 26 26 20 73 71 6c  Right).   && sql
24d40 69 74 65 33 49 73 42 69 6e 61 72 79 28 73 71 6c  ite3IsBinary(sql
24d50 69 74 65 33 42 69 6e 61 72 79 43 6f 6d 70 61 72  ite3BinaryCompar
24d60 65 43 6f 6c 6c 53 65 71 28 70 43 6f 6e 73 74 2d  eCollSeq(pConst-
24d70 3e 70 50 61 72 73 65 2c 70 4c 65 66 74 2c 70 52  >pParse,pLeft,pR
24d80 69 67 68 74 29 29 0a 20 20 29 7b 0a 20 20 20 20  ight)).  ){.    
24d90 63 6f 6e 73 74 49 6e 73 65 72 74 28 70 43 6f 6e  constInsert(pCon
24da0 73 74 2c 20 70 4c 65 66 74 2c 20 70 52 69 67 68  st, pLeft, pRigh
24db0 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  t);.  }.}../*.**
24dc0 20 54 68 69 73 20 69 73 20 61 20 57 61 6c 6b 65   This is a Walke
24dd0 72 20 65 78 70 72 65 73 73 69 6f 6e 20 63 61 6c  r expression cal
24de0 6c 62 61 63 6b 2e 20 20 70 45 78 70 72 20 69 73  lback.  pExpr is
24df0 20 61 20 63 61 6e 64 69 64 61 74 65 20 65 78 70   a candidate exp
24e00 72 65 73 73 69 6f 6e 0a 2a 2a 20 74 6f 20 62 65  ression.** to be
24e10 20 72 65 70 6c 61 63 65 64 20 62 79 20 61 20 76   replaced by a v
24e20 61 6c 75 65 2e 20 20 49 66 20 70 45 78 70 72 20  alue.  If pExpr 
24e30 69 73 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f  is equivalent to
24e40 20 6f 6e 65 20 6f 66 20 74 68 65 0a 2a 2a 20 63   one of the.** c
24e50 6f 6c 75 6d 6e 73 20 6e 61 6d 65 64 20 69 6e 20  olumns named in 
24e60 70 57 61 6c 6b 65 72 2d 3e 75 2e 70 43 6f 6e 73  pWalker->u.pCons
24e70 74 2c 20 74 68 65 6e 20 6f 76 65 72 77 72 69 74  t, then overwrit
24e80 65 20 69 74 20 77 69 74 68 20 69 74 73 0a 2a 2a  e it with its.**
24e90 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 76   corresponding v
24ea0 61 6c 75 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  alue..*/.static 
24eb0 69 6e 74 20 70 72 6f 70 61 67 61 74 65 43 6f 6e  int propagateCon
24ec0 73 74 61 6e 74 45 78 70 72 52 65 77 72 69 74 65  stantExprRewrite
24ed0 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72  (Walker *pWalker
24ee0 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a  , Expr *pExpr){.
24ef0 20 20 69 6e 74 20 69 3b 0a 20 20 57 68 65 72 65    int i;.  Where
24f00 43 6f 6e 73 74 20 2a 70 43 6f 6e 73 74 3b 0a 20  Const *pConst;. 
24f10 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d   if( pExpr->op!=
24f20 54 4b 5f 43 4f 4c 55 4d 4e 20 29 20 72 65 74 75  TK_COLUMN ) retu
24f30 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b  rn WRC_Continue;
24f40 0a 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72  .  if( ExprHasPr
24f50 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
24f60 5f 46 69 78 65 64 43 6f 6c 29 20 29 20 72 65 74  _FixedCol) ) ret
24f70 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65  urn WRC_Continue
24f80 3b 0a 20 20 70 43 6f 6e 73 74 20 3d 20 70 57 61  ;.  pConst = pWa
24f90 6c 6b 65 72 2d 3e 75 2e 70 43 6f 6e 73 74 3b 0a  lker->u.pConst;.
24fa0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 43 6f    for(i=0; i<pCo
24fb0 6e 73 74 2d 3e 6e 43 6f 6e 73 74 3b 20 69 2b 2b  nst->nConst; i++
24fc0 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 43 6f  ){.    Expr *pCo
24fd0 6c 75 6d 6e 20 3d 20 70 43 6f 6e 73 74 2d 3e 61  lumn = pConst->a
24fe0 70 45 78 70 72 5b 69 2a 32 5d 3b 0a 20 20 20 20  pExpr[i*2];.    
24ff0 69 66 28 20 70 43 6f 6c 75 6d 6e 3d 3d 70 45 78  if( pColumn==pEx
25000 70 72 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  pr ) continue;. 
25010 20 20 20 69 66 28 20 70 43 6f 6c 75 6d 6e 2d 3e     if( pColumn->
25020 69 54 61 62 6c 65 21 3d 70 45 78 70 72 2d 3e 69  iTable!=pExpr->i
25030 54 61 62 6c 65 20 29 20 63 6f 6e 74 69 6e 75 65  Table ) continue
25040 3b 0a 20 20 20 20 69 66 28 20 70 43 6f 6c 75 6d  ;.    if( pColum
25050 6e 2d 3e 69 43 6f 6c 75 6d 6e 21 3d 70 45 78 70  n->iColumn!=pExp
25060 72 2d 3e 69 43 6f 6c 75 6d 6e 20 29 20 63 6f 6e  r->iColumn ) con
25070 74 69 6e 75 65 3b 0a 20 20 20 20 2f 2a 20 41 20  tinue;.    /* A 
25080 6d 61 74 63 68 20 69 73 20 66 6f 75 6e 64 2e 20  match is found. 
25090 20 41 64 64 20 74 68 65 20 45 50 5f 46 69 78 65   Add the EP_Fixe
250a0 64 43 6f 6c 20 70 72 6f 70 65 72 74 79 20 2a 2f  dCol property */
250b0 0a 20 20 20 20 70 43 6f 6e 73 74 2d 3e 6e 43 68  .    pConst->nCh
250c0 6e 67 2b 2b 3b 0a 20 20 20 20 45 78 70 72 43 6c  ng++;.    ExprCl
250d0 65 61 72 50 72 6f 70 65 72 74 79 28 70 45 78 70  earProperty(pExp
250e0 72 2c 20 45 50 5f 4c 65 61 66 29 3b 0a 20 20 20  r, EP_Leaf);.   
250f0 20 45 78 70 72 53 65 74 50 72 6f 70 65 72 74 79   ExprSetProperty
25100 28 70 45 78 70 72 2c 20 45 50 5f 46 69 78 65 64  (pExpr, EP_Fixed
25110 43 6f 6c 29 3b 0a 20 20 20 20 61 73 73 65 72 74  Col);.    assert
25120 28 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3d 3d  ( pExpr->pLeft==
25130 30 20 29 3b 0a 20 20 20 20 70 45 78 70 72 2d 3e  0 );.    pExpr->
25140 70 4c 65 66 74 20 3d 20 73 71 6c 69 74 65 33 45  pLeft = sqlite3E
25150 78 70 72 44 75 70 28 70 43 6f 6e 73 74 2d 3e 70  xprDup(pConst->p
25160 50 61 72 73 65 2d 3e 64 62 2c 20 70 43 6f 6e 73  Parse->db, pCons
25170 74 2d 3e 61 70 45 78 70 72 5b 69 2a 32 2b 31 5d  t->apExpr[i*2+1]
25180 2c 20 30 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b  , 0);.    break;
25190 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 57 52  .  }.  return WR
251a0 43 5f 50 72 75 6e 65 3b 0a 7d 0a 0a 2f 2a 0a 2a  C_Prune;.}../*.*
251b0 2a 20 54 68 65 20 57 48 45 52 45 2d 63 6c 61 75  * The WHERE-clau
251c0 73 65 20 63 6f 6e 73 74 61 6e 74 20 70 72 6f 70  se constant prop
251d0 61 67 61 74 69 6f 6e 20 6f 70 74 69 6d 69 7a 61  agation optimiza
251e0 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  tion..**.** If t
251f0 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
25200 63 6f 6e 74 61 69 6e 73 20 74 65 72 6d 73 20 6f  contains terms o
25210 66 20 74 68 65 20 66 6f 72 6d 20 43 4f 4c 55 4d  f the form COLUM
25220 4e 3d 43 4f 4e 53 54 41 4e 54 20 6f 72 0a 2a 2a  N=CONSTANT or.**
25230 20 43 4f 4e 53 54 41 4e 54 3d 43 4f 4c 55 4d 4e   CONSTANT=COLUMN
25240 20 74 68 61 74 20 6d 75 73 74 20 62 65 20 74 72   that must be tr
25250 65 65 20 28 69 6e 20 6f 74 68 65 72 20 77 6f 72  ee (in other wor
25260 64 73 2c 20 69 66 20 74 68 65 20 74 65 72 6d 73  ds, if the terms
25270 20 74 6f 70 2d 6c 65 76 65 6c 0a 2a 2a 20 41 4e   top-level.** AN
25280 44 2d 63 6f 6e 6e 65 63 74 65 64 20 74 65 72 6d  D-connected term
25290 73 20 74 68 61 74 20 61 72 65 20 6e 6f 74 20 70  s that are not p
252a0 61 72 74 20 6f 66 20 61 20 4f 4e 20 63 6c 61 75  art of a ON clau
252b0 73 65 20 66 72 6f 6d 20 61 20 4c 45 46 54 20 4a  se from a LEFT J
252c0 4f 49 4e 29 0a 2a 2a 20 74 68 65 6e 20 74 68 72  OIN).** then thr
252d0 6f 75 67 68 6f 75 74 20 74 68 65 20 71 75 65 72  oughout the quer
252e0 79 20 72 65 70 6c 61 63 65 20 61 6c 6c 20 6f 74  y replace all ot
252f0 68 65 72 20 6f 63 63 75 72 72 65 6e 63 65 73 20  her occurrences 
25300 6f 66 20 43 4f 4c 55 4d 4e 0a 2a 2a 20 77 69 74  of COLUMN.** wit
25310 68 20 43 4f 4e 53 54 41 4e 54 20 77 69 74 68 69  h CONSTANT withi
25320 6e 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  n the WHERE clau
25330 73 65 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65 78  se..**.** For ex
25340 61 6d 70 6c 65 2c 20 74 68 65 20 71 75 65 72 79  ample, the query
25350 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 53 45 4c  :.**.**      SEL
25360 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 2c 20 74  ECT * FROM t1, t
25370 32 2c 20 74 33 20 57 48 45 52 45 20 74 31 2e 61  2, t3 WHERE t1.a
25380 3d 33 39 20 41 4e 44 20 74 32 2e 62 3d 74 31 2e  =39 AND t2.b=t1.
25390 61 20 41 4e 44 20 74 33 2e 63 3d 74 32 2e 62 0a  a AND t3.c=t2.b.
253a0 2a 2a 0a 2a 2a 20 49 73 20 74 72 61 6e 73 66 6f  **.** Is transfo
253b0 72 6d 65 64 20 69 6e 74 6f 0a 2a 2a 0a 2a 2a 20  rmed into.**.** 
253c0 20 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52       SELECT * FR
253d0 4f 4d 20 74 31 2c 20 74 32 2c 20 74 33 20 57 48  OM t1, t2, t3 WH
253e0 45 52 45 20 74 31 2e 61 3d 33 39 20 41 4e 44 20  ERE t1.a=39 AND 
253f0 74 32 2e 62 3d 33 39 20 41 4e 44 20 74 33 2e 63  t2.b=39 AND t3.c
25400 3d 33 39 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  =39.**.** Return
25410 20 74 72 75 65 20 69 66 20 61 6e 79 20 74 72 61   true if any tra
25420 6e 73 66 6f 72 6d 61 74 69 6f 6e 73 20 77 68 65  nsformations whe
25430 72 65 20 6d 61 64 65 20 61 6e 64 20 66 61 6c 73  re made and fals
25440 65 20 69 66 20 6e 6f 74 2e 0a 2a 2a 0a 2a 2a 20  e if not..**.** 
25450 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6e  Implementation n
25460 6f 74 65 3a 20 20 43 6f 6e 73 74 61 6e 74 20 70  ote:  Constant p
25470 72 6f 70 61 67 61 74 69 6f 6e 20 69 73 20 74 72  ropagation is tr
25480 69 63 6b 79 20 64 75 65 20 74 6f 20 61 66 66 69  icky due to affi
25490 6e 69 74 79 0a 2a 2a 20 61 6e 64 20 63 6f 6c 6c  nity.** and coll
254a0 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 69  ating sequence i
254b0 6e 74 65 72 61 63 74 69 6f 6e 73 2e 20 20 43 6f  nteractions.  Co
254c0 6e 73 69 64 65 72 20 74 68 69 73 20 65 78 61 6d  nsider this exam
254d0 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 43 52  ple:.**.**    CR
254e0 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 61 20  EATE TABLE t1(a 
254f0 49 4e 54 2c 62 20 54 45 58 54 29 3b 0a 2a 2a 20  INT,b TEXT);.** 
25500 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
25510 31 20 56 41 4c 55 45 53 28 31 32 33 2c 27 30 31  1 VALUES(123,'01
25520 32 33 27 29 3b 0a 2a 2a 20 20 20 20 53 45 4c 45  23');.**    SELE
25530 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 57 48 45  CT * FROM t1 WHE
25540 52 45 20 61 3d 31 32 33 20 41 4e 44 20 62 3d 61  RE a=123 AND b=a
25550 3b 0a 2a 2a 20 20 20 20 53 45 4c 45 43 54 20 2a  ;.**    SELECT *
25560 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 61   FROM t1 WHERE a
25570 3d 31 32 33 20 41 4e 44 20 62 3d 31 32 33 3b 0a  =123 AND b=123;.
25580 2a 2a 0a 2a 2a 20 54 68 65 20 74 77 6f 20 53 45  **.** The two SE
25590 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73 20  LECT statements 
255a0 61 62 6f 76 65 20 73 68 6f 75 6c 64 20 72 65 74  above should ret
255b0 75 72 6e 20 64 69 66 66 65 72 65 6e 74 20 61 6e  urn different an
255c0 73 77 65 72 73 2e 20 20 62 3d 61 0a 2a 2a 20 69  swers.  b=a.** i
255d0 73 20 61 6c 77 61 79 20 74 72 75 65 20 62 65 63  s alway true bec
255e0 61 75 73 65 20 74 68 65 20 63 6f 6d 70 61 72 69  ause the compari
255f0 73 6f 6e 20 75 73 65 73 20 6e 75 6d 65 72 69 63  son uses numeric
25600 20 61 66 66 69 6e 69 74 79 2c 20 62 75 74 20 62   affinity, but b
25610 3d 31 32 33 0a 2a 2a 20 69 73 20 66 61 6c 73 65  =123.** is false
25620 20 62 65 63 61 75 73 65 20 69 74 20 75 73 65 73   because it uses
25630 20 74 65 78 74 20 61 66 66 69 6e 69 74 79 20 61   text affinity a
25640 6e 64 20 27 30 31 32 33 27 20 69 73 20 6e 6f 74  nd '0123' is not
25650 20 74 68 65 20 73 61 6d 65 20 61 73 20 27 31 32   the same as '12
25660 33 27 2e 0a 2a 2a 20 54 6f 20 77 6f 72 6b 20 61  3'..** To work a
25670 72 6f 75 6e 64 20 74 68 69 73 2c 20 74 68 65 20  round this, the 
25680 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 20  expression tree 
25690 69 73 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20  is not actually 
256a0 63 68 61 6e 67 65 64 20 66 72 6f 6d 0a 2a 2a 20  changed from.** 
256b0 22 62 3d 61 22 20 74 6f 20 22 62 3d 31 32 33 22  "b=a" to "b=123"
256c0 20 62 75 74 20 72 61 74 68 65 72 20 74 68 65 20   but rather the 
256d0 22 61 22 20 69 6e 20 22 62 3d 61 22 20 69 73 20  "a" in "b=a" is 
256e0 74 61 67 67 65 64 20 77 69 74 68 20 45 50 5f 46  tagged with EP_F
256f0 69 78 65 64 43 6f 6c 0a 2a 2a 20 61 6e 64 20 74  ixedCol.** and t
25700 68 65 20 22 31 32 33 22 20 76 61 6c 75 65 20 69  he "123" value i
25710 73 20 68 75 6e 67 20 6f 66 66 20 6f 66 20 74 68  s hung off of th
25720 65 20 70 4c 65 66 74 20 70 6f 69 6e 74 65 72 2e  e pLeft pointer.
25730 20 20 43 6f 64 65 20 67 65 6e 65 72 61 74 6f 72    Code generator
25740 0a 2a 2a 20 72 6f 75 74 69 6e 65 73 20 6b 6e 6f  .** routines kno
25750 77 20 74 6f 20 67 65 6e 65 72 61 74 65 20 74 68  w to generate th
25760 65 20 63 6f 6e 73 74 61 6e 74 20 22 31 32 33 22  e constant "123"
25770 20 69 6e 73 74 65 61 64 20 6f 66 20 6c 6f 6f 6b   instead of look
25780 69 6e 67 20 75 70 20 74 68 65 0a 2a 2a 20 63 6f  ing up the.** co
25790 6c 75 6d 6e 20 76 61 6c 75 65 2e 20 20 41 6c 73  lumn value.  Als
257a0 6f 2c 20 74 6f 20 61 76 6f 69 64 20 63 6f 6c 6c  o, to avoid coll
257b0 61 74 69 6f 6e 20 70 72 6f 62 6c 65 6d 73 2c 20  ation problems, 
257c0 74 68 69 73 20 6f 70 74 69 6d 69 7a 61 74 69 6f  this optimizatio
257d0 6e 20 69 73 0a 2a 2a 20 6f 6e 6c 79 20 61 74 74  n is.** only att
257e0 65 6d 70 74 65 64 20 69 66 20 74 68 65 20 22 61  empted if the "a
257f0 3d 31 32 33 22 20 74 65 72 6d 20 75 73 65 73 20  =123" term uses 
25800 74 68 65 20 64 65 66 61 75 6c 74 20 42 49 4e 41  the default BINA
25810 52 59 20 63 6f 6c 6c 61 74 69 6f 6e 2e 0a 2a 2f  RY collation..*/
25820 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f 70  .static int prop
25830 61 67 61 74 65 43 6f 6e 73 74 61 6e 74 73 28 0a  agateConstants(.
25840 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
25850 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 69 6e     /* The parsin
25860 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53  g context */.  S
25870 65 6c 65 63 74 20 2a 70 20 20 20 20 20 20 20 20  elect *p        
25880 2f 2a 20 54 68 65 20 71 75 65 72 79 20 69 6e 20  /* The query in 
25890 77 68 69 63 68 20 74 6f 20 70 72 6f 70 61 67 61  which to propaga
258a0 74 65 20 63 6f 6e 73 74 61 6e 74 73 20 2a 2f 0a  te constants */.
258b0 29 7b 0a 20 20 57 68 65 72 65 43 6f 6e 73 74 20  ){.  WhereConst 
258c0 78 3b 0a 20 20 57 61 6c 6b 65 72 20 77 3b 0a 20  x;.  Walker w;. 
258d0 20 69 6e 74 20 6e 43 68 6e 67 20 3d 20 30 3b 0a   int nChng = 0;.
258e0 20 20 78 2e 70 50 61 72 73 65 20 3d 20 70 50 61    x.pParse = pPa
258f0 72 73 65 3b 0a 20 20 64 6f 7b 0a 20 20 20 20 78  rse;.  do{.    x
25900 2e 6e 43 6f 6e 73 74 20 3d 20 30 3b 0a 20 20 20  .nConst = 0;.   
25910 20 78 2e 6e 43 68 6e 67 20 3d 20 30 3b 0a 20 20   x.nChng = 0;.  
25920 20 20 78 2e 61 70 45 78 70 72 20 3d 20 30 3b 0a    x.apExpr = 0;.
25930 20 20 20 20 66 69 6e 64 43 6f 6e 73 74 49 6e 57      findConstInW
25940 68 65 72 65 28 26 78 2c 20 70 2d 3e 70 57 68 65  here(&x, p->pWhe
25950 72 65 29 3b 0a 20 20 20 20 69 66 28 20 78 2e 6e  re);.    if( x.n
25960 43 6f 6e 73 74 20 29 7b 0a 20 20 20 20 20 20 6d  Const ){.      m
25970 65 6d 73 65 74 28 26 77 2c 20 30 2c 20 73 69 7a  emset(&w, 0, siz
25980 65 6f 66 28 77 29 29 3b 0a 20 20 20 20 20 20 77  eof(w));.      w
25990 2e 70 50 61 72 73 65 20 3d 20 70 50 61 72 73 65  .pParse = pParse
259a0 3b 0a 20 20 20 20 20 20 77 2e 78 45 78 70 72 43  ;.      w.xExprC
259b0 61 6c 6c 62 61 63 6b 20 3d 20 70 72 6f 70 61 67  allback = propag
259c0 61 74 65 43 6f 6e 73 74 61 6e 74 45 78 70 72 52  ateConstantExprR
259d0 65 77 72 69 74 65 3b 0a 20 20 20 20 20 20 77 2e  ewrite;.      w.
259e0 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20  xSelectCallback 
259f0 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 57  = sqlite3SelectW
25a00 61 6c 6b 4e 6f 6f 70 3b 0a 20 20 20 20 20 20 77  alkNoop;.      w
25a10 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b  .xSelectCallback
25a20 32 20 3d 20 30 3b 0a 20 20 20 20 20 20 77 2e 77  2 = 0;.      w.w
25a30 61 6c 6b 65 72 44 65 70 74 68 20 3d 20 30 3b 0a  alkerDepth = 0;.
25a40 20 20 20 20 20 20 77 2e 75 2e 70 43 6f 6e 73 74        w.u.pConst
25a50 20 3d 20 26 78 3b 0a 20 20 20 20 20 20 73 71 6c   = &x;.      sql
25a60 69 74 65 33 57 61 6c 6b 45 78 70 72 28 26 77 2c  ite3WalkExpr(&w,
25a70 20 70 2d 3e 70 57 68 65 72 65 29 3b 0a 20 20 20   p->pWhere);.   
25a80 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
25a90 28 78 2e 70 50 61 72 73 65 2d 3e 64 62 2c 20 78  (x.pParse->db, x
25aa0 2e 61 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20  .apExpr);.      
25ab0 6e 43 68 6e 67 20 2b 3d 20 78 2e 6e 43 68 6e 67  nChng += x.nChng
25ac0 3b 0a 20 20 20 20 7d 0a 20 20 7d 77 68 69 6c 65  ;.    }.  }while
25ad0 28 20 78 2e 6e 43 68 6e 67 20 29 3b 20 20 0a 20  ( x.nChng );  . 
25ae0 20 72 65 74 75 72 6e 20 6e 43 68 6e 67 3b 0a 7d   return nChng;.}
25af0 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  ..#if !defined(S
25b00 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
25b10 45 52 59 29 20 7c 7c 20 21 64 65 66 69 6e 65 64  ERY) || !defined
25b20 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45  (SQLITE_OMIT_VIE
25b30 57 29 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 63 6f  W)./*.** Make co
25b40 70 69 65 73 20 6f 66 20 72 65 6c 65 76 61 6e 74  pies of relevant
25b50 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 65   WHERE clause te
25b60 72 6d 73 20 6f 66 20 74 68 65 20 6f 75 74 65 72  rms of the outer
25b70 20 71 75 65 72 79 20 69 6e 74 6f 0a 2a 2a 20 74   query into.** t
25b80 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
25b90 6f 66 20 73 75 62 71 75 65 72 79 2e 20 20 45 78  of subquery.  Ex
25ba0 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  ample:.**.**    
25bb0 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 28 53  SELECT * FROM (S
25bc0 45 4c 45 43 54 20 61 20 41 53 20 78 2c 20 63 2d  ELECT a AS x, c-
25bd0 64 20 41 53 20 79 20 46 52 4f 4d 20 74 31 29 20  d AS y FROM t1) 
25be0 57 48 45 52 45 20 78 3d 35 20 41 4e 44 20 79 3d  WHERE x=5 AND y=
25bf0 31 30 3b 0a 2a 2a 0a 2a 2a 20 54 72 61 6e 73 66  10;.**.** Transf
25c00 6f 72 6d 65 64 20 69 6e 74 6f 3a 0a 2a 2a 0a 2a  ormed into:.**.*
25c10 2a 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52  *    SELECT * FR
25c20 4f 4d 20 28 53 45 4c 45 43 54 20 61 20 41 53 20  OM (SELECT a AS 
25c30 78 2c 20 63 2d 64 20 41 53 20 79 20 46 52 4f 4d  x, c-d AS y FROM
25c40 20 74 31 20 57 48 45 52 45 20 61 3d 35 20 41 4e   t1 WHERE a=5 AN
25c50 44 20 63 2d 64 3d 31 30 29 0a 2a 2a 20 20 20 20  D c-d=10).**    
25c60 20 57 48 45 52 45 20 78 3d 35 20 41 4e 44 20 79   WHERE x=5 AND y
25c70 3d 31 30 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 20 68  =10;.**.** The h
25c80 6f 70 65 20 69 73 20 74 68 61 74 20 74 68 65 20  ope is that the 
25c90 74 65 72 6d 73 20 61 64 64 65 64 20 74 6f 20 74  terms added to t
25ca0 68 65 20 69 6e 6e 65 72 20 71 75 65 72 79 20 77  he inner query w
25cb0 69 6c 6c 20 6d 61 6b 65 20 69 74 20 6d 6f 72 65  ill make it more
25cc0 0a 2a 2a 20 65 66 66 69 63 69 65 6e 74 2e 0a 2a  .** efficient..*
25cd0 2a 0a 2a 2a 20 44 6f 20 6e 6f 74 20 61 74 74 65  *.** Do not atte
25ce0 6d 70 74 20 74 68 69 73 20 6f 70 74 69 6d 69 7a  mpt this optimiz
25cf0 61 74 69 6f 6e 20 69 66 3a 0a 2a 2a 0a 2a 2a 20  ation if:.**.** 
25d00 20 20 28 31 29 20 28 2a 2a 20 54 68 69 73 20 72    (1) (** This r
25d10 65 73 74 72 69 63 74 69 6f 6e 20 77 61 73 20 72  estriction was r
25d20 65 6d 6f 76 65 64 20 6f 6e 20 32 30 31 37 2d 30  emoved on 2017-0
25d30 39 2d 32 39 2e 20 20 57 65 20 75 73 65 64 20 74  9-29.  We used t
25d40 6f 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 64  o.**           d
25d50 69 73 61 6c 6c 6f 77 20 74 68 69 73 20 6f 70 74  isallow this opt
25d60 69 6d 69 7a 61 74 69 6f 6e 20 66 6f 72 20 61 67  imization for ag
25d70 67 72 65 67 61 74 65 20 73 75 62 71 75 65 72 69  gregate subqueri
25d80 65 73 2c 20 62 75 74 20 6e 6f 77 0a 2a 2a 20 20  es, but now.**  
25d90 20 20 20 20 20 20 20 20 20 69 74 20 69 73 20 61           it is a
25da0 6c 6c 6f 77 65 64 20 62 79 20 70 75 74 74 69 6e  llowed by puttin
25db0 67 20 74 68 65 20 65 78 74 72 61 20 74 65 72 6d  g the extra term
25dc0 73 20 6f 6e 20 74 68 65 20 48 41 56 49 4e 47 20  s on the HAVING 
25dd0 63 6c 61 75 73 65 2e 0a 2a 2a 20 20 20 20 20 20  clause..**      
25de0 20 20 20 20 20 54 68 65 20 61 64 64 65 64 20 48       The added H
25df0 41 56 49 4e 47 20 63 6c 61 75 73 65 20 69 73 20  AVING clause is 
25e00 70 6f 69 6e 74 6c 65 73 73 20 69 66 20 74 68 65  pointless if the
25e10 20 73 75 62 71 75 65 72 79 20 6c 61 63 6b 73 0a   subquery lacks.
25e20 2a 2a 20 20 20 20 20 20 20 20 20 20 20 61 20 47  **           a G
25e30 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 2e 20  ROUP BY clause. 
25e40 20 42 75 74 20 73 75 63 68 20 61 20 48 41 56 49   But such a HAVI
25e50 4e 47 20 63 6c 61 75 73 65 20 69 73 20 61 6c 73  NG clause is als
25e60 6f 20 68 61 72 6d 6c 65 73 73 0a 2a 2a 20 20 20  o harmless.**   
25e70 20 20 20 20 20 20 20 20 73 6f 20 74 68 65 72 65          so there
25e80 20 64 6f 65 73 20 6e 6f 74 20 61 70 70 65 61 72   does not appear
25e90 20 74 6f 20 62 65 20 61 6e 79 20 72 65 61 73 6f   to be any reaso
25ea0 6e 20 74 6f 20 61 64 64 20 65 78 74 72 61 20 6c  n to add extra l
25eb0 6f 67 69 63 0a 2a 2a 20 20 20 20 20 20 20 20 20  ogic.**         
25ec0 20 20 74 6f 20 73 75 70 70 72 65 73 73 20 69 74    to suppress it
25ed0 2e 20 2a 2a 29 0a 2a 2a 0a 2a 2a 20 20 20 28 32  . **).**.**   (2
25ee0 29 20 54 68 65 20 69 6e 6e 65 72 20 71 75 65 72  ) The inner quer
25ef0 79 20 69 73 20 74 68 65 20 72 65 63 75 72 73 69  y is the recursi
25f00 76 65 20 70 61 72 74 20 6f 66 20 61 20 63 6f 6d  ve part of a com
25f10 6d 6f 6e 20 74 61 62 6c 65 20 65 78 70 72 65 73  mon table expres
25f20 73 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 33  sion..**.**   (3
25f30 29 20 54 68 65 20 69 6e 6e 65 72 20 71 75 65 72  ) The inner quer
25f40 79 20 68 61 73 20 61 20 4c 49 4d 49 54 20 63 6c  y has a LIMIT cl
25f50 61 75 73 65 20 28 73 69 6e 63 65 20 74 68 65 20  ause (since the 
25f60 63 68 61 6e 67 65 73 20 74 6f 20 74 68 65 20 57  changes to the W
25f70 48 45 52 45 0a 2a 2a 20 20 20 20 20 20 20 63 6c  HERE.**       cl
25f80 61 75 73 65 20 77 6f 75 6c 64 20 63 68 61 6e 67  ause would chang
25f90 65 20 74 68 65 20 6d 65 61 6e 69 6e 67 20 6f 66  e the meaning of
25fa0 20 74 68 65 20 4c 49 4d 49 54 29 2e 0a 2a 2a 0a   the LIMIT)..**.
25fb0 2a 2a 20 20 20 28 34 29 20 54 68 65 20 69 6e 6e  **   (4) The inn
25fc0 65 72 20 71 75 65 72 79 20 69 73 20 74 68 65 20  er query is the 
25fd0 72 69 67 68 74 20 6f 70 65 72 61 6e 64 20 6f 66  right operand of
25fe0 20 61 20 4c 45 46 54 20 4a 4f 49 4e 20 61 6e 64   a LEFT JOIN and
25ff0 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 65 78   the.**       ex
26000 70 72 65 73 73 69 6f 6e 20 74 6f 20 62 65 20 70  pression to be p
26010 75 73 68 65 64 20 64 6f 77 6e 20 64 6f 65 73 20  ushed down does 
26020 6e 6f 74 20 63 6f 6d 65 20 66 72 6f 6d 20 74 68  not come from th
26030 65 20 4f 4e 20 63 6c 61 75 73 65 0a 2a 2a 20 20  e ON clause.**  
26040 20 20 20 20 20 6f 6e 20 74 68 61 74 20 4c 45 46       on that LEF
26050 54 20 4a 4f 49 4e 2e 0a 2a 2a 0a 2a 2a 20 20 20  T JOIN..**.**   
26060 28 35 29 20 54 68 65 20 57 48 45 52 45 20 63 6c  (5) The WHERE cl
26070 61 75 73 65 20 65 78 70 72 65 73 73 69 6f 6e 20  ause expression 
26080 6f 72 69 67 69 6e 61 74 65 73 20 69 6e 20 74 68  originates in th
26090 65 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c  e ON or USING cl
260a0 61 75 73 65 0a 2a 2a 20 20 20 20 20 20 20 6f 66  ause.**       of
260b0 20 61 20 4c 45 46 54 20 4a 4f 49 4e 20 77 68 65   a LEFT JOIN whe
260c0 72 65 20 69 43 75 72 73 6f 72 20 69 73 20 6e 6f  re iCursor is no
260d0 74 20 74 68 65 20 72 69 67 68 74 2d 68 61 6e 64  t the right-hand
260e0 20 74 61 62 6c 65 20 6f 66 20 74 68 61 74 0a 2a   table of that.*
260f0 2a 20 20 20 20 20 20 20 6c 65 66 74 20 6a 6f 69  *       left joi
26100 6e 2e 20 20 41 6e 20 65 78 61 6d 70 6c 65 3a 0a  n.  An example:.
26110 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  **.**           
26120 53 45 4c 45 43 54 20 2a 0a 2a 2a 20 20 20 20 20  SELECT *.**     
26130 20 20 20 20 20 20 46 52 4f 4d 20 28 53 45 4c 45        FROM (SELE
26140 43 54 20 31 20 41 53 20 61 31 20 55 4e 49 4f 4e  CT 1 AS a1 UNION
26150 20 41 4c 4c 20 53 45 4c 45 43 54 20 32 29 20 41   ALL SELECT 2) A
26160 53 20 61 61 0a 2a 2a 20 20 20 20 20 20 20 20 20  S aa.**         
26170 20 20 4a 4f 49 4e 20 28 53 45 4c 45 43 54 20 31    JOIN (SELECT 1
26180 20 41 53 20 62 32 20 55 4e 49 4f 4e 20 41 4c 4c   AS b2 UNION ALL
26190 20 53 45 4c 45 43 54 20 32 29 20 41 53 20 62 62   SELECT 2) AS bb
261a0 20 4f 4e 20 28 61 31 3d 62 32 29 0a 2a 2a 20 20   ON (a1=b2).**  
261b0 20 20 20 20 20 20 20 20 20 4c 45 46 54 20 4a 4f           LEFT JO
261c0 49 4e 20 28 53 45 4c 45 43 54 20 38 20 41 53 20  IN (SELECT 8 AS 
261d0 63 33 20 55 4e 49 4f 4e 20 41 4c 4c 20 53 45 4c  c3 UNION ALL SEL
261e0 45 43 54 20 39 29 20 41 53 20 63 63 20 4f 4e 20  ECT 9) AS cc ON 
261f0 28 62 32 3d 32 29 3b 0a 2a 2a 0a 2a 2a 20 20 20  (b2=2);.**.**   
26200 20 20 20 20 54 68 65 20 63 6f 72 72 65 63 74 20      The correct 
26210 61 6e 73 77 65 72 20 69 73 20 74 68 72 65 65 20  answer is three 
26220 72 6f 77 73 3a 20 20 28 31 2c 31 2c 4e 55 4c 4c  rows:  (1,1,NULL
26230 29 2c 28 32 2c 32 2c 38 29 2c 28 32 2c 32 2c 39  ),(2,2,8),(2,2,9
26240 29 2e 0a 2a 2a 20 20 20 20 20 20 20 42 75 74 20  )..**       But 
26250 69 66 20 74 68 65 20 28 62 32 3d 32 29 20 74 65  if the (b2=2) te
26260 72 6d 20 77 65 72 65 20 74 6f 20 62 65 20 70 75  rm were to be pu
26270 73 68 65 64 20 64 6f 77 6e 20 69 6e 74 6f 20 74  shed down into t
26280 68 65 20 62 62 20 73 75 62 71 75 65 72 79 2c 0a  he bb subquery,.
26290 2a 2a 20 20 20 20 20 20 20 74 68 65 6e 20 74 68  **       then th
262a0 65 20 28 31 2c 31 2c 4e 55 4c 4c 29 20 72 6f 77  e (1,1,NULL) row
262b0 20 77 6f 75 6c 64 20 62 65 20 73 75 70 70 72 65   would be suppre
262c0 73 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 36  ssed..**.**   (6
262d0 29 20 54 68 65 20 69 6e 6e 65 72 20 71 75 65 72  ) The inner quer
262e0 79 20 66 65 61 74 75 72 65 73 20 6f 6e 65 20 6f  y features one o
262f0 72 20 6d 6f 72 65 20 77 69 6e 64 6f 77 2d 66 75  r more window-fu
26300 6e 63 74 69 6f 6e 73 20 28 73 69 6e 63 65 20 0a  nctions (since .
26310 2a 2a 20 20 20 20 20 20 20 63 68 61 6e 67 65 73  **       changes
26320 20 74 6f 20 74 68 65 20 57 48 45 52 45 20 63 6c   to the WHERE cl
26330 61 75 73 65 20 6f 66 20 74 68 65 20 69 6e 6e 65  ause of the inne
26340 72 20 71 75 65 72 79 20 63 6f 75 6c 64 20 63 68  r query could ch
26350 61 6e 67 65 20 74 68 65 20 0a 2a 2a 20 20 20 20  ange the .**    
26360 20 20 20 77 69 6e 64 6f 77 20 6f 76 65 72 20 77     window over w
26370 68 69 63 68 20 77 69 6e 64 6f 77 20 66 75 6e 63  hich window func
26380 74 69 6f 6e 73 20 61 72 65 20 63 61 6c 63 75 6c  tions are calcul
26390 61 74 65 64 29 2e 0a 2a 2a 0a 2a 2a 20 52 65 74  ated)..**.** Ret
263a0 75 72 6e 20 30 20 69 66 20 6e 6f 20 63 68 61 6e  urn 0 if no chan
263b0 67 65 73 20 61 72 65 20 6d 61 64 65 20 61 6e 64  ges are made and
263c0 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 6f 6e 65   non-zero if one
263d0 20 6f 72 20 6d 6f 72 65 20 57 48 45 52 45 20 63   or more WHERE c
263e0 6c 61 75 73 65 0a 2a 2a 20 74 65 72 6d 73 20 61  lause.** terms a
263f0 72 65 20 64 75 70 6c 69 63 61 74 65 64 20 69 6e  re duplicated in
26400 74 6f 20 74 68 65 20 73 75 62 71 75 65 72 79 2e  to the subquery.
26410 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
26420 75 73 68 44 6f 77 6e 57 68 65 72 65 54 65 72 6d  ushDownWhereTerm
26430 73 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  s(.  Parse *pPar
26440 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 61  se,        /* Pa
26450 72 73 65 20 63 6f 6e 74 65 78 74 20 28 66 6f 72  rse context (for
26460 20 6d 61 6c 6c 6f 63 28 29 20 61 6e 64 20 65 72   malloc() and er
26470 72 6f 72 20 72 65 70 6f 72 74 69 6e 67 29 20 2a  ror reporting) *
26480 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 75 62  /.  Select *pSub
26490 71 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  q,        /* The
264a0 20 73 75 62 71 75 65 72 79 20 77 68 6f 73 65 20   subquery whose 
264b0 57 48 45 52 45 20 63 6c 61 75 73 65 20 69 73 20  WHERE clause is 
264c0 74 6f 20 62 65 20 61 75 67 6d 65 6e 74 65 64 20  to be augmented 
264d0 2a 2f 0a 20 20 45 78 70 72 20 2a 70 57 68 65 72  */.  Expr *pWher
264e0 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  e,         /* Th
264f0 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 6f  e WHERE clause o
26500 66 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  f the outer quer
26510 79 20 2a 2f 0a 20 20 69 6e 74 20 69 43 75 72 73  y */.  int iCurs
26520 6f 72 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  or,          /* 
26530 43 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 6f 66  Cursor number of
26540 20 74 68 65 20 73 75 62 71 75 65 72 79 20 2a 2f   the subquery */
26550 0a 20 20 69 6e 74 20 69 73 4c 65 66 74 4a 6f 69  .  int isLeftJoi
26560 6e 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65  n        /* True
26570 20 69 66 20 70 53 75 62 71 20 69 73 20 74 68 65   if pSubq is the
26580 20 72 69 67 68 74 20 74 65 72 6d 20 6f 66 20 61   right term of a
26590 20 4c 45 46 54 20 4a 4f 49 4e 20 2a 2f 0a 29 7b   LEFT JOIN */.){
265a0 0a 20 20 45 78 70 72 20 2a 70 4e 65 77 3b 0a 20  .  Expr *pNew;. 
265b0 20 69 6e 74 20 6e 43 68 6e 67 20 3d 20 30 3b 0a   int nChng = 0;.
265c0 20 20 69 66 28 20 70 57 68 65 72 65 3d 3d 30 20    if( pWhere==0 
265d0 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66  ) return 0;.  if
265e0 28 20 70 53 75 62 71 2d 3e 73 65 6c 46 6c 61 67  ( pSubq->selFlag
265f0 73 20 26 20 53 46 5f 52 65 63 75 72 73 69 76 65  s & SF_Recursive
26600 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 2f 2a   ) return 0;  /*
26610 20 72 65 73 74 72 69 63 74 69 6f 6e 20 28 32 29   restriction (2)
26620 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c   */..#ifndef SQL
26630 49 54 45 5f 4f 4d 49 54 5f 57 49 4e 44 4f 57 46  ITE_OMIT_WINDOWF
26640 55 4e 43 0a 20 20 69 66 28 20 70 53 75 62 71 2d  UNC.  if( pSubq-
26650 3e 70 57 69 6e 20 29 20 72 65 74 75 72 6e 20 30  >pWin ) return 0
26660 3b 20 20 20 20 2f 2a 20 72 65 73 74 72 69 63 74  ;    /* restrict
26670 69 6f 6e 20 28 36 29 20 2a 2f 0a 23 65 6e 64 69  ion (6) */.#endi
26680 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  f..#ifdef SQLITE
26690 5f 44 45 42 55 47 0a 20 20 2f 2a 20 4f 6e 6c 79  _DEBUG.  /* Only
266a0 20 74 68 65 20 66 69 72 73 74 20 74 65 72 6d 20   the first term 
266b0 6f 66 20 61 20 63 6f 6d 70 6f 75 6e 64 20 63 61  of a compound ca
266c0 6e 20 68 61 76 65 20 61 20 57 49 54 48 20 63 6c  n have a WITH cl
266d0 61 75 73 65 2e 20 20 42 75 74 20 6d 61 6b 65 0a  ause.  But make.
266e0 20 20 2a 2a 20 73 75 72 65 20 6e 6f 20 6f 74 68    ** sure no oth
266f0 65 72 20 74 65 72 6d 73 20 61 72 65 20 6d 61 72  er terms are mar
26700 6b 65 64 20 53 46 5f 52 65 63 75 72 73 69 76 65  ked SF_Recursive
26710 20 69 6e 20 63 61 73 65 20 73 6f 6d 65 74 68 69   in case somethi
26720 6e 67 20 63 68 61 6e 67 65 73 0a 20 20 2a 2a 20  ng changes.  ** 
26730 69 6e 20 74 68 65 20 66 75 74 75 72 65 2e 0a 20  in the future.. 
26740 20 2a 2f 0a 20 20 7b 0a 20 20 20 20 53 65 6c 65   */.  {.    Sele
26750 63 74 20 2a 70 58 3b 20 20 0a 20 20 20 20 66 6f  ct *pX;  .    fo
26760 72 28 70 58 3d 70 53 75 62 71 3b 20 70 58 3b 20  r(pX=pSubq; pX; 
26770 70 58 3d 70 58 2d 3e 70 50 72 69 6f 72 29 7b 0a  pX=pX->pPrior){.
26780 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28 70        assert( (p
26790 58 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 28 53  X->selFlags & (S
267a0 46 5f 52 65 63 75 72 73 69 76 65 29 29 3d 3d 30  F_Recursive))==0
267b0 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65   );.    }.  }.#e
267c0 6e 64 69 66 0a 0a 20 20 69 66 28 20 70 53 75 62  ndif..  if( pSub
267d0 71 2d 3e 70 4c 69 6d 69 74 21 3d 30 20 29 7b 0a  q->pLimit!=0 ){.
267e0 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 2f 2a      return 0; /*
267f0 20 72 65 73 74 72 69 63 74 69 6f 6e 20 28 33 29   restriction (3)
26800 20 2a 2f 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28   */.  }.  while(
26810 20 70 57 68 65 72 65 2d 3e 6f 70 3d 3d 54 4b 5f   pWhere->op==TK_
26820 41 4e 44 20 29 7b 0a 20 20 20 20 6e 43 68 6e 67  AND ){.    nChng
26830 20 2b 3d 20 70 75 73 68 44 6f 77 6e 57 68 65 72   += pushDownWher
26840 65 54 65 72 6d 73 28 70 50 61 72 73 65 2c 20 70  eTerms(pParse, p
26850 53 75 62 71 2c 20 70 57 68 65 72 65 2d 3e 70 52  Subq, pWhere->pR
26860 69 67 68 74 2c 0a 20 20 20 20 20 20 20 20 20 20  ight,.          
26870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26880 20 20 20 20 20 20 69 43 75 72 73 6f 72 2c 20 69        iCursor, i
26890 73 4c 65 66 74 4a 6f 69 6e 29 3b 0a 20 20 20 20  sLeftJoin);.    
268a0 70 57 68 65 72 65 20 3d 20 70 57 68 65 72 65 2d  pWhere = pWhere-
268b0 3e 70 4c 65 66 74 3b 0a 20 20 7d 0a 20 20 69 66  >pLeft;.  }.  if
268c0 28 20 69 73 4c 65 66 74 4a 6f 69 6e 0a 20 20 20  ( isLeftJoin.   
268d0 26 26 20 28 45 78 70 72 48 61 73 50 72 6f 70 65  && (ExprHasPrope
268e0 72 74 79 28 70 57 68 65 72 65 2c 45 50 5f 46 72  rty(pWhere,EP_Fr
268f0 6f 6d 4a 6f 69 6e 29 3d 3d 30 0a 20 20 20 20 20  omJoin)==0.     
26900 20 20 20 20 7c 7c 20 70 57 68 65 72 65 2d 3e 69      || pWhere->i
26910 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 21 3d  RightJoinTable!=
26920 69 43 75 72 73 6f 72 29 0a 20 20 29 7b 0a 20 20  iCursor).  ){.  
26930 20 20 72 65 74 75 72 6e 20 30 3b 20 2f 2a 20 72    return 0; /* r
26940 65 73 74 72 69 63 74 69 6f 6e 20 28 34 29 20 2a  estriction (4) *
26950 2f 0a 20 20 7d 0a 20 20 69 66 28 20 45 78 70 72  /.  }.  if( Expr
26960 48 61 73 50 72 6f 70 65 72 74 79 28 70 57 68 65  HasProperty(pWhe
26970 72 65 2c 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20  re,EP_FromJoin) 
26980 26 26 20 70 57 68 65 72 65 2d 3e 69 52 69 67 68  && pWhere->iRigh
26990 74 4a 6f 69 6e 54 61 62 6c 65 21 3d 69 43 75 72  tJoinTable!=iCur
269a0 73 6f 72 20 29 7b 0a 20 20 20 20 72 65 74 75 72  sor ){.    retur
269b0 6e 20 30 3b 20 2f 2a 20 72 65 73 74 72 69 63 74  n 0; /* restrict
269c0 69 6f 6e 20 28 35 29 20 2a 2f 0a 20 20 7d 0a 20  ion (5) */.  }. 
269d0 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72   if( sqlite3Expr
269e0 49 73 54 61 62 6c 65 43 6f 6e 73 74 61 6e 74 28  IsTableConstant(
269f0 70 57 68 65 72 65 2c 20 69 43 75 72 73 6f 72 29  pWhere, iCursor)
26a00 20 29 7b 0a 20 20 20 20 6e 43 68 6e 67 2b 2b 3b   ){.    nChng++;
26a10 0a 20 20 20 20 77 68 69 6c 65 28 20 70 53 75 62  .    while( pSub
26a20 71 20 29 7b 0a 20 20 20 20 20 20 53 75 62 73 74  q ){.      Subst
26a30 43 6f 6e 74 65 78 74 20 78 3b 0a 20 20 20 20 20  Context x;.     
26a40 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 45   pNew = sqlite3E
26a50 78 70 72 44 75 70 28 70 50 61 72 73 65 2d 3e 64  xprDup(pParse->d
26a60 62 2c 20 70 57 68 65 72 65 2c 20 30 29 3b 0a 20  b, pWhere, 0);. 
26a70 20 20 20 20 20 75 6e 73 65 74 4a 6f 69 6e 45 78       unsetJoinEx
26a80 70 72 28 70 4e 65 77 2c 20 2d 31 29 3b 0a 20 20  pr(pNew, -1);.  
26a90 20 20 20 20 78 2e 70 50 61 72 73 65 20 3d 20 70      x.pParse = p
26aa0 50 61 72 73 65 3b 0a 20 20 20 20 20 20 78 2e 69  Parse;.      x.i
26ab0 54 61 62 6c 65 20 3d 20 69 43 75 72 73 6f 72 3b  Table = iCursor;
26ac0 0a 20 20 20 20 20 20 78 2e 69 4e 65 77 54 61 62  .      x.iNewTab
26ad0 6c 65 20 3d 20 69 43 75 72 73 6f 72 3b 0a 20 20  le = iCursor;.  
26ae0 20 20 20 20 78 2e 69 73 4c 65 66 74 4a 6f 69 6e      x.isLeftJoin
26af0 20 3d 20 30 3b 0a 20 20 20 20 20 20 78 2e 70 45   = 0;.      x.pE
26b00 4c 69 73 74 20 3d 20 70 53 75 62 71 2d 3e 70 45  List = pSubq->pE
26b10 4c 69 73 74 3b 0a 20 20 20 20 20 20 70 4e 65 77  List;.      pNew
26b20 20 3d 20 73 75 62 73 74 45 78 70 72 28 26 78 2c   = substExpr(&x,
26b30 20 70 4e 65 77 29 3b 0a 20 20 20 20 20 20 69 66   pNew);.      if
26b40 28 20 70 53 75 62 71 2d 3e 73 65 6c 46 6c 61 67  ( pSubq->selFlag
26b50 73 20 26 20 53 46 5f 41 67 67 72 65 67 61 74 65  s & SF_Aggregate
26b60 20 29 7b 0a 20 20 20 20 20 20 20 20 70 53 75 62   ){.        pSub
26b70 71 2d 3e 70 48 61 76 69 6e 67 20 3d 20 73 71 6c  q->pHaving = sql
26b80 69 74 65 33 45 78 70 72 41 6e 64 28 70 50 61 72  ite3ExprAnd(pPar
26b90 73 65 2d 3e 64 62 2c 20 70 53 75 62 71 2d 3e 70  se->db, pSubq->p
26ba0 48 61 76 69 6e 67 2c 20 70 4e 65 77 29 3b 0a 20  Having, pNew);. 
26bb0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
26bc0 20 20 20 20 70 53 75 62 71 2d 3e 70 57 68 65 72      pSubq->pWher
26bd0 65 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41  e = sqlite3ExprA
26be0 6e 64 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  nd(pParse->db, p
26bf0 53 75 62 71 2d 3e 70 57 68 65 72 65 2c 20 70 4e  Subq->pWhere, pN
26c00 65 77 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ew);.      }.   
26c10 20 20 20 70 53 75 62 71 20 3d 20 70 53 75 62 71     pSubq = pSubq
26c20 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 7d 0a  ->pPrior;.    }.
26c30 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 43 68    }.  return nCh
26c40 6e 67 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  ng;.}.#endif /* 
26c50 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
26c60 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29 20 7c  OMIT_SUBQUERY) |
26c70 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  | !defined(SQLIT
26c80 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20 2a 2f 0a  E_OMIT_VIEW) */.
26c90 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70 46 75 6e 63  ./*.** The pFunc
26ca0 20 69 73 20 74 68 65 20 6f 6e 6c 79 20 61 67 67   is the only agg
26cb0 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 20  regate function 
26cc0 69 6e 20 74 68 65 20 71 75 65 72 79 2e 20 20 43  in the query.  C
26cd0 68 65 63 6b 20 74 6f 20 73 65 65 0a 2a 2a 20 69  heck to see.** i
26ce0 66 20 74 68 65 20 71 75 65 72 79 20 69 73 20 61  f the query is a
26cf0 20 63 61 6e 64 69 64 61 74 65 20 66 6f 72 20 74   candidate for t
26d00 68 65 20 6d 69 6e 2f 6d 61 78 20 6f 70 74 69 6d  he min/max optim
26d10 69 7a 61 74 69 6f 6e 2e 20 0a 2a 2a 0a 2a 2a 20  ization. .**.** 
26d20 49 66 20 74 68 65 20 71 75 65 72 79 20 69 73 20  If the query is 
26d30 61 20 63 61 6e 64 69 64 61 74 65 20 66 6f 72 20  a candidate for 
26d40 74 68 65 20 6d 69 6e 2f 6d 61 78 20 6f 70 74 69  the min/max opti
26d50 6d 69 7a 61 74 69 6f 6e 2c 20 74 68 65 6e 20 73  mization, then s
26d60 65 74 0a 2a 2a 20 2a 70 70 4d 69 6e 4d 61 78 20  et.** *ppMinMax 
26d70 74 6f 20 62 65 20 61 6e 20 4f 52 44 45 52 20 42  to be an ORDER B
26d80 59 20 63 6c 61 75 73 65 20 74 6f 20 62 65 20 75  Y clause to be u
26d90 73 65 64 20 66 6f 72 20 74 68 65 20 6f 70 74 69  sed for the opti
26da0 6d 69 7a 61 74 69 6f 6e 0a 2a 2a 20 61 6e 64 20  mization.** and 
26db0 72 65 74 75 72 6e 20 65 69 74 68 65 72 20 57 48  return either WH
26dc0 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d 49 4e 20  ERE_ORDERBY_MIN 
26dd0 6f 72 20 57 48 45 52 45 5f 4f 52 44 45 52 42 59  or WHERE_ORDERBY
26de0 5f 4d 41 58 20 64 65 70 65 6e 64 69 6e 67 20 6f  _MAX depending o
26df0 6e 0a 2a 2a 20 77 68 65 74 68 65 72 20 70 46 75  n.** whether pFu
26e00 6e 63 20 69 73 20 61 20 6d 69 6e 28 29 20 6f 72  nc is a min() or
26e10 20 6d 61 78 28 29 20 66 75 6e 63 74 69 6f 6e 2e   max() function.
26e20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 71 75  .**.** If the qu
26e30 65 72 79 20 69 73 20 6e 6f 74 20 61 20 63 61 6e  ery is not a can
26e40 64 69 64 61 74 65 20 66 6f 72 20 74 68 65 20 6d  didate for the m
26e50 69 6e 2f 6d 61 78 20 6f 70 74 69 6d 69 7a 61 74  in/max optimizat
26e60 69 6f 6e 2c 20 72 65 74 75 72 6e 0a 2a 2a 20 57  ion, return.** W
26e70 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4e 4f 52  HERE_ORDERBY_NOR
26e80 4d 41 4c 20 28 77 68 69 63 68 20 6d 75 73 74 20  MAL (which must 
26e90 62 65 20 7a 65 72 6f 29 2e 0a 2a 2a 0a 2a 2a 20  be zero)..**.** 
26ea0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 75 73  This routine mus
26eb0 74 20 62 65 20 63 61 6c 6c 65 64 20 61 66 74 65  t be called afte
26ec0 72 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63  r aggregate func
26ed0 74 69 6f 6e 73 20 68 61 76 65 20 62 65 65 6e 0a  tions have been.
26ee0 2a 2a 20 6c 6f 63 61 74 65 64 20 62 75 74 20 62  ** located but b
26ef0 65 66 6f 72 65 20 74 68 65 69 72 20 61 72 67 75  efore their argu
26f00 6d 65 6e 74 73 20 68 61 76 65 20 62 65 65 6e 20  ments have been 
26f10 73 75 62 6a 65 63 74 65 64 20 74 6f 20 61 67 67  subjected to agg
26f20 72 65 67 61 74 65 0a 2a 2a 20 61 6e 61 6c 79 73  regate.** analys
26f30 69 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 38  is..*/.static u8
26f40 20 6d 69 6e 4d 61 78 51 75 65 72 79 28 73 71 6c   minMaxQuery(sql
26f50 69 74 65 33 20 2a 64 62 2c 20 45 78 70 72 20 2a  ite3 *db, Expr *
26f60 70 46 75 6e 63 2c 20 45 78 70 72 4c 69 73 74 20  pFunc, ExprList 
26f70 2a 2a 70 70 4d 69 6e 4d 61 78 29 7b 0a 20 20 69  **ppMinMax){.  i
26f80 6e 74 20 65 52 65 74 20 3d 20 57 48 45 52 45 5f  nt eRet = WHERE_
26f90 4f 52 44 45 52 42 59 5f 4e 4f 52 4d 41 4c 3b 20  ORDERBY_NORMAL; 
26fa0 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 76       /* Return v
26fb0 61 6c 75 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69  alue */.  ExprLi
26fc0 73 74 20 2a 70 45 4c 69 73 74 20 3d 20 70 46 75  st *pEList = pFu
26fd0 6e 63 2d 3e 78 2e 70 4c 69 73 74 3b 20 20 20 20  nc->x.pList;    
26fe0 2f 2a 20 41 72 67 75 6d 65 6e 74 73 20 74 6f 20  /* Arguments to 
26ff0 61 67 67 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a  agg function */.
27000 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46    const char *zF
27010 75 6e 63 3b 20 20 20 20 20 20 20 20 20 20 20 20  unc;            
27020 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
27030 6f 66 20 61 67 67 72 65 67 61 74 65 20 66 75 6e  of aggregate fun
27040 63 74 69 6f 6e 20 70 46 75 6e 63 20 2a 2f 0a 20  ction pFunc */. 
27050 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65   ExprList *pOrde
27060 72 42 79 3b 0a 20 20 75 38 20 73 6f 72 74 4f 72  rBy;.  u8 sortOr
27070 64 65 72 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  der;..  assert( 
27080 2a 70 70 4d 69 6e 4d 61 78 3d 3d 30 20 29 3b 0a  *ppMinMax==0 );.
27090 20 20 61 73 73 65 72 74 28 20 70 46 75 6e 63 2d    assert( pFunc-
270a0 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 46 55 4e 43  >op==TK_AGG_FUNC
270b0 54 49 4f 4e 20 29 3b 0a 20 20 69 66 28 20 70 45  TION );.  if( pE
270c0 4c 69 73 74 3d 3d 30 20 7c 7c 20 70 45 4c 69 73  List==0 || pELis
270d0 74 2d 3e 6e 45 78 70 72 21 3d 31 20 29 20 72 65  t->nExpr!=1 ) re
270e0 74 75 72 6e 20 65 52 65 74 3b 0a 20 20 7a 46 75  turn eRet;.  zFu
270f0 6e 63 20 3d 20 70 46 75 6e 63 2d 3e 75 2e 7a 54  nc = pFunc->u.zT
27100 6f 6b 65 6e 3b 0a 20 20 69 66 28 20 73 71 6c 69  oken;.  if( sqli
27110 74 65 33 53 74 72 49 43 6d 70 28 7a 46 75 6e 63  te3StrICmp(zFunc
27120 2c 20 22 6d 69 6e 22 29 3d 3d 30 20 29 7b 0a 20  , "min")==0 ){. 
27130 20 20 20 65 52 65 74 20 3d 20 57 48 45 52 45 5f     eRet = WHERE_
27140 4f 52 44 45 52 42 59 5f 4d 49 4e 3b 0a 20 20 20  ORDERBY_MIN;.   
27150 20 73 6f 72 74 4f 72 64 65 72 20 3d 20 53 51 4c   sortOrder = SQL
27160 49 54 45 5f 53 4f 5f 41 53 43 3b 0a 20 20 7d 65  ITE_SO_ASC;.  }e
27170 6c 73 65 20 69 66 28 20 73 71 6c 69 74 65 33 53  lse if( sqlite3S
27180 74 72 49 43 6d 70 28 7a 46 75 6e 63 2c 20 22 6d  trICmp(zFunc, "m
27190 61 78 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 65  ax")==0 ){.    e
271a0 52 65 74 20 3d 20 57 48 45 52 45 5f 4f 52 44 45  Ret = WHERE_ORDE
271b0 52 42 59 5f 4d 41 58 3b 0a 20 20 20 20 73 6f 72  RBY_MAX;.    sor
271c0 74 4f 72 64 65 72 20 3d 20 53 51 4c 49 54 45 5f  tOrder = SQLITE_
271d0 53 4f 5f 44 45 53 43 3b 0a 20 20 7d 65 6c 73 65  SO_DESC;.  }else
271e0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 65 52 65  {.    return eRe
271f0 74 3b 0a 20 20 7d 0a 20 20 2a 70 70 4d 69 6e 4d  t;.  }.  *ppMinM
27200 61 78 20 3d 20 70 4f 72 64 65 72 42 79 20 3d 20  ax = pOrderBy = 
27210 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
27220 75 70 28 64 62 2c 20 70 45 4c 69 73 74 2c 20 30  up(db, pEList, 0
27230 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f 72  );.  assert( pOr
27240 64 65 72 42 79 21 3d 30 20 7c 7c 20 64 62 2d 3e  derBy!=0 || db->
27250 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a  mallocFailed );.
27260 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 20 29    if( pOrderBy )
27270 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 30 5d 2e   pOrderBy->a[0].
27280 73 6f 72 74 4f 72 64 65 72 20 3d 20 73 6f 72 74  sortOrder = sort
27290 4f 72 64 65 72 3b 0a 20 20 72 65 74 75 72 6e 20  Order;.  return 
272a0 65 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  eRet;.}../*.** T
272b0 68 65 20 73 65 6c 65 63 74 20 73 74 61 74 65 6d  he select statem
272c0 65 6e 74 20 70 61 73 73 65 64 20 61 73 20 74 68  ent passed as th
272d0 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74  e first argument
272e0 20 69 73 20 61 6e 20 61 67 67 72 65 67 61 74 65   is an aggregate
272f0 20 71 75 65 72 79 2e 0a 2a 2a 20 54 68 65 20 73   query..** The s
27300 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69  econd argument i
27310 73 20 74 68 65 20 61 73 73 6f 63 69 61 74 65 64  s the associated
27320 20 61 67 67 72 65 67 61 74 65 2d 69 6e 66 6f 20   aggregate-info 
27330 6f 62 6a 65 63 74 2e 20 54 68 69 73 20 0a 2a 2a  object. This .**
27340 20 66 75 6e 63 74 69 6f 6e 20 74 65 73 74 73 20   function tests 
27350 69 66 20 74 68 65 20 53 45 4c 45 43 54 20 69 73  if the SELECT is
27360 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a 2a 2a   of the form:.**
27370 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20 63 6f 75  .**   SELECT cou
27380 6e 74 28 2a 29 20 46 52 4f 4d 20 3c 74 62 6c 3e  nt(*) FROM <tbl>
27390 0a 2a 2a 0a 2a 2a 20 77 68 65 72 65 20 74 61 62  .**.** where tab
273a0 6c 65 20 69 73 20 61 20 64 61 74 61 62 61 73 65  le is a database
273b0 20 74 61 62 6c 65 2c 20 6e 6f 74 20 61 20 73 75   table, not a su
273c0 62 2d 73 65 6c 65 63 74 20 6f 72 20 76 69 65 77  b-select or view
273d0 2e 20 49 66 20 74 68 65 20 71 75 65 72 79 0a 2a  . If the query.*
273e0 2a 20 64 6f 65 73 20 6d 61 74 63 68 20 74 68 69  * does match thi
273f0 73 20 70 61 74 74 65 72 6e 2c 20 74 68 65 6e 20  s pattern, then 
27400 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
27410 20 54 61 62 6c 65 20 6f 62 6a 65 63 74 20 72 65   Table object re
27420 70 72 65 73 65 6e 74 69 6e 67 0a 2a 2a 20 3c 74  presenting.** <t
27430 62 6c 3e 20 69 73 20 72 65 74 75 72 6e 65 64 2e  bl> is returned.
27440 20 4f 74 68 65 72 77 69 73 65 2c 20 30 20 69 73   Otherwise, 0 is
27450 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74   returned..*/.st
27460 61 74 69 63 20 54 61 62 6c 65 20 2a 69 73 53 69  atic Table *isSi
27470 6d 70 6c 65 43 6f 75 6e 74 28 53 65 6c 65 63 74  mpleCount(Select
27480 20 2a 70 2c 20 41 67 67 49 6e 66 6f 20 2a 70 41   *p, AggInfo *pA
27490 67 67 49 6e 66 6f 29 7b 0a 20 20 54 61 62 6c 65  ggInfo){.  Table
274a0 20 2a 70 54 61 62 3b 0a 20 20 45 78 70 72 20 2a   *pTab;.  Expr *
274b0 70 45 78 70 72 3b 0a 0a 20 20 61 73 73 65 72 74  pExpr;..  assert
274c0 28 20 21 70 2d 3e 70 47 72 6f 75 70 42 79 20 29  ( !p->pGroupBy )
274d0 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 70 57 68 65  ;..  if( p->pWhe
274e0 72 65 20 7c 7c 20 70 2d 3e 70 45 4c 69 73 74 2d  re || p->pEList-
274f0 3e 6e 45 78 70 72 21 3d 31 20 0a 20 20 20 7c 7c  >nExpr!=1 .   ||
27500 20 70 2d 3e 70 53 72 63 2d 3e 6e 53 72 63 21 3d   p->pSrc->nSrc!=
27510 31 20 7c 7c 20 70 2d 3e 70 53 72 63 2d 3e 61 5b  1 || p->pSrc->a[
27520 30 5d 2e 70 53 65 6c 65 63 74 0a 20 20 29 7b 0a  0].pSelect.  ){.
27530 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
27540 7d 0a 20 20 70 54 61 62 20 3d 20 70 2d 3e 70 53  }.  pTab = p->pS
27550 72 63 2d 3e 61 5b 30 5d 2e 70 54 61 62 3b 0a 20  rc->a[0].pTab;. 
27560 20 70 45 78 70 72 20 3d 20 70 2d 3e 70 45 4c 69   pExpr = p->pELi
27570 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a  st->a[0].pExpr;.
27580 20 20 61 73 73 65 72 74 28 20 70 54 61 62 20 26    assert( pTab &
27590 26 20 21 70 54 61 62 2d 3e 70 53 65 6c 65 63 74  & !pTab->pSelect
275a0 20 26 26 20 70 45 78 70 72 20 29 3b 0a 0a 20 20   && pExpr );..  
275b0 69 66 28 20 49 73 56 69 72 74 75 61 6c 28 70 54  if( IsVirtual(pT
275c0 61 62 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ab) ) return 0;.
275d0 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 21    if( pExpr->op!
275e0 3d 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e  =TK_AGG_FUNCTION
275f0 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69   ) return 0;.  i
27600 66 28 20 4e 45 56 45 52 28 70 41 67 67 49 6e 66  f( NEVER(pAggInf
27610 6f 2d 3e 6e 46 75 6e 63 3d 3d 30 29 20 29 20 72  o->nFunc==0) ) r
27620 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 28  eturn 0;.  if( (
27630 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b  pAggInfo->aFunc[
27640 30 5d 2e 70 46 75 6e 63 2d 3e 66 75 6e 63 46 6c  0].pFunc->funcFl
27650 61 67 73 26 53 51 4c 49 54 45 5f 46 55 4e 43 5f  ags&SQLITE_FUNC_
27660 43 4f 55 4e 54 29 3d 3d 30 20 29 20 72 65 74 75  COUNT)==0 ) retu
27670 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 45 78 70  rn 0;.  if( pExp
27680 72 2d 3e 66 6c 61 67 73 26 45 50 5f 44 69 73 74  r->flags&EP_Dist
27690 69 6e 63 74 20 29 20 72 65 74 75 72 6e 20 30 3b  inct ) return 0;
276a0 0a 0a 20 20 72 65 74 75 72 6e 20 70 54 61 62 3b  ..  return pTab;
276b0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65  .}../*.** If the
276c0 20 73 6f 75 72 63 65 2d 6c 69 73 74 20 69 74 65   source-list ite
276d0 6d 20 70 61 73 73 65 64 20 61 73 20 61 6e 20 61  m passed as an a
276e0 72 67 75 6d 65 6e 74 20 77 61 73 20 61 75 67 6d  rgument was augm
276f0 65 6e 74 65 64 20 77 69 74 68 20 61 6e 0a 2a 2a  ented with an.**
27700 20 49 4e 44 45 58 45 44 20 42 59 20 63 6c 61 75   INDEXED BY clau
27710 73 65 2c 20 74 68 65 6e 20 74 72 79 20 74 6f 20  se, then try to 
27720 6c 6f 63 61 74 65 20 74 68 65 20 73 70 65 63 69  locate the speci
27730 66 69 65 64 20 69 6e 64 65 78 2e 20 49 66 20 74  fied index. If t
27740 68 65 72 65 0a 2a 2a 20 77 61 73 20 73 75 63 68  here.** was such
27750 20 61 20 63 6c 61 75 73 65 20 61 6e 64 20 74 68   a clause and th
27760 65 20 6e 61 6d 65 64 20 69 6e 64 65 78 20 63 61  e named index ca
27770 6e 6e 6f 74 20 62 65 20 66 6f 75 6e 64 2c 20 72  nnot be found, r
27780 65 74 75 72 6e 20 0a 2a 2a 20 53 51 4c 49 54 45  eturn .** SQLITE
27790 5f 45 52 52 4f 52 20 61 6e 64 20 6c 65 61 76 65  _ERROR and leave
277a0 20 61 6e 20 65 72 72 6f 72 20 69 6e 20 70 50 61   an error in pPa
277b0 72 73 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  rse. Otherwise, 
277c0 70 6f 70 75 6c 61 74 65 20 0a 2a 2a 20 70 46 72  populate .** pFr
277d0 6f 6d 2d 3e 70 49 6e 64 65 78 20 61 6e 64 20 72  om->pIndex and r
277e0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e  eturn SQLITE_OK.
277f0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 49  .*/.int sqlite3I
27800 6e 64 65 78 65 64 42 79 4c 6f 6f 6b 75 70 28 50  ndexedByLookup(P
27810 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 73 74  arse *pParse, st
27820 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
27830 6d 20 2a 70 46 72 6f 6d 29 7b 0a 20 20 69 66 28  m *pFrom){.  if(
27840 20 70 46 72 6f 6d 2d 3e 70 54 61 62 20 26 26 20   pFrom->pTab && 
27850 70 46 72 6f 6d 2d 3e 66 67 2e 69 73 49 6e 64 65  pFrom->fg.isInde
27860 78 65 64 42 79 20 29 7b 0a 20 20 20 20 54 61 62  xedBy ){.    Tab
27870 6c 65 20 2a 70 54 61 62 20 3d 20 70 46 72 6f 6d  le *pTab = pFrom
27880 2d 3e 70 54 61 62 3b 0a 20 20 20 20 63 68 61 72  ->pTab;.    char
27890 20 2a 7a 49 6e 64 65 78 65 64 42 79 20 3d 20 70   *zIndexedBy = p
278a0 46 72 6f 6d 2d 3e 75 31 2e 7a 49 6e 64 65 78 65  From->u1.zIndexe
278b0 64 42 79 3b 0a 20 20 20 20 49 6e 64 65 78 20 2a  dBy;.    Index *
278c0 70 49 64 78 3b 0a 20 20 20 20 66 6f 72 28 70 49  pIdx;.    for(pI
278d0 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b  dx=pTab->pIndex;
278e0 20 0a 20 20 20 20 20 20 20 20 70 49 64 78 20 26   .        pIdx &
278f0 26 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  & sqlite3StrICmp
27900 28 70 49 64 78 2d 3e 7a 4e 61 6d 65 2c 20 7a 49  (pIdx->zName, zI
27910 6e 64 65 78 65 64 42 79 29 3b 20 0a 20 20 20 20  ndexedBy); .    
27920 20 20 20 20 70 49 64 78 3d 70 49 64 78 2d 3e 70      pIdx=pIdx->p
27930 4e 65 78 74 0a 20 20 20 20 29 3b 0a 20 20 20 20  Next.    );.    
27940 69 66 28 20 21 70 49 64 78 20 29 7b 0a 20 20 20  if( !pIdx ){.   
27950 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
27960 73 67 28 70 50 61 72 73 65 2c 20 22 6e 6f 20 73  sg(pParse, "no s
27970 75 63 68 20 69 6e 64 65 78 3a 20 25 73 22 2c 20  uch index: %s", 
27980 7a 49 6e 64 65 78 65 64 42 79 2c 20 30 29 3b 0a  zIndexedBy, 0);.
27990 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 63 68        pParse->ch
279a0 65 63 6b 53 63 68 65 6d 61 20 3d 20 31 3b 0a 20  eckSchema = 1;. 
279b0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
279c0 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  TE_ERROR;.    }.
279d0 20 20 20 20 70 46 72 6f 6d 2d 3e 70 49 42 49 6e      pFrom->pIBIn
279e0 64 65 78 20 3d 20 70 49 64 78 3b 0a 20 20 7d 0a  dex = pIdx;.  }.
279f0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
27a00 4f 4b 3b 0a 7d 0a 2f 2a 0a 2a 2a 20 44 65 74 65  OK;.}./*.** Dete
27a10 63 74 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45  ct compound SELE
27a20 43 54 20 73 74 61 74 65 6d 65 6e 74 73 20 74 68  CT statements th
27a30 61 74 20 75 73 65 20 61 6e 20 4f 52 44 45 52 20  at use an ORDER 
27a40 42 59 20 63 6c 61 75 73 65 20 77 69 74 68 20 0a  BY clause with .
27a50 2a 2a 20 61 6e 20 61 6c 74 65 72 6e 61 74 69 76  ** an alternativ
27a60 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  e collating sequ
27a70 65 6e 63 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 53  ence..**.**    S
27a80 45 4c 45 43 54 20 2e 2e 2e 20 46 52 4f 4d 20 74  ELECT ... FROM t
27a90 31 20 45 58 43 45 50 54 20 53 45 4c 45 43 54 20  1 EXCEPT SELECT 
27aa0 2e 2e 2e 20 46 52 4f 4d 20 74 32 20 4f 52 44 45  ... FROM t2 ORDE
27ab0 52 20 42 59 20 2e 2e 20 43 4f 4c 4c 41 54 45 20  R BY .. COLLATE 
27ac0 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 73 65 20  ....**.** These 
27ad0 61 72 65 20 72 65 77 72 69 74 74 65 6e 20 61 73  are rewritten as
27ae0 20 61 20 73 75 62 71 75 65 72 79 3a 0a 2a 2a 0a   a subquery:.**.
27af0 2a 2a 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46  **    SELECT * F
27b00 52 4f 4d 20 28 53 45 4c 45 43 54 20 2e 2e 2e 20  ROM (SELECT ... 
27b10 46 52 4f 4d 20 74 31 20 45 58 43 45 50 54 20 53  FROM t1 EXCEPT S
27b20 45 4c 45 43 54 20 2e 2e 2e 20 46 52 4f 4d 20 74  ELECT ... FROM t
27b30 32 29 0a 2a 2a 20 20 20 20 20 4f 52 44 45 52 20  2).**     ORDER 
27b40 42 59 20 2e 2e 2e 20 43 4f 4c 4c 41 54 45 20 2e  BY ... COLLATE .
27b50 2e 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 74 72  ...**.** This tr
27b60 61 6e 73 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20  ansformation is 
27b70 6e 65 63 65 73 73 61 72 79 20 62 65 63 61 75 73  necessary becaus
27b80 65 20 74 68 65 20 6d 75 6c 74 69 53 65 6c 65 63  e the multiSelec
27b90 74 4f 72 64 65 72 42 79 28 29 20 72 6f 75 74 69  tOrderBy() routi
27ba0 6e 65 0a 2a 2a 20 61 62 6f 76 65 20 74 68 61 74  ne.** above that
27bb0 20 67 65 6e 65 72 61 74 65 73 20 74 68 65 20 63   generates the c
27bc0 6f 64 65 20 66 6f 72 20 61 20 63 6f 6d 70 6f 75  ode for a compou
27bd0 6e 64 20 53 45 4c 45 43 54 20 77 69 74 68 20 61  nd SELECT with a
27be0 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  n ORDER BY claus
27bf0 65 0a 2a 2a 20 75 73 65 73 20 61 20 6d 65 72 67  e.** uses a merg
27c00 65 20 61 6c 67 6f 72 69 74 68 6d 20 74 68 61 74  e algorithm that
27c10 20 72 65 71 75 69 72 65 73 20 74 68 65 20 73 61   requires the sa
27c20 6d 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71  me collating seq
27c30 75 65 6e 63 65 20 6f 6e 20 74 68 65 0a 2a 2a 20  uence on the.** 
27c40 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 61  result columns a
27c50 73 20 6f 6e 20 74 68 65 20 4f 52 44 45 52 20 42  s on the ORDER B
27c60 59 20 63 6c 61 75 73 65 2e 20 20 53 65 65 20 74  Y clause.  See t
27c70 69 63 6b 65 74 0a 2a 2a 20 68 74 74 70 3a 2f 2f  icket.** http://
27c80 77 77 77 2e 73 71 6c 69 74 65 2e 6f 72 67 2f 73  www.sqlite.org/s
27c90 72 63 2f 69 6e 66 6f 2f 36 37 30 39 35 37 34 64  rc/info/6709574d
27ca0 32 61 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 74 72  2a.**.** This tr
27cb0 61 6e 73 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20  ansformation is 
27cc0 6f 6e 6c 79 20 6e 65 65 64 65 64 20 66 6f 72 20  only needed for 
27cd0 45 58 43 45 50 54 2c 20 49 4e 54 45 52 53 45 43  EXCEPT, INTERSEC
27ce0 54 2c 20 61 6e 64 20 55 4e 49 4f 4e 2e 0a 2a 2a  T, and UNION..**
27cf0 20 54 68 65 20 55 4e 49 4f 4e 20 41 4c 4c 20 6f   The UNION ALL o
27d00 70 65 72 61 74 6f 72 20 77 6f 72 6b 73 20 66 69  perator works fi
27d10 6e 65 20 77 69 74 68 20 6d 75 6c 74 69 53 65 6c  ne with multiSel
27d20 65 63 74 4f 72 64 65 72 42 79 28 29 20 65 76 65  ectOrderBy() eve
27d30 6e 20 77 68 65 6e 0a 2a 2a 20 74 68 65 72 65 20  n when.** there 
27d40 61 72 65 20 43 4f 4c 4c 41 54 45 20 74 65 72 6d  are COLLATE term
27d50 73 20 69 6e 20 74 68 65 20 4f 52 44 45 52 20 42  s in the ORDER B
27d60 59 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  Y..*/.static int
27d70 20 63 6f 6e 76 65 72 74 43 6f 6d 70 6f 75 6e 64   convertCompound
27d80 53 65 6c 65 63 74 54 6f 53 75 62 71 75 65 72 79  SelectToSubquery
27d90 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72  (Walker *pWalker
27da0 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20  , Select *p){.  
27db0 69 6e 74 20 69 3b 0a 20 20 53 65 6c 65 63 74 20  int i;.  Select 
27dc0 2a 70 4e 65 77 3b 0a 20 20 53 65 6c 65 63 74 20  *pNew;.  Select 
27dd0 2a 70 58 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a  *pX;.  sqlite3 *
27de0 64 62 3b 0a 20 20 73 74 72 75 63 74 20 45 78 70  db;.  struct Exp
27df0 72 4c 69 73 74 5f 69 74 65 6d 20 2a 61 3b 0a 20  rList_item *a;. 
27e00 20 53 72 63 4c 69 73 74 20 2a 70 4e 65 77 53 72   SrcList *pNewSr
27e10 63 3b 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  c;.  Parse *pPar
27e20 73 65 3b 0a 20 20 54 6f 6b 65 6e 20 64 75 6d 6d  se;.  Token dumm
27e30 79 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 70 50 72  y;..  if( p->pPr
27e40 69 6f 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ior==0 ) return 
27e50 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20 20  WRC_Continue;.  
27e60 69 66 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 3d  if( p->pOrderBy=
27e70 3d 30 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f  =0 ) return WRC_
27e80 43 6f 6e 74 69 6e 75 65 3b 0a 20 20 66 6f 72 28  Continue;.  for(
27e90 70 58 3d 70 3b 20 70 58 20 26 26 20 28 70 58 2d  pX=p; pX && (pX-
27ea0 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 7c 7c 20 70  >op==TK_ALL || p
27eb0 58 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54  X->op==TK_SELECT
27ec0 29 3b 20 70 58 3d 70 58 2d 3e 70 50 72 69 6f 72  ); pX=pX->pPrior
27ed0 29 7b 7d 0a 20 20 69 66 28 20 70 58 3d 3d 30 20  ){}.  if( pX==0 
27ee0 29 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e  ) return WRC_Con
27ef0 74 69 6e 75 65 3b 0a 20 20 61 20 3d 20 70 2d 3e  tinue;.  a = p->
27f00 70 4f 72 64 65 72 42 79 2d 3e 61 3b 0a 20 20 66  pOrderBy->a;.  f
27f10 6f 72 28 69 3d 70 2d 3e 70 4f 72 64 65 72 42 79  or(i=p->pOrderBy
27f20 2d 3e 6e 45 78 70 72 2d 31 3b 20 69 3e 3d 30 3b  ->nExpr-1; i>=0;
27f30 20 69 2d 2d 29 7b 0a 20 20 20 20 69 66 28 20 61   i--){.    if( a
27f40 5b 69 5d 2e 70 45 78 70 72 2d 3e 66 6c 61 67 73  [i].pExpr->flags
27f50 20 26 20 45 50 5f 43 6f 6c 6c 61 74 65 20 29 20   & EP_Collate ) 
27f60 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 69 66 28  break;.  }.  if(
27f70 20 69 3c 30 20 29 20 72 65 74 75 72 6e 20 57 52   i<0 ) return WR
27f80 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 0a 20 20 2f  C_Continue;..  /
27f90 2a 20 49 66 20 77 65 20 72 65 61 63 68 20 74 68  * If we reach th
27fa0 69 73 20 70 6f 69 6e 74 2c 20 74 68 61 74 20 6d  is point, that m
27fb0 65 61 6e 73 20 74 68 65 20 74 72 61 6e 73 66 6f  eans the transfo
27fc0 72 6d 61 74 69 6f 6e 20 69 73 20 72 65 71 75 69  rmation is requi
27fd0 72 65 64 2e 20 2a 2f 0a 0a 20 20 70 50 61 72 73  red. */..  pPars
27fe0 65 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 70 50 61  e = pWalker->pPa
27ff0 72 73 65 3b 0a 20 20 64 62 20 3d 20 70 50 61 72  rse;.  db = pPar
28000 73 65 2d 3e 64 62 3b 0a 20 20 70 4e 65 77 20 3d  se->db;.  pNew =
28010 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
28020 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28  Zero(db, sizeof(
28030 2a 70 4e 65 77 29 20 29 3b 0a 20 20 69 66 28 20  *pNew) );.  if( 
28040 70 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e  pNew==0 ) return
28050 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 6d 65   WRC_Abort;.  me
28060 6d 73 65 74 28 26 64 75 6d 6d 79 2c 20 30 2c 20  mset(&dummy, 0, 
28070 73 69 7a 65 6f 66 28 64 75 6d 6d 79 29 29 3b 0a  sizeof(dummy));.
28080 20 20 70 4e 65 77 53 72 63 20 3d 20 73 71 6c 69    pNewSrc = sqli
28090 74 65 33 53 72 63 4c 69 73 74 41 70 70 65 6e 64  te3SrcListAppend
280a0 46 72 6f 6d 54 65 72 6d 28 70 50 61 72 73 65 2c  FromTerm(pParse,
280b0 30 2c 30 2c 30 2c 26 64 75 6d 6d 79 2c 70 4e 65  0,0,0,&dummy,pNe
280c0 77 2c 30 2c 30 29 3b 0a 20 20 69 66 28 20 70 4e  w,0,0);.  if( pN
280d0 65 77 53 72 63 3d 3d 30 20 29 20 72 65 74 75 72  ewSrc==0 ) retur
280e0 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 2a  n WRC_Abort;.  *
280f0 70 4e 65 77 20 3d 20 2a 70 3b 0a 20 20 70 2d 3e  pNew = *p;.  p->
28100 70 53 72 63 20 3d 20 70 4e 65 77 53 72 63 3b 0a  pSrc = pNewSrc;.
28110 20 20 70 2d 3e 70 45 4c 69 73 74 20 3d 20 73 71    p->pEList = sq
28120 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70 70  lite3ExprListApp
28130 65 6e 64 28 70 50 61 72 73 65 2c 20 30 2c 20 73  end(pParse, 0, s
28140 71 6c 69 74 65 33 45 78 70 72 28 64 62 2c 20 54  qlite3Expr(db, T
28150 4b 5f 41 53 54 45 52 49 53 4b 2c 20 30 29 29 3b  K_ASTERISK, 0));
28160 0a 20 20 70 2d 3e 6f 70 20 3d 20 54 4b 5f 53 45  .  p->op = TK_SE
28170 4c 45 43 54 3b 0a 20 20 70 2d 3e 70 57 68 65 72  LECT;.  p->pWher
28180 65 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 70  e = 0;.  pNew->p
28190 47 72 6f 75 70 42 79 20 3d 20 30 3b 0a 20 20 70  GroupBy = 0;.  p
281a0 4e 65 77 2d 3e 70 48 61 76 69 6e 67 20 3d 20 30  New->pHaving = 0
281b0 3b 0a 20 20 70 4e 65 77 2d 3e 70 4f 72 64 65 72  ;.  pNew->pOrder
281c0 42 79 20 3d 20 30 3b 0a 20 20 70 2d 3e 70 50 72  By = 0;.  p->pPr
281d0 69 6f 72 20 3d 20 30 3b 0a 20 20 70 2d 3e 70 4e  ior = 0;.  p->pN
281e0 65 78 74 20 3d 20 30 3b 0a 20 20 70 2d 3e 70 57  ext = 0;.  p->pW
281f0 69 74 68 20 3d 20 30 3b 0a 20 20 70 2d 3e 73 65  ith = 0;.  p->se
28200 6c 46 6c 61 67 73 20 26 3d 20 7e 53 46 5f 43 6f  lFlags &= ~SF_Co
28210 6d 70 6f 75 6e 64 3b 0a 20 20 61 73 73 65 72 74  mpound;.  assert
28220 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26  ( (p->selFlags &
28230 20 53 46 5f 43 6f 6e 76 65 72 74 65 64 29 3d 3d   SF_Converted)==
28240 30 20 29 3b 0a 20 20 70 2d 3e 73 65 6c 46 6c 61  0 );.  p->selFla
28250 67 73 20 7c 3d 20 53 46 5f 43 6f 6e 76 65 72 74  gs |= SF_Convert
28260 65 64 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4e  ed;.  assert( pN
28270 65 77 2d 3e 70 50 72 69 6f 72 21 3d 30 20 29 3b  ew->pPrior!=0 );
28280 0a 20 20 70 4e 65 77 2d 3e 70 50 72 69 6f 72 2d  .  pNew->pPrior-
28290 3e 70 4e 65 78 74 20 3d 20 70 4e 65 77 3b 0a 20  >pNext = pNew;. 
282a0 20 70 4e 65 77 2d 3e 70 4c 69 6d 69 74 20 3d 20   pNew->pLimit = 
282b0 30 3b 0a 20 20 72 65 74 75 72 6e 20 57 52 43 5f  0;.  return WRC_
282c0 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a  Continue;.}../*.
282d0 2a 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20  ** Check to see 
282e0 69 66 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  if the FROM clau
282f0 73 65 20 74 65 72 6d 20 70 46 72 6f 6d 20 68 61  se term pFrom ha
28300 73 20 74 61 62 6c 65 2d 76 61 6c 75 65 64 20 66  s table-valued f
28310 75 6e 63 74 69 6f 6e 0a 2a 2a 20 61 72 67 75 6d  unction.** argum
28320 65 6e 74 73 2e 20 20 49 66 20 69 74 20 64 6f 65  ents.  If it doe
28330 73 2c 20 6c 65 61 76 65 20 61 6e 20 65 72 72 6f  s, leave an erro
28340 72 20 6d 65 73 73 61 67 65 20 69 6e 20 70 50 61  r message in pPa
28350 72 73 65 20 61 6e 64 20 72 65 74 75 72 6e 0a 2a  rse and return.*
28360 2a 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 73 69 6e 63  * non-zero, sinc
28370 65 20 70 46 72 6f 6d 20 69 73 20 6e 6f 74 20 61  e pFrom is not a
28380 6c 6c 6f 77 65 64 20 74 6f 20 62 65 20 61 20 74  llowed to be a t
28390 61 62 6c 65 2d 76 61 6c 75 65 64 20 66 75 6e 63  able-valued func
283a0 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tion..*/.static 
283b0 69 6e 74 20 63 61 6e 6e 6f 74 42 65 46 75 6e 63  int cannotBeFunc
283c0 74 69 6f 6e 28 50 61 72 73 65 20 2a 70 50 61 72  tion(Parse *pPar
283d0 73 65 2c 20 73 74 72 75 63 74 20 53 72 63 4c 69  se, struct SrcLi
283e0 73 74 5f 69 74 65 6d 20 2a 70 46 72 6f 6d 29 7b  st_item *pFrom){
283f0 0a 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e 66 67  .  if( pFrom->fg
28400 2e 69 73 54 61 62 46 75 6e 63 20 29 7b 0a 20 20  .isTabFunc ){.  
28410 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
28420 67 28 70 50 61 72 73 65 2c 20 22 27 25 73 27 20  g(pParse, "'%s' 
28430 69 73 20 6e 6f 74 20 61 20 66 75 6e 63 74 69 6f  is not a functio
28440 6e 22 2c 20 70 46 72 6f 6d 2d 3e 7a 4e 61 6d 65  n", pFrom->zName
28450 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b  );.    return 1;
28460 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
28470 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
28480 54 45 5f 4f 4d 49 54 5f 43 54 45 0a 2f 2a 0a 2a  TE_OMIT_CTE./*.*
28490 2a 20 41 72 67 75 6d 65 6e 74 20 70 57 69 74 68  * Argument pWith
284a0 20 28 77 68 69 63 68 20 6d 61 79 20 62 65 20 4e   (which may be N
284b0 55 4c 4c 29 20 70 6f 69 6e 74 73 20 74 6f 20 61  ULL) points to a
284c0 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20   linked list of 
284d0 6e 65 73 74 65 64 20 0a 2a 2a 20 57 49 54 48 20  nested .** WITH 
284e0 63 6f 6e 74 65 78 74 73 2c 20 66 72 6f 6d 20 69  contexts, from i
284f0 6e 6e 65 72 20 74 6f 20 6f 75 74 65 72 6d 6f 73  nner to outermos
28500 74 2e 20 49 66 20 74 68 65 20 74 61 62 6c 65 20  t. If the table 
28510 69 64 65 6e 74 69 66 69 65 64 20 62 79 20 0a 2a  identified by .*
28520 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 65 6c  * FROM clause el
28530 65 6d 65 6e 74 20 70 49 74 65 6d 20 69 73 20 72  ement pItem is r
28540 65 61 6c 6c 79 20 61 20 63 6f 6d 6d 6f 6e 2d 74  eally a common-t
28550 61 62 6c 65 2d 65 78 70 72 65 73 73 69 6f 6e 20  able-expression 
28560 28 43 54 45 29 20 0a 2a 2a 20 74 68 65 6e 20 72  (CTE) .** then r
28570 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
28580 74 6f 20 74 68 65 20 43 54 45 20 64 65 66 69 6e  to the CTE defin
28590 69 74 69 6f 6e 20 66 6f 72 20 74 68 61 74 20 74  ition for that t
285a0 61 62 6c 65 2e 20 4f 74 68 65 72 77 69 73 65 0a  able. Otherwise.
285b0 2a 2a 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a  ** return NULL..
285c0 2a 2a 0a 2a 2a 20 49 66 20 61 20 6e 6f 6e 2d 4e  **.** If a non-N
285d0 55 4c 4c 20 76 61 6c 75 65 20 69 73 20 72 65 74  ULL value is ret
285e0 75 72 6e 65 64 2c 20 73 65 74 20 2a 70 70 43 6f  urned, set *ppCo
285f0 6e 74 65 78 74 20 74 6f 20 70 6f 69 6e 74 20 74  ntext to point t
28600 6f 20 74 68 65 20 57 69 74 68 0a 2a 2a 20 6f 62  o the With.** ob
28610 6a 65 63 74 20 74 68 61 74 20 74 68 65 20 72 65  ject that the re
28620 74 75 72 6e 65 64 20 43 54 45 20 62 65 6c 6f 6e  turned CTE belon
28630 67 73 20 74 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63  gs to..*/.static
28640 20 73 74 72 75 63 74 20 43 74 65 20 2a 73 65 61   struct Cte *sea
28650 72 63 68 57 69 74 68 28 0a 20 20 57 69 74 68 20  rchWith(.  With 
28660 2a 70 57 69 74 68 2c 20 20 20 20 20 20 20 20 20  *pWith,         
28670 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75             /* Cu
28680 72 72 65 6e 74 20 69 6e 6e 65 72 6d 6f 73 74 20  rrent innermost 
28690 57 49 54 48 20 63 6c 61 75 73 65 20 2a 2f 0a 20  WITH clause */. 
286a0 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
286b0 69 74 65 6d 20 2a 70 49 74 65 6d 2c 20 20 20 20  item *pItem,    
286c0 20 2f 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65 20   /* FROM clause 
286d0 65 6c 65 6d 65 6e 74 20 74 6f 20 72 65 73 6f 6c  element to resol
286e0 76 65 20 2a 2f 0a 20 20 57 69 74 68 20 2a 2a 70  ve */.  With **p
286f0 70 43 6f 6e 74 65 78 74 20 20 20 20 20 20 20 20  pContext        
28700 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
28710 57 49 54 48 20 63 6c 61 75 73 65 20 72 65 74 75  WITH clause retu
28720 72 6e 20 76 61 6c 75 65 20 62 65 6c 6f 6e 67 73  rn value belongs
28730 20 74 6f 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73   to */.){.  cons
28740 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20  t char *zName;. 
28750 20 69 66 28 20 70 49 74 65 6d 2d 3e 7a 44 61 74   if( pItem->zDat
28760 61 62 61 73 65 3d 3d 30 20 26 26 20 28 7a 4e 61  abase==0 && (zNa
28770 6d 65 20 3d 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d  me = pItem->zNam
28780 65 29 21 3d 30 20 29 7b 0a 20 20 20 20 57 69 74  e)!=0 ){.    Wit
28790 68 20 2a 70 3b 0a 20 20 20 20 66 6f 72 28 70 3d  h *p;.    for(p=
287a0 70 57 69 74 68 3b 20 70 3b 20 70 3d 70 2d 3e 70  pWith; p; p=p->p
287b0 4f 75 74 65 72 29 7b 0a 20 20 20 20 20 20 69 6e  Outer){.      in
287c0 74 20 69 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  t i;.      for(i
287d0 3d 30 3b 20 69 3c 70 2d 3e 6e 43 74 65 3b 20 69  =0; i<p->nCte; i
287e0 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ++){.        if(
287f0 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
28800 7a 4e 61 6d 65 2c 20 70 2d 3e 61 5b 69 5d 2e 7a  zName, p->a[i].z
28810 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20  Name)==0 ){.    
28820 20 20 20 20 20 20 2a 70 70 43 6f 6e 74 65 78 74        *ppContext
28830 20 3d 20 70 3b 0a 20 20 20 20 20 20 20 20 20 20   = p;.          
28840 72 65 74 75 72 6e 20 26 70 2d 3e 61 5b 69 5d 3b  return &p->a[i];
28850 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
28860 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72   }.    }.  }.  r
28870 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 20 54  eturn 0;.}../* T
28880 68 65 20 63 6f 64 65 20 67 65 6e 65 72 61 74 6f  he code generato
28890 72 20 6d 61 69 6e 74 61 69 6e 73 20 61 20 73 74  r maintains a st
288a0 61 63 6b 20 6f 66 20 61 63 74 69 76 65 20 57 49  ack of active WI
288b0 54 48 20 63 6c 61 75 73 65 73 0a 2a 2a 20 77 69  TH clauses.** wi
288c0 74 68 20 74 68 65 20 69 6e 6e 65 72 2d 6d 6f 73  th the inner-mos
288d0 74 20 57 49 54 48 20 63 6c 61 75 73 65 20 62 65  t WITH clause be
288e0 69 6e 67 20 61 74 20 74 68 65 20 74 6f 70 20 6f  ing at the top o
288f0 66 20 74 68 65 20 73 74 61 63 6b 2e 0a 2a 2a 0a  f the stack..**.
28900 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
28910 70 75 73 68 65 73 20 74 68 65 20 57 49 54 48 20  pushes the WITH 
28920 63 6c 61 75 73 65 20 70 61 73 73 65 64 20 61 73  clause passed as
28930 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
28940 6d 65 6e 74 0a 2a 2a 20 6f 6e 74 6f 20 74 68 65  ment.** onto the
28950 20 74 6f 70 20 6f 66 20 74 68 65 20 73 74 61 63   top of the stac
28960 6b 2e 20 49 66 20 61 72 67 75 6d 65 6e 74 20 62  k. If argument b
28970 46 72 65 65 20 69 73 20 74 72 75 65 2c 20 74 68  Free is true, th
28980 65 6e 20 74 68 69 73 0a 2a 2a 20 57 49 54 48 20  en this.** WITH 
28990 63 6c 61 75 73 65 20 77 69 6c 6c 20 6e 65 76 65  clause will neve
289a0 72 20 62 65 20 70 6f 70 70 65 64 20 66 72 6f 6d  r be popped from
289b0 20 74 68 65 20 73 74 61 63 6b 2e 20 49 6e 20 74   the stack. In t
289c0 68 69 73 20 63 61 73 65 20 69 74 0a 2a 2a 20 73  his case it.** s
289d0 68 6f 75 6c 64 20 62 65 20 66 72 65 65 64 20 61  hould be freed a
289e0 6c 6f 6e 67 20 77 69 74 68 20 74 68 65 20 50 61  long with the Pa
289f0 72 73 65 20 6f 62 6a 65 63 74 2e 20 49 6e 20 6f  rse object. In o
28a00 74 68 65 72 20 63 61 73 65 73 2c 20 77 68 65 6e  ther cases, when
28a10 0a 2a 2a 20 62 46 72 65 65 3d 3d 30 2c 20 74 68  .** bFree==0, th
28a20 65 20 57 69 74 68 20 6f 62 6a 65 63 74 20 77 69  e With object wi
28a30 6c 6c 20 62 65 20 66 72 65 65 64 20 61 6c 6f 6e  ll be freed alon
28a40 67 20 77 69 74 68 20 74 68 65 20 53 45 4c 45 43  g with the SELEC
28a50 54 20 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20  T .** statement 
28a60 77 69 74 68 20 77 68 69 63 68 20 69 74 20 69 73  with which it is
28a70 20 61 73 73 6f 63 69 61 74 65 64 2e 0a 2a 2f 0a   associated..*/.
28a80 76 6f 69 64 20 73 71 6c 69 74 65 33 57 69 74 68  void sqlite3With
28a90 50 75 73 68 28 50 61 72 73 65 20 2a 70 50 61 72  Push(Parse *pPar
28aa0 73 65 2c 20 57 69 74 68 20 2a 70 57 69 74 68 2c  se, With *pWith,
28ab0 20 75 38 20 62 46 72 65 65 29 7b 0a 20 20 61 73   u8 bFree){.  as
28ac0 73 65 72 74 28 20 62 46 72 65 65 3d 3d 30 20 7c  sert( bFree==0 |
28ad0 7c 20 28 70 50 61 72 73 65 2d 3e 70 57 69 74 68  | (pParse->pWith
28ae0 3d 3d 30 20 26 26 20 70 50 61 72 73 65 2d 3e 70  ==0 && pParse->p
28af0 57 69 74 68 54 6f 46 72 65 65 3d 3d 30 29 20 29  WithToFree==0) )
28b00 3b 0a 20 20 69 66 28 20 70 57 69 74 68 20 29 7b  ;.  if( pWith ){
28b10 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
28b20 72 73 65 2d 3e 70 57 69 74 68 21 3d 70 57 69 74  rse->pWith!=pWit
28b30 68 20 29 3b 0a 20 20 20 20 70 57 69 74 68 2d 3e  h );.    pWith->
28b40 70 4f 75 74 65 72 20 3d 20 70 50 61 72 73 65 2d  pOuter = pParse-
28b50 3e 70 57 69 74 68 3b 0a 20 20 20 20 70 50 61 72  >pWith;.    pPar
28b60 73 65 2d 3e 70 57 69 74 68 20 3d 20 70 57 69 74  se->pWith = pWit
28b70 68 3b 0a 20 20 20 20 69 66 28 20 62 46 72 65 65  h;.    if( bFree
28b80 20 29 20 70 50 61 72 73 65 2d 3e 70 57 69 74 68   ) pParse->pWith
28b90 54 6f 46 72 65 65 20 3d 20 70 57 69 74 68 3b 0a  ToFree = pWith;.
28ba0 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69    }.}../*.** Thi
28bb0 73 20 66 75 6e 63 74 69 6f 6e 20 63 68 65 63 6b  s function check
28bc0 73 20 69 66 20 61 72 67 75 6d 65 6e 74 20 70 46  s if argument pF
28bd0 72 6f 6d 20 72 65 66 65 72 73 20 74 6f 20 61 20  rom refers to a 
28be0 43 54 45 20 64 65 63 6c 61 72 65 64 20 62 79 20  CTE declared by 
28bf0 0a 2a 2a 20 61 20 57 49 54 48 20 63 6c 61 75 73  .** a WITH claus
28c00 65 20 6f 6e 20 74 68 65 20 73 74 61 63 6b 20 63  e on the stack c
28c10 75 72 72 65 6e 74 6c 79 20 6d 61 69 6e 74 61 69  urrently maintai
28c20 6e 65 64 20 62 79 20 74 68 65 20 70 61 72 73 65  ned by the parse
28c30 72 2e 20 41 6e 64 2c 0a 2a 2a 20 69 66 20 63 75  r. And,.** if cu
28c40 72 72 65 6e 74 6c 79 20 70 72 6f 63 65 73 73 69  rrently processi
28c50 6e 67 20 61 20 43 54 45 20 65 78 70 72 65 73 73  ng a CTE express
28c60 69 6f 6e 2c 20 69 66 20 69 74 20 69 73 20 61 20  ion, if it is a 
28c70 72 65 63 75 72 73 69 76 65 0a 2a 2a 20 72 65 66  recursive.** ref
28c80 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20 63 75  erence to the cu
28c90 72 72 65 6e 74 20 43 54 45 2e 0a 2a 2a 0a 2a 2a  rrent CTE..**.**
28ca0 20 49 66 20 70 46 72 6f 6d 20 66 61 6c 6c 73 20   If pFrom falls 
28cb0 69 6e 74 6f 20 65 69 74 68 65 72 20 6f 66 20 74  into either of t
28cc0 68 65 20 74 77 6f 20 63 61 74 65 67 6f 72 69 65  he two categorie
28cd0 73 20 61 62 6f 76 65 2c 20 70 46 72 6f 6d 2d 3e  s above, pFrom->
28ce0 70 54 61 62 0a 2a 2a 20 61 6e 64 20 6f 74 68 65  pTab.** and othe
28cf0 72 20 66 69 65 6c 64 73 20 61 72 65 20 70 6f 70  r fields are pop
28d00 75 6c 61 74 65 64 20 61 63 63 6f 72 64 69 6e 67  ulated according
28d10 6c 79 2e 20 54 68 65 20 63 61 6c 6c 65 72 20 73  ly. The caller s
28d20 68 6f 75 6c 64 20 63 68 65 63 6b 0a 2a 2a 20 28  hould check.** (
28d30 70 46 72 6f 6d 2d 3e 70 54 61 62 21 3d 30 29 20  pFrom->pTab!=0) 
28d40 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 77 68 65  to determine whe
28d50 74 68 65 72 20 6f 72 20 6e 6f 74 20 61 20 73 75  ther or not a su
28d60 63 63 65 73 73 66 75 6c 20 6d 61 74 63 68 0a 2a  ccessful match.*
28d70 2a 20 77 61 73 20 66 6f 75 6e 64 2e 0a 2a 2a 0a  * was found..**.
28d80 2a 2a 20 57 68 65 74 68 65 72 20 6f 72 20 6e 6f  ** Whether or no
28d90 74 20 61 20 6d 61 74 63 68 20 69 73 20 66 6f 75  t a match is fou
28da0 6e 64 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  nd, SQLITE_OK is
28db0 20 72 65 74 75 72 6e 65 64 20 69 66 20 6e 6f 20   returned if no 
28dc0 65 72 72 6f 72 0a 2a 2a 20 6f 63 63 75 72 73 2e  error.** occurs.
28dd0 20 49 66 20 61 6e 20 65 72 72 6f 72 20 64 6f 65   If an error doe
28de0 73 20 6f 63 63 75 72 2c 20 61 6e 20 65 72 72 6f  s occur, an erro
28df0 72 20 6d 65 73 73 61 67 65 20 69 73 20 73 74 6f  r message is sto
28e00 72 65 64 20 69 6e 20 74 68 65 0a 2a 2a 20 70 61  red in the.** pa
28e10 72 73 65 72 20 61 6e 64 20 73 6f 6d 65 20 65 72  rser and some er
28e20 72 6f 72 20 63 6f 64 65 20 6f 74 68 65 72 20 74  ror code other t
28e30 68 61 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65  han SQLITE_OK re
28e40 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  turned..*/.stati
28e50 63 20 69 6e 74 20 77 69 74 68 45 78 70 61 6e 64  c int withExpand
28e60 28 0a 20 20 57 61 6c 6b 65 72 20 2a 70 57 61 6c  (.  Walker *pWal
28e70 6b 65 72 2c 20 0a 20 20 73 74 72 75 63 74 20 53  ker, .  struct S
28e80 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 46 72  rcList_item *pFr
28e90 6f 6d 0a 29 7b 0a 20 20 50 61 72 73 65 20 2a 70  om.){.  Parse *p
28ea0 50 61 72 73 65 20 3d 20 70 57 61 6c 6b 65 72 2d  Parse = pWalker-
28eb0 3e 70 50 61 72 73 65 3b 0a 20 20 73 71 6c 69 74  >pParse;.  sqlit
28ec0 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
28ed0 3e 64 62 3b 0a 20 20 73 74 72 75 63 74 20 43 74  >db;.  struct Ct
28ee0 65 20 2a 70 43 74 65 3b 20 20 20 20 20 20 20 20  e *pCte;        
28ef0 20 20 20 20 20 20 20 2f 2a 20 4d 61 74 63 68 65         /* Matche
28f00 64 20 43 54 45 20 28 6f 72 20 4e 55 4c 4c 20 69  d CTE (or NULL i
28f10 66 20 6e 6f 20 6d 61 74 63 68 29 20 2a 2f 0a 20  f no match) */. 
28f20 20 57 69 74 68 20 2a 70 57 69 74 68 3b 20 20 20   With *pWith;   
28f30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28f40 20 2f 2a 20 57 49 54 48 20 63 6c 61 75 73 65 20   /* WITH clause 
28f50 74 68 61 74 20 70 43 74 65 20 62 65 6c 6f 6e 67  that pCte belong
28f60 73 20 74 6f 20 2a 2f 0a 0a 20 20 61 73 73 65 72  s to */..  asser
28f70 74 28 20 70 46 72 6f 6d 2d 3e 70 54 61 62 3d 3d  t( pFrom->pTab==
28f80 30 20 29 3b 0a 0a 20 20 70 43 74 65 20 3d 20 73  0 );..  pCte = s
28f90 65 61 72 63 68 57 69 74 68 28 70 50 61 72 73 65  earchWith(pParse
28fa0 2d 3e 70 57 69 74 68 2c 20 70 46 72 6f 6d 2c 20  ->pWith, pFrom, 
28fb0 26 70 57 69 74 68 29 3b 0a 20 20 69 66 28 20 70  &pWith);.  if( p
28fc0 43 74 65 20 29 7b 0a 20 20 20 20 54 61 62 6c 65  Cte ){.    Table
28fd0 20 2a 70 54 61 62 3b 0a 20 20 20 20 45 78 70 72   *pTab;.    Expr
28fe0 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 0a 20 20  List *pEList;.  
28ff0 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 3b 0a    Select *pSel;.
29000 20 20 20 20 53 65 6c 65 63 74 20 2a 70 4c 65 66      Select *pLef
29010 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
29020 20 20 2f 2a 20 4c 65 66 74 2d 6d 6f 73 74 20 53    /* Left-most S
29030 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
29040 2a 2f 0a 20 20 20 20 69 6e 74 20 62 4d 61 79 52  */.    int bMayR
29050 65 63 75 72 73 69 76 65 3b 20 20 20 20 20 20 20  ecursive;       
29060 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
29070 63 6f 6d 70 6f 75 6e 64 20 6a 6f 69 6e 65 64 20  compound joined 
29080 62 79 20 55 4e 49 4f 4e 20 5b 41 4c 4c 5d 20 2a  by UNION [ALL] *
29090 2f 0a 20 20 20 20 57 69 74 68 20 2a 70 53 61 76  /.    With *pSav
290a0 65 64 57 69 74 68 3b 20 20 20 20 20 20 20 20 20  edWith;         
290b0 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 20 76      /* Initial v
290c0 61 6c 75 65 20 6f 66 20 70 50 61 72 73 65 2d 3e  alue of pParse->
290d0 70 57 69 74 68 20 2a 2f 0a 0a 20 20 20 20 2f 2a  pWith */..    /*
290e0 20 49 66 20 70 43 74 65 2d 3e 7a 43 74 65 45 72   If pCte->zCteEr
290f0 72 20 69 73 20 6e 6f 6e 2d 4e 55 4c 4c 20 61 74  r is non-NULL at
29100 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 74 68 65   this point, the
29110 6e 20 74 68 69 73 20 69 73 20 61 6e 20 69 6c 6c  n this is an ill
29120 65 67 61 6c 0a 20 20 20 20 2a 2a 20 72 65 63 75  egal.    ** recu
29130 72 73 69 76 65 20 72 65 66 65 72 65 6e 63 65 20  rsive reference 
29140 74 6f 20 43 54 45 20 70 43 74 65 2e 20 4c 65 61  to CTE pCte. Lea
29150 76 65 20 61 6e 20 65 72 72 6f 72 20 69 6e 20 70  ve an error in p
29160 50 61 72 73 65 20 61 6e 64 20 72 65 74 75 72 6e  Parse and return
29170 0a 20 20 20 20 2a 2a 20 65 61 72 6c 79 2e 20 49  .    ** early. I
29180 66 20 70 43 74 65 2d 3e 7a 43 74 65 45 72 72 20  f pCte->zCteErr 
29190 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 74 68  is NULL, then th
291a0 69 73 20 69 73 20 6e 6f 74 20 61 20 72 65 63 75  is is not a recu
291b0 72 73 69 76 65 20 72 65 66 65 72 65 6e 63 65 2e  rsive reference.
291c0 0a 20 20 20 20 2a 2a 20 49 6e 20 74 68 69 73 20  .    ** In this 
291d0 63 61 73 65 2c 20 70 72 6f 63 65 65 64 2e 20 20  case, proceed.  
291e0 2a 2f 0a 20 20 20 20 69 66 28 20 70 43 74 65 2d  */.    if( pCte-
291f0 3e 7a 43 74 65 45 72 72 20 29 7b 0a 20 20 20 20  >zCteErr ){.    
29200 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
29210 67 28 70 50 61 72 73 65 2c 20 70 43 74 65 2d 3e  g(pParse, pCte->
29220 7a 43 74 65 45 72 72 2c 20 70 43 74 65 2d 3e 7a  zCteErr, pCte->z
29230 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 72 65 74  Name);.      ret
29240 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  urn SQLITE_ERROR
29250 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
29260 63 61 6e 6e 6f 74 42 65 46 75 6e 63 74 69 6f 6e  cannotBeFunction
29270 28 70 50 61 72 73 65 2c 20 70 46 72 6f 6d 29 20  (pParse, pFrom) 
29280 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
29290 45 52 52 4f 52 3b 0a 0a 20 20 20 20 61 73 73 65  ERROR;..    asse
292a0 72 74 28 20 70 46 72 6f 6d 2d 3e 70 54 61 62 3d  rt( pFrom->pTab=
292b0 3d 30 20 29 3b 0a 20 20 20 20 70 46 72 6f 6d 2d  =0 );.    pFrom-
292c0 3e 70 54 61 62 20 3d 20 70 54 61 62 20 3d 20 73  >pTab = pTab = s
292d0 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65  qlite3DbMallocZe
292e0 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 54 61  ro(db, sizeof(Ta
292f0 62 6c 65 29 29 3b 0a 20 20 20 20 69 66 28 20 70  ble));.    if( p
29300 54 61 62 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  Tab==0 ) return 
29310 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 70  WRC_Abort;.    p
29320 54 61 62 2d 3e 6e 54 61 62 52 65 66 20 3d 20 31  Tab->nTabRef = 1
29330 3b 0a 20 20 20 20 70 54 61 62 2d 3e 7a 4e 61 6d  ;.    pTab->zNam
29340 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72  e = sqlite3DbStr
29350 44 75 70 28 64 62 2c 20 70 43 74 65 2d 3e 7a 4e  Dup(db, pCte->zN
29360 61 6d 65 29 3b 0a 20 20 20 20 70 54 61 62 2d 3e  ame);.    pTab->
29370 69 50 4b 65 79 20 3d 20 2d 31 3b 0a 20 20 20 20  iPKey = -1;.    
29380 70 54 61 62 2d 3e 6e 52 6f 77 4c 6f 67 45 73 74  pTab->nRowLogEst
29390 20 3d 20 32 30 30 3b 20 61 73 73 65 72 74 28 20   = 200; assert( 
293a0 32 30 30 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45  200==sqlite3LogE
293b0 73 74 28 31 30 34 38 35 37 36 29 20 29 3b 0a 20  st(1048576) );. 
293c0 20 20 20 70 54 61 62 2d 3e 74 61 62 46 6c 61 67     pTab->tabFlag
293d0 73 20 7c 3d 20 54 46 5f 45 70 68 65 6d 65 72 61  s |= TF_Ephemera
293e0 6c 20 7c 20 54 46 5f 4e 6f 56 69 73 69 62 6c 65  l | TF_NoVisible
293f0 52 6f 77 69 64 3b 0a 20 20 20 20 70 46 72 6f 6d  Rowid;.    pFrom
29400 2d 3e 70 53 65 6c 65 63 74 20 3d 20 73 71 6c 69  ->pSelect = sqli
29410 74 65 33 53 65 6c 65 63 74 44 75 70 28 64 62 2c  te3SelectDup(db,
29420 20 70 43 74 65 2d 3e 70 53 65 6c 65 63 74 2c 20   pCte->pSelect, 
29430 30 29 3b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e  0);.    if( db->
29440 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72  mallocFailed ) r
29450 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
29460 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 61 73 73  EM_BKPT;.    ass
29470 65 72 74 28 20 70 46 72 6f 6d 2d 3e 70 53 65 6c  ert( pFrom->pSel
29480 65 63 74 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 43  ect );..    /* C
29490 68 65 63 6b 20 69 66 20 74 68 69 73 20 69 73 20  heck if this is 
294a0 61 20 72 65 63 75 72 73 69 76 65 20 43 54 45 2e  a recursive CTE.
294b0 20 2a 2f 0a 20 20 20 20 70 53 65 6c 20 3d 20 70   */.    pSel = p
294c0 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a 20  From->pSelect;. 
294d0 20 20 20 62 4d 61 79 52 65 63 75 72 73 69 76 65     bMayRecursive
294e0 20 3d 20 28 20 70 53 65 6c 2d 3e 6f 70 3d 3d 54   = ( pSel->op==T
294f0 4b 5f 41 4c 4c 20 7c 7c 20 70 53 65 6c 2d 3e 6f  K_ALL || pSel->o
29500 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29 3b 0a 20  p==TK_UNION );. 
29510 20 20 20 69 66 28 20 62 4d 61 79 52 65 63 75 72     if( bMayRecur
29520 73 69 76 65 20 29 7b 0a 20 20 20 20 20 20 69 6e  sive ){.      in
29530 74 20 69 3b 0a 20 20 20 20 20 20 53 72 63 4c 69  t i;.      SrcLi
29540 73 74 20 2a 70 53 72 63 20 3d 20 70 46 72 6f 6d  st *pSrc = pFrom
29550 2d 3e 70 53 65 6c 65 63 74 2d 3e 70 53 72 63 3b  ->pSelect->pSrc;
29560 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
29570 69 3c 70 53 72 63 2d 3e 6e 53 72 63 3b 20 69 2b  i<pSrc->nSrc; i+
29580 2b 29 7b 0a 20 20 20 20 20 20 20 20 73 74 72 75  +){.        stru
29590 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
295a0 2a 70 49 74 65 6d 20 3d 20 26 70 53 72 63 2d 3e  *pItem = &pSrc->
295b0 61 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 69 66  a[i];.        if
295c0 28 20 70 49 74 65 6d 2d 3e 7a 44 61 74 61 62 61  ( pItem->zDataba
295d0 73 65 3d 3d 30 20 0a 20 20 20 20 20 20 20 20 20  se==0 .         
295e0 26 26 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 21  && pItem->zName!
295f0 3d 30 20 0a 20 20 20 20 20 20 20 20 20 26 26 20  =0 .         && 
29600 30 3d 3d 73 71 6c 69 74 65 33 53 74 72 49 43 6d  0==sqlite3StrICm
29610 70 28 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 2c 20  p(pItem->zName, 
29620 70 43 74 65 2d 3e 7a 4e 61 6d 65 29 0a 20 20 20  pCte->zName).   
29630 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20         ){.      
29640 20 20 20 20 70 49 74 65 6d 2d 3e 70 54 61 62 20      pItem->pTab 
29650 3d 20 70 54 61 62 3b 0a 20 20 20 20 20 20 20 20  = pTab;.        
29660 20 20 70 49 74 65 6d 2d 3e 66 67 2e 69 73 52 65    pItem->fg.isRe
29670 63 75 72 73 69 76 65 20 3d 20 31 3b 0a 20 20 20  cursive = 1;.   
29680 20 20 20 20 20 20 20 70 54 61 62 2d 3e 6e 54 61         pTab->nTa
29690 62 52 65 66 2b 2b 3b 0a 20 20 20 20 20 20 20 20  bRef++;.        
296a0 20 20 70 53 65 6c 2d 3e 73 65 6c 46 6c 61 67 73    pSel->selFlags
296b0 20 7c 3d 20 53 46 5f 52 65 63 75 72 73 69 76 65   |= SF_Recursive
296c0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
296d0 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f    }.    }..    /
296e0 2a 20 4f 6e 6c 79 20 6f 6e 65 20 72 65 63 75 72  * Only one recur
296f0 73 69 76 65 20 72 65 66 65 72 65 6e 63 65 20 69  sive reference i
29700 73 20 70 65 72 6d 69 74 74 65 64 2e 20 2a 2f 20  s permitted. */ 
29710 0a 20 20 20 20 69 66 28 20 70 54 61 62 2d 3e 6e  .    if( pTab->n
29720 54 61 62 52 65 66 3e 32 20 29 7b 0a 20 20 20 20  TabRef>2 ){.    
29730 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
29740 67 28 0a 20 20 20 20 20 20 20 20 20 20 70 50 61  g(.          pPa
29750 72 73 65 2c 20 22 6d 75 6c 74 69 70 6c 65 20 72  rse, "multiple r
29760 65 66 65 72 65 6e 63 65 73 20 74 6f 20 72 65 63  eferences to rec
29770 75 72 73 69 76 65 20 74 61 62 6c 65 3a 20 25 73  ursive table: %s
29780 22 2c 20 70 43 74 65 2d 3e 7a 4e 61 6d 65 0a 20  ", pCte->zName. 
29790 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 72 65       );.      re
297a0 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
297b0 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73  R;.    }.    ass
297c0 65 72 74 28 20 70 54 61 62 2d 3e 6e 54 61 62 52  ert( pTab->nTabR
297d0 65 66 3d 3d 31 20 7c 7c 20 0a 20 20 20 20 20 20  ef==1 || .      
297e0 20 20 20 20 20 20 28 28 70 53 65 6c 2d 3e 73 65        ((pSel->se
297f0 6c 46 6c 61 67 73 26 53 46 5f 52 65 63 75 72 73  lFlags&SF_Recurs
29800 69 76 65 29 20 26 26 20 70 54 61 62 2d 3e 6e 54  ive) && pTab->nT
29810 61 62 52 65 66 3d 3d 32 20 29 29 3b 0a 0a 20 20  abRef==2 ));..  
29820 20 20 70 43 74 65 2d 3e 7a 43 74 65 45 72 72 20    pCte->zCteErr 
29830 3d 20 22 63 69 72 63 75 6c 61 72 20 72 65 66 65  = "circular refe
29840 72 65 6e 63 65 3a 20 25 73 22 3b 0a 20 20 20 20  rence: %s";.    
29850 70 53 61 76 65 64 57 69 74 68 20 3d 20 70 50 61  pSavedWith = pPa
29860 72 73 65 2d 3e 70 57 69 74 68 3b 0a 20 20 20 20  rse->pWith;.    
29870 70 50 61 72 73 65 2d 3e 70 57 69 74 68 20 3d 20  pParse->pWith = 
29880 70 57 69 74 68 3b 0a 20 20 20 20 69 66 28 20 62  pWith;.    if( b
29890 4d 61 79 52 65 63 75 72 73 69 76 65 20 29 7b 0a  MayRecursive ){.
298a0 20 20 20 20 20 20 53 65 6c 65 63 74 20 2a 70 50        Select *pP
298b0 72 69 6f 72 20 3d 20 70 53 65 6c 2d 3e 70 50 72  rior = pSel->pPr
298c0 69 6f 72 3b 0a 20 20 20 20 20 20 61 73 73 65 72  ior;.      asser
298d0 74 28 20 70 50 72 69 6f 72 2d 3e 70 57 69 74 68  t( pPrior->pWith
298e0 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 50 72  ==0 );.      pPr
298f0 69 6f 72 2d 3e 70 57 69 74 68 20 3d 20 70 53 65  ior->pWith = pSe
29900 6c 2d 3e 70 57 69 74 68 3b 0a 20 20 20 20 20 20  l->pWith;.      
29910 73 71 6c 69 74 65 33 57 61 6c 6b 53 65 6c 65 63  sqlite3WalkSelec
29920 74 28 70 57 61 6c 6b 65 72 2c 20 70 50 72 69 6f  t(pWalker, pPrio
29930 72 29 3b 0a 20 20 20 20 20 20 70 50 72 69 6f 72  r);.      pPrior
29940 2d 3e 70 57 69 74 68 20 3d 20 30 3b 0a 20 20 20  ->pWith = 0;.   
29950 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71   }else{.      sq
29960 6c 69 74 65 33 57 61 6c 6b 53 65 6c 65 63 74 28  lite3WalkSelect(
29970 70 57 61 6c 6b 65 72 2c 20 70 53 65 6c 29 3b 0a  pWalker, pSel);.
29980 20 20 20 20 7d 0a 20 20 20 20 70 50 61 72 73 65      }.    pParse
29990 2d 3e 70 57 69 74 68 20 3d 20 70 57 69 74 68 3b  ->pWith = pWith;
299a0 0a 0a 20 20 20 20 66 6f 72 28 70 4c 65 66 74 3d  ..    for(pLeft=
299b0 70 53 65 6c 3b 20 70 4c 65 66 74 2d 3e 70 50 72  pSel; pLeft->pPr
299c0 69 6f 72 3b 20 70 4c 65 66 74 3d 70 4c 65 66 74  ior; pLeft=pLeft
299d0 2d 3e 70 50 72 69 6f 72 29 3b 0a 20 20 20 20 70  ->pPrior);.    p
299e0 45 4c 69 73 74 20 3d 20 70 4c 65 66 74 2d 3e 70  EList = pLeft->p
299f0 45 4c 69 73 74 3b 0a 20 20 20 20 69 66 28 20 70  EList;.    if( p
29a00 43 74 65 2d 3e 70 43 6f 6c 73 20 29 7b 0a 20 20  Cte->pCols ){.  
29a10 20 20 20 20 69 66 28 20 70 45 4c 69 73 74 20 26      if( pEList &
29a20 26 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 21  & pEList->nExpr!
29a30 3d 70 43 74 65 2d 3e 70 43 6f 6c 73 2d 3e 6e 45  =pCte->pCols->nE
29a40 78 70 72 20 29 7b 0a 20 20 20 20 20 20 20 20 73  xpr ){.        s
29a50 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
29a60 50 61 72 73 65 2c 20 22 74 61 62 6c 65 20 25 73  Parse, "table %s
29a70 20 68 61 73 20 25 64 20 76 61 6c 75 65 73 20 66   has %d values f
29a80 6f 72 20 25 64 20 63 6f 6c 75 6d 6e 73 22 2c 0a  or %d columns",.
29a90 20 20 20 20 20 20 20 20 20 20 20 20 70 43 74 65              pCte
29aa0 2d 3e 7a 4e 61 6d 65 2c 20 70 45 4c 69 73 74 2d  ->zName, pEList-
29ab0 3e 6e 45 78 70 72 2c 20 70 43 74 65 2d 3e 70 43  >nExpr, pCte->pC
29ac0 6f 6c 73 2d 3e 6e 45 78 70 72 0a 20 20 20 20 20  ols->nExpr.     
29ad0 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 70 50     );.        pP
29ae0 61 72 73 65 2d 3e 70 57 69 74 68 20 3d 20 70 53  arse->pWith = pS
29af0 61 76 65 64 57 69 74 68 3b 0a 20 20 20 20 20 20  avedWith;.      
29b00 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
29b10 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20  ERROR;.      }. 
29b20 20 20 20 20 20 70 45 4c 69 73 74 20 3d 20 70 43       pEList = pC
29b30 74 65 2d 3e 70 43 6f 6c 73 3b 0a 20 20 20 20 7d  te->pCols;.    }
29b40 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 43 6f 6c  ..    sqlite3Col
29b50 75 6d 6e 73 46 72 6f 6d 45 78 70 72 4c 69 73 74  umnsFromExprList
29b60 28 70 50 61 72 73 65 2c 20 70 45 4c 69 73 74 2c  (pParse, pEList,
29b70 20 26 70 54 61 62 2d 3e 6e 43 6f 6c 2c 20 26 70   &pTab->nCol, &p
29b80 54 61 62 2d 3e 61 43 6f 6c 29 3b 0a 20 20 20 20  Tab->aCol);.    
29b90 69 66 28 20 62 4d 61 79 52 65 63 75 72 73 69 76  if( bMayRecursiv
29ba0 65 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  e ){.      if( p
29bb0 53 65 6c 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20  Sel->selFlags & 
29bc0 53 46 5f 52 65 63 75 72 73 69 76 65 20 29 7b 0a  SF_Recursive ){.
29bd0 20 20 20 20 20 20 20 20 70 43 74 65 2d 3e 7a 43          pCte->zC
29be0 74 65 45 72 72 20 3d 20 22 6d 75 6c 74 69 70 6c  teErr = "multipl
29bf0 65 20 72 65 63 75 72 73 69 76 65 20 72 65 66 65  e recursive refe
29c00 72 65 6e 63 65 73 3a 20 25 73 22 3b 0a 20 20 20  rences: %s";.   
29c10 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
29c20 20 20 70 43 74 65 2d 3e 7a 43 74 65 45 72 72 20    pCte->zCteErr 
29c30 3d 20 22 72 65 63 75 72 73 69 76 65 20 72 65 66  = "recursive ref
29c40 65 72 65 6e 63 65 20 69 6e 20 61 20 73 75 62 71  erence in a subq
29c50 75 65 72 79 3a 20 25 73 22 3b 0a 20 20 20 20 20  uery: %s";.     
29c60 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
29c70 57 61 6c 6b 53 65 6c 65 63 74 28 70 57 61 6c 6b  WalkSelect(pWalk
29c80 65 72 2c 20 70 53 65 6c 29 3b 0a 20 20 20 20 7d  er, pSel);.    }
29c90 0a 20 20 20 20 70 43 74 65 2d 3e 7a 43 74 65 45  .    pCte->zCteE
29ca0 72 72 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 72  rr = 0;.    pPar
29cb0 73 65 2d 3e 70 57 69 74 68 20 3d 20 70 53 61 76  se->pWith = pSav
29cc0 65 64 57 69 74 68 3b 0a 20 20 7d 0a 0a 20 20 72  edWith;.  }..  r
29cd0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
29ce0 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64  .}.#endif..#ifnd
29cf0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43  ef SQLITE_OMIT_C
29d00 54 45 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20  TE./*.** If the 
29d10 53 45 4c 45 43 54 20 70 61 73 73 65 64 20 61 73  SELECT passed as
29d20 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
29d30 6d 65 6e 74 20 68 61 73 20 61 6e 20 61 73 73 6f  ment has an asso
29d40 63 69 61 74 65 64 20 57 49 54 48 20 0a 2a 2a 20  ciated WITH .** 
29d50 63 6c 61 75 73 65 2c 20 70 6f 70 20 69 74 20 66  clause, pop it f
29d60 72 6f 6d 20 74 68 65 20 73 74 61 63 6b 20 73 74  rom the stack st
29d70 6f 72 65 64 20 61 73 20 70 61 72 74 20 6f 66 20  ored as part of 
29d80 74 68 65 20 50 61 72 73 65 20 6f 62 6a 65 63 74  the Parse object
29d90 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ..**.** This fun
29da0 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20 61 73  ction is used as
29db0 20 74 68 65 20 78 53 65 6c 65 63 74 43 61 6c 6c   the xSelectCall
29dc0 62 61 63 6b 32 28 29 20 63 61 6c 6c 62 61 63 6b  back2() callback
29dd0 20 62 79 0a 2a 2a 20 73 71 6c 69 74 65 33 53 65   by.** sqlite3Se
29de0 6c 65 63 74 45 78 70 61 6e 64 28 29 20 77 68 65  lectExpand() whe
29df0 6e 20 77 61 6c 6b 69 6e 67 20 61 20 53 45 4c 45  n walking a SELE
29e00 43 54 20 74 72 65 65 20 74 6f 20 72 65 73 6f 6c  CT tree to resol
29e10 76 65 20 74 61 62 6c 65 0a 2a 2a 20 6e 61 6d 65  ve table.** name
29e20 73 20 61 6e 64 20 6f 74 68 65 72 20 46 52 4f 4d  s and other FROM
29e30 20 63 6c 61 75 73 65 20 65 6c 65 6d 65 6e 74 73   clause elements
29e40 2e 20 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  . .*/.static voi
29e50 64 20 73 65 6c 65 63 74 50 6f 70 57 69 74 68 28  d selectPopWith(
29e60 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c  Walker *pWalker,
29e70 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 50   Select *p){.  P
29e80 61 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20 70  arse *pParse = p
29e90 57 61 6c 6b 65 72 2d 3e 70 50 61 72 73 65 3b 0a  Walker->pParse;.
29ea0 20 20 69 66 28 20 4f 4b 5f 49 46 5f 41 4c 57 41    if( OK_IF_ALWA
29eb0 59 53 5f 54 52 55 45 28 70 50 61 72 73 65 2d 3e  YS_TRUE(pParse->
29ec0 70 57 69 74 68 29 20 26 26 20 70 2d 3e 70 50 72  pWith) && p->pPr
29ed0 69 6f 72 3d 3d 30 20 29 7b 0a 20 20 20 20 57 69  ior==0 ){.    Wi
29ee0 74 68 20 2a 70 57 69 74 68 20 3d 20 66 69 6e 64  th *pWith = find
29ef0 52 69 67 68 74 6d 6f 73 74 28 70 29 2d 3e 70 57  Rightmost(p)->pW
29f00 69 74 68 3b 0a 20 20 20 20 69 66 28 20 70 57 69  ith;.    if( pWi
29f10 74 68 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 61  th!=0 ){.      a
29f20 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 70  ssert( pParse->p
29f30 57 69 74 68 3d 3d 70 57 69 74 68 20 29 3b 0a 20  With==pWith );. 
29f40 20 20 20 20 20 70 50 61 72 73 65 2d 3e 70 57 69       pParse->pWi
29f50 74 68 20 3d 20 70 57 69 74 68 2d 3e 70 4f 75 74  th = pWith->pOut
29f60 65 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  er;.    }.  }.}.
29f70 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 73 65  #else.#define se
29f80 6c 65 63 74 50 6f 70 57 69 74 68 20 30 0a 23 65  lectPopWith 0.#e
29f90 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  ndif../*.** The 
29fa0 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 73 74 72  SrcList_item str
29fb0 75 63 74 75 72 65 20 70 61 73 73 65 64 20 61 73  ucture passed as
29fc0 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
29fd0 6d 65 6e 74 20 72 65 70 72 65 73 65 6e 74 73 20  ment represents 
29fe0 61 0a 2a 2a 20 73 75 62 2d 71 75 65 72 79 20 69  a.** sub-query i
29ff0 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  n the FROM claus
2a000 65 20 6f 66 20 61 20 53 45 4c 45 43 54 20 73 74  e of a SELECT st
2a010 61 74 65 6d 65 6e 74 2e 20 54 68 69 73 20 66 75  atement. This fu
2a020 6e 63 74 69 6f 6e 0a 2a 2a 20 61 6c 6c 6f 63 61  nction.** alloca
2a030 74 65 73 20 61 6e 64 20 70 6f 70 75 6c 61 74 65  tes and populate
2a040 73 20 74 68 65 20 53 72 63 4c 69 73 74 5f 69 74  s the SrcList_it
2a050 65 6d 2e 70 54 61 62 20 6f 62 6a 65 63 74 2e 20  em.pTab object. 
2a060 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 0a 2a  If successful,.*
2a070 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  * SQLITE_OK is r
2a080 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69  eturned. Otherwi
2a090 73 65 2c 20 69 66 20 61 6e 20 4f 4f 4d 20 65 72  se, if an OOM er
2a0a0 72 6f 72 20 69 73 20 65 6e 63 6f 75 6e 74 65 72  ror is encounter
2a0b0 65 64 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 4e 4f  ed,.** SQLITE_NO
2a0c0 4d 45 4d 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  MEM..*/.int sqli
2a0d0 74 65 33 45 78 70 61 6e 64 53 75 62 71 75 65 72  te3ExpandSubquer
2a0e0 79 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  y(Parse *pParse,
2a0f0 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
2a100 69 74 65 6d 20 2a 70 46 72 6f 6d 29 7b 0a 20 20  item *pFrom){.  
2a110 53 65 6c 65 63 74 20 2a 70 53 65 6c 20 3d 20 70  Select *pSel = p
2a120 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a 20  From->pSelect;. 
2a130 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 0a 20   Table *pTab;.. 
2a140 20 61 73 73 65 72 74 28 20 70 53 65 6c 20 29 3b   assert( pSel );
2a150 0a 20 20 70 46 72 6f 6d 2d 3e 70 54 61 62 20 3d  .  pFrom->pTab =
2a160 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33 44   pTab = sqlite3D
2a170 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 70 50 61 72  bMallocZero(pPar
2a180 73 65 2d 3e 64 62 2c 20 73 69 7a 65 6f 66 28 54  se->db, sizeof(T
2a190 61 62 6c 65 29 29 3b 0a 20 20 69 66 28 20 70 54  able));.  if( pT
2a1a0 61 62 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53  ab==0 ) return S
2a1b0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 70  QLITE_NOMEM;.  p
2a1c0 54 61 62 2d 3e 6e 54 61 62 52 65 66 20 3d 20 31  Tab->nTabRef = 1
2a1d0 3b 0a 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e 7a  ;.  if( pFrom->z
2a1e0 41 6c 69 61 73 20 29 7b 0a 20 20 20 20 70 54 61  Alias ){.    pTa
2a1f0 62 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74  b->zName = sqlit
2a200 65 33 44 62 53 74 72 44 75 70 28 70 50 61 72 73  e3DbStrDup(pPars
2a210 65 2d 3e 64 62 2c 20 70 46 72 6f 6d 2d 3e 7a 41  e->db, pFrom->zA
2a220 6c 69 61 73 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  lias);.  }else{.
2a230 20 20 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 20      pTab->zName 
2a240 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66  = sqlite3MPrintf
2a250 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 22 73 75  (pParse->db, "su
2a260 62 71 75 65 72 79 5f 25 75 22 2c 20 70 53 65 6c  bquery_%u", pSel
2a270 2d 3e 73 65 6c 49 64 29 3b 0a 20 20 7d 0a 20 20  ->selId);.  }.  
2a280 77 68 69 6c 65 28 20 70 53 65 6c 2d 3e 70 50 72  while( pSel->pPr
2a290 69 6f 72 20 29 7b 20 70 53 65 6c 20 3d 20 70 53  ior ){ pSel = pS
2a2a0 65 6c 2d 3e 70 50 72 69 6f 72 3b 20 7d 0a 20 20  el->pPrior; }.  
2a2b0 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 73 46 72  sqlite3ColumnsFr
2a2c0 6f 6d 45 78 70 72 4c 69 73 74 28 70 50 61 72 73  omExprList(pPars
2a2d0 65 2c 20 70 53 65 6c 2d 3e 70 45 4c 69 73 74 2c  e, pSel->pEList,
2a2e0 26 70 54 61 62 2d 3e 6e 43 6f 6c 2c 26 70 54 61  &pTab->nCol,&pTa
2a2f0 62 2d 3e 61 43 6f 6c 29 3b 0a 20 20 70 54 61 62  b->aCol);.  pTab
2a300 2d 3e 69 50 4b 65 79 20 3d 20 2d 31 3b 0a 20 20  ->iPKey = -1;.  
2a310 70 54 61 62 2d 3e 6e 52 6f 77 4c 6f 67 45 73 74  pTab->nRowLogEst
2a320 20 3d 20 32 30 30 3b 20 61 73 73 65 72 74 28 20   = 200; assert( 
2a330 32 30 30 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45  200==sqlite3LogE
2a340 73 74 28 31 30 34 38 35 37 36 29 20 29 3b 0a 20  st(1048576) );. 
2a350 20 70 54 61 62 2d 3e 74 61 62 46 6c 61 67 73 20   pTab->tabFlags 
2a360 7c 3d 20 54 46 5f 45 70 68 65 6d 65 72 61 6c 3b  |= TF_Ephemeral;
2a370 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ..  return SQLIT
2a380 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  E_OK;.}../*.** T
2a390 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61  his routine is a
2a3a0 20 57 61 6c 6b 65 72 20 63 61 6c 6c 62 61 63 6b   Walker callback
2a3b0 20 66 6f 72 20 22 65 78 70 61 6e 64 69 6e 67 22   for "expanding"
2a3c0 20 61 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d   a SELECT statem
2a3d0 65 6e 74 2e 0a 2a 2a 20 22 45 78 70 61 6e 64 69  ent..** "Expandi
2a3e0 6e 67 22 20 6d 65 61 6e 73 20 74 6f 20 64 6f 20  ng" means to do 
2a3f0 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a  the following:.*
2a400 2a 0a 2a 2a 20 20 20 20 28 31 29 20 20 4d 61 6b  *.**    (1)  Mak
2a410 65 20 73 75 72 65 20 56 44 42 45 20 63 75 72 73  e sure VDBE curs
2a420 6f 72 20 6e 75 6d 62 65 72 73 20 68 61 76 65 20  or numbers have 
2a430 62 65 65 6e 20 61 73 73 69 67 6e 65 64 20 74 6f  been assigned to
2a440 20 65 76 65 72 79 0a 2a 2a 20 20 20 20 20 20 20   every.**       
2a450 20 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65    element of the
2a460 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 0a 2a 2a   FROM clause..**
2a470 0a 2a 2a 20 20 20 20 28 32 29 20 20 46 69 6c 6c  .**    (2)  Fill
2a480 20 69 6e 20 74 68 65 20 70 54 61 62 4c 69 73 74   in the pTabList
2a490 2d 3e 61 5b 5d 2e 70 54 61 62 20 66 69 65 6c 64  ->a[].pTab field
2a4a0 73 20 69 6e 20 74 68 65 20 53 72 63 4c 69 73 74  s in the SrcList
2a4b0 20 74 68 61 74 20 0a 2a 2a 20 20 20 20 20 20 20   that .**       
2a4c0 20 20 64 65 66 69 6e 65 73 20 46 52 4f 4d 20 63    defines FROM c
2a4d0 6c 61 75 73 65 2e 20 20 57 68 65 6e 20 76 69 65  lause.  When vie
2a4e0 77 73 20 61 70 70 65 61 72 20 69 6e 20 74 68 65  ws appear in the
2a4f0 20 46 52 4f 4d 20 63 6c 61 75 73 65 2c 0a 2a 2a   FROM clause,.**
2a500 20 20 20 20 20 20 20 20 20 66 69 6c 6c 20 70 54           fill pT
2a510 61 62 4c 69 73 74 2d 3e 61 5b 5d 2e 70 53 65 6c  abList->a[].pSel
2a520 65 63 74 20 77 69 74 68 20 61 20 63 6f 70 79 20  ect with a copy 
2a530 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20 73 74  of the SELECT st
2a540 61 74 65 6d 65 6e 74 0a 2a 2a 20 20 20 20 20 20  atement.**      
2a550 20 20 20 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e     that implemen
2a560 74 73 20 74 68 65 20 76 69 65 77 2e 20 20 41 20  ts the view.  A 
2a570 63 6f 70 79 20 69 73 20 6d 61 64 65 20 6f 66 20  copy is made of 
2a580 74 68 65 20 76 69 65 77 27 73 20 53 45 4c 45 43  the view's SELEC
2a590 54 0a 2a 2a 20 20 20 20 20 20 20 20 20 73 74 61  T.**         sta
2a5a0 74 65 6d 65 6e 74 20 73 6f 20 74 68 61 74 20 77  tement so that w
2a5b0 65 20 63 61 6e 20 66 72 65 65 6c 79 20 6d 6f 64  e can freely mod
2a5c0 69 66 79 20 6f 72 20 64 65 6c 65 74 65 20 74 68  ify or delete th
2a5d0 61 74 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20  at statement.** 
2a5e0 20 20 20 20 20 20 20 20 77 69 74 68 6f 75 74 20          without 
2a5f0 77 6f 72 72 79 69 6e 67 20 61 62 6f 75 74 20 6d  worrying about m
2a600 65 73 73 69 6e 67 20 75 70 20 74 68 65 20 70 65  essing up the pe
2a610 72 73 69 73 74 65 6e 74 20 72 65 70 72 65 73 65  rsistent represe
2a620 6e 74 61 74 69 6f 6e 0a 2a 2a 20 20 20 20 20 20  ntation.**      
2a630 20 20 20 6f 66 20 74 68 65 20 76 69 65 77 2e 0a     of the view..
2a640 2a 2a 0a 2a 2a 20 20 20 20 28 33 29 20 20 41 64  **.**    (3)  Ad
2a650 64 20 74 65 72 6d 73 20 74 6f 20 74 68 65 20 57  d terms to the W
2a660 48 45 52 45 20 63 6c 61 75 73 65 20 74 6f 20 61  HERE clause to a
2a670 63 63 6f 6d 6d 6f 64 61 74 65 20 74 68 65 20 4e  ccommodate the N
2a680 41 54 55 52 41 4c 20 6b 65 79 77 6f 72 64 0a 2a  ATURAL keyword.*
2a690 2a 20 20 20 20 20 20 20 20 20 6f 6e 20 6a 6f 69  *         on joi
2a6a0 6e 73 20 61 6e 64 20 74 68 65 20 4f 4e 20 61 6e  ns and the ON an
2a6b0 64 20 55 53 49 4e 47 20 63 6c 61 75 73 65 20 6f  d USING clause o
2a6c0 66 20 6a 6f 69 6e 73 2e 0a 2a 2a 0a 2a 2a 20 20  f joins..**.**  
2a6d0 20 20 28 34 29 20 20 53 63 61 6e 20 74 68 65 20    (4)  Scan the 
2a6e0 6c 69 73 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20  list of columns 
2a6f0 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  in the result se
2a700 74 20 28 70 45 4c 69 73 74 29 20 6c 6f 6f 6b 69  t (pEList) looki
2a710 6e 67 0a 2a 2a 20 20 20 20 20 20 20 20 20 66 6f  ng.**         fo
2a720 72 20 69 6e 73 74 61 6e 63 65 73 20 6f 66 20 74  r instances of t
2a730 68 65 20 22 2a 22 20 6f 70 65 72 61 74 6f 72 20  he "*" operator 
2a740 6f 72 20 74 68 65 20 54 41 42 4c 45 2e 2a 20 6f  or the TABLE.* o
2a750 70 65 72 61 74 6f 72 2e 0a 2a 2a 20 20 20 20 20  perator..**     
2a760 20 20 20 20 49 66 20 66 6f 75 6e 64 2c 20 65 78      If found, ex
2a770 70 61 6e 64 20 65 61 63 68 20 22 2a 22 20 74 6f  pand each "*" to
2a780 20 62 65 20 65 76 65 72 79 20 63 6f 6c 75 6d 6e   be every column
2a790 20 69 6e 20 65 76 65 72 79 20 74 61 62 6c 65 0a   in every table.
2a7a0 2a 2a 20 20 20 20 20 20 20 20 20 61 6e 64 20 54  **         and T
2a7b0 41 42 4c 45 2e 2a 20 74 6f 20 62 65 20 65 76 65  ABLE.* to be eve
2a7c0 72 79 20 63 6f 6c 75 6d 6e 20 69 6e 20 54 41 42  ry column in TAB
2a7d0 4c 45 2e 0a 2a 2a 0a 2a 2f 0a 73 74 61 74 69 63  LE..**.*/.static
2a7e0 20 69 6e 74 20 73 65 6c 65 63 74 45 78 70 61 6e   int selectExpan
2a7f0 64 65 72 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c  der(Walker *pWal
2a800 6b 65 72 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b  ker, Select *p){
2a810 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
2a820 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 70 50 61 72   = pWalker->pPar
2a830 73 65 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 2c 20  se;.  int i, j, 
2a840 6b 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54  k;.  SrcList *pT
2a850 61 62 4c 69 73 74 3b 0a 20 20 45 78 70 72 4c 69  abList;.  ExprLi
2a860 73 74 20 2a 70 45 4c 69 73 74 3b 0a 20 20 73 74  st *pEList;.  st
2a870 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
2a880 6d 20 2a 70 46 72 6f 6d 3b 0a 20 20 73 71 6c 69  m *pFrom;.  sqli
2a890 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
2a8a0 2d 3e 64 62 3b 0a 20 20 45 78 70 72 20 2a 70 45  ->db;.  Expr *pE
2a8b0 2c 20 2a 70 52 69 67 68 74 2c 20 2a 70 45 78 70  , *pRight, *pExp
2a8c0 72 3b 0a 20 20 75 31 36 20 73 65 6c 46 6c 61 67  r;.  u16 selFlag
2a8d0 73 20 3d 20 70 2d 3e 73 65 6c 46 6c 61 67 73 3b  s = p->selFlags;
2a8e0 0a 20 20 75 33 32 20 65 6c 69 73 74 46 6c 61 67  .  u32 elistFlag
2a8f0 73 20 3d 20 30 3b 0a 0a 20 20 70 2d 3e 73 65 6c  s = 0;..  p->sel
2a900 46 6c 61 67 73 20 7c 3d 20 53 46 5f 45 78 70 61  Flags |= SF_Expa
2a910 6e 64 65 64 3b 0a 20 20 69 66 28 20 64 62 2d 3e  nded;.  if( db->
2a920 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 20 29 7b  mallocFailed  ){
2a930 0a 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f  .    return WRC_
2a940 41 62 6f 72 74 3b 0a 20 20 7d 0a 20 20 61 73 73  Abort;.  }.  ass
2a950 65 72 74 28 20 70 2d 3e 70 53 72 63 21 3d 30 20  ert( p->pSrc!=0 
2a960 29 3b 0a 20 20 69 66 28 20 28 73 65 6c 46 6c 61  );.  if( (selFla
2a970 67 73 20 26 20 53 46 5f 45 78 70 61 6e 64 65 64  gs & SF_Expanded
2a980 29 21 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  )!=0 ){.    retu
2a990 72 6e 20 57 52 43 5f 50 72 75 6e 65 3b 0a 20 20  rn WRC_Prune;.  
2a9a0 7d 0a 20 20 70 54 61 62 4c 69 73 74 20 3d 20 70  }.  pTabList = p
2a9b0 2d 3e 70 53 72 63 3b 0a 20 20 70 45 4c 69 73 74  ->pSrc;.  pEList
2a9c0 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 20 20   = p->pEList;.  
2a9d0 73 71 6c 69 74 65 33 57 69 74 68 50 75 73 68 28  sqlite3WithPush(
2a9e0 70 50 61 72 73 65 2c 20 70 2d 3e 70 57 69 74 68  pParse, p->pWith
2a9f0 2c 20 30 29 3b 0a 0a 20 20 2f 2a 20 4d 61 6b 65  , 0);..  /* Make
2aa00 20 73 75 72 65 20 63 75 72 73 6f 72 20 6e 75 6d   sure cursor num
2aa10 62 65 72 73 20 68 61 76 65 20 62 65 65 6e 20 61  bers have been a
2aa20 73 73 69 67 6e 65 64 20 74 6f 20 61 6c 6c 20 65  ssigned to all e
2aa30 6e 74 72 69 65 73 20 69 6e 0a 20 20 2a 2a 20 74  ntries in.  ** t
2aa40 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f  he FROM clause o
2aa50 66 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61  f the SELECT sta
2aa60 74 65 6d 65 6e 74 2e 0a 20 20 2a 2f 0a 20 20 73  tement..  */.  s
2aa70 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41 73 73  qlite3SrcListAss
2aa80 69 67 6e 43 75 72 73 6f 72 73 28 70 50 61 72 73  ignCursors(pPars
2aa90 65 2c 20 70 54 61 62 4c 69 73 74 29 3b 0a 0a 20  e, pTabList);.. 
2aaa0 20 2f 2a 20 4c 6f 6f 6b 20 75 70 20 65 76 65 72   /* Look up ever
2aab0 79 20 74 61 62 6c 65 20 6e 61 6d 65 64 20 69 6e  y table named in
2aac0 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
2aad0 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74 2e 20   of the select. 
2aae0 20 49 66 0a 20 20 2a 2a 20 61 6e 20 65 6e 74 72   If.  ** an entr
2aaf0 79 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c  y of the FROM cl
2ab00 61 75 73 65 20 69 73 20 61 20 73 75 62 71 75 65  ause is a subque
2ab10 72 79 20 69 6e 73 74 65 61 64 20 6f 66 20 61 20  ry instead of a 
2ab20 74 61 62 6c 65 20 6f 72 20 76 69 65 77 2c 0a 20  table or view,. 
2ab30 20 2a 2a 20 74 68 65 6e 20 63 72 65 61 74 65 20   ** then create 
2ab40 61 20 74 72 61 6e 73 69 65 6e 74 20 74 61 62 6c  a transient tabl
2ab50 65 20 73 74 72 75 63 74 75 72 65 20 74 6f 20 64  e structure to d
2ab60 65 73 63 72 69 62 65 20 74 68 65 20 73 75 62 71  escribe the subq
2ab70 75 65 72 79 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72  uery..  */.  for
2ab80 28 69 3d 30 2c 20 70 46 72 6f 6d 3d 70 54 61 62  (i=0, pFrom=pTab
2ab90 4c 69 73 74 2d 3e 61 3b 20 69 3c 70 54 61 62 4c  List->a; i<pTabL
2aba0 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20  ist->nSrc; i++, 
2abb0 70 46 72 6f 6d 2b 2b 29 7b 0a 20 20 20 20 54 61  pFrom++){.    Ta
2abc0 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 20 20 61  ble *pTab;.    a
2abd0 73 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e 66 67  ssert( pFrom->fg
2abe0 2e 69 73 52 65 63 75 72 73 69 76 65 3d 3d 30 20  .isRecursive==0 
2abf0 7c 7c 20 70 46 72 6f 6d 2d 3e 70 54 61 62 21 3d  || pFrom->pTab!=
2ac00 30 20 29 3b 0a 20 20 20 20 69 66 28 20 70 46 72  0 );.    if( pFr
2ac10 6f 6d 2d 3e 66 67 2e 69 73 52 65 63 75 72 73 69  om->fg.isRecursi
2ac20 76 65 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  ve ) continue;. 
2ac30 20 20 20 61 73 73 65 72 74 28 20 70 46 72 6f 6d     assert( pFrom
2ac40 2d 3e 70 54 61 62 3d 3d 30 20 29 3b 0a 23 69 66  ->pTab==0 );.#if
2ac50 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
2ac60 5f 43 54 45 0a 20 20 20 20 69 66 28 20 77 69 74  _CTE.    if( wit
2ac70 68 45 78 70 61 6e 64 28 70 57 61 6c 6b 65 72 2c  hExpand(pWalker,
2ac80 20 70 46 72 6f 6d 29 20 29 20 72 65 74 75 72 6e   pFrom) ) return
2ac90 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20   WRC_Abort;.    
2aca0 69 66 28 20 70 46 72 6f 6d 2d 3e 70 54 61 62 20  if( pFrom->pTab 
2acb0 29 20 7b 7d 20 65 6c 73 65 0a 23 65 6e 64 69 66  ) {} else.#endif
2acc0 0a 20 20 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e  .    if( pFrom->
2acd0 7a 4e 61 6d 65 3d 3d 30 20 29 7b 0a 23 69 66 6e  zName==0 ){.#ifn
2ace0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
2acf0 53 55 42 51 55 45 52 59 0a 20 20 20 20 20 20 53  SUBQUERY.      S
2ad00 65 6c 65 63 74 20 2a 70 53 65 6c 20 3d 20 70 46  elect *pSel = pF
2ad10 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a 20 20  rom->pSelect;.  
2ad20 20 20 20 20 2f 2a 20 41 20 73 75 62 2d 71 75 65      /* A sub-que
2ad30 72 79 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63  ry in the FROM c
2ad40 6c 61 75 73 65 20 6f 66 20 61 20 53 45 4c 45 43  lause of a SELEC
2ad50 54 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72  T */.      asser
2ad60 74 28 20 70 53 65 6c 21 3d 30 20 29 3b 0a 20 20  t( pSel!=0 );.  
2ad70 20 20 20 20 61 73 73 65 72 74 28 20 70 46 72 6f      assert( pFro
2ad80 6d 2d 3e 70 54 61 62 3d 3d 30 20 29 3b 0a 20 20  m->pTab==0 );.  
2ad90 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 57      if( sqlite3W
2ada0 61 6c 6b 53 65 6c 65 63 74 28 70 57 61 6c 6b 65  alkSelect(pWalke
2adb0 72 2c 20 70 53 65 6c 29 20 29 20 72 65 74 75 72  r, pSel) ) retur
2adc0 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20  n WRC_Abort;.   
2add0 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78     if( sqlite3Ex
2ade0 70 61 6e 64 53 75 62 71 75 65 72 79 28 70 50 61  pandSubquery(pPa
2adf0 72 73 65 2c 20 70 46 72 6f 6d 29 20 29 20 72 65  rse, pFrom) ) re
2ae00 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a  turn WRC_Abort;.
2ae10 23 65 6e 64 69 66 0a 20 20 20 20 7d 65 6c 73 65  #endif.    }else
2ae20 7b 0a 20 20 20 20 20 20 2f 2a 20 41 6e 20 6f 72  {.      /* An or
2ae30 64 69 6e 61 72 79 20 74 61 62 6c 65 20 6f 72 20  dinary table or 
2ae40 76 69 65 77 20 6e 61 6d 65 20 69 6e 20 74 68 65  view name in the
2ae50 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a   FROM clause */.
2ae60 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 46        assert( pF
2ae70 72 6f 6d 2d 3e 70 54 61 62 3d 3d 30 20 29 3b 0a  rom->pTab==0 );.
2ae80 20 20 20 20 20 20 70 46 72 6f 6d 2d 3e 70 54 61        pFrom->pTa
2ae90 62 20 3d 20 70 54 61 62 20 3d 20 73 71 6c 69 74  b = pTab = sqlit
2aea0 65 33 4c 6f 63 61 74 65 54 61 62 6c 65 49 74 65  e3LocateTableIte
2aeb0 6d 28 70 50 61 72 73 65 2c 20 30 2c 20 70 46 72  m(pParse, 0, pFr
2aec0 6f 6d 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  om);.      if( p
2aed0 54 61 62 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  Tab==0 ) return 
2aee0 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 20  WRC_Abort;.     
2aef0 20 69 66 28 20 70 54 61 62 2d 3e 6e 54 61 62 52   if( pTab->nTabR
2af00 65 66 3e 3d 30 78 66 66 66 66 20 29 7b 0a 20 20  ef>=0xffff ){.  
2af10 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
2af20 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74  orMsg(pParse, "t
2af30 6f 6f 20 6d 61 6e 79 20 72 65 66 65 72 65 6e 63  oo many referenc
2af40 65 73 20 74 6f 20 5c 22 25 73 5c 22 3a 20 6d 61  es to \"%s\": ma
2af50 78 20 36 35 35 33 35 22 2c 0a 20 20 20 20 20 20  x 65535",.      
2af60 20 20 20 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65       pTab->zName
2af70 29 3b 0a 20 20 20 20 20 20 20 20 70 46 72 6f 6d  );.        pFrom
2af80 2d 3e 70 54 61 62 20 3d 20 30 3b 0a 20 20 20 20  ->pTab = 0;.    
2af90 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41      return WRC_A
2afa0 62 6f 72 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20  bort;.      }.  
2afb0 20 20 20 20 70 54 61 62 2d 3e 6e 54 61 62 52 65      pTab->nTabRe
2afc0 66 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 21  f++;.      if( !
2afd0 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 29 20  IsVirtual(pTab) 
2afe0 26 26 20 63 61 6e 6e 6f 74 42 65 46 75 6e 63 74  && cannotBeFunct
2aff0 69 6f 6e 28 70 50 61 72 73 65 2c 20 70 46 72 6f  ion(pParse, pFro
2b000 6d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  m) ){.        re
2b010 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a  turn WRC_Abort;.
2b020 20 20 20 20 20 20 7d 0a 23 69 66 20 21 64 65 66        }.#if !def
2b030 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
2b040 5f 56 49 45 57 29 20 7c 7c 20 21 64 65 66 69 6e  _VIEW) || !defin
2b050 65 64 20 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ed (SQLITE_OMIT_
2b060 56 49 52 54 55 41 4c 54 41 42 4c 45 29 0a 20 20  VIRTUALTABLE).  
2b070 20 20 20 20 69 66 28 20 49 73 56 69 72 74 75 61      if( IsVirtua
2b080 6c 28 70 54 61 62 29 20 7c 7c 20 70 54 61 62 2d  l(pTab) || pTab-
2b090 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20  >pSelect ){.    
2b0a0 20 20 20 20 69 31 36 20 6e 43 6f 6c 3b 0a 20 20      i16 nCol;.  
2b0b0 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
2b0c0 33 56 69 65 77 47 65 74 43 6f 6c 75 6d 6e 4e 61  3ViewGetColumnNa
2b0d0 6d 65 73 28 70 50 61 72 73 65 2c 20 70 54 61 62  mes(pParse, pTab
2b0e0 29 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f 41  ) ) return WRC_A
2b0f0 62 6f 72 74 3b 0a 20 20 20 20 20 20 20 20 61 73  bort;.        as
2b100 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e 70 53 65  sert( pFrom->pSe
2b110 6c 65 63 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20  lect==0 );.     
2b120 20 20 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63     pFrom->pSelec
2b130 74 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63  t = sqlite3Selec
2b140 74 44 75 70 28 64 62 2c 20 70 54 61 62 2d 3e 70  tDup(db, pTab->p
2b150 53 65 6c 65 63 74 2c 20 30 29 3b 0a 20 20 20 20  Select, 0);.    
2b160 20 20 20 20 6e 43 6f 6c 20 3d 20 70 54 61 62 2d      nCol = pTab-
2b170 3e 6e 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20 70  >nCol;.        p
2b180 54 61 62 2d 3e 6e 43 6f 6c 20 3d 20 2d 31 3b 0a  Tab->nCol = -1;.
2b190 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 57          sqlite3W
2b1a0 61 6c 6b 53 65 6c 65 63 74 28 70 57 61 6c 6b 65  alkSelect(pWalke
2b1b0 72 2c 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63  r, pFrom->pSelec
2b1c0 74 29 3b 0a 20 20 20 20 20 20 20 20 70 54 61 62  t);.        pTab
2b1d0 2d 3e 6e 43 6f 6c 20 3d 20 6e 43 6f 6c 3b 0a 20  ->nCol = nCol;. 
2b1e0 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20       }.#endif.  
2b1f0 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4c 6f 63 61    }..    /* Loca
2b200 74 65 20 74 68 65 20 69 6e 64 65 78 20 6e 61 6d  te the index nam
2b210 65 64 20 62 79 20 74 68 65 20 49 4e 44 45 58 45  ed by the INDEXE
2b220 44 20 42 59 20 63 6c 61 75 73 65 2c 20 69 66 20  D BY clause, if 
2b230 61 6e 79 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20  any. */.    if( 
2b240 73 71 6c 69 74 65 33 49 6e 64 65 78 65 64 42 79  sqlite3IndexedBy
2b250 4c 6f 6f 6b 75 70 28 70 50 61 72 73 65 2c 20 70  Lookup(pParse, p
2b260 46 72 6f 6d 29 20 29 7b 0a 20 20 20 20 20 20 72  From) ){.      r
2b270 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b  eturn WRC_Abort;
2b280 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
2b290 20 50 72 6f 63 65 73 73 20 4e 41 54 55 52 41 4c   Process NATURAL
2b2a0 20 6b 65 79 77 6f 72 64 73 2c 20 61 6e 64 20 4f   keywords, and O
2b2b0 4e 20 61 6e 64 20 55 53 49 4e 47 20 63 6c 61 75  N and USING clau
2b2c0 73 65 73 20 6f 66 20 6a 6f 69 6e 73 2e 0a 20 20  ses of joins..  
2b2d0 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c  */.  if( db->mal
2b2e0 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20 73 71 6c  locFailed || sql
2b2f0 69 74 65 50 72 6f 63 65 73 73 4a 6f 69 6e 28 70  iteProcessJoin(p
2b300 50 61 72 73 65 2c 20 70 29 20 29 7b 0a 20 20 20  Parse, p) ){.   
2b310 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72   return WRC_Abor
2b320 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 6f 72  t;.  }..  /* For
2b330 20 65 76 65 72 79 20 22 2a 22 20 74 68 61 74 20   every "*" that 
2b340 6f 63 63 75 72 73 20 69 6e 20 74 68 65 20 63 6f  occurs in the co
2b350 6c 75 6d 6e 20 6c 69 73 74 2c 20 69 6e 73 65 72  lumn list, inser
2b360 74 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 0a 20  t the names of. 
2b370 20 2a 2a 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20   ** all columns 
2b380 69 6e 20 61 6c 6c 20 74 61 62 6c 65 73 2e 20 20  in all tables.  
2b390 41 6e 64 20 66 6f 72 20 65 76 65 72 79 20 54 41  And for every TA
2b3a0 42 4c 45 2e 2a 20 69 6e 73 65 72 74 20 74 68 65  BLE.* insert the
2b3b0 20 6e 61 6d 65 73 0a 20 20 2a 2a 20 6f 66 20 61   names.  ** of a
2b3c0 6c 6c 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 54 41  ll columns in TA
2b3d0 42 4c 45 2e 20 20 54 68 65 20 70 61 72 73 65 72  BLE.  The parser
2b3e0 20 69 6e 73 65 72 74 65 64 20 61 20 73 70 65 63   inserted a spec
2b3f0 69 61 6c 20 65 78 70 72 65 73 73 69 6f 6e 0a 20  ial expression. 
2b400 20 2a 2a 20 77 69 74 68 20 74 68 65 20 54 4b 5f   ** with the TK_
2b410 41 53 54 45 52 49 53 4b 20 6f 70 65 72 61 74 6f  ASTERISK operato
2b420 72 20 66 6f 72 20 65 61 63 68 20 22 2a 22 20 74  r for each "*" t
2b430 68 61 74 20 69 74 20 66 6f 75 6e 64 20 69 6e 20  hat it found in 
2b440 74 68 65 20 63 6f 6c 75 6d 6e 0a 20 20 2a 2a 20  the column.  ** 
2b450 6c 69 73 74 2e 20 20 54 68 65 20 66 6f 6c 6c 6f  list.  The follo
2b460 77 69 6e 67 20 63 6f 64 65 20 6a 75 73 74 20 68  wing code just h
2b470 61 73 20 74 6f 20 6c 6f 63 61 74 65 20 74 68 65  as to locate the
2b480 20 54 4b 5f 41 53 54 45 52 49 53 4b 0a 20 20 2a   TK_ASTERISK.  *
2b490 2a 20 65 78 70 72 65 73 73 69 6f 6e 73 20 61 6e  * expressions an
2b4a0 64 20 65 78 70 61 6e 64 20 65 61 63 68 20 6f 6e  d expand each on
2b4b0 65 20 74 6f 20 74 68 65 20 6c 69 73 74 20 6f 66  e to the list of
2b4c0 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 69 6e 0a   all columns in.
2b4d0 20 20 2a 2a 20 61 6c 6c 20 74 61 62 6c 65 73 2e    ** all tables.
2b4e0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 66  .  **.  ** The f
2b4f0 69 72 73 74 20 6c 6f 6f 70 20 6a 75 73 74 20 63  irst loop just c
2b500 68 65 63 6b 73 20 74 6f 20 73 65 65 20 69 66 20  hecks to see if 
2b510 74 68 65 72 65 20 61 72 65 20 61 6e 79 20 22 2a  there are any "*
2b520 22 20 6f 70 65 72 61 74 6f 72 73 0a 20 20 2a 2a  " operators.  **
2b530 20 74 68 61 74 20 6e 65 65 64 20 65 78 70 61 6e   that need expan
2b540 64 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72  ding..  */.  for
2b550 28 6b 3d 30 3b 20 6b 3c 70 45 4c 69 73 74 2d 3e  (k=0; k<pEList->
2b560 6e 45 78 70 72 3b 20 6b 2b 2b 29 7b 0a 20 20 20  nExpr; k++){.   
2b570 20 70 45 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b   pE = pEList->a[
2b580 6b 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 69 66  k].pExpr;.    if
2b590 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 41 53 54  ( pE->op==TK_AST
2b5a0 45 52 49 53 4b 20 29 20 62 72 65 61 6b 3b 0a 20  ERISK ) break;. 
2b5b0 20 20 20 61 73 73 65 72 74 28 20 70 45 2d 3e 6f     assert( pE->o
2b5c0 70 21 3d 54 4b 5f 44 4f 54 20 7c 7c 20 70 45 2d  p!=TK_DOT || pE-
2b5d0 3e 70 52 69 67 68 74 21 3d 30 20 29 3b 0a 20 20  >pRight!=0 );.  
2b5e0 20 20 61 73 73 65 72 74 28 20 70 45 2d 3e 6f 70    assert( pE->op
2b5f0 21 3d 54 4b 5f 44 4f 54 20 7c 7c 20 28 70 45 2d  !=TK_DOT || (pE-
2b600 3e 70 4c 65 66 74 21 3d 30 20 26 26 20 70 45 2d  >pLeft!=0 && pE-
2b610 3e 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 49  >pLeft->op==TK_I
2b620 44 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70 45  D) );.    if( pE
2b630 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f 54 20 26 26 20  ->op==TK_DOT && 
2b640 70 45 2d 3e 70 52 69 67 68 74 2d 3e 6f 70 3d 3d  pE->pRight->op==
2b650 54 4b 5f 41 53 54 45 52 49 53 4b 20 29 20 62 72  TK_ASTERISK ) br
2b660 65 61 6b 3b 0a 20 20 20 20 65 6c 69 73 74 46 6c  eak;.    elistFl
2b670 61 67 73 20 7c 3d 20 70 45 2d 3e 66 6c 61 67 73  ags |= pE->flags
2b680 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6b 3c 70 45  ;.  }.  if( k<pE
2b690 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20  List->nExpr ){. 
2b6a0 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 49 66 20     /*.    ** If 
2b6b0 77 65 20 67 65 74 20 68 65 72 65 20 69 74 20 6d  we get here it m
2b6c0 65 61 6e 73 20 74 68 65 20 72 65 73 75 6c 74 20  eans the result 
2b6d0 73 65 74 20 63 6f 6e 74 61 69 6e 73 20 6f 6e 65  set contains one
2b6e0 20 6f 72 20 6d 6f 72 65 20 22 2a 22 0a 20 20 20   or more "*".   
2b6f0 20 2a 2a 20 6f 70 65 72 61 74 6f 72 73 20 74 68   ** operators th
2b700 61 74 20 6e 65 65 64 20 74 6f 20 62 65 20 65 78  at need to be ex
2b710 70 61 6e 64 65 64 2e 20 20 4c 6f 6f 70 20 74 68  panded.  Loop th
2b720 72 6f 75 67 68 20 65 61 63 68 20 65 78 70 72 65  rough each expre
2b730 73 73 69 6f 6e 0a 20 20 20 20 2a 2a 20 69 6e 20  ssion.    ** in 
2b740 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 61  the result set a
2b750 6e 64 20 65 78 70 61 6e 64 20 74 68 65 6d 20 6f  nd expand them o
2b760 6e 65 20 62 79 20 6f 6e 65 2e 0a 20 20 20 20 2a  ne by one..    *
2b770 2f 0a 20 20 20 20 73 74 72 75 63 74 20 45 78 70  /.    struct Exp
2b780 72 4c 69 73 74 5f 69 74 65 6d 20 2a 61 20 3d 20  rList_item *a = 
2b790 70 45 4c 69 73 74 2d 3e 61 3b 0a 20 20 20 20 45  pEList->a;.    E
2b7a0 78 70 72 4c 69 73 74 20 2a 70 4e 65 77 20 3d 20  xprList *pNew = 
2b7b0 30 3b 0a 20 20 20 20 69 6e 74 20 66 6c 61 67 73  0;.    int flags
2b7c0 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 66   = pParse->db->f
2b7d0 6c 61 67 73 3b 0a 20 20 20 20 69 6e 74 20 6c 6f  lags;.    int lo
2b7e0 6e 67 4e 61 6d 65 73 20 3d 20 28 66 6c 61 67 73  ngNames = (flags
2b7f0 20 26 20 53 51 4c 49 54 45 5f 46 75 6c 6c 43 6f   & SQLITE_FullCo
2b800 6c 4e 61 6d 65 73 29 21 3d 30 0a 20 20 20 20 20  lNames)!=0.     
2b810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b820 20 26 26 20 28 66 6c 61 67 73 20 26 20 53 51 4c   && (flags & SQL
2b830 49 54 45 5f 53 68 6f 72 74 43 6f 6c 4e 61 6d 65  ITE_ShortColName
2b840 73 29 3d 3d 30 3b 0a 0a 20 20 20 20 66 6f 72 28  s)==0;..    for(
2b850 6b 3d 30 3b 20 6b 3c 70 45 4c 69 73 74 2d 3e 6e  k=0; k<pEList->n
2b860 45 78 70 72 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20  Expr; k++){.    
2b870 20 20 70 45 20 3d 20 61 5b 6b 5d 2e 70 45 78 70    pE = a[k].pExp
2b880 72 3b 0a 20 20 20 20 20 20 65 6c 69 73 74 46 6c  r;.      elistFl
2b890 61 67 73 20 7c 3d 20 70 45 2d 3e 66 6c 61 67 73  ags |= pE->flags
2b8a0 3b 0a 20 20 20 20 20 20 70 52 69 67 68 74 20 3d  ;.      pRight =
2b8b0 20 70 45 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20   pE->pRight;.   
2b8c0 20 20 20 61 73 73 65 72 74 28 20 70 45 2d 3e 6f     assert( pE->o
2b8d0 70 21 3d 54 4b 5f 44 4f 54 20 7c 7c 20 70 52 69  p!=TK_DOT || pRi
2b8e0 67 68 74 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  ght!=0 );.      
2b8f0 69 66 28 20 70 45 2d 3e 6f 70 21 3d 54 4b 5f 41  if( pE->op!=TK_A
2b900 53 54 45 52 49 53 4b 0a 20 20 20 20 20 20 20 26  STERISK.       &
2b910 26 20 28 70 45 2d 3e 6f 70 21 3d 54 4b 5f 44 4f  & (pE->op!=TK_DO
2b920 54 20 7c 7c 20 70 52 69 67 68 74 2d 3e 6f 70 21  T || pRight->op!
2b930 3d 54 4b 5f 41 53 54 45 52 49 53 4b 29 0a 20 20  =TK_ASTERISK).  
2b940 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 2f      ){.        /
2b950 2a 20 54 68 69 73 20 70 61 72 74 69 63 75 6c 61  * This particula
2b960 72 20 65 78 70 72 65 73 73 69 6f 6e 20 64 6f 65  r expression doe
2b970 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65  s not need to be
2b980 20 65 78 70 61 6e 64 65 64 2e 0a 20 20 20 20 20   expanded..     
2b990 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 4e     */.        pN
2b9a0 65 77 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ew = sqlite3Expr
2b9b0 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61 72 73  ListAppend(pPars
2b9c0 65 2c 20 70 4e 65 77 2c 20 61 5b 6b 5d 2e 70 45  e, pNew, a[k].pE
2b9d0 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 69 66  xpr);.        if
2b9e0 28 20 70 4e 65 77 20 29 7b 0a 20 20 20 20 20 20  ( pNew ){.      
2b9f0 20 20 20 20 70 4e 65 77 2d 3e 61 5b 70 4e 65 77      pNew->a[pNew
2ba00 2d 3e 6e 45 78 70 72 2d 31 5d 2e 7a 4e 61 6d 65  ->nExpr-1].zName
2ba10 20 3d 20 61 5b 6b 5d 2e 7a 4e 61 6d 65 3b 0a 20   = a[k].zName;. 
2ba20 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 61           pNew->a
2ba30 5b 70 4e 65 77 2d 3e 6e 45 78 70 72 2d 31 5d 2e  [pNew->nExpr-1].
2ba40 7a 53 70 61 6e 20 3d 20 61 5b 6b 5d 2e 7a 53 70  zSpan = a[k].zSp
2ba50 61 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 61 5b  an;.          a[
2ba60 6b 5d 2e 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20  k].zName = 0;.  
2ba70 20 20 20 20 20 20 20 20 61 5b 6b 5d 2e 7a 53 70          a[k].zSp
2ba80 61 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  an = 0;.        
2ba90 7d 0a 20 20 20 20 20 20 20 20 61 5b 6b 5d 2e 70  }.        a[k].p
2baa0 45 78 70 72 20 3d 20 30 3b 0a 20 20 20 20 20 20  Expr = 0;.      
2bab0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f  }else{.        /
2bac0 2a 20 54 68 69 73 20 65 78 70 72 65 73 73 69 6f  * This expressio
2bad0 6e 20 69 73 20 61 20 22 2a 22 20 6f 72 20 61 20  n is a "*" or a 
2bae0 22 54 41 42 4c 45 2e 2a 22 20 61 6e 64 20 6e 65  "TABLE.*" and ne
2baf0 65 64 73 20 74 6f 20 62 65 0a 20 20 20 20 20 20  eds to be.      
2bb00 20 20 2a 2a 20 65 78 70 61 6e 64 65 64 2e 20 2a    ** expanded. *
2bb10 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 74 61  /.        int ta
2bb20 62 6c 65 53 65 65 6e 20 3d 20 30 3b 20 20 20 20  bleSeen = 0;    
2bb30 20 20 2f 2a 20 53 65 74 20 74 6f 20 31 20 77 68    /* Set to 1 wh
2bb40 65 6e 20 54 41 42 4c 45 20 6d 61 74 63 68 65 73  en TABLE matches
2bb50 20 2a 2f 0a 20 20 20 20 20 20 20 20 63 68 61 72   */.        char
2bb60 20 2a 7a 54 4e 61 6d 65 20 3d 20 30 3b 20 20 20   *zTName = 0;   
2bb70 20 20 20 20 2f 2a 20 74 65 78 74 20 6f 66 20 6e      /* text of n
2bb80 61 6d 65 20 6f 66 20 54 41 42 4c 45 20 2a 2f 0a  ame of TABLE */.
2bb90 20 20 20 20 20 20 20 20 69 66 28 20 70 45 2d 3e          if( pE->
2bba0 6f 70 3d 3d 54 4b 5f 44 4f 54 20 29 7b 0a 20 20  op==TK_DOT ){.  
2bbb0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
2bbc0 70 45 2d 3e 70 4c 65 66 74 21 3d 30 20 29 3b 0a  pE->pLeft!=0 );.
2bbd0 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
2bbe0 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
2bbf0 74 79 28 70 45 2d 3e 70 4c 65 66 74 2c 20 45 50  ty(pE->pLeft, EP
2bc00 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20 20  _IntValue) );.  
2bc10 20 20 20 20 20 20 20 20 7a 54 4e 61 6d 65 20 3d          zTName =
2bc20 20 70 45 2d 3e 70 4c 65 66 74 2d 3e 75 2e 7a 54   pE->pLeft->u.zT
2bc30 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 20 20 7d 0a  oken;.        }.
2bc40 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 2c          for(i=0,
2bc50 20 70 46 72 6f 6d 3d 70 54 61 62 4c 69 73 74 2d   pFrom=pTabList-
2bc60 3e 61 3b 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e  >a; i<pTabList->
2bc70 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 46 72 6f 6d  nSrc; i++, pFrom
2bc80 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 54  ++){.          T
2bc90 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 46 72  able *pTab = pFr
2bca0 6f 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20 20 20  om->pTab;.      
2bcb0 20 20 20 20 53 65 6c 65 63 74 20 2a 70 53 75 62      Select *pSub
2bcc0 20 3d 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63   = pFrom->pSelec
2bcd0 74 3b 0a 20 20 20 20 20 20 20 20 20 20 63 68 61  t;.          cha
2bce0 72 20 2a 7a 54 61 62 4e 61 6d 65 20 3d 20 70 46  r *zTabName = pF
2bcf0 72 6f 6d 2d 3e 7a 41 6c 69 61 73 3b 0a 20 20 20  rom->zAlias;.   
2bd00 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61         const cha
2bd10 72 20 2a 7a 53 63 68 65 6d 61 4e 61 6d 65 20 3d  r *zSchemaName =
2bd20 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 69 6e   0;.          in
2bd30 74 20 69 44 62 3b 0a 20 20 20 20 20 20 20 20 20  t iDb;.         
2bd40 20 69 66 28 20 7a 54 61 62 4e 61 6d 65 3d 3d 30   if( zTabName==0
2bd50 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
2bd60 7a 54 61 62 4e 61 6d 65 20 3d 20 70 54 61 62 2d  zTabName = pTab-
2bd70 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20  >zName;.        
2bd80 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66    }.          if
2bd90 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
2bda0 65 64 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  ed ) break;.    
2bdb0 20 20 20 20 20 20 69 66 28 20 70 53 75 62 3d 3d        if( pSub==
2bdc0 30 20 7c 7c 20 28 70 53 75 62 2d 3e 73 65 6c 46  0 || (pSub->selF
2bdd0 6c 61 67 73 20 26 20 53 46 5f 4e 65 73 74 65 64  lags & SF_Nested
2bde0 46 72 6f 6d 29 3d 3d 30 20 29 7b 0a 20 20 20 20  From)==0 ){.    
2bdf0 20 20 20 20 20 20 20 20 70 53 75 62 20 3d 20 30          pSub = 0
2be00 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
2be10 28 20 7a 54 4e 61 6d 65 20 26 26 20 73 71 6c 69  ( zTName && sqli
2be20 74 65 33 53 74 72 49 43 6d 70 28 7a 54 4e 61 6d  te3StrICmp(zTNam
2be30 65 2c 20 7a 54 61 62 4e 61 6d 65 29 21 3d 30 20  e, zTabName)!=0 
2be40 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
2be50 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
2be60 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2be70 20 20 20 20 20 69 44 62 20 3d 20 73 71 6c 69 74       iDb = sqlit
2be80 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28  e3SchemaToIndex(
2be90 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d  db, pTab->pSchem
2bea0 61 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  a);.            
2beb0 7a 53 63 68 65 6d 61 4e 61 6d 65 20 3d 20 69 44  zSchemaName = iD
2bec0 62 3e 3d 30 20 3f 20 64 62 2d 3e 61 44 62 5b 69  b>=0 ? db->aDb[i
2bed0 44 62 5d 2e 7a 44 62 53 4e 61 6d 65 20 3a 20 22  Db].zDbSName : "
2bee0 2a 22 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  *";.          }.
2bef0 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d            for(j=
2bf00 30 3b 20 6a 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b  0; j<pTab->nCol;
2bf10 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20   j++){.         
2bf20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d     char *zName =
2bf30 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a   pTab->aCol[j].z
2bf40 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 20 20  Name;.          
2bf50 20 20 63 68 61 72 20 2a 7a 43 6f 6c 6e 61 6d 65    char *zColname
2bf60 3b 20 20 2f 2a 20 54 68 65 20 63 6f 6d 70 75 74  ;  /* The comput
2bf70 65 64 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 2a  ed column name *
2bf80 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 68  /.            ch
2bf90 61 72 20 2a 7a 54 6f 46 72 65 65 3b 20 20 20 2f  ar *zToFree;   /
2bfa0 2a 20 4d 61 6c 6c 6f 63 65 64 20 73 74 72 69 6e  * Malloced strin
2bfb0 67 20 74 68 61 74 20 6e 65 65 64 73 20 74 6f 20  g that needs to 
2bfc0 62 65 20 66 72 65 65 64 20 2a 2f 0a 20 20 20 20  be freed */.    
2bfd0 20 20 20 20 20 20 20 20 54 6f 6b 65 6e 20 73 43          Token sC
2bfe0 6f 6c 6e 61 6d 65 3b 20 20 2f 2a 20 43 6f 6d 70  olname;  /* Comp
2bff0 75 74 65 64 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65  uted column name
2c000 20 61 73 20 61 20 74 6f 6b 65 6e 20 2a 2f 0a 0a   as a token */..
2c010 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65              asse
2c020 72 74 28 20 7a 4e 61 6d 65 20 29 3b 0a 20 20 20  rt( zName );.   
2c030 20 20 20 20 20 20 20 20 20 69 66 28 20 7a 54 4e           if( zTN
2c040 61 6d 65 20 26 26 20 70 53 75 62 0a 20 20 20 20  ame && pSub.    
2c050 20 20 20 20 20 20 20 20 20 26 26 20 73 71 6c 69           && sqli
2c060 74 65 33 4d 61 74 63 68 53 70 61 6e 4e 61 6d 65  te3MatchSpanName
2c070 28 70 53 75 62 2d 3e 70 45 4c 69 73 74 2d 3e 61  (pSub->pEList->a
2c080 5b 6a 5d 2e 7a 53 70 61 6e 2c 20 30 2c 20 7a 54  [j].zSpan, 0, zT
2c090 4e 61 6d 65 2c 20 30 29 3d 3d 30 0a 20 20 20 20  Name, 0)==0.    
2c0a0 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20          ){.     
2c0b0 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75           continu
2c0c0 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  e;.            }
2c0d0 0a 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ..            /*
2c0e0 20 49 66 20 61 20 63 6f 6c 75 6d 6e 20 69 73 20   If a column is 
2c0f0 6d 61 72 6b 65 64 20 61 73 20 27 68 69 64 64 65  marked as 'hidde
2c100 6e 27 2c 20 6f 6d 69 74 20 69 74 20 66 72 6f 6d  n', omit it from
2c110 20 74 68 65 20 65 78 70 61 6e 64 65 64 0a 20 20   the expanded.  
2c120 20 20 20 20 20 20 20 20 20 20 2a 2a 20 72 65 73            ** res
2c130 75 6c 74 2d 73 65 74 20 6c 69 73 74 20 75 6e 6c  ult-set list unl
2c140 65 73 73 20 74 68 65 20 53 45 4c 45 43 54 20 68  ess the SELECT h
2c150 61 73 20 74 68 65 20 53 46 5f 49 6e 63 6c 75 64  as the SF_Includ
2c160 65 48 69 64 64 65 6e 0a 20 20 20 20 20 20 20 20  eHidden.        
2c170 20 20 20 20 2a 2a 20 62 69 74 20 73 65 74 2e 0a      ** bit set..
2c180 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20              */. 
2c190 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 28             if( (
2c1a0 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46  p->selFlags & SF
2c1b0 5f 49 6e 63 6c 75 64 65 48 69 64 64 65 6e 29 3d  _IncludeHidden)=
2c1c0 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  =0.             
2c1d0 26 26 20 49 73 48 69 64 64 65 6e 43 6f 6c 75 6d  && IsHiddenColum
2c1e0 6e 28 26 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d  n(&pTab->aCol[j]
2c1f0 29 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 29  ) .            )
2c200 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
2c210 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
2c220 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2c230 20 20 20 20 74 61 62 6c 65 53 65 65 6e 20 3d 20      tableSeen = 
2c240 31 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 20 20  1;..            
2c250 69 66 28 20 69 3e 30 20 26 26 20 7a 54 4e 61 6d  if( i>0 && zTNam
2c260 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  e==0 ){.        
2c270 20 20 20 20 20 20 69 66 28 20 28 70 46 72 6f 6d        if( (pFrom
2c280 2d 3e 66 67 2e 6a 6f 69 6e 74 79 70 65 20 26 20  ->fg.jointype & 
2c290 4a 54 5f 4e 41 54 55 52 41 4c 29 21 3d 30 0a 20  JT_NATURAL)!=0. 
2c2a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26                 &
2c2b0 26 20 74 61 62 6c 65 41 6e 64 43 6f 6c 75 6d 6e  & tableAndColumn
2c2c0 49 6e 64 65 78 28 70 54 61 62 4c 69 73 74 2c 20  Index(pTabList, 
2c2d0 69 2c 20 7a 4e 61 6d 65 2c 20 30 2c 20 30 29 0a  i, zName, 0, 0).
2c2e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 29 7b                ){
2c2f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2c300 20 2f 2a 20 49 6e 20 61 20 4e 41 54 55 52 41 4c   /* In a NATURAL
2c310 20 6a 6f 69 6e 2c 20 6f 6d 69 74 20 74 68 65 20   join, omit the 
2c320 6a 6f 69 6e 20 63 6f 6c 75 6d 6e 73 20 66 72 6f  join columns fro
2c330 6d 20 74 68 65 20 0a 20 20 20 20 20 20 20 20 20  m the .         
2c340 20 20 20 20 20 20 20 2a 2a 20 74 61 62 6c 65 20         ** table 
2c350 74 6f 20 74 68 65 20 72 69 67 68 74 20 6f 66 20  to the right of 
2c360 74 68 65 20 6a 6f 69 6e 20 2a 2f 0a 20 20 20 20  the join */.    
2c370 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74              cont
2c380 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20  inue;.          
2c390 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
2c3a0 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 49      if( sqlite3I
2c3b0 64 4c 69 73 74 49 6e 64 65 78 28 70 46 72 6f 6d  dListIndex(pFrom
2c3c0 2d 3e 70 55 73 69 6e 67 2c 20 7a 4e 61 6d 65 29  ->pUsing, zName)
2c3d0 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  >=0 ){.         
2c3e0 20 20 20 20 20 20 20 2f 2a 20 49 6e 20 61 20 6a         /* In a j
2c3f0 6f 69 6e 20 77 69 74 68 20 61 20 55 53 49 4e 47  oin with a USING
2c400 20 63 6c 61 75 73 65 2c 20 6f 6d 69 74 20 63 6f   clause, omit co
2c410 6c 75 6d 6e 73 20 69 6e 20 74 68 65 0a 20 20 20  lumns in the.   
2c420 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20               ** 
2c430 75 73 69 6e 67 20 63 6c 61 75 73 65 20 66 72 6f  using clause fro
2c440 6d 20 74 68 65 20 74 61 62 6c 65 20 6f 6e 20 74  m the table on t
2c450 68 65 20 72 69 67 68 74 2e 20 2a 2f 0a 20 20 20  he right. */.   
2c460 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e               con
2c470 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20  tinue;.         
2c480 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
2c490 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
2c4a0 20 70 52 69 67 68 74 20 3d 20 73 71 6c 69 74 65   pRight = sqlite
2c4b0 33 45 78 70 72 28 64 62 2c 20 54 4b 5f 49 44 2c  3Expr(db, TK_ID,
2c4c0 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20   zName);.       
2c4d0 20 20 20 20 20 7a 43 6f 6c 6e 61 6d 65 20 3d 20       zColname = 
2c4e0 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 20  zName;.         
2c4f0 20 20 20 7a 54 6f 46 72 65 65 20 3d 20 30 3b 0a     zToFree = 0;.
2c500 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
2c510 6c 6f 6e 67 4e 61 6d 65 73 20 7c 7c 20 70 54 61  longNames || pTa
2c520 62 4c 69 73 74 2d 3e 6e 53 72 63 3e 31 20 29 7b  bList->nSrc>1 ){
2c530 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 45  .              E
2c540 78 70 72 20 2a 70 4c 65 66 74 3b 0a 20 20 20 20  xpr *pLeft;.    
2c550 20 20 20 20 20 20 20 20 20 20 70 4c 65 66 74 20            pLeft 
2c560 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28 64 62  = sqlite3Expr(db
2c570 2c 20 54 4b 5f 49 44 2c 20 7a 54 61 62 4e 61 6d  , TK_ID, zTabNam
2c580 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  e);.            
2c590 20 20 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65    pExpr = sqlite
2c5a0 33 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 54  3PExpr(pParse, T
2c5b0 4b 5f 44 4f 54 2c 20 70 4c 65 66 74 2c 20 70 52  K_DOT, pLeft, pR
2c5c0 69 67 68 74 29 3b 0a 20 20 20 20 20 20 20 20 20  ight);.         
2c5d0 20 20 20 20 20 69 66 28 20 7a 53 63 68 65 6d 61       if( zSchema
2c5e0 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Name ){.        
2c5f0 20 20 20 20 20 20 20 20 70 4c 65 66 74 20 3d 20          pLeft = 
2c600 73 71 6c 69 74 65 33 45 78 70 72 28 64 62 2c 20  sqlite3Expr(db, 
2c610 54 4b 5f 49 44 2c 20 7a 53 63 68 65 6d 61 4e 61  TK_ID, zSchemaNa
2c620 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  me);.           
2c630 20 20 20 20 20 70 45 78 70 72 20 3d 20 73 71 6c       pExpr = sql
2c640 69 74 65 33 50 45 78 70 72 28 70 50 61 72 73 65  ite3PExpr(pParse
2c650 2c 20 54 4b 5f 44 4f 54 2c 20 70 4c 65 66 74 2c  , TK_DOT, pLeft,
2c660 20 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20   pExpr);.       
2c670 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2c680 20 20 20 20 20 20 20 69 66 28 20 6c 6f 6e 67 4e         if( longN
2c690 61 6d 65 73 20 29 7b 0a 20 20 20 20 20 20 20 20  ames ){.        
2c6a0 20 20 20 20 20 20 20 20 7a 43 6f 6c 6e 61 6d 65          zColname
2c6b0 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74   = sqlite3MPrint
2c6c0 66 28 64 62 2c 20 22 25 73 2e 25 73 22 2c 20 7a  f(db, "%s.%s", z
2c6d0 54 61 62 4e 61 6d 65 2c 20 7a 4e 61 6d 65 29 3b  TabName, zName);
2c6e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2c6f0 20 7a 54 6f 46 72 65 65 20 3d 20 7a 43 6f 6c 6e   zToFree = zColn
2c700 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ame;.           
2c710 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
2c720 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
2c730 20 20 20 20 20 20 70 45 78 70 72 20 3d 20 70 52        pExpr = pR
2c740 69 67 68 74 3b 0a 20 20 20 20 20 20 20 20 20 20  ight;.          
2c750 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
2c760 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 45 78  pNew = sqlite3Ex
2c770 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61  prListAppend(pPa
2c780 72 73 65 2c 20 70 4e 65 77 2c 20 70 45 78 70 72  rse, pNew, pExpr
2c790 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  );.            s
2c7a0 71 6c 69 74 65 33 54 6f 6b 65 6e 49 6e 69 74 28  qlite3TokenInit(
2c7b0 26 73 43 6f 6c 6e 61 6d 65 2c 20 7a 43 6f 6c 6e  &sColname, zColn
2c7c0 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ame);.          
2c7d0 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73    sqlite3ExprLis
2c7e0 74 53 65 74 4e 61 6d 65 28 70 50 61 72 73 65 2c  tSetName(pParse,
2c7f0 20 70 4e 65 77 2c 20 26 73 43 6f 6c 6e 61 6d 65   pNew, &sColname
2c800 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 0);.          
2c810 20 20 69 66 28 20 70 4e 65 77 20 26 26 20 28 70    if( pNew && (p
2c820 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f  ->selFlags & SF_
2c830 4e 65 73 74 65 64 46 72 6f 6d 29 21 3d 30 20 29  NestedFrom)!=0 )
2c840 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
2c850 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f  struct ExprList_
2c860 69 74 65 6d 20 2a 70 58 20 3d 20 26 70 4e 65 77  item *pX = &pNew
2c870 2d 3e 61 5b 70 4e 65 77 2d 3e 6e 45 78 70 72 2d  ->a[pNew->nExpr-
2c880 31 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  1];.            
2c890 20 20 69 66 28 20 70 53 75 62 20 29 7b 0a 20 20    if( pSub ){.  
2c8a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 58                pX
2c8b0 2d 3e 7a 53 70 61 6e 20 3d 20 73 71 6c 69 74 65  ->zSpan = sqlite
2c8c0 33 44 62 53 74 72 44 75 70 28 64 62 2c 20 70 53  3DbStrDup(db, pS
2c8d0 75 62 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 6a 5d  ub->pEList->a[j]
2c8e0 2e 7a 53 70 61 6e 29 3b 0a 20 20 20 20 20 20 20  .zSpan);.       
2c8f0 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73           testcas
2c900 65 28 20 70 58 2d 3e 7a 53 70 61 6e 3d 3d 30 20  e( pX->zSpan==0 
2c910 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
2c920 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
2c930 20 20 20 20 20 20 20 20 70 58 2d 3e 7a 53 70 61          pX->zSpa
2c940 6e 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e  n = sqlite3MPrin
2c950 74 66 28 64 62 2c 20 22 25 73 2e 25 73 2e 25 73  tf(db, "%s.%s.%s
2c960 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
2c970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 53                zS
2c990 63 68 65 6d 61 4e 61 6d 65 2c 20 7a 54 61 62 4e  chemaName, zTabN
2c9a0 61 6d 65 2c 20 7a 43 6f 6c 6e 61 6d 65 29 3b 0a  ame, zColname);.
2c9b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c9c0 74 65 73 74 63 61 73 65 28 20 70 58 2d 3e 7a 53  testcase( pX->zS
2c9d0 70 61 6e 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  pan==0 );.      
2c9e0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2c9f0 20 20 20 20 20 20 20 20 70 58 2d 3e 62 53 70 61          pX->bSpa
2ca00 6e 49 73 54 61 62 20 3d 20 31 3b 0a 20 20 20 20  nIsTab = 1;.    
2ca10 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2ca20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46        sqlite3DbF
2ca30 72 65 65 28 64 62 2c 20 7a 54 6f 46 72 65 65 29  ree(db, zToFree)
2ca40 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
2ca50 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2ca60 69 66 28 20 21 74 61 62 6c 65 53 65 65 6e 20 29  if( !tableSeen )
2ca70 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
2ca80 7a 54 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20  zTName ){.      
2ca90 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
2caa0 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6e  orMsg(pParse, "n
2cab0 6f 20 73 75 63 68 20 74 61 62 6c 65 3a 20 25 73  o such table: %s
2cac0 22 2c 20 7a 54 4e 61 6d 65 29 3b 0a 20 20 20 20  ", zTName);.    
2cad0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
2cae0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
2caf0 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
2cb00 20 22 6e 6f 20 74 61 62 6c 65 73 20 73 70 65 63   "no tables spec
2cb10 69 66 69 65 64 22 29 3b 0a 20 20 20 20 20 20 20  ified");.       
2cb20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
2cb30 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
2cb40 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
2cb50 44 65 6c 65 74 65 28 64 62 2c 20 70 45 4c 69 73  Delete(db, pELis
2cb60 74 29 3b 0a 20 20 20 20 70 2d 3e 70 45 4c 69 73  t);.    p->pELis
2cb70 74 20 3d 20 70 4e 65 77 3b 0a 20 20 7d 0a 20 20  t = pNew;.  }.  
2cb80 69 66 28 20 70 2d 3e 70 45 4c 69 73 74 20 29 7b  if( p->pEList ){
2cb90 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 45 4c 69  .    if( p->pELi
2cba0 73 74 2d 3e 6e 45 78 70 72 3e 64 62 2d 3e 61 4c  st->nExpr>db->aL
2cbb0 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49  imit[SQLITE_LIMI
2cbc0 54 5f 43 4f 4c 55 4d 4e 5d 20 29 7b 0a 20 20 20  T_COLUMN] ){.   
2cbd0 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
2cbe0 73 67 28 70 50 61 72 73 65 2c 20 22 74 6f 6f 20  sg(pParse, "too 
2cbf0 6d 61 6e 79 20 63 6f 6c 75 6d 6e 73 20 69 6e 20  many columns in 
2cc00 72 65 73 75 6c 74 20 73 65 74 22 29 3b 0a 20 20  result set");.  
2cc10 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41      return WRC_A
2cc20 62 6f 72 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20  bort;.    }.    
2cc30 69 66 28 20 28 65 6c 69 73 74 46 6c 61 67 73 20  if( (elistFlags 
2cc40 26 20 28 45 50 5f 48 61 73 46 75 6e 63 7c 45 50  & (EP_HasFunc|EP
2cc50 5f 53 75 62 71 75 65 72 79 29 29 21 3d 30 20 29  _Subquery))!=0 )
2cc60 7b 0a 20 20 20 20 20 20 70 2d 3e 73 65 6c 46 6c  {.      p->selFl
2cc70 61 67 73 20 7c 3d 20 53 46 5f 43 6f 6d 70 6c 65  ags |= SF_Comple
2cc80 78 52 65 73 75 6c 74 3b 0a 20 20 20 20 7d 0a 20  xResult;.    }. 
2cc90 20 7d 0a 20 20 72 65 74 75 72 6e 20 57 52 43 5f   }.  return WRC_
2cca0 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a  Continue;.}../*.
2ccb0 2a 2a 20 4e 6f 2d 6f 70 20 72 6f 75 74 69 6e 65  ** No-op routine
2ccc0 20 66 6f 72 20 74 68 65 20 70 61 72 73 65 2d 74   for the parse-t
2ccd0 72 65 65 20 77 61 6c 6b 65 72 2e 0a 2a 2a 0a 2a  ree walker..**.*
2cce0 2a 20 57 68 65 6e 20 74 68 69 73 20 72 6f 75 74  * When this rout
2ccf0 69 6e 65 20 69 73 20 74 68 65 20 57 61 6c 6b 65  ine is the Walke
2cd00 72 2e 78 45 78 70 72 43 61 6c 6c 62 61 63 6b 20  r.xExprCallback 
2cd10 74 68 65 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  then expression 
2cd20 74 72 65 65 73 0a 2a 2a 20 61 72 65 20 77 61 6c  trees.** are wal
2cd30 6b 65 64 20 77 69 74 68 6f 75 74 20 61 6e 79 20  ked without any 
2cd40 61 63 74 69 6f 6e 73 20 62 65 69 6e 67 20 74 61  actions being ta
2cd50 6b 65 6e 20 61 74 20 65 61 63 68 20 6e 6f 64 65  ken at each node
2cd60 2e 20 20 50 72 65 73 75 6d 61 62 6c 79 2c 0a 2a  .  Presumably,.*
2cd70 2a 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74  * when this rout
2cd80 69 6e 65 20 69 73 20 75 73 65 64 20 66 6f 72 20  ine is used for 
2cd90 57 61 6c 6b 65 72 2e 78 45 78 70 72 43 61 6c 6c  Walker.xExprCall
2cda0 62 61 63 6b 20 74 68 65 6e 20 0a 2a 2a 20 57 61  back then .** Wa
2cdb0 6c 6b 65 72 2e 78 53 65 6c 65 63 74 43 61 6c 6c  lker.xSelectCall
2cdc0 62 61 63 6b 20 69 73 20 73 65 74 20 74 6f 20 64  back is set to d
2cdd0 6f 20 73 6f 6d 65 74 68 69 6e 67 20 75 73 65 66  o something usef
2cde0 75 6c 20 66 6f 72 20 65 76 65 72 79 20 0a 2a 2a  ul for every .**
2cdf0 20 73 75 62 71 75 65 72 79 20 69 6e 20 74 68 65   subquery in the
2ce00 20 70 61 72 73 65 72 20 74 72 65 65 2e 0a 2a 2f   parser tree..*/
2ce10 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72  .int sqlite3Expr
2ce20 57 61 6c 6b 4e 6f 6f 70 28 57 61 6c 6b 65 72 20  WalkNoop(Walker 
2ce30 2a 4e 6f 74 55 73 65 64 2c 20 45 78 70 72 20 2a  *NotUsed, Expr *
2ce40 4e 6f 74 55 73 65 64 32 29 7b 0a 20 20 55 4e 55  NotUsed2){.  UNU
2ce50 53 45 44 5f 50 41 52 41 4d 45 54 45 52 32 28 4e  SED_PARAMETER2(N
2ce60 6f 74 55 73 65 64 2c 20 4e 6f 74 55 73 65 64 32  otUsed, NotUsed2
2ce70 29 3b 0a 20 20 72 65 74 75 72 6e 20 57 52 43 5f  );.  return WRC_
2ce80 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a  Continue;.}../*.
2ce90 2a 2a 20 4e 6f 2d 6f 70 20 72 6f 75 74 69 6e 65  ** No-op routine
2cea0 20 66 6f 72 20 74 68 65 20 70 61 72 73 65 2d 74   for the parse-t
2ceb0 72 65 65 20 77 61 6c 6b 65 72 20 66 6f 72 20 53  ree walker for S
2cec0 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73  ELECT statements
2ced0 2e 0a 2a 2a 20 73 75 62 71 75 65 72 79 20 69 6e  ..** subquery in
2cee0 20 74 68 65 20 70 61 72 73 65 72 20 74 72 65 65   the parser tree
2cef0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
2cf00 53 65 6c 65 63 74 57 61 6c 6b 4e 6f 6f 70 28 57  SelectWalkNoop(W
2cf10 61 6c 6b 65 72 20 2a 4e 6f 74 55 73 65 64 2c 20  alker *NotUsed, 
2cf20 53 65 6c 65 63 74 20 2a 4e 6f 74 55 73 65 64 32  Select *NotUsed2
2cf30 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  ){.  UNUSED_PARA
2cf40 4d 45 54 45 52 32 28 4e 6f 74 55 73 65 64 2c 20  METER2(NotUsed, 
2cf50 4e 6f 74 55 73 65 64 32 29 3b 0a 20 20 72 65 74  NotUsed2);.  ret
2cf60 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65  urn WRC_Continue
2cf70 3b 0a 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f  ;.}..#if SQLITE_
2cf80 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 41 6c 77 61  DEBUG./*.** Alwa
2cf90 79 73 20 61 73 73 65 72 74 2e 20 20 54 68 69 73  ys assert.  This
2cfa0 20 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b   xSelectCallback
2cfb0 32 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  2 implementation
2cfc0 20 70 72 6f 76 65 73 20 74 68 61 74 20 74 68 65   proves that the
2cfd0 0a 2a 2a 20 78 53 65 6c 65 63 74 43 61 6c 6c 62  .** xSelectCallb
2cfe0 61 63 6b 32 20 69 73 20 6e 65 76 65 72 20 69 6e  ack2 is never in
2cff0 76 6f 6b 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73  voked..*/.void s
2d000 71 6c 69 74 65 33 53 65 6c 65 63 74 57 61 6c 6b  qlite3SelectWalk
2d010 41 73 73 65 72 74 32 28 57 61 6c 6b 65 72 20 2a  Assert2(Walker *
2d020 4e 6f 74 55 73 65 64 2c 20 53 65 6c 65 63 74 20  NotUsed, Select 
2d030 2a 4e 6f 74 55 73 65 64 32 29 7b 0a 20 20 55 4e  *NotUsed2){.  UN
2d040 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 32 28  USED_PARAMETER2(
2d050 4e 6f 74 55 73 65 64 2c 20 4e 6f 74 55 73 65 64  NotUsed, NotUsed
2d060 32 29 3b 0a 20 20 61 73 73 65 72 74 28 20 30 20  2);.  assert( 0 
2d070 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 2f 2a 0a 2a  );.}.#endif./*.*
2d080 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 22  * This routine "
2d090 65 78 70 61 6e 64 73 22 20 61 20 53 45 4c 45 43  expands" a SELEC
2d0a0 54 20 73 74 61 74 65 6d 65 6e 74 20 61 6e 64 20  T statement and 
2d0b0 61 6c 6c 20 6f 66 20 69 74 73 20 73 75 62 71 75  all of its subqu
2d0c0 65 72 69 65 73 2e 0a 2a 2a 20 46 6f 72 20 61 64  eries..** For ad
2d0d0 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61  ditional informa
2d0e0 74 69 6f 6e 20 6f 6e 20 77 68 61 74 20 69 74 20  tion on what it 
2d0f0 6d 65 61 6e 73 20 74 6f 20 22 65 78 70 61 6e 64  means to "expand
2d100 22 20 61 20 53 45 4c 45 43 54 0a 2a 2a 20 73 74  " a SELECT.** st
2d110 61 74 65 6d 65 6e 74 2c 20 73 65 65 20 74 68 65  atement, see the
2d120 20 63 6f 6d 6d 65 6e 74 20 6f 6e 20 74 68 65 20   comment on the 
2d130 73 65 6c 65 63 74 45 78 70 61 6e 64 20 77 6f 72  selectExpand wor
2d140 6b 65 72 20 63 61 6c 6c 62 61 63 6b 20 61 62 6f  ker callback abo
2d150 76 65 2e 0a 2a 2a 0a 2a 2a 20 45 78 70 61 6e 64  ve..**.** Expand
2d160 69 6e 67 20 61 20 53 45 4c 45 43 54 20 73 74 61  ing a SELECT sta
2d170 74 65 6d 65 6e 74 20 69 73 20 74 68 65 20 66 69  tement is the fi
2d180 72 73 74 20 73 74 65 70 20 69 6e 20 70 72 6f 63  rst step in proc
2d190 65 73 73 69 6e 67 20 61 0a 2a 2a 20 53 45 4c 45  essing a.** SELE
2d1a0 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 54  CT statement.  T
2d1b0 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  he SELECT statem
2d1c0 65 6e 74 20 6d 75 73 74 20 62 65 20 65 78 70 61  ent must be expa
2d1d0 6e 64 65 64 20 62 65 66 6f 72 65 0a 2a 2a 20 6e  nded before.** n
2d1e0 61 6d 65 20 72 65 73 6f 6c 75 74 69 6f 6e 20 69  ame resolution i
2d1f0 73 20 70 65 72 66 6f 72 6d 65 64 2e 0a 2a 2a 0a  s performed..**.
2d200 2a 2a 20 49 66 20 61 6e 79 74 68 69 6e 67 20 67  ** If anything g
2d210 6f 65 73 20 77 72 6f 6e 67 2c 20 61 6e 20 65 72  oes wrong, an er
2d220 72 6f 72 20 6d 65 73 73 61 67 65 20 69 73 20 77  ror message is w
2d230 72 69 74 74 65 6e 20 69 6e 74 6f 20 70 50 61 72  ritten into pPar
2d240 73 65 2e 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 69  se..** The calli
2d250 6e 67 20 66 75 6e 63 74 69 6f 6e 20 63 61 6e 20  ng function can 
2d260 64 65 74 65 63 74 20 74 68 65 20 70 72 6f 62 6c  detect the probl
2d270 65 6d 20 62 79 20 6c 6f 6f 6b 69 6e 67 20 61 74  em by looking at
2d280 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 0a 2a 2a   pParse->nErr.**
2d290 20 61 6e 64 2f 6f 72 20 70 50 61 72 73 65 2d 3e   and/or pParse->
2d2a0 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
2d2b0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
2d2c0 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 45 78   sqlite3SelectEx
2d2d0 70 61 6e 64 28 50 61 72 73 65 20 2a 70 50 61 72  pand(Parse *pPar
2d2e0 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 53 65 6c  se, Select *pSel
2d2f0 65 63 74 29 7b 0a 20 20 57 61 6c 6b 65 72 20 77  ect){.  Walker w
2d300 3b 0a 20 20 77 2e 78 45 78 70 72 43 61 6c 6c 62  ;.  w.xExprCallb
2d310 61 63 6b 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ack = sqlite3Exp
2d320 72 57 61 6c 6b 4e 6f 6f 70 3b 0a 20 20 77 2e 70  rWalkNoop;.  w.p
2d330 50 61 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a  Parse = pParse;.
2d340 20 20 69 66 28 20 4f 4b 5f 49 46 5f 41 4c 57 41    if( OK_IF_ALWA
2d350 59 53 5f 54 52 55 45 28 70 50 61 72 73 65 2d 3e  YS_TRUE(pParse->
2d360 68 61 73 43 6f 6d 70 6f 75 6e 64 29 20 29 7b 0a  hasCompound) ){.
2d370 20 20 20 20 77 2e 78 53 65 6c 65 63 74 43 61 6c      w.xSelectCal
2d380 6c 62 61 63 6b 20 3d 20 63 6f 6e 76 65 72 74 43  lback = convertC
2d390 6f 6d 70 6f 75 6e 64 53 65 6c 65 63 74 54 6f 53  ompoundSelectToS
2d3a0 75 62 71 75 65 72 79 3b 0a 20 20 20 20 77 2e 78  ubquery;.    w.x
2d3b0 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 32 20  SelectCallback2 
2d3c0 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  = 0;.    sqlite3
2d3d0 57 61 6c 6b 53 65 6c 65 63 74 28 26 77 2c 20 70  WalkSelect(&w, p
2d3e0 53 65 6c 65 63 74 29 3b 0a 20 20 7d 0a 20 20 77  Select);.  }.  w
2d3f0 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b  .xSelectCallback
2d400 20 3d 20 73 65 6c 65 63 74 45 78 70 61 6e 64 65   = selectExpande
2d410 72 3b 0a 20 20 77 2e 78 53 65 6c 65 63 74 43 61  r;.  w.xSelectCa
2d420 6c 6c 62 61 63 6b 32 20 3d 20 73 65 6c 65 63 74  llback2 = select
2d430 50 6f 70 57 69 74 68 3b 0a 20 20 73 71 6c 69 74  PopWith;.  sqlit
2d440 65 33 57 61 6c 6b 53 65 6c 65 63 74 28 26 77 2c  e3WalkSelect(&w,
2d450 20 70 53 65 6c 65 63 74 29 3b 0a 7d 0a 0a 0a 23   pSelect);.}...#
2d460 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
2d470 49 54 5f 53 55 42 51 55 45 52 59 0a 2f 2a 0a 2a  IT_SUBQUERY./*.*
2d480 2a 20 54 68 69 73 20 69 73 20 61 20 57 61 6c 6b  * This is a Walk
2d490 65 72 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61  er.xSelectCallba
2d4a0 63 6b 20 63 61 6c 6c 62 61 63 6b 20 66 6f 72 20  ck callback for 
2d4b0 74 68 65 20 73 71 6c 69 74 65 33 53 65 6c 65 63  the sqlite3Selec
2d4c0 74 54 79 70 65 49 6e 66 6f 28 29 0a 2a 2a 20 69  tTypeInfo().** i
2d4d0 6e 74 65 72 66 61 63 65 2e 0a 2a 2a 0a 2a 2a 20  nterface..**.** 
2d4e0 46 6f 72 20 65 61 63 68 20 46 52 4f 4d 2d 63 6c  For each FROM-cl
2d4f0 61 75 73 65 20 73 75 62 71 75 65 72 79 2c 20 61  ause subquery, a
2d500 64 64 20 43 6f 6c 75 6d 6e 2e 7a 54 79 70 65 20  dd Column.zType 
2d510 61 6e 64 20 43 6f 6c 75 6d 6e 2e 7a 43 6f 6c 6c  and Column.zColl
2d520 0a 2a 2a 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  .** information 
2d530 74 6f 20 74 68 65 20 54 61 62 6c 65 20 73 74 72  to the Table str
2d540 75 63 74 75 72 65 20 74 68 61 74 20 72 65 70 72  ucture that repr
2d550 65 73 65 6e 74 73 20 74 68 65 20 72 65 73 75 6c  esents the resul
2d560 74 20 73 65 74 0a 2a 2a 20 6f 66 20 74 68 61 74  t set.** of that
2d570 20 73 75 62 71 75 65 72 79 2e 0a 2a 2a 0a 2a 2a   subquery..**.**
2d580 20 54 68 65 20 54 61 62 6c 65 20 73 74 72 75 63   The Table struc
2d590 74 75 72 65 20 74 68 61 74 20 72 65 70 72 65 73  ture that repres
2d5a0 65 6e 74 73 20 74 68 65 20 72 65 73 75 6c 74 20  ents the result 
2d5b0 73 65 74 20 77 61 73 20 63 6f 6e 73 74 72 75 63  set was construc
2d5c0 74 65 64 0a 2a 2a 20 62 79 20 73 65 6c 65 63 74  ted.** by select
2d5d0 45 78 70 61 6e 64 65 72 28 29 20 62 75 74 20 74  Expander() but t
2d5e0 68 65 20 74 79 70 65 20 61 6e 64 20 63 6f 6c 6c  he type and coll
2d5f0 61 74 69 6f 6e 20 69 6e 66 6f 72 6d 61 74 69 6f  ation informatio
2d600 6e 20 77 61 73 20 6f 6d 69 74 74 65 64 0a 2a 2a  n was omitted.**
2d610 20 61 74 20 74 68 61 74 20 70 6f 69 6e 74 20 62   at that point b
2d620 65 63 61 75 73 65 20 69 64 65 6e 74 69 66 69 65  ecause identifie
2d630 72 73 20 68 61 64 20 6e 6f 74 20 79 65 74 20 62  rs had not yet b
2d640 65 65 6e 20 72 65 73 6f 6c 76 65 64 2e 20 20 54  een resolved.  T
2d650 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 69  his.** routine i
2d660 73 20 63 61 6c 6c 65 64 20 61 66 74 65 72 20 69  s called after i
2d670 64 65 6e 74 69 66 69 65 72 20 72 65 73 6f 6c 75  dentifier resolu
2d680 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tion..*/.static 
2d690 76 6f 69 64 20 73 65 6c 65 63 74 41 64 64 53 75  void selectAddSu
2d6a0 62 71 75 65 72 79 54 79 70 65 49 6e 66 6f 28 57  bqueryTypeInfo(W
2d6b0 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20  alker *pWalker, 
2d6c0 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 50 61  Select *p){.  Pa
2d6d0 72 73 65 20 2a 70 50 61 72 73 65 3b 0a 20 20 69  rse *pParse;.  i
2d6e0 6e 74 20 69 3b 0a 20 20 53 72 63 4c 69 73 74 20  nt i;.  SrcList 
2d6f0 2a 70 54 61 62 4c 69 73 74 3b 0a 20 20 73 74 72  *pTabList;.  str
2d700 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
2d710 20 2a 70 46 72 6f 6d 3b 0a 0a 20 20 61 73 73 65   *pFrom;..  asse
2d720 72 74 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20  rt( p->selFlags 
2d730 26 20 53 46 5f 52 65 73 6f 6c 76 65 64 20 29 3b  & SF_Resolved );
2d740 0a 20 20 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61  .  if( p->selFla
2d750 67 73 20 26 20 53 46 5f 48 61 73 54 79 70 65 49  gs & SF_HasTypeI
2d760 6e 66 6f 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  nfo ) return;.  
2d770 70 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53  p->selFlags |= S
2d780 46 5f 48 61 73 54 79 70 65 49 6e 66 6f 3b 0a 20  F_HasTypeInfo;. 
2d790 20 70 50 61 72 73 65 20 3d 20 70 57 61 6c 6b 65   pParse = pWalke
2d7a0 72 2d 3e 70 50 61 72 73 65 3b 0a 20 20 70 54 61  r->pParse;.  pTa
2d7b0 62 4c 69 73 74 20 3d 20 70 2d 3e 70 53 72 63 3b  bList = p->pSrc;
2d7c0 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 46 72 6f  .  for(i=0, pFro
2d7d0 6d 3d 70 54 61 62 4c 69 73 74 2d 3e 61 3b 20 69  m=pTabList->a; i
2d7e0 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b  <pTabList->nSrc;
2d7f0 20 69 2b 2b 2c 20 70 46 72 6f 6d 2b 2b 29 7b 0a   i++, pFrom++){.
2d800 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20      Table *pTab 
2d810 3d 20 70 46 72 6f 6d 2d 3e 70 54 61 62 3b 0a 20  = pFrom->pTab;. 
2d820 20 20 20 61 73 73 65 72 74 28 20 70 54 61 62 21     assert( pTab!
2d830 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 28 70  =0 );.    if( (p
2d840 54 61 62 2d 3e 74 61 62 46 6c 61 67 73 20 26 20  Tab->tabFlags & 
2d850 54 46 5f 45 70 68 65 6d 65 72 61 6c 29 21 3d 30  TF_Ephemeral)!=0
2d860 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 20 73   ){.      /* A s
2d870 75 62 2d 71 75 65 72 79 20 69 6e 20 74 68 65 20  ub-query in the 
2d880 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 61  FROM clause of a
2d890 20 53 45 4c 45 43 54 20 2a 2f 0a 20 20 20 20 20   SELECT */.     
2d8a0 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 20 3d 20   Select *pSel = 
2d8b0 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a  pFrom->pSelect;.
2d8c0 20 20 20 20 20 20 69 66 28 20 70 53 65 6c 20 29        if( pSel )
2d8d0 7b 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65 28  {.        while(
2d8e0 20 70 53 65 6c 2d 3e 70 50 72 69 6f 72 20 29 20   pSel->pPrior ) 
2d8f0 70 53 65 6c 20 3d 20 70 53 65 6c 2d 3e 70 50 72  pSel = pSel->pPr
2d900 69 6f 72 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  ior;.        sql
2d910 69 74 65 33 53 65 6c 65 63 74 41 64 64 43 6f 6c  ite3SelectAddCol
2d920 75 6d 6e 54 79 70 65 41 6e 64 43 6f 6c 6c 61 74  umnTypeAndCollat
2d930 69 6f 6e 28 70 50 61 72 73 65 2c 20 70 54 61 62  ion(pParse, pTab
2d940 2c 20 70 53 65 6c 29 3b 0a 20 20 20 20 20 20 7d  , pSel);.      }
2d950 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e  .    }.  }.}.#en
2d960 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  dif.../*.** This
2d970 20 72 6f 75 74 69 6e 65 20 61 64 64 73 20 64 61   routine adds da
2d980 74 61 74 79 70 65 20 61 6e 64 20 63 6f 6c 6c 61  tatype and colla
2d990 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 69 6e  ting sequence in
2d9a0 66 6f 72 6d 61 74 69 6f 6e 20 74 6f 0a 2a 2a 20  formation to.** 
2d9b0 74 68 65 20 54 61 62 6c 65 20 73 74 72 75 63 74  the Table struct
2d9c0 75 72 65 73 20 6f 66 20 61 6c 6c 20 46 52 4f 4d  ures of all FROM
2d9d0 2d 63 6c 61 75 73 65 20 73 75 62 71 75 65 72 69  -clause subqueri
2d9e0 65 73 20 69 6e 20 61 0a 2a 2a 20 53 45 4c 45 43  es in a.** SELEC
2d9f0 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a  T statement..**.
2da00 2a 2a 20 55 73 65 20 74 68 69 73 20 72 6f 75 74  ** Use this rout
2da10 69 6e 65 20 61 66 74 65 72 20 6e 61 6d 65 20 72  ine after name r
2da20 65 73 6f 6c 75 74 69 6f 6e 2e 0a 2a 2f 0a 73 74  esolution..*/.st
2da30 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65  atic void sqlite
2da40 33 53 65 6c 65 63 74 41 64 64 54 79 70 65 49 6e  3SelectAddTypeIn
2da50 66 6f 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  fo(Parse *pParse
2da60 2c 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63  , Select *pSelec
2da70 74 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  t){.#ifndef SQLI
2da80 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
2da90 0a 20 20 57 61 6c 6b 65 72 20 77 3b 0a 20 20 77  .  Walker w;.  w
2daa0 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b  .xSelectCallback
2dab0 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74   = sqlite3Select
2dac0 57 61 6c 6b 4e 6f 6f 70 3b 0a 20 20 77 2e 78 53  WalkNoop;.  w.xS
2dad0 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 32 20 3d  electCallback2 =
2dae0 20 73 65 6c 65 63 74 41 64 64 53 75 62 71 75 65   selectAddSubque
2daf0 72 79 54 79 70 65 49 6e 66 6f 3b 0a 20 20 77 2e  ryTypeInfo;.  w.
2db00 78 45 78 70 72 43 61 6c 6c 62 61 63 6b 20 3d 20  xExprCallback = 
2db10 73 71 6c 69 74 65 33 45 78 70 72 57 61 6c 6b 4e  sqlite3ExprWalkN
2db20 6f 6f 70 3b 0a 20 20 77 2e 70 50 61 72 73 65 20  oop;.  w.pParse 
2db30 3d 20 70 50 61 72 73 65 3b 0a 20 20 73 71 6c 69  = pParse;.  sqli
2db40 74 65 33 57 61 6c 6b 53 65 6c 65 63 74 28 26 77  te3WalkSelect(&w
2db50 2c 20 70 53 65 6c 65 63 74 29 3b 0a 23 65 6e 64  , pSelect);.#end
2db60 69 66 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  if.}.../*.** Thi
2db70 73 20 72 6f 75 74 69 6e 65 20 73 65 74 73 20 75  s routine sets u
2db80 70 20 61 20 53 45 4c 45 43 54 20 73 74 61 74 65  p a SELECT state
2db90 6d 65 6e 74 20 66 6f 72 20 70 72 6f 63 65 73 73  ment for process
2dba0 69 6e 67 2e 20 20 54 68 65 0a 2a 2a 20 66 6f 6c  ing.  The.** fol
2dbb0 6c 6f 77 69 6e 67 20 69 73 20 61 63 63 6f 6d 70  lowing is accomp
2dbc0 6c 69 73 68 65 64 3a 0a 2a 2a 0a 2a 2a 20 20 20  lished:.**.**   
2dbd0 20 20 2a 20 20 56 44 42 45 20 43 75 72 73 6f 72    *  VDBE Cursor
2dbe0 20 6e 75 6d 62 65 72 73 20 61 72 65 20 61 73 73   numbers are ass
2dbf0 69 67 6e 65 64 20 74 6f 20 61 6c 6c 20 46 52 4f  igned to all FRO
2dc00 4d 2d 63 6c 61 75 73 65 20 74 65 72 6d 73 2e 0a  M-clause terms..
2dc10 2a 2a 20 20 20 20 20 2a 20 20 45 70 68 65 6d 65  **     *  Epheme
2dc20 72 61 6c 20 54 61 62 6c 65 20 6f 62 6a 65 63 74  ral Table object
2dc30 73 20 61 72 65 20 63 72 65 61 74 65 64 20 66 6f  s are created fo
2dc40 72 20 61 6c 6c 20 46 52 4f 4d 2d 63 6c 61 75 73  r all FROM-claus
2dc50 65 20 73 75 62 71 75 65 72 69 65 73 2e 0a 2a 2a  e subqueries..**
2dc60 20 20 20 20 20 2a 20 20 4f 4e 20 61 6e 64 20 55       *  ON and U
2dc70 53 49 4e 47 20 63 6c 61 75 73 65 73 20 61 72 65  SING clauses are
2dc80 20 73 68 69 66 74 65 64 20 69 6e 74 6f 20 57 48   shifted into WH
2dc90 45 52 45 20 73 74 61 74 65 6d 65 6e 74 73 0a 2a  ERE statements.*
2dca0 2a 20 20 20 20 20 2a 20 20 57 69 6c 64 63 61 72  *     *  Wildcar
2dcb0 64 73 20 22 2a 22 20 61 6e 64 20 22 54 41 42 4c  ds "*" and "TABL
2dcc0 45 2e 2a 22 20 69 6e 20 72 65 73 75 6c 74 20 73  E.*" in result s
2dcd0 65 74 73 20 61 72 65 20 65 78 70 61 6e 64 65 64  ets are expanded
2dce0 2e 0a 2a 2a 20 20 20 20 20 2a 20 20 49 64 65 6e  ..**     *  Iden
2dcf0 74 69 66 69 65 72 73 20 69 6e 20 65 78 70 72 65  tifiers in expre
2dd00 73 73 69 6f 6e 20 61 72 65 20 6d 61 74 63 68 65  ssion are matche
2dd10 64 20 74 6f 20 74 61 62 6c 65 73 2e 0a 2a 2a 0a  d to tables..**.
2dd20 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
2dd30 61 63 74 73 20 72 65 63 75 72 73 69 76 65 6c 79  acts recursively
2dd40 20 6f 6e 20 61 6c 6c 20 73 75 62 71 75 65 72 69   on all subqueri
2dd50 65 73 20 77 69 74 68 69 6e 20 74 68 65 20 53 45  es within the SE
2dd60 4c 45 43 54 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  LECT..*/.void sq
2dd70 6c 69 74 65 33 53 65 6c 65 63 74 50 72 65 70 28  lite3SelectPrep(
2dd80 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
2dd90 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  ,         /* The
2dda0 20 70 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20   parser context 
2ddb0 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20  */.  Select *p, 
2ddc0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
2ddd0 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  he SELECT statem
2dde0 65 6e 74 20 62 65 69 6e 67 20 63 6f 64 65 64 2e  ent being coded.
2ddf0 20 2a 2f 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78   */.  NameContex
2de00 74 20 2a 70 4f 75 74 65 72 4e 43 20 20 2f 2a 20  t *pOuterNC  /* 
2de10 4e 61 6d 65 20 63 6f 6e 74 65 78 74 20 66 6f 72  Name context for
2de20 20 63 6f 6e 74 61 69 6e 65 72 20 2a 2f 0a 29 7b   container */.){
2de30 0a 20 20 61 73 73 65 72 74 28 20 70 21 3d 30 20  .  assert( p!=0 
2de40 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d  || pParse->db->m
2de50 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20  allocFailed );. 
2de60 20 69 66 28 20 70 50 61 72 73 65 2d 3e 64 62 2d   if( pParse->db-
2de70 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20  >mallocFailed ) 
2de80 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 70 2d  return;.  if( p-
2de90 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 48  >selFlags & SF_H
2dea0 61 73 54 79 70 65 49 6e 66 6f 20 29 20 72 65 74  asTypeInfo ) ret
2deb0 75 72 6e 3b 0a 20 20 73 71 6c 69 74 65 33 53 65  urn;.  sqlite3Se
2dec0 6c 65 63 74 45 78 70 61 6e 64 28 70 50 61 72 73  lectExpand(pPars
2ded0 65 2c 20 70 29 3b 0a 20 20 69 66 28 20 70 50 61  e, p);.  if( pPa
2dee0 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 70 50 61  rse->nErr || pPa
2def0 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  rse->db->mallocF
2df00 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a  ailed ) return;.
2df10 20 20 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65    sqlite3Resolve
2df20 53 65 6c 65 63 74 4e 61 6d 65 73 28 70 50 61 72  SelectNames(pPar
2df30 73 65 2c 20 70 2c 20 70 4f 75 74 65 72 4e 43 29  se, p, pOuterNC)
2df40 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  ;.  if( pParse->
2df50 6e 45 72 72 20 7c 7c 20 70 50 61 72 73 65 2d 3e  nErr || pParse->
2df60 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
2df70 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 73 71 6c   ) return;.  sql
2df80 69 74 65 33 53 65 6c 65 63 74 41 64 64 54 79 70  ite3SelectAddTyp
2df90 65 49 6e 66 6f 28 70 50 61 72 73 65 2c 20 70 29  eInfo(pParse, p)
2dfa0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 73 65 74  ;.}../*.** Reset
2dfb0 20 74 68 65 20 61 67 67 72 65 67 61 74 65 20 61   the aggregate a
2dfc0 63 63 75 6d 75 6c 61 74 6f 72 2e 0a 2a 2a 0a 2a  ccumulator..**.*
2dfd0 2a 20 54 68 65 20 61 67 67 72 65 67 61 74 65 20  * The aggregate 
2dfe0 61 63 63 75 6d 75 6c 61 74 6f 72 20 69 73 20 61  accumulator is a
2dff0 20 73 65 74 20 6f 66 20 6d 65 6d 6f 72 79 20 63   set of memory c
2e000 65 6c 6c 73 20 74 68 61 74 20 68 6f 6c 64 0a 2a  ells that hold.*
2e010 2a 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20 72  * intermediate r
2e020 65 73 75 6c 74 73 20 77 68 69 6c 65 20 63 61 6c  esults while cal
2e030 63 75 6c 61 74 69 6e 67 20 61 6e 20 61 67 67 72  culating an aggr
2e040 65 67 61 74 65 2e 20 20 54 68 69 73 0a 2a 2a 20  egate.  This.** 
2e050 72 6f 75 74 69 6e 65 20 67 65 6e 65 72 61 74 65  routine generate
2e060 73 20 63 6f 64 65 20 74 68 61 74 20 73 74 6f 72  s code that stor
2e070 65 73 20 4e 55 4c 4c 73 20 69 6e 20 61 6c 6c 20  es NULLs in all 
2e080 6f 66 20 74 68 6f 73 65 20 6d 65 6d 6f 72 79 0a  of those memory.
2e090 2a 2a 20 63 65 6c 6c 73 2e 0a 2a 2f 0a 73 74 61  ** cells..*/.sta
2e0a0 74 69 63 20 76 6f 69 64 20 72 65 73 65 74 41 63  tic void resetAc
2e0b0 63 75 6d 75 6c 61 74 6f 72 28 50 61 72 73 65 20  cumulator(Parse 
2e0c0 2a 70 50 61 72 73 65 2c 20 41 67 67 49 6e 66 6f  *pParse, AggInfo
2e0d0 20 2a 70 41 67 67 49 6e 66 6f 29 7b 0a 20 20 56   *pAggInfo){.  V
2e0e0 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
2e0f0 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b  >pVdbe;.  int i;
2e100 0a 20 20 73 74 72 75 63 74 20 41 67 67 49 6e 66  .  struct AggInf
2e110 6f 5f 66 75 6e 63 20 2a 70 46 75 6e 63 3b 0a 20  o_func *pFunc;. 
2e120 20 69 6e 74 20 6e 52 65 67 20 3d 20 70 41 67 67   int nReg = pAgg
2e130 49 6e 66 6f 2d 3e 6e 46 75 6e 63 20 2b 20 70 41  Info->nFunc + pA
2e140 67 67 49 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e 3b  ggInfo->nColumn;
2e150 0a 20 20 69 66 28 20 6e 52 65 67 3d 3d 30 20 29  .  if( nReg==0 )
2e160 20 72 65 74 75 72 6e 3b 0a 23 69 66 64 65 66 20   return;.#ifdef 
2e170 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 2f  SQLITE_DEBUG.  /
2e180 2a 20 56 65 72 69 66 79 20 74 68 61 74 20 61 6c  * Verify that al
2e190 6c 20 41 67 67 49 6e 66 6f 20 72 65 67 69 73 74  l AggInfo regist
2e1a0 65 72 73 20 61 72 65 20 77 69 74 68 69 6e 20 74  ers are within t
2e1b0 68 65 20 72 61 6e 67 65 20 73 70 65 63 69 66 69  he range specifi
2e1c0 65 64 20 62 79 0a 20 20 2a 2a 20 41 67 67 49 6e  ed by.  ** AggIn
2e1d0 66 6f 2e 6d 6e 52 65 67 2e 2e 41 67 67 49 6e 66  fo.mnReg..AggInf
2e1e0 6f 2e 6d 78 52 65 67 20 2a 2f 0a 20 20 61 73 73  o.mxReg */.  ass
2e1f0 65 72 74 28 20 6e 52 65 67 3d 3d 70 41 67 67 49  ert( nReg==pAggI
2e200 6e 66 6f 2d 3e 6d 78 52 65 67 2d 70 41 67 67 49  nfo->mxReg-pAggI
2e210 6e 66 6f 2d 3e 6d 6e 52 65 67 2b 31 20 29 3b 0a  nfo->mnReg+1 );.
2e220 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 41 67    for(i=0; i<pAg
2e230 67 49 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20  gInfo->nColumn; 
2e240 69 2b 2b 29 7b 0a 20 20 20 20 61 73 73 65 72 74  i++){.    assert
2e250 28 20 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c  ( pAggInfo->aCol
2e260 5b 69 5d 2e 69 4d 65 6d 3e 3d 70 41 67 67 49 6e  [i].iMem>=pAggIn
2e270 66 6f 2d 3e 6d 6e 52 65 67 0a 20 20 20 20 20 20  fo->mnReg.      
2e280 20 20 20 26 26 20 70 41 67 67 49 6e 66 6f 2d 3e     && pAggInfo->
2e290 61 43 6f 6c 5b 69 5d 2e 69 4d 65 6d 3c 3d 70 41  aCol[i].iMem<=pA
2e2a0 67 67 49 6e 66 6f 2d 3e 6d 78 52 65 67 20 29 3b  ggInfo->mxReg );
2e2b0 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20  .  }.  for(i=0; 
2e2c0 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e  i<pAggInfo->nFun
2e2d0 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 61 73 73  c; i++){.    ass
2e2e0 65 72 74 28 20 70 41 67 67 49 6e 66 6f 2d 3e 61  ert( pAggInfo->a
2e2f0 46 75 6e 63 5b 69 5d 2e 69 4d 65 6d 3e 3d 70 41  Func[i].iMem>=pA
2e300 67 67 49 6e 66 6f 2d 3e 6d 6e 52 65 67 0a 20 20  ggInfo->mnReg.  
2e310 20 20 20 20 20 20 20 26 26 20 70 41 67 67 49 6e         && pAggIn
2e320 66 6f 2d 3e 61 46 75 6e 63 5b 69 5d 2e 69 4d 65  fo->aFunc[i].iMe
2e330 6d 3c 3d 70 41 67 67 49 6e 66 6f 2d 3e 6d 78 52  m<=pAggInfo->mxR
2e340 65 67 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  eg );.  }.#endif
2e350 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
2e360 64 4f 70 33 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c  dOp3(v, OP_Null,
2e370 20 30 2c 20 70 41 67 67 49 6e 66 6f 2d 3e 6d 6e   0, pAggInfo->mn
2e380 52 65 67 2c 20 70 41 67 67 49 6e 66 6f 2d 3e 6d  Reg, pAggInfo->m
2e390 78 52 65 67 29 3b 0a 20 20 66 6f 72 28 70 46 75  xReg);.  for(pFu
2e3a0 6e 63 3d 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75  nc=pAggInfo->aFu
2e3b0 6e 63 2c 20 69 3d 30 3b 20 69 3c 70 41 67 67 49  nc, i=0; i<pAggI
2e3c0 6e 66 6f 2d 3e 6e 46 75 6e 63 3b 20 69 2b 2b 2c  nfo->nFunc; i++,
2e3d0 20 70 46 75 6e 63 2b 2b 29 7b 0a 20 20 20 20 69   pFunc++){.    i
2e3e0 66 28 20 70 46 75 6e 63 2d 3e 69 44 69 73 74 69  f( pFunc->iDisti
2e3f0 6e 63 74 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20  nct>=0 ){.      
2e400 45 78 70 72 20 2a 70 45 20 3d 20 70 46 75 6e 63  Expr *pE = pFunc
2e410 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 61  ->pExpr;.      a
2e420 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50  ssert( !ExprHasP
2e430 72 6f 70 65 72 74 79 28 70 45 2c 20 45 50 5f 78  roperty(pE, EP_x
2e440 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 20  IsSelect) );.   
2e450 20 20 20 69 66 28 20 70 45 2d 3e 78 2e 70 4c 69     if( pE->x.pLi
2e460 73 74 3d 3d 30 20 7c 7c 20 70 45 2d 3e 78 2e 70  st==0 || pE->x.p
2e470 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d 31 20 29  List->nExpr!=1 )
2e480 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
2e490 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
2e4a0 2c 20 22 44 49 53 54 49 4e 43 54 20 61 67 67 72  , "DISTINCT aggr
2e4b0 65 67 61 74 65 73 20 6d 75 73 74 20 68 61 76 65  egates must have
2e4c0 20 65 78 61 63 74 6c 79 20 6f 6e 65 20 22 0a 20   exactly one ". 
2e4d0 20 20 20 20 20 20 20 20 20 20 22 61 72 67 75 6d            "argum
2e4e0 65 6e 74 22 29 3b 0a 20 20 20 20 20 20 20 20 70  ent");.        p
2e4f0 46 75 6e 63 2d 3e 69 44 69 73 74 69 6e 63 74 20  Func->iDistinct 
2e500 3d 20 2d 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73  = -1;.      }els
2e510 65 7b 0a 20 20 20 20 20 20 20 20 4b 65 79 49 6e  e{.        KeyIn
2e520 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 20 3d 20 73  fo *pKeyInfo = s
2e530 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 46 72 6f  qlite3KeyInfoFro
2e540 6d 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65  mExprList(pParse
2e550 2c 20 70 45 2d 3e 78 2e 70 4c 69 73 74 2c 30 2c  , pE->x.pList,0,
2e560 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  0);.        sqli
2e570 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
2e580 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61   OP_OpenEphemera
2e590 6c 2c 20 70 46 75 6e 63 2d 3e 69 44 69 73 74 69  l, pFunc->iDisti
2e5a0 6e 63 74 2c 20 30 2c 20 30 2c 0a 20 20 20 20 20  nct, 0, 0,.     
2e5b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e5c0 20 20 20 20 20 28 63 68 61 72 2a 29 70 4b 65 79       (char*)pKey
2e5d0 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f  Info, P4_KEYINFO
2e5e0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
2e5f0 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e  .  }.}../*.** In
2e600 76 6f 6b 65 20 74 68 65 20 4f 50 5f 41 67 67 46  voke the OP_AggF
2e610 69 6e 61 6c 69 7a 65 20 6f 70 63 6f 64 65 20 66  inalize opcode f
2e620 6f 72 20 65 76 65 72 79 20 61 67 67 72 65 67 61  or every aggrega
2e630 74 65 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69  te function.** i
2e640 6e 20 74 68 65 20 41 67 67 49 6e 66 6f 20 73 74  n the AggInfo st
2e650 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 61 74  ructure..*/.stat
2e660 69 63 20 76 6f 69 64 20 66 69 6e 61 6c 69 7a 65  ic void finalize
2e670 41 67 67 46 75 6e 63 74 69 6f 6e 73 28 50 61 72  AggFunctions(Par
2e680 73 65 20 2a 70 50 61 72 73 65 2c 20 41 67 67 49  se *pParse, AggI
2e690 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f 29 7b 0a  nfo *pAggInfo){.
2e6a0 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
2e6b0 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74  se->pVdbe;.  int
2e6c0 20 69 3b 0a 20 20 73 74 72 75 63 74 20 41 67 67   i;.  struct Agg
2e6d0 49 6e 66 6f 5f 66 75 6e 63 20 2a 70 46 3b 0a 20  Info_func *pF;. 
2e6e0 20 66 6f 72 28 69 3d 30 2c 20 70 46 3d 70 41 67   for(i=0, pF=pAg
2e6f0 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 3b 20 69 3c  gInfo->aFunc; i<
2e700 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3b  pAggInfo->nFunc;
2e710 20 69 2b 2b 2c 20 70 46 2b 2b 29 7b 0a 20 20 20   i++, pF++){.   
2e720 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74   ExprList *pList
2e730 20 3d 20 70 46 2d 3e 70 45 78 70 72 2d 3e 78 2e   = pF->pExpr->x.
2e740 70 4c 69 73 74 3b 0a 20 20 20 20 61 73 73 65 72  pList;.    asser
2e750 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  t( !ExprHasPrope
2e760 72 74 79 28 70 46 2d 3e 70 45 78 70 72 2c 20 45  rty(pF->pExpr, E
2e770 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a  P_xIsSelect) );.
2e780 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
2e790 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41 67 67 46  ddOp2(v, OP_AggF
2e7a0 69 6e 61 6c 2c 20 70 46 2d 3e 69 4d 65 6d 2c 20  inal, pF->iMem, 
2e7b0 70 4c 69 73 74 20 3f 20 70 4c 69 73 74 2d 3e 6e  pList ? pList->n
2e7c0 45 78 70 72 20 3a 20 30 29 3b 0a 20 20 20 20 73  Expr : 0);.    s
2e7d0 71 6c 69 74 65 33 56 64 62 65 41 70 70 65 6e 64  qlite3VdbeAppend
2e7e0 50 34 28 76 2c 20 70 46 2d 3e 70 46 75 6e 63 2c  P4(v, pF->pFunc,
2e7f0 20 50 34 5f 46 55 4e 43 44 45 46 29 3b 0a 20 20   P4_FUNCDEF);.  
2e800 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 55 70 64 61  }.}.../*.** Upda
2e810 74 65 20 74 68 65 20 61 63 63 75 6d 75 6c 61 74  te the accumulat
2e820 6f 72 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20  or memory cells 
2e830 66 6f 72 20 61 6e 20 61 67 67 72 65 67 61 74 65  for an aggregate
2e840 20 62 61 73 65 64 20 6f 6e 0a 2a 2a 20 74 68 65   based on.** the
2e850 20 63 75 72 72 65 6e 74 20 63 75 72 73 6f 72 20   current cursor 
2e860 70 6f 73 69 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  position..**.** 
2e870 49 66 20 72 65 67 41 63 63 20 69 73 20 6e 6f 6e  If regAcc is non
2e880 2d 7a 65 72 6f 20 61 6e 64 20 74 68 65 72 65 20  -zero and there 
2e890 61 72 65 20 6e 6f 20 6d 69 6e 28 29 20 6f 72 20  are no min() or 
2e8a0 6d 61 78 28 29 20 61 67 67 72 65 67 61 74 65 73  max() aggregates
2e8b0 0a 2a 2a 20 69 6e 20 70 41 67 67 49 6e 66 6f 2c  .** in pAggInfo,
2e8c0 20 74 68 65 6e 20 6f 6e 6c 79 20 70 6f 70 75 6c   then only popul
2e8d0 61 74 65 20 74 68 65 20 70 41 67 67 49 6e 66 6f  ate the pAggInfo
2e8e0 2d 3e 6e 41 63 63 75 6d 75 6c 61 74 6f 72 20 61  ->nAccumulator a
2e8f0 63 63 75 6d 75 6c 61 74 6f 72 0a 2a 2a 20 72 65  ccumulator.** re
2e900 67 69 73 74 65 72 73 20 69 20 72 65 67 69 73 74  gisters i regist
2e910 65 72 20 72 65 67 41 63 63 20 63 6f 6e 74 61 69  er regAcc contai
2e920 6e 73 20 30 2e 20 54 68 65 20 63 61 6c 6c 65 72  ns 0. The caller
2e930 20 77 69 6c 6c 20 74 61 6b 65 20 63 61 72 65 0a   will take care.
2e940 2a 2a 20 6f 66 20 73 65 74 74 69 6e 67 20 61 6e  ** of setting an
2e950 64 20 63 6c 65 61 72 69 6e 67 20 72 65 67 41 63  d clearing regAc
2e960 63 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  c..*/.static voi
2e970 64 20 75 70 64 61 74 65 41 63 63 75 6d 75 6c 61  d updateAccumula
2e980 74 6f 72 28 50 61 72 73 65 20 2a 70 50 61 72 73  tor(Parse *pPars
2e990 65 2c 20 69 6e 74 20 72 65 67 41 63 63 2c 20 41  e, int regAcc, A
2e9a0 67 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f  ggInfo *pAggInfo
2e9b0 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  ){.  Vdbe *v = p
2e9c0 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
2e9d0 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 72 65 67  int i;.  int reg
2e9e0 48 69 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20 61  Hit = 0;.  int a
2e9f0 64 64 72 48 69 74 54 65 73 74 20 3d 20 30 3b 0a  ddrHitTest = 0;.
2ea00 20 20 73 74 72 75 63 74 20 41 67 67 49 6e 66 6f    struct AggInfo
2ea10 5f 66 75 6e 63 20 2a 70 46 3b 0a 20 20 73 74 72  _func *pF;.  str
2ea20 75 63 74 20 41 67 67 49 6e 66 6f 5f 63 6f 6c 20  uct AggInfo_col 
2ea30 2a 70 43 3b 0a 0a 20 20 70 41 67 67 49 6e 66 6f  *pC;..  pAggInfo
2ea40 2d 3e 64 69 72 65 63 74 4d 6f 64 65 20 3d 20 31  ->directMode = 1
2ea50 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 46 3d  ;.  for(i=0, pF=
2ea60 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 3b  pAggInfo->aFunc;
2ea70 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75   i<pAggInfo->nFu
2ea80 6e 63 3b 20 69 2b 2b 2c 20 70 46 2b 2b 29 7b 0a  nc; i++, pF++){.
2ea90 20 20 20 20 69 6e 74 20 6e 41 72 67 3b 0a 20 20      int nArg;.  
2eaa0 20 20 69 6e 74 20 61 64 64 72 4e 65 78 74 20 3d    int addrNext =
2eab0 20 30 3b 0a 20 20 20 20 69 6e 74 20 72 65 67 41   0;.    int regA
2eac0 67 67 3b 0a 20 20 20 20 45 78 70 72 4c 69 73 74  gg;.    ExprList
2ead0 20 2a 70 4c 69 73 74 20 3d 20 70 46 2d 3e 70 45   *pList = pF->pE
2eae0 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20  xpr->x.pList;.  
2eaf0 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48    assert( !ExprH
2eb00 61 73 50 72 6f 70 65 72 74 79 28 70 46 2d 3e 70  asProperty(pF->p
2eb10 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65  Expr, EP_xIsSele
2eb20 63 74 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70  ct) );.    if( p
2eb30 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20 6e 41  List ){.      nA
2eb40 72 67 20 3d 20 70 4c 69 73 74 2d 3e 6e 45 78 70  rg = pList->nExp
2eb50 72 3b 0a 20 20 20 20 20 20 72 65 67 41 67 67 20  r;.      regAgg 
2eb60 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
2eb70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 6e 41  Range(pParse, nA
2eb80 72 67 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  rg);.      sqlit
2eb90 65 33 45 78 70 72 43 6f 64 65 45 78 70 72 4c 69  e3ExprCodeExprLi
2eba0 73 74 28 70 50 61 72 73 65 2c 20 70 4c 69 73 74  st(pParse, pList
2ebb0 2c 20 72 65 67 41 67 67 2c 20 30 2c 20 53 51 4c  , regAgg, 0, SQL
2ebc0 49 54 45 5f 45 43 45 4c 5f 44 55 50 29 3b 0a 20  ITE_ECEL_DUP);. 
2ebd0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2ebe0 6e 41 72 67 20 3d 20 30 3b 0a 20 20 20 20 20 20  nArg = 0;.      
2ebf0 72 65 67 41 67 67 20 3d 20 30 3b 0a 20 20 20 20  regAgg = 0;.    
2ec00 7d 0a 20 20 20 20 69 66 28 20 70 46 2d 3e 69 44  }.    if( pF->iD
2ec10 69 73 74 69 6e 63 74 3e 3d 30 20 29 7b 0a 20 20  istinct>=0 ){.  
2ec20 20 20 20 20 61 64 64 72 4e 65 78 74 20 3d 20 73      addrNext = s
2ec30 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
2ec40 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 74 65  bel(v);.      te
2ec50 73 74 63 61 73 65 28 20 6e 41 72 67 3d 3d 30 20  stcase( nArg==0 
2ec60 29 3b 20 20 2f 2a 20 45 72 72 6f 72 20 63 6f 6e  );  /* Error con
2ec70 64 69 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20  dition */.      
2ec80 74 65 73 74 63 61 73 65 28 20 6e 41 72 67 3e 31  testcase( nArg>1
2ec90 20 29 3b 20 20 20 2f 2a 20 41 6c 73 6f 20 61 6e   );   /* Also an
2eca0 20 65 72 72 6f 72 20 2a 2f 0a 20 20 20 20 20 20   error */.      
2ecb0 63 6f 64 65 44 69 73 74 69 6e 63 74 28 70 50 61  codeDistinct(pPa
2ecc0 72 73 65 2c 20 70 46 2d 3e 69 44 69 73 74 69 6e  rse, pF->iDistin
2ecd0 63 74 2c 20 61 64 64 72 4e 65 78 74 2c 20 31 2c  ct, addrNext, 1,
2ece0 20 72 65 67 41 67 67 29 3b 0a 20 20 20 20 7d 0a   regAgg);.    }.
2ecf0 20 20 20 20 69 66 28 20 70 46 2d 3e 70 46 75 6e      if( pF->pFun
2ed00 63 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20 53  c->funcFlags & S
2ed10 51 4c 49 54 45 5f 46 55 4e 43 5f 4e 45 45 44 43  QLITE_FUNC_NEEDC
2ed20 4f 4c 4c 20 29 7b 0a 20 20 20 20 20 20 43 6f 6c  OLL ){.      Col
2ed30 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 30 3b  lSeq *pColl = 0;
2ed40 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 45 78  .      struct Ex
2ed50 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  prList_item *pIt
2ed60 65 6d 3b 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b  em;.      int j;
2ed70 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
2ed80 4c 69 73 74 21 3d 30 20 29 3b 20 20 2f 2a 20 70  List!=0 );  /* p
2ed90 4c 69 73 74 21 3d 30 20 69 66 20 70 46 2d 3e 70  List!=0 if pF->p
2eda0 46 75 6e 63 20 68 61 73 20 4e 45 45 44 43 4f 4c  Func has NEEDCOL
2edb0 4c 20 2a 2f 0a 20 20 20 20 20 20 66 6f 72 28 6a  L */.      for(j
2edc0 3d 30 2c 20 70 49 74 65 6d 3d 70 4c 69 73 74 2d  =0, pItem=pList-
2edd0 3e 61 3b 20 21 70 43 6f 6c 6c 20 26 26 20 6a 3c  >a; !pColl && j<
2ede0 6e 41 72 67 3b 20 6a 2b 2b 2c 20 70 49 74 65 6d  nArg; j++, pItem
2edf0 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 70 43 6f  ++){.        pCo
2ee00 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ll = sqlite3Expr
2ee10 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
2ee20 70 49 74 65 6d 2d 3e 70 45 78 70 72 29 3b 0a 20  pItem->pExpr);. 
2ee30 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
2ee40 20 21 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20   !pColl ){.     
2ee50 20 20 20 70 43 6f 6c 6c 20 3d 20 70 50 61 72 73     pColl = pPars
2ee60 65 2d 3e 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c  e->db->pDfltColl
2ee70 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
2ee80 69 66 28 20 72 65 67 48 69 74 3d 3d 30 20 26 26  if( regHit==0 &&
2ee90 20 70 41 67 67 49 6e 66 6f 2d 3e 6e 41 63 63 75   pAggInfo->nAccu
2eea0 6d 75 6c 61 74 6f 72 20 29 20 72 65 67 48 69 74  mulator ) regHit
2eeb0 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
2eec0 6d 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  m;.      sqlite3
2eed0 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
2eee0 5f 43 6f 6c 6c 53 65 71 2c 20 72 65 67 48 69 74  _CollSeq, regHit
2eef0 2c 20 30 2c 20 30 2c 20 28 63 68 61 72 20 2a 29  , 0, 0, (char *)
2ef00 70 43 6f 6c 6c 2c 20 50 34 5f 43 4f 4c 4c 53 45  pColl, P4_COLLSE
2ef10 51 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  Q);.    }.    sq
2ef20 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
2ef30 76 2c 20 4f 50 5f 41 67 67 53 74 65 70 2c 20 30  v, OP_AggStep, 0
2ef40 2c 20 72 65 67 41 67 67 2c 20 70 46 2d 3e 69 4d  , regAgg, pF->iM
2ef50 65 6d 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  em);.    sqlite3
2ef60 56 64 62 65 41 70 70 65 6e 64 50 34 28 76 2c 20  VdbeAppendP4(v, 
2ef70 70 46 2d 3e 70 46 75 6e 63 2c 20 50 34 5f 46 55  pF->pFunc, P4_FU
2ef80 4e 43 44 45 46 29 3b 0a 20 20 20 20 73 71 6c 69  NCDEF);.    sqli
2ef90 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28  te3VdbeChangeP5(
2efa0 76 2c 20 28 75 38 29 6e 41 72 67 29 3b 0a 20 20  v, (u8)nArg);.  
2efb0 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
2efc0 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65  TempRange(pParse
2efd0 2c 20 72 65 67 41 67 67 2c 20 6e 41 72 67 29 3b  , regAgg, nArg);
2efe0 0a 20 20 20 20 69 66 28 20 61 64 64 72 4e 65 78  .    if( addrNex
2eff0 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  t ){.      sqlit
2f000 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
2f010 65 6c 28 76 2c 20 61 64 64 72 4e 65 78 74 29 3b  el(v, addrNext);
2f020 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
2f030 20 72 65 67 48 69 74 3d 3d 30 20 26 26 20 70 41   regHit==0 && pA
2f040 67 67 49 6e 66 6f 2d 3e 6e 41 63 63 75 6d 75 6c  ggInfo->nAccumul
2f050 61 74 6f 72 20 29 7b 0a 20 20 20 20 72 65 67 48  ator ){.    regH
2f060 69 74 20 3d 20 72 65 67 41 63 63 3b 0a 20 20 7d  it = regAcc;.  }
2f070 0a 20 20 69 66 28 20 72 65 67 48 69 74 20 29 7b  .  if( regHit ){
2f080 0a 20 20 20 20 61 64 64 72 48 69 74 54 65 73 74  .    addrHitTest
2f090 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
2f0a0 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66 2c 20 72  dOp1(v, OP_If, r
2f0b0 65 67 48 69 74 29 3b 20 56 64 62 65 43 6f 76 65  egHit); VdbeCove
2f0c0 72 61 67 65 28 76 29 3b 0a 20 20 7d 0a 20 20 66  rage(v);.  }.  f
2f0d0 6f 72 28 69 3d 30 2c 20 70 43 3d 70 41 67 67 49  or(i=0, pC=pAggI
2f0e0 6e 66 6f 2d 3e 61 43 6f 6c 3b 20 69 3c 70 41 67  nfo->aCol; i<pAg
2f0f0 67 49 6e 66 6f 2d 3e 6e 41 63 63 75 6d 75 6c 61  gInfo->nAccumula
2f100 74 6f 72 3b 20 69 2b 2b 2c 20 70 43 2b 2b 29 7b  tor; i++, pC++){
2f110 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
2f120 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 43 2d  Code(pParse, pC-
2f130 3e 70 45 78 70 72 2c 20 70 43 2d 3e 69 4d 65 6d  >pExpr, pC->iMem
2f140 29 3b 0a 20 20 7d 0a 20 20 70 41 67 67 49 6e 66  );.  }.  pAggInf
2f150 6f 2d 3e 64 69 72 65 63 74 4d 6f 64 65 20 3d 20  o->directMode = 
2f160 30 3b 0a 20 20 69 66 28 20 61 64 64 72 48 69 74  0;.  if( addrHit
2f170 54 65 73 74 20 29 7b 0a 20 20 20 20 73 71 6c 69  Test ){.    sqli
2f180 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
2f190 76 2c 20 61 64 64 72 48 69 74 54 65 73 74 29 3b  v, addrHitTest);
2f1a0 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64  .  }.}../*.** Ad
2f1b0 64 20 61 20 73 69 6e 67 6c 65 20 4f 50 5f 45 78  d a single OP_Ex
2f1c0 70 6c 61 69 6e 20 69 6e 73 74 72 75 63 74 69 6f  plain instructio
2f1d0 6e 20 74 6f 20 74 68 65 20 56 44 42 45 20 74 6f  n to the VDBE to
2f1e0 20 65 78 70 6c 61 69 6e 20 61 20 73 69 6d 70 6c   explain a simpl
2f1f0 65 0a 2a 2a 20 63 6f 75 6e 74 28 2a 29 20 71 75  e.** count(*) qu
2f200 65 72 79 20 28 22 53 45 4c 45 43 54 20 63 6f 75  ery ("SELECT cou
2f210 6e 74 28 2a 29 20 46 52 4f 4d 20 70 54 61 62 22  nt(*) FROM pTab"
2f220 29 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  )..*/.#ifndef SQ
2f230 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49  LITE_OMIT_EXPLAI
2f240 4e 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65 78  N.static void ex
2f250 70 6c 61 69 6e 53 69 6d 70 6c 65 43 6f 75 6e 74  plainSimpleCount
2f260 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
2f270 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
2f280 20 20 20 20 2f 2a 20 50 61 72 73 65 20 63 6f 6e      /* Parse con
2f290 74 65 78 74 20 2a 2f 0a 20 20 54 61 62 6c 65 20  text */.  Table 
2f2a0 2a 70 54 61 62 2c 20 20 20 20 20 20 20 20 20 20  *pTab,          
2f2b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62            /* Tab
2f2c0 6c 65 20 62 65 69 6e 67 20 71 75 65 72 69 65 64  le being queried
2f2d0 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 64   */.  Index *pId
2f2e0 78 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  x               
2f2f0 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 75        /* Index u
2f300 73 65 64 20 74 6f 20 6f 70 74 69 6d 69 7a 65 20  sed to optimize 
2f310 73 63 61 6e 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f  scan, or NULL */
2f320 0a 29 7b 0a 20 20 69 66 28 20 70 50 61 72 73 65  .){.  if( pParse
2f330 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32 20 29 7b 0a  ->explain==2 ){.
2f340 20 20 20 20 69 6e 74 20 62 43 6f 76 65 72 20 3d      int bCover =
2f350 20 28 70 49 64 78 21 3d 30 20 26 26 20 28 48 61   (pIdx!=0 && (Ha
2f360 73 52 6f 77 69 64 28 70 54 61 62 29 20 7c 7c 20  sRowid(pTab) || 
2f370 21 49 73 50 72 69 6d 61 72 79 4b 65 79 49 6e 64  !IsPrimaryKeyInd
2f380 65 78 28 70 49 64 78 29 29 29 3b 0a 20 20 20 20  ex(pIdx)));.    
2f390 73 71 6c 69 74 65 33 56 64 62 65 45 78 70 6c 61  sqlite3VdbeExpla
2f3a0 69 6e 28 70 50 61 72 73 65 2c 20 30 2c 20 22 53  in(pParse, 0, "S
2f3b0 43 41 4e 20 54 41 42 4c 45 20 25 73 25 73 25 73  CAN TABLE %s%s%s
2f3c0 22 2c 0a 20 20 20 20 20 20 20 20 70 54 61 62 2d  ",.        pTab-
2f3d0 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20  >zName,.        
2f3e0 62 43 6f 76 65 72 20 3f 20 22 20 55 53 49 4e 47  bCover ? " USING
2f3f0 20 43 4f 56 45 52 49 4e 47 20 49 4e 44 45 58 20   COVERING INDEX 
2f400 22 20 3a 20 22 22 2c 0a 20 20 20 20 20 20 20 20  " : "",.        
2f410 62 43 6f 76 65 72 20 3f 20 70 49 64 78 2d 3e 7a  bCover ? pIdx->z
2f420 4e 61 6d 65 20 3a 20 22 22 0a 20 20 20 20 29 3b  Name : "".    );
2f430 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23 20 64  .  }.}.#else.# d
2f440 65 66 69 6e 65 20 65 78 70 6c 61 69 6e 53 69 6d  efine explainSim
2f450 70 6c 65 43 6f 75 6e 74 28 61 2c 62 2c 63 29 0a  pleCount(a,b,c).
2f460 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 73 71  #endif../*.** sq
2f470 6c 69 74 65 33 57 61 6c 6b 45 78 70 72 28 29 20  lite3WalkExpr() 
2f480 63 61 6c 6c 62 61 63 6b 20 75 73 65 64 20 62 79  callback used by
2f490 20 68 61 76 69 6e 67 54 6f 57 68 65 72 65 28 29   havingToWhere()
2f4a0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6e  ..**.** If the n
2f4b0 6f 64 65 20 70 61 73 73 65 64 20 74 6f 20 74 68  ode passed to th
2f4c0 65 20 63 61 6c 6c 62 61 63 6b 20 69 73 20 61 20  e callback is a 
2f4d0 54 4b 5f 41 4e 44 20 6e 6f 64 65 2c 20 72 65 74  TK_AND node, ret
2f4e0 75 72 6e 20 0a 2a 2a 20 57 52 43 5f 43 6f 6e 74  urn .** WRC_Cont
2f4f0 69 6e 75 65 20 74 6f 20 74 65 6c 6c 20 73 71 6c  inue to tell sql
2f500 69 74 65 33 57 61 6c 6b 45 78 70 72 28 29 20 74  ite3WalkExpr() t
2f510 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f 75 67  o iterate throug
2f520 68 20 63 68 69 6c 64 20 6e 6f 64 65 73 2e 0a 2a  h child nodes..*
2f530 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20  *.** Otherwise, 
2f540 72 65 74 75 72 6e 20 57 52 43 5f 50 72 75 6e 65  return WRC_Prune
2f550 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20  . In this case, 
2f560 61 6c 73 6f 20 63 68 65 63 6b 20 69 66 20 74 68  also check if th
2f570 65 20 0a 2a 2a 20 73 75 62 2d 65 78 70 72 65 73  e .** sub-expres
2f580 73 69 6f 6e 20 6d 61 74 63 68 65 73 20 74 68 65  sion matches the
2f590 20 63 72 69 74 65 72 69 61 20 66 6f 72 20 62 65   criteria for be
2f5a0 69 6e 67 20 6d 6f 76 65 64 20 74 6f 20 74 68 65  ing moved to the
2f5b0 20 57 48 45 52 45 0a 2a 2a 20 63 6c 61 75 73 65   WHERE.** clause
2f5c0 2e 20 49 66 20 73 6f 2c 20 61 64 64 20 69 74 20  . If so, add it 
2f5d0 74 6f 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  to the WHERE cla
2f5e0 75 73 65 20 61 6e 64 20 72 65 70 6c 61 63 65 20  use and replace 
2f5f0 74 68 65 20 73 75 62 2d 65 78 70 72 65 73 73 69  the sub-expressi
2f600 6f 6e 0a 2a 2a 20 77 69 74 68 69 6e 20 74 68 65  on.** within the
2f610 20 48 41 56 49 4e 47 20 65 78 70 72 65 73 73 69   HAVING expressi
2f620 6f 6e 20 77 69 74 68 20 61 20 63 6f 6e 73 74 61  on with a consta
2f630 6e 74 20 22 31 22 2e 0a 2a 2f 0a 73 74 61 74 69  nt "1"..*/.stati
2f640 63 20 69 6e 74 20 68 61 76 69 6e 67 54 6f 57 68  c int havingToWh
2f650 65 72 65 45 78 70 72 43 62 28 57 61 6c 6b 65 72  ereExprCb(Walker
2f660 20 2a 70 57 61 6c 6b 65 72 2c 20 45 78 70 72 20   *pWalker, Expr 
2f670 2a 70 45 78 70 72 29 7b 0a 20 20 69 66 28 20 70  *pExpr){.  if( p
2f680 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 41 4e 44  Expr->op!=TK_AND
2f690 20 29 7b 0a 20 20 20 20 53 65 6c 65 63 74 20 2a   ){.    Select *
2f6a0 70 53 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 75 2e  pS = pWalker->u.
2f6b0 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 69 66 28  pSelect;.    if(
2f6c0 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f   sqlite3ExprIsCo
2f6d0 6e 73 74 61 6e 74 4f 72 47 72 6f 75 70 42 79 28  nstantOrGroupBy(
2f6e0 70 57 61 6c 6b 65 72 2d 3e 70 50 61 72 73 65 2c  pWalker->pParse,
2f6f0 20 70 45 78 70 72 2c 20 70 53 2d 3e 70 47 72 6f   pExpr, pS->pGro
2f700 75 70 42 79 29 20 29 7b 0a 20 20 20 20 20 20 73  upBy) ){.      s
2f710 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 57 61  qlite3 *db = pWa
2f720 6c 6b 65 72 2d 3e 70 50 61 72 73 65 2d 3e 64 62  lker->pParse->db
2f730 3b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 4e  ;.      Expr *pN
2f740 65 77 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ew = sqlite3Expr
2f750 41 6c 6c 6f 63 28 64 62 2c 20 54 4b 5f 49 4e 54  Alloc(db, TK_INT
2f760 45 47 45 52 2c 20 26 73 71 6c 69 74 65 33 49 6e  EGER, &sqlite3In
2f770 74 54 6f 6b 65 6e 73 5b 31 5d 2c 20 30 29 3b 0a  tTokens[1], 0);.
2f780 20 20 20 20 20 20 69 66 28 20 70 4e 65 77 20 29        if( pNew )
2f790 7b 0a 20 20 20 20 20 20 20 20 45 78 70 72 20 2a  {.        Expr *
2f7a0 70 57 68 65 72 65 20 3d 20 70 53 2d 3e 70 57 68  pWhere = pS->pWh
2f7b0 65 72 65 3b 0a 20 20 20 20 20 20 20 20 53 57 41  ere;.        SWA
2f7c0 50 28 45 78 70 72 2c 20 2a 70 4e 65 77 2c 20 2a  P(Expr, *pNew, *
2f7d0 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20  pExpr);.        
2f7e0 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 45 78  pNew = sqlite3Ex
2f7f0 70 72 41 6e 64 28 64 62 2c 20 70 57 68 65 72 65  prAnd(db, pWhere
2f800 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20 20 20 20  , pNew);.       
2f810 20 70 53 2d 3e 70 57 68 65 72 65 20 3d 20 70 4e   pS->pWhere = pN
2f820 65 77 3b 0a 20 20 20 20 20 20 20 20 70 57 61 6c  ew;.        pWal
2f830 6b 65 72 2d 3e 65 43 6f 64 65 20 3d 20 31 3b 0a  ker->eCode = 1;.
2f840 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
2f850 20 20 72 65 74 75 72 6e 20 57 52 43 5f 50 72 75    return WRC_Pru
2f860 6e 65 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ne;.  }.  return
2f870 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d   WRC_Continue;.}
2f880 0a 0a 2f 2a 0a 2a 2a 20 54 72 61 6e 73 66 65 72  ../*.** Transfer
2f890 20 65 6c 69 67 69 62 6c 65 20 74 65 72 6d 73 20   eligible terms 
2f8a0 66 72 6f 6d 20 74 68 65 20 48 41 56 49 4e 47 20  from the HAVING 
2f8b0 63 6c 61 75 73 65 20 6f 66 20 61 20 71 75 65 72  clause of a quer
2f8c0 79 2c 20 77 68 69 63 68 20 69 73 0a 2a 2a 20 70  y, which is.** p
2f8d0 72 6f 63 65 73 73 65 64 20 61 66 74 65 72 20 67  rocessed after g
2f8e0 72 6f 75 70 69 6e 67 2c 20 74 6f 20 74 68 65 20  rouping, to the 
2f8f0 57 48 45 52 45 20 63 6c 61 75 73 65 2c 20 77 68  WHERE clause, wh
2f900 69 63 68 20 69 73 20 70 72 6f 63 65 73 73 65 64  ich is processed
2f910 20 62 65 66 6f 72 65 0a 2a 2a 20 67 72 6f 75 70   before.** group
2f920 69 6e 67 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65  ing. For example
2f930 2c 20 74 68 65 20 71 75 65 72 79 3a 0a 2a 2a 0a  , the query:.**.
2f940 2a 2a 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52  **   SELECT * FR
2f950 4f 4d 20 3c 74 61 62 6c 65 73 3e 20 57 48 45 52  OM <tables> WHER
2f960 45 20 61 3d 3f 20 47 52 4f 55 50 20 42 59 20 62  E a=? GROUP BY b
2f970 20 48 41 56 49 4e 47 20 62 3d 3f 20 41 4e 44 20   HAVING b=? AND 
2f980 63 3d 3f 0a 2a 2a 0a 2a 2a 20 63 61 6e 20 62 65  c=?.**.** can be
2f990 20 72 65 77 72 69 74 74 65 6e 20 61 73 3a 0a 2a   rewritten as:.*
2f9a0 2a 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20 2a 20  *.**   SELECT * 
2f9b0 46 52 4f 4d 20 3c 74 61 62 6c 65 73 3e 20 57 48  FROM <tables> WH
2f9c0 45 52 45 20 61 3d 3f 20 41 4e 44 20 62 3d 3f 20  ERE a=? AND b=? 
2f9d0 47 52 4f 55 50 20 42 59 20 62 20 48 41 56 49 4e  GROUP BY b HAVIN
2f9e0 47 20 63 3d 3f 0a 2a 2a 0a 2a 2a 20 41 20 74 65  G c=?.**.** A te
2f9f0 72 6d 20 6f 66 20 74 68 65 20 48 41 56 49 4e 47  rm of the HAVING
2fa00 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 65   expression is e
2fa10 6c 69 67 69 62 6c 65 20 66 6f 72 20 74 72 61 6e  ligible for tran
2fa20 73 66 65 72 20 69 66 20 69 74 20 63 6f 6e 73 69  sfer if it consi
2fa30 73 74 73 0a 2a 2a 20 65 6e 74 69 72 65 6c 79 20  sts.** entirely 
2fa40 6f 66 20 63 6f 6e 73 74 61 6e 74 73 20 61 6e 64  of constants and
2fa50 20 65 78 70 72 65 73 73 69 6f 6e 73 20 74 68 61   expressions tha
2fa60 74 20 61 72 65 20 61 6c 73 6f 20 47 52 4f 55 50  t are also GROUP
2fa70 20 42 59 20 74 65 72 6d 73 20 74 68 61 74 0a 2a   BY terms that.*
2fa80 2a 20 75 73 65 20 74 68 65 20 22 42 49 4e 41 52  * use the "BINAR
2fa90 59 22 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71  Y" collation seq
2faa0 75 65 6e 63 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  uence..*/.static
2fab0 20 76 6f 69 64 20 68 61 76 69 6e 67 54 6f 57 68   void havingToWh
2fac0 65 72 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  ere(Parse *pPars
2fad0 65 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20  e, Select *p){. 
2fae0 20 57 61 6c 6b 65 72 20 73 57 61 6c 6b 65 72 3b   Walker sWalker;
2faf0 0a 20 20 6d 65 6d 73 65 74 28 26 73 57 61 6c 6b  .  memset(&sWalk
2fb00 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 57  er, 0, sizeof(sW
2fb10 61 6c 6b 65 72 29 29 3b 0a 20 20 73 57 61 6c 6b  alker));.  sWalk
2fb20 65 72 2e 70 50 61 72 73 65 20 3d 20 70 50 61 72  er.pParse = pPar
2fb30 73 65 3b 0a 20 20 73 57 61 6c 6b 65 72 2e 78 45  se;.  sWalker.xE
2fb40 78 70 72 43 61 6c 6c 62 61 63 6b 20 3d 20 68 61  xprCallback = ha
2fb50 76 69 6e 67 54 6f 57 68 65 72 65 45 78 70 72 43  vingToWhereExprC
2fb60 62 3b 0a 20 20 73 57 61 6c 6b 65 72 2e 75 2e 70  b;.  sWalker.u.p
2fb70 53 65 6c 65 63 74 20 3d 20 70 3b 0a 20 20 73 71  Select = p;.  sq
2fb80 6c 69 74 65 33 57 61 6c 6b 45 78 70 72 28 26 73  lite3WalkExpr(&s
2fb90 57 61 6c 6b 65 72 2c 20 70 2d 3e 70 48 61 76 69  Walker, p->pHavi
2fba0 6e 67 29 3b 0a 23 69 66 20 53 45 4c 45 43 54 54  ng);.#if SELECTT
2fbb0 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20 69  RACE_ENABLED.  i
2fbc0 66 28 20 73 57 61 6c 6b 65 72 2e 65 43 6f 64 65  f( sWalker.eCode
2fbd0 20 26 26 20 28 73 71 6c 69 74 65 33 53 65 6c 65   && (sqlite3Sele
2fbe0 63 74 54 72 61 63 65 20 26 20 30 78 31 30 30 29  ctTrace & 0x100)
2fbf0 21 3d 30 20 29 7b 0a 20 20 20 20 53 45 4c 45 43  !=0 ){.    SELEC
2fc00 54 54 52 41 43 45 28 30 78 31 30 30 2c 70 50 61  TTRACE(0x100,pPa
2fc10 72 73 65 2c 70 2c 28 22 4d 6f 76 65 20 48 41 56  rse,p,("Move HAV
2fc20 49 4e 47 20 74 65 72 6d 73 20 69 6e 74 6f 20 57  ING terms into W
2fc30 48 45 52 45 3a 5c 6e 22 29 29 3b 0a 20 20 20 20  HERE:\n"));.    
2fc40 73 71 6c 69 74 65 33 54 72 65 65 56 69 65 77 53  sqlite3TreeViewS
2fc50 65 6c 65 63 74 28 30 2c 20 70 2c 20 30 29 3b 0a  elect(0, p, 0);.
2fc60 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a    }.#endif.}../*
2fc70 0a 2a 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65  .** Check to see
2fc80 20 69 66 20 74 68 65 20 70 54 68 69 73 20 65 6e   if the pThis en
2fc90 74 72 79 20 6f 66 20 70 54 61 62 4c 69 73 74 20  try of pTabList 
2fca0 69 73 20 61 20 73 65 6c 66 2d 6a 6f 69 6e 20 6f  is a self-join o
2fcb0 66 20 61 20 70 72 69 6f 72 20 76 69 65 77 2e 0a  f a prior view..
2fcc0 2a 2a 20 49 66 20 69 74 20 69 73 2c 20 74 68 65  ** If it is, the
2fcd0 6e 20 72 65 74 75 72 6e 20 74 68 65 20 53 72 63  n return the Src
2fce0 4c 69 73 74 5f 69 74 65 6d 20 66 6f 72 20 74 68  List_item for th
2fcf0 65 20 70 72 69 6f 72 20 76 69 65 77 2e 20 20 49  e prior view.  I
2fd00 66 20 69 74 20 69 73 20 6e 6f 74 2c 0a 2a 2a 20  f it is not,.** 
2fd10 74 68 65 6e 20 72 65 74 75 72 6e 20 30 2e 0a 2a  then return 0..*
2fd20 2f 0a 73 74 61 74 69 63 20 73 74 72 75 63 74 20  /.static struct 
2fd30 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 69 73  SrcList_item *is
2fd40 53 65 6c 66 4a 6f 69 6e 56 69 65 77 28 0a 20 20  SelfJoinView(.  
2fd50 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73  SrcList *pTabLis
2fd60 74 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  t,           /* 
2fd70 53 65 61 72 63 68 20 66 6f 72 20 73 65 6c 66 2d  Search for self-
2fd80 6a 6f 69 6e 73 20 69 6e 20 74 68 69 73 20 46 52  joins in this FR
2fd90 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 73  OM clause */.  s
2fda0 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
2fdb0 65 6d 20 2a 70 54 68 69 73 20 20 20 2f 2a 20 53  em *pThis   /* S
2fdc0 65 61 72 63 68 20 66 6f 72 20 70 72 69 6f 72 20  earch for prior 
2fdd0 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68 69  reference to thi
2fde0 73 20 73 75 62 71 75 65 72 79 20 2a 2f 0a 29 7b  s subquery */.){
2fdf0 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73  .  struct SrcLis
2fe00 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20  t_item *pItem;. 
2fe10 20 66 6f 72 28 70 49 74 65 6d 20 3d 20 70 54 61   for(pItem = pTa
2fe20 62 4c 69 73 74 2d 3e 61 3b 20 70 49 74 65 6d 3c  bList->a; pItem<
2fe30 70 54 68 69 73 3b 20 70 49 74 65 6d 2b 2b 29 7b  pThis; pItem++){
2fe40 0a 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e  .    if( pItem->
2fe50 70 53 65 6c 65 63 74 3d 3d 30 20 29 20 63 6f 6e  pSelect==0 ) con
2fe60 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 70  tinue;.    if( p
2fe70 49 74 65 6d 2d 3e 66 67 2e 76 69 61 43 6f 72 6f  Item->fg.viaCoro
2fe80 75 74 69 6e 65 20 29 20 63 6f 6e 74 69 6e 75 65  utine ) continue
2fe90 3b 0a 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d  ;.    if( pItem-
2fea0 3e 7a 4e 61 6d 65 3d 3d 30 20 29 20 63 6f 6e 74  >zName==0 ) cont
2feb0 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 73 71  inue;.    if( sq
2fec0 6c 69 74 65 33 5f 73 74 72 69 63 6d 70 28 70 49  lite3_stricmp(pI
2fed0 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65 2c 20  tem->zDatabase, 
2fee0 70 54 68 69 73 2d 3e 7a 44 61 74 61 62 61 73 65  pThis->zDatabase
2fef0 29 21 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b  )!=0 ) continue;
2ff00 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
2ff10 5f 73 74 72 69 63 6d 70 28 70 49 74 65 6d 2d 3e  _stricmp(pItem->
2ff20 7a 4e 61 6d 65 2c 20 70 54 68 69 73 2d 3e 7a 4e  zName, pThis->zN
2ff30 61 6d 65 29 21 3d 30 20 29 20 63 6f 6e 74 69 6e  ame)!=0 ) contin
2ff40 75 65 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69  ue;.    if( sqli
2ff50 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28 30  te3ExprCompare(0
2ff60 2c 20 0a 20 20 20 20 20 20 20 20 20 20 70 54 68  , .          pTh
2ff70 69 73 2d 3e 70 53 65 6c 65 63 74 2d 3e 70 57 68  is->pSelect->pWh
2ff80 65 72 65 2c 20 70 49 74 65 6d 2d 3e 70 53 65 6c  ere, pItem->pSel
2ff90 65 63 74 2d 3e 70 57 68 65 72 65 2c 20 2d 31 29  ect->pWhere, -1)
2ffa0 20 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 2f   .    ){.      /
2ffb0 2a 20 54 68 65 20 76 69 65 77 20 77 61 73 20 6d  * The view was m
2ffc0 6f 64 69 66 69 65 64 20 62 79 20 73 6f 6d 65 20  odified by some 
2ffd0 6f 74 68 65 72 20 6f 70 74 69 6d 69 7a 61 74 69  other optimizati
2ffe0 6f 6e 20 73 75 63 68 20 61 73 0a 20 20 20 20 20  on such as.     
2fff0 20 2a 2a 20 70 75 73 68 44 6f 77 6e 57 68 65 72   ** pushDownWher
30000 65 54 65 72 6d 73 28 29 20 2a 2f 0a 20 20 20 20  eTerms() */.    
30010 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
30020 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 70 49 74  }.    return pIt
30030 65 6d 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  em;.  }.  return
30040 20 30 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51   0;.}..#ifdef SQ
30050 4c 49 54 45 5f 43 4f 55 4e 54 4f 46 56 49 45 57  LITE_COUNTOFVIEW
30060 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 0a 2f 2a  _OPTIMIZATION./*
30070 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74 6f 20 74  .** Attempt to t
30080 72 61 6e 73 66 6f 72 6d 20 61 20 71 75 65 72 79  ransform a query
30090 20 6f 66 20 74 68 65 20 66 6f 72 6d 0a 2a 2a 0a   of the form.**.
300a0 2a 2a 20 20 20 20 53 45 4c 45 43 54 20 63 6f 75  **    SELECT cou
300b0 6e 74 28 2a 29 20 46 52 4f 4d 20 28 53 45 4c 45  nt(*) FROM (SELE
300c0 43 54 20 78 20 46 52 4f 4d 20 74 31 20 55 4e 49  CT x FROM t1 UNI
300d0 4f 4e 20 41 4c 4c 20 53 45 4c 45 43 54 20 79 20  ON ALL SELECT y 
300e0 46 52 4f 4d 20 74 32 29 0a 2a 2a 0a 2a 2a 20 49  FROM t2).**.** I
300f0 6e 74 6f 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20  nto this:.**.** 
30100 20 20 20 53 45 4c 45 43 54 20 28 53 45 4c 45 43     SELECT (SELEC
30110 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20  T count(*) FROM 
30120 74 31 29 2b 28 53 45 4c 45 43 54 20 63 6f 75 6e  t1)+(SELECT coun
30130 74 28 2a 29 20 46 52 4f 4d 20 74 32 29 0a 2a 2a  t(*) FROM t2).**
30140 0a 2a 2a 20 54 68 65 20 74 72 61 6e 73 66 6f 72  .** The transfor
30150 6d 61 74 69 6f 6e 20 6f 6e 6c 79 20 77 6f 72 6b  mation only work
30160 73 20 69 66 20 61 6c 6c 20 6f 66 20 74 68 65 20  s if all of the 
30170 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65 20 74 72  following are tr
30180 75 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20 54  ue:.**.**   *  T
30190 68 65 20 73 75 62 71 75 65 72 79 20 69 73 20 61  he subquery is a
301a0 20 55 4e 49 4f 4e 20 41 4c 4c 20 6f 66 20 74 77   UNION ALL of tw
301b0 6f 20 6f 72 20 6d 6f 72 65 20 74 65 72 6d 73 0a  o or more terms.
301c0 2a 2a 20 20 20 2a 20 20 54 68 65 20 73 75 62 71  **   *  The subq
301d0 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 68 61  uery does not ha
301e0 76 65 20 61 20 4c 49 4d 49 54 20 63 6c 61 75 73  ve a LIMIT claus
301f0 65 0a 2a 2a 20 20 20 2a 20 20 54 68 65 72 65 20  e.**   *  There 
30200 69 73 20 6e 6f 20 57 48 45 52 45 20 6f 72 20 47  is no WHERE or G
30210 52 4f 55 50 20 42 59 20 6f 72 20 48 41 56 49 4e  ROUP BY or HAVIN
30220 47 20 63 6c 61 75 73 65 73 20 6f 6e 20 74 68 65  G clauses on the
30230 20 73 75 62 71 75 65 72 69 65 73 0a 2a 2a 20 20   subqueries.**  
30240 20 2a 20 20 54 68 65 20 6f 75 74 65 72 20 71 75   *  The outer qu
30250 65 72 79 20 69 73 20 61 20 73 69 6d 70 6c 65 20  ery is a simple 
30260 63 6f 75 6e 74 28 2a 29 0a 2a 2a 0a 2a 2a 20 52  count(*).**.** R
30270 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 74 68  eturn TRUE if th
30280 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69  e optimization i
30290 73 20 75 6e 64 65 72 74 61 6b 65 6e 2e 0a 2a 2f  s undertaken..*/
302a0 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f 75 6e  .static int coun
302b0 74 4f 66 56 69 65 77 4f 70 74 69 6d 69 7a 61 74  tOfViewOptimizat
302c0 69 6f 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73  ion(Parse *pPars
302d0 65 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20  e, Select *p){. 
302e0 20 53 65 6c 65 63 74 20 2a 70 53 75 62 2c 20 2a   Select *pSub, *
302f0 70 50 72 69 6f 72 3b 0a 20 20 45 78 70 72 20 2a  pPrior;.  Expr *
30300 70 45 78 70 72 3b 0a 20 20 45 78 70 72 20 2a 70  pExpr;.  Expr *p
30310 43 6f 75 6e 74 3b 0a 20 20 73 71 6c 69 74 65 33  Count;.  sqlite3
30320 20 2a 64 62 3b 0a 20 20 69 66 28 20 28 70 2d 3e   *db;.  if( (p->
30330 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 41 67  selFlags & SF_Ag
30340 67 72 65 67 61 74 65 29 3d 3d 30 20 29 20 72 65  gregate)==0 ) re
30350 74 75 72 6e 20 30 3b 20 20 20 2f 2a 20 54 68 69  turn 0;   /* Thi
30360 73 20 69 73 20 61 6e 20 61 67 67 72 65 67 61 74  s is an aggregat
30370 65 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 45  e */.  if( p->pE
30380 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d 31 20 29  List->nExpr!=1 )
30390 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20   return 0;      
303a0 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 6e 67           /* Sing
303b0 6c 65 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e  le result column
303c0 20 2a 2f 0a 20 20 70 45 78 70 72 20 3d 20 70 2d   */.  pExpr = p-
303d0 3e 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45  >pEList->a[0].pE
303e0 78 70 72 3b 0a 20 20 69 66 28 20 70 45 78 70 72  xpr;.  if( pExpr
303f0 2d 3e 6f 70 21 3d 54 4b 5f 41 47 47 5f 46 55 4e  ->op!=TK_AGG_FUN
30400 43 54 49 4f 4e 20 29 20 72 65 74 75 72 6e 20 30  CTION ) return 0
30410 3b 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75  ;        /* Resu
30420 6c 74 20 69 73 20 61 6e 20 61 67 67 72 65 67 61  lt is an aggrega
30430 74 65 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69  te */.  if( sqli
30440 74 65 33 5f 73 74 72 69 63 6d 70 28 70 45 78 70  te3_stricmp(pExp
30450 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 22 63 6f 75  r->u.zToken,"cou
30460 6e 74 22 29 20 29 20 72 65 74 75 72 6e 20 30 3b  nt") ) return 0;
30470 20 20 2f 2a 20 49 73 20 63 6f 75 6e 74 28 29 20    /* Is count() 
30480 2a 2f 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e  */.  if( pExpr->
30490 78 2e 70 4c 69 73 74 21 3d 30 20 29 20 72 65 74  x.pList!=0 ) ret
304a0 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20  urn 0;          
304b0 20 20 20 20 20 20 20 2f 2a 20 4d 75 73 74 20 62         /* Must b
304c0 65 20 63 6f 75 6e 74 28 2a 29 20 2a 2f 0a 20 20  e count(*) */.  
304d0 69 66 28 20 70 2d 3e 70 53 72 63 2d 3e 6e 53 72  if( p->pSrc->nSr
304e0 63 21 3d 31 20 29 20 72 65 74 75 72 6e 20 30 3b  c!=1 ) return 0;
304f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30500 20 20 2f 2a 20 4f 6e 65 20 74 61 62 6c 65 20 69    /* One table i
30510 6e 20 46 52 4f 4d 20 20 2a 2f 0a 20 20 70 53 75  n FROM  */.  pSu
30520 62 20 3d 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 30  b = p->pSrc->a[0
30530 5d 2e 70 53 65 6c 65 63 74 3b 0a 20 20 69 66 28  ].pSelect;.  if(
30540 20 70 53 75 62 3d 3d 30 20 29 20 72 65 74 75 72   pSub==0 ) retur
30550 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  n 0;            
30560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
30570 2a 20 54 68 65 20 46 52 4f 4d 20 69 73 20 61 20  * The FROM is a 
30580 73 75 62 71 75 65 72 79 20 2a 2f 0a 20 20 69 66  subquery */.  if
30590 28 20 70 53 75 62 2d 3e 70 50 72 69 6f 72 3d 3d  ( pSub->pPrior==
305a0 30 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20  0 ) return 0;   
305b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
305c0 2f 2a 20 4d 75 73 74 20 62 65 20 61 20 63 6f 6d  /* Must be a com
305d0 70 6f 75 6e 64 20 72 79 20 2a 2f 0a 20 20 64 6f  pound ry */.  do
305e0 7b 0a 20 20 20 20 69 66 28 20 70 53 75 62 2d 3e  {.    if( pSub->
305f0 6f 70 21 3d 54 4b 5f 41 4c 4c 20 26 26 20 70 53  op!=TK_ALL && pS
30600 75 62 2d 3e 70 50 72 69 6f 72 20 29 20 72 65 74  ub->pPrior ) ret
30610 75 72 6e 20 30 3b 20 20 2f 2a 20 4d 75 73 74 20  urn 0;  /* Must 
30620 62 65 20 55 4e 49 4f 4e 20 41 4c 4c 20 2a 2f 0a  be UNION ALL */.
30630 20 20 20 20 69 66 28 20 70 53 75 62 2d 3e 70 57      if( pSub->pW
30640 68 65 72 65 20 29 20 72 65 74 75 72 6e 20 30 3b  here ) return 0;
30650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30660 20 20 20 20 20 20 2f 2a 20 4e 6f 20 57 48 45 52        /* No WHER
30670 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20  E clause */.    
30680 69 66 28 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74  if( pSub->pLimit
30690 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20   ) return 0;    
306a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
306b0 20 20 2f 2a 20 4e 6f 20 4c 49 4d 49 54 20 63 6c    /* No LIMIT cl
306c0 61 75 73 65 20 2a 2f 0a 20 20 20 20 69 66 28 20  ause */.    if( 
306d0 70 53 75 62 2d 3e 73 65 6c 46 6c 61 67 73 20 26  pSub->selFlags &
306e0 20 53 46 5f 41 67 67 72 65 67 61 74 65 20 29 20   SF_Aggregate ) 
306f0 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 2f 2a  return 0;     /*
30700 20 4e 6f 74 20 61 6e 20 61 67 67 72 65 67 61 74   Not an aggregat
30710 65 20 2a 2f 0a 20 20 20 20 70 53 75 62 20 3d 20  e */.    pSub = 
30720 70 53 75 62 2d 3e 70 50 72 69 6f 72 3b 20 20 20  pSub->pPrior;   
30730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30740 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
30750 70 65 61 74 20 6f 76 65 72 20 63 6f 6d 70 6f 75  peat over compou
30760 6e 64 20 2a 2f 0a 20 20 7d 77 68 69 6c 65 28 20  nd */.  }while( 
30770 70 53 75 62 20 29 3b 0a 0a 20 20 2f 2a 20 49 66  pSub );..  /* If
30780 20 77 65 20 72 65 61 63 68 20 74 68 69 73 20 70   we reach this p
30790 6f 69 6e 74 20 74 68 65 6e 20 69 74 20 69 73 20  oint then it is 
307a0 4f 4b 20 74 6f 20 70 65 72 66 6f 72 6d 20 74 68  OK to perform th
307b0 65 20 74 72 61 6e 73 66 6f 72 6d 61 74 69 6f 6e  e transformation
307c0 20 2a 2f 0a 0a 20 20 64 62 20 3d 20 70 50 61 72   */..  db = pPar
307d0 73 65 2d 3e 64 62 3b 0a 20 20 70 43 6f 75 6e 74  se->db;.  pCount
307e0 20 3d 20 70 45 78 70 72 3b 0a 20 20 70 45 78 70   = pExpr;.  pExp
307f0 72 20 3d 20 30 3b 0a 20 20 70 53 75 62 20 3d 20  r = 0;.  pSub = 
30800 70 2d 3e 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 53  p->pSrc->a[0].pS
30810 65 6c 65 63 74 3b 0a 20 20 70 2d 3e 70 53 72 63  elect;.  p->pSrc
30820 2d 3e 61 5b 30 5d 2e 70 53 65 6c 65 63 74 20 3d  ->a[0].pSelect =
30830 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 53 72 63   0;.  sqlite3Src
30840 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70  ListDelete(db, p
30850 2d 3e 70 53 72 63 29 3b 0a 20 20 70 2d 3e 70 53  ->pSrc);.  p->pS
30860 72 63 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  rc = sqlite3DbMa
30870 6c 6c 6f 63 5a 65 72 6f 28 70 50 61 72 73 65 2d  llocZero(pParse-
30880 3e 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70 2d 3e  >db, sizeof(*p->
30890 70 53 72 63 29 29 3b 0a 20 20 77 68 69 6c 65 28  pSrc));.  while(
308a0 20 70 53 75 62 20 29 7b 0a 20 20 20 20 45 78 70   pSub ){.    Exp
308b0 72 20 2a 70 54 65 72 6d 3b 0a 20 20 20 20 70 50  r *pTerm;.    pP
308c0 72 69 6f 72 20 3d 20 70 53 75 62 2d 3e 70 50 72  rior = pSub->pPr
308d0 69 6f 72 3b 0a 20 20 20 20 70 53 75 62 2d 3e 70  ior;.    pSub->p
308e0 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20 70  Prior = 0;.    p
308f0 53 75 62 2d 3e 70 4e 65 78 74 20 3d 20 30 3b 0a  Sub->pNext = 0;.
30900 20 20 20 20 70 53 75 62 2d 3e 73 65 6c 46 6c 61      pSub->selFla
30910 67 73 20 7c 3d 20 53 46 5f 41 67 67 72 65 67 61  gs |= SF_Aggrega
30920 74 65 3b 0a 20 20 20 20 70 53 75 62 2d 3e 73 65  te;.    pSub->se
30930 6c 46 6c 61 67 73 20 26 3d 20 7e 53 46 5f 43 6f  lFlags &= ~SF_Co
30940 6d 70 6f 75 6e 64 3b 0a 20 20 20 20 70 53 75 62  mpound;.    pSub
30950 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 30  ->nSelectRow = 0
30960 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  ;.    sqlite3Exp
30970 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20  rListDelete(db, 
30980 70 53 75 62 2d 3e 70 45 4c 69 73 74 29 3b 0a 20  pSub->pEList);. 
30990 20 20 20 70 54 65 72 6d 20 3d 20 70 50 72 69 6f     pTerm = pPrio
309a0 72 20 3f 20 73 71 6c 69 74 65 33 45 78 70 72 44  r ? sqlite3ExprD
309b0 75 70 28 64 62 2c 20 70 43 6f 75 6e 74 2c 20 30  up(db, pCount, 0
309c0 29 20 3a 20 70 43 6f 75 6e 74 3b 0a 20 20 20 20  ) : pCount;.    
309d0 70 53 75 62 2d 3e 70 45 4c 69 73 74 20 3d 20 73  pSub->pEList = s
309e0 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70  qlite3ExprListAp
309f0 70 65 6e 64 28 70 50 61 72 73 65 2c 20 30 2c 20  pend(pParse, 0, 
30a00 70 54 65 72 6d 29 3b 0a 20 20 20 20 70 54 65 72  pTerm);.    pTer
30a10 6d 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72  m = sqlite3PExpr
30a20 28 70 50 61 72 73 65 2c 20 54 4b 5f 53 45 4c 45  (pParse, TK_SELE
30a30 43 54 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73  CT, 0, 0);.    s
30a40 71 6c 69 74 65 33 50 45 78 70 72 41 64 64 53 65  qlite3PExprAddSe
30a50 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 54 65  lect(pParse, pTe
30a60 72 6d 2c 20 70 53 75 62 29 3b 0a 20 20 20 20 69  rm, pSub);.    i
30a70 66 28 20 70 45 78 70 72 3d 3d 30 20 29 7b 0a 20  f( pExpr==0 ){. 
30a80 20 20 20 20 20 70 45 78 70 72 20 3d 20 70 54 65       pExpr = pTe
30a90 72 6d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  rm;.    }else{. 
30aa0 20 20 20 20 20 70 45 78 70 72 20 3d 20 73 71 6c       pExpr = sql
30ab0 69 74 65 33 50 45 78 70 72 28 70 50 61 72 73 65  ite3PExpr(pParse
30ac0 2c 20 54 4b 5f 50 4c 55 53 2c 20 70 54 65 72 6d  , TK_PLUS, pTerm
30ad0 2c 20 70 45 78 70 72 29 3b 0a 20 20 20 20 7d 0a  , pExpr);.    }.
30ae0 20 20 20 20 70 53 75 62 20 3d 20 70 50 72 69 6f      pSub = pPrio
30af0 72 3b 0a 20 20 7d 0a 20 20 70 2d 3e 70 45 4c 69  r;.  }.  p->pELi
30b00 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 20 3d  st->a[0].pExpr =
30b10 20 70 45 78 70 72 3b 0a 20 20 70 2d 3e 73 65 6c   pExpr;.  p->sel
30b20 46 6c 61 67 73 20 26 3d 20 7e 53 46 5f 41 67 67  Flags &= ~SF_Agg
30b30 72 65 67 61 74 65 3b 0a 0a 23 69 66 20 53 45 4c  regate;..#if SEL
30b40 45 43 54 54 52 41 43 45 5f 45 4e 41 42 4c 45 44  ECTTRACE_ENABLED
30b50 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 65  .  if( sqlite3Se
30b60 6c 65 63 74 54 72 61 63 65 20 26 20 30 78 34 30  lectTrace & 0x40
30b70 30 20 29 7b 0a 20 20 20 20 53 45 4c 45 43 54 54  0 ){.    SELECTT
30b80 52 41 43 45 28 30 78 34 30 30 2c 70 50 61 72 73  RACE(0x400,pPars
30b90 65 2c 70 2c 28 22 41 66 74 65 72 20 63 6f 75 6e  e,p,("After coun
30ba0 74 2d 6f 66 2d 76 69 65 77 20 6f 70 74 69 6d 69  t-of-view optimi
30bb0 7a 61 74 69 6f 6e 3a 5c 6e 22 29 29 3b 0a 20 20  zation:\n"));.  
30bc0 20 20 73 71 6c 69 74 65 33 54 72 65 65 56 69 65    sqlite3TreeVie
30bd0 77 53 65 6c 65 63 74 28 30 2c 20 70 2c 20 30 29  wSelect(0, p, 0)
30be0 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72  ;.  }.#endif.  r
30bf0 65 74 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69  eturn 1;.}.#endi
30c00 66 20 2f 2a 20 53 51 4c 49 54 45 5f 43 4f 55 4e  f /* SQLITE_COUN
30c10 54 4f 46 56 49 45 57 5f 4f 50 54 49 4d 49 5a 41  TOFVIEW_OPTIMIZA
30c20 54 49 4f 4e 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 47  TION */../*.** G
30c30 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72  enerate code for
30c40 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74   the SELECT stat
30c50 65 6d 65 6e 74 20 67 69 76 65 6e 20 69 6e 20 74  ement given in t
30c60 68 65 20 70 20 61 72 67 75 6d 65 6e 74 2e 20 20  he p argument.  
30c70 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 73 75 6c  .**.** The resul
30c80 74 73 20 61 72 65 20 72 65 74 75 72 6e 65 64 20  ts are returned 
30c90 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 74 68 65  according to the
30ca0 20 53 65 6c 65 63 74 44 65 73 74 20 73 74 72 75   SelectDest stru
30cb0 63 74 75 72 65 2e 0a 2a 2a 20 53 65 65 20 63 6f  cture..** See co
30cc0 6d 6d 65 6e 74 73 20 69 6e 20 73 71 6c 69 74 65  mments in sqlite
30cd0 49 6e 74 2e 68 20 66 6f 72 20 66 75 72 74 68 65  Int.h for furthe
30ce0 72 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a  r information..*
30cf0 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
30d00 65 20 72 65 74 75 72 6e 73 20 74 68 65 20 6e 75  e returns the nu
30d10 6d 62 65 72 20 6f 66 20 65 72 72 6f 72 73 2e 20  mber of errors. 
30d20 20 49 66 20 61 6e 79 20 65 72 72 6f 72 73 20 61   If any errors a
30d30 72 65 0a 2a 2a 20 65 6e 63 6f 75 6e 74 65 72 65  re.** encountere
30d40 64 2c 20 74 68 65 6e 20 61 6e 20 61 70 70 72 6f  d, then an appro
30d50 70 72 69 61 74 65 20 65 72 72 6f 72 20 6d 65 73  priate error mes
30d60 73 61 67 65 20 69 73 20 6c 65 66 74 20 69 6e 0a  sage is left in.
30d70 2a 2a 20 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d  ** pParse->zErrM
30d80 73 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  sg..**.** This r
30d90 6f 75 74 69 6e 65 20 64 6f 65 73 20 4e 4f 54 20  outine does NOT 
30da0 66 72 65 65 20 74 68 65 20 53 65 6c 65 63 74 20  free the Select 
30db0 73 74 72 75 63 74 75 72 65 20 70 61 73 73 65 64  structure passed
30dc0 20 69 6e 2e 20 20 54 68 65 0a 2a 2a 20 63 61 6c   in.  The.** cal
30dd0 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 6e 65  ling function ne
30de0 65 64 73 20 74 6f 20 64 6f 20 74 68 61 74 2e 0a  eds to do that..
30df0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 53 65  */.int sqlite3Se
30e00 6c 65 63 74 28 0a 20 20 50 61 72 73 65 20 2a 70  lect(.  Parse *p
30e10 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 2f  Parse,         /
30e20 2a 20 54 68 65 20 70 61 72 73 65 72 20 63 6f 6e  * The parser con
30e30 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74  text */.  Select
30e40 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
30e50 20 2f 2a 20 54 68 65 20 53 45 4c 45 43 54 20 73   /* The SELECT s
30e60 74 61 74 65 6d 65 6e 74 20 62 65 69 6e 67 20 63  tatement being c
30e70 6f 64 65 64 2e 20 2a 2f 0a 20 20 53 65 6c 65 63  oded. */.  Selec
30e80 74 44 65 73 74 20 2a 70 44 65 73 74 20 20 20 20  tDest *pDest    
30e90 20 20 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f 20    /* What to do 
30ea0 77 69 74 68 20 74 68 65 20 71 75 65 72 79 20 72  with the query r
30eb0 65 73 75 6c 74 73 20 2a 2f 0a 29 7b 0a 20 20 69  esults */.){.  i
30ec0 6e 74 20 69 2c 20 6a 3b 20 20 20 20 20 20 20 20  nt i, j;        
30ed0 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
30ee0 75 6e 74 65 72 73 20 2a 2f 0a 20 20 57 68 65 72  unters */.  Wher
30ef0 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 3b 20 20  eInfo *pWInfo;  
30f00 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 66 72 6f     /* Return fro
30f10 6d 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65  m sqlite3WhereBe
30f20 67 69 6e 28 29 20 2a 2f 0a 20 20 56 64 62 65 20  gin() */.  Vdbe 
30f30 2a 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  *v;             
30f40 20 20 2f 2a 20 54 68 65 20 76 69 72 74 75 61 6c    /* The virtual
30f50 20 6d 61 63 68 69 6e 65 20 75 6e 64 65 72 20 63   machine under c
30f60 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20  onstruction */. 
30f70 20 69 6e 74 20 69 73 41 67 67 3b 20 20 20 20 20   int isAgg;     
30f80 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
30f90 66 6f 72 20 73 65 6c 65 63 74 20 6c 69 73 74 73  for select lists
30fa0 20 6c 69 6b 65 20 22 63 6f 75 6e 74 28 2a 29 22   like "count(*)"
30fb0 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
30fc0 70 45 4c 69 73 74 20 3d 20 30 3b 20 20 2f 2a 20  pEList = 0;  /* 
30fd0 4c 69 73 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20  List of columns 
30fe0 74 6f 20 65 78 74 72 61 63 74 2e 20 2a 2f 0a 20  to extract. */. 
30ff0 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69   SrcList *pTabLi
31000 73 74 3b 20 20 20 20 20 2f 2a 20 4c 69 73 74 20  st;     /* List 
31010 6f 66 20 74 61 62 6c 65 73 20 74 6f 20 73 65 6c  of tables to sel
31020 65 63 74 20 66 72 6f 6d 20 2a 2f 0a 20 20 45 78  ect from */.  Ex
31030 70 72 20 2a 70 57 68 65 72 65 3b 20 20 20 20 20  pr *pWhere;     
31040 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52       /* The WHER
31050 45 20 63 6c 61 75 73 65 2e 20 20 4d 61 79 20 62  E clause.  May b
31060 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78 70 72  e NULL */.  Expr
31070 4c 69 73 74 20 2a 70 47 72 6f 75 70 42 79 3b 20  List *pGroupBy; 
31080 20 20 20 2f 2a 20 54 68 65 20 47 52 4f 55 50 20     /* The GROUP 
31090 42 59 20 63 6c 61 75 73 65 2e 20 20 4d 61 79 20  BY clause.  May 
310a0 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78 70  be NULL */.  Exp
310b0 72 20 2a 70 48 61 76 69 6e 67 3b 20 20 20 20 20  r *pHaving;     
310c0 20 20 20 20 2f 2a 20 54 68 65 20 48 41 56 49 4e      /* The HAVIN
310d0 47 20 63 6c 61 75 73 65 2e 20 20 4d 61 79 20 62  G clause.  May b
310e0 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 69 6e 74 20  e NULL */.  int 
310f0 72 63 20 3d 20 31 3b 20 20 20 20 20 20 20 20 20  rc = 1;         
31100 20 20 20 2f 2a 20 56 61 6c 75 65 20 74 6f 20 72     /* Value to r
31110 65 74 75 72 6e 20 66 72 6f 6d 20 74 68 69 73 20  eturn from this 
31120 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 44 69  function */.  Di
31130 73 74 69 6e 63 74 43 74 78 20 73 44 69 73 74 69  stinctCtx sDisti
31140 6e 63 74 3b 20 2f 2a 20 49 6e 66 6f 20 6f 6e 20  nct; /* Info on 
31150 68 6f 77 20 74 6f 20 63 6f 64 65 20 74 68 65 20  how to code the 
31160 44 49 53 54 49 4e 43 54 20 6b 65 79 77 6f 72 64  DISTINCT keyword
31170 20 2a 2f 0a 20 20 53 6f 72 74 43 74 78 20 73 53   */.  SortCtx sS
31180 6f 72 74 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  ort;         /* 
31190 49 6e 66 6f 20 6f 6e 20 68 6f 77 20 74 6f 20 63  Info on how to c
311a0 6f 64 65 20 74 68 65 20 4f 52 44 45 52 20 42 59  ode the ORDER BY
311b0 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 41 67 67   clause */.  Agg
311c0 49 6e 66 6f 20 73 41 67 67 49 6e 66 6f 3b 20 20  Info sAggInfo;  
311d0 20 20 20 20 2f 2a 20 49 6e 66 6f 72 6d 61 74 69      /* Informati
311e0 6f 6e 20 75 73 65 64 20 62 79 20 61 67 67 72 65  on used by aggre
311f0 67 61 74 65 20 71 75 65 72 69 65 73 20 2a 2f 0a  gate queries */.
31200 20 20 69 6e 74 20 69 45 6e 64 3b 20 20 20 20 20    int iEnd;     
31210 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72           /* Addr
31220 65 73 73 20 6f 66 20 74 68 65 20 65 6e 64 20 6f  ess of the end o
31230 66 20 74 68 65 20 71 75 65 72 79 20 2a 2f 0a 20  f the query */. 
31240 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 20 20 20   sqlite3 *db;   
31250 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64          /* The d
31260 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
31270 6f 6e 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  on */.  ExprList
31280 20 2a 70 4d 69 6e 4d 61 78 4f 72 64 65 72 42 79   *pMinMaxOrderBy
31290 20 3d 20 30 3b 20 20 2f 2a 20 41 64 64 65 64 20   = 0;  /* Added 
312a0 4f 52 44 45 52 20 42 59 20 66 6f 72 20 6d 69 6e  ORDER BY for min
312b0 2f 6d 61 78 20 71 75 65 72 69 65 73 20 2a 2f 0a  /max queries */.
312c0 20 20 75 38 20 6d 69 6e 4d 61 78 46 6c 61 67 3b    u8 minMaxFlag;
312d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
312e0 20 2f 2a 20 46 6c 61 67 20 66 6f 72 20 6d 69 6e   /* Flag for min
312f0 2f 6d 61 78 20 71 75 65 72 69 65 73 20 2a 2f 0a  /max queries */.
31300 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  .  db = pParse->
31310 64 62 3b 0a 20 20 76 20 3d 20 73 71 6c 69 74 65  db;.  v = sqlite
31320 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  3GetVdbe(pParse)
31330 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 7c 7c 20  ;.  if( p==0 || 
31340 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
31350 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72 72   || pParse->nErr
31360 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 31   ){.    return 1
31370 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c 69  ;.  }.  if( sqli
31380 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61  te3AuthCheck(pPa
31390 72 73 65 2c 20 53 51 4c 49 54 45 5f 53 45 4c 45  rse, SQLITE_SELE
313a0 43 54 2c 20 30 2c 20 30 2c 20 30 29 20 29 20 72  CT, 0, 0, 0) ) r
313b0 65 74 75 72 6e 20 31 3b 0a 20 20 6d 65 6d 73 65  eturn 1;.  memse
313c0 74 28 26 73 41 67 67 49 6e 66 6f 2c 20 30 2c 20  t(&sAggInfo, 0, 
313d0 73 69 7a 65 6f 66 28 73 41 67 67 49 6e 66 6f 29  sizeof(sAggInfo)
313e0 29 3b 0a 23 69 66 20 53 45 4c 45 43 54 54 52 41  );.#if SELECTTRA
313f0 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20 53 45 4c  CE_ENABLED.  SEL
31400 45 43 54 54 52 41 43 45 28 31 2c 70 50 61 72 73  ECTTRACE(1,pPars
31410 65 2c 70 2c 20 28 22 62 65 67 69 6e 20 70 72 6f  e,p, ("begin pro
31420 63 65 73 73 69 6e 67 3a 5c 6e 22 2c 20 70 50 61  cessing:\n", pPa
31430 72 73 65 2d 3e 61 64 64 72 45 78 70 6c 61 69 6e  rse->addrExplain
31440 29 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65  ));.  if( sqlite
31450 33 53 65 6c 65 63 74 54 72 61 63 65 20 26 20 30  3SelectTrace & 0
31460 78 31 30 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  x100 ){.    sqli
31470 74 65 33 54 72 65 65 56 69 65 77 53 65 6c 65 63  te3TreeViewSelec
31480 74 28 30 2c 20 70 2c 20 30 29 3b 0a 20 20 7d 0a  t(0, p, 0);.  }.
31490 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74  #endif..  assert
314a0 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30  ( p->pOrderBy==0
314b0 20 7c 7c 20 70 44 65 73 74 2d 3e 65 44 65 73 74   || pDest->eDest
314c0 21 3d 53 52 54 5f 44 69 73 74 46 69 66 6f 20 29  !=SRT_DistFifo )
314d0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70  ;.  assert( p->p
314e0 4f 72 64 65 72 42 79 3d 3d 30 20 7c 7c 20 70 44  OrderBy==0 || pD
314f0 65 73 74 2d 3e 65 44 65 73 74 21 3d 53 52 54 5f  est->eDest!=SRT_
31500 46 69 66 6f 20 29 3b 0a 20 20 61 73 73 65 72 74  Fifo );.  assert
31510 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30  ( p->pOrderBy==0
31520 20 7c 7c 20 70 44 65 73 74 2d 3e 65 44 65 73 74   || pDest->eDest
31530 21 3d 53 52 54 5f 44 69 73 74 51 75 65 75 65 20  !=SRT_DistQueue 
31540 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
31550 70 4f 72 64 65 72 42 79 3d 3d 30 20 7c 7c 20 70  pOrderBy==0 || p
31560 44 65 73 74 2d 3e 65 44 65 73 74 21 3d 53 52 54  Dest->eDest!=SRT
31570 5f 51 75 65 75 65 20 29 3b 0a 20 20 69 66 28 20  _Queue );.  if( 
31580 49 67 6e 6f 72 61 62 6c 65 4f 72 64 65 72 62 79  IgnorableOrderby
31590 28 70 44 65 73 74 29 20 29 7b 0a 20 20 20 20 61  (pDest) ){.    a
315a0 73 73 65 72 74 28 70 44 65 73 74 2d 3e 65 44 65  ssert(pDest->eDe
315b0 73 74 3d 3d 53 52 54 5f 45 78 69 73 74 73 20 7c  st==SRT_Exists |
315c0 7c 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d  | pDest->eDest==
315d0 53 52 54 5f 55 6e 69 6f 6e 20 7c 7c 20 0a 20 20  SRT_Union || .  
315e0 20 20 20 20 20 20 20 20 20 70 44 65 73 74 2d 3e           pDest->
315f0 65 44 65 73 74 3d 3d 53 52 54 5f 45 78 63 65 70  eDest==SRT_Excep
31600 74 20 7c 7c 20 70 44 65 73 74 2d 3e 65 44 65 73  t || pDest->eDes
31610 74 3d 3d 53 52 54 5f 44 69 73 63 61 72 64 20 7c  t==SRT_Discard |
31620 7c 0a 20 20 20 20 20 20 20 20 20 20 20 70 44 65  |.           pDe
31630 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 51  st->eDest==SRT_Q
31640 75 65 75 65 20 20 7c 7c 20 70 44 65 73 74 2d 3e  ueue  || pDest->
31650 65 44 65 73 74 3d 3d 53 52 54 5f 44 69 73 74 46  eDest==SRT_DistF
31660 69 66 6f 20 7c 7c 0a 20 20 20 20 20 20 20 20 20  ifo ||.         
31670 20 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d    pDest->eDest==
31680 53 52 54 5f 44 69 73 74 51 75 65 75 65 20 7c 7c  SRT_DistQueue ||
31690 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53   pDest->eDest==S
316a0 52 54 5f 46 69 66 6f 29 3b 0a 20 20 20 20 2f 2a  RT_Fifo);.    /*
316b0 20 49 66 20 4f 52 44 45 52 20 42 59 20 6d 61 6b   If ORDER BY mak
316c0 65 73 20 6e 6f 20 64 69 66 66 65 72 65 6e 63 65  es no difference
316d0 20 69 6e 20 74 68 65 20 6f 75 74 70 75 74 20 74   in the output t
316e0 68 65 6e 20 6e 65 69 74 68 65 72 20 64 6f 65 73  hen neither does
316f0 0a 20 20 20 20 2a 2a 20 44 49 53 54 49 4e 43 54  .    ** DISTINCT
31700 20 73 6f 20 69 74 20 63 61 6e 20 62 65 20 72 65   so it can be re
31710 6d 6f 76 65 64 20 74 6f 6f 2e 20 2a 2f 0a 20 20  moved too. */.  
31720 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73    sqlite3ExprLis
31730 74 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70  tDelete(db, p->p
31740 4f 72 64 65 72 42 79 29 3b 0a 20 20 20 20 70 2d  OrderBy);.    p-
31750 3e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20  >pOrderBy = 0;. 
31760 20 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26     p->selFlags &
31770 3d 20 7e 53 46 5f 44 69 73 74 69 6e 63 74 3b 0a  = ~SF_Distinct;.
31780 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 53 65 6c    }.  sqlite3Sel
31790 65 63 74 50 72 65 70 28 70 50 61 72 73 65 2c 20  ectPrep(pParse, 
317a0 70 2c 20 30 29 3b 0a 20 20 69 66 28 20 70 50 61  p, 0);.  if( pPa
317b0 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 64 62 2d  rse->nErr || db-
317c0 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b  >mallocFailed ){
317d0 0a 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74  .    goto select
317e0 5f 65 6e 64 3b 0a 20 20 7d 0a 20 20 61 73 73 65  _end;.  }.  asse
317f0 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 21 3d 30  rt( p->pEList!=0
31800 20 29 3b 0a 23 69 66 20 53 45 4c 45 43 54 54 52   );.#if SELECTTR
31810 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20 69 66  ACE_ENABLED.  if
31820 28 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 54  ( sqlite3SelectT
31830 72 61 63 65 20 26 20 30 78 31 30 34 20 29 7b 0a  race & 0x104 ){.
31840 20 20 20 20 53 45 4c 45 43 54 54 52 41 43 45 28      SELECTTRACE(
31850 30 78 31 30 34 2c 70 50 61 72 73 65 2c 70 2c 20  0x104,pParse,p, 
31860 28 22 61 66 74 65 72 20 6e 61 6d 65 20 72 65 73  ("after name res
31870 6f 6c 75 74 69 6f 6e 3a 5c 6e 22 29 29 3b 0a 20  olution:\n"));. 
31880 20 20 20 73 71 6c 69 74 65 33 54 72 65 65 56 69     sqlite3TreeVi
31890 65 77 53 65 6c 65 63 74 28 30 2c 20 70 2c 20 30  ewSelect(0, p, 0
318a0 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  );.  }.#endif.. 
318b0 20 69 66 28 20 70 44 65 73 74 2d 3e 65 44 65 73   if( pDest->eDes
318c0 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20 29 7b  t==SRT_Output ){
318d0 0a 20 20 20 20 67 65 6e 65 72 61 74 65 43 6f 6c  .    generateCol
318e0 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73 65 2c  umnNames(pParse,
318f0 20 70 29 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65   p);.  }..#ifnde
31900 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 49  f SQLITE_OMIT_WI
31910 4e 44 4f 57 46 55 4e 43 0a 20 20 69 66 28 20 73  NDOWFUNC.  if( s
31920 71 6c 69 74 65 33 57 69 6e 64 6f 77 52 65 77 72  qlite3WindowRewr
31930 69 74 65 28 70 50 61 72 73 65 2c 20 70 29 20 29  ite(pParse, p) )
31940 7b 0a 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63  {.    goto selec
31950 74 5f 65 6e 64 3b 0a 20 20 7d 0a 23 69 66 20 53  t_end;.  }.#if S
31960 45 4c 45 43 54 54 52 41 43 45 5f 45 4e 41 42 4c  ELECTTRACE_ENABL
31970 45 44 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  ED.  if( sqlite3
31980 53 65 6c 65 63 74 54 72 61 63 65 20 26 20 30 78  SelectTrace & 0x
31990 31 30 38 20 29 7b 0a 20 20 20 20 53 45 4c 45 43  108 ){.    SELEC
319a0 54 54 52 41 43 45 28 30 78 31 30 34 2c 70 50 61  TTRACE(0x104,pPa
319b0 72 73 65 2c 70 2c 20 28 22 61 66 74 65 72 20 77  rse,p, ("after w
319c0 69 6e 64 6f 77 20 72 65 77 72 69 74 65 3a 5c 6e  indow rewrite:\n
319d0 22 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  "));.    sqlite3
319e0 54 72 65 65 56 69 65 77 53 65 6c 65 63 74 28 30  TreeViewSelect(0
319f0 2c 20 70 2c 20 30 29 3b 0a 20 20 7d 0a 23 65 6e  , p, 0);.  }.#en
31a00 64 69 66 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  dif.#endif /* SQ
31a10 4c 49 54 45 5f 4f 4d 49 54 5f 57 49 4e 44 4f 57  LITE_OMIT_WINDOW
31a20 46 55 4e 43 20 2a 2f 0a 20 20 70 54 61 62 4c 69  FUNC */.  pTabLi
31a30 73 74 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20  st = p->pSrc;.  
31a40 69 73 41 67 67 20 3d 20 28 70 2d 3e 73 65 6c 46  isAgg = (p->selF
31a50 6c 61 67 73 20 26 20 53 46 5f 41 67 67 72 65 67  lags & SF_Aggreg
31a60 61 74 65 29 21 3d 30 3b 0a 20 20 6d 65 6d 73 65  ate)!=0;.  memse
31a70 74 28 26 73 53 6f 72 74 2c 20 30 2c 20 73 69 7a  t(&sSort, 0, siz
31a80 65 6f 66 28 73 53 6f 72 74 29 29 3b 0a 20 20 73  eof(sSort));.  s
31a90 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 20 3d 20  Sort.pOrderBy = 
31aa0 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 0a 20 20  p->pOrderBy;..  
31ab0 2f 2a 20 54 72 79 20 74 6f 20 76 61 72 69 6f 75  /* Try to variou
31ac0 73 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20  s optimizations 
31ad0 28 66 6c 61 74 74 65 6e 69 6e 67 20 73 75 62 71  (flattening subq
31ae0 75 65 72 69 65 73 2c 20 61 6e 64 20 73 74 72 65  ueries, and stre
31af0 6e 67 74 68 0a 20 20 2a 2a 20 72 65 64 75 63 74  ngth.  ** reduct
31b00 69 6f 6e 20 6f 66 20 6a 6f 69 6e 20 6f 70 65 72  ion of join oper
31b10 61 74 6f 72 73 29 20 69 6e 20 74 68 65 20 46 52  ators) in the FR
31b20 4f 4d 20 63 6c 61 75 73 65 20 75 70 20 69 6e 74  OM clause up int
31b30 6f 20 74 68 65 20 6d 61 69 6e 20 71 75 65 72 79  o the main query
31b40 0a 20 20 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e  .  */.#if !defin
31b50 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ed(SQLITE_OMIT_S
31b60 55 42 51 55 45 52 59 29 20 7c 7c 20 21 64 65 66  UBQUERY) || !def
31b70 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
31b80 5f 56 49 45 57 29 0a 20 20 66 6f 72 28 69 3d 30  _VIEW).  for(i=0
31b90 3b 20 21 70 2d 3e 70 50 72 69 6f 72 20 26 26 20  ; !p->pPrior && 
31ba0 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63  i<pTabList->nSrc
31bb0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75  ; i++){.    stru
31bc0 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
31bd0 2a 70 49 74 65 6d 20 3d 20 26 70 54 61 62 4c 69  *pItem = &pTabLi
31be0 73 74 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 53 65  st->a[i];.    Se
31bf0 6c 65 63 74 20 2a 70 53 75 62 20 3d 20 70 49 74  lect *pSub = pIt
31c00 65 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a 20 20 20  em->pSelect;.   
31c10 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70   Table *pTab = p
31c20 49 74 65 6d 2d 3e 70 54 61 62 3b 0a 0a 20 20 20  Item->pTab;..   
31c30 20 2f 2a 20 43 6f 6e 76 65 72 74 20 4c 45 46 54   /* Convert LEFT
31c40 20 4a 4f 49 4e 20 69 6e 74 6f 20 4a 4f 49 4e 20   JOIN into JOIN 
31c50 69 66 20 74 68 65 72 65 20 61 72 65 20 74 65 72  if there are ter
31c60 6d 73 20 6f 66 20 74 68 65 20 72 69 67 68 74 20  ms of the right 
31c70 74 61 62 6c 65 0a 20 20 20 20 2a 2a 20 6f 66 20  table.    ** of 
31c80 74 68 65 20 4c 45 46 54 20 4a 4f 49 4e 20 75 73  the LEFT JOIN us
31c90 65 64 20 69 6e 20 74 68 65 20 57 48 45 52 45 20  ed in the WHERE 
31ca0 63 6c 61 75 73 65 2e 0a 20 20 20 20 2a 2f 0a 20  clause..    */. 
31cb0 20 20 20 69 66 28 20 28 70 49 74 65 6d 2d 3e 66     if( (pItem->f
31cc0 67 2e 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f  g.jointype & JT_
31cd0 4c 45 46 54 29 21 3d 30 0a 20 20 20 20 20 26 26  LEFT)!=0.     &&
31ce0 20 73 71 6c 69 74 65 33 45 78 70 72 49 6d 70 6c   sqlite3ExprImpl
31cf0 69 65 73 4e 6f 6e 4e 75 6c 6c 52 6f 77 28 70 2d  iesNonNullRow(p-
31d00 3e 70 57 68 65 72 65 2c 20 70 49 74 65 6d 2d 3e  >pWhere, pItem->
31d10 69 43 75 72 73 6f 72 29 0a 20 20 20 20 20 26 26  iCursor).     &&
31d20 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 45 6e 61   OptimizationEna
31d30 62 6c 65 64 28 64 62 2c 20 53 51 4c 49 54 45 5f  bled(db, SQLITE_
31d40 53 69 6d 70 6c 69 66 79 4a 6f 69 6e 29 0a 20 20  SimplifyJoin).  
31d50 20 20 29 7b 0a 20 20 20 20 20 20 53 45 4c 45 43    ){.      SELEC
31d60 54 54 52 41 43 45 28 30 78 31 30 30 2c 70 50 61  TTRACE(0x100,pPa
31d70 72 73 65 2c 70 2c 0a 20 20 20 20 20 20 20 20 20  rse,p,.         
31d80 20 20 20 20 20 20 20 28 22 4c 45 46 54 2d 4a 4f         ("LEFT-JO
31d90 49 4e 20 73 69 6d 70 6c 69 66 69 65 73 20 74 6f  IN simplifies to
31da0 20 4a 4f 49 4e 20 6f 6e 20 74 65 72 6d 20 25 64   JOIN on term %d
31db0 5c 6e 22 2c 69 29 29 3b 0a 20 20 20 20 20 20 70  \n",i));.      p
31dc0 49 74 65 6d 2d 3e 66 67 2e 6a 6f 69 6e 74 79 70  Item->fg.jointyp
31dd0 65 20 26 3d 20 7e 28 4a 54 5f 4c 45 46 54 7c 4a  e &= ~(JT_LEFT|J
31de0 54 5f 4f 55 54 45 52 29 3b 0a 20 20 20 20 20 20  T_OUTER);.      
31df0 75 6e 73 65 74 4a 6f 69 6e 45 78 70 72 28 70 2d  unsetJoinExpr(p-
31e00 3e 70 57 68 65 72 65 2c 20 70 49 74 65 6d 2d 3e  >pWhere, pItem->
31e10 69 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 7d 0a  iCursor);.    }.
31e20 0a 20 20 20 20 2f 2a 20 4e 6f 20 66 75 74 68 65  .    /* No futhe
31e30 72 20 61 63 74 69 6f 6e 20 69 66 20 74 68 69 73  r action if this
31e40 20 74 65 72 6d 20 6f 66 20 74 68 65 20 46 52 4f   term of the FRO
31e50 4d 20 63 6c 61 75 73 65 20 69 73 20 6e 6f 20 61  M clause is no a
31e60 20 73 75 62 71 75 65 72 79 20 2a 2f 0a 20 20 20   subquery */.   
31e70 20 69 66 28 20 70 53 75 62 3d 3d 30 20 29 20 63   if( pSub==0 ) c
31e80 6f 6e 74 69 6e 75 65 3b 0a 0a 20 20 20 20 2f 2a  ontinue;..    /*
31e90 20 43 61 74 63 68 20 6d 69 73 6d 61 74 63 68 20   Catch mismatch 
31ea0 69 6e 20 74 68 65 20 64 65 63 6c 61 72 65 64 20  in the declared 
31eb0 63 6f 6c 75 6d 6e 73 20 6f 66 20 61 20 76 69 65  columns of a vie
31ec0 77 20 61 6e 64 20 74 68 65 20 6e 75 6d 62 65 72  w and the number
31ed0 20 6f 66 0a 20 20 20 20 2a 2a 20 63 6f 6c 75 6d   of.    ** colum
31ee0 6e 73 20 69 6e 20 74 68 65 20 53 45 4c 45 43 54  ns in the SELECT
31ef0 20 6f 6e 20 74 68 65 20 52 48 53 20 2a 2f 0a 20   on the RHS */. 
31f00 20 20 20 69 66 28 20 70 54 61 62 2d 3e 6e 43 6f     if( pTab->nCo
31f10 6c 21 3d 70 53 75 62 2d 3e 70 45 4c 69 73 74 2d  l!=pSub->pEList-
31f20 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20  >nExpr ){.      
31f30 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
31f40 70 50 61 72 73 65 2c 20 22 65 78 70 65 63 74 65  pParse, "expecte
31f50 64 20 25 64 20 63 6f 6c 75 6d 6e 73 20 66 6f 72  d %d columns for
31f60 20 27 25 73 27 20 62 75 74 20 67 6f 74 20 25 64   '%s' but got %d
31f70 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
31f80 20 20 20 20 20 20 20 20 20 70 54 61 62 2d 3e 6e           pTab->n
31f90 43 6f 6c 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  Col, pTab->zName
31fa0 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73 74 2d 3e  , pSub->pEList->
31fb0 6e 45 78 70 72 29 3b 0a 20 20 20 20 20 20 67 6f  nExpr);.      go
31fc0 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20  to select_end;. 
31fd0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 6f 20     }..    /* Do 
31fe0 6e 6f 74 20 74 72 79 20 74 6f 20 66 6c 61 74 74  not try to flatt
31ff0 65 6e 20 61 6e 20 61 67 67 72 65 67 61 74 65 20  en an aggregate 
32000 73 75 62 71 75 65 72 79 2e 0a 20 20 20 20 2a 2a  subquery..    **
32010 0a 20 20 20 20 2a 2a 20 46 6c 61 74 74 65 6e 69  .    ** Flatteni
32020 6e 67 20 61 6e 20 61 67 67 72 65 67 61 74 65 20  ng an aggregate 
32030 73 75 62 71 75 65 72 79 20 69 73 20 6f 6e 6c 79  subquery is only
32040 20 70 6f 73 73 69 62 6c 65 20 69 66 20 74 68 65   possible if the
32050 20 6f 75 74 65 72 20 71 75 65 72 79 0a 20 20 20   outer query.   
32060 20 2a 2a 20 69 73 20 6e 6f 74 20 61 20 6a 6f 69   ** is not a joi
32070 6e 2e 20 20 42 75 74 20 69 66 20 74 68 65 20 6f  n.  But if the o
32080 75 74 65 72 20 71 75 65 72 79 20 69 73 20 6e 6f  uter query is no
32090 74 20 61 20 6a 6f 69 6e 2c 20 74 68 65 6e 20 74  t a join, then t
320a0 68 65 20 73 75 62 71 75 65 72 79 0a 20 20 20 20  he subquery.    
320b0 2a 2a 20 77 69 6c 6c 20 62 65 20 69 6d 70 6c 65  ** will be imple
320c0 6d 65 6e 74 65 64 20 61 73 20 61 20 63 6f 2d 72  mented as a co-r
320d0 6f 75 74 69 6e 65 20 61 6e 64 20 74 68 65 72 65  outine and there
320e0 20 69 73 20 6e 6f 20 61 64 76 61 6e 74 61 67 65   is no advantage
320f0 20 74 6f 0a 20 20 20 20 2a 2a 20 66 6c 61 74 74   to.    ** flatt
32100 65 6e 69 6e 67 20 69 6e 20 74 68 61 74 20 63 61  ening in that ca
32110 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  se..    */.    i
32120 66 28 20 28 70 53 75 62 2d 3e 73 65 6c 46 6c 61  f( (pSub->selFla
32130 67 73 20 26 20 53 46 5f 41 67 67 72 65 67 61 74  gs & SF_Aggregat
32140 65 29 21 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65  e)!=0 ) continue
32150 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 53  ;.    assert( pS
32160 75 62 2d 3e 70 47 72 6f 75 70 42 79 3d 3d 30 20  ub->pGroupBy==0 
32170 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  );..    /* If th
32180 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 63 6f  e outer query co
32190 6e 74 61 69 6e 73 20 61 20 22 63 6f 6d 70 6c 65  ntains a "comple
321a0 78 22 20 72 65 73 75 6c 74 20 73 65 74 20 28 74  x" result set (t
321b0 68 61 74 20 69 73 2c 0a 20 20 20 20 2a 2a 20 69  hat is,.    ** i
321c0 66 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  f the result set
321d0 20 6f 66 20 74 68 65 20 6f 75 74 65 72 20 71 75   of the outer qu
321e0 65 72 79 20 75 73 65 73 20 66 75 6e 63 74 69 6f  ery uses functio
321f0 6e 73 20 6f 72 20 73 75 62 71 75 65 72 69 65 73  ns or subqueries
32200 29 0a 20 20 20 20 2a 2a 20 61 6e 64 20 69 66 20  ).    ** and if 
32210 74 68 65 20 73 75 62 71 75 65 72 79 20 63 6f 6e  the subquery con
32220 74 61 69 6e 73 20 61 6e 20 4f 52 44 45 52 20 42  tains an ORDER B
32230 59 20 63 6c 61 75 73 65 20 61 6e 64 20 69 66 0a  Y clause and if.
32240 20 20 20 20 2a 2a 20 69 74 20 77 69 6c 6c 20 62      ** it will b
32250 65 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 61 73  e implemented as
32260 20 61 20 63 6f 2d 72 6f 75 74 69 6e 65 2c 20 74   a co-routine, t
32270 68 65 6e 20 64 6f 20 6e 6f 74 20 66 6c 61 74 74  hen do not flatt
32280 65 6e 2e 20 20 54 68 69 73 0a 20 20 20 20 2a 2a  en.  This.    **
32290 20 72 65 73 74 72 69 63 74 69 6f 6e 20 61 6c 6c   restriction all
322a0 6f 77 73 20 53 51 4c 20 63 6f 6e 73 74 72 75 63  ows SQL construc
322b0 74 73 20 6c 69 6b 65 20 74 68 69 73 3a 0a 20 20  ts like this:.  
322c0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 53 45 4c    **.    **  SEL
322d0 45 43 54 20 65 78 70 65 6e 73 69 76 65 5f 66 75  ECT expensive_fu
322e0 6e 63 74 69 6f 6e 28 78 29 0a 20 20 20 20 2a 2a  nction(x).    **
322f0 20 20 20 20 46 52 4f 4d 20 28 53 45 4c 45 43 54      FROM (SELECT
32300 20 78 20 46 52 4f 4d 20 74 61 62 20 4f 52 44 45   x FROM tab ORDE
32310 52 20 42 59 20 79 20 4c 49 4d 49 54 20 31 30 29  R BY y LIMIT 10)
32320 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ;.    **.    ** 
32330 54 68 65 20 65 78 70 65 6e 73 69 76 65 5f 66 75  The expensive_fu
32340 6e 63 74 69 6f 6e 28 29 20 69 73 20 6f 6e 6c 79  nction() is only
32350 20 63 6f 6d 70 75 74 65 64 20 6f 6e 20 74 68 65   computed on the
32360 20 31 30 20 72 6f 77 73 20 74 68 61 74 0a 20 20   10 rows that.  
32370 20 20 2a 2a 20 61 72 65 20 6f 75 74 70 75 74 2c    ** are output,
32380 20 72 61 74 68 65 72 20 74 68 61 6e 20 65 76 65   rather than eve
32390 72 79 20 72 6f 77 20 6f 66 20 74 68 65 20 74 61  ry row of the ta
323a0 62 6c 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ble..    **.    
323b0 2a 2a 20 54 68 65 20 72 65 71 75 69 72 65 6d 65  ** The requireme
323c0 6e 74 20 74 68 61 74 20 74 68 65 20 6f 75 74 65  nt that the oute
323d0 72 20 71 75 65 72 79 20 68 61 76 65 20 61 20 63  r query have a c
323e0 6f 6d 70 6c 65 78 20 72 65 73 75 6c 74 20 73 65  omplex result se
323f0 74 0a 20 20 20 20 2a 2a 20 6d 65 61 6e 73 20 74  t.    ** means t
32400 68 61 74 20 66 6c 61 74 74 65 6e 69 6e 67 20 64  hat flattening d
32410 6f 65 73 20 6f 63 63 75 72 20 6f 6e 20 73 69 6d  oes occur on sim
32420 70 6c 65 72 20 53 51 4c 20 63 6f 6e 73 74 72 61  pler SQL constra
32430 69 6e 74 73 20 77 69 74 68 6f 75 74 0a 20 20 20  ints without.   
32440 20 2a 2a 20 74 68 65 20 65 78 70 65 6e 73 69 76   ** the expensiv
32450 65 5f 66 75 6e 63 74 69 6f 6e 28 29 20 6c 69 6b  e_function() lik
32460 65 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  e:.    **.    **
32470 20 20 53 45 4c 45 43 54 20 78 20 46 52 4f 4d 20    SELECT x FROM 
32480 28 53 45 4c 45 43 54 20 78 20 46 52 4f 4d 20 74  (SELECT x FROM t
32490 61 62 20 4f 52 44 45 52 20 42 59 20 79 20 4c 49  ab ORDER BY y LI
324a0 4d 49 54 20 31 30 29 3b 0a 20 20 20 20 2a 2f 0a  MIT 10);.    */.
324b0 20 20 20 20 69 66 28 20 70 53 75 62 2d 3e 70 4f      if( pSub->pO
324c0 72 64 65 72 42 79 21 3d 30 0a 20 20 20 20 20 26  rderBy!=0.     &
324d0 26 20 69 3d 3d 30 0a 20 20 20 20 20 26 26 20 28  & i==0.     && (
324e0 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46  p->selFlags & SF
324f0 5f 43 6f 6d 70 6c 65 78 52 65 73 75 6c 74 29 21  _ComplexResult)!
32500 3d 30 0a 20 20 20 20 20 26 26 20 28 70 54 61 62  =0.     && (pTab
32510 4c 69 73 74 2d 3e 6e 53 72 63 3d 3d 31 0a 20 20  List->nSrc==1.  
32520 20 20 20 20 20 20 20 7c 7c 20 28 70 54 61 62 4c         || (pTabL
32530 69 73 74 2d 3e 61 5b 31 5d 2e 66 67 2e 6a 6f 69  ist->a[1].fg.joi
32540 6e 74 79 70 65 26 28 4a 54 5f 4c 45 46 54 7c 4a  ntype&(JT_LEFT|J
32550 54 5f 43 52 4f 53 53 29 29 21 3d 30 29 0a 20 20  T_CROSS))!=0).  
32560 20 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 74 69    ){.      conti
32570 6e 75 65 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  nue;.    }..    
32580 69 66 28 20 66 6c 61 74 74 65 6e 53 75 62 71 75  if( flattenSubqu
32590 65 72 79 28 70 50 61 72 73 65 2c 20 70 2c 20 69  ery(pParse, p, i
325a0 2c 20 69 73 41 67 67 29 20 29 7b 0a 20 20 20 20  , isAgg) ){.    
325b0 20 20 2f 2a 20 54 68 69 73 20 73 75 62 71 75 65    /* This subque
325c0 72 79 20 63 61 6e 20 62 65 20 61 62 73 6f 72 62  ry can be absorb
325d0 65 64 20 69 6e 74 6f 20 69 74 73 20 70 61 72 65  ed into its pare
325e0 6e 74 2e 20 2a 2f 0a 20 20 20 20 20 20 69 20 3d  nt. */.      i =
325f0 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70   -1;.    }.    p
32600 54 61 62 4c 69 73 74 20 3d 20 70 2d 3e 70 53 72  TabList = p->pSr
32610 63 3b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 6d  c;.    if( db->m
32620 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 67 6f  allocFailed ) go
32630 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20  to select_end;. 
32640 20 20 20 69 66 28 20 21 49 67 6e 6f 72 61 62 6c     if( !Ignorabl
32650 65 4f 72 64 65 72 62 79 28 70 44 65 73 74 29 20  eOrderby(pDest) 
32660 29 7b 0a 20 20 20 20 20 20 73 53 6f 72 74 2e 70  ){.      sSort.p
32670 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72  OrderBy = p->pOr
32680 64 65 72 42 79 3b 0a 20 20 20 20 7d 0a 20 20 7d  derBy;.    }.  }
32690 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66  .#endif..#ifndef
326a0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d   SQLITE_OMIT_COM
326b0 50 4f 55 4e 44 5f 53 45 4c 45 43 54 0a 20 20 2f  POUND_SELECT.  /
326c0 2a 20 48 61 6e 64 6c 65 20 63 6f 6d 70 6f 75 6e  * Handle compoun
326d0 64 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  d SELECT stateme
326e0 6e 74 73 20 75 73 69 6e 67 20 74 68 65 20 73 65  nts using the se
326f0 70 61 72 61 74 65 20 6d 75 6c 74 69 53 65 6c 65  parate multiSele
32700 63 74 28 29 0a 20 20 2a 2a 20 70 72 6f 63 65 64  ct().  ** proced
32710 75 72 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ure..  */.  if( 
32720 70 2d 3e 70 50 72 69 6f 72 20 29 7b 0a 20 20 20  p->pPrior ){.   
32730 20 72 63 20 3d 20 6d 75 6c 74 69 53 65 6c 65 63   rc = multiSelec
32740 74 28 70 50 61 72 73 65 2c 20 70 2c 20 70 44 65  t(pParse, p, pDe
32750 73 74 29 3b 0a 23 69 66 20 53 45 4c 45 43 54 54  st);.#if SELECTT
32760 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20 20  RACE_ENABLED.   
32770 20 53 45 4c 45 43 54 54 52 41 43 45 28 30 78 31   SELECTTRACE(0x1
32780 2c 70 50 61 72 73 65 2c 70 2c 28 22 65 6e 64 20  ,pParse,p,("end 
32790 63 6f 6d 70 6f 75 6e 64 2d 73 65 6c 65 63 74 20  compound-select 
327a0 70 72 6f 63 65 73 73 69 6e 67 5c 6e 22 29 29 3b  processing\n"));
327b0 0a 20 20 20 20 69 66 28 20 28 73 71 6c 69 74 65  .    if( (sqlite
327c0 33 53 65 6c 65 63 74 54 72 61 63 65 20 26 20 30  3SelectTrace & 0
327d0 78 32 30 30 30 29 21 3d 30 20 26 26 20 45 78 70  x2000)!=0 && Exp
327e0 6c 61 69 6e 51 75 65 72 79 50 6c 61 6e 50 61 72  lainQueryPlanPar
327f0 65 6e 74 28 70 50 61 72 73 65 29 3d 3d 30 20 29  ent(pParse)==0 )
32800 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 54  {.      sqlite3T
32810 72 65 65 56 69 65 77 53 65 6c 65 63 74 28 30 2c  reeViewSelect(0,
32820 20 70 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 23 65   p, 0);.    }.#e
32830 6e 64 69 66 0a 20 20 20 20 69 66 28 20 70 2d 3e  ndif.    if( p->
32840 70 4e 65 78 74 3d 3d 30 20 29 20 45 78 70 6c 61  pNext==0 ) Expla
32850 69 6e 51 75 65 72 79 50 6c 61 6e 50 6f 70 28 70  inQueryPlanPop(p
32860 50 61 72 73 65 29 3b 0a 20 20 20 20 72 65 74 75  Parse);.    retu
32870 72 6e 20 72 63 3b 0a 20 20 7d 0a 23 65 6e 64 69  rn rc;.  }.#endi
32880 66 0a 0a 20 20 2f 2a 20 44 6f 20 74 68 65 20 57  f..  /* Do the W
32890 48 45 52 45 2d 63 6c 61 75 73 65 20 63 6f 6e 73  HERE-clause cons
328a0 74 61 6e 74 20 70 72 6f 70 61 67 61 74 69 6f 6e  tant propagation
328b0 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69 66   optimization if
328c0 20 74 68 69 73 20 69 73 0a 20 20 2a 2a 20 61 20   this is.  ** a 
328d0 6a 6f 69 6e 2e 20 20 4e 6f 20 6e 65 65 64 20 74  join.  No need t
328e0 6f 20 73 70 65 65 64 20 74 69 6d 65 20 6f 6e 20  o speed time on 
328f0 74 68 69 73 20 6f 70 65 72 61 74 69 6f 6e 20 66  this operation f
32900 6f 72 20 6e 6f 6e 2d 6a 6f 69 6e 20 71 75 65 72  or non-join quer
32910 69 65 73 0a 20 20 2a 2a 20 61 73 20 74 68 65 20  ies.  ** as the 
32920 65 71 75 69 76 61 6c 65 6e 74 20 6f 70 74 69 6d  equivalent optim
32930 69 7a 61 74 69 6f 6e 20 77 69 6c 6c 20 62 65 20  ization will be 
32940 68 61 6e 64 6c 65 64 20 62 79 20 71 75 65 72 79  handled by query
32950 20 70 6c 61 6e 6e 65 72 20 69 6e 0a 20 20 2a 2a   planner in.  **
32960 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67   sqlite3WhereBeg
32970 69 6e 28 29 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  in()..  */.  if(
32980 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3e   pTabList->nSrc>
32990 31 0a 20 20 20 26 26 20 4f 70 74 69 6d 69 7a 61  1.   && Optimiza
329a0 74 69 6f 6e 45 6e 61 62 6c 65 64 28 64 62 2c 20  tionEnabled(db, 
329b0 53 51 4c 49 54 45 5f 50 72 6f 70 61 67 61 74 65  SQLITE_Propagate
329c0 43 6f 6e 73 74 29 0a 20 20 20 26 26 20 70 72 6f  Const).   && pro
329d0 70 61 67 61 74 65 43 6f 6e 73 74 61 6e 74 73 28  pagateConstants(
329e0 70 50 61 72 73 65 2c 20 70 29 0a 20 20 29 7b 0a  pParse, p).  ){.
329f0 23 69 66 20 53 45 4c 45 43 54 54 52 41 43 45 5f  #if SELECTTRACE_
32a00 45 4e 41 42 4c 45 44 0a 20 20 20 20 69 66 28 20  ENABLED.    if( 
32a10 73 71 6c 69 74 65 33 53 65 6c 65 63 74 54 72 61  sqlite3SelectTra
32a20 63 65 20 26 20 30 78 31 30 30 20 29 7b 0a 20 20  ce & 0x100 ){.  
32a30 20 20 20 20 53 45 4c 45 43 54 54 52 41 43 45 28      SELECTTRACE(
32a40 30 78 31 30 30 2c 70 50 61 72 73 65 2c 70 2c 28  0x100,pParse,p,(
32a50 22 41 66 74 65 72 20 63 6f 6e 73 74 61 6e 74 20  "After constant 
32a60 70 72 6f 70 61 67 61 74 69 6f 6e 3a 5c 6e 22 29  propagation:\n")
32a70 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
32a80 54 72 65 65 56 69 65 77 53 65 6c 65 63 74 28 30  TreeViewSelect(0
32a90 2c 20 70 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 23  , p, 0);.    }.#
32aa0 65 6e 64 69 66 0a 20 20 7d 65 6c 73 65 7b 0a 20  endif.  }else{. 
32ab0 20 20 20 53 45 4c 45 43 54 54 52 41 43 45 28 30     SELECTTRACE(0
32ac0 78 31 30 30 2c 70 50 61 72 73 65 2c 70 2c 28 22  x100,pParse,p,("
32ad0 43 6f 6e 73 74 61 6e 74 20 70 72 6f 70 61 67 61  Constant propaga
32ae0 74 69 6f 6e 20 6e 6f 74 20 68 65 6c 70 66 75 6c  tion not helpful
32af0 5c 6e 22 29 29 3b 0a 20 20 7d 0a 0a 23 69 66 64  \n"));.  }..#ifd
32b00 65 66 20 53 51 4c 49 54 45 5f 43 4f 55 4e 54 4f  ef SQLITE_COUNTO
32b10 46 56 49 45 57 5f 4f 50 54 49 4d 49 5a 41 54 49  FVIEW_OPTIMIZATI
32b20 4f 4e 0a 20 20 69 66 28 20 4f 70 74 69 6d 69 7a  ON.  if( Optimiz
32b30 61 74 69 6f 6e 45 6e 61 62 6c 65 64 28 64 62 2c  ationEnabled(db,
32b40 20 53 51 4c 49 54 45 5f 51 75 65 72 79 46 6c 61   SQLITE_QueryFla
32b50 74 74 65 6e 65 72 7c 53 51 4c 49 54 45 5f 43 6f  ttener|SQLITE_Co
32b60 75 6e 74 4f 66 56 69 65 77 29 0a 20 20 20 26 26  untOfView).   &&
32b70 20 63 6f 75 6e 74 4f 66 56 69 65 77 4f 70 74 69   countOfViewOpti
32b80 6d 69 7a 61 74 69 6f 6e 28 70 50 61 72 73 65 2c  mization(pParse,
32b90 20 70 29 0a 20 20 29 7b 0a 20 20 20 20 69 66 28   p).  ){.    if(
32ba0 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
32bb0 64 20 29 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f  d ) goto select_
32bc0 65 6e 64 3b 0a 20 20 20 20 70 45 4c 69 73 74 20  end;.    pEList 
32bd0 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 20  = p->pEList;.   
32be0 20 70 54 61 62 4c 69 73 74 20 3d 20 70 2d 3e 70   pTabList = p->p
32bf0 53 72 63 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  Src;.  }.#endif.
32c00 0a 20 20 2f 2a 20 46 6f 72 20 65 61 63 68 20 74  .  /* For each t
32c10 65 72 6d 20 69 6e 20 74 68 65 20 46 52 4f 4d 20  erm in the FROM 
32c20 63 6c 61 75 73 65 2c 20 64 6f 20 74 77 6f 20 74  clause, do two t
32c30 68 69 6e 67 73 3a 0a 20 20 2a 2a 20 28 31 29 20  hings:.  ** (1) 
32c40 41 75 74 68 6f 72 69 7a 65 64 20 75 6e 72 65 66  Authorized unref
32c50 65 72 65 6e 63 65 64 20 74 61 62 6c 65 73 0a 20  erenced tables. 
32c60 20 2a 2a 20 28 32 29 20 47 65 6e 65 72 61 74 65   ** (2) Generate
32c70 20 63 6f 64 65 20 66 6f 72 20 61 6c 6c 20 73 75   code for all su
32c80 62 2d 71 75 65 72 69 65 73 0a 20 20 2a 2f 0a 20  b-queries.  */. 
32c90 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54 61 62   for(i=0; i<pTab
32ca0 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29  List->nSrc; i++)
32cb0 7b 0a 20 20 20 20 73 74 72 75 63 74 20 53 72 63  {.    struct Src
32cc0 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
32cd0 20 3d 20 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b   = &pTabList->a[
32ce0 69 5d 3b 0a 20 20 20 20 53 65 6c 65 63 74 44 65  i];.    SelectDe
32cf0 73 74 20 64 65 73 74 3b 0a 20 20 20 20 53 65 6c  st dest;.    Sel
32d00 65 63 74 20 2a 70 53 75 62 3b 0a 23 69 66 20 21  ect *pSub;.#if !
32d10 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
32d20 4d 49 54 5f 53 55 42 51 55 45 52 59 29 20 7c 7c  MIT_SUBQUERY) ||
32d30 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
32d40 5f 4f 4d 49 54 5f 56 49 45 57 29 0a 20 20 20 20  _OMIT_VIEW).    
32d50 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 61 76  const char *zSav
32d60 65 64 41 75 74 68 43 6f 6e 74 65 78 74 3b 0a 23  edAuthContext;.#
32d70 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 49 73  endif..    /* Is
32d80 73 75 65 20 53 51 4c 49 54 45 5f 52 45 41 44 20  sue SQLITE_READ 
32d90 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e 73 20 77  authorizations w
32da0 69 74 68 20 61 20 66 61 6b 65 20 63 6f 6c 75 6d  ith a fake colum
32db0 6e 20 6e 61 6d 65 20 66 6f 72 20 61 6e 79 0a 20  n name for any. 
32dc0 20 20 20 2a 2a 20 74 61 62 6c 65 73 20 74 68 61     ** tables tha
32dd0 74 20 61 72 65 20 72 65 66 65 72 65 6e 63 65 64  t are referenced
32de0 20 62 75 74 20 66 72 6f 6d 20 77 68 69 63 68 20   but from which 
32df0 6e 6f 20 76 61 6c 75 65 73 20 61 72 65 20 65 78  no values are ex
32e00 74 72 61 63 74 65 64 2e 0a 20 20 20 20 2a 2a 20  tracted..    ** 
32e10 45 78 61 6d 70 6c 65 73 20 6f 66 20 77 68 65 72  Examples of wher
32e20 65 20 74 68 65 73 65 20 6b 69 6e 64 73 20 6f 66  e these kinds of
32e30 20 6e 75 6c 6c 20 53 51 4c 49 54 45 5f 52 45 41   null SQLITE_REA
32e40 44 20 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e 73  D authorizations
32e50 0a 20 20 20 20 2a 2a 20 77 6f 75 6c 64 20 6f 63  .    ** would oc
32e60 63 75 72 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20  cur:.    **.    
32e70 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 63 6f  **     SELECT co
32e80 75 6e 74 28 2a 29 20 46 52 4f 4d 20 74 31 3b 20  unt(*) FROM t1; 
32e90 20 20 2d 2d 20 53 51 4c 49 54 45 5f 52 45 41 44    -- SQLITE_READ
32ea0 20 74 31 2e 22 22 0a 20 20 20 20 2a 2a 20 20 20   t1."".    **   
32eb0 20 20 53 45 4c 45 43 54 20 74 31 2e 2a 20 46 52    SELECT t1.* FR
32ec0 4f 4d 20 74 31 2c 20 74 32 3b 20 20 20 2d 2d 20  OM t1, t2;   -- 
32ed0 53 51 4c 49 54 45 5f 52 45 41 44 20 74 32 2e 22  SQLITE_READ t2."
32ee0 22 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ".    **.    ** 
32ef0 54 68 65 20 66 61 6b 65 20 63 6f 6c 75 6d 6e 20  The fake column 
32f00 6e 61 6d 65 20 69 73 20 61 6e 20 65 6d 70 74 79  name is an empty
32f10 20 73 74 72 69 6e 67 2e 20 20 49 74 20 69 73 20   string.  It is 
32f20 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 61 20 74  possible for a t
32f30 61 62 6c 65 20 74 6f 0a 20 20 20 20 2a 2a 20 68  able to.    ** h
32f40 61 76 65 20 61 20 63 6f 6c 75 6d 6e 20 6e 61 6d  ave a column nam
32f50 65 64 20 62 79 20 74 68 65 20 65 6d 70 74 79 20  ed by the empty 
32f60 73 74 72 69 6e 67 2c 20 69 6e 20 77 68 69 63 68  string, in which
32f70 20 63 61 73 65 20 74 68 65 72 65 20 69 73 20 6e   case there is n
32f80 6f 20 77 61 79 20 74 6f 0a 20 20 20 20 2a 2a 20  o way to.    ** 
32f90 64 69 73 74 69 6e 67 75 69 73 68 20 62 65 74 77  distinguish betw
32fa0 65 65 6e 20 61 6e 20 75 6e 72 65 66 65 72 65 6e  een an unreferen
32fb0 63 65 64 20 74 61 62 6c 65 20 61 6e 64 20 61 6e  ced table and an
32fc0 20 61 63 74 75 61 6c 20 72 65 66 65 72 65 6e 63   actual referenc
32fd0 65 20 74 6f 20 74 68 65 0a 20 20 20 20 2a 2a 20  e to the.    ** 
32fe0 22 22 20 63 6f 6c 75 6d 6e 2e 20 54 68 65 20 6f  "" column. The o
32ff0 72 69 67 69 6e 61 6c 20 64 65 73 69 67 6e 20 77  riginal design w
33000 61 73 20 66 6f 72 20 74 68 65 20 66 61 6b 65 20  as for the fake 
33010 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 74 6f 20 62  column name to b
33020 65 20 61 20 4e 55 4c 4c 2c 0a 20 20 20 20 2a 2a  e a NULL,.    **
33030 20 77 68 69 63 68 20 77 6f 75 6c 64 20 62 65 20   which would be 
33040 75 6e 61 6d 62 69 67 75 6f 75 73 2e 20 20 42 75  unambiguous.  Bu
33050 74 20 6c 65 67 61 63 79 20 61 75 74 68 6f 72 69  t legacy authori
33060 7a 61 74 69 6f 6e 20 63 61 6c 6c 62 61 63 6b 73  zation callbacks
33070 20 6d 69 67 68 74 0a 20 20 20 20 2a 2a 20 61 73   might.    ** as
33080 73 75 6d 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20  sume the column 
33090 6e 61 6d 65 20 69 73 20 6e 6f 6e 2d 4e 55 4c 4c  name is non-NULL
330a0 20 61 6e 64 20 73 65 67 66 61 75 6c 74 2e 20 20   and segfault.  
330b0 54 68 65 20 75 73 65 20 6f 66 20 61 6e 20 65 6d  The use of an em
330c0 70 74 79 0a 20 20 20 20 2a 2a 20 73 74 72 69 6e  pty.    ** strin
330d0 67 20 66 6f 72 20 74 68 65 20 66 61 6b 65 20 63  g for the fake c
330e0 6f 6c 75 6d 6e 20 6e 61 6d 65 20 73 65 65 6d 73  olumn name seems
330f0 20 73 61 66 65 72 2e 0a 20 20 20 20 2a 2f 0a 20   safer..    */. 
33100 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 63 6f     if( pItem->co
33110 6c 55 73 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20  lUsed==0 ){.    
33120 20 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65    sqlite3AuthChe
33130 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54  ck(pParse, SQLIT
33140 45 5f 52 45 41 44 2c 20 70 49 74 65 6d 2d 3e 7a  E_READ, pItem->z
33150 4e 61 6d 65 2c 20 22 22 2c 20 70 49 74 65 6d 2d  Name, "", pItem-
33160 3e 7a 44 61 74 61 62 61 73 65 29 3b 0a 20 20 20  >zDatabase);.   
33170 20 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64   }..#if !defined
33180 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42  (SQLITE_OMIT_SUB
33190 51 55 45 52 59 29 20 7c 7c 20 21 64 65 66 69 6e  QUERY) || !defin
331a0 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ed(SQLITE_OMIT_V
331b0 49 45 57 29 0a 20 20 20 20 2f 2a 20 47 65 6e 65  IEW).    /* Gene
331c0 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 61 6c  rate code for al
331d0 6c 20 73 75 62 2d 71 75 65 72 69 65 73 20 69 6e  l sub-queries in
331e0 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
331f0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 53 75 62  .    */.    pSub
33200 20 3d 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63   = pItem->pSelec
33210 74 3b 0a 20 20 20 20 69 66 28 20 70 53 75 62 3d  t;.    if( pSub=
33220 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 0a  =0 ) continue;..
33230 20 20 20 20 2f 2a 20 53 6f 6d 65 74 69 6d 65 73      /* Sometimes
33240 20 74 68 65 20 63 6f 64 65 20 66 6f 72 20 61 20   the code for a 
33250 73 75 62 71 75 65 72 79 20 77 69 6c 6c 20 62 65  subquery will be
33260 20 67 65 6e 65 72 61 74 65 64 20 6d 6f 72 65 20   generated more 
33270 74 68 61 6e 0a 20 20 20 20 2a 2a 20 6f 6e 63 65  than.    ** once
33280 2c 20 69 66 20 74 68 65 20 73 75 62 71 75 65 72  , if the subquer
33290 79 20 69 73 20 70 61 72 74 20 6f 66 20 74 68 65  y is part of the
332a0 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 69 6e   WHERE clause in
332b0 20 61 20 4c 45 46 54 20 4a 4f 49 4e 2c 0a 20 20   a LEFT JOIN,.  
332c0 20 20 2a 2a 20 66 6f 72 20 65 78 61 6d 70 6c 65    ** for example
332d0 2e 20 20 49 6e 20 74 68 61 74 20 63 61 73 65 2c  .  In that case,
332e0 20 64 6f 20 6e 6f 74 20 72 65 67 65 6e 65 72 61   do not regenera
332f0 74 65 20 74 68 65 20 63 6f 64 65 20 74 6f 20 6d  te the code to m
33300 61 6e 69 66 65 73 74 0a 20 20 20 20 2a 2a 20 61  anifest.    ** a
33310 20 76 69 65 77 20 6f 72 20 74 68 65 20 63 6f 2d   view or the co-
33320 72 6f 75 74 69 6e 65 20 74 6f 20 69 6d 70 6c 65  routine to imple
33330 6d 65 6e 74 20 61 20 76 69 65 77 2e 20 20 54 68  ment a view.  Th
33340 65 20 66 69 72 73 74 20 69 6e 73 74 61 6e 63 65  e first instance
33350 0a 20 20 20 20 2a 2a 20 69 73 20 73 75 66 66 69  .    ** is suffi
33360 63 69 65 6e 74 2c 20 74 68 6f 75 67 68 20 74 68  cient, though th
33370 65 20 73 75 62 72 6f 75 74 69 6e 65 20 74 6f 20  e subroutine to 
33380 6d 61 6e 69 66 65 73 74 20 74 68 65 20 76 69 65  manifest the vie
33390 77 20 64 6f 65 73 20 6e 65 65 64 0a 20 20 20 20  w does need.    
333a0 2a 2a 20 74 6f 20 62 65 20 69 6e 76 6f 6b 65 64  ** to be invoked
333b0 20 61 67 61 69 6e 2e 20 2a 2f 0a 20 20 20 20 69   again. */.    i
333c0 66 28 20 70 49 74 65 6d 2d 3e 61 64 64 72 46 69  f( pItem->addrFi
333d0 6c 6c 53 75 62 20 29 7b 0a 20 20 20 20 20 20 69  llSub ){.      i
333e0 66 28 20 70 49 74 65 6d 2d 3e 66 67 2e 76 69 61  f( pItem->fg.via
333f0 43 6f 72 6f 75 74 69 6e 65 3d 3d 30 20 29 7b 0a  Coroutine==0 ){.
33400 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73          /* The s
33410 75 62 72 6f 75 74 69 6e 65 20 74 68 61 74 20 6d  ubroutine that m
33420 61 6e 69 66 65 73 74 73 20 74 68 65 20 76 69 65  anifests the vie
33430 77 20 6d 69 67 68 74 20 62 65 20 61 20 6f 6e 65  w might be a one
33440 2d 74 69 6d 65 20 72 6f 75 74 69 6e 65 2c 0a 20  -time routine,. 
33450 20 20 20 20 20 20 20 2a 2a 20 6f 72 20 69 74 20         ** or it 
33460 6d 69 67 68 74 20 6e 65 65 64 20 74 6f 20 62 65  might need to be
33470 20 72 65 72 75 6e 20 6f 6e 20 65 61 63 68 20 69   rerun on each i
33480 74 65 72 61 74 69 6f 6e 20 62 65 63 61 75 73 65  teration because
33490 20 69 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 65   it.        ** e
334a0 6e 63 6f 64 65 73 20 61 20 63 6f 72 72 65 6c 61  ncodes a correla
334b0 74 65 64 20 73 75 62 71 75 65 72 79 2e 20 2a 2f  ted subquery. */
334c0 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
334d0 65 28 20 73 71 6c 69 74 65 33 56 64 62 65 47 65  e( sqlite3VdbeGe
334e0 74 4f 70 28 76 2c 20 70 49 74 65 6d 2d 3e 61 64  tOp(v, pItem->ad
334f0 64 72 46 69 6c 6c 53 75 62 29 2d 3e 6f 70 63 6f  drFillSub)->opco
33500 64 65 3d 3d 4f 50 5f 4f 6e 63 65 20 29 3b 0a 20  de==OP_Once );. 
33510 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
33520 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47  beAddOp2(v, OP_G
33530 6f 73 75 62 2c 20 70 49 74 65 6d 2d 3e 72 65 67  osub, pItem->reg
33540 52 65 74 75 72 6e 2c 20 70 49 74 65 6d 2d 3e 61  Return, pItem->a
33550 64 64 72 46 69 6c 6c 53 75 62 29 3b 0a 20 20 20  ddrFillSub);.   
33560 20 20 20 7d 0a 20 20 20 20 20 20 63 6f 6e 74 69     }.      conti
33570 6e 75 65 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  nue;.    }..    
33580 2f 2a 20 49 6e 63 72 65 6d 65 6e 74 20 50 61 72  /* Increment Par
33590 73 65 2e 6e 48 65 69 67 68 74 20 62 79 20 74 68  se.nHeight by th
335a0 65 20 68 65 69 67 68 74 20 6f 66 20 74 68 65 20  e height of the 
335b0 6c 61 72 67 65 73 74 20 65 78 70 72 65 73 73 69  largest expressi
335c0 6f 6e 0a 20 20 20 20 2a 2a 20 74 72 65 65 20 72  on.    ** tree r
335d0 65 66 65 72 72 65 64 20 74 6f 20 62 79 20 74 68  eferred to by th
335e0 69 73 2c 20 74 68 65 20 70 61 72 65 6e 74 20 73  is, the parent s
335f0 65 6c 65 63 74 2e 20 54 68 65 20 63 68 69 6c 64  elect. The child
33600 20 73 65 6c 65 63 74 0a 20 20 20 20 2a 2a 20 6d   select.    ** m
33610 61 79 20 63 6f 6e 74 61 69 6e 20 65 78 70 72 65  ay contain expre
33620 73 73 69 6f 6e 20 74 72 65 65 73 20 6f 66 20 61  ssion trees of a
33630 74 20 6d 6f 73 74 0a 20 20 20 20 2a 2a 20 28 53  t most.    ** (S
33640 51 4c 49 54 45 5f 4d 41 58 5f 45 58 50 52 5f 44  QLITE_MAX_EXPR_D
33650 45 50 54 48 2d 50 61 72 73 65 2e 6e 48 65 69 67  EPTH-Parse.nHeig
33660 68 74 29 20 68 65 69 67 68 74 2e 20 54 68 69 73  ht) height. This
33670 20 69 73 20 61 20 62 69 74 0a 20 20 20 20 2a 2a   is a bit.    **
33680 20 6d 6f 72 65 20 63 6f 6e 73 65 72 76 61 74 69   more conservati
33690 76 65 20 74 68 61 6e 20 6e 65 63 65 73 73 61 72  ve than necessar
336a0 79 2c 20 62 75 74 20 6d 75 63 68 20 65 61 73 69  y, but much easi
336b0 65 72 20 74 68 61 6e 20 65 6e 66 6f 72 63 69 6e  er than enforcin
336c0 67 0a 20 20 20 20 2a 2a 20 61 6e 20 65 78 61 63  g.    ** an exac
336d0 74 20 6c 69 6d 69 74 2e 0a 20 20 20 20 2a 2f 0a  t limit..    */.
336e0 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 48 65 69      pParse->nHei
336f0 67 68 74 20 2b 3d 20 73 71 6c 69 74 65 33 53 65  ght += sqlite3Se
33700 6c 65 63 74 45 78 70 72 48 65 69 67 68 74 28 70  lectExprHeight(p
33710 29 3b 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 20  );..    /* Make 
33720 63 6f 70 69 65 73 20 6f 66 20 63 6f 6e 73 74 61  copies of consta
33730 6e 74 20 57 48 45 52 45 2d 63 6c 61 75 73 65 20  nt WHERE-clause 
33740 74 65 72 6d 73 20 69 6e 20 74 68 65 20 6f 75 74  terms in the out
33750 65 72 20 71 75 65 72 79 20 64 6f 77 6e 0a 20 20  er query down.  
33760 20 20 2a 2a 20 69 6e 73 69 64 65 20 74 68 65 20    ** inside the 
33770 73 75 62 71 75 65 72 79 2e 20 20 54 68 69 73 20  subquery.  This 
33780 63 61 6e 20 68 65 6c 70 20 74 68 65 20 73 75 62  can help the sub
33790 71 75 65 72 79 20 74 6f 20 72 75 6e 20 6d 6f 72  query to run mor
337a0 65 20 65 66 66 69 63 69 65 6e 74 6c 79 2e 0a 20  e efficiently.. 
337b0 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 4f 70     */.    if( Op
337c0 74 69 6d 69 7a 61 74 69 6f 6e 45 6e 61 62 6c 65  timizationEnable
337d0 64 28 64 62 2c 20 53 51 4c 49 54 45 5f 50 75 73  d(db, SQLITE_Pus
337e0 68 44 6f 77 6e 29 0a 20 20 20 20 20 26 26 20 70  hDown).     && p
337f0 75 73 68 44 6f 77 6e 57 68 65 72 65 54 65 72 6d  ushDownWhereTerm
33800 73 28 70 50 61 72 73 65 2c 20 70 53 75 62 2c 20  s(pParse, pSub, 
33810 70 2d 3e 70 57 68 65 72 65 2c 20 70 49 74 65 6d  p->pWhere, pItem
33820 2d 3e 69 43 75 72 73 6f 72 2c 0a 20 20 20 20 20  ->iCursor,.     
33830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33840 20 20 20 20 20 20 28 70 49 74 65 6d 2d 3e 66 67        (pItem->fg
33850 2e 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 4f  .jointype & JT_O
33860 55 54 45 52 29 21 3d 30 29 0a 20 20 20 20 29 7b  UTER)!=0).    ){
33870 0a 23 69 66 20 53 45 4c 45 43 54 54 52 41 43 45  .#if SELECTTRACE
33880 5f 45 4e 41 42 4c 45 44 0a 20 20 20 20 20 20 69  _ENABLED.      i
33890 66 28 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  f( sqlite3Select
338a0 54 72 61 63 65 20 26 20 30 78 31 30 30 20 29 7b  Trace & 0x100 ){
338b0 0a 20 20 20 20 20 20 20 20 53 45 4c 45 43 54 54  .        SELECTT
338c0 52 41 43 45 28 30 78 31 30 30 2c 70 50 61 72 73  RACE(0x100,pPars
338d0 65 2c 70 2c 0a 20 20 20 20 20 20 20 20 20 20 20  e,p,.           
338e0 20 28 22 41 66 74 65 72 20 57 48 45 52 45 2d 63   ("After WHERE-c
338f0 6c 61 75 73 65 20 70 75 73 68 2d 64 6f 77 6e 20  lause push-down 
33900 69 6e 74 6f 20 73 75 62 71 75 65 72 79 20 25 64  into subquery %d
33910 3a 5c 6e 22 2c 20 70 53 75 62 2d 3e 73 65 6c 49  :\n", pSub->selI
33920 64 29 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  d));.        sql
33930 69 74 65 33 54 72 65 65 56 69 65 77 53 65 6c 65  ite3TreeViewSele
33940 63 74 28 30 2c 20 70 2c 20 30 29 3b 0a 20 20 20  ct(0, p, 0);.   
33950 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
33960 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 53 45 4c  }else{.      SEL
33970 45 43 54 54 52 41 43 45 28 30 78 31 30 30 2c 70  ECTTRACE(0x100,p
33980 50 61 72 73 65 2c 70 2c 28 22 50 75 73 68 2d 64  Parse,p,("Push-d
33990 6f 77 6e 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65  own not possible
339a0 5c 6e 22 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  \n"));.    }..  
339b0 20 20 7a 53 61 76 65 64 41 75 74 68 43 6f 6e 74    zSavedAuthCont
339c0 65 78 74 20 3d 20 70 50 61 72 73 65 2d 3e 7a 41  ext = pParse->zA
339d0 75 74 68 43 6f 6e 74 65 78 74 3b 0a 20 20 20 20  uthContext;.    
339e0 70 50 61 72 73 65 2d 3e 7a 41 75 74 68 43 6f 6e  pParse->zAuthCon
339f0 74 65 78 74 20 3d 20 70 49 74 65 6d 2d 3e 7a 4e  text = pItem->zN
33a00 61 6d 65 3b 0a 0a 20 20 20 20 2f 2a 20 47 65 6e  ame;..    /* Gen
33a10 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 69 6d  erate code to im
33a20 70 6c 65 6d 65 6e 74 20 74 68 65 20 73 75 62 71  plement the subq
33a30 75 65 72 79 0a 20 20 20 20 2a 2a 0a 20 20 20 20  uery.    **.    
33a40 2a 2a 20 54 68 65 20 73 75 62 71 75 65 72 79 20  ** The subquery 
33a50 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 61  is implemented a
33a60 73 20 61 20 63 6f 2d 72 6f 75 74 69 6e 65 20 69  s a co-routine i
33a70 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20 69  f the subquery i
33a80 73 0a 20 20 20 20 2a 2a 20 67 75 61 72 61 6e 74  s.    ** guarant
33a90 65 65 64 20 74 6f 20 62 65 20 74 68 65 20 6f 75  eed to be the ou
33aa0 74 65 72 20 6c 6f 6f 70 20 28 73 6f 20 74 68 61  ter loop (so tha
33ab0 74 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 6e 65  t it does not ne
33ac0 65 64 20 74 6f 20 62 65 0a 20 20 20 20 2a 2a 20  ed to be.    ** 
33ad0 63 6f 6d 70 75 74 65 64 20 6d 6f 72 65 20 74 68  computed more th
33ae0 61 6e 20 6f 6e 63 65 29 0a 20 20 20 20 2a 2a 0a  an once).    **.
33af0 20 20 20 20 2a 2a 20 54 4f 44 4f 3a 20 41 72 65      ** TODO: Are
33b00 20 74 68 65 72 65 20 6f 74 68 65 72 20 72 65 61   there other rea
33b10 73 6f 6e 73 20 62 65 73 69 64 65 20 28 31 29 20  sons beside (1) 
33b20 74 6f 20 75 73 65 20 61 20 63 6f 2d 72 6f 75 74  to use a co-rout
33b30 69 6e 65 0a 20 20 20 20 2a 2a 20 69 6d 70 6c 65  ine.    ** imple
33b40 6d 65 6e 74 61 74 69 6f 6e 3f 0a 20 20 20 20 2a  mentation?.    *
33b50 2f 0a 20 20 20 20 69 66 28 20 69 3d 3d 30 0a 20  /.    if( i==0. 
33b60 20 20 20 20 26 26 20 28 70 54 61 62 4c 69 73 74      && (pTabList
33b70 2d 3e 6e 53 72 63 3d 3d 31 0a 20 20 20 20 20 20  ->nSrc==1.      
33b80 20 20 20 20 20 20 7c 7c 20 28 70 54 61 62 4c 69        || (pTabLi
33b90 73 74 2d 3e 61 5b 31 5d 2e 66 67 2e 6a 6f 69 6e  st->a[1].fg.join
33ba0 74 79 70 65 26 28 4a 54 5f 4c 45 46 54 7c 4a 54  type&(JT_LEFT|JT
33bb0 5f 43 52 4f 53 53 29 29 21 3d 30 29 20 20 2f 2a  _CROSS))!=0)  /*
33bc0 20 28 31 29 20 2a 2f 0a 20 20 20 20 29 7b 0a 20   (1) */.    ){. 
33bd0 20 20 20 20 20 2f 2a 20 49 6d 70 6c 65 6d 65 6e       /* Implemen
33be0 74 20 61 20 63 6f 2d 72 6f 75 74 69 6e 65 20 74  t a co-routine t
33bf0 68 61 74 20 77 69 6c 6c 20 72 65 74 75 72 6e 20  hat will return 
33c00 61 20 73 69 6e 67 6c 65 20 72 6f 77 20 6f 66 20  a single row of 
33c10 74 68 65 20 72 65 73 75 6c 74 0a 20 20 20 20 20  the result.     
33c20 20 2a 2a 20 73 65 74 20 6f 6e 20 65 61 63 68 20   ** set on each 
33c30 69 6e 76 6f 63 61 74 69 6f 6e 2e 0a 20 20 20 20  invocation..    
33c40 20 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61    */.      int a
33c50 64 64 72 54 6f 70 20 3d 20 73 71 6c 69 74 65 33  ddrTop = sqlite3
33c60 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
33c70 76 29 2b 31 3b 0a 20 20 20 20 20 0a 20 20 20 20  v)+1;.     .    
33c80 20 20 70 49 74 65 6d 2d 3e 72 65 67 52 65 74 75    pItem->regRetu
33c90 72 6e 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  rn = ++pParse->n
33ca0 4d 65 6d 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  Mem;.      sqlit
33cb0 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
33cc0 4f 50 5f 49 6e 69 74 43 6f 72 6f 75 74 69 6e 65  OP_InitCoroutine
33cd0 2c 20 70 49 74 65 6d 2d 3e 72 65 67 52 65 74 75  , pItem->regRetu
33ce0 72 6e 2c 20 30 2c 20 61 64 64 72 54 6f 70 29 3b  rn, 0, addrTop);
33cf0 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65  .      VdbeComme
33d00 6e 74 28 28 76 2c 20 22 25 73 22 2c 20 70 49 74  nt((v, "%s", pIt
33d10 65 6d 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65 29  em->pTab->zName)
33d20 29 3b 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e  );.      pItem->
33d30 61 64 64 72 46 69 6c 6c 53 75 62 20 3d 20 61 64  addrFillSub = ad
33d40 64 72 54 6f 70 3b 0a 20 20 20 20 20 20 73 71 6c  drTop;.      sql
33d50 69 74 65 33 53 65 6c 65 63 74 44 65 73 74 49 6e  ite3SelectDestIn
33d60 69 74 28 26 64 65 73 74 2c 20 53 52 54 5f 43 6f  it(&dest, SRT_Co
33d70 72 6f 75 74 69 6e 65 2c 20 70 49 74 65 6d 2d 3e  routine, pItem->
33d80 72 65 67 52 65 74 75 72 6e 29 3b 0a 20 20 20 20  regReturn);.    
33d90 20 20 45 78 70 6c 61 69 6e 51 75 65 72 79 50 6c    ExplainQueryPl
33da0 61 6e 28 28 70 50 61 72 73 65 2c 20 31 2c 20 22  an((pParse, 1, "
33db0 43 4f 2d 52 4f 55 54 49 4e 45 20 25 75 22 2c 20  CO-ROUTINE %u", 
33dc0 70 53 75 62 2d 3e 73 65 6c 49 64 29 29 3b 0a 20  pSub->selId));. 
33dd0 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65       sqlite3Sele
33de0 63 74 28 70 50 61 72 73 65 2c 20 70 53 75 62 2c  ct(pParse, pSub,
33df0 20 26 64 65 73 74 29 3b 0a 20 20 20 20 20 20 70   &dest);.      p
33e00 49 74 65 6d 2d 3e 70 54 61 62 2d 3e 6e 52 6f 77  Item->pTab->nRow
33e10 4c 6f 67 45 73 74 20 3d 20 70 53 75 62 2d 3e 6e  LogEst = pSub->n
33e20 53 65 6c 65 63 74 52 6f 77 3b 0a 20 20 20 20 20  SelectRow;.     
33e30 20 70 49 74 65 6d 2d 3e 66 67 2e 76 69 61 43 6f   pItem->fg.viaCo
33e40 72 6f 75 74 69 6e 65 20 3d 20 31 3b 0a 20 20 20  routine = 1;.   
33e50 20 20 20 70 49 74 65 6d 2d 3e 72 65 67 52 65 73     pItem->regRes
33e60 75 6c 74 20 3d 20 64 65 73 74 2e 69 53 64 73 74  ult = dest.iSdst
33e70 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
33e80 64 62 65 45 6e 64 43 6f 72 6f 75 74 69 6e 65 28  dbeEndCoroutine(
33e90 76 2c 20 70 49 74 65 6d 2d 3e 72 65 67 52 65 74  v, pItem->regRet
33ea0 75 72 6e 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  urn);.      sqli
33eb0 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
33ec0 76 2c 20 61 64 64 72 54 6f 70 2d 31 29 3b 0a 20  v, addrTop-1);. 
33ed0 20 20 20 20 20 73 71 6c 69 74 65 33 43 6c 65 61       sqlite3Clea
33ee0 72 54 65 6d 70 52 65 67 43 61 63 68 65 28 70 50  rTempRegCache(pP
33ef0 61 72 73 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65  arse);.    }else
33f00 7b 0a 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72  {.      /* Gener
33f10 61 74 65 20 61 20 73 75 62 72 6f 75 74 69 6e 65  ate a subroutine
33f20 20 74 68 61 74 20 77 69 6c 6c 20 66 69 6c 6c 20   that will fill 
33f30 61 6e 20 65 70 68 65 6d 65 72 61 6c 20 74 61 62  an ephemeral tab
33f40 6c 65 20 77 69 74 68 0a 20 20 20 20 20 20 2a 2a  le with.      **
33f50 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20   the content of 
33f60 74 68 69 73 20 73 75 62 71 75 65 72 79 2e 20 20  this subquery.  
33f70 70 49 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53  pItem->addrFillS
33f80 75 62 20 77 69 6c 6c 20 70 6f 69 6e 74 0a 20 20  ub will point.  
33f90 20 20 20 20 2a 2a 20 74 6f 20 74 68 65 20 61 64      ** to the ad
33fa0 64 72 65 73 73 20 6f 66 20 74 68 65 20 67 65 6e  dress of the gen
33fb0 65 72 61 74 65 64 20 73 75 62 72 6f 75 74 69 6e  erated subroutin
33fc0 65 2e 20 20 70 49 74 65 6d 2d 3e 72 65 67 52 65  e.  pItem->regRe
33fd0 74 75 72 6e 0a 20 20 20 20 20 20 2a 2a 20 69 73  turn.      ** is
33fe0 20 61 20 72 65 67 69 73 74 65 72 20 61 6c 6c 6f   a register allo
33ff0 63 61 74 65 64 20 74 6f 20 68 6f 6c 64 20 74 68  cated to hold th
34000 65 20 73 75 62 72 6f 75 74 69 6e 65 20 72 65 74  e subroutine ret
34010 75 72 6e 20 61 64 64 72 65 73 73 0a 20 20 20 20  urn address.    
34020 20 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 74    */.      int t
34030 6f 70 41 64 64 72 3b 0a 20 20 20 20 20 20 69 6e  opAddr;.      in
34040 74 20 6f 6e 63 65 41 64 64 72 20 3d 20 30 3b 0a  t onceAddr = 0;.
34050 20 20 20 20 20 20 69 6e 74 20 72 65 74 41 64 64        int retAdd
34060 72 3b 0a 20 20 20 20 20 20 73 74 72 75 63 74 20  r;.      struct 
34070 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 50  SrcList_item *pP
34080 72 69 6f 72 3b 0a 0a 20 20 20 20 20 20 61 73 73  rior;..      ass
34090 65 72 74 28 20 70 49 74 65 6d 2d 3e 61 64 64 72  ert( pItem->addr
340a0 46 69 6c 6c 53 75 62 3d 3d 30 20 29 3b 0a 20 20  FillSub==0 );.  
340b0 20 20 20 20 70 49 74 65 6d 2d 3e 72 65 67 52 65      pItem->regRe
340c0 74 75 72 6e 20 3d 20 2b 2b 70 50 61 72 73 65 2d  turn = ++pParse-
340d0 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 74 6f 70  >nMem;.      top
340e0 41 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64  Addr = sqlite3Vd
340f0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
34100 6e 74 65 67 65 72 2c 20 30 2c 20 70 49 74 65 6d  nteger, 0, pItem
34110 2d 3e 72 65 67 52 65 74 75 72 6e 29 3b 0a 20 20  ->regReturn);.  
34120 20 20 20 20 70 49 74 65 6d 2d 3e 61 64 64 72 46      pItem->addrF
34130 69 6c 6c 53 75 62 20 3d 20 74 6f 70 41 64 64 72  illSub = topAddr
34140 2b 31 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49  +1;.      if( pI
34150 74 65 6d 2d 3e 66 67 2e 69 73 43 6f 72 72 65 6c  tem->fg.isCorrel
34160 61 74 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ated==0 ){.     
34170 20 20 20 2f 2a 20 49 66 20 74 68 65 20 73 75 62     /* If the sub
34180 71 75 65 72 79 20 69 73 20 6e 6f 74 20 63 6f 72  query is not cor
34190 72 65 6c 61 74 65 64 20 61 6e 64 20 69 66 20 77  related and if w
341a0 65 20 61 72 65 20 6e 6f 74 20 69 6e 73 69 64 65  e are not inside
341b0 20 6f 66 0a 20 20 20 20 20 20 20 20 2a 2a 20 61   of.        ** a
341c0 20 74 72 69 67 67 65 72 2c 20 74 68 65 6e 20 77   trigger, then w
341d0 65 20 6f 6e 6c 79 20 6e 65 65 64 20 74 6f 20 63  e only need to c
341e0 6f 6d 70 75 74 65 20 74 68 65 20 76 61 6c 75 65  ompute the value
341f0 20 6f 66 20 74 68 65 20 73 75 62 71 75 65 72 79   of the subquery
34200 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 6e 63 65  .        ** once
34210 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 6f 6e 63  . */.        onc
34220 65 41 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56  eAddr = sqlite3V
34230 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f  dbeAddOp0(v, OP_
34240 4f 6e 63 65 29 3b 20 56 64 62 65 43 6f 76 65 72  Once); VdbeCover
34250 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20  age(v);.        
34260 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
34270 22 6d 61 74 65 72 69 61 6c 69 7a 65 20 5c 22 25  "materialize \"%
34280 73 5c 22 22 2c 20 70 49 74 65 6d 2d 3e 70 54 61  s\"", pItem->pTa
34290 62 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20  b->zName));.    
342a0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
342b0 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74   VdbeNoopComment
342c0 28 28 76 2c 20 22 6d 61 74 65 72 69 61 6c 69 7a  ((v, "materializ
342d0 65 20 5c 22 25 73 5c 22 22 2c 20 70 49 74 65 6d  e \"%s\"", pItem
342e0 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 29 3b  ->pTab->zName));
342f0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
34300 50 72 69 6f 72 20 3d 20 69 73 53 65 6c 66 4a 6f  Prior = isSelfJo
34310 69 6e 56 69 65 77 28 70 54 61 62 4c 69 73 74 2c  inView(pTabList,
34320 20 70 49 74 65 6d 29 3b 0a 20 20 20 20 20 20 69   pItem);.      i
34330 66 28 20 70 50 72 69 6f 72 20 29 7b 0a 20 20 20  f( pPrior ){.   
34340 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
34350 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65  AddOp2(v, OP_Ope
34360 6e 44 75 70 2c 20 70 49 74 65 6d 2d 3e 69 43 75  nDup, pItem->iCu
34370 72 73 6f 72 2c 20 70 50 72 69 6f 72 2d 3e 69 43  rsor, pPrior->iC
34380 75 72 73 6f 72 29 3b 0a 20 20 20 20 20 20 20 20  ursor);.        
34390 61 73 73 65 72 74 28 20 70 50 72 69 6f 72 2d 3e  assert( pPrior->
343a0 70 53 65 6c 65 63 74 21 3d 30 20 29 3b 0a 20 20  pSelect!=0 );.  
343b0 20 20 20 20 20 20 70 53 75 62 2d 3e 6e 53 65 6c        pSub->nSel
343c0 65 63 74 52 6f 77 20 3d 20 70 50 72 69 6f 72 2d  ectRow = pPrior-
343d0 3e 70 53 65 6c 65 63 74 2d 3e 6e 53 65 6c 65 63  >pSelect->nSelec
343e0 74 52 6f 77 3b 0a 20 20 20 20 20 20 7d 65 6c 73  tRow;.      }els
343f0 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e{.        sqlit
34400 65 33 53 65 6c 65 63 74 44 65 73 74 49 6e 69 74  e3SelectDestInit
34410 28 26 64 65 73 74 2c 20 53 52 54 5f 45 70 68 65  (&dest, SRT_Ephe
34420 6d 54 61 62 2c 20 70 49 74 65 6d 2d 3e 69 43 75  mTab, pItem->iCu
34430 72 73 6f 72 29 3b 0a 20 20 20 20 20 20 20 20 45  rsor);.        E
34440 78 70 6c 61 69 6e 51 75 65 72 79 50 6c 61 6e 28  xplainQueryPlan(
34450 28 70 50 61 72 73 65 2c 20 31 2c 20 22 4d 41 54  (pParse, 1, "MAT
34460 45 52 49 41 4c 49 5a 45 20 25 75 22 2c 20 70 53  ERIALIZE %u", pS
34470 75 62 2d 3e 73 65 6c 49 64 29 29 3b 0a 20 20 20  ub->selId));.   
34480 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65       sqlite3Sele
34490 63 74 28 70 50 61 72 73 65 2c 20 70 53 75 62 2c  ct(pParse, pSub,
344a0 20 26 64 65 73 74 29 3b 0a 20 20 20 20 20 20 7d   &dest);.      }
344b0 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 70 54  .      pItem->pT
344c0 61 62 2d 3e 6e 52 6f 77 4c 6f 67 45 73 74 20 3d  ab->nRowLogEst =
344d0 20 70 53 75 62 2d 3e 6e 53 65 6c 65 63 74 52 6f   pSub->nSelectRo
344e0 77 3b 0a 20 20 20 20 20 20 69 66 28 20 6f 6e 63  w;.      if( onc
344f0 65 41 64 64 72 20 29 20 73 71 6c 69 74 65 33 56  eAddr ) sqlite3V
34500 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 6f  dbeJumpHere(v, o
34510 6e 63 65 41 64 64 72 29 3b 0a 20 20 20 20 20 20  nceAddr);.      
34520 72 65 74 41 64 64 72 20 3d 20 73 71 6c 69 74 65  retAddr = sqlite
34530 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
34540 50 5f 52 65 74 75 72 6e 2c 20 70 49 74 65 6d 2d  P_Return, pItem-
34550 3e 72 65 67 52 65 74 75 72 6e 29 3b 0a 20 20 20  >regReturn);.   
34560 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
34570 76 2c 20 22 65 6e 64 20 25 73 22 2c 20 70 49 74  v, "end %s", pIt
34580 65 6d 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65 29  em->pTab->zName)
34590 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
345a0 56 64 62 65 43 68 61 6e 67 65 50 31 28 76 2c 20  VdbeChangeP1(v, 
345b0 74 6f 70 41 64 64 72 2c 20 72 65 74 41 64 64 72  topAddr, retAddr
345c0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
345d0 43 6c 65 61 72 54 65 6d 70 52 65 67 43 61 63 68  ClearTempRegCach
345e0 65 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 7d  e(pParse);.    }
345f0 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c  .    if( db->mal
34600 6c 6f 63 46 61 69 6c 65 64 20 29 20 67 6f 74 6f  locFailed ) goto
34610 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20   select_end;.   
34620 20 70 50 61 72 73 65 2d 3e 6e 48 65 69 67 68 74   pParse->nHeight
34630 20 2d 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63   -= sqlite3Selec
34640 74 45 78 70 72 48 65 69 67 68 74 28 70 29 3b 0a  tExprHeight(p);.
34650 20 20 20 20 70 50 61 72 73 65 2d 3e 7a 41 75 74      pParse->zAut
34660 68 43 6f 6e 74 65 78 74 20 3d 20 7a 53 61 76 65  hContext = zSave
34670 64 41 75 74 68 43 6f 6e 74 65 78 74 3b 0a 23 65  dAuthContext;.#e
34680 6e 64 69 66 0a 20 20 7d 0a 0a 20 20 2f 2a 20 56  ndif.  }..  /* V
34690 61 72 69 6f 75 73 20 65 6c 65 6d 65 6e 74 73 20  arious elements 
346a0 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20 63 6f  of the SELECT co
346b0 70 69 65 64 20 69 6e 74 6f 20 6c 6f 63 61 6c 20  pied into local 
346c0 76 61 72 69 61 62 6c 65 73 20 66 6f 72 0a 20 20  variables for.  
346d0 2a 2a 20 63 6f 6e 76 65 6e 69 65 6e 63 65 20 2a  ** convenience *
346e0 2f 0a 20 20 70 45 4c 69 73 74 20 3d 20 70 2d 3e  /.  pEList = p->
346f0 70 45 4c 69 73 74 3b 0a 20 20 70 57 68 65 72 65  pEList;.  pWhere
34700 20 3d 20 70 2d 3e 70 57 68 65 72 65 3b 0a 20 20   = p->pWhere;.  
34710 70 47 72 6f 75 70 42 79 20 3d 20 70 2d 3e 70 47  pGroupBy = p->pG
34720 72 6f 75 70 42 79 3b 0a 20 20 70 48 61 76 69 6e  roupBy;.  pHavin
34730 67 20 3d 20 70 2d 3e 70 48 61 76 69 6e 67 3b 0a  g = p->pHaving;.
34740 20 20 73 44 69 73 74 69 6e 63 74 2e 69 73 54 6e    sDistinct.isTn
34750 63 74 20 3d 20 28 70 2d 3e 73 65 6c 46 6c 61 67  ct = (p->selFlag
34760 73 20 26 20 53 46 5f 44 69 73 74 69 6e 63 74 29  s & SF_Distinct)
34770 21 3d 30 3b 0a 0a 23 69 66 20 53 45 4c 45 43 54  !=0;..#if SELECT
34780 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20  TRACE_ENABLED.  
34790 69 66 28 20 73 71 6c 69 74 65 33 53 65 6c 65 63  if( sqlite3Selec
347a0 74 54 72 61 63 65 20 26 20 30 78 34 30 30 20 29  tTrace & 0x400 )
347b0 7b 0a 20 20 20 20 53 45 4c 45 43 54 54 52 41 43  {.    SELECTTRAC
347c0 45 28 30 78 34 30 30 2c 70 50 61 72 73 65 2c 70  E(0x400,pParse,p
347d0 2c 28 22 41 66 74 65 72 20 61 6c 6c 20 46 52 4f  ,("After all FRO
347e0 4d 2d 63 6c 61 75 73 65 20 61 6e 61 6c 79 73 69  M-clause analysi
347f0 73 3a 5c 6e 22 29 29 3b 0a 20 20 20 20 73 71 6c  s:\n"));.    sql
34800 69 74 65 33 54 72 65 65 56 69 65 77 53 65 6c 65  ite3TreeViewSele
34810 63 74 28 30 2c 20 70 2c 20 30 29 3b 0a 20 20 7d  ct(0, p, 0);.  }
34820 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66  .#endif..  /* If
34830 20 74 68 65 20 71 75 65 72 79 20 69 73 20 44 49   the query is DI
34840 53 54 49 4e 43 54 20 77 69 74 68 20 61 6e 20 4f  STINCT with an O
34850 52 44 45 52 20 42 59 20 62 75 74 20 69 73 20 6e  RDER BY but is n
34860 6f 74 20 61 6e 20 61 67 67 72 65 67 61 74 65 2c  ot an aggregate,
34870 20 61 6e 64 20 0a 20 20 2a 2a 20 69 66 20 74 68   and .  ** if th
34880 65 20 73 65 6c 65 63 74 2d 6c 69 73 74 20 69 73  e select-list is
34890 20 74 68 65 20 73 61 6d 65 20 61 73 20 74 68 65   the same as the
348a0 20 4f 52 44 45 52 20 42 59 20 6c 69 73 74 2c 20   ORDER BY list, 
348b0 74 68 65 6e 20 74 68 69 73 20 71 75 65 72 79 0a  then this query.
348c0 20 20 2a 2a 20 63 61 6e 20 62 65 20 72 65 77 72    ** can be rewr
348d0 69 74 74 65 6e 20 61 73 20 61 20 47 52 4f 55 50  itten as a GROUP
348e0 20 42 59 2e 20 49 6e 20 6f 74 68 65 72 20 77 6f   BY. In other wo
348f0 72 64 73 2c 20 74 68 69 73 3a 0a 20 20 2a 2a 0a  rds, this:.  **.
34900 20 20 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20    **     SELECT 
34910 44 49 53 54 49 4e 43 54 20 78 79 7a 20 46 52 4f  DISTINCT xyz FRO
34920 4d 20 2e 2e 2e 20 4f 52 44 45 52 20 42 59 20 78  M ... ORDER BY x
34930 79 7a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 69 73 20  yz.  **.  ** is 
34940 74 72 61 6e 73 66 6f 72 6d 65 64 20 74 6f 3a 0a  transformed to:.
34950 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 53 45    **.  **     SE
34960 4c 45 43 54 20 78 79 7a 20 46 52 4f 4d 20 2e 2e  LECT xyz FROM ..
34970 2e 20 47 52 4f 55 50 20 42 59 20 78 79 7a 20 4f  . GROUP BY xyz O
34980 52 44 45 52 20 42 59 20 78 79 7a 0a 20 20 2a 2a  RDER BY xyz.  **
34990 0a 20 20 2a 2a 20 54 68 65 20 73 65 63 6f 6e 64  .  ** The second
349a0 20 66 6f 72 6d 20 69 73 20 70 72 65 66 65 72 72   form is preferr
349b0 65 64 20 61 73 20 61 20 73 69 6e 67 6c 65 20 69  ed as a single i
349c0 6e 64 65 78 20 28 6f 72 20 74 65 6d 70 2d 74 61  ndex (or temp-ta
349d0 62 6c 65 29 20 6d 61 79 20 62 65 20 0a 20 20 2a  ble) may be .  *
349e0 2a 20 75 73 65 64 20 66 6f 72 20 62 6f 74 68 20  * used for both 
349f0 74 68 65 20 4f 52 44 45 52 20 42 59 20 61 6e 64  the ORDER BY and
34a00 20 44 49 53 54 49 4e 43 54 20 70 72 6f 63 65 73   DISTINCT proces
34a10 73 69 6e 67 2e 20 41 73 20 6f 72 69 67 69 6e 61  sing. As origina
34a20 6c 6c 79 20 0a 20 20 2a 2a 20 77 72 69 74 74 65  lly .  ** writte
34a30 6e 20 74 68 65 20 71 75 65 72 79 20 6d 75 73 74  n the query must
34a40 20 75 73 65 20 61 20 74 65 6d 70 2d 74 61 62 6c   use a temp-tabl
34a50 65 20 66 6f 72 20 61 74 20 6c 65 61 73 74 20 6f  e for at least o
34a60 6e 65 20 6f 66 20 74 68 65 20 4f 52 44 45 52 20  ne of the ORDER 
34a70 0a 20 20 2a 2a 20 42 59 20 61 6e 64 20 44 49 53  .  ** BY and DIS
34a80 54 49 4e 43 54 2c 20 61 6e 64 20 61 6e 20 69 6e  TINCT, and an in
34a90 64 65 78 20 6f 72 20 73 65 70 61 72 61 74 65 20  dex or separate 
34aa0 74 65 6d 70 2d 74 61 62 6c 65 20 66 6f 72 20 74  temp-table for t
34ab0 68 65 20 6f 74 68 65 72 2e 0a 20 20 2a 2f 0a 20  he other..  */. 
34ac0 20 69 66 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67   if( (p->selFlag
34ad0 73 20 26 20 28 53 46 5f 44 69 73 74 69 6e 63 74  s & (SF_Distinct
34ae0 7c 53 46 5f 41 67 67 72 65 67 61 74 65 29 29 3d  |SF_Aggregate))=
34af0 3d 53 46 5f 44 69 73 74 69 6e 63 74 20 0a 20 20  =SF_Distinct .  
34b00 20 26 26 20 73 71 6c 69 74 65 33 45 78 70 72 4c   && sqlite3ExprL
34b10 69 73 74 43 6f 6d 70 61 72 65 28 73 53 6f 72 74  istCompare(sSort
34b20 2e 70 4f 72 64 65 72 42 79 2c 20 70 45 4c 69 73  .pOrderBy, pELis
34b30 74 2c 20 2d 31 29 3d 3d 30 0a 20 20 29 7b 0a 20  t, -1)==0.  ){. 
34b40 20 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26     p->selFlags &
34b50 3d 20 7e 53 46 5f 44 69 73 74 69 6e 63 74 3b 0a  = ~SF_Distinct;.
34b60 20 20 20 20 70 47 72 6f 75 70 42 79 20 3d 20 70      pGroupBy = p
34b70 2d 3e 70 47 72 6f 75 70 42 79 20 3d 20 73 71 6c  ->pGroupBy = sql
34b80 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28  ite3ExprListDup(
34b90 64 62 2c 20 70 45 4c 69 73 74 2c 20 30 29 3b 0a  db, pEList, 0);.
34ba0 20 20 20 20 2f 2a 20 4e 6f 74 69 63 65 20 74 68      /* Notice th
34bb0 61 74 20 65 76 65 6e 20 74 68 6f 75 67 68 74 20  at even thought 
34bc0 53 46 5f 44 69 73 74 69 6e 63 74 20 68 61 73 20  SF_Distinct has 
34bd0 62 65 65 6e 20 63 6c 65 61 72 65 64 20 66 72 6f  been cleared fro
34be0 6d 20 70 2d 3e 73 65 6c 46 6c 61 67 73 2c 0a 20  m p->selFlags,. 
34bf0 20 20 20 2a 2a 20 74 68 65 20 73 44 69 73 74 69     ** the sDisti
34c00 6e 63 74 2e 69 73 54 6e 63 74 20 69 73 20 73 74  nct.isTnct is st
34c10 69 6c 6c 20 73 65 74 2e 20 20 48 65 6e 63 65 2c  ill set.  Hence,
34c20 20 69 73 54 6e 63 74 20 72 65 70 72 65 73 65 6e   isTnct represen
34c30 74 73 20 74 68 65 0a 20 20 20 20 2a 2a 20 6f 72  ts the.    ** or
34c40 69 67 69 6e 61 6c 20 73 65 74 74 69 6e 67 20 6f  iginal setting o
34c50 66 20 74 68 65 20 53 46 5f 44 69 73 74 69 6e 63  f the SF_Distinc
34c60 74 20 66 6c 61 67 2c 20 6e 6f 74 20 74 68 65 20  t flag, not the 
34c70 63 75 72 72 65 6e 74 20 73 65 74 74 69 6e 67 20  current setting 
34c80 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 73  */.    assert( s
34c90 44 69 73 74 69 6e 63 74 2e 69 73 54 6e 63 74 20  Distinct.isTnct 
34ca0 29 3b 0a 0a 23 69 66 20 53 45 4c 45 43 54 54 52  );..#if SELECTTR
34cb0 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20 20 20  ACE_ENABLED.    
34cc0 69 66 28 20 73 71 6c 69 74 65 33 53 65 6c 65 63  if( sqlite3Selec
34cd0 74 54 72 61 63 65 20 26 20 30 78 34 30 30 20 29  tTrace & 0x400 )
34ce0 7b 0a 20 20 20 20 20 20 53 45 4c 45 43 54 54 52  {.      SELECTTR
34cf0 41 43 45 28 30 78 34 30 30 2c 70 50 61 72 73 65  ACE(0x400,pParse
34d00 2c 70 2c 28 22 54 72 61 6e 73 66 6f 72 6d 20 44  ,p,("Transform D
34d10 49 53 54 49 4e 43 54 20 69 6e 74 6f 20 47 52 4f  ISTINCT into GRO
34d20 55 50 20 42 59 3a 5c 6e 22 29 29 3b 0a 20 20 20  UP BY:\n"));.   
34d30 20 20 20 73 71 6c 69 74 65 33 54 72 65 65 56 69     sqlite3TreeVi
34d40 65 77 53 65 6c 65 63 74 28 30 2c 20 70 2c 20 30  ewSelect(0, p, 0
34d50 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  );.    }.#endif.
34d60 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65    }..  /* If the
34d70 72 65 20 69 73 20 61 6e 20 4f 52 44 45 52 20 42  re is an ORDER B
34d80 59 20 63 6c 61 75 73 65 2c 20 74 68 65 6e 20 63  Y clause, then c
34d90 72 65 61 74 65 20 61 6e 20 65 70 68 65 6d 65 72  reate an ephemer
34da0 61 6c 20 69 6e 64 65 78 20 74 6f 0a 20 20 2a 2a  al index to.  **
34db0 20 64 6f 20 74 68 65 20 73 6f 72 74 69 6e 67 2e   do the sorting.
34dc0 20 20 42 75 74 20 74 68 69 73 20 73 6f 72 74 69    But this sorti
34dd0 6e 67 20 65 70 68 65 6d 65 72 61 6c 20 69 6e 64  ng ephemeral ind
34de0 65 78 20 6d 69 67 68 74 20 65 6e 64 20 75 70 0a  ex might end up.
34df0 20 20 2a 2a 20 62 65 69 6e 67 20 75 6e 75 73 65    ** being unuse
34e00 64 20 69 66 20 74 68 65 20 64 61 74 61 20 63 61  d if the data ca
34e10 6e 20 62 65 20 65 78 74 72 61 63 74 65 64 20 69  n be extracted i
34e20 6e 20 70 72 65 2d 73 6f 72 74 65 64 20 6f 72 64  n pre-sorted ord
34e30 65 72 2e 0a 20 20 2a 2a 20 49 66 20 74 68 61 74  er..  ** If that
34e40 20 69 73 20 74 68 65 20 63 61 73 65 2c 20 74 68   is the case, th
34e50 65 6e 20 74 68 65 20 4f 50 5f 4f 70 65 6e 45 70  en the OP_OpenEp
34e60 68 65 6d 65 72 61 6c 20 69 6e 73 74 72 75 63 74  hemeral instruct
34e70 69 6f 6e 20 77 69 6c 6c 20 62 65 0a 20 20 2a 2a  ion will be.  **
34e80 20 63 68 61 6e 67 65 64 20 74 6f 20 61 6e 20 4f   changed to an O
34e90 50 5f 4e 6f 6f 70 20 6f 6e 63 65 20 77 65 20 66  P_Noop once we f
34ea0 69 67 75 72 65 20 6f 75 74 20 74 68 61 74 20 74  igure out that t
34eb0 68 65 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78  he sorting index
34ec0 20 69 73 0a 20 20 2a 2a 20 6e 6f 74 20 6e 65 65   is.  ** not nee
34ed0 64 65 64 2e 20 20 54 68 65 20 73 53 6f 72 74 2e  ded.  The sSort.
34ee0 61 64 64 72 53 6f 72 74 49 6e 64 65 78 20 76 61  addrSortIndex va
34ef0 72 69 61 62 6c 65 20 69 73 20 75 73 65 64 20 74  riable is used t
34f00 6f 20 66 61 63 69 6c 69 74 61 74 65 0a 20 20 2a  o facilitate.  *
34f10 2a 20 74 68 61 74 20 63 68 61 6e 67 65 2e 0a 20  * that change.. 
34f20 20 2a 2f 0a 20 20 69 66 28 20 73 53 6f 72 74 2e   */.  if( sSort.
34f30 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20  pOrderBy ){.    
34f40 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66  KeyInfo *pKeyInf
34f50 6f 3b 0a 20 20 20 20 70 4b 65 79 49 6e 66 6f 20  o;.    pKeyInfo 
34f60 3d 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f  = sqlite3KeyInfo
34f70 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 0a 20 20  FromExprList(.  
34f80 20 20 20 20 20 20 70 50 61 72 73 65 2c 20 73 53        pParse, sS
34f90 6f 72 74 2e 70 4f 72 64 65 72 42 79 2c 20 30 2c  ort.pOrderBy, 0,
34fa0 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b   pEList->nExpr);
34fb0 0a 20 20 20 20 73 53 6f 72 74 2e 69 45 43 75 72  .    sSort.iECur
34fc0 73 6f 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54  sor = pParse->nT
34fd0 61 62 2b 2b 3b 0a 20 20 20 20 73 53 6f 72 74 2e  ab++;.    sSort.
34fe0 61 64 64 72 53 6f 72 74 49 6e 64 65 78 20 3d 0a  addrSortIndex =.
34ff0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
35000 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4f 70  eAddOp4(v, OP_Op
35010 65 6e 45 70 68 65 6d 65 72 61 6c 2c 0a 20 20 20  enEphemeral,.   
35020 20 20 20 20 20 20 20 73 53 6f 72 74 2e 69 45 43         sSort.iEC
35030 75 72 73 6f 72 2c 20 73 53 6f 72 74 2e 70 4f 72  ursor, sSort.pOr
35040 64 65 72 42 79 2d 3e 6e 45 78 70 72 2b 31 2b 70  derBy->nExpr+1+p
35050 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 20 30 2c  EList->nExpr, 0,
35060 0a 20 20 20 20 20 20 20 20 20 20 28 63 68 61 72  .          (char
35070 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b  *)pKeyInfo, P4_K
35080 45 59 49 4e 46 4f 0a 20 20 20 20 20 20 29 3b 0a  EYINFO.      );.
35090 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 53 6f    }else{.    sSo
350a0 72 74 2e 61 64 64 72 53 6f 72 74 49 6e 64 65 78  rt.addrSortIndex
350b0 20 3d 20 2d 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a   = -1;.  }..  /*
350c0 20 49 66 20 74 68 65 20 6f 75 74 70 75 74 20 69   If the output i
350d0 73 20 64 65 73 74 69 6e 65 64 20 66 6f 72 20 61  s destined for a
350e0 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
350f0 2c 20 6f 70 65 6e 20 74 68 61 74 20 74 61 62 6c  , open that tabl
35100 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 44  e..  */.  if( pD
35110 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f  est->eDest==SRT_
35120 45 70 68 65 6d 54 61 62 20 29 7b 0a 20 20 20 20  EphemTab ){.    
35130 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
35140 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65  2(v, OP_OpenEphe
35150 6d 65 72 61 6c 2c 20 70 44 65 73 74 2d 3e 69 53  meral, pDest->iS
35160 44 50 61 72 6d 2c 20 70 45 4c 69 73 74 2d 3e 6e  DParm, pEList->n
35170 45 78 70 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  Expr);.  }..  /*
35180 20 53 65 74 20 74 68 65 20 6c 69 6d 69 74 65 72   Set the limiter
35190 2e 0a 20 20 2a 2f 0a 20 20 69 45 6e 64 20 3d 20  ..  */.  iEnd = 
351a0 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
351b0 61 62 65 6c 28 76 29 3b 0a 20 20 69 66 28 20 28  abel(v);.  if( (
351c0 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46  p->selFlags & SF
351d0 5f 46 69 78 65 64 4c 69 6d 69 74 29 3d 3d 30 20  _FixedLimit)==0 
351e0 29 7b 0a 20 20 20 20 70 2d 3e 6e 53 65 6c 65 63  ){.    p->nSelec
351f0 74 52 6f 77 20 3d 20 33 32 30 3b 20 20 2f 2a 20  tRow = 320;  /* 
35200 34 20 62 69 6c 6c 69 6f 6e 20 72 6f 77 73 20 2a  4 billion rows *
35210 2f 0a 20 20 7d 0a 20 20 63 6f 6d 70 75 74 65 4c  /.  }.  computeL
35220 69 6d 69 74 52 65 67 69 73 74 65 72 73 28 70 50  imitRegisters(pP
35230 61 72 73 65 2c 20 70 2c 20 69 45 6e 64 29 3b 0a  arse, p, iEnd);.
35240 20 20 69 66 28 20 70 2d 3e 69 4c 69 6d 69 74 3d    if( p->iLimit=
35250 3d 30 20 26 26 20 73 53 6f 72 74 2e 61 64 64 72  =0 && sSort.addr
35260 53 6f 72 74 49 6e 64 65 78 3e 3d 30 20 29 7b 0a  SortIndex>=0 ){.
35270 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
35280 68 61 6e 67 65 4f 70 63 6f 64 65 28 76 2c 20 73  hangeOpcode(v, s
35290 53 6f 72 74 2e 61 64 64 72 53 6f 72 74 49 6e 64  Sort.addrSortInd
352a0 65 78 2c 20 4f 50 5f 53 6f 72 74 65 72 4f 70 65  ex, OP_SorterOpe
352b0 6e 29 3b 0a 20 20 20 20 73 53 6f 72 74 2e 73 6f  n);.    sSort.so
352c0 72 74 46 6c 61 67 73 20 7c 3d 20 53 4f 52 54 46  rtFlags |= SORTF
352d0 4c 41 47 5f 55 73 65 53 6f 72 74 65 72 3b 0a 20  LAG_UseSorter;. 
352e0 20 7d 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 61 6e   }..  /* Open an
352f0 20 65 70 68 65 6d 65 72 61 6c 20 69 6e 64 65 78   ephemeral index
35300 20 74 6f 20 75 73 65 20 66 6f 72 20 74 68 65 20   to use for the 
35310 64 69 73 74 69 6e 63 74 20 73 65 74 2e 0a 20 20  distinct set..  
35320 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 73 65 6c 46  */.  if( p->selF
35330 6c 61 67 73 20 26 20 53 46 5f 44 69 73 74 69 6e  lags & SF_Distin
35340 63 74 20 29 7b 0a 20 20 20 20 73 44 69 73 74 69  ct ){.    sDisti
35350 6e 63 74 2e 74 61 62 54 6e 63 74 20 3d 20 70 50  nct.tabTnct = pP
35360 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20  arse->nTab++;.  
35370 20 20 73 44 69 73 74 69 6e 63 74 2e 61 64 64 72    sDistinct.addr
35380 54 6e 63 74 20 3d 20 73 71 6c 69 74 65 33 56 64  Tnct = sqlite3Vd
35390 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4f  beAddOp4(v, OP_O
353a0 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 0a 20 20  penEphemeral,.  
353b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
353c0 20 20 20 20 20 73 44 69 73 74 69 6e 63 74 2e 74       sDistinct.t
353d0 61 62 54 6e 63 74 2c 20 30 2c 20 30 2c 0a 20 20  abTnct, 0, 0,.  
353e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
353f0 20 20 20 20 20 28 63 68 61 72 2a 29 73 71 6c 69       (char*)sqli
35400 74 65 33 4b 65 79 49 6e 66 6f 46 72 6f 6d 45 78  te3KeyInfoFromEx
35410 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70  prList(pParse, p
35420 2d 3e 70 45 4c 69 73 74 2c 30 2c 30 29 2c 0a 20  ->pEList,0,0),. 
35430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35440 20 20 20 20 20 20 50 34 5f 4b 45 59 49 4e 46 4f        P4_KEYINFO
35450 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
35460 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 42 54  beChangeP5(v, BT
35470 52 45 45 5f 55 4e 4f 52 44 45 52 45 44 29 3b 0a  REE_UNORDERED);.
35480 20 20 20 20 73 44 69 73 74 69 6e 63 74 2e 65 54      sDistinct.eT
35490 6e 63 74 54 79 70 65 20 3d 20 57 48 45 52 45 5f  nctType = WHERE_
354a0 44 49 53 54 49 4e 43 54 5f 55 4e 4f 52 44 45 52  DISTINCT_UNORDER
354b0 45 44 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ED;.  }else{.   
354c0 20 73 44 69 73 74 69 6e 63 74 2e 65 54 6e 63 74   sDistinct.eTnct
354d0 54 79 70 65 20 3d 20 57 48 45 52 45 5f 44 49 53  Type = WHERE_DIS
354e0 54 49 4e 43 54 5f 4e 4f 4f 50 3b 0a 20 20 7d 0a  TINCT_NOOP;.  }.
354f0 0a 20 20 69 66 28 20 21 69 73 41 67 67 20 26 26  .  if( !isAgg &&
35500 20 70 47 72 6f 75 70 42 79 3d 3d 30 20 29 7b 0a   pGroupBy==0 ){.
35510 20 20 20 20 2f 2a 20 4e 6f 20 61 67 67 72 65 67      /* No aggreg
35520 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 20 61 6e  ate functions an
35530 64 20 6e 6f 20 47 52 4f 55 50 20 42 59 20 63 6c  d no GROUP BY cl
35540 61 75 73 65 20 2a 2f 0a 20 20 20 20 75 31 36 20  ause */.    u16 
35550 77 63 74 72 6c 46 6c 61 67 73 20 3d 20 28 73 44  wctrlFlags = (sD
35560 69 73 74 69 6e 63 74 2e 69 73 54 6e 63 74 20 3f  istinct.isTnct ?
35570 20 57 48 45 52 45 5f 57 41 4e 54 5f 44 49 53 54   WHERE_WANT_DIST
35580 49 4e 43 54 20 3a 20 30 29 0a 20 20 20 20 20 20  INCT : 0).      
35590 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 28               | (
355a0 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46  p->selFlags & SF
355b0 5f 46 69 78 65 64 4c 69 6d 69 74 29 3b 0a 23 69  _FixedLimit);.#i
355c0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
355d0 54 5f 57 49 4e 44 4f 57 46 55 4e 43 0a 20 20 20  T_WINDOWFUNC.   
355e0 20 57 69 6e 64 6f 77 20 2a 70 57 69 6e 20 3d 20   Window *pWin = 
355f0 70 2d 3e 70 57 69 6e 3b 20 20 20 20 20 20 2f 2a  p->pWin;      /*
35600 20 4d 61 73 74 65 72 20 77 69 6e 64 6f 77 20 6f   Master window o
35610 62 6a 65 63 74 20 28 6f 72 20 4e 55 4c 4c 29 20  bject (or NULL) 
35620 2a 2f 0a 20 20 20 20 69 66 28 20 70 57 69 6e 20  */.    if( pWin 
35630 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
35640 57 69 6e 64 6f 77 43 6f 64 65 49 6e 69 74 28 70  WindowCodeInit(p
35650 50 61 72 73 65 2c 20 70 57 69 6e 29 3b 0a 20 20  Parse, pWin);.  
35660 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 61    }.#endif.    a
35670 73 73 65 72 74 28 20 57 48 45 52 45 5f 55 53 45  ssert( WHERE_USE
35680 5f 4c 49 4d 49 54 3d 3d 53 46 5f 46 69 78 65 64  _LIMIT==SF_Fixed
35690 4c 69 6d 69 74 20 29 3b 0a 0a 0a 20 20 20 20 2f  Limit );...    /
356a0 2a 20 42 65 67 69 6e 20 74 68 65 20 64 61 74 61  * Begin the data
356b0 62 61 73 65 20 73 63 61 6e 2e 20 2a 2f 0a 20 20  base scan. */.  
356c0 20 20 53 45 4c 45 43 54 54 52 41 43 45 28 31 2c    SELECTTRACE(1,
356d0 70 50 61 72 73 65 2c 70 2c 28 22 57 68 65 72 65  pParse,p,("Where
356e0 42 65 67 69 6e 5c 6e 22 29 29 3b 0a 20 20 20 20  Begin\n"));.    
356f0 70 57 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33  pWInfo = sqlite3
35700 57 68 65 72 65 42 65 67 69 6e 28 70 50 61 72 73  WhereBegin(pPars
35710 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 57 68  e, pTabList, pWh
35720 65 72 65 2c 20 73 53 6f 72 74 2e 70 4f 72 64 65  ere, sSort.pOrde
35730 72 42 79 2c 0a 20 20 20 20 20 20 20 20 20 20 20  rBy,.           
35740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35750 20 20 20 20 70 2d 3e 70 45 4c 69 73 74 2c 20 77      p->pEList, w
35760 63 74 72 6c 46 6c 61 67 73 2c 20 70 2d 3e 6e 53  ctrlFlags, p->nS
35770 65 6c 65 63 74 52 6f 77 29 3b 0a 20 20 20 20 69  electRow);.    i
35780 66 28 20 70 57 49 6e 66 6f 3d 3d 30 20 29 20 67  f( pWInfo==0 ) g
35790 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  oto select_end;.
357a0 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 57      if( sqlite3W
357b0 68 65 72 65 4f 75 74 70 75 74 52 6f 77 43 6f 75  hereOutputRowCou
357c0 6e 74 28 70 57 49 6e 66 6f 29 20 3c 20 70 2d 3e  nt(pWInfo) < p->
357d0 6e 53 65 6c 65 63 74 52 6f 77 20 29 7b 0a 20 20  nSelectRow ){.  
357e0 20 20 20 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f      p->nSelectRo
357f0 77 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65  w = sqlite3Where
35800 4f 75 74 70 75 74 52 6f 77 43 6f 75 6e 74 28 70  OutputRowCount(p
35810 57 49 6e 66 6f 29 3b 0a 20 20 20 20 7d 0a 20 20  WInfo);.    }.  
35820 20 20 69 66 28 20 73 44 69 73 74 69 6e 63 74 2e    if( sDistinct.
35830 69 73 54 6e 63 74 20 26 26 20 73 71 6c 69 74 65  isTnct && sqlite
35840 33 57 68 65 72 65 49 73 44 69 73 74 69 6e 63 74  3WhereIsDistinct
35850 28 70 57 49 6e 66 6f 29 20 29 7b 0a 20 20 20 20  (pWInfo) ){.    
35860 20 20 73 44 69 73 74 69 6e 63 74 2e 65 54 6e 63    sDistinct.eTnc
35870 74 54 79 70 65 20 3d 20 73 71 6c 69 74 65 33 57  tType = sqlite3W
35880 68 65 72 65 49 73 44 69 73 74 69 6e 63 74 28 70  hereIsDistinct(p
35890 57 49 6e 66 6f 29 3b 0a 20 20 20 20 7d 0a 20 20  WInfo);.    }.  
358a0 20 20 69 66 28 20 73 53 6f 72 74 2e 70 4f 72 64    if( sSort.pOrd
358b0 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20 73 53  erBy ){.      sS
358c0 6f 72 74 2e 6e 4f 42 53 61 74 20 3d 20 73 71 6c  ort.nOBSat = sql
358d0 69 74 65 33 57 68 65 72 65 49 73 4f 72 64 65 72  ite3WhereIsOrder
358e0 65 64 28 70 57 49 6e 66 6f 29 3b 0a 20 20 20 20  ed(pWInfo);.    
358f0 20 20 73 53 6f 72 74 2e 6c 61 62 65 6c 4f 42 4c    sSort.labelOBL
35900 6f 70 74 20 3d 20 73 71 6c 69 74 65 33 57 68 65  opt = sqlite3Whe
35910 72 65 4f 72 64 65 72 42 79 4c 69 6d 69 74 4f 70  reOrderByLimitOp
35920 74 4c 61 62 65 6c 28 70 57 49 6e 66 6f 29 3b 0a  tLabel(pWInfo);.
35930 20 20 20 20 20 20 69 66 28 20 73 53 6f 72 74 2e        if( sSort.
35940 6e 4f 42 53 61 74 3d 3d 73 53 6f 72 74 2e 70 4f  nOBSat==sSort.pO
35950 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 20 29 7b  rderBy->nExpr ){
35960 0a 20 20 20 20 20 20 20 20 73 53 6f 72 74 2e 70  .        sSort.p
35970 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 20  OrderBy = 0;.   
35980 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
35990 2f 2a 20 49 66 20 73 6f 72 74 69 6e 67 20 69 6e  /* If sorting in
359a0 64 65 78 20 74 68 61 74 20 77 61 73 20 63 72 65  dex that was cre
359b0 61 74 65 64 20 62 79 20 61 20 70 72 69 6f 72 20  ated by a prior 
359c0 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c  OP_OpenEphemeral
359d0 20 0a 20 20 20 20 2a 2a 20 69 6e 73 74 72 75 63   .    ** instruc
359e0 74 69 6f 6e 20 65 6e 64 65 64 20 75 70 20 6e 6f  tion ended up no
359f0 74 20 62 65 69 6e 67 20 6e 65 65 64 65 64 2c 20  t being needed, 
35a00 74 68 65 6e 20 63 68 61 6e 67 65 20 74 68 65 20  then change the 
35a10 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c  OP_OpenEphemeral
35a20 0a 20 20 20 20 2a 2a 20 69 6e 74 6f 20 61 6e 20  .    ** into an 
35a30 4f 50 5f 4e 6f 6f 70 2e 0a 20 20 20 20 2a 2f 0a  OP_Noop..    */.
35a40 20 20 20 20 69 66 28 20 73 53 6f 72 74 2e 61 64      if( sSort.ad
35a50 64 72 53 6f 72 74 49 6e 64 65 78 3e 3d 30 20 26  drSortIndex>=0 &
35a60 26 20 73 53 6f 72 74 2e 70 4f 72 64 65 72 42 79  & sSort.pOrderBy
35a70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ==0 ){.      sql
35a80 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 54 6f  ite3VdbeChangeTo
35a90 4e 6f 6f 70 28 76 2c 20 73 53 6f 72 74 2e 61 64  Noop(v, sSort.ad
35aa0 64 72 53 6f 72 74 49 6e 64 65 78 29 3b 0a 20 20  drSortIndex);.  
35ab0 20 20 7d 0a 0a 20 20 20 20 61 73 73 65 72 74 28    }..    assert(
35ac0 20 70 2d 3e 70 45 4c 69 73 74 3d 3d 70 45 4c 69   p->pEList==pELi
35ad0 73 74 20 29 3b 0a 23 69 66 6e 64 65 66 20 53 51  st );.#ifndef SQ
35ae0 4c 49 54 45 5f 4f 4d 49 54 5f 57 49 4e 44 4f 57  LITE_OMIT_WINDOW
35af0 46 55 4e 43 0a 20 20 20 20 69 66 28 20 70 57 69  FUNC.    if( pWi
35b00 6e 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 61  n ){.      int a
35b10 64 64 72 47 6f 73 75 62 20 3d 20 73 71 6c 69 74  ddrGosub = sqlit
35b20 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
35b30 76 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 43  v);.      int iC
35b40 6f 6e 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ont = sqlite3Vdb
35b50 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
35b60 20 20 20 20 20 69 6e 74 20 69 42 72 65 61 6b 20       int iBreak 
35b70 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
35b80 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20  eLabel(v);.     
35b90 20 69 6e 74 20 72 65 67 47 6f 73 75 62 20 3d 20   int regGosub = 
35ba0 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
35bb0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 57 69  .      sqlite3Wi
35bc0 6e 64 6f 77 43 6f 64 65 53 74 65 70 28 70 50 61  ndowCodeStep(pPa
35bd0 72 73 65 2c 20 70 2c 20 70 57 49 6e 66 6f 2c 20  rse, p, pWInfo, 
35be0 72 65 67 47 6f 73 75 62 2c 20 61 64 64 72 47 6f  regGosub, addrGo
35bf0 73 75 62 29 3b 0a 0a 20 20 20 20 20 20 73 71 6c  sub);..      sql
35c00 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
35c10 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 69 42  , OP_Goto, 0, iB
35c20 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 73 71 6c  reak);.      sql
35c30 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
35c40 61 62 65 6c 28 76 2c 20 61 64 64 72 47 6f 73 75  abel(v, addrGosu
35c50 62 29 3b 0a 20 20 20 20 20 20 56 64 62 65 4e 6f  b);.      VdbeNo
35c60 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 69  opComment((v, "i
35c70 6e 6e 65 72 2d 6c 6f 6f 70 20 73 75 62 72 6f 75  nner-loop subrou
35c80 74 69 6e 65 22 29 29 3b 0a 20 20 20 20 20 20 73  tine"));.      s
35c90 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70  electInnerLoop(p
35ca0 50 61 72 73 65 2c 20 70 2c 20 2d 31 2c 20 26 73  Parse, p, -1, &s
35cb0 53 6f 72 74 2c 20 26 73 44 69 73 74 69 6e 63 74  Sort, &sDistinct
35cc0 2c 20 70 44 65 73 74 2c 20 69 43 6f 6e 74 2c 20  , pDest, iCont, 
35cd0 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 73  iBreak);.      s
35ce0 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
35cf0 65 4c 61 62 65 6c 28 76 2c 20 69 43 6f 6e 74 29  eLabel(v, iCont)
35d00 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
35d10 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
35d20 52 65 74 75 72 6e 2c 20 72 65 67 47 6f 73 75 62  Return, regGosub
35d30 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d  );.      VdbeCom
35d40 6d 65 6e 74 28 28 76 2c 20 22 65 6e 64 20 69 6e  ment((v, "end in
35d50 6e 65 72 2d 6c 6f 6f 70 20 73 75 62 72 6f 75 74  ner-loop subrout
35d60 69 6e 65 22 29 29 3b 0a 20 20 20 20 20 20 73 71  ine"));.      sq
35d70 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
35d80 4c 61 62 65 6c 28 76 2c 20 69 42 72 65 61 6b 29  Label(v, iBreak)
35d90 3b 0a 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64  ;.    }else.#end
35da0 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
35db0 54 5f 57 49 4e 44 4f 57 46 55 4e 43 20 2a 2f 0a  T_WINDOWFUNC */.
35dc0 20 20 20 20 7b 0a 20 20 20 20 20 20 2f 2a 20 55      {.      /* U
35dd0 73 65 20 74 68 65 20 73 74 61 6e 64 61 72 64 20  se the standard 
35de0 69 6e 6e 65 72 20 6c 6f 6f 70 2e 20 2a 2f 0a 20  inner loop. */. 
35df0 20 20 20 20 20 73 65 6c 65 63 74 49 6e 6e 65 72       selectInner
35e00 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20 70 2c 20  Loop(pParse, p, 
35e10 2d 31 2c 20 26 73 53 6f 72 74 2c 20 26 73 44 69  -1, &sSort, &sDi
35e20 73 74 69 6e 63 74 2c 20 70 44 65 73 74 2c 0a 20  stinct, pDest,. 
35e30 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
35e40 57 68 65 72 65 43 6f 6e 74 69 6e 75 65 4c 61 62  WhereContinueLab
35e50 65 6c 28 70 57 49 6e 66 6f 29 2c 0a 20 20 20 20  el(pWInfo),.    
35e60 20 20 20 20 20 20 73 71 6c 69 74 65 33 57 68 65        sqlite3Whe
35e70 72 65 42 72 65 61 6b 4c 61 62 65 6c 28 70 57 49  reBreakLabel(pWI
35e80 6e 66 6f 29 29 3b 0a 0a 20 20 20 20 20 20 2f 2a  nfo));..      /*
35e90 20 45 6e 64 20 74 68 65 20 64 61 74 61 62 61 73   End the databas
35ea0 65 20 73 63 61 6e 20 6c 6f 6f 70 2e 0a 20 20 20  e scan loop..   
35eb0 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69     */.      sqli
35ec0 74 65 33 57 68 65 72 65 45 6e 64 28 70 57 49 6e  te3WhereEnd(pWIn
35ed0 66 6f 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  fo);.    }.  }el
35ee0 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20  se{.    /* This 
35ef0 63 61 73 65 20 77 68 65 6e 20 74 68 65 72 65 20  case when there 
35f00 65 78 69 73 74 20 61 67 67 72 65 67 61 74 65 20  exist aggregate 
35f10 66 75 6e 63 74 69 6f 6e 73 20 6f 72 20 61 20 47  functions or a G
35f20 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 0a 20  ROUP BY clause. 
35f30 20 20 20 2a 2a 20 6f 72 20 62 6f 74 68 20 2a 2f     ** or both */
35f40 0a 20 20 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74  .    NameContext
35f50 20 73 4e 43 3b 20 20 20 20 2f 2a 20 4e 61 6d 65   sNC;    /* Name
35f60 20 63 6f 6e 74 65 78 74 20 66 6f 72 20 70 72 6f   context for pro
35f70 63 65 73 73 69 6e 67 20 61 67 67 72 65 67 61 74  cessing aggregat
35f80 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f  e information */
35f90 0a 20 20 20 20 69 6e 74 20 69 41 4d 65 6d 3b 20  .    int iAMem; 
35fa0 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
35fb0 74 20 4d 65 6d 20 61 64 64 72 65 73 73 20 66 6f  t Mem address fo
35fc0 72 20 73 74 6f 72 69 6e 67 20 63 75 72 72 65 6e  r storing curren
35fd0 74 20 47 52 4f 55 50 20 42 59 20 2a 2f 0a 20 20  t GROUP BY */.  
35fe0 20 20 69 6e 74 20 69 42 4d 65 6d 3b 20 20 20 20    int iBMem;    
35ff0 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 4d        /* First M
36000 65 6d 20 61 64 64 72 65 73 73 20 66 6f 72 20 70  em address for p
36010 72 65 76 69 6f 75 73 20 47 52 4f 55 50 20 42 59  revious GROUP BY
36020 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 55 73 65   */.    int iUse
36030 46 6c 61 67 3b 20 20 20 20 20 20 20 2f 2a 20 4d  Flag;       /* M
36040 65 6d 20 61 64 64 72 65 73 73 20 68 6f 6c 64 69  em address holdi
36050 6e 67 20 66 6c 61 67 20 69 6e 64 69 63 61 74 69  ng flag indicati
36060 6e 67 20 74 68 61 74 20 61 74 20 6c 65 61 73 74  ng that at least
36070 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
36080 20 20 20 20 20 20 20 20 20 2a 2a 20 6f 6e 65 20           ** one 
36090 72 6f 77 20 6f 66 20 74 68 65 20 69 6e 70 75 74  row of the input
360a0 20 74 6f 20 74 68 65 20 61 67 67 72 65 67 61 74   to the aggregat
360b0 6f 72 20 68 61 73 20 62 65 65 6e 0a 20 20 20 20  or has been.    
360c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
360d0 20 20 20 20 2a 2a 20 70 72 6f 63 65 73 73 65 64      ** processed
360e0 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 41 62 6f   */.    int iAbo
360f0 72 74 46 6c 61 67 3b 20 20 20 20 20 2f 2a 20 4d  rtFlag;     /* M
36100 65 6d 20 61 64 64 72 65 73 73 20 77 68 69 63 68  em address which
36110 20 63 61 75 73 65 73 20 71 75 65 72 79 20 61 62   causes query ab
36120 6f 72 74 20 69 66 20 70 6f 73 69 74 69 76 65 20  ort if positive 
36130 2a 2f 0a 20 20 20 20 69 6e 74 20 67 72 6f 75 70  */.    int group
36140 42 79 53 6f 72 74 3b 20 20 20 20 2f 2a 20 52 6f  BySort;    /* Ro
36150 77 73 20 63 6f 6d 65 20 66 72 6f 6d 20 73 6f 75  ws come from sou
36160 72 63 65 20 69 6e 20 47 52 4f 55 50 20 42 59 20  rce in GROUP BY 
36170 6f 72 64 65 72 20 2a 2f 0a 20 20 20 20 69 6e 74  order */.    int
36180 20 61 64 64 72 45 6e 64 3b 20 20 20 20 20 20 20   addrEnd;       
36190 20 2f 2a 20 45 6e 64 20 6f 66 20 70 72 6f 63 65   /* End of proce
361a0 73 73 69 6e 67 20 66 6f 72 20 74 68 69 73 20 53  ssing for this S
361b0 45 4c 45 43 54 20 2a 2f 0a 20 20 20 20 69 6e 74  ELECT */.    int
361c0 20 73 6f 72 74 50 54 61 62 20 3d 20 30 3b 20 20   sortPTab = 0;  
361d0 20 2f 2a 20 50 73 65 75 64 6f 74 61 62 6c 65 20   /* Pseudotable 
361e0 75 73 65 64 20 74 6f 20 64 65 63 6f 64 65 20 73  used to decode s
361f0 6f 72 74 69 6e 67 20 72 65 73 75 6c 74 73 20 2a  orting results *
36200 2f 0a 20 20 20 20 69 6e 74 20 73 6f 72 74 4f 75  /.    int sortOu
36210 74 20 3d 20 30 3b 20 20 20 20 2f 2a 20 4f 75 74  t = 0;    /* Out
36220 70 75 74 20 72 65 67 69 73 74 65 72 20 66 72 6f  put register fro
36230 6d 20 74 68 65 20 73 6f 72 74 65 72 20 2a 2f 0a  m the sorter */.
36240 20 20 20 20 69 6e 74 20 6f 72 64 65 72 42 79 47      int orderByG
36250 72 70 20 3d 20 30 3b 20 2f 2a 20 54 72 75 65 20  rp = 0; /* True 
36260 69 66 20 74 68 65 20 47 52 4f 55 50 20 42 59 20  if the GROUP BY 
36270 61 6e 64 20 4f 52 44 45 52 20 42 59 20 61 72 65  and ORDER BY are
36280 20 74 68 65 20 73 61 6d 65 20 2a 2f 0a 0a 20 20   the same */..  
36290 20 20 2f 2a 20 52 65 6d 6f 76 65 20 61 6e 79 20    /* Remove any 
362a0 61 6e 64 20 61 6c 6c 20 61 6c 69 61 73 65 73 20  and all aliases 
362b0 62 65 74 77 65 65 6e 20 74 68 65 20 72 65 73 75  between the resu
362c0 6c 74 20 73 65 74 20 61 6e 64 20 74 68 65 0a 20  lt set and the. 
362d0 20 20 20 2a 2a 20 47 52 4f 55 50 20 42 59 20 63     ** GROUP BY c
362e0 6c 61 75 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20  lause..    */.  
362f0 20 20 69 66 28 20 70 47 72 6f 75 70 42 79 20 29    if( pGroupBy )
36300 7b 0a 20 20 20 20 20 20 69 6e 74 20 6b 3b 20 20  {.      int k;  
36310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36320 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
36330 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 20 20 73  unter */.      s
36340 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69  truct ExprList_i
36350 74 65 6d 20 2a 70 49 74 65 6d 3b 20 20 2f 2a 20  tem *pItem;  /* 
36360 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72  For looping over
36370 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 61   expression in a
36380 20 6c 69 73 74 20 2a 2f 0a 0a 20 20 20 20 20 20   list */..      
36390 66 6f 72 28 6b 3d 70 2d 3e 70 45 4c 69 73 74 2d  for(k=p->pEList-
363a0 3e 6e 45 78 70 72 2c 20 70 49 74 65 6d 3d 70 2d  >nExpr, pItem=p-
363b0 3e 70 45 4c 69 73 74 2d 3e 61 3b 20 6b 3e 30 3b  >pEList->a; k>0;
363c0 20 6b 2d 2d 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a   k--, pItem++){.
363d0 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 75          pItem->u
363e0 2e 78 2e 69 41 6c 69 61 73 20 3d 20 30 3b 0a 20  .x.iAlias = 0;. 
363f0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 6f 72       }.      for
36400 28 6b 3d 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78  (k=pGroupBy->nEx
36410 70 72 2c 20 70 49 74 65 6d 3d 70 47 72 6f 75 70  pr, pItem=pGroup
36420 42 79 2d 3e 61 3b 20 6b 3e 30 3b 20 6b 2d 2d 2c  By->a; k>0; k--,
36430 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20   pItem++){.     
36440 20 20 20 70 49 74 65 6d 2d 3e 75 2e 78 2e 69 41     pItem->u.x.iA
36450 6c 69 61 73 20 3d 20 30 3b 0a 20 20 20 20 20 20  lias = 0;.      
36460 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  }.      assert( 
36470 36 36 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73  66==sqlite3LogEs
36480 74 28 31 30 30 29 20 29 3b 0a 20 20 20 20 20 20  t(100) );.      
36490 69 66 28 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f  if( p->nSelectRo
364a0 77 3e 36 36 20 29 20 70 2d 3e 6e 53 65 6c 65 63  w>66 ) p->nSelec
364b0 74 52 6f 77 20 3d 20 36 36 3b 0a 20 20 20 20 7d  tRow = 66;.    }
364c0 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65  else{.      asse
364d0 72 74 28 20 30 3d 3d 73 71 6c 69 74 65 33 4c 6f  rt( 0==sqlite3Lo
364e0 67 45 73 74 28 31 29 20 29 3b 0a 20 20 20 20 20  gEst(1) );.     
364f0 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d   p->nSelectRow =
36500 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f   0;.    }..    /
36510 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 62 6f  * If there is bo
36520 74 68 20 61 20 47 52 4f 55 50 20 42 59 20 61 6e  th a GROUP BY an
36530 64 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c  d an ORDER BY cl
36540 61 75 73 65 20 61 6e 64 20 74 68 65 79 20 61 72  ause and they ar
36550 65 0a 20 20 20 20 2a 2a 20 69 64 65 6e 74 69 63  e.    ** identic
36560 61 6c 2c 20 74 68 65 6e 20 69 74 20 6d 61 79 20  al, then it may 
36570 62 65 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 64  be possible to d
36580 69 73 61 62 6c 65 20 74 68 65 20 4f 52 44 45 52  isable the ORDER
36590 20 42 59 20 63 6c 61 75 73 65 20 0a 20 20 20 20   BY clause .    
365a0 2a 2a 20 6f 6e 20 74 68 65 20 67 72 6f 75 6e 64  ** on the ground
365b0 73 20 74 68 61 74 20 74 68 65 20 47 52 4f 55 50  s that the GROUP
365c0 20 42 59 20 77 69 6c 6c 20 63 61 75 73 65 20 65   BY will cause e
365d0 6c 65 6d 65 6e 74 73 20 74 6f 20 63 6f 6d 65 20  lements to come 
365e0 6f 75 74 20 0a 20 20 20 20 2a 2a 20 69 6e 20 74  out .    ** in t
365f0 68 65 20 63 6f 72 72 65 63 74 20 6f 72 64 65 72  he correct order
36600 2e 20 49 74 20 61 6c 73 6f 20 6d 61 79 20 6e 6f  . It also may no
36610 74 20 2d 20 74 68 65 20 47 52 4f 55 50 20 42 59  t - the GROUP BY
36620 20 6d 69 67 68 74 20 75 73 65 20 61 0a 20 20 20   might use a.   
36630 20 2a 2a 20 64 61 74 61 62 61 73 65 20 69 6e 64   ** database ind
36640 65 78 20 74 68 61 74 20 63 61 75 73 65 73 20 72  ex that causes r
36650 6f 77 73 20 74 6f 20 62 65 20 67 72 6f 75 70 65  ows to be groupe
36660 64 20 74 6f 67 65 74 68 65 72 20 61 73 20 72 65  d together as re
36670 71 75 69 72 65 64 0a 20 20 20 20 2a 2a 20 62 75  quired.    ** bu
36680 74 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 73  t not actually s
36690 6f 72 74 65 64 2e 20 45 69 74 68 65 72 20 77 61  orted. Either wa
366a0 79 2c 20 72 65 63 6f 72 64 20 74 68 65 20 66 61  y, record the fa
366b0 63 74 20 74 68 61 74 20 74 68 65 0a 20 20 20 20  ct that the.    
366c0 2a 2a 20 4f 52 44 45 52 20 42 59 20 61 6e 64 20  ** ORDER BY and 
366d0 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 73  GROUP BY clauses
366e0 20 61 72 65 20 74 68 65 20 73 61 6d 65 20 62 79   are the same by
366f0 20 73 65 74 74 69 6e 67 20 74 68 65 20 6f 72 64   setting the ord
36700 65 72 42 79 47 72 70 0a 20 20 20 20 2a 2a 20 76  erByGrp.    ** v
36710 61 72 69 61 62 6c 65 2e 20 20 2a 2f 0a 20 20 20  ariable.  */.   
36720 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72   if( sqlite3Expr
36730 4c 69 73 74 43 6f 6d 70 61 72 65 28 70 47 72 6f  ListCompare(pGro
36740 75 70 42 79 2c 20 73 53 6f 72 74 2e 70 4f 72 64  upBy, sSort.pOrd
36750 65 72 42 79 2c 20 2d 31 29 3d 3d 30 20 29 7b 0a  erBy, -1)==0 ){.
36760 20 20 20 20 20 20 6f 72 64 65 72 42 79 47 72 70        orderByGrp
36770 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 0a 20 20   = 1;.    }. .  
36780 20 20 2f 2a 20 43 72 65 61 74 65 20 61 20 6c 61    /* Create a la
36790 62 65 6c 20 74 6f 20 6a 75 6d 70 20 74 6f 20 77  bel to jump to w
367a0 68 65 6e 20 77 65 20 77 61 6e 74 20 74 6f 20 61  hen we want to a
367b0 62 6f 72 74 20 74 68 65 20 71 75 65 72 79 20 2a  bort the query *
367c0 2f 0a 20 20 20 20 61 64 64 72 45 6e 64 20 3d 20  /.    addrEnd = 
367d0 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
367e0 61 62 65 6c 28 76 29 3b 0a 0a 20 20 20 20 2f 2a  abel(v);..    /*
367f0 20 43 6f 6e 76 65 72 74 20 54 4b 5f 43 4f 4c 55   Convert TK_COLU
36800 4d 4e 20 6e 6f 64 65 73 20 69 6e 74 6f 20 54 4b  MN nodes into TK
36810 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 61 6e 64 20  _AGG_COLUMN and 
36820 6d 61 6b 65 20 65 6e 74 72 69 65 73 20 69 6e 0a  make entries in.
36830 20 20 20 20 2a 2a 20 73 41 67 67 49 6e 66 6f 20      ** sAggInfo 
36840 66 6f 72 20 61 6c 6c 20 54 4b 5f 41 47 47 5f 46  for all TK_AGG_F
36850 55 4e 43 54 49 4f 4e 20 6e 6f 64 65 73 20 69 6e  UNCTION nodes in
36860 20 65 78 70 72 65 73 73 69 6f 6e 73 20 6f 66 20   expressions of 
36870 74 68 65 0a 20 20 20 20 2a 2a 20 53 45 4c 45 43  the.    ** SELEC
36880 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a 20 20 20  T statement..   
36890 20 2a 2f 0a 20 20 20 20 6d 65 6d 73 65 74 28 26   */.    memset(&
368a0 73 4e 43 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73  sNC, 0, sizeof(s
368b0 4e 43 29 29 3b 0a 20 20 20 20 73 4e 43 2e 70 50  NC));.    sNC.pP
368c0 61 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20  arse = pParse;. 
368d0 20 20 20 73 4e 43 2e 70 53 72 63 4c 69 73 74 20     sNC.pSrcList 
368e0 3d 20 70 54 61 62 4c 69 73 74 3b 0a 20 20 20 20  = pTabList;.    
368f0 73 4e 43 2e 75 4e 43 2e 70 41 67 67 49 6e 66 6f  sNC.uNC.pAggInfo
36900 20 3d 20 26 73 41 67 67 49 6e 66 6f 3b 0a 20 20   = &sAggInfo;.  
36910 20 20 56 56 41 5f 4f 4e 4c 59 28 20 73 4e 43 2e    VVA_ONLY( sNC.
36920 6e 63 46 6c 61 67 73 20 3d 20 4e 43 5f 55 41 67  ncFlags = NC_UAg
36930 67 49 6e 66 6f 3b 20 29 0a 20 20 20 20 73 41 67  gInfo; ).    sAg
36940 67 49 6e 66 6f 2e 6d 6e 52 65 67 20 3d 20 70 50  gInfo.mnReg = pP
36950 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20  arse->nMem+1;.  
36960 20 20 73 41 67 67 49 6e 66 6f 2e 6e 53 6f 72 74    sAggInfo.nSort
36970 69 6e 67 43 6f 6c 75 6d 6e 20 3d 20 70 47 72 6f  ingColumn = pGro
36980 75 70 42 79 20 3f 20 70 47 72 6f 75 70 42 79 2d  upBy ? pGroupBy-
36990 3e 6e 45 78 70 72 20 3a 20 30 3b 0a 20 20 20 20  >nExpr : 0;.    
369a0 73 41 67 67 49 6e 66 6f 2e 70 47 72 6f 75 70 42  sAggInfo.pGroupB
369b0 79 20 3d 20 70 47 72 6f 75 70 42 79 3b 0a 20 20  y = pGroupBy;.  
369c0 20 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61    sqlite3ExprAna
369d0 6c 79 7a 65 41 67 67 4c 69 73 74 28 26 73 4e 43  lyzeAggList(&sNC
369e0 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 73  , pEList);.    s
369f0 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a  qlite3ExprAnalyz
36a00 65 41 67 67 4c 69 73 74 28 26 73 4e 43 2c 20 73  eAggList(&sNC, s
36a10 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 29 3b 0a  Sort.pOrderBy);.
36a20 20 20 20 20 69 66 28 20 70 48 61 76 69 6e 67 20      if( pHaving 
36a30 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 47 72  ){.      if( pGr
36a40 6f 75 70 42 79 20 29 7b 0a 20 20 20 20 20 20 20  oupBy ){.       
36a50 20 61 73 73 65 72 74 28 20 70 57 68 65 72 65 3d   assert( pWhere=
36a60 3d 70 2d 3e 70 57 68 65 72 65 20 29 3b 0a 20 20  =p->pWhere );.  
36a70 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 48        assert( pH
36a80 61 76 69 6e 67 3d 3d 70 2d 3e 70 48 61 76 69 6e  aving==p->pHavin
36a90 67 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  g );.        ass
36aa0 65 72 74 28 20 70 47 72 6f 75 70 42 79 3d 3d 70  ert( pGroupBy==p
36ab0 2d 3e 70 47 72 6f 75 70 42 79 20 29 3b 0a 20 20  ->pGroupBy );.  
36ac0 20 20 20 20 20 20 68 61 76 69 6e 67 54 6f 57 68        havingToWh
36ad0 65 72 65 28 70 50 61 72 73 65 2c 20 70 29 3b 0a  ere(pParse, p);.
36ae0 20 20 20 20 20 20 20 20 70 57 68 65 72 65 20 3d          pWhere =
36af0 20 70 2d 3e 70 57 68 65 72 65 3b 0a 20 20 20 20   p->pWhere;.    
36b00 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
36b10 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 72  3ExprAnalyzeAggr
36b20 65 67 61 74 65 73 28 26 73 4e 43 2c 20 70 48 61  egates(&sNC, pHa
36b30 76 69 6e 67 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ving);.    }.   
36b40 20 73 41 67 67 49 6e 66 6f 2e 6e 41 63 63 75 6d   sAggInfo.nAccum
36b50 75 6c 61 74 6f 72 20 3d 20 73 41 67 67 49 6e 66  ulator = sAggInf
36b60 6f 2e 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 69  o.nColumn;.    i
36b70 66 28 20 70 2d 3e 70 47 72 6f 75 70 42 79 3d 3d  f( p->pGroupBy==
36b80 30 20 26 26 20 70 2d 3e 70 48 61 76 69 6e 67 3d  0 && p->pHaving=
36b90 3d 30 20 26 26 20 73 41 67 67 49 6e 66 6f 2e 6e  =0 && sAggInfo.n
36ba0 46 75 6e 63 3d 3d 31 20 29 7b 0a 20 20 20 20 20  Func==1 ){.     
36bb0 20 6d 69 6e 4d 61 78 46 6c 61 67 20 3d 20 6d 69   minMaxFlag = mi
36bc0 6e 4d 61 78 51 75 65 72 79 28 64 62 2c 20 73 41  nMaxQuery(db, sA
36bd0 67 67 49 6e 66 6f 2e 61 46 75 6e 63 5b 30 5d 2e  ggInfo.aFunc[0].
36be0 70 45 78 70 72 2c 20 26 70 4d 69 6e 4d 61 78 4f  pExpr, &pMinMaxO
36bf0 72 64 65 72 42 79 29 3b 0a 20 20 20 20 7d 65 6c  rderBy);.    }el
36c00 73 65 7b 0a 20 20 20 20 20 20 6d 69 6e 4d 61 78  se{.      minMax
36c10 46 6c 61 67 20 3d 20 57 48 45 52 45 5f 4f 52 44  Flag = WHERE_ORD
36c20 45 52 42 59 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 20  ERBY_NORMAL;.   
36c30 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20   }.    for(i=0; 
36c40 69 3c 73 41 67 67 49 6e 66 6f 2e 6e 46 75 6e 63  i<sAggInfo.nFunc
36c50 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 61 73  ; i++){.      as
36c60 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72  sert( !ExprHasPr
36c70 6f 70 65 72 74 79 28 73 41 67 67 49 6e 66 6f 2e  operty(sAggInfo.
36c80 61 46 75 6e 63 5b 69 5d 2e 70 45 78 70 72 2c 20  aFunc[i].pExpr, 
36c90 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b  EP_xIsSelect) );
36ca0 0a 20 20 20 20 20 20 73 4e 43 2e 6e 63 46 6c 61  .      sNC.ncFla
36cb0 67 73 20 7c 3d 20 4e 43 5f 49 6e 41 67 67 46 75  gs |= NC_InAggFu
36cc0 6e 63 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  nc;.      sqlite
36cd0 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 4c  3ExprAnalyzeAggL
36ce0 69 73 74 28 26 73 4e 43 2c 20 73 41 67 67 49 6e  ist(&sNC, sAggIn
36cf0 66 6f 2e 61 46 75 6e 63 5b 69 5d 2e 70 45 78 70  fo.aFunc[i].pExp
36d00 72 2d 3e 78 2e 70 4c 69 73 74 29 3b 0a 20 20 20  r->x.pList);.   
36d10 20 20 20 73 4e 43 2e 6e 63 46 6c 61 67 73 20 26     sNC.ncFlags &
36d20 3d 20 7e 4e 43 5f 49 6e 41 67 67 46 75 6e 63 3b  = ~NC_InAggFunc;
36d30 0a 20 20 20 20 7d 0a 20 20 20 20 73 41 67 67 49  .    }.    sAggI
36d40 6e 66 6f 2e 6d 78 52 65 67 20 3d 20 70 50 61 72  nfo.mxReg = pPar
36d50 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 69 66  se->nMem;.    if
36d60 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
36d70 65 64 20 29 20 67 6f 74 6f 20 73 65 6c 65 63 74  ed ) goto select
36d80 5f 65 6e 64 3b 0a 23 69 66 20 53 45 4c 45 43 54  _end;.#if SELECT
36d90 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20  TRACE_ENABLED.  
36da0 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 65 6c    if( sqlite3Sel
36db0 65 63 74 54 72 61 63 65 20 26 20 30 78 34 30 30  ectTrace & 0x400
36dc0 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 69   ){.      int ii
36dd0 3b 0a 20 20 20 20 20 20 53 45 4c 45 43 54 54 52  ;.      SELECTTR
36de0 41 43 45 28 30 78 34 30 30 2c 70 50 61 72 73 65  ACE(0x400,pParse
36df0 2c 70 2c 28 22 41 66 74 65 72 20 61 67 67 72 65  ,p,("After aggre
36e00 67 61 74 65 20 61 6e 61 6c 79 73 69 73 3a 5c 6e  gate analysis:\n
36e10 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  "));.      sqlit
36e20 65 33 54 72 65 65 56 69 65 77 53 65 6c 65 63 74  e3TreeViewSelect
36e30 28 30 2c 20 70 2c 20 30 29 3b 0a 20 20 20 20 20  (0, p, 0);.     
36e40 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 73 41   for(ii=0; ii<sA
36e50 67 67 49 6e 66 6f 2e 6e 43 6f 6c 75 6d 6e 3b 20  ggInfo.nColumn; 
36e60 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 73  ii++){.        s
36e70 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
36e80 66 28 22 61 67 67 2d 63 6f 6c 75 6d 6e 5b 25 64  f("agg-column[%d
36e90 5d 20 69 4d 65 6d 3d 25 64 5c 6e 22 2c 0a 20 20  ] iMem=%d\n",.  
36ea0 20 20 20 20 20 20 20 20 20 20 69 69 2c 20 73 41            ii, sA
36eb0 67 67 49 6e 66 6f 2e 61 43 6f 6c 5b 69 69 5d 2e  ggInfo.aCol[ii].
36ec0 69 4d 65 6d 29 3b 0a 20 20 20 20 20 20 20 20 73  iMem);.        s
36ed0 71 6c 69 74 65 33 54 72 65 65 56 69 65 77 45 78  qlite3TreeViewEx
36ee0 70 72 28 30 2c 20 73 41 67 67 49 6e 66 6f 2e 61  pr(0, sAggInfo.a
36ef0 43 6f 6c 5b 69 69 5d 2e 70 45 78 70 72 2c 20 30  Col[ii].pExpr, 0
36f00 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
36f10 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 73 41   for(ii=0; ii<sA
36f20 67 67 49 6e 66 6f 2e 6e 46 75 6e 63 3b 20 69 69  ggInfo.nFunc; ii
36f30 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  ++){.        sql
36f40 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
36f50 22 61 67 67 2d 66 75 6e 63 5b 25 64 5d 3a 20 69  "agg-func[%d]: i
36f60 4d 65 6d 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20  Mem=%d\n",.     
36f70 20 20 20 20 20 20 20 69 69 2c 20 73 41 67 67 49         ii, sAggI
36f80 6e 66 6f 2e 61 46 75 6e 63 5b 69 69 5d 2e 69 4d  nfo.aFunc[ii].iM
36f90 65 6d 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  em);.        sql
36fa0 69 74 65 33 54 72 65 65 56 69 65 77 45 78 70 72  ite3TreeViewExpr
36fb0 28 30 2c 20 73 41 67 67 49 6e 66 6f 2e 61 46 75  (0, sAggInfo.aFu
36fc0 6e 63 5b 69 69 5d 2e 70 45 78 70 72 2c 20 30 29  nc[ii].pExpr, 0)
36fd0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
36fe0 23 65 6e 64 69 66 0a 0a 0a 20 20 20 20 2f 2a 20  #endif...    /* 
36ff0 50 72 6f 63 65 73 73 69 6e 67 20 66 6f 72 20 61  Processing for a
37000 67 67 72 65 67 61 74 65 73 20 77 69 74 68 20 47  ggregates with G
37010 52 4f 55 50 20 42 59 20 69 73 20 76 65 72 79 20  ROUP BY is very 
37020 64 69 66 66 65 72 65 6e 74 20 61 6e 64 0a 20 20  different and.  
37030 20 20 2a 2a 20 6d 75 63 68 20 6d 6f 72 65 20 63    ** much more c
37040 6f 6d 70 6c 65 78 20 74 68 61 6e 20 61 67 67 72  omplex than aggr
37050 65 67 61 74 65 73 20 77 69 74 68 6f 75 74 20 61  egates without a
37060 20 47 52 4f 55 50 20 42 59 2e 0a 20 20 20 20 2a   GROUP BY..    *
37070 2f 0a 20 20 20 20 69 66 28 20 70 47 72 6f 75 70  /.    if( pGroup
37080 42 79 20 29 7b 0a 20 20 20 20 20 20 4b 65 79 49  By ){.      KeyI
37090 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b 20 20  nfo *pKeyInfo;  
370a0 2f 2a 20 4b 65 79 69 6e 67 20 69 6e 66 6f 72 6d  /* Keying inform
370b0 61 74 69 6f 6e 20 66 6f 72 20 74 68 65 20 67 72  ation for the gr
370c0 6f 75 70 20 62 79 20 63 6c 61 75 73 65 20 2a 2f  oup by clause */
370d0 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 31  .      int addr1
370e0 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 2d  ;          /* A-
370f0 76 73 2d 42 20 63 6f 6d 70 61 72 69 73 69 6f 6e  vs-B comparision
37100 20 6a 75 6d 70 20 2a 2f 0a 20 20 20 20 20 20 69   jump */.      i
37110 6e 74 20 61 64 64 72 4f 75 74 70 75 74 52 6f 77  nt addrOutputRow
37120 3b 20 20 2f 2a 20 53 74 61 72 74 20 6f 66 20 73  ;  /* Start of s
37130 75 62 72 6f 75 74 69 6e 65 20 74 68 61 74 20 6f  ubroutine that o
37140 75 74 70 75 74 73 20 61 20 72 65 73 75 6c 74 20  utputs a result 
37150 72 6f 77 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  row */.      int
37160 20 72 65 67 4f 75 74 70 75 74 52 6f 77 3b 20 20   regOutputRow;  
37170 20 2f 2a 20 52 65 74 75 72 6e 20 61 64 64 72 65   /* Return addre
37180 73 73 20 72 65 67 69 73 74 65 72 20 66 6f 72 20  ss register for 
37190 6f 75 74 70 75 74 20 73 75 62 72 6f 75 74 69 6e  output subroutin
371a0 65 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61  e */.      int a
371b0 64 64 72 53 65 74 41 62 6f 72 74 3b 20 20 20 2f  ddrSetAbort;   /
371c0 2a 20 53 65 74 20 74 68 65 20 61 62 6f 72 74 20  * Set the abort 
371d0 66 6c 61 67 20 61 6e 64 20 72 65 74 75 72 6e 20  flag and return 
371e0 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64  */.      int add
371f0 72 54 6f 70 4f 66 4c 6f 6f 70 3b 20 20 2f 2a 20  rTopOfLoop;  /* 
37200 54 6f 70 20 6f 66 20 74 68 65 20 69 6e 70 75 74  Top of the input
37210 20 6c 6f 6f 70 20 2a 2f 0a 20 20 20 20 20 20 69   loop */.      i
37220 6e 74 20 61 64 64 72 53 6f 72 74 69 6e 67 49 64  nt addrSortingId
37230 78 3b 20 2f 2a 20 54 68 65 20 4f 50 5f 4f 70 65  x; /* The OP_Ope
37240 6e 45 70 68 65 6d 65 72 61 6c 20 66 6f 72 20 74  nEphemeral for t
37250 68 65 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78  he sorting index
37260 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61 64   */.      int ad
37270 64 72 52 65 73 65 74 3b 20 20 20 20 20 20 2f 2a  drReset;      /*
37280 20 53 75 62 72 6f 75 74 69 6e 65 20 66 6f 72 20   Subroutine for 
37290 72 65 73 65 74 74 69 6e 67 20 74 68 65 20 61 63  resetting the ac
372a0 63 75 6d 75 6c 61 74 6f 72 20 2a 2f 0a 20 20 20  cumulator */.   
372b0 20 20 20 69 6e 74 20 72 65 67 52 65 73 65 74 3b     int regReset;
372c0 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
372d0 20 61 64 64 72 65 73 73 20 72 65 67 69 73 74 65   address registe
372e0 72 20 66 6f 72 20 72 65 73 65 74 20 73 75 62 72  r for reset subr
372f0 6f 75 74 69 6e 65 20 2a 2f 0a 0a 20 20 20 20 20  outine */..     
37300 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73 20   /* If there is 
37310 61 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73  a GROUP BY claus
37320 65 20 77 65 20 6d 69 67 68 74 20 6e 65 65 64 20  e we might need 
37330 61 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 20  a sorting index 
37340 74 6f 0a 20 20 20 20 20 20 2a 2a 20 69 6d 70 6c  to.      ** impl
37350 65 6d 65 6e 74 20 69 74 2e 20 20 41 6c 6c 6f 63  ement it.  Alloc
37360 61 74 65 20 74 68 61 74 20 73 6f 72 74 69 6e 67  ate that sorting
37370 20 69 6e 64 65 78 20 6e 6f 77 2e 20 20 49 66 20   index now.  If 
37380 69 74 20 74 75 72 6e 73 20 6f 75 74 0a 20 20 20  it turns out.   
37390 20 20 20 2a 2a 20 74 68 61 74 20 77 65 20 64 6f     ** that we do
373a0 20 6e 6f 74 20 6e 65 65 64 20 69 74 20 61 66 74   not need it aft
373b0 65 72 20 61 6c 6c 2c 20 74 68 65 20 4f 50 5f 53  er all, the OP_S
373c0 6f 72 74 65 72 4f 70 65 6e 20 69 6e 73 74 72 75  orterOpen instru
373d0 63 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 77  ction.      ** w
373e0 69 6c 6c 20 62 65 20 63 6f 6e 76 65 72 74 65 64  ill be converted
373f0 20 69 6e 74 6f 20 61 20 4e 6f 6f 70 2e 20 20 0a   into a Noop.  .
37400 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73        */.      s
37410 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49  AggInfo.sortingI
37420 64 78 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61  dx = pParse->nTa
37430 62 2b 2b 3b 0a 20 20 20 20 20 20 70 4b 65 79 49  b++;.      pKeyI
37440 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 4b 65 79  nfo = sqlite3Key
37450 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74  InfoFromExprList
37460 28 70 50 61 72 73 65 2c 70 47 72 6f 75 70 42 79  (pParse,pGroupBy
37470 2c 30 2c 73 41 67 67 49 6e 66 6f 2e 6e 43 6f 6c  ,0,sAggInfo.nCol
37480 75 6d 6e 29 3b 0a 20 20 20 20 20 20 61 64 64 72  umn);.      addr
37490 53 6f 72 74 69 6e 67 49 64 78 20 3d 20 73 71 6c  SortingIdx = sql
374a0 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
374b0 2c 20 4f 50 5f 53 6f 72 74 65 72 4f 70 65 6e 2c  , OP_SorterOpen,
374c0 20 0a 20 20 20 20 20 20 20 20 20 20 73 41 67 67   .          sAgg
374d0 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78 2c  Info.sortingIdx,
374e0 20 73 41 67 67 49 6e 66 6f 2e 6e 53 6f 72 74 69   sAggInfo.nSorti
374f0 6e 67 43 6f 6c 75 6d 6e 2c 20 0a 20 20 20 20 20  ngColumn, .     
37500 20 20 20 20 20 30 2c 20 28 63 68 61 72 2a 29 70       0, (char*)p
37510 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49  KeyInfo, P4_KEYI
37520 4e 46 4f 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  NFO);..      /* 
37530 49 6e 69 74 69 61 6c 69 7a 65 20 6d 65 6d 6f 72  Initialize memor
37540 79 20 6c 6f 63 61 74 69 6f 6e 73 20 75 73 65 64  y locations used
37550 20 62 79 20 47 52 4f 55 50 20 42 59 20 61 67 67   by GROUP BY agg
37560 72 65 67 61 74 65 20 70 72 6f 63 65 73 73 69 6e  regate processin
37570 67 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  g.      */.     
37580 20 69 55 73 65 46 6c 61 67 20 3d 20 2b 2b 70 50   iUseFlag = ++pP
37590 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20  arse->nMem;.    
375a0 20 20 69 41 62 6f 72 74 46 6c 61 67 20 3d 20 2b    iAbortFlag = +
375b0 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
375c0 20 20 20 20 20 72 65 67 4f 75 74 70 75 74 52 6f       regOutputRo
375d0 77 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  w = ++pParse->nM
375e0 65 6d 3b 0a 20 20 20 20 20 20 61 64 64 72 4f 75  em;.      addrOu
375f0 74 70 75 74 52 6f 77 20 3d 20 73 71 6c 69 74 65  tputRow = sqlite
37600 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
37610 29 3b 0a 20 20 20 20 20 20 72 65 67 52 65 73 65  );.      regRese
37620 74 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  t = ++pParse->nM
37630 65 6d 3b 0a 20 20 20 20 20 20 61 64 64 72 52 65  em;.      addrRe
37640 73 65 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62  set = sqlite3Vdb
37650 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
37660 20 20 20 20 20 69 41 4d 65 6d 20 3d 20 70 50 61       iAMem = pPa
37670 72 73 65 2d 3e 6e 4d 65 6d 20 2b 20 31 3b 0a 20  rse->nMem + 1;. 
37680 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65       pParse->nMe
37690 6d 20 2b 3d 20 70 47 72 6f 75 70 42 79 2d 3e 6e  m += pGroupBy->n
376a0 45 78 70 72 3b 0a 20 20 20 20 20 20 69 42 4d 65  Expr;.      iBMe
376b0 6d 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  m = pParse->nMem
376c0 20 2b 20 31 3b 0a 20 20 20 20 20 20 70 50 61 72   + 1;.      pPar
376d0 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 70 47 72 6f  se->nMem += pGro
376e0 75 70 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 20  upBy->nExpr;.   
376f0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
37700 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
37710 65 72 2c 20 30 2c 20 69 41 62 6f 72 74 46 6c 61  er, 0, iAbortFla
37720 67 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  g);.      VdbeCo
37730 6d 6d 65 6e 74 28 28 76 2c 20 22 63 6c 65 61 72  mment((v, "clear
37740 20 61 62 6f 72 74 20 66 6c 61 67 22 29 29 3b 0a   abort flag"));.
37750 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
37760 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4e 75  eAddOp3(v, OP_Nu
37770 6c 6c 2c 20 30 2c 20 69 41 4d 65 6d 2c 20 69 41  ll, 0, iAMem, iA
37780 4d 65 6d 2b 70 47 72 6f 75 70 42 79 2d 3e 6e 45  Mem+pGroupBy->nE
37790 78 70 72 2d 31 29 3b 0a 0a 20 20 20 20 20 20 2f  xpr-1);..      /
377a0 2a 20 42 65 67 69 6e 20 61 20 6c 6f 6f 70 20 74  * Begin a loop t
377b0 68 61 74 20 77 69 6c 6c 20 65 78 74 72 61 63 74  hat will extract
377c0 20 61 6c 6c 20 73 6f 75 72 63 65 20 72 6f 77 73   all source rows
377d0 20 69 6e 20 47 52 4f 55 50 20 42 59 20 6f 72 64   in GROUP BY ord
377e0 65 72 2e 0a 20 20 20 20 20 20 2a 2a 20 54 68 69  er..      ** Thi
377f0 73 20 6d 69 67 68 74 20 69 6e 76 6f 6c 76 65 20  s might involve 
37800 74 77 6f 20 73 65 70 61 72 61 74 65 20 6c 6f 6f  two separate loo
37810 70 73 20 77 69 74 68 20 61 6e 20 4f 50 5f 53 6f  ps with an OP_So
37820 72 74 20 69 6e 20 62 65 74 77 65 65 6e 2c 20 6f  rt in between, o
37830 72 0a 20 20 20 20 20 20 2a 2a 20 69 74 20 6d 69  r.      ** it mi
37840 67 68 74 20 62 65 20 61 20 73 69 6e 67 6c 65 20  ght be a single 
37850 6c 6f 6f 70 20 74 68 61 74 20 75 73 65 73 20 61  loop that uses a
37860 6e 20 69 6e 64 65 78 20 74 6f 20 65 78 74 72 61  n index to extra
37870 63 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a 20  ct information. 
37880 20 20 20 20 20 2a 2a 20 69 6e 20 74 68 65 20 72       ** in the r
37890 69 67 68 74 20 6f 72 64 65 72 20 74 6f 20 62 65  ight order to be
378a0 67 69 6e 20 77 69 74 68 2e 0a 20 20 20 20 20 20  gin with..      
378b0 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
378c0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
378d0 5f 47 6f 73 75 62 2c 20 72 65 67 52 65 73 65 74  _Gosub, regReset
378e0 2c 20 61 64 64 72 52 65 73 65 74 29 3b 0a 20 20  , addrReset);.  
378f0 20 20 20 20 53 45 4c 45 43 54 54 52 41 43 45 28      SELECTTRACE(
37900 31 2c 70 50 61 72 73 65 2c 70 2c 28 22 57 68 65  1,pParse,p,("Whe
37910 72 65 42 65 67 69 6e 5c 6e 22 29 29 3b 0a 20 20  reBegin\n"));.  
37920 20 20 20 20 70 57 49 6e 66 6f 20 3d 20 73 71 6c      pWInfo = sql
37930 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 70  ite3WhereBegin(p
37940 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74 2c  Parse, pTabList,
37950 20 70 57 68 65 72 65 2c 20 70 47 72 6f 75 70 42   pWhere, pGroupB
37960 79 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20  y, 0,.          
37970 57 48 45 52 45 5f 47 52 4f 55 50 42 59 20 7c 20  WHERE_GROUPBY | 
37980 28 6f 72 64 65 72 42 79 47 72 70 20 3f 20 57 48  (orderByGrp ? WH
37990 45 52 45 5f 53 4f 52 54 42 59 47 52 4f 55 50 20  ERE_SORTBYGROUP 
379a0 3a 20 30 29 2c 20 30 0a 20 20 20 20 20 20 29 3b  : 0), 0.      );
379b0 0a 20 20 20 20 20 20 69 66 28 20 70 57 49 6e 66  .      if( pWInf
379c0 6f 3d 3d 30 20 29 20 67 6f 74 6f 20 73 65 6c 65  o==0 ) goto sele
379d0 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 69 66  ct_end;.      if
379e0 28 20 73 71 6c 69 74 65 33 57 68 65 72 65 49 73  ( sqlite3WhereIs
379f0 4f 72 64 65 72 65 64 28 70 57 49 6e 66 6f 29 3d  Ordered(pWInfo)=
37a00 3d 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72  =pGroupBy->nExpr
37a10 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54   ){.        /* T
37a20 68 65 20 6f 70 74 69 6d 69 7a 65 72 20 69 73 20  he optimizer is 
37a30 61 62 6c 65 20 74 6f 20 64 65 6c 69 76 65 72 20  able to deliver 
37a40 72 6f 77 73 20 69 6e 20 67 72 6f 75 70 20 62 79  rows in group by
37a50 20 6f 72 64 65 72 20 73 6f 0a 20 20 20 20 20 20   order so.      
37a60 20 20 2a 2a 20 77 65 20 64 6f 20 6e 6f 74 20 68    ** we do not h
37a70 61 76 65 20 74 6f 20 73 6f 72 74 2e 20 20 54 68  ave to sort.  Th
37a80 65 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72  e OP_OpenEphemer
37a90 61 6c 20 74 61 62 6c 65 20 77 69 6c 6c 20 62 65  al table will be
37aa0 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 61 6e 63  .        ** canc
37ab0 65 6c 6c 65 64 20 6c 61 74 65 72 20 62 65 63 61  elled later beca
37ac0 75 73 65 20 77 65 20 73 74 69 6c 6c 20 6e 65 65  use we still nee
37ad0 64 20 74 6f 20 75 73 65 20 74 68 65 20 70 4b 65  d to use the pKe
37ae0 79 49 6e 66 6f 0a 20 20 20 20 20 20 20 20 2a 2f  yInfo.        */
37af0 0a 20 20 20 20 20 20 20 20 67 72 6f 75 70 42 79  .        groupBy
37b00 53 6f 72 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  Sort = 0;.      
37b10 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f  }else{.        /
37b20 2a 20 52 6f 77 73 20 61 72 65 20 63 6f 6d 69 6e  * Rows are comin
37b30 67 20 6f 75 74 20 69 6e 20 75 6e 64 65 74 65 72  g out in undeter
37b40 6d 69 6e 65 64 20 6f 72 64 65 72 2e 20 20 57 65  mined order.  We
37b50 20 68 61 76 65 20 74 6f 20 70 75 73 68 0a 20 20   have to push.  
37b60 20 20 20 20 20 20 2a 2a 20 65 61 63 68 20 72 6f        ** each ro
37b70 77 20 69 6e 74 6f 20 61 20 73 6f 72 74 69 6e 67  w into a sorting
37b80 20 69 6e 64 65 78 2c 20 74 65 72 6d 69 6e 61 74   index, terminat
37b90 65 20 74 68 65 20 66 69 72 73 74 20 6c 6f 6f 70  e the first loop
37ba0 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65  ,.        ** the
37bb0 6e 20 6c 6f 6f 70 20 6f 76 65 72 20 74 68 65 20  n loop over the 
37bc0 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 20 69 6e  sorting index in
37bd0 20 6f 72 64 65 72 20 74 6f 20 67 65 74 20 74 68   order to get th
37be0 65 20 6f 75 74 70 75 74 0a 20 20 20 20 20 20 20  e output.       
37bf0 20 2a 2a 20 69 6e 20 73 6f 72 74 65 64 20 6f 72   ** in sorted or
37c00 64 65 72 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  der.        */. 
37c10 20 20 20 20 20 20 20 69 6e 74 20 72 65 67 42 61         int regBa
37c20 73 65 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  se;.        int 
37c30 72 65 67 52 65 63 6f 72 64 3b 0a 20 20 20 20 20  regRecord;.     
37c40 20 20 20 69 6e 74 20 6e 43 6f 6c 3b 0a 20 20 20     int nCol;.   
37c50 20 20 20 20 20 69 6e 74 20 6e 47 72 6f 75 70 42       int nGroupB
37c60 79 3b 0a 0a 20 20 20 20 20 20 20 20 65 78 70 6c  y;..        expl
37c70 61 69 6e 54 65 6d 70 54 61 62 6c 65 28 70 50 61  ainTempTable(pPa
37c80 72 73 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20  rse, .          
37c90 20 20 28 73 44 69 73 74 69 6e 63 74 2e 69 73 54    (sDistinct.isT
37ca0 6e 63 74 20 26 26 20 28 70 2d 3e 73 65 6c 46 6c  nct && (p->selFl
37cb0 61 67 73 26 53 46 5f 44 69 73 74 69 6e 63 74 29  ags&SF_Distinct)
37cc0 3d 3d 30 29 20 3f 0a 20 20 20 20 20 20 20 20 20  ==0) ?.         
37cd0 20 20 20 20 20 20 20 20 20 20 20 22 44 49 53 54             "DIST
37ce0 49 4e 43 54 22 20 3a 20 22 47 52 4f 55 50 20 42  INCT" : "GROUP B
37cf0 59 22 29 3b 0a 0a 20 20 20 20 20 20 20 20 67 72  Y");..        gr
37d00 6f 75 70 42 79 53 6f 72 74 20 3d 20 31 3b 0a 20  oupBySort = 1;. 
37d10 20 20 20 20 20 20 20 6e 47 72 6f 75 70 42 79 20         nGroupBy 
37d20 3d 20 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70  = pGroupBy->nExp
37d30 72 3b 0a 20 20 20 20 20 20 20 20 6e 43 6f 6c 20  r;.        nCol 
37d40 3d 20 6e 47 72 6f 75 70 42 79 3b 0a 20 20 20 20  = nGroupBy;.    
37d50 20 20 20 20 6a 20 3d 20 6e 47 72 6f 75 70 42 79      j = nGroupBy
37d60 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d  ;.        for(i=
37d70 30 3b 20 69 3c 73 41 67 67 49 6e 66 6f 2e 6e 43  0; i<sAggInfo.nC
37d80 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20  olumn; i++){.   
37d90 20 20 20 20 20 20 20 69 66 28 20 73 41 67 67 49         if( sAggI
37da0 6e 66 6f 2e 61 43 6f 6c 5b 69 5d 2e 69 53 6f 72  nfo.aCol[i].iSor
37db0 74 65 72 43 6f 6c 75 6d 6e 3e 3d 6a 20 29 7b 0a  terColumn>=j ){.
37dc0 20 20 20 20 20 20 20 20 20 20 20 20 6e 43 6f 6c              nCol
37dd0 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ++;.            
37de0 6a 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  j++;.          }
37df0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
37e00 20 20 20 72 65 67 42 61 73 65 20 3d 20 73 71 6c     regBase = sql
37e10 69 74 65 33 47 65 74 54 65 6d 70 52 61 6e 67 65  ite3GetTempRange
37e20 28 70 50 61 72 73 65 2c 20 6e 43 6f 6c 29 3b 0a  (pParse, nCol);.
37e30 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
37e40 78 70 72 43 6f 64 65 45 78 70 72 4c 69 73 74 28  xprCodeExprList(
37e50 70 50 61 72 73 65 2c 20 70 47 72 6f 75 70 42 79  pParse, pGroupBy
37e60 2c 20 72 65 67 42 61 73 65 2c 20 30 2c 20 30 29  , regBase, 0, 0)
37e70 3b 0a 20 20 20 20 20 20 20 20 6a 20 3d 20 6e 47  ;.        j = nG
37e80 72 6f 75 70 42 79 3b 0a 20 20 20 20 20 20 20 20  roupBy;.        
37e90 66 6f 72 28 69 3d 30 3b 20 69 3c 73 41 67 67 49  for(i=0; i<sAggI
37ea0 6e 66 6f 2e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b  nfo.nColumn; i++
37eb0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 74 72  ){.          str
37ec0 75 63 74 20 41 67 67 49 6e 66 6f 5f 63 6f 6c 20  uct AggInfo_col 
37ed0 2a 70 43 6f 6c 20 3d 20 26 73 41 67 67 49 6e 66  *pCol = &sAggInf
37ee0 6f 2e 61 43 6f 6c 5b 69 5d 3b 0a 20 20 20 20 20  o.aCol[i];.     
37ef0 20 20 20 20 20 69 66 28 20 70 43 6f 6c 2d 3e 69       if( pCol->i
37f00 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 3e 3d 6a 20  SorterColumn>=j 
37f10 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ){.            i
37f20 6e 74 20 72 31 20 3d 20 6a 20 2b 20 72 65 67 42  nt r1 = j + regB
37f30 61 73 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ase;.           
37f40 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
37f50 47 65 74 43 6f 6c 75 6d 6e 4f 66 54 61 62 6c 65  GetColumnOfTable
37f60 28 76 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  (v,.            
37f70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37f80 20 20 20 70 43 6f 6c 2d 3e 70 54 61 62 2c 20 70     pCol->pTab, p
37f90 43 6f 6c 2d 3e 69 54 61 62 6c 65 2c 20 70 43 6f  Col->iTable, pCo
37fa0 6c 2d 3e 69 43 6f 6c 75 6d 6e 2c 20 72 31 29 3b  l->iColumn, r1);
37fb0 0a 20 20 20 20 20 20 20 20 20 20 20 20 6a 2b 2b  .            j++
37fc0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
37fd0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
37fe0 72 65 67 52 65 63 6f 72 64 20 3d 20 73 71 6c 69  regRecord = sqli
37ff0 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50  te3GetTempReg(pP
38000 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20 73  arse);.        s
38010 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
38020 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72  (v, OP_MakeRecor
38030 64 2c 20 72 65 67 42 61 73 65 2c 20 6e 43 6f 6c  d, regBase, nCol
38040 2c 20 72 65 67 52 65 63 6f 72 64 29 3b 0a 20 20  , regRecord);.  
38050 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
38060 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 6f  eAddOp2(v, OP_So
38070 72 74 65 72 49 6e 73 65 72 74 2c 20 73 41 67 67  rterInsert, sAgg
38080 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78 2c  Info.sortingIdx,
38090 20 72 65 67 52 65 63 6f 72 64 29 3b 0a 20 20 20   regRecord);.   
380a0 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65       sqlite3Rele
380b0 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
380c0 65 2c 20 72 65 67 52 65 63 6f 72 64 29 3b 0a 20  e, regRecord);. 
380d0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65         sqlite3Re
380e0 6c 65 61 73 65 54 65 6d 70 52 61 6e 67 65 28 70  leaseTempRange(p
380f0 50 61 72 73 65 2c 20 72 65 67 42 61 73 65 2c 20  Parse, regBase, 
38100 6e 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20 73  nCol);.        s
38110 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28 70  qlite3WhereEnd(p
38120 57 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20  WInfo);.        
38130 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67  sAggInfo.sorting
38140 49 64 78 50 54 61 62 20 3d 20 73 6f 72 74 50 54  IdxPTab = sortPT
38150 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61  ab = pParse->nTa
38160 62 2b 2b 3b 0a 20 20 20 20 20 20 20 20 73 6f 72  b++;.        sor
38170 74 4f 75 74 20 3d 20 73 71 6c 69 74 65 33 47 65  tOut = sqlite3Ge
38180 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29  tTempReg(pParse)
38190 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
381a0 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
381b0 50 5f 4f 70 65 6e 50 73 65 75 64 6f 2c 20 73 6f  P_OpenPseudo, so
381c0 72 74 50 54 61 62 2c 20 73 6f 72 74 4f 75 74 2c  rtPTab, sortOut,
381d0 20 6e 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20   nCol);.        
381e0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
381f0 32 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72 53 6f  2(v, OP_SorterSo
38200 72 74 2c 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72  rt, sAggInfo.sor
38210 74 69 6e 67 49 64 78 2c 20 61 64 64 72 45 6e 64  tingIdx, addrEnd
38220 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65 43  );.        VdbeC
38230 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 47 52 4f 55  omment((v, "GROU
38240 50 20 42 59 20 73 6f 72 74 22 29 29 3b 20 56 64  P BY sort")); Vd
38250 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
38260 20 20 20 20 20 20 20 73 41 67 67 49 6e 66 6f 2e         sAggInfo.
38270 75 73 65 53 6f 72 74 69 6e 67 49 64 78 20 3d 20  useSortingIdx = 
38280 31 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  1;.      }..    
38290 20 20 2f 2a 20 49 66 20 74 68 65 20 69 6e 64 65    /* If the inde
382a0 78 20 6f 72 20 74 65 6d 70 6f 72 61 72 79 20 74  x or temporary t
382b0 61 62 6c 65 20 75 73 65 64 20 62 79 20 74 68 65  able used by the
382c0 20 47 52 4f 55 50 20 42 59 20 73 6f 72 74 0a 20   GROUP BY sort. 
382d0 20 20 20 20 20 2a 2a 20 77 69 6c 6c 20 6e 61 74       ** will nat
382e0 75 72 61 6c 6c 79 20 64 65 6c 69 76 65 72 20 72  urally deliver r
382f0 6f 77 73 20 69 6e 20 74 68 65 20 6f 72 64 65 72  ows in the order
38300 20 72 65 71 75 69 72 65 64 20 62 79 20 74 68 65   required by the
38310 20 4f 52 44 45 52 20 42 59 0a 20 20 20 20 20 20   ORDER BY.      
38320 2a 2a 20 63 6c 61 75 73 65 2c 20 63 61 6e 63 65  ** clause, cance
38330 6c 20 74 68 65 20 65 70 68 65 6d 65 72 61 6c 20  l the ephemeral 
38340 74 61 62 6c 65 20 6f 70 65 6e 20 63 6f 64 65 64  table open coded
38350 20 65 61 72 6c 69 65 72 2e 0a 20 20 20 20 20 20   earlier..      
38360 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 54 68 69 73  **.      ** This
38370 20 69 73 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74   is an optimizat
38380 69 6f 6e 20 2d 20 74 68 65 20 63 6f 72 72 65 63  ion - the correc
38390 74 20 61 6e 73 77 65 72 20 73 68 6f 75 6c 64 20  t answer should 
383a0 72 65 73 75 6c 74 20 72 65 67 61 72 64 6c 65 73  result regardles
383b0 73 2e 0a 20 20 20 20 20 20 2a 2a 20 55 73 65 20  s..      ** Use 
383c0 74 68 65 20 53 51 4c 49 54 45 5f 47 72 6f 75 70  the SQLITE_Group
383d0 42 79 4f 72 64 65 72 20 66 6c 61 67 20 77 69 74  ByOrder flag wit
383e0 68 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52  h SQLITE_TESTCTR
383f0 4c 5f 4f 50 54 49 4d 49 5a 45 52 20 74 6f 20 0a  L_OPTIMIZER to .
38400 20 20 20 20 20 20 2a 2a 20 64 69 73 61 62 6c 65        ** disab