/ Hex Artifact Content
Login
SQLite training in Houston TX on 2019-11-05 (details)
Part of the 2019 Tcl Conference

Artifact 8a0fb4fd971c0364006f6a69b56aced36a773956483acfcc260e83b49e8c0da5:


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 43 61 6e 6e 6f 74 20 62 6f 74     /* Cannot bot
3f30: 68 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20 63  h ON and USING c
3f40: 6c 61 75 73 65 73 20 69 6e 20 74 68 65 20 73 61  lauses in the sa
3f50: 6d 65 20 6a 6f 69 6e 2e 20 20 54 68 65 20 70 61  me join.  The pa
3f60: 72 73 65 72 0a 20 20 20 20 2a 2a 20 64 6f 65 73  rser.    ** does
3f70: 20 6e 6f 74 20 61 6c 6c 6f 77 20 74 68 69 73 2e   not allow this.
3f80: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65  .    */.    asse
3f90: 72 74 28 20 70 52 69 67 68 74 2d 3e 70 4f 6e 3d  rt( pRight->pOn=
3fa0: 3d 30 20 7c 7c 20 70 52 69 67 68 74 2d 3e 70 55  =0 || pRight->pU
3fb0: 73 69 6e 67 3d 3d 30 20 29 3b 0a 0a 20 20 20 20  sing==0 );..    
3fc0: 2f 2a 20 41 64 64 20 74 68 65 20 4f 4e 20 63 6c  /* Add the ON cl
3fd0: 61 75 73 65 20 74 6f 20 74 68 65 20 65 6e 64 20  ause to the end 
3fe0: 6f 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  of the WHERE cla
3ff0: 75 73 65 2c 20 63 6f 6e 6e 65 63 74 65 64 20 62  use, connected b
4000: 79 0a 20 20 20 20 2a 2a 20 61 6e 20 41 4e 44 20  y.    ** an AND 
4010: 6f 70 65 72 61 74 6f 72 2e 0a 20 20 20 20 2a 2f  operator..    */
4020: 0a 20 20 20 20 69 66 28 20 70 52 69 67 68 74 2d  .    if( pRight-
4030: 3e 70 4f 6e 20 29 7b 0a 20 20 20 20 20 20 69 66  >pOn ){.      if
4040: 28 20 69 73 4f 75 74 65 72 20 29 20 73 65 74 4a  ( isOuter ) setJ
4050: 6f 69 6e 45 78 70 72 28 70 52 69 67 68 74 2d 3e  oinExpr(pRight->
4060: 70 4f 6e 2c 20 70 52 69 67 68 74 2d 3e 69 43 75  pOn, pRight->iCu
4070: 72 73 6f 72 29 3b 0a 20 20 20 20 20 20 70 2d 3e  rsor);.      p->
4080: 70 57 68 65 72 65 20 3d 20 73 71 6c 69 74 65 33  pWhere = sqlite3
4090: 45 78 70 72 41 6e 64 28 70 50 61 72 73 65 2d 3e  ExprAnd(pParse->
40a0: 64 62 2c 20 70 2d 3e 70 57 68 65 72 65 2c 20 70  db, p->pWhere, p
40b0: 52 69 67 68 74 2d 3e 70 4f 6e 29 3b 0a 20 20 20  Right->pOn);.   
40c0: 20 20 20 70 52 69 67 68 74 2d 3e 70 4f 6e 20 3d     pRight->pOn =
40d0: 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f   0;.    }..    /
40e0: 2a 20 43 72 65 61 74 65 20 65 78 74 72 61 20 74  * Create extra t
40f0: 65 72 6d 73 20 6f 6e 20 74 68 65 20 57 48 45 52  erms on the WHER
4100: 45 20 63 6c 61 75 73 65 20 66 6f 72 20 65 61 63  E clause for eac
4110: 68 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 64 0a 20  h column named. 
4120: 20 20 20 2a 2a 20 69 6e 20 74 68 65 20 55 53 49     ** in the USI
4130: 4e 47 20 63 6c 61 75 73 65 2e 20 20 45 78 61 6d  NG clause.  Exam
4140: 70 6c 65 3a 20 49 66 20 74 68 65 20 74 77 6f 20  ple: If the two 
4150: 74 61 62 6c 65 73 20 74 6f 20 62 65 20 6a 6f 69  tables to be joi
4160: 6e 65 64 20 61 72 65 20 0a 20 20 20 20 2a 2a 20  ned are .    ** 
4170: 41 20 61 6e 64 20 42 20 61 6e 64 20 74 68 65 20  A and B and the 
4180: 55 53 49 4e 47 20 63 6c 61 75 73 65 20 6e 61 6d  USING clause nam
4190: 65 73 20 58 2c 20 59 2c 20 61 6e 64 20 5a 2c 20  es X, Y, and Z, 
41a0: 74 68 65 6e 20 61 64 64 20 74 68 69 73 0a 20 20  then add this.  
41b0: 20 20 2a 2a 20 74 6f 20 74 68 65 20 57 48 45 52    ** to the WHER
41c0: 45 20 63 6c 61 75 73 65 3a 20 20 20 20 41 2e 58  E clause:    A.X
41d0: 3d 42 2e 58 20 41 4e 44 20 41 2e 59 3d 42 2e 59  =B.X AND A.Y=B.Y
41e0: 20 41 4e 44 20 41 2e 5a 3d 42 2e 5a 0a 20 20 20   AND A.Z=B.Z.   
41f0: 20 2a 2a 20 52 65 70 6f 72 74 20 61 6e 20 65 72   ** Report an er
4200: 72 6f 72 20 69 66 20 61 6e 79 20 63 6f 6c 75 6d  ror if any colum
4210: 6e 20 6d 65 6e 74 69 6f 6e 65 64 20 69 6e 20 74  n mentioned in t
4220: 68 65 20 55 53 49 4e 47 20 63 6c 61 75 73 65 20  he USING clause 
4230: 69 73 0a 20 20 20 20 2a 2a 20 6e 6f 74 20 63 6f  is.    ** not co
4240: 6e 74 61 69 6e 65 64 20 69 6e 20 62 6f 74 68 20  ntained in both 
4250: 74 61 62 6c 65 73 20 74 6f 20 62 65 20 6a 6f 69  tables to be joi
4260: 6e 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ned..    */.    
4270: 69 66 28 20 70 52 69 67 68 74 2d 3e 70 55 73 69  if( pRight->pUsi
4280: 6e 67 20 29 7b 0a 20 20 20 20 20 20 49 64 4c 69  ng ){.      IdLi
4290: 73 74 20 2a 70 4c 69 73 74 20 3d 20 70 52 69 67  st *pList = pRig
42a0: 68 74 2d 3e 70 55 73 69 6e 67 3b 0a 20 20 20 20  ht->pUsing;.    
42b0: 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 4c 69    for(j=0; j<pLi
42c0: 73 74 2d 3e 6e 49 64 3b 20 6a 2b 2b 29 7b 0a 20  st->nId; j++){. 
42d0: 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 61         char *zNa
42e0: 6d 65 3b 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20  me;     /* Name 
42f0: 6f 66 20 74 68 65 20 74 65 72 6d 20 69 6e 20 74  of the term in t
4300: 68 65 20 55 53 49 4e 47 20 63 6c 61 75 73 65 20  he USING clause 
4310: 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69  */.        int i
4320: 4c 65 66 74 3b 20 20 20 20 20 20 20 2f 2a 20 54  Left;       /* T
4330: 61 62 6c 65 20 6f 6e 20 74 68 65 20 6c 65 66 74  able on the left
4340: 20 77 69 74 68 20 6d 61 74 63 68 69 6e 67 20 63   with matching c
4350: 6f 6c 75 6d 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20  olumn name */.  
4360: 20 20 20 20 20 20 69 6e 74 20 69 4c 65 66 74 43        int iLeftC
4370: 6f 6c 3b 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e  ol;    /* Column
4380: 20 6e 75 6d 62 65 72 20 6f 66 20 6d 61 74 63 68   number of match
4390: 69 6e 67 20 63 6f 6c 75 6d 6e 20 6f 6e 20 74 68  ing column on th
43a0: 65 20 6c 65 66 74 20 2a 2f 0a 20 20 20 20 20 20  e left */.      
43b0: 20 20 69 6e 74 20 69 52 69 67 68 74 43 6f 6c 3b    int iRightCol;
43c0: 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 6e 75 6d     /* Column num
43d0: 62 65 72 20 6f 66 20 6d 61 74 63 68 69 6e 67 20  ber of matching 
43e0: 63 6f 6c 75 6d 6e 20 6f 6e 20 74 68 65 20 72 69  column on the ri
43f0: 67 68 74 20 2a 2f 0a 0a 20 20 20 20 20 20 20 20  ght */..        
4400: 7a 4e 61 6d 65 20 3d 20 70 4c 69 73 74 2d 3e 61  zName = pList->a
4410: 5b 6a 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20  [j].zName;.     
4420: 20 20 20 69 52 69 67 68 74 43 6f 6c 20 3d 20 63     iRightCol = c
4430: 6f 6c 75 6d 6e 49 6e 64 65 78 28 70 52 69 67 68  olumnIndex(pRigh
4440: 74 54 61 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20  tTab, zName);.  
4450: 20 20 20 20 20 20 69 66 28 20 69 52 69 67 68 74        if( iRight
4460: 43 6f 6c 3c 30 0a 20 20 20 20 20 20 20 20 20 7c  Col<0.         |
4470: 7c 20 21 74 61 62 6c 65 41 6e 64 43 6f 6c 75 6d  | !tableAndColum
4480: 6e 49 6e 64 65 78 28 70 53 72 63 2c 20 69 2b 31  nIndex(pSrc, i+1
4490: 2c 20 7a 4e 61 6d 65 2c 20 26 69 4c 65 66 74 2c  , zName, &iLeft,
44a0: 20 26 69 4c 65 66 74 43 6f 6c 29 0a 20 20 20 20   &iLeftCol).    
44b0: 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20      ){.         
44c0: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
44d0: 28 70 50 61 72 73 65 2c 20 22 63 61 6e 6e 6f 74  (pParse, "cannot
44e0: 20 6a 6f 69 6e 20 75 73 69 6e 67 20 63 6f 6c 75   join using colu
44f0: 6d 6e 20 25 73 20 2d 20 63 6f 6c 75 6d 6e 20 22  mn %s - column "
4500: 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 6e 6f  .            "no
4510: 74 20 70 72 65 73 65 6e 74 20 69 6e 20 62 6f 74  t present in bot
4520: 68 20 74 61 62 6c 65 73 22 2c 20 7a 4e 61 6d 65  h tables", zName
4530: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  );.          ret
4540: 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 20 20 7d  urn 1;.        }
4550: 0a 20 20 20 20 20 20 20 20 61 64 64 57 68 65 72  .        addWher
4560: 65 54 65 72 6d 28 70 50 61 72 73 65 2c 20 70 53  eTerm(pParse, pS
4570: 72 63 2c 20 69 4c 65 66 74 2c 20 69 4c 65 66 74  rc, iLeft, iLeft
4580: 43 6f 6c 2c 20 69 2b 31 2c 20 69 52 69 67 68 74  Col, i+1, iRight
4590: 43 6f 6c 2c 0a 20 20 20 20 20 20 20 20 20 20 20  Col,.           
45a0: 20 20 20 20 20 20 20 20 20 20 69 73 4f 75 74 65            isOute
45b0: 72 2c 20 26 70 2d 3e 70 57 68 65 72 65 29 3b 0a  r, &p->pWhere);.
45c0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
45d0: 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
45e0: 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74 61 6e  ./*.** An instan
45f0: 63 65 20 6f 66 20 74 68 69 73 20 6f 62 6a 65 63  ce of this objec
4600: 74 20 68 6f 6c 64 73 20 69 6e 66 6f 72 6d 61 74  t holds informat
4610: 69 6f 6e 20 28 62 65 79 6f 6e 64 20 70 50 61 72  ion (beyond pPar
4620: 73 65 20 61 6e 64 20 70 53 65 6c 65 63 74 29 0a  se and pSelect).
4630: 2a 2a 20 6e 65 65 64 65 64 20 74 6f 20 6c 6f 61  ** needed to loa
4640: 64 20 74 68 65 20 6e 65 78 74 20 72 65 73 75 6c  d the next resul
4650: 74 20 72 6f 77 20 74 68 61 74 20 69 73 20 74 6f  t row that is to
4660: 20 62 65 20 61 64 64 65 64 20 74 6f 20 74 68 65   be added to the
4670: 20 73 6f 72 74 65 72 2e 0a 2a 2f 0a 74 79 70 65   sorter..*/.type
4680: 64 65 66 20 73 74 72 75 63 74 20 52 6f 77 4c 6f  def struct RowLo
4690: 61 64 49 6e 66 6f 20 52 6f 77 4c 6f 61 64 49 6e  adInfo RowLoadIn
46a0: 66 6f 3b 0a 73 74 72 75 63 74 20 52 6f 77 4c 6f  fo;.struct RowLo
46b0: 61 64 49 6e 66 6f 20 7b 0a 20 20 69 6e 74 20 72  adInfo {.  int r
46c0: 65 67 52 65 73 75 6c 74 3b 20 20 20 20 20 20 20  egResult;       
46d0: 20 20 20 20 20 20 20 20 2f 2a 20 53 74 6f 72 65          /* Store
46e0: 20 72 65 73 75 6c 74 73 20 69 6e 20 61 72 72 61   results in arra
46f0: 79 20 6f 66 20 72 65 67 69 73 74 65 72 73 20 68  y of registers h
4700: 65 72 65 20 2a 2f 0a 20 20 75 38 20 65 63 65 6c  ere */.  u8 ecel
4710: 46 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20 20  Flags;          
4720: 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 20 61 72        /* Flag ar
4730: 67 75 6d 65 6e 74 20 74 6f 20 45 78 70 72 43 6f  gument to ExprCo
4740: 64 65 45 78 70 72 4c 69 73 74 28 29 20 2a 2f 0a  deExprList() */.
4750: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
4760: 41 42 4c 45 5f 53 4f 52 54 45 52 5f 52 45 46 45  ABLE_SORTER_REFE
4770: 52 45 4e 43 45 53 0a 20 20 45 78 70 72 4c 69 73  RENCES.  ExprLis
4780: 74 20 2a 70 45 78 74 72 61 3b 20 20 20 20 20 20  t *pExtra;      
4790: 20 20 20 20 20 20 2f 2a 20 45 78 74 72 61 20 63        /* Extra c
47a0: 6f 6c 75 6d 6e 73 20 6e 65 65 64 65 64 20 62 79  olumns needed by
47b0: 20 73 6f 72 74 65 72 20 72 65 66 73 20 2a 2f 0a   sorter refs */.
47c0: 20 20 69 6e 74 20 72 65 67 45 78 74 72 61 52 65    int regExtraRe
47d0: 73 75 6c 74 3b 20 20 20 20 20 20 20 20 20 20 2f  sult;          /
47e0: 2a 20 57 68 65 72 65 20 74 6f 20 6c 6f 61 64 20  * Where to load 
47f0: 74 68 65 20 65 78 74 72 61 20 63 6f 6c 75 6d 6e  the extra column
4800: 73 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a  s */.#endif.};..
4810: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
4820: 6e 65 20 64 6f 65 73 20 74 68 65 20 77 6f 72 6b  ne does the work
4830: 20 6f 66 20 6c 6f 61 64 69 6e 67 20 71 75 65 72   of loading quer
4840: 79 20 64 61 74 61 20 69 6e 74 6f 20 61 6e 20 61  y data into an a
4850: 72 72 61 79 20 6f 66 0a 2a 2a 20 72 65 67 69 73  rray of.** regis
4860: 74 65 72 73 20 73 6f 20 74 68 61 74 20 69 74 20  ters so that it 
4870: 63 61 6e 20 62 65 20 61 64 64 65 64 20 74 6f 20  can be added to 
4880: 74 68 65 20 73 6f 72 74 65 72 2e 0a 2a 2f 0a 73  the sorter..*/.s
4890: 74 61 74 69 63 20 76 6f 69 64 20 69 6e 6e 65 72  tatic void inner
48a0: 4c 6f 6f 70 4c 6f 61 64 52 6f 77 28 0a 20 20 50  LoopLoadRow(.  P
48b0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
48c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74 61            /* Sta
48d0: 74 65 6d 65 6e 74 20 75 6e 64 65 72 20 63 6f 6e  tement under con
48e0: 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 53  struction */.  S
48f0: 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 2c 20  elect *pSelect, 
4900: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
4910: 20 71 75 65 72 79 20 62 65 69 6e 67 20 63 6f 64   query being cod
4920: 65 64 20 2a 2f 0a 20 20 52 6f 77 4c 6f 61 64 49  ed */.  RowLoadI
4930: 6e 66 6f 20 2a 70 49 6e 66 6f 20 20 20 20 20 20  nfo *pInfo      
4940: 20 20 20 2f 2a 20 49 6e 66 6f 20 6e 65 65 64 65     /* Info neede
4950: 64 20 74 6f 20 63 6f 6d 70 6c 65 74 65 20 74 68  d to complete th
4960: 65 20 72 6f 77 20 6c 6f 61 64 20 2a 2f 0a 29 7b  e row load */.){
4970: 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  .  sqlite3ExprCo
4980: 64 65 45 78 70 72 4c 69 73 74 28 70 50 61 72 73  deExprList(pPars
4990: 65 2c 20 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69  e, pSelect->pELi
49a0: 73 74 2c 20 70 49 6e 66 6f 2d 3e 72 65 67 52 65  st, pInfo->regRe
49b0: 73 75 6c 74 2c 0a 20 20 20 20 20 20 20 20 20 20  sult,.          
49c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
49d0: 30 2c 20 70 49 6e 66 6f 2d 3e 65 63 65 6c 46 6c  0, pInfo->ecelFl
49e0: 61 67 73 29 3b 0a 23 69 66 64 65 66 20 53 51 4c  ags);.#ifdef SQL
49f0: 49 54 45 5f 45 4e 41 42 4c 45 5f 53 4f 52 54 45  ITE_ENABLE_SORTE
4a00: 52 5f 52 45 46 45 52 45 4e 43 45 53 0a 20 20 69  R_REFERENCES.  i
4a10: 66 28 20 70 49 6e 66 6f 2d 3e 70 45 78 74 72 61  f( pInfo->pExtra
4a20: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
4a30: 78 70 72 43 6f 64 65 45 78 70 72 4c 69 73 74 28  xprCodeExprList(
4a40: 70 50 61 72 73 65 2c 20 70 49 6e 66 6f 2d 3e 70  pParse, pInfo->p
4a50: 45 78 74 72 61 2c 20 70 49 6e 66 6f 2d 3e 72 65  Extra, pInfo->re
4a60: 67 45 78 74 72 61 52 65 73 75 6c 74 2c 20 30 2c  gExtraResult, 0,
4a70: 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
4a80: 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 70  ExprListDelete(p
4a90: 50 61 72 73 65 2d 3e 64 62 2c 20 70 49 6e 66 6f  Parse->db, pInfo
4aa0: 2d 3e 70 45 78 74 72 61 29 3b 0a 20 20 7d 0a 23  ->pExtra);.  }.#
4ab0: 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  endif.}../*.** C
4ac0: 6f 64 65 20 74 68 65 20 4f 50 5f 4d 61 6b 65 52  ode the OP_MakeR
4ad0: 65 63 6f 72 64 20 69 6e 73 74 72 75 63 74 69 6f  ecord instructio
4ae0: 6e 20 74 68 61 74 20 67 65 6e 65 72 61 74 65 73  n that generates
4af0: 20 74 68 65 20 65 6e 74 72 79 20 74 6f 20 62 65   the entry to be
4b00: 0a 2a 2a 20 61 64 64 65 64 20 69 6e 74 6f 20 74  .** added into t
4b10: 68 65 20 73 6f 72 74 65 72 2e 0a 2a 2a 0a 2a 2a  he sorter..**.**
4b20: 20 52 65 74 75 72 6e 20 74 68 65 20 72 65 67 69   Return the regi
4b30: 73 74 65 72 20 69 6e 20 77 68 69 63 68 20 74 68  ster in which th
4b40: 65 20 72 65 73 75 6c 74 20 69 73 20 73 74 6f 72  e result is stor
4b50: 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
4b60: 74 20 6d 61 6b 65 53 6f 72 74 65 72 52 65 63 6f  t makeSorterReco
4b70: 72 64 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  rd(.  Parse *pPa
4b80: 72 73 65 2c 0a 20 20 53 6f 72 74 43 74 78 20 2a  rse,.  SortCtx *
4b90: 70 53 6f 72 74 2c 0a 20 20 53 65 6c 65 63 74 20  pSort,.  Select 
4ba0: 2a 70 53 65 6c 65 63 74 2c 0a 20 20 69 6e 74 20  *pSelect,.  int 
4bb0: 72 65 67 42 61 73 65 2c 0a 20 20 69 6e 74 20 6e  regBase,.  int n
4bc0: 42 61 73 65 0a 29 7b 0a 20 20 69 6e 74 20 6e 4f  Base.){.  int nO
4bd0: 42 53 61 74 20 3d 20 70 53 6f 72 74 2d 3e 6e 4f  BSat = pSort->nO
4be0: 42 53 61 74 3b 0a 20 20 56 64 62 65 20 2a 76 20  BSat;.  Vdbe *v 
4bf0: 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
4c00: 0a 20 20 69 6e 74 20 72 65 67 4f 75 74 20 3d 20  .  int regOut = 
4c10: 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
4c20: 20 20 69 66 28 20 70 53 6f 72 74 2d 3e 70 44 65    if( pSort->pDe
4c30: 66 65 72 72 65 64 52 6f 77 4c 6f 61 64 20 29 7b  ferredRowLoad ){
4c40: 0a 20 20 20 20 69 6e 6e 65 72 4c 6f 6f 70 4c 6f  .    innerLoopLo
4c50: 61 64 52 6f 77 28 70 50 61 72 73 65 2c 20 70 53  adRow(pParse, pS
4c60: 65 6c 65 63 74 2c 20 70 53 6f 72 74 2d 3e 70 44  elect, pSort->pD
4c70: 65 66 65 72 72 65 64 52 6f 77 4c 6f 61 64 29 3b  eferredRowLoad);
4c80: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64  .  }.  sqlite3Vd
4c90: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d  beAddOp3(v, OP_M
4ca0: 61 6b 65 52 65 63 6f 72 64 2c 20 72 65 67 42 61  akeRecord, regBa
4cb0: 73 65 2b 6e 4f 42 53 61 74 2c 20 6e 42 61 73 65  se+nOBSat, nBase
4cc0: 2d 6e 4f 42 53 61 74 2c 20 72 65 67 4f 75 74 29  -nOBSat, regOut)
4cd0: 3b 0a 20 20 72 65 74 75 72 6e 20 72 65 67 4f 75  ;.  return regOu
4ce0: 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  t;.}../*.** Gene
4cf0: 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 77  rate code that w
4d00: 69 6c 6c 20 70 75 73 68 20 74 68 65 20 72 65 63  ill push the rec
4d10: 6f 72 64 20 69 6e 20 72 65 67 69 73 74 65 72 73  ord in registers
4d20: 20 72 65 67 44 61 74 61 0a 2a 2a 20 74 68 72 6f   regData.** thro
4d30: 75 67 68 20 72 65 67 44 61 74 61 2b 6e 44 61 74  ugh regData+nDat
4d40: 61 2d 31 20 6f 6e 74 6f 20 74 68 65 20 73 6f 72  a-1 onto the sor
4d50: 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ter..*/.static v
4d60: 6f 69 64 20 70 75 73 68 4f 6e 74 6f 53 6f 72 74  oid pushOntoSort
4d70: 65 72 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  er(.  Parse *pPa
4d80: 72 73 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  rse,         /* 
4d90: 50 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a  Parser context *
4da0: 2f 0a 20 20 53 6f 72 74 43 74 78 20 2a 70 53 6f  /.  SortCtx *pSo
4db0: 72 74 2c 20 20 20 20 20 20 20 20 2f 2a 20 49 6e  rt,        /* In
4dc0: 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20  formation about 
4dd0: 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
4de0: 75 73 65 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20  use */.  Select 
4df0: 2a 70 53 65 6c 65 63 74 2c 20 20 20 20 20 20 20  *pSelect,       
4e00: 2f 2a 20 54 68 65 20 77 68 6f 6c 65 20 53 45 4c  /* The whole SEL
4e10: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f  ECT statement */
4e20: 0a 20 20 69 6e 74 20 72 65 67 44 61 74 61 2c 20  .  int regData, 
4e30: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72            /* Fir
4e40: 73 74 20 72 65 67 69 73 74 65 72 20 68 6f 6c 64  st register hold
4e50: 69 6e 67 20 64 61 74 61 20 74 6f 20 62 65 20 73  ing data to be s
4e60: 6f 72 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20 72  orted */.  int r
4e70: 65 67 4f 72 69 67 44 61 74 61 2c 20 20 20 20 20  egOrigData,     
4e80: 20 20 2f 2a 20 46 69 72 73 74 20 72 65 67 69 73    /* First regis
4e90: 74 65 72 20 68 6f 6c 64 69 6e 67 20 64 61 74 61  ter holding data
4ea0: 20 62 65 66 6f 72 65 20 70 61 63 6b 69 6e 67 20   before packing 
4eb0: 2a 2f 0a 20 20 69 6e 74 20 6e 44 61 74 61 2c 20  */.  int nData, 
4ec0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
4ed0: 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74  umber of element
4ee0: 73 20 69 6e 20 74 68 65 20 72 65 67 44 61 74 61  s in the regData
4ef0: 20 64 61 74 61 20 61 72 72 61 79 20 2a 2f 0a 20   data array */. 
4f00: 20 69 6e 74 20 6e 50 72 65 66 69 78 52 65 67 20   int nPrefixReg 
4f10: 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 2e 20 6f          /* No. o
4f20: 66 20 72 65 67 20 70 72 69 6f 72 20 74 6f 20 72  f reg prior to r
4f30: 65 67 44 61 74 61 20 61 76 61 69 6c 61 62 6c 65  egData available
4f40: 20 66 6f 72 20 75 73 65 20 2a 2f 0a 29 7b 0a 20   for use */.){. 
4f50: 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
4f60: 65 2d 3e 70 56 64 62 65 3b 20 20 20 20 20 20 20  e->pVdbe;       
4f70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4f80: 20 20 2f 2a 20 53 74 6d 74 20 75 6e 64 65 72 20    /* Stmt under 
4f90: 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a  construction */.
4fa0: 20 20 69 6e 74 20 62 53 65 71 20 3d 20 28 28 70    int bSeq = ((p
4fb0: 53 6f 72 74 2d 3e 73 6f 72 74 46 6c 61 67 73 20  Sort->sortFlags 
4fc0: 26 20 53 4f 52 54 46 4c 41 47 5f 55 73 65 53 6f  & SORTFLAG_UseSo
4fd0: 72 74 65 72 29 3d 3d 30 29 3b 0a 20 20 69 6e 74  rter)==0);.  int
4fe0: 20 6e 45 78 70 72 20 3d 20 70 53 6f 72 74 2d 3e   nExpr = pSort->
4ff0: 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b  pOrderBy->nExpr;
5000: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
5010: 20 4e 6f 2e 20 6f 66 20 4f 52 44 45 52 20 42 59   No. of ORDER BY
5020: 20 74 65 72 6d 73 20 2a 2f 0a 20 20 69 6e 74 20   terms */.  int 
5030: 6e 42 61 73 65 20 3d 20 6e 45 78 70 72 20 2b 20  nBase = nExpr + 
5040: 62 53 65 71 20 2b 20 6e 44 61 74 61 3b 20 20 20  bSeq + nData;   
5050: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
5060: 46 69 65 6c 64 73 20 69 6e 20 73 6f 72 74 65 72  Fields in sorter
5070: 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 69 6e 74   record */.  int
5080: 20 72 65 67 42 61 73 65 3b 20 20 20 20 20 20 20   regBase;       
5090: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
50a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
50b0: 20 52 65 67 73 20 66 6f 72 20 73 6f 72 74 65 72   Regs for sorter
50c0: 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 69 6e 74   record */.  int
50d0: 20 72 65 67 52 65 63 6f 72 64 20 3d 20 30 3b 20   regRecord = 0; 
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 20 20 20 20 20 20 20 2f 2a                /*
5100: 20 41 73 73 65 6d 62 6c 65 64 20 73 6f 72 74 65   Assembled sorte
5110: 72 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 69 6e  r record */.  in
5120: 74 20 6e 4f 42 53 61 74 20 3d 20 70 53 6f 72 74  t nOBSat = pSort
5130: 2d 3e 6e 4f 42 53 61 74 3b 20 20 20 20 20 20 20  ->nOBSat;       
5140: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
5150: 2a 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d 73  * ORDER BY terms
5160: 20 74 6f 20 73 6b 69 70 20 2a 2f 0a 20 20 69 6e   to skip */.  in
5170: 74 20 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20  t op;           
5180: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5190: 20 2f 2a 20 4f 70 63 6f 64 65 20 74 6f 20 61 64   /* Opcode to ad
51a0: 64 20 73 6f 72 74 65 72 20 72 65 63 6f 72 64 20  d sorter record 
51b0: 74 6f 20 73 6f 72 74 65 72 20 2a 2f 0a 20 20 69  to sorter */.  i
51c0: 6e 74 20 69 4c 69 6d 69 74 3b 20 20 20 20 20 20  nt iLimit;      
51d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
51e0: 20 20 2f 2a 20 4c 49 4d 49 54 20 63 6f 75 6e 74    /* LIMIT count
51f0: 65 72 20 2a 2f 0a 20 20 69 6e 74 20 69 53 6b 69  er */.  int iSki
5200: 70 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  p = 0;          
5210: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 6e             /* En
5220: 64 20 6f 66 20 74 68 65 20 73 6f 72 74 65 72 20  d of the sorter 
5230: 69 6e 73 65 72 74 20 6c 6f 6f 70 20 2a 2f 0a 0a  insert loop */..
5240: 20 20 61 73 73 65 72 74 28 20 62 53 65 71 3d 3d    assert( bSeq==
5250: 30 20 7c 7c 20 62 53 65 71 3d 3d 31 20 29 3b 0a  0 || bSeq==1 );.
5260: 0a 20 20 2f 2a 20 54 68 72 65 65 20 63 61 73 65  .  /* Three case
5270: 73 3a 0a 20 20 2a 2a 20 20 20 28 31 29 20 54 68  s:.  **   (1) Th
5280: 65 20 64 61 74 61 20 74 6f 20 62 65 20 73 6f 72  e data to be sor
5290: 74 65 64 20 68 61 73 20 61 6c 72 65 61 64 79 20  ted has already 
52a0: 62 65 65 6e 20 70 61 63 6b 65 64 20 69 6e 74 6f  been packed into
52b0: 20 61 20 52 65 63 6f 72 64 0a 20 20 2a 2a 20 20   a Record.  **  
52c0: 20 20 20 20 20 62 79 20 61 20 70 72 69 6f 72 20       by a prior 
52d0: 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2e 20 20  OP_MakeRecord.  
52e0: 49 6e 20 74 68 69 73 20 63 61 73 65 20 6e 44 61  In this case nDa
52f0: 74 61 3d 3d 31 20 61 6e 64 20 72 65 67 44 61 74  ta==1 and regDat
5300: 61 0a 20 20 2a 2a 20 20 20 20 20 20 20 77 69 6c  a.  **       wil
5310: 6c 20 62 65 20 63 6f 6d 70 6c 65 74 65 6c 79 20  l be completely 
5320: 75 6e 72 65 6c 61 74 65 64 20 74 6f 20 72 65 67  unrelated to reg
5330: 4f 72 69 67 44 61 74 61 2e 0a 20 20 2a 2a 20 20  OrigData..  **  
5340: 20 28 32 29 20 41 6c 6c 20 6f 75 74 70 75 74 20   (2) All output 
5350: 63 6f 6c 75 6d 6e 73 20 61 72 65 20 69 6e 63 6c  columns are incl
5360: 75 64 65 64 20 69 6e 20 74 68 65 20 73 6f 72 74  uded in the sort
5370: 20 72 65 63 6f 72 64 2e 20 20 49 6e 20 74 68 61   record.  In tha
5380: 74 0a 20 20 2a 2a 20 20 20 20 20 20 20 63 61 73  t.  **       cas
5390: 65 20 72 65 67 44 61 74 61 3d 3d 72 65 67 4f 72  e regData==regOr
53a0: 69 67 44 61 74 61 2e 0a 20 20 2a 2a 20 20 20 28  igData..  **   (
53b0: 33 29 20 53 6f 6d 65 20 6f 75 74 70 75 74 20 63  3) Some output c
53c0: 6f 6c 75 6d 6e 73 20 61 72 65 20 6f 6d 69 74 74  olumns are omitt
53d0: 65 64 20 66 72 6f 6d 20 74 68 65 20 73 6f 72 74  ed from the sort
53e0: 20 72 65 63 6f 72 64 20 64 75 65 20 74 6f 0a 20   record due to. 
53f0: 20 2a 2a 20 20 20 20 20 20 20 74 68 65 20 53 51   **       the SQ
5400: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 4f 52 54  LITE_ENABLE_SORT
5410: 45 52 5f 52 45 46 45 52 45 4e 43 45 20 6f 70 74  ER_REFERENCE opt
5420: 69 6d 69 7a 61 74 69 6f 6e 2c 20 6f 72 20 64 75  imization, or du
5430: 65 20 74 6f 20 74 68 65 0a 20 20 2a 2a 20 20 20  e to the.  **   
5440: 20 20 20 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f      SQLITE_ECEL_
5450: 4f 4d 49 54 52 45 46 20 6f 70 74 69 6d 69 7a 61  OMITREF optimiza
5460: 74 69 6f 6e 2c 20 6f 72 20 64 75 65 20 74 6f 20  tion, or due to 
5470: 74 68 65 20 0a 20 20 2a 2a 20 20 20 20 20 20 20  the .  **       
5480: 53 6f 72 74 43 74 78 2e 70 44 65 66 65 72 72 65  SortCtx.pDeferre
5490: 64 52 6f 77 4c 6f 61 64 20 6f 70 74 69 6d 69 61  dRowLoad optimia
54a0: 74 69 6f 6e 2e 20 20 49 6e 20 61 6e 79 20 6f 66  tion.  In any of
54b0: 20 74 68 65 73 65 20 63 61 73 65 73 0a 20 20 2a   these cases.  *
54c0: 2a 20 20 20 20 20 20 20 72 65 67 4f 72 69 67 44  *       regOrigD
54d0: 61 74 61 20 69 73 20 30 20 74 6f 20 70 72 65 76  ata is 0 to prev
54e0: 65 6e 74 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ent this routine
54f0: 20 66 72 6f 6d 20 74 72 79 69 6e 67 20 74 6f 20   from trying to 
5500: 63 6f 70 79 0a 20 20 2a 2a 20 20 20 20 20 20 20  copy.  **       
5510: 76 61 6c 75 65 73 20 74 68 61 74 20 6d 69 67 68  values that migh
5520: 74 20 6e 6f 74 20 79 65 74 20 65 78 69 73 74 2e  t not yet exist.
5530: 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
5540: 6e 44 61 74 61 3d 3d 31 20 7c 7c 20 72 65 67 44  nData==1 || regD
5550: 61 74 61 3d 3d 72 65 67 4f 72 69 67 44 61 74 61  ata==regOrigData
5560: 20 7c 7c 20 72 65 67 4f 72 69 67 44 61 74 61 3d   || regOrigData=
5570: 3d 30 20 29 3b 0a 0a 20 20 69 66 28 20 6e 50 72  =0 );..  if( nPr
5580: 65 66 69 78 52 65 67 20 29 7b 0a 20 20 20 20 61  efixReg ){.    a
5590: 73 73 65 72 74 28 20 6e 50 72 65 66 69 78 52 65  ssert( nPrefixRe
55a0: 67 3d 3d 6e 45 78 70 72 2b 62 53 65 71 20 29 3b  g==nExpr+bSeq );
55b0: 0a 20 20 20 20 72 65 67 42 61 73 65 20 3d 20 72  .    regBase = r
55c0: 65 67 44 61 74 61 20 2d 20 6e 50 72 65 66 69 78  egData - nPrefix
55d0: 52 65 67 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  Reg;.  }else{.  
55e0: 20 20 72 65 67 42 61 73 65 20 3d 20 70 50 61 72    regBase = pPar
55f0: 73 65 2d 3e 6e 4d 65 6d 20 2b 20 31 3b 0a 20 20  se->nMem + 1;.  
5600: 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b    pParse->nMem +
5610: 3d 20 6e 42 61 73 65 3b 0a 20 20 7d 0a 20 20 61  = nBase;.  }.  a
5620: 73 73 65 72 74 28 20 70 53 65 6c 65 63 74 2d 3e  ssert( pSelect->
5630: 69 4f 66 66 73 65 74 3d 3d 30 20 7c 7c 20 70 53  iOffset==0 || pS
5640: 65 6c 65 63 74 2d 3e 69 4c 69 6d 69 74 21 3d 30  elect->iLimit!=0
5650: 20 29 3b 0a 20 20 69 4c 69 6d 69 74 20 3d 20 70   );.  iLimit = p
5660: 53 65 6c 65 63 74 2d 3e 69 4f 66 66 73 65 74 20  Select->iOffset 
5670: 3f 20 70 53 65 6c 65 63 74 2d 3e 69 4f 66 66 73  ? pSelect->iOffs
5680: 65 74 2b 31 20 3a 20 70 53 65 6c 65 63 74 2d 3e  et+1 : pSelect->
5690: 69 4c 69 6d 69 74 3b 0a 20 20 70 53 6f 72 74 2d  iLimit;.  pSort-
56a0: 3e 6c 61 62 65 6c 44 6f 6e 65 20 3d 20 73 71 6c  >labelDone = sql
56b0: 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
56c0: 6c 28 76 29 3b 0a 20 20 73 71 6c 69 74 65 33 45  l(v);.  sqlite3E
56d0: 78 70 72 43 6f 64 65 45 78 70 72 4c 69 73 74 28  xprCodeExprList(
56e0: 70 50 61 72 73 65 2c 20 70 53 6f 72 74 2d 3e 70  pParse, pSort->p
56f0: 4f 72 64 65 72 42 79 2c 20 72 65 67 42 61 73 65  OrderBy, regBase
5700: 2c 20 72 65 67 4f 72 69 67 44 61 74 61 2c 0a 20  , regOrigData,. 
5710: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5720: 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
5730: 45 43 45 4c 5f 44 55 50 20 7c 20 28 72 65 67 4f  ECEL_DUP | (regO
5740: 72 69 67 44 61 74 61 3f 20 53 51 4c 49 54 45 5f  rigData? SQLITE_
5750: 45 43 45 4c 5f 52 45 46 20 3a 20 30 29 29 3b 0a  ECEL_REF : 0));.
5760: 20 20 69 66 28 20 62 53 65 71 20 29 7b 0a 20 20    if( bSeq ){.  
5770: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
5780: 4f 70 32 28 76 2c 20 4f 50 5f 53 65 71 75 65 6e  Op2(v, OP_Sequen
5790: 63 65 2c 20 70 53 6f 72 74 2d 3e 69 45 43 75 72  ce, pSort->iECur
57a0: 73 6f 72 2c 20 72 65 67 42 61 73 65 2b 6e 45 78  sor, regBase+nEx
57b0: 70 72 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e  pr);.  }.  if( n
57c0: 50 72 65 66 69 78 52 65 67 3d 3d 30 20 26 26 20  PrefixReg==0 && 
57d0: 6e 44 61 74 61 3e 30 20 29 7b 0a 20 20 20 20 73  nData>0 ){.    s
57e0: 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 4d 6f  qlite3ExprCodeMo
57f0: 76 65 28 70 50 61 72 73 65 2c 20 72 65 67 44 61  ve(pParse, regDa
5800: 74 61 2c 20 72 65 67 42 61 73 65 2b 6e 45 78 70  ta, regBase+nExp
5810: 72 2b 62 53 65 71 2c 20 6e 44 61 74 61 29 3b 0a  r+bSeq, nData);.
5820: 20 20 7d 0a 20 20 69 66 28 20 6e 4f 42 53 61 74    }.  if( nOBSat
5830: 3e 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 65  >0 ){.    int re
5840: 67 50 72 65 76 4b 65 79 3b 20 20 20 2f 2a 20 54  gPrevKey;   /* T
5850: 68 65 20 66 69 72 73 74 20 6e 4f 42 53 61 74 20  he first nOBSat 
5860: 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20 70  columns of the p
5870: 72 65 76 69 6f 75 73 20 72 6f 77 20 2a 2f 0a 20  revious row */. 
5880: 20 20 20 69 6e 74 20 61 64 64 72 46 69 72 73 74     int addrFirst
5890: 3b 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20  ;    /* Address 
58a0: 6f 66 20 74 68 65 20 4f 50 5f 49 66 4e 6f 74 20  of the OP_IfNot 
58b0: 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 20 20 69 6e  opcode */.    in
58c0: 74 20 61 64 64 72 4a 6d 70 3b 20 20 20 20 20 20  t addrJmp;      
58d0: 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 68  /* Address of th
58e0: 65 20 4f 50 5f 4a 75 6d 70 20 6f 70 63 6f 64 65  e OP_Jump opcode
58f0: 20 2a 2f 0a 20 20 20 20 56 64 62 65 4f 70 20 2a   */.    VdbeOp *
5900: 70 4f 70 3b 20 20 20 20 20 20 2f 2a 20 4f 70 63  pOp;      /* Opc
5910: 6f 64 65 20 74 68 61 74 20 6f 70 65 6e 73 20 74  ode that opens t
5920: 68 65 20 73 6f 72 74 65 72 20 2a 2f 0a 20 20 20  he sorter */.   
5930: 20 69 6e 74 20 6e 4b 65 79 3b 20 20 20 20 20 20   int nKey;      
5940: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
5950: 73 6f 72 74 69 6e 67 20 6b 65 79 20 63 6f 6c 75  sorting key colu
5960: 6d 6e 73 2c 20 69 6e 63 6c 75 64 69 6e 67 20 4f  mns, including O
5970: 50 5f 53 65 71 75 65 6e 63 65 20 2a 2f 0a 20 20  P_Sequence */.  
5980: 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 49 3b 20    KeyInfo *pKI; 
5990: 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20      /* Original 
59a0: 4b 65 79 49 6e 66 6f 20 6f 6e 20 74 68 65 20 73  KeyInfo on the s
59b0: 6f 72 74 65 72 20 74 61 62 6c 65 20 2a 2f 0a 0a  orter table */..
59c0: 20 20 20 20 72 65 67 52 65 63 6f 72 64 20 3d 20      regRecord = 
59d0: 6d 61 6b 65 53 6f 72 74 65 72 52 65 63 6f 72 64  makeSorterRecord
59e0: 28 70 50 61 72 73 65 2c 20 70 53 6f 72 74 2c 20  (pParse, pSort, 
59f0: 70 53 65 6c 65 63 74 2c 20 72 65 67 42 61 73 65  pSelect, regBase
5a00: 2c 20 6e 42 61 73 65 29 3b 0a 20 20 20 20 72 65  , nBase);.    re
5a10: 67 50 72 65 76 4b 65 79 20 3d 20 70 50 61 72 73  gPrevKey = pPars
5a20: 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20 70  e->nMem+1;.    p
5a30: 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 70  Parse->nMem += p
5a40: 53 6f 72 74 2d 3e 6e 4f 42 53 61 74 3b 0a 20 20  Sort->nOBSat;.  
5a50: 20 20 6e 4b 65 79 20 3d 20 6e 45 78 70 72 20 2d    nKey = nExpr -
5a60: 20 70 53 6f 72 74 2d 3e 6e 4f 42 53 61 74 20 2b   pSort->nOBSat +
5a70: 20 62 53 65 71 3b 0a 20 20 20 20 69 66 28 20 62   bSeq;.    if( b
5a80: 53 65 71 20 29 7b 0a 20 20 20 20 20 20 61 64 64  Seq ){.      add
5a90: 72 46 69 72 73 74 20 3d 20 73 71 6c 69 74 65 33  rFirst = sqlite3
5aa0: 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
5ab0: 5f 49 66 4e 6f 74 2c 20 72 65 67 42 61 73 65 2b  _IfNot, regBase+
5ac0: 6e 45 78 70 72 29 3b 20 0a 20 20 20 20 7d 65 6c  nExpr); .    }el
5ad0: 73 65 7b 0a 20 20 20 20 20 20 61 64 64 72 46 69  se{.      addrFi
5ae0: 72 73 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62  rst = sqlite3Vdb
5af0: 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 53 65  eAddOp1(v, OP_Se
5b00: 71 75 65 6e 63 65 54 65 73 74 2c 20 70 53 6f 72  quenceTest, pSor
5b10: 74 2d 3e 69 45 43 75 72 73 6f 72 29 3b 0a 20 20  t->iECursor);.  
5b20: 20 20 7d 0a 20 20 20 20 56 64 62 65 43 6f 76 65    }.    VdbeCove
5b30: 72 61 67 65 28 76 29 3b 0a 20 20 20 20 73 71 6c  rage(v);.    sql
5b40: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
5b50: 2c 20 4f 50 5f 43 6f 6d 70 61 72 65 2c 20 72 65  , OP_Compare, re
5b60: 67 50 72 65 76 4b 65 79 2c 20 72 65 67 42 61 73  gPrevKey, regBas
5b70: 65 2c 20 70 53 6f 72 74 2d 3e 6e 4f 42 53 61 74  e, pSort->nOBSat
5b80: 29 3b 0a 20 20 20 20 70 4f 70 20 3d 20 73 71 6c  );.    pOp = sql
5b90: 69 74 65 33 56 64 62 65 47 65 74 4f 70 28 76 2c  ite3VdbeGetOp(v,
5ba0: 20 70 53 6f 72 74 2d 3e 61 64 64 72 53 6f 72 74   pSort->addrSort
5bb0: 49 6e 64 65 78 29 3b 0a 20 20 20 20 69 66 28 20  Index);.    if( 
5bc0: 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c  pParse->db->mall
5bd0: 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74 75 72  ocFailed ) retur
5be0: 6e 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 32 20 3d  n;.    pOp->p2 =
5bf0: 20 6e 4b 65 79 20 2b 20 6e 44 61 74 61 3b 0a 20   nKey + nData;. 
5c00: 20 20 20 70 4b 49 20 3d 20 70 4f 70 2d 3e 70 34     pKI = pOp->p4
5c10: 2e 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 20 20 6d  .pKeyInfo;.    m
5c20: 65 6d 73 65 74 28 70 4b 49 2d 3e 61 53 6f 72 74  emset(pKI->aSort
5c30: 4f 72 64 65 72 2c 20 30 2c 20 70 4b 49 2d 3e 6e  Order, 0, pKI->n
5c40: 4b 65 79 46 69 65 6c 64 29 3b 20 2f 2a 20 4d 61  KeyField); /* Ma
5c50: 6b 65 73 20 4f 50 5f 4a 75 6d 70 20 74 65 73 74  kes OP_Jump test
5c60: 61 62 6c 65 20 2a 2f 0a 20 20 20 20 73 71 6c 69  able */.    sqli
5c70: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 34 28  te3VdbeChangeP4(
5c80: 76 2c 20 2d 31 2c 20 28 63 68 61 72 2a 29 70 4b  v, -1, (char*)pK
5c90: 49 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a  I, P4_KEYINFO);.
5ca0: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 4b      testcase( pK
5cb0: 49 2d 3e 6e 41 6c 6c 46 69 65 6c 64 20 3e 20 70  I->nAllField > p
5cc0: 4b 49 2d 3e 6e 4b 65 79 46 69 65 6c 64 2b 32 20  KI->nKeyField+2 
5cd0: 29 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 2e 70  );.    pOp->p4.p
5ce0: 4b 65 79 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65  KeyInfo = sqlite
5cf0: 33 4b 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72  3KeyInfoFromExpr
5d00: 4c 69 73 74 28 70 50 61 72 73 65 2c 70 53 6f 72  List(pParse,pSor
5d10: 74 2d 3e 70 4f 72 64 65 72 42 79 2c 6e 4f 42 53  t->pOrderBy,nOBS
5d20: 61 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  at,.            
5d30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5d40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
5d50: 4b 49 2d 3e 6e 41 6c 6c 46 69 65 6c 64 2d 70 4b  KI->nAllField-pK
5d60: 49 2d 3e 6e 4b 65 79 46 69 65 6c 64 2d 31 29 3b  I->nKeyField-1);
5d70: 0a 20 20 20 20 61 64 64 72 4a 6d 70 20 3d 20 73  .    addrJmp = s
5d80: 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
5d90: 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20 73 71  tAddr(v);.    sq
5da0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
5db0: 76 2c 20 4f 50 5f 4a 75 6d 70 2c 20 61 64 64 72  v, OP_Jump, addr
5dc0: 4a 6d 70 2b 31 2c 20 30 2c 20 61 64 64 72 4a 6d  Jmp+1, 0, addrJm
5dd0: 70 2b 31 29 3b 20 56 64 62 65 43 6f 76 65 72 61  p+1); VdbeCovera
5de0: 67 65 28 76 29 3b 0a 20 20 20 20 70 53 6f 72 74  ge(v);.    pSort
5df0: 2d 3e 6c 61 62 65 6c 42 6b 4f 75 74 20 3d 20 73  ->labelBkOut = s
5e00: 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
5e10: 62 65 6c 28 76 29 3b 0a 20 20 20 20 70 53 6f 72  bel(v);.    pSor
5e20: 74 2d 3e 72 65 67 52 65 74 75 72 6e 20 3d 20 2b  t->regReturn = +
5e30: 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
5e40: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
5e50: 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62  dOp2(v, OP_Gosub
5e60: 2c 20 70 53 6f 72 74 2d 3e 72 65 67 52 65 74 75  , pSort->regRetu
5e70: 72 6e 2c 20 70 53 6f 72 74 2d 3e 6c 61 62 65 6c  rn, pSort->label
5e80: 42 6b 4f 75 74 29 3b 0a 20 20 20 20 73 71 6c 69  BkOut);.    sqli
5e90: 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
5ea0: 20 4f 50 5f 52 65 73 65 74 53 6f 72 74 65 72 2c   OP_ResetSorter,
5eb0: 20 70 53 6f 72 74 2d 3e 69 45 43 75 72 73 6f 72   pSort->iECursor
5ec0: 29 3b 0a 20 20 20 20 69 66 28 20 69 4c 69 6d 69  );.    if( iLimi
5ed0: 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  t ){.      sqlit
5ee0: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
5ef0: 4f 50 5f 49 66 4e 6f 74 2c 20 69 4c 69 6d 69 74  OP_IfNot, iLimit
5f00: 2c 20 70 53 6f 72 74 2d 3e 6c 61 62 65 6c 44 6f  , pSort->labelDo
5f10: 6e 65 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  ne);.      VdbeC
5f20: 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
5f30: 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  }.    sqlite3Vdb
5f40: 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64  eJumpHere(v, add
5f50: 72 46 69 72 73 74 29 3b 0a 20 20 20 20 73 71 6c  rFirst);.    sql
5f60: 69 74 65 33 45 78 70 72 43 6f 64 65 4d 6f 76 65  ite3ExprCodeMove
5f70: 28 70 50 61 72 73 65 2c 20 72 65 67 42 61 73 65  (pParse, regBase
5f80: 2c 20 72 65 67 50 72 65 76 4b 65 79 2c 20 70 53  , regPrevKey, pS
5f90: 6f 72 74 2d 3e 6e 4f 42 53 61 74 29 3b 0a 20 20  ort->nOBSat);.  
5fa0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
5fb0: 70 48 65 72 65 28 76 2c 20 61 64 64 72 4a 6d 70  pHere(v, addrJmp
5fc0: 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 4c 69  );.  }.  if( iLi
5fd0: 6d 69 74 20 29 7b 0a 20 20 20 20 2f 2a 20 41 74  mit ){.    /* At
5fe0: 20 74 68 69 73 20 70 6f 69 6e 74 20 74 68 65 20   this point the 
5ff0: 76 61 6c 75 65 73 20 66 6f 72 20 74 68 65 20 6e  values for the n
6000: 65 77 20 73 6f 72 74 65 72 20 65 6e 74 72 79 20  ew sorter entry 
6010: 61 72 65 20 73 74 6f 72 65 64 0a 20 20 20 20 2a  are stored.    *
6020: 2a 20 69 6e 20 61 6e 20 61 72 72 61 79 20 6f 66  * in an array of
6030: 20 72 65 67 69 73 74 65 72 73 2e 20 54 68 65 79   registers. They
6040: 20 6e 65 65 64 20 74 6f 20 62 65 20 63 6f 6d 70   need to be comp
6050: 6f 73 65 64 20 69 6e 74 6f 20 61 20 72 65 63 6f  osed into a reco
6060: 72 64 0a 20 20 20 20 2a 2a 20 61 6e 64 20 69 6e  rd.    ** and in
6070: 73 65 72 74 65 64 20 69 6e 74 6f 20 74 68 65 20  serted into the 
6080: 73 6f 72 74 65 72 20 69 66 20 65 69 74 68 65 72  sorter if either
6090: 20 28 61 29 20 74 68 65 72 65 20 61 72 65 20 63   (a) there are c
60a0: 75 72 72 65 6e 74 6c 79 0a 20 20 20 20 2a 2a 20  urrently.    ** 
60b0: 6c 65 73 73 20 74 68 61 6e 20 4c 49 4d 49 54 2b  less than LIMIT+
60c0: 4f 46 46 53 45 54 20 69 74 65 6d 73 20 6f 72 20  OFFSET items or 
60d0: 28 62 29 20 74 68 65 20 6e 65 77 20 72 65 63 6f  (b) the new reco
60e0: 72 64 20 69 73 20 73 6d 61 6c 6c 65 72 20 74 68  rd is smaller th
60f0: 61 6e 20 0a 20 20 20 20 2a 2a 20 74 68 65 20 6c  an .    ** the l
6100: 61 72 67 65 73 74 20 72 65 63 6f 72 64 20 63 75  argest record cu
6110: 72 72 65 6e 74 6c 79 20 69 6e 20 74 68 65 20 73  rrently in the s
6120: 6f 72 74 65 72 2e 20 49 66 20 28 62 29 20 69 73  orter. If (b) is
6130: 20 74 72 75 65 20 61 6e 64 20 74 68 65 72 65 0a   true and there.
6140: 20 20 20 20 2a 2a 20 61 72 65 20 61 6c 72 65 61      ** are alrea
6150: 64 79 20 4c 49 4d 49 54 2b 4f 46 46 53 45 54 20  dy LIMIT+OFFSET 
6160: 69 74 65 6d 73 20 69 6e 20 74 68 65 20 73 6f 72  items in the sor
6170: 74 65 72 2c 20 64 65 6c 65 74 65 20 74 68 65 20  ter, delete the 
6180: 6c 61 72 67 65 73 74 0a 20 20 20 20 2a 2a 20 65  largest.    ** e
6190: 6e 74 72 79 20 62 65 66 6f 72 65 20 69 6e 73 65  ntry before inse
61a0: 72 74 69 6e 67 20 74 68 65 20 6e 65 77 20 6f 6e  rting the new on
61b0: 65 2e 20 54 68 69 73 20 77 61 79 20 74 68 65 72  e. This way ther
61c0: 65 20 61 72 65 20 6e 65 76 65 72 20 6d 6f 72 65  e are never more
61d0: 20 0a 20 20 20 20 2a 2a 20 74 68 61 6e 20 4c 49   .    ** than LI
61e0: 4d 49 54 2b 4f 46 46 53 45 54 20 69 74 65 6d 73  MIT+OFFSET items
61f0: 20 69 6e 20 74 68 65 20 73 6f 72 74 65 72 2e 0a   in the sorter..
6200: 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66      **.    ** If
6210: 20 74 68 65 20 6e 65 77 20 72 65 63 6f 72 64 20   the new record 
6220: 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f  does not need to
6230: 20 62 65 20 69 6e 73 65 72 74 65 64 20 69 6e 74   be inserted int
6240: 6f 20 74 68 65 20 73 6f 72 74 65 72 2c 0a 20 20  o the sorter,.  
6250: 20 20 2a 2a 20 6a 75 6d 70 20 74 6f 20 74 68 65    ** jump to the
6260: 20 6e 65 78 74 20 69 74 65 72 61 74 69 6f 6e 20   next iteration 
6270: 6f 66 20 74 68 65 20 6c 6f 6f 70 2e 20 49 66 20  of the loop. If 
6280: 74 68 65 20 70 53 6f 72 74 2d 3e 6c 61 62 65 6c  the pSort->label
6290: 4f 42 4c 6f 70 74 0a 20 20 20 20 2a 2a 20 76 61  OBLopt.    ** va
62a0: 6c 75 65 20 69 73 20 6e 6f 74 20 7a 65 72 6f 2c  lue is not zero,
62b0: 20 74 68 65 6e 20 69 74 20 69 73 20 61 20 6c 61   then it is a la
62c0: 62 65 6c 20 6f 66 20 77 68 65 72 65 20 74 6f 20  bel of where to 
62d0: 6a 75 6d 70 2e 20 20 4f 74 68 65 72 77 69 73 65  jump.  Otherwise
62e0: 2c 0a 20 20 20 20 2a 2a 20 6a 75 73 74 20 62 79  ,.    ** just by
62f0: 70 61 73 73 20 74 68 65 20 72 6f 77 20 69 6e 73  pass the row ins
6300: 65 72 74 20 6c 6f 67 69 63 2e 20 20 53 65 65 20  ert logic.  See 
6310: 74 68 65 20 68 65 61 64 65 72 20 63 6f 6d 6d 65  the header comme
6320: 6e 74 20 6f 6e 20 74 68 65 0a 20 20 20 20 2a 2a  nt on the.    **
6330: 20 73 71 6c 69 74 65 33 57 68 65 72 65 4f 72 64   sqlite3WhereOrd
6340: 65 72 42 79 4c 69 6d 69 74 4f 70 74 4c 61 62 65  erByLimitOptLabe
6350: 6c 28 29 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72  l() function for
6360: 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f   additional info
6370: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74  ..    */.    int
6380: 20 69 43 73 72 20 3d 20 70 53 6f 72 74 2d 3e 69   iCsr = pSort->i
6390: 45 43 75 72 73 6f 72 3b 0a 20 20 20 20 73 71 6c  ECursor;.    sql
63a0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
63b0: 2c 20 4f 50 5f 49 66 4e 6f 74 5a 65 72 6f 2c 20  , OP_IfNotZero, 
63c0: 69 4c 69 6d 69 74 2c 20 73 71 6c 69 74 65 33 56  iLimit, sqlite3V
63d0: 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
63e0: 29 2b 34 29 3b 0a 20 20 20 20 56 64 62 65 43 6f  )+4);.    VdbeCo
63f0: 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 73  verage(v);.    s
6400: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
6410: 28 76 2c 20 4f 50 5f 4c 61 73 74 2c 20 69 43 73  (v, OP_Last, iCs
6420: 72 2c 20 30 29 3b 0a 20 20 20 20 69 53 6b 69 70  r, 0);.    iSkip
6430: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
6440: 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 49 64  dOp4Int(v, OP_Id
6450: 78 4c 45 2c 0a 20 20 20 20 20 20 20 20 20 20 20  xLE,.           
6460: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6470: 20 20 20 20 20 20 69 43 73 72 2c 20 30 2c 20 72        iCsr, 0, r
6480: 65 67 42 61 73 65 2b 6e 4f 42 53 61 74 2c 20 6e  egBase+nOBSat, n
6490: 45 78 70 72 2d 6e 4f 42 53 61 74 29 3b 0a 20 20  Expr-nOBSat);.  
64a0: 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76    VdbeCoverage(v
64b0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
64c0: 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 44  beAddOp1(v, OP_D
64d0: 65 6c 65 74 65 2c 20 69 43 73 72 29 3b 0a 20 20  elete, iCsr);.  
64e0: 7d 0a 20 20 69 66 28 20 72 65 67 52 65 63 6f 72  }.  if( regRecor
64f0: 64 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 67 52  d==0 ){.    regR
6500: 65 63 6f 72 64 20 3d 20 6d 61 6b 65 53 6f 72 74  ecord = makeSort
6510: 65 72 52 65 63 6f 72 64 28 70 50 61 72 73 65 2c  erRecord(pParse,
6520: 20 70 53 6f 72 74 2c 20 70 53 65 6c 65 63 74 2c   pSort, pSelect,
6530: 20 72 65 67 42 61 73 65 2c 20 6e 42 61 73 65 29   regBase, nBase)
6540: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 53 6f 72  ;.  }.  if( pSor
6550: 74 2d 3e 73 6f 72 74 46 6c 61 67 73 20 26 20 53  t->sortFlags & S
6560: 4f 52 54 46 4c 41 47 5f 55 73 65 53 6f 72 74 65  ORTFLAG_UseSorte
6570: 72 20 29 7b 0a 20 20 20 20 6f 70 20 3d 20 4f 50  r ){.    op = OP
6580: 5f 53 6f 72 74 65 72 49 6e 73 65 72 74 3b 0a 20  _SorterInsert;. 
6590: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6f 70 20 3d   }else{.    op =
65a0: 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 3b 0a 20   OP_IdxInsert;. 
65b0: 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65   }.  sqlite3Vdbe
65c0: 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 6f 70 2c  AddOp4Int(v, op,
65d0: 20 70 53 6f 72 74 2d 3e 69 45 43 75 72 73 6f 72   pSort->iECursor
65e0: 2c 20 72 65 67 52 65 63 6f 72 64 2c 0a 20 20 20  , regRecord,.   
65f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6600: 20 20 20 20 72 65 67 42 61 73 65 2b 6e 4f 42 53      regBase+nOBS
6610: 61 74 2c 20 6e 42 61 73 65 2d 6e 4f 42 53 61 74  at, nBase-nOBSat
6620: 29 3b 0a 20 20 69 66 28 20 69 53 6b 69 70 20 29  );.  if( iSkip )
6630: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
6640: 65 43 68 61 6e 67 65 50 32 28 76 2c 20 69 53 6b  eChangeP2(v, iSk
6650: 69 70 2c 0a 20 20 20 20 20 20 20 20 20 70 53 6f  ip,.         pSo
6660: 72 74 2d 3e 6c 61 62 65 6c 4f 42 4c 6f 70 74 20  rt->labelOBLopt 
6670: 3f 20 70 53 6f 72 74 2d 3e 6c 61 62 65 6c 4f 42  ? pSort->labelOB
6680: 4c 6f 70 74 20 3a 20 73 71 6c 69 74 65 33 56 64  Lopt : sqlite3Vd
6690: 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
66a0: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
66b0: 41 64 64 20 63 6f 64 65 20 74 6f 20 69 6d 70 6c  Add code to impl
66c0: 65 6d 65 6e 74 20 74 68 65 20 4f 46 46 53 45 54  ement the OFFSET
66d0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
66e0: 63 6f 64 65 4f 66 66 73 65 74 28 0a 20 20 56 64  codeOffset(.  Vd
66f0: 62 65 20 2a 76 2c 20 20 20 20 20 20 20 20 20 20  be *v,          
6700: 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  /* Generate code
6710: 20 69 6e 74 6f 20 74 68 69 73 20 56 4d 20 2a 2f   into this VM */
6720: 0a 20 20 69 6e 74 20 69 4f 66 66 73 65 74 2c 20  .  int iOffset, 
6730: 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72       /* Register
6740: 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 6f 66 66   holding the off
6750: 73 65 74 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  set counter */. 
6760: 20 69 6e 74 20 69 43 6f 6e 74 69 6e 75 65 20 20   int iContinue  
6770: 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20     /* Jump here 
6780: 74 6f 20 73 6b 69 70 20 74 68 65 20 63 75 72 72  to skip the curr
6790: 65 6e 74 20 72 65 63 6f 72 64 20 2a 2f 0a 29 7b  ent record */.){
67a0: 0a 20 20 69 66 28 20 69 4f 66 66 73 65 74 3e 30  .  if( iOffset>0
67b0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
67c0: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
67d0: 49 66 50 6f 73 2c 20 69 4f 66 66 73 65 74 2c 20  IfPos, iOffset, 
67e0: 69 43 6f 6e 74 69 6e 75 65 2c 20 31 29 3b 20 56  iContinue, 1); V
67f0: 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
6800: 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
6810: 28 76 2c 20 22 4f 46 46 53 45 54 22 29 29 3b 0a  (v, "OFFSET"));.
6820: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64    }.}../*.** Add
6830: 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20   code that will 
6840: 63 68 65 63 6b 20 74 6f 20 6d 61 6b 65 20 73 75  check to make su
6850: 72 65 20 74 68 65 20 4e 20 72 65 67 69 73 74 65  re the N registe
6860: 72 73 20 73 74 61 72 74 69 6e 67 20 61 74 20 69  rs starting at i
6870: 4d 65 6d 0a 2a 2a 20 66 6f 72 6d 20 61 20 64 69  Mem.** form a di
6880: 73 74 69 6e 63 74 20 65 6e 74 72 79 2e 20 20 69  stinct entry.  i
6890: 54 61 62 20 69 73 20 61 20 73 6f 72 74 69 6e 67  Tab is a sorting
68a0: 20 69 6e 64 65 78 20 74 68 61 74 20 68 6f 6c 64   index that hold
68b0: 73 20 70 72 65 76 69 6f 75 73 6c 79 0a 2a 2a 20  s previously.** 
68c0: 73 65 65 6e 20 63 6f 6d 62 69 6e 61 74 69 6f 6e  seen combination
68d0: 73 20 6f 66 20 74 68 65 20 4e 20 76 61 6c 75 65  s of the N value
68e0: 73 2e 20 20 41 20 6e 65 77 20 65 6e 74 72 79 20  s.  A new entry 
68f0: 69 73 20 6d 61 64 65 20 69 6e 20 69 54 61 62 0a  is made in iTab.
6900: 2a 2a 20 69 66 20 74 68 65 20 63 75 72 72 65 6e  ** if the curren
6910: 74 20 4e 20 76 61 6c 75 65 73 20 61 72 65 20 6e  t N values are n
6920: 65 77 2e 0a 2a 2a 0a 2a 2a 20 41 20 6a 75 6d 70  ew..**.** A jump
6930: 20 74 6f 20 61 64 64 72 52 65 70 65 61 74 20 69   to addrRepeat i
6940: 73 20 6d 61 64 65 20 61 6e 64 20 74 68 65 20 4e  s made and the N
6950: 2b 31 20 76 61 6c 75 65 73 20 61 72 65 20 70 6f  +1 values are po
6960: 70 70 65 64 20 66 72 6f 6d 20 74 68 65 0a 2a 2a  pped from the.**
6970: 20 73 74 61 63 6b 20 69 66 20 74 68 65 20 74 6f   stack if the to
6980: 70 20 4e 20 65 6c 65 6d 65 6e 74 73 20 61 72 65  p N elements are
6990: 20 6e 6f 74 20 64 69 73 74 69 6e 63 74 2e 0a 2a   not distinct..*
69a0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f  /.static void co
69b0: 64 65 44 69 73 74 69 6e 63 74 28 0a 20 20 50 61  deDistinct(.  Pa
69c0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
69d0: 20 2f 2a 20 50 61 72 73 69 6e 67 20 61 6e 64 20   /* Parsing and 
69e0: 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6e 67 20  code generating 
69f0: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74  context */.  int
6a00: 20 69 54 61 62 2c 20 20 20 20 20 20 20 20 20 20   iTab,          
6a10: 2f 2a 20 41 20 73 6f 72 74 69 6e 67 20 69 6e 64  /* A sorting ind
6a20: 65 78 20 75 73 65 64 20 74 6f 20 74 65 73 74 20  ex used to test 
6a30: 66 6f 72 20 64 69 73 74 69 6e 63 74 6e 65 73 73  for distinctness
6a40: 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 52 65   */.  int addrRe
6a50: 70 65 61 74 2c 20 20 20 20 2f 2a 20 4a 75 6d 70  peat,    /* Jump
6a60: 20 74 6f 20 68 65 72 65 20 69 66 20 6e 6f 74 20   to here if not 
6a70: 64 69 73 74 69 6e 63 74 20 2a 2f 0a 20 20 69 6e  distinct */.  in
6a80: 74 20 4e 2c 20 20 20 20 20 20 20 20 20 20 20 20  t N,            
6a90: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 6c   /* Number of el
6aa0: 65 6d 65 6e 74 73 20 2a 2f 0a 20 20 69 6e 74 20  ements */.  int 
6ab0: 69 4d 65 6d 20 20 20 20 20 20 20 20 20 20 20 2f  iMem           /
6ac0: 2a 20 46 69 72 73 74 20 65 6c 65 6d 65 6e 74 20  * First element 
6ad0: 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76 3b  */.){.  Vdbe *v;
6ae0: 0a 20 20 69 6e 74 20 72 31 3b 0a 0a 20 20 76 20  .  int r1;..  v 
6af0: 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
6b00: 0a 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47  .  r1 = sqlite3G
6b10: 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  etTempReg(pParse
6b20: 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
6b30: 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f  AddOp4Int(v, OP_
6b40: 46 6f 75 6e 64 2c 20 69 54 61 62 2c 20 61 64 64  Found, iTab, add
6b50: 72 52 65 70 65 61 74 2c 20 69 4d 65 6d 2c 20 4e  rRepeat, iMem, N
6b60: 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
6b70: 76 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  v);.  sqlite3Vdb
6b80: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61  eAddOp3(v, OP_Ma
6b90: 6b 65 52 65 63 6f 72 64 2c 20 69 4d 65 6d 2c 20  keRecord, iMem, 
6ba0: 4e 2c 20 72 31 29 3b 0a 20 20 73 71 6c 69 74 65  N, r1);.  sqlite
6bb0: 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76  3VdbeAddOp4Int(v
6bc0: 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20  , OP_IdxInsert, 
6bd0: 69 54 61 62 2c 20 72 31 2c 20 69 4d 65 6d 2c 20  iTab, r1, iMem, 
6be0: 4e 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  N);.  sqlite3Vdb
6bf0: 65 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46  eChangeP5(v, OPF
6c00: 4c 41 47 5f 55 53 45 53 45 45 4b 52 45 53 55 4c  LAG_USESEEKRESUL
6c10: 54 29 3b 0a 20 20 73 71 6c 69 74 65 33 52 65 6c  T);.  sqlite3Rel
6c20: 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
6c30: 73 65 2c 20 72 31 29 3b 0a 7d 0a 0a 23 69 66 64  se, r1);.}..#ifd
6c40: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
6c50: 5f 53 4f 52 54 45 52 5f 52 45 46 45 52 45 4e 43  _SORTER_REFERENC
6c60: 45 53 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  ES./*.** This fu
6c70: 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
6c80: 20 61 73 20 70 61 72 74 20 6f 66 20 69 6e 6e 65   as part of inne
6c90: 72 2d 6c 6f 6f 70 20 67 65 6e 65 72 61 74 69 6f  r-loop generatio
6ca0: 6e 20 66 6f 72 20 61 20 53 45 4c 45 43 54 0a 2a  n for a SELECT.*
6cb0: 2a 20 73 74 61 74 65 6d 65 6e 74 20 77 69 74 68  * statement with
6cc0: 20 61 6e 20 4f 52 44 45 52 20 42 59 20 74 68 61   an ORDER BY tha
6cd0: 74 20 69 73 20 6e 6f 74 20 6f 70 74 69 6d 69 7a  t is not optimiz
6ce0: 65 64 20 62 79 20 61 6e 20 69 6e 64 65 78 2e 20  ed by an index. 
6cf0: 49 74 20 0a 2a 2a 20 64 65 74 65 72 6d 69 6e 65  It .** determine
6d00: 73 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  s the expression
6d10: 73 2c 20 69 66 20 61 6e 79 2c 20 74 68 61 74 20  s, if any, that 
6d20: 74 68 65 20 73 6f 72 74 65 72 2d 72 65 66 65 72  the sorter-refer
6d30: 65 6e 63 65 20 0a 2a 2a 20 6f 70 74 69 6d 69 7a  ence .** optimiz
6d40: 61 74 69 6f 6e 20 73 68 6f 75 6c 64 20 62 65 20  ation should be 
6d50: 75 73 65 64 20 66 6f 72 2e 20 54 68 65 20 73 6f  used for. The so
6d60: 72 74 65 72 2d 72 65 66 65 72 65 6e 63 65 20 6f  rter-reference o
6d70: 70 74 69 6d 69 7a 61 74 69 6f 6e 0a 2a 2a 20 69  ptimization.** i
6d80: 73 20 75 73 65 64 20 66 6f 72 20 53 45 4c 45 43  s used for SELEC
6d90: 54 20 71 75 65 72 69 65 73 20 6c 69 6b 65 3a 0a  T queries like:.
6da0: 2a 2a 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20 61  **.**   SELECT a
6db0: 2c 20 62 69 67 62 6c 6f 62 20 46 52 4f 4d 20 74  , bigblob FROM t
6dc0: 31 20 4f 52 44 45 52 20 42 59 20 61 20 4c 49 4d  1 ORDER BY a LIM
6dd0: 49 54 20 31 30 0a 2a 2a 0a 2a 2a 20 49 66 20 74  IT 10.**.** If t
6de0: 68 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20  he optimization 
6df0: 69 73 20 75 73 65 64 20 66 6f 72 20 65 78 70 72  is used for expr
6e00: 65 73 73 69 6f 6e 20 22 62 69 67 62 6c 6f 62 22  ession "bigblob"
6e10: 2c 20 74 68 65 6e 20 69 6e 73 74 65 61 64 20 6f  , then instead o
6e20: 66 0a 2a 2a 20 73 74 6f 72 69 6e 67 20 76 61 6c  f.** storing val
6e30: 75 65 73 20 72 65 61 64 20 66 72 6f 6d 20 74 68  ues read from th
6e40: 61 74 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65  at column in the
6e50: 20 73 6f 72 74 65 72 20 72 65 63 6f 72 64 73 2c   sorter records,
6e60: 20 74 68 65 20 50 4b 20 6f 66 0a 2a 2a 20 74 68   the PK of.** th
6e70: 65 20 72 6f 77 20 66 72 6f 6d 20 74 61 62 6c 65  e row from table
6e80: 20 74 31 20 69 73 20 73 74 6f 72 65 64 20 69 6e   t1 is stored in
6e90: 73 74 65 61 64 2e 20 54 68 65 6e 2c 20 61 73 20  stead. Then, as 
6ea0: 72 65 63 6f 72 64 73 20 61 72 65 20 65 78 74 72  records are extr
6eb0: 61 63 74 65 64 20 66 72 6f 6d 0a 2a 2a 20 74 68  acted from.** th
6ec0: 65 20 73 6f 72 74 65 72 20 74 6f 20 72 65 74 75  e sorter to retu
6ed0: 72 6e 20 74 6f 20 74 68 65 20 75 73 65 72 2c 20  rn to the user, 
6ee0: 74 68 65 20 72 65 71 75 69 72 65 64 20 76 61 6c  the required val
6ef0: 75 65 20 6f 66 20 62 69 67 62 6c 6f 62 20 69 73  ue of bigblob is
6f00: 0a 2a 2a 20 72 65 74 72 69 65 76 65 64 20 64 69  .** retrieved di
6f10: 72 65 63 74 6c 79 20 66 72 6f 6d 20 74 61 62 6c  rectly from tabl
6f20: 65 20 74 31 2e 20 49 66 20 74 68 65 20 76 61 6c  e t1. If the val
6f30: 75 65 73 20 61 72 65 20 76 65 72 79 20 6c 61 72  ues are very lar
6f40: 67 65 2c 20 74 68 69 73 20 0a 2a 2a 20 63 61 6e  ge, this .** can
6f50: 20 62 65 20 6d 6f 72 65 20 65 66 66 69 63 69 65   be more efficie
6f60: 6e 74 20 74 68 61 6e 20 73 74 6f 72 69 6e 67 20  nt than storing 
6f70: 74 68 65 6d 20 64 69 72 65 63 74 6c 79 20 69 6e  them directly in
6f80: 20 74 68 65 20 73 6f 72 74 65 72 20 72 65 63 6f   the sorter reco
6f90: 72 64 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 45  rds..**.** The E
6fa0: 78 70 72 4c 69 73 74 5f 69 74 65 6d 2e 62 53 6f  xprList_item.bSo
6fb0: 72 74 65 72 52 65 66 20 66 6c 61 67 20 69 73 20  rterRef flag is 
6fc0: 73 65 74 20 66 6f 72 20 65 61 63 68 20 65 78 70  set for each exp
6fd0: 72 65 73 73 69 6f 6e 20 69 6e 20 70 45 4c 69 73  ression in pELis
6fe0: 74 20 0a 2a 2a 20 66 6f 72 20 77 68 69 63 68 20  t .** for which 
6ff0: 74 68 65 20 73 6f 72 74 65 72 2d 72 65 66 65 72  the sorter-refer
7000: 65 6e 63 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f  ence optimizatio
7010: 6e 20 73 68 6f 75 6c 64 20 62 65 20 65 6e 61 62  n should be enab
7020: 6c 65 64 2e 20 0a 2a 2a 20 41 64 64 69 74 69 6f  led. .** Additio
7030: 6e 61 6c 6c 79 2c 20 74 68 65 20 70 53 6f 72 74  nally, the pSort
7040: 2d 3e 61 44 65 66 65 72 5b 5d 20 61 72 72 61 79  ->aDefer[] array
7050: 20 69 73 20 70 6f 70 75 6c 61 74 65 64 20 77 69   is populated wi
7060: 74 68 20 65 6e 74 72 69 65 73 0a 2a 2a 20 66 6f  th entries.** fo
7070: 72 20 61 6c 6c 20 63 75 72 73 6f 72 73 20 72 65  r all cursors re
7080: 71 75 69 72 65 64 20 74 6f 20 65 76 61 6c 75 61  quired to evalua
7090: 74 65 20 61 6c 6c 20 73 65 6c 65 63 74 65 64 20  te all selected 
70a0: 65 78 70 72 65 73 73 69 6f 6e 73 2e 20 46 69 6e  expressions. Fin
70b0: 61 6c 6c 79 2e 0a 2a 2a 20 6f 75 74 70 75 74 20  ally..** output 
70c0: 76 61 72 69 61 62 6c 65 20 28 2a 70 70 45 78 74  variable (*ppExt
70d0: 72 61 29 20 69 73 20 73 65 74 20 74 6f 20 61 6e  ra) is set to an
70e0: 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74   expression list
70f0: 20 63 6f 6e 74 61 69 6e 69 6e 67 0a 2a 2a 20 65   containing.** e
7100: 78 70 72 65 73 73 69 6f 6e 73 20 66 6f 72 20 61  xpressions for a
7110: 6c 6c 20 65 78 74 72 61 20 50 4b 20 76 61 6c 75  ll extra PK valu
7120: 65 73 20 74 68 61 74 20 73 68 6f 75 6c 64 20 62  es that should b
7130: 65 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 0a  e stored in the.
7140: 2a 2a 20 73 6f 72 74 65 72 20 72 65 63 6f 72 64  ** sorter record
7150: 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  s..*/.static voi
7160: 64 20 73 65 6c 65 63 74 45 78 70 72 44 65 66 65  d selectExprDefe
7170: 72 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  r(.  Parse *pPar
7180: 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  se,             
7190: 20 20 20 20 20 2f 2a 20 4c 65 61 76 65 20 61 6e       /* Leave an
71a0: 79 20 65 72 72 6f 72 20 68 65 72 65 20 2a 2f 0a  y error here */.
71b0: 20 20 53 6f 72 74 43 74 78 20 2a 70 53 6f 72 74    SortCtx *pSort
71c0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
71d0: 20 20 2f 2a 20 53 6f 72 74 65 72 20 63 6f 6e 74    /* Sorter cont
71e0: 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  ext */.  ExprLis
71f0: 74 20 2a 70 45 4c 69 73 74 2c 20 20 20 20 20 20  t *pEList,      
7200: 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 70 72           /* Expr
7210: 65 73 73 69 6f 6e 73 20 64 65 73 74 69 6e 65 64  essions destined
7220: 20 66 6f 72 20 73 6f 72 74 65 72 20 2a 2f 0a 20   for sorter */. 
7230: 20 45 78 70 72 4c 69 73 74 20 2a 2a 70 70 45 78   ExprList **ppEx
7240: 74 72 61 20 20 20 20 20 20 20 20 20 20 20 20 20  tra             
7250: 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 73 20   /* Expressions 
7260: 74 6f 20 61 70 70 65 6e 64 20 74 6f 20 73 6f 72  to append to sor
7270: 74 65 72 20 72 65 63 6f 72 64 20 2a 2f 0a 29 7b  ter record */.){
7280: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20  .  int i;.  int 
7290: 6e 44 65 66 65 72 20 3d 20 30 3b 0a 20 20 45 78  nDefer = 0;.  Ex
72a0: 70 72 4c 69 73 74 20 2a 70 45 78 74 72 61 20 3d  prList *pExtra =
72b0: 20 30 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   0;.  for(i=0; i
72c0: 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20  <pEList->nExpr; 
72d0: 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75 63 74  i++){.    struct
72e0: 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a   ExprList_item *
72f0: 70 49 74 65 6d 20 3d 20 26 70 45 4c 69 73 74 2d  pItem = &pEList-
7300: 3e 61 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 70  >a[i];.    if( p
7310: 49 74 65 6d 2d 3e 75 2e 78 2e 69 4f 72 64 65 72  Item->u.x.iOrder
7320: 42 79 43 6f 6c 3d 3d 30 20 29 7b 0a 20 20 20 20  ByCol==0 ){.    
7330: 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20    Expr *pExpr = 
7340: 70 49 74 65 6d 2d 3e 70 45 78 70 72 3b 0a 20 20  pItem->pExpr;.  
7350: 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20      Table *pTab 
7360: 3d 20 70 45 78 70 72 2d 3e 79 2e 70 54 61 62 3b  = pExpr->y.pTab;
7370: 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72  .      if( pExpr
7380: 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20  ->op==TK_COLUMN 
7390: 26 26 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d  && pExpr->iColum
73a0: 6e 3e 3d 30 20 26 26 20 70 54 61 62 20 26 26 20  n>=0 && pTab && 
73b0: 21 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 29  !IsVirtual(pTab)
73c0: 0a 20 20 20 20 20 20 20 26 26 20 28 70 54 61 62  .       && (pTab
73d0: 2d 3e 61 43 6f 6c 5b 70 45 78 70 72 2d 3e 69 43  ->aCol[pExpr->iC
73e0: 6f 6c 75 6d 6e 5d 2e 63 6f 6c 46 6c 61 67 73 20  olumn].colFlags 
73f0: 26 20 43 4f 4c 46 4c 41 47 5f 53 4f 52 54 45 52  & COLFLAG_SORTER
7400: 52 45 46 29 0a 20 20 20 20 20 20 29 7b 0a 20 20  REF).      ){.  
7410: 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20        int j;.   
7420: 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c       for(j=0; j<
7430: 6e 44 65 66 65 72 3b 20 6a 2b 2b 29 7b 0a 20 20  nDefer; j++){.  
7440: 20 20 20 20 20 20 20 20 69 66 28 20 70 53 6f 72          if( pSor
7450: 74 2d 3e 61 44 65 66 65 72 5b 6a 5d 2e 69 43 73  t->aDefer[j].iCs
7460: 72 3d 3d 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  r==pExpr->iTable
7470: 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
7480: 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
7490: 6a 3d 3d 6e 44 65 66 65 72 20 29 7b 0a 20 20 20  j==nDefer ){.   
74a0: 20 20 20 20 20 20 20 69 66 28 20 6e 44 65 66 65         if( nDefe
74b0: 72 3d 3d 41 72 72 61 79 53 69 7a 65 28 70 53 6f  r==ArraySize(pSo
74c0: 72 74 2d 3e 61 44 65 66 65 72 29 20 29 7b 0a 20  rt->aDefer) ){. 
74d0: 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69             conti
74e0: 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  nue;.          }
74f0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
7500: 20 20 69 6e 74 20 6e 4b 65 79 20 3d 20 31 3b 0a    int nKey = 1;.
7510: 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20              int 
7520: 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 49  k;.            I
7530: 6e 64 65 78 20 2a 70 50 6b 20 3d 20 30 3b 0a 20  ndex *pPk = 0;. 
7540: 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 21             if( !
7550: 48 61 73 52 6f 77 69 64 28 70 54 61 62 29 20 29  HasRowid(pTab) )
7560: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
7570: 70 50 6b 20 3d 20 73 71 6c 69 74 65 33 50 72 69  pPk = sqlite3Pri
7580: 6d 61 72 79 4b 65 79 49 6e 64 65 78 28 70 54 61  maryKeyIndex(pTa
7590: 62 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  b);.            
75a0: 20 20 6e 4b 65 79 20 3d 20 70 50 6b 2d 3e 6e 4b    nKey = pPk->nK
75b0: 65 79 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20 20  eyCol;.         
75c0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
75d0: 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 6e 4b 65 79   for(k=0; k<nKey
75e0: 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; k++){.        
75f0: 20 20 20 20 20 20 45 78 70 72 20 2a 70 4e 65 77        Expr *pNew
7600: 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72 28   = sqlite3PExpr(
7610: 70 50 61 72 73 65 2c 20 54 4b 5f 43 4f 4c 55 4d  pParse, TK_COLUM
7620: 4e 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  N, 0, 0);.      
7630: 20 20 20 20 20 20 20 20 69 66 28 20 70 4e 65 77          if( pNew
7640: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
7650: 20 20 20 20 70 4e 65 77 2d 3e 69 54 61 62 6c 65      pNew->iTable
7660: 20 3d 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65   = pExpr->iTable
7670: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
7680: 20 20 70 4e 65 77 2d 3e 79 2e 70 54 61 62 20 3d    pNew->y.pTab =
7690: 20 70 45 78 70 72 2d 3e 79 2e 70 54 61 62 3b 0a   pExpr->y.pTab;.
76a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
76b0: 70 4e 65 77 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20  pNew->iColumn = 
76c0: 70 50 6b 20 3f 20 70 50 6b 2d 3e 61 69 43 6f 6c  pPk ? pPk->aiCol
76d0: 75 6d 6e 5b 6b 5d 20 3a 20 2d 31 3b 0a 20 20 20  umn[k] : -1;.   
76e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78               pEx
76f0: 74 72 61 20 3d 20 73 71 6c 69 74 65 33 45 78 70  tra = sqlite3Exp
7700: 72 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61 72  rListAppend(pPar
7710: 73 65 2c 20 70 45 78 74 72 61 2c 20 70 4e 65 77  se, pExtra, pNew
7720: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
7730: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d   }.            }
7740: 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 53 6f  .            pSo
7750: 72 74 2d 3e 61 44 65 66 65 72 5b 6e 44 65 66 65  rt->aDefer[nDefe
7760: 72 5d 2e 70 54 61 62 20 3d 20 70 45 78 70 72 2d  r].pTab = pExpr-
7770: 3e 79 2e 70 54 61 62 3b 0a 20 20 20 20 20 20 20  >y.pTab;.       
7780: 20 20 20 20 20 70 53 6f 72 74 2d 3e 61 44 65 66       pSort->aDef
7790: 65 72 5b 6e 44 65 66 65 72 5d 2e 69 43 73 72 20  er[nDefer].iCsr 
77a0: 3d 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3b  = pExpr->iTable;
77b0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 53 6f  .            pSo
77c0: 72 74 2d 3e 61 44 65 66 65 72 5b 6e 44 65 66 65  rt->aDefer[nDefe
77d0: 72 5d 2e 6e 4b 65 79 20 3d 20 6e 4b 65 79 3b 0a  r].nKey = nKey;.
77e0: 20 20 20 20 20 20 20 20 20 20 20 20 6e 44 65 66              nDef
77f0: 65 72 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20  er++;.          
7800: 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
7810: 20 20 20 20 70 49 74 65 6d 2d 3e 62 53 6f 72 74      pItem->bSort
7820: 65 72 52 65 66 20 3d 20 31 3b 0a 20 20 20 20 20  erRef = 1;.     
7830: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70   }.    }.  }.  p
7840: 53 6f 72 74 2d 3e 6e 44 65 66 65 72 20 3d 20 28  Sort->nDefer = (
7850: 75 38 29 6e 44 65 66 65 72 3b 0a 20 20 2a 70 70  u8)nDefer;.  *pp
7860: 45 78 74 72 61 20 3d 20 70 45 78 74 72 61 3b 0a  Extra = pExtra;.
7870: 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
7880: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 67 65 6e  This routine gen
7890: 65 72 61 74 65 73 20 74 68 65 20 63 6f 64 65 20  erates the code 
78a0: 66 6f 72 20 74 68 65 20 69 6e 73 69 64 65 20 6f  for the inside o
78b0: 66 20 74 68 65 20 69 6e 6e 65 72 20 6c 6f 6f 70  f the inner loop
78c0: 0a 2a 2a 20 6f 66 20 61 20 53 45 4c 45 43 54 2e  .** of a SELECT.
78d0: 0a 2a 2a 0a 2a 2a 20 49 66 20 73 72 63 54 61 62  .**.** If srcTab
78e0: 20 69 73 20 6e 65 67 61 74 69 76 65 2c 20 74 68   is negative, th
78f0: 65 6e 20 74 68 65 20 70 2d 3e 70 45 4c 69 73 74  en the p->pEList
7900: 20 65 78 70 72 65 73 73 69 6f 6e 73 0a 2a 2a 20   expressions.** 
7910: 61 72 65 20 65 76 61 6c 75 61 74 65 64 20 69 6e  are evaluated in
7920: 20 6f 72 64 65 72 20 74 6f 20 67 65 74 20 74 68   order to get th
7930: 65 20 64 61 74 61 20 66 6f 72 20 74 68 69 73 20  e data for this 
7940: 72 6f 77 2e 20 20 49 66 20 73 72 63 54 61 62 20  row.  If srcTab 
7950: 69 73 0a 2a 2a 20 7a 65 72 6f 20 6f 72 20 6d 6f  is.** zero or mo
7960: 72 65 2c 20 74 68 65 6e 20 64 61 74 61 20 69 73  re, then data is
7970: 20 70 75 6c 6c 65 64 20 66 72 6f 6d 20 73 72 63   pulled from src
7980: 54 61 62 20 61 6e 64 20 70 2d 3e 70 45 4c 69 73  Tab and p->pELis
7990: 74 20 69 73 20 75 73 65 64 20 6f 6e 6c 79 20 0a  t is used only .
79a0: 2a 2a 20 74 6f 20 67 65 74 20 74 68 65 20 6e 75  ** to get the nu
79b0: 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20  mber of columns 
79c0: 61 6e 64 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f  and the collatio
79d0: 6e 20 73 65 71 75 65 6e 63 65 20 66 6f 72 20 65  n sequence for e
79e0: 61 63 68 20 63 6f 6c 75 6d 6e 2e 0a 2a 2f 0a 73  ach column..*/.s
79f0: 74 61 74 69 63 20 76 6f 69 64 20 73 65 6c 65 63  tatic void selec
7a00: 74 49 6e 6e 65 72 4c 6f 6f 70 28 0a 20 20 50 61  tInnerLoop(.  Pa
7a10: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
7a20: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72        /* The par
7a30: 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ser context */. 
7a40: 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20   Select *p,     
7a50: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
7a60: 63 6f 6d 70 6c 65 74 65 20 73 65 6c 65 63 74 20  complete select 
7a70: 73 74 61 74 65 6d 65 6e 74 20 62 65 69 6e 67 20  statement being 
7a80: 63 6f 64 65 64 20 2a 2f 0a 20 20 69 6e 74 20 73  coded */.  int s
7a90: 72 63 54 61 62 2c 20 20 20 20 20 20 20 20 20 20  rcTab,          
7aa0: 20 20 20 2f 2a 20 50 75 6c 6c 20 64 61 74 61 20     /* Pull data 
7ab0: 66 72 6f 6d 20 74 68 69 73 20 74 61 62 6c 65 20  from this table 
7ac0: 69 66 20 6e 6f 6e 2d 6e 65 67 61 74 69 76 65 20  if non-negative 
7ad0: 2a 2f 0a 20 20 53 6f 72 74 43 74 78 20 2a 70 53  */.  SortCtx *pS
7ae0: 6f 72 74 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  ort,         /* 
7af0: 49 66 20 6e 6f 74 20 4e 55 4c 4c 2c 20 69 6e 66  If not NULL, inf
7b00: 6f 20 6f 6e 20 68 6f 77 20 74 6f 20 70 72 6f 63  o on how to proc
7b10: 65 73 73 20 4f 52 44 45 52 20 42 59 20 2a 2f 0a  ess ORDER BY */.
7b20: 20 20 44 69 73 74 69 6e 63 74 43 74 78 20 2a 70    DistinctCtx *p
7b30: 44 69 73 74 69 6e 63 74 2c 20 2f 2a 20 49 66 20  Distinct, /* If 
7b40: 6e 6f 74 20 4e 55 4c 4c 2c 20 69 6e 66 6f 20 6f  not NULL, info o
7b50: 6e 20 68 6f 77 20 74 6f 20 70 72 6f 63 65 73 73  n how to process
7b60: 20 44 49 53 54 49 4e 43 54 20 2a 2f 0a 20 20 53   DISTINCT */.  S
7b70: 65 6c 65 63 74 44 65 73 74 20 2a 70 44 65 73 74  electDest *pDest
7b80: 2c 20 20 20 20 20 20 2f 2a 20 48 6f 77 20 74 6f  ,      /* How to
7b90: 20 64 69 73 70 6f 73 65 20 6f 66 20 74 68 65 20   dispose of the 
7ba0: 72 65 73 75 6c 74 73 20 2a 2f 0a 20 20 69 6e 74  results */.  int
7bb0: 20 69 43 6f 6e 74 69 6e 75 65 2c 20 20 20 20 20   iContinue,     
7bc0: 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72       /* Jump her
7bd0: 65 20 74 6f 20 63 6f 6e 74 69 6e 75 65 20 77 69  e to continue wi
7be0: 74 68 20 6e 65 78 74 20 72 6f 77 20 2a 2f 0a 20  th next row */. 
7bf0: 20 69 6e 74 20 69 42 72 65 61 6b 20 20 20 20 20   int iBreak     
7c00: 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70           /* Jump
7c10: 20 68 65 72 65 20 74 6f 20 62 72 65 61 6b 20 6f   here to break o
7c20: 75 74 20 6f 66 20 74 68 65 20 69 6e 6e 65 72 20  ut of the inner 
7c30: 6c 6f 6f 70 20 2a 2f 0a 29 7b 0a 20 20 56 64 62  loop */.){.  Vdb
7c40: 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
7c50: 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  Vdbe;.  int i;. 
7c60: 20 69 6e 74 20 68 61 73 44 69 73 74 69 6e 63 74   int hasDistinct
7c70: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
7c80: 54 72 75 65 20 69 66 20 74 68 65 20 44 49 53 54  True if the DIST
7c90: 49 4e 43 54 20 6b 65 79 77 6f 72 64 20 69 73 20  INCT keyword is 
7ca0: 70 72 65 73 65 6e 74 20 2a 2f 0a 20 20 69 6e 74  present */.  int
7cb0: 20 65 44 65 73 74 20 3d 20 70 44 65 73 74 2d 3e   eDest = pDest->
7cc0: 65 44 65 73 74 3b 20 20 20 2f 2a 20 48 6f 77 20  eDest;   /* How 
7cd0: 74 6f 20 64 69 73 70 6f 73 65 20 6f 66 20 72 65  to dispose of re
7ce0: 73 75 6c 74 73 20 2a 2f 0a 20 20 69 6e 74 20 69  sults */.  int i
7cf0: 50 61 72 6d 20 3d 20 70 44 65 73 74 2d 3e 69 53  Parm = pDest->iS
7d00: 44 50 61 72 6d 3b 20 2f 2a 20 46 69 72 73 74 20  DParm; /* First 
7d10: 61 72 67 75 6d 65 6e 74 20 74 6f 20 64 69 73 70  argument to disp
7d20: 6f 73 61 6c 20 6d 65 74 68 6f 64 20 2a 2f 0a 20  osal method */. 
7d30: 20 69 6e 74 20 6e 52 65 73 75 6c 74 43 6f 6c 3b   int nResultCol;
7d40: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
7d50: 4e 75 6d 62 65 72 20 6f 66 20 72 65 73 75 6c 74  Number of result
7d60: 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 69 6e   columns */.  in
7d70: 74 20 6e 50 72 65 66 69 78 52 65 67 20 3d 20 30  t nPrefixReg = 0
7d80: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d  ;         /* Num
7d90: 62 65 72 20 6f 66 20 65 78 74 72 61 20 72 65 67  ber of extra reg
7da0: 69 73 74 65 72 73 20 62 65 66 6f 72 65 20 72 65  isters before re
7db0: 67 52 65 73 75 6c 74 20 2a 2f 0a 20 20 52 6f 77  gResult */.  Row
7dc0: 4c 6f 61 64 49 6e 66 6f 20 73 52 6f 77 4c 6f 61  LoadInfo sRowLoa
7dd0: 64 49 6e 66 6f 3b 20 20 20 2f 2a 20 49 6e 66 6f  dInfo;   /* Info
7de0: 20 66 6f 72 20 64 65 66 65 72 72 65 64 20 72 6f   for deferred ro
7df0: 77 20 6c 6f 61 64 69 6e 67 20 2a 2f 0a 0a 20 20  w loading */..  
7e00: 2f 2a 20 55 73 75 61 6c 6c 79 2c 20 72 65 67 52  /* Usually, regR
7e10: 65 73 75 6c 74 20 69 73 20 74 68 65 20 66 69 72  esult is the fir
7e20: 73 74 20 63 65 6c 6c 20 69 6e 20 61 6e 20 61 72  st cell in an ar
7e30: 72 61 79 20 6f 66 20 6d 65 6d 6f 72 79 20 63 65  ray of memory ce
7e40: 6c 6c 73 0a 20 20 2a 2a 20 63 6f 6e 74 61 69 6e  lls.  ** contain
7e50: 69 6e 67 20 74 68 65 20 63 75 72 72 65 6e 74 20  ing the current 
7e60: 72 65 73 75 6c 74 20 72 6f 77 2e 20 49 6e 20 74  result row. In t
7e70: 68 69 73 20 63 61 73 65 20 72 65 67 4f 72 69 67  his case regOrig
7e80: 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 0a 20   is set to the. 
7e90: 20 2a 2a 20 73 61 6d 65 20 76 61 6c 75 65 2e 20   ** same value. 
7ea0: 48 6f 77 65 76 65 72 2c 20 69 66 20 74 68 65 20  However, if the 
7eb0: 72 65 73 75 6c 74 73 20 61 72 65 20 62 65 69 6e  results are bein
7ec0: 67 20 73 65 6e 74 20 74 6f 20 74 68 65 20 73 6f  g sent to the so
7ed0: 72 74 65 72 2c 20 74 68 65 0a 20 20 2a 2a 20 76  rter, the.  ** v
7ee0: 61 6c 75 65 73 20 66 6f 72 20 61 6e 79 20 65 78  alues for any ex
7ef0: 70 72 65 73 73 69 6f 6e 73 20 74 68 61 74 20 61  pressions that a
7f00: 72 65 20 61 6c 73 6f 20 70 61 72 74 20 6f 66 20  re also part of 
7f10: 74 68 65 20 73 6f 72 74 2d 6b 65 79 20 61 72 65  the sort-key are
7f20: 20 6f 6d 69 74 74 65 64 0a 20 20 2a 2a 20 66 72   omitted.  ** fr
7f30: 6f 6d 20 74 68 69 73 20 61 72 72 61 79 2e 20 49  om this array. I
7f40: 6e 20 74 68 69 73 20 63 61 73 65 20 72 65 67 4f  n this case regO
7f50: 72 69 67 20 69 73 20 73 65 74 20 74 6f 20 7a 65  rig is set to ze
7f60: 72 6f 2e 20 20 2a 2f 0a 20 20 69 6e 74 20 72 65  ro.  */.  int re
7f70: 67 52 65 73 75 6c 74 3b 20 20 20 20 20 20 20 20  gResult;        
7f80: 20 20 20 20 20 20 2f 2a 20 53 74 61 72 74 20 6f        /* Start o
7f90: 66 20 6d 65 6d 6f 72 79 20 68 6f 6c 64 69 6e 67  f memory holding
7fa0: 20 63 75 72 72 65 6e 74 20 72 65 73 75 6c 74 73   current results
7fb0: 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 4f 72 69   */.  int regOri
7fc0: 67 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g;              
7fd0: 20 20 2f 2a 20 53 74 61 72 74 20 6f 66 20 6d 65    /* Start of me
7fe0: 6d 6f 72 79 20 68 6f 6c 64 69 6e 67 20 66 75 6c  mory holding ful
7ff0: 6c 20 72 65 73 75 6c 74 20 28 6f 72 20 30 29 20  l result (or 0) 
8000: 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 76 20  */..  assert( v 
8010: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
8020: 70 45 4c 69 73 74 21 3d 30 20 29 3b 0a 20 20 68  pEList!=0 );.  h
8030: 61 73 44 69 73 74 69 6e 63 74 20 3d 20 70 44 69  asDistinct = pDi
8040: 73 74 69 6e 63 74 20 3f 20 70 44 69 73 74 69 6e  stinct ? pDistin
8050: 63 74 2d 3e 65 54 6e 63 74 54 79 70 65 20 3a 20  ct->eTnctType : 
8060: 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 4e  WHERE_DISTINCT_N
8070: 4f 4f 50 3b 0a 20 20 69 66 28 20 70 53 6f 72 74  OOP;.  if( pSort
8080: 20 26 26 20 70 53 6f 72 74 2d 3e 70 4f 72 64 65   && pSort->pOrde
8090: 72 42 79 3d 3d 30 20 29 20 70 53 6f 72 74 20 3d  rBy==0 ) pSort =
80a0: 20 30 3b 0a 20 20 69 66 28 20 70 53 6f 72 74 3d   0;.  if( pSort=
80b0: 3d 30 20 26 26 20 21 68 61 73 44 69 73 74 69 6e  =0 && !hasDistin
80c0: 63 74 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  ct ){.    assert
80d0: 28 20 69 43 6f 6e 74 69 6e 75 65 21 3d 30 20 29  ( iContinue!=0 )
80e0: 3b 0a 20 20 20 20 63 6f 64 65 4f 66 66 73 65 74  ;.    codeOffset
80f0: 28 76 2c 20 70 2d 3e 69 4f 66 66 73 65 74 2c 20  (v, p->iOffset, 
8100: 69 43 6f 6e 74 69 6e 75 65 29 3b 0a 20 20 7d 0a  iContinue);.  }.
8110: 0a 20 20 2f 2a 20 50 75 6c 6c 20 74 68 65 20 72  .  /* Pull the r
8120: 65 71 75 65 73 74 65 64 20 63 6f 6c 75 6d 6e 73  equested columns
8130: 2e 0a 20 20 2a 2f 0a 20 20 6e 52 65 73 75 6c 74  ..  */.  nResult
8140: 43 6f 6c 20 3d 20 70 2d 3e 70 45 4c 69 73 74 2d  Col = p->pEList-
8150: 3e 6e 45 78 70 72 3b 0a 0a 20 20 69 66 28 20 70  >nExpr;..  if( p
8160: 44 65 73 74 2d 3e 69 53 64 73 74 3d 3d 30 20 29  Dest->iSdst==0 )
8170: 7b 0a 20 20 20 20 69 66 28 20 70 53 6f 72 74 20  {.    if( pSort 
8180: 29 7b 0a 20 20 20 20 20 20 6e 50 72 65 66 69 78  ){.      nPrefix
8190: 52 65 67 20 3d 20 70 53 6f 72 74 2d 3e 70 4f 72  Reg = pSort->pOr
81a0: 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20  derBy->nExpr;.  
81b0: 20 20 20 20 69 66 28 20 21 28 70 53 6f 72 74 2d      if( !(pSort-
81c0: 3e 73 6f 72 74 46 6c 61 67 73 20 26 20 53 4f 52  >sortFlags & SOR
81d0: 54 46 4c 41 47 5f 55 73 65 53 6f 72 74 65 72 29  TFLAG_UseSorter)
81e0: 20 29 20 6e 50 72 65 66 69 78 52 65 67 2b 2b 3b   ) nPrefixReg++;
81f0: 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  .      pParse->n
8200: 4d 65 6d 20 2b 3d 20 6e 50 72 65 66 69 78 52 65  Mem += nPrefixRe
8210: 67 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 44 65  g;.    }.    pDe
8220: 73 74 2d 3e 69 53 64 73 74 20 3d 20 70 50 61 72  st->iSdst = pPar
8230: 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20  se->nMem+1;.    
8240: 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20  pParse->nMem += 
8250: 6e 52 65 73 75 6c 74 43 6f 6c 3b 0a 20 20 7d 65  nResultCol;.  }e
8260: 6c 73 65 20 69 66 28 20 70 44 65 73 74 2d 3e 69  lse if( pDest->i
8270: 53 64 73 74 2b 6e 52 65 73 75 6c 74 43 6f 6c 20  Sdst+nResultCol 
8280: 3e 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 29  > pParse->nMem )
8290: 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 69 73  {.    /* This is
82a0: 20 61 6e 20 65 72 72 6f 72 20 63 6f 6e 64 69 74   an error condit
82b0: 69 6f 6e 20 74 68 61 74 20 63 61 6e 20 72 65 73  ion that can res
82c0: 75 6c 74 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65  ult, for example
82d0: 2c 20 77 68 65 6e 20 61 20 53 45 4c 45 43 54 0a  , when a SELECT.
82e0: 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20 72 69      ** on the ri
82f0: 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20 6f 66  ght-hand side of
8300: 20 61 6e 20 49 4e 53 45 52 54 20 63 6f 6e 74 61   an INSERT conta
8310: 69 6e 73 20 6d 6f 72 65 20 72 65 73 75 6c 74 20  ins more result 
8320: 63 6f 6c 75 6d 6e 73 20 74 68 61 6e 0a 20 20 20  columns than.   
8330: 20 2a 2a 20 74 68 65 72 65 20 61 72 65 20 63 6f   ** there are co
8340: 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 74 61 62  lumns in the tab
8350: 6c 65 20 6f 6e 20 74 68 65 20 6c 65 66 74 2e 20  le on the left. 
8360: 20 54 68 65 20 65 72 72 6f 72 20 77 69 6c 6c 20   The error will 
8370: 62 65 20 63 61 75 67 68 74 0a 20 20 20 20 2a 2a  be caught.    **
8380: 20 61 6e 64 20 72 65 70 6f 72 74 65 64 20 6c 61   and reported la
8390: 74 65 72 2e 20 20 42 75 74 20 77 65 20 6e 65 65  ter.  But we nee
83a0: 64 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 65  d to make sure e
83b0: 6e 6f 75 67 68 20 6d 65 6d 6f 72 79 20 69 73 20  nough memory is 
83c0: 61 6c 6c 6f 63 61 74 65 64 0a 20 20 20 20 2a 2a  allocated.    **
83d0: 20 74 6f 20 61 76 6f 69 64 20 6f 74 68 65 72 20   to avoid other 
83e0: 73 70 75 72 69 6f 75 73 20 65 72 72 6f 72 73 20  spurious errors 
83f0: 69 6e 20 74 68 65 20 6d 65 61 6e 74 69 6d 65 2e  in the meantime.
8400: 20 2a 2f 0a 20 20 20 20 70 50 61 72 73 65 2d 3e   */.    pParse->
8410: 6e 4d 65 6d 20 2b 3d 20 6e 52 65 73 75 6c 74 43  nMem += nResultC
8420: 6f 6c 3b 0a 20 20 7d 0a 20 20 70 44 65 73 74 2d  ol;.  }.  pDest-
8430: 3e 6e 53 64 73 74 20 3d 20 6e 52 65 73 75 6c 74  >nSdst = nResult
8440: 43 6f 6c 3b 0a 20 20 72 65 67 4f 72 69 67 20 3d  Col;.  regOrig =
8450: 20 72 65 67 52 65 73 75 6c 74 20 3d 20 70 44 65   regResult = pDe
8460: 73 74 2d 3e 69 53 64 73 74 3b 0a 20 20 69 66 28  st->iSdst;.  if(
8470: 20 73 72 63 54 61 62 3e 3d 30 20 29 7b 0a 20 20   srcTab>=0 ){.  
8480: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 52 65    for(i=0; i<nRe
8490: 73 75 6c 74 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20  sultCol; i++){. 
84a0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
84b0: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c  AddOp3(v, OP_Col
84c0: 75 6d 6e 2c 20 73 72 63 54 61 62 2c 20 69 2c 20  umn, srcTab, i, 
84d0: 72 65 67 52 65 73 75 6c 74 2b 69 29 3b 0a 20 20  regResult+i);.  
84e0: 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
84f0: 28 76 2c 20 22 25 73 22 2c 20 70 2d 3e 70 45 4c  (v, "%s", p->pEL
8500: 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29  ist->a[i].zName)
8510: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  );.    }.  }else
8520: 20 69 66 28 20 65 44 65 73 74 21 3d 53 52 54 5f   if( eDest!=SRT_
8530: 45 78 69 73 74 73 20 29 7b 0a 23 69 66 64 65 66  Exists ){.#ifdef
8540: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53   SQLITE_ENABLE_S
8550: 4f 52 54 45 52 5f 52 45 46 45 52 45 4e 43 45 53  ORTER_REFERENCES
8560: 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70  .    ExprList *p
8570: 45 78 74 72 61 20 3d 20 30 3b 0a 23 65 6e 64 69  Extra = 0;.#endi
8580: 66 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20  f.    /* If the 
8590: 64 65 73 74 69 6e 61 74 69 6f 6e 20 69 73 20 61  destination is a
85a0: 6e 20 45 58 49 53 54 53 28 2e 2e 2e 29 20 65 78  n EXISTS(...) ex
85b0: 70 72 65 73 73 69 6f 6e 2c 20 74 68 65 20 61 63  pression, the ac
85c0: 74 75 61 6c 0a 20 20 20 20 2a 2a 20 76 61 6c 75  tual.    ** valu
85d0: 65 73 20 72 65 74 75 72 6e 65 64 20 62 79 20 74  es returned by t
85e0: 68 65 20 53 45 4c 45 43 54 20 61 72 65 20 6e 6f  he SELECT are no
85f0: 74 20 72 65 71 75 69 72 65 64 2e 0a 20 20 20 20  t required..    
8600: 2a 2f 0a 20 20 20 20 75 38 20 65 63 65 6c 46 6c  */.    u8 ecelFl
8610: 61 67 73 3b 20 20 20 20 2f 2a 20 22 65 63 65 6c  ags;    /* "ecel
8620: 22 20 69 73 20 61 6e 20 61 62 62 72 65 76 69 61  " is an abbrevia
8630: 74 69 6f 6e 20 6f 66 20 22 45 78 70 72 43 6f 64  tion of "ExprCod
8640: 65 45 78 70 72 4c 69 73 74 22 20 2a 2f 0a 20 20  eExprList" */.  
8650: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69    ExprList *pELi
8660: 73 74 3b 0a 20 20 20 20 69 66 28 20 65 44 65 73  st;.    if( eDes
8670: 74 3d 3d 53 52 54 5f 4d 65 6d 20 7c 7c 20 65 44  t==SRT_Mem || eD
8680: 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20  est==SRT_Output 
8690: 7c 7c 20 65 44 65 73 74 3d 3d 53 52 54 5f 43 6f  || eDest==SRT_Co
86a0: 72 6f 75 74 69 6e 65 20 29 7b 0a 20 20 20 20 20  routine ){.     
86b0: 20 65 63 65 6c 46 6c 61 67 73 20 3d 20 53 51 4c   ecelFlags = SQL
86c0: 49 54 45 5f 45 43 45 4c 5f 44 55 50 3b 0a 20 20  ITE_ECEL_DUP;.  
86d0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 65    }else{.      e
86e0: 63 65 6c 46 6c 61 67 73 20 3d 20 30 3b 0a 20 20  celFlags = 0;.  
86f0: 20 20 7d 0a 20 20 20 20 69 66 28 20 70 53 6f 72    }.    if( pSor
8700: 74 20 26 26 20 68 61 73 44 69 73 74 69 6e 63 74  t && hasDistinct
8710: 3d 3d 30 20 26 26 20 65 44 65 73 74 21 3d 53 52  ==0 && eDest!=SR
8720: 54 5f 45 70 68 65 6d 54 61 62 20 26 26 20 65 44  T_EphemTab && eD
8730: 65 73 74 21 3d 53 52 54 5f 54 61 62 6c 65 20 29  est!=SRT_Table )
8740: 7b 0a 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 65  {.      /* For e
8750: 61 63 68 20 65 78 70 72 65 73 73 69 6f 6e 20 69  ach expression i
8760: 6e 20 70 2d 3e 70 45 4c 69 73 74 20 74 68 61 74  n p->pEList that
8770: 20 69 73 20 61 20 63 6f 70 79 20 6f 66 20 61 6e   is a copy of an
8780: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 0a 20   expression in. 
8790: 20 20 20 20 20 2a 2a 20 74 68 65 20 4f 52 44 45       ** the ORDE
87a0: 52 20 42 59 20 63 6c 61 75 73 65 20 28 70 53 6f  R BY clause (pSo
87b0: 72 74 2d 3e 70 4f 72 64 65 72 42 79 29 2c 20 73  rt->pOrderBy), s
87c0: 65 74 20 74 68 65 20 61 73 73 6f 63 69 61 74 65  et the associate
87d0: 64 20 0a 20 20 20 20 20 20 2a 2a 20 69 4f 72 64  d .      ** iOrd
87e0: 65 72 42 79 43 6f 6c 20 76 61 6c 75 65 20 74 6f  erByCol value to
87f0: 20 6f 6e 65 20 6d 6f 72 65 20 74 68 61 6e 20 74   one more than t
8800: 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20  he index of the 
8810: 4f 52 44 45 52 20 42 59 20 0a 20 20 20 20 20 20  ORDER BY .      
8820: 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 77 69  ** expression wi
8830: 74 68 69 6e 20 74 68 65 20 73 6f 72 74 2d 6b 65  thin the sort-ke
8840: 79 20 74 68 61 74 20 70 75 73 68 4f 6e 74 6f 53  y that pushOntoS
8850: 6f 72 74 65 72 28 29 20 77 69 6c 6c 20 67 65 6e  orter() will gen
8860: 65 72 61 74 65 2e 0a 20 20 20 20 20 20 2a 2a 20  erate..      ** 
8870: 54 68 69 73 20 61 6c 6c 6f 77 73 20 74 68 65 20  This allows the 
8880: 70 2d 3e 70 45 4c 69 73 74 20 66 69 65 6c 64 20  p->pEList field 
8890: 74 6f 20 62 65 20 6f 6d 69 74 74 65 64 20 66 72  to be omitted fr
88a0: 6f 6d 20 74 68 65 20 73 6f 72 74 65 64 20 72 65  om the sorted re
88b0: 63 6f 72 64 2c 0a 20 20 20 20 20 20 2a 2a 20 73  cord,.      ** s
88c0: 61 76 69 6e 67 20 73 70 61 63 65 20 61 6e 64 20  aving space and 
88d0: 43 50 55 20 63 79 63 6c 65 73 2e 20 20 2a 2f 0a  CPU cycles.  */.
88e0: 20 20 20 20 20 20 65 63 65 6c 46 6c 61 67 73 20        ecelFlags 
88f0: 7c 3d 20 28 53 51 4c 49 54 45 5f 45 43 45 4c 5f  |= (SQLITE_ECEL_
8900: 4f 4d 49 54 52 45 46 7c 53 51 4c 49 54 45 5f 45  OMITREF|SQLITE_E
8910: 43 45 4c 5f 52 45 46 29 3b 0a 0a 20 20 20 20 20  CEL_REF);..     
8920: 20 66 6f 72 28 69 3d 70 53 6f 72 74 2d 3e 6e 4f   for(i=pSort->nO
8930: 42 53 61 74 3b 20 69 3c 70 53 6f 72 74 2d 3e 70  BSat; i<pSort->p
8940: 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 20  OrderBy->nExpr; 
8950: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  i++){.        in
8960: 74 20 6a 3b 0a 20 20 20 20 20 20 20 20 69 66 28  t j;.        if(
8970: 20 28 6a 20 3d 20 70 53 6f 72 74 2d 3e 70 4f 72   (j = pSort->pOr
8980: 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 75 2e 78 2e  derBy->a[i].u.x.
8990: 69 4f 72 64 65 72 42 79 43 6f 6c 29 3e 30 20 29  iOrderByCol)>0 )
89a0: 7b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70  {.          p->p
89b0: 45 4c 69 73 74 2d 3e 61 5b 6a 2d 31 5d 2e 75 2e  EList->a[j-1].u.
89c0: 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 20 3d 20  x.iOrderByCol = 
89d0: 69 2b 31 2d 70 53 6f 72 74 2d 3e 6e 4f 42 53 61  i+1-pSort->nOBSa
89e0: 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  t;.        }.   
89f0: 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49     }.#ifdef SQLI
8a00: 54 45 5f 45 4e 41 42 4c 45 5f 53 4f 52 54 45 52  TE_ENABLE_SORTER
8a10: 5f 52 45 46 45 52 45 4e 43 45 53 0a 20 20 20 20  _REFERENCES.    
8a20: 20 20 73 65 6c 65 63 74 45 78 70 72 44 65 66 65    selectExprDefe
8a30: 72 28 70 50 61 72 73 65 2c 20 70 53 6f 72 74 2c  r(pParse, pSort,
8a40: 20 70 2d 3e 70 45 4c 69 73 74 2c 20 26 70 45 78   p->pEList, &pEx
8a50: 74 72 61 29 3b 0a 20 20 20 20 20 20 69 66 28 20  tra);.      if( 
8a60: 70 45 78 74 72 61 20 26 26 20 70 50 61 72 73 65  pExtra && pParse
8a70: 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
8a80: 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ed==0 ){.       
8a90: 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72 65   /* If there are
8aa0: 20 61 6e 79 20 65 78 74 72 61 20 50 4b 20 63 6f   any extra PK co
8ab0: 6c 75 6d 6e 73 20 74 6f 20 61 64 64 20 74 6f 20  lumns to add to 
8ac0: 74 68 65 20 73 6f 72 74 65 72 20 72 65 63 6f 72  the sorter recor
8ad0: 64 73 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20 61  ds,.        ** a
8ae0: 6c 6c 6f 63 61 74 65 20 65 78 74 72 61 20 6d 65  llocate extra me
8af0: 6d 6f 72 79 20 63 65 6c 6c 73 20 61 6e 64 20 61  mory cells and a
8b00: 64 6a 75 73 74 20 74 68 65 20 4f 70 65 6e 45 70  djust the OpenEp
8b10: 68 65 6d 65 72 61 6c 20 0a 20 20 20 20 20 20 20  hemeral .       
8b20: 20 2a 2a 20 69 6e 73 74 72 75 63 74 69 6f 6e 20   ** instruction 
8b30: 74 6f 20 61 63 63 6f 75 6e 74 20 66 6f 72 20 74  to account for t
8b40: 68 65 20 6c 61 72 67 65 72 20 72 65 63 6f 72 64  he larger record
8b50: 73 2e 20 54 68 69 73 20 69 73 20 6f 6e 6c 79 0a  s. This is only.
8b60: 20 20 20 20 20 20 20 20 2a 2a 20 72 65 71 75 69          ** requi
8b70: 72 65 64 20 69 66 20 74 68 65 72 65 20 61 72 65  red if there are
8b80: 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 57 49 54   one or more WIT
8b90: 48 4f 55 54 20 52 4f 57 49 44 20 74 61 62 6c 65  HOUT ROWID table
8ba0: 73 20 77 69 74 68 0a 20 20 20 20 20 20 20 20 2a  s with.        *
8bb0: 2a 20 63 6f 6d 70 6f 73 69 74 65 20 70 72 69 6d  * composite prim
8bc0: 61 72 79 20 6b 65 79 73 20 69 6e 20 74 68 65 20  ary keys in the 
8bd0: 53 6f 72 74 43 74 78 2e 61 44 65 66 65 72 5b 5d  SortCtx.aDefer[]
8be0: 20 61 72 72 61 79 2e 20 20 2a 2f 0a 20 20 20 20   array.  */.    
8bf0: 20 20 20 20 56 64 62 65 4f 70 20 2a 70 4f 70 20      VdbeOp *pOp 
8c00: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 47 65 74  = sqlite3VdbeGet
8c10: 4f 70 28 76 2c 20 70 53 6f 72 74 2d 3e 61 64 64  Op(v, pSort->add
8c20: 72 53 6f 72 74 49 6e 64 65 78 29 3b 0a 20 20 20  rSortIndex);.   
8c30: 20 20 20 20 20 70 4f 70 2d 3e 70 32 20 2b 3d 20       pOp->p2 += 
8c40: 28 70 45 78 74 72 61 2d 3e 6e 45 78 70 72 20 2d  (pExtra->nExpr -
8c50: 20 70 53 6f 72 74 2d 3e 6e 44 65 66 65 72 29 3b   pSort->nDefer);
8c60: 0a 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 70 34  .        pOp->p4
8c70: 2e 70 4b 65 79 49 6e 66 6f 2d 3e 6e 41 6c 6c 46  .pKeyInfo->nAllF
8c80: 69 65 6c 64 20 2b 3d 20 28 70 45 78 74 72 61 2d  ield += (pExtra-
8c90: 3e 6e 45 78 70 72 20 2d 20 70 53 6f 72 74 2d 3e  >nExpr - pSort->
8ca0: 6e 44 65 66 65 72 29 3b 0a 20 20 20 20 20 20 20  nDefer);.       
8cb0: 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d   pParse->nMem +=
8cc0: 20 70 45 78 74 72 61 2d 3e 6e 45 78 70 72 3b 0a   pExtra->nExpr;.
8cd0: 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a        }.#endif..
8ce0: 20 20 20 20 20 20 2f 2a 20 41 64 6a 75 73 74 20        /* Adjust 
8cf0: 6e 52 65 73 75 6c 74 43 6f 6c 20 74 6f 20 61 63  nResultCol to ac
8d00: 63 6f 75 6e 74 20 66 6f 72 20 63 6f 6c 75 6d 6e  count for column
8d10: 73 20 74 68 61 74 20 61 72 65 20 6f 6d 69 74 74  s that are omitt
8d20: 65 64 0a 20 20 20 20 20 20 2a 2a 20 66 72 6f 6d  ed.      ** from
8d30: 20 74 68 65 20 73 6f 72 74 65 72 20 62 79 20 74   the sorter by t
8d40: 68 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73  he optimizations
8d50: 20 69 6e 20 74 68 69 73 20 62 72 61 6e 63 68 20   in this branch 
8d60: 2a 2f 0a 20 20 20 20 20 20 70 45 4c 69 73 74 20  */.      pEList 
8d70: 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 20  = p->pEList;.   
8d80: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 45     for(i=0; i<pE
8d90: 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b  List->nExpr; i++
8da0: 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  ){.        if( p
8db0: 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 75 2e 78 2e  EList->a[i].u.x.
8dc0: 69 4f 72 64 65 72 42 79 43 6f 6c 3e 30 0a 23 69  iOrderByCol>0.#i
8dd0: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
8de0: 4c 45 5f 53 4f 52 54 45 52 5f 52 45 46 45 52 45  LE_SORTER_REFERE
8df0: 4e 43 45 53 0a 20 20 20 20 20 20 20 20 20 7c 7c  NCES.         ||
8e00: 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 62 53   pEList->a[i].bS
8e10: 6f 72 74 65 72 52 65 66 0a 23 65 6e 64 69 66 0a  orterRef.#endif.
8e20: 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20          ){.     
8e30: 20 20 20 20 20 6e 52 65 73 75 6c 74 43 6f 6c 2d       nResultCol-
8e40: 2d 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 67  -;.          reg
8e50: 4f 72 69 67 20 3d 20 30 3b 0a 20 20 20 20 20 20  Orig = 0;.      
8e60: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20    }.      }..   
8e70: 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67     testcase( reg
8e80: 4f 72 69 67 20 29 3b 0a 20 20 20 20 20 20 74 65  Orig );.      te
8e90: 73 74 63 61 73 65 28 20 65 44 65 73 74 3d 3d 53  stcase( eDest==S
8ea0: 52 54 5f 53 65 74 20 29 3b 0a 20 20 20 20 20 20  RT_Set );.      
8eb0: 74 65 73 74 63 61 73 65 28 20 65 44 65 73 74 3d  testcase( eDest=
8ec0: 3d 53 52 54 5f 4d 65 6d 20 29 3b 0a 20 20 20 20  =SRT_Mem );.    
8ed0: 20 20 74 65 73 74 63 61 73 65 28 20 65 44 65 73    testcase( eDes
8ee0: 74 3d 3d 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65  t==SRT_Coroutine
8ef0: 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
8f00: 73 65 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 4f  se( eDest==SRT_O
8f10: 75 74 70 75 74 20 29 3b 0a 20 20 20 20 20 20 61  utput );.      a
8f20: 73 73 65 72 74 28 20 65 44 65 73 74 3d 3d 53 52  ssert( eDest==SR
8f30: 54 5f 53 65 74 20 7c 7c 20 65 44 65 73 74 3d 3d  T_Set || eDest==
8f40: 53 52 54 5f 4d 65 6d 20 0a 20 20 20 20 20 20 20  SRT_Mem .       
8f50: 20 20 20 20 7c 7c 20 65 44 65 73 74 3d 3d 53 52      || eDest==SR
8f60: 54 5f 43 6f 72 6f 75 74 69 6e 65 20 7c 7c 20 65  T_Coroutine || e
8f70: 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74  Dest==SRT_Output
8f80: 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 52   );.    }.    sR
8f90: 6f 77 4c 6f 61 64 49 6e 66 6f 2e 72 65 67 52 65  owLoadInfo.regRe
8fa0: 73 75 6c 74 20 3d 20 72 65 67 52 65 73 75 6c 74  sult = regResult
8fb0: 3b 0a 20 20 20 20 73 52 6f 77 4c 6f 61 64 49 6e  ;.    sRowLoadIn
8fc0: 66 6f 2e 65 63 65 6c 46 6c 61 67 73 20 3d 20 65  fo.ecelFlags = e
8fd0: 63 65 6c 46 6c 61 67 73 3b 0a 23 69 66 64 65 66  celFlags;.#ifdef
8fe0: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53   SQLITE_ENABLE_S
8ff0: 4f 52 54 45 52 5f 52 45 46 45 52 45 4e 43 45 53  ORTER_REFERENCES
9000: 0a 20 20 20 20 73 52 6f 77 4c 6f 61 64 49 6e 66  .    sRowLoadInf
9010: 6f 2e 70 45 78 74 72 61 20 3d 20 70 45 78 74 72  o.pExtra = pExtr
9020: 61 3b 0a 20 20 20 20 73 52 6f 77 4c 6f 61 64 49  a;.    sRowLoadI
9030: 6e 66 6f 2e 72 65 67 45 78 74 72 61 52 65 73 75  nfo.regExtraResu
9040: 6c 74 20 3d 20 72 65 67 52 65 73 75 6c 74 20 2b  lt = regResult +
9050: 20 6e 52 65 73 75 6c 74 43 6f 6c 3b 0a 20 20 20   nResultCol;.   
9060: 20 69 66 28 20 70 45 78 74 72 61 20 29 20 6e 52   if( pExtra ) nR
9070: 65 73 75 6c 74 43 6f 6c 20 2b 3d 20 70 45 78 74  esultCol += pExt
9080: 72 61 2d 3e 6e 45 78 70 72 3b 0a 23 65 6e 64 69  ra->nExpr;.#endi
9090: 66 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 4c 69  f.    if( p->iLi
90a0: 6d 69 74 0a 20 20 20 20 20 26 26 20 28 65 63 65  mit.     && (ece
90b0: 6c 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  lFlags & SQLITE_
90c0: 45 43 45 4c 5f 4f 4d 49 54 52 45 46 29 21 3d 30  ECEL_OMITREF)!=0
90d0: 20 0a 20 20 20 20 20 26 26 20 6e 50 72 65 66 69   .     && nPrefi
90e0: 78 52 65 67 3e 30 0a 20 20 20 20 29 7b 0a 20 20  xReg>0.    ){.  
90f0: 20 20 20 20 61 73 73 65 72 74 28 20 70 53 6f 72      assert( pSor
9100: 74 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 73  t!=0 );.      as
9110: 73 65 72 74 28 20 68 61 73 44 69 73 74 69 6e 63  sert( hasDistinc
9120: 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 53  t==0 );.      pS
9130: 6f 72 74 2d 3e 70 44 65 66 65 72 72 65 64 52 6f  ort->pDeferredRo
9140: 77 4c 6f 61 64 20 3d 20 26 73 52 6f 77 4c 6f 61  wLoad = &sRowLoa
9150: 64 49 6e 66 6f 3b 0a 20 20 20 20 20 20 72 65 67  dInfo;.      reg
9160: 4f 72 69 67 20 3d 20 30 3b 0a 20 20 20 20 7d 65  Orig = 0;.    }e
9170: 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 6e 65 72  lse{.      inner
9180: 4c 6f 6f 70 4c 6f 61 64 52 6f 77 28 70 50 61 72  LoopLoadRow(pPar
9190: 73 65 2c 20 70 2c 20 26 73 52 6f 77 4c 6f 61 64  se, p, &sRowLoad
91a0: 49 6e 66 6f 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  Info);.    }.  }
91b0: 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 44 49  ..  /* If the DI
91c0: 53 54 49 4e 43 54 20 6b 65 79 77 6f 72 64 20 77  STINCT keyword w
91d0: 61 73 20 70 72 65 73 65 6e 74 20 6f 6e 20 74 68  as present on th
91e0: 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  e SELECT stateme
91f0: 6e 74 0a 20 20 2a 2a 20 61 6e 64 20 74 68 69 73  nt.  ** and this
9200: 20 72 6f 77 20 68 61 73 20 62 65 65 6e 20 73 65   row has been se
9210: 65 6e 20 62 65 66 6f 72 65 2c 20 74 68 65 6e 20  en before, then 
9220: 64 6f 20 6e 6f 74 20 6d 61 6b 65 20 74 68 69 73  do not make this
9230: 20 72 6f 77 0a 20 20 2a 2a 20 70 61 72 74 20 6f   row.  ** part o
9240: 66 20 74 68 65 20 72 65 73 75 6c 74 2e 0a 20 20  f the result..  
9250: 2a 2f 0a 20 20 69 66 28 20 68 61 73 44 69 73 74  */.  if( hasDist
9260: 69 6e 63 74 20 29 7b 0a 20 20 20 20 73 77 69 74  inct ){.    swit
9270: 63 68 28 20 70 44 69 73 74 69 6e 63 74 2d 3e 65  ch( pDistinct->e
9280: 54 6e 63 74 54 79 70 65 20 29 7b 0a 20 20 20 20  TnctType ){.    
9290: 20 20 63 61 73 65 20 57 48 45 52 45 5f 44 49 53    case WHERE_DIS
92a0: 54 49 4e 43 54 5f 4f 52 44 45 52 45 44 3a 20 7b  TINCT_ORDERED: {
92b0: 0a 20 20 20 20 20 20 20 20 56 64 62 65 4f 70 20  .        VdbeOp 
92c0: 2a 70 4f 70 3b 20 20 20 20 20 20 20 20 20 20 20  *pOp;           
92d0: 20 2f 2a 20 4e 6f 20 6c 6f 6e 67 65 72 20 72 65   /* No longer re
92e0: 71 75 69 72 65 64 20 4f 70 65 6e 45 70 68 65 6d  quired OpenEphem
92f0: 65 72 61 6c 20 69 6e 73 74 72 2e 20 2a 2f 0a 20  eral instr. */. 
9300: 20 20 20 20 20 20 20 69 6e 74 20 69 4a 75 6d 70         int iJump
9310: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
9320: 2a 20 4a 75 6d 70 20 64 65 73 74 69 6e 61 74 69  * Jump destinati
9330: 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e  on */.        in
9340: 74 20 72 65 67 50 72 65 76 3b 20 20 20 20 20 20  t regPrev;      
9350: 20 20 20 20 20 20 2f 2a 20 50 72 65 76 69 6f 75        /* Previou
9360: 73 20 72 6f 77 20 63 6f 6e 74 65 6e 74 20 2a 2f  s row content */
9370: 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c  ..        /* All
9380: 6f 63 61 74 65 20 73 70 61 63 65 20 66 6f 72 20  ocate space for 
9390: 74 68 65 20 70 72 65 76 69 6f 75 73 20 72 6f 77  the previous row
93a0: 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 65 67 50   */.        regP
93b0: 72 65 76 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d  rev = pParse->nM
93c0: 65 6d 2b 31 3b 0a 20 20 20 20 20 20 20 20 70 50  em+1;.        pP
93d0: 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 52  arse->nMem += nR
93e0: 65 73 75 6c 74 43 6f 6c 3b 0a 0a 20 20 20 20 20  esultCol;..     
93f0: 20 20 20 2f 2a 20 43 68 61 6e 67 65 20 74 68 65     /* Change the
9400: 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61   OP_OpenEphemera
9410: 6c 20 63 6f 64 65 64 20 65 61 72 6c 69 65 72 20  l coded earlier 
9420: 74 6f 20 61 6e 20 4f 50 5f 4e 75 6c 6c 0a 20 20  to an OP_Null.  
9430: 20 20 20 20 20 20 2a 2a 20 73 65 74 73 20 74 68        ** sets th
9440: 65 20 4d 45 4d 5f 43 6c 65 61 72 65 64 20 62 69  e MEM_Cleared bi
9450: 74 20 6f 6e 20 74 68 65 20 66 69 72 73 74 20 72  t on the first r
9460: 65 67 69 73 74 65 72 20 6f 66 20 74 68 65 0a 20  egister of the. 
9470: 20 20 20 20 20 20 20 2a 2a 20 70 72 65 76 69 6f         ** previo
9480: 75 73 20 76 61 6c 75 65 2e 20 20 54 68 69 73 20  us value.  This 
9490: 77 69 6c 6c 20 63 61 75 73 65 20 74 68 65 20 4f  will cause the O
94a0: 50 5f 4e 65 20 62 65 6c 6f 77 20 74 6f 20 61 6c  P_Ne below to al
94b0: 77 61 79 73 0a 20 20 20 20 20 20 20 20 2a 2a 20  ways.        ** 
94c0: 66 61 69 6c 20 6f 6e 20 74 68 65 20 66 69 72 73  fail on the firs
94d0: 74 20 69 74 65 72 61 74 69 6f 6e 20 6f 66 20 74  t iteration of t
94e0: 68 65 20 6c 6f 6f 70 20 65 76 65 6e 20 69 66 20  he loop even if 
94f0: 74 68 65 20 66 69 72 73 74 0a 20 20 20 20 20 20  the first.      
9500: 20 20 2a 2a 20 72 6f 77 20 69 73 20 61 6c 6c 20    ** row is all 
9510: 4e 55 4c 4c 73 2e 0a 20 20 20 20 20 20 20 20 2a  NULLs..        *
9520: 2f 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  /.        sqlite
9530: 33 56 64 62 65 43 68 61 6e 67 65 54 6f 4e 6f 6f  3VdbeChangeToNoo
9540: 70 28 76 2c 20 70 44 69 73 74 69 6e 63 74 2d 3e  p(v, pDistinct->
9550: 61 64 64 72 54 6e 63 74 29 3b 0a 20 20 20 20 20  addrTnct);.     
9560: 20 20 20 70 4f 70 20 3d 20 73 71 6c 69 74 65 33     pOp = sqlite3
9570: 56 64 62 65 47 65 74 4f 70 28 76 2c 20 70 44 69  VdbeGetOp(v, pDi
9580: 73 74 69 6e 63 74 2d 3e 61 64 64 72 54 6e 63 74  stinct->addrTnct
9590: 29 3b 0a 20 20 20 20 20 20 20 20 70 4f 70 2d 3e  );.        pOp->
95a0: 6f 70 63 6f 64 65 20 3d 20 4f 50 5f 4e 75 6c 6c  opcode = OP_Null
95b0: 3b 0a 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 70  ;.        pOp->p
95c0: 31 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 70  1 = 1;.        p
95d0: 4f 70 2d 3e 70 32 20 3d 20 72 65 67 50 72 65 76  Op->p2 = regPrev
95e0: 3b 0a 0a 20 20 20 20 20 20 20 20 69 4a 75 6d 70  ;..        iJump
95f0: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75   = sqlite3VdbeCu
9600: 72 72 65 6e 74 41 64 64 72 28 76 29 20 2b 20 6e  rrentAddr(v) + n
9610: 52 65 73 75 6c 74 43 6f 6c 3b 0a 20 20 20 20 20  ResultCol;.     
9620: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 52     for(i=0; i<nR
9630: 65 73 75 6c 74 43 6f 6c 3b 20 69 2b 2b 29 7b 0a  esultCol; i++){.
9640: 20 20 20 20 20 20 20 20 20 20 43 6f 6c 6c 53 65            CollSe
9650: 71 20 2a 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74  q *pColl = sqlit
9660: 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50  e3ExprCollSeq(pP
9670: 61 72 73 65 2c 20 70 2d 3e 70 45 4c 69 73 74 2d  arse, p->pEList-
9680: 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20  >a[i].pExpr);.  
9690: 20 20 20 20 20 20 20 20 69 66 28 20 69 3c 6e 52          if( i<nR
96a0: 65 73 75 6c 74 43 6f 6c 2d 31 20 29 7b 0a 20 20  esultCol-1 ){.  
96b0: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
96c0: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
96d0: 50 5f 4e 65 2c 20 72 65 67 52 65 73 75 6c 74 2b  P_Ne, regResult+
96e0: 69 2c 20 69 4a 75 6d 70 2c 20 72 65 67 50 72 65  i, iJump, regPre
96f0: 76 2b 69 29 3b 0a 20 20 20 20 20 20 20 20 20 20  v+i);.          
9700: 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76    VdbeCoverage(v
9710: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c  );.          }el
9720: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
9730: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
9740: 33 28 76 2c 20 4f 50 5f 45 71 2c 20 72 65 67 52  3(v, OP_Eq, regR
9750: 65 73 75 6c 74 2b 69 2c 20 69 43 6f 6e 74 69 6e  esult+i, iContin
9760: 75 65 2c 20 72 65 67 50 72 65 76 2b 69 29 3b 0a  ue, regPrev+i);.
9770: 20 20 20 20 20 20 20 20 20 20 20 20 56 64 62 65              Vdbe
9780: 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
9790: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
97a0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
97b0: 68 61 6e 67 65 50 34 28 76 2c 20 2d 31 2c 20 28  hangeP4(v, -1, (
97c0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 70 43 6f  const char *)pCo
97d0: 6c 6c 2c 20 50 34 5f 43 4f 4c 4c 53 45 51 29 3b  ll, P4_COLLSEQ);
97e0: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
97f0: 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76  e3VdbeChangeP5(v
9800: 2c 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 29  , SQLITE_NULLEQ)
9810: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
9820: 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
9830: 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
9840: 64 72 28 76 29 3d 3d 69 4a 75 6d 70 20 7c 7c 20  dr(v)==iJump || 
9850: 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c  pParse->db->mall
9860: 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20  ocFailed );.    
9870: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
9880: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 70 79  ddOp3(v, OP_Copy
9890: 2c 20 72 65 67 52 65 73 75 6c 74 2c 20 72 65 67  , regResult, reg
98a0: 50 72 65 76 2c 20 6e 52 65 73 75 6c 74 43 6f 6c  Prev, nResultCol
98b0: 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65  -1);.        bre
98c0: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  ak;.      }..   
98d0: 20 20 20 63 61 73 65 20 57 48 45 52 45 5f 44 49     case WHERE_DI
98e0: 53 54 49 4e 43 54 5f 55 4e 49 51 55 45 3a 20 7b  STINCT_UNIQUE: {
98f0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
9900: 56 64 62 65 43 68 61 6e 67 65 54 6f 4e 6f 6f 70  VdbeChangeToNoop
9910: 28 76 2c 20 70 44 69 73 74 69 6e 63 74 2d 3e 61  (v, pDistinct->a
9920: 64 64 72 54 6e 63 74 29 3b 0a 20 20 20 20 20 20  ddrTnct);.      
9930: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
9940: 0a 0a 20 20 20 20 20 20 64 65 66 61 75 6c 74 3a  ..      default:
9950: 20 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72   {.        asser
9960: 74 28 20 70 44 69 73 74 69 6e 63 74 2d 3e 65 54  t( pDistinct->eT
9970: 6e 63 74 54 79 70 65 3d 3d 57 48 45 52 45 5f 44  nctType==WHERE_D
9980: 49 53 54 49 4e 43 54 5f 55 4e 4f 52 44 45 52 45  ISTINCT_UNORDERE
9990: 44 20 29 3b 0a 20 20 20 20 20 20 20 20 63 6f 64  D );.        cod
99a0: 65 44 69 73 74 69 6e 63 74 28 70 50 61 72 73 65  eDistinct(pParse
99b0: 2c 20 70 44 69 73 74 69 6e 63 74 2d 3e 74 61 62  , pDistinct->tab
99c0: 54 6e 63 74 2c 20 69 43 6f 6e 74 69 6e 75 65 2c  Tnct, iContinue,
99d0: 20 6e 52 65 73 75 6c 74 43 6f 6c 2c 0a 20 20 20   nResultCol,.   
99e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
99f0: 20 20 72 65 67 52 65 73 75 6c 74 29 3b 0a 20 20    regResult);.  
9a00: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
9a10: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
9a20: 66 28 20 70 53 6f 72 74 3d 3d 30 20 29 7b 0a 20  f( pSort==0 ){. 
9a30: 20 20 20 20 20 63 6f 64 65 4f 66 66 73 65 74 28       codeOffset(
9a40: 76 2c 20 70 2d 3e 69 4f 66 66 73 65 74 2c 20 69  v, p->iOffset, i
9a50: 43 6f 6e 74 69 6e 75 65 29 3b 0a 20 20 20 20 7d  Continue);.    }
9a60: 0a 20 20 7d 0a 0a 20 20 73 77 69 74 63 68 28 20  .  }..  switch( 
9a70: 65 44 65 73 74 20 29 7b 0a 20 20 20 20 2f 2a 20  eDest ){.    /* 
9a80: 49 6e 20 74 68 69 73 20 6d 6f 64 65 2c 20 77 72  In this mode, wr
9a90: 69 74 65 20 65 61 63 68 20 71 75 65 72 79 20 72  ite each query r
9aa0: 65 73 75 6c 74 20 74 6f 20 74 68 65 20 6b 65 79  esult to the key
9ab0: 20 6f 66 20 74 68 65 20 74 65 6d 70 6f 72 61 72   of the temporar
9ac0: 79 0a 20 20 20 20 2a 2a 20 74 61 62 6c 65 20 69  y.    ** table i
9ad0: 50 61 72 6d 2e 0a 20 20 20 20 2a 2f 0a 23 69 66  Parm..    */.#if
9ae0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
9af0: 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54  _COMPOUND_SELECT
9b00: 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 55 6e  .    case SRT_Un
9b10: 69 6f 6e 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74  ion: {.      int
9b20: 20 72 31 3b 0a 20 20 20 20 20 20 72 31 20 3d 20   r1;.      r1 = 
9b30: 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65  sqlite3GetTempRe
9b40: 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  g(pParse);.     
9b50: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
9b60: 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63  p3(v, OP_MakeRec
9b70: 6f 72 64 2c 20 72 65 67 52 65 73 75 6c 74 2c 20  ord, regResult, 
9b80: 6e 52 65 73 75 6c 74 43 6f 6c 2c 20 72 31 29 3b  nResultCol, r1);
9b90: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
9ba0: 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f  beAddOp4Int(v, O
9bb0: 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 69 50 61  P_IdxInsert, iPa
9bc0: 72 6d 2c 20 72 31 2c 20 72 65 67 52 65 73 75 6c  rm, r1, regResul
9bd0: 74 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 29 3b 0a  t, nResultCol);.
9be0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c        sqlite3Rel
9bf0: 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
9c00: 73 65 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 62  se, r1);.      b
9c10: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  reak;.    }..   
9c20: 20 2f 2a 20 43 6f 6e 73 74 72 75 63 74 20 61 20   /* Construct a 
9c30: 72 65 63 6f 72 64 20 66 72 6f 6d 20 74 68 65 20  record from the 
9c40: 71 75 65 72 79 20 72 65 73 75 6c 74 2c 20 62 75  query result, bu
9c50: 74 20 69 6e 73 74 65 61 64 20 6f 66 0a 20 20 20  t instead of.   
9c60: 20 2a 2a 20 73 61 76 69 6e 67 20 74 68 61 74 20   ** saving that 
9c70: 72 65 63 6f 72 64 2c 20 75 73 65 20 69 74 20 61  record, use it a
9c80: 73 20 61 20 6b 65 79 20 74 6f 20 64 65 6c 65 74  s a key to delet
9c90: 65 20 65 6c 65 6d 65 6e 74 73 20 66 72 6f 6d 0a  e elements from.
9ca0: 20 20 20 20 2a 2a 20 74 68 65 20 74 65 6d 70 6f      ** the tempo
9cb0: 72 61 72 79 20 74 61 62 6c 65 20 69 50 61 72 6d  rary table iParm
9cc0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73  ..    */.    cas
9cd0: 65 20 53 52 54 5f 45 78 63 65 70 74 3a 20 7b 0a  e SRT_Except: {.
9ce0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
9cf0: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 64  eAddOp3(v, OP_Id
9d00: 78 44 65 6c 65 74 65 2c 20 69 50 61 72 6d 2c 20  xDelete, iParm, 
9d10: 72 65 67 52 65 73 75 6c 74 2c 20 6e 52 65 73 75  regResult, nResu
9d20: 6c 74 43 6f 6c 29 3b 0a 20 20 20 20 20 20 62 72  ltCol);.      br
9d30: 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  eak;.    }.#endi
9d40: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
9d50: 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54  _COMPOUND_SELECT
9d60: 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 53 74 6f 72   */..    /* Stor
9d70: 65 20 74 68 65 20 72 65 73 75 6c 74 20 61 73 20  e the result as 
9d80: 64 61 74 61 20 75 73 69 6e 67 20 61 20 75 6e 69  data using a uni
9d90: 71 75 65 20 6b 65 79 2e 0a 20 20 20 20 2a 2f 0a  que key..    */.
9da0: 20 20 20 20 63 61 73 65 20 53 52 54 5f 46 69 66      case SRT_Fif
9db0: 6f 3a 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f  o:.    case SRT_
9dc0: 44 69 73 74 46 69 66 6f 3a 0a 20 20 20 20 63 61  DistFifo:.    ca
9dd0: 73 65 20 53 52 54 5f 54 61 62 6c 65 3a 0a 20 20  se SRT_Table:.  
9de0: 20 20 63 61 73 65 20 53 52 54 5f 45 70 68 65 6d    case SRT_Ephem
9df0: 54 61 62 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74  Tab: {.      int
9e00: 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74   r1 = sqlite3Get
9e10: 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65  TempRange(pParse
9e20: 2c 20 6e 50 72 65 66 69 78 52 65 67 2b 31 29 3b  , nPrefixReg+1);
9e30: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
9e40: 20 65 44 65 73 74 3d 3d 53 52 54 5f 54 61 62 6c   eDest==SRT_Tabl
9e50: 65 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  e );.      testc
9e60: 61 73 65 28 20 65 44 65 73 74 3d 3d 53 52 54 5f  ase( eDest==SRT_
9e70: 45 70 68 65 6d 54 61 62 20 29 3b 0a 20 20 20 20  EphemTab );.    
9e80: 20 20 74 65 73 74 63 61 73 65 28 20 65 44 65 73    testcase( eDes
9e90: 74 3d 3d 53 52 54 5f 46 69 66 6f 20 29 3b 0a 20  t==SRT_Fifo );. 
9ea0: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 65       testcase( e
9eb0: 44 65 73 74 3d 3d 53 52 54 5f 44 69 73 74 46 69  Dest==SRT_DistFi
9ec0: 66 6f 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  fo );.      sqli
9ed0: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
9ee0: 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20   OP_MakeRecord, 
9ef0: 72 65 67 52 65 73 75 6c 74 2c 20 6e 52 65 73 75  regResult, nResu
9f00: 6c 74 43 6f 6c 2c 20 72 31 2b 6e 50 72 65 66 69  ltCol, r1+nPrefi
9f10: 78 52 65 67 29 3b 0a 23 69 66 6e 64 65 66 20 53  xReg);.#ifndef S
9f20: 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 54 45 0a 20  QLITE_OMIT_CTE. 
9f30: 20 20 20 20 20 69 66 28 20 65 44 65 73 74 3d 3d       if( eDest==
9f40: 53 52 54 5f 44 69 73 74 46 69 66 6f 20 29 7b 0a  SRT_DistFifo ){.
9f50: 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68          /* If th
9f60: 65 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 69 73  e destination is
9f70: 20 44 69 73 74 46 69 66 6f 2c 20 74 68 65 6e 20   DistFifo, then 
9f80: 63 75 72 73 6f 72 20 28 69 50 61 72 6d 2b 31 29  cursor (iParm+1)
9f90: 20 69 73 20 6f 70 65 6e 0a 20 20 20 20 20 20 20   is open.       
9fa0: 20 2a 2a 20 6f 6e 20 61 6e 20 65 70 68 65 6d 65   ** on an epheme
9fb0: 72 61 6c 20 69 6e 64 65 78 2e 20 49 66 20 74 68  ral index. If th
9fc0: 65 20 63 75 72 72 65 6e 74 20 72 6f 77 20 69 73  e current row is
9fd0: 20 61 6c 72 65 61 64 79 20 70 72 65 73 65 6e 74   already present
9fe0: 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 20 74  .        ** in t
9ff0: 68 65 20 69 6e 64 65 78 2c 20 64 6f 20 6e 6f 74  he index, do not
a000: 20 77 72 69 74 65 20 69 74 20 74 6f 20 74 68 65   write it to the
a010: 20 6f 75 74 70 75 74 2e 20 49 66 20 6e 6f 74 2c   output. If not,
a020: 20 61 64 64 20 74 68 65 0a 20 20 20 20 20 20 20   add the.       
a030: 20 2a 2a 20 63 75 72 72 65 6e 74 20 72 6f 77 20   ** current row 
a040: 74 6f 20 74 68 65 20 69 6e 64 65 78 20 61 6e 64  to the index and
a050: 20 70 72 6f 63 65 65 64 20 77 69 74 68 20 77 72   proceed with wr
a060: 69 74 69 6e 67 20 69 74 20 74 6f 20 74 68 65 0a  iting it to the.
a070: 20 20 20 20 20 20 20 20 2a 2a 20 6f 75 74 70 75          ** outpu
a080: 74 20 74 61 62 6c 65 20 61 73 20 77 65 6c 6c 2e  t table as well.
a090: 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74    */.        int
a0a0: 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56   addr = sqlite3V
a0b0: 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
a0c0: 29 20 2b 20 34 3b 0a 20 20 20 20 20 20 20 20 73  ) + 4;.        s
a0d0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
a0e0: 49 6e 74 28 76 2c 20 4f 50 5f 46 6f 75 6e 64 2c  Int(v, OP_Found,
a0f0: 20 69 50 61 72 6d 2b 31 2c 20 61 64 64 72 2c 20   iParm+1, addr, 
a100: 72 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  r1, 0);.        
a110: 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
a120: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
a130: 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c  VdbeAddOp4Int(v,
a140: 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 69   OP_IdxInsert, i
a150: 50 61 72 6d 2b 31 2c 20 72 31 2c 72 65 67 52 65  Parm+1, r1,regRe
a160: 73 75 6c 74 2c 6e 52 65 73 75 6c 74 43 6f 6c 29  sult,nResultCol)
a170: 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
a180: 28 20 70 53 6f 72 74 3d 3d 30 20 29 3b 0a 20 20  ( pSort==0 );.  
a190: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
a1a0: 20 20 20 69 66 28 20 70 53 6f 72 74 20 29 7b 0a     if( pSort ){.
a1b0: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
a1c0: 72 65 67 52 65 73 75 6c 74 3d 3d 72 65 67 4f 72  regResult==regOr
a1d0: 69 67 20 29 3b 0a 20 20 20 20 20 20 20 20 70 75  ig );.        pu
a1e0: 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28 70 50 61  shOntoSorter(pPa
a1f0: 72 73 65 2c 20 70 53 6f 72 74 2c 20 70 2c 20 72  rse, pSort, p, r
a200: 31 2b 6e 50 72 65 66 69 78 52 65 67 2c 20 72 65  1+nPrefixReg, re
a210: 67 4f 72 69 67 2c 20 31 2c 20 6e 50 72 65 66 69  gOrig, 1, nPrefi
a220: 78 52 65 67 29 3b 0a 20 20 20 20 20 20 7d 65 6c  xReg);.      }el
a230: 73 65 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  se{.        int 
a240: 72 32 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  r2 = sqlite3GetT
a250: 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a  empReg(pParse);.
a260: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
a270: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
a280: 4e 65 77 52 6f 77 69 64 2c 20 69 50 61 72 6d 2c  NewRowid, iParm,
a290: 20 72 32 29 3b 0a 20 20 20 20 20 20 20 20 73 71   r2);.        sq
a2a0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
a2b0: 76 2c 20 4f 50 5f 49 6e 73 65 72 74 2c 20 69 50  v, OP_Insert, iP
a2c0: 61 72 6d 2c 20 72 31 2c 20 72 32 29 3b 0a 20 20  arm, r1, r2);.  
a2d0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
a2e0: 65 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46  eChangeP5(v, OPF
a2f0: 4c 41 47 5f 41 50 50 45 4e 44 29 3b 0a 20 20 20  LAG_APPEND);.   
a300: 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65       sqlite3Rele
a310: 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
a320: 65 2c 20 72 32 29 3b 0a 20 20 20 20 20 20 7d 0a  e, r2);.      }.
a330: 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c        sqlite3Rel
a340: 65 61 73 65 54 65 6d 70 52 61 6e 67 65 28 70 50  easeTempRange(pP
a350: 61 72 73 65 2c 20 72 31 2c 20 6e 50 72 65 66 69  arse, r1, nPrefi
a360: 78 52 65 67 2b 31 29 3b 0a 20 20 20 20 20 20 62  xReg+1);.      b
a370: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 23 69 66  reak;.    }..#if
a380: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
a390: 5f 53 55 42 51 55 45 52 59 0a 20 20 20 20 2f 2a  _SUBQUERY.    /*
a3a0: 20 49 66 20 77 65 20 61 72 65 20 63 72 65 61 74   If we are creat
a3b0: 69 6e 67 20 61 20 73 65 74 20 66 6f 72 20 61 6e  ing a set for an
a3c0: 20 22 65 78 70 72 20 49 4e 20 28 53 45 4c 45 43   "expr IN (SELEC
a3d0: 54 20 2e 2e 2e 29 22 20 63 6f 6e 73 74 72 75 63  T ...)" construc
a3e0: 74 2c 0a 20 20 20 20 2a 2a 20 74 68 65 6e 20 74  t,.    ** then t
a3f0: 68 65 72 65 20 73 68 6f 75 6c 64 20 62 65 20 61  here should be a
a400: 20 73 69 6e 67 6c 65 20 69 74 65 6d 20 6f 6e 20   single item on 
a410: 74 68 65 20 73 74 61 63 6b 2e 20 20 57 72 69 74  the stack.  Writ
a420: 65 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 69 74  e this.    ** it
a430: 65 6d 20 69 6e 74 6f 20 74 68 65 20 73 65 74 20  em into the set 
a440: 74 61 62 6c 65 20 77 69 74 68 20 62 6f 67 75 73  table with bogus
a450: 20 64 61 74 61 2e 0a 20 20 20 20 2a 2f 0a 20 20   data..    */.  
a460: 20 20 63 61 73 65 20 53 52 54 5f 53 65 74 3a 20    case SRT_Set: 
a470: 7b 0a 20 20 20 20 20 20 69 66 28 20 70 53 6f 72  {.      if( pSor
a480: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  t ){.        /* 
a490: 41 74 20 66 69 72 73 74 20 67 6c 61 6e 63 65 20  At first glance 
a4a0: 79 6f 75 20 77 6f 75 6c 64 20 74 68 69 6e 6b 20  you would think 
a4b0: 77 65 20 63 6f 75 6c 64 20 6f 70 74 69 6d 69 7a  we could optimiz
a4c0: 65 20 6f 75 74 20 74 68 65 0a 20 20 20 20 20 20  e out the.      
a4d0: 20 20 2a 2a 20 4f 52 44 45 52 20 42 59 20 69 6e    ** ORDER BY in
a4e0: 20 74 68 69 73 20 63 61 73 65 20 73 69 6e 63 65   this case since
a4f0: 20 74 68 65 20 6f 72 64 65 72 20 6f 66 20 65 6e   the order of en
a500: 74 72 69 65 73 20 69 6e 20 74 68 65 20 73 65 74  tries in the set
a510: 0a 20 20 20 20 20 20 20 20 2a 2a 20 64 6f 65 73  .        ** does
a520: 20 6e 6f 74 20 6d 61 74 74 65 72 2e 20 20 42 75   not matter.  Bu
a530: 74 20 74 68 65 72 65 20 6d 69 67 68 74 20 62 65  t there might be
a540: 20 61 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 2c   a LIMIT clause,
a550: 20 69 6e 20 77 68 69 63 68 0a 20 20 20 20 20 20   in which.      
a560: 20 20 2a 2a 20 63 61 73 65 20 74 68 65 20 6f 72    ** case the or
a570: 64 65 72 20 64 6f 65 73 20 6d 61 74 74 65 72 20  der does matter 
a580: 2a 2f 0a 20 20 20 20 20 20 20 20 70 75 73 68 4f  */.        pushO
a590: 6e 74 6f 53 6f 72 74 65 72 28 0a 20 20 20 20 20  ntoSorter(.     
a5a0: 20 20 20 20 20 20 20 70 50 61 72 73 65 2c 20 70         pParse, p
a5b0: 53 6f 72 74 2c 20 70 2c 20 72 65 67 52 65 73 75  Sort, p, regResu
a5c0: 6c 74 2c 20 72 65 67 4f 72 69 67 2c 20 6e 52 65  lt, regOrig, nRe
a5d0: 73 75 6c 74 43 6f 6c 2c 20 6e 50 72 65 66 69 78  sultCol, nPrefix
a5e0: 52 65 67 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  Reg);.      }els
a5f0: 65 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72  e{.        int r
a600: 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  1 = sqlite3GetTe
a610: 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20  mpReg(pParse);. 
a620: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73         assert( s
a630: 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70  qlite3Strlen30(p
a640: 44 65 73 74 2d 3e 7a 41 66 66 53 64 73 74 29 3d  Dest->zAffSdst)=
a650: 3d 6e 52 65 73 75 6c 74 43 6f 6c 20 29 3b 0a 20  =nResultCol );. 
a660: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
a670: 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4d  beAddOp4(v, OP_M
a680: 61 6b 65 52 65 63 6f 72 64 2c 20 72 65 67 52 65  akeRecord, regRe
a690: 73 75 6c 74 2c 20 6e 52 65 73 75 6c 74 43 6f 6c  sult, nResultCol
a6a0: 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  , .            r
a6b0: 31 2c 20 70 44 65 73 74 2d 3e 7a 41 66 66 53 64  1, pDest->zAffSd
a6c0: 73 74 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 29 3b  st, nResultCol);
a6d0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
a6e0: 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c  VdbeAddOp4Int(v,
a6f0: 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 69   OP_IdxInsert, i
a700: 50 61 72 6d 2c 20 72 31 2c 20 72 65 67 52 65 73  Parm, r1, regRes
a710: 75 6c 74 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 29  ult, nResultCol)
a720: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
a730: 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
a740: 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 20 20 20  pParse, r1);.   
a750: 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b     }.      break
a760: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
a770: 49 66 20 61 6e 79 20 72 6f 77 20 65 78 69 73 74  If any row exist
a780: 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73   in the result s
a790: 65 74 2c 20 72 65 63 6f 72 64 20 74 68 61 74 20  et, record that 
a7a0: 66 61 63 74 20 61 6e 64 20 61 62 6f 72 74 2e 0a  fact and abort..
a7b0: 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20      */.    case 
a7c0: 53 52 54 5f 45 78 69 73 74 73 3a 20 7b 0a 20 20  SRT_Exists: {.  
a7d0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
a7e0: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65  ddOp2(v, OP_Inte
a7f0: 67 65 72 2c 20 31 2c 20 69 50 61 72 6d 29 3b 0a  ger, 1, iParm);.
a800: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 4c 49 4d        /* The LIM
a810: 49 54 20 63 6c 61 75 73 65 20 77 69 6c 6c 20 74  IT clause will t
a820: 65 72 6d 69 6e 61 74 65 20 74 68 65 20 6c 6f 6f  erminate the loo
a830: 70 20 66 6f 72 20 75 73 20 2a 2f 0a 20 20 20 20  p for us */.    
a840: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
a850: 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69      /* If this i
a860: 73 20 61 20 73 63 61 6c 61 72 20 73 65 6c 65 63  s a scalar selec
a870: 74 20 74 68 61 74 20 69 73 20 70 61 72 74 20 6f  t that is part o
a880: 66 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 2c  f an expression,
a890: 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20 73 74 6f   then.    ** sto
a8a0: 72 65 20 74 68 65 20 72 65 73 75 6c 74 73 20 69  re the results i
a8b0: 6e 20 74 68 65 20 61 70 70 72 6f 70 72 69 61 74  n the appropriat
a8c0: 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 6f 72  e memory cell or
a8d0: 20 61 72 72 61 79 20 6f 66 20 0a 20 20 20 20 2a   array of .    *
a8e0: 2a 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20 61  * memory cells a
a8f0: 6e 64 20 62 72 65 61 6b 20 6f 75 74 20 6f 66 20  nd break out of 
a900: 74 68 65 20 73 63 61 6e 20 6c 6f 6f 70 2e 0a 20  the scan loop.. 
a910: 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53     */.    case S
a920: 52 54 5f 4d 65 6d 3a 20 7b 0a 20 20 20 20 20 20  RT_Mem: {.      
a930: 69 66 28 20 70 53 6f 72 74 20 29 7b 0a 20 20 20  if( pSort ){.   
a940: 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 52 65       assert( nRe
a950: 73 75 6c 74 43 6f 6c 3c 3d 70 44 65 73 74 2d 3e  sultCol<=pDest->
a960: 6e 53 64 73 74 20 29 3b 0a 20 20 20 20 20 20 20  nSdst );.       
a970: 20 70 75 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28   pushOntoSorter(
a980: 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 50 61  .            pPa
a990: 72 73 65 2c 20 70 53 6f 72 74 2c 20 70 2c 20 72  rse, pSort, p, r
a9a0: 65 67 52 65 73 75 6c 74 2c 20 72 65 67 4f 72 69  egResult, regOri
a9b0: 67 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 2c 20 6e  g, nResultCol, n
a9c0: 50 72 65 66 69 78 52 65 67 29 3b 0a 20 20 20 20  PrefixReg);.    
a9d0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
a9e0: 20 61 73 73 65 72 74 28 20 6e 52 65 73 75 6c 74   assert( nResult
a9f0: 43 6f 6c 3d 3d 70 44 65 73 74 2d 3e 6e 53 64 73  Col==pDest->nSds
aa00: 74 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  t );.        ass
aa10: 65 72 74 28 20 72 65 67 52 65 73 75 6c 74 3d 3d  ert( regResult==
aa20: 69 50 61 72 6d 20 29 3b 0a 20 20 20 20 20 20 20  iParm );.       
aa30: 20 2f 2a 20 54 68 65 20 4c 49 4d 49 54 20 63 6c   /* The LIMIT cl
aa40: 61 75 73 65 20 77 69 6c 6c 20 6a 75 6d 70 20 6f  ause will jump o
aa50: 75 74 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 66  ut of the loop f
aa60: 6f 72 20 75 73 20 2a 2f 0a 20 20 20 20 20 20 7d  or us */.      }
aa70: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
aa80: 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 23 69    }.#endif /* #i
aa90: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
aaa0: 54 5f 53 55 42 51 55 45 52 59 20 2a 2f 0a 0a 20  T_SUBQUERY */.. 
aab0: 20 20 20 63 61 73 65 20 53 52 54 5f 43 6f 72 6f     case SRT_Coro
aac0: 75 74 69 6e 65 3a 20 20 20 20 20 20 20 2f 2a 20  utine:       /* 
aad0: 53 65 6e 64 20 64 61 74 61 20 74 6f 20 61 20 63  Send data to a c
aae0: 6f 2d 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 20  o-routine */.   
aaf0: 20 63 61 73 65 20 53 52 54 5f 4f 75 74 70 75 74   case SRT_Output
ab00: 3a 20 7b 20 20 20 20 20 20 20 20 2f 2a 20 52 65  : {        /* Re
ab10: 74 75 72 6e 20 74 68 65 20 72 65 73 75 6c 74 73  turn the results
ab20: 20 2a 2f 0a 20 20 20 20 20 20 74 65 73 74 63 61   */.      testca
ab30: 73 65 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 43  se( eDest==SRT_C
ab40: 6f 72 6f 75 74 69 6e 65 20 29 3b 0a 20 20 20 20  oroutine );.    
ab50: 20 20 74 65 73 74 63 61 73 65 28 20 65 44 65 73    testcase( eDes
ab60: 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20 29 3b  t==SRT_Output );
ab70: 0a 20 20 20 20 20 20 69 66 28 20 70 53 6f 72 74  .      if( pSort
ab80: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 75 73 68   ){.        push
ab90: 4f 6e 74 6f 53 6f 72 74 65 72 28 70 50 61 72 73  OntoSorter(pPars
aba0: 65 2c 20 70 53 6f 72 74 2c 20 70 2c 20 72 65 67  e, pSort, p, reg
abb0: 52 65 73 75 6c 74 2c 20 72 65 67 4f 72 69 67 2c  Result, regOrig,
abc0: 20 6e 52 65 73 75 6c 74 43 6f 6c 2c 0a 20 20 20   nResultCol,.   
abd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
abe0: 20 20 20 20 6e 50 72 65 66 69 78 52 65 67 29 3b      nPrefixReg);
abf0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
ac00: 20 65 44 65 73 74 3d 3d 53 52 54 5f 43 6f 72 6f   eDest==SRT_Coro
ac10: 75 74 69 6e 65 20 29 7b 0a 20 20 20 20 20 20 20  utine ){.       
ac20: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
ac30: 70 31 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20  p1(v, OP_Yield, 
ac40: 70 44 65 73 74 2d 3e 69 53 44 50 61 72 6d 29 3b  pDest->iSDParm);
ac50: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
ac60: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
ac70: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65  eAddOp2(v, OP_Re
ac80: 73 75 6c 74 52 6f 77 2c 20 72 65 67 52 65 73 75  sultRow, regResu
ac90: 6c 74 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 29 3b  lt, nResultCol);
aca0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
acb0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 23 69 66  reak;.    }..#if
acc0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
acd0: 5f 43 54 45 0a 20 20 20 20 2f 2a 20 57 72 69 74  _CTE.    /* Writ
ace0: 65 20 74 68 65 20 72 65 73 75 6c 74 73 20 69 6e  e the results in
acf0: 74 6f 20 61 20 70 72 69 6f 72 69 74 79 20 71 75  to a priority qu
ad00: 65 75 65 20 74 68 61 74 20 69 73 20 6f 72 64 65  eue that is orde
ad10: 72 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 0a 20  r according to. 
ad20: 20 20 20 2a 2a 20 70 44 65 73 74 2d 3e 70 4f 72     ** pDest->pOr
ad30: 64 65 72 42 79 20 28 69 6e 20 70 53 4f 29 2e 20  derBy (in pSO). 
ad40: 20 70 44 65 73 74 2d 3e 69 53 44 50 61 72 6d 20   pDest->iSDParm 
ad50: 28 69 6e 20 69 50 61 72 6d 29 20 69 73 20 74 68  (in iParm) is th
ad60: 65 20 63 75 72 73 6f 72 20 66 6f 72 20 61 6e 0a  e cursor for an.
ad70: 20 20 20 20 2a 2a 20 69 6e 64 65 78 20 77 69 74      ** index wit
ad80: 68 20 70 53 4f 2d 3e 6e 45 78 70 72 2b 32 20 63  h pSO->nExpr+2 c
ad90: 6f 6c 75 6d 6e 73 2e 20 20 42 75 69 6c 64 20 61  olumns.  Build a
ada0: 20 6b 65 79 20 75 73 69 6e 67 20 70 53 4f 20 66   key using pSO f
adb0: 6f 72 20 74 68 65 20 66 69 72 73 74 0a 20 20 20  or the first.   
adc0: 20 2a 2a 20 70 53 4f 2d 3e 6e 45 78 70 72 20 63   ** pSO->nExpr c
add0: 6f 6c 75 6d 6e 73 2c 20 74 68 65 6e 20 6d 61 6b  olumns, then mak
ade0: 65 20 73 75 72 65 20 61 6c 6c 20 6b 65 79 73 20  e sure all keys 
adf0: 61 72 65 20 75 6e 69 71 75 65 20 62 79 20 61 64  are unique by ad
ae00: 64 69 6e 67 20 61 0a 20 20 20 20 2a 2a 20 66 69  ding a.    ** fi
ae10: 6e 61 6c 20 4f 50 5f 53 65 71 75 65 6e 63 65 20  nal OP_Sequence 
ae20: 63 6f 6c 75 6d 6e 2e 20 20 54 68 65 20 6c 61 73  column.  The las
ae30: 74 20 63 6f 6c 75 6d 6e 20 69 73 20 74 68 65 20  t column is the 
ae40: 72 65 63 6f 72 64 20 61 73 20 61 20 62 6c 6f 62  record as a blob
ae50: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73  ..    */.    cas
ae60: 65 20 53 52 54 5f 44 69 73 74 51 75 65 75 65 3a  e SRT_DistQueue:
ae70: 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 51 75  .    case SRT_Qu
ae80: 65 75 65 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74  eue: {.      int
ae90: 20 6e 4b 65 79 3b 0a 20 20 20 20 20 20 69 6e 74   nKey;.      int
aea0: 20 72 31 2c 20 72 32 2c 20 72 33 3b 0a 20 20 20   r1, r2, r3;.   
aeb0: 20 20 20 69 6e 74 20 61 64 64 72 54 65 73 74 20     int addrTest 
aec0: 3d 20 30 3b 0a 20 20 20 20 20 20 45 78 70 72 4c  = 0;.      ExprL
aed0: 69 73 74 20 2a 70 53 4f 3b 0a 20 20 20 20 20 20  ist *pSO;.      
aee0: 70 53 4f 20 3d 20 70 44 65 73 74 2d 3e 70 4f 72  pSO = pDest->pOr
aef0: 64 65 72 42 79 3b 0a 20 20 20 20 20 20 61 73 73  derBy;.      ass
af00: 65 72 74 28 20 70 53 4f 20 29 3b 0a 20 20 20 20  ert( pSO );.    
af10: 20 20 6e 4b 65 79 20 3d 20 70 53 4f 2d 3e 6e 45    nKey = pSO->nE
af20: 78 70 72 3b 0a 20 20 20 20 20 20 72 31 20 3d 20  xpr;.      r1 = 
af30: 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65  sqlite3GetTempRe
af40: 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  g(pParse);.     
af50: 20 72 32 20 3d 20 73 71 6c 69 74 65 33 47 65 74   r2 = sqlite3Get
af60: 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65  TempRange(pParse
af70: 2c 20 6e 4b 65 79 2b 32 29 3b 0a 20 20 20 20 20  , nKey+2);.     
af80: 20 72 33 20 3d 20 72 32 2b 6e 4b 65 79 2b 31 3b   r3 = r2+nKey+1;
af90: 0a 20 20 20 20 20 20 69 66 28 20 65 44 65 73 74  .      if( eDest
afa0: 3d 3d 53 52 54 5f 44 69 73 74 51 75 65 75 65 20  ==SRT_DistQueue 
afb0: 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66  ){.        /* If
afc0: 20 74 68 65 20 64 65 73 74 69 6e 61 74 69 6f 6e   the destination
afd0: 20 69 73 20 44 69 73 74 51 75 65 75 65 2c 20 74   is DistQueue, t
afe0: 68 65 6e 20 63 75 72 73 6f 72 20 28 69 50 61 72  hen cursor (iPar
aff0: 6d 2b 31 29 20 69 73 20 6f 70 65 6e 0a 20 20 20  m+1) is open.   
b000: 20 20 20 20 20 2a 2a 20 6f 6e 20 61 20 73 65 63       ** on a sec
b010: 6f 6e 64 20 65 70 68 65 6d 65 72 61 6c 20 69 6e  ond ephemeral in
b020: 64 65 78 20 74 68 61 74 20 68 6f 6c 64 73 20 61  dex that holds a
b030: 6c 6c 20 76 61 6c 75 65 73 20 65 76 65 72 79 20  ll values every 
b040: 70 72 65 76 69 6f 75 73 6c 79 0a 20 20 20 20 20  previously.     
b050: 20 20 20 2a 2a 20 61 64 64 65 64 20 74 6f 20 74     ** added to t
b060: 68 65 20 71 75 65 75 65 2e 20 2a 2f 0a 20 20 20  he queue. */.   
b070: 20 20 20 20 20 61 64 64 72 54 65 73 74 20 3d 20       addrTest = 
b080: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
b090: 34 49 6e 74 28 76 2c 20 4f 50 5f 46 6f 75 6e 64  4Int(v, OP_Found
b0a0: 2c 20 69 50 61 72 6d 2b 31 2c 20 30 2c 20 0a 20  , iParm+1, 0, . 
b0b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b0c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b0d0: 20 20 20 20 20 20 20 72 65 67 52 65 73 75 6c 74         regResult
b0e0: 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 29 3b 0a 20  , nResultCol);. 
b0f0: 20 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72         VdbeCover
b100: 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 7d 0a  age(v);.      }.
b110: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
b120: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61  eAddOp3(v, OP_Ma
b130: 6b 65 52 65 63 6f 72 64 2c 20 72 65 67 52 65 73  keRecord, regRes
b140: 75 6c 74 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 2c  ult, nResultCol,
b150: 20 72 33 29 3b 0a 20 20 20 20 20 20 69 66 28 20   r3);.      if( 
b160: 65 44 65 73 74 3d 3d 53 52 54 5f 44 69 73 74 51  eDest==SRT_DistQ
b170: 75 65 75 65 20 29 7b 0a 20 20 20 20 20 20 20 20  ueue ){.        
b180: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
b190: 32 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72  2(v, OP_IdxInser
b1a0: 74 2c 20 69 50 61 72 6d 2b 31 2c 20 72 33 29 3b  t, iParm+1, r3);
b1b0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
b1c0: 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20  VdbeChangeP5(v, 
b1d0: 4f 50 46 4c 41 47 5f 55 53 45 53 45 45 4b 52 45  OPFLAG_USESEEKRE
b1e0: 53 55 4c 54 29 3b 0a 20 20 20 20 20 20 7d 0a 20  SULT);.      }. 
b1f0: 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
b200: 6e 4b 65 79 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nKey; i++){.    
b210: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
b220: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 43 6f 70  ddOp2(v, OP_SCop
b230: 79 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  y,.             
b240: 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65 67               reg
b250: 52 65 73 75 6c 74 20 2b 20 70 53 4f 2d 3e 61 5b  Result + pSO->a[
b260: 69 5d 2e 75 2e 78 2e 69 4f 72 64 65 72 42 79 43  i].u.x.iOrderByC
b270: 6f 6c 20 2d 20 31 2c 0a 20 20 20 20 20 20 20 20  ol - 1,.        
b280: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b290: 20 20 72 32 2b 69 29 3b 0a 20 20 20 20 20 20 7d    r2+i);.      }
b2a0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
b2b0: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53  beAddOp2(v, OP_S
b2c0: 65 71 75 65 6e 63 65 2c 20 69 50 61 72 6d 2c 20  equence, iParm, 
b2d0: 72 32 2b 6e 4b 65 79 29 3b 0a 20 20 20 20 20 20  r2+nKey);.      
b2e0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
b2f0: 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f  3(v, OP_MakeReco
b300: 72 64 2c 20 72 32 2c 20 6e 4b 65 79 2b 32 2c 20  rd, r2, nKey+2, 
b310: 72 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  r1);.      sqlit
b320: 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28  e3VdbeAddOp4Int(
b330: 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c  v, OP_IdxInsert,
b340: 20 69 50 61 72 6d 2c 20 72 31 2c 20 72 32 2c 20   iParm, r1, r2, 
b350: 6e 4b 65 79 2b 32 29 3b 0a 20 20 20 20 20 20 69  nKey+2);.      i
b360: 66 28 20 61 64 64 72 54 65 73 74 20 29 20 73 71  f( addrTest ) sq
b370: 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
b380: 65 28 76 2c 20 61 64 64 72 54 65 73 74 29 3b 0a  e(v, addrTest);.
b390: 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c        sqlite3Rel
b3a0: 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
b3b0: 73 65 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 73  se, r1);.      s
b3c0: 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
b3d0: 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72  pRange(pParse, r
b3e0: 32 2c 20 6e 4b 65 79 2b 32 29 3b 0a 20 20 20 20  2, nKey+2);.    
b3f0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
b400: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
b410: 4f 4d 49 54 5f 43 54 45 20 2a 2f 0a 0a 0a 0a 23  OMIT_CTE */....#
b420: 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
b430: 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52 29  TE_OMIT_TRIGGER)
b440: 0a 20 20 20 20 2f 2a 20 44 69 73 63 61 72 64 20  .    /* Discard 
b450: 74 68 65 20 72 65 73 75 6c 74 73 2e 20 20 54 68  the results.  Th
b460: 69 73 20 69 73 20 75 73 65 64 20 66 6f 72 20 53  is is used for S
b470: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73  ELECT statements
b480: 20 69 6e 73 69 64 65 0a 20 20 20 20 2a 2a 20 74   inside.    ** t
b490: 68 65 20 62 6f 64 79 20 6f 66 20 61 20 54 52 49  he body of a TRI
b4a0: 47 47 45 52 2e 20 20 54 68 65 20 70 75 72 70 6f  GGER.  The purpo
b4b0: 73 65 20 6f 66 20 73 75 63 68 20 73 65 6c 65 63  se of such selec
b4c0: 74 73 20 69 73 20 74 6f 20 63 61 6c 6c 0a 20 20  ts is to call.  
b4d0: 20 20 2a 2a 20 75 73 65 72 2d 64 65 66 69 6e 65    ** user-define
b4e0: 64 20 66 75 6e 63 74 69 6f 6e 73 20 74 68 61 74  d functions that
b4f0: 20 68 61 76 65 20 73 69 64 65 20 65 66 66 65 63   have side effec
b500: 74 73 2e 20 20 57 65 20 64 6f 20 6e 6f 74 20 63  ts.  We do not c
b510: 61 72 65 0a 20 20 20 20 2a 2a 20 61 62 6f 75 74  are.    ** about
b520: 20 74 68 65 20 61 63 74 75 61 6c 20 72 65 73 75   the actual resu
b530: 6c 74 73 20 6f 66 20 74 68 65 20 73 65 6c 65 63  lts of the selec
b540: 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64 65  t..    */.    de
b550: 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 61  fault: {.      a
b560: 73 73 65 72 74 28 20 65 44 65 73 74 3d 3d 53 52  ssert( eDest==SR
b570: 54 5f 44 69 73 63 61 72 64 20 29 3b 0a 20 20 20  T_Discard );.   
b580: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
b590: 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 20 20 2f 2a  #endif.  }..  /*
b5a0: 20 4a 75 6d 70 20 74 6f 20 74 68 65 20 65 6e 64   Jump to the end
b5b0: 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 69 66 20   of the loop if 
b5c0: 74 68 65 20 4c 49 4d 49 54 20 69 73 20 72 65 61  the LIMIT is rea
b5d0: 63 68 65 64 2e 20 20 45 78 63 65 70 74 2c 20 69  ched.  Except, i
b5e0: 66 0a 20 20 2a 2a 20 74 68 65 72 65 20 69 73 20  f.  ** there is 
b5f0: 61 20 73 6f 72 74 65 72 2c 20 69 6e 20 77 68 69  a sorter, in whi
b600: 63 68 20 63 61 73 65 20 74 68 65 20 73 6f 72 74  ch case the sort
b610: 65 72 20 68 61 73 20 61 6c 72 65 61 64 79 20 6c  er has already l
b620: 69 6d 69 74 65 64 0a 20 20 2a 2a 20 74 68 65 20  imited.  ** the 
b630: 6f 75 74 70 75 74 20 66 6f 72 20 75 73 2e 0a 20  output for us.. 
b640: 20 2a 2f 0a 20 20 69 66 28 20 70 53 6f 72 74 3d   */.  if( pSort=
b650: 3d 30 20 26 26 20 70 2d 3e 69 4c 69 6d 69 74 20  =0 && p->iLimit 
b660: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
b670: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 44  beAddOp2(v, OP_D
b680: 65 63 72 4a 75 6d 70 5a 65 72 6f 2c 20 70 2d 3e  ecrJumpZero, p->
b690: 69 4c 69 6d 69 74 2c 20 69 42 72 65 61 6b 29 3b  iLimit, iBreak);
b6a0: 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
b6b0: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  ;.  }.}../*.** A
b6c0: 6c 6c 6f 63 61 74 65 20 61 20 4b 65 79 49 6e 66  llocate a KeyInf
b6d0: 6f 20 6f 62 6a 65 63 74 20 73 75 66 66 69 63 69  o object suffici
b6e0: 65 6e 74 20 66 6f 72 20 61 6e 20 69 6e 64 65 78  ent for an index
b6f0: 20 6f 66 20 4e 20 6b 65 79 20 63 6f 6c 75 6d 6e   of N key column
b700: 73 20 61 6e 64 0a 2a 2a 20 58 20 65 78 74 72 61  s and.** X extra
b710: 20 63 6f 6c 75 6d 6e 73 2e 0a 2a 2f 0a 4b 65 79   columns..*/.Key
b720: 49 6e 66 6f 20 2a 73 71 6c 69 74 65 33 4b 65 79  Info *sqlite3Key
b730: 49 6e 66 6f 41 6c 6c 6f 63 28 73 71 6c 69 74 65  InfoAlloc(sqlite
b740: 33 20 2a 64 62 2c 20 69 6e 74 20 4e 2c 20 69 6e  3 *db, int N, in
b750: 74 20 58 29 7b 0a 20 20 69 6e 74 20 6e 45 78 74  t X){.  int nExt
b760: 72 61 20 3d 20 28 4e 2b 58 29 2a 28 73 69 7a 65  ra = (N+X)*(size
b770: 6f 66 28 43 6f 6c 6c 53 65 71 2a 29 2b 31 29 20  of(CollSeq*)+1) 
b780: 2d 20 73 69 7a 65 6f 66 28 43 6f 6c 6c 53 65 71  - sizeof(CollSeq
b790: 2a 29 3b 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70  *);.  KeyInfo *p
b7a0: 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
b7b0: 6f 63 52 61 77 4e 4e 28 64 62 2c 20 73 69 7a 65  ocRawNN(db, size
b7c0: 6f 66 28 4b 65 79 49 6e 66 6f 29 20 2b 20 6e 45  of(KeyInfo) + nE
b7d0: 78 74 72 61 29 3b 0a 20 20 69 66 28 20 70 20 29  xtra);.  if( p )
b7e0: 7b 0a 20 20 20 20 70 2d 3e 61 53 6f 72 74 4f 72  {.    p->aSortOr
b7f0: 64 65 72 20 3d 20 28 75 38 2a 29 26 70 2d 3e 61  der = (u8*)&p->a
b800: 43 6f 6c 6c 5b 4e 2b 58 5d 3b 0a 20 20 20 20 70  Coll[N+X];.    p
b810: 2d 3e 6e 4b 65 79 46 69 65 6c 64 20 3d 20 28 75  ->nKeyField = (u
b820: 31 36 29 4e 3b 0a 20 20 20 20 70 2d 3e 6e 41 6c  16)N;.    p->nAl
b830: 6c 46 69 65 6c 64 20 3d 20 28 75 31 36 29 28 4e  lField = (u16)(N
b840: 2b 58 29 3b 0a 20 20 20 20 70 2d 3e 65 6e 63 20  +X);.    p->enc 
b850: 3d 20 45 4e 43 28 64 62 29 3b 0a 20 20 20 20 70  = ENC(db);.    p
b860: 2d 3e 64 62 20 3d 20 64 62 3b 0a 20 20 20 20 70  ->db = db;.    p
b870: 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20 20 20  ->nRef = 1;.    
b880: 6d 65 6d 73 65 74 28 26 70 5b 31 5d 2c 20 30 2c  memset(&p[1], 0,
b890: 20 6e 45 78 74 72 61 29 3b 0a 20 20 7d 65 6c 73   nExtra);.  }els
b8a0: 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 6f  e{.    sqlite3Oo
b8b0: 6d 46 61 75 6c 74 28 64 62 29 3b 0a 20 20 7d 0a  mFault(db);.  }.
b8c0: 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f    return p;.}../
b8d0: 2a 0a 2a 2a 20 44 65 61 6c 6c 6f 63 61 74 65 20  *.** Deallocate 
b8e0: 61 20 4b 65 79 49 6e 66 6f 20 6f 62 6a 65 63 74  a KeyInfo object
b8f0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
b900: 4b 65 79 49 6e 66 6f 55 6e 72 65 66 28 4b 65 79  KeyInfoUnref(Key
b910: 49 6e 66 6f 20 2a 70 29 7b 0a 20 20 69 66 28 20  Info *p){.  if( 
b920: 70 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  p ){.    assert(
b930: 20 70 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20   p->nRef>0 );.  
b940: 20 20 70 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 20    p->nRef--;.   
b950: 20 69 66 28 20 70 2d 3e 6e 52 65 66 3d 3d 30 20   if( p->nRef==0 
b960: 29 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 4e  ) sqlite3DbFreeN
b970: 4e 28 70 2d 3e 64 62 2c 20 70 29 3b 0a 20 20 7d  N(p->db, p);.  }
b980: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 61  .}../*.** Make a
b990: 20 6e 65 77 20 70 6f 69 6e 74 65 72 20 74 6f 20   new pointer to 
b9a0: 61 20 4b 65 79 49 6e 66 6f 20 6f 62 6a 65 63 74  a KeyInfo object
b9b0: 0a 2a 2f 0a 4b 65 79 49 6e 66 6f 20 2a 73 71 6c  .*/.KeyInfo *sql
b9c0: 69 74 65 33 4b 65 79 49 6e 66 6f 52 65 66 28 4b  ite3KeyInfoRef(K
b9d0: 65 79 49 6e 66 6f 20 2a 70 29 7b 0a 20 20 69 66  eyInfo *p){.  if
b9e0: 28 20 70 20 29 7b 0a 20 20 20 20 61 73 73 65 72  ( p ){.    asser
b9f0: 74 28 20 70 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a  t( p->nRef>0 );.
ba00: 20 20 20 20 70 2d 3e 6e 52 65 66 2b 2b 3b 0a 20      p->nRef++;. 
ba10: 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d   }.  return p;.}
ba20: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
ba30: 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 52 65 74 75  DEBUG./*.** Retu
ba40: 72 6e 20 54 52 55 45 20 69 66 20 61 20 4b 65 79  rn TRUE if a Key
ba50: 49 6e 66 6f 20 6f 62 6a 65 63 74 20 63 61 6e 20  Info object can 
ba60: 62 65 20 63 68 61 6e 67 65 2e 20 20 54 68 65 20  be change.  The 
ba70: 4b 65 79 49 6e 66 6f 20 6f 62 6a 65 63 74 0a 2a  KeyInfo object.*
ba80: 2a 20 63 61 6e 20 6f 6e 6c 79 20 62 65 20 63 68  * can only be ch
ba90: 61 6e 67 65 64 20 69 66 20 74 68 69 73 20 69 73  anged if this is
baa0: 20 6a 75 73 74 20 61 20 73 69 6e 67 6c 65 20 72   just a single r
bab0: 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20  eference to the 
bac0: 6f 62 6a 65 63 74 2e 0a 2a 2a 0a 2a 2a 20 54 68  object..**.** Th
bad0: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73  is routine is us
bae0: 65 64 20 6f 6e 6c 79 20 69 6e 73 69 64 65 20 6f  ed only inside o
baf0: 66 20 61 73 73 65 72 74 28 29 20 73 74 61 74 65  f assert() state
bb00: 6d 65 6e 74 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ments..*/.int sq
bb10: 6c 69 74 65 33 4b 65 79 49 6e 66 6f 49 73 57 72  lite3KeyInfoIsWr
bb20: 69 74 65 61 62 6c 65 28 4b 65 79 49 6e 66 6f 20  iteable(KeyInfo 
bb30: 2a 70 29 7b 20 72 65 74 75 72 6e 20 70 2d 3e 6e  *p){ return p->n
bb40: 52 65 66 3d 3d 31 3b 20 7d 0a 23 65 6e 64 69 66  Ref==1; }.#endif
bb50: 20 2f 2a 20 53 51 4c 49 54 45 5f 44 45 42 55 47   /* SQLITE_DEBUG
bb60: 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e   */../*.** Given
bb70: 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 6c   an expression l
bb80: 69 73 74 2c 20 67 65 6e 65 72 61 74 65 20 61 20  ist, generate a 
bb90: 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72  KeyInfo structur
bba0: 65 20 74 68 61 74 20 72 65 63 6f 72 64 73 0a 2a  e that records.*
bbb0: 2a 20 74 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20  * the collating 
bbc0: 73 65 71 75 65 6e 63 65 20 66 6f 72 20 65 61 63  sequence for eac
bbd0: 68 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20  h expression in 
bbe0: 74 68 61 74 20 65 78 70 72 65 73 73 69 6f 6e 20  that expression 
bbf0: 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  list..**.** If t
bc00: 68 65 20 45 78 70 72 4c 69 73 74 20 69 73 20 61  he ExprList is a
bc10: 6e 20 4f 52 44 45 52 20 42 59 20 6f 72 20 47 52  n ORDER BY or GR
bc20: 4f 55 50 20 42 59 20 63 6c 61 75 73 65 20 74 68  OUP BY clause th
bc30: 65 6e 20 74 68 65 20 72 65 73 75 6c 74 69 6e 67  en the resulting
bc40: 0a 2a 2a 20 4b 65 79 49 6e 66 6f 20 73 74 72 75  .** KeyInfo stru
bc50: 63 74 75 72 65 20 69 73 20 61 70 70 72 6f 70 72  cture is appropr
bc60: 69 61 74 65 20 66 6f 72 20 69 6e 69 74 69 61 6c  iate for initial
bc70: 69 7a 69 6e 67 20 61 20 76 69 72 74 75 61 6c 20  izing a virtual 
bc80: 69 6e 64 65 78 20 74 6f 0a 2a 2a 20 69 6d 70 6c  index to.** impl
bc90: 65 6d 65 6e 74 20 74 68 61 74 20 63 6c 61 75 73  ement that claus
bca0: 65 2e 20 20 49 66 20 74 68 65 20 45 78 70 72 4c  e.  If the ExprL
bcb0: 69 73 74 20 69 73 20 74 68 65 20 72 65 73 75 6c  ist is the resul
bcc0: 74 20 73 65 74 20 6f 66 20 61 20 53 45 4c 45 43  t set of a SELEC
bcd0: 54 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20 4b 65  T.** then the Ke
bce0: 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20  yInfo structure 
bcf0: 69 73 20 61 70 70 72 6f 70 72 69 61 74 65 20 66  is appropriate f
bd00: 6f 72 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20  or initializing 
bd10: 61 20 76 69 72 74 75 61 6c 0a 2a 2a 20 69 6e 64  a virtual.** ind
bd20: 65 78 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20  ex to implement 
bd30: 61 20 44 49 53 54 49 4e 43 54 20 74 65 73 74 2e  a DISTINCT test.
bd40: 0a 2a 2a 0a 2a 2a 20 53 70 61 63 65 20 74 6f 20  .**.** Space to 
bd50: 68 6f 6c 64 20 74 68 65 20 4b 65 79 49 6e 66 6f  hold the KeyInfo
bd60: 20 73 74 72 75 63 74 75 72 65 20 69 73 20 6f 62   structure is ob
bd70: 74 61 69 6e 65 64 20 66 72 6f 6d 20 6d 61 6c 6c  tained from mall
bd80: 6f 63 2e 20 20 54 68 65 20 63 61 6c 6c 69 6e 67  oc.  The calling
bd90: 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  .** function is 
bda0: 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20  responsible for 
bdb0: 73 65 65 69 6e 67 20 74 68 61 74 20 74 68 69 73  seeing that this
bdc0: 20 73 74 72 75 63 74 75 72 65 20 69 73 20 65 76   structure is ev
bdd0: 65 6e 74 75 61 6c 6c 79 0a 2a 2a 20 66 72 65 65  entually.** free
bde0: 64 2e 0a 2a 2f 0a 4b 65 79 49 6e 66 6f 20 2a 73  d..*/.KeyInfo *s
bdf0: 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 46 72 6f  qlite3KeyInfoFro
be00: 6d 45 78 70 72 4c 69 73 74 28 0a 20 20 50 61 72  mExprList(.  Par
be10: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
be20: 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
be30: 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69  text */.  ExprLi
be40: 73 74 20 2a 70 4c 69 73 74 2c 20 20 20 20 20 2f  st *pList,     /
be50: 2a 20 46 6f 72 6d 20 74 68 65 20 4b 65 79 49 6e  * Form the KeyIn
be60: 66 6f 20 6f 62 6a 65 63 74 20 66 72 6f 6d 20 74  fo object from t
be70: 68 69 73 20 45 78 70 72 4c 69 73 74 20 2a 2f 0a  his ExprList */.
be80: 20 20 69 6e 74 20 69 53 74 61 72 74 2c 20 20 20    int iStart,   
be90: 20 20 20 20 20 20 20 2f 2a 20 42 65 67 69 6e 20         /* Begin 
bea0: 77 69 74 68 20 74 68 69 73 20 63 6f 6c 75 6d 6e  with this column
beb0: 20 6f 66 20 70 4c 69 73 74 20 2a 2f 0a 20 20 69   of pList */.  i
bec0: 6e 74 20 6e 45 78 74 72 61 20 20 20 20 20 20 20  nt nExtra       
bed0: 20 20 20 20 2f 2a 20 41 64 64 20 74 68 69 73 20      /* Add this 
bee0: 6d 61 6e 79 20 65 78 74 72 61 20 63 6f 6c 75 6d  many extra colum
bef0: 6e 73 20 74 6f 20 74 68 65 20 65 6e 64 20 2a 2f  ns to the end */
bf00: 0a 29 7b 0a 20 20 69 6e 74 20 6e 45 78 70 72 3b  .){.  int nExpr;
bf10: 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 49 6e 66  .  KeyInfo *pInf
bf20: 6f 3b 0a 20 20 73 74 72 75 63 74 20 45 78 70 72  o;.  struct Expr
bf30: 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
bf40: 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  ;.  sqlite3 *db 
bf50: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
bf60: 69 6e 74 20 69 3b 0a 0a 20 20 6e 45 78 70 72 20  int i;..  nExpr 
bf70: 3d 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a  = pList->nExpr;.
bf80: 20 20 70 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65    pInfo = sqlite
bf90: 33 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63 28 64 62  3KeyInfoAlloc(db
bfa0: 2c 20 6e 45 78 70 72 2d 69 53 74 61 72 74 2c 20  , nExpr-iStart, 
bfb0: 6e 45 78 74 72 61 2b 31 29 3b 0a 20 20 69 66 28  nExtra+1);.  if(
bfc0: 20 70 49 6e 66 6f 20 29 7b 0a 20 20 20 20 61 73   pInfo ){.    as
bfd0: 73 65 72 74 28 20 73 71 6c 69 74 65 33 4b 65 79  sert( sqlite3Key
bfe0: 49 6e 66 6f 49 73 57 72 69 74 65 61 62 6c 65 28  InfoIsWriteable(
bff0: 70 49 6e 66 6f 29 20 29 3b 0a 20 20 20 20 66 6f  pInfo) );.    fo
c000: 72 28 69 3d 69 53 74 61 72 74 2c 20 70 49 74 65  r(i=iStart, pIte
c010: 6d 3d 70 4c 69 73 74 2d 3e 61 2b 69 53 74 61 72  m=pList->a+iStar
c020: 74 3b 20 69 3c 6e 45 78 70 72 3b 20 69 2b 2b 2c  t; i<nExpr; i++,
c030: 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20   pItem++){.     
c040: 20 70 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 69 2d   pInfo->aColl[i-
c050: 69 53 74 61 72 74 5d 20 3d 20 73 71 6c 69 74 65  iStart] = sqlite
c060: 33 45 78 70 72 4e 4e 43 6f 6c 6c 53 65 71 28 70  3ExprNNCollSeq(p
c070: 50 61 72 73 65 2c 20 70 49 74 65 6d 2d 3e 70 45  Parse, pItem->pE
c080: 78 70 72 29 3b 0a 20 20 20 20 20 20 70 49 6e 66  xpr);.      pInf
c090: 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69 2d  o->aSortOrder[i-
c0a0: 69 53 74 61 72 74 5d 20 3d 20 70 49 74 65 6d 2d  iStart] = pItem-
c0b0: 3e 73 6f 72 74 4f 72 64 65 72 3b 0a 20 20 20 20  >sortOrder;.    
c0c0: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  }.  }.  return p
c0d0: 49 6e 66 6f 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4e  Info;.}../*.** N
c0e0: 61 6d 65 20 6f 66 20 74 68 65 20 63 6f 6e 6e 65  ame of the conne
c0f0: 63 74 69 6f 6e 20 6f 70 65 72 61 74 6f 72 2c 20  ction operator, 
c100: 75 73 65 64 20 66 6f 72 20 65 72 72 6f 72 20 6d  used for error m
c110: 65 73 73 61 67 65 73 2e 0a 2a 2f 0a 73 74 61 74  essages..*/.stat
c120: 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 73  ic const char *s
c130: 65 6c 65 63 74 4f 70 4e 61 6d 65 28 69 6e 74 20  electOpName(int 
c140: 69 64 29 7b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a  id){.  char *z;.
c150: 20 20 73 77 69 74 63 68 28 20 69 64 20 29 7b 0a    switch( id ){.
c160: 20 20 20 20 63 61 73 65 20 54 4b 5f 41 4c 4c 3a      case TK_ALL:
c170: 20 20 20 20 20 20 20 7a 20 3d 20 22 55 4e 49 4f         z = "UNIO
c180: 4e 20 41 4c 4c 22 3b 20 20 20 62 72 65 61 6b 3b  N ALL";   break;
c190: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 54  .    case TK_INT
c1a0: 45 52 53 45 43 54 3a 20 7a 20 3d 20 22 49 4e 54  ERSECT: z = "INT
c1b0: 45 52 53 45 43 54 22 3b 20 20 20 62 72 65 61 6b  ERSECT";   break
c1c0: 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45 58  ;.    case TK_EX
c1d0: 43 45 50 54 3a 20 20 20 20 7a 20 3d 20 22 45 58  CEPT:    z = "EX
c1e0: 43 45 50 54 22 3b 20 20 20 20 20 20 62 72 65 61  CEPT";      brea
c1f0: 6b 3b 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20  k;.    default: 
c200: 20 20 20 20 20 20 20 20 20 20 7a 20 3d 20 22 55            z = "U
c210: 4e 49 4f 4e 22 3b 20 20 20 20 20 20 20 62 72 65  NION";       bre
c220: 61 6b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ak;.  }.  return
c230: 20 7a 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53   z;.}..#ifndef S
c240: 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41  QLITE_OMIT_EXPLA
c250: 49 4e 0a 2f 2a 0a 2a 2a 20 55 6e 6c 65 73 73 20  IN./*.** Unless 
c260: 61 6e 20 22 45 58 50 4c 41 49 4e 20 51 55 45 52  an "EXPLAIN QUER
c270: 59 20 50 4c 41 4e 22 20 63 6f 6d 6d 61 6e 64 20  Y PLAN" command 
c280: 69 73 20 62 65 69 6e 67 20 70 72 6f 63 65 73 73  is being process
c290: 65 64 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ed, this functio
c2a0: 6e 0a 2a 2a 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  n.** is a no-op.
c2b0: 20 4f 74 68 65 72 77 69 73 65 2c 20 69 74 20 61   Otherwise, it a
c2c0: 64 64 73 20 61 20 73 69 6e 67 6c 65 20 72 6f 77  dds a single row
c2d0: 20 6f 66 20 6f 75 74 70 75 74 20 74 6f 20 74 68   of output to th
c2e0: 65 20 45 51 50 20 72 65 73 75 6c 74 2c 0a 2a 2a  e EQP result,.**
c2f0: 20 77 68 65 72 65 20 74 68 65 20 63 61 70 74 69   where the capti
c300: 6f 6e 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72  on is of the for
c310: 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 22 55 53 45 20  m:.**.**   "USE 
c320: 54 45 4d 50 20 42 2d 54 52 45 45 20 46 4f 52 20  TEMP B-TREE FOR 
c330: 78 78 78 22 0a 2a 2a 0a 2a 2a 20 77 68 65 72 65  xxx".**.** where
c340: 20 78 78 78 20 69 73 20 6f 6e 65 20 6f 66 20 22   xxx is one of "
c350: 44 49 53 54 49 4e 43 54 22 2c 20 22 4f 52 44 45  DISTINCT", "ORDE
c360: 52 20 42 59 22 20 6f 72 20 22 47 52 4f 55 50 20  R BY" or "GROUP 
c370: 42 59 22 2e 20 45 78 61 63 74 6c 79 20 77 68 69  BY". Exactly whi
c380: 63 68 0a 2a 2a 20 69 73 20 64 65 74 65 72 6d 69  ch.** is determi
c390: 6e 65 64 20 62 79 20 74 68 65 20 7a 55 73 61 67  ned by the zUsag
c3a0: 65 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73  e argument..*/.s
c3b0: 74 61 74 69 63 20 76 6f 69 64 20 65 78 70 6c 61  tatic void expla
c3c0: 69 6e 54 65 6d 70 54 61 62 6c 65 28 50 61 72 73  inTempTable(Pars
c3d0: 65 20 2a 70 50 61 72 73 65 2c 20 63 6f 6e 73 74  e *pParse, const
c3e0: 20 63 68 61 72 20 2a 7a 55 73 61 67 65 29 7b 0a   char *zUsage){.
c3f0: 20 20 45 78 70 6c 61 69 6e 51 75 65 72 79 50 6c    ExplainQueryPl
c400: 61 6e 28 28 70 50 61 72 73 65 2c 20 30 2c 20 22  an((pParse, 0, "
c410: 55 53 45 20 54 45 4d 50 20 42 2d 54 52 45 45 20  USE TEMP B-TREE 
c420: 46 4f 52 20 25 73 22 2c 20 7a 55 73 61 67 65 29  FOR %s", zUsage)
c430: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 73 73 69  );.}../*.** Assi
c440: 67 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 62 20  gn expression b 
c450: 74 6f 20 6c 76 61 6c 75 65 20 61 2e 20 41 20 73  to lvalue a. A s
c460: 65 63 6f 6e 64 2c 20 6e 6f 2d 6f 70 2c 20 76 65  econd, no-op, ve
c470: 72 73 69 6f 6e 20 6f 66 20 74 68 69 73 20 6d 61  rsion of this ma
c480: 63 72 6f 0a 2a 2a 20 69 73 20 70 72 6f 76 69 64  cro.** is provid
c490: 65 64 20 77 68 65 6e 20 53 51 4c 49 54 45 5f 4f  ed when SQLITE_O
c4a0: 4d 49 54 5f 45 58 50 4c 41 49 4e 20 69 73 20 64  MIT_EXPLAIN is d
c4b0: 65 66 69 6e 65 64 2e 20 54 68 69 73 20 61 6c 6c  efined. This all
c4c0: 6f 77 73 20 74 68 65 20 63 6f 64 65 0a 2a 2a 20  ows the code.** 
c4d0: 69 6e 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  in sqlite3Select
c4e0: 28 29 20 74 6f 20 61 73 73 69 67 6e 20 76 61 6c  () to assign val
c4f0: 75 65 73 20 74 6f 20 73 74 72 75 63 74 75 72 65  ues to structure
c500: 20 6d 65 6d 62 65 72 20 76 61 72 69 61 62 6c 65   member variable
c510: 73 20 74 68 61 74 0a 2a 2a 20 6f 6e 6c 79 20 65  s that.** only e
c520: 78 69 73 74 20 69 66 20 53 51 4c 49 54 45 5f 4f  xist if SQLITE_O
c530: 4d 49 54 5f 45 58 50 4c 41 49 4e 20 69 73 20 6e  MIT_EXPLAIN is n
c540: 6f 74 20 64 65 66 69 6e 65 64 20 77 69 74 68 6f  ot defined witho
c550: 75 74 20 70 6f 6c 6c 75 74 69 6e 67 20 74 68 65  ut polluting the
c560: 0a 2a 2a 20 63 6f 64 65 20 77 69 74 68 20 23 69  .** code with #i
c570: 66 6e 64 65 66 20 64 69 72 65 63 74 69 76 65 73  fndef directives
c580: 2e 0a 2a 2f 0a 23 20 64 65 66 69 6e 65 20 65 78  ..*/.# define ex
c590: 70 6c 61 69 6e 53 65 74 49 6e 74 65 67 65 72 28  plainSetInteger(
c5a0: 61 2c 20 62 29 20 61 20 3d 20 62 0a 0a 23 65 6c  a, b) a = b..#el
c5b0: 73 65 0a 2f 2a 20 4e 6f 2d 6f 70 20 76 65 72 73  se./* No-op vers
c5c0: 69 6f 6e 73 20 6f 66 20 74 68 65 20 65 78 70 6c  ions of the expl
c5d0: 61 69 6e 58 58 58 28 29 20 66 75 6e 63 74 69 6f  ainXXX() functio
c5e0: 6e 73 20 61 6e 64 20 6d 61 63 72 6f 73 2e 20 2a  ns and macros. *
c5f0: 2f 0a 23 20 64 65 66 69 6e 65 20 65 78 70 6c 61  /.# define expla
c600: 69 6e 54 65 6d 70 54 61 62 6c 65 28 79 2c 7a 29  inTempTable(y,z)
c610: 0a 23 20 64 65 66 69 6e 65 20 65 78 70 6c 61 69  .# define explai
c620: 6e 53 65 74 49 6e 74 65 67 65 72 28 79 2c 7a 29  nSetInteger(y,z)
c630: 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20  .#endif.../*.** 
c640: 49 66 20 74 68 65 20 69 6e 6e 65 72 20 6c 6f 6f  If the inner loo
c650: 70 20 77 61 73 20 67 65 6e 65 72 61 74 65 64 20  p was generated 
c660: 75 73 69 6e 67 20 61 20 6e 6f 6e 2d 6e 75 6c 6c  using a non-null
c670: 20 70 4f 72 64 65 72 42 79 20 61 72 67 75 6d 65   pOrderBy argume
c680: 6e 74 2c 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20  nt,.** then the 
c690: 72 65 73 75 6c 74 73 20 77 65 72 65 20 70 6c 61  results were pla
c6a0: 63 65 64 20 69 6e 20 61 20 73 6f 72 74 65 72 2e  ced in a sorter.
c6b0: 20 20 41 66 74 65 72 20 74 68 65 20 6c 6f 6f 70    After the loop
c6c0: 20 69 73 20 74 65 72 6d 69 6e 61 74 65 64 0a 2a   is terminated.*
c6d0: 2a 20 77 65 20 6e 65 65 64 20 74 6f 20 72 75 6e  * we need to run
c6e0: 20 74 68 65 20 73 6f 72 74 65 72 20 61 6e 64 20   the sorter and 
c6f0: 6f 75 74 70 75 74 20 74 68 65 20 72 65 73 75 6c  output the resul
c700: 74 73 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69  ts.  The followi
c710: 6e 67 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 67 65  ng.** routine ge
c720: 6e 65 72 61 74 65 73 20 74 68 65 20 63 6f 64 65  nerates the code
c730: 20 6e 65 65 64 65 64 20 74 6f 20 64 6f 20 74 68   needed to do th
c740: 61 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  at..*/.static vo
c750: 69 64 20 67 65 6e 65 72 61 74 65 53 6f 72 74 54  id generateSortT
c760: 61 69 6c 28 0a 20 20 50 61 72 73 65 20 2a 70 50  ail(.  Parse *pP
c770: 61 72 73 65 2c 20 20 20 20 2f 2a 20 50 61 72 73  arse,    /* Pars
c780: 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
c790: 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20   Select *p,     
c7a0: 20 20 20 2f 2a 20 54 68 65 20 53 45 4c 45 43 54     /* The SELECT
c7b0: 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20   statement */.  
c7c0: 53 6f 72 74 43 74 78 20 2a 70 53 6f 72 74 2c 20  SortCtx *pSort, 
c7d0: 20 20 2f 2a 20 49 6e 66 6f 72 6d 61 74 69 6f 6e    /* Information
c7e0: 20 6f 6e 20 74 68 65 20 4f 52 44 45 52 20 42 59   on the ORDER BY
c7f0: 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74   clause */.  int
c800: 20 6e 43 6f 6c 75 6d 6e 2c 20 20 20 20 20 20 2f   nColumn,      /
c810: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75  * Number of colu
c820: 6d 6e 73 20 6f 66 20 64 61 74 61 20 2a 2f 0a 20  mns of data */. 
c830: 20 53 65 6c 65 63 74 44 65 73 74 20 2a 70 44 65   SelectDest *pDe
c840: 73 74 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20  st /* Write the 
c850: 73 6f 72 74 65 64 20 72 65 73 75 6c 74 73 20 68  sorted results h
c860: 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65  ere */.){.  Vdbe
c870: 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56   *v = pParse->pV
c880: 64 62 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  dbe;            
c890: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
c8a0: 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65  prepared stateme
c8b0: 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72  nt */.  int addr
c8c0: 42 72 65 61 6b 20 3d 20 70 53 6f 72 74 2d 3e 6c  Break = pSort->l
c8d0: 61 62 65 6c 44 6f 6e 65 3b 20 20 20 20 20 20 20  abelDone;       
c8e0: 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72       /* Jump her
c8f0: 65 20 74 6f 20 65 78 69 74 20 6c 6f 6f 70 20 2a  e to exit loop *
c900: 2f 0a 20 20 69 6e 74 20 61 64 64 72 43 6f 6e 74  /.  int addrCont
c910: 69 6e 75 65 20 3d 20 73 71 6c 69 74 65 33 56 64  inue = sqlite3Vd
c920: 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 20  beMakeLabel(v); 
c930: 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 66 6f   /* Jump here fo
c940: 72 20 6e 65 78 74 20 63 79 63 6c 65 20 2a 2f 0a  r next cycle */.
c950: 20 20 69 6e 74 20 61 64 64 72 3b 20 20 20 20 20    int addr;     
c960: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c970: 20 20 2f 2a 20 54 6f 70 20 6f 66 20 6f 75 74 70    /* Top of outp
c980: 75 74 20 6c 6f 6f 70 2e 20 4a 75 6d 70 20 66 6f  ut loop. Jump fo
c990: 72 20 4e 65 78 74 2e 20 2a 2f 0a 20 20 69 6e 74  r Next. */.  int
c9a0: 20 61 64 64 72 4f 6e 63 65 20 3d 20 30 3b 0a 20   addrOnce = 0;. 
c9b0: 20 69 6e 74 20 69 54 61 62 3b 0a 20 20 45 78 70   int iTab;.  Exp
c9c0: 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 20  rList *pOrderBy 
c9d0: 3d 20 70 53 6f 72 74 2d 3e 70 4f 72 64 65 72 42  = pSort->pOrderB
c9e0: 79 3b 0a 20 20 69 6e 74 20 65 44 65 73 74 20 3d  y;.  int eDest =
c9f0: 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3b 0a 20   pDest->eDest;. 
ca00: 20 69 6e 74 20 69 50 61 72 6d 20 3d 20 70 44 65   int iParm = pDe
ca10: 73 74 2d 3e 69 53 44 50 61 72 6d 3b 0a 20 20 69  st->iSDParm;.  i
ca20: 6e 74 20 72 65 67 52 6f 77 3b 0a 20 20 69 6e 74  nt regRow;.  int
ca30: 20 72 65 67 52 6f 77 69 64 3b 0a 20 20 69 6e 74   regRowid;.  int
ca40: 20 69 43 6f 6c 3b 0a 20 20 69 6e 74 20 6e 4b 65   iCol;.  int nKe
ca50: 79 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  y;              
ca60: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
ca70: 65 72 20 6f 66 20 6b 65 79 20 63 6f 6c 75 6d 6e  er of key column
ca80: 73 20 69 6e 20 73 6f 72 74 65 72 20 72 65 63 6f  s in sorter reco
ca90: 72 64 20 2a 2f 0a 20 20 69 6e 74 20 69 53 6f 72  rd */.  int iSor
caa0: 74 54 61 62 3b 20 20 20 20 20 20 20 20 20 20 20  tTab;           
cab0: 20 20 20 20 20 20 20 20 2f 2a 20 53 6f 72 74 65          /* Sorte
cac0: 72 20 63 75 72 73 6f 72 20 74 6f 20 72 65 61 64  r cursor to read
cad0: 20 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20 69   from */.  int i
cae0: 3b 0a 20 20 69 6e 74 20 62 53 65 71 3b 20 20 20  ;.  int bSeq;   
caf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cb00: 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 73      /* True if s
cb10: 6f 72 74 65 72 20 72 65 63 6f 72 64 20 69 6e 63  orter record inc
cb20: 6c 75 64 65 73 20 73 65 71 2e 20 6e 6f 2e 20 2a  ludes seq. no. *
cb30: 2f 0a 20 20 69 6e 74 20 6e 52 65 66 4b 65 79 20  /.  int nRefKey 
cb40: 3d 20 30 3b 0a 20 20 73 74 72 75 63 74 20 45 78  = 0;.  struct Ex
cb50: 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 61 4f 75  prList_item *aOu
cb60: 74 45 78 20 3d 20 70 2d 3e 70 45 4c 69 73 74 2d  tEx = p->pEList-
cb70: 3e 61 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 61  >a;..  assert( a
cb80: 64 64 72 42 72 65 61 6b 3c 30 20 29 3b 0a 20 20  ddrBreak<0 );.  
cb90: 69 66 28 20 70 53 6f 72 74 2d 3e 6c 61 62 65 6c  if( pSort->label
cba0: 42 6b 4f 75 74 20 29 7b 0a 20 20 20 20 73 71 6c  BkOut ){.    sql
cbb0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
cbc0: 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 70 53 6f 72  , OP_Gosub, pSor
cbd0: 74 2d 3e 72 65 67 52 65 74 75 72 6e 2c 20 70 53  t->regReturn, pS
cbe0: 6f 72 74 2d 3e 6c 61 62 65 6c 42 6b 4f 75 74 29  ort->labelBkOut)
cbf0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
cc00: 65 47 6f 74 6f 28 76 2c 20 61 64 64 72 42 72 65  eGoto(v, addrBre
cc10: 61 6b 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ak);.    sqlite3
cc20: 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
cc30: 28 76 2c 20 70 53 6f 72 74 2d 3e 6c 61 62 65 6c  (v, pSort->label
cc40: 42 6b 4f 75 74 29 3b 0a 20 20 7d 0a 0a 23 69 66  BkOut);.  }..#if
cc50: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
cc60: 45 5f 53 4f 52 54 45 52 5f 52 45 46 45 52 45 4e  E_SORTER_REFEREN
cc70: 43 45 53 0a 20 20 2f 2a 20 4f 70 65 6e 20 61 6e  CES.  /* Open an
cc80: 79 20 63 75 72 73 6f 72 73 20 6e 65 65 64 65 64  y cursors needed
cc90: 20 66 6f 72 20 73 6f 72 74 65 72 2d 72 65 66 65   for sorter-refe
cca0: 72 65 6e 63 65 20 65 78 70 72 65 73 73 69 6f 6e  rence expression
ccb0: 73 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20  s */.  for(i=0; 
ccc0: 69 3c 70 53 6f 72 74 2d 3e 6e 44 65 66 65 72 3b  i<pSort->nDefer;
ccd0: 20 69 2b 2b 29 7b 0a 20 20 20 20 54 61 62 6c 65   i++){.    Table
cce0: 20 2a 70 54 61 62 20 3d 20 70 53 6f 72 74 2d 3e   *pTab = pSort->
ccf0: 61 44 65 66 65 72 5b 69 5d 2e 70 54 61 62 3b 0a  aDefer[i].pTab;.
cd00: 20 20 20 20 69 6e 74 20 69 44 62 20 3d 20 73 71      int iDb = sq
cd10: 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64  lite3SchemaToInd
cd20: 65 78 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  ex(pParse->db, p
cd30: 54 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20  Tab->pSchema);. 
cd40: 20 20 20 73 71 6c 69 74 65 33 4f 70 65 6e 54 61     sqlite3OpenTa
cd50: 62 6c 65 28 70 50 61 72 73 65 2c 20 70 53 6f 72  ble(pParse, pSor
cd60: 74 2d 3e 61 44 65 66 65 72 5b 69 5d 2e 69 43 73  t->aDefer[i].iCs
cd70: 72 2c 20 69 44 62 2c 20 70 54 61 62 2c 20 4f 50  r, iDb, pTab, OP
cd80: 5f 4f 70 65 6e 52 65 61 64 29 3b 0a 20 20 20 20  _OpenRead);.    
cd90: 6e 52 65 66 4b 65 79 20 3d 20 4d 41 58 28 6e 52  nRefKey = MAX(nR
cda0: 65 66 4b 65 79 2c 20 70 53 6f 72 74 2d 3e 61 44  efKey, pSort->aD
cdb0: 65 66 65 72 5b 69 5d 2e 6e 4b 65 79 29 3b 0a 20  efer[i].nKey);. 
cdc0: 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 69 54 61   }.#endif..  iTa
cdd0: 62 20 3d 20 70 53 6f 72 74 2d 3e 69 45 43 75 72  b = pSort->iECur
cde0: 73 6f 72 3b 0a 20 20 69 66 28 20 65 44 65 73 74  sor;.  if( eDest
cdf0: 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20 7c 7c 20  ==SRT_Output || 
ce00: 65 44 65 73 74 3d 3d 53 52 54 5f 43 6f 72 6f 75  eDest==SRT_Corou
ce10: 74 69 6e 65 20 7c 7c 20 65 44 65 73 74 3d 3d 53  tine || eDest==S
ce20: 52 54 5f 4d 65 6d 20 29 7b 0a 20 20 20 20 72 65  RT_Mem ){.    re
ce30: 67 52 6f 77 69 64 20 3d 20 30 3b 0a 20 20 20 20  gRowid = 0;.    
ce40: 72 65 67 52 6f 77 20 3d 20 70 44 65 73 74 2d 3e  regRow = pDest->
ce50: 69 53 64 73 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a  iSdst;.  }else{.
ce60: 20 20 20 20 72 65 67 52 6f 77 69 64 20 3d 20 73      regRowid = s
ce70: 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67  qlite3GetTempReg
ce80: 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 72 65  (pParse);.    re
ce90: 67 52 6f 77 20 3d 20 73 71 6c 69 74 65 33 47 65  gRow = sqlite3Ge
cea0: 74 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73  tTempRange(pPars
ceb0: 65 2c 20 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20 7d  e, nColumn);.  }
cec0: 0a 20 20 6e 4b 65 79 20 3d 20 70 4f 72 64 65 72  .  nKey = pOrder
ced0: 42 79 2d 3e 6e 45 78 70 72 20 2d 20 70 53 6f 72  By->nExpr - pSor
cee0: 74 2d 3e 6e 4f 42 53 61 74 3b 0a 20 20 69 66 28  t->nOBSat;.  if(
cef0: 20 70 53 6f 72 74 2d 3e 73 6f 72 74 46 6c 61 67   pSort->sortFlag
cf00: 73 20 26 20 53 4f 52 54 46 4c 41 47 5f 55 73 65  s & SORTFLAG_Use
cf10: 53 6f 72 74 65 72 20 29 7b 0a 20 20 20 20 69 6e  Sorter ){.    in
cf20: 74 20 72 65 67 53 6f 72 74 4f 75 74 20 3d 20 2b  t regSortOut = +
cf30: 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
cf40: 20 20 20 69 53 6f 72 74 54 61 62 20 3d 20 70 50     iSortTab = pP
cf50: 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20  arse->nTab++;.  
cf60: 20 20 69 66 28 20 70 53 6f 72 74 2d 3e 6c 61 62    if( pSort->lab
cf70: 65 6c 42 6b 4f 75 74 20 29 7b 0a 20 20 20 20 20  elBkOut ){.     
cf80: 20 61 64 64 72 4f 6e 63 65 20 3d 20 73 71 6c 69   addrOnce = sqli
cf90: 74 65 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c  te3VdbeAddOp0(v,
cfa0: 20 4f 50 5f 4f 6e 63 65 29 3b 20 56 64 62 65 43   OP_Once); VdbeC
cfb0: 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
cfc0: 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  }.    sqlite3Vdb
cfd0: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4f 70  eAddOp3(v, OP_Op
cfe0: 65 6e 50 73 65 75 64 6f 2c 20 69 53 6f 72 74 54  enPseudo, iSortT
cff0: 61 62 2c 20 72 65 67 53 6f 72 74 4f 75 74 2c 20  ab, regSortOut, 
d000: 0a 20 20 20 20 20 20 20 20 6e 4b 65 79 2b 31 2b  .        nKey+1+
d010: 6e 43 6f 6c 75 6d 6e 2b 6e 52 65 66 4b 65 79 29  nColumn+nRefKey)
d020: 3b 0a 20 20 20 20 69 66 28 20 61 64 64 72 4f 6e  ;.    if( addrOn
d030: 63 65 20 29 20 73 71 6c 69 74 65 33 56 64 62 65  ce ) sqlite3Vdbe
d040: 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72  JumpHere(v, addr
d050: 4f 6e 63 65 29 3b 0a 20 20 20 20 61 64 64 72 20  Once);.    addr 
d060: 3d 20 31 20 2b 20 73 71 6c 69 74 65 33 56 64 62  = 1 + sqlite3Vdb
d070: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 6f  eAddOp2(v, OP_So
d080: 72 74 65 72 53 6f 72 74 2c 20 69 54 61 62 2c 20  rterSort, iTab, 
d090: 61 64 64 72 42 72 65 61 6b 29 3b 0a 20 20 20 20  addrBreak);.    
d0a0: 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
d0b0: 0a 20 20 20 20 63 6f 64 65 4f 66 66 73 65 74 28  .    codeOffset(
d0c0: 76 2c 20 70 2d 3e 69 4f 66 66 73 65 74 2c 20 61  v, p->iOffset, a
d0d0: 64 64 72 43 6f 6e 74 69 6e 75 65 29 3b 0a 20 20  ddrContinue);.  
d0e0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
d0f0: 4f 70 33 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72  Op3(v, OP_Sorter
d100: 44 61 74 61 2c 20 69 54 61 62 2c 20 72 65 67 53  Data, iTab, regS
d110: 6f 72 74 4f 75 74 2c 20 69 53 6f 72 74 54 61 62  ortOut, iSortTab
d120: 29 3b 0a 20 20 20 20 62 53 65 71 20 3d 20 30 3b  );.    bSeq = 0;
d130: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 64  .  }else{.    ad
d140: 64 72 20 3d 20 31 20 2b 20 73 71 6c 69 74 65 33  dr = 1 + sqlite3
d150: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
d160: 5f 53 6f 72 74 2c 20 69 54 61 62 2c 20 61 64 64  _Sort, iTab, add
d170: 72 42 72 65 61 6b 29 3b 20 56 64 62 65 43 6f 76  rBreak); VdbeCov
d180: 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 63 6f  erage(v);.    co
d190: 64 65 4f 66 66 73 65 74 28 76 2c 20 70 2d 3e 69  deOffset(v, p->i
d1a0: 4f 66 66 73 65 74 2c 20 61 64 64 72 43 6f 6e 74  Offset, addrCont
d1b0: 69 6e 75 65 29 3b 0a 20 20 20 20 69 53 6f 72 74  inue);.    iSort
d1c0: 54 61 62 20 3d 20 69 54 61 62 3b 0a 20 20 20 20  Tab = iTab;.    
d1d0: 62 53 65 71 20 3d 20 31 3b 0a 20 20 7d 0a 20 20  bSeq = 1;.  }.  
d1e0: 66 6f 72 28 69 3d 30 2c 20 69 43 6f 6c 3d 6e 4b  for(i=0, iCol=nK
d1f0: 65 79 2b 62 53 65 71 2d 31 3b 20 69 3c 6e 43 6f  ey+bSeq-1; i<nCo
d200: 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 23 69 66 64  lumn; i++){.#ifd
d210: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
d220: 5f 53 4f 52 54 45 52 5f 52 45 46 45 52 45 4e 43  _SORTER_REFERENC
d230: 45 53 0a 20 20 20 20 69 66 28 20 61 4f 75 74 45  ES.    if( aOutE
d240: 78 5b 69 5d 2e 62 53 6f 72 74 65 72 52 65 66 20  x[i].bSorterRef 
d250: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 23 65 6e 64  ) continue;.#end
d260: 69 66 0a 20 20 20 20 69 66 28 20 61 4f 75 74 45  if.    if( aOutE
d270: 78 5b 69 5d 2e 75 2e 78 2e 69 4f 72 64 65 72 42  x[i].u.x.iOrderB
d280: 79 43 6f 6c 3d 3d 30 20 29 20 69 43 6f 6c 2b 2b  yCol==0 ) iCol++
d290: 3b 0a 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c  ;.  }.#ifdef SQL
d2a0: 49 54 45 5f 45 4e 41 42 4c 45 5f 53 4f 52 54 45  ITE_ENABLE_SORTE
d2b0: 52 5f 52 45 46 45 52 45 4e 43 45 53 0a 20 20 69  R_REFERENCES.  i
d2c0: 66 28 20 70 53 6f 72 74 2d 3e 6e 44 65 66 65 72  f( pSort->nDefer
d2d0: 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 4b 65 79   ){.    int iKey
d2e0: 20 3d 20 69 43 6f 6c 2b 31 3b 0a 20 20 20 20 69   = iCol+1;.    i
d2f0: 6e 74 20 72 65 67 4b 65 79 20 3d 20 73 71 6c 69  nt regKey = sqli
d300: 74 65 33 47 65 74 54 65 6d 70 52 61 6e 67 65 28  te3GetTempRange(
d310: 70 50 61 72 73 65 2c 20 6e 52 65 66 4b 65 79 29  pParse, nRefKey)
d320: 3b 0a 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  ;..    for(i=0; 
d330: 69 3c 70 53 6f 72 74 2d 3e 6e 44 65 66 65 72 3b  i<pSort->nDefer;
d340: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74   i++){.      int
d350: 20 69 43 73 72 20 3d 20 70 53 6f 72 74 2d 3e 61   iCsr = pSort->a
d360: 44 65 66 65 72 5b 69 5d 2e 69 43 73 72 3b 0a 20  Defer[i].iCsr;. 
d370: 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62       Table *pTab
d380: 20 3d 20 70 53 6f 72 74 2d 3e 61 44 65 66 65 72   = pSort->aDefer
d390: 5b 69 5d 2e 70 54 61 62 3b 0a 20 20 20 20 20 20  [i].pTab;.      
d3a0: 69 6e 74 20 6e 4b 65 79 20 3d 20 70 53 6f 72 74  int nKey = pSort
d3b0: 2d 3e 61 44 65 66 65 72 5b 69 5d 2e 6e 4b 65 79  ->aDefer[i].nKey
d3c0: 3b 0a 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ;..      sqlite3
d3d0: 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
d3e0: 5f 4e 75 6c 6c 52 6f 77 2c 20 69 43 73 72 29 3b  _NullRow, iCsr);
d3f0: 0a 20 20 20 20 20 20 69 66 28 20 48 61 73 52 6f  .      if( HasRo
d400: 77 69 64 28 70 54 61 62 29 20 29 7b 0a 20 20 20  wid(pTab) ){.   
d410: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
d420: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c  AddOp3(v, OP_Col
d430: 75 6d 6e 2c 20 69 53 6f 72 74 54 61 62 2c 20 69  umn, iSortTab, i
d440: 4b 65 79 2b 2b 2c 20 72 65 67 4b 65 79 29 3b 0a  Key++, regKey);.
d450: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
d460: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
d470: 53 65 65 6b 52 6f 77 69 64 2c 20 69 43 73 72 2c  SeekRowid, iCsr,
d480: 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71   .            sq
d490: 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
d4a0: 41 64 64 72 28 76 29 2b 31 2c 20 72 65 67 4b 65  Addr(v)+1, regKe
d4b0: 79 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  y);.      }else{
d4c0: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6b 3b 0a  .        int k;.
d4d0: 20 20 20 20 20 20 20 20 69 6e 74 20 69 4a 6d 70          int iJmp
d4e0: 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
d4f0: 28 20 73 71 6c 69 74 65 33 50 72 69 6d 61 72 79  ( sqlite3Primary
d500: 4b 65 79 49 6e 64 65 78 28 70 54 61 62 29 2d 3e  KeyIndex(pTab)->
d510: 6e 4b 65 79 43 6f 6c 3d 3d 6e 4b 65 79 20 29 3b  nKeyCol==nKey );
d520: 0a 20 20 20 20 20 20 20 20 66 6f 72 28 6b 3d 30  .        for(k=0
d530: 3b 20 6b 3c 6e 4b 65 79 3b 20 6b 2b 2b 29 7b 0a  ; k<nKey; k++){.
d540: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
d550: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
d560: 50 5f 43 6f 6c 75 6d 6e 2c 20 69 53 6f 72 74 54  P_Column, iSortT
d570: 61 62 2c 20 69 4b 65 79 2b 2b 2c 20 72 65 67 4b  ab, iKey++, regK
d580: 65 79 2b 6b 29 3b 0a 20 20 20 20 20 20 20 20 7d  ey+k);.        }
d590: 0a 20 20 20 20 20 20 20 20 69 4a 6d 70 20 3d 20  .        iJmp = 
d5a0: 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
d5b0: 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20  ntAddr(v);.     
d5c0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
d5d0: 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 53 65  dOp4Int(v, OP_Se
d5e0: 65 6b 47 45 2c 20 69 43 73 72 2c 20 69 4a 6d 70  ekGE, iCsr, iJmp
d5f0: 2b 32 2c 20 72 65 67 4b 65 79 2c 20 6e 4b 65 79  +2, regKey, nKey
d600: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
d610: 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28  e3VdbeAddOp4Int(
d620: 76 2c 20 4f 50 5f 49 64 78 4c 45 2c 20 69 43 73  v, OP_IdxLE, iCs
d630: 72 2c 20 69 4a 6d 70 2b 33 2c 20 72 65 67 4b 65  r, iJmp+3, regKe
d640: 79 2c 20 6e 4b 65 79 29 3b 0a 20 20 20 20 20 20  y, nKey);.      
d650: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
d660: 4f 70 31 28 76 2c 20 4f 50 5f 4e 75 6c 6c 52 6f  Op1(v, OP_NullRo
d670: 77 2c 20 69 43 73 72 29 3b 0a 20 20 20 20 20 20  w, iCsr);.      
d680: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  }.    }.    sqli
d690: 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 61  te3ReleaseTempRa
d6a0: 6e 67 65 28 70 50 61 72 73 65 2c 20 72 65 67 4b  nge(pParse, regK
d6b0: 65 79 2c 20 6e 52 65 66 4b 65 79 29 3b 0a 20 20  ey, nRefKey);.  
d6c0: 7d 0a 23 65 6e 64 69 66 0a 20 20 66 6f 72 28 69  }.#endif.  for(i
d6d0: 3d 6e 43 6f 6c 75 6d 6e 2d 31 3b 20 69 3e 3d 30  =nColumn-1; i>=0
d6e0: 3b 20 69 2d 2d 29 7b 0a 23 69 66 64 65 66 20 53  ; i--){.#ifdef S
d6f0: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 4f 52  QLITE_ENABLE_SOR
d700: 54 45 52 5f 52 45 46 45 52 45 4e 43 45 53 0a 20  TER_REFERENCES. 
d710: 20 20 20 69 66 28 20 61 4f 75 74 45 78 5b 69 5d     if( aOutEx[i]
d720: 2e 62 53 6f 72 74 65 72 52 65 66 20 29 7b 0a 20  .bSorterRef ){. 
d730: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
d740: 43 6f 64 65 28 70 50 61 72 73 65 2c 20 61 4f 75  Code(pParse, aOu
d750: 74 45 78 5b 69 5d 2e 70 45 78 70 72 2c 20 72 65  tEx[i].pExpr, re
d760: 67 52 6f 77 2b 69 29 3b 0a 20 20 20 20 7d 65 6c  gRow+i);.    }el
d770: 73 65 0a 23 65 6e 64 69 66 0a 20 20 20 20 7b 0a  se.#endif.    {.
d780: 20 20 20 20 20 20 69 6e 74 20 69 52 65 61 64 3b        int iRead;
d790: 0a 20 20 20 20 20 20 69 66 28 20 61 4f 75 74 45  .      if( aOutE
d7a0: 78 5b 69 5d 2e 75 2e 78 2e 69 4f 72 64 65 72 42  x[i].u.x.iOrderB
d7b0: 79 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  yCol ){.        
d7c0: 69 52 65 61 64 20 3d 20 61 4f 75 74 45 78 5b 69  iRead = aOutEx[i
d7d0: 5d 2e 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f  ].u.x.iOrderByCo
d7e0: 6c 2d 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  l-1;.      }else
d7f0: 7b 0a 20 20 20 20 20 20 20 20 69 52 65 61 64 20  {.        iRead 
d800: 3d 20 69 43 6f 6c 2d 2d 3b 0a 20 20 20 20 20 20  = iCol--;.      
d810: 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  }.      sqlite3V
d820: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
d830: 43 6f 6c 75 6d 6e 2c 20 69 53 6f 72 74 54 61 62  Column, iSortTab
d840: 2c 20 69 52 65 61 64 2c 20 72 65 67 52 6f 77 2b  , iRead, regRow+
d850: 69 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  i);.      VdbeCo
d860: 6d 6d 65 6e 74 28 28 76 2c 20 22 25 73 22 2c 20  mment((v, "%s", 
d870: 61 4f 75 74 45 78 5b 69 5d 2e 7a 4e 61 6d 65 3f  aOutEx[i].zName?
d880: 61 4f 75 74 45 78 5b 69 5d 2e 7a 4e 61 6d 65 20  aOutEx[i].zName 
d890: 3a 20 61 4f 75 74 45 78 5b 69 5d 2e 7a 53 70 61  : aOutEx[i].zSpa
d8a0: 6e 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  n));.    }.  }. 
d8b0: 20 73 77 69 74 63 68 28 20 65 44 65 73 74 20 29   switch( eDest )
d8c0: 7b 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 54  {.    case SRT_T
d8d0: 61 62 6c 65 3a 0a 20 20 20 20 63 61 73 65 20 53  able:.    case S
d8e0: 52 54 5f 45 70 68 65 6d 54 61 62 3a 20 7b 0a 20  RT_EphemTab: {. 
d8f0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
d900: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 77  AddOp2(v, OP_New
d910: 52 6f 77 69 64 2c 20 69 50 61 72 6d 2c 20 72 65  Rowid, iParm, re
d920: 67 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 73  gRowid);.      s
d930: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
d940: 28 76 2c 20 4f 50 5f 49 6e 73 65 72 74 2c 20 69  (v, OP_Insert, i
d950: 50 61 72 6d 2c 20 72 65 67 52 6f 77 2c 20 72 65  Parm, regRow, re
d960: 67 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 73  gRowid);.      s
d970: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
d980: 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f 41 50 50  P5(v, OPFLAG_APP
d990: 45 4e 44 29 3b 0a 20 20 20 20 20 20 62 72 65 61  END);.      brea
d9a0: 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66  k;.    }.#ifndef
d9b0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42   SQLITE_OMIT_SUB
d9c0: 51 55 45 52 59 0a 20 20 20 20 63 61 73 65 20 53  QUERY.    case S
d9d0: 52 54 5f 53 65 74 3a 20 7b 0a 20 20 20 20 20 20  RT_Set: {.      
d9e0: 61 73 73 65 72 74 28 20 6e 43 6f 6c 75 6d 6e 3d  assert( nColumn=
d9f0: 3d 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30  =sqlite3Strlen30
da00: 28 70 44 65 73 74 2d 3e 7a 41 66 66 53 64 73 74  (pDest->zAffSdst
da10: 29 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ) );.      sqlit
da20: 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
da30: 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72  OP_MakeRecord, r
da40: 65 67 52 6f 77 2c 20 6e 43 6f 6c 75 6d 6e 2c 20  egRow, nColumn, 
da50: 72 65 67 52 6f 77 69 64 2c 0a 20 20 20 20 20 20  regRowid,.      
da60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
da70: 20 20 70 44 65 73 74 2d 3e 7a 41 66 66 53 64 73    pDest->zAffSds
da80: 74 2c 20 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20  t, nColumn);.   
da90: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
daa0: 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 49 64  dOp4Int(v, OP_Id
dab0: 78 49 6e 73 65 72 74 2c 20 69 50 61 72 6d 2c 20  xInsert, iParm, 
dac0: 72 65 67 52 6f 77 69 64 2c 20 72 65 67 52 6f 77  regRowid, regRow
dad0: 2c 20 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20  , nColumn);.    
dae0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
daf0: 20 20 20 63 61 73 65 20 53 52 54 5f 4d 65 6d 3a     case SRT_Mem:
db00: 20 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20   {.      /* The 
db10: 4c 49 4d 49 54 20 63 6c 61 75 73 65 20 77 69 6c  LIMIT clause wil
db20: 6c 20 74 65 72 6d 69 6e 61 74 65 20 74 68 65 20  l terminate the 
db30: 6c 6f 6f 70 20 66 6f 72 20 75 73 20 2a 2f 0a 20  loop for us */. 
db40: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
db50: 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 64 65 66  }.#endif.    def
db60: 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 61 73  ault: {.      as
db70: 73 65 72 74 28 20 65 44 65 73 74 3d 3d 53 52 54  sert( eDest==SRT
db80: 5f 4f 75 74 70 75 74 20 7c 7c 20 65 44 65 73 74  _Output || eDest
db90: 3d 3d 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 20  ==SRT_Coroutine 
dba0: 29 3b 20 0a 20 20 20 20 20 20 74 65 73 74 63 61  ); .      testca
dbb0: 73 65 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 4f  se( eDest==SRT_O
dbc0: 75 74 70 75 74 20 29 3b 0a 20 20 20 20 20 20 74  utput );.      t
dbd0: 65 73 74 63 61 73 65 28 20 65 44 65 73 74 3d 3d  estcase( eDest==
dbe0: 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 20 29 3b  SRT_Coroutine );
dbf0: 0a 20 20 20 20 20 20 69 66 28 20 65 44 65 73 74  .      if( eDest
dc00: 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20 29 7b 0a  ==SRT_Output ){.
dc10: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
dc20: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
dc30: 52 65 73 75 6c 74 52 6f 77 2c 20 70 44 65 73 74  ResultRow, pDest
dc40: 2d 3e 69 53 64 73 74 2c 20 6e 43 6f 6c 75 6d 6e  ->iSdst, nColumn
dc50: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
dc60: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
dc70: 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
dc80: 59 69 65 6c 64 2c 20 70 44 65 73 74 2d 3e 69 53  Yield, pDest->iS
dc90: 44 50 61 72 6d 29 3b 0a 20 20 20 20 20 20 7d 0a  DParm);.      }.
dca0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
dcb0: 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 72 65 67   }.  }.  if( reg
dcc0: 52 6f 77 69 64 20 29 7b 0a 20 20 20 20 69 66 28  Rowid ){.    if(
dcd0: 20 65 44 65 73 74 3d 3d 53 52 54 5f 53 65 74 20   eDest==SRT_Set 
dce0: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
dcf0: 52 65 6c 65 61 73 65 54 65 6d 70 52 61 6e 67 65  ReleaseTempRange
dd00: 28 70 50 61 72 73 65 2c 20 72 65 67 52 6f 77 2c  (pParse, regRow,
dd10: 20 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 7d   nColumn);.    }
dd20: 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69  else{.      sqli
dd30: 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
dd40: 67 28 70 50 61 72 73 65 2c 20 72 65 67 52 6f 77  g(pParse, regRow
dd50: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
dd60: 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
dd70: 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 52 6f  eg(pParse, regRo
dd80: 77 69 64 29 3b 0a 20 20 7d 0a 20 20 2f 2a 20 54  wid);.  }.  /* T
dd90: 68 65 20 62 6f 74 74 6f 6d 20 6f 66 20 74 68 65  he bottom of the
dda0: 20 6c 6f 6f 70 0a 20 20 2a 2f 0a 20 20 73 71 6c   loop.  */.  sql
ddb0: 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
ddc0: 61 62 65 6c 28 76 2c 20 61 64 64 72 43 6f 6e 74  abel(v, addrCont
ddd0: 69 6e 75 65 29 3b 0a 20 20 69 66 28 20 70 53 6f  inue);.  if( pSo
dde0: 72 74 2d 3e 73 6f 72 74 46 6c 61 67 73 20 26 20  rt->sortFlags & 
ddf0: 53 4f 52 54 46 4c 41 47 5f 55 73 65 53 6f 72 74  SORTFLAG_UseSort
de00: 65 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  er ){.    sqlite
de10: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
de20: 50 5f 53 6f 72 74 65 72 4e 65 78 74 2c 20 69 54  P_SorterNext, iT
de30: 61 62 2c 20 61 64 64 72 29 3b 20 56 64 62 65 43  ab, addr); VdbeC
de40: 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 7d 65  overage(v);.  }e
de50: 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  lse{.    sqlite3
de60: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
de70: 5f 4e 65 78 74 2c 20 69 54 61 62 2c 20 61 64 64  _Next, iTab, add
de80: 72 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  r); VdbeCoverage
de90: 28 76 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  (v);.  }.  if( p
dea0: 53 6f 72 74 2d 3e 72 65 67 52 65 74 75 72 6e 20  Sort->regReturn 
deb0: 29 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  ) sqlite3VdbeAdd
dec0: 4f 70 31 28 76 2c 20 4f 50 5f 52 65 74 75 72 6e  Op1(v, OP_Return
ded0: 2c 20 70 53 6f 72 74 2d 3e 72 65 67 52 65 74 75  , pSort->regRetu
dee0: 72 6e 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  rn);.  sqlite3Vd
def0: 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
df00: 2c 20 61 64 64 72 42 72 65 61 6b 29 3b 0a 7d 0a  , addrBreak);.}.
df10: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20  ./*.** Return a 
df20: 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 73 74 72  pointer to a str
df30: 69 6e 67 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  ing containing t
df40: 68 65 20 27 64 65 63 6c 61 72 61 74 69 6f 6e 20  he 'declaration 
df50: 74 79 70 65 27 20 6f 66 20 74 68 65 0a 2a 2a 20  type' of the.** 
df60: 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70 72  expression pExpr
df70: 2e 20 54 68 65 20 73 74 72 69 6e 67 20 6d 61 79  . The string may
df80: 20 62 65 20 74 72 65 61 74 65 64 20 61 73 20 73   be treated as s
df90: 74 61 74 69 63 20 62 79 20 74 68 65 20 63 61 6c  tatic by the cal
dfa0: 6c 65 72 2e 0a 2a 2a 0a 2a 2a 20 41 6c 73 6f 20  ler..**.** Also 
dfb0: 74 72 79 20 74 6f 20 65 73 74 69 6d 61 74 65 20  try to estimate 
dfc0: 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
dfd0: 72 65 74 75 72 6e 65 64 20 76 61 6c 75 65 20 61  returned value a
dfe0: 6e 64 20 72 65 74 75 72 6e 20 74 68 61 74 0a 2a  nd return that.*
dff0: 2a 20 72 65 73 75 6c 74 20 69 6e 20 2a 70 45 73  * result in *pEs
e000: 74 57 69 64 74 68 2e 0a 2a 2a 0a 2a 2a 20 54 68  tWidth..**.** Th
e010: 65 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 74 79  e declaration ty
e020: 70 65 20 69 73 20 74 68 65 20 65 78 61 63 74 20  pe is the exact 
e030: 64 61 74 61 74 79 70 65 20 64 65 66 69 6e 69 74  datatype definit
e040: 69 6f 6e 20 65 78 74 72 61 63 74 65 64 20 66 72  ion extracted fr
e050: 6f 6d 20 74 68 65 0a 2a 2a 20 6f 72 69 67 69 6e  om the.** origin
e060: 61 6c 20 43 52 45 41 54 45 20 54 41 42 4c 45 20  al CREATE TABLE 
e070: 73 74 61 74 65 6d 65 6e 74 20 69 66 20 74 68 65  statement if the
e080: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61   expression is a
e090: 20 63 6f 6c 75 6d 6e 2e 20 54 68 65 0a 2a 2a 20   column. The.** 
e0a0: 64 65 63 6c 61 72 61 74 69 6f 6e 20 74 79 70 65  declaration type
e0b0: 20 66 6f 72 20 61 20 52 4f 57 49 44 20 66 69 65   for a ROWID fie
e0c0: 6c 64 20 69 73 20 49 4e 54 45 47 45 52 2e 20 45  ld is INTEGER. E
e0d0: 78 61 63 74 6c 79 20 77 68 65 6e 20 61 6e 20 65  xactly when an e
e0e0: 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 69 73 20  xpression.** is 
e0f0: 63 6f 6e 73 69 64 65 72 65 64 20 61 20 63 6f 6c  considered a col
e100: 75 6d 6e 20 63 61 6e 20 62 65 20 63 6f 6d 70 6c  umn can be compl
e110: 65 78 20 69 6e 20 74 68 65 20 70 72 65 73 65 6e  ex in the presen
e120: 63 65 20 6f 66 20 73 75 62 71 75 65 72 69 65 73  ce of subqueries
e130: 2e 20 54 68 65 0a 2a 2a 20 72 65 73 75 6c 74 2d  . The.** result-
e140: 73 65 74 20 65 78 70 72 65 73 73 69 6f 6e 20 69  set expression i
e150: 6e 20 61 6c 6c 20 6f 66 20 74 68 65 20 66 6f 6c  n all of the fol
e160: 6c 6f 77 69 6e 67 20 53 45 4c 45 43 54 20 73 74  lowing SELECT st
e170: 61 74 65 6d 65 6e 74 73 20 69 73 20 0a 2a 2a 20  atements is .** 
e180: 63 6f 6e 73 69 64 65 72 65 64 20 61 20 63 6f 6c  considered a col
e190: 75 6d 6e 20 62 79 20 74 68 69 73 20 66 75 6e 63  umn by this func
e1a0: 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 53 45  tion..**.**   SE
e1b0: 4c 45 43 54 20 63 6f 6c 20 46 52 4f 4d 20 74 62  LECT col FROM tb
e1c0: 6c 3b 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20 28  l;.**   SELECT (
e1d0: 53 45 4c 45 43 54 20 63 6f 6c 20 46 52 4f 4d 20  SELECT col FROM 
e1e0: 74 62 6c 3b 0a 2a 2a 20 20 20 53 45 4c 45 43 54  tbl;.**   SELECT
e1f0: 20 28 53 45 4c 45 43 54 20 63 6f 6c 20 46 52 4f   (SELECT col FRO
e200: 4d 20 74 62 6c 29 3b 0a 2a 2a 20 20 20 53 45 4c  M tbl);.**   SEL
e210: 45 43 54 20 61 62 63 20 46 52 4f 4d 20 28 53 45  ECT abc FROM (SE
e220: 4c 45 43 54 20 63 6f 6c 20 41 53 20 61 62 63 20  LECT col AS abc 
e230: 46 52 4f 4d 20 74 62 6c 29 3b 0a 2a 2a 20 0a 2a  FROM tbl);.** .*
e240: 2a 20 54 68 65 20 64 65 63 6c 61 72 61 74 69 6f  * The declaratio
e250: 6e 20 74 79 70 65 20 66 6f 72 20 61 6e 79 20 65  n type for any e
e260: 78 70 72 65 73 73 69 6f 6e 20 6f 74 68 65 72 20  xpression other 
e270: 74 68 61 6e 20 61 20 63 6f 6c 75 6d 6e 20 69 73  than a column is
e280: 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 69   NULL..**.** Thi
e290: 73 20 72 6f 75 74 69 6e 65 20 68 61 73 20 65 69  s routine has ei
e2a0: 74 68 65 72 20 33 20 6f 72 20 36 20 70 61 72 61  ther 3 or 6 para
e2b0: 6d 65 74 65 72 73 20 64 65 70 65 6e 64 69 6e 67  meters depending
e2c0: 20 6f 6e 20 77 68 65 74 68 65 72 20 6f 72 20 6e   on whether or n
e2d0: 6f 74 0a 2a 2a 20 74 68 65 20 53 51 4c 49 54 45  ot.** the SQLITE
e2e0: 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d  _ENABLE_COLUMN_M
e2f0: 45 54 41 44 41 54 41 20 63 6f 6d 70 69 6c 65 2d  ETADATA compile-
e300: 74 69 6d 65 20 6f 70 74 69 6f 6e 20 69 73 20 75  time option is u
e310: 73 65 64 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53  sed..*/.#ifdef S
e320: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c  QLITE_ENABLE_COL
e330: 55 4d 4e 5f 4d 45 54 41 44 41 54 41 0a 23 20 64  UMN_METADATA.# d
e340: 65 66 69 6e 65 20 63 6f 6c 75 6d 6e 54 79 70 65  efine columnType
e350: 28 41 2c 42 2c 43 2c 44 2c 45 29 20 63 6f 6c 75  (A,B,C,D,E) colu
e360: 6d 6e 54 79 70 65 49 6d 70 6c 28 41 2c 42 2c 43  mnTypeImpl(A,B,C
e370: 2c 44 2c 45 29 0a 23 65 6c 73 65 20 2f 2a 20 69  ,D,E).#else /* i
e380: 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
e390: 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f  E_ENABLE_COLUMN_
e3a0: 4d 45 54 41 44 41 54 41 29 20 2a 2f 0a 23 20 64  METADATA) */.# d
e3b0: 65 66 69 6e 65 20 63 6f 6c 75 6d 6e 54 79 70 65  efine columnType
e3c0: 28 41 2c 42 2c 43 2c 44 2c 45 29 20 63 6f 6c 75  (A,B,C,D,E) colu
e3d0: 6d 6e 54 79 70 65 49 6d 70 6c 28 41 2c 42 29 0a  mnTypeImpl(A,B).
e3e0: 23 65 6e 64 69 66 0a 73 74 61 74 69 63 20 63 6f  #endif.static co
e3f0: 6e 73 74 20 63 68 61 72 20 2a 63 6f 6c 75 6d 6e  nst char *column
e400: 54 79 70 65 49 6d 70 6c 28 0a 20 20 4e 61 6d 65  TypeImpl(.  Name
e410: 43 6f 6e 74 65 78 74 20 2a 70 4e 43 2c 20 0a 23  Context *pNC, .#
e420: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  ifndef SQLITE_EN
e430: 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41  ABLE_COLUMN_META
e440: 44 41 54 41 0a 20 20 45 78 70 72 20 2a 70 45 78  DATA.  Expr *pEx
e450: 70 72 0a 23 65 6c 73 65 0a 20 20 45 78 70 72 20  pr.#else.  Expr 
e460: 2a 70 45 78 70 72 2c 0a 20 20 63 6f 6e 73 74 20  *pExpr,.  const 
e470: 63 68 61 72 20 2a 2a 70 7a 4f 72 69 67 44 62 2c  char **pzOrigDb,
e480: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a  .  const char **
e490: 70 7a 4f 72 69 67 54 61 62 2c 0a 20 20 63 6f 6e  pzOrigTab,.  con
e4a0: 73 74 20 63 68 61 72 20 2a 2a 70 7a 4f 72 69 67  st char **pzOrig
e4b0: 43 6f 6c 0a 23 65 6e 64 69 66 0a 29 7b 0a 20 20  Col.#endif.){.  
e4c0: 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 54 79 70  char const *zTyp
e4d0: 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6a 3b 0a  e = 0;.  int j;.
e4e0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
e4f0: 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41  ABLE_COLUMN_META
e500: 44 41 54 41 0a 20 20 63 68 61 72 20 63 6f 6e 73  DATA.  char cons
e510: 74 20 2a 7a 4f 72 69 67 44 62 20 3d 20 30 3b 0a  t *zOrigDb = 0;.
e520: 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 4f    char const *zO
e530: 72 69 67 54 61 62 20 3d 20 30 3b 0a 20 20 63 68  rigTab = 0;.  ch
e540: 61 72 20 63 6f 6e 73 74 20 2a 7a 4f 72 69 67 43  ar const *zOrigC
e550: 6f 6c 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a  ol = 0;.#endif..
e560: 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 21    assert( pExpr!
e570: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
e580: 70 4e 43 2d 3e 70 53 72 63 4c 69 73 74 21 3d 30  pNC->pSrcList!=0
e590: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45   );.  assert( pE
e5a0: 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 41 47 47 5f  xpr->op!=TK_AGG_
e5b0: 43 4f 4c 55 4d 4e 20 29 3b 20 20 2f 2a 20 54 68  COLUMN );  /* Th
e5c0: 69 73 20 72 6f 75 74 69 6e 65 20 72 75 6e 65 73  is routine runes
e5d0: 20 62 65 66 6f 72 65 20 61 67 67 72 65 67 61 74   before aggregat
e5e0: 65 73 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  es.             
e5f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e600: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61 72 65            ** are
e610: 20 70 72 6f 63 65 73 73 65 64 20 2a 2f 0a 20 20   processed */.  
e620: 73 77 69 74 63 68 28 20 70 45 78 70 72 2d 3e 6f  switch( pExpr->o
e630: 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b  p ){.    case TK
e640: 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20 20  _COLUMN: {.     
e650: 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73 69   /* The expressi
e660: 6f 6e 20 69 73 20 61 20 63 6f 6c 75 6d 6e 2e 20  on is a column. 
e670: 4c 6f 63 61 74 65 20 74 68 65 20 74 61 62 6c 65  Locate the table
e680: 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69 73 20 62   the column is b
e690: 65 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 65 78  eing.      ** ex
e6a0: 74 72 61 63 74 65 64 20 66 72 6f 6d 20 69 6e 20  tracted from in 
e6b0: 4e 61 6d 65 43 6f 6e 74 65 78 74 2e 70 53 72 63  NameContext.pSrc
e6c0: 4c 69 73 74 2e 20 54 68 69 73 20 74 61 62 6c 65  List. This table
e6d0: 20 6d 61 79 20 62 65 20 72 65 61 6c 0a 20 20 20   may be real.   
e6e0: 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 74     ** database t
e6f0: 61 62 6c 65 20 6f 72 20 61 20 73 75 62 71 75 65  able or a subque
e700: 72 79 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ry..      */.   
e710: 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d     Table *pTab =
e720: 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f   0;            /
e730: 2a 20 54 61 62 6c 65 20 73 74 72 75 63 74 75 72  * Table structur
e740: 65 20 63 6f 6c 75 6d 6e 20 69 73 20 65 78 74 72  e column is extr
e750: 61 63 74 65 64 20 66 72 6f 6d 20 2a 2f 0a 20 20  acted from */.  
e760: 20 20 20 20 53 65 6c 65 63 74 20 2a 70 53 20 3d      Select *pS =
e770: 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
e780: 2f 2a 20 53 65 6c 65 63 74 20 74 68 65 20 63 6f  /* Select the co
e790: 6c 75 6d 6e 20 69 73 20 65 78 74 72 61 63 74 65  lumn is extracte
e7a0: 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 20 20 20 20  d from */.      
e7b0: 69 6e 74 20 69 43 6f 6c 20 3d 20 70 45 78 70 72  int iCol = pExpr
e7c0: 2d 3e 69 43 6f 6c 75 6d 6e 3b 20 20 2f 2a 20 49  ->iColumn;  /* I
e7d0: 6e 64 65 78 20 6f 66 20 63 6f 6c 75 6d 6e 20 69  ndex of column i
e7e0: 6e 20 70 54 61 62 20 2a 2f 0a 20 20 20 20 20 20  n pTab */.      
e7f0: 77 68 69 6c 65 28 20 70 4e 43 20 26 26 20 21 70  while( pNC && !p
e800: 54 61 62 20 29 7b 0a 20 20 20 20 20 20 20 20 53  Tab ){.        S
e810: 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74  rcList *pTabList
e820: 20 3d 20 70 4e 43 2d 3e 70 53 72 63 4c 69 73 74   = pNC->pSrcList
e830: 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d  ;.        for(j=
e840: 30 3b 6a 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53  0;j<pTabList->nS
e850: 72 63 20 26 26 20 70 54 61 62 4c 69 73 74 2d 3e  rc && pTabList->
e860: 61 5b 6a 5d 2e 69 43 75 72 73 6f 72 21 3d 70 45  a[j].iCursor!=pE
e870: 78 70 72 2d 3e 69 54 61 62 6c 65 3b 6a 2b 2b 29  xpr->iTable;j++)
e880: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6a 3c  ;.        if( j<
e890: 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 20 29  pTabList->nSrc )
e8a0: 7b 0a 20 20 20 20 20 20 20 20 20 20 70 54 61 62  {.          pTab
e8b0: 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 6a   = pTabList->a[j
e8c0: 5d 2e 70 54 61 62 3b 0a 20 20 20 20 20 20 20 20  ].pTab;.        
e8d0: 20 20 70 53 20 3d 20 70 54 61 62 4c 69 73 74 2d    pS = pTabList-
e8e0: 3e 61 5b 6a 5d 2e 70 53 65 6c 65 63 74 3b 0a 20  >a[j].pSelect;. 
e8f0: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
e900: 20 20 20 20 20 20 20 20 70 4e 43 20 3d 20 70 4e          pNC = pN
e910: 43 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20  C->pNext;.      
e920: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20    }.      }..   
e930: 20 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29     if( pTab==0 )
e940: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 74 20  {.        /* At 
e950: 6f 6e 65 20 74 69 6d 65 2c 20 63 6f 64 65 20 73  one time, code s
e960: 75 63 68 20 61 73 20 22 53 45 4c 45 43 54 20 6e  uch as "SELECT n
e970: 65 77 2e 78 22 20 77 69 74 68 69 6e 20 61 20 74  ew.x" within a t
e980: 72 69 67 67 65 72 20 77 6f 75 6c 64 0a 20 20 20  rigger would.   
e990: 20 20 20 20 20 2a 2a 20 63 61 75 73 65 20 74 68       ** cause th
e9a0: 69 73 20 63 6f 6e 64 69 74 69 6f 6e 20 74 6f 20  is condition to 
e9b0: 72 75 6e 2e 20 20 53 69 6e 63 65 20 74 68 65 6e  run.  Since then
e9c0: 2c 20 77 65 20 68 61 76 65 20 72 65 73 74 72 75  , we have restru
e9d0: 63 74 75 72 65 64 20 68 6f 77 0a 20 20 20 20 20  ctured how.     
e9e0: 20 20 20 2a 2a 20 74 72 69 67 67 65 72 20 63 6f     ** trigger co
e9f0: 64 65 20 69 73 20 67 65 6e 65 72 61 74 65 64 20  de is generated 
ea00: 61 6e 64 20 73 6f 20 74 68 69 73 20 63 6f 6e 64  and so this cond
ea10: 69 74 69 6f 6e 20 69 73 20 6e 6f 20 6c 6f 6e 67  ition is no long
ea20: 65 72 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 70  er .        ** p
ea30: 6f 73 73 69 62 6c 65 2e 20 48 6f 77 65 76 65 72  ossible. However
ea40: 2c 20 69 74 20 63 61 6e 20 73 74 69 6c 6c 20 62  , it can still b
ea50: 65 20 74 72 75 65 20 66 6f 72 20 73 74 61 74 65  e true for state
ea60: 6d 65 6e 74 73 20 6c 69 6b 65 0a 20 20 20 20 20  ments like.     
ea70: 20 20 20 2a 2a 20 74 68 65 20 66 6f 6c 6c 6f 77     ** the follow
ea80: 69 6e 67 3a 0a 20 20 20 20 20 20 20 20 2a 2a 0a  ing:.        **.
ea90: 20 20 20 20 20 20 20 20 2a 2a 20 20 20 43 52 45          **   CRE
eaa0: 41 54 45 20 54 41 42 4c 45 20 74 31 28 63 6f 6c  ATE TABLE t1(col
eab0: 20 49 4e 54 45 47 45 52 29 3b 0a 20 20 20 20 20   INTEGER);.     
eac0: 20 20 20 2a 2a 20 20 20 53 45 4c 45 43 54 20 28     **   SELECT (
ead0: 53 45 4c 45 43 54 20 74 31 2e 63 6f 6c 29 20 46  SELECT t1.col) F
eae0: 52 4f 4d 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20  ROM FROM t1;.   
eaf0: 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
eb00: 2a 2a 20 77 68 65 6e 20 63 6f 6c 75 6d 6e 54 79  ** when columnTy
eb10: 70 65 28 29 20 69 73 20 63 61 6c 6c 65 64 20 6f  pe() is called o
eb20: 6e 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  n the expression
eb30: 20 22 74 31 2e 63 6f 6c 22 20 69 6e 20 74 68 65   "t1.col" in the
eb40: 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 75 62   .        ** sub
eb50: 2d 73 65 6c 65 63 74 2e 20 49 6e 20 74 68 69 73  -select. In this
eb60: 20 63 61 73 65 2c 20 73 65 74 20 74 68 65 20 63   case, set the c
eb70: 6f 6c 75 6d 6e 20 74 79 70 65 20 74 6f 20 4e 55  olumn type to NU
eb80: 4c 4c 2c 20 65 76 65 6e 0a 20 20 20 20 20 20 20  LL, even.       
eb90: 20 2a 2a 20 74 68 6f 75 67 68 20 69 74 20 73 68   ** though it sh
eba0: 6f 75 6c 64 20 72 65 61 6c 6c 79 20 62 65 20 22  ould really be "
ebb0: 49 4e 54 45 47 45 52 22 2e 0a 20 20 20 20 20 20  INTEGER"..      
ebc0: 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20    **.        ** 
ebd0: 54 68 69 73 20 69 73 20 6e 6f 74 20 61 20 70 72  This is not a pr
ebe0: 6f 62 6c 65 6d 2c 20 61 73 20 74 68 65 20 63 6f  oblem, as the co
ebf0: 6c 75 6d 6e 20 74 79 70 65 20 6f 66 20 22 74 31  lumn type of "t1
ec00: 2e 63 6f 6c 22 20 69 73 20 6e 65 76 65 72 0a 20  .col" is never. 
ec10: 20 20 20 20 20 20 20 2a 2a 20 75 73 65 64 2e 20         ** used. 
ec20: 57 68 65 6e 20 63 6f 6c 75 6d 6e 54 79 70 65 28  When columnType(
ec30: 29 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e 20 74  ) is called on t
ec40: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 0a 20  he expression . 
ec50: 20 20 20 20 20 20 20 2a 2a 20 22 28 53 45 4c 45         ** "(SELE
ec60: 43 54 20 74 31 2e 63 6f 6c 29 22 2c 20 74 68 65  CT t1.col)", the
ec70: 20 63 6f 72 72 65 63 74 20 74 79 70 65 20 69 73   correct type is
ec80: 20 72 65 74 75 72 6e 65 64 20 28 73 65 65 20 74   returned (see t
ec90: 68 65 20 54 4b 5f 53 45 4c 45 43 54 0a 20 20 20  he TK_SELECT.   
eca0: 20 20 20 20 20 2a 2a 20 62 72 61 6e 63 68 20 62       ** branch b
ecb0: 65 6c 6f 77 2e 20 20 2a 2f 0a 20 20 20 20 20 20  elow.  */.      
ecc0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
ecd0: 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ..      assert( 
ece0: 70 54 61 62 20 26 26 20 70 45 78 70 72 2d 3e 79  pTab && pExpr->y
ecf0: 2e 70 54 61 62 3d 3d 70 54 61 62 20 29 3b 0a 20  .pTab==pTab );. 
ed00: 20 20 20 20 20 69 66 28 20 70 53 20 29 7b 0a 20       if( pS ){. 
ed10: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 22 74         /* The "t
ed20: 61 62 6c 65 22 20 69 73 20 61 63 74 75 61 6c 6c  able" is actuall
ed30: 79 20 61 20 73 75 62 2d 73 65 6c 65 63 74 20 6f  y a sub-select o
ed40: 72 20 61 20 76 69 65 77 20 69 6e 20 74 68 65 20  r a view in the 
ed50: 46 52 4f 4d 20 63 6c 61 75 73 65 0a 20 20 20 20  FROM clause.    
ed60: 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 53 45      ** of the SE
ed70: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 20  LECT statement. 
ed80: 52 65 74 75 72 6e 20 74 68 65 20 64 65 63 6c 61  Return the decla
ed90: 72 61 74 69 6f 6e 20 74 79 70 65 20 61 6e 64 20  ration type and 
eda0: 6f 72 69 67 69 6e 0a 20 20 20 20 20 20 20 20 2a  origin.        *
edb0: 2a 20 64 61 74 61 20 66 6f 72 20 74 68 65 20 72  * data for the r
edc0: 65 73 75 6c 74 2d 73 65 74 20 63 6f 6c 75 6d 6e  esult-set column
edd0: 20 6f 66 20 74 68 65 20 73 75 62 2d 73 65 6c 65   of the sub-sele
ede0: 63 74 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  ct..        */. 
edf0: 20 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3e         if( iCol>
ee00: 3d 30 20 26 26 20 69 43 6f 6c 3c 70 53 2d 3e 70  =0 && iCol<pS->p
ee10: 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 7b 0a  EList->nExpr ){.
ee20: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20            /* If 
ee30: 69 43 6f 6c 20 69 73 20 6c 65 73 73 20 74 68 61  iCol is less tha
ee40: 6e 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65  n zero, then the
ee50: 20 65 78 70 72 65 73 73 69 6f 6e 20 72 65 71 75   expression requ
ee60: 65 73 74 73 20 74 68 65 0a 20 20 20 20 20 20 20  ests the.       
ee70: 20 20 20 2a 2a 20 72 6f 77 69 64 20 6f 66 20 74     ** rowid of t
ee80: 68 65 20 73 75 62 2d 73 65 6c 65 63 74 20 6f 72  he sub-select or
ee90: 20 76 69 65 77 2e 20 54 68 69 73 20 65 78 70 72   view. This expr
eea0: 65 73 73 69 6f 6e 20 69 73 20 6c 65 67 61 6c 20  ession is legal 
eeb0: 28 73 65 65 20 0a 20 20 20 20 20 20 20 20 20 20  (see .          
eec0: 2a 2a 20 74 65 73 74 20 63 61 73 65 20 6d 69 73  ** test case mis
eed0: 63 32 2e 32 2e 32 29 20 2d 20 69 74 20 61 6c 77  c2.2.2) - it alw
eee0: 61 79 73 20 65 76 61 6c 75 61 74 65 73 20 74 6f  ays evaluates to
eef0: 20 4e 55 4c 4c 2e 0a 20 20 20 20 20 20 20 20 20   NULL..         
ef00: 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 4e 61   */.          Na
ef10: 6d 65 43 6f 6e 74 65 78 74 20 73 4e 43 3b 0a 20  meContext sNC;. 
ef20: 20 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70           Expr *p
ef30: 20 3d 20 70 53 2d 3e 70 45 4c 69 73 74 2d 3e 61   = pS->pEList->a
ef40: 5b 69 43 6f 6c 5d 2e 70 45 78 70 72 3b 0a 20 20  [iCol].pExpr;.  
ef50: 20 20 20 20 20 20 20 20 73 4e 43 2e 70 53 72 63          sNC.pSrc
ef60: 4c 69 73 74 20 3d 20 70 53 2d 3e 70 53 72 63 3b  List = pS->pSrc;
ef70: 0a 20 20 20 20 20 20 20 20 20 20 73 4e 43 2e 70  .          sNC.p
ef80: 4e 65 78 74 20 3d 20 70 4e 43 3b 0a 20 20 20 20  Next = pNC;.    
ef90: 20 20 20 20 20 20 73 4e 43 2e 70 50 61 72 73 65        sNC.pParse
efa0: 20 3d 20 70 4e 43 2d 3e 70 50 61 72 73 65 3b 0a   = pNC->pParse;.
efb0: 20 20 20 20 20 20 20 20 20 20 7a 54 79 70 65 20            zType 
efc0: 3d 20 63 6f 6c 75 6d 6e 54 79 70 65 28 26 73 4e  = columnType(&sN
efd0: 43 2c 20 70 2c 26 7a 4f 72 69 67 44 62 2c 26 7a  C, p,&zOrigDb,&z
efe0: 4f 72 69 67 54 61 62 2c 26 7a 4f 72 69 67 43 6f  OrigTab,&zOrigCo
eff0: 6c 29 3b 20 0a 20 20 20 20 20 20 20 20 7d 0a 20  l); .        }. 
f000: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
f010: 20 20 20 20 2f 2a 20 41 20 72 65 61 6c 20 74 61      /* A real ta
f020: 62 6c 65 20 6f 72 20 61 20 43 54 45 20 74 61 62  ble or a CTE tab
f030: 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73  le */.        as
f040: 73 65 72 74 28 20 21 70 53 20 29 3b 0a 23 69 66  sert( !pS );.#if
f050: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
f060: 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41 54  E_COLUMN_METADAT
f070: 41 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 43  A.        if( iC
f080: 6f 6c 3c 30 20 29 20 69 43 6f 6c 20 3d 20 70 54  ol<0 ) iCol = pT
f090: 61 62 2d 3e 69 50 4b 65 79 3b 0a 20 20 20 20 20  ab->iPKey;.     
f0a0: 20 20 20 61 73 73 65 72 74 28 20 69 43 6f 6c 3d     assert( iCol=
f0b0: 3d 58 4e 5f 52 4f 57 49 44 20 7c 7c 20 28 69 43  =XN_ROWID || (iC
f0c0: 6f 6c 3e 3d 30 20 26 26 20 69 43 6f 6c 3c 70 54  ol>=0 && iCol<pT
f0d0: 61 62 2d 3e 6e 43 6f 6c 29 20 29 3b 0a 20 20 20  ab->nCol) );.   
f0e0: 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20       if( iCol<0 
f0f0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 54 79  ){.          zTy
f100: 70 65 20 3d 20 22 49 4e 54 45 47 45 52 22 3b 0a  pe = "INTEGER";.
f110: 20 20 20 20 20 20 20 20 20 20 7a 4f 72 69 67 43            zOrigC
f120: 6f 6c 20 3d 20 22 72 6f 77 69 64 22 3b 0a 20 20  ol = "rowid";.  
f130: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
f140: 20 20 20 20 20 20 20 7a 4f 72 69 67 43 6f 6c 20         zOrigCol 
f150: 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f  = pTab->aCol[iCo
f160: 6c 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20  l].zName;.      
f170: 20 20 20 20 7a 54 79 70 65 20 3d 20 73 71 6c 69      zType = sqli
f180: 74 65 33 43 6f 6c 75 6d 6e 54 79 70 65 28 26 70  te3ColumnType(&p
f190: 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2c  Tab->aCol[iCol],
f1a0: 30 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  0);.        }.  
f1b0: 20 20 20 20 20 20 7a 4f 72 69 67 54 61 62 20 3d        zOrigTab =
f1c0: 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 3b 0a 20 20   pTab->zName;.  
f1d0: 20 20 20 20 20 20 69 66 28 20 70 4e 43 2d 3e 70        if( pNC->p
f1e0: 50 61 72 73 65 20 26 26 20 70 54 61 62 2d 3e 70  Parse && pTab->p
f1f0: 53 63 68 65 6d 61 20 29 7b 0a 20 20 20 20 20 20  Schema ){.      
f200: 20 20 20 20 69 6e 74 20 69 44 62 20 3d 20 73 71      int iDb = sq
f210: 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64  lite3SchemaToInd
f220: 65 78 28 70 4e 43 2d 3e 70 50 61 72 73 65 2d 3e  ex(pNC->pParse->
f230: 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d  db, pTab->pSchem
f240: 61 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7a 4f  a);.          zO
f250: 72 69 67 44 62 20 3d 20 70 4e 43 2d 3e 70 50 61  rigDb = pNC->pPa
f260: 72 73 65 2d 3e 64 62 2d 3e 61 44 62 5b 69 44 62  rse->db->aDb[iDb
f270: 5d 2e 7a 44 62 53 4e 61 6d 65 3b 0a 20 20 20 20  ].zDbSName;.    
f280: 20 20 20 20 7d 0a 23 65 6c 73 65 0a 20 20 20 20      }.#else.    
f290: 20 20 20 20 61 73 73 65 72 74 28 20 69 43 6f 6c      assert( iCol
f2a0: 3d 3d 58 4e 5f 52 4f 57 49 44 20 7c 7c 20 28 69  ==XN_ROWID || (i
f2b0: 43 6f 6c 3e 3d 30 20 26 26 20 69 43 6f 6c 3c 70  Col>=0 && iCol<p
f2c0: 54 61 62 2d 3e 6e 43 6f 6c 29 20 29 3b 0a 20 20  Tab->nCol) );.  
f2d0: 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30        if( iCol<0
f2e0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 54   ){.          zT
f2f0: 79 70 65 20 3d 20 22 49 4e 54 45 47 45 52 22 3b  ype = "INTEGER";
f300: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
f310: 20 20 20 20 20 20 20 20 20 20 7a 54 79 70 65 20            zType 
f320: 3d 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 54  = sqlite3ColumnT
f330: 79 70 65 28 26 70 54 61 62 2d 3e 61 43 6f 6c 5b  ype(&pTab->aCol[
f340: 69 43 6f 6c 5d 2c 30 29 3b 0a 20 20 20 20 20 20  iCol],0);.      
f350: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20    }.#endif.     
f360: 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
f370: 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51      }.#ifndef SQ
f380: 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
f390: 52 59 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53  RY.    case TK_S
f3a0: 45 4c 45 43 54 3a 20 7b 0a 20 20 20 20 20 20 2f  ELECT: {.      /
f3b0: 2a 20 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e  * The expression
f3c0: 20 69 73 20 61 20 73 75 62 2d 73 65 6c 65 63 74   is a sub-select
f3d0: 2e 20 52 65 74 75 72 6e 20 74 68 65 20 64 65 63  . Return the dec
f3e0: 6c 61 72 61 74 69 6f 6e 20 74 79 70 65 20 61 6e  laration type an
f3f0: 64 0a 20 20 20 20 20 20 2a 2a 20 6f 72 69 67 69  d.      ** origi
f400: 6e 20 69 6e 66 6f 20 66 6f 72 20 74 68 65 20 73  n info for the s
f410: 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e 20 69 6e 20  ingle column in 
f420: 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 6f  the result set o
f430: 66 20 74 68 65 20 53 45 4c 45 43 54 0a 20 20 20  f the SELECT.   
f440: 20 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 2e     ** statement.
f450: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
f460: 4e 61 6d 65 43 6f 6e 74 65 78 74 20 73 4e 43 3b  NameContext sNC;
f470: 0a 20 20 20 20 20 20 53 65 6c 65 63 74 20 2a 70  .      Select *p
f480: 53 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 53 65  S = pExpr->x.pSe
f490: 6c 65 63 74 3b 0a 20 20 20 20 20 20 45 78 70 72  lect;.      Expr
f4a0: 20 2a 70 20 3d 20 70 53 2d 3e 70 45 4c 69 73 74   *p = pS->pEList
f4b0: 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20  ->a[0].pExpr;.  
f4c0: 20 20 20 20 61 73 73 65 72 74 28 20 45 78 70 72      assert( Expr
f4d0: 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
f4e0: 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29  r, EP_xIsSelect)
f4f0: 20 29 3b 0a 20 20 20 20 20 20 73 4e 43 2e 70 53   );.      sNC.pS
f500: 72 63 4c 69 73 74 20 3d 20 70 53 2d 3e 70 53 72  rcList = pS->pSr
f510: 63 3b 0a 20 20 20 20 20 20 73 4e 43 2e 70 4e 65  c;.      sNC.pNe
f520: 78 74 20 3d 20 70 4e 43 3b 0a 20 20 20 20 20 20  xt = pNC;.      
f530: 73 4e 43 2e 70 50 61 72 73 65 20 3d 20 70 4e 43  sNC.pParse = pNC
f540: 2d 3e 70 50 61 72 73 65 3b 0a 20 20 20 20 20 20  ->pParse;.      
f550: 7a 54 79 70 65 20 3d 20 63 6f 6c 75 6d 6e 54 79  zType = columnTy
f560: 70 65 28 26 73 4e 43 2c 20 70 2c 20 26 7a 4f 72  pe(&sNC, p, &zOr
f570: 69 67 44 62 2c 20 26 7a 4f 72 69 67 54 61 62 2c  igDb, &zOrigTab,
f580: 20 26 7a 4f 72 69 67 43 6f 6c 29 3b 20 0a 20 20   &zOrigCol); .  
f590: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
f5a0: 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 23 69 66  .#endif.  }..#if
f5b0: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
f5c0: 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41 54  E_COLUMN_METADAT
f5d0: 41 20 20 0a 20 20 69 66 28 20 70 7a 4f 72 69 67  A  .  if( pzOrig
f5e0: 44 62 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  Db ){.    assert
f5f0: 28 20 70 7a 4f 72 69 67 54 61 62 20 26 26 20 70  ( pzOrigTab && p
f600: 7a 4f 72 69 67 43 6f 6c 20 29 3b 0a 20 20 20 20  zOrigCol );.    
f610: 2a 70 7a 4f 72 69 67 44 62 20 3d 20 7a 4f 72 69  *pzOrigDb = zOri
f620: 67 44 62 3b 0a 20 20 20 20 2a 70 7a 4f 72 69 67  gDb;.    *pzOrig
f630: 54 61 62 20 3d 20 7a 4f 72 69 67 54 61 62 3b 0a  Tab = zOrigTab;.
f640: 20 20 20 20 2a 70 7a 4f 72 69 67 43 6f 6c 20 3d      *pzOrigCol =
f650: 20 7a 4f 72 69 67 43 6f 6c 3b 0a 20 20 7d 0a 23   zOrigCol;.  }.#
f660: 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 7a  endif.  return z
f670: 54 79 70 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  Type;.}../*.** G
f680: 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61  enerate code tha
f690: 74 20 77 69 6c 6c 20 74 65 6c 6c 20 74 68 65 20  t will tell the 
f6a0: 56 44 42 45 20 74 68 65 20 64 65 63 6c 61 72 61  VDBE the declara
f6b0: 74 69 6f 6e 20 74 79 70 65 73 20 6f 66 20 63 6f  tion types of co
f6c0: 6c 75 6d 6e 73 0a 2a 2a 20 69 6e 20 74 68 65 20  lumns.** in the 
f6d0: 72 65 73 75 6c 74 20 73 65 74 2e 0a 2a 2f 0a 73  result set..*/.s
f6e0: 74 61 74 69 63 20 76 6f 69 64 20 67 65 6e 65 72  tatic void gener
f6f0: 61 74 65 43 6f 6c 75 6d 6e 54 79 70 65 73 28 0a  ateColumnTypes(.
f700: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
f710: 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65 72 20        /* Parser 
f720: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 72 63  context */.  Src
f730: 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74 2c 20  List *pTabList, 
f740: 20 2f 2a 20 4c 69 73 74 20 6f 66 20 74 61 62 6c   /* List of tabl
f750: 65 73 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  es */.  ExprList
f760: 20 2a 70 45 4c 69 73 74 20 20 20 20 2f 2a 20 45   *pEList    /* E
f770: 78 70 72 65 73 73 69 6f 6e 73 20 64 65 66 69 6e  xpressions defin
f780: 69 6e 67 20 74 68 65 20 72 65 73 75 6c 74 20 73  ing the result s
f790: 65 74 20 2a 2f 0a 29 7b 0a 23 69 66 6e 64 65 66  et */.){.#ifndef
f7a0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 45 43   SQLITE_OMIT_DEC
f7b0: 4c 54 59 50 45 0a 20 20 56 64 62 65 20 2a 76 20  LTYPE.  Vdbe *v 
f7c0: 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
f7d0: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 4e 61 6d 65  .  int i;.  Name
f7e0: 43 6f 6e 74 65 78 74 20 73 4e 43 3b 0a 20 20 73  Context sNC;.  s
f7f0: 4e 43 2e 70 53 72 63 4c 69 73 74 20 3d 20 70 54  NC.pSrcList = pT
f800: 61 62 4c 69 73 74 3b 0a 20 20 73 4e 43 2e 70 50  abList;.  sNC.pP
f810: 61 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20  arse = pParse;. 
f820: 20 73 4e 43 2e 70 4e 65 78 74 20 3d 20 30 3b 0a   sNC.pNext = 0;.
f830: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 45 4c    for(i=0; i<pEL
f840: 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29  ist->nExpr; i++)
f850: 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 20 3d 20  {.    Expr *p = 
f860: 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78  pEList->a[i].pEx
f870: 70 72 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68  pr;.    const ch
f880: 61 72 20 2a 7a 54 79 70 65 3b 0a 23 69 66 64 65  ar *zType;.#ifde
f890: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
f8a0: 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41 54 41 0a  COLUMN_METADATA.
f8b0: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
f8c0: 7a 4f 72 69 67 44 62 20 3d 20 30 3b 0a 20 20 20  zOrigDb = 0;.   
f8d0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f 72   const char *zOr
f8e0: 69 67 54 61 62 20 3d 20 30 3b 0a 20 20 20 20 63  igTab = 0;.    c
f8f0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f 72 69 67  onst char *zOrig
f900: 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 7a 54 79  Col = 0;.    zTy
f910: 70 65 20 3d 20 63 6f 6c 75 6d 6e 54 79 70 65 28  pe = columnType(
f920: 26 73 4e 43 2c 20 70 2c 20 26 7a 4f 72 69 67 44  &sNC, p, &zOrigD
f930: 62 2c 20 26 7a 4f 72 69 67 54 61 62 2c 20 26 7a  b, &zOrigTab, &z
f940: 4f 72 69 67 43 6f 6c 29 3b 0a 0a 20 20 20 20 2f  OrigCol);..    /
f950: 2a 20 54 68 65 20 76 64 62 65 20 6d 75 73 74 20  * The vdbe must 
f960: 6d 61 6b 65 20 69 74 73 20 6f 77 6e 20 63 6f 70  make its own cop
f970: 79 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 2d  y of the column-
f980: 74 79 70 65 20 61 6e 64 20 6f 74 68 65 72 20 0a  type and other .
f990: 20 20 20 20 2a 2a 20 63 6f 6c 75 6d 6e 20 73 70      ** column sp
f9a0: 65 63 69 66 69 63 20 73 74 72 69 6e 67 73 2c 20  ecific strings, 
f9b0: 69 6e 20 63 61 73 65 20 74 68 65 20 73 63 68 65  in case the sche
f9c0: 6d 61 20 69 73 20 72 65 73 65 74 20 62 65 66 6f  ma is reset befo
f9d0: 72 65 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 76  re this.    ** v
f9e0: 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 20 69  irtual machine i
f9f0: 73 20 64 65 6c 65 74 65 64 2e 0a 20 20 20 20 2a  s deleted..    *
fa00: 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  /.    sqlite3Vdb
fa10: 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69  eSetColName(v, i
fa20: 2c 20 43 4f 4c 4e 41 4d 45 5f 44 41 54 41 42 41  , COLNAME_DATABA
fa30: 53 45 2c 20 7a 4f 72 69 67 44 62 2c 20 53 51 4c  SE, zOrigDb, SQL
fa40: 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a  ITE_TRANSIENT);.
fa50: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53      sqlite3VdbeS
fa60: 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20  etColName(v, i, 
fa70: 43 4f 4c 4e 41 4d 45 5f 54 41 42 4c 45 2c 20 7a  COLNAME_TABLE, z
fa80: 4f 72 69 67 54 61 62 2c 20 53 51 4c 49 54 45 5f  OrigTab, SQLITE_
fa90: 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20  TRANSIENT);.    
faa0: 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f  sqlite3VdbeSetCo
fab0: 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e  lName(v, i, COLN
fac0: 41 4d 45 5f 43 4f 4c 55 4d 4e 2c 20 7a 4f 72 69  AME_COLUMN, zOri
fad0: 67 43 6f 6c 2c 20 53 51 4c 49 54 45 5f 54 52 41  gCol, SQLITE_TRA
fae0: 4e 53 49 45 4e 54 29 3b 0a 23 65 6c 73 65 0a 20  NSIENT);.#else. 
faf0: 20 20 20 7a 54 79 70 65 20 3d 20 63 6f 6c 75 6d     zType = colum
fb00: 6e 54 79 70 65 28 26 73 4e 43 2c 20 70 2c 20 30  nType(&sNC, p, 0
fb10: 2c 20 30 2c 20 30 29 3b 0a 23 65 6e 64 69 66 0a  , 0, 0);.#endif.
fb20: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53      sqlite3VdbeS
fb30: 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20  etColName(v, i, 
fb40: 43 4f 4c 4e 41 4d 45 5f 44 45 43 4c 54 59 50 45  COLNAME_DECLTYPE
fb50: 2c 20 7a 54 79 70 65 2c 20 53 51 4c 49 54 45 5f  , zType, SQLITE_
fb60: 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 7d 0a  TRANSIENT);.  }.
fb70: 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e  #endif /* !defin
fb80: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44  ed(SQLITE_OMIT_D
fb90: 45 43 4c 54 59 50 45 29 20 2a 2f 0a 7d 0a 0a 0a  ECLTYPE) */.}...
fba0: 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 74 68  /*.** Compute th
fbb0: 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 66  e column names f
fbc0: 6f 72 20 61 20 53 45 4c 45 43 54 20 73 74 61 74  or a SELECT stat
fbd0: 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ement..**.** The
fbe0: 20 6f 6e 6c 79 20 67 75 61 72 61 6e 74 65 65 20   only guarantee 
fbf0: 74 68 61 74 20 53 51 4c 69 74 65 20 6d 61 6b 65  that SQLite make
fc00: 73 20 61 62 6f 75 74 20 63 6f 6c 75 6d 6e 20 6e  s about column n
fc10: 61 6d 65 73 20 69 73 20 74 68 61 74 20 69 66 20  ames is that if 
fc20: 74 68 65 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 68 61  the.** column ha
fc30: 73 20 61 6e 20 41 53 20 63 6c 61 75 73 65 20 61  s an AS clause a
fc40: 73 73 69 67 6e 69 6e 67 20 69 74 20 61 20 6e 61  ssigning it a na
fc50: 6d 65 2c 20 74 68 61 74 20 77 69 6c 6c 20 62 65  me, that will be
fc60: 20 74 68 65 20 6e 61 6d 65 20 75 73 65 64 2e 0a   the name used..
fc70: 2a 2a 20 54 68 61 74 20 69 73 20 74 68 65 20 6f  ** That is the o
fc80: 6e 6c 79 20 64 6f 63 75 6d 65 6e 74 65 64 20 67  nly documented g
fc90: 75 61 72 61 6e 74 65 65 2e 20 20 48 6f 77 65 76  uarantee.  Howev
fca0: 65 72 2c 20 63 6f 75 6e 74 6c 65 73 73 20 61 70  er, countless ap
fcb0: 70 6c 69 63 61 74 69 6f 6e 73 0a 2a 2a 20 64 65  plications.** de
fcc0: 76 65 6c 6f 70 65 64 20 6f 76 65 72 20 74 68 65  veloped over the
fcd0: 20 79 65 61 72 73 20 68 61 76 65 20 6d 61 64 65   years have made
fce0: 20 62 61 73 65 6c 65 73 73 20 61 73 73 75 6d 70   baseless assump
fcf0: 74 69 6f 6e 73 20 61 62 6f 75 74 20 63 6f 6c 75  tions about colu
fd00: 6d 6e 20 6e 61 6d 65 73 0a 2a 2a 20 61 6e 64 20  mn names.** and 
fd10: 77 69 6c 6c 20 62 72 65 61 6b 20 69 66 20 74 68  will break if th
fd20: 6f 73 65 20 61 73 73 75 6d 70 74 69 6f 6e 73 20  ose assumptions 
fd30: 63 68 61 6e 67 65 73 2e 20 20 48 65 6e 63 65 2c  changes.  Hence,
fd40: 20 75 73 65 20 65 78 74 72 65 6d 65 20 63 61 75   use extreme cau
fd50: 74 69 6f 6e 0a 2a 2a 20 77 68 65 6e 20 6d 6f 64  tion.** when mod
fd60: 69 66 79 69 6e 67 20 74 68 69 73 20 72 6f 75 74  ifying this rout
fd70: 69 6e 65 20 74 6f 20 61 76 6f 69 64 20 62 72 65  ine to avoid bre
fd80: 61 6b 69 6e 67 20 6c 65 67 61 63 79 2e 0a 2a 2a  aking legacy..**
fd90: 0a 2a 2a 20 53 65 65 20 41 6c 73 6f 3a 20 73 71  .** See Also: sq
fda0: 6c 69 74 65 33 43 6f 6c 75 6d 6e 73 46 72 6f 6d  lite3ColumnsFrom
fdb0: 45 78 70 72 4c 69 73 74 28 29 0a 2a 2a 0a 2a 2a  ExprList().**.**
fdc0: 20 54 68 65 20 50 52 41 47 4d 41 20 73 68 6f 72   The PRAGMA shor
fdd0: 74 5f 63 6f 6c 75 6d 6e 5f 6e 61 6d 65 73 20 61  t_column_names a
fde0: 6e 64 20 50 52 41 47 4d 41 20 66 75 6c 6c 5f 63  nd PRAGMA full_c
fdf0: 6f 6c 75 6d 6e 5f 6e 61 6d 65 73 20 73 65 74 74  olumn_names sett
fe00: 69 6e 67 73 20 61 72 65 0a 2a 2a 20 64 65 70 72  ings are.** depr
fe10: 65 63 61 74 65 64 2e 20 20 54 68 65 20 64 65 66  ecated.  The def
fe20: 61 75 6c 74 20 73 65 74 74 69 6e 67 20 69 73 20  ault setting is 
fe30: 73 68 6f 72 74 3d 4f 4e 2c 20 66 75 6c 6c 3d 4f  short=ON, full=O
fe40: 46 46 2e 20 20 39 39 2e 39 25 20 6f 66 20 61 6c  FF.  99.9% of al
fe50: 6c 0a 2a 2a 20 61 70 70 6c 69 63 61 74 69 6f 6e  l.** application
fe60: 73 20 73 68 6f 75 6c 64 20 6f 70 65 72 61 74 65  s should operate
fe70: 20 74 68 69 73 20 77 61 79 2e 20 20 4e 65 76 65   this way.  Neve
fe80: 72 74 68 65 6c 65 73 73 2c 20 77 65 20 6e 65 65  rtheless, we nee
fe90: 64 20 74 6f 20 73 75 70 70 6f 72 74 20 74 68 65  d to support the
fea0: 0a 2a 2a 20 6f 74 68 65 72 20 6d 6f 64 65 73 20  .** other modes 
feb0: 66 6f 72 20 6c 65 67 61 63 79 3a 0a 2a 2a 0a 2a  for legacy:.**.*
fec0: 2a 20 20 20 20 73 68 6f 72 74 3d 4f 46 46 2c 20  *    short=OFF, 
fed0: 66 75 6c 6c 3d 4f 46 46 3a 20 20 20 20 20 20 43  full=OFF:      C
fee0: 6f 6c 75 6d 6e 20 6e 61 6d 65 20 69 73 20 74 68  olumn name is th
fef0: 65 20 74 65 78 74 20 6f 66 20 74 68 65 20 65 78  e text of the ex
ff00: 70 72 65 73 73 69 6f 6e 20 68 61 73 20 69 74 0a  pression has it.
ff10: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
ff20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ff30: 6f 72 69 67 69 6e 61 6c 6c 79 20 61 70 70 65 61  originally appea
ff40: 72 73 20 69 6e 20 74 68 65 20 53 45 4c 45 43 54  rs in the SELECT
ff50: 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 49 6e 0a   statement.  In.
ff60: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
ff70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ff80: 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 74 68 65  other words, the
ff90: 20 7a 53 70 61 6e 20 6f 66 20 74 68 65 20 72 65   zSpan of the re
ffa0: 73 75 6c 74 20 65 78 70 72 65 73 73 69 6f 6e 2e  sult expression.
ffb0: 0a 2a 2a 0a 2a 2a 20 20 20 20 73 68 6f 72 74 3d  .**.**    short=
ffc0: 4f 4e 2c 20 66 75 6c 6c 3d 4f 46 46 3a 20 20 20  ON, full=OFF:   
ffd0: 20 20 20 20 28 54 68 69 73 20 69 73 20 74 68 65      (This is the
ffe0: 20 64 65 66 61 75 6c 74 20 73 65 74 74 69 6e 67   default setting
fff0: 29 2e 20 20 49 66 20 74 68 65 20 72 65 73 75 6c  ).  If the resul
10000 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  t.**            
10010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10020 20 20 72 65 66 65 72 73 20 64 69 72 65 63 74 6c    refers directl
10030 79 20 74 6f 20 61 20 74 61 62 6c 65 20 63 6f 6c  y to a table col
10040 75 6d 6e 2c 20 74 68 65 6e 20 74 68 65 0a 2a 2a  umn, then the.**
10050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65                re
10070 73 75 6c 74 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65  sult column name
10080 20 69 73 20 6a 75 73 74 20 74 68 65 20 74 61 62   is just the tab
10090 6c 65 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 20 20 20  le column.**    
100a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
100b0 20 20 20 20 20 20 20 20 20 20 6e 61 6d 65 3a 20            name: 
100c0 43 4f 4c 55 4d 4e 2e 20 20 4f 74 68 65 72 77 69  COLUMN.  Otherwi
100d0 73 65 20 75 73 65 20 7a 53 70 61 6e 2e 0a 2a 2a  se use zSpan..**
100e0 0a 2a 2a 20 20 20 20 66 75 6c 6c 3d 4f 4e 2c 20  .**    full=ON, 
100f0 73 68 6f 72 74 3d 41 4e 59 3a 20 20 20 20 20 20  short=ANY:      
10100 20 49 66 20 74 68 65 20 72 65 73 75 6c 74 20 72   If the result r
10110 65 66 65 72 73 20 64 69 72 65 63 74 6c 79 20 74  efers directly t
10120 6f 20 61 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e  o a table column
10130 2c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  ,.**            
10140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10150 20 20 74 68 65 6e 20 74 68 65 20 72 65 73 75 6c    then the resul
10160 74 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 77 69  t column name wi
10170 74 68 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d  th the table nam
10180 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  e.**            
10190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
101a0 20 20 70 72 65 66 69 78 2c 20 65 78 3a 20 54 41    prefix, ex: TA
101b0 42 4c 45 2e 43 4f 4c 55 4d 4e 2e 20 20 4f 74 68  BLE.COLUMN.  Oth
101c0 65 72 77 69 73 65 20 75 73 65 20 7a 53 70 61 6e  erwise use zSpan
101d0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
101e0 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e   generateColumnN
101f0 61 6d 65 73 28 0a 20 20 50 61 72 73 65 20 2a 70  ames(.  Parse *p
10200 50 61 72 73 65 2c 20 20 20 20 20 20 2f 2a 20 50  Parse,      /* P
10210 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f  arser context */
10220 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65  .  Select *pSele
10230 63 74 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61  ct     /* Genera
10240 74 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20  te column names 
10250 66 6f 72 20 74 68 69 73 20 53 45 4c 45 43 54 20  for this SELECT 
10260 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 29 7b 0a  statement */.){.
10270 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
10280 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74  se->pVdbe;.  int
10290 20 69 3b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61   i;.  Table *pTa
102a0 62 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54  b;.  SrcList *pT
102b0 61 62 4c 69 73 74 3b 0a 20 20 45 78 70 72 4c 69  abList;.  ExprLi
102c0 73 74 20 2a 70 45 4c 69 73 74 3b 0a 20 20 73 71  st *pEList;.  sq
102d0 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
102e0 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 66 75  se->db;.  int fu
102f0 6c 6c 4e 61 6d 65 3b 20 20 20 20 2f 2a 20 54 41  llName;    /* TA
10300 42 4c 45 2e 43 4f 4c 55 4d 4e 20 69 66 20 6e 6f  BLE.COLUMN if no
10310 20 41 53 20 63 6c 61 75 73 65 20 61 6e 64 20 69   AS clause and i
10320 73 20 61 20 64 69 72 65 63 74 20 74 61 62 6c 65  s a direct table
10330 20 72 65 66 20 2a 2f 0a 20 20 69 6e 74 20 73 72   ref */.  int sr
10340 63 4e 61 6d 65 3b 20 20 20 20 20 2f 2a 20 43 4f  cName;     /* CO
10350 4c 55 4d 4e 20 6f 72 20 54 41 42 4c 45 2e 43 4f  LUMN or TABLE.CO
10360 4c 55 4d 4e 20 69 66 20 6e 6f 20 41 53 20 63 6c  LUMN if no AS cl
10370 61 75 73 65 20 61 6e 64 20 69 73 20 64 69 72 65  ause and is dire
10380 63 74 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53  ct */..#ifndef S
10390 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41  QLITE_OMIT_EXPLA
103a0 49 4e 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20  IN.  /* If this 
103b0 69 73 20 61 6e 20 45 58 50 4c 41 49 4e 2c 20 73  is an EXPLAIN, s
103c0 6b 69 70 20 74 68 69 73 20 73 74 65 70 20 2a 2f  kip this step */
103d0 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 65  .  if( pParse->e
103e0 78 70 6c 61 69 6e 20 29 7b 0a 20 20 20 20 72 65  xplain ){.    re
103f0 74 75 72 6e 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  turn;.  }.#endif
10400 0a 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  ..  if( pParse->
10410 63 6f 6c 4e 61 6d 65 73 53 65 74 20 29 20 72 65  colNamesSet ) re
10420 74 75 72 6e 3b 0a 20 20 2f 2a 20 43 6f 6c 75 6d  turn;.  /* Colum
10430 6e 20 6e 61 6d 65 73 20 61 72 65 20 64 65 74 65  n names are dete
10440 72 6d 69 6e 65 64 20 62 79 20 74 68 65 20 6c 65  rmined by the le
10450 66 74 2d 6d 6f 73 74 20 74 65 72 6d 20 6f 66 20  ft-most term of 
10460 61 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63  a compound selec
10470 74 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20 70 53  t */.  while( pS
10480 65 6c 65 63 74 2d 3e 70 50 72 69 6f 72 20 29 20  elect->pPrior ) 
10490 70 53 65 6c 65 63 74 20 3d 20 70 53 65 6c 65 63  pSelect = pSelec
104a0 74 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 53 45 4c  t->pPrior;.  SEL
104b0 45 43 54 54 52 41 43 45 28 31 2c 70 50 61 72 73  ECTTRACE(1,pPars
104c0 65 2c 70 53 65 6c 65 63 74 2c 28 22 67 65 6e 65  e,pSelect,("gene
104d0 72 61 74 69 6e 67 20 63 6f 6c 75 6d 6e 20 6e 61  rating column na
104e0 6d 65 73 5c 6e 22 29 29 3b 0a 20 20 70 54 61 62  mes\n"));.  pTab
104f0 4c 69 73 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e  List = pSelect->
10500 70 53 72 63 3b 0a 20 20 70 45 4c 69 73 74 20 3d  pSrc;.  pEList =
10510 20 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74   pSelect->pEList
10520 3b 0a 20 20 61 73 73 65 72 74 28 20 76 21 3d 30  ;.  assert( v!=0
10530 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 54   );.  assert( pT
10540 61 62 4c 69 73 74 21 3d 30 20 29 3b 0a 20 20 70  abList!=0 );.  p
10550 50 61 72 73 65 2d 3e 63 6f 6c 4e 61 6d 65 73 53  Parse->colNamesS
10560 65 74 20 3d 20 31 3b 0a 20 20 66 75 6c 6c 4e 61  et = 1;.  fullNa
10570 6d 65 20 3d 20 28 64 62 2d 3e 66 6c 61 67 73 20  me = (db->flags 
10580 26 20 53 51 4c 49 54 45 5f 46 75 6c 6c 43 6f 6c  & SQLITE_FullCol
10590 4e 61 6d 65 73 29 21 3d 30 3b 0a 20 20 73 72 63  Names)!=0;.  src
105a0 4e 61 6d 65 20 3d 20 28 64 62 2d 3e 66 6c 61 67  Name = (db->flag
105b0 73 20 26 20 53 51 4c 49 54 45 5f 53 68 6f 72 74  s & SQLITE_Short
105c0 43 6f 6c 4e 61 6d 65 73 29 21 3d 30 20 7c 7c 20  ColNames)!=0 || 
105d0 66 75 6c 6c 4e 61 6d 65 3b 0a 20 20 73 71 6c 69  fullName;.  sqli
105e0 74 65 33 56 64 62 65 53 65 74 4e 75 6d 43 6f 6c  te3VdbeSetNumCol
105f0 73 28 76 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78  s(v, pEList->nEx
10600 70 72 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  pr);.  for(i=0; 
10610 69 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b  i<pEList->nExpr;
10620 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20   i++){.    Expr 
10630 2a 70 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69  *p = pEList->a[i
10640 5d 2e 70 45 78 70 72 3b 0a 0a 20 20 20 20 61 73  ].pExpr;..    as
10650 73 65 72 74 28 20 70 21 3d 30 20 29 3b 0a 20 20  sert( p!=0 );.  
10660 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6f 70 21    assert( p->op!
10670 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 29  =TK_AGG_COLUMN )
10680 3b 20 20 2f 2a 20 41 67 67 20 70 72 6f 63 65 73  ;  /* Agg proces
10690 73 69 6e 67 20 68 61 73 20 6e 6f 74 20 72 75 6e  sing has not run
106a0 20 79 65 74 20 2a 2f 0a 20 20 20 20 61 73 73 65   yet */.    asse
106b0 72 74 28 20 70 2d 3e 6f 70 21 3d 54 4b 5f 43 4f  rt( p->op!=TK_CO
106c0 4c 55 4d 4e 20 7c 7c 20 70 2d 3e 79 2e 70 54 61  LUMN || p->y.pTa
106d0 62 21 3d 30 20 29 3b 20 2f 2a 20 43 6f 76 65 72  b!=0 ); /* Cover
106e0 69 6e 67 20 69 64 78 20 6e 6f 74 20 79 65 74 20  ing idx not yet 
106f0 63 6f 64 65 64 20 2a 2f 0a 20 20 20 20 69 66 28  coded */.    if(
10700 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e   pEList->a[i].zN
10710 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  ame ){.      /* 
10720 41 6e 20 41 53 20 63 6c 61 75 73 65 20 61 6c 77  An AS clause alw
10730 61 79 73 20 74 61 6b 65 73 20 66 69 72 73 74 20  ays takes first 
10740 70 72 69 6f 72 69 74 79 20 2a 2f 0a 20 20 20 20  priority */.    
10750 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20    char *zName = 
10760 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61  pEList->a[i].zNa
10770 6d 65 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  me;.      sqlite
10780 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28  3VdbeSetColName(
10790 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41  v, i, COLNAME_NA
107a0 4d 45 2c 20 7a 4e 61 6d 65 2c 20 53 51 4c 49 54  ME, zName, SQLIT
107b0 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20  E_TRANSIENT);.  
107c0 20 20 7d 65 6c 73 65 20 69 66 28 20 73 72 63 4e    }else if( srcN
107d0 61 6d 65 20 26 26 20 70 2d 3e 6f 70 3d 3d 54 4b  ame && p->op==TK
107e0 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 20  _COLUMN ){.     
107f0 20 63 68 61 72 20 2a 7a 43 6f 6c 3b 0a 20 20 20   char *zCol;.   
10800 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70 2d     int iCol = p-
10810 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20  >iColumn;.      
10820 70 54 61 62 20 3d 20 70 2d 3e 79 2e 70 54 61 62  pTab = p->y.pTab
10830 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
10840 70 54 61 62 21 3d 30 20 29 3b 0a 20 20 20 20 20  pTab!=0 );.     
10850 20 69 66 28 20 69 43 6f 6c 3c 30 20 29 20 69 43   if( iCol<0 ) iC
10860 6f 6c 20 3d 20 70 54 61 62 2d 3e 69 50 4b 65 79  ol = pTab->iPKey
10870 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
10880 69 43 6f 6c 3d 3d 2d 31 20 7c 7c 20 28 69 43 6f  iCol==-1 || (iCo
10890 6c 3e 3d 30 20 26 26 20 69 43 6f 6c 3c 70 54 61  l>=0 && iCol<pTa
108a0 62 2d 3e 6e 43 6f 6c 29 20 29 3b 0a 20 20 20 20  b->nCol) );.    
108b0 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 29 7b 0a    if( iCol<0 ){.
108c0 20 20 20 20 20 20 20 20 7a 43 6f 6c 20 3d 20 22          zCol = "
108d0 72 6f 77 69 64 22 3b 0a 20 20 20 20 20 20 7d 65  rowid";.      }e
108e0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 7a 43 6f  lse{.        zCo
108f0 6c 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69  l = pTab->aCol[i
10900 43 6f 6c 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20  Col].zName;.    
10910 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 66 75    }.      if( fu
10920 6c 6c 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20  llName ){.      
10930 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20    char *zName = 
10940 30 3b 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d 65  0;.        zName
10950 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74   = sqlite3MPrint
10960 66 28 64 62 2c 20 22 25 73 2e 25 73 22 2c 20 70  f(db, "%s.%s", p
10970 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 43 6f 6c  Tab->zName, zCol
10980 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
10990 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65  e3VdbeSetColName
109a0 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 4e  (v, i, COLNAME_N
109b0 41 4d 45 2c 20 7a 4e 61 6d 65 2c 20 53 51 4c 49  AME, zName, SQLI
109c0 54 45 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20  TE_DYNAMIC);.   
109d0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
109e0 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74    sqlite3VdbeSet
109f0 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f  ColName(v, i, CO
10a00 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20 7a 43 6f 6c  LNAME_NAME, zCol
10a10 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45  , SQLITE_TRANSIE
10a20 4e 54 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  NT);.      }.   
10a30 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 63 6f   }else{.      co
10a40 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 70 45  nst char *z = pE
10a50 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 53 70 61 6e  List->a[i].zSpan
10a60 3b 0a 20 20 20 20 20 20 7a 20 3d 20 7a 3d 3d 30  ;.      z = z==0
10a70 20 3f 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74   ? sqlite3MPrint
10a80 66 28 64 62 2c 20 22 63 6f 6c 75 6d 6e 25 64 22  f(db, "column%d"
10a90 2c 20 69 2b 31 29 20 3a 20 73 71 6c 69 74 65 33  , i+1) : sqlite3
10aa0 44 62 53 74 72 44 75 70 28 64 62 2c 20 7a 29 3b  DbStrDup(db, z);
10ab0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
10ac0 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20  beSetColName(v, 
10ad0 69 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c  i, COLNAME_NAME,
10ae0 20 7a 2c 20 53 51 4c 49 54 45 5f 44 59 4e 41 4d   z, SQLITE_DYNAM
10af0 49 43 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  IC);.    }.  }. 
10b00 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 54   generateColumnT
10b10 79 70 65 73 28 70 50 61 72 73 65 2c 20 70 54 61  ypes(pParse, pTa
10b20 62 4c 69 73 74 2c 20 70 45 4c 69 73 74 29 3b 0a  bList, pEList);.
10b30 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61  }../*.** Given a
10b40 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73  n expression lis
10b50 74 20 28 77 68 69 63 68 20 69 73 20 72 65 61 6c  t (which is real
10b60 6c 79 20 74 68 65 20 6c 69 73 74 20 6f 66 20 65  ly the list of e
10b70 78 70 72 65 73 73 69 6f 6e 73 0a 2a 2a 20 74 68  xpressions.** th
10b80 61 74 20 66 6f 72 6d 20 74 68 65 20 72 65 73 75  at form the resu
10b90 6c 74 20 73 65 74 20 6f 66 20 61 20 53 45 4c 45  lt set of a SELE
10ba0 43 54 20 73 74 61 74 65 6d 65 6e 74 29 20 63 6f  CT statement) co
10bb0 6d 70 75 74 65 20 61 70 70 72 6f 70 72 69 61 74  mpute appropriat
10bc0 65 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65  e.** column name
10bd0 73 20 66 6f 72 20 61 20 74 61 62 6c 65 20 74 68  s for a table th
10be0 61 74 20 77 6f 75 6c 64 20 68 6f 6c 64 20 74 68  at would hold th
10bf0 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73  e expression lis
10c00 74 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 63 6f 6c  t..**.** All col
10c10 75 6d 6e 20 6e 61 6d 65 73 20 77 69 6c 6c 20 62  umn names will b
10c20 65 20 75 6e 69 71 75 65 2e 0a 2a 2a 0a 2a 2a 20  e unique..**.** 
10c30 4f 6e 6c 79 20 74 68 65 20 63 6f 6c 75 6d 6e 20  Only the column 
10c40 6e 61 6d 65 73 20 61 72 65 20 63 6f 6d 70 75 74  names are comput
10c50 65 64 2e 20 20 43 6f 6c 75 6d 6e 2e 7a 54 79 70  ed.  Column.zTyp
10c60 65 2c 20 43 6f 6c 75 6d 6e 2e 7a 43 6f 6c 6c 2c  e, Column.zColl,
10c70 0a 2a 2a 20 61 6e 64 20 6f 74 68 65 72 20 66 69  .** and other fi
10c80 65 6c 64 73 20 6f 66 20 43 6f 6c 75 6d 6e 20 61  elds of Column a
10c90 72 65 20 7a 65 72 6f 65 64 2e 0a 2a 2a 0a 2a 2a  re zeroed..**.**
10ca0 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
10cb0 4b 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 49  K on success.  I
10cc0 66 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63  f a memory alloc
10cd0 61 74 69 6f 6e 20 65 72 72 6f 72 20 6f 63 63 75  ation error occu
10ce0 72 73 2c 0a 2a 2a 20 73 74 6f 72 65 20 4e 55 4c  rs,.** store NUL
10cf0 4c 20 69 6e 20 2a 70 61 43 6f 6c 20 61 6e 64 20  L in *paCol and 
10d00 30 20 69 6e 20 2a 70 6e 43 6f 6c 20 61 6e 64 20  0 in *pnCol and 
10d10 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
10d20 4d 45 4d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f  MEM..**.** The o
10d30 6e 6c 79 20 67 75 61 72 61 6e 74 65 65 20 74 68  nly guarantee th
10d40 61 74 20 53 51 4c 69 74 65 20 6d 61 6b 65 73 20  at SQLite makes 
10d50 61 62 6f 75 74 20 63 6f 6c 75 6d 6e 20 6e 61 6d  about column nam
10d60 65 73 20 69 73 20 74 68 61 74 20 69 66 20 74 68  es is that if th
10d70 65 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 68 61 73 20  e.** column has 
10d80 61 6e 20 41 53 20 63 6c 61 75 73 65 20 61 73 73  an AS clause ass
10d90 69 67 6e 69 6e 67 20 69 74 20 61 20 6e 61 6d 65  igning it a name
10da0 2c 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20 74  , that will be t
10db0 68 65 20 6e 61 6d 65 20 75 73 65 64 2e 0a 2a 2a  he name used..**
10dc0 20 54 68 61 74 20 69 73 20 74 68 65 20 6f 6e 6c   That is the onl
10dd0 79 20 64 6f 63 75 6d 65 6e 74 65 64 20 67 75 61  y documented gua
10de0 72 61 6e 74 65 65 2e 20 20 48 6f 77 65 76 65 72  rantee.  However
10df0 2c 20 63 6f 75 6e 74 6c 65 73 73 20 61 70 70 6c  , countless appl
10e00 69 63 61 74 69 6f 6e 73 0a 2a 2a 20 64 65 76 65  ications.** deve
10e10 6c 6f 70 65 64 20 6f 76 65 72 20 74 68 65 20 79  loped over the y
10e20 65 61 72 73 20 68 61 76 65 20 6d 61 64 65 20 62  ears have made b
10e30 61 73 65 6c 65 73 73 20 61 73 73 75 6d 70 74 69  aseless assumpti
10e40 6f 6e 73 20 61 62 6f 75 74 20 63 6f 6c 75 6d 6e  ons about column
10e50 20 6e 61 6d 65 73 0a 2a 2a 20 61 6e 64 20 77 69   names.** and wi
10e60 6c 6c 20 62 72 65 61 6b 20 69 66 20 74 68 6f 73  ll break if thos
10e70 65 20 61 73 73 75 6d 70 74 69 6f 6e 73 20 63 68  e assumptions ch
10e80 61 6e 67 65 73 2e 20 20 48 65 6e 63 65 2c 20 75  anges.  Hence, u
10e90 73 65 20 65 78 74 72 65 6d 65 20 63 61 75 74 69  se extreme cauti
10ea0 6f 6e 0a 2a 2a 20 77 68 65 6e 20 6d 6f 64 69 66  on.** when modif
10eb0 79 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e  ying this routin
10ec0 65 20 74 6f 20 61 76 6f 69 64 20 62 72 65 61 6b  e to avoid break
10ed0 69 6e 67 20 6c 65 67 61 63 79 2e 0a 2a 2a 0a 2a  ing legacy..**.*
10ee0 2a 20 53 65 65 20 41 6c 73 6f 3a 20 67 65 6e 65  * See Also: gene
10ef0 72 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28  rateColumnNames(
10f00 29 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ).*/.int sqlite3
10f10 43 6f 6c 75 6d 6e 73 46 72 6f 6d 45 78 70 72 4c  ColumnsFromExprL
10f20 69 73 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50  ist(.  Parse *pP
10f30 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f  arse,          /
10f40 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
10f50 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  t */.  ExprList 
10f60 2a 70 45 4c 69 73 74 2c 20 20 20 20 20 20 20 2f  *pEList,       /
10f70 2a 20 45 78 70 72 20 6c 69 73 74 20 66 72 6f 6d  * Expr list from
10f80 20 77 68 69 63 68 20 74 6f 20 64 65 72 69 76 65   which to derive
10f90 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 2a 2f   column names */
10fa0 0a 20 20 69 31 36 20 2a 70 6e 43 6f 6c 2c 20 20  .  i16 *pnCol,  
10fb0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72             /* Wr
10fc0 69 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  ite the number o
10fd0 66 20 63 6f 6c 75 6d 6e 73 20 68 65 72 65 20 2a  f columns here *
10fe0 2f 0a 20 20 43 6f 6c 75 6d 6e 20 2a 2a 70 61 43  /.  Column **paC
10ff0 6f 6c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57  ol          /* W
11000 72 69 74 65 20 74 68 65 20 6e 65 77 20 63 6f 6c  rite the new col
11010 75 6d 6e 20 6c 69 73 74 20 68 65 72 65 20 2a 2f  umn list here */
11020 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  .){.  sqlite3 *d
11030 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20  b = pParse->db; 
11040 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f    /* Database co
11050 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e  nnection */.  in
11060 74 20 69 2c 20 6a 3b 20 20 20 20 20 20 20 20 20  t i, j;         
11070 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
11080 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20  p counters */.  
11090 75 33 32 20 63 6e 74 3b 20 20 20 20 20 20 20 20  u32 cnt;        
110a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
110b0 6e 64 65 78 20 61 64 64 65 64 20 74 6f 20 6d 61  ndex added to ma
110c0 6b 65 20 74 68 65 20 6e 61 6d 65 20 75 6e 69 71  ke the name uniq
110d0 75 65 20 2a 2f 0a 20 20 43 6f 6c 75 6d 6e 20 2a  ue */.  Column *
110e0 61 43 6f 6c 2c 20 2a 70 43 6f 6c 3b 20 20 20 20  aCol, *pCol;    
110f0 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69      /* For loopi
11100 6e 67 20 6f 76 65 72 20 72 65 73 75 6c 74 20 63  ng over result c
11110 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 69 6e 74 20  olumns */.  int 
11120 6e 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20  nCol;           
11130 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
11140 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20  r of columns in 
11150 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 2a  the result set *
11160 2f 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b  /.  char *zName;
11170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11180 2f 2a 20 43 6f 6c 75 6d 6e 20 6e 61 6d 65 20 2a  /* Column name *
11190 2f 0a 20 20 69 6e 74 20 6e 4e 61 6d 65 3b 20 20  /.  int nName;  
111a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
111b0 2f 2a 20 53 69 7a 65 20 6f 66 20 6e 61 6d 65 20  /* Size of name 
111c0 69 6e 20 7a 4e 61 6d 65 5b 5d 20 2a 2f 0a 20 20  in zName[] */.  
111d0 48 61 73 68 20 68 74 3b 20 20 20 20 20 20 20 20  Hash ht;        
111e0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48              /* H
111f0 61 73 68 20 74 61 62 6c 65 20 6f 66 20 63 6f 6c  ash table of col
11200 75 6d 6e 20 6e 61 6d 65 73 20 2a 2f 0a 0a 20 20  umn names */..  
11210 73 71 6c 69 74 65 33 48 61 73 68 49 6e 69 74 28  sqlite3HashInit(
11220 26 68 74 29 3b 0a 20 20 69 66 28 20 70 45 4c 69  &ht);.  if( pELi
11230 73 74 20 29 7b 0a 20 20 20 20 6e 43 6f 6c 20 3d  st ){.    nCol =
11240 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a   pEList->nExpr;.
11250 20 20 20 20 61 43 6f 6c 20 3d 20 73 71 6c 69 74      aCol = sqlit
11260 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64  e3DbMallocZero(d
11270 62 2c 20 73 69 7a 65 6f 66 28 61 43 6f 6c 5b 30  b, sizeof(aCol[0
11280 5d 29 2a 6e 43 6f 6c 29 3b 0a 20 20 20 20 74 65  ])*nCol);.    te
11290 73 74 63 61 73 65 28 20 61 43 6f 6c 3d 3d 30 20  stcase( aCol==0 
112a0 29 3b 0a 20 20 20 20 69 66 28 20 6e 43 6f 6c 3e  );.    if( nCol>
112b0 33 32 37 36 37 20 29 20 6e 43 6f 6c 20 3d 20 33  32767 ) nCol = 3
112c0 32 37 36 37 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  2767;.  }else{. 
112d0 20 20 20 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 20     nCol = 0;.   
112e0 20 61 43 6f 6c 20 3d 20 30 3b 0a 20 20 7d 0a 20   aCol = 0;.  }. 
112f0 20 61 73 73 65 72 74 28 20 6e 43 6f 6c 3d 3d 28   assert( nCol==(
11300 69 31 36 29 6e 43 6f 6c 20 29 3b 0a 20 20 2a 70  i16)nCol );.  *p
11310 6e 43 6f 6c 20 3d 20 6e 43 6f 6c 3b 0a 20 20 2a  nCol = nCol;.  *
11320 70 61 43 6f 6c 20 3d 20 61 43 6f 6c 3b 0a 0a 20  paCol = aCol;.. 
11330 20 66 6f 72 28 69 3d 30 2c 20 70 43 6f 6c 3d 61   for(i=0, pCol=a
11340 43 6f 6c 3b 20 69 3c 6e 43 6f 6c 20 26 26 20 21  Col; i<nCol && !
11350 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
11360 3b 20 69 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a  ; i++, pCol++){.
11370 20 20 20 20 2f 2a 20 47 65 74 20 61 6e 20 61 70      /* Get an ap
11380 70 72 6f 70 72 69 61 74 65 20 6e 61 6d 65 20 66  propriate name f
11390 6f 72 20 74 68 65 20 63 6f 6c 75 6d 6e 0a 20 20  or the column.  
113a0 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 7a 4e    */.    if( (zN
113b0 61 6d 65 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b  ame = pEList->a[
113c0 69 5d 2e 7a 4e 61 6d 65 29 21 3d 30 20 29 7b 0a  i].zName)!=0 ){.
113d0 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20        /* If the 
113e0 63 6f 6c 75 6d 6e 20 63 6f 6e 74 61 69 6e 73 20  column contains 
113f0 61 6e 20 22 41 53 20 3c 6e 61 6d 65 3e 22 20 70  an "AS <name>" p
11400 68 72 61 73 65 2c 20 75 73 65 20 3c 6e 61 6d 65  hrase, use <name
11410 3e 20 61 73 20 74 68 65 20 6e 61 6d 65 20 2a 2f  > as the name */
11420 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
11430 20 20 45 78 70 72 20 2a 70 43 6f 6c 45 78 70 72    Expr *pColExpr
11440 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 53 6b   = sqlite3ExprSk
11450 69 70 43 6f 6c 6c 61 74 65 28 70 45 4c 69 73 74  ipCollate(pEList
11460 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20  ->a[i].pExpr);. 
11470 20 20 20 20 20 77 68 69 6c 65 28 20 70 43 6f 6c       while( pCol
11480 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f 54  Expr->op==TK_DOT
11490 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43 6f 6c   ){.        pCol
114a0 45 78 70 72 20 3d 20 70 43 6f 6c 45 78 70 72 2d  Expr = pColExpr-
114b0 3e 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20 20  >pRight;.       
114c0 20 61 73 73 65 72 74 28 20 70 43 6f 6c 45 78 70   assert( pColExp
114d0 72 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 7d 0a  r!=0 );.      }.
114e0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43        assert( pC
114f0 6f 6c 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 41  olExpr->op!=TK_A
11500 47 47 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20  GG_COLUMN );.   
11510 20 20 20 69 66 28 20 70 43 6f 6c 45 78 70 72 2d     if( pColExpr-
11520 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29  >op==TK_COLUMN )
11530 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72  {.        /* For
11540 20 63 6f 6c 75 6d 6e 73 20 75 73 65 20 74 68 65   columns use the
11550 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 6e 61 6d   column name nam
11560 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74  e */.        int
11570 20 69 43 6f 6c 20 3d 20 70 43 6f 6c 45 78 70 72   iCol = pColExpr
11580 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20  ->iColumn;.     
11590 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d     Table *pTab =
115a0 20 70 43 6f 6c 45 78 70 72 2d 3e 79 2e 70 54 61   pColExpr->y.pTa
115b0 62 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  b;.        asser
115c0 74 28 20 70 54 61 62 21 3d 30 20 29 3b 0a 20 20  t( pTab!=0 );.  
115d0 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30        if( iCol<0
115e0 20 29 20 69 43 6f 6c 20 3d 20 70 54 61 62 2d 3e   ) iCol = pTab->
115f0 69 50 4b 65 79 3b 0a 20 20 20 20 20 20 20 20 7a  iPKey;.        z
11600 4e 61 6d 65 20 3d 20 69 43 6f 6c 3e 3d 30 20 3f  Name = iCol>=0 ?
11610 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c   pTab->aCol[iCol
11620 5d 2e 7a 4e 61 6d 65 20 3a 20 22 72 6f 77 69 64  ].zName : "rowid
11630 22 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  ";.      }else i
11640 66 28 20 70 43 6f 6c 45 78 70 72 2d 3e 6f 70 3d  f( pColExpr->op=
11650 3d 54 4b 5f 49 44 20 29 7b 0a 20 20 20 20 20 20  =TK_ID ){.      
11660 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48    assert( !ExprH
11670 61 73 50 72 6f 70 65 72 74 79 28 70 43 6f 6c 45  asProperty(pColE
11680 78 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65  xpr, EP_IntValue
11690 29 20 29 3b 0a 20 20 20 20 20 20 20 20 7a 4e 61  ) );.        zNa
116a0 6d 65 20 3d 20 70 43 6f 6c 45 78 70 72 2d 3e 75  me = pColExpr->u
116b0 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 7d  .zToken;.      }
116c0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a  else{.        /*
116d0 20 55 73 65 20 74 68 65 20 6f 72 69 67 69 6e 61   Use the origina
116e0 6c 20 74 65 78 74 20 6f 66 20 74 68 65 20 63 6f  l text of the co
116f0 6c 75 6d 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  lumn expression 
11700 61 73 20 69 74 73 20 6e 61 6d 65 20 2a 2f 0a 20  as its name */. 
11710 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 70         zName = p
11720 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 53 70 61  EList->a[i].zSpa
11730 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  n;.      }.    }
11740 0a 20 20 20 20 69 66 28 20 7a 4e 61 6d 65 20 29  .    if( zName )
11750 7b 0a 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20  {.      zName = 
11760 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28  sqlite3DbStrDup(
11770 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  db, zName);.    
11780 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 7a 4e 61  }else{.      zNa
11790 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69  me = sqlite3MPri
117a0 6e 74 66 28 64 62 2c 22 63 6f 6c 75 6d 6e 25 64  ntf(db,"column%d
117b0 22 2c 69 2b 31 29 3b 0a 20 20 20 20 7d 0a 0a 20  ",i+1);.    }.. 
117c0 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20     /* Make sure 
117d0 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20  the column name 
117e0 69 73 20 75 6e 69 71 75 65 2e 20 20 49 66 20 74  is unique.  If t
117f0 68 65 20 6e 61 6d 65 20 69 73 20 6e 6f 74 20 75  he name is not u
11800 6e 69 71 75 65 2c 0a 20 20 20 20 2a 2a 20 61 70  nique,.    ** ap
11810 70 65 6e 64 20 61 6e 20 69 6e 74 65 67 65 72 20  pend an integer 
11820 74 6f 20 74 68 65 20 6e 61 6d 65 20 73 6f 20 74  to the name so t
11830 68 61 74 20 69 74 20 62 65 63 6f 6d 65 73 20 75  hat it becomes u
11840 6e 69 71 75 65 2e 0a 20 20 20 20 2a 2f 0a 20 20  nique..    */.  
11850 20 20 63 6e 74 20 3d 20 30 3b 0a 20 20 20 20 77    cnt = 0;.    w
11860 68 69 6c 65 28 20 7a 4e 61 6d 65 20 26 26 20 73  hile( zName && s
11870 71 6c 69 74 65 33 48 61 73 68 46 69 6e 64 28 26  qlite3HashFind(&
11880 68 74 2c 20 7a 4e 61 6d 65 29 21 3d 30 20 29 7b  ht, zName)!=0 ){
11890 0a 20 20 20 20 20 20 6e 4e 61 6d 65 20 3d 20 73  .      nName = s
118a0 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
118b0 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 69 66 28  Name);.      if(
118c0 20 6e 4e 61 6d 65 3e 30 20 29 7b 0a 20 20 20 20   nName>0 ){.    
118d0 20 20 20 20 66 6f 72 28 6a 3d 6e 4e 61 6d 65 2d      for(j=nName-
118e0 31 3b 20 6a 3e 30 20 26 26 20 73 71 6c 69 74 65  1; j>0 && sqlite
118f0 33 49 73 64 69 67 69 74 28 7a 4e 61 6d 65 5b 6a  3Isdigit(zName[j
11900 5d 29 3b 20 6a 2d 2d 29 7b 7d 0a 20 20 20 20 20  ]); j--){}.     
11910 20 20 20 69 66 28 20 7a 4e 61 6d 65 5b 6a 5d 3d     if( zName[j]=
11920 3d 27 3a 27 20 29 20 6e 4e 61 6d 65 20 3d 20 6a  =':' ) nName = j
11930 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
11940 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d  zName = sqlite3M
11950 50 72 69 6e 74 66 28 64 62 2c 20 22 25 2e 2a 7a  Printf(db, "%.*z
11960 3a 25 75 22 2c 20 6e 4e 61 6d 65 2c 20 7a 4e 61  :%u", nName, zNa
11970 6d 65 2c 20 2b 2b 63 6e 74 29 3b 0a 20 20 20 20  me, ++cnt);.    
11980 20 20 69 66 28 20 63 6e 74 3e 33 20 29 20 73 71    if( cnt>3 ) sq
11990 6c 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73  lite3_randomness
119a0 28 73 69 7a 65 6f 66 28 63 6e 74 29 2c 20 26 63  (sizeof(cnt), &c
119b0 6e 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  nt);.    }.    p
119c0 43 6f 6c 2d 3e 7a 4e 61 6d 65 20 3d 20 7a 4e 61  Col->zName = zNa
119d0 6d 65 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 43  me;.    sqlite3C
119e0 6f 6c 75 6d 6e 50 72 6f 70 65 72 74 69 65 73 46  olumnPropertiesF
119f0 72 6f 6d 4e 61 6d 65 28 30 2c 20 70 43 6f 6c 29  romName(0, pCol)
11a00 3b 0a 20 20 20 20 69 66 28 20 7a 4e 61 6d 65 20  ;.    if( zName 
11a10 26 26 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e  && sqlite3HashIn
11a20 73 65 72 74 28 26 68 74 2c 20 7a 4e 61 6d 65 2c  sert(&ht, zName,
11a30 20 70 43 6f 6c 29 3d 3d 70 43 6f 6c 20 29 7b 0a   pCol)==pCol ){.
11a40 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 6f 6d        sqlite3Oom
11a50 46 61 75 6c 74 28 64 62 29 3b 0a 20 20 20 20 7d  Fault(db);.    }
11a60 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 48 61  .  }.  sqlite3Ha
11a70 73 68 43 6c 65 61 72 28 26 68 74 29 3b 0a 20 20  shClear(&ht);.  
11a80 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
11a90 69 6c 65 64 20 29 7b 0a 20 20 20 20 66 6f 72 28  iled ){.    for(
11aa0 6a 3d 30 3b 20 6a 3c 69 3b 20 6a 2b 2b 29 7b 0a  j=0; j<i; j++){.
11ab0 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46        sqlite3DbF
11ac0 72 65 65 28 64 62 2c 20 61 43 6f 6c 5b 6a 5d 2e  ree(db, aCol[j].
11ad0 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20  zName);.    }.  
11ae0 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
11af0 64 62 2c 20 61 43 6f 6c 29 3b 0a 20 20 20 20 2a  db, aCol);.    *
11b00 70 61 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 2a  paCol = 0;.    *
11b10 70 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 72  pnCol = 0;.    r
11b20 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
11b30 45 4d 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 72  EM_BKPT;.  }.  r
11b40 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
11b50 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 74 79  .}../*.** Add ty
11b60 70 65 20 61 6e 64 20 63 6f 6c 6c 61 74 69 6f 6e  pe and collation
11b70 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 6f 20   information to 
11b80 61 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 20 62 61  a column list ba
11b90 73 65 64 20 6f 6e 0a 2a 2a 20 61 20 53 45 4c 45  sed on.** a SELE
11ba0 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a  CT statement..**
11bb0 20 0a 2a 2a 20 54 68 65 20 63 6f 6c 75 6d 6e 20   .** The column 
11bc0 6c 69 73 74 20 70 72 65 73 75 6d 61 62 6c 79 20  list presumably 
11bd0 63 61 6d 65 20 66 72 6f 6d 20 73 65 6c 65 63 74  came from select
11be0 43 6f 6c 75 6d 6e 4e 61 6d 65 73 46 72 6f 6d 45  ColumnNamesFromE
11bf0 78 70 72 4c 69 73 74 28 29 2e 0a 2a 2a 20 54 68  xprList()..** Th
11c00 65 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 20 68 61  e column list ha
11c10 73 20 6f 6e 6c 79 20 6e 61 6d 65 73 2c 20 6e 6f  s only names, no
11c20 74 20 74 79 70 65 73 20 6f 72 20 63 6f 6c 6c 61  t types or colla
11c30 74 69 6f 6e 73 2e 20 20 54 68 69 73 0a 2a 2a 20  tions.  This.** 
11c40 72 6f 75 74 69 6e 65 20 67 6f 65 73 20 74 68 72  routine goes thr
11c50 6f 75 67 68 20 61 6e 64 20 61 64 64 73 20 74 68  ough and adds th
11c60 65 20 74 79 70 65 73 20 61 6e 64 20 63 6f 6c 6c  e types and coll
11c70 61 74 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20 54 68  ations..**.** Th
11c80 69 73 20 72 6f 75 74 69 6e 65 20 72 65 71 75 69  is routine requi
11c90 72 65 73 20 74 68 61 74 20 61 6c 6c 20 69 64 65  res that all ide
11ca0 6e 74 69 66 69 65 72 73 20 69 6e 20 74 68 65 20  ntifiers in the 
11cb0 53 45 4c 45 43 54 0a 2a 2a 20 73 74 61 74 65 6d  SELECT.** statem
11cc0 65 6e 74 20 62 65 20 72 65 73 6f 6c 76 65 64 2e  ent be resolved.
11cd0 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
11ce0 53 65 6c 65 63 74 41 64 64 43 6f 6c 75 6d 6e 54  SelectAddColumnT
11cf0 79 70 65 41 6e 64 43 6f 6c 6c 61 74 69 6f 6e 28  ypeAndCollation(
11d00 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
11d10 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73  ,        /* Pars
11d20 69 6e 67 20 63 6f 6e 74 65 78 74 73 20 2a 2f 0a  ing contexts */.
11d30 20 20 54 61 62 6c 65 20 2a 70 54 61 62 2c 20 20    Table *pTab,  
11d40 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20 63          /* Add c
11d50 6f 6c 75 6d 6e 20 74 79 70 65 20 69 6e 66 6f 72  olumn type infor
11d60 6d 61 74 69 6f 6e 20 74 6f 20 74 68 69 73 20 74  mation to this t
11d70 61 62 6c 65 20 2a 2f 0a 20 20 53 65 6c 65 63 74  able */.  Select
11d80 20 2a 70 53 65 6c 65 63 74 20 20 20 20 20 20 20   *pSelect       
11d90 2f 2a 20 53 45 4c 45 43 54 20 75 73 65 64 20 74  /* SELECT used t
11da0 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 79 70 65  o determine type
11db0 73 20 61 6e 64 20 63 6f 6c 6c 61 74 69 6f 6e 73  s and collations
11dc0 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33   */.){.  sqlite3
11dd0 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
11de0 62 3b 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74  b;.  NameContext
11df0 20 73 4e 43 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a   sNC;.  Column *
11e00 70 43 6f 6c 3b 0a 20 20 43 6f 6c 6c 53 65 71 20  pCol;.  CollSeq 
11e10 2a 70 43 6f 6c 6c 3b 0a 20 20 69 6e 74 20 69 3b  *pColl;.  int i;
11e20 0a 20 20 45 78 70 72 20 2a 70 3b 0a 20 20 73 74  .  Expr *p;.  st
11e30 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74  ruct ExprList_it
11e40 65 6d 20 2a 61 3b 0a 0a 20 20 61 73 73 65 72 74  em *a;..  assert
11e50 28 20 70 53 65 6c 65 63 74 21 3d 30 20 29 3b 0a  ( pSelect!=0 );.
11e60 20 20 61 73 73 65 72 74 28 20 28 70 53 65 6c 65    assert( (pSele
11e70 63 74 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53  ct->selFlags & S
11e80 46 5f 52 65 73 6f 6c 76 65 64 29 21 3d 30 20 29  F_Resolved)!=0 )
11e90 3b 0a 20 20 61 73 73 65 72 74 28 20 70 54 61 62  ;.  assert( pTab
11ea0 2d 3e 6e 43 6f 6c 3d 3d 70 53 65 6c 65 63 74 2d  ->nCol==pSelect-
11eb0 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 7c  >pEList->nExpr |
11ec0 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  | db->mallocFail
11ed0 65 64 20 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e  ed );.  if( db->
11ee0 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72  mallocFailed ) r
11ef0 65 74 75 72 6e 3b 0a 20 20 6d 65 6d 73 65 74 28  eturn;.  memset(
11f00 26 73 4e 43 2c 20 30 2c 20 73 69 7a 65 6f 66 28  &sNC, 0, sizeof(
11f10 73 4e 43 29 29 3b 0a 20 20 73 4e 43 2e 70 53 72  sNC));.  sNC.pSr
11f20 63 4c 69 73 74 20 3d 20 70 53 65 6c 65 63 74 2d  cList = pSelect-
11f30 3e 70 53 72 63 3b 0a 20 20 61 20 3d 20 70 53 65  >pSrc;.  a = pSe
11f40 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2d 3e 61 3b  lect->pEList->a;
11f50 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 43 6f 6c  .  for(i=0, pCol
11f60 3d 70 54 61 62 2d 3e 61 43 6f 6c 3b 20 69 3c 70  =pTab->aCol; i<p
11f70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 2c 20  Tab->nCol; i++, 
11f80 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 63 6f 6e  pCol++){.    con
11f90 73 74 20 63 68 61 72 20 2a 7a 54 79 70 65 3b 0a  st char *zType;.
11fa0 20 20 20 20 69 6e 74 20 6e 2c 20 6d 3b 0a 20 20      int n, m;.  
11fb0 20 20 70 20 3d 20 61 5b 69 5d 2e 70 45 78 70 72    p = a[i].pExpr
11fc0 3b 0a 20 20 20 20 7a 54 79 70 65 20 3d 20 63 6f  ;.    zType = co
11fd0 6c 75 6d 6e 54 79 70 65 28 26 73 4e 43 2c 20 70  lumnType(&sNC, p
11fe0 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  , 0, 0, 0);.    
11ff0 2f 2a 20 70 43 6f 6c 2d 3e 73 7a 45 73 74 20 3d  /* pCol->szEst =
12000 20 2e 2e 2e 20 2f 2f 20 43 6f 6c 75 6d 6e 20 73   ... // Column s
12010 69 7a 65 20 65 73 74 20 66 6f 72 20 53 45 4c 45  ize est for SELE
12020 43 54 20 74 61 62 6c 65 73 20 6e 65 76 65 72 20  CT tables never 
12030 75 73 65 64 20 2a 2f 0a 20 20 20 20 70 43 6f 6c  used */.    pCol
12040 2d 3e 61 66 66 69 6e 69 74 79 20 3d 20 73 71 6c  ->affinity = sql
12050 69 74 65 33 45 78 70 72 41 66 66 69 6e 69 74 79  ite3ExprAffinity
12060 28 70 29 3b 0a 20 20 20 20 69 66 28 20 7a 54 79  (p);.    if( zTy
12070 70 65 20 29 7b 0a 20 20 20 20 20 20 6d 20 3d 20  pe ){.      m = 
12080 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
12090 7a 54 79 70 65 29 3b 0a 20 20 20 20 20 20 6e 20  zType);.      n 
120a0 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
120b0 30 28 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a  0(pCol->zName);.
120c0 20 20 20 20 20 20 70 43 6f 6c 2d 3e 7a 4e 61 6d        pCol->zNam
120d0 65 20 3d 20 73 71 6c 69 74 65 33 44 62 52 65 61  e = sqlite3DbRea
120e0 6c 6c 6f 63 4f 72 46 72 65 65 28 64 62 2c 20 70  llocOrFree(db, p
120f0 43 6f 6c 2d 3e 7a 4e 61 6d 65 2c 20 6e 2b 6d 2b  Col->zName, n+m+
12100 32 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 43  2);.      if( pC
12110 6f 6c 2d 3e 7a 4e 61 6d 65 20 29 7b 0a 20 20 20  ol->zName ){.   
12120 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70 43 6f       memcpy(&pCo
12130 6c 2d 3e 7a 4e 61 6d 65 5b 6e 2b 31 5d 2c 20 7a  l->zName[n+1], z
12140 54 79 70 65 2c 20 6d 2b 31 29 3b 0a 20 20 20 20  Type, m+1);.    
12150 20 20 20 20 70 43 6f 6c 2d 3e 63 6f 6c 46 6c 61      pCol->colFla
12160 67 73 20 7c 3d 20 43 4f 4c 46 4c 41 47 5f 48 41  gs |= COLFLAG_HA
12170 53 54 59 50 45 3b 0a 20 20 20 20 20 20 7d 0a 20  STYPE;.      }. 
12180 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 43 6f     }.    if( pCo
12190 6c 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 30 20 29  l->affinity==0 )
121a0 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 20   pCol->affinity 
121b0 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f  = SQLITE_AFF_BLO
121c0 42 3b 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73  B;.    pColl = s
121d0 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65  qlite3ExprCollSe
121e0 71 28 70 50 61 72 73 65 2c 20 70 29 3b 0a 20 20  q(pParse, p);.  
121f0 20 20 69 66 28 20 70 43 6f 6c 6c 20 26 26 20 70    if( pColl && p
12200 43 6f 6c 2d 3e 7a 43 6f 6c 6c 3d 3d 30 20 29 7b  Col->zColl==0 ){
12210 0a 20 20 20 20 20 20 70 43 6f 6c 2d 3e 7a 43 6f  .      pCol->zCo
12220 6c 6c 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74  ll = sqlite3DbSt
12230 72 44 75 70 28 64 62 2c 20 70 43 6f 6c 6c 2d 3e  rDup(db, pColl->
12240 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20  zName);.    }.  
12250 7d 0a 20 20 70 54 61 62 2d 3e 73 7a 54 61 62 52  }.  pTab->szTabR
12260 6f 77 20 3d 20 31 3b 20 2f 2a 20 41 6e 79 20 6e  ow = 1; /* Any n
12270 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 20 77 6f  on-zero value wo
12280 72 6b 73 20 2a 2f 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rks */.}../*.** 
12290 47 69 76 65 6e 20 61 20 53 45 4c 45 43 54 20 73  Given a SELECT s
122a0 74 61 74 65 6d 65 6e 74 2c 20 67 65 6e 65 72 61  tatement, genera
122b0 74 65 20 61 20 54 61 62 6c 65 20 73 74 72 75 63  te a Table struc
122c0 74 75 72 65 20 74 68 61 74 20 64 65 73 63 72 69  ture that descri
122d0 62 65 73 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c  bes.** the resul
122e0 74 20 73 65 74 20 6f 66 20 74 68 61 74 20 53 45  t set of that SE
122f0 4c 45 43 54 2e 0a 2a 2f 0a 54 61 62 6c 65 20 2a  LECT..*/.Table *
12300 73 71 6c 69 74 65 33 52 65 73 75 6c 74 53 65 74  sqlite3ResultSet
12310 4f 66 53 65 6c 65 63 74 28 50 61 72 73 65 20 2a  OfSelect(Parse *
12320 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a  pParse, Select *
12330 70 53 65 6c 65 63 74 29 7b 0a 20 20 54 61 62 6c  pSelect){.  Tabl
12340 65 20 2a 70 54 61 62 3b 0a 20 20 73 71 6c 69 74  e *pTab;.  sqlit
12350 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
12360 3e 64 62 3b 0a 20 20 69 6e 74 20 73 61 76 65 64  >db;.  int saved
12370 46 6c 61 67 73 3b 0a 0a 20 20 73 61 76 65 64 46  Flags;..  savedF
12380 6c 61 67 73 20 3d 20 64 62 2d 3e 66 6c 61 67 73  lags = db->flags
12390 3b 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d  ;.  db->flags &=
123a0 20 7e 53 51 4c 49 54 45 5f 46 75 6c 6c 43 6f 6c   ~SQLITE_FullCol
123b0 4e 61 6d 65 73 3b 0a 20 20 64 62 2d 3e 66 6c 61  Names;.  db->fla
123c0 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 53 68 6f  gs |= SQLITE_Sho
123d0 72 74 43 6f 6c 4e 61 6d 65 73 3b 0a 20 20 73 71  rtColNames;.  sq
123e0 6c 69 74 65 33 53 65 6c 65 63 74 50 72 65 70 28  lite3SelectPrep(
123f0 70 50 61 72 73 65 2c 20 70 53 65 6c 65 63 74 2c  pParse, pSelect,
12400 20 30 29 3b 0a 20 20 69 66 28 20 70 50 61 72 73   0);.  if( pPars
12410 65 2d 3e 6e 45 72 72 20 29 20 72 65 74 75 72 6e  e->nErr ) return
12420 20 30 3b 0a 20 20 77 68 69 6c 65 28 20 70 53 65   0;.  while( pSe
12430 6c 65 63 74 2d 3e 70 50 72 69 6f 72 20 29 20 70  lect->pPrior ) p
12440 53 65 6c 65 63 74 20 3d 20 70 53 65 6c 65 63 74  Select = pSelect
12450 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 64 62 2d 3e  ->pPrior;.  db->
12460 66 6c 61 67 73 20 3d 20 73 61 76 65 64 46 6c 61  flags = savedFla
12470 67 73 3b 0a 20 20 70 54 61 62 20 3d 20 73 71 6c  gs;.  pTab = sql
12480 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f  ite3DbMallocZero
12490 28 64 62 2c 20 73 69 7a 65 6f 66 28 54 61 62 6c  (db, sizeof(Tabl
124a0 65 29 20 29 3b 0a 20 20 69 66 28 20 70 54 61 62  e) );.  if( pTab
124b0 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ==0 ){.    retur
124c0 6e 20 30 3b 0a 20 20 7d 0a 20 20 2f 2a 20 54 68  n 0;.  }.  /* Th
124d0 65 20 73 71 6c 69 74 65 33 52 65 73 75 6c 74 53  e sqlite3ResultS
124e0 65 74 4f 66 53 65 6c 65 63 74 28 29 20 69 73 20  etOfSelect() is 
124f0 6f 6e 6c 79 20 75 73 65 64 20 6e 20 63 6f 6e 74  only used n cont
12500 65 78 74 73 20 77 68 65 72 65 20 6c 6f 6f 6b 61  exts where looka
12510 73 69 64 65 0a 20 20 2a 2a 20 69 73 20 64 69 73  side.  ** is dis
12520 61 62 6c 65 64 20 2a 2f 0a 20 20 61 73 73 65 72  abled */.  asser
12530 74 28 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65  t( db->lookaside
12540 2e 62 44 69 73 61 62 6c 65 20 29 3b 0a 20 20 70  .bDisable );.  p
12550 54 61 62 2d 3e 6e 54 61 62 52 65 66 20 3d 20 31  Tab->nTabRef = 1
12560 3b 0a 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 20  ;.  pTab->zName 
12570 3d 20 30 3b 0a 20 20 70 54 61 62 2d 3e 6e 52 6f  = 0;.  pTab->nRo
12580 77 4c 6f 67 45 73 74 20 3d 20 32 30 30 3b 20 61  wLogEst = 200; a
12590 73 73 65 72 74 28 20 32 30 30 3d 3d 73 71 6c 69  ssert( 200==sqli
125a0 74 65 33 4c 6f 67 45 73 74 28 31 30 34 38 35 37  te3LogEst(104857
125b0 36 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 43  6) );.  sqlite3C
125c0 6f 6c 75 6d 6e 73 46 72 6f 6d 45 78 70 72 4c 69  olumnsFromExprLi
125d0 73 74 28 70 50 61 72 73 65 2c 20 70 53 65 6c 65  st(pParse, pSele
125e0 63 74 2d 3e 70 45 4c 69 73 74 2c 20 26 70 54 61  ct->pEList, &pTa
125f0 62 2d 3e 6e 43 6f 6c 2c 20 26 70 54 61 62 2d 3e  b->nCol, &pTab->
12600 61 43 6f 6c 29 3b 0a 20 20 73 71 6c 69 74 65 33  aCol);.  sqlite3
12610 53 65 6c 65 63 74 41 64 64 43 6f 6c 75 6d 6e 54  SelectAddColumnT
12620 79 70 65 41 6e 64 43 6f 6c 6c 61 74 69 6f 6e 28  ypeAndCollation(
12630 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20 70 53  pParse, pTab, pS
12640 65 6c 65 63 74 29 3b 0a 20 20 70 54 61 62 2d 3e  elect);.  pTab->
12650 69 50 4b 65 79 20 3d 20 2d 31 3b 0a 20 20 69 66  iPKey = -1;.  if
12660 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
12670 65 64 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ed ){.    sqlite
12680 33 44 65 6c 65 74 65 54 61 62 6c 65 28 64 62 2c  3DeleteTable(db,
12690 20 70 54 61 62 29 3b 0a 20 20 20 20 72 65 74 75   pTab);.    retu
126a0 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75  rn 0;.  }.  retu
126b0 72 6e 20 70 54 61 62 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn pTab;.}../*.*
126c0 2a 20 47 65 74 20 61 20 56 44 42 45 20 66 6f 72  * Get a VDBE for
126d0 20 74 68 65 20 67 69 76 65 6e 20 70 61 72 73 65   the given parse
126e0 72 20 63 6f 6e 74 65 78 74 2e 20 20 43 72 65 61  r context.  Crea
126f0 74 65 20 61 20 6e 65 77 20 6f 6e 65 20 69 66 20  te a new one if 
12700 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2a 20 49 66  necessary..** If
12710 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
12720 2c 20 72 65 74 75 72 6e 20 4e 55 4c 4c 20 61 6e  , return NULL an
12730 64 20 6c 65 61 76 65 20 61 20 6d 65 73 73 61 67  d leave a messag
12740 65 20 69 6e 20 70 50 61 72 73 65 2e 0a 2a 2f 0a  e in pParse..*/.
12750 56 64 62 65 20 2a 73 71 6c 69 74 65 33 47 65 74  Vdbe *sqlite3Get
12760 56 64 62 65 28 50 61 72 73 65 20 2a 70 50 61 72  Vdbe(Parse *pPar
12770 73 65 29 7b 0a 20 20 69 66 28 20 70 50 61 72 73  se){.  if( pPars
12780 65 2d 3e 70 56 64 62 65 20 29 7b 0a 20 20 20 20  e->pVdbe ){.    
12790 72 65 74 75 72 6e 20 70 50 61 72 73 65 2d 3e 70  return pParse->p
127a0 56 64 62 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20  Vdbe;.  }.  if( 
127b0 70 50 61 72 73 65 2d 3e 70 54 6f 70 6c 65 76 65  pParse->pTopleve
127c0 6c 3d 3d 30 0a 20 20 20 26 26 20 4f 70 74 69 6d  l==0.   && Optim
127d0 69 7a 61 74 69 6f 6e 45 6e 61 62 6c 65 64 28 70  izationEnabled(p
127e0 50 61 72 73 65 2d 3e 64 62 2c 53 51 4c 49 54 45  Parse->db,SQLITE
127f0 5f 46 61 63 74 6f 72 4f 75 74 43 6f 6e 73 74 29  _FactorOutConst)
12800 0a 20 20 29 7b 0a 20 20 20 20 70 50 61 72 73 65  .  ){.    pParse
12810 2d 3e 6f 6b 43 6f 6e 73 74 46 61 63 74 6f 72 20  ->okConstFactor 
12820 3d 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  = 1;.  }.  retur
12830 6e 20 73 71 6c 69 74 65 33 56 64 62 65 43 72 65  n sqlite3VdbeCre
12840 61 74 65 28 70 50 61 72 73 65 29 3b 0a 7d 0a 0a  ate(pParse);.}..
12850 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 74  ./*.** Compute t
12860 68 65 20 69 4c 69 6d 69 74 20 61 6e 64 20 69 4f  he iLimit and iO
12870 66 66 73 65 74 20 66 69 65 6c 64 73 20 6f 66 20  ffset fields of 
12880 74 68 65 20 53 45 4c 45 43 54 20 62 61 73 65 64  the SELECT based
12890 20 6f 6e 20 74 68 65 0a 2a 2a 20 70 4c 69 6d 69   on the.** pLimi
128a0 74 20 65 78 70 72 65 73 73 69 6f 6e 73 2e 20 20  t expressions.  
128b0 70 4c 69 6d 69 74 2d 3e 70 4c 65 66 74 20 61 6e  pLimit->pLeft an
128c0 64 20 70 4c 69 6d 69 74 2d 3e 70 52 69 67 68 74  d pLimit->pRight
128d0 20 68 6f 6c 64 20 74 68 65 20 65 78 70 72 65 73   hold the expres
128e0 73 69 6f 6e 73 0a 2a 2a 20 74 68 61 74 20 61 70  sions.** that ap
128f0 70 65 61 72 20 69 6e 20 74 68 65 20 6f 72 69 67  pear in the orig
12900 69 6e 61 6c 20 53 51 4c 20 73 74 61 74 65 6d 65  inal SQL stateme
12910 6e 74 20 61 66 74 65 72 20 74 68 65 20 4c 49 4d  nt after the LIM
12920 49 54 20 61 6e 64 20 4f 46 46 53 45 54 0a 2a 2a  IT and OFFSET.**
12930 20 6b 65 79 77 6f 72 64 73 2e 20 20 4f 72 20 4e   keywords.  Or N
12940 55 4c 4c 20 69 66 20 74 68 6f 73 65 20 6b 65 79  ULL if those key
12950 77 6f 72 64 73 20 61 72 65 20 6f 6d 69 74 74 65  words are omitte
12960 64 2e 20 69 4c 69 6d 69 74 20 61 6e 64 20 69 4f  d. iLimit and iO
12970 66 66 73 65 74 20 0a 2a 2a 20 61 72 65 20 74 68  ffset .** are th
12980 65 20 69 6e 74 65 67 65 72 20 6d 65 6d 6f 72 79  e integer memory
12990 20 72 65 67 69 73 74 65 72 20 6e 75 6d 62 65 72   register number
129a0 73 20 66 6f 72 20 63 6f 75 6e 74 65 72 73 20 75  s for counters u
129b0 73 65 64 20 74 6f 20 63 6f 6d 70 75 74 65 20 0a  sed to compute .
129c0 2a 2a 20 74 68 65 20 6c 69 6d 69 74 20 61 6e 64  ** the limit and
129d0 20 6f 66 66 73 65 74 2e 20 20 49 66 20 74 68 65   offset.  If the
129e0 72 65 20 69 73 20 6e 6f 20 6c 69 6d 69 74 20 61  re is no limit a
129f0 6e 64 2f 6f 72 20 6f 66 66 73 65 74 2c 20 74 68  nd/or offset, th
12a00 65 6e 20 0a 2a 2a 20 69 4c 69 6d 69 74 20 61 6e  en .** iLimit an
12a10 64 20 69 4f 66 66 73 65 74 20 61 72 65 20 6e 65  d iOffset are ne
12a20 67 61 74 69 76 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  gative..**.** Th
12a30 69 73 20 72 6f 75 74 69 6e 65 20 63 68 61 6e 67  is routine chang
12a40 65 73 20 74 68 65 20 76 61 6c 75 65 73 20 6f 66  es the values of
12a50 20 69 4c 69 6d 69 74 20 61 6e 64 20 69 4f 66 66   iLimit and iOff
12a60 73 65 74 20 6f 6e 6c 79 20 69 66 0a 2a 2a 20 61  set only if.** a
12a70 20 6c 69 6d 69 74 20 6f 72 20 6f 66 66 73 65 74   limit or offset
12a80 20 69 73 20 64 65 66 69 6e 65 64 20 62 79 20 70   is defined by p
12a90 4c 69 6d 69 74 2d 3e 70 4c 65 66 74 20 61 6e 64  Limit->pLeft and
12aa0 20 70 4c 69 6d 69 74 2d 3e 70 52 69 67 68 74 2e   pLimit->pRight.
12ab0 20 20 69 4c 69 6d 69 74 0a 2a 2a 20 61 6e 64 20    iLimit.** and 
12ac0 69 4f 66 66 73 65 74 20 73 68 6f 75 6c 64 20 68  iOffset should h
12ad0 61 76 65 20 62 65 65 6e 20 70 72 65 73 65 74 20  ave been preset 
12ae0 74 6f 20 61 70 70 72 6f 70 72 69 61 74 65 20 64  to appropriate d
12af0 65 66 61 75 6c 74 20 76 61 6c 75 65 73 20 28 7a  efault values (z
12b00 65 72 6f 29 0a 2a 2a 20 70 72 69 6f 72 20 74 6f  ero).** prior to
12b10 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 72 6f   calling this ro
12b20 75 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  utine..**.** The
12b30 20 69 4f 66 66 73 65 74 20 72 65 67 69 73 74 65   iOffset registe
12b40 72 20 28 69 66 20 69 74 20 65 78 69 73 74 73 29  r (if it exists)
12b50 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20   is initialized 
12b60 74 6f 20 74 68 65 20 76 61 6c 75 65 0a 2a 2a 20  to the value.** 
12b70 6f 66 20 74 68 65 20 4f 46 46 53 45 54 2e 20 20  of the OFFSET.  
12b80 54 68 65 20 69 4c 69 6d 69 74 20 72 65 67 69 73  The iLimit regis
12b90 74 65 72 20 69 73 20 69 6e 69 74 69 61 6c 69 7a  ter is initializ
12ba0 65 64 20 74 6f 20 4c 49 4d 49 54 2e 20 20 52 65  ed to LIMIT.  Re
12bb0 67 69 73 74 65 72 0a 2a 2a 20 69 4f 66 66 73 65  gister.** iOffse
12bc0 74 2b 31 20 69 73 20 69 6e 69 74 69 61 6c 69 7a  t+1 is initializ
12bd0 65 64 20 74 6f 20 4c 49 4d 49 54 2b 4f 46 46 53  ed to LIMIT+OFFS
12be0 45 54 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20 69  ET..**.** Only i
12bf0 66 20 70 4c 69 6d 69 74 2d 3e 70 4c 65 66 74 21  f pLimit->pLeft!
12c00 3d 30 20 64 6f 20 74 68 65 20 6c 69 6d 69 74 20  =0 do the limit 
12c10 72 65 67 69 73 74 65 72 73 20 67 65 74 0a 2a 2a  registers get.**
12c20 20 72 65 64 65 66 69 6e 65 64 2e 20 20 54 68 65   redefined.  The
12c30 20 55 4e 49 4f 4e 20 41 4c 4c 20 6f 70 65 72 61   UNION ALL opera
12c40 74 6f 72 20 75 73 65 73 20 74 68 69 73 20 70 72  tor uses this pr
12c50 6f 70 65 72 74 79 20 74 6f 20 66 6f 72 63 65 0a  operty to force.
12c60 2a 2a 20 74 68 65 20 72 65 75 73 65 20 6f 66 20  ** the reuse of 
12c70 74 68 65 20 73 61 6d 65 20 6c 69 6d 69 74 20 61  the same limit a
12c80 6e 64 20 6f 66 66 73 65 74 20 72 65 67 69 73 74  nd offset regist
12c90 65 72 73 20 61 63 72 6f 73 73 20 6d 75 6c 74 69  ers across multi
12ca0 70 6c 65 0a 2a 2a 20 53 45 4c 45 43 54 20 73 74  ple.** SELECT st
12cb0 61 74 65 6d 65 6e 74 73 2e 0a 2a 2f 0a 73 74 61  atements..*/.sta
12cc0 74 69 63 20 76 6f 69 64 20 63 6f 6d 70 75 74 65  tic void compute
12cd0 4c 69 6d 69 74 52 65 67 69 73 74 65 72 73 28 50  LimitRegisters(P
12ce0 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 65  arse *pParse, Se
12cf0 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20 69 42 72  lect *p, int iBr
12d00 65 61 6b 29 7b 0a 20 20 56 64 62 65 20 2a 76 20  eak){.  Vdbe *v 
12d10 3d 20 30 3b 0a 20 20 69 6e 74 20 69 4c 69 6d 69  = 0;.  int iLimi
12d20 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 4f 66  t = 0;.  int iOf
12d30 66 73 65 74 3b 0a 20 20 69 6e 74 20 6e 3b 0a 20  fset;.  int n;. 
12d40 20 45 78 70 72 20 2a 70 4c 69 6d 69 74 20 3d 20   Expr *pLimit = 
12d50 70 2d 3e 70 4c 69 6d 69 74 3b 0a 0a 20 20 69 66  p->pLimit;..  if
12d60 28 20 70 2d 3e 69 4c 69 6d 69 74 20 29 20 72 65  ( p->iLimit ) re
12d70 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20 0a 20 20 2a  turn;..  /* .  *
12d80 2a 20 22 4c 49 4d 49 54 20 2d 31 22 20 61 6c 77  * "LIMIT -1" alw
12d90 61 79 73 20 73 68 6f 77 73 20 61 6c 6c 20 72 6f  ays shows all ro
12da0 77 73 2e 20 20 54 68 65 72 65 20 69 73 20 73 6f  ws.  There is so
12db0 6d 65 0a 20 20 2a 2a 20 63 6f 6e 74 72 6f 76 65  me.  ** controve
12dc0 72 73 79 20 61 62 6f 75 74 20 77 68 61 74 20 74  rsy about what t
12dd0 68 65 20 63 6f 72 72 65 63 74 20 62 65 68 61 76  he correct behav
12de0 69 6f 72 20 73 68 6f 75 6c 64 20 62 65 2e 0a 20  ior should be.. 
12df0 20 2a 2a 20 54 68 65 20 63 75 72 72 65 6e 74 20   ** The current 
12e00 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 69  implementation i
12e10 6e 74 65 72 70 72 65 74 73 20 22 4c 49 4d 49 54  nterprets "LIMIT
12e20 20 30 22 20 74 6f 20 6d 65 61 6e 0a 20 20 2a 2a   0" to mean.  **
12e30 20 6e 6f 20 72 6f 77 73 2e 0a 20 20 2a 2f 0a 20   no rows..  */. 
12e40 20 69 66 28 20 70 4c 69 6d 69 74 20 29 7b 0a 20   if( pLimit ){. 
12e50 20 20 20 61 73 73 65 72 74 28 20 70 4c 69 6d 69     assert( pLimi
12e60 74 2d 3e 6f 70 3d 3d 54 4b 5f 4c 49 4d 49 54 20  t->op==TK_LIMIT 
12e70 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
12e80 4c 69 6d 69 74 2d 3e 70 4c 65 66 74 21 3d 30 20  Limit->pLeft!=0 
12e90 29 3b 0a 20 20 20 20 70 2d 3e 69 4c 69 6d 69 74  );.    p->iLimit
12ea0 20 3d 20 69 4c 69 6d 69 74 20 3d 20 2b 2b 70 50   = iLimit = ++pP
12eb0 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20  arse->nMem;.    
12ec0 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64  v = sqlite3GetVd
12ed0 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  be(pParse);.    
12ee0 61 73 73 65 72 74 28 20 76 21 3d 30 20 29 3b 0a  assert( v!=0 );.
12ef0 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45      if( sqlite3E
12f00 78 70 72 49 73 49 6e 74 65 67 65 72 28 70 4c 69  xprIsInteger(pLi
12f10 6d 69 74 2d 3e 70 4c 65 66 74 2c 20 26 6e 29 20  mit->pLeft, &n) 
12f20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
12f30 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
12f40 5f 49 6e 74 65 67 65 72 2c 20 6e 2c 20 69 4c 69  _Integer, n, iLi
12f50 6d 69 74 29 3b 0a 20 20 20 20 20 20 56 64 62 65  mit);.      Vdbe
12f60 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4c 49 4d  Comment((v, "LIM
12f70 49 54 20 63 6f 75 6e 74 65 72 22 29 29 3b 0a 20  IT counter"));. 
12f80 20 20 20 20 20 69 66 28 20 6e 3d 3d 30 20 29 7b       if( n==0 ){
12f90 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
12fa0 56 64 62 65 47 6f 74 6f 28 76 2c 20 69 42 72 65  VdbeGoto(v, iBre
12fb0 61 6b 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ak);.      }else
12fc0 20 69 66 28 20 6e 3e 3d 30 20 26 26 20 70 2d 3e   if( n>=0 && p->
12fd0 6e 53 65 6c 65 63 74 52 6f 77 3e 73 71 6c 69 74  nSelectRow>sqlit
12fe0 65 33 4c 6f 67 45 73 74 28 28 75 36 34 29 6e 29  e3LogEst((u64)n)
12ff0 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 6e   ){.        p->n
13000 53 65 6c 65 63 74 52 6f 77 20 3d 20 73 71 6c 69  SelectRow = sqli
13010 74 65 33 4c 6f 67 45 73 74 28 28 75 36 34 29 6e  te3LogEst((u64)n
13020 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 73 65  );.        p->se
13030 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f 46 69 78  lFlags |= SF_Fix
13040 65 64 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 7d  edLimit;.      }
13050 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
13060 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
13070 65 28 70 50 61 72 73 65 2c 20 70 4c 69 6d 69 74  e(pParse, pLimit
13080 2d 3e 70 4c 65 66 74 2c 20 69 4c 69 6d 69 74 29  ->pLeft, iLimit)
13090 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
130a0 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
130b0 4d 75 73 74 42 65 49 6e 74 2c 20 69 4c 69 6d 69  MustBeInt, iLimi
130c0 74 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  t); VdbeCoverage
130d0 28 76 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  (v);.      VdbeC
130e0 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4c 49 4d 49  omment((v, "LIMI
130f0 54 20 63 6f 75 6e 74 65 72 22 29 29 3b 0a 20 20  T counter"));.  
13100 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
13110 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66 4e 6f  ddOp2(v, OP_IfNo
13120 74 2c 20 69 4c 69 6d 69 74 2c 20 69 42 72 65 61  t, iLimit, iBrea
13130 6b 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  k); VdbeCoverage
13140 28 76 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  (v);.    }.    i
13150 66 28 20 70 4c 69 6d 69 74 2d 3e 70 52 69 67 68  f( pLimit->pRigh
13160 74 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 69 4f  t ){.      p->iO
13170 66 66 73 65 74 20 3d 20 69 4f 66 66 73 65 74 20  ffset = iOffset 
13180 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
13190 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e  ;.      pParse->
131a0 6e 4d 65 6d 2b 2b 3b 20 20 20 2f 2a 20 41 6c 6c  nMem++;   /* All
131b0 6f 63 61 74 65 20 61 6e 20 65 78 74 72 61 20 72  ocate an extra r
131c0 65 67 69 73 74 65 72 20 66 6f 72 20 6c 69 6d 69  egister for limi
131d0 74 2b 6f 66 66 73 65 74 20 2a 2f 0a 20 20 20 20  t+offset */.    
131e0 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
131f0 65 28 70 50 61 72 73 65 2c 20 70 4c 69 6d 69 74  e(pParse, pLimit
13200 2d 3e 70 52 69 67 68 74 2c 20 69 4f 66 66 73 65  ->pRight, iOffse
13210 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
13220 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
13230 50 5f 4d 75 73 74 42 65 49 6e 74 2c 20 69 4f 66  P_MustBeInt, iOf
13240 66 73 65 74 29 3b 20 56 64 62 65 43 6f 76 65 72  fset); VdbeCover
13250 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 56 64  age(v);.      Vd
13260 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4f  beComment((v, "O
13270 46 46 53 45 54 20 63 6f 75 6e 74 65 72 22 29 29  FFSET counter"))
13280 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
13290 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
132a0 4f 66 66 73 65 74 4c 69 6d 69 74 2c 20 69 4c 69  OffsetLimit, iLi
132b0 6d 69 74 2c 20 69 4f 66 66 73 65 74 2b 31 2c 20  mit, iOffset+1, 
132c0 69 4f 66 66 73 65 74 29 3b 0a 20 20 20 20 20 20  iOffset);.      
132d0 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
132e0 22 4c 49 4d 49 54 2b 4f 46 46 53 45 54 22 29 29  "LIMIT+OFFSET"))
132f0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 23  ;.    }.  }.}..#
13300 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
13310 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45  IT_COMPOUND_SELE
13320 43 54 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  CT./*.** Return 
13330 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 20  the appropriate 
13340 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  collating sequen
13350 63 65 20 66 6f 72 20 74 68 65 20 69 43 6f 6c 2d  ce for the iCol-
13360 74 68 20 63 6f 6c 75 6d 6e 20 6f 66 0a 2a 2a 20  th column of.** 
13370 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 66  the result set f
13380 6f 72 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 2d  or the compound-
13390 73 65 6c 65 63 74 20 73 74 61 74 65 6d 65 6e 74  select statement
133a0 20 22 70 22 2e 20 20 52 65 74 75 72 6e 20 4e 55   "p".  Return NU
133b0 4c 4c 20 69 66 0a 2a 2a 20 74 68 65 20 63 6f 6c  LL if.** the col
133c0 75 6d 6e 20 68 61 73 20 6e 6f 20 64 65 66 61 75  umn has no defau
133d0 6c 74 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71  lt collating seq
133e0 75 65 6e 63 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  uence..**.** The
133f0 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
13400 6e 63 65 20 66 6f 72 20 74 68 65 20 63 6f 6d 70  nce for the comp
13410 6f 75 6e 64 20 73 65 6c 65 63 74 20 69 73 20 74  ound select is t
13420 61 6b 65 6e 20 66 72 6f 6d 20 74 68 65 0a 2a 2a  aken from the.**
13430 20 6c 65 66 74 2d 6d 6f 73 74 20 74 65 72 6d 20   left-most term 
13440 6f 66 20 74 68 65 20 73 65 6c 65 63 74 20 74 68  of the select th
13450 61 74 20 68 61 73 20 61 20 63 6f 6c 6c 61 74 69  at has a collati
13460 6e 67 20 73 65 71 75 65 6e 63 65 2e 0a 2a 2f 0a  ng sequence..*/.
13470 73 74 61 74 69 63 20 43 6f 6c 6c 53 65 71 20 2a  static CollSeq *
13480 6d 75 6c 74 69 53 65 6c 65 63 74 43 6f 6c 6c 53  multiSelectCollS
13490 65 71 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  eq(Parse *pParse
134a0 2c 20 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74  , Select *p, int
134b0 20 69 43 6f 6c 29 7b 0a 20 20 43 6f 6c 6c 53 65   iCol){.  CollSe
134c0 71 20 2a 70 52 65 74 3b 0a 20 20 69 66 28 20 70  q *pRet;.  if( p
134d0 2d 3e 70 50 72 69 6f 72 20 29 7b 0a 20 20 20 20  ->pPrior ){.    
134e0 70 52 65 74 20 3d 20 6d 75 6c 74 69 53 65 6c 65  pRet = multiSele
134f0 63 74 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  ctCollSeq(pParse
13500 2c 20 70 2d 3e 70 50 72 69 6f 72 2c 20 69 43 6f  , p->pPrior, iCo
13510 6c 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  l);.  }else{.   
13520 20 70 52 65 74 20 3d 20 30 3b 0a 20 20 7d 0a 20   pRet = 0;.  }. 
13530 20 61 73 73 65 72 74 28 20 69 43 6f 6c 3e 3d 30   assert( iCol>=0
13540 20 29 3b 0a 20 20 2f 2a 20 69 43 6f 6c 20 6d 75   );.  /* iCol mu
13550 73 74 20 62 65 20 6c 65 73 73 20 74 68 61 6e 20  st be less than 
13560 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  p->pEList->nExpr
13570 2e 20 20 4f 74 68 65 72 77 69 73 65 20 61 6e 20  .  Otherwise an 
13580 65 72 72 6f 72 20 77 6f 75 6c 64 0a 20 20 2a 2a  error would.  **
13590 20 68 61 76 65 20 62 65 65 6e 20 74 68 72 6f 77   have been throw
135a0 6e 20 64 75 72 69 6e 67 20 6e 61 6d 65 20 72 65  n during name re
135b0 73 6f 6c 75 74 69 6f 6e 20 61 6e 64 20 77 65 20  solution and we 
135c0 77 6f 75 6c 64 20 6e 6f 74 20 68 61 76 65 20 67  would not have g
135d0 6f 74 74 65 6e 0a 20 20 2a 2a 20 74 68 69 73 20  otten.  ** this 
135e0 66 61 72 20 2a 2f 0a 20 20 69 66 28 20 70 52 65  far */.  if( pRe
135f0 74 3d 3d 30 20 26 26 20 41 4c 57 41 59 53 28 69  t==0 && ALWAYS(i
13600 43 6f 6c 3c 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e  Col<p->pEList->n
13610 45 78 70 72 29 20 29 7b 0a 20 20 20 20 70 52 65  Expr) ){.    pRe
13620 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  t = sqlite3ExprC
13630 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70  ollSeq(pParse, p
13640 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 69 43 6f 6c  ->pEList->a[iCol
13650 5d 2e 70 45 78 70 72 29 3b 0a 20 20 7d 0a 20 20  ].pExpr);.  }.  
13660 72 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 0a  return pRet;.}..
13670 2f 2a 0a 2a 2a 20 54 68 65 20 73 65 6c 65 63 74  /*.** The select
13680 20 73 74 61 74 65 6d 65 6e 74 20 70 61 73 73 65   statement passe
13690 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20  d as the second 
136a0 70 61 72 61 6d 65 74 65 72 20 69 73 20 61 20 63  parameter is a c
136b0 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 0a 2a  ompound SELECT.*
136c0 2a 20 77 69 74 68 20 61 6e 20 4f 52 44 45 52 20  * with an ORDER 
136d0 42 59 20 63 6c 61 75 73 65 2e 20 54 68 69 73 20  BY clause. This 
136e0 66 75 6e 63 74 69 6f 6e 20 61 6c 6c 6f 63 61 74  function allocat
136f0 65 73 20 61 6e 64 20 72 65 74 75 72 6e 73 20 61  es and returns a
13700 20 4b 65 79 49 6e 66 6f 0a 2a 2a 20 73 74 72 75   KeyInfo.** stru
13710 63 74 75 72 65 20 73 75 69 74 61 62 6c 65 20 66  cture suitable f
13720 6f 72 20 69 6d 70 6c 65 6d 65 6e 74 69 6e 67 20  or implementing 
13730 74 68 65 20 4f 52 44 45 52 20 42 59 2e 0a 2a 2a  the ORDER BY..**
13740 0a 2a 2a 20 53 70 61 63 65 20 74 6f 20 68 6f 6c  .** Space to hol
13750 64 20 74 68 65 20 4b 65 79 49 6e 66 6f 20 73 74  d the KeyInfo st
13760 72 75 63 74 75 72 65 20 69 73 20 6f 62 74 61 69  ructure is obtai
13770 6e 65 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 2e  ned from malloc.
13780 20 54 68 65 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20   The calling.** 
13790 66 75 6e 63 74 69 6f 6e 20 69 73 20 72 65 73 70  function is resp
137a0 6f 6e 73 69 62 6c 65 20 66 6f 72 20 65 6e 73 75  onsible for ensu
137b0 72 69 6e 67 20 74 68 61 74 20 74 68 69 73 20 73  ring that this s
137c0 74 72 75 63 74 75 72 65 20 69 73 20 65 76 65 6e  tructure is even
137d0 74 75 61 6c 6c 79 0a 2a 2a 20 66 72 65 65 64 2e  tually.** freed.
137e0 0a 2a 2f 0a 73 74 61 74 69 63 20 4b 65 79 49 6e  .*/.static KeyIn
137f0 66 6f 20 2a 6d 75 6c 74 69 53 65 6c 65 63 74 4f  fo *multiSelectO
13800 72 64 65 72 42 79 4b 65 79 49 6e 66 6f 28 50 61  rderByKeyInfo(Pa
13810 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 65 6c  rse *pParse, Sel
13820 65 63 74 20 2a 70 2c 20 69 6e 74 20 6e 45 78 74  ect *p, int nExt
13830 72 61 29 7b 0a 20 20 45 78 70 72 4c 69 73 74 20  ra){.  ExprList 
13840 2a 70 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e 70  *pOrderBy = p->p
13850 4f 72 64 65 72 42 79 3b 0a 20 20 69 6e 74 20 6e  OrderBy;.  int n
13860 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72  OrderBy = p->pOr
13870 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20  derBy->nExpr;.  
13880 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
13890 61 72 73 65 2d 3e 64 62 3b 0a 20 20 4b 65 79 49  arse->db;.  KeyI
138a0 6e 66 6f 20 2a 70 52 65 74 20 3d 20 73 71 6c 69  nfo *pRet = sqli
138b0 74 65 33 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63 28  te3KeyInfoAlloc(
138c0 64 62 2c 20 6e 4f 72 64 65 72 42 79 2b 6e 45 78  db, nOrderBy+nEx
138d0 74 72 61 2c 20 31 29 3b 0a 20 20 69 66 28 20 70  tra, 1);.  if( p
138e0 52 65 74 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  Ret ){.    int i
138f0 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
13900 3c 6e 4f 72 64 65 72 42 79 3b 20 69 2b 2b 29 7b  <nOrderBy; i++){
13910 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 45 78  .      struct Ex
13920 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  prList_item *pIt
13930 65 6d 20 3d 20 26 70 4f 72 64 65 72 42 79 2d 3e  em = &pOrderBy->
13940 61 5b 69 5d 3b 0a 20 20 20 20 20 20 45 78 70 72  a[i];.      Expr
13950 20 2a 70 54 65 72 6d 20 3d 20 70 49 74 65 6d 2d   *pTerm = pItem-
13960 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 43 6f  >pExpr;.      Co
13970 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 0a 20  llSeq *pColl;.. 
13980 20 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e       if( pTerm->
13990 66 6c 61 67 73 20 26 20 45 50 5f 43 6f 6c 6c 61  flags & EP_Colla
139a0 74 65 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43  te ){.        pC
139b0 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70  oll = sqlite3Exp
139c0 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  rCollSeq(pParse,
139d0 20 70 54 65 72 6d 29 3b 0a 20 20 20 20 20 20 7d   pTerm);.      }
139e0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 43  else{.        pC
139f0 6f 6c 6c 20 3d 20 6d 75 6c 74 69 53 65 6c 65 63  oll = multiSelec
13a00 74 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  tCollSeq(pParse,
13a10 20 70 2c 20 70 49 74 65 6d 2d 3e 75 2e 78 2e 69   p, pItem->u.x.i
13a20 4f 72 64 65 72 42 79 43 6f 6c 2d 31 29 3b 0a 20  OrderByCol-1);. 
13a30 20 20 20 20 20 20 20 69 66 28 20 70 43 6f 6c 6c         if( pColl
13a40 3d 3d 30 20 29 20 70 43 6f 6c 6c 20 3d 20 64 62  ==0 ) pColl = db
13a50 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20  ->pDfltColl;.   
13a60 20 20 20 20 20 70 4f 72 64 65 72 42 79 2d 3e 61       pOrderBy->a
13a70 5b 69 5d 2e 70 45 78 70 72 20 3d 0a 20 20 20 20  [i].pExpr =.    
13a80 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
13a90 72 41 64 64 43 6f 6c 6c 61 74 65 53 74 72 69 6e  rAddCollateStrin
13aa0 67 28 70 50 61 72 73 65 2c 20 70 54 65 72 6d 2c  g(pParse, pTerm,
13ab0 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a   pColl->zName);.
13ac0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73        }.      as
13ad0 73 65 72 74 28 20 73 71 6c 69 74 65 33 4b 65 79  sert( sqlite3Key
13ae0 49 6e 66 6f 49 73 57 72 69 74 65 61 62 6c 65 28  InfoIsWriteable(
13af0 70 52 65 74 29 20 29 3b 0a 20 20 20 20 20 20 70  pRet) );.      p
13b00 52 65 74 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 3d 20  Ret->aColl[i] = 
13b10 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 70 52 65  pColl;.      pRe
13b20 74 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d  t->aSortOrder[i]
13b30 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69   = pOrderBy->a[i
13b40 5d 2e 73 6f 72 74 4f 72 64 65 72 3b 0a 20 20 20  ].sortOrder;.   
13b50 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e   }.  }..  return
13b60 20 70 52 65 74 3b 0a 7d 0a 0a 23 69 66 6e 64 65   pRet;.}..#ifnde
13b70 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 54  f SQLITE_OMIT_CT
13b80 45 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  E./*.** This rou
13b90 74 69 6e 65 20 67 65 6e 65 72 61 74 65 73 20 56  tine generates V
13ba0 44 42 45 20 63 6f 64 65 20 74 6f 20 63 6f 6d 70  DBE code to comp
13bb0 75 74 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 20  ute the content 
13bc0 6f 66 20 61 20 57 49 54 48 20 52 45 43 55 52 53  of a WITH RECURS
13bd0 49 56 45 0a 2a 2a 20 71 75 65 72 79 20 6f 66 20  IVE.** query of 
13be0 74 68 65 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20  the form:.**.** 
13bf0 20 20 3c 72 65 63 75 72 73 69 76 65 2d 74 61 62    <recursive-tab
13c00 6c 65 3e 20 41 53 20 28 3c 73 65 74 75 70 2d 71  le> AS (<setup-q
13c10 75 65 72 79 3e 20 55 4e 49 4f 4e 20 5b 41 4c 4c  uery> UNION [ALL
13c20 5d 20 3c 72 65 63 75 72 73 69 76 65 2d 71 75 65  ] <recursive-que
13c30 72 79 3e 29 0a 2a 2a 20 20 20 20 20 20 20 20 20  ry>).**         
13c40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13c50 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 20 20 20  \___________/   
13c60 20 20 20 20 20 20 20 20 20 20 5c 5f 5f 5f 5f 5f            \_____
13c70 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 0a 2a 2a 20 20  __________/.**  
13c80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13c90 20 20 20 20 20 20 20 20 20 70 2d 3e 70 50 72 69           p->pPri
13ca0 6f 72 20 20 20 20 20 20 20 20 20 20 20 20 20 20  or              
13cb0 20 20 20 20 20 20 20 20 70 0a 2a 2a 0a 2a 2a 0a          p.**.**.
13cc0 2a 2a 20 54 68 65 72 65 20 69 73 20 65 78 61 63  ** There is exac
13cd0 74 6c 79 20 6f 6e 65 20 72 65 66 65 72 65 6e 63  tly one referenc
13ce0 65 20 74 6f 20 74 68 65 20 72 65 63 75 72 73 69  e to the recursi
13cf0 76 65 2d 74 61 62 6c 65 20 69 6e 20 74 68 65 20  ve-table in the 
13d00 46 52 4f 4d 20 63 6c 61 75 73 65 0a 2a 2a 20 6f  FROM clause.** o
13d10 66 20 72 65 63 75 72 73 69 76 65 2d 71 75 65 72  f recursive-quer
13d20 79 2c 20 6d 61 72 6b 65 64 20 77 69 74 68 20 74  y, marked with t
13d30 68 65 20 53 72 63 4c 69 73 74 2d 3e 61 5b 5d 2e  he SrcList->a[].
13d40 66 67 2e 69 73 52 65 63 75 72 73 69 76 65 20 66  fg.isRecursive f
13d50 6c 61 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73  lag..**.** The s
13d60 65 74 75 70 2d 71 75 65 72 79 20 72 75 6e 73 20  etup-query runs 
13d70 6f 6e 63 65 20 74 6f 20 67 65 6e 65 72 61 74 65  once to generate
13d80 20 61 6e 20 69 6e 69 74 69 61 6c 20 73 65 74 20   an initial set 
13d90 6f 66 20 72 6f 77 73 20 74 68 61 74 20 67 6f 0a  of rows that go.
13da0 2a 2a 20 69 6e 74 6f 20 61 20 51 75 65 75 65 20  ** into a Queue 
13db0 74 61 62 6c 65 2e 20 20 52 6f 77 73 20 61 72 65  table.  Rows are
13dc0 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20   extracted from 
13dd0 74 68 65 20 51 75 65 75 65 20 74 61 62 6c 65 20  the Queue table 
13de0 6f 6e 65 20 62 79 0a 2a 2a 20 6f 6e 65 2e 20 20  one by.** one.  
13df0 45 61 63 68 20 72 6f 77 20 65 78 74 72 61 63 74  Each row extract
13e00 65 64 20 66 72 6f 6d 20 51 75 65 75 65 20 69 73  ed from Queue is
13e10 20 6f 75 74 70 75 74 20 74 6f 20 70 44 65 73 74   output to pDest
13e20 2e 20 20 54 68 65 6e 20 74 68 65 20 73 69 6e 67  .  Then the sing
13e30 6c 65 0a 2a 2a 20 65 78 74 72 61 63 74 65 64 20  le.** extracted 
13e40 72 6f 77 20 28 6e 6f 77 20 69 6e 20 74 68 65 20  row (now in the 
13e50 69 43 75 72 72 65 6e 74 20 74 61 62 6c 65 29 20  iCurrent table) 
13e60 62 65 63 6f 6d 65 73 20 74 68 65 20 63 6f 6e 74  becomes the cont
13e70 65 6e 74 20 6f 66 20 74 68 65 0a 2a 2a 20 72 65  ent of the.** re
13e80 63 75 72 73 69 76 65 2d 74 61 62 6c 65 20 66 6f  cursive-table fo
13e90 72 20 61 20 72 65 63 75 72 73 69 76 65 2d 71 75  r a recursive-qu
13ea0 65 72 79 20 72 75 6e 2e 20 20 54 68 65 20 6f 75  ery run.  The ou
13eb0 74 70 75 74 20 6f 66 20 74 68 65 20 72 65 63 75  tput of the recu
13ec0 72 73 69 76 65 2d 71 75 65 72 79 0a 2a 2a 20 69  rsive-query.** i
13ed0 73 20 61 64 64 65 64 20 62 61 63 6b 20 69 6e 74  s added back int
13ee0 6f 20 74 68 65 20 51 75 65 75 65 20 74 61 62 6c  o the Queue tabl
13ef0 65 2e 20 20 54 68 65 6e 20 61 6e 6f 74 68 65 72  e.  Then another
13f00 20 72 6f 77 20 69 73 20 65 78 74 72 61 63 74 65   row is extracte
13f10 64 20 66 72 6f 6d 20 51 75 65 75 65 0a 2a 2a 20  d from Queue.** 
13f20 61 6e 64 20 74 68 65 20 69 74 65 72 61 74 69 6f  and the iteratio
13f30 6e 20 63 6f 6e 74 69 6e 75 65 73 20 75 6e 74 69  n continues unti
13f40 6c 20 74 68 65 20 51 75 65 75 65 20 74 61 62 6c  l the Queue tabl
13f50 65 20 69 73 20 65 6d 70 74 79 2e 0a 2a 2a 0a 2a  e is empty..**.*
13f60 2a 20 49 66 20 74 68 65 20 63 6f 6d 70 6f 75 6e  * If the compoun
13f70 64 20 71 75 65 72 79 20 6f 70 65 72 61 74 6f 72  d query operator
13f80 20 69 73 20 55 4e 49 4f 4e 20 74 68 65 6e 20 6e   is UNION then n
13f90 6f 20 64 75 70 6c 69 63 61 74 65 20 72 6f 77 73  o duplicate rows
13fa0 20 61 72 65 20 65 76 65 72 0a 2a 2a 20 69 6e 73   are ever.** ins
13fb0 65 72 74 65 64 20 69 6e 74 6f 20 74 68 65 20 51  erted into the Q
13fc0 75 65 75 65 20 74 61 62 6c 65 2e 20 20 54 68 65  ueue table.  The
13fd0 20 69 44 69 73 74 69 6e 63 74 20 74 61 62 6c 65   iDistinct table
13fe0 20 6b 65 65 70 73 20 61 20 63 6f 70 79 20 6f 66   keeps a copy of
13ff0 20 61 6c 6c 20 72 6f 77 73 0a 2a 2a 20 74 68 61   all rows.** tha
14000 74 20 68 61 76 65 20 65 76 65 72 20 62 65 65 6e  t have ever been
14010 20 69 6e 73 65 72 74 65 64 20 69 6e 74 6f 20 51   inserted into Q
14020 75 65 75 65 20 61 6e 64 20 63 61 75 73 65 73 20  ueue and causes 
14030 64 75 70 6c 69 63 61 74 65 73 20 74 6f 20 62 65  duplicates to be
14040 0a 2a 2a 20 64 69 73 63 61 72 64 65 64 2e 20 20  .** discarded.  
14050 49 66 20 74 68 65 20 6f 70 65 72 61 74 6f 72 20  If the operator 
14060 69 73 20 55 4e 49 4f 4e 20 41 4c 4c 2c 20 74 68  is UNION ALL, th
14070 65 6e 20 64 75 70 6c 69 63 61 74 65 73 20 61 72  en duplicates ar
14080 65 20 61 6c 6c 6f 77 65 64 2e 0a 2a 2a 20 0a 2a  e allowed..** .*
14090 2a 20 49 66 20 74 68 65 20 71 75 65 72 79 20 68  * If the query h
140a0 61 73 20 61 6e 20 4f 52 44 45 52 20 42 59 2c 20  as an ORDER BY, 
140b0 74 68 65 6e 20 65 6e 74 72 69 65 73 20 69 6e 20  then entries in 
140c0 74 68 65 20 51 75 65 75 65 20 74 61 62 6c 65 20  the Queue table 
140d0 61 72 65 20 6b 65 70 74 20 69 6e 0a 2a 2a 20 4f  are kept in.** O
140e0 52 44 45 52 20 42 59 20 6f 72 64 65 72 20 61 6e  RDER BY order an
140f0 64 20 74 68 65 20 66 69 72 73 74 20 65 6e 74 72  d the first entr
14100 79 20 69 73 20 65 78 74 72 61 63 74 65 64 20 66  y is extracted f
14110 6f 72 20 65 61 63 68 20 63 79 63 6c 65 2e 20 20  or each cycle.  
14120 57 69 74 68 6f 75 74 0a 2a 2a 20 61 6e 20 4f 52  Without.** an OR
14130 44 45 52 20 42 59 2c 20 74 68 65 20 51 75 65 75  DER BY, the Queu
14140 65 20 74 61 62 6c 65 20 69 73 20 6a 75 73 74 20  e table is just 
14150 61 20 46 49 46 4f 2e 0a 2a 2a 0a 2a 2a 20 49 66  a FIFO..**.** If
14160 20 61 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 20   a LIMIT clause 
14170 69 73 20 70 72 6f 76 69 64 65 64 2c 20 74 68 65  is provided, the
14180 6e 20 74 68 65 20 69 74 65 72 61 74 69 6f 6e 20  n the iteration 
14190 73 74 6f 70 73 20 61 66 74 65 72 20 4c 49 4d 49  stops after LIMI
141a0 54 20 72 6f 77 73 0a 2a 2a 20 68 61 76 65 20 62  T rows.** have b
141b0 65 65 6e 20 6f 75 74 70 75 74 20 74 6f 20 70 44  een output to pD
141c0 65 73 74 2e 20 20 41 20 4c 49 4d 49 54 20 6f 66  est.  A LIMIT of
141d0 20 7a 65 72 6f 20 6d 65 61 6e 73 20 74 6f 20 6f   zero means to o
141e0 75 74 70 75 74 20 6e 6f 20 72 6f 77 73 20 61 6e  utput no rows an
141f0 64 20 61 0a 2a 2a 20 6e 65 67 61 74 69 76 65 20  d a.** negative 
14200 4c 49 4d 49 54 20 6d 65 61 6e 73 20 74 6f 20 6f  LIMIT means to o
14210 75 74 70 75 74 20 61 6c 6c 20 72 6f 77 73 2e 20  utput all rows. 
14220 20 49 66 20 74 68 65 72 65 20 69 73 20 61 6c 73   If there is als
14230 6f 20 61 6e 20 4f 46 46 53 45 54 20 63 6c 61 75  o an OFFSET clau
14240 73 65 0a 2a 2a 20 77 69 74 68 20 61 20 70 6f 73  se.** with a pos
14250 69 74 69 76 65 20 76 61 6c 75 65 2c 20 74 68 65  itive value, the
14260 6e 20 74 68 65 20 66 69 72 73 74 20 4f 46 46 53  n the first OFFS
14270 45 54 20 6f 75 74 70 75 74 73 20 61 72 65 20 64  ET outputs are d
14280 69 73 63 61 72 64 65 64 20 72 61 74 68 65 72 0a  iscarded rather.
14290 2a 2a 20 74 68 61 6e 20 62 65 69 6e 67 20 73 65  ** than being se
142a0 6e 74 20 74 6f 20 70 44 65 73 74 2e 20 20 54 68  nt to pDest.  Th
142b0 65 20 4c 49 4d 49 54 20 63 6f 75 6e 74 20 64 6f  e LIMIT count do
142c0 65 73 20 6e 6f 74 20 62 65 67 69 6e 20 75 6e 74  es not begin unt
142d0 69 6c 20 61 66 74 65 72 20 4f 46 46 53 45 54 0a  il after OFFSET.
142e0 2a 2a 20 72 6f 77 73 20 68 61 76 65 20 62 65 65  ** rows have bee
142f0 6e 20 73 6b 69 70 70 65 64 2e 0a 2a 2f 0a 73 74  n skipped..*/.st
14300 61 74 69 63 20 76 6f 69 64 20 67 65 6e 65 72 61  atic void genera
14310 74 65 57 69 74 68 52 65 63 75 72 73 69 76 65 51  teWithRecursiveQ
14320 75 65 72 79 28 0a 20 20 50 61 72 73 65 20 2a 70  uery(.  Parse *p
14330 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a  Parse,        /*
14340 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
14350 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c   */.  Select *p,
14360 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
14370 68 65 20 72 65 63 75 72 73 69 76 65 20 53 45 4c  he recursive SEL
14380 45 43 54 20 74 6f 20 62 65 20 63 6f 64 65 64 20  ECT to be coded 
14390 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20  */.  SelectDest 
143a0 2a 70 44 65 73 74 20 20 20 20 20 2f 2a 20 57 68  *pDest     /* Wh
143b0 61 74 20 74 6f 20 64 6f 20 77 69 74 68 20 71 75  at to do with qu
143c0 65 72 79 20 72 65 73 75 6c 74 73 20 2a 2f 0a 29  ery results */.)
143d0 7b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72  {.  SrcList *pSr
143e0 63 20 3d 20 70 2d 3e 70 53 72 63 3b 20 20 20 20  c = p->pSrc;    
143f0 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c    /* The FROM cl
14400 61 75 73 65 20 6f 66 20 74 68 65 20 72 65 63 75  ause of the recu
14410 72 73 69 76 65 20 71 75 65 72 79 20 2a 2f 0a 20  rsive query */. 
14420 20 69 6e 74 20 6e 43 6f 6c 20 3d 20 70 2d 3e 70   int nCol = p->p
14430 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 20 2f  EList->nExpr;  /
14440 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75  * Number of colu
14450 6d 6e 73 20 69 6e 20 74 68 65 20 72 65 63 75 72  mns in the recur
14460 73 69 76 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20  sive table */.  
14470 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65  Vdbe *v = pParse
14480 2d 3e 70 56 64 62 65 3b 20 20 20 20 20 20 2f 2a  ->pVdbe;      /*
14490 20 54 68 65 20 70 72 65 70 61 72 65 64 20 73 74   The prepared st
144a0 61 74 65 6d 65 6e 74 20 75 6e 64 65 72 20 63 6f  atement under co
144b0 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20  nstruction */.  
144c0 53 65 6c 65 63 74 20 2a 70 53 65 74 75 70 20 3d  Select *pSetup =
144d0 20 70 2d 3e 70 50 72 69 6f 72 3b 20 20 20 2f 2a   p->pPrior;   /*
144e0 20 54 68 65 20 73 65 74 75 70 20 71 75 65 72 79   The setup query
144f0 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 54 6f   */.  int addrTo
14500 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p;              
14510 20 20 20 20 2f 2a 20 54 6f 70 20 6f 66 20 74 68      /* Top of th
14520 65 20 6c 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74 20  e loop */.  int 
14530 61 64 64 72 43 6f 6e 74 2c 20 61 64 64 72 42 72  addrCont, addrBr
14540 65 61 6b 3b 20 20 20 20 20 20 2f 2a 20 43 4f 4e  eak;      /* CON
14550 54 49 4e 55 45 20 61 6e 64 20 42 52 45 41 4b 20  TINUE and BREAK 
14560 61 64 64 72 65 73 73 65 73 20 2a 2f 0a 20 20 69  addresses */.  i
14570 6e 74 20 69 43 75 72 72 65 6e 74 20 3d 20 30 3b  nt iCurrent = 0;
14580 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
14590 54 68 65 20 43 75 72 72 65 6e 74 20 74 61 62 6c  The Current tabl
145a0 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 43 75  e */.  int regCu
145b0 72 72 65 6e 74 3b 20 20 20 20 20 20 20 20 20 20  rrent;          
145c0 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72       /* Register
145d0 20 68 6f 6c 64 69 6e 67 20 43 75 72 72 65 6e 74   holding Current
145e0 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20   table */.  int 
145f0 69 51 75 65 75 65 3b 20 20 20 20 20 20 20 20 20  iQueue;         
14600 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
14610 20 51 75 65 75 65 20 74 61 62 6c 65 20 2a 2f 0a   Queue table */.
14620 20 20 69 6e 74 20 69 44 69 73 74 69 6e 63 74 20    int iDistinct 
14630 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
14640 2f 2a 20 54 6f 20 65 6e 73 75 72 65 20 75 6e 69  /* To ensure uni
14650 71 75 65 20 72 65 73 75 6c 74 73 20 69 66 20 55  que results if U
14660 4e 49 4f 4e 20 2a 2f 0a 20 20 69 6e 74 20 65 44  NION */.  int eD
14670 65 73 74 20 3d 20 53 52 54 5f 46 69 66 6f 3b 20  est = SRT_Fifo; 
14680 20 20 20 20 20 20 20 20 2f 2a 20 48 6f 77 20 74          /* How t
14690 6f 20 77 72 69 74 65 20 74 6f 20 51 75 65 75 65  o write to Queue
146a0 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74   */.  SelectDest
146b0 20 64 65 73 74 51 75 65 75 65 3b 20 20 20 20 20   destQueue;     
146c0 20 20 20 20 2f 2a 20 53 65 6c 65 63 74 44 65 73      /* SelectDes
146d0 74 20 74 61 72 67 65 74 74 69 6e 67 20 74 68 65  t targetting the
146e0 20 51 75 65 75 65 20 74 61 62 6c 65 20 2a 2f 0a   Queue table */.
146f0 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20    int i;        
14700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14710 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  /* Loop counter 
14720 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  */.  int rc;    
14730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14740 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64     /* Result cod
14750 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  e */.  ExprList 
14760 2a 70 4f 72 64 65 72 42 79 3b 20 20 20 20 20 20  *pOrderBy;      
14770 20 20 20 20 20 2f 2a 20 54 68 65 20 4f 52 44 45       /* The ORDE
14780 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20  R BY clause */. 
14790 20 45 78 70 72 20 2a 70 4c 69 6d 69 74 3b 20 20   Expr *pLimit;  
147a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
147b0 2a 20 53 61 76 65 64 20 4c 49 4d 49 54 20 61 6e  * Saved LIMIT an
147c0 64 20 4f 46 46 53 45 54 20 2a 2f 0a 20 20 69 6e  d OFFSET */.  in
147d0 74 20 72 65 67 4c 69 6d 69 74 2c 20 72 65 67 4f  t regLimit, regO
147e0 66 66 73 65 74 3b 20 20 20 20 20 20 2f 2a 20 52  ffset;      /* R
147f0 65 67 69 73 74 65 72 73 20 75 73 65 64 20 62 79  egisters used by
14800 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46 53 45   LIMIT and OFFSE
14810 54 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51  T */..#ifndef SQ
14820 4c 49 54 45 5f 4f 4d 49 54 5f 57 49 4e 44 4f 57  LITE_OMIT_WINDOW
14830 46 55 4e 43 0a 20 20 69 66 28 20 70 2d 3e 70 57  FUNC.  if( p->pW
14840 69 6e 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  in ){.    sqlite
14850 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
14860 2c 20 22 63 61 6e 6e 6f 74 20 75 73 65 20 77 69  , "cannot use wi
14870 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e 73 20 69  ndow functions i
14880 6e 20 72 65 63 75 72 73 69 76 65 20 71 75 65 72  n recursive quer
14890 69 65 73 22 29 3b 0a 20 20 20 20 72 65 74 75 72  ies");.    retur
148a0 6e 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  n;.  }.#endif.. 
148b0 20 2f 2a 20 4f 62 74 61 69 6e 20 61 75 74 68 6f   /* Obtain autho
148c0 72 69 7a 61 74 69 6f 6e 20 74 6f 20 64 6f 20 61  rization to do a
148d0 20 72 65 63 75 72 73 69 76 65 20 71 75 65 72 79   recursive query
148e0 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69 74 65   */.  if( sqlite
148f0 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73  3AuthCheck(pPars
14900 65 2c 20 53 51 4c 49 54 45 5f 52 45 43 55 52 53  e, SQLITE_RECURS
14910 49 56 45 2c 20 30 2c 20 30 2c 20 30 29 20 29 20  IVE, 0, 0, 0) ) 
14920 72 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20 50 72  return;..  /* Pr
14930 6f 63 65 73 73 20 74 68 65 20 4c 49 4d 49 54 20  ocess the LIMIT 
14940 61 6e 64 20 4f 46 46 53 45 54 20 63 6c 61 75 73  and OFFSET claus
14950 65 73 2c 20 69 66 20 74 68 65 79 20 65 78 69 73  es, if they exis
14960 74 20 2a 2f 0a 20 20 61 64 64 72 42 72 65 61 6b  t */.  addrBreak
14970 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
14980 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 70 2d  keLabel(v);.  p-
14990 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 33 32  >nSelectRow = 32
149a0 30 3b 20 20 2f 2a 20 34 20 62 69 6c 6c 69 6f 6e  0;  /* 4 billion
149b0 20 72 6f 77 73 20 2a 2f 0a 20 20 63 6f 6d 70 75   rows */.  compu
149c0 74 65 4c 69 6d 69 74 52 65 67 69 73 74 65 72 73  teLimitRegisters
149d0 28 70 50 61 72 73 65 2c 20 70 2c 20 61 64 64 72  (pParse, p, addr
149e0 42 72 65 61 6b 29 3b 0a 20 20 70 4c 69 6d 69 74  Break);.  pLimit
149f0 20 3d 20 70 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20   = p->pLimit;.  
14a00 72 65 67 4c 69 6d 69 74 20 3d 20 70 2d 3e 69 4c  regLimit = p->iL
14a10 69 6d 69 74 3b 0a 20 20 72 65 67 4f 66 66 73 65  imit;.  regOffse
14a20 74 20 3d 20 70 2d 3e 69 4f 66 66 73 65 74 3b 0a  t = p->iOffset;.
14a30 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b    p->pLimit = 0;
14a40 0a 20 20 70 2d 3e 69 4c 69 6d 69 74 20 3d 20 70  .  p->iLimit = p
14a50 2d 3e 69 4f 66 66 73 65 74 20 3d 20 30 3b 0a 20  ->iOffset = 0;. 
14a60 20 70 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e 70   pOrderBy = p->p
14a70 4f 72 64 65 72 42 79 3b 0a 0a 20 20 2f 2a 20 4c  OrderBy;..  /* L
14a80 6f 63 61 74 65 20 74 68 65 20 63 75 72 73 6f 72  ocate the cursor
14a90 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 43   number of the C
14aa0 75 72 72 65 6e 74 20 74 61 62 6c 65 20 2a 2f 0a  urrent table */.
14ab0 20 20 66 6f 72 28 69 3d 30 3b 20 41 4c 57 41 59    for(i=0; ALWAY
14ac0 53 28 69 3c 70 53 72 63 2d 3e 6e 53 72 63 29 3b  S(i<pSrc->nSrc);
14ad0 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70   i++){.    if( p
14ae0 53 72 63 2d 3e 61 5b 69 5d 2e 66 67 2e 69 73 52  Src->a[i].fg.isR
14af0 65 63 75 72 73 69 76 65 20 29 7b 0a 20 20 20 20  ecursive ){.    
14b00 20 20 69 43 75 72 72 65 6e 74 20 3d 20 70 53 72    iCurrent = pSr
14b10 63 2d 3e 61 5b 69 5d 2e 69 43 75 72 73 6f 72 3b  c->a[i].iCursor;
14b20 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
14b30 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 6c    }.  }..  /* Al
14b40 6c 6f 63 61 74 65 20 63 75 72 73 6f 72 73 20 6e  locate cursors n
14b50 75 6d 62 65 72 73 20 66 6f 72 20 51 75 65 75 65  umbers for Queue
14b60 20 61 6e 64 20 44 69 73 74 69 6e 63 74 2e 20 20   and Distinct.  
14b70 54 68 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65  The cursor numbe
14b80 72 20 66 6f 72 0a 20 20 2a 2a 20 74 68 65 20 44  r for.  ** the D
14b90 69 73 74 69 6e 63 74 20 74 61 62 6c 65 20 6d 75  istinct table mu
14ba0 73 74 20 62 65 20 65 78 61 63 74 6c 79 20 6f 6e  st be exactly on
14bb0 65 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 51  e greater than Q
14bc0 75 65 75 65 20 69 6e 20 6f 72 64 65 72 0a 20 20  ueue in order.  
14bd0 2a 2a 20 66 6f 72 20 74 68 65 20 53 52 54 5f 44  ** for the SRT_D
14be0 69 73 74 46 69 66 6f 20 61 6e 64 20 53 52 54 5f  istFifo and SRT_
14bf0 44 69 73 74 51 75 65 75 65 20 64 65 73 74 69 6e  DistQueue destin
14c00 61 74 69 6f 6e 73 20 74 6f 20 77 6f 72 6b 2e 20  ations to work. 
14c10 2a 2f 0a 20 20 69 51 75 65 75 65 20 3d 20 70 50  */.  iQueue = pP
14c20 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20  arse->nTab++;.  
14c30 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 4e  if( p->op==TK_UN
14c40 49 4f 4e 20 29 7b 0a 20 20 20 20 65 44 65 73 74  ION ){.    eDest
14c50 20 3d 20 70 4f 72 64 65 72 42 79 20 3f 20 53 52   = pOrderBy ? SR
14c60 54 5f 44 69 73 74 51 75 65 75 65 20 3a 20 53 52  T_DistQueue : SR
14c70 54 5f 44 69 73 74 46 69 66 6f 3b 0a 20 20 20 20  T_DistFifo;.    
14c80 69 44 69 73 74 69 6e 63 74 20 3d 20 70 50 61 72  iDistinct = pPar
14c90 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 7d 65  se->nTab++;.  }e
14ca0 6c 73 65 7b 0a 20 20 20 20 65 44 65 73 74 20 3d  lse{.    eDest =
14cb0 20 70 4f 72 64 65 72 42 79 20 3f 20 53 52 54 5f   pOrderBy ? SRT_
14cc0 51 75 65 75 65 20 3a 20 53 52 54 5f 46 69 66 6f  Queue : SRT_Fifo
14cd0 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 53  ;.  }.  sqlite3S
14ce0 65 6c 65 63 74 44 65 73 74 49 6e 69 74 28 26 64  electDestInit(&d
14cf0 65 73 74 51 75 65 75 65 2c 20 65 44 65 73 74 2c  estQueue, eDest,
14d00 20 69 51 75 65 75 65 29 3b 0a 0a 20 20 2f 2a 20   iQueue);..  /* 
14d10 41 6c 6c 6f 63 61 74 65 20 63 75 72 73 6f 72 73  Allocate cursors
14d20 20 66 6f 72 20 43 75 72 72 65 6e 74 2c 20 51 75   for Current, Qu
14d30 65 75 65 2c 20 61 6e 64 20 44 69 73 74 69 6e 63  eue, and Distinc
14d40 74 2e 20 2a 2f 0a 20 20 72 65 67 43 75 72 72 65  t. */.  regCurre
14d50 6e 74 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  nt = ++pParse->n
14d60 4d 65 6d 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  Mem;.  sqlite3Vd
14d70 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4f  beAddOp3(v, OP_O
14d80 70 65 6e 50 73 65 75 64 6f 2c 20 69 43 75 72 72  penPseudo, iCurr
14d90 65 6e 74 2c 20 72 65 67 43 75 72 72 65 6e 74 2c  ent, regCurrent,
14da0 20 6e 43 6f 6c 29 3b 0a 20 20 69 66 28 20 70 4f   nCol);.  if( pO
14db0 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 4b 65  rderBy ){.    Ke
14dc0 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 20  yInfo *pKeyInfo 
14dd0 3d 20 6d 75 6c 74 69 53 65 6c 65 63 74 4f 72 64  = multiSelectOrd
14de0 65 72 42 79 4b 65 79 49 6e 66 6f 28 70 50 61 72  erByKeyInfo(pPar
14df0 73 65 2c 20 70 2c 20 31 29 3b 0a 20 20 20 20 73  se, p, 1);.    s
14e00 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
14e10 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d  (v, OP_OpenEphem
14e20 65 72 61 6c 2c 20 69 51 75 65 75 65 2c 20 70 4f  eral, iQueue, pO
14e30 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 2b 32 2c  rderBy->nExpr+2,
14e40 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20   0,.            
14e50 20 20 20 20 20 20 20 20 20 20 28 63 68 61 72 2a            (char*
14e60 29 70 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45  )pKeyInfo, P4_KE
14e70 59 49 4e 46 4f 29 3b 0a 20 20 20 20 64 65 73 74  YINFO);.    dest
14e80 51 75 65 75 65 2e 70 4f 72 64 65 72 42 79 20 3d  Queue.pOrderBy =
14e90 20 70 4f 72 64 65 72 42 79 3b 0a 20 20 7d 65 6c   pOrderBy;.  }el
14ea0 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  se{.    sqlite3V
14eb0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
14ec0 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 69  OpenEphemeral, i
14ed0 51 75 65 75 65 2c 20 6e 43 6f 6c 29 3b 0a 20 20  Queue, nCol);.  
14ee0 7d 0a 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28  }.  VdbeComment(
14ef0 28 76 2c 20 22 51 75 65 75 65 20 74 61 62 6c 65  (v, "Queue table
14f00 22 29 29 3b 0a 20 20 69 66 28 20 69 44 69 73 74  "));.  if( iDist
14f10 69 6e 63 74 20 29 7b 0a 20 20 20 20 70 2d 3e 61  inct ){.    p->a
14f20 64 64 72 4f 70 65 6e 45 70 68 6d 5b 30 5d 20 3d  ddrOpenEphm[0] =
14f30 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
14f40 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68  p2(v, OP_OpenEph
14f50 65 6d 65 72 61 6c 2c 20 69 44 69 73 74 69 6e 63  emeral, iDistinc
14f60 74 2c 20 30 29 3b 0a 20 20 20 20 70 2d 3e 73 65  t, 0);.    p->se
14f70 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f 55 73 65  lFlags |= SF_Use
14f80 73 45 70 68 65 6d 65 72 61 6c 3b 0a 20 20 7d 0a  sEphemeral;.  }.
14f90 0a 20 20 2f 2a 20 44 65 74 61 63 68 20 74 68 65  .  /* Detach the
14fa0 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
14fb0 20 66 72 6f 6d 20 74 68 65 20 63 6f 6d 70 6f 75   from the compou
14fc0 6e 64 20 53 45 4c 45 43 54 20 2a 2f 0a 20 20 70  nd SELECT */.  p
14fd0 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a  ->pOrderBy = 0;.
14fe0 0a 20 20 2f 2a 20 53 74 6f 72 65 20 74 68 65 20  .  /* Store the 
14ff0 72 65 73 75 6c 74 73 20 6f 66 20 74 68 65 20 73  results of the s
15000 65 74 75 70 2d 71 75 65 72 79 20 69 6e 20 51 75  etup-query in Qu
15010 65 75 65 2e 20 2a 2f 0a 20 20 70 53 65 74 75 70  eue. */.  pSetup
15020 2d 3e 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 45  ->pNext = 0;.  E
15030 78 70 6c 61 69 6e 51 75 65 72 79 50 6c 61 6e 28  xplainQueryPlan(
15040 28 70 50 61 72 73 65 2c 20 31 2c 20 22 53 45 54  (pParse, 1, "SET
15050 55 50 22 29 29 3b 0a 20 20 72 63 20 3d 20 73 71  UP"));.  rc = sq
15060 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72  lite3Select(pPar
15070 73 65 2c 20 70 53 65 74 75 70 2c 20 26 64 65 73  se, pSetup, &des
15080 74 51 75 65 75 65 29 3b 0a 20 20 70 53 65 74 75  tQueue);.  pSetu
15090 70 2d 3e 70 4e 65 78 74 20 3d 20 70 3b 0a 20 20  p->pNext = p;.  
150a0 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 65 6e  if( rc ) goto en
150b0 64 5f 6f 66 5f 72 65 63 75 72 73 69 76 65 5f 71  d_of_recursive_q
150c0 75 65 72 79 3b 0a 0a 20 20 2f 2a 20 46 69 6e 64  uery;..  /* Find
150d0 20 74 68 65 20 6e 65 78 74 20 72 6f 77 20 69 6e   the next row in
150e0 20 74 68 65 20 51 75 65 75 65 20 61 6e 64 20 6f   the Queue and o
150f0 75 74 70 75 74 20 74 68 61 74 20 72 6f 77 20 2a  utput that row *
15100 2f 0a 20 20 61 64 64 72 54 6f 70 20 3d 20 73 71  /.  addrTop = sq
15110 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
15120 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 69 51  v, OP_Rewind, iQ
15130 75 65 75 65 2c 20 61 64 64 72 42 72 65 61 6b 29  ueue, addrBreak)
15140 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
15150 29 3b 0a 0a 20 20 2f 2a 20 54 72 61 6e 73 66 65  );..  /* Transfe
15160 72 20 74 68 65 20 6e 65 78 74 20 72 6f 77 20 69  r the next row i
15170 6e 20 51 75 65 75 65 20 6f 76 65 72 20 74 6f 20  n Queue over to 
15180 43 75 72 72 65 6e 74 20 2a 2f 0a 20 20 73 71 6c  Current */.  sql
15190 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
151a0 2c 20 4f 50 5f 4e 75 6c 6c 52 6f 77 2c 20 69 43  , OP_NullRow, iC
151b0 75 72 72 65 6e 74 29 3b 20 2f 2a 20 54 6f 20 72  urrent); /* To r
151c0 65 73 65 74 20 63 6f 6c 75 6d 6e 20 63 61 63 68  eset column cach
151d0 65 20 2a 2f 0a 20 20 69 66 28 20 70 4f 72 64 65  e */.  if( pOrde
151e0 72 42 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  rBy ){.    sqlit
151f0 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
15200 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69 51 75 65 75  OP_Column, iQueu
15210 65 2c 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78  e, pOrderBy->nEx
15220 70 72 2b 31 2c 20 72 65 67 43 75 72 72 65 6e 74  pr+1, regCurrent
15230 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
15240 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
15250 32 28 76 2c 20 4f 50 5f 52 6f 77 44 61 74 61 2c  2(v, OP_RowData,
15260 20 69 51 75 65 75 65 2c 20 72 65 67 43 75 72 72   iQueue, regCurr
15270 65 6e 74 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  ent);.  }.  sqli
15280 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
15290 20 4f 50 5f 44 65 6c 65 74 65 2c 20 69 51 75 65   OP_Delete, iQue
152a0 75 65 29 3b 0a 0a 20 20 2f 2a 20 4f 75 74 70 75  ue);..  /* Outpu
152b0 74 20 74 68 65 20 73 69 6e 67 6c 65 20 72 6f 77  t the single row
152c0 20 69 6e 20 43 75 72 72 65 6e 74 20 2a 2f 0a 20   in Current */. 
152d0 20 61 64 64 72 43 6f 6e 74 20 3d 20 73 71 6c 69   addrCont = sqli
152e0 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
152f0 28 76 29 3b 0a 20 20 63 6f 64 65 4f 66 66 73 65  (v);.  codeOffse
15300 74 28 76 2c 20 72 65 67 4f 66 66 73 65 74 2c 20  t(v, regOffset, 
15310 61 64 64 72 43 6f 6e 74 29 3b 0a 20 20 73 65 6c  addrCont);.  sel
15320 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61  ectInnerLoop(pPa
15330 72 73 65 2c 20 70 2c 20 69 43 75 72 72 65 6e 74  rse, p, iCurrent
15340 2c 0a 20 20 20 20 20 20 30 2c 20 30 2c 20 70 44  ,.      0, 0, pD
15350 65 73 74 2c 20 61 64 64 72 43 6f 6e 74 2c 20 61  est, addrCont, a
15360 64 64 72 42 72 65 61 6b 29 3b 0a 20 20 69 66 28  ddrBreak);.  if(
15370 20 72 65 67 4c 69 6d 69 74 20 29 7b 0a 20 20 20   regLimit ){.   
15380 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
15390 70 32 28 76 2c 20 4f 50 5f 44 65 63 72 4a 75 6d  p2(v, OP_DecrJum
153a0 70 5a 65 72 6f 2c 20 72 65 67 4c 69 6d 69 74 2c  pZero, regLimit,
153b0 20 61 64 64 72 42 72 65 61 6b 29 3b 0a 20 20 20   addrBreak);.   
153c0 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
153d0 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56  ;.  }.  sqlite3V
153e0 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
153f0 76 2c 20 61 64 64 72 43 6f 6e 74 29 3b 0a 0a 20  v, addrCont);.. 
15400 20 2f 2a 20 45 78 65 63 75 74 65 20 74 68 65 20   /* Execute the 
15410 72 65 63 75 72 73 69 76 65 20 53 45 4c 45 43 54  recursive SELECT
15420 20 74 61 6b 69 6e 67 20 74 68 65 20 73 69 6e 67   taking the sing
15430 6c 65 20 72 6f 77 20 69 6e 20 43 75 72 72 65 6e  le row in Curren
15440 74 20 61 73 0a 20 20 2a 2a 20 74 68 65 20 76 61  t as.  ** the va
15450 6c 75 65 20 66 6f 72 20 74 68 65 20 72 65 63 75  lue for the recu
15460 72 73 69 76 65 2d 74 61 62 6c 65 2e 20 53 74 6f  rsive-table. Sto
15470 72 65 20 74 68 65 20 72 65 73 75 6c 74 73 20 69  re the results i
15480 6e 20 74 68 65 20 51 75 65 75 65 2e 0a 20 20 2a  n the Queue..  *
15490 2f 0a 20 20 69 66 28 20 70 2d 3e 73 65 6c 46 6c  /.  if( p->selFl
154a0 61 67 73 20 26 20 53 46 5f 41 67 67 72 65 67 61  ags & SF_Aggrega
154b0 74 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  te ){.    sqlite
154c0 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
154d0 2c 20 22 72 65 63 75 72 73 69 76 65 20 61 67 67  , "recursive agg
154e0 72 65 67 61 74 65 20 71 75 65 72 69 65 73 20 6e  regate queries n
154f0 6f 74 20 73 75 70 70 6f 72 74 65 64 22 29 3b 0a  ot supported");.
15500 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 2d 3e    }else{.    p->
15510 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20  pPrior = 0;.    
15520 45 78 70 6c 61 69 6e 51 75 65 72 79 50 6c 61 6e  ExplainQueryPlan
15530 28 28 70 50 61 72 73 65 2c 20 31 2c 20 22 52 45  ((pParse, 1, "RE
15540 43 55 52 53 49 56 45 20 53 54 45 50 22 29 29 3b  CURSIVE STEP"));
15550 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65  .    sqlite3Sele
15560 63 74 28 70 50 61 72 73 65 2c 20 70 2c 20 26 64  ct(pParse, p, &d
15570 65 73 74 51 75 65 75 65 29 3b 0a 20 20 20 20 61  estQueue);.    a
15580 73 73 65 72 74 28 20 70 2d 3e 70 50 72 69 6f 72  ssert( p->pPrior
15590 3d 3d 30 20 29 3b 0a 20 20 20 20 70 2d 3e 70 50  ==0 );.    p->pP
155a0 72 69 6f 72 20 3d 20 70 53 65 74 75 70 3b 0a 20  rior = pSetup;. 
155b0 20 7d 0a 0a 20 20 2f 2a 20 4b 65 65 70 20 72 75   }..  /* Keep ru
155c0 6e 6e 69 6e 67 20 74 68 65 20 6c 6f 6f 70 20 75  nning the loop u
155d0 6e 74 69 6c 20 74 68 65 20 51 75 65 75 65 20 69  ntil the Queue i
155e0 73 20 65 6d 70 74 79 20 2a 2f 0a 20 20 73 71 6c  s empty */.  sql
155f0 69 74 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20  ite3VdbeGoto(v, 
15600 61 64 64 72 54 6f 70 29 3b 0a 20 20 73 71 6c 69  addrTop);.  sqli
15610 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
15620 62 65 6c 28 76 2c 20 61 64 64 72 42 72 65 61 6b  bel(v, addrBreak
15630 29 3b 0a 0a 65 6e 64 5f 6f 66 5f 72 65 63 75 72  );..end_of_recur
15640 73 69 76 65 5f 71 75 65 72 79 3a 0a 20 20 73 71  sive_query:.  sq
15650 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c  lite3ExprListDel
15660 65 74 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ete(pParse->db, 
15670 70 2d 3e 70 4f 72 64 65 72 42 79 29 3b 0a 20 20  p->pOrderBy);.  
15680 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 70 4f  p->pOrderBy = pO
15690 72 64 65 72 42 79 3b 0a 20 20 70 2d 3e 70 4c 69  rderBy;.  p->pLi
156a0 6d 69 74 20 3d 20 70 4c 69 6d 69 74 3b 0a 20 20  mit = pLimit;.  
156b0 72 65 74 75 72 6e 3b 0a 7d 0a 23 65 6e 64 69 66  return;.}.#endif
156c0 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
156d0 43 54 45 20 2a 2f 0a 0a 2f 2a 20 46 6f 72 77 61  CTE */../* Forwa
156e0 72 64 20 72 65 66 65 72 65 6e 63 65 73 20 2a 2f  rd references */
156f0 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 75 6c 74  .static int mult
15700 69 53 65 6c 65 63 74 4f 72 64 65 72 42 79 28 0a  iSelectOrderBy(.
15710 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
15720 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69          /* Parsi
15730 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
15740 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20  Select *p,      
15750 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 69 67        /* The rig
15760 68 74 2d 6d 6f 73 74 20 6f 66 20 53 45 4c 45 43  ht-most of SELEC
15770 54 73 20 74 6f 20 62 65 20 63 6f 64 65 64 20 2a  Ts to be coded *
15780 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 2a  /.  SelectDest *
15790 70 44 65 73 74 20 20 20 20 20 2f 2a 20 57 68 61  pDest     /* Wha
157a0 74 20 74 6f 20 64 6f 20 77 69 74 68 20 71 75 65  t to do with que
157b0 72 79 20 72 65 73 75 6c 74 73 20 2a 2f 0a 29 3b  ry results */.);
157c0 0a 0a 2f 2a 0a 2a 2a 20 48 61 6e 64 6c 65 20 74  ../*.** Handle t
157d0 68 65 20 73 70 65 63 69 61 6c 20 63 61 73 65 20  he special case 
157e0 6f 66 20 61 20 63 6f 6d 70 6f 75 6e 64 2d 73 65  of a compound-se
157f0 6c 65 63 74 20 74 68 61 74 20 6f 72 69 67 69 6e  lect that origin
15800 61 74 65 73 20 66 72 6f 6d 20 61 0a 2a 2a 20 56  ates from a.** V
15810 41 4c 55 45 53 20 63 6c 61 75 73 65 2e 20 20 42  ALUES clause.  B
15820 79 20 68 61 6e 64 6c 69 6e 67 20 74 68 69 73 20  y handling this 
15830 61 73 20 61 20 73 70 65 63 69 61 6c 20 63 61 73  as a special cas
15840 65 2c 20 77 65 20 61 76 6f 69 64 20 64 65 65 70  e, we avoid deep
15850 0a 2a 2a 20 72 65 63 75 72 73 69 6f 6e 2c 20 61  .** recursion, a
15860 6e 64 20 74 68 75 73 20 64 6f 20 6e 6f 74 20 6e  nd thus do not n
15870 65 65 64 20 74 6f 20 65 6e 66 6f 72 63 65 20 74  eed to enforce t
15880 68 65 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f  he SQLITE_LIMIT_
15890 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 0a  COMPOUND_SELECT.
158a0 2a 2a 20 6f 6e 20 61 20 56 41 4c 55 45 53 20 63  ** on a VALUES c
158b0 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 42 65 63  lause..**.** Bec
158c0 61 75 73 65 20 74 68 65 20 53 65 6c 65 63 74 20  ause the Select 
158d0 6f 62 6a 65 63 74 20 6f 72 69 67 69 6e 61 74 65  object originate
158e0 73 20 66 72 6f 6d 20 61 20 56 41 4c 55 45 53 20  s from a VALUES 
158f0 63 6c 61 75 73 65 3a 0a 2a 2a 20 20 20 28 31 29  clause:.**   (1)
15900 20 54 68 65 72 65 20 69 73 20 6e 6f 20 4c 49 4d   There is no LIM
15910 49 54 20 6f 72 20 4f 46 46 53 45 54 20 6f 72 20  IT or OFFSET or 
15920 65 6c 73 65 20 74 68 65 72 65 20 69 73 20 61 20  else there is a 
15930 4c 49 4d 49 54 20 6f 66 20 65 78 61 63 74 6c 79  LIMIT of exactly
15940 20 31 0a 2a 2a 20 20 20 28 32 29 20 41 6c 6c 20   1.**   (2) All 
15950 74 65 72 6d 73 20 61 72 65 20 55 4e 49 4f 4e 20  terms are UNION 
15960 41 4c 4c 0a 2a 2a 20 20 20 28 33 29 20 54 68 65  ALL.**   (3) The
15970 72 65 20 69 73 20 6e 6f 20 4f 52 44 45 52 20 42  re is no ORDER B
15980 59 20 63 6c 61 75 73 65 0a 2a 2a 0a 2a 2a 20 54  Y clause.**.** T
15990 68 65 20 22 4c 49 4d 49 54 20 6f 66 20 65 78 61  he "LIMIT of exa
159a0 63 74 6c 79 20 31 22 20 63 61 73 65 20 6f 66 20  ctly 1" case of 
159b0 63 6f 6e 64 69 74 69 6f 6e 20 28 31 29 20 63 6f  condition (1) co
159c0 6d 65 73 20 61 62 6f 75 74 20 77 68 65 6e 20 61  mes about when a
159d0 20 56 41 4c 55 45 53 0a 2a 2a 20 63 6c 61 75 73   VALUES.** claus
159e0 65 20 6f 63 63 75 72 73 20 77 69 74 68 69 6e 20  e occurs within 
159f0 73 63 61 6c 61 72 20 65 78 70 72 65 73 73 69 6f  scalar expressio
15a00 6e 20 28 65 78 3a 20 22 53 45 4c 45 43 54 20 28  n (ex: "SELECT (
15a10 56 41 4c 55 45 53 28 31 29 2c 28 32 29 2c 28 33  VALUES(1),(2),(3
15a20 29 29 22 29 2e 0a 2a 2a 20 54 68 65 20 73 71 6c  ))")..** The sql
15a30 69 74 65 33 43 6f 64 65 53 75 62 73 65 6c 65 63  ite3CodeSubselec
15a40 74 20 77 69 6c 6c 20 68 61 76 65 20 61 64 64 65  t will have adde
15a50 64 20 74 68 65 20 4c 49 4d 49 54 20 31 20 63 6c  d the LIMIT 1 cl
15a60 61 75 73 65 20 69 6e 20 74 68 74 20 63 61 73 65  ause in tht case
15a70 2e 0a 2a 2a 20 53 69 6e 63 65 20 74 68 65 20 6c  ..** Since the l
15a80 69 6d 69 74 20 69 73 20 65 78 61 63 74 6c 79 20  imit is exactly 
15a90 31 2c 20 77 65 20 6f 6e 6c 79 20 6e 65 65 64 20  1, we only need 
15aa0 74 6f 20 65 76 61 6c 75 74 65 73 20 74 68 65 20  to evalutes the 
15ab0 6c 65 66 74 2d 6d 6f 73 74 20 56 41 4c 55 45 53  left-most VALUES
15ac0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
15ad0 6d 75 6c 74 69 53 65 6c 65 63 74 56 61 6c 75 65  multiSelectValue
15ae0 73 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  s(.  Parse *pPar
15af0 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 61  se,        /* Pa
15b00 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
15b10 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20  .  Select *p,   
15b20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
15b30 72 69 67 68 74 2d 6d 6f 73 74 20 6f 66 20 53 45  right-most of SE
15b40 4c 45 43 54 73 20 74 6f 20 62 65 20 63 6f 64 65  LECTs to be code
15b50 64 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73  d */.  SelectDes
15b60 74 20 2a 70 44 65 73 74 20 20 20 20 20 2f 2a 20  t *pDest     /* 
15b70 57 68 61 74 20 74 6f 20 64 6f 20 77 69 74 68 20  What to do with 
15b80 71 75 65 72 79 20 72 65 73 75 6c 74 73 20 2a 2f  query results */
15b90 0a 29 7b 0a 20 20 69 6e 74 20 6e 52 6f 77 20 3d  .){.  int nRow =
15ba0 20 31 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 30   1;.  int rc = 0
15bb0 3b 0a 20 20 69 6e 74 20 62 53 68 6f 77 41 6c 6c  ;.  int bShowAll
15bc0 20 3d 20 70 2d 3e 70 4c 69 6d 69 74 3d 3d 30 3b   = p->pLimit==0;
15bd0 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 73 65  .  assert( p->se
15be0 6c 46 6c 61 67 73 20 26 20 53 46 5f 4d 75 6c 74  lFlags & SF_Mult
15bf0 69 56 61 6c 75 65 20 29 3b 0a 20 20 64 6f 7b 0a  iValue );.  do{.
15c00 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 73      assert( p->s
15c10 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 56 61 6c  elFlags & SF_Val
15c20 75 65 73 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ues );.    asser
15c30 74 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c  t( p->op==TK_ALL
15c40 20 7c 7c 20 28 70 2d 3e 6f 70 3d 3d 54 4b 5f 53   || (p->op==TK_S
15c50 45 4c 45 43 54 20 26 26 20 70 2d 3e 70 50 72 69  ELECT && p->pPri
15c60 6f 72 3d 3d 30 29 20 29 3b 0a 20 20 20 20 61 73  or==0) );.    as
15c70 73 65 72 74 28 20 70 2d 3e 70 4e 65 78 74 3d 3d  sert( p->pNext==
15c80 30 20 7c 7c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e  0 || p->pEList->
15c90 6e 45 78 70 72 3d 3d 70 2d 3e 70 4e 65 78 74 2d  nExpr==p->pNext-
15ca0 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29  >pEList->nExpr )
15cb0 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 50 72  ;.    if( p->pPr
15cc0 69 6f 72 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a  ior==0 ) break;.
15cd0 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70      assert( p->p
15ce0 50 72 69 6f 72 2d 3e 70 4e 65 78 74 3d 3d 70 20  Prior->pNext==p 
15cf0 29 3b 0a 20 20 20 20 70 20 3d 20 70 2d 3e 70 50  );.    p = p->pP
15d00 72 69 6f 72 3b 0a 20 20 20 20 6e 52 6f 77 20 2b  rior;.    nRow +
15d10 3d 20 62 53 68 6f 77 41 6c 6c 3b 0a 20 20 7d 77  = bShowAll;.  }w
15d20 68 69 6c 65 28 31 29 3b 0a 20 20 45 78 70 6c 61  hile(1);.  Expla
15d30 69 6e 51 75 65 72 79 50 6c 61 6e 28 28 70 50 61  inQueryPlan((pPa
15d40 72 73 65 2c 20 30 2c 20 22 53 43 41 4e 20 25 64  rse, 0, "SCAN %d
15d50 20 43 4f 4e 53 54 41 4e 54 20 52 4f 57 25 73 22   CONSTANT ROW%s"
15d60 2c 20 6e 52 6f 77 2c 0a 20 20 20 20 20 20 20 20  , nRow,.        
15d70 20 20 20 20 20 20 20 20 20 20 20 20 6e 52 6f 77              nRow
15d80 3d 3d 31 20 3f 20 22 22 20 3a 20 22 53 22 29 29  ==1 ? "" : "S"))
15d90 3b 0a 20 20 77 68 69 6c 65 28 20 70 20 29 7b 0a  ;.  while( p ){.
15da0 20 20 20 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c      selectInnerL
15db0 6f 6f 70 28 70 50 61 72 73 65 2c 20 70 2c 20 2d  oop(pParse, p, -
15dc0 31 2c 20 30 2c 20 30 2c 20 70 44 65 73 74 2c 20  1, 0, 0, pDest, 
15dd0 31 2c 20 31 29 3b 0a 20 20 20 20 69 66 28 20 21  1, 1);.    if( !
15de0 62 53 68 6f 77 41 6c 6c 20 29 20 62 72 65 61 6b  bShowAll ) break
15df0 3b 0a 20 20 20 20 70 2d 3e 6e 53 65 6c 65 63 74  ;.    p->nSelect
15e00 52 6f 77 20 3d 20 6e 52 6f 77 3b 0a 20 20 20 20  Row = nRow;.    
15e10 70 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20  p = p->pNext;.  
15e20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
15e30 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
15e40 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74  tine is called t
15e50 6f 20 70 72 6f 63 65 73 73 20 61 20 63 6f 6d 70  o process a comp
15e60 6f 75 6e 64 20 71 75 65 72 79 20 66 6f 72 6d 20  ound query form 
15e70 66 72 6f 6d 0a 2a 2a 20 74 77 6f 20 6f 72 20 6d  from.** two or m
15e80 6f 72 65 20 73 65 70 61 72 61 74 65 20 71 75 65  ore separate que
15e90 72 69 65 73 20 75 73 69 6e 67 20 55 4e 49 4f 4e  ries using UNION
15ea0 2c 20 55 4e 49 4f 4e 20 41 4c 4c 2c 20 45 58 43  , UNION ALL, EXC
15eb0 45 50 54 2c 20 6f 72 0a 2a 2a 20 49 4e 54 45 52  EPT, or.** INTER
15ec0 53 45 43 54 0a 2a 2a 0a 2a 2a 20 22 70 22 20 70  SECT.**.** "p" p
15ed0 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 72 69 67  oints to the rig
15ee0 68 74 2d 6d 6f 73 74 20 6f 66 20 74 68 65 20 74  ht-most of the t
15ef0 77 6f 20 71 75 65 72 69 65 73 2e 20 20 74 68 65  wo queries.  the
15f00 20 71 75 65 72 79 20 6f 6e 20 74 68 65 0a 2a 2a   query on the.**
15f10 20 6c 65 66 74 20 69 73 20 70 2d 3e 70 50 72 69   left is p->pPri
15f20 6f 72 2e 20 20 54 68 65 20 6c 65 66 74 20 71 75  or.  The left qu
15f30 65 72 79 20 63 6f 75 6c 64 20 61 6c 73 6f 20 62  ery could also b
15f40 65 20 61 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65  e a compound que
15f50 72 79 0a 2a 2a 20 69 6e 20 77 68 69 63 68 20 63  ry.** in which c
15f60 61 73 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ase this routine
15f70 20 77 69 6c 6c 20 62 65 20 63 61 6c 6c 65 64 20   will be called 
15f80 72 65 63 75 72 73 69 76 65 6c 79 2e 20 0a 2a 2a  recursively. .**
15f90 0a 2a 2a 20 54 68 65 20 72 65 73 75 6c 74 73 20  .** The results 
15fa0 6f 66 20 74 68 65 20 74 6f 74 61 6c 20 71 75 65  of the total que
15fb0 72 79 20 61 72 65 20 74 6f 20 62 65 20 77 72 69  ry are to be wri
15fc0 74 74 65 6e 20 69 6e 74 6f 20 61 20 64 65 73 74  tten into a dest
15fd0 69 6e 61 74 69 6f 6e 0a 2a 2a 20 6f 66 20 74 79  ination.** of ty
15fe0 70 65 20 65 44 65 73 74 20 77 69 74 68 20 70 61  pe eDest with pa
15ff0 72 61 6d 65 74 65 72 20 69 50 61 72 6d 2e 0a 2a  rameter iParm..*
16000 2a 0a 2a 2a 20 45 78 61 6d 70 6c 65 20 31 3a 20  *.** Example 1: 
16010 20 43 6f 6e 73 69 64 65 72 20 61 20 74 68 72 65   Consider a thre
16020 65 2d 77 61 79 20 63 6f 6d 70 6f 75 6e 64 20 53  e-way compound S
16030 51 4c 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a  QL statement..**
16040 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 61  .**     SELECT a
16050 20 46 52 4f 4d 20 74 31 20 55 4e 49 4f 4e 20 53   FROM t1 UNION S
16060 45 4c 45 43 54 20 62 20 46 52 4f 4d 20 74 32 20  ELECT b FROM t2 
16070 55 4e 49 4f 4e 20 53 45 4c 45 43 54 20 63 20 46  UNION SELECT c F
16080 52 4f 4d 20 74 33 0a 2a 2a 0a 2a 2a 20 54 68 69  ROM t3.**.** Thi
16090 73 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 70  s statement is p
160a0 61 72 73 65 64 20 75 70 20 61 73 20 66 6f 6c 6c  arsed up as foll
160b0 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53  ows:.**.**     S
160c0 45 4c 45 43 54 20 63 20 46 52 4f 4d 20 74 33 0a  ELECT c FROM t3.
160d0 2a 2a 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20  **      |.**    
160e0 20 20 60 2d 2d 2d 2d 2d 3e 20 20 53 45 4c 45 43    `----->  SELEC
160f0 54 20 62 20 46 52 4f 4d 20 74 32 0a 2a 2a 20 20  T b FROM t2.**  
16100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 0a                |.
16110 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
16120 20 20 60 2d 2d 2d 2d 2d 2d 3e 20 20 53 45 4c 45    `------>  SELE
16130 43 54 20 61 20 46 52 4f 4d 20 74 31 0a 2a 2a 0a  CT a FROM t1.**.
16140 2a 2a 20 54 68 65 20 61 72 72 6f 77 73 20 69 6e  ** The arrows in
16150 20 74 68 65 20 64 69 61 67 72 61 6d 20 61 62 6f   the diagram abo
16160 76 65 20 72 65 70 72 65 73 65 6e 74 20 74 68 65  ve represent the
16170 20 53 65 6c 65 63 74 2e 70 50 72 69 6f 72 20 70   Select.pPrior p
16180 6f 69 6e 74 65 72 2e 0a 2a 2a 20 53 6f 20 69 66  ointer..** So if
16190 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
161a0 20 63 61 6c 6c 65 64 20 77 69 74 68 20 70 20 65   called with p e
161b0 71 75 61 6c 20 74 6f 20 74 68 65 20 74 33 20 71  qual to the t3 q
161c0 75 65 72 79 2c 20 74 68 65 6e 0a 2a 2a 20 70 50  uery, then.** pP
161d0 72 69 6f 72 20 77 69 6c 6c 20 62 65 20 74 68 65  rior will be the
161e0 20 74 32 20 71 75 65 72 79 2e 20 20 70 2d 3e 6f   t2 query.  p->o
161f0 70 20 77 69 6c 6c 20 62 65 20 54 4b 5f 55 4e 49  p will be TK_UNI
16200 4f 4e 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e  ON in this case.
16210 0a 2a 2a 0a 2a 2a 20 4e 6f 74 69 63 65 20 74 68  .**.** Notice th
16220 61 74 20 62 65 63 61 75 73 65 20 6f 66 20 74 68  at because of th
16230 65 20 77 61 79 20 53 51 4c 69 74 65 20 70 61 72  e way SQLite par
16240 73 65 73 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c  ses compound SEL
16250 45 43 54 73 2c 20 74 68 65 0a 2a 2a 20 69 6e 64  ECTs, the.** ind
16260 69 76 69 64 75 61 6c 20 73 65 6c 65 63 74 73 20  ividual selects 
16270 61 6c 77 61 79 73 20 67 72 6f 75 70 20 66 72 6f  always group fro
16280 6d 20 6c 65 66 74 20 74 6f 20 72 69 67 68 74 2e  m left to right.
16290 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d  .*/.static int m
162a0 75 6c 74 69 53 65 6c 65 63 74 28 0a 20 20 50 61  ultiSelect(.  Pa
162b0 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
162c0 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63      /* Parsing c
162d0 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65  ontext */.  Sele
162e0 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  ct *p,          
162f0 20 20 2f 2a 20 54 68 65 20 72 69 67 68 74 2d 6d    /* The right-m
16300 6f 73 74 20 6f 66 20 53 45 4c 45 43 54 73 20 74  ost of SELECTs t
16310 6f 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20  o be coded */.  
16320 53 65 6c 65 63 74 44 65 73 74 20 2a 70 44 65 73  SelectDest *pDes
16330 74 20 20 20 20 20 2f 2a 20 57 68 61 74 20 74 6f  t     /* What to
16340 20 64 6f 20 77 69 74 68 20 71 75 65 72 79 20 72   do with query r
16350 65 73 75 6c 74 73 20 2a 2f 0a 29 7b 0a 20 20 69  esults */.){.  i
16360 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
16370 4b 3b 20 20 20 2f 2a 20 53 75 63 63 65 73 73 20  K;   /* Success 
16380 63 6f 64 65 20 66 72 6f 6d 20 61 20 73 75 62 72  code from a subr
16390 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 53 65 6c 65  outine */.  Sele
163a0 63 74 20 2a 70 50 72 69 6f 72 3b 20 20 20 20 20  ct *pPrior;     
163b0 20 20 2f 2a 20 41 6e 6f 74 68 65 72 20 53 45 4c    /* Another SEL
163c0 45 43 54 20 69 6d 6d 65 64 69 61 74 65 6c 79 20  ECT immediately 
163d0 74 6f 20 6f 75 72 20 6c 65 66 74 20 2a 2f 0a 20  to our left */. 
163e0 20 56 64 62 65 20 2a 76 3b 20 20 20 20 20 20 20   Vdbe *v;       
163f0 20 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61         /* Genera
16400 74 65 20 63 6f 64 65 20 74 6f 20 74 68 69 73 20  te code to this 
16410 56 44 42 45 20 2a 2f 0a 20 20 53 65 6c 65 63 74  VDBE */.  Select
16420 44 65 73 74 20 64 65 73 74 3b 20 20 20 20 20 20  Dest dest;      
16430 2f 2a 20 41 6c 74 65 72 6e 61 74 69 76 65 20 64  /* Alternative d
16440 61 74 61 20 64 65 73 74 69 6e 61 74 69 6f 6e 20  ata destination 
16450 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 44 65  */.  Select *pDe
16460 6c 65 74 65 20 3d 20 30 3b 20 20 2f 2a 20 43 68  lete = 0;  /* Ch
16470 61 69 6e 20 6f 66 20 73 69 6d 70 6c 65 20 73 65  ain of simple se
16480 6c 65 63 74 73 20 74 6f 20 64 65 6c 65 74 65 20  lects to delete 
16490 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  */.  sqlite3 *db
164a0 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61  ;          /* Da
164b0 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
164c0 6e 20 2a 2f 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20  n */..  /* Make 
164d0 73 75 72 65 20 74 68 65 72 65 20 69 73 20 6e 6f  sure there is no
164e0 20 4f 52 44 45 52 20 42 59 20 6f 72 20 4c 49 4d   ORDER BY or LIM
164f0 49 54 20 63 6c 61 75 73 65 20 6f 6e 20 70 72 69  IT clause on pri
16500 6f 72 20 53 45 4c 45 43 54 73 2e 20 20 4f 6e 6c  or SELECTs.  Onl
16510 79 0a 20 20 2a 2a 20 74 68 65 20 6c 61 73 74 20  y.  ** the last 
16520 28 72 69 67 68 74 2d 6d 6f 73 74 29 20 53 45 4c  (right-most) SEL
16530 45 43 54 20 69 6e 20 74 68 65 20 73 65 72 69 65  ECT in the serie
16540 73 20 6d 61 79 20 68 61 76 65 20 61 6e 20 4f 52  s may have an OR
16550 44 45 52 20 42 59 20 6f 72 20 4c 49 4d 49 54 2e  DER BY or LIMIT.
16560 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
16570 70 20 26 26 20 70 2d 3e 70 50 72 69 6f 72 20 29  p && p->pPrior )
16580 3b 20 20 2f 2a 20 43 61 6c 6c 69 6e 67 20 66 75  ;  /* Calling fu
16590 6e 63 74 69 6f 6e 20 67 75 61 72 61 6e 74 65 65  nction guarantee
165a0 73 20 74 68 69 73 20 6d 75 63 68 20 2a 2f 0a 20  s this much */. 
165b0 20 61 73 73 65 72 74 28 20 28 70 2d 3e 73 65 6c   assert( (p->sel
165c0 46 6c 61 67 73 20 26 20 53 46 5f 52 65 63 75 72  Flags & SF_Recur
165d0 73 69 76 65 29 3d 3d 30 20 7c 7c 20 70 2d 3e 6f  sive)==0 || p->o
165e0 70 3d 3d 54 4b 5f 41 4c 4c 20 7c 7c 20 70 2d 3e  p==TK_ALL || p->
165f0 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29 3b 0a  op==TK_UNION );.
16600 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64    db = pParse->d
16610 62 3b 0a 20 20 70 50 72 69 6f 72 20 3d 20 70 2d  b;.  pPrior = p-
16620 3e 70 50 72 69 6f 72 3b 0a 20 20 64 65 73 74 20  >pPrior;.  dest 
16630 3d 20 2a 70 44 65 73 74 3b 0a 20 20 69 66 28 20  = *pDest;.  if( 
16640 70 50 72 69 6f 72 2d 3e 70 4f 72 64 65 72 42 79  pPrior->pOrderBy
16650 20 7c 7c 20 70 50 72 69 6f 72 2d 3e 70 4c 69 6d   || pPrior->pLim
16660 69 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  it ){.    sqlite
16670 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
16680 2c 22 25 73 20 63 6c 61 75 73 65 20 73 68 6f 75  ,"%s clause shou
16690 6c 64 20 63 6f 6d 65 20 61 66 74 65 72 20 25 73  ld come after %s
166a0 20 6e 6f 74 20 62 65 66 6f 72 65 22 2c 0a 20 20   not before",.  
166b0 20 20 20 20 70 50 72 69 6f 72 2d 3e 70 4f 72 64      pPrior->pOrd
166c0 65 72 42 79 21 3d 30 20 3f 20 22 4f 52 44 45 52  erBy!=0 ? "ORDER
166d0 20 42 59 22 20 3a 20 22 4c 49 4d 49 54 22 2c 20   BY" : "LIMIT", 
166e0 73 65 6c 65 63 74 4f 70 4e 61 6d 65 28 70 2d 3e  selectOpName(p->
166f0 6f 70 29 29 3b 0a 20 20 20 20 72 63 20 3d 20 31  op));.    rc = 1
16700 3b 0a 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69  ;.    goto multi
16710 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d  _select_end;.  }
16720 0a 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47  ..  v = sqlite3G
16730 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a  etVdbe(pParse);.
16740 20 20 61 73 73 65 72 74 28 20 76 21 3d 30 20 29    assert( v!=0 )
16750 3b 20 20 2f 2a 20 54 68 65 20 56 44 42 45 20 61  ;  /* The VDBE a
16760 6c 72 65 61 64 79 20 63 72 65 61 74 65 64 20 62  lready created b
16770 79 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69  y calling functi
16780 6f 6e 20 2a 2f 0a 0a 20 20 2f 2a 20 43 72 65 61  on */..  /* Crea
16790 74 65 20 74 68 65 20 64 65 73 74 69 6e 61 74 69  te the destinati
167a0 6f 6e 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  on temporary tab
167b0 6c 65 20 69 66 20 6e 65 63 65 73 73 61 72 79 0a  le if necessary.
167c0 20 20 2a 2f 0a 20 20 69 66 28 20 64 65 73 74 2e    */.  if( dest.
167d0 65 44 65 73 74 3d 3d 53 52 54 5f 45 70 68 65 6d  eDest==SRT_Ephem
167e0 54 61 62 20 29 7b 0a 20 20 20 20 61 73 73 65 72  Tab ){.    asser
167f0 74 28 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a  t( p->pEList );.
16800 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
16810 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e  ddOp2(v, OP_Open
16820 45 70 68 65 6d 65 72 61 6c 2c 20 64 65 73 74 2e  Ephemeral, dest.
16830 69 53 44 50 61 72 6d 2c 20 70 2d 3e 70 45 4c 69  iSDParm, p->pELi
16840 73 74 2d 3e 6e 45 78 70 72 29 3b 0a 20 20 20 20  st->nExpr);.    
16850 64 65 73 74 2e 65 44 65 73 74 20 3d 20 53 52 54  dest.eDest = SRT
16860 5f 54 61 62 6c 65 3b 0a 20 20 7d 0a 0a 20 20 2f  _Table;.  }..  /
16870 2a 20 53 70 65 63 69 61 6c 20 68 61 6e 64 6c 69  * Special handli
16880 6e 67 20 66 6f 72 20 61 20 63 6f 6d 70 6f 75 6e  ng for a compoun
16890 64 2d 73 65 6c 65 63 74 20 74 68 61 74 20 6f 72  d-select that or
168a0 69 67 69 6e 61 74 65 73 20 61 73 20 61 20 56 41  iginates as a VA
168b0 4c 55 45 53 20 63 6c 61 75 73 65 2e 0a 20 20 2a  LUES clause..  *
168c0 2f 0a 20 20 69 66 28 20 70 2d 3e 73 65 6c 46 6c  /.  if( p->selFl
168d0 61 67 73 20 26 20 53 46 5f 4d 75 6c 74 69 56 61  ags & SF_MultiVa
168e0 6c 75 65 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  lue ){.    rc = 
168f0 6d 75 6c 74 69 53 65 6c 65 63 74 56 61 6c 75 65  multiSelectValue
16900 73 28 70 50 61 72 73 65 2c 20 70 2c 20 26 64 65  s(pParse, p, &de
16910 73 74 29 3b 0a 20 20 20 20 67 6f 74 6f 20 6d 75  st);.    goto mu
16920 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  lti_select_end;.
16930 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73    }..  /* Make s
16940 75 72 65 20 61 6c 6c 20 53 45 4c 45 43 54 73 20  ure all SELECTs 
16950 69 6e 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  in the statement
16960 20 68 61 76 65 20 74 68 65 20 73 61 6d 65 20 6e   have the same n
16970 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74  umber of element
16980 73 0a 20 20 2a 2a 20 69 6e 20 74 68 65 69 72 20  s.  ** in their 
16990 72 65 73 75 6c 74 20 73 65 74 73 2e 0a 20 20 2a  result sets..  *
169a0 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70  /.  assert( p->p
169b0 45 4c 69 73 74 20 26 26 20 70 50 72 69 6f 72 2d  EList && pPrior-
169c0 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20 61 73 73  >pEList );.  ass
169d0 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 2d 3e  ert( p->pEList->
169e0 6e 45 78 70 72 3d 3d 70 50 72 69 6f 72 2d 3e 70  nExpr==pPrior->p
169f0 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 3b 0a  EList->nExpr );.
16a00 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
16a10 4f 4d 49 54 5f 43 54 45 0a 20 20 69 66 28 20 70  OMIT_CTE.  if( p
16a20 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f  ->selFlags & SF_
16a30 52 65 63 75 72 73 69 76 65 20 29 7b 0a 20 20 20  Recursive ){.   
16a40 20 67 65 6e 65 72 61 74 65 57 69 74 68 52 65 63   generateWithRec
16a50 75 72 73 69 76 65 51 75 65 72 79 28 70 50 61 72  ursiveQuery(pPar
16a60 73 65 2c 20 70 2c 20 26 64 65 73 74 29 3b 0a 20  se, p, &dest);. 
16a70 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 0a 20   }else.#endif.. 
16a80 20 2f 2a 20 43 6f 6d 70 6f 75 6e 64 20 53 45 4c   /* Compound SEL
16a90 45 43 54 73 20 74 68 61 74 20 68 61 76 65 20 61  ECTs that have a
16aa0 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  n ORDER BY claus
16ab0 65 20 61 72 65 20 68 61 6e 64 6c 65 64 20 73 65  e are handled se
16ac0 70 61 72 61 74 65 6c 79 2e 0a 20 20 2a 2f 0a 20  parately..  */. 
16ad0 20 69 66 28 20 70 2d 3e 70 4f 72 64 65 72 42 79   if( p->pOrderBy
16ae0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 6d   ){.    return m
16af0 75 6c 74 69 53 65 6c 65 63 74 4f 72 64 65 72 42  ultiSelectOrderB
16b00 79 28 70 50 61 72 73 65 2c 20 70 2c 20 70 44 65  y(pParse, p, pDe
16b10 73 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 0a 23  st);.  }else{..#
16b20 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
16b30 49 54 5f 45 58 50 4c 41 49 4e 0a 20 20 20 20 69  IT_EXPLAIN.    i
16b40 66 28 20 70 50 72 69 6f 72 2d 3e 70 50 72 69 6f  f( pPrior->pPrio
16b50 72 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 45 78  r==0 ){.      Ex
16b60 70 6c 61 69 6e 51 75 65 72 79 50 6c 61 6e 28 28  plainQueryPlan((
16b70 70 50 61 72 73 65 2c 20 31 2c 20 22 43 4f 4d 50  pParse, 1, "COMP
16b80 4f 55 4e 44 20 51 55 45 52 59 22 29 29 3b 0a 20  OUND QUERY"));. 
16b90 20 20 20 20 20 45 78 70 6c 61 69 6e 51 75 65 72       ExplainQuer
16ba0 79 50 6c 61 6e 28 28 70 50 61 72 73 65 2c 20 31  yPlan((pParse, 1
16bb0 2c 20 22 4c 45 46 54 2d 4d 4f 53 54 20 53 55 42  , "LEFT-MOST SUB
16bc0 51 55 45 52 59 22 29 29 3b 0a 20 20 20 20 7d 0a  QUERY"));.    }.
16bd0 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 47  #endif..    /* G
16be0 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72  enerate code for
16bf0 20 74 68 65 20 6c 65 66 74 20 61 6e 64 20 72 69   the left and ri
16c00 67 68 74 20 53 45 4c 45 43 54 20 73 74 61 74 65  ght SELECT state
16c10 6d 65 6e 74 73 2e 0a 20 20 20 20 2a 2f 0a 20 20  ments..    */.  
16c20 20 20 73 77 69 74 63 68 28 20 70 2d 3e 6f 70 20    switch( p->op 
16c30 29 7b 0a 20 20 20 20 20 20 63 61 73 65 20 54 4b  ){.      case TK
16c40 5f 41 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 20 20  _ALL: {.        
16c50 69 6e 74 20 61 64 64 72 20 3d 20 30 3b 0a 20 20  int addr = 0;.  
16c60 20 20 20 20 20 20 69 6e 74 20 6e 4c 69 6d 69 74        int nLimit
16c70 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
16c80 28 20 21 70 50 72 69 6f 72 2d 3e 70 4c 69 6d 69  ( !pPrior->pLimi
16c90 74 20 29 3b 0a 20 20 20 20 20 20 20 20 70 50 72  t );.        pPr
16ca0 69 6f 72 2d 3e 69 4c 69 6d 69 74 20 3d 20 70 2d  ior->iLimit = p-
16cb0 3e 69 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 20  >iLimit;.       
16cc0 20 70 50 72 69 6f 72 2d 3e 69 4f 66 66 73 65 74   pPrior->iOffset
16cd0 20 3d 20 70 2d 3e 69 4f 66 66 73 65 74 3b 0a 20   = p->iOffset;. 
16ce0 20 20 20 20 20 20 20 70 50 72 69 6f 72 2d 3e 70         pPrior->p
16cf0 4c 69 6d 69 74 20 3d 20 70 2d 3e 70 4c 69 6d 69  Limit = p->pLimi
16d00 74 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  t;.        rc = 
16d10 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50  sqlite3Select(pP
16d20 61 72 73 65 2c 20 70 50 72 69 6f 72 2c 20 26 64  arse, pPrior, &d
16d30 65 73 74 29 3b 0a 20 20 20 20 20 20 20 20 70 2d  est);.        p-
16d40 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20  >pLimit = 0;.   
16d50 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20       if( rc ){. 
16d60 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 75           goto mu
16d70 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  lti_select_end;.
16d80 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
16d90 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b    p->pPrior = 0;
16da0 0a 20 20 20 20 20 20 20 20 70 2d 3e 69 4c 69 6d  .        p->iLim
16db0 69 74 20 3d 20 70 50 72 69 6f 72 2d 3e 69 4c 69  it = pPrior->iLi
16dc0 6d 69 74 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e  mit;.        p->
16dd0 69 4f 66 66 73 65 74 20 3d 20 70 50 72 69 6f 72  iOffset = pPrior
16de0 2d 3e 69 4f 66 66 73 65 74 3b 0a 20 20 20 20 20  ->iOffset;.     
16df0 20 20 20 69 66 28 20 70 2d 3e 69 4c 69 6d 69 74     if( p->iLimit
16e00 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 64   ){.          ad
16e10 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  dr = sqlite3Vdbe
16e20 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66 4e  AddOp1(v, OP_IfN
16e30 6f 74 2c 20 70 2d 3e 69 4c 69 6d 69 74 29 3b 20  ot, p->iLimit); 
16e40 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
16e50 0a 20 20 20 20 20 20 20 20 20 20 56 64 62 65 43  .          VdbeC
16e60 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4a 75 6d 70  omment((v, "Jump
16e70 20 61 68 65 61 64 20 69 66 20 4c 49 4d 49 54 20   ahead if LIMIT 
16e80 72 65 61 63 68 65 64 22 29 29 3b 0a 20 20 20 20  reached"));.    
16e90 20 20 20 20 20 20 69 66 28 20 70 2d 3e 69 4f 66        if( p->iOf
16ea0 66 73 65 74 20 29 7b 0a 20 20 20 20 20 20 20 20  fset ){.        
16eb0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
16ec0 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4f 66 66 73  ddOp3(v, OP_Offs
16ed0 65 74 4c 69 6d 69 74 2c 0a 20 20 20 20 20 20 20  etLimit,.       
16ee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16ef0 20 20 20 20 20 20 20 70 2d 3e 69 4c 69 6d 69 74         p->iLimit
16f00 2c 20 70 2d 3e 69 4f 66 66 73 65 74 2b 31 2c 20  , p->iOffset+1, 
16f10 70 2d 3e 69 4f 66 66 73 65 74 29 3b 0a 20 20 20  p->iOffset);.   
16f20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
16f30 20 7d 0a 20 20 20 20 20 20 20 20 45 78 70 6c 61   }.        Expla
16f40 69 6e 51 75 65 72 79 50 6c 61 6e 28 28 70 50 61  inQueryPlan((pPa
16f50 72 73 65 2c 20 31 2c 20 22 55 4e 49 4f 4e 20 41  rse, 1, "UNION A
16f60 4c 4c 22 29 29 3b 0a 20 20 20 20 20 20 20 20 72  LL"));.        r
16f70 63 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63  c = sqlite3Selec
16f80 74 28 70 50 61 72 73 65 2c 20 70 2c 20 26 64 65  t(pParse, p, &de
16f90 73 74 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73  st);.        tes
16fa0 74 63 61 73 65 28 20 72 63 21 3d 53 51 4c 49 54  tcase( rc!=SQLIT
16fb0 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 20 20  E_OK );.        
16fc0 70 44 65 6c 65 74 65 20 3d 20 70 2d 3e 70 50 72  pDelete = p->pPr
16fd0 69 6f 72 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e  ior;.        p->
16fe0 70 50 72 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b  pPrior = pPrior;
16ff0 0a 20 20 20 20 20 20 20 20 70 2d 3e 6e 53 65 6c  .        p->nSel
17000 65 63 74 52 6f 77 20 3d 20 73 71 6c 69 74 65 33  ectRow = sqlite3
17010 4c 6f 67 45 73 74 41 64 64 28 70 2d 3e 6e 53 65  LogEstAdd(p->nSe
17020 6c 65 63 74 52 6f 77 2c 20 70 50 72 69 6f 72 2d  lectRow, pPrior-
17030 3e 6e 53 65 6c 65 63 74 52 6f 77 29 3b 0a 20 20  >nSelectRow);.  
17040 20 20 20 20 20 20 69 66 28 20 70 50 72 69 6f 72        if( pPrior
17050 2d 3e 70 4c 69 6d 69 74 0a 20 20 20 20 20 20 20  ->pLimit.       
17060 20 20 26 26 20 73 71 6c 69 74 65 33 45 78 70 72    && sqlite3Expr
17070 49 73 49 6e 74 65 67 65 72 28 70 50 72 69 6f 72  IsInteger(pPrior
17080 2d 3e 70 4c 69 6d 69 74 2d 3e 70 4c 65 66 74 2c  ->pLimit->pLeft,
17090 20 26 6e 4c 69 6d 69 74 29 0a 20 20 20 20 20 20   &nLimit).      
170a0 20 20 20 26 26 20 6e 4c 69 6d 69 74 3e 30 20 26     && nLimit>0 &
170b0 26 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20  & p->nSelectRow 
170c0 3e 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28  > sqlite3LogEst(
170d0 28 75 36 34 29 6e 4c 69 6d 69 74 29 20 0a 20 20  (u64)nLimit) .  
170e0 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
170f0 20 20 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77     p->nSelectRow
17100 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74   = sqlite3LogEst
17110 28 28 75 36 34 29 6e 4c 69 6d 69 74 29 3b 0a 20  ((u64)nLimit);. 
17120 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
17130 20 69 66 28 20 61 64 64 72 20 29 7b 0a 20 20 20   if( addr ){.   
17140 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
17150 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64  beJumpHere(v, ad
17160 64 72 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  dr);.        }. 
17170 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
17180 20 20 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65      }.      case
17190 20 54 4b 5f 45 58 43 45 50 54 3a 0a 20 20 20 20   TK_EXCEPT:.    
171a0 20 20 63 61 73 65 20 54 4b 5f 55 4e 49 4f 4e 3a    case TK_UNION:
171b0 20 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 75   {.        int u
171c0 6e 69 6f 6e 54 61 62 3b 20 20 20 20 2f 2a 20 43  nionTab;    /* C
171d0 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20  ursor number of 
171e0 74 68 65 20 74 65 6d 70 20 74 61 62 6c 65 20 68  the temp table h
171f0 6f 6c 64 69 6e 67 20 72 65 73 75 6c 74 20 2a 2f  olding result */
17200 0a 20 20 20 20 20 20 20 20 75 38 20 6f 70 20 3d  .        u8 op =
17210 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65   0;       /* One
17220 20 6f 66 20 74 68 65 20 53 52 54 5f 20 6f 70 65   of the SRT_ ope
17230 72 61 74 69 6f 6e 73 20 74 6f 20 61 70 70 6c 79  rations to apply
17240 20 74 6f 20 73 65 6c 66 20 2a 2f 0a 20 20 20 20   to self */.    
17250 20 20 20 20 69 6e 74 20 70 72 69 6f 72 4f 70 3b      int priorOp;
17260 20 20 20 20 20 2f 2a 20 54 68 65 20 53 52 54 5f       /* The SRT_
17270 20 6f 70 65 72 61 74 69 6f 6e 20 74 6f 20 61 70   operation to ap
17280 70 6c 79 20 74 6f 20 70 72 69 6f 72 20 73 65 6c  ply to prior sel
17290 65 63 74 73 20 2a 2f 0a 20 20 20 20 20 20 20 20  ects */.        
172a0 45 78 70 72 20 2a 70 4c 69 6d 69 74 3b 20 20 20  Expr *pLimit;   
172b0 20 2f 2a 20 53 61 76 65 64 20 76 61 6c 75 65 73   /* Saved values
172c0 20 6f 66 20 70 2d 3e 6e 4c 69 6d 69 74 20 20 2a   of p->nLimit  *
172d0 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 61 64  /.        int ad
172e0 64 72 3b 0a 20 20 20 20 20 20 20 20 53 65 6c 65  dr;.        Sele
172f0 63 74 44 65 73 74 20 75 6e 69 6f 6e 64 65 73 74  ctDest uniondest
17300 3b 0a 20 20 0a 20 20 20 20 20 20 20 20 74 65 73  ;.  .        tes
17310 74 63 61 73 65 28 20 70 2d 3e 6f 70 3d 3d 54 4b  tcase( p->op==TK
17320 5f 45 58 43 45 50 54 20 29 3b 0a 20 20 20 20 20  _EXCEPT );.     
17330 20 20 20 74 65 73 74 63 61 73 65 28 20 70 2d 3e     testcase( p->
17340 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29 3b 0a  op==TK_UNION );.
17350 20 20 20 20 20 20 20 20 70 72 69 6f 72 4f 70 20          priorOp 
17360 3d 20 53 52 54 5f 55 6e 69 6f 6e 3b 0a 20 20 20  = SRT_Union;.   
17370 20 20 20 20 20 69 66 28 20 64 65 73 74 2e 65 44       if( dest.eD
17380 65 73 74 3d 3d 70 72 69 6f 72 4f 70 20 29 7b 0a  est==priorOp ){.
17390 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 65 20            /* We 
173a0 63 61 6e 20 72 65 75 73 65 20 61 20 74 65 6d 70  can reuse a temp
173b0 6f 72 61 72 79 20 74 61 62 6c 65 20 67 65 6e 65  orary table gene
173c0 72 61 74 65 64 20 62 79 20 61 20 53 45 4c 45 43  rated by a SELEC
173d0 54 20 74 6f 20 6f 75 72 0a 20 20 20 20 20 20 20  T to our.       
173e0 20 20 20 2a 2a 20 72 69 67 68 74 2e 0a 20 20 20     ** right..   
173f0 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
17400 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70      assert( p->p
17410 4c 69 6d 69 74 3d 3d 30 20 29 3b 20 20 20 20 20  Limit==0 );     
17420 20 2f 2a 20 4e 6f 74 20 61 6c 6c 6f 77 65 64 20   /* Not allowed 
17430 6f 6e 20 6c 65 66 74 77 61 72 64 20 65 6c 65 6d  on leftward elem
17440 65 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20 20 20  ents */.        
17450 20 20 75 6e 69 6f 6e 54 61 62 20 3d 20 64 65 73    unionTab = des
17460 74 2e 69 53 44 50 61 72 6d 3b 0a 20 20 20 20 20  t.iSDParm;.     
17470 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
17480 20 20 20 20 2f 2a 20 57 65 20 77 69 6c 6c 20 6e      /* We will n
17490 65 65 64 20 74 6f 20 63 72 65 61 74 65 20 6f 75  eed to create ou
174a0 72 20 6f 77 6e 20 74 65 6d 70 6f 72 61 72 79 20  r own temporary 
174b0 74 61 62 6c 65 20 74 6f 20 68 6f 6c 64 20 74 68  table to hold th
174c0 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69  e.          ** i
174d0 6e 74 65 72 6d 65 64 69 61 74 65 20 72 65 73 75  ntermediate resu
174e0 6c 74 73 2e 0a 20 20 20 20 20 20 20 20 20 20 2a  lts..          *
174f0 2f 0a 20 20 20 20 20 20 20 20 20 20 75 6e 69 6f  /.          unio
17500 6e 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 6e  nTab = pParse->n
17510 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20  Tab++;.         
17520 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4f 72 64   assert( p->pOrd
17530 65 72 42 79 3d 3d 30 20 29 3b 0a 20 20 20 20 20  erBy==0 );.     
17540 20 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69       addr = sqli
17550 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
17560 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61   OP_OpenEphemera
17570 6c 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 30 29 3b  l, unionTab, 0);
17580 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
17590 74 28 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70  t( p->addrOpenEp
175a0 68 6d 5b 30 5d 20 3d 3d 20 2d 31 20 29 3b 0a 20  hm[0] == -1 );. 
175b0 20 20 20 20 20 20 20 20 20 70 2d 3e 61 64 64 72           p->addr
175c0 4f 70 65 6e 45 70 68 6d 5b 30 5d 20 3d 20 61 64  OpenEphm[0] = ad
175d0 64 72 3b 0a 20 20 20 20 20 20 20 20 20 20 66 69  dr;.          fi
175e0 6e 64 52 69 67 68 74 6d 6f 73 74 28 70 29 2d 3e  ndRightmost(p)->
175f0 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f 55  selFlags |= SF_U
17600 73 65 73 45 70 68 65 6d 65 72 61 6c 3b 0a 20 20  sesEphemeral;.  
17610 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
17620 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20 20  p->pEList );.   
17630 20 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 20 20       }.  .      
17640 20 20 2f 2a 20 43 6f 64 65 20 74 68 65 20 53 45    /* Code the SE
17650 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73 20  LECT statements 
17660 74 6f 20 6f 75 72 20 6c 65 66 74 0a 20 20 20 20  to our left.    
17670 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 61      */.        a
17680 73 73 65 72 74 28 20 21 70 50 72 69 6f 72 2d 3e  ssert( !pPrior->
17690 70 4f 72 64 65 72 42 79 20 29 3b 0a 20 20 20 20  pOrderBy );.    
176a0 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63      sqlite3Selec
176b0 74 44 65 73 74 49 6e 69 74 28 26 75 6e 69 6f 6e  tDestInit(&union
176c0 64 65 73 74 2c 20 70 72 69 6f 72 4f 70 2c 20 75  dest, priorOp, u
176d0 6e 69 6f 6e 54 61 62 29 3b 0a 20 20 20 20 20 20  nionTab);.      
176e0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53 65    rc = sqlite3Se
176f0 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 50 72  lect(pParse, pPr
17700 69 6f 72 2c 20 26 75 6e 69 6f 6e 64 65 73 74 29  ior, &uniondest)
17710 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
17720 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f   ){.          go
17730 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f  to multi_select_
17740 65 6e 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  end;.        }. 
17750 20 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 64   .        /* Cod
17760 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 53 45  e the current SE
17770 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 0a 20  LECT statement. 
17780 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
17790 20 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f    if( p->op==TK_
177a0 45 58 43 45 50 54 20 29 7b 0a 20 20 20 20 20 20  EXCEPT ){.      
177b0 20 20 20 20 6f 70 20 3d 20 53 52 54 5f 45 78 63      op = SRT_Exc
177c0 65 70 74 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  ept;.        }el
177d0 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73  se{.          as
177e0 73 65 72 74 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f  sert( p->op==TK_
177f0 55 4e 49 4f 4e 20 29 3b 0a 20 20 20 20 20 20 20  UNION );.       
17800 20 20 20 6f 70 20 3d 20 53 52 54 5f 55 6e 69 6f     op = SRT_Unio
17810 6e 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  n;.        }.   
17820 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d       p->pPrior =
17830 20 30 3b 0a 20 20 20 20 20 20 20 20 70 4c 69 6d   0;.        pLim
17840 69 74 20 3d 20 70 2d 3e 70 4c 69 6d 69 74 3b 0a  it = p->pLimit;.
17850 20 20 20 20 20 20 20 20 70 2d 3e 70 4c 69 6d 69          p->pLimi
17860 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 75  t = 0;.        u
17870 6e 69 6f 6e 64 65 73 74 2e 65 44 65 73 74 20 3d  niondest.eDest =
17880 20 6f 70 3b 0a 20 20 20 20 20 20 20 20 45 78 70   op;.        Exp
17890 6c 61 69 6e 51 75 65 72 79 50 6c 61 6e 28 28 70  lainQueryPlan((p
178a0 50 61 72 73 65 2c 20 31 2c 20 22 25 73 20 55 53  Parse, 1, "%s US
178b0 49 4e 47 20 54 45 4d 50 20 42 2d 54 52 45 45 22  ING TEMP B-TREE"
178c0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
178d0 20 20 20 20 20 20 20 20 20 20 20 20 73 65 6c 65              sele
178e0 63 74 4f 70 4e 61 6d 65 28 70 2d 3e 6f 70 29 29  ctOpName(p->op))
178f0 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  );.        rc = 
17900 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50  sqlite3Select(pP
17910 61 72 73 65 2c 20 70 2c 20 26 75 6e 69 6f 6e 64  arse, p, &uniond
17920 65 73 74 29 3b 0a 20 20 20 20 20 20 20 20 74 65  est);.        te
17930 73 74 63 61 73 65 28 20 72 63 21 3d 53 51 4c 49  stcase( rc!=SQLI
17940 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 20  TE_OK );.       
17950 20 2f 2a 20 51 75 65 72 79 20 66 6c 61 74 74 65   /* Query flatte
17960 6e 69 6e 67 20 69 6e 20 73 71 6c 69 74 65 33 53  ning in sqlite3S
17970 65 6c 65 63 74 28 29 20 6d 69 67 68 74 20 72 65  elect() might re
17980 66 69 6c 6c 20 70 2d 3e 70 4f 72 64 65 72 42 79  fill p->pOrderBy
17990 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 42 65 20  ..        ** Be 
179a0 73 75 72 65 20 74 6f 20 64 65 6c 65 74 65 20 70  sure to delete p
179b0 2d 3e 70 4f 72 64 65 72 42 79 2c 20 74 68 65 72  ->pOrderBy, ther
179c0 65 66 6f 72 65 2c 20 74 6f 20 61 76 6f 69 64 20  efore, to avoid 
179d0 61 20 6d 65 6d 6f 72 79 20 6c 65 61 6b 2e 20 2a  a memory leak. *
179e0 2f 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  /.        sqlite
179f0 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28  3ExprListDelete(
17a00 64 62 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79 29  db, p->pOrderBy)
17a10 3b 0a 20 20 20 20 20 20 20 20 70 44 65 6c 65 74  ;.        pDelet
17a20 65 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20  e = p->pPrior;. 
17a30 20 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72         p->pPrior
17a40 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20 20 20   = pPrior;.     
17a50 20 20 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d     p->pOrderBy =
17a60 20 30 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   0;.        if( 
17a70 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20  p->op==TK_UNION 
17a80 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e  ){.          p->
17a90 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 73 71 6c  nSelectRow = sql
17aa0 69 74 65 33 4c 6f 67 45 73 74 41 64 64 28 70 2d  ite3LogEstAdd(p-
17ab0 3e 6e 53 65 6c 65 63 74 52 6f 77 2c 20 70 50 72  >nSelectRow, pPr
17ac0 69 6f 72 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 29  ior->nSelectRow)
17ad0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
17ae0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44      sqlite3ExprD
17af0 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 4c 69  elete(db, p->pLi
17b00 6d 69 74 29 3b 0a 20 20 20 20 20 20 20 20 70 2d  mit);.        p-
17b10 3e 70 4c 69 6d 69 74 20 3d 20 70 4c 69 6d 69 74  >pLimit = pLimit
17b20 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 69 4c 69  ;.        p->iLi
17b30 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  mit = 0;.       
17b40 20 70 2d 3e 69 4f 66 66 73 65 74 20 3d 20 30 3b   p->iOffset = 0;
17b50 0a 20 20 0a 20 20 20 20 20 20 20 20 2f 2a 20 43  .  .        /* C
17b60 6f 6e 76 65 72 74 20 74 68 65 20 64 61 74 61 20  onvert the data 
17b70 69 6e 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79  in the temporary
17b80 20 74 61 62 6c 65 20 69 6e 74 6f 20 77 68 61 74   table into what
17b90 65 76 65 72 20 66 6f 72 6d 0a 20 20 20 20 20 20  ever form.      
17ba0 20 20 2a 2a 20 69 74 20 69 73 20 74 68 61 74 20    ** it is that 
17bb0 77 65 20 63 75 72 72 65 6e 74 6c 79 20 6e 65 65  we currently nee
17bc0 64 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  d..        */.  
17bd0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 75 6e        assert( un
17be0 69 6f 6e 54 61 62 3d 3d 64 65 73 74 2e 69 53 44  ionTab==dest.iSD
17bf0 50 61 72 6d 20 7c 7c 20 64 65 73 74 2e 65 44 65  Parm || dest.eDe
17c00 73 74 21 3d 70 72 69 6f 72 4f 70 20 29 3b 0a 20  st!=priorOp );. 
17c10 20 20 20 20 20 20 20 69 66 28 20 64 65 73 74 2e         if( dest.
17c20 65 44 65 73 74 21 3d 70 72 69 6f 72 4f 70 20 29  eDest!=priorOp )
17c30 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20  {.          int 
17c40 69 43 6f 6e 74 2c 20 69 42 72 65 61 6b 2c 20 69  iCont, iBreak, i
17c50 53 74 61 72 74 3b 0a 20 20 20 20 20 20 20 20 20  Start;.         
17c60 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69   assert( p->pELi
17c70 73 74 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  st );.          
17c80 69 42 72 65 61 6b 20 3d 20 73 71 6c 69 74 65 33  iBreak = sqlite3
17c90 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
17ca0 3b 0a 20 20 20 20 20 20 20 20 20 20 69 43 6f 6e  ;.          iCon
17cb0 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  t = sqlite3VdbeM
17cc0 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20  akeLabel(v);.   
17cd0 20 20 20 20 20 20 20 63 6f 6d 70 75 74 65 4c 69         computeLi
17ce0 6d 69 74 52 65 67 69 73 74 65 72 73 28 70 50 61  mitRegisters(pPa
17cf0 72 73 65 2c 20 70 2c 20 69 42 72 65 61 6b 29 3b  rse, p, iBreak);
17d00 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
17d10 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
17d20 4f 50 5f 52 65 77 69 6e 64 2c 20 75 6e 69 6f 6e  OP_Rewind, union
17d30 54 61 62 2c 20 69 42 72 65 61 6b 29 3b 20 56 64  Tab, iBreak); Vd
17d40 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
17d50 20 20 20 20 20 20 20 20 20 69 53 74 61 72 74 20           iStart 
17d60 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  = sqlite3VdbeCur
17d70 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20  rentAddr(v);.   
17d80 20 20 20 20 20 20 20 73 65 6c 65 63 74 49 6e 6e         selectInn
17d90 65 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20 70  erLoop(pParse, p
17da0 2c 20 75 6e 69 6f 6e 54 61 62 2c 0a 20 20 20 20  , unionTab,.    
17db0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17dc0 20 20 20 20 20 20 30 2c 20 30 2c 20 26 64 65 73        0, 0, &des
17dd0 74 2c 20 69 43 6f 6e 74 2c 20 69 42 72 65 61 6b  t, iCont, iBreak
17de0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
17df0 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
17e00 61 62 65 6c 28 76 2c 20 69 43 6f 6e 74 29 3b 0a  abel(v, iCont);.
17e10 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
17e20 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
17e30 50 5f 4e 65 78 74 2c 20 75 6e 69 6f 6e 54 61 62  P_Next, unionTab
17e40 2c 20 69 53 74 61 72 74 29 3b 20 56 64 62 65 43  , iStart); VdbeC
17e50 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
17e60 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
17e70 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
17e80 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20   iBreak);.      
17e90 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
17ea0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6c 6f 73  ddOp2(v, OP_Clos
17eb0 65 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 30 29 3b  e, unionTab, 0);
17ec0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
17ed0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
17ee0 7d 0a 20 20 20 20 20 20 64 65 66 61 75 6c 74 3a  }.      default:
17ef0 20 61 73 73 65 72 74 28 20 70 2d 3e 6f 70 3d 3d   assert( p->op==
17f00 54 4b 5f 49 4e 54 45 52 53 45 43 54 20 29 3b 20  TK_INTERSECT ); 
17f10 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 74 61  {.        int ta
17f20 62 31 2c 20 74 61 62 32 3b 0a 20 20 20 20 20 20  b1, tab2;.      
17f30 20 20 69 6e 74 20 69 43 6f 6e 74 2c 20 69 42 72    int iCont, iBr
17f40 65 61 6b 2c 20 69 53 74 61 72 74 3b 0a 20 20 20  eak, iStart;.   
17f50 20 20 20 20 20 45 78 70 72 20 2a 70 4c 69 6d 69       Expr *pLimi
17f60 74 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 61  t;.        int a
17f70 64 64 72 3b 0a 20 20 20 20 20 20 20 20 53 65 6c  ddr;.        Sel
17f80 65 63 74 44 65 73 74 20 69 6e 74 65 72 73 65 63  ectDest intersec
17f90 74 64 65 73 74 3b 0a 20 20 20 20 20 20 20 20 69  tdest;.        i
17fa0 6e 74 20 72 31 3b 0a 20 20 0a 20 20 20 20 20 20  nt r1;.  .      
17fb0 20 20 2f 2a 20 49 4e 54 45 52 53 45 43 54 20 69    /* INTERSECT i
17fc0 73 20 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d  s different from
17fd0 20 74 68 65 20 6f 74 68 65 72 73 20 73 69 6e 63   the others sinc
17fe0 65 20 69 74 20 72 65 71 75 69 72 65 73 0a 20 20  e it requires.  
17ff0 20 20 20 20 20 20 2a 2a 20 74 77 6f 20 74 65 6d        ** two tem
18000 70 6f 72 61 72 79 20 74 61 62 6c 65 73 2e 20 20  porary tables.  
18010 48 65 6e 63 65 20 69 74 20 68 61 73 20 69 74 73  Hence it has its
18020 20 6f 77 6e 20 63 61 73 65 2e 20 20 42 65 67 69   own case.  Begi
18030 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 62 79 20  n.        ** by 
18040 61 6c 6c 6f 63 61 74 69 6e 67 20 74 68 65 20 74  allocating the t
18050 61 62 6c 65 73 20 77 65 20 77 69 6c 6c 20 6e 65  ables we will ne
18060 65 64 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  ed..        */. 
18070 20 20 20 20 20 20 20 74 61 62 31 20 3d 20 70 50         tab1 = pP
18080 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20  arse->nTab++;.  
18090 20 20 20 20 20 20 74 61 62 32 20 3d 20 70 50 61        tab2 = pPa
180a0 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20  rse->nTab++;.   
180b0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
180c0 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 3b 0a 20  pOrderBy==0 );. 
180d0 20 0a 20 20 20 20 20 20 20 20 61 64 64 72 20 3d   .        addr =
180e0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
180f0 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68  p2(v, OP_OpenEph
18100 65 6d 65 72 61 6c 2c 20 74 61 62 31 2c 20 30 29  emeral, tab1, 0)
18110 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
18120 28 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68  ( p->addrOpenEph
18130 6d 5b 30 5d 20 3d 3d 20 2d 31 20 29 3b 0a 20 20  m[0] == -1 );.  
18140 20 20 20 20 20 20 70 2d 3e 61 64 64 72 4f 70 65        p->addrOpe
18150 6e 45 70 68 6d 5b 30 5d 20 3d 20 61 64 64 72 3b  nEphm[0] = addr;
18160 0a 20 20 20 20 20 20 20 20 66 69 6e 64 52 69 67  .        findRig
18170 68 74 6d 6f 73 74 28 70 29 2d 3e 73 65 6c 46 6c  htmost(p)->selFl
18180 61 67 73 20 7c 3d 20 53 46 5f 55 73 65 73 45 70  ags |= SF_UsesEp
18190 68 65 6d 65 72 61 6c 3b 0a 20 20 20 20 20 20 20  hemeral;.       
181a0 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69   assert( p->pELi
181b0 73 74 20 29 3b 0a 20 20 0a 20 20 20 20 20 20 20  st );.  .       
181c0 20 2f 2a 20 43 6f 64 65 20 74 68 65 20 53 45 4c   /* Code the SEL
181d0 45 43 54 73 20 74 6f 20 6f 75 72 20 6c 65 66 74  ECTs to our left
181e0 20 69 6e 74 6f 20 74 65 6d 70 6f 72 61 72 79 20   into temporary 
181f0 74 61 62 6c 65 20 22 74 61 62 31 22 2e 0a 20 20  table "tab1"..  
18200 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
18210 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65   sqlite3SelectDe
18220 73 74 49 6e 69 74 28 26 69 6e 74 65 72 73 65 63  stInit(&intersec
18230 74 64 65 73 74 2c 20 53 52 54 5f 55 6e 69 6f 6e  tdest, SRT_Union
18240 2c 20 74 61 62 31 29 3b 0a 20 20 20 20 20 20 20  , tab1);.       
18250 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53 65 6c   rc = sqlite3Sel
18260 65 63 74 28 70 50 61 72 73 65 2c 20 70 50 72 69  ect(pParse, pPri
18270 6f 72 2c 20 26 69 6e 74 65 72 73 65 63 74 64 65  or, &intersectde
18280 73 74 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  st);.        if(
18290 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20   rc ){.         
182a0 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65   goto multi_sele
182b0 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 20 20  ct_end;.        
182c0 7d 0a 20 20 0a 20 20 20 20 20 20 20 20 2f 2a 20  }.  .        /* 
182d0 43 6f 64 65 20 74 68 65 20 63 75 72 72 65 6e 74  Code the current
182e0 20 53 45 4c 45 43 54 20 69 6e 74 6f 20 74 65 6d   SELECT into tem
182f0 70 6f 72 61 72 79 20 74 61 62 6c 65 20 22 74 61  porary table "ta
18300 62 32 22 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  b2".        */. 
18310 20 20 20 20 20 20 20 61 64 64 72 20 3d 20 73 71         addr = sq
18320 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
18330 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65  v, OP_OpenEpheme
18340 72 61 6c 2c 20 74 61 62 32 2c 20 30 29 3b 0a 20  ral, tab2, 0);. 
18350 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
18360 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 31  ->addrOpenEphm[1
18370 5d 20 3d 3d 20 2d 31 20 29 3b 0a 20 20 20 20 20  ] == -1 );.     
18380 20 20 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70     p->addrOpenEp
18390 68 6d 5b 31 5d 20 3d 20 61 64 64 72 3b 0a 20 20  hm[1] = addr;.  
183a0 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20        p->pPrior 
183b0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70 4c 69  = 0;.        pLi
183c0 6d 69 74 20 3d 20 70 2d 3e 70 4c 69 6d 69 74 3b  mit = p->pLimit;
183d0 0a 20 20 20 20 20 20 20 20 70 2d 3e 70 4c 69 6d  .        p->pLim
183e0 69 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  it = 0;.        
183f0 69 6e 74 65 72 73 65 63 74 64 65 73 74 2e 69 53  intersectdest.iS
18400 44 50 61 72 6d 20 3d 20 74 61 62 32 3b 0a 20 20  DParm = tab2;.  
18410 20 20 20 20 20 20 45 78 70 6c 61 69 6e 51 75 65        ExplainQue
18420 72 79 50 6c 61 6e 28 28 70 50 61 72 73 65 2c 20  ryPlan((pParse, 
18430 31 2c 20 22 25 73 20 55 53 49 4e 47 20 54 45 4d  1, "%s USING TEM
18440 50 20 42 2d 54 52 45 45 22 2c 0a 20 20 20 20 20  P B-TREE",.     
18450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18460 20 20 20 20 20 73 65 6c 65 63 74 4f 70 4e 61 6d       selectOpNam
18470 65 28 70 2d 3e 6f 70 29 29 29 3b 0a 20 20 20 20  e(p->op)));.    
18480 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
18490 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70  Select(pParse, p
184a0 2c 20 26 69 6e 74 65 72 73 65 63 74 64 65 73 74  , &intersectdest
184b0 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63  );.        testc
184c0 61 73 65 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ase( rc!=SQLITE_
184d0 4f 4b 20 29 3b 0a 20 20 20 20 20 20 20 20 70 44  OK );.        pD
184e0 65 6c 65 74 65 20 3d 20 70 2d 3e 70 50 72 69 6f  elete = p->pPrio
184f0 72 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 70 50  r;.        p->pP
18500 72 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a 20  rior = pPrior;. 
18510 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 6e 53         if( p->nS
18520 65 6c 65 63 74 52 6f 77 3e 70 50 72 69 6f 72 2d  electRow>pPrior-
18530 3e 6e 53 65 6c 65 63 74 52 6f 77 20 29 7b 0a 20  >nSelectRow ){. 
18540 20 20 20 20 20 20 20 20 20 70 2d 3e 6e 53 65 6c           p->nSel
18550 65 63 74 52 6f 77 20 3d 20 70 50 72 69 6f 72 2d  ectRow = pPrior-
18560 3e 6e 53 65 6c 65 63 74 52 6f 77 3b 0a 20 20 20  >nSelectRow;.   
18570 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73       }.        s
18580 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
18590 28 64 62 2c 20 70 2d 3e 70 4c 69 6d 69 74 29 3b  (db, p->pLimit);
185a0 0a 20 20 20 20 20 20 20 20 70 2d 3e 70 4c 69 6d  .        p->pLim
185b0 69 74 20 3d 20 70 4c 69 6d 69 74 3b 0a 20 20 0a  it = pLimit;.  .
185c0 20 20 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72          /* Gener
185d0 61 74 65 20 63 6f 64 65 20 74 6f 20 74 61 6b 65  ate code to take
185e0 20 74 68 65 20 69 6e 74 65 72 73 65 63 74 69 6f   the intersectio
185f0 6e 20 6f 66 20 74 68 65 20 74 77 6f 20 74 65 6d  n of the two tem
18600 70 6f 72 61 72 79 0a 20 20 20 20 20 20 20 20 2a  porary.        *
18610 2a 20 74 61 62 6c 65 73 2e 0a 20 20 20 20 20 20  * tables..      
18620 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73    */.        ass
18630 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 20 29  ert( p->pEList )
18640 3b 0a 20 20 20 20 20 20 20 20 69 42 72 65 61 6b  ;.        iBreak
18650 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
18660 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20  keLabel(v);.    
18670 20 20 20 20 69 43 6f 6e 74 20 3d 20 73 71 6c 69      iCont = sqli
18680 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
18690 28 76 29 3b 0a 20 20 20 20 20 20 20 20 63 6f 6d  (v);.        com
186a0 70 75 74 65 4c 69 6d 69 74 52 65 67 69 73 74 65  puteLimitRegiste
186b0 72 73 28 70 50 61 72 73 65 2c 20 70 2c 20 69 42  rs(pParse, p, iB
186c0 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 20 20 73  reak);.        s
186d0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
186e0 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 74  (v, OP_Rewind, t
186f0 61 62 31 2c 20 69 42 72 65 61 6b 29 3b 20 56 64  ab1, iBreak); Vd
18700 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
18710 20 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69         r1 = sqli
18720 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50  te3GetTempReg(pP
18730 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20 69  arse);.        i
18740 53 74 61 72 74 20 3d 20 73 71 6c 69 74 65 33 56  Start = sqlite3V
18750 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
18760 52 6f 77 44 61 74 61 2c 20 74 61 62 31 2c 20 72  RowData, tab1, r
18770 31 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  1);.        sqli
18780 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74  te3VdbeAddOp4Int
18790 28 76 2c 20 4f 50 5f 4e 6f 74 46 6f 75 6e 64 2c  (v, OP_NotFound,
187a0 20 74 61 62 32 2c 20 69 43 6f 6e 74 2c 20 72 31   tab2, iCont, r1
187b0 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 56 64  , 0);.        Vd
187c0 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
187d0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65         sqlite3Re
187e0 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
187f0 72 73 65 2c 20 72 31 29 3b 0a 20 20 20 20 20 20  rse, r1);.      
18800 20 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f    selectInnerLoo
18810 70 28 70 50 61 72 73 65 2c 20 70 2c 20 74 61 62  p(pParse, p, tab
18820 31 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  1,.             
18830 20 20 20 20 20 20 20 20 20 20 20 30 2c 20 30 2c             0, 0,
18840 20 26 64 65 73 74 2c 20 69 43 6f 6e 74 2c 20 69   &dest, iCont, i
18850 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 20 20  Break);.        
18860 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
18870 76 65 4c 61 62 65 6c 28 76 2c 20 69 43 6f 6e 74  veLabel(v, iCont
18880 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
18890 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
188a0 4f 50 5f 4e 65 78 74 2c 20 74 61 62 31 2c 20 69  OP_Next, tab1, i
188b0 53 74 61 72 74 29 3b 20 56 64 62 65 43 6f 76 65  Start); VdbeCove
188c0 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20  rage(v);.       
188d0 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
188e0 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69 42 72 65  lveLabel(v, iBre
188f0 61 6b 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  ak);.        sql
18900 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
18910 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 74 61 62 32  , OP_Close, tab2
18920 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71  , 0);.        sq
18930 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
18940 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 74 61 62  v, OP_Close, tab
18950 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 62  1, 0);.        b
18960 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
18970 20 20 7d 0a 20 20 0a 20 20 23 69 66 6e 64 65 66    }.  .  #ifndef
18980 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50   SQLITE_OMIT_EXP
18990 4c 41 49 4e 0a 20 20 20 20 69 66 28 20 70 2d 3e  LAIN.    if( p->
189a0 70 4e 65 78 74 3d 3d 30 20 29 7b 0a 20 20 20 20  pNext==0 ){.    
189b0 20 20 45 78 70 6c 61 69 6e 51 75 65 72 79 50 6c    ExplainQueryPl
189c0 61 6e 50 6f 70 28 70 50 61 72 73 65 29 3b 0a 20  anPop(pParse);. 
189d0 20 20 20 7d 0a 20 20 23 65 6e 64 69 66 0a 20 20     }.  #endif.  
189e0 7d 0a 20 20 0a 20 20 2f 2a 20 43 6f 6d 70 75 74  }.  .  /* Comput
189f0 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  e collating sequ
18a00 65 6e 63 65 73 20 75 73 65 64 20 62 79 20 0a 20  ences used by . 
18a10 20 2a 2a 20 74 65 6d 70 6f 72 61 72 79 20 74 61   ** temporary ta
18a20 62 6c 65 73 20 6e 65 65 64 65 64 20 74 6f 20 69  bles needed to i
18a30 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 63 6f 6d  mplement the com
18a40 70 6f 75 6e 64 20 73 65 6c 65 63 74 2e 0a 20 20  pound select..  
18a50 2a 2a 20 41 74 74 61 63 68 20 74 68 65 20 4b 65  ** Attach the Ke
18a60 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20  yInfo structure 
18a70 74 6f 20 61 6c 6c 20 74 65 6d 70 6f 72 61 72 79  to all temporary
18a80 20 74 61 62 6c 65 73 2e 0a 20 20 2a 2a 0a 20 20   tables..  **.  
18a90 2a 2a 20 54 68 69 73 20 73 65 63 74 69 6f 6e 20  ** This section 
18aa0 69 73 20 72 75 6e 20 62 79 20 74 68 65 20 72 69  is run by the ri
18ab0 67 68 74 2d 6d 6f 73 74 20 53 45 4c 45 43 54 20  ght-most SELECT 
18ac0 73 74 61 74 65 6d 65 6e 74 20 6f 6e 6c 79 2e 0a  statement only..
18ad0 20 20 2a 2a 20 53 45 4c 45 43 54 20 73 74 61 74    ** SELECT stat
18ae0 65 6d 65 6e 74 73 20 74 6f 20 74 68 65 20 6c 65  ements to the le
18af0 66 74 20 61 6c 77 61 79 73 20 73 6b 69 70 20 74  ft always skip t
18b00 68 69 73 20 70 61 72 74 2e 20 20 54 68 65 20 72  his part.  The r
18b10 69 67 68 74 2d 6d 6f 73 74 0a 20 20 2a 2a 20 53  ight-most.  ** S
18b20 45 4c 45 43 54 20 6d 69 67 68 74 20 61 6c 73 6f  ELECT might also
18b30 20 73 6b 69 70 20 74 68 69 73 20 70 61 72 74 20   skip this part 
18b40 69 66 20 69 74 20 68 61 73 20 6e 6f 20 4f 52 44  if it has no ORD
18b50 45 52 20 42 59 20 63 6c 61 75 73 65 20 61 6e 64  ER BY clause and
18b60 0a 20 20 2a 2a 20 6e 6f 20 74 65 6d 70 20 74 61  .  ** no temp ta
18b70 62 6c 65 73 20 61 72 65 20 72 65 71 75 69 72 65  bles are require
18b80 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d  d..  */.  if( p-
18b90 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 55  >selFlags & SF_U
18ba0 73 65 73 45 70 68 65 6d 65 72 61 6c 20 29 7b 0a  sesEphemeral ){.
18bb0 20 20 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20      int i;      
18bc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18bd0 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
18be0 72 20 2a 2f 0a 20 20 20 20 4b 65 79 49 6e 66 6f  r */.    KeyInfo
18bf0 20 2a 70 4b 65 79 49 6e 66 6f 3b 20 20 20 20 20   *pKeyInfo;     
18c00 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 6c 61 74         /* Collat
18c10 69 6e 67 20 73 65 71 75 65 6e 63 65 20 66 6f 72  ing sequence for
18c20 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20   the result set 
18c30 2a 2f 0a 20 20 20 20 53 65 6c 65 63 74 20 2a 70  */.    Select *p
18c40 4c 6f 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20  Loop;           
18c50 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70       /* For loop
18c60 69 6e 67 20 74 68 72 6f 75 67 68 20 53 45 4c 45  ing through SELE
18c70 43 54 20 73 74 61 74 65 6d 65 6e 74 73 20 2a 2f  CT statements */
18c80 0a 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 2a 61  .    CollSeq **a
18c90 70 43 6f 6c 6c 3b 20 20 20 20 20 20 20 20 20 20  pColl;          
18ca0 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e     /* For loopin
18cb0 67 20 74 68 72 6f 75 67 68 20 70 4b 65 79 49 6e  g through pKeyIn
18cc0 66 6f 2d 3e 61 43 6f 6c 6c 5b 5d 20 2a 2f 0a 20  fo->aColl[] */. 
18cd0 20 20 20 69 6e 74 20 6e 43 6f 6c 3b 20 20 20 20     int nCol;    
18ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18cf0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f   /* Number of co
18d00 6c 75 6d 6e 73 20 69 6e 20 72 65 73 75 6c 74 20  lumns in result 
18d10 73 65 74 20 2a 2f 0a 0a 20 20 20 20 61 73 73 65  set */..    asse
18d20 72 74 28 20 70 2d 3e 70 4e 65 78 74 3d 3d 30 20  rt( p->pNext==0 
18d30 29 3b 0a 20 20 20 20 6e 43 6f 6c 20 3d 20 70 2d  );.    nCol = p-
18d40 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a  >pEList->nExpr;.
18d50 20 20 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20 73      pKeyInfo = s
18d60 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 41 6c 6c  qlite3KeyInfoAll
18d70 6f 63 28 64 62 2c 20 6e 43 6f 6c 2c 20 31 29 3b  oc(db, nCol, 1);
18d80 0a 20 20 20 20 69 66 28 20 21 70 4b 65 79 49 6e  .    if( !pKeyIn
18d90 66 6f 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  fo ){.      rc =
18da0 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b   SQLITE_NOMEM_BK
18db0 50 54 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6d  PT;.      goto m
18dc0 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b  ulti_select_end;
18dd0 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69  .    }.    for(i
18de0 3d 30 2c 20 61 70 43 6f 6c 6c 3d 70 4b 65 79 49  =0, apColl=pKeyI
18df0 6e 66 6f 2d 3e 61 43 6f 6c 6c 3b 20 69 3c 6e 43  nfo->aColl; i<nC
18e00 6f 6c 3b 20 69 2b 2b 2c 20 61 70 43 6f 6c 6c 2b  ol; i++, apColl+
18e10 2b 29 7b 0a 20 20 20 20 20 20 2a 61 70 43 6f 6c  +){.      *apCol
18e20 6c 20 3d 20 6d 75 6c 74 69 53 65 6c 65 63 74 43  l = multiSelectC
18e30 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70  ollSeq(pParse, p
18e40 2c 20 69 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , i);.      if( 
18e50 30 3d 3d 2a 61 70 43 6f 6c 6c 20 29 7b 0a 20 20  0==*apColl ){.  
18e60 20 20 20 20 20 20 2a 61 70 43 6f 6c 6c 20 3d 20        *apColl = 
18e70 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20  db->pDfltColl;. 
18e80 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
18e90 20 20 66 6f 72 28 70 4c 6f 6f 70 3d 70 3b 20 70    for(pLoop=p; p
18ea0 4c 6f 6f 70 3b 20 70 4c 6f 6f 70 3d 70 4c 6f 6f  Loop; pLoop=pLoo
18eb0 70 2d 3e 70 50 72 69 6f 72 29 7b 0a 20 20 20 20  p->pPrior){.    
18ec0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 32 3b 20    for(i=0; i<2; 
18ed0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  i++){.        in
18ee0 74 20 61 64 64 72 20 3d 20 70 4c 6f 6f 70 2d 3e  t addr = pLoop->
18ef0 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 69 5d 3b  addrOpenEphm[i];
18f00 0a 20 20 20 20 20 20 20 20 69 66 28 20 61 64 64  .        if( add
18f10 72 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  r<0 ){.         
18f20 20 2f 2a 20 49 66 20 5b 30 5d 20 69 73 20 75 6e   /* If [0] is un
18f30 75 73 65 64 20 74 68 65 6e 20 5b 31 5d 20 69 73  used then [1] is
18f40 20 61 6c 73 6f 20 75 6e 75 73 65 64 2e 20 20 53   also unused.  S
18f50 6f 20 77 65 20 63 61 6e 0a 20 20 20 20 20 20 20  o we can.       
18f60 20 20 20 2a 2a 20 61 6c 77 61 79 73 20 73 61 66     ** always saf
18f70 65 6c 79 20 61 62 6f 72 74 20 61 73 20 73 6f 6f  ely abort as soo
18f80 6e 20 61 73 20 74 68 65 20 66 69 72 73 74 20 75  n as the first u
18f90 6e 75 73 65 64 20 73 6c 6f 74 20 69 73 20 66 6f  nused slot is fo
18fa0 75 6e 64 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  und */.         
18fb0 20 61 73 73 65 72 74 28 20 70 4c 6f 6f 70 2d 3e   assert( pLoop->
18fc0 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 31 5d 3c  addrOpenEphm[1]<
18fd0 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62  0 );.          b
18fe0 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  reak;.        }.
18ff0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
19000 64 62 65 43 68 61 6e 67 65 50 32 28 76 2c 20 61  dbeChangeP2(v, a
19010 64 64 72 2c 20 6e 43 6f 6c 29 3b 0a 20 20 20 20  ddr, nCol);.    
19020 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
19030 68 61 6e 67 65 50 34 28 76 2c 20 61 64 64 72 2c  hangeP4(v, addr,
19040 20 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33 4b   (char*)sqlite3K
19050 65 79 49 6e 66 6f 52 65 66 28 70 4b 65 79 49 6e  eyInfoRef(pKeyIn
19060 66 6f 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20  fo),.           
19070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19080 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20   P4_KEYINFO);.  
19090 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 61 64 64        pLoop->add
190a0 72 4f 70 65 6e 45 70 68 6d 5b 69 5d 20 3d 20 2d  rOpenEphm[i] = -
190b0 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  1;.      }.    }
190c0 0a 20 20 20 20 73 71 6c 69 74 65 33 4b 65 79 49  .    sqlite3KeyI
190d0 6e 66 6f 55 6e 72 65 66 28 70 4b 65 79 49 6e 66  nfoUnref(pKeyInf
190e0 6f 29 3b 0a 20 20 7d 0a 0a 6d 75 6c 74 69 5f 73  o);.  }..multi_s
190f0 65 6c 65 63 74 5f 65 6e 64 3a 0a 20 20 70 44 65  elect_end:.  pDe
19100 73 74 2d 3e 69 53 64 73 74 20 3d 20 64 65 73 74  st->iSdst = dest
19110 2e 69 53 64 73 74 3b 0a 20 20 70 44 65 73 74 2d  .iSdst;.  pDest-
19120 3e 6e 53 64 73 74 20 3d 20 64 65 73 74 2e 6e 53  >nSdst = dest.nS
19130 64 73 74 3b 0a 20 20 73 71 6c 69 74 65 33 53 65  dst;.  sqlite3Se
19140 6c 65 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70  lectDelete(db, p
19150 44 65 6c 65 74 65 29 3b 0a 20 20 72 65 74 75 72  Delete);.  retur
19160 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  n rc;.}.#endif /
19170 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f  * SQLITE_OMIT_CO
19180 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 20 2a 2f  MPOUND_SELECT */
19190 0a 0a 2f 2a 0a 2a 2a 20 45 72 72 6f 72 20 6d 65  ../*.** Error me
191a0 73 73 61 67 65 20 66 6f 72 20 77 68 65 6e 20 74  ssage for when t
191b0 77 6f 20 6f 72 20 6d 6f 72 65 20 74 65 72 6d 73  wo or more terms
191c0 20 6f 66 20 61 20 63 6f 6d 70 6f 75 6e 64 20 73   of a compound s
191d0 65 6c 65 63 74 20 68 61 76 65 20 64 69 66 66 65  elect have diffe
191e0 72 65 6e 74 0a 2a 2a 20 73 69 7a 65 20 72 65 73  rent.** size res
191f0 75 6c 74 20 73 65 74 73 2e 0a 2a 2f 0a 76 6f 69  ult sets..*/.voi
19200 64 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 57  d sqlite3SelectW
19210 72 6f 6e 67 4e 75 6d 54 65 72 6d 73 45 72 72 6f  rongNumTermsErro
19220 72 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  r(Parse *pParse,
19230 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 69   Select *p){.  i
19240 66 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26  f( p->selFlags &
19250 20 53 46 5f 56 61 6c 75 65 73 20 29 7b 0a 20 20   SF_Values ){.  
19260 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
19270 67 28 70 50 61 72 73 65 2c 20 22 61 6c 6c 20 56  g(pParse, "all V
19280 41 4c 55 45 53 20 6d 75 73 74 20 68 61 76 65 20  ALUES must have 
19290 74 68 65 20 73 61 6d 65 20 6e 75 6d 62 65 72 20  the same number 
192a0 6f 66 20 74 65 72 6d 73 22 29 3b 0a 20 20 7d 65  of terms");.  }e
192b0 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  lse{.    sqlite3
192c0 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
192d0 20 22 53 45 4c 45 43 54 73 20 74 6f 20 74 68 65   "SELECTs to the
192e0 20 6c 65 66 74 20 61 6e 64 20 72 69 67 68 74 20   left and right 
192f0 6f 66 20 25 73 22 0a 20 20 20 20 20 20 22 20 64  of %s".      " d
19300 6f 20 6e 6f 74 20 68 61 76 65 20 74 68 65 20 73  o not have the s
19310 61 6d 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65  ame number of re
19320 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 22 2c 20 73  sult columns", s
19330 65 6c 65 63 74 4f 70 4e 61 6d 65 28 70 2d 3e 6f  electOpName(p->o
19340 70 29 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  p));.  }.}../*.*
19350 2a 20 43 6f 64 65 20 61 6e 20 6f 75 74 70 75 74  * Code an output
19360 20 73 75 62 72 6f 75 74 69 6e 65 20 66 6f 72 20   subroutine for 
19370 61 20 63 6f 72 6f 75 74 69 6e 65 20 69 6d 70 6c  a coroutine impl
19380 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 61 0a  ementation of a.
19390 2a 2a 20 53 45 4c 45 43 54 20 73 74 61 74 6d 65  ** SELECT statme
193a0 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 61  nt..**.** The da
193b0 74 61 20 74 6f 20 62 65 20 6f 75 74 70 75 74 20  ta to be output 
193c0 69 73 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20  is contained in 
193d0 70 49 6e 2d 3e 69 53 64 73 74 2e 20 20 54 68 65  pIn->iSdst.  The
193e0 72 65 20 61 72 65 0a 2a 2a 20 70 49 6e 2d 3e 6e  re are.** pIn->n
193f0 53 64 73 74 20 63 6f 6c 75 6d 6e 73 20 74 6f 20  Sdst columns to 
19400 62 65 20 6f 75 74 70 75 74 2e 20 20 70 44 65 73  be output.  pDes
19410 74 20 69 73 20 77 68 65 72 65 20 74 68 65 20 6f  t is where the o
19420 75 74 70 75 74 20 73 68 6f 75 6c 64 0a 2a 2a 20  utput should.** 
19430 62 65 20 73 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 72  be sent..**.** r
19440 65 67 52 65 74 75 72 6e 20 69 73 20 74 68 65 20  egReturn is the 
19450 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 72 65  number of the re
19460 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 74  gister holding t
19470 68 65 20 73 75 62 72 6f 75 74 69 6e 65 0a 2a 2a  he subroutine.**
19480 20 72 65 74 75 72 6e 20 61 64 64 72 65 73 73 2e   return address.
19490 0a 2a 2a 0a 2a 2a 20 49 66 20 72 65 67 50 72 65  .**.** If regPre
194a0 76 3e 30 20 74 68 65 6e 20 69 74 20 69 73 20 74  v>0 then it is t
194b0 68 65 20 66 69 72 73 74 20 72 65 67 69 73 74 65  he first registe
194c0 72 20 69 6e 20 61 20 76 65 63 74 6f 72 20 74 68  r in a vector th
194d0 61 74 0a 2a 2a 20 72 65 63 6f 72 64 73 20 74 68  at.** records th
194e0 65 20 70 72 65 76 69 6f 75 73 20 6f 75 74 70 75  e previous outpu
194f0 74 2e 20 20 6d 65 6d 5b 72 65 67 50 72 65 76 5d  t.  mem[regPrev]
19500 20 69 73 20 61 20 66 6c 61 67 20 74 68 61 74 20   is a flag that 
19510 69 73 20 66 61 6c 73 65 0a 2a 2a 20 69 66 20 74  is false.** if t
19520 68 65 72 65 20 68 61 73 20 62 65 65 6e 20 6e 6f  here has been no
19530 20 70 72 65 76 69 6f 75 73 20 6f 75 74 70 75 74   previous output
19540 2e 20 20 49 66 20 72 65 67 50 72 65 76 3e 30 20  .  If regPrev>0 
19550 74 68 65 6e 20 63 6f 64 65 20 69 73 0a 2a 2a 20  then code is.** 
19560 67 65 6e 65 72 61 74 65 64 20 74 6f 20 73 75 70  generated to sup
19570 70 72 65 73 73 20 64 75 70 6c 69 63 61 74 65 73  press duplicates
19580 2e 20 20 70 4b 65 79 49 6e 66 6f 20 69 73 20 75  .  pKeyInfo is u
19590 73 65 64 20 66 6f 72 20 63 6f 6d 70 61 72 69 6e  sed for comparin
195a0 67 0a 2a 2a 20 6b 65 79 73 2e 0a 2a 2a 0a 2a 2a  g.** keys..**.**
195b0 20 49 66 20 74 68 65 20 4c 49 4d 49 54 20 66 6f   If the LIMIT fo
195c0 75 6e 64 20 69 6e 20 70 2d 3e 69 4c 69 6d 69 74  und in p->iLimit
195d0 20 69 73 20 72 65 61 63 68 65 64 2c 20 6a 75 6d   is reached, jum
195e0 70 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 74 6f  p immediately to
195f0 0a 2a 2a 20 69 42 72 65 61 6b 2e 0a 2a 2f 0a 73  .** iBreak..*/.s
19600 74 61 74 69 63 20 69 6e 74 20 67 65 6e 65 72 61  tatic int genera
19610 74 65 4f 75 74 70 75 74 53 75 62 72 6f 75 74 69  teOutputSubrouti
19620 6e 65 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  ne(.  Parse *pPa
19630 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  rse,          /*
19640 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
19650 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c   */.  Select *p,
19660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
19670 20 54 68 65 20 53 45 4c 45 43 54 20 73 74 61 74   The SELECT stat
19680 65 6d 65 6e 74 20 2a 2f 0a 20 20 53 65 6c 65 63  ement */.  Selec
19690 74 44 65 73 74 20 2a 70 49 6e 2c 20 20 20 20 20  tDest *pIn,     
196a0 20 20 20 2f 2a 20 43 6f 72 6f 75 74 69 6e 65 20     /* Coroutine 
196b0 73 75 70 70 6c 79 69 6e 67 20 64 61 74 61 20 2a  supplying data *
196c0 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 2a  /.  SelectDest *
196d0 70 44 65 73 74 2c 20 20 20 20 20 20 2f 2a 20 57  pDest,      /* W
196e0 68 65 72 65 20 74 6f 20 73 65 6e 64 20 74 68 65  here to send the
196f0 20 64 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 72   data */.  int r
19700 65 67 52 65 74 75 72 6e 2c 20 20 20 20 20 20 20  egReturn,       
19710 20 20 20 2f 2a 20 54 68 65 20 72 65 74 75 72 6e     /* The return
19720 20 61 64 64 72 65 73 73 20 72 65 67 69 73 74 65   address registe
19730 72 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 50 72  r */.  int regPr
19740 65 76 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  ev,            /
19750 2a 20 50 72 65 76 69 6f 75 73 20 72 65 73 75 6c  * Previous resul
19760 74 20 72 65 67 69 73 74 65 72 2e 20 20 4e 6f 20  t register.  No 
19770 75 6e 69 71 75 65 6e 65 73 73 20 69 66 20 30 20  uniqueness if 0 
19780 2a 2f 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b  */.  KeyInfo *pK
19790 65 79 49 6e 66 6f 2c 20 20 20 20 20 20 2f 2a 20  eyInfo,      /* 
197a0 46 6f 72 20 63 6f 6d 70 61 72 69 6e 67 20 77 69  For comparing wi
197b0 74 68 20 70 72 65 76 69 6f 75 73 20 65 6e 74 72  th previous entr
197c0 79 20 2a 2f 0a 20 20 69 6e 74 20 69 42 72 65 61  y */.  int iBrea
197d0 6b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  k              /
197e0 2a 20 4a 75 6d 70 20 68 65 72 65 20 69 66 20 77  * Jump here if w
197f0 65 20 68 69 74 20 74 68 65 20 4c 49 4d 49 54 20  e hit the LIMIT 
19800 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76 20  */.){.  Vdbe *v 
19810 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
19820 0a 20 20 69 6e 74 20 69 43 6f 6e 74 69 6e 75 65  .  int iContinue
19830 3b 0a 20 20 69 6e 74 20 61 64 64 72 3b 0a 0a 20  ;.  int addr;.. 
19840 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56   addr = sqlite3V
19850 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
19860 29 3b 0a 20 20 69 43 6f 6e 74 69 6e 75 65 20 3d  );.  iContinue =
19870 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
19880 4c 61 62 65 6c 28 76 29 3b 0a 0a 20 20 2f 2a 20  Label(v);..  /* 
19890 53 75 70 70 72 65 73 73 20 64 75 70 6c 69 63 61  Suppress duplica
198a0 74 65 73 20 66 6f 72 20 55 4e 49 4f 4e 2c 20 45  tes for UNION, E
198b0 58 43 45 50 54 2c 20 61 6e 64 20 49 4e 54 45 52  XCEPT, and INTER
198c0 53 45 43 54 20 0a 20 20 2a 2f 0a 20 20 69 66 28  SECT .  */.  if(
198d0 20 72 65 67 50 72 65 76 20 29 7b 0a 20 20 20 20   regPrev ){.    
198e0 69 6e 74 20 61 64 64 72 31 2c 20 61 64 64 72 32  int addr1, addr2
198f0 3b 0a 20 20 20 20 61 64 64 72 31 20 3d 20 73 71  ;.    addr1 = sq
19900 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
19910 76 2c 20 4f 50 5f 49 66 4e 6f 74 2c 20 72 65 67  v, OP_IfNot, reg
19920 50 72 65 76 29 3b 20 56 64 62 65 43 6f 76 65 72  Prev); VdbeCover
19930 61 67 65 28 76 29 3b 0a 20 20 20 20 61 64 64 72  age(v);.    addr
19940 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  2 = sqlite3VdbeA
19950 64 64 4f 70 34 28 76 2c 20 4f 50 5f 43 6f 6d 70  ddOp4(v, OP_Comp
19960 61 72 65 2c 20 70 49 6e 2d 3e 69 53 64 73 74 2c  are, pIn->iSdst,
19970 20 72 65 67 50 72 65 76 2b 31 2c 20 70 49 6e 2d   regPrev+1, pIn-
19980 3e 6e 53 64 73 74 2c 0a 20 20 20 20 20 20 20 20  >nSdst,.        
19990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
199a0 20 20 20 20 20 20 28 63 68 61 72 2a 29 73 71 6c        (char*)sql
199b0 69 74 65 33 4b 65 79 49 6e 66 6f 52 65 66 28 70  ite3KeyInfoRef(p
199c0 4b 65 79 49 6e 66 6f 29 2c 20 50 34 5f 4b 45 59  KeyInfo), P4_KEY
199d0 49 4e 46 4f 29 3b 0a 20 20 20 20 73 71 6c 69 74  INFO);.    sqlit
199e0 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
199f0 4f 50 5f 4a 75 6d 70 2c 20 61 64 64 72 32 2b 32  OP_Jump, addr2+2
19a00 2c 20 69 43 6f 6e 74 69 6e 75 65 2c 20 61 64 64  , iContinue, add
19a10 72 32 2b 32 29 3b 20 56 64 62 65 43 6f 76 65 72  r2+2); VdbeCover
19a20 61 67 65 28 76 29 3b 0a 20 20 20 20 73 71 6c 69  age(v);.    sqli
19a30 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
19a40 76 2c 20 61 64 64 72 31 29 3b 0a 20 20 20 20 73  v, addr1);.    s
19a50 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
19a60 28 76 2c 20 4f 50 5f 43 6f 70 79 2c 20 70 49 6e  (v, OP_Copy, pIn
19a70 2d 3e 69 53 64 73 74 2c 20 72 65 67 50 72 65 76  ->iSdst, regPrev
19a80 2b 31 2c 20 70 49 6e 2d 3e 6e 53 64 73 74 2d 31  +1, pIn->nSdst-1
19a90 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
19aa0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
19ab0 6e 74 65 67 65 72 2c 20 31 2c 20 72 65 67 50 72  nteger, 1, regPr
19ac0 65 76 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  ev);.  }.  if( p
19ad0 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  Parse->db->mallo
19ae0 63 46 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e  cFailed ) return
19af0 20 30 3b 0a 0a 20 20 2f 2a 20 53 75 70 70 72 65   0;..  /* Suppre
19b00 73 73 20 74 68 65 20 66 69 72 73 74 20 4f 46 46  ss the first OFF
19b10 53 45 54 20 65 6e 74 72 69 65 73 20 69 66 20 74  SET entries if t
19b20 68 65 72 65 20 69 73 20 61 6e 20 4f 46 46 53 45  here is an OFFSE
19b30 54 20 63 6c 61 75 73 65 0a 20 20 2a 2f 0a 20 20  T clause.  */.  
19b40 63 6f 64 65 4f 66 66 73 65 74 28 76 2c 20 70 2d  codeOffset(v, p-
19b50 3e 69 4f 66 66 73 65 74 2c 20 69 43 6f 6e 74 69  >iOffset, iConti
19b60 6e 75 65 29 3b 0a 0a 20 20 61 73 73 65 72 74 28  nue);..  assert(
19b70 20 70 44 65 73 74 2d 3e 65 44 65 73 74 21 3d 53   pDest->eDest!=S
19b80 52 54 5f 45 78 69 73 74 73 20 29 3b 0a 20 20 61  RT_Exists );.  a
19b90 73 73 65 72 74 28 20 70 44 65 73 74 2d 3e 65 44  ssert( pDest->eD
19ba0 65 73 74 21 3d 53 52 54 5f 54 61 62 6c 65 20 29  est!=SRT_Table )
19bb0 3b 0a 20 20 73 77 69 74 63 68 28 20 70 44 65 73  ;.  switch( pDes
19bc0 74 2d 3e 65 44 65 73 74 20 29 7b 0a 20 20 20 20  t->eDest ){.    
19bd0 2f 2a 20 53 74 6f 72 65 20 74 68 65 20 72 65 73  /* Store the res
19be0 75 6c 74 20 61 73 20 64 61 74 61 20 75 73 69 6e  ult as data usin
19bf0 67 20 61 20 75 6e 69 71 75 65 20 6b 65 79 2e 0a  g a unique key..
19c00 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20      */.    case 
19c10 53 52 54 5f 45 70 68 65 6d 54 61 62 3a 20 7b 0a  SRT_EphemTab: {.
19c20 20 20 20 20 20 20 69 6e 74 20 72 31 20 3d 20 73        int r1 = s
19c30 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67  qlite3GetTempReg
19c40 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
19c50 69 6e 74 20 72 32 20 3d 20 73 71 6c 69 74 65 33  int r2 = sqlite3
19c60 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73  GetTempReg(pPars
19c70 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  e);.      sqlite
19c80 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
19c90 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 70 49  P_MakeRecord, pI
19ca0 6e 2d 3e 69 53 64 73 74 2c 20 70 49 6e 2d 3e 6e  n->iSdst, pIn->n
19cb0 53 64 73 74 2c 20 72 31 29 3b 0a 20 20 20 20 20  Sdst, r1);.     
19cc0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
19cd0 70 32 28 76 2c 20 4f 50 5f 4e 65 77 52 6f 77 69  p2(v, OP_NewRowi
19ce0 64 2c 20 70 44 65 73 74 2d 3e 69 53 44 50 61 72  d, pDest->iSDPar
19cf0 6d 2c 20 72 32 29 3b 0a 20 20 20 20 20 20 73 71  m, r2);.      sq
19d00 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
19d10 76 2c 20 4f 50 5f 49 6e 73 65 72 74 2c 20 70 44  v, OP_Insert, pD
19d20 65 73 74 2d 3e 69 53 44 50 61 72 6d 2c 20 72 31  est->iSDParm, r1
19d30 2c 20 72 32 29 3b 0a 20 20 20 20 20 20 73 71 6c  , r2);.      sql
19d40 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35  ite3VdbeChangeP5
19d50 28 76 2c 20 4f 50 46 4c 41 47 5f 41 50 50 45 4e  (v, OPFLAG_APPEN
19d60 44 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  D);.      sqlite
19d70 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
19d80 70 50 61 72 73 65 2c 20 72 32 29 3b 0a 20 20 20  pParse, r2);.   
19d90 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
19da0 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
19db0 20 72 31 29 3b 0a 20 20 20 20 20 20 62 72 65 61   r1);.      brea
19dc0 6b 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 6e 64 65  k;.    }..#ifnde
19dd0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  f SQLITE_OMIT_SU
19de0 42 51 55 45 52 59 0a 20 20 20 20 2f 2a 20 49 66  BQUERY.    /* If
19df0 20 77 65 20 61 72 65 20 63 72 65 61 74 69 6e 67   we are creating
19e00 20 61 20 73 65 74 20 66 6f 72 20 61 6e 20 22 65   a set for an "e
19e10 78 70 72 20 49 4e 20 28 53 45 4c 45 43 54 20 2e  xpr IN (SELECT .
19e20 2e 2e 29 22 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ..)"..    */.   
19e30 20 63 61 73 65 20 53 52 54 5f 53 65 74 3a 20 7b   case SRT_Set: {
19e40 0a 20 20 20 20 20 20 69 6e 74 20 72 31 3b 0a 20  .      int r1;. 
19e50 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
19e60 49 6e 2d 3e 6e 53 64 73 74 3e 31 20 29 3b 0a 20  In->nSdst>1 );. 
19e70 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65       r1 = sqlite
19e80 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72  3GetTempReg(pPar
19e90 73 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  se);.      sqlit
19ea0 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
19eb0 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 70  OP_MakeRecord, p
19ec0 49 6e 2d 3e 69 53 64 73 74 2c 20 70 49 6e 2d 3e  In->iSdst, pIn->
19ed0 6e 53 64 73 74 2c 20 0a 20 20 20 20 20 20 20 20  nSdst, .        
19ee0 20 20 72 31 2c 20 70 44 65 73 74 2d 3e 7a 41 66    r1, pDest->zAf
19ef0 66 53 64 73 74 2c 20 70 49 6e 2d 3e 6e 53 64 73  fSdst, pIn->nSds
19f00 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
19f10 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76  3VdbeAddOp4Int(v
19f20 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20  , OP_IdxInsert, 
19f30 70 44 65 73 74 2d 3e 69 53 44 50 61 72 6d 2c 20  pDest->iSDParm, 
19f40 72 31 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  r1,.            
19f50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
19f60 49 6e 2d 3e 69 53 64 73 74 2c 20 70 49 6e 2d 3e  In->iSdst, pIn->
19f70 6e 53 64 73 74 29 3b 0a 20 20 20 20 20 20 73 71  nSdst);.      sq
19f80 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
19f90 52 65 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b  Reg(pParse, r1);
19fa0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
19fb0 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74    }..    /* If t
19fc0 68 69 73 20 69 73 20 61 20 73 63 61 6c 61 72 20  his is a scalar 
19fd0 73 65 6c 65 63 74 20 74 68 61 74 20 69 73 20 70  select that is p
19fe0 61 72 74 20 6f 66 20 61 6e 20 65 78 70 72 65 73  art of an expres
19ff0 73 69 6f 6e 2c 20 74 68 65 6e 0a 20 20 20 20 2a  sion, then.    *
1a000 2a 20 73 74 6f 72 65 20 74 68 65 20 72 65 73 75  * store the resu
1a010 6c 74 73 20 69 6e 20 74 68 65 20 61 70 70 72 6f  lts in the appro
1a020 70 72 69 61 74 65 20 6d 65 6d 6f 72 79 20 63 65  priate memory ce
1a030 6c 6c 20 61 6e 64 20 62 72 65 61 6b 20 6f 75 74  ll and break out
1a040 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 73  .    ** of the s
1a050 63 61 6e 20 6c 6f 6f 70 2e 0a 20 20 20 20 2a 2f  can loop..    */
1a060 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 4d 65  .    case SRT_Me
1a070 6d 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72  m: {.      asser
1a080 74 28 20 70 49 6e 2d 3e 6e 53 64 73 74 3d 3d 31  t( pIn->nSdst==1
1a090 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72 72   || pParse->nErr
1a0a0 3e 30 20 29 3b 20 20 74 65 73 74 63 61 73 65 28  >0 );  testcase(
1a0b0 20 70 49 6e 2d 3e 6e 53 64 73 74 21 3d 31 20 29   pIn->nSdst!=1 )
1a0c0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
1a0d0 78 70 72 43 6f 64 65 4d 6f 76 65 28 70 50 61 72  xprCodeMove(pPar
1a0e0 73 65 2c 20 70 49 6e 2d 3e 69 53 64 73 74 2c 20  se, pIn->iSdst, 
1a0f0 70 44 65 73 74 2d 3e 69 53 44 50 61 72 6d 2c 20  pDest->iSDParm, 
1a100 31 29 3b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65  1);.      /* The
1a110 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 20 77 69   LIMIT clause wi
1a120 6c 6c 20 6a 75 6d 70 20 6f 75 74 20 6f 66 20 74  ll jump out of t
1a130 68 65 20 6c 6f 6f 70 20 66 6f 72 20 75 73 20 2a  he loop for us *
1a140 2f 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  /.      break;. 
1a150 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 23     }.#endif /* #
1a160 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1a170 49 54 5f 53 55 42 51 55 45 52 59 20 2a 2f 0a 0a  IT_SUBQUERY */..
1a180 20 20 20 20 2f 2a 20 54 68 65 20 72 65 73 75 6c      /* The resul
1a190 74 73 20 61 72 65 20 73 74 6f 72 65 64 20 69 6e  ts are stored in
1a1a0 20 61 20 73 65 71 75 65 6e 63 65 20 6f 66 20 72   a sequence of r
1a1b0 65 67 69 73 74 65 72 73 0a 20 20 20 20 2a 2a 20  egisters.    ** 
1a1c0 73 74 61 72 74 69 6e 67 20 61 74 20 70 44 65 73  starting at pDes
1a1d0 74 2d 3e 69 53 64 73 74 2e 20 20 54 68 65 6e 20  t->iSdst.  Then 
1a1e0 74 68 65 20 63 6f 2d 72 6f 75 74 69 6e 65 20 79  the co-routine y
1a1f0 69 65 6c 64 73 2e 0a 20 20 20 20 2a 2f 0a 20 20  ields..    */.  
1a200 20 20 63 61 73 65 20 53 52 54 5f 43 6f 72 6f 75    case SRT_Corou
1a210 74 69 6e 65 3a 20 7b 0a 20 20 20 20 20 20 69 66  tine: {.      if
1a220 28 20 70 44 65 73 74 2d 3e 69 53 64 73 74 3d 3d  ( pDest->iSdst==
1a230 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44 65  0 ){.        pDe
1a240 73 74 2d 3e 69 53 64 73 74 20 3d 20 73 71 6c 69  st->iSdst = sqli
1a250 74 65 33 47 65 74 54 65 6d 70 52 61 6e 67 65 28  te3GetTempRange(
1a260 70 50 61 72 73 65 2c 20 70 49 6e 2d 3e 6e 53 64  pParse, pIn->nSd
1a270 73 74 29 3b 0a 20 20 20 20 20 20 20 20 70 44 65  st);.        pDe
1a280 73 74 2d 3e 6e 53 64 73 74 20 3d 20 70 49 6e 2d  st->nSdst = pIn-
1a290 3e 6e 53 64 73 74 3b 0a 20 20 20 20 20 20 7d 0a  >nSdst;.      }.
1a2a0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
1a2b0 72 43 6f 64 65 4d 6f 76 65 28 70 50 61 72 73 65  rCodeMove(pParse
1a2c0 2c 20 70 49 6e 2d 3e 69 53 64 73 74 2c 20 70 44  , pIn->iSdst, pD
1a2d0 65 73 74 2d 3e 69 53 64 73 74 2c 20 70 49 6e 2d  est->iSdst, pIn-
1a2e0 3e 6e 53 64 73 74 29 3b 0a 20 20 20 20 20 20 73  >nSdst);.      s
1a2f0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
1a300 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 70 44  (v, OP_Yield, pD
1a310 65 73 74 2d 3e 69 53 44 50 61 72 6d 29 3b 0a 20  est->iSDParm);. 
1a320 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1a330 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 6e 6f 6e  }..    /* If non
1a340 65 20 6f 66 20 74 68 65 20 61 62 6f 76 65 2c 20  e of the above, 
1a350 74 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74 20  then the result 
1a360 64 65 73 74 69 6e 61 74 69 6f 6e 20 6d 75 73 74  destination must
1a370 20 62 65 0a 20 20 20 20 2a 2a 20 53 52 54 5f 4f   be.    ** SRT_O
1a380 75 74 70 75 74 2e 20 20 54 68 69 73 20 72 6f 75  utput.  This rou
1a390 74 69 6e 65 20 69 73 20 6e 65 76 65 72 20 63 61  tine is never ca
1a3a0 6c 6c 65 64 20 77 69 74 68 20 61 6e 79 20 6f 74  lled with any ot
1a3b0 68 65 72 0a 20 20 20 20 2a 2a 20 64 65 73 74 69  her.    ** desti
1a3c0 6e 61 74 69 6f 6e 20 6f 74 68 65 72 20 74 68 61  nation other tha
1a3d0 6e 20 74 68 65 20 6f 6e 65 73 20 68 61 6e 64 6c  n the ones handl
1a3e0 65 64 20 61 62 6f 76 65 20 6f 72 20 53 52 54 5f  ed above or SRT_
1a3f0 4f 75 74 70 75 74 2e 0a 20 20 20 20 2a 2a 0a 20  Output..    **. 
1a400 20 20 20 2a 2a 20 46 6f 72 20 53 52 54 5f 4f 75     ** For SRT_Ou
1a410 74 70 75 74 2c 20 72 65 73 75 6c 74 73 20 61 72  tput, results ar
1a420 65 20 73 74 6f 72 65 64 20 69 6e 20 61 20 73 65  e stored in a se
1a430 71 75 65 6e 63 65 20 6f 66 20 72 65 67 69 73 74  quence of regist
1a440 65 72 73 2e 20 20 0a 20 20 20 20 2a 2a 20 54 68  ers.  .    ** Th
1a450 65 6e 20 74 68 65 20 4f 50 5f 52 65 73 75 6c 74  en the OP_Result
1a460 52 6f 77 20 6f 70 63 6f 64 65 20 69 73 20 75 73  Row opcode is us
1a470 65 64 20 74 6f 20 63 61 75 73 65 20 73 71 6c 69  ed to cause sqli
1a480 74 65 33 5f 73 74 65 70 28 29 20 74 6f 0a 20 20  te3_step() to.  
1a490 20 20 2a 2a 20 72 65 74 75 72 6e 20 74 68 65 20    ** return the 
1a4a0 6e 65 78 74 20 72 6f 77 20 6f 66 20 72 65 73 75  next row of resu
1a4b0 6c 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64  lt..    */.    d
1a4c0 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20  efault: {.      
1a4d0 61 73 73 65 72 74 28 20 70 44 65 73 74 2d 3e 65  assert( pDest->e
1a4e0 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74  Dest==SRT_Output
1a4f0 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
1a500 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
1a510 50 5f 52 65 73 75 6c 74 52 6f 77 2c 20 70 49 6e  P_ResultRow, pIn
1a520 2d 3e 69 53 64 73 74 2c 20 70 49 6e 2d 3e 6e 53  ->iSdst, pIn->nS
1a530 64 73 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61  dst);.      brea
1a540 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  k;.    }.  }..  
1a550 2f 2a 20 4a 75 6d 70 20 74 6f 20 74 68 65 20 65  /* Jump to the e
1a560 6e 64 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 69  nd of the loop i
1a570 66 20 74 68 65 20 4c 49 4d 49 54 20 69 73 20 72  f the LIMIT is r
1a580 65 61 63 68 65 64 2e 0a 20 20 2a 2f 0a 20 20 69  eached..  */.  i
1a590 66 28 20 70 2d 3e 69 4c 69 6d 69 74 20 29 7b 0a  f( p->iLimit ){.
1a5a0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1a5b0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 44 65 63 72  ddOp2(v, OP_Decr
1a5c0 4a 75 6d 70 5a 65 72 6f 2c 20 70 2d 3e 69 4c 69  JumpZero, p->iLi
1a5d0 6d 69 74 2c 20 69 42 72 65 61 6b 29 3b 20 56 64  mit, iBreak); Vd
1a5e0 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
1a5f0 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74   }..  /* Generat
1a600 65 20 74 68 65 20 73 75 62 72 6f 75 74 69 6e 65  e the subroutine
1a610 20 72 65 74 75 72 6e 0a 20 20 2a 2f 0a 20 20 73   return.  */.  s
1a620 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
1a630 65 4c 61 62 65 6c 28 76 2c 20 69 43 6f 6e 74 69  eLabel(v, iConti
1a640 6e 75 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  nue);.  sqlite3V
1a650 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
1a660 52 65 74 75 72 6e 2c 20 72 65 67 52 65 74 75 72  Return, regRetur
1a670 6e 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 61 64  n);..  return ad
1a680 64 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 74  dr;.}../*.** Alt
1a690 65 72 6e 61 74 69 76 65 20 63 6f 6d 70 6f 75 6e  ernative compoun
1a6a0 64 20 73 65 6c 65 63 74 20 63 6f 64 65 20 67 65  d select code ge
1a6b0 6e 65 72 61 74 6f 72 20 66 6f 72 20 63 61 73 65  nerator for case
1a6c0 73 20 77 68 65 6e 20 74 68 65 72 65 0a 2a 2a 20  s when there.** 
1a6d0 69 73 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63  is an ORDER BY c
1a6e0 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 57 65 20  lause..**.** We 
1a6f0 61 73 73 75 6d 65 20 61 20 71 75 65 72 79 20 6f  assume a query o
1a700 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
1a710 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  form:.**.**     
1a720 20 3c 73 65 6c 65 63 74 41 3e 20 20 3c 6f 70 65   <selectA>  <ope
1a730 72 61 74 6f 72 3e 20 20 3c 73 65 6c 65 63 74 42  rator>  <selectB
1a740 3e 20 20 4f 52 44 45 52 20 42 59 20 3c 6f 72 64  >  ORDER BY <ord
1a750 65 72 62 79 6c 69 73 74 3e 0a 2a 2a 0a 2a 2a 20  erbylist>.**.** 
1a760 3c 6f 70 65 72 61 74 6f 72 3e 20 69 73 20 6f 6e  <operator> is on
1a770 65 20 6f 66 20 55 4e 49 4f 4e 20 41 4c 4c 2c 20  e of UNION ALL, 
1a780 55 4e 49 4f 4e 2c 20 45 58 43 45 50 54 2c 20 6f  UNION, EXCEPT, o
1a790 72 20 49 4e 54 45 52 53 45 43 54 2e 20 20 54 68  r INTERSECT.  Th
1a7a0 65 20 69 64 65 61 0a 2a 2a 20 69 73 20 74 6f 20  e idea.** is to 
1a7b0 63 6f 64 65 20 62 6f 74 68 20 3c 73 65 6c 65 63  code both <selec
1a7c0 74 41 3e 20 61 6e 64 20 3c 73 65 6c 65 63 74 42  tA> and <selectB
1a7d0 3e 20 77 69 74 68 20 74 68 65 20 4f 52 44 45 52  > with the ORDER
1a7e0 20 42 59 20 63 6c 61 75 73 65 20 61 73 0a 2a 2a   BY clause as.**
1a7f0 20 63 6f 2d 72 6f 75 74 69 6e 65 73 2e 20 20 54   co-routines.  T
1a800 68 65 6e 20 72 75 6e 20 74 68 65 20 63 6f 2d 72  hen run the co-r
1a810 6f 75 74 69 6e 65 73 20 69 6e 20 70 61 72 61 6c  outines in paral
1a820 6c 65 6c 20 61 6e 64 20 6d 65 72 67 65 20 74 68  lel and merge th
1a830 65 20 72 65 73 75 6c 74 73 0a 2a 2a 20 69 6e 74  e results.** int
1a840 6f 20 74 68 65 20 6f 75 74 70 75 74 2e 20 20 49  o the output.  I
1a850 6e 20 61 64 64 69 74 69 6f 6e 20 74 6f 20 74 68  n addition to th
1a860 65 20 74 77 6f 20 63 6f 72 6f 75 74 69 6e 65 73  e two coroutines
1a870 20 28 63 61 6c 6c 65 64 20 73 65 6c 65 63 74 41   (called selectA
1a880 20 61 6e 64 0a 2a 2a 20 73 65 6c 65 63 74 42 29   and.** selectB)
1a890 20 74 68 65 72 65 20 61 72 65 20 37 20 73 75 62   there are 7 sub
1a8a0 72 6f 75 74 69 6e 65 73 3a 0a 2a 2a 0a 2a 2a 20  routines:.**.** 
1a8b0 20 20 20 6f 75 74 41 3a 20 20 20 20 4d 6f 76 65     outA:    Move
1a8c0 20 74 68 65 20 6f 75 74 70 75 74 20 6f 66 20 74   the output of t
1a8d0 68 65 20 73 65 6c 65 63 74 41 20 63 6f 72 6f 75  he selectA corou
1a8e0 74 69 6e 65 20 69 6e 74 6f 20 74 68 65 20 6f 75  tine into the ou
1a8f0 74 70 75 74 0a 2a 2a 20 20 20 20 20 20 20 20 20  tput.**         
1a900 20 20 20 20 6f 66 20 74 68 65 20 63 6f 6d 70 6f      of the compo
1a910 75 6e 64 20 71 75 65 72 79 2e 0a 2a 2a 0a 2a 2a  und query..**.**
1a920 20 20 20 20 6f 75 74 42 3a 20 20 20 20 4d 6f 76      outB:    Mov
1a930 65 20 74 68 65 20 6f 75 74 70 75 74 20 6f 66 20  e the output of 
1a940 74 68 65 20 73 65 6c 65 63 74 42 20 63 6f 72 6f  the selectB coro
1a950 75 74 69 6e 65 20 69 6e 74 6f 20 74 68 65 20 6f  utine into the o
1a960 75 74 70 75 74 0a 2a 2a 20 20 20 20 20 20 20 20  utput.**        
1a970 20 20 20 20 20 6f 66 20 74 68 65 20 63 6f 6d 70       of the comp
1a980 6f 75 6e 64 20 71 75 65 72 79 2e 20 20 28 4f 6e  ound query.  (On
1a990 6c 79 20 67 65 6e 65 72 61 74 65 64 20 66 6f 72  ly generated for
1a9a0 20 55 4e 49 4f 4e 20 61 6e 64 0a 2a 2a 20 20 20   UNION and.**   
1a9b0 20 20 20 20 20 20 20 20 20 20 55 4e 49 4f 4e 20            UNION 
1a9c0 41 4c 4c 2e 20 20 45 58 43 45 50 54 20 61 6e 64  ALL.  EXCEPT and
1a9d0 20 49 4e 53 45 52 54 53 45 43 54 20 6e 65 76 65   INSERTSECT neve
1a9e0 72 20 6f 75 74 70 75 74 20 61 20 72 6f 77 20 74  r output a row t
1a9f0 68 61 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  hat.**          
1aa00 20 20 20 61 70 70 65 61 72 73 20 6f 6e 6c 79 20     appears only 
1aa10 69 6e 20 42 2e 29 0a 2a 2a 0a 2a 2a 20 20 20 20  in B.).**.**    
1aa20 41 6c 74 42 3a 20 20 20 20 43 61 6c 6c 65 64 20  AltB:    Called 
1aa30 77 68 65 6e 20 74 68 65 72 65 20 69 73 20 64 61  when there is da
1aa40 74 61 20 66 72 6f 6d 20 62 6f 74 68 20 63 6f 72  ta from both cor
1aa50 6f 75 74 69 6e 65 73 20 61 6e 64 20 41 3c 42 2e  outines and A<B.
1aa60 0a 2a 2a 0a 2a 2a 20 20 20 20 41 65 71 42 3a 20  .**.**    AeqB: 
1aa70 20 20 20 43 61 6c 6c 65 64 20 77 68 65 6e 20 74     Called when t
1aa80 68 65 72 65 20 69 73 20 64 61 74 61 20 66 72 6f  here is data fro
1aa90 6d 20 62 6f 74 68 20 63 6f 72 6f 75 74 69 6e 65  m both coroutine
1aaa0 73 20 61 6e 64 20 41 3d 3d 42 2e 0a 2a 2a 0a 2a  s and A==B..**.*
1aab0 2a 20 20 20 20 41 67 74 42 3a 20 20 20 20 43 61  *    AgtB:    Ca
1aac0 6c 6c 65 64 20 77 68 65 6e 20 74 68 65 72 65 20  lled when there 
1aad0 69 73 20 64 61 74 61 20 66 72 6f 6d 20 62 6f 74  is data from bot
1aae0 68 20 63 6f 72 6f 75 74 69 6e 65 73 20 61 6e 64  h coroutines and
1aaf0 20 41 3e 42 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 45   A>B..**.**    E
1ab00 6f 66 41 3a 20 20 20 20 43 61 6c 6c 65 64 20 77  ofA:    Called w
1ab10 68 65 6e 20 64 61 74 61 20 69 73 20 65 78 68 61  hen data is exha
1ab20 75 73 74 65 64 20 66 72 6f 6d 20 73 65 6c 65 63  usted from selec
1ab30 74 41 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 45 6f 66  tA..**.**    Eof
1ab40 42 3a 20 20 20 20 43 61 6c 6c 65 64 20 77 68 65  B:    Called whe
1ab50 6e 20 64 61 74 61 20 69 73 20 65 78 68 61 75 73  n data is exhaus
1ab60 74 65 64 20 66 72 6f 6d 20 73 65 6c 65 63 74 42  ted from selectB
1ab70 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 6d 70 6c  ..**.** The impl
1ab80 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68  ementation of th
1ab90 65 20 6c 61 74 74 65 72 20 66 69 76 65 20 73 75  e latter five su
1aba0 62 72 6f 75 74 69 6e 65 73 20 64 65 70 65 6e 64  broutines depend
1abb0 20 6f 6e 20 77 68 69 63 68 20 0a 2a 2a 20 3c 6f   on which .** <o
1abc0 70 65 72 61 74 6f 72 3e 20 69 73 20 75 73 65 64  perator> is used
1abd0 3a 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  :.**.**.**      
1abe0 20 20 20 20 20 20 20 55 4e 49 4f 4e 20 41 4c 4c         UNION ALL
1abf0 20 20 20 20 20 20 20 20 20 55 4e 49 4f 4e 20 20           UNION  
1ac00 20 20 20 20 20 20 20 20 20 20 45 58 43 45 50 54            EXCEPT
1ac10 20 20 20 20 20 20 20 20 20 20 49 4e 54 45 52 53            INTERS
1ac20 45 43 54 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ECT.**          
1ac30 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 2d  -------------  -
1ac40 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1ac50 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d    --------------
1ac60 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d    --------------
1ac70 2d 2d 2d 0a 2a 2a 20 20 20 41 6c 74 42 3a 20 20  ---.**   AltB:  
1ac80 20 6f 75 74 41 2c 20 6e 65 78 74 41 20 20 20 20   outA, nextA    
1ac90 20 20 6f 75 74 41 2c 20 6e 65 78 74 41 20 20 20    outA, nextA   
1aca0 20 20 20 20 6f 75 74 41 2c 20 6e 65 78 74 41 20      outA, nextA 
1acb0 20 20 20 20 20 20 20 20 6e 65 78 74 41 0a 2a 2a          nextA.**
1acc0 0a 2a 2a 20 20 20 41 65 71 42 3a 20 20 20 6f 75  .**   AeqB:   ou
1acd0 74 41 2c 20 6e 65 78 74 41 20 20 20 20 20 20 20  tA, nextA       
1ace0 20 20 6e 65 78 74 41 20 20 20 20 20 20 20 20 20    nextA         
1acf0 20 20 20 20 6e 65 78 74 41 20 20 20 20 20 20 20      nextA       
1ad00 20 20 6f 75 74 41 2c 20 6e 65 78 74 41 0a 2a 2a    outA, nextA.**
1ad10 0a 2a 2a 20 20 20 41 67 74 42 3a 20 20 20 6f 75  .**   AgtB:   ou
1ad20 74 42 2c 20 6e 65 78 74 42 20 20 20 20 20 20 6f  tB, nextB      o
1ad30 75 74 42 2c 20 6e 65 78 74 42 20 20 20 20 20 20  utB, nextB      
1ad40 20 20 20 20 6e 65 78 74 42 20 20 20 20 20 20 20      nextB       
1ad50 20 20 20 20 20 6e 65 78 74 42 0a 2a 2a 0a 2a 2a       nextB.**.**
1ad60 20 20 20 45 6f 66 41 3a 20 20 20 6f 75 74 42 2c     EofA:   outB,
1ad70 20 6e 65 78 74 42 20 20 20 20 20 20 6f 75 74 42   nextB      outB
1ad80 2c 20 6e 65 78 74 42 20 20 20 20 20 20 20 20 20  , nextB         
1ad90 20 68 61 6c 74 20 20 20 20 20 20 20 20 20 20 20   halt           
1ada0 20 20 68 61 6c 74 0a 2a 2a 0a 2a 2a 20 20 20 45    halt.**.**   E
1adb0 6f 66 42 3a 20 20 20 6f 75 74 41 2c 20 6e 65 78  ofB:   outA, nex
1adc0 74 41 20 20 20 20 20 20 6f 75 74 41 2c 20 6e 65  tA      outA, ne
1add0 78 74 41 20 20 20 20 20 20 20 6f 75 74 41 2c 20  xtA       outA, 
1ade0 6e 65 78 74 41 20 20 20 20 20 20 20 20 20 68 61  nextA         ha
1adf0 6c 74 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 65 20  lt.**.** In the 
1ae00 41 6c 74 42 2c 20 41 65 71 42 2c 20 61 6e 64 20  AltB, AeqB, and 
1ae10 41 67 74 42 20 73 75 62 72 6f 75 74 69 6e 65 73  AgtB subroutines
1ae20 2c 20 61 6e 20 45 4f 46 20 6f 6e 20 41 20 66 6f  , an EOF on A fo
1ae30 6c 6c 6f 77 69 6e 67 20 6e 65 78 74 41 0a 2a 2a  llowing nextA.**
1ae40 20 63 61 75 73 65 73 20 61 6e 20 69 6d 6d 65 64   causes an immed
1ae50 69 61 74 65 20 6a 75 6d 70 20 74 6f 20 45 6f 66  iate jump to Eof
1ae60 41 20 61 6e 64 20 61 6e 20 45 4f 46 20 6f 6e 20  A and an EOF on 
1ae70 42 20 66 6f 6c 6c 6f 77 69 6e 67 20 6e 65 78 74  B following next
1ae80 42 20 63 61 75 73 65 73 0a 2a 2a 20 61 6e 20 69  B causes.** an i
1ae90 6d 6d 65 64 69 61 74 65 20 6a 75 6d 70 20 74 6f  mmediate jump to
1aea0 20 45 6f 66 42 2e 20 20 57 69 74 68 69 6e 20 45   EofB.  Within E
1aeb0 6f 66 41 20 61 6e 64 20 45 6f 66 42 2c 20 61 6e  ofA and EofB, an
1aec0 64 20 45 4f 46 20 6f 6e 20 65 6e 74 72 79 20 6f  d EOF on entry o
1aed0 72 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 6e  r.** following n
1aee0 65 78 74 58 20 63 61 75 73 65 73 20 61 20 6a 75  extX causes a ju
1aef0 6d 70 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66  mp to the end of
1af00 20 74 68 65 20 73 65 6c 65 63 74 20 70 72 6f 63   the select proc
1af10 65 73 73 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 44 75  essing..**.** Du
1af20 70 6c 69 63 61 74 65 20 72 65 6d 6f 76 61 6c 20  plicate removal 
1af30 69 6e 20 74 68 65 20 55 4e 49 4f 4e 2c 20 45 58  in the UNION, EX
1af40 43 45 50 54 2c 20 61 6e 64 20 49 4e 54 45 52 53  CEPT, and INTERS
1af50 45 43 54 20 63 61 73 65 73 20 69 73 20 68 61 6e  ECT cases is han
1af60 64 6c 65 64 0a 2a 2a 20 77 69 74 68 69 6e 20 74  dled.** within t
1af70 68 65 20 6f 75 74 70 75 74 20 73 75 62 72 6f 75  he output subrou
1af80 74 69 6e 65 2e 20 20 54 68 65 20 72 65 67 50 72  tine.  The regPr
1af90 65 76 20 72 65 67 69 73 74 65 72 20 73 65 74 20  ev register set 
1afa0 68 6f 6c 64 73 20 74 68 65 20 70 72 65 76 69 6f  holds the previo
1afb0 75 73 6c 79 0a 2a 2a 20 6f 75 74 70 75 74 20 76  usly.** output v
1afc0 61 6c 75 65 2e 20 20 41 20 63 6f 6d 70 61 72 69  alue.  A compari
1afd0 73 6f 6e 20 69 73 20 6d 61 64 65 20 61 67 61 69  son is made agai
1afe0 6e 73 74 20 74 68 69 73 20 76 61 6c 75 65 20 61  nst this value a
1aff0 6e 64 20 74 68 65 20 6f 75 74 70 75 74 0a 2a 2a  nd the output.**
1b000 20 69 73 20 73 6b 69 70 70 65 64 20 69 66 20 74   is skipped if t
1b010 68 65 20 6e 65 78 74 20 72 65 73 75 6c 74 73 20  he next results 
1b020 77 6f 75 6c 64 20 62 65 20 74 68 65 20 73 61 6d  would be the sam
1b030 65 20 61 73 20 74 68 65 20 70 72 65 76 69 6f 75  e as the previou
1b040 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 6d 70  s..**.** The imp
1b050 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 70 6c 61 6e  lementation plan
1b060 20 69 73 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74   is to implement
1b070 20 74 68 65 20 74 77 6f 20 63 6f 72 6f 75 74 69   the two corouti
1b080 6e 65 73 20 61 6e 64 20 73 65 76 65 6e 0a 2a 2a  nes and seven.**
1b090 20 73 75 62 72 6f 75 74 69 6e 65 73 20 66 69 72   subroutines fir
1b0a0 73 74 2c 20 74 68 65 6e 20 70 75 74 20 74 68 65  st, then put the
1b0b0 20 63 6f 6e 74 72 6f 6c 20 6c 6f 67 69 63 20 61   control logic a
1b0c0 74 20 74 68 65 20 62 6f 74 74 6f 6d 2e 20 20 4c  t the bottom.  L
1b0d0 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20  ike this:.**.** 
1b0e0 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 49 6e           goto In
1b0f0 69 74 0a 2a 2a 20 20 20 20 20 63 6f 41 3a 20 63  it.**     coA: c
1b100 6f 72 6f 75 74 69 6e 65 20 66 6f 72 20 6c 65 66  oroutine for lef
1b110 74 20 71 75 65 72 79 20 28 41 29 0a 2a 2a 20 20  t query (A).**  
1b120 20 20 20 63 6f 42 3a 20 63 6f 72 6f 75 74 69 6e     coB: coroutin
1b130 65 20 66 6f 72 20 72 69 67 68 74 20 71 75 65 72  e for right quer
1b140 79 20 28 42 29 0a 2a 2a 20 20 20 20 6f 75 74 41  y (B).**    outA
1b150 3a 20 6f 75 74 70 75 74 20 6f 6e 65 20 72 6f 77  : output one row
1b160 20 6f 66 20 41 0a 2a 2a 20 20 20 20 6f 75 74 42   of A.**    outB
1b170 3a 20 6f 75 74 70 75 74 20 6f 6e 65 20 72 6f 77  : output one row
1b180 20 6f 66 20 42 20 28 55 4e 49 4f 4e 20 61 6e 64   of B (UNION and
1b190 20 55 4e 49 4f 4e 20 41 4c 4c 20 6f 6e 6c 79 29   UNION ALL only)
1b1a0 0a 2a 2a 20 20 20 20 45 6f 66 41 3a 20 2e 2e 2e  .**    EofA: ...
1b1b0 0a 2a 2a 20 20 20 20 45 6f 66 42 3a 20 2e 2e 2e  .**    EofB: ...
1b1c0 0a 2a 2a 20 20 20 20 41 6c 74 42 3a 20 2e 2e 2e  .**    AltB: ...
1b1d0 0a 2a 2a 20 20 20 20 41 65 71 42 3a 20 2e 2e 2e  .**    AeqB: ...
1b1e0 0a 2a 2a 20 20 20 20 41 67 74 42 3a 20 2e 2e 2e  .**    AgtB: ...
1b1f0 0a 2a 2a 20 20 20 20 49 6e 69 74 3a 20 69 6e 69  .**    Init: ini
1b200 74 69 61 6c 69 7a 65 20 63 6f 72 6f 75 74 69 6e  tialize coroutin
1b210 65 20 72 65 67 69 73 74 65 72 73 0a 2a 2a 20 20  e registers.**  
1b220 20 20 20 20 20 20 20 20 79 69 65 6c 64 20 63 6f          yield co
1b230 41 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 69 66  A.**          if
1b240 20 65 6f 66 28 41 29 20 67 6f 74 6f 20 45 6f 66   eof(A) goto Eof
1b250 41 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 79 69  A.**          yi
1b260 65 6c 64 20 63 6f 42 0a 2a 2a 20 20 20 20 20 20  eld coB.**      
1b270 20 20 20 20 69 66 20 65 6f 66 28 42 29 20 67 6f      if eof(B) go
1b280 74 6f 20 45 6f 66 42 0a 2a 2a 20 20 20 20 43 6d  to EofB.**    Cm
1b290 70 72 3a 20 43 6f 6d 70 61 72 65 20 41 2c 20 42  pr: Compare A, B
1b2a0 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 4a 75 6d  .**          Jum
1b2b0 70 20 41 6c 74 42 2c 20 41 65 71 42 2c 20 41 67  p AltB, AeqB, Ag
1b2c0 74 42 0a 2a 2a 20 20 20 20 20 45 6e 64 3a 20 2e  tB.**     End: .
1b2d0 2e 2e 0a 2a 2a 0a 2a 2a 20 57 65 20 63 61 6c 6c  ...**.** We call
1b2e0 20 41 6c 74 42 2c 20 41 65 71 42 2c 20 41 67 74   AltB, AeqB, Agt
1b2f0 42 2c 20 45 6f 66 41 2c 20 61 6e 64 20 45 6f 66  B, EofA, and Eof
1b300 42 20 22 73 75 62 72 6f 75 74 69 6e 65 73 22 20  B "subroutines" 
1b310 62 75 74 20 74 68 65 79 20 61 72 65 20 6e 6f 74  but they are not
1b320 0a 2a 2a 20 61 63 74 75 61 6c 6c 79 20 63 61 6c  .** actually cal
1b330 6c 65 64 20 75 73 69 6e 67 20 47 6f 73 75 62 20  led using Gosub 
1b340 61 6e 64 20 74 68 65 79 20 64 6f 20 6e 6f 74 20  and they do not 
1b350 52 65 74 75 72 6e 2e 20 20 45 6f 66 41 20 61 6e  Return.  EofA an
1b360 64 20 45 6f 66 42 20 6c 6f 6f 70 0a 2a 2a 20 75  d EofB loop.** u
1b370 6e 74 69 6c 20 61 6c 6c 20 64 61 74 61 20 69 73  ntil all data is
1b380 20 65 78 68 61 75 73 74 65 64 20 74 68 65 6e 20   exhausted then 
1b390 6a 75 6d 70 20 74 6f 20 74 68 65 20 22 65 6e 64  jump to the "end
1b3a0 22 20 6c 61 62 65 2e 20 20 41 6c 74 42 2c 20 41  " labe.  AltB, A
1b3b0 65 71 42 2c 0a 2a 2a 20 61 6e 64 20 41 67 74 42  eqB,.** and AgtB
1b3c0 20 6a 75 6d 70 20 74 6f 20 65 69 74 68 65 72 20   jump to either 
1b3d0 4c 32 20 6f 72 20 74 6f 20 6f 6e 65 20 6f 66 20  L2 or to one of 
1b3e0 45 6f 66 41 20 6f 72 20 45 6f 66 42 2e 0a 2a 2f  EofA or EofB..*/
1b3f0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1b400 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45  OMIT_COMPOUND_SE
1b410 4c 45 43 54 0a 73 74 61 74 69 63 20 69 6e 74 20  LECT.static int 
1b420 6d 75 6c 74 69 53 65 6c 65 63 74 4f 72 64 65 72  multiSelectOrder
1b430 42 79 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  By(.  Parse *pPa
1b440 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50  rse,        /* P
1b450 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
1b460 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20  /.  Select *p,  
1b470 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
1b480 20 72 69 67 68 74 2d 6d 6f 73 74 20 6f 66 20 53   right-most of S
1b490 45 4c 45 43 54 73 20 74 6f 20 62 65 20 63 6f 64  ELECTs to be cod
1b4a0 65 64 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65  ed */.  SelectDe
1b4b0 73 74 20 2a 70 44 65 73 74 20 20 20 20 20 2f 2a  st *pDest     /*
1b4c0 20 57 68 61 74 20 74 6f 20 64 6f 20 77 69 74 68   What to do with
1b4d0 20 71 75 65 72 79 20 72 65 73 75 6c 74 73 20 2a   query results *
1b4e0 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b  /.){.  int i, j;
1b4f0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1b500 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f  Loop counters */
1b510 0a 20 20 53 65 6c 65 63 74 20 2a 70 50 72 69 6f  .  Select *pPrio
1b520 72 3b 20 20 20 20 20 20 20 2f 2a 20 41 6e 6f 74  r;       /* Anot
1b530 68 65 72 20 53 45 4c 45 43 54 20 69 6d 6d 65 64  her SELECT immed
1b540 69 61 74 65 6c 79 20 74 6f 20 6f 75 72 20 6c 65  iately to our le
1b550 66 74 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b  ft */.  Vdbe *v;
1b560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1b570 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
1b580 6f 20 74 68 69 73 20 56 44 42 45 20 2a 2f 0a 20  o this VDBE */. 
1b590 20 53 65 6c 65 63 74 44 65 73 74 20 64 65 73 74   SelectDest dest
1b5a0 41 3b 20 20 20 20 20 2f 2a 20 44 65 73 74 69 6e  A;     /* Destin
1b5b0 61 74 69 6f 6e 20 66 6f 72 20 63 6f 72 6f 75 74  ation for corout
1b5c0 69 6e 65 20 41 20 2a 2f 0a 20 20 53 65 6c 65 63  ine A */.  Selec
1b5d0 74 44 65 73 74 20 64 65 73 74 42 3b 20 20 20 20  tDest destB;    
1b5e0 20 2f 2a 20 44 65 73 74 69 6e 61 74 69 6f 6e 20   /* Destination 
1b5f0 66 6f 72 20 63 6f 72 6f 75 74 69 6e 65 20 42 20  for coroutine B 
1b600 2a 2f 0a 20 20 69 6e 74 20 72 65 67 41 64 64 72  */.  int regAddr
1b610 41 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64  A;         /* Ad
1b620 64 72 65 73 73 20 72 65 67 69 73 74 65 72 20 66  dress register f
1b630 6f 72 20 73 65 6c 65 63 74 2d 41 20 63 6f 72 6f  or select-A coro
1b640 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 72  utine */.  int r
1b650 65 67 41 64 64 72 42 3b 20 20 20 20 20 20 20 20  egAddrB;        
1b660 20 2f 2a 20 41 64 64 72 65 73 73 20 72 65 67 69   /* Address regi
1b670 73 74 65 72 20 66 6f 72 20 73 65 6c 65 63 74 2d  ster for select-
1b680 42 20 63 6f 72 6f 75 74 69 6e 65 20 2a 2f 0a 20  B coroutine */. 
1b690 20 69 6e 74 20 61 64 64 72 53 65 6c 65 63 74 41   int addrSelectA
1b6a0 3b 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73  ;      /* Addres
1b6b0 73 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74 2d  s of the select-
1b6c0 41 20 63 6f 72 6f 75 74 69 6e 65 20 2a 2f 0a 20  A coroutine */. 
1b6d0 20 69 6e 74 20 61 64 64 72 53 65 6c 65 63 74 42   int addrSelectB
1b6e0 3b 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73  ;      /* Addres
1b6f0 73 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74 2d  s of the select-
1b700 42 20 63 6f 72 6f 75 74 69 6e 65 20 2a 2f 0a 20  B coroutine */. 
1b710 20 69 6e 74 20 72 65 67 4f 75 74 41 3b 20 20 20   int regOutA;   
1b720 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73         /* Addres
1b730 73 20 72 65 67 69 73 74 65 72 20 66 6f 72 20 74  s register for t
1b740 68 65 20 6f 75 74 70 75 74 2d 41 20 73 75 62 72  he output-A subr
1b750 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20  outine */.  int 
1b760 72 65 67 4f 75 74 42 3b 20 20 20 20 20 20 20 20  regOutB;        
1b770 20 20 2f 2a 20 41 64 64 72 65 73 73 20 72 65 67    /* Address reg
1b780 69 73 74 65 72 20 66 6f 72 20 74 68 65 20 6f 75  ister for the ou
1b790 74 70 75 74 2d 42 20 73 75 62 72 6f 75 74 69 6e  tput-B subroutin
1b7a0 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 4f  e */.  int addrO
1b7b0 75 74 41 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  utA;         /* 
1b7c0 41 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 6f  Address of the o
1b7d0 75 74 70 75 74 2d 41 20 73 75 62 72 6f 75 74 69  utput-A subrouti
1b7e0 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72  ne */.  int addr
1b7f0 4f 75 74 42 20 3d 20 30 3b 20 20 20 20 20 2f 2a  OutB = 0;     /*
1b800 20 41 64 64 72 65 73 73 20 6f 66 20 74 68 65 20   Address of the 
1b810 6f 75 74 70 75 74 2d 42 20 73 75 62 72 6f 75 74  output-B subrout
1b820 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64  ine */.  int add
1b830 72 45 6f 66 41 3b 20 20 20 20 20 20 20 20 20 2f  rEofA;         /
1b840 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 68 65  * Address of the
1b850 20 73 65 6c 65 63 74 2d 41 2d 65 78 68 61 75 73   select-A-exhaus
1b860 74 65 64 20 73 75 62 72 6f 75 74 69 6e 65 20 2a  ted subroutine *
1b870 2f 0a 20 20 69 6e 74 20 61 64 64 72 45 6f 66 41  /.  int addrEofA
1b880 5f 6e 6f 42 3b 20 20 20 20 20 2f 2a 20 41 6c 74  _noB;     /* Alt
1b890 65 72 6e 61 74 65 20 61 64 64 72 45 6f 66 41 20  ernate addrEofA 
1b8a0 69 66 20 42 20 69 73 20 75 6e 69 6e 69 74 69 61  if B is uninitia
1b8b0 6c 69 7a 65 64 20 2a 2f 0a 20 20 69 6e 74 20 61  lized */.  int a
1b8c0 64 64 72 45 6f 66 42 3b 20 20 20 20 20 20 20 20  ddrEofB;        
1b8d0 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74   /* Address of t
1b8e0 68 65 20 73 65 6c 65 63 74 2d 42 2d 65 78 68 61  he select-B-exha
1b8f0 75 73 74 65 64 20 73 75 62 72 6f 75 74 69 6e 65  usted subroutine
1b900 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 41 6c   */.  int addrAl
1b910 74 42 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41  tB;         /* A
1b920 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 41 3c  ddress of the A<
1b930 42 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a  B subroutine */.
1b940 20 20 69 6e 74 20 61 64 64 72 41 65 71 42 3b 20    int addrAeqB; 
1b950 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65          /* Addre
1b960 73 73 20 6f 66 20 74 68 65 20 41 3d 3d 42 20 73  ss of the A==B s
1b970 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69  ubroutine */.  i
1b980 6e 74 20 61 64 64 72 41 67 74 42 3b 20 20 20 20  nt addrAgtB;    
1b990 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
1b9a0 6f 66 20 74 68 65 20 41 3e 42 20 73 75 62 72 6f  of the A>B subro
1b9b0 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 72  utine */.  int r
1b9c0 65 67 4c 69 6d 69 74 41 3b 20 20 20 20 20 20 20  egLimitA;       
1b9d0 20 2f 2a 20 4c 69 6d 69 74 20 72 65 67 69 73 74   /* Limit regist
1b9e0 65 72 20 66 6f 72 20 73 65 6c 65 63 74 2d 41 20  er for select-A 
1b9f0 2a 2f 0a 20 20 69 6e 74 20 72 65 67 4c 69 6d 69  */.  int regLimi
1ba00 74 42 3b 20 20 20 20 20 20 20 20 2f 2a 20 4c 69  tB;        /* Li
1ba10 6d 69 74 20 72 65 67 69 73 74 65 72 20 66 6f 72  mit register for
1ba20 20 73 65 6c 65 63 74 2d 41 20 2a 2f 0a 20 20 69   select-A */.  i
1ba30 6e 74 20 72 65 67 50 72 65 76 3b 20 20 20 20 20  nt regPrev;     
1ba40 20 20 20 20 20 2f 2a 20 41 20 72 61 6e 67 65 20       /* A range 
1ba50 6f 66 20 72 65 67 69 73 74 65 72 73 20 74 6f 20  of registers to 
1ba60 68 6f 6c 64 20 70 72 65 76 69 6f 75 73 20 6f 75  hold previous ou
1ba70 74 70 75 74 20 2a 2f 0a 20 20 69 6e 74 20 73 61  tput */.  int sa
1ba80 76 65 64 4c 69 6d 69 74 3b 20 20 20 20 20 20 20  vedLimit;       
1ba90 2f 2a 20 53 61 76 65 64 20 76 61 6c 75 65 20 6f  /* Saved value o
1baa0 66 20 70 2d 3e 69 4c 69 6d 69 74 20 2a 2f 0a 20  f p->iLimit */. 
1bab0 20 69 6e 74 20 73 61 76 65 64 4f 66 66 73 65 74   int savedOffset
1bac0 3b 20 20 20 20 20 20 2f 2a 20 53 61 76 65 64 20  ;      /* Saved 
1bad0 76 61 6c 75 65 20 6f 66 20 70 2d 3e 69 4f 66 66  value of p->iOff
1bae0 73 65 74 20 2a 2f 0a 20 20 69 6e 74 20 6c 61 62  set */.  int lab
1baf0 65 6c 43 6d 70 72 3b 20 20 20 20 20 20 20 20 2f  elCmpr;        /
1bb00 2a 20 4c 61 62 65 6c 20 66 6f 72 20 74 68 65 20  * Label for the 
1bb10 73 74 61 72 74 20 6f 66 20 74 68 65 20 6d 65 72  start of the mer
1bb20 67 65 20 61 6c 67 6f 72 69 74 68 6d 20 2a 2f 0a  ge algorithm */.
1bb30 20 20 69 6e 74 20 6c 61 62 65 6c 45 6e 64 3b 20    int labelEnd; 
1bb40 20 20 20 20 20 20 20 20 2f 2a 20 4c 61 62 65 6c          /* Label
1bb50 20 66 6f 72 20 74 68 65 20 65 6e 64 20 6f 66 20   for the end of 
1bb60 74 68 65 20 6f 76 65 72 61 6c 6c 20 53 45 4c 45  the overall SELE
1bb70 43 54 20 73 74 6d 74 20 2a 2f 0a 20 20 69 6e 74  CT stmt */.  int
1bb80 20 61 64 64 72 31 3b 20 20 20 20 20 20 20 20 20   addr1;         
1bb90 20 20 20 2f 2a 20 4a 75 6d 70 20 69 6e 73 74 72     /* Jump instr
1bba0 75 63 74 69 6f 6e 73 20 74 68 61 74 20 67 65 74  uctions that get
1bbb0 20 72 65 74 61 72 67 65 74 74 65 64 20 2a 2f 0a   retargetted */.
1bbc0 20 20 69 6e 74 20 6f 70 3b 20 20 20 20 20 20 20    int op;       
1bbd0 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f          /* One o
1bbe0 66 20 54 4b 5f 41 4c 4c 2c 20 54 4b 5f 55 4e 49  f TK_ALL, TK_UNI
1bbf0 4f 4e 2c 20 54 4b 5f 45 58 43 45 50 54 2c 20 54  ON, TK_EXCEPT, T
1bc00 4b 5f 49 4e 54 45 52 53 45 43 54 20 2a 2f 0a 20  K_INTERSECT */. 
1bc10 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 44 75   KeyInfo *pKeyDu
1bc20 70 20 3d 20 30 3b 20 2f 2a 20 43 6f 6d 70 61 72  p = 0; /* Compar
1bc30 69 73 6f 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  ison information
1bc40 20 66 6f 72 20 64 75 70 6c 69 63 61 74 65 20 72   for duplicate r
1bc50 65 6d 6f 76 61 6c 20 2a 2f 0a 20 20 4b 65 79 49  emoval */.  KeyI
1bc60 6e 66 6f 20 2a 70 4b 65 79 4d 65 72 67 65 3b 20  nfo *pKeyMerge; 
1bc70 20 20 2f 2a 20 43 6f 6d 70 61 72 69 73 6f 6e 20    /* Comparison 
1bc80 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20  information for 
1bc90 6d 65 72 67 69 6e 67 20 72 6f 77 73 20 2a 2f 0a  merging rows */.
1bca0 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 20 20    sqlite3 *db;  
1bcb0 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62          /* Datab
1bcc0 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a  ase connection *
1bcd0 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f  /.  ExprList *pO
1bce0 72 64 65 72 42 79 3b 20 20 20 2f 2a 20 54 68 65  rderBy;   /* The
1bcf0 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
1bd00 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f 72 64 65 72   */.  int nOrder
1bd10 42 79 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  By;         /* N
1bd20 75 6d 62 65 72 20 6f 66 20 74 65 72 6d 73 20 69  umber of terms i
1bd30 6e 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63  n the ORDER BY c
1bd40 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 2a  lause */.  int *
1bd50 61 50 65 72 6d 75 74 65 3b 20 20 20 20 20 20 20  aPermute;       
1bd60 20 2f 2a 20 4d 61 70 70 69 6e 67 20 66 72 6f 6d   /* Mapping from
1bd70 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d 73 20   ORDER BY terms 
1bd80 74 6f 20 72 65 73 75 6c 74 20 73 65 74 20 63 6f  to result set co
1bd90 6c 75 6d 6e 73 20 2a 2f 0a 0a 20 20 61 73 73 65  lumns */..  asse
1bda0 72 74 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 21  rt( p->pOrderBy!
1bdb0 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
1bdc0 70 4b 65 79 44 75 70 3d 3d 30 20 29 3b 20 2f 2a  pKeyDup==0 ); /*
1bdd0 20 22 4d 61 6e 61 67 65 64 22 20 63 6f 64 65 20   "Managed" code 
1bde0 6e 65 65 64 73 20 74 68 69 73 2e 20 20 54 69 63  needs this.  Tic
1bdf0 6b 65 74 20 23 33 33 38 32 2e 20 2a 2f 0a 20 20  ket #3382. */.  
1be00 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
1be10 0a 20 20 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  .  v = pParse->p
1be20 56 64 62 65 3b 0a 20 20 61 73 73 65 72 74 28 20  Vdbe;.  assert( 
1be30 76 21 3d 30 20 29 3b 20 20 20 20 20 20 20 2f 2a  v!=0 );       /*
1be40 20 41 6c 72 65 61 64 79 20 74 68 72 6f 77 6e 20   Already thrown 
1be50 74 68 65 20 65 72 72 6f 72 20 69 66 20 56 44 42  the error if VDB
1be60 45 20 61 6c 6c 6f 63 20 66 61 69 6c 65 64 20 2a  E alloc failed *
1be70 2f 0a 20 20 6c 61 62 65 6c 45 6e 64 20 3d 20 73  /.  labelEnd = s
1be80 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
1be90 62 65 6c 28 76 29 3b 0a 20 20 6c 61 62 65 6c 43  bel(v);.  labelC
1bea0 6d 70 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62  mpr = sqlite3Vdb
1beb0 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 0a  eMakeLabel(v);..
1bec0 0a 20 20 2f 2a 20 50 61 74 63 68 20 75 70 20 74  .  /* Patch up t
1bed0 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
1bee0 73 65 0a 20 20 2a 2f 0a 20 20 6f 70 20 3d 20 70  se.  */.  op = p
1bef0 2d 3e 6f 70 3b 20 20 0a 20 20 70 50 72 69 6f 72  ->op;  .  pPrior
1bf00 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20   = p->pPrior;.  
1bf10 61 73 73 65 72 74 28 20 70 50 72 69 6f 72 2d 3e  assert( pPrior->
1bf20 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 3b 0a 20  pOrderBy==0 );. 
1bf30 20 70 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e 70   pOrderBy = p->p
1bf40 4f 72 64 65 72 42 79 3b 0a 20 20 61 73 73 65 72  OrderBy;.  asser
1bf50 74 28 20 70 4f 72 64 65 72 42 79 20 29 3b 0a 20  t( pOrderBy );. 
1bf60 20 6e 4f 72 64 65 72 42 79 20 3d 20 70 4f 72 64   nOrderBy = pOrd
1bf70 65 72 42 79 2d 3e 6e 45 78 70 72 3b 0a 0a 20 20  erBy->nExpr;..  
1bf80 2f 2a 20 46 6f 72 20 6f 70 65 72 61 74 6f 72 73  /* For operators
1bf90 20 6f 74 68 65 72 20 74 68 61 6e 20 55 4e 49 4f   other than UNIO
1bfa0 4e 20 41 4c 4c 20 77 65 20 68 61 76 65 20 74 6f  N ALL we have to
1bfb0 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 0a   make sure that.
1bfc0 20 20 2a 2a 20 74 68 65 20 4f 52 44 45 52 20 42    ** the ORDER B
1bfd0 59 20 63 6c 61 75 73 65 20 63 6f 76 65 72 73 20  Y clause covers 
1bfe0 65 76 65 72 79 20 74 65 72 6d 20 6f 66 20 74 68  every term of th
1bff0 65 20 72 65 73 75 6c 74 20 73 65 74 2e 20 20 41  e result set.  A
1c000 64 64 0a 20 20 2a 2a 20 74 65 72 6d 73 20 74 6f  dd.  ** terms to
1c010 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   the ORDER BY cl
1c020 61 75 73 65 20 61 73 20 6e 65 63 65 73 73 61 72  ause as necessar
1c030 79 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6f 70  y..  */.  if( op
1c040 21 3d 54 4b 5f 41 4c 4c 20 29 7b 0a 20 20 20 20  !=TK_ALL ){.    
1c050 66 6f 72 28 69 3d 31 3b 20 64 62 2d 3e 6d 61 6c  for(i=1; db->mal
1c060 6c 6f 63 46 61 69 6c 65 64 3d 3d 30 20 26 26 20  locFailed==0 && 
1c070 69 3c 3d 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45  i<=p->pEList->nE
1c080 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  xpr; i++){.     
1c090 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74   struct ExprList
1c0a0 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20  _item *pItem;.  
1c0b0 20 20 20 20 66 6f 72 28 6a 3d 30 2c 20 70 49 74      for(j=0, pIt
1c0c0 65 6d 3d 70 4f 72 64 65 72 42 79 2d 3e 61 3b 20  em=pOrderBy->a; 
1c0d0 6a 3c 6e 4f 72 64 65 72 42 79 3b 20 6a 2b 2b 2c  j<nOrderBy; j++,
1c0e0 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20   pItem++){.     
1c0f0 20 20 20 61 73 73 65 72 74 28 20 70 49 74 65 6d     assert( pItem
1c100 2d 3e 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f  ->u.x.iOrderByCo
1c110 6c 3e 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69  l>0 );.        i
1c120 66 28 20 70 49 74 65 6d 2d 3e 75 2e 78 2e 69 4f  f( pItem->u.x.iO
1c130 72 64 65 72 42 79 43 6f 6c 3d 3d 69 20 29 20 62  rderByCol==i ) b
1c140 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
1c150 20 20 20 20 69 66 28 20 6a 3d 3d 6e 4f 72 64 65      if( j==nOrde
1c160 72 42 79 20 29 7b 0a 20 20 20 20 20 20 20 20 45  rBy ){.        E
1c170 78 70 72 20 2a 70 4e 65 77 20 3d 20 73 71 6c 69  xpr *pNew = sqli
1c180 74 65 33 45 78 70 72 28 64 62 2c 20 54 4b 5f 49  te3Expr(db, TK_I
1c190 4e 54 45 47 45 52 2c 20 30 29 3b 0a 20 20 20 20  NTEGER, 0);.    
1c1a0 20 20 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20      if( pNew==0 
1c1b0 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
1c1c0 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20  NOMEM_BKPT;.    
1c1d0 20 20 20 20 70 4e 65 77 2d 3e 66 6c 61 67 73 20      pNew->flags 
1c1e0 7c 3d 20 45 50 5f 49 6e 74 56 61 6c 75 65 3b 0a  |= EP_IntValue;.
1c1f0 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e          pNew->u.
1c200 69 56 61 6c 75 65 20 3d 20 69 3b 0a 20 20 20 20  iValue = i;.    
1c210 20 20 20 20 70 2d 3e 70 4f 72 64 65 72 42 79 20      p->pOrderBy 
1c220 3d 20 70 4f 72 64 65 72 42 79 20 3d 20 73 71 6c  = pOrderBy = sql
1c230 69 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65  ite3ExprListAppe
1c240 6e 64 28 70 50 61 72 73 65 2c 20 70 4f 72 64 65  nd(pParse, pOrde
1c250 72 42 79 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20  rBy, pNew);.    
1c260 20 20 20 20 69 66 28 20 70 4f 72 64 65 72 42 79      if( pOrderBy
1c270 20 29 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 6e   ) pOrderBy->a[n
1c280 4f 72 64 65 72 42 79 2b 2b 5d 2e 75 2e 78 2e 69  OrderBy++].u.x.i
1c290 4f 72 64 65 72 42 79 43 6f 6c 20 3d 20 28 75 31  OrderByCol = (u1
1c2a0 36 29 69 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  6)i;.      }.   
1c2b0 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6d   }.  }..  /* Com
1c2c0 70 75 74 65 20 74 68 65 20 63 6f 6d 70 61 72 69  pute the compari
1c2d0 73 6f 6e 20 70 65 72 6d 75 74 61 74 69 6f 6e 20  son permutation 
1c2e0 61 6e 64 20 6b 65 79 69 6e 66 6f 20 74 68 61 74  and keyinfo that
1c2f0 20 69 73 20 75 73 65 64 20 77 69 74 68 0a 20 20   is used with.  
1c300 2a 2a 20 74 68 65 20 70 65 72 6d 75 74 61 74 69  ** the permutati
1c310 6f 6e 20 75 73 65 64 20 74 6f 20 64 65 74 65 72  on used to deter
1c320 6d 69 6e 65 20 69 66 20 74 68 65 20 6e 65 78 74  mine if the next
1c330 0a 20 20 2a 2a 20 72 6f 77 20 6f 66 20 72 65 73  .  ** row of res
1c340 75 6c 74 73 20 63 6f 6d 65 73 20 66 72 6f 6d 20  ults comes from 
1c350 73 65 6c 65 63 74 41 20 6f 72 20 73 65 6c 65 63  selectA or selec
1c360 74 42 2e 20 20 41 6c 73 6f 20 61 64 64 20 65 78  tB.  Also add ex
1c370 70 6c 69 63 69 74 0a 20 20 2a 2a 20 63 6f 6c 6c  plicit.  ** coll
1c380 61 74 69 6f 6e 73 20 74 6f 20 74 68 65 20 4f 52  ations to the OR
1c390 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 74 65  DER BY clause te
1c3a0 72 6d 73 20 73 6f 20 74 68 61 74 20 77 68 65 6e  rms so that when
1c3b0 20 74 68 65 20 73 75 62 71 75 65 72 69 65 73 0a   the subqueries.
1c3c0 20 20 2a 2a 20 74 6f 20 74 68 65 20 72 69 67 68    ** to the righ
1c3d0 74 20 61 6e 64 20 74 68 65 20 6c 65 66 74 20 61  t and the left a
1c3e0 72 65 20 65 76 61 6c 75 61 74 65 64 2c 20 74 68  re evaluated, th
1c3f0 65 79 20 75 73 65 20 74 68 65 20 63 6f 72 72 65  ey use the corre
1c400 63 74 0a 20 20 2a 2a 20 63 6f 6c 6c 61 74 69 6f  ct.  ** collatio
1c410 6e 2e 0a 20 20 2a 2f 0a 20 20 61 50 65 72 6d 75  n..  */.  aPermu
1c420 74 65 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  te = sqlite3DbMa
1c430 6c 6c 6f 63 52 61 77 4e 4e 28 64 62 2c 20 73 69  llocRawNN(db, si
1c440 7a 65 6f 66 28 69 6e 74 29 2a 28 6e 4f 72 64 65  zeof(int)*(nOrde
1c450 72 42 79 20 2b 20 31 29 29 3b 0a 20 20 69 66 28  rBy + 1));.  if(
1c460 20 61 50 65 72 6d 75 74 65 20 29 7b 0a 20 20 20   aPermute ){.   
1c470 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74   struct ExprList
1c480 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20  _item *pItem;.  
1c490 20 20 61 50 65 72 6d 75 74 65 5b 30 5d 20 3d 20    aPermute[0] = 
1c4a0 6e 4f 72 64 65 72 42 79 3b 0a 20 20 20 20 66 6f  nOrderBy;.    fo
1c4b0 72 28 69 3d 31 2c 20 70 49 74 65 6d 3d 70 4f 72  r(i=1, pItem=pOr
1c4c0 64 65 72 42 79 2d 3e 61 3b 20 69 3c 3d 6e 4f 72  derBy->a; i<=nOr
1c4d0 64 65 72 42 79 3b 20 69 2b 2b 2c 20 70 49 74 65  derBy; i++, pIte
1c4e0 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 61 73 73 65  m++){.      asse
1c4f0 72 74 28 20 70 49 74 65 6d 2d 3e 75 2e 78 2e 69  rt( pItem->u.x.i
1c500 4f 72 64 65 72 42 79 43 6f 6c 3e 30 20 29 3b 0a  OrderByCol>0 );.
1c510 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49        assert( pI
1c520 74 65 6d 2d 3e 75 2e 78 2e 69 4f 72 64 65 72 42  tem->u.x.iOrderB
1c530 79 43 6f 6c 3c 3d 70 2d 3e 70 45 4c 69 73 74 2d  yCol<=p->pEList-
1c540 3e 6e 45 78 70 72 20 29 3b 0a 20 20 20 20 20 20  >nExpr );.      
1c550 61 50 65 72 6d 75 74 65 5b 69 5d 20 3d 20 70 49  aPermute[i] = pI
1c560 74 65 6d 2d 3e 75 2e 78 2e 69 4f 72 64 65 72 42  tem->u.x.iOrderB
1c570 79 43 6f 6c 20 2d 20 31 3b 0a 20 20 20 20 7d 0a  yCol - 1;.    }.
1c580 20 20 20 20 70 4b 65 79 4d 65 72 67 65 20 3d 20      pKeyMerge = 
1c590 6d 75 6c 74 69 53 65 6c 65 63 74 4f 72 64 65 72  multiSelectOrder
1c5a0 42 79 4b 65 79 49 6e 66 6f 28 70 50 61 72 73 65  ByKeyInfo(pParse
1c5b0 2c 20 70 2c 20 31 29 3b 0a 20 20 7d 65 6c 73 65  , p, 1);.  }else
1c5c0 7b 0a 20 20 20 20 70 4b 65 79 4d 65 72 67 65 20  {.    pKeyMerge 
1c5d0 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52  = 0;.  }..  /* R
1c5e0 65 61 74 74 61 63 68 20 74 68 65 20 4f 52 44 45  eattach the ORDE
1c5f0 52 20 42 59 20 63 6c 61 75 73 65 20 74 6f 20 74  R BY clause to t
1c600 68 65 20 71 75 65 72 79 2e 0a 20 20 2a 2f 0a 20  he query..  */. 
1c610 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 70   p->pOrderBy = p
1c620 4f 72 64 65 72 42 79 3b 0a 20 20 70 50 72 69 6f  OrderBy;.  pPrio
1c630 72 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 73 71  r->pOrderBy = sq
1c640 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70  lite3ExprListDup
1c650 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 4f 72  (pParse->db, pOr
1c660 64 65 72 42 79 2c 20 30 29 3b 0a 0a 20 20 2f 2a  derBy, 0);..  /*
1c670 20 41 6c 6c 6f 63 61 74 65 20 61 20 72 61 6e 67   Allocate a rang
1c680 65 20 6f 66 20 74 65 6d 70 6f 72 61 72 79 20 72  e of temporary r
1c690 65 67 69 73 74 65 72 73 20 61 6e 64 20 74 68 65  egisters and the
1c6a0 20 4b 65 79 49 6e 66 6f 20 6e 65 65 64 65 64 0a   KeyInfo needed.
1c6b0 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 6c 6f 67    ** for the log
1c6c0 69 63 20 74 68 61 74 20 72 65 6d 6f 76 65 73 20  ic that removes 
1c6d0 64 75 70 6c 69 63 61 74 65 20 72 65 73 75 6c 74  duplicate result
1c6e0 20 72 6f 77 73 20 77 68 65 6e 20 74 68 65 0a 20   rows when the. 
1c6f0 20 2a 2a 20 6f 70 65 72 61 74 6f 72 20 69 73 20   ** operator is 
1c700 55 4e 49 4f 4e 2c 20 45 58 43 45 50 54 2c 20 6f  UNION, EXCEPT, o
1c710 72 20 49 4e 54 45 52 53 45 43 54 20 28 62 75 74  r INTERSECT (but
1c720 20 6e 6f 74 20 55 4e 49 4f 4e 20 41 4c 4c 29 2e   not UNION ALL).
1c730 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6f 70 3d 3d  .  */.  if( op==
1c740 54 4b 5f 41 4c 4c 20 29 7b 0a 20 20 20 20 72 65  TK_ALL ){.    re
1c750 67 50 72 65 76 20 3d 20 30 3b 0a 20 20 7d 65 6c  gPrev = 0;.  }el
1c760 73 65 7b 0a 20 20 20 20 69 6e 74 20 6e 45 78 70  se{.    int nExp
1c770 72 20 3d 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e  r = p->pEList->n
1c780 45 78 70 72 3b 0a 20 20 20 20 61 73 73 65 72 74  Expr;.    assert
1c790 28 20 6e 4f 72 64 65 72 42 79 3e 3d 6e 45 78 70  ( nOrderBy>=nExp
1c7a0 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  r || db->mallocF
1c7b0 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 72 65 67  ailed );.    reg
1c7c0 50 72 65 76 20 3d 20 70 50 61 72 73 65 2d 3e 6e  Prev = pParse->n
1c7d0 4d 65 6d 2b 31 3b 0a 20 20 20 20 70 50 61 72 73  Mem+1;.    pPars
1c7e0 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 45 78 70 72  e->nMem += nExpr
1c7f0 2b 31 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  +1;.    sqlite3V
1c800 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
1c810 49 6e 74 65 67 65 72 2c 20 30 2c 20 72 65 67 50  Integer, 0, regP
1c820 72 65 76 29 3b 0a 20 20 20 20 70 4b 65 79 44 75  rev);.    pKeyDu
1c830 70 20 3d 20 73 71 6c 69 74 65 33 4b 65 79 49 6e  p = sqlite3KeyIn
1c840 66 6f 41 6c 6c 6f 63 28 64 62 2c 20 6e 45 78 70  foAlloc(db, nExp
1c850 72 2c 20 31 29 3b 0a 20 20 20 20 69 66 28 20 70  r, 1);.    if( p
1c860 4b 65 79 44 75 70 20 29 7b 0a 20 20 20 20 20 20  KeyDup ){.      
1c870 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 4b  assert( sqlite3K
1c880 65 79 49 6e 66 6f 49 73 57 72 69 74 65 61 62 6c  eyInfoIsWriteabl
1c890 65 28 70 4b 65 79 44 75 70 29 20 29 3b 0a 20 20  e(pKeyDup) );.  
1c8a0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
1c8b0 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Expr; i++){.    
1c8c0 20 20 20 20 70 4b 65 79 44 75 70 2d 3e 61 43 6f      pKeyDup->aCo
1c8d0 6c 6c 5b 69 5d 20 3d 20 6d 75 6c 74 69 53 65 6c  ll[i] = multiSel
1c8e0 65 63 74 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  ectCollSeq(pPars
1c8f0 65 2c 20 70 2c 20 69 29 3b 0a 20 20 20 20 20 20  e, p, i);.      
1c900 20 20 70 4b 65 79 44 75 70 2d 3e 61 53 6f 72 74    pKeyDup->aSort
1c910 4f 72 64 65 72 5b 69 5d 20 3d 20 30 3b 0a 20 20  Order[i] = 0;.  
1c920 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
1c930 20 0a 20 20 2f 2a 20 53 65 70 61 72 61 74 65 20   .  /* Separate 
1c940 74 68 65 20 6c 65 66 74 20 61 6e 64 20 74 68 65  the left and the
1c950 20 72 69 67 68 74 20 71 75 65 72 79 20 66 72 6f   right query fro
1c960 6d 20 6f 6e 65 20 61 6e 6f 74 68 65 72 0a 20 20  m one another.  
1c970 2a 2f 0a 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d  */.  p->pPrior =
1c980 20 30 3b 0a 20 20 70 50 72 69 6f 72 2d 3e 70 4e   0;.  pPrior->pN
1c990 65 78 74 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74  ext = 0;.  sqlit
1c9a0 65 33 52 65 73 6f 6c 76 65 4f 72 64 65 72 47 72  e3ResolveOrderGr
1c9b0 6f 75 70 42 79 28 70 50 61 72 73 65 2c 20 70 2c  oupBy(pParse, p,
1c9c0 20 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20 22 4f   p->pOrderBy, "O
1c9d0 52 44 45 52 22 29 3b 0a 20 20 69 66 28 20 70 50  RDER");.  if( pP
1c9e0 72 69 6f 72 2d 3e 70 50 72 69 6f 72 3d 3d 30 20  rior->pPrior==0 
1c9f0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65  ){.    sqlite3Re
1ca00 73 6f 6c 76 65 4f 72 64 65 72 47 72 6f 75 70 42  solveOrderGroupB
1ca10 79 28 70 50 61 72 73 65 2c 20 70 50 72 69 6f 72  y(pParse, pPrior
1ca20 2c 20 70 50 72 69 6f 72 2d 3e 70 4f 72 64 65 72  , pPrior->pOrder
1ca30 42 79 2c 20 22 4f 52 44 45 52 22 29 3b 0a 20 20  By, "ORDER");.  
1ca40 7d 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20  }..  /* Compute 
1ca50 74 68 65 20 6c 69 6d 69 74 20 72 65 67 69 73 74  the limit regist
1ca60 65 72 73 20 2a 2f 0a 20 20 63 6f 6d 70 75 74 65  ers */.  compute
1ca70 4c 69 6d 69 74 52 65 67 69 73 74 65 72 73 28 70  LimitRegisters(p
1ca80 50 61 72 73 65 2c 20 70 2c 20 6c 61 62 65 6c 45  Parse, p, labelE
1ca90 6e 64 29 3b 0a 20 20 69 66 28 20 70 2d 3e 69 4c  nd);.  if( p->iL
1caa0 69 6d 69 74 20 26 26 20 6f 70 3d 3d 54 4b 5f 41  imit && op==TK_A
1cab0 4c 4c 20 29 7b 0a 20 20 20 20 72 65 67 4c 69 6d  LL ){.    regLim
1cac0 69 74 41 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  itA = ++pParse->
1cad0 6e 4d 65 6d 3b 0a 20 20 20 20 72 65 67 4c 69 6d  nMem;.    regLim
1cae0 69 74 42 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  itB = ++pParse->
1caf0 6e 4d 65 6d 3b 0a 20 20 20 20 73 71 6c 69 74 65  nMem;.    sqlite
1cb00 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
1cb10 50 5f 43 6f 70 79 2c 20 70 2d 3e 69 4f 66 66 73  P_Copy, p->iOffs
1cb20 65 74 20 3f 20 70 2d 3e 69 4f 66 66 73 65 74 2b  et ? p->iOffset+
1cb30 31 20 3a 20 70 2d 3e 69 4c 69 6d 69 74 2c 0a 20  1 : p->iLimit,. 
1cb40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cb50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cb60 20 72 65 67 4c 69 6d 69 74 41 29 3b 0a 20 20 20   regLimitA);.   
1cb70 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1cb80 70 32 28 76 2c 20 4f 50 5f 43 6f 70 79 2c 20 72  p2(v, OP_Copy, r
1cb90 65 67 4c 69 6d 69 74 41 2c 20 72 65 67 4c 69 6d  egLimitA, regLim
1cba0 69 74 42 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  itB);.  }else{. 
1cbb0 20 20 20 72 65 67 4c 69 6d 69 74 41 20 3d 20 72     regLimitA = r
1cbc0 65 67 4c 69 6d 69 74 42 20 3d 20 30 3b 0a 20 20  egLimitB = 0;.  
1cbd0 7d 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 44  }.  sqlite3ExprD
1cbe0 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 4c 69  elete(db, p->pLi
1cbf0 6d 69 74 29 3b 0a 20 20 70 2d 3e 70 4c 69 6d 69  mit);.  p->pLimi
1cc00 74 20 3d 20 30 3b 0a 0a 20 20 72 65 67 41 64 64  t = 0;..  regAdd
1cc10 72 41 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  rA = ++pParse->n
1cc20 4d 65 6d 3b 0a 20 20 72 65 67 41 64 64 72 42 20  Mem;.  regAddrB 
1cc30 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
1cc40 3b 0a 20 20 72 65 67 4f 75 74 41 20 3d 20 2b 2b  ;.  regOutA = ++
1cc50 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
1cc60 72 65 67 4f 75 74 42 20 3d 20 2b 2b 70 50 61 72  regOutB = ++pPar
1cc70 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 73 71 6c 69  se->nMem;.  sqli
1cc80 74 65 33 53 65 6c 65 63 74 44 65 73 74 49 6e 69  te3SelectDestIni
1cc90 74 28 26 64 65 73 74 41 2c 20 53 52 54 5f 43 6f  t(&destA, SRT_Co
1cca0 72 6f 75 74 69 6e 65 2c 20 72 65 67 41 64 64 72  routine, regAddr
1ccb0 41 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c  A);.  sqlite3Sel
1ccc0 65 63 74 44 65 73 74 49 6e 69 74 28 26 64 65 73  ectDestInit(&des
1ccd0 74 42 2c 20 53 52 54 5f 43 6f 72 6f 75 74 69 6e  tB, SRT_Coroutin
1cce0 65 2c 20 72 65 67 41 64 64 72 42 29 3b 0a 0a 20  e, regAddrB);.. 
1ccf0 20 45 78 70 6c 61 69 6e 51 75 65 72 79 50 6c 61   ExplainQueryPla
1cd00 6e 28 28 70 50 61 72 73 65 2c 20 31 2c 20 22 4d  n((pParse, 1, "M
1cd10 45 52 47 45 20 28 25 73 29 22 2c 20 73 65 6c 65  ERGE (%s)", sele
1cd20 63 74 4f 70 4e 61 6d 65 28 70 2d 3e 6f 70 29 29  ctOpName(p->op))
1cd30 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74  );..  /* Generat
1cd40 65 20 61 20 63 6f 72 6f 75 74 69 6e 65 20 74 6f  e a coroutine to
1cd50 20 65 76 61 6c 75 61 74 65 20 74 68 65 20 53 45   evaluate the SE
1cd60 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 74  LECT statement t
1cd70 6f 20 74 68 65 0a 20 20 2a 2a 20 6c 65 66 74 20  o the.  ** left 
1cd80 6f 66 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20  of the compound 
1cd90 6f 70 65 72 61 74 6f 72 20 2d 20 74 68 65 20 22  operator - the "
1cda0 41 22 20 73 65 6c 65 63 74 2e 0a 20 20 2a 2f 0a  A" select..  */.
1cdb0 20 20 61 64 64 72 53 65 6c 65 63 74 41 20 3d 20    addrSelectA = 
1cdc0 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
1cdd0 6e 74 41 64 64 72 28 76 29 20 2b 20 31 3b 0a 20  ntAddr(v) + 1;. 
1cde0 20 61 64 64 72 31 20 3d 20 73 71 6c 69 74 65 33   addr1 = sqlite3
1cdf0 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
1ce00 5f 49 6e 69 74 43 6f 72 6f 75 74 69 6e 65 2c 20  _InitCoroutine, 
1ce10 72 65 67 41 64 64 72 41 2c 20 30 2c 20 61 64 64  regAddrA, 0, add
1ce20 72 53 65 6c 65 63 74 41 29 3b 0a 20 20 56 64 62  rSelectA);.  Vdb
1ce30 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 6c 65  eComment((v, "le
1ce40 66 74 20 53 45 4c 45 43 54 22 29 29 3b 0a 20 20  ft SELECT"));.  
1ce50 70 50 72 69 6f 72 2d 3e 69 4c 69 6d 69 74 20 3d  pPrior->iLimit =
1ce60 20 72 65 67 4c 69 6d 69 74 41 3b 0a 20 20 45 78   regLimitA;.  Ex
1ce70 70 6c 61 69 6e 51 75 65 72 79 50 6c 61 6e 28 28  plainQueryPlan((
1ce80 70 50 61 72 73 65 2c 20 31 2c 20 22 4c 45 46 54  pParse, 1, "LEFT
1ce90 22 29 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 65  "));.  sqlite3Se
1cea0 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 50 72  lect(pParse, pPr
1ceb0 69 6f 72 2c 20 26 64 65 73 74 41 29 3b 0a 20 20  ior, &destA);.  
1cec0 73 71 6c 69 74 65 33 56 64 62 65 45 6e 64 43 6f  sqlite3VdbeEndCo
1ced0 72 6f 75 74 69 6e 65 28 76 2c 20 72 65 67 41 64  routine(v, regAd
1cee0 64 72 41 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  drA);.  sqlite3V
1cef0 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61  dbeJumpHere(v, a
1cf00 64 64 72 31 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e  ddr1);..  /* Gen
1cf10 65 72 61 74 65 20 61 20 63 6f 72 6f 75 74 69 6e  erate a coroutin
1cf20 65 20 74 6f 20 65 76 61 6c 75 61 74 65 20 74 68  e to evaluate th
1cf30 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  e SELECT stateme
1cf40 6e 74 20 6f 6e 20 0a 20 20 2a 2a 20 74 68 65 20  nt on .  ** the 
1cf50 72 69 67 68 74 20 2d 20 74 68 65 20 22 42 22 20  right - the "B" 
1cf60 73 65 6c 65 63 74 0a 20 20 2a 2f 0a 20 20 61 64  select.  */.  ad
1cf70 64 72 53 65 6c 65 63 74 42 20 3d 20 73 71 6c 69  drSelectB = sqli
1cf80 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
1cf90 64 72 28 76 29 20 2b 20 31 3b 0a 20 20 61 64 64  dr(v) + 1;.  add
1cfa0 72 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  r1 = sqlite3Vdbe
1cfb0 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 69  AddOp3(v, OP_Ini
1cfc0 74 43 6f 72 6f 75 74 69 6e 65 2c 20 72 65 67 41  tCoroutine, regA
1cfd0 64 64 72 42 2c 20 30 2c 20 61 64 64 72 53 65 6c  ddrB, 0, addrSel
1cfe0 65 63 74 42 29 3b 0a 20 20 56 64 62 65 43 6f 6d  ectB);.  VdbeCom
1cff0 6d 65 6e 74 28 28 76 2c 20 22 72 69 67 68 74 20  ment((v, "right 
1d000 53 45 4c 45 43 54 22 29 29 3b 0a 20 20 73 61 76  SELECT"));.  sav
1d010 65 64 4c 69 6d 69 74 20 3d 20 70 2d 3e 69 4c 69  edLimit = p->iLi
1d020 6d 69 74 3b 0a 20 20 73 61 76 65 64 4f 66 66 73  mit;.  savedOffs
1d030 65 74 20 3d 20 70 2d 3e 69 4f 66 66 73 65 74 3b  et = p->iOffset;
1d040 0a 20 20 70 2d 3e 69 4c 69 6d 69 74 20 3d 20 72  .  p->iLimit = r
1d050 65 67 4c 69 6d 69 74 42 3b 0a 20 20 70 2d 3e 69  egLimitB;.  p->i
1d060 4f 66 66 73 65 74 20 3d 20 30 3b 20 20 0a 20 20  Offset = 0;  .  
1d070 45 78 70 6c 61 69 6e 51 75 65 72 79 50 6c 61 6e  ExplainQueryPlan
1d080 28 28 70 50 61 72 73 65 2c 20 31 2c 20 22 52 49  ((pParse, 1, "RI
1d090 47 48 54 22 29 29 3b 0a 20 20 73 71 6c 69 74 65  GHT"));.  sqlite
1d0a0 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20  3Select(pParse, 
1d0b0 70 2c 20 26 64 65 73 74 42 29 3b 0a 20 20 70 2d  p, &destB);.  p-
1d0c0 3e 69 4c 69 6d 69 74 20 3d 20 73 61 76 65 64 4c  >iLimit = savedL
1d0d0 69 6d 69 74 3b 0a 20 20 70 2d 3e 69 4f 66 66 73  imit;.  p->iOffs
1d0e0 65 74 20 3d 20 73 61 76 65 64 4f 66 66 73 65 74  et = savedOffset
1d0f0 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 45  ;.  sqlite3VdbeE
1d100 6e 64 43 6f 72 6f 75 74 69 6e 65 28 76 2c 20 72  ndCoroutine(v, r
1d110 65 67 41 64 64 72 42 29 3b 0a 0a 20 20 2f 2a 20  egAddrB);..  /* 
1d120 47 65 6e 65 72 61 74 65 20 61 20 73 75 62 72 6f  Generate a subro
1d130 75 74 69 6e 65 20 74 68 61 74 20 6f 75 74 70 75  utine that outpu
1d140 74 73 20 74 68 65 20 63 75 72 72 65 6e 74 20 72  ts the current r
1d150 6f 77 20 6f 66 20 74 68 65 20 41 0a 20 20 2a 2a  ow of the A.  **
1d160 20 73 65 6c 65 63 74 20 61 73 20 74 68 65 20 6e   select as the n
1d170 65 78 74 20 6f 75 74 70 75 74 20 72 6f 77 20 6f  ext output row o
1d180 66 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 73  f the compound s
1d190 65 6c 65 63 74 2e 0a 20 20 2a 2f 0a 20 20 56 64  elect..  */.  Vd
1d1a0 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76  beNoopComment((v
1d1b0 2c 20 22 4f 75 74 70 75 74 20 72 6f 75 74 69 6e  , "Output routin
1d1c0 65 20 66 6f 72 20 41 22 29 29 3b 0a 20 20 61 64  e for A"));.  ad
1d1d0 64 72 4f 75 74 41 20 3d 20 67 65 6e 65 72 61 74  drOutA = generat
1d1e0 65 4f 75 74 70 75 74 53 75 62 72 6f 75 74 69 6e  eOutputSubroutin
1d1f0 65 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20  e(pParse,.      
1d200 20 20 20 20 20 20 20 20 20 20 20 70 2c 20 26 64             p, &d
1d210 65 73 74 41 2c 20 70 44 65 73 74 2c 20 72 65 67  estA, pDest, reg
1d220 4f 75 74 41 2c 0a 20 20 20 20 20 20 20 20 20 20  OutA,.          
1d230 20 20 20 20 20 20 20 72 65 67 50 72 65 76 2c 20         regPrev, 
1d240 70 4b 65 79 44 75 70 2c 20 6c 61 62 65 6c 45 6e  pKeyDup, labelEn
1d250 64 29 3b 0a 20 20 0a 20 20 2f 2a 20 47 65 6e 65  d);.  .  /* Gene
1d260 72 61 74 65 20 61 20 73 75 62 72 6f 75 74 69 6e  rate a subroutin
1d270 65 20 74 68 61 74 20 6f 75 74 70 75 74 73 20 74  e that outputs t
1d280 68 65 20 63 75 72 72 65 6e 74 20 72 6f 77 20 6f  he current row o
1d290 66 20 74 68 65 20 42 0a 20 20 2a 2a 20 73 65 6c  f the B.  ** sel
1d2a0 65 63 74 20 61 73 20 74 68 65 20 6e 65 78 74 20  ect as the next 
1d2b0 6f 75 74 70 75 74 20 72 6f 77 20 6f 66 20 74 68  output row of th
1d2c0 65 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63  e compound selec
1d2d0 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6f 70  t..  */.  if( op
1d2e0 3d 3d 54 4b 5f 41 4c 4c 20 7c 7c 20 6f 70 3d 3d  ==TK_ALL || op==
1d2f0 54 4b 5f 55 4e 49 4f 4e 20 29 7b 0a 20 20 20 20  TK_UNION ){.    
1d300 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28  VdbeNoopComment(
1d310 28 76 2c 20 22 4f 75 74 70 75 74 20 72 6f 75 74  (v, "Output rout
1d320 69 6e 65 20 66 6f 72 20 42 22 29 29 3b 0a 20 20  ine for B"));.  
1d330 20 20 61 64 64 72 4f 75 74 42 20 3d 20 67 65 6e    addrOutB = gen
1d340 65 72 61 74 65 4f 75 74 70 75 74 53 75 62 72 6f  erateOutputSubro
1d350 75 74 69 6e 65 28 70 50 61 72 73 65 2c 0a 20 20  utine(pParse,.  
1d360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
1d370 2c 20 26 64 65 73 74 42 2c 20 70 44 65 73 74 2c  , &destB, pDest,
1d380 20 72 65 67 4f 75 74 42 2c 0a 20 20 20 20 20 20   regOutB,.      
1d390 20 20 20 20 20 20 20 20 20 20 20 72 65 67 50 72             regPr
1d3a0 65 76 2c 20 70 4b 65 79 44 75 70 2c 20 6c 61 62  ev, pKeyDup, lab
1d3b0 65 6c 45 6e 64 29 3b 0a 20 20 7d 0a 20 20 73 71  elEnd);.  }.  sq
1d3c0 6c 69 74 65 33 4b 65 79 49 6e 66 6f 55 6e 72 65  lite3KeyInfoUnre
1d3d0 66 28 70 4b 65 79 44 75 70 29 3b 0a 0a 20 20 2f  f(pKeyDup);..  /
1d3e0 2a 20 47 65 6e 65 72 61 74 65 20 61 20 73 75 62  * Generate a sub
1d3f0 72 6f 75 74 69 6e 65 20 74 6f 20 72 75 6e 20 77  routine to run w
1d400 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74 73 20  hen the results 
1d410 66 72 6f 6d 20 73 65 6c 65 63 74 20 41 0a 20 20  from select A.  
1d420 2a 2a 20 61 72 65 20 65 78 68 61 75 73 74 65 64  ** are exhausted
1d430 20 61 6e 64 20 6f 6e 6c 79 20 64 61 74 61 20 69   and only data i
1d440 6e 20 73 65 6c 65 63 74 20 42 20 72 65 6d 61 69  n select B remai
1d450 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6f  ns..  */.  if( o
1d460 70 3d 3d 54 4b 5f 45 58 43 45 50 54 20 7c 7c 20  p==TK_EXCEPT || 
1d470 6f 70 3d 3d 54 4b 5f 49 4e 54 45 52 53 45 43 54  op==TK_INTERSECT
1d480 20 29 7b 0a 20 20 20 20 61 64 64 72 45 6f 66 41   ){.    addrEofA
1d490 5f 6e 6f 42 20 3d 20 61 64 64 72 45 6f 66 41 20  _noB = addrEofA 
1d4a0 3d 20 6c 61 62 65 6c 45 6e 64 3b 0a 20 20 7d 65  = labelEnd;.  }e
1d4b0 6c 73 65 7b 20 20 0a 20 20 20 20 56 64 62 65 4e  lse{  .    VdbeN
1d4c0 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  oopComment((v, "
1d4d0 65 6f 66 2d 41 20 73 75 62 72 6f 75 74 69 6e 65  eof-A subroutine
1d4e0 22 29 29 3b 0a 20 20 20 20 61 64 64 72 45 6f 66  "));.    addrEof
1d4f0 41 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  A = sqlite3VdbeA
1d500 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75  ddOp2(v, OP_Gosu
1d510 62 2c 20 72 65 67 4f 75 74 42 2c 20 61 64 64 72  b, regOutB, addr
1d520 4f 75 74 42 29 3b 0a 20 20 20 20 61 64 64 72 45  OutB);.    addrE
1d530 6f 66 41 5f 6e 6f 42 20 3d 20 73 71 6c 69 74 65  ofA_noB = sqlite
1d540 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
1d550 50 5f 59 69 65 6c 64 2c 20 72 65 67 41 64 64 72  P_Yield, regAddr
1d560 42 2c 20 6c 61 62 65 6c 45 6e 64 29 3b 0a 20 20  B, labelEnd);.  
1d570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d590 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28     VdbeCoverage(
1d5a0 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  v);.    sqlite3V
1d5b0 64 62 65 47 6f 74 6f 28 76 2c 20 61 64 64 72 45  dbeGoto(v, addrE
1d5c0 6f 66 41 29 3b 0a 20 20 20 20 70 2d 3e 6e 53 65  ofA);.    p->nSe
1d5d0 6c 65 63 74 52 6f 77 20 3d 20 73 71 6c 69 74 65  lectRow = sqlite
1d5e0 33 4c 6f 67 45 73 74 41 64 64 28 70 2d 3e 6e 53  3LogEstAdd(p->nS
1d5f0 65 6c 65 63 74 52 6f 77 2c 20 70 50 72 69 6f 72  electRow, pPrior
1d600 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 29 3b 0a 20  ->nSelectRow);. 
1d610 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74   }..  /* Generat
1d620 65 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20 74  e a subroutine t
1d630 6f 20 72 75 6e 20 77 68 65 6e 20 74 68 65 20 72  o run when the r
1d640 65 73 75 6c 74 73 20 66 72 6f 6d 20 73 65 6c 65  esults from sele
1d650 63 74 20 42 0a 20 20 2a 2a 20 61 72 65 20 65 78  ct B.  ** are ex
1d660 68 61 75 73 74 65 64 20 61 6e 64 20 6f 6e 6c 79  hausted and only
1d670 20 64 61 74 61 20 69 6e 20 73 65 6c 65 63 74 20   data in select 
1d680 41 20 72 65 6d 61 69 6e 73 2e 0a 20 20 2a 2f 0a  A remains..  */.
1d690 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 49 4e 54    if( op==TK_INT
1d6a0 45 52 53 45 43 54 20 29 7b 0a 20 20 20 20 61 64  ERSECT ){.    ad
1d6b0 64 72 45 6f 66 42 20 3d 20 61 64 64 72 45 6f 66  drEofB = addrEof
1d6c0 41 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6e 53  A;.    if( p->nS
1d6d0 65 6c 65 63 74 52 6f 77 20 3e 20 70 50 72 69 6f  electRow > pPrio
1d6e0 72 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 29 20  r->nSelectRow ) 
1d6f0 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20  p->nSelectRow = 
1d700 70 50 72 69 6f 72 2d 3e 6e 53 65 6c 65 63 74 52  pPrior->nSelectR
1d710 6f 77 3b 0a 20 20 7d 65 6c 73 65 7b 20 20 0a 20  ow;.  }else{  . 
1d720 20 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65     VdbeNoopComme
1d730 6e 74 28 28 76 2c 20 22 65 6f 66 2d 42 20 73 75  nt((v, "eof-B su
1d740 62 72 6f 75 74 69 6e 65 22 29 29 3b 0a 20 20 20  broutine"));.   
1d750 20 61 64 64 72 45 6f 66 42 20 3d 20 73 71 6c 69   addrEofB = sqli
1d760 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
1d770 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 4f 75   OP_Gosub, regOu
1d780 74 41 2c 20 61 64 64 72 4f 75 74 41 29 3b 0a 20  tA, addrOutA);. 
1d790 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1d7a0 64 4f 70 32 28 76 2c 20 4f 50 5f 59 69 65 6c 64  dOp2(v, OP_Yield
1d7b0 2c 20 72 65 67 41 64 64 72 41 2c 20 6c 61 62 65  , regAddrA, labe
1d7c0 6c 45 6e 64 29 3b 20 56 64 62 65 43 6f 76 65 72  lEnd); VdbeCover
1d7d0 61 67 65 28 76 29 3b 0a 20 20 20 20 73 71 6c 69  age(v);.    sqli
1d7e0 74 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 61  te3VdbeGoto(v, a
1d7f0 64 64 72 45 6f 66 42 29 3b 0a 20 20 7d 0a 0a 20  ddrEofB);.  }.. 
1d800 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64   /* Generate cod
1d810 65 20 74 6f 20 68 61 6e 64 6c 65 20 74 68 65 20  e to handle the 
1d820 63 61 73 65 20 6f 66 20 41 3c 42 0a 20 20 2a 2f  case of A<B.  */
1d830 0a 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65  .  VdbeNoopComme
1d840 6e 74 28 28 76 2c 20 22 41 2d 6c 74 2d 42 20 73  nt((v, "A-lt-B s
1d850 75 62 72 6f 75 74 69 6e 65 22 29 29 3b 0a 20 20  ubroutine"));.  
1d860 61 64 64 72 41 6c 74 42 20 3d 20 73 71 6c 69 74  addrAltB = sqlit
1d870 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
1d880 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 4f 75 74  OP_Gosub, regOut
1d890 41 2c 20 61 64 64 72 4f 75 74 41 29 3b 0a 20 20  A, addrOutA);.  
1d8a0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1d8b0 32 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 72  2(v, OP_Yield, r
1d8c0 65 67 41 64 64 72 41 2c 20 61 64 64 72 45 6f 66  egAddrA, addrEof
1d8d0 41 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  A); VdbeCoverage
1d8e0 28 76 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  (v);.  sqlite3Vd
1d8f0 62 65 47 6f 74 6f 28 76 2c 20 6c 61 62 65 6c 43  beGoto(v, labelC
1d900 6d 70 72 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65  mpr);..  /* Gene
1d910 72 61 74 65 20 63 6f 64 65 20 74 6f 20 68 61 6e  rate code to han
1d920 64 6c 65 20 74 68 65 20 63 61 73 65 20 6f 66 20  dle the case of 
1d930 41 3d 3d 42 0a 20 20 2a 2f 0a 20 20 69 66 28 20  A==B.  */.  if( 
1d940 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 29 7b 0a 20 20  op==TK_ALL ){.  
1d950 20 20 61 64 64 72 41 65 71 42 20 3d 20 61 64 64    addrAeqB = add
1d960 72 41 6c 74 42 3b 0a 20 20 7d 65 6c 73 65 20 69  rAltB;.  }else i
1d970 66 28 20 6f 70 3d 3d 54 4b 5f 49 4e 54 45 52 53  f( op==TK_INTERS
1d980 45 43 54 20 29 7b 0a 20 20 20 20 61 64 64 72 41  ECT ){.    addrA
1d990 65 71 42 20 3d 20 61 64 64 72 41 6c 74 42 3b 0a  eqB = addrAltB;.
1d9a0 20 20 20 20 61 64 64 72 41 6c 74 42 2b 2b 3b 0a      addrAltB++;.
1d9b0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 56 64 62    }else{.    Vdb
1d9c0 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c  eNoopComment((v,
1d9d0 20 22 41 2d 65 71 2d 42 20 73 75 62 72 6f 75 74   "A-eq-B subrout
1d9e0 69 6e 65 22 29 29 3b 0a 20 20 20 20 61 64 64 72  ine"));.    addr
1d9f0 41 65 71 42 20 3d 0a 20 20 20 20 73 71 6c 69 74  AeqB =.    sqlit
1da00 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
1da10 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67 41 64 64  OP_Yield, regAdd
1da20 72 41 2c 20 61 64 64 72 45 6f 66 41 29 3b 20 56  rA, addrEofA); V
1da30 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
1da40 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 47      sqlite3VdbeG
1da50 6f 74 6f 28 76 2c 20 6c 61 62 65 6c 43 6d 70 72  oto(v, labelCmpr
1da60 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e  );.  }..  /* Gen
1da70 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 68 61  erate code to ha
1da80 6e 64 6c 65 20 74 68 65 20 63 61 73 65 20 6f 66  ndle the case of
1da90 20 41 3e 42 0a 20 20 2a 2f 0a 20 20 56 64 62 65   A>B.  */.  Vdbe
1daa0 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  NoopComment((v, 
1dab0 22 41 2d 67 74 2d 42 20 73 75 62 72 6f 75 74 69  "A-gt-B subrouti
1dac0 6e 65 22 29 29 3b 0a 20 20 61 64 64 72 41 67 74  ne"));.  addrAgt
1dad0 42 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  B = sqlite3VdbeC
1dae0 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20  urrentAddr(v);. 
1daf0 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 41 4c 4c 20   if( op==TK_ALL 
1db00 7c 7c 20 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20  || op==TK_UNION 
1db10 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
1db20 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47  beAddOp2(v, OP_G
1db30 6f 73 75 62 2c 20 72 65 67 4f 75 74 42 2c 20 61  osub, regOutB, a
1db40 64 64 72 4f 75 74 42 29 3b 0a 20 20 7d 0a 20 20  ddrOutB);.  }.  
1db50 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1db60 32 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 72  2(v, OP_Yield, r
1db70 65 67 41 64 64 72 42 2c 20 61 64 64 72 45 6f 66  egAddrB, addrEof
1db80 42 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  B); VdbeCoverage
1db90 28 76 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  (v);.  sqlite3Vd
1dba0 62 65 47 6f 74 6f 28 76 2c 20 6c 61 62 65 6c 43  beGoto(v, labelC
1dbb0 6d 70 72 29 3b 0a 0a 20 20 2f 2a 20 54 68 69 73  mpr);..  /* This
1dbc0 20 63 6f 64 65 20 72 75 6e 73 20 6f 6e 63 65 20   code runs once 
1dbd0 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20 65 76  to initialize ev
1dbe0 65 72 79 74 68 69 6e 67 2e 0a 20 20 2a 2f 0a 20  erything..  */. 
1dbf0 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
1dc00 48 65 72 65 28 76 2c 20 61 64 64 72 31 29 3b 0a  Here(v, addr1);.
1dc10 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1dc20 4f 70 32 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c  Op2(v, OP_Yield,
1dc30 20 72 65 67 41 64 64 72 41 2c 20 61 64 64 72 45   regAddrA, addrE
1dc40 6f 66 41 5f 6e 6f 42 29 3b 20 56 64 62 65 43 6f  ofA_noB); VdbeCo
1dc50 76 65 72 61 67 65 28 76 29 3b 0a 20 20 73 71 6c  verage(v);.  sql
1dc60 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
1dc70 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67 41  , OP_Yield, regA
1dc80 64 64 72 42 2c 20 61 64 64 72 45 6f 66 42 29 3b  ddrB, addrEofB);
1dc90 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
1dca0 3b 0a 0a 20 20 2f 2a 20 49 6d 70 6c 65 6d 65 6e  ;..  /* Implemen
1dcb0 74 20 74 68 65 20 6d 61 69 6e 20 6d 65 72 67 65  t the main merge
1dcc0 20 6c 6f 6f 70 0a 20 20 2a 2f 0a 20 20 73 71 6c   loop.  */.  sql
1dcd0 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
1dce0 61 62 65 6c 28 76 2c 20 6c 61 62 65 6c 43 6d 70  abel(v, labelCmp
1dcf0 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  r);.  sqlite3Vdb
1dd00 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 50 65  eAddOp4(v, OP_Pe
1dd10 72 6d 75 74 61 74 69 6f 6e 2c 20 30 2c 20 30 2c  rmutation, 0, 0,
1dd20 20 30 2c 20 28 63 68 61 72 2a 29 61 50 65 72 6d   0, (char*)aPerm
1dd30 75 74 65 2c 20 50 34 5f 49 4e 54 41 52 52 41 59  ute, P4_INTARRAY
1dd40 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
1dd50 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 43 6f 6d  AddOp4(v, OP_Com
1dd60 70 61 72 65 2c 20 64 65 73 74 41 2e 69 53 64 73  pare, destA.iSds
1dd70 74 2c 20 64 65 73 74 42 2e 69 53 64 73 74 2c 20  t, destB.iSdst, 
1dd80 6e 4f 72 64 65 72 42 79 2c 0a 20 20 20 20 20 20  nOrderBy,.      
1dd90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dda0 20 20 20 28 63 68 61 72 2a 29 70 4b 65 79 4d 65     (char*)pKeyMe
1ddb0 72 67 65 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29  rge, P4_KEYINFO)
1ddc0 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 43  ;.  sqlite3VdbeC
1ddd0 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41  hangeP5(v, OPFLA
1dde0 47 5f 50 45 52 4d 55 54 45 29 3b 0a 20 20 73 71  G_PERMUTE);.  sq
1ddf0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
1de00 76 2c 20 4f 50 5f 4a 75 6d 70 2c 20 61 64 64 72  v, OP_Jump, addr
1de10 41 6c 74 42 2c 20 61 64 64 72 41 65 71 42 2c 20  AltB, addrAeqB, 
1de20 61 64 64 72 41 67 74 42 29 3b 20 56 64 62 65 43  addrAgtB); VdbeC
1de30 6f 76 65 72 61 67 65 28 76 29 3b 0a 0a 20 20 2f  overage(v);..  /
1de40 2a 20 4a 75 6d 70 20 74 6f 20 74 68 65 20 74 68  * Jump to the th
1de50 69 73 20 70 6f 69 6e 74 20 69 6e 20 6f 72 64 65  is point in orde
1de60 72 20 74 6f 20 74 65 72 6d 69 6e 61 74 65 20 74  r to terminate t
1de70 68 65 20 71 75 65 72 79 2e 0a 20 20 2a 2f 0a 20  he query..  */. 
1de80 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
1de90 6c 76 65 4c 61 62 65 6c 28 76 2c 20 6c 61 62 65  lveLabel(v, labe
1dea0 6c 45 6e 64 29 3b 0a 0a 20 20 2f 2a 20 52 65 61  lEnd);..  /* Rea
1deb0 73 73 65 6d 62 6c 79 20 74 68 65 20 63 6f 6d 70  ssembly the comp
1dec0 6f 75 6e 64 20 71 75 65 72 79 20 73 6f 20 74 68  ound query so th
1ded0 61 74 20 69 74 20 77 69 6c 6c 20 62 65 20 66 72  at it will be fr
1dee0 65 65 64 20 63 6f 72 72 65 63 74 6c 79 0a 20 20  eed correctly.  
1def0 2a 2a 20 62 79 20 74 68 65 20 63 61 6c 6c 69 6e  ** by the callin
1df00 67 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20  g function */.  
1df10 69 66 28 20 70 2d 3e 70 50 72 69 6f 72 20 29 7b  if( p->pPrior ){
1df20 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65  .    sqlite3Sele
1df30 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e  ctDelete(db, p->
1df40 70 50 72 69 6f 72 29 3b 0a 20 20 7d 0a 20 20 70  pPrior);.  }.  p
1df50 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50 72 69 6f  ->pPrior = pPrio
1df60 72 3b 0a 20 20 70 50 72 69 6f 72 2d 3e 70 4e 65  r;.  pPrior->pNe
1df70 78 74 20 3d 20 70 3b 0a 0a 20 20 2f 2a 2a 2a 20  xt = p;..  /*** 
1df80 54 42 44 3a 20 20 49 6e 73 65 72 74 20 73 75 62  TBD:  Insert sub
1df90 72 6f 75 74 69 6e 65 20 63 61 6c 6c 73 20 74 6f  routine calls to
1dfa0 20 63 6c 6f 73 65 20 63 75 72 73 6f 72 73 20 6f   close cursors o
1dfb0 6e 20 69 6e 63 6f 6d 70 6c 65 74 65 0a 20 20 2a  n incomplete.  *
1dfc0 2a 2a 2a 20 73 75 62 71 75 65 72 69 65 73 20 2a  *** subqueries *
1dfd0 2a 2a 2a 2f 0a 20 20 45 78 70 6c 61 69 6e 51 75  ***/.  ExplainQu
1dfe0 65 72 79 50 6c 61 6e 50 6f 70 28 70 50 61 72 73  eryPlanPop(pPars
1dff0 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 50 61  e);.  return pPa
1e000 72 73 65 2d 3e 6e 45 72 72 21 3d 30 3b 0a 7d 0a  rse->nErr!=0;.}.
1e010 23 65 6e 64 69 66 0a 0a 23 69 66 20 21 64 65 66  #endif..#if !def
1e020 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
1e030 5f 53 55 42 51 55 45 52 59 29 20 7c 7c 20 21 64  _SUBQUERY) || !d
1e040 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
1e050 49 54 5f 56 49 45 57 29 0a 0a 2f 2a 20 41 6e 20  IT_VIEW)../* An 
1e060 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20  instance of the 
1e070 53 75 62 73 74 43 6f 6e 74 65 78 74 20 6f 62 6a  SubstContext obj
1e080 65 63 74 20 64 65 73 63 72 69 62 65 73 20 61 6e  ect describes an
1e090 20 73 75 62 73 74 69 74 75 74 69 6f 6e 20 65 64   substitution ed
1e0a0 69 74 0a 2a 2a 20 74 6f 20 62 65 20 70 65 72 66  it.** to be perf
1e0b0 6f 72 6d 65 64 20 6f 6e 20 61 20 70 61 72 73 65  ormed on a parse
1e0c0 20 74 72 65 65 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c   tree..**.** All
1e0d0 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 63   references to c
1e0e0 6f 6c 75 6d 6e 73 20 69 6e 20 74 61 62 6c 65 20  olumns in table 
1e0f0 69 54 61 62 6c 65 20 61 72 65 20 74 6f 20 62 65  iTable are to be
1e100 20 72 65 70 6c 61 63 65 64 20 62 79 20 63 6f 72   replaced by cor
1e110 72 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20 65 78  responding.** ex
1e120 70 72 65 73 73 69 6f 6e 73 20 69 6e 20 70 45 4c  pressions in pEL
1e130 69 73 74 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20  ist..*/.typedef 
1e140 73 74 72 75 63 74 20 53 75 62 73 74 43 6f 6e 74  struct SubstCont
1e150 65 78 74 20 7b 0a 20 20 50 61 72 73 65 20 2a 70  ext {.  Parse *p
1e160 50 61 72 73 65 3b 20 20 20 20 20 20 20 20 20 20  Parse;          
1e170 20 20 2f 2a 20 54 68 65 20 70 61 72 73 69 6e 67    /* The parsing
1e180 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e   context */.  in
1e190 74 20 69 54 61 62 6c 65 3b 20 20 20 20 20 20 20  t iTable;       
1e1a0 20 20 20 20 20 20 20 20 2f 2a 20 52 65 70 6c 61          /* Repla
1e1b0 63 65 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f  ce references to
1e1c0 20 74 68 69 73 20 74 61 62 6c 65 20 2a 2f 0a 20   this table */. 
1e1d0 20 69 6e 74 20 69 4e 65 77 54 61 62 6c 65 3b 20   int iNewTable; 
1e1e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65             /* Ne
1e1f0 77 20 74 61 62 6c 65 20 6e 75 6d 62 65 72 20 2a  w table number *
1e200 2f 0a 20 20 69 6e 74 20 69 73 4c 65 66 74 4a 6f  /.  int isLeftJo
1e210 69 6e 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  in;           /*
1e220 20 41 64 64 20 54 4b 5f 49 46 5f 4e 55 4c 4c 5f   Add TK_IF_NULL_
1e230 52 4f 57 20 6f 70 63 6f 64 65 73 20 6f 6e 20 65  ROW opcodes on e
1e240 61 63 68 20 72 65 70 6c 61 63 65 6d 65 6e 74 20  ach replacement 
1e250 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
1e260 45 4c 69 73 74 3b 20 20 20 20 20 20 20 20 20 2f  EList;         /
1e270 2a 20 52 65 70 6c 61 63 65 6d 65 6e 74 20 65 78  * Replacement ex
1e280 70 72 65 73 73 69 6f 6e 73 20 2a 2f 0a 7d 20 53  pressions */.} S
1e290 75 62 73 74 43 6f 6e 74 65 78 74 3b 0a 0a 2f 2a  ubstContext;../*
1e2a0 20 46 6f 72 77 61 72 64 20 44 65 63 6c 61 72 61   Forward Declara
1e2b0 74 69 6f 6e 73 20 2a 2f 0a 73 74 61 74 69 63 20  tions */.static 
1e2c0 76 6f 69 64 20 73 75 62 73 74 45 78 70 72 4c 69  void substExprLi
1e2d0 73 74 28 53 75 62 73 74 43 6f 6e 74 65 78 74 2a  st(SubstContext*
1e2e0 2c 20 45 78 70 72 4c 69 73 74 2a 29 3b 0a 73 74  , ExprList*);.st
1e2f0 61 74 69 63 20 76 6f 69 64 20 73 75 62 73 74 53  atic void substS
1e300 65 6c 65 63 74 28 53 75 62 73 74 43 6f 6e 74 65  elect(SubstConte
1e310 78 74 2a 2c 20 53 65 6c 65 63 74 2a 2c 20 69 6e  xt*, Select*, in
1e320 74 29 3b 0a 0a 2f 2a 0a 2a 2a 20 53 63 61 6e 20  t);../*.** Scan 
1e330 74 68 72 6f 75 67 68 20 74 68 65 20 65 78 70 72  through the expr
1e340 65 73 73 69 6f 6e 20 70 45 78 70 72 2e 20 20 52  ession pExpr.  R
1e350 65 70 6c 61 63 65 20 65 76 65 72 79 20 72 65 66  eplace every ref
1e360 65 72 65 6e 63 65 20 74 6f 0a 2a 2a 20 61 20 63  erence to.** a c
1e370 6f 6c 75 6d 6e 20 69 6e 20 74 61 62 6c 65 20 6e  olumn in table n
1e380 75 6d 62 65 72 20 69 54 61 62 6c 65 20 77 69 74  umber iTable wit
1e390 68 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20  h a copy of the 
1e3a0 69 43 6f 6c 75 6d 6e 2d 74 68 0a 2a 2a 20 65 6e  iColumn-th.** en
1e3b0 74 72 79 20 69 6e 20 70 45 4c 69 73 74 2e 20 20  try in pEList.  
1e3c0 28 42 75 74 20 6c 65 61 76 65 20 72 65 66 65 72  (But leave refer
1e3d0 65 6e 63 65 73 20 74 6f 20 74 68 65 20 52 4f 57  ences to the ROW
1e3e0 49 44 20 63 6f 6c 75 6d 6e 20 0a 2a 2a 20 75 6e  ID column .** un
1e3f0 63 68 61 6e 67 65 64 2e 29 0a 2a 2a 0a 2a 2a 20  changed.).**.** 
1e400 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
1e410 70 61 72 74 20 6f 66 20 74 68 65 20 66 6c 61 74  part of the flat
1e420 74 65 6e 69 6e 67 20 70 72 6f 63 65 64 75 72 65  tening procedure
1e430 2e 20 20 41 20 73 75 62 71 75 65 72 79 0a 2a 2a  .  A subquery.**
1e440 20 77 68 6f 73 65 20 72 65 73 75 6c 74 20 73 65   whose result se
1e450 74 20 69 73 20 64 65 66 69 6e 65 64 20 62 79 20  t is defined by 
1e460 70 45 4c 69 73 74 20 61 70 70 65 61 72 73 20 61  pEList appears a
1e470 73 20 65 6e 74 72 79 20 69 6e 20 74 68 65 0a 2a  s entry in the.*
1e480 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66  * FROM clause of
1e490 20 61 20 53 45 4c 45 43 54 20 73 75 63 68 20 74   a SELECT such t
1e4a0 68 61 74 20 74 68 65 20 56 44 42 45 20 63 75 72  hat the VDBE cur
1e4b0 73 6f 72 20 61 73 73 69 67 6e 65 64 20 74 6f 20  sor assigned to 
1e4c0 74 68 61 74 0a 2a 2a 20 46 4f 52 4d 20 63 6c 61  that.** FORM cla
1e4d0 75 73 65 20 65 6e 74 72 79 20 69 73 20 69 54 61  use entry is iTa
1e4e0 62 6c 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69  ble.  This routi
1e4f0 6e 65 20 6d 61 6b 65 73 20 74 68 65 20 6e 65 63  ne makes the nec
1e500 65 73 73 61 72 79 20 0a 2a 2a 20 63 68 61 6e 67  essary .** chang
1e510 65 73 20 74 6f 20 70 45 78 70 72 20 73 6f 20 74  es to pExpr so t
1e520 68 61 74 20 69 74 20 72 65 66 65 72 73 20 64 69  hat it refers di
1e530 72 65 63 74 6c 79 20 74 6f 20 74 68 65 20 73 6f  rectly to the so
1e540 75 72 63 65 20 74 61 62 6c 65 0a 2a 2a 20 6f 66  urce table.** of
1e550 20 74 68 65 20 73 75 62 71 75 65 72 79 20 72 61   the subquery ra
1e560 74 68 65 72 20 74 68 65 20 72 65 73 75 6c 74 20  ther the result 
1e570 73 65 74 20 6f 66 20 74 68 65 20 73 75 62 71 75  set of the subqu
1e580 65 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 45  ery..*/.static E
1e590 78 70 72 20 2a 73 75 62 73 74 45 78 70 72 28 0a  xpr *substExpr(.
1e5a0 20 20 53 75 62 73 74 43 6f 6e 74 65 78 74 20 2a    SubstContext *
1e5b0 70 53 75 62 73 74 2c 20 20 2f 2a 20 44 65 73 63  pSubst,  /* Desc
1e5c0 72 69 70 74 69 6f 6e 20 6f 66 20 74 68 65 20 73  ription of the s
1e5d0 75 62 73 74 69 74 75 74 69 6f 6e 20 2a 2f 0a 20  ubstitution */. 
1e5e0 20 45 78 70 72 20 2a 70 45 78 70 72 20 20 20 20   Expr *pExpr    
1e5f0 20 20 20 20 20 20 20 20 2f 2a 20 45 78 70 72 20          /* Expr 
1e600 69 6e 20 77 68 69 63 68 20 73 75 62 73 74 69 74  in which substit
1e610 75 74 69 6f 6e 20 6f 63 63 75 72 73 20 2a 2f 0a  ution occurs */.
1e620 29 7b 0a 20 20 69 66 28 20 70 45 78 70 72 3d 3d  ){.  if( pExpr==
1e630 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
1e640 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65  if( ExprHasPrope
1e650 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 46 72  rty(pExpr, EP_Fr
1e660 6f 6d 4a 6f 69 6e 29 0a 20 20 20 26 26 20 70 45  omJoin).   && pE
1e670 78 70 72 2d 3e 69 52 69 67 68 74 4a 6f 69 6e 54  xpr->iRightJoinT
1e680 61 62 6c 65 3d 3d 70 53 75 62 73 74 2d 3e 69 54  able==pSubst->iT
1e690 61 62 6c 65 0a 20 20 29 7b 0a 20 20 20 20 70 45  able.  ){.    pE
1e6a0 78 70 72 2d 3e 69 52 69 67 68 74 4a 6f 69 6e 54  xpr->iRightJoinT
1e6b0 61 62 6c 65 20 3d 20 70 53 75 62 73 74 2d 3e 69  able = pSubst->i
1e6c0 4e 65 77 54 61 62 6c 65 3b 0a 20 20 7d 0a 20 20  NewTable;.  }.  
1e6d0 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  if( pExpr->op==T
1e6e0 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20 70 45 78 70  K_COLUMN && pExp
1e6f0 72 2d 3e 69 54 61 62 6c 65 3d 3d 70 53 75 62 73  r->iTable==pSubs
1e700 74 2d 3e 69 54 61 62 6c 65 20 29 7b 0a 20 20 20  t->iTable ){.   
1e710 20 69 66 28 20 70 45 78 70 72 2d 3e 69 43 6f 6c   if( pExpr->iCol
1e720 75 6d 6e 3c 30 20 29 7b 0a 20 20 20 20 20 20 70  umn<0 ){.      p
1e730 45 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 4e 55  Expr->op = TK_NU
1e740 4c 4c 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  LL;.    }else{. 
1e750 20 20 20 20 20 45 78 70 72 20 2a 70 4e 65 77 3b       Expr *pNew;
1e760 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 43 6f  .      Expr *pCo
1e770 70 79 20 3d 20 70 53 75 62 73 74 2d 3e 70 45 4c  py = pSubst->pEL
1e780 69 73 74 2d 3e 61 5b 70 45 78 70 72 2d 3e 69 43  ist->a[pExpr->iC
1e790 6f 6c 75 6d 6e 5d 2e 70 45 78 70 72 3b 0a 20 20  olumn].pExpr;.  
1e7a0 20 20 20 20 45 78 70 72 20 69 66 4e 75 6c 6c 52      Expr ifNullR
1e7b0 6f 77 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  ow;.      assert
1e7c0 28 20 70 53 75 62 73 74 2d 3e 70 45 4c 69 73 74  ( pSubst->pEList
1e7d0 21 3d 30 20 26 26 20 70 45 78 70 72 2d 3e 69 43  !=0 && pExpr->iC
1e7e0 6f 6c 75 6d 6e 3c 70 53 75 62 73 74 2d 3e 70 45  olumn<pSubst->pE
1e7f0 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 3b 0a 20  List->nExpr );. 
1e800 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78       assert( pEx
1e810 70 72 2d 3e 70 52 69 67 68 74 3d 3d 30 20 29 3b  pr->pRight==0 );
1e820 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
1e830 65 33 45 78 70 72 49 73 56 65 63 74 6f 72 28 70  e3ExprIsVector(p
1e840 43 6f 70 79 29 20 29 7b 0a 20 20 20 20 20 20 20  Copy) ){.       
1e850 20 73 71 6c 69 74 65 33 56 65 63 74 6f 72 45 72   sqlite3VectorEr
1e860 72 6f 72 4d 73 67 28 70 53 75 62 73 74 2d 3e 70  rorMsg(pSubst->p
1e870 50 61 72 73 65 2c 20 70 43 6f 70 79 29 3b 0a 20  Parse, pCopy);. 
1e880 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1e890 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20      sqlite3 *db 
1e8a0 3d 20 70 53 75 62 73 74 2d 3e 70 50 61 72 73 65  = pSubst->pParse
1e8b0 2d 3e 64 62 3b 0a 20 20 20 20 20 20 20 20 69 66  ->db;.        if
1e8c0 28 20 70 53 75 62 73 74 2d 3e 69 73 4c 65 66 74  ( pSubst->isLeft
1e8d0 4a 6f 69 6e 20 26 26 20 70 43 6f 70 79 2d 3e 6f  Join && pCopy->o
1e8e0 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 7b 0a  p!=TK_COLUMN ){.
1e8f0 20 20 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74            memset
1e900 28 26 69 66 4e 75 6c 6c 52 6f 77 2c 20 30 2c 20  (&ifNullRow, 0, 
1e910 73 69 7a 65 6f 66 28 69 66 4e 75 6c 6c 52 6f 77  sizeof(ifNullRow
1e920 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  ));.          if
1e930 4e 75 6c 6c 52 6f 77 2e 6f 70 20 3d 20 54 4b 5f  NullRow.op = TK_
1e940 49 46 5f 4e 55 4c 4c 5f 52 4f 57 3b 0a 20 20 20  IF_NULL_ROW;.   
1e950 20 20 20 20 20 20 20 69 66 4e 75 6c 6c 52 6f 77         ifNullRow
1e960 2e 70 4c 65 66 74 20 3d 20 70 43 6f 70 79 3b 0a  .pLeft = pCopy;.
1e970 20 20 20 20 20 20 20 20 20 20 69 66 4e 75 6c 6c            ifNull
1e980 52 6f 77 2e 69 54 61 62 6c 65 20 3d 20 70 53 75  Row.iTable = pSu
1e990 62 73 74 2d 3e 69 4e 65 77 54 61 62 6c 65 3b 0a  bst->iNewTable;.
1e9a0 20 20 20 20 20 20 20 20 20 20 70 43 6f 70 79 20            pCopy 
1e9b0 3d 20 26 69 66 4e 75 6c 6c 52 6f 77 3b 0a 20 20  = &ifNullRow;.  
1e9c0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1e9d0 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 45 78  pNew = sqlite3Ex
1e9e0 70 72 44 75 70 28 64 62 2c 20 70 43 6f 70 79 2c  prDup(db, pCopy,
1e9f0 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28   0);.        if(
1ea00 20 70 4e 65 77 20 26 26 20 70 53 75 62 73 74 2d   pNew && pSubst-
1ea10 3e 69 73 4c 65 66 74 4a 6f 69 6e 20 29 7b 0a 20  >isLeftJoin ){. 
1ea20 20 20 20 20 20 20 20 20 20 45 78 70 72 53 65 74           ExprSet
1ea30 50 72 6f 70 65 72 74 79 28 70 4e 65 77 2c 20 45  Property(pNew, E
1ea40 50 5f 43 61 6e 42 65 4e 75 6c 6c 29 3b 0a 20 20  P_CanBeNull);.  
1ea50 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1ea60 69 66 28 20 70 4e 65 77 20 26 26 20 45 78 70 72  if( pNew && Expr
1ea70 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
1ea80 72 2c 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29  r,EP_FromJoin) )
1ea90 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4e 65 77  {.          pNew
1eaa0 2d 3e 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c  ->iRightJoinTabl
1eab0 65 20 3d 20 70 45 78 70 72 2d 3e 69 52 69 67 68  e = pExpr->iRigh
1eac0 74 4a 6f 69 6e 54 61 62 6c 65 3b 0a 20 20 20 20  tJoinTable;.    
1ead0 20 20 20 20 20 20 45 78 70 72 53 65 74 50 72 6f        ExprSetPro
1eae0 70 65 72 74 79 28 70 4e 65 77 2c 20 45 50 5f 46  perty(pNew, EP_F
1eaf0 72 6f 6d 4a 6f 69 6e 29 3b 0a 20 20 20 20 20 20  romJoin);.      
1eb00 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69    }.        sqli
1eb10 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62  te3ExprDelete(db
1eb20 2c 20 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20  , pExpr);.      
1eb30 20 20 70 45 78 70 72 20 3d 20 70 4e 65 77 3b 0a    pExpr = pNew;.
1eb40 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
1eb50 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66 28 20 70  }else{.    if( p
1eb60 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 46 5f  Expr->op==TK_IF_
1eb70 4e 55 4c 4c 5f 52 4f 57 20 26 26 20 70 45 78 70  NULL_ROW && pExp
1eb80 72 2d 3e 69 54 61 62 6c 65 3d 3d 70 53 75 62 73  r->iTable==pSubs
1eb90 74 2d 3e 69 54 61 62 6c 65 20 29 7b 0a 20 20 20  t->iTable ){.   
1eba0 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65     pExpr->iTable
1ebb0 20 3d 20 70 53 75 62 73 74 2d 3e 69 4e 65 77 54   = pSubst->iNewT
1ebc0 61 62 6c 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20  able;.    }.    
1ebd0 70 45 78 70 72 2d 3e 70 4c 65 66 74 20 3d 20 73  pExpr->pLeft = s
1ebe0 75 62 73 74 45 78 70 72 28 70 53 75 62 73 74 2c  ubstExpr(pSubst,
1ebf0 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a   pExpr->pLeft);.
1ec00 20 20 20 20 70 45 78 70 72 2d 3e 70 52 69 67 68      pExpr->pRigh
1ec10 74 20 3d 20 73 75 62 73 74 45 78 70 72 28 70 53  t = substExpr(pS
1ec20 75 62 73 74 2c 20 70 45 78 70 72 2d 3e 70 52 69  ubst, pExpr->pRi
1ec30 67 68 74 29 3b 0a 20 20 20 20 69 66 28 20 45 78  ght);.    if( Ex
1ec40 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
1ec50 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63  xpr, EP_xIsSelec
1ec60 74 29 20 29 7b 0a 20 20 20 20 20 20 73 75 62 73  t) ){.      subs
1ec70 74 53 65 6c 65 63 74 28 70 53 75 62 73 74 2c 20  tSelect(pSubst, 
1ec80 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74  pExpr->x.pSelect
1ec90 2c 20 31 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  , 1);.    }else{
1eca0 0a 20 20 20 20 20 20 73 75 62 73 74 45 78 70 72  .      substExpr
1ecb0 4c 69 73 74 28 70 53 75 62 73 74 2c 20 70 45 78  List(pSubst, pEx
1ecc0 70 72 2d 3e 78 2e 70 4c 69 73 74 29 3b 0a 20 20  pr->x.pList);.  
1ecd0 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
1ece0 20 70 45 78 70 72 3b 0a 7d 0a 73 74 61 74 69 63   pExpr;.}.static
1ecf0 20 76 6f 69 64 20 73 75 62 73 74 45 78 70 72 4c   void substExprL
1ed00 69 73 74 28 0a 20 20 53 75 62 73 74 43 6f 6e 74  ist(.  SubstCont
1ed10 65 78 74 20 2a 70 53 75 62 73 74 2c 20 2f 2a 20  ext *pSubst, /* 
1ed20 44 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 74  Description of t
1ed30 68 65 20 73 75 62 73 74 69 74 75 74 69 6f 6e 20  he substitution 
1ed40 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
1ed50 4c 69 73 74 20 20 20 20 20 20 20 2f 2a 20 4c 69  List       /* Li
1ed60 73 74 20 74 6f 20 73 63 61 6e 20 61 6e 64 20 69  st to scan and i
1ed70 6e 20 77 68 69 63 68 20 74 6f 20 6d 61 6b 65 20  n which to make 
1ed80 73 75 62 73 74 69 74 75 74 65 73 20 2a 2f 0a 29  substitutes */.)
1ed90 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28  {.  int i;.  if(
1eda0 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75   pList==0 ) retu
1edb0 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  rn;.  for(i=0; i
1edc0 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69  <pList->nExpr; i
1edd0 2b 2b 29 7b 0a 20 20 20 20 70 4c 69 73 74 2d 3e  ++){.    pList->
1ede0 61 5b 69 5d 2e 70 45 78 70 72 20 3d 20 73 75 62  a[i].pExpr = sub
1edf0 73 74 45 78 70 72 28 70 53 75 62 73 74 2c 20 70  stExpr(pSubst, p
1ee00 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  List->a[i].pExpr
1ee10 29 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20  );.  }.}.static 
1ee20 76 6f 69 64 20 73 75 62 73 74 53 65 6c 65 63 74  void substSelect
1ee30 28 0a 20 20 53 75 62 73 74 43 6f 6e 74 65 78 74  (.  SubstContext
1ee40 20 2a 70 53 75 62 73 74 2c 20 2f 2a 20 44 65 73   *pSubst, /* Des
1ee50 63 72 69 70 74 69 6f 6e 20 6f 66 20 74 68 65 20  cription of the 
1ee60 73 75 62 73 74 69 74 75 74 69 6f 6e 20 2a 2f 0a  substitution */.
1ee70 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20    Select *p,    
1ee80 20 20 20 20 20 20 20 20 2f 2a 20 53 45 4c 45 43          /* SELEC
1ee90 54 20 73 74 61 74 65 6d 65 6e 74 20 69 6e 20 77  T statement in w
1eea0 68 69 63 68 20 74 6f 20 6d 61 6b 65 20 73 75 62  hich to make sub
1eeb0 73 74 69 74 75 74 69 6f 6e 73 20 2a 2f 0a 20 20  stitutions */.  
1eec0 69 6e 74 20 64 6f 50 72 69 6f 72 20 20 20 20 20  int doPrior     
1eed0 20 20 20 20 20 20 2f 2a 20 44 6f 20 73 75 62 73        /* Do subs
1eee0 74 69 74 75 74 65 73 20 6f 6e 20 70 2d 3e 70 50  titutes on p->pP
1eef0 72 69 6f 72 20 74 6f 6f 20 2a 2f 0a 29 7b 0a 20  rior too */.){. 
1ef00 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63 3b 0a   SrcList *pSrc;.
1ef10 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
1ef20 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20  _item *pItem;.  
1ef30 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 21 70 20  int i;.  if( !p 
1ef40 29 20 72 65 74 75 72 6e 3b 0a 20 20 64 6f 7b 0a  ) return;.  do{.
1ef50 20 20 20 20 73 75 62 73 74 45 78 70 72 4c 69 73      substExprLis
1ef60 74 28 70 53 75 62 73 74 2c 20 70 2d 3e 70 45 4c  t(pSubst, p->pEL
1ef70 69 73 74 29 3b 0a 20 20 20 20 73 75 62 73 74 45  ist);.    substE
1ef80 78 70 72 4c 69 73 74 28 70 53 75 62 73 74 2c 20  xprList(pSubst, 
1ef90 70 2d 3e 70 47 72 6f 75 70 42 79 29 3b 0a 20 20  p->pGroupBy);.  
1efa0 20 20 73 75 62 73 74 45 78 70 72 4c 69 73 74 28    substExprList(
1efb0 70 53 75 62 73 74 2c 20 70 2d 3e 70 4f 72 64 65  pSubst, p->pOrde
1efc0 72 42 79 29 3b 0a 20 20 20 20 70 2d 3e 70 48 61  rBy);.    p->pHa
1efd0 76 69 6e 67 20 3d 20 73 75 62 73 74 45 78 70 72  ving = substExpr
1efe0 28 70 53 75 62 73 74 2c 20 70 2d 3e 70 48 61 76  (pSubst, p->pHav
1eff0 69 6e 67 29 3b 0a 20 20 20 20 70 2d 3e 70 57 68  ing);.    p->pWh
1f000 65 72 65 20 3d 20 73 75 62 73 74 45 78 70 72 28  ere = substExpr(
1f010 70 53 75 62 73 74 2c 20 70 2d 3e 70 57 68 65 72  pSubst, p->pWher
1f020 65 29 3b 0a 20 20 20 20 70 53 72 63 20 3d 20 70  e);.    pSrc = p
1f030 2d 3e 70 53 72 63 3b 0a 20 20 20 20 61 73 73 65  ->pSrc;.    asse
1f040 72 74 28 20 70 53 72 63 21 3d 30 20 29 3b 0a 20  rt( pSrc!=0 );. 
1f050 20 20 20 66 6f 72 28 69 3d 70 53 72 63 2d 3e 6e     for(i=pSrc->n
1f060 53 72 63 2c 20 70 49 74 65 6d 3d 70 53 72 63 2d  Src, pItem=pSrc-
1f070 3e 61 3b 20 69 3e 30 3b 20 69 2d 2d 2c 20 70 49  >a; i>0; i--, pI
1f080 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 73 75  tem++){.      su
1f090 62 73 74 53 65 6c 65 63 74 28 70 53 75 62 73 74  bstSelect(pSubst
1f0a0 2c 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74  , pItem->pSelect
1f0b0 2c 20 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 1);.      if( 
1f0c0 70 49 74 65 6d 2d 3e 66 67 2e 69 73 54 61 62 46  pItem->fg.isTabF
1f0d0 75 6e 63 20 29 7b 0a 20 20 20 20 20 20 20 20 73  unc ){.        s
1f0e0 75 62 73 74 45 78 70 72 4c 69 73 74 28 70 53 75  ubstExprList(pSu
1f0f0 62 73 74 2c 20 70 49 74 65 6d 2d 3e 75 31 2e 70  bst, pItem->u1.p
1f100 46 75 6e 63 41 72 67 29 3b 0a 20 20 20 20 20 20  FuncArg);.      
1f110 7d 0a 20 20 20 20 7d 0a 20 20 7d 77 68 69 6c 65  }.    }.  }while
1f120 28 20 64 6f 50 72 69 6f 72 20 26 26 20 28 70 20  ( doPrior && (p 
1f130 3d 20 70 2d 3e 70 50 72 69 6f 72 29 21 3d 30 20  = p->pPrior)!=0 
1f140 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21  );.}.#endif /* !
1f150 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
1f160 4d 49 54 5f 53 55 42 51 55 45 52 59 29 20 7c 7c  MIT_SUBQUERY) ||
1f170 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
1f180 5f 4f 4d 49 54 5f 56 49 45 57 29 20 2a 2f 0a 0a  _OMIT_VIEW) */..
1f190 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
1f1a0 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
1f1b0 59 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53  Y) || !defined(S
1f1c0 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29  QLITE_OMIT_VIEW)
1f1d0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
1f1e0 69 6e 65 20 61 74 74 65 6d 70 74 73 20 74 6f 20  ine attempts to 
1f1f0 66 6c 61 74 74 65 6e 20 73 75 62 71 75 65 72 69  flatten subqueri
1f200 65 73 20 61 73 20 61 20 70 65 72 66 6f 72 6d 61  es as a performa
1f210 6e 63 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  nce optimization
1f220 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  ..** This routin
1f230 65 20 72 65 74 75 72 6e 73 20 31 20 69 66 20 69  e returns 1 if i
1f240 74 20 6d 61 6b 65 73 20 63 68 61 6e 67 65 73 20  t makes changes 
1f250 61 6e 64 20 30 20 69 66 20 6e 6f 20 66 6c 61 74  and 0 if no flat
1f260 74 65 6e 69 6e 67 20 6f 63 63 75 72 73 2e 0a 2a  tening occurs..*
1f270 2a 0a 2a 2a 20 54 6f 20 75 6e 64 65 72 73 74 61  *.** To understa
1f280 6e 64 20 74 68 65 20 63 6f 6e 63 65 70 74 20 6f  nd the concept o
1f290 66 20 66 6c 61 74 74 65 6e 69 6e 67 2c 20 63 6f  f flattening, co
1f2a0 6e 73 69 64 65 72 20 74 68 65 20 66 6f 6c 6c 6f  nsider the follo
1f2b0 77 69 6e 67 0a 2a 2a 20 71 75 65 72 79 3a 0a 2a  wing.** query:.*
1f2c0 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20  *.**     SELECT 
1f2d0 61 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20 78  a FROM (SELECT x
1f2e0 2b 79 20 41 53 20 61 20 46 52 4f 4d 20 74 31 20  +y AS a FROM t1 
1f2f0 57 48 45 52 45 20 7a 3c 31 30 30 29 20 57 48 45  WHERE z<100) WHE
1f300 52 45 20 61 3e 35 0a 2a 2a 0a 2a 2a 20 54 68 65  RE a>5.**.** The
1f310 20 64 65 66 61 75 6c 74 20 77 61 79 20 6f 66 20   default way of 
1f320 69 6d 70 6c 65 6d 65 6e 74 69 6e 67 20 74 68 69  implementing thi
1f330 73 20 71 75 65 72 79 20 69 73 20 74 6f 20 65 78  s query is to ex
1f340 65 63 75 74 65 20 74 68 65 0a 2a 2a 20 73 75 62  ecute the.** sub
1f350 71 75 65 72 79 20 66 69 72 73 74 20 61 6e 64 20  query first and 
1f360 73 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74  store the result
1f370 73 20 69 6e 20 61 20 74 65 6d 70 6f 72 61 72 79  s in a temporary
1f380 20 74 61 62 6c 65 2c 20 74 68 65 6e 0a 2a 2a 20   table, then.** 
1f390 72 75 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75  run the outer qu
1f3a0 65 72 79 20 6f 6e 20 74 68 61 74 20 74 65 6d 70  ery on that temp
1f3b0 6f 72 61 72 79 20 74 61 62 6c 65 2e 20 20 54 68  orary table.  Th
1f3c0 69 73 20 72 65 71 75 69 72 65 73 20 74 77 6f 0a  is requires two.
1f3d0 2a 2a 20 70 61 73 73 65 73 20 6f 76 65 72 20 74  ** passes over t
1f3e0 68 65 20 64 61 74 61 2e 20 20 46 75 72 74 68 65  he data.  Furthe
1f3f0 72 6d 6f 72 65 2c 20 62 65 63 61 75 73 65 20 74  rmore, because t
1f400 68 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  he temporary tab
1f410 6c 65 0a 2a 2a 20 68 61 73 20 6e 6f 20 69 6e 64  le.** has no ind
1f420 69 63 65 73 2c 20 74 68 65 20 57 48 45 52 45 20  ices, the WHERE 
1f430 63 6c 61 75 73 65 20 6f 6e 20 74 68 65 20 6f 75  clause on the ou
1f440 74 65 72 20 71 75 65 72 79 20 63 61 6e 6e 6f 74  ter query cannot
1f450 20 62 65 0a 2a 2a 20 6f 70 74 69 6d 69 7a 65 64   be.** optimized
1f460 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
1f470 74 69 6e 65 20 61 74 74 65 6d 70 74 73 20 74 6f  tine attempts to
1f480 20 72 65 77 72 69 74 65 20 71 75 65 72 69 65 73   rewrite queries
1f490 20 73 75 63 68 20 61 73 20 74 68 65 20 61 62 6f   such as the abo
1f4a0 76 65 20 69 6e 74 6f 0a 2a 2a 20 61 20 73 69 6e  ve into.** a sin
1f4b0 67 6c 65 20 66 6c 61 74 20 73 65 6c 65 63 74 2c  gle flat select,
1f4c0 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a   like this:.**.*
1f4d0 2a 20 20 20 20 20 53 45 4c 45 43 54 20 78 2b 79  *     SELECT x+y
1f4e0 20 41 53 20 61 20 46 52 4f 4d 20 74 31 20 57 48   AS a FROM t1 WH
1f4f0 45 52 45 20 7a 3c 31 30 30 20 41 4e 44 20 61 3e  ERE z<100 AND a>
1f500 35 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 64 65  5.**.** The code
1f510 20 67 65 6e 65 72 61 74 65 64 20 66 6f 72 20 74   generated for t
1f520 68 69 73 20 73 69 6d 70 6c 69 66 69 63 61 74 69  his simplificati
1f530 6f 6e 20 67 69 76 65 73 20 74 68 65 20 73 61 6d  on gives the sam
1f540 65 20 72 65 73 75 6c 74 0a 2a 2a 20 62 75 74 20  e result.** but 
1f550 6f 6e 6c 79 20 68 61 73 20 74 6f 20 73 63 61 6e  only has to scan
1f560 20 74 68 65 20 64 61 74 61 20 6f 6e 63 65 2e 20   the data once. 
1f570 20 41 6e 64 20 62 65 63 61 75 73 65 20 69 6e 64   And because ind
1f580 69 63 65 73 20 6d 69 67 68 74 20 0a 2a 2a 20 65  ices might .** e
1f590 78 69 73 74 20 6f 6e 20 74 68 65 20 74 61 62 6c  xist on the tabl
1f5a0 65 20 74 31 2c 20 61 20 63 6f 6d 70 6c 65 74 65  e t1, a complete
1f5b0 20 73 63 61 6e 20 6f 66 20 74 68 65 20 64 61 74   scan of the dat
1f5c0 61 20 6d 69 67 68 74 20 62 65 0a 2a 2a 20 61 76  a might be.** av
1f5d0 6f 69 64 65 64 2e 0a 2a 2a 0a 2a 2a 20 46 6c 61  oided..**.** Fla
1f5e0 74 74 65 6e 69 6e 67 20 69 73 20 73 75 62 6a 65  ttening is subje
1f5f0 63 74 20 74 6f 20 74 68 65 20 66 6f 6c 6c 6f 77  ct to the follow
1f600 69 6e 67 20 63 6f 6e 73 74 72 61 69 6e 74 73 3a  ing constraints:
1f610 0a 2a 2a 0a 2a 2a 20 20 28 2a 2a 29 20 20 57 65  .**.**  (**)  We
1f620 20 6e 6f 20 6c 6f 6e 67 65 72 20 61 74 74 65 6d   no longer attem
1f630 70 74 20 74 6f 20 66 6c 61 74 74 65 6e 20 61 67  pt to flatten ag
1f640 67 72 65 67 61 74 65 20 73 75 62 71 75 65 72 69  gregate subqueri
1f650 65 73 2e 20 57 61 73 3a 0a 2a 2a 20 20 20 20 20  es. Was:.**     
1f660 20 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20     The subquery 
1f670 61 6e 64 20 74 68 65 20 6f 75 74 65 72 20 71 75  and the outer qu
1f680 65 72 79 20 63 61 6e 6e 6f 74 20 62 6f 74 68 20  ery cannot both 
1f690 62 65 20 61 67 67 72 65 67 61 74 65 73 2e 0a 2a  be aggregates..*
1f6a0 2a 0a 2a 2a 20 20 28 2a 2a 29 20 20 57 65 20 6e  *.**  (**)  We n
1f6b0 6f 20 6c 6f 6e 67 65 72 20 61 74 74 65 6d 70 74  o longer attempt
1f6c0 20 74 6f 20 66 6c 61 74 74 65 6e 20 61 67 67 72   to flatten aggr
1f6d0 65 67 61 74 65 20 73 75 62 71 75 65 72 69 65 73  egate subqueries
1f6e0 2e 20 57 61 73 3a 0a 2a 2a 20 20 20 20 20 20 20  . Was:.**       
1f6f0 20 28 32 29 20 49 66 20 74 68 65 20 73 75 62 71   (2) If the subq
1f700 75 65 72 79 20 69 73 20 61 6e 20 61 67 67 72 65  uery is an aggre
1f710 67 61 74 65 20 74 68 65 6e 0a 2a 2a 20 20 20 20  gate then.**    
1f720 20 20 20 20 28 32 61 29 20 74 68 65 20 6f 75 74      (2a) the out
1f730 65 72 20 71 75 65 72 79 20 6d 75 73 74 20 6e 6f  er query must no
1f740 74 20 62 65 20 61 20 6a 6f 69 6e 20 61 6e 64 0a  t be a join and.
1f750 2a 2a 20 20 20 20 20 20 20 20 28 32 62 29 20 74  **        (2b) t
1f760 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 6d  he outer query m
1f770 75 73 74 20 6e 6f 74 20 75 73 65 20 73 75 62 71  ust not use subq
1f780 75 65 72 69 65 73 0a 2a 2a 20 20 20 20 20 20 20  ueries.**       
1f790 20 20 20 20 20 20 6f 74 68 65 72 20 74 68 61 6e        other than
1f7a0 20 74 68 65 20 6f 6e 65 20 46 52 4f 4d 2d 63 6c   the one FROM-cl
1f7b0 61 75 73 65 20 73 75 62 71 75 65 72 79 20 74 68  ause subquery th
1f7c0 61 74 20 69 73 20 61 20 63 61 6e 64 69 64 61 74  at is a candidat
1f7d0 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  e.**            
1f7e0 20 66 6f 72 20 66 6c 61 74 74 65 6e 69 6e 67 2e   for flattening.
1f7f0 20 20 28 54 68 69 73 20 69 73 20 64 75 65 20 74    (This is due t
1f800 6f 20 74 69 63 6b 65 74 20 5b 32 66 37 31 37 30  o ticket [2f7170
1f810 64 37 33 62 66 39 61 62 66 38 30 5d 0a 2a 2a 20  d73bf9abf80].** 
1f820 20 20 20 20 20 20 20 20 20 20 20 20 66 72 6f 6d              from
1f830 20 32 30 31 35 2d 30 32 2d 30 39 2e 29 0a 2a 2a   2015-02-09.).**
1f840 0a 2a 2a 20 20 20 28 33 29 20 20 49 66 20 74 68  .**   (3)  If th
1f850 65 20 73 75 62 71 75 65 72 79 20 69 73 20 74 68  e subquery is th
1f860 65 20 72 69 67 68 74 20 6f 70 65 72 61 6e 64 20  e right operand 
1f870 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e 20 74  of a LEFT JOIN t
1f880 68 65 6e 0a 2a 2a 20 20 20 20 20 20 20 20 28 33  hen.**        (3
1f890 61 29 20 74 68 65 20 73 75 62 71 75 65 72 79 20  a) the subquery 
1f8a0 6d 61 79 20 6e 6f 74 20 62 65 20 61 20 6a 6f 69  may not be a joi
1f8b0 6e 20 61 6e 64 0a 2a 2a 20 20 20 20 20 20 20 20  n and.**        
1f8c0 28 33 62 29 20 74 68 65 20 46 52 4f 4d 20 63 6c  (3b) the FROM cl
1f8d0 61 75 73 65 20 6f 66 20 74 68 65 20 73 75 62 71  ause of the subq
1f8e0 75 65 72 79 20 6d 61 79 20 6e 6f 74 20 63 6f 6e  uery may not con
1f8f0 74 61 69 6e 20 61 20 76 69 72 74 75 61 6c 0a 2a  tain a virtual.*
1f900 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 74 61  *             ta
1f910 62 6c 65 20 61 6e 64 0a 2a 2a 20 20 20 20 20 20  ble and.**      
1f920 20 20 28 33 63 29 20 74 68 65 20 6f 75 74 65 72    (3c) the outer
1f930 20 71 75 65 72 79 20 6d 61 79 20 6e 6f 74 20 62   query may not b
1f940 65 20 61 6e 20 61 67 67 72 65 67 61 74 65 2e 0a  e an aggregate..
1f950 2a 2a 0a 2a 2a 20 20 20 28 34 29 20 20 54 68 65  **.**   (4)  The
1f960 20 73 75 62 71 75 65 72 79 20 63 61 6e 20 6e 6f   subquery can no
1f970 74 20 62 65 20 44 49 53 54 49 4e 43 54 2e 0a 2a  t be DISTINCT..*
1f980 2a 0a 2a 2a 20 20 28 2a 2a 29 20 20 41 74 20 6f  *.**  (**)  At o
1f990 6e 65 20 70 6f 69 6e 74 20 72 65 73 74 72 69 63  ne point restric
1f9a0 74 69 6f 6e 73 20 28 34 29 20 61 6e 64 20 28 35  tions (4) and (5
1f9b0 29 20 64 65 66 69 6e 65 64 20 61 20 73 75 62 73  ) defined a subs
1f9c0 65 74 20 6f 66 20 44 49 53 54 49 4e 43 54 0a 2a  et of DISTINCT.*
1f9d0 2a 20 20 20 20 20 20 20 20 73 75 62 2d 71 75 65  *        sub-que
1f9e0 72 69 65 73 20 74 68 61 74 20 77 65 72 65 20 65  ries that were e
1f9f0 78 63 6c 75 64 65 64 20 66 72 6f 6d 20 74 68 69  xcluded from thi
1fa00 73 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 20  s optimization. 
1fa10 52 65 73 74 72 69 63 74 69 6f 6e 20 0a 2a 2a 20  Restriction .** 
1fa20 20 20 20 20 20 20 20 28 34 29 20 68 61 73 20 73         (4) has s
1fa30 69 6e 63 65 20 62 65 65 6e 20 65 78 70 61 6e 64  ince been expand
1fa40 65 64 20 74 6f 20 65 78 63 6c 75 64 65 20 61 6c  ed to exclude al
1fa50 6c 20 44 49 53 54 49 4e 43 54 20 73 75 62 71 75  l DISTINCT subqu
1fa60 65 72 69 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 28 2a  eries..**.**  (*
1fa70 2a 29 20 20 57 65 20 6e 6f 20 6c 6f 6e 67 65 72  *)  We no longer
1fa80 20 61 74 74 65 6d 70 74 20 74 6f 20 66 6c 61 74   attempt to flat
1fa90 74 65 6e 20 61 67 67 72 65 67 61 74 65 20 73 75  ten aggregate su
1faa0 62 71 75 65 72 69 65 73 2e 20 20 57 61 73 3a 0a  bqueries.  Was:.
1fab0 2a 2a 20 20 20 20 20 20 20 20 49 66 20 74 68 65  **        If the
1fac0 20 73 75 62 71 75 65 72 79 20 69 73 20 61 67 67   subquery is agg
1fad0 72 65 67 61 74 65 2c 20 74 68 65 20 6f 75 74 65  regate, the oute
1fae0 72 20 71 75 65 72 79 20 6d 61 79 20 6e 6f 74 20  r query may not 
1faf0 62 65 20 44 49 53 54 49 4e 43 54 2e 0a 2a 2a 0a  be DISTINCT..**.
1fb00 2a 2a 20 20 20 28 37 29 20 20 54 68 65 20 73 75  **   (7)  The su
1fb10 62 71 75 65 72 79 20 6d 75 73 74 20 68 61 76 65  bquery must have
1fb20 20 61 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20   a FROM clause. 
1fb30 20 54 4f 44 4f 3a 20 20 46 6f 72 20 73 75 62 71   TODO:  For subq
1fb40 75 65 72 69 65 73 20 77 69 74 68 6f 75 74 0a 2a  ueries without.*
1fb50 2a 20 20 20 20 20 20 20 20 41 20 46 52 4f 4d 20  *        A FROM 
1fb60 63 6c 61 75 73 65 2c 20 63 6f 6e 73 69 64 65 72  clause, consider
1fb70 20 61 64 64 69 6e 67 20 61 20 46 52 4f 4d 20 63   adding a FROM c
1fb80 6c 61 75 73 65 20 77 69 74 68 20 74 68 65 20 73  lause with the s
1fb90 70 65 63 69 61 6c 0a 2a 2a 20 20 20 20 20 20 20  pecial.**       
1fba0 20 74 61 62 6c 65 20 73 71 6c 69 74 65 5f 6f 6e   table sqlite_on
1fbb0 63 65 20 74 68 61 74 20 63 6f 6e 73 69 73 74 73  ce that consists
1fbc0 20 6f 66 20 61 20 73 69 6e 67 6c 65 20 72 6f 77   of a single row
1fbd0 20 63 6f 6e 74 61 69 6e 69 6e 67 20 61 0a 2a 2a   containing a.**
1fbe0 20 20 20 20 20 20 20 20 73 69 6e 67 6c 65 20 4e          single N
1fbf0 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 38 29  ULL..**.**   (8)
1fc00 20 20 49 66 20 74 68 65 20 73 75 62 71 75 65 72    If the subquer
1fc10 79 20 75 73 65 73 20 4c 49 4d 49 54 20 74 68 65  y uses LIMIT the
1fc20 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  n the outer quer
1fc30 79 20 6d 61 79 20 6e 6f 74 20 62 65 20 61 20 6a  y may not be a j
1fc40 6f 69 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 39 29  oin..**.**   (9)
1fc50 20 20 49 66 20 74 68 65 20 73 75 62 71 75 65 72    If the subquer
1fc60 79 20 75 73 65 73 20 4c 49 4d 49 54 20 74 68 65  y uses LIMIT the
1fc70 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  n the outer quer
1fc80 79 20 6d 61 79 20 6e 6f 74 20 62 65 20 61 67 67  y may not be agg
1fc90 72 65 67 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 20 28  regate..**.**  (
1fca0 2a 2a 29 20 20 52 65 73 74 72 69 63 74 69 6f 6e  **)  Restriction
1fcb0 20 28 31 30 29 20 77 61 73 20 72 65 6d 6f 76 65   (10) was remove
1fcc0 64 20 66 72 6f 6d 20 74 68 65 20 63 6f 64 65 20  d from the code 
1fcd0 6f 6e 20 32 30 30 35 2d 30 32 2d 30 35 20 62 75  on 2005-02-05 bu
1fce0 74 20 77 65 0a 2a 2a 20 20 20 20 20 20 20 20 61  t we.**        a
1fcf0 63 63 69 64 65 6e 74 6c 79 20 63 61 72 72 69 65  ccidently carrie
1fd00 64 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20 66 6f  d the comment fo
1fd10 72 77 61 72 64 20 75 6e 74 69 6c 20 32 30 31 34  rward until 2014
1fd20 2d 30 39 2d 31 35 2e 20 20 4f 72 69 67 69 6e 61  -09-15.  Origina
1fd30 6c 0a 2a 2a 20 20 20 20 20 20 20 20 63 6f 6e 73  l.**        cons
1fd40 74 72 61 69 6e 74 3a 20 22 49 66 20 74 68 65 20  traint: "If the 
1fd50 73 75 62 71 75 65 72 79 20 69 73 20 61 67 67 72  subquery is aggr
1fd60 65 67 61 74 65 20 74 68 65 6e 20 74 68 65 20 6f  egate then the o
1fd70 75 74 65 72 20 71 75 65 72 79 20 0a 2a 2a 20 20  uter query .**  
1fd80 20 20 20 20 20 20 6d 61 79 20 6e 6f 74 20 75 73        may not us
1fd90 65 20 4c 49 4d 49 54 2e 22 0a 2a 2a 0a 2a 2a 20  e LIMIT.".**.** 
1fda0 20 28 31 31 29 20 20 54 68 65 20 73 75 62 71 75   (11)  The subqu
1fdb0 65 72 79 20 61 6e 64 20 74 68 65 20 6f 75 74 65  ery and the oute
1fdc0 72 20 71 75 65 72 79 20 6d 61 79 20 6e 6f 74 20  r query may not 
1fdd0 62 6f 74 68 20 68 61 76 65 20 4f 52 44 45 52 20  both have ORDER 
1fde0 42 59 20 63 6c 61 75 73 65 73 2e 0a 2a 2a 0a 2a  BY clauses..**.*
1fdf0 2a 20 20 28 2a 2a 29 20 20 4e 6f 74 20 69 6d 70  *  (**)  Not imp
1fe00 6c 65 6d 65 6e 74 65 64 2e 20 20 53 75 62 73 75  lemented.  Subsu
1fe10 6d 65 64 20 69 6e 74 6f 20 72 65 73 74 72 69 63  med into restric
1fe20 74 69 6f 6e 20 28 33 29 2e 20 20 57 61 73 20 70  tion (3).  Was p
1fe30 72 65 76 69 6f 75 73 6c 79 0a 2a 2a 20 20 20 20  reviously.**    
1fe40 20 20 20 20 61 20 73 65 70 61 72 61 74 65 20 72      a separate r
1fe50 65 73 74 72 69 63 74 69 6f 6e 20 64 65 72 69 76  estriction deriv
1fe60 69 6e 67 20 66 72 6f 6d 20 74 69 63 6b 65 74 20  ing from ticket 
1fe70 23 33 35 30 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 33  #350..**.**  (13
1fe80 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20  )  The subquery 
1fe90 61 6e 64 20 6f 75 74 65 72 20 71 75 65 72 79 20  and outer query 
1fea0 6d 61 79 20 6e 6f 74 20 62 6f 74 68 20 75 73 65  may not both use
1feb0 20 4c 49 4d 49 54 2e 0a 2a 2a 0a 2a 2a 20 20 28   LIMIT..**.**  (
1fec0 31 34 29 20 20 54 68 65 20 73 75 62 71 75 65 72  14)  The subquer
1fed0 79 20 6d 61 79 20 6e 6f 74 20 75 73 65 20 4f 46  y may not use OF
1fee0 46 53 45 54 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 35  FSET..**.**  (15
1fef0 29 20 20 49 66 20 74 68 65 20 6f 75 74 65 72 20  )  If the outer 
1ff00 71 75 65 72 79 20 69 73 20 70 61 72 74 20 6f 66  query is part of
1ff10 20 61 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65   a compound sele
1ff20 63 74 2c 20 74 68 65 6e 20 74 68 65 0a 2a 2a 20  ct, then the.** 
1ff30 20 20 20 20 20 20 20 73 75 62 71 75 65 72 79 20         subquery 
1ff40 6d 61 79 20 6e 6f 74 20 75 73 65 20 4c 49 4d 49  may not use LIMI
1ff50 54 2e 0a 2a 2a 20 20 20 20 20 20 20 20 28 53 65  T..**        (Se
1ff60 65 20 74 69 63 6b 65 74 20 23 32 33 33 39 20 61  e ticket #2339 a
1ff70 6e 64 20 74 69 63 6b 65 74 20 5b 30 32 61 38 65  nd ticket [02a8e
1ff80 38 31 64 34 34 5d 29 2e 0a 2a 2a 0a 2a 2a 20 20  81d44])..**.**  
1ff90 28 31 36 29 20 20 49 66 20 74 68 65 20 6f 75 74  (16)  If the out
1ffa0 65 72 20 71 75 65 72 79 20 69 73 20 61 67 67 72  er query is aggr
1ffb0 65 67 61 74 65 2c 20 74 68 65 6e 20 74 68 65 20  egate, then the 
1ffc0 73 75 62 71 75 65 72 79 20 6d 61 79 20 6e 6f 74  subquery may not
1ffd0 0a 2a 2a 20 20 20 20 20 20 20 20 75 73 65 20 4f  .**        use O
1ffe0 52 44 45 52 20 42 59 2e 20 20 28 54 69 63 6b 65  RDER BY.  (Ticke
1fff0 74 20 23 32 39 34 32 29 20 20 54 68 69 73 20 75  t #2942)  This u
20000 73 65 64 20 74 6f 20 6e 6f 74 20 6d 61 74 74 65  sed to not matte
20010 72 0a 2a 2a 20 20 20 20 20 20 20 20 75 6e 74 69  r.**        unti
20020 6c 20 77 65 20 69 6e 74 72 6f 64 75 63 65 64 20  l we introduced 
20030 74 68 65 20 67 72 6f 75 70 5f 63 6f 6e 63 61 74  the group_concat
20040 28 29 20 66 75 6e 63 74 69 6f 6e 2e 20 20 0a 2a  () function.  .*
20050 2a 0a 2a 2a 20 20 28 31 37 29 20 20 49 66 20 74  *.**  (17)  If t
20060 68 65 20 73 75 62 71 75 65 72 79 20 69 73 20 61  he subquery is a
20070 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74   compound select
20080 2c 20 74 68 65 6e 0a 2a 2a 20 20 20 20 20 20 20  , then.**       
20090 20 28 31 37 61 29 20 61 6c 6c 20 63 6f 6d 70 6f   (17a) all compo
200a0 75 6e 64 20 6f 70 65 72 61 74 6f 72 73 20 6d 75  und operators mu
200b0 73 74 20 62 65 20 61 20 55 4e 49 4f 4e 20 41 4c  st be a UNION AL
200c0 4c 2c 20 61 6e 64 0a 2a 2a 20 20 20 20 20 20 20  L, and.**       
200d0 20 28 31 37 62 29 20 6e 6f 20 74 65 72 6d 73 20   (17b) no terms 
200e0 77 69 74 68 69 6e 20 74 68 65 20 73 75 62 71 75  within the subqu
200f0 65 72 79 20 63 6f 6d 70 6f 75 6e 64 20 6d 61 79  ery compound may
20100 20 62 65 20 61 67 67 72 65 67 61 74 65 0a 2a 2a   be aggregate.**
20110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 72                or
20120 20 44 49 53 54 49 4e 43 54 2c 20 61 6e 64 0a 2a   DISTINCT, and.*
20130 2a 20 20 20 20 20 20 20 20 28 31 37 63 29 20 65  *        (17c) e
20140 76 65 72 79 20 74 65 72 6d 20 77 69 74 68 69 6e  very term within
20150 20 74 68 65 20 73 75 62 71 75 65 72 79 20 63 6f   the subquery co
20160 6d 70 6f 75 6e 64 20 6d 75 73 74 20 68 61 76 65  mpound must have
20170 20 61 20 46 52 4f 4d 20 63 6c 61 75 73 65 0a 2a   a FROM clause.*
20180 2a 20 20 20 20 20 20 20 20 28 31 37 64 29 20 74  *        (17d) t
20190 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 6d  he outer query m
201a0 61 79 20 6e 6f 74 20 62 65 0a 2a 2a 20 20 20 20  ay not be.**    
201b0 20 20 20 20 20 20 20 20 20 20 28 31 37 64 31 29            (17d1)
201c0 20 61 67 67 72 65 67 61 74 65 2c 20 6f 72 0a 2a   aggregate, or.*
201d0 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28  *              (
201e0 31 37 64 32 29 20 44 49 53 54 49 4e 43 54 2c 20  17d2) DISTINCT, 
201f0 6f 72 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  or.**           
20200 20 20 20 28 31 37 64 33 29 20 61 20 6a 6f 69 6e     (17d3) a join
20210 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 54  ..**.**        T
20220 68 65 20 70 61 72 65 6e 74 20 61 6e 64 20 73 75  he parent and su
20230 62 2d 71 75 65 72 79 20 6d 61 79 20 63 6f 6e 74  b-query may cont
20240 61 69 6e 20 57 48 45 52 45 20 63 6c 61 75 73 65  ain WHERE clause
20250 73 2e 20 53 75 62 6a 65 63 74 20 74 6f 0a 2a 2a  s. Subject to.**
20260 20 20 20 20 20 20 20 20 72 75 6c 65 73 20 28 31          rules (1
20270 31 29 2c 20 28 31 33 29 20 61 6e 64 20 28 31 34  1), (13) and (14
20280 29 2c 20 74 68 65 79 20 6d 61 79 20 61 6c 73 6f  ), they may also
20290 20 63 6f 6e 74 61 69 6e 20 4f 52 44 45 52 20 42   contain ORDER B
202a0 59 2c 0a 2a 2a 20 20 20 20 20 20 20 20 4c 49 4d  Y,.**        LIM
202b0 49 54 20 61 6e 64 20 4f 46 46 53 45 54 20 63 6c  IT and OFFSET cl
202c0 61 75 73 65 73 2e 20 20 54 68 65 20 73 75 62 71  auses.  The subq
202d0 75 65 72 79 20 63 61 6e 6e 6f 74 20 75 73 65 20  uery cannot use 
202e0 61 6e 79 20 63 6f 6d 70 6f 75 6e 64 0a 2a 2a 20  any compound.** 
202f0 20 20 20 20 20 20 20 6f 70 65 72 61 74 6f 72 20         operator 
20300 6f 74 68 65 72 20 74 68 61 6e 20 55 4e 49 4f 4e  other than UNION
20310 20 41 4c 4c 20 62 65 63 61 75 73 65 20 61 6c 6c   ALL because all
20320 20 74 68 65 20 6f 74 68 65 72 20 63 6f 6d 70 6f   the other compo
20330 75 6e 64 0a 2a 2a 20 20 20 20 20 20 20 20 6f 70  und.**        op
20340 65 72 61 74 6f 72 73 20 68 61 76 65 20 61 6e 20  erators have an 
20350 69 6d 70 6c 69 65 64 20 44 49 53 54 49 4e 43 54  implied DISTINCT
20360 20 77 68 69 63 68 20 69 73 20 64 69 73 61 6c 6c   which is disall
20370 6f 77 65 64 20 62 79 0a 2a 2a 20 20 20 20 20 20  owed by.**      
20380 20 20 72 65 73 74 72 69 63 74 69 6f 6e 20 28 34    restriction (4
20390 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20  )..**.**        
203a0 41 6c 73 6f 2c 20 65 61 63 68 20 63 6f 6d 70 6f  Also, each compo
203b0 6e 65 6e 74 20 6f 66 20 74 68 65 20 73 75 62 2d  nent of the sub-
203c0 71 75 65 72 79 20 6d 75 73 74 20 72 65 74 75 72  query must retur
203d0 6e 20 74 68 65 20 73 61 6d 65 20 6e 75 6d 62 65  n the same numbe
203e0 72 0a 2a 2a 20 20 20 20 20 20 20 20 6f 66 20 72  r.**        of r
203f0 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 2e 20 54  esult columns. T
20400 68 69 73 20 69 73 20 61 63 74 75 61 6c 6c 79 20  his is actually 
20410 61 20 72 65 71 75 69 72 65 6d 65 6e 74 20 66 6f  a requirement fo
20420 72 20 61 6e 79 20 63 6f 6d 70 6f 75 6e 64 0a 2a  r any compound.*
20430 2a 20 20 20 20 20 20 20 20 53 45 4c 45 43 54 20  *        SELECT 
20440 73 74 61 74 65 6d 65 6e 74 2c 20 62 75 74 20 61  statement, but a
20450 6c 6c 20 74 68 65 20 63 6f 64 65 20 68 65 72 65  ll the code here
20460 20 64 6f 65 73 20 69 73 20 6d 61 6b 65 20 73 75   does is make su
20470 72 65 20 74 68 61 74 20 6e 6f 0a 2a 2a 20 20 20  re that no.**   
20480 20 20 20 20 20 73 75 63 68 20 28 69 6c 6c 65 67       such (illeg
20490 61 6c 29 20 73 75 62 2d 71 75 65 72 79 20 69 73  al) sub-query is
204a0 20 66 6c 61 74 74 65 6e 65 64 2e 20 54 68 65 20   flattened. The 
204b0 63 61 6c 6c 65 72 20 77 69 6c 6c 20 64 65 74 65  caller will dete
204c0 63 74 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20  ct the.**       
204d0 20 73 79 6e 74 61 78 20 65 72 72 6f 72 20 61 6e   syntax error an
204e0 64 20 72 65 74 75 72 6e 20 61 20 64 65 74 61 69  d return a detai
204f0 6c 65 64 20 6d 65 73 73 61 67 65 2e 0a 2a 2a 0a  led message..**.
20500 2a 2a 20 20 28 31 38 29 20 20 49 66 20 74 68 65  **  (18)  If the
20510 20 73 75 62 2d 71 75 65 72 79 20 69 73 20 61 20   sub-query is a 
20520 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 2c  compound select,
20530 20 74 68 65 6e 20 61 6c 6c 20 74 65 72 6d 73 20   then all terms 
20540 6f 66 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20  of the.**       
20550 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
20560 20 6f 66 20 74 68 65 20 70 61 72 65 6e 74 20 6d   of the parent m
20570 75 73 74 20 62 65 20 73 69 6d 70 6c 65 20 72 65  ust be simple re
20580 66 65 72 65 6e 63 65 73 20 74 6f 20 0a 2a 2a 20  ferences to .** 
20590 20 20 20 20 20 20 20 63 6f 6c 75 6d 6e 73 20 6f         columns o
205a0 66 20 74 68 65 20 73 75 62 2d 71 75 65 72 79 2e  f the sub-query.
205b0 0a 2a 2a 0a 2a 2a 20 20 28 31 39 29 20 20 49 66  .**.**  (19)  If
205c0 20 74 68 65 20 73 75 62 71 75 65 72 79 20 75 73   the subquery us
205d0 65 73 20 4c 49 4d 49 54 20 74 68 65 6e 20 74 68  es LIMIT then th
205e0 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 6d 61  e outer query ma
205f0 79 20 6e 6f 74 0a 2a 2a 20 20 20 20 20 20 20 20  y not.**        
20600 68 61 76 65 20 61 20 57 48 45 52 45 20 63 6c 61  have a WHERE cla
20610 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 20 28 32 30 29  use..**.**  (20)
20620 20 20 49 66 20 74 68 65 20 73 75 62 2d 71 75 65    If the sub-que
20630 72 79 20 69 73 20 61 20 63 6f 6d 70 6f 75 6e 64  ry is a compound
20640 20 73 65 6c 65 63 74 2c 20 74 68 65 6e 20 69 74   select, then it
20650 20 6d 75 73 74 20 6e 6f 74 20 75 73 65 0a 2a 2a   must not use.**
20660 20 20 20 20 20 20 20 20 61 6e 20 4f 52 44 45 52          an ORDER
20670 20 42 59 20 63 6c 61 75 73 65 2e 20 20 54 69 63   BY clause.  Tic
20680 6b 65 74 20 23 33 37 37 33 2e 20 20 57 65 20 63  ket #3773.  We c
20690 6f 75 6c 64 20 72 65 6c 61 78 20 74 68 69 73 20  ould relax this 
206a0 63 6f 6e 73 74 72 61 69 6e 74 0a 2a 2a 20 20 20  constraint.**   
206b0 20 20 20 20 20 73 6f 6d 65 77 68 61 74 20 62 79       somewhat by
206c0 20 73 61 79 69 6e 67 20 74 68 61 74 20 74 68 65   saying that the
206d0 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 4f 52   terms of the OR
206e0 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 6d 75  DER BY clause mu
206f0 73 74 0a 2a 2a 20 20 20 20 20 20 20 20 61 70 70  st.**        app
20700 65 61 72 20 61 73 20 75 6e 6d 6f 64 69 66 69 65  ear as unmodifie
20710 64 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73  d result columns
20720 20 69 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75   in the outer qu
20730 65 72 79 2e 20 20 42 75 74 20 77 65 0a 2a 2a 20  ery.  But we.** 
20740 20 20 20 20 20 20 20 68 61 76 65 20 6f 74 68 65         have othe
20750 72 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20  r optimizations 
20760 69 6e 20 6d 69 6e 64 20 74 6f 20 64 65 61 6c 20  in mind to deal 
20770 77 69 74 68 20 74 68 61 74 20 63 61 73 65 2e 0a  with that case..
20780 2a 2a 0a 2a 2a 20 20 28 32 31 29 20 20 49 66 20  **.**  (21)  If 
20790 74 68 65 20 73 75 62 71 75 65 72 79 20 75 73 65  the subquery use
207a0 73 20 4c 49 4d 49 54 20 74 68 65 6e 20 74 68 65  s LIMIT then the
207b0 20 6f 75 74 65 72 20 71 75 65 72 79 20 6d 61 79   outer query may
207c0 20 6e 6f 74 20 62 65 0a 2a 2a 20 20 20 20 20 20   not be.**      
207d0 20 20 44 49 53 54 49 4e 43 54 2e 20 20 28 53 65    DISTINCT.  (Se
207e0 65 20 74 69 63 6b 65 74 20 5b 37 35 32 65 31 36  e ticket [752e16
207f0 34 36 66 63 5d 29 2e 0a 2a 2a 0a 2a 2a 20 20 28  46fc])..**.**  (
20800 32 32 29 20 20 54 68 65 20 73 75 62 71 75 65 72  22)  The subquer
20810 79 20 6d 61 79 20 6e 6f 74 20 62 65 20 61 20 72  y may not be a r
20820 65 63 75 72 73 69 76 65 20 43 54 45 2e 0a 2a 2a  ecursive CTE..**
20830 0a 2a 2a 20 20 28 2a 2a 29 20 20 53 75 62 73 75  .**  (**)  Subsu
20840 6d 65 64 20 69 6e 74 6f 20 72 65 73 74 72 69 63  med into restric
20850 74 69 6f 6e 20 28 31 37 64 33 29 2e 20 20 57 61  tion (17d3).  Wa
20860 73 3a 20 49 66 20 74 68 65 20 6f 75 74 65 72 20  s: If the outer 
20870 71 75 65 72 79 20 69 73 0a 2a 2a 20 20 20 20 20  query is.**     
20880 20 20 20 61 20 72 65 63 75 72 73 69 76 65 20 43     a recursive C
20890 54 45 2c 20 74 68 65 6e 20 74 68 65 20 73 75 62  TE, then the sub
208a0 2d 71 75 65 72 79 20 6d 61 79 20 6e 6f 74 20 62  -query may not b
208b0 65 20 61 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65  e a compound que
208c0 72 79 2e 0a 2a 2a 20 20 20 20 20 20 20 20 54 68  ry..**        Th
208d0 69 73 20 72 65 73 74 72 69 63 74 69 6f 6e 20 69  is restriction i
208e0 73 20 62 65 63 61 75 73 65 20 74 72 61 6e 73 66  s because transf
208f0 6f 72 6d 69 6e 67 20 74 68 65 0a 2a 2a 20 20 20  orming the.**   
20900 20 20 20 20 20 70 61 72 65 6e 74 20 74 6f 20 61       parent to a
20910 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79 20   compound query 
20920 63 6f 6e 66 75 73 65 73 20 74 68 65 20 63 6f 64  confuses the cod
20930 65 20 74 68 61 74 20 68 61 6e 64 6c 65 73 0a 2a  e that handles.*
20940 2a 20 20 20 20 20 20 20 20 72 65 63 75 72 73 69  *        recursi
20950 76 65 20 71 75 65 72 69 65 73 20 69 6e 20 6d 75  ve queries in mu
20960 6c 74 69 53 65 6c 65 63 74 28 29 2e 0a 2a 2a 0a  ltiSelect()..**.
20970 2a 2a 20 20 28 2a 2a 29 20 20 57 65 20 6e 6f 20  **  (**)  We no 
20980 6c 6f 6e 67 65 72 20 61 74 74 65 6d 70 74 20 74  longer attempt t
20990 6f 20 66 6c 61 74 74 65 6e 20 61 67 67 72 65 67  o flatten aggreg
209a0 61 74 65 20 73 75 62 71 75 65 72 69 65 73 2e 20  ate subqueries. 
209b0 20 57 61 73 3a 0a 2a 2a 20 20 20 20 20 20 20 20   Was:.**        
209c0 54 68 65 20 73 75 62 71 75 65 72 79 20 6d 61 79  The subquery may
209d0 20 6e 6f 74 20 62 65 20 61 6e 20 61 67 67 72 65   not be an aggre
209e0 67 61 74 65 20 74 68 61 74 20 75 73 65 73 20 74  gate that uses t
209f0 68 65 20 62 75 69 6c 74 2d 69 6e 20 6d 69 6e 28  he built-in min(
20a00 29 20 6f 72 20 0a 2a 2a 20 20 20 20 20 20 20 20  ) or .**        
20a10 6f 72 20 6d 61 78 28 29 20 66 75 6e 63 74 69 6f  or max() functio
20a20 6e 73 2e 20 20 28 57 69 74 68 6f 75 74 20 74 68  ns.  (Without th
20a30 69 73 20 72 65 73 74 72 69 63 74 69 6f 6e 2c 20  is restriction, 
20a40 61 20 71 75 65 72 79 20 6c 69 6b 65 3a 0a 2a 2a  a query like:.**
20a50 20 20 20 20 20 20 20 20 22 53 45 4c 45 43 54 20          "SELECT 
20a60 78 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20 6d  x FROM (SELECT m
20a70 61 78 28 79 29 2c 20 78 20 46 52 4f 4d 20 74 31  ax(y), x FROM t1
20a80 29 22 20 77 6f 75 6c 64 20 6e 6f 74 20 6e 65 63  )" would not nec
20a90 65 73 73 61 72 69 6c 79 0a 2a 2a 20 20 20 20 20  essarily.**     
20aa0 20 20 20 72 65 74 75 72 6e 20 74 68 65 20 76 61     return the va
20ab0 6c 75 65 20 58 20 66 6f 72 20 77 68 69 63 68 20  lue X for which 
20ac0 59 20 77 61 73 20 6d 61 78 69 6d 61 6c 2e 29 0a  Y was maximal.).
20ad0 2a 2a 0a 2a 2a 20 20 28 32 35 29 20 20 49 66 20  **.**  (25)  If 
20ae0 65 69 74 68 65 72 20 74 68 65 20 73 75 62 71 75  either the subqu
20af0 65 72 79 20 6f 72 20 74 68 65 20 70 61 72 65 6e  ery or the paren
20b00 74 20 71 75 65 72 79 20 63 6f 6e 74 61 69 6e 73  t query contains
20b10 20 61 20 77 69 6e 64 6f 77 0a 2a 2a 20 20 20 20   a window.**    
20b20 20 20 20 20 66 75 6e 63 74 69 6f 6e 20 69 6e 20      function in 
20b30 74 68 65 20 73 65 6c 65 63 74 20 6c 69 73 74 20  the select list 
20b40 6f 72 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  or ORDER BY clau
20b50 73 65 2c 20 66 6c 61 74 74 65 6e 69 6e 67 0a 2a  se, flattening.*
20b60 2a 20 20 20 20 20 20 20 20 69 73 20 6e 6f 74 20  *        is not 
20b70 61 74 74 65 6d 70 74 65 64 2e 0a 2a 2a 0a 2a 2a  attempted..**.**
20b80 0a 2a 2a 20 49 6e 20 74 68 69 73 20 72 6f 75 74  .** In this rout
20b90 69 6e 65 2c 20 74 68 65 20 22 70 22 20 70 61 72  ine, the "p" par
20ba0 61 6d 65 74 65 72 20 69 73 20 61 20 70 6f 69 6e  ameter is a poin
20bb0 74 65 72 20 74 6f 20 74 68 65 20 6f 75 74 65 72  ter to the outer
20bc0 20 71 75 65 72 79 2e 0a 2a 2a 20 54 68 65 20 73   query..** The s
20bd0 75 62 71 75 65 72 79 20 69 73 20 70 2d 3e 70 53  ubquery is p->pS
20be0 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d 2e 20 20 69  rc->a[iFrom].  i
20bf0 73 41 67 67 20 69 73 20 74 72 75 65 20 69 66 20  sAgg is true if 
20c00 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 0a  the outer query.
20c10 2a 2a 20 75 73 65 73 20 61 67 67 72 65 67 61 74  ** uses aggregat
20c20 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 66 6c 61  es..**.** If fla
20c30 74 74 65 6e 69 6e 67 20 69 73 20 6e 6f 74 20 61  ttening is not a
20c40 74 74 65 6d 70 74 65 64 2c 20 74 68 69 73 20 72  ttempted, this r
20c50 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f  outine is a no-o
20c60 70 20 61 6e 64 20 72 65 74 75 72 6e 73 20 30 2e  p and returns 0.
20c70 0a 2a 2a 20 49 66 20 66 6c 61 74 74 65 6e 69 6e  .** If flattenin
20c80 67 20 69 73 20 61 74 74 65 6d 70 74 65 64 20 74  g is attempted t
20c90 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75  his routine retu
20ca0 72 6e 73 20 31 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c  rns 1..**.** All
20cb0 20 6f 66 20 74 68 65 20 65 78 70 72 65 73 73 69   of the expressi
20cc0 6f 6e 20 61 6e 61 6c 79 73 69 73 20 6d 75 73 74  on analysis must
20cd0 20 6f 63 63 75 72 20 6f 6e 20 62 6f 74 68 20 74   occur on both t
20ce0 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 61  he outer query a
20cf0 6e 64 0a 2a 2a 20 74 68 65 20 73 75 62 71 75 65  nd.** the subque
20d00 72 79 20 62 65 66 6f 72 65 20 74 68 69 73 20 72  ry before this r
20d10 6f 75 74 69 6e 65 20 72 75 6e 73 2e 0a 2a 2f 0a  outine runs..*/.
20d20 73 74 61 74 69 63 20 69 6e 74 20 66 6c 61 74 74  static int flatt
20d30 65 6e 53 75 62 71 75 65 72 79 28 0a 20 20 50 61  enSubquery(.  Pa
20d40 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
20d50 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
20d60 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63  ntext */.  Selec
20d70 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  t *p,           
20d80 2f 2a 20 54 68 65 20 70 61 72 65 6e 74 20 6f 72  /* The parent or
20d90 20 6f 75 74 65 72 20 53 45 4c 45 43 54 20 73 74   outer SELECT st
20da0 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74  atement */.  int
20db0 20 69 46 72 6f 6d 2c 20 20 20 20 20 20 20 20 20   iFrom,         
20dc0 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e 20 70 2d    /* Index in p-
20dd0 3e 70 53 72 63 2d 3e 61 5b 5d 20 6f 66 20 74 68  >pSrc->a[] of th
20de0 65 20 69 6e 6e 65 72 20 73 75 62 71 75 65 72 79  e inner subquery
20df0 20 2a 2f 0a 20 20 69 6e 74 20 69 73 41 67 67 20   */.  int isAgg 
20e00 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
20e10 75 65 20 69 66 20 6f 75 74 65 72 20 53 45 4c 45  ue if outer SELE
20e20 43 54 20 75 73 65 73 20 61 67 67 72 65 67 61 74  CT uses aggregat
20e30 65 20 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 29  e functions */.)
20e40 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  {.  const char *
20e50 7a 53 61 76 65 64 41 75 74 68 43 6f 6e 74 65 78  zSavedAuthContex
20e60 74 20 3d 20 70 50 61 72 73 65 2d 3e 7a 41 75 74  t = pParse->zAut
20e70 68 43 6f 6e 74 65 78 74 3b 0a 20 20 53 65 6c 65  hContext;.  Sele
20e80 63 74 20 2a 70 50 61 72 65 6e 74 3b 20 20 20 20  ct *pParent;    
20e90 2f 2a 20 43 75 72 72 65 6e 74 20 55 4e 49 4f 4e  /* Current UNION
20ea0 20 41 4c 4c 20 74 65 72 6d 20 6f 66 20 74 68 65   ALL term of the
20eb0 20 6f 74 68 65 72 20 71 75 65 72 79 20 2a 2f 0a   other query */.
20ec0 20 20 53 65 6c 65 63 74 20 2a 70 53 75 62 3b 20    Select *pSub; 
20ed0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 6e        /* The inn
20ee0 65 72 20 71 75 65 72 79 20 6f 72 20 22 73 75 62  er query or "sub
20ef0 71 75 65 72 79 22 20 2a 2f 0a 20 20 53 65 6c 65  query" */.  Sele
20f00 63 74 20 2a 70 53 75 62 31 3b 20 20 20 20 20 20  ct *pSub1;      
20f10 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 74 68  /* Pointer to th
20f20 65 20 72 69 67 68 74 6d 6f 73 74 20 73 65 6c 65  e rightmost sele
20f30 63 74 20 69 6e 20 73 75 62 2d 71 75 65 72 79 20  ct in sub-query 
20f40 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53  */.  SrcList *pS
20f50 72 63 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20  rc;      /* The 
20f60 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74  FROM clause of t
20f70 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 2a  he outer query *
20f80 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53 75  /.  SrcList *pSu
20f90 62 53 72 63 3b 20 20 20 2f 2a 20 54 68 65 20 46  bSrc;   /* The F
20fa0 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68  ROM clause of th
20fb0 65 20 73 75 62 71 75 65 72 79 20 2a 2f 0a 20 20  e subquery */.  
20fc0 69 6e 74 20 69 50 61 72 65 6e 74 3b 20 20 20 20  int iParent;    
20fd0 20 20 20 20 2f 2a 20 56 44 42 45 20 63 75 72 73      /* VDBE curs
20fe0 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65  or number of the
20ff0 20 70 53 75 62 20 72 65 73 75 6c 74 20 73 65 74   pSub result set
21000 20 74 65 6d 70 20 74 61 62 6c 65 20 2a 2f 0a 20   temp table */. 
21010 20 69 6e 74 20 69 4e 65 77 50 61 72 65 6e 74 20   int iNewParent 
21020 3d 20 2d 31 3b 2f 2a 20 52 65 70 6c 61 63 65 6d  = -1;/* Replacem
21030 65 6e 74 20 74 61 62 6c 65 20 66 6f 72 20 69 50  ent table for iP
21040 61 72 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 69  arent */.  int i
21050 73 4c 65 66 74 4a 6f 69 6e 20 3d 20 30 3b 20 2f  sLeftJoin = 0; /
21060 2a 20 54 72 75 65 20 69 66 20 70 53 75 62 20 69  * True if pSub i
21070 73 20 74 68 65 20 72 69 67 68 74 20 73 69 64 65  s the right side
21080 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e 20   of a LEFT JOIN 
21090 2a 2f 20 20 20 20 0a 20 20 69 6e 74 20 69 3b 20  */    .  int i; 
210a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
210b0 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  Loop counter */.
210c0 20 20 45 78 70 72 20 2a 70 57 68 65 72 65 3b 20    Expr *pWhere; 
210d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
210e0 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20     /* The WHERE 
210f0 63 6c 61 75 73 65 20 2a 2f 0a 20 20 73 74 72 75  clause */.  stru
21100 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
21110 2a 70 53 75 62 69 74 65 6d 3b 20 20 20 2f 2a 20  *pSubitem;   /* 
21120 54 68 65 20 73 75 62 71 75 65 72 79 20 2a 2f 0a  The subquery */.
21130 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
21140 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 2f  pParse->db;..  /
21150 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69  * Check to see i
21160 66 20 66 6c 61 74 74 65 6e 69 6e 67 20 69 73 20  f flattening is 
21170 70 65 72 6d 69 74 74 65 64 2e 20 20 52 65 74 75  permitted.  Retu
21180 72 6e 20 30 20 69 66 20 6e 6f 74 2e 0a 20 20 2a  rn 0 if not..  *
21190 2f 0a 20 20 61 73 73 65 72 74 28 20 70 21 3d 30  /.  assert( p!=0
211a0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d   );.  assert( p-
211b0 3e 70 50 72 69 6f 72 3d 3d 30 20 29 3b 0a 20 20  >pPrior==0 );.  
211c0 69 66 28 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e  if( Optimization
211d0 44 69 73 61 62 6c 65 64 28 64 62 2c 20 53 51 4c  Disabled(db, SQL
211e0 49 54 45 5f 51 75 65 72 79 46 6c 61 74 74 65 6e  ITE_QueryFlatten
211f0 65 72 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  er) ) return 0;.
21200 20 20 70 53 72 63 20 3d 20 70 2d 3e 70 53 72 63    pSrc = p->pSrc
21210 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 72 63  ;.  assert( pSrc
21220 20 26 26 20 69 46 72 6f 6d 3e 3d 30 20 26 26 20   && iFrom>=0 && 
21230 69 46 72 6f 6d 3c 70 53 72 63 2d 3e 6e 53 72 63  iFrom<pSrc->nSrc
21240 20 29 3b 0a 20 20 70 53 75 62 69 74 65 6d 20 3d   );.  pSubitem =
21250 20 26 70 53 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d   &pSrc->a[iFrom]
21260 3b 0a 20 20 69 50 61 72 65 6e 74 20 3d 20 70 53  ;.  iParent = pS
21270 75 62 69 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b  ubitem->iCursor;
21280 0a 20 20 70 53 75 62 20 3d 20 70 53 75 62 69 74  .  pSub = pSubit
21290 65 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a 20 20 61  em->pSelect;.  a
212a0 73 73 65 72 74 28 20 70 53 75 62 21 3d 30 20 29  ssert( pSub!=0 )
212b0 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ;..#ifndef SQLIT
212c0 45 5f 4f 4d 49 54 5f 57 49 4e 44 4f 57 46 55 4e  E_OMIT_WINDOWFUN
212d0 43 0a 20 20 69 66 28 20 70 2d 3e 70 57 69 6e 20  C.  if( p->pWin 
212e0 7c 7c 20 70 53 75 62 2d 3e 70 57 69 6e 20 29 20  || pSub->pWin ) 
212f0 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20  return 0;       
21300 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
21310 73 74 72 69 63 74 69 6f 6e 20 28 32 35 29 20 2a  striction (25) *
21320 2f 0a 23 65 6e 64 69 66 0a 0a 20 20 70 53 75 62  /.#endif..  pSub
21330 53 72 63 20 3d 20 70 53 75 62 2d 3e 70 53 72 63  Src = pSub->pSrc
21340 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 75 62  ;.  assert( pSub
21350 53 72 63 20 29 3b 0a 20 20 2f 2a 20 50 72 69 6f  Src );.  /* Prio
21360 72 20 74 6f 20 76 65 72 73 69 6f 6e 20 33 2e 31  r to version 3.1
21370 2e 32 2c 20 77 68 65 6e 20 4c 49 4d 49 54 20 61  .2, when LIMIT a
21380 6e 64 20 4f 46 46 53 45 54 20 68 61 64 20 74 6f  nd OFFSET had to
21390 20 62 65 20 73 69 6d 70 6c 65 20 63 6f 6e 73 74   be simple const
213a0 61 6e 74 73 2c 0a 20 20 2a 2a 20 6e 6f 74 20 61  ants,.  ** not a
213b0 72 62 69 74 72 61 72 79 20 65 78 70 72 65 73 73  rbitrary express
213c0 69 6f 6e 73 2c 20 77 65 20 61 6c 6c 6f 77 65 64  ions, we allowed
213d0 20 73 6f 6d 65 20 63 6f 6d 62 69 6e 69 6e 67 20   some combining 
213e0 6f 66 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46  of LIMIT and OFF
213f0 53 45 54 0a 20 20 2a 2a 20 62 65 63 61 75 73 65  SET.  ** because
21400 20 74 68 65 79 20 63 6f 75 6c 64 20 62 65 20 63   they could be c
21410 6f 6d 70 75 74 65 64 20 61 74 20 63 6f 6d 70 69  omputed at compi
21420 6c 65 2d 74 69 6d 65 2e 20 20 42 75 74 20 77 68  le-time.  But wh
21430 65 6e 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46  en LIMIT and OFF
21440 53 45 54 0a 20 20 2a 2a 20 62 65 63 61 6d 65 20  SET.  ** became 
21450 61 72 62 69 74 72 61 72 79 20 65 78 70 72 65 73  arbitrary expres
21460 73 69 6f 6e 73 2c 20 77 65 20 77 65 72 65 20 66  sions, we were f
21470 6f 72 63 65 64 20 74 6f 20 61 64 64 20 72 65 73  orced to add res
21480 74 72 69 63 74 69 6f 6e 73 20 28 31 33 29 0a 20  trictions (13). 
21490 20 2a 2a 20 61 6e 64 20 28 31 34 29 2e 20 2a 2f   ** and (14). */
214a0 0a 20 20 69 66 28 20 70 53 75 62 2d 3e 70 4c 69  .  if( pSub->pLi
214b0 6d 69 74 20 26 26 20 70 2d 3e 70 4c 69 6d 69 74  mit && p->pLimit
214c0 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20   ) return 0;    
214d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73            /* Res
214e0 74 72 69 63 74 69 6f 6e 20 28 31 33 29 20 2a 2f  triction (13) */
214f0 0a 20 20 69 66 28 20 70 53 75 62 2d 3e 70 4c 69  .  if( pSub->pLi
21500 6d 69 74 20 26 26 20 70 53 75 62 2d 3e 70 4c 69  mit && pSub->pLi
21510 6d 69 74 2d 3e 70 52 69 67 68 74 20 29 20 72 65  mit->pRight ) re
21520 74 75 72 6e 20 30 3b 20 20 20 2f 2a 20 52 65 73  turn 0;   /* Res
21530 74 72 69 63 74 69 6f 6e 20 28 31 34 29 20 2a 2f  triction (14) */
21540 0a 20 20 69 66 28 20 28 70 2d 3e 73 65 6c 46 6c  .  if( (p->selFl
21550 61 67 73 20 26 20 53 46 5f 43 6f 6d 70 6f 75 6e  ags & SF_Compoun
21560 64 29 21 3d 30 20 26 26 20 70 53 75 62 2d 3e 70  d)!=0 && pSub->p
21570 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 72 65 74  Limit ){.    ret
21580 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20  urn 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 20 20 20 20 20 20 20 20 20 20                  
215b0 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e    /* Restriction
215c0 20 28 31 35 29 20 2a 2f 0a 20 20 7d 0a 20 20 69   (15) */.  }.  i
215d0 66 28 20 70 53 75 62 53 72 63 2d 3e 6e 53 72 63  f( pSubSrc->nSrc
215e0 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 20  ==0 ) return 0; 
215f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21600 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63        /* Restric
21610 74 69 6f 6e 20 28 37 29 20 20 2a 2f 0a 20 20 69  tion (7)  */.  i
21620 66 28 20 70 53 75 62 2d 3e 73 65 6c 46 6c 61 67  f( pSub->selFlag
21630 73 20 26 20 53 46 5f 44 69 73 74 69 6e 63 74 20  s & SF_Distinct 
21640 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20  ) return 0;     
21650 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63        /* Restric
21660 74 69 6f 6e 20 28 34 29 20 20 2a 2f 0a 20 20 69  tion (4)  */.  i
21670 66 28 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20  f( pSub->pLimit 
21680 26 26 20 28 70 53 72 63 2d 3e 6e 53 72 63 3e 31  && (pSrc->nSrc>1
21690 20 7c 7c 20 69 73 41 67 67 29 20 29 7b 0a 20 20   || isAgg) ){.  
216a0 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20     return 0;    
216b0 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74       /* Restrict
216c0 69 6f 6e 73 20 28 38 29 28 39 29 20 2a 2f 0a 20  ions (8)(9) */. 
216d0 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70 4f 72 64   }.  if( p->pOrd
216e0 65 72 42 79 20 26 26 20 70 53 75 62 2d 3e 70 4f  erBy && pSub->pO
216f0 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20 72  rderBy ){.     r
21700 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20  eturn 0;        
21710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21730 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f     /* Restrictio
21740 6e 20 28 31 31 29 20 2a 2f 0a 20 20 7d 0a 20 20  n (11) */.  }.  
21750 69 66 28 20 69 73 41 67 67 20 26 26 20 70 53 75  if( isAgg && pSu
21760 62 2d 3e 70 4f 72 64 65 72 42 79 20 29 20 72 65  b->pOrderBy ) re
21770 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20  turn 0;         
21780 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69         /* Restri
21790 63 74 69 6f 6e 20 28 31 36 29 20 2a 2f 0a 20 20  ction (16) */.  
217a0 69 66 28 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74  if( pSub->pLimit
217b0 20 26 26 20 70 2d 3e 70 57 68 65 72 65 20 29 20   && p->pWhere ) 
217c0 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20  return 0;       
217d0 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69         /* Restri
217e0 63 74 69 6f 6e 20 28 31 39 29 20 2a 2f 0a 20 20  ction (19) */.  
217f0 69 66 28 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74  if( pSub->pLimit
21800 20 26 26 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73   && (p->selFlags
21810 20 26 20 53 46 5f 44 69 73 74 69 6e 63 74 29 21   & SF_Distinct)!
21820 3d 30 20 29 7b 0a 20 20 20 20 20 72 65 74 75 72  =0 ){.     retur
21830 6e 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  n 0;         /* 
21840 52 65 73 74 72 69 63 74 69 6f 6e 20 28 32 31 29  Restriction (21)
21850 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20 70 53   */.  }.  if( pS
21860 75 62 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 28  ub->selFlags & (
21870 53 46 5f 52 65 63 75 72 73 69 76 65 29 20 29 7b  SF_Recursive) ){
21880 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 2f  .    return 0; /
21890 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 73 20 28  * Restrictions (
218a0 32 32 29 20 2a 2f 0a 20 20 7d 0a 0a 20 20 2f 2a  22) */.  }..  /*
218b0 0a 20 20 2a 2a 20 49 66 20 74 68 65 20 73 75 62  .  ** If the sub
218c0 71 75 65 72 79 20 69 73 20 74 68 65 20 72 69 67  query is the rig
218d0 68 74 20 6f 70 65 72 61 6e 64 20 6f 66 20 61 20  ht operand of a 
218e0 4c 45 46 54 20 4a 4f 49 4e 2c 20 74 68 65 6e 20  LEFT JOIN, then 
218f0 74 68 65 0a 20 20 2a 2a 20 73 75 62 71 75 65 72  the.  ** subquer
21900 79 20 6d 61 79 20 6e 6f 74 20 62 65 20 61 20 6a  y may not be a j
21910 6f 69 6e 20 69 74 73 65 6c 66 20 28 33 61 29 2e  oin itself (3a).
21920 20 45 78 61 6d 70 6c 65 20 6f 66 20 77 68 79 20   Example of why 
21930 74 68 69 73 20 69 73 20 6e 6f 74 0a 20 20 2a 2a  this is not.  **
21940 20 61 6c 6c 6f 77 65 64 3a 0a 20 20 2a 2a 0a 20   allowed:.  **. 
21950 20 2a 2a 20 20 20 20 20 20 20 20 20 74 31 20 4c   **         t1 L
21960 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20 28  EFT OUTER JOIN (
21970 74 32 20 4a 4f 49 4e 20 74 33 29 0a 20 20 2a 2a  t2 JOIN t3).  **
21980 0a 20 20 2a 2a 20 49 66 20 77 65 20 66 6c 61 74  .  ** If we flat
21990 74 65 6e 20 74 68 65 20 61 62 6f 76 65 2c 20 77  ten the above, w
219a0 65 20 77 6f 75 6c 64 20 67 65 74 0a 20 20 2a 2a  e would get.  **
219b0 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20 28 74  .  **         (t
219c0 31 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49  1 LEFT OUTER JOI
219d0 4e 20 74 32 29 20 4a 4f 49 4e 20 74 33 0a 20 20  N t2) JOIN t3.  
219e0 2a 2a 0a 20 20 2a 2a 20 77 68 69 63 68 20 69 73  **.  ** which is
219f0 20 6e 6f 74 20 61 74 20 61 6c 6c 20 74 68 65 20   not at all the 
21a00 73 61 6d 65 20 74 68 69 6e 67 2e 0a 20 20 2a 2a  same thing..  **
21a10 0a 20 20 2a 2a 20 49 66 20 74 68 65 20 73 75 62  .  ** If the sub
21a20 71 75 65 72 79 20 69 73 20 74 68 65 20 72 69 67  query is the rig
21a30 68 74 20 6f 70 65 72 61 6e 64 20 6f 66 20 61 20  ht operand of a 
21a40 4c 45 46 54 20 4a 4f 49 4e 2c 20 74 68 65 6e 20  LEFT JOIN, then 
21a50 74 68 65 20 6f 75 74 65 72 0a 20 20 2a 2a 20 71  the outer.  ** q
21a60 75 65 72 79 20 63 61 6e 6e 6f 74 20 62 65 20 61  uery cannot be a
21a70 6e 20 61 67 67 72 65 67 61 74 65 2e 20 28 33 63  n aggregate. (3c
21a80 29 20 20 54 68 69 73 20 69 73 20 61 6e 20 61 72  )  This is an ar
21a90 74 69 66 61 63 74 20 6f 66 20 74 68 65 20 77 61  tifact of the wa
21aa0 79 0a 20 20 2a 2a 20 61 67 67 72 65 67 61 74 65  y.  ** aggregate
21ab0 73 20 61 72 65 20 70 72 6f 63 65 73 73 65 64 20  s are processed 
21ac0 2d 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6d 65  - there is no me
21ad0 63 68 61 6e 69 73 6d 20 74 6f 20 64 65 74 65 72  chanism to deter
21ae0 6d 69 6e 65 20 69 66 0a 20 20 2a 2a 20 74 68 65  mine if.  ** the
21af0 20 4c 45 46 54 20 4a 4f 49 4e 20 74 61 62 6c 65   LEFT JOIN table
21b00 20 73 68 6f 75 6c 64 20 62 65 20 61 6c 6c 2d 4e   should be all-N
21b10 55 4c 4c 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 53  ULL..  **.  ** S
21b20 65 65 20 61 6c 73 6f 20 74 69 63 6b 65 74 73 20  ee also tickets 
21b30 23 33 30 36 2c 20 23 33 35 30 2c 20 61 6e 64 20  #306, #350, and 
21b40 23 33 33 30 30 2e 0a 20 20 2a 2f 0a 20 20 69 66  #3300..  */.  if
21b50 28 20 28 70 53 75 62 69 74 65 6d 2d 3e 66 67 2e  ( (pSubitem->fg.
21b60 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 4f 55  jointype & JT_OU
21b70 54 45 52 29 21 3d 30 20 29 7b 0a 20 20 20 20 69  TER)!=0 ){.    i
21b80 73 4c 65 66 74 4a 6f 69 6e 20 3d 20 31 3b 0a 20  sLeftJoin = 1;. 
21b90 20 20 20 69 66 28 20 70 53 75 62 53 72 63 2d 3e     if( pSubSrc->
21ba0 6e 53 72 63 3e 31 20 7c 7c 20 69 73 41 67 67 20  nSrc>1 || isAgg 
21bb0 7c 7c 20 49 73 56 69 72 74 75 61 6c 28 70 53 75  || IsVirtual(pSu
21bc0 62 53 72 63 2d 3e 61 5b 30 5d 2e 70 54 61 62 29  bSrc->a[0].pTab)
21bd0 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 20 28 33   ){.      /*  (3
21be0 61 29 20 20 20 20 20 20 20 20 20 20 20 20 20 28  a)             (
21bf0 33 63 29 20 20 20 20 20 28 33 62 29 20 2a 2f 0a  3c)     (3b) */.
21c00 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a        return 0;.
21c10 20 20 20 20 7d 0a 20 20 7d 0a 23 69 66 64 65 66      }.  }.#ifdef
21c20 20 53 51 4c 49 54 45 5f 45 58 54 52 41 5f 49 46   SQLITE_EXTRA_IF
21c30 4e 55 4c 4c 52 4f 57 0a 20 20 65 6c 73 65 20 69  NULLROW.  else i
21c40 66 28 20 69 46 72 6f 6d 3e 30 20 26 26 20 21 69  f( iFrom>0 && !i
21c50 73 41 67 67 20 29 7b 0a 20 20 20 20 2f 2a 20 53  sAgg ){.    /* S
21c60 65 74 74 69 6e 67 20 69 73 4c 65 66 74 4a 6f 69  etting isLeftJoi
21c70 6e 20 74 6f 20 2d 31 20 63 61 75 73 65 73 20 4f  n to -1 causes O
21c80 50 5f 49 66 4e 75 6c 6c 52 6f 77 20 6f 70 63 6f  P_IfNullRow opco
21c90 64 65 73 20 74 6f 20 62 65 20 67 65 6e 65 72 61  des to be genera
21ca0 74 65 64 20 66 6f 72 0a 20 20 20 20 2a 2a 20 65  ted for.    ** e
21cb0 76 65 72 79 20 72 65 66 65 72 65 6e 63 65 20 74  very reference t
21cc0 6f 20 61 6e 79 20 72 65 73 75 6c 74 20 63 6f 6c  o any result col
21cd0 75 6d 6e 20 66 72 6f 6d 20 73 75 62 71 75 65 72  umn from subquer
21ce0 79 20 69 6e 20 61 20 6a 6f 69 6e 2c 20 65 76 65  y in a join, eve
21cf0 6e 0a 20 20 20 20 2a 2a 20 74 68 6f 75 67 68 20  n.    ** though 
21d00 74 68 65 79 20 61 72 65 20 6e 6f 74 20 6e 65 63  they are not nec
21d10 65 73 73 61 72 79 2e 20 20 54 68 69 73 20 77 69  essary.  This wi
21d20 6c 6c 20 73 74 72 65 73 73 2d 74 65 73 74 20 74  ll stress-test t
21d30 68 65 20 4f 50 5f 49 66 4e 75 6c 6c 52 6f 77 20  he OP_IfNullRow 
21d40 0a 20 20 20 20 2a 2a 20 6f 70 63 6f 64 65 2e 20  .    ** opcode. 
21d50 2a 2f 0a 20 20 20 20 69 73 4c 65 66 74 4a 6f 69  */.    isLeftJoi
21d60 6e 20 3d 20 2d 31 3b 0a 20 20 7d 0a 23 65 6e 64  n = -1;.  }.#end
21d70 69 66 0a 0a 20 20 2f 2a 20 52 65 73 74 72 69 63  if..  /* Restric
21d80 74 69 6f 6e 20 28 31 37 29 3a 20 49 66 20 74 68  tion (17): If th
21d90 65 20 73 75 62 2d 71 75 65 72 79 20 69 73 20 61  e sub-query is a
21da0 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54   compound SELECT
21db0 2c 20 74 68 65 6e 20 69 74 20 6d 75 73 74 0a 20  , then it must. 
21dc0 20 2a 2a 20 75 73 65 20 6f 6e 6c 79 20 74 68 65   ** use only the
21dd0 20 55 4e 49 4f 4e 20 41 4c 4c 20 6f 70 65 72 61   UNION ALL opera
21de0 74 6f 72 2e 20 41 6e 64 20 6e 6f 6e 65 20 6f 66  tor. And none of
21df0 20 74 68 65 20 73 69 6d 70 6c 65 20 73 65 6c 65   the simple sele
21e00 63 74 20 71 75 65 72 69 65 73 0a 20 20 2a 2a 20  ct queries.  ** 
21e10 74 68 61 74 20 6d 61 6b 65 20 75 70 20 74 68 65  that make up the
21e20 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54   compound SELECT
21e30 20 61 72 65 20 61 6c 6c 6f 77 65 64 20 74 6f 20   are allowed to 
21e40 62 65 20 61 67 67 72 65 67 61 74 65 20 6f 72 20  be aggregate or 
21e50 64 69 73 74 69 6e 63 74 0a 20 20 2a 2a 20 71 75  distinct.  ** qu
21e60 65 72 69 65 73 2e 0a 20 20 2a 2f 0a 20 20 69 66  eries..  */.  if
21e70 28 20 70 53 75 62 2d 3e 70 50 72 69 6f 72 20 29  ( pSub->pPrior )
21e80 7b 0a 20 20 20 20 69 66 28 20 70 53 75 62 2d 3e  {.    if( pSub->
21e90 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20  pOrderBy ){.    
21ea0 20 20 72 65 74 75 72 6e 20 30 3b 20 20 2f 2a 20    return 0;  /* 
21eb0 52 65 73 74 72 69 63 74 69 6f 6e 20 28 32 30 29  Restriction (20)
21ec0 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 69 66   */.    }.    if
21ed0 28 20 69 73 41 67 67 20 7c 7c 20 28 70 2d 3e 73  ( isAgg || (p->s
21ee0 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 44 69 73  elFlags & SF_Dis
21ef0 74 69 6e 63 74 29 21 3d 30 20 7c 7c 20 70 53 72  tinct)!=0 || pSr
21f00 63 2d 3e 6e 53 72 63 21 3d 31 20 29 7b 0a 20 20  c->nSrc!=1 ){.  
21f10 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 2f 2a      return 0; /*
21f20 20 28 31 37 64 31 29 2c 20 28 31 37 64 32 29 2c   (17d1), (17d2),
21f30 20 6f 72 20 28 31 37 64 33 29 20 2a 2f 0a 20 20   or (17d3) */.  
21f40 20 20 7d 0a 20 20 20 20 66 6f 72 28 70 53 75 62    }.    for(pSub
21f50 31 3d 70 53 75 62 3b 20 70 53 75 62 31 3b 20 70  1=pSub; pSub1; p
21f60 53 75 62 31 3d 70 53 75 62 31 2d 3e 70 50 72 69  Sub1=pSub1->pPri
21f70 6f 72 29 7b 0a 20 20 20 20 20 20 74 65 73 74 63  or){.      testc
21f80 61 73 65 28 20 28 70 53 75 62 31 2d 3e 73 65 6c  ase( (pSub1->sel
21f90 46 6c 61 67 73 20 26 20 28 53 46 5f 44 69 73 74  Flags & (SF_Dist
21fa0 69 6e 63 74 7c 53 46 5f 41 67 67 72 65 67 61 74  inct|SF_Aggregat
21fb0 65 29 29 3d 3d 53 46 5f 44 69 73 74 69 6e 63 74  e))==SF_Distinct
21fc0 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
21fd0 73 65 28 20 28 70 53 75 62 31 2d 3e 73 65 6c 46  se( (pSub1->selF
21fe0 6c 61 67 73 20 26 20 28 53 46 5f 44 69 73 74 69  lags & (SF_Disti
21ff0 6e 63 74 7c 53 46 5f 41 67 67 72 65 67 61 74 65  nct|SF_Aggregate
22000 29 29 3d 3d 53 46 5f 41 67 67 72 65 67 61 74 65  ))==SF_Aggregate
22010 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
22020 28 20 70 53 75 62 2d 3e 70 53 72 63 21 3d 30 20  ( pSub->pSrc!=0 
22030 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
22040 20 70 53 75 62 2d 3e 70 45 4c 69 73 74 2d 3e 6e   pSub->pEList->n
22050 45 78 70 72 3d 3d 70 53 75 62 31 2d 3e 70 45 4c  Expr==pSub1->pEL
22060 69 73 74 2d 3e 6e 45 78 70 72 20 29 3b 0a 20 20  ist->nExpr );.  
22070 20 20 20 20 69 66 28 20 28 70 53 75 62 31 2d 3e      if( (pSub1->
22080 73 65 6c 46 6c 61 67 73 20 26 20 28 53 46 5f 44  selFlags & (SF_D
22090 69 73 74 69 6e 63 74 7c 53 46 5f 41 67 67 72 65  istinct|SF_Aggre
220a0 67 61 74 65 29 29 21 3d 30 20 20 20 20 2f 2a 20  gate))!=0    /* 
220b0 28 31 37 62 29 20 2a 2f 0a 20 20 20 20 20 20 20  (17b) */.       
220c0 7c 7c 20 28 70 53 75 62 31 2d 3e 70 50 72 69 6f  || (pSub1->pPrio
220d0 72 20 26 26 20 70 53 75 62 31 2d 3e 6f 70 21 3d  r && pSub1->op!=
220e0 54 4b 5f 41 4c 4c 29 20 20 20 20 20 20 20 20 20  TK_ALL)         
220f0 20 20 20 20 20 20 20 20 2f 2a 20 28 31 37 61 29          /* (17a)
22100 20 2a 2f 0a 20 20 20 20 20 20 20 7c 7c 20 70 53   */.       || pS
22110 75 62 31 2d 3e 70 53 72 63 2d 3e 6e 53 72 63 3c  ub1->pSrc->nSrc<
22120 31 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  1               
22130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22140 20 20 20 2f 2a 20 28 31 37 63 29 20 2a 2f 0a 20     /* (17c) */. 
22150 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
22160 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20  return 0;.      
22170 7d 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  }.      testcase
22180 28 20 70 53 75 62 31 2d 3e 70 53 72 63 2d 3e 6e  ( pSub1->pSrc->n
22190 53 72 63 3e 31 20 29 3b 0a 20 20 20 20 7d 0a 0a  Src>1 );.    }..
221a0 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69      /* Restricti
221b0 6f 6e 20 28 31 38 29 2e 20 2a 2f 0a 20 20 20 20  on (18). */.    
221c0 69 66 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 20  if( p->pOrderBy 
221d0 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 69 3b  ){.      int ii;
221e0 0a 20 20 20 20 20 20 66 6f 72 28 69 69 3d 30 3b  .      for(ii=0;
221f0 20 69 69 3c 70 2d 3e 70 4f 72 64 65 72 42 79 2d   ii<p->pOrderBy-
22200 3e 6e 45 78 70 72 3b 20 69 69 2b 2b 29 7b 0a 20  >nExpr; ii++){. 
22210 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70 4f         if( p->pO
22220 72 64 65 72 42 79 2d 3e 61 5b 69 69 5d 2e 75 2e  rderBy->a[ii].u.
22230 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 3d 3d 30  x.iOrderByCol==0
22240 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20   ) return 0;.   
22250 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
22260 20 20 2f 2a 20 45 78 2d 72 65 73 74 72 69 63 74    /* Ex-restrict
22270 69 6f 6e 20 28 32 33 29 3a 0a 20 20 2a 2a 20 54  ion (23):.  ** T
22280 68 65 20 6f 6e 6c 79 20 77 61 79 20 74 68 61 74  he only way that
22290 20 74 68 65 20 72 65 63 75 72 73 69 76 65 20 70   the recursive p
222a0 61 72 74 20 6f 66 20 61 20 43 54 45 20 63 61 6e  art of a CTE can
222b0 20 63 6f 6e 74 61 69 6e 20 61 20 63 6f 6d 70 6f   contain a compo
222c0 75 6e 64 0a 20 20 2a 2a 20 73 75 62 71 75 65 72  und.  ** subquer
222d0 79 20 69 73 20 66 6f 72 20 74 68 65 20 73 75 62  y is for the sub
222e0 71 75 65 72 79 20 74 6f 20 62 65 20 6f 6e 65 20  query to be one 
222f0 74 65 72 6d 20 6f 66 20 61 20 6a 6f 69 6e 2e 20  term of a join. 
22300 20 42 75 74 20 69 66 20 74 68 65 0a 20 20 2a 2a   But if the.  **
22310 20 73 75 62 71 75 65 72 79 20 69 73 20 61 20 6a   subquery is a j
22320 6f 69 6e 2c 20 74 68 65 6e 20 74 68 65 20 66 6c  oin, then the fl
22330 61 74 74 65 6e 69 6e 67 20 68 61 73 20 61 6c 72  attening has alr
22340 65 61 64 79 20 62 65 65 6e 20 73 74 6f 70 70 65  eady been stoppe
22350 64 20 62 79 0a 20 20 2a 2a 20 72 65 73 74 72 69  d by.  ** restri
22360 63 74 69 6f 6e 20 28 31 37 64 33 29 0a 20 20 2a  ction (17d3).  *
22370 2f 0a 20 20 61 73 73 65 72 74 28 20 28 70 2d 3e  /.  assert( (p->
22380 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 52 65  selFlags & SF_Re
22390 63 75 72 73 69 76 65 29 3d 3d 30 20 7c 7c 20 70  cursive)==0 || p
223a0 53 75 62 2d 3e 70 50 72 69 6f 72 3d 3d 30 20 29  Sub->pPrior==0 )
223b0 3b 0a 0a 20 20 2f 2a 2a 2a 2a 2a 20 49 66 20 77  ;..  /***** If w
223c0 65 20 72 65 61 63 68 20 74 68 69 73 20 70 6f 69  e reach this poi
223d0 6e 74 2c 20 66 6c 61 74 74 65 6e 69 6e 67 20 69  nt, flattening i
223e0 73 20 70 65 72 6d 69 74 74 65 64 2e 20 2a 2a 2a  s permitted. ***
223f0 2a 2a 2f 0a 20 20 53 45 4c 45 43 54 54 52 41 43  **/.  SELECTTRAC
22400 45 28 31 2c 70 50 61 72 73 65 2c 70 2c 28 22 66  E(1,pParse,p,("f
22410 6c 61 74 74 65 6e 20 25 75 2e 25 70 20 66 72 6f  latten %u.%p fro
22420 6d 20 74 65 72 6d 20 25 64 5c 6e 22 2c 0a 20 20  m term %d\n",.  
22430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22440 20 70 53 75 62 2d 3e 73 65 6c 49 64 2c 20 70 53   pSub->selId, pS
22450 75 62 2c 20 69 46 72 6f 6d 29 29 3b 0a 0a 20 20  ub, iFrom));..  
22460 2f 2a 20 41 75 74 68 6f 72 69 7a 65 20 74 68 65  /* Authorize the
22470 20 73 75 62 71 75 65 72 79 20 2a 2f 0a 20 20 70   subquery */.  p
22480 50 61 72 73 65 2d 3e 7a 41 75 74 68 43 6f 6e 74  Parse->zAuthCont
22490 65 78 74 20 3d 20 70 53 75 62 69 74 65 6d 2d 3e  ext = pSubitem->
224a0 7a 4e 61 6d 65 3b 0a 20 20 54 45 53 54 4f 4e 4c  zName;.  TESTONL
224b0 59 28 69 20 3d 29 20 73 71 6c 69 74 65 33 41 75  Y(i =) sqlite3Au
224c0 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20  thCheck(pParse, 
224d0 53 51 4c 49 54 45 5f 53 45 4c 45 43 54 2c 20 30  SQLITE_SELECT, 0
224e0 2c 20 30 2c 20 30 29 3b 0a 20 20 74 65 73 74 63  , 0, 0);.  testc
224f0 61 73 65 28 20 69 3d 3d 53 51 4c 49 54 45 5f 44  ase( i==SQLITE_D
22500 45 4e 59 20 29 3b 0a 20 20 70 50 61 72 73 65 2d  ENY );.  pParse-
22510 3e 7a 41 75 74 68 43 6f 6e 74 65 78 74 20 3d 20  >zAuthContext = 
22520 7a 53 61 76 65 64 41 75 74 68 43 6f 6e 74 65 78  zSavedAuthContex
22530 74 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  t;..  /* If the 
22540 73 75 62 2d 71 75 65 72 79 20 69 73 20 61 20 63  sub-query is a c
22550 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 20 73  ompound SELECT s
22560 74 61 74 65 6d 65 6e 74 2c 20 74 68 65 6e 20 28  tatement, then (
22570 62 79 20 72 65 73 74 72 69 63 74 69 6f 6e 73 0a  by restrictions.
22580 20 20 2a 2a 20 31 37 20 61 6e 64 20 31 38 20 61    ** 17 and 18 a
22590 62 6f 76 65 29 20 69 74 20 6d 75 73 74 20 62 65  bove) it must be
225a0 20 61 20 55 4e 49 4f 4e 20 41 4c 4c 20 61 6e 64   a UNION ALL and
225b0 20 74 68 65 20 70 61 72 65 6e 74 20 71 75 65 72   the parent quer
225c0 79 20 6d 75 73 74 20 0a 20 20 2a 2a 20 62 65 20  y must .  ** be 
225d0 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a 20 20 2a  of the form:.  *
225e0 2a 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c 45 43  *.  **     SELEC
225f0 54 20 3c 65 78 70 72 2d 6c 69 73 74 3e 20 46 52  T <expr-list> FR
22600 4f 4d 20 28 3c 73 75 62 2d 71 75 65 72 79 3e 29  OM (<sub-query>)
22610 20 3c 77 68 65 72 65 2d 63 6c 61 75 73 65 3e 20   <where-clause> 
22620 0a 20 20 2a 2a 0a 20 20 2a 2a 20 66 6f 6c 6c 6f  .  **.  ** follo
22630 77 65 64 20 62 79 20 61 6e 79 20 4f 52 44 45 52  wed by any ORDER
22640 20 42 59 2c 20 4c 49 4d 49 54 20 61 6e 64 2f 6f   BY, LIMIT and/o
22650 72 20 4f 46 46 53 45 54 20 63 6c 61 75 73 65 73  r OFFSET clauses
22660 2e 20 54 68 69 73 20 62 6c 6f 63 6b 0a 20 20 2a  . This block.  *
22670 2a 20 63 72 65 61 74 65 73 20 4e 2d 31 20 63 6f  * creates N-1 co
22680 70 69 65 73 20 6f 66 20 74 68 65 20 70 61 72 65  pies of the pare
22690 6e 74 20 71 75 65 72 79 20 77 69 74 68 6f 75 74  nt query without
226a0 20 61 6e 79 20 4f 52 44 45 52 20 42 59 2c 20 4c   any ORDER BY, L
226b0 49 4d 49 54 20 6f 72 20 0a 20 20 2a 2a 20 4f 46  IMIT or .  ** OF
226c0 46 53 45 54 20 63 6c 61 75 73 65 73 20 61 6e 64  FSET clauses and
226d0 20 6a 6f 69 6e 73 20 74 68 65 6d 20 74 6f 20 74   joins them to t
226e0 68 65 20 6c 65 66 74 2d 68 61 6e 64 2d 73 69 64  he left-hand-sid
226f0 65 20 6f 66 20 74 68 65 20 6f 72 69 67 69 6e 61  e of the origina
22700 6c 0a 20 20 2a 2a 20 75 73 69 6e 67 20 55 4e 49  l.  ** using UNI
22710 4f 4e 20 41 4c 4c 20 6f 70 65 72 61 74 6f 72 73  ON ALL operators
22720 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 4e  . In this case N
22730 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   is the number o
22740 66 20 73 69 6d 70 6c 65 0a 20 20 2a 2a 20 73 65  f simple.  ** se
22750 6c 65 63 74 20 73 74 61 74 65 6d 65 6e 74 73 20  lect statements 
22760 69 6e 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20  in the compound 
22770 73 75 62 2d 71 75 65 72 79 2e 0a 20 20 2a 2a 0a  sub-query..  **.
22780 20 20 2a 2a 20 45 78 61 6d 70 6c 65 3a 0a 20 20    ** Example:.  
22790 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c 45  **.  **     SELE
227a0 43 54 20 61 2b 31 20 46 52 4f 4d 20 28 0a 20 20  CT a+1 FROM (.  
227b0 2a 2a 20 20 20 20 20 20 20 20 53 45 4c 45 43 54  **        SELECT
227c0 20 78 20 46 52 4f 4d 20 74 61 62 0a 20 20 2a 2a   x FROM tab.  **
227d0 20 20 20 20 20 20 20 20 55 4e 49 4f 4e 20 41 4c          UNION AL
227e0 4c 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 53 45  L.  **        SE
227f0 4c 45 43 54 20 79 20 46 52 4f 4d 20 74 61 62 0a  LECT y FROM tab.
22800 20 20 2a 2a 20 20 20 20 20 20 20 20 55 4e 49 4f    **        UNIO
22810 4e 20 41 4c 4c 0a 20 20 2a 2a 20 20 20 20 20 20  N ALL.  **      
22820 20 20 53 45 4c 45 43 54 20 61 62 73 28 7a 2a 32    SELECT abs(z*2
22830 29 20 46 52 4f 4d 20 74 61 62 32 0a 20 20 2a 2a  ) FROM tab2.  **
22840 20 20 20 20 20 29 20 57 48 45 52 45 20 61 21 3d       ) WHERE a!=
22850 35 20 4f 52 44 45 52 20 42 59 20 31 0a 20 20 2a  5 ORDER BY 1.  *
22860 2a 0a 20 20 2a 2a 20 54 72 61 6e 73 66 6f 72 6d  *.  ** Transform
22870 65 64 20 69 6e 74 6f 3a 0a 20 20 2a 2a 0a 20 20  ed into:.  **.  
22880 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 78 2b  **     SELECT x+
22890 31 20 46 52 4f 4d 20 74 61 62 20 57 48 45 52 45  1 FROM tab WHERE
228a0 20 78 2b 31 21 3d 35 0a 20 20 2a 2a 20 20 20 20   x+1!=5.  **    
228b0 20 55 4e 49 4f 4e 20 41 4c 4c 0a 20 20 2a 2a 20   UNION ALL.  ** 
228c0 20 20 20 20 53 45 4c 45 43 54 20 79 2b 31 20 46      SELECT y+1 F
228d0 52 4f 4d 20 74 61 62 20 57 48 45 52 45 20 79 2b  ROM tab WHERE y+
228e0 31 21 3d 35 0a 20 20 2a 2a 20 20 20 20 20 55 4e  1!=5.  **     UN
228f0 49 4f 4e 20 41 4c 4c 0a 20 20 2a 2a 20 20 20 20  ION ALL.  **    
22900 20 53 45 4c 45 43 54 20 61 62 73 28 7a 2a 32 29   SELECT abs(z*2)
22910 2b 31 20 46 52 4f 4d 20 74 61 62 32 20 57 48 45  +1 FROM tab2 WHE
22920 52 45 20 61 62 73 28 7a 2a 32 29 2b 31 21 3d 35  RE abs(z*2)+1!=5
22930 0a 20 20 2a 2a 20 20 20 20 20 4f 52 44 45 52 20  .  **     ORDER 
22940 42 59 20 31 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57  BY 1.  **.  ** W
22950 65 20 63 61 6c 6c 20 74 68 69 73 20 74 68 65 20  e call this the 
22960 22 63 6f 6d 70 6f 75 6e 64 2d 73 75 62 71 75 65  "compound-subque
22970 72 79 20 66 6c 61 74 74 65 6e 69 6e 67 22 2e 0a  ry flattening"..
22980 20 20 2a 2f 0a 20 20 66 6f 72 28 70 53 75 62 3d    */.  for(pSub=
22990 70 53 75 62 2d 3e 70 50 72 69 6f 72 3b 20 70 53  pSub->pPrior; pS
229a0 75 62 3b 20 70 53 75 62 3d 70 53 75 62 2d 3e 70  ub; pSub=pSub->p
229b0 50 72 69 6f 72 29 7b 0a 20 20 20 20 53 65 6c 65  Prior){.    Sele
229c0 63 74 20 2a 70 4e 65 77 3b 0a 20 20 20 20 45 78  ct *pNew;.    Ex
229d0 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79  prList *pOrderBy
229e0 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a   = p->pOrderBy;.
229f0 20 20 20 20 45 78 70 72 20 2a 70 4c 69 6d 69 74      Expr *pLimit
22a00 20 3d 20 70 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20   = p->pLimit;.  
22a10 20 20 53 65 6c 65 63 74 20 2a 70 50 72 69 6f 72    Select *pPrior
22a20 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20   = p->pPrior;.  
22a30 20 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20    p->pOrderBy = 
22a40 30 3b 0a 20 20 20 20 70 2d 3e 70 53 72 63 20 3d  0;.    p->pSrc =
22a50 20 30 3b 0a 20 20 20 20 70 2d 3e 70 50 72 69 6f   0;.    p->pPrio
22a60 72 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 70 4c  r = 0;.    p->pL
22a70 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20 70 4e  imit = 0;.    pN
22a80 65 77 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65  ew = sqlite3Sele
22a90 63 74 44 75 70 28 64 62 2c 20 70 2c 20 30 29 3b  ctDup(db, p, 0);
22aa0 0a 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d  .    p->pLimit =
22ab0 20 70 4c 69 6d 69 74 3b 0a 20 20 20 20 70 2d 3e   pLimit;.    p->
22ac0 70 4f 72 64 65 72 42 79 20 3d 20 70 4f 72 64 65  pOrderBy = pOrde
22ad0 72 42 79 3b 0a 20 20 20 20 70 2d 3e 70 53 72 63  rBy;.    p->pSrc
22ae0 20 3d 20 70 53 72 63 3b 0a 20 20 20 20 70 2d 3e   = pSrc;.    p->
22af0 6f 70 20 3d 20 54 4b 5f 41 4c 4c 3b 0a 20 20 20  op = TK_ALL;.   
22b00 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a   if( pNew==0 ){.
22b10 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20        p->pPrior 
22b20 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20 20 7d 65  = pPrior;.    }e
22b30 6c 73 65 7b 0a 20 20 20 20 20 20 70 4e 65 77 2d  lse{.      pNew-
22b40 3e 70 50 72 69 6f 72 20 3d 20 70 50 72 69 6f 72  >pPrior = pPrior
22b50 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50 72 69  ;.      if( pPri
22b60 6f 72 20 29 20 70 50 72 69 6f 72 2d 3e 70 4e 65  or ) pPrior->pNe
22b70 78 74 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 20  xt = pNew;.     
22b80 20 70 4e 65 77 2d 3e 70 4e 65 78 74 20 3d 20 70   pNew->pNext = p
22b90 3b 0a 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f  ;.      p->pPrio
22ba0 72 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 20 20  r = pNew;.      
22bb0 53 45 4c 45 43 54 54 52 41 43 45 28 32 2c 70 50  SELECTTRACE(2,pP
22bc0 61 72 73 65 2c 70 2c 28 22 63 6f 6d 70 6f 75 6e  arse,p,("compoun
22bd0 64 2d 73 75 62 71 75 65 72 79 20 66 6c 61 74 74  d-subquery flatt
22be0 65 6e 65 72 22 0a 20 20 20 20 20 20 20 20 20 20  ener".          
22bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22c00 20 20 20 20 22 20 63 72 65 61 74 65 73 20 25 75      " creates %u
22c10 20 61 73 20 70 65 65 72 5c 6e 22 2c 70 4e 65 77   as peer\n",pNew
22c20 2d 3e 73 65 6c 49 64 29 29 3b 0a 20 20 20 20 7d  ->selId));.    }
22c30 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c  .    if( db->mal
22c40 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74 75  locFailed ) retu
22c50 72 6e 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  rn 1;.  }..  /* 
22c60 42 65 67 69 6e 20 66 6c 61 74 74 65 6e 69 6e 67  Begin flattening
22c70 20 74 68 65 20 69 46 72 6f 6d 2d 74 68 20 65 6e   the iFrom-th en
22c80 74 72 79 20 6f 66 20 74 68 65 20 46 52 4f 4d 20  try of the FROM 
22c90 63 6c 61 75 73 65 20 0a 20 20 2a 2a 20 69 6e 20  clause .  ** in 
22ca0 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 2e  the outer query.
22cb0 0a 20 20 2a 2f 0a 20 20 70 53 75 62 20 3d 20 70  .  */.  pSub = p
22cc0 53 75 62 31 20 3d 20 70 53 75 62 69 74 65 6d 2d  Sub1 = pSubitem-
22cd0 3e 70 53 65 6c 65 63 74 3b 0a 0a 20 20 2f 2a 20  >pSelect;..  /* 
22ce0 44 65 6c 65 74 65 20 74 68 65 20 74 72 61 6e 73  Delete the trans
22cf0 69 65 6e 74 20 74 61 62 6c 65 20 73 74 72 75 63  ient table struc
22d00 74 75 72 65 20 61 73 73 6f 63 69 61 74 65 64 20  ture associated 
22d10 77 69 74 68 20 74 68 65 0a 20 20 2a 2a 20 73 75  with the.  ** su
22d20 62 71 75 65 72 79 0a 20 20 2a 2f 0a 20 20 73 71  bquery.  */.  sq
22d30 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
22d40 70 53 75 62 69 74 65 6d 2d 3e 7a 44 61 74 61 62  pSubitem->zDatab
22d50 61 73 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 44  ase);.  sqlite3D
22d60 62 46 72 65 65 28 64 62 2c 20 70 53 75 62 69 74  bFree(db, pSubit
22d70 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 73 71  em->zName);.  sq
22d80 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
22d90 70 53 75 62 69 74 65 6d 2d 3e 7a 41 6c 69 61 73  pSubitem->zAlias
22da0 29 3b 0a 20 20 70 53 75 62 69 74 65 6d 2d 3e 7a  );.  pSubitem->z
22db0 44 61 74 61 62 61 73 65 20 3d 20 30 3b 0a 20 20  Database = 0;.  
22dc0 70 53 75 62 69 74 65 6d 2d 3e 7a 4e 61 6d 65 20  pSubitem->zName 
22dd0 3d 20 30 3b 0a 20 20 70 53 75 62 69 74 65 6d 2d  = 0;.  pSubitem-
22de0 3e 7a 41 6c 69 61 73 20 3d 20 30 3b 0a 20 20 70  >zAlias = 0;.  p
22df0 53 75 62 69 74 65 6d 2d 3e 70 53 65 6c 65 63 74  Subitem->pSelect
22e00 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 44 65 66 65   = 0;..  /* Defe
22e10 72 20 64 65 6c 65 74 69 6e 67 20 74 68 65 20 54  r deleting the T
22e20 61 62 6c 65 20 6f 62 6a 65 63 74 20 61 73 73 6f  able object asso
22e30 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65 0a  ciated with the.
22e40 20 20 2a 2a 20 73 75 62 71 75 65 72 79 20 75 6e    ** subquery un
22e50 74 69 6c 20 63 6f 64 65 20 67 65 6e 65 72 61 74  til code generat
22e60 69 6f 6e 20 69 73 0a 20 20 2a 2a 20 63 6f 6d 70  ion is.  ** comp
22e70 6c 65 74 65 2c 20 73 69 6e 63 65 20 74 68 65 72  lete, since ther
22e80 65 20 6d 61 79 20 73 74 69 6c 6c 20 65 78 69 73  e may still exis
22e90 74 20 45 78 70 72 2e 70 54 61 62 20 65 6e 74 72  t Expr.pTab entr
22ea0 69 65 73 20 74 68 61 74 0a 20 20 2a 2a 20 72 65  ies that.  ** re
22eb0 66 65 72 20 74 6f 20 74 68 65 20 73 75 62 71 75  fer to the subqu
22ec0 65 72 79 20 65 76 65 6e 20 61 66 74 65 72 20 66  ery even after f
22ed0 6c 61 74 74 65 6e 69 6e 67 2e 20 20 54 69 63 6b  lattening.  Tick
22ee0 65 74 20 23 33 33 34 36 2e 0a 20 20 2a 2a 0a 20  et #3346..  **. 
22ef0 20 2a 2a 20 70 53 75 62 69 74 65 6d 2d 3e 70 54   ** pSubitem->pT
22f00 61 62 20 69 73 20 61 6c 77 61 79 73 20 6e 6f 6e  ab is always non
22f10 2d 4e 55 4c 4c 20 62 79 20 74 65 73 74 20 72 65  -NULL by test re
22f20 73 74 72 69 63 74 69 6f 6e 73 20 61 6e 64 20 74  strictions and t
22f30 65 73 74 73 20 61 62 6f 76 65 2e 0a 20 20 2a 2f  ests above..  */
22f40 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28 70 53  .  if( ALWAYS(pS
22f50 75 62 69 74 65 6d 2d 3e 70 54 61 62 21 3d 30 29  ubitem->pTab!=0)
22f60 20 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70   ){.    Table *p
22f70 54 61 62 54 6f 44 65 6c 20 3d 20 70 53 75 62 69  TabToDel = pSubi
22f80 74 65 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20 69  tem->pTab;.    i
22f90 66 28 20 70 54 61 62 54 6f 44 65 6c 2d 3e 6e 54  f( pTabToDel->nT
22fa0 61 62 52 65 66 3d 3d 31 20 29 7b 0a 20 20 20 20  abRef==1 ){.    
22fb0 20 20 50 61 72 73 65 20 2a 70 54 6f 70 6c 65 76    Parse *pToplev
22fc0 65 6c 20 3d 20 73 71 6c 69 74 65 33 50 61 72 73  el = sqlite3Pars
22fd0 65 54 6f 70 6c 65 76 65 6c 28 70 50 61 72 73 65  eToplevel(pParse
22fe0 29 3b 0a 20 20 20 20 20 20 70 54 61 62 54 6f 44  );.      pTabToD
22ff0 65 6c 2d 3e 70 4e 65 78 74 5a 6f 6d 62 69 65 20  el->pNextZombie 
23000 3d 20 70 54 6f 70 6c 65 76 65 6c 2d 3e 70 5a 6f  = pToplevel->pZo
23010 6d 62 69 65 54 61 62 3b 0a 20 20 20 20 20 20 70  mbieTab;.      p
23020 54 6f 70 6c 65 76 65 6c 2d 3e 70 5a 6f 6d 62 69  Toplevel->pZombi
23030 65 54 61 62 20 3d 20 70 54 61 62 54 6f 44 65 6c  eTab = pTabToDel
23040 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
23050 20 20 20 70 54 61 62 54 6f 44 65 6c 2d 3e 6e 54     pTabToDel->nT
23060 61 62 52 65 66 2d 2d 3b 0a 20 20 20 20 7d 0a 20  abRef--;.    }. 
23070 20 20 20 70 53 75 62 69 74 65 6d 2d 3e 70 54 61     pSubitem->pTa
23080 62 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  b = 0;.  }..  /*
23090 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6c   The following l
230a0 6f 6f 70 20 72 75 6e 73 20 6f 6e 63 65 20 66 6f  oop runs once fo
230b0 72 20 65 61 63 68 20 74 65 72 6d 20 69 6e 20 61  r each term in a
230c0 20 63 6f 6d 70 6f 75 6e 64 2d 73 75 62 71 75 65   compound-subque
230d0 72 79 0a 20 20 2a 2a 20 66 6c 61 74 74 65 6e 69  ry.  ** flatteni
230e0 6e 67 20 28 61 73 20 64 65 73 63 72 69 62 65 64  ng (as described
230f0 20 61 62 6f 76 65 29 2e 20 20 49 66 20 77 65 20   above).  If we 
23100 61 72 65 20 64 6f 69 6e 67 20 61 20 64 69 66 66  are doing a diff
23110 65 72 65 6e 74 20 6b 69 6e 64 0a 20 20 2a 2a 20  erent kind.  ** 
23120 6f 66 20 66 6c 61 74 74 65 6e 69 6e 67 20 2d 20  of flattening - 
23130 61 20 66 6c 61 74 74 65 6e 69 6e 67 20 6f 74 68  a flattening oth
23140 65 72 20 74 68 61 6e 20 61 20 63 6f 6d 70 6f 75  er than a compou
23150 6e 64 2d 73 75 62 71 75 65 72 79 20 66 6c 61 74  nd-subquery flat
23160 74 65 6e 69 6e 67 20 2d 0a 20 20 2a 2a 20 74 68  tening -.  ** th
23170 65 6e 20 74 68 69 73 20 6c 6f 6f 70 20 6f 6e 6c  en this loop onl
23180 79 20 72 75 6e 73 20 6f 6e 63 65 2e 0a 20 20 2a  y runs once..  *
23190 2a 0a 20 20 2a 2a 20 54 68 69 73 20 6c 6f 6f 70  *.  ** This loop
231a0 20 6d 6f 76 65 73 20 61 6c 6c 20 6f 66 20 74 68   moves all of th
231b0 65 20 46 52 4f 4d 20 65 6c 65 6d 65 6e 74 73 20  e FROM elements 
231c0 6f 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20  of the subquery 
231d0 69 6e 74 6f 20 74 68 65 0a 20 20 2a 2a 20 74 68  into the.  ** th
231e0 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66  e FROM clause of
231f0 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
23200 2e 20 20 42 65 66 6f 72 65 20 64 6f 69 6e 67 20  .  Before doing 
23210 74 68 69 73 2c 20 72 65 6d 65 6d 62 65 72 0a 20  this, remember. 
23220 20 2a 2a 20 74 68 65 20 63 75 72 73 6f 72 20 6e   ** the cursor n
23230 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20 6f 72  umber for the or
23240 69 67 69 6e 61 6c 20 6f 75 74 65 72 20 71 75 65  iginal outer que
23250 72 79 20 46 52 4f 4d 20 65 6c 65 6d 65 6e 74 20  ry FROM element 
23260 69 6e 0a 20 20 2a 2a 20 69 50 61 72 65 6e 74 2e  in.  ** iParent.
23270 20 20 54 68 65 20 69 50 61 72 65 6e 74 20 63 75    The iParent cu
23280 72 73 6f 72 20 77 69 6c 6c 20 6e 65 76 65 72 20  rsor will never 
23290 62 65 20 75 73 65 64 2e 20 20 53 75 62 73 65 71  be used.  Subseq
232a0 75 65 6e 74 20 63 6f 64 65 0a 20 20 2a 2a 20 77  uent code.  ** w
232b0 69 6c 6c 20 73 63 61 6e 20 65 78 70 72 65 73 73  ill scan express
232c0 69 6f 6e 73 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72  ions looking for
232d0 20 69 50 61 72 65 6e 74 20 72 65 66 65 72 65 6e   iParent referen
232e0 63 65 73 20 61 6e 64 20 72 65 70 6c 61 63 65 0a  ces and replace.
232f0 20 20 2a 2a 20 74 68 6f 73 65 20 72 65 66 65 72    ** those refer
23300 65 6e 63 65 73 20 77 69 74 68 20 65 78 70 72 65  ences with expre
23310 73 73 69 6f 6e 73 20 74 68 61 74 20 72 65 73 6f  ssions that reso
23320 6c 76 65 20 74 6f 20 74 68 65 20 73 75 62 71 75  lve to the subqu
23330 65 72 79 20 46 52 4f 4d 0a 20 20 2a 2a 20 65 6c  ery FROM.  ** el
23340 65 6d 65 6e 74 73 20 77 65 20 61 72 65 20 6e 6f  ements we are no
23350 77 20 63 6f 70 79 69 6e 67 20 69 6e 2e 0a 20 20  w copying in..  
23360 2a 2f 0a 20 20 66 6f 72 28 70 50 61 72 65 6e 74  */.  for(pParent
23370 3d 70 3b 20 70 50 61 72 65 6e 74 3b 20 70 50 61  =p; pParent; pPa
23380 72 65 6e 74 3d 70 50 61 72 65 6e 74 2d 3e 70 50  rent=pParent->pP
23390 72 69 6f 72 2c 20 70 53 75 62 3d 70 53 75 62 2d  rior, pSub=pSub-
233a0 3e 70 50 72 69 6f 72 29 7b 0a 20 20 20 20 69 6e  >pPrior){.    in
233b0 74 20 6e 53 75 62 53 72 63 3b 0a 20 20 20 20 75  t nSubSrc;.    u
233c0 38 20 6a 6f 69 6e 74 79 70 65 20 3d 20 30 3b 0a  8 jointype = 0;.
233d0 20 20 20 20 70 53 75 62 53 72 63 20 3d 20 70 53      pSubSrc = pS
233e0 75 62 2d 3e 70 53 72 63 3b 20 20 20 20 20 2f 2a  ub->pSrc;     /*
233f0 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20   FROM clause of 
23400 73 75 62 71 75 65 72 79 20 2a 2f 0a 20 20 20 20  subquery */.    
23410 6e 53 75 62 53 72 63 20 3d 20 70 53 75 62 53 72  nSubSrc = pSubSr
23420 63 2d 3e 6e 53 72 63 3b 20 20 2f 2a 20 4e 75 6d  c->nSrc;  /* Num
23430 62 65 72 20 6f 66 20 74 65 72 6d 73 20 69 6e 20  ber of terms in 
23440 73 75 62 71 75 65 72 79 20 46 52 4f 4d 20 63 6c  subquery FROM cl
23450 61 75 73 65 20 2a 2f 0a 20 20 20 20 70 53 72 63  ause */.    pSrc
23460 20 3d 20 70 50 61 72 65 6e 74 2d 3e 70 53 72 63   = pParent->pSrc
23470 3b 20 20 20 20 20 2f 2a 20 46 52 4f 4d 20 63 6c  ;     /* FROM cl
23480 61 75 73 65 20 6f 66 20 74 68 65 20 6f 75 74 65  ause of the oute
23490 72 20 71 75 65 72 79 20 2a 2f 0a 0a 20 20 20 20  r query */..    
234a0 69 66 28 20 70 53 72 63 20 29 7b 0a 20 20 20 20  if( pSrc ){.    
234b0 20 20 61 73 73 65 72 74 28 20 70 50 61 72 65 6e    assert( pParen
234c0 74 3d 3d 70 20 29 3b 20 20 2f 2a 20 46 69 72 73  t==p );  /* Firs
234d0 74 20 74 69 6d 65 20 74 68 72 6f 75 67 68 20 74  t time through t
234e0 68 65 20 6c 6f 6f 70 20 2a 2f 0a 20 20 20 20 20  he loop */.     
234f0 20 6a 6f 69 6e 74 79 70 65 20 3d 20 70 53 75 62   jointype = pSub
23500 69 74 65 6d 2d 3e 66 67 2e 6a 6f 69 6e 74 79 70  item->fg.jointyp
23510 65 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  e;.    }else{.  
23520 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72      assert( pPar
23530 65 6e 74 21 3d 70 20 29 3b 20 20 2f 2a 20 32 6e  ent!=p );  /* 2n
23540 64 20 61 6e 64 20 73 75 62 73 65 71 75 65 6e 74  d and subsequent
23550 20 74 69 6d 65 73 20 74 68 72 6f 75 67 68 20 74   times through t
23560 68 65 20 6c 6f 6f 70 20 2a 2f 0a 20 20 20 20 20  he loop */.     
23570 20 70 53 72 63 20 3d 20 70 50 61 72 65 6e 74 2d   pSrc = pParent-
23580 3e 70 53 72 63 20 3d 20 73 71 6c 69 74 65 33 53  >pSrc = sqlite3S
23590 72 63 4c 69 73 74 41 70 70 65 6e 64 28 64 62 2c  rcListAppend(db,
235a0 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20   0, 0, 0);.     
235b0 20 69 66 28 20 70 53 72 63 3d 3d 30 20 29 7b 0a   if( pSrc==0 ){.
235c0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
235d0 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
235e0 20 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61   );.        brea
235f0 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  k;.      }.    }
23600 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 73 75 62  ..    /* The sub
23610 71 75 65 72 79 20 75 73 65 73 20 61 20 73 69 6e  query uses a sin
23620 67 6c 65 20 73 6c 6f 74 20 6f 66 20 74 68 65 20  gle slot of the 
23630 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74  FROM clause of t
23640 68 65 20 6f 75 74 65 72 0a 20 20 20 20 2a 2a 20  he outer.    ** 
23650 71 75 65 72 79 2e 20 20 49 66 20 74 68 65 20 73  query.  If the s
23660 75 62 71 75 65 72 79 20 68 61 73 20 6d 6f 72 65  ubquery has more
23670 20 74 68 61 6e 20 6f 6e 65 20 65 6c 65 6d 65 6e   than one elemen
23680 74 20 69 6e 20 69 74 73 20 46 52 4f 4d 20 63 6c  t in its FROM cl
23690 61 75 73 65 2c 0a 20 20 20 20 2a 2a 20 74 68 65  ause,.    ** the
236a0 6e 20 65 78 70 61 6e 64 20 74 68 65 20 6f 75 74  n expand the out
236b0 65 72 20 71 75 65 72 79 20 74 6f 20 6d 61 6b 65  er query to make
236c0 20 73 70 61 63 65 20 66 6f 72 20 69 74 20 74 6f   space for it to
236d0 20 68 6f 6c 64 20 61 6c 6c 20 65 6c 65 6d 65 6e   hold all elemen
236e0 74 73 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65  ts.    ** of the
236f0 20 73 75 62 71 75 65 72 79 2e 0a 20 20 20 20 2a   subquery..    *
23700 2a 0a 20 20 20 20 2a 2a 20 45 78 61 6d 70 6c 65  *.    ** Example
23710 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  :.    **.    ** 
23720 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d     SELECT * FROM
23730 20 74 61 62 41 2c 20 28 53 45 4c 45 43 54 20 2a   tabA, (SELECT *
23740 20 46 52 4f 4d 20 73 75 62 31 2c 20 73 75 62 32   FROM sub1, sub2
23750 29 2c 20 74 61 62 42 3b 0a 20 20 20 20 2a 2a 0a  ), tabB;.    **.
23760 20 20 20 20 2a 2a 20 54 68 65 20 6f 75 74 65 72      ** The outer
23770 20 71 75 65 72 79 20 68 61 73 20 33 20 73 6c 6f   query has 3 slo
23780 74 73 20 69 6e 20 69 74 73 20 46 52 4f 4d 20 63  ts in its FROM c
23790 6c 61 75 73 65 2e 20 20 4f 6e 65 20 73 6c 6f 74  lause.  One slot
237a0 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 6f   of the.    ** o
237b0 75 74 65 72 20 71 75 65 72 79 20 28 74 68 65 20  uter query (the 
237c0 6d 69 64 64 6c 65 20 73 6c 6f 74 29 20 69 73 20  middle slot) is 
237d0 75 73 65 64 20 62 79 20 74 68 65 20 73 75 62 71  used by the subq
237e0 75 65 72 79 2e 20 20 54 68 65 20 6e 65 78 74 0a  uery.  The next.
237f0 20 20 20 20 2a 2a 20 62 6c 6f 63 6b 20 6f 66 20      ** block of 
23800 63 6f 64 65 20 77 69 6c 6c 20 65 78 70 61 6e 64  code will expand
23810 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
23820 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 6f 20   FROM clause to 
23830 34 20 73 6c 6f 74 73 2e 0a 20 20 20 20 2a 2a 20  4 slots..    ** 
23840 54 68 65 20 6d 69 64 64 6c 65 20 73 6c 6f 74 20  The middle slot 
23850 69 73 20 65 78 70 61 6e 64 65 64 20 74 6f 20 74  is expanded to t
23860 77 6f 20 73 6c 6f 74 73 20 69 6e 20 6f 72 64 65  wo slots in orde
23870 72 20 74 6f 20 6d 61 6b 65 20 73 70 61 63 65 0a  r to make space.
23880 20 20 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 74      ** for the t
23890 77 6f 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20 74  wo elements in t
238a0 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f  he FROM clause o
238b0 66 20 74 68 65 20 73 75 62 71 75 65 72 79 2e 0a  f the subquery..
238c0 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e      */.    if( n
238d0 53 75 62 53 72 63 3e 31 20 29 7b 0a 20 20 20 20  SubSrc>1 ){.    
238e0 20 20 70 50 61 72 65 6e 74 2d 3e 70 53 72 63 20    pParent->pSrc 
238f0 3d 20 70 53 72 63 20 3d 20 73 71 6c 69 74 65 33  = pSrc = sqlite3
23900 53 72 63 4c 69 73 74 45 6e 6c 61 72 67 65 28 64  SrcListEnlarge(d
23910 62 2c 20 70 53 72 63 2c 20 6e 53 75 62 53 72 63  b, pSrc, nSubSrc
23920 2d 31 2c 69 46 72 6f 6d 2b 31 29 3b 0a 20 20 20  -1,iFrom+1);.   
23930 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f     if( db->mallo
23940 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 20  cFailed ){.     
23950 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
23960 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
23970 54 72 61 6e 73 66 65 72 20 74 68 65 20 46 52 4f  Transfer the FRO
23980 4d 20 63 6c 61 75 73 65 20 74 65 72 6d 73 20 66  M clause terms f
23990 72 6f 6d 20 74 68 65 20 73 75 62 71 75 65 72 79  rom the subquery
239a0 20 69 6e 74 6f 20 74 68 65 0a 20 20 20 20 2a 2a   into the.    **
239b0 20 6f 75 74 65 72 20 71 75 65 72 79 2e 0a 20 20   outer query..  
239c0 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30    */.    for(i=0
239d0 3b 20 69 3c 6e 53 75 62 53 72 63 3b 20 69 2b 2b  ; i<nSubSrc; i++
239e0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
239f0 49 64 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c  IdListDelete(db,
23a00 20 70 53 72 63 2d 3e 61 5b 69 2b 69 46 72 6f 6d   pSrc->a[i+iFrom
23a10 5d 2e 70 55 73 69 6e 67 29 3b 0a 20 20 20 20 20  ].pUsing);.     
23a20 20 61 73 73 65 72 74 28 20 70 53 72 63 2d 3e 61   assert( pSrc->a
23a30 5b 69 2b 69 46 72 6f 6d 5d 2e 66 67 2e 69 73 54  [i+iFrom].fg.isT
23a40 61 62 46 75 6e 63 3d 3d 30 20 29 3b 0a 20 20 20  abFunc==0 );.   
23a50 20 20 20 70 53 72 63 2d 3e 61 5b 69 2b 69 46 72     pSrc->a[i+iFr
23a60 6f 6d 5d 20 3d 20 70 53 75 62 53 72 63 2d 3e 61  om] = pSubSrc->a
23a70 5b 69 5d 3b 0a 20 20 20 20 20 20 69 4e 65 77 50  [i];.      iNewP
23a80 61 72 65 6e 74 20 3d 20 70 53 75 62 53 72 63 2d  arent = pSubSrc-
23a90 3e 61 5b 69 5d 2e 69 43 75 72 73 6f 72 3b 0a 20  >a[i].iCursor;. 
23aa0 20 20 20 20 20 6d 65 6d 73 65 74 28 26 70 53 75       memset(&pSu
23ab0 62 53 72 63 2d 3e 61 5b 69 5d 2c 20 30 2c 20 73  bSrc->a[i], 0, s
23ac0 69 7a 65 6f 66 28 70 53 75 62 53 72 63 2d 3e 61  izeof(pSubSrc->a
23ad0 5b 69 5d 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20  [i]));.    }.   
23ae0 20 70 53 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d 2e   pSrc->a[iFrom].
23af0 66 67 2e 6a 6f 69 6e 74 79 70 65 20 3d 20 6a 6f  fg.jointype = jo
23b00 69 6e 74 79 70 65 3b 0a 20 20 0a 20 20 20 20 2f  intype;.  .    /
23b10 2a 20 4e 6f 77 20 62 65 67 69 6e 20 73 75 62 73  * Now begin subs
23b20 74 69 74 75 74 69 6e 67 20 73 75 62 71 75 65 72  tituting subquer
23b30 79 20 72 65 73 75 6c 74 20 73 65 74 20 65 78 70  y result set exp
23b40 72 65 73 73 69 6f 6e 73 20 66 6f 72 20 0a 20 20  ressions for .  
23b50 20 20 2a 2a 20 72 65 66 65 72 65 6e 63 65 73 20    ** references 
23b60 74 6f 20 74 68 65 20 69 50 61 72 65 6e 74 20 69  to the iParent i
23b70 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  n the outer quer
23b80 79 2e 0a 20 20 20 20 2a 2a 20 0a 20 20 20 20 2a  y..    ** .    *
23b90 2a 20 45 78 61 6d 70 6c 65 3a 0a 20 20 20 20 2a  * Example:.    *
23ba0 2a 0a 20 20 20 20 2a 2a 20 20 20 53 45 4c 45 43  *.    **   SELEC
23bb0 54 20 61 2b 35 2c 20 62 2a 31 30 20 46 52 4f 4d  T a+5, b*10 FROM
23bc0 20 28 53 45 4c 45 43 54 20 78 2a 33 20 41 53 20   (SELECT x*3 AS 
23bd0 61 2c 20 79 2b 31 30 20 41 53 20 62 20 46 52 4f  a, y+10 AS b FRO
23be0 4d 20 74 31 29 20 57 48 45 52 45 20 61 3e 62 3b  M t1) WHERE a>b;
23bf0 0a 20 20 20 20 2a 2a 20 20 20 5c 20 20 20 20 20  .    **   \     
23c00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23c10 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 20 73  \_____________ s
23c20 75 62 71 75 65 72 79 20 5f 5f 5f 5f 5f 5f 5f 5f  ubquery ________
23c30 5f 5f 2f 20 20 20 20 20 20 20 20 20 20 2f 0a 20  __/          /. 
23c40 20 20 20 2a 2a 20 20 20 20 5c 5f 5f 5f 5f 5f 5f     **    \______
23c50 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 20  _______________ 
23c60 6f 75 74 65 72 20 71 75 65 72 79 20 5f 5f 5f 5f  outer query ____
23c70 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
23c80 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 0a 20 20 20 20  __________/.    
23c90 2a 2a 0a 20 20 20 20 2a 2a 20 57 65 20 6c 6f 6f  **.    ** We loo
23ca0 6b 20 61 74 20 65 76 65 72 79 20 65 78 70 72 65  k at every expre
23cb0 73 73 69 6f 6e 20 69 6e 20 74 68 65 20 6f 75 74  ssion in the out
23cc0 65 72 20 71 75 65 72 79 20 61 6e 64 20 65 76 65  er query and eve
23cd0 72 79 20 70 6c 61 63 65 20 77 65 20 73 65 65 0a  ry place we see.
23ce0 20 20 20 20 2a 2a 20 22 61 22 20 77 65 20 73 75      ** "a" we su
23cf0 62 73 74 69 74 75 74 65 20 22 78 2a 33 22 20 61  bstitute "x*3" a
23d00 6e 64 20 65 76 65 72 79 20 70 6c 61 63 65 20 77  nd every place w
23d10 65 20 73 65 65 20 22 62 22 20 77 65 20 73 75 62  e see "b" we sub
23d20 73 74 69 74 75 74 65 20 22 79 2b 31 30 22 2e 0a  stitute "y+10"..
23d30 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
23d40 53 75 62 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b  Sub->pOrderBy ){
23d50 0a 20 20 20 20 20 20 2f 2a 20 41 74 20 74 68 69  .      /* At thi
23d60 73 20 70 6f 69 6e 74 2c 20 61 6e 79 20 6e 6f 6e  s point, any non
23d70 2d 7a 65 72 6f 20 69 4f 72 64 65 72 42 79 43 6f  -zero iOrderByCo
23d80 6c 20 76 61 6c 75 65 73 20 69 6e 64 69 63 61 74  l values indicat
23d90 65 20 74 68 61 74 20 74 68 65 0a 20 20 20 20 20  e that the.     
23da0 20 2a 2a 20 4f 52 44 45 52 20 42 59 20 63 6f 6c   ** ORDER BY col
23db0 75 6d 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 69  umn expression i
23dc0 73 20 69 64 65 6e 74 69 63 61 6c 20 74 6f 20 74  s identical to t
23dd0 68 65 20 69 4f 72 64 65 72 42 79 43 6f 6c 27 74  he iOrderByCol't
23de0 68 0a 20 20 20 20 20 20 2a 2a 20 65 78 70 72 65  h.      ** expre
23df0 73 73 69 6f 6e 20 72 65 74 75 72 6e 65 64 20 62  ssion returned b
23e00 79 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  y SELECT stateme
23e10 6e 74 20 70 53 75 62 2e 20 53 69 6e 63 65 20 74  nt pSub. Since t
23e20 68 65 73 65 20 76 61 6c 75 65 73 0a 20 20 20 20  hese values.    
23e30 20 20 2a 2a 20 64 6f 20 6e 6f 74 20 6e 65 63 65    ** do not nece
23e40 73 73 61 72 69 6c 79 20 63 6f 72 72 65 73 70 6f  ssarily correspo
23e50 6e 64 20 74 6f 20 63 6f 6c 75 6d 6e 73 20 69 6e  nd to columns in
23e60 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
23e70 74 20 70 50 61 72 65 6e 74 2c 0a 20 20 20 20 20  t pParent,.     
23e80 20 2a 2a 20 7a 65 72 6f 20 74 68 65 6d 20 62 65   ** zero them be
23e90 66 6f 72 65 20 74 72 61 6e 73 66 65 72 69 6e 67  fore transfering
23ea0 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   the ORDER BY cl
23eb0 61 75 73 65 2e 0a 20 20 20 20 20 20 2a 2a 0a 20  ause..      **. 
23ec0 20 20 20 20 20 2a 2a 20 4e 6f 74 20 64 6f 69 6e       ** Not doin
23ed0 67 20 74 68 69 73 20 6d 61 79 20 63 61 75 73 65  g this may cause
23ee0 20 61 6e 20 65 72 72 6f 72 20 69 66 20 61 20 73   an error if a s
23ef0 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 20 74  ubsequent call t
23f00 6f 20 74 68 69 73 0a 20 20 20 20 20 20 2a 2a 20  o this.      ** 
23f10 66 75 6e 63 74 69 6f 6e 20 61 74 74 65 6d 70 74  function attempt
23f20 73 20 74 6f 20 66 6c 61 74 74 65 6e 20 61 20 63  s to flatten a c
23f30 6f 6d 70 6f 75 6e 64 20 73 75 62 2d 71 75 65 72  ompound sub-quer
23f40 79 20 69 6e 74 6f 20 70 50 61 72 65 6e 74 0a 20  y into pParent. 
23f50 20 20 20 20 20 2a 2a 20 28 74 68 65 20 6f 6e 6c       ** (the onl
23f60 79 20 77 61 79 20 74 68 69 73 20 63 61 6e 20 68  y way this can h
23f70 61 70 70 65 6e 20 69 73 20 69 66 20 74 68 65 20  appen is if the 
23f80 63 6f 6d 70 6f 75 6e 64 20 73 75 62 2d 71 75 65  compound sub-que
23f90 72 79 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 63  ry is.      ** c
23fa0 75 72 72 65 6e 74 6c 79 20 70 61 72 74 20 6f 66  urrently part of
23fb0 20 70 53 75 62 2d 3e 70 53 72 63 29 2e 20 53 65   pSub->pSrc). Se
23fc0 65 20 74 69 63 6b 65 74 20 5b 64 31 31 61 36 65  e ticket [d11a6e
23fd0 39 30 38 66 5d 2e 20 20 2a 2f 0a 20 20 20 20 20  908f].  */.     
23fe0 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65   ExprList *pOrde
23ff0 72 42 79 20 3d 20 70 53 75 62 2d 3e 70 4f 72 64  rBy = pSub->pOrd
24000 65 72 42 79 3b 0a 20 20 20 20 20 20 66 6f 72 28  erBy;.      for(
24010 69 3d 30 3b 20 69 3c 70 4f 72 64 65 72 42 79 2d  i=0; i<pOrderBy-
24020 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20  >nExpr; i++){.  
24030 20 20 20 20 20 20 70 4f 72 64 65 72 42 79 2d 3e        pOrderBy->
24040 61 5b 69 5d 2e 75 2e 78 2e 69 4f 72 64 65 72 42  a[i].u.x.iOrderB
24050 79 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20  yCol = 0;.      
24060 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  }.      assert( 
24070 70 50 61 72 65 6e 74 2d 3e 70 4f 72 64 65 72 42  pParent->pOrderB
24080 79 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 50  y==0 );.      pP
24090 61 72 65 6e 74 2d 3e 70 4f 72 64 65 72 42 79 20  arent->pOrderBy 
240a0 3d 20 70 4f 72 64 65 72 42 79 3b 0a 20 20 20 20  = pOrderBy;.    
240b0 20 20 70 53 75 62 2d 3e 70 4f 72 64 65 72 42 79    pSub->pOrderBy
240c0 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20   = 0;.    }.    
240d0 70 57 68 65 72 65 20 3d 20 73 71 6c 69 74 65 33  pWhere = sqlite3
240e0 45 78 70 72 44 75 70 28 64 62 2c 20 70 53 75 62  ExprDup(db, pSub
240f0 2d 3e 70 57 68 65 72 65 2c 20 30 29 3b 0a 20 20  ->pWhere, 0);.  
24100 20 20 69 66 28 20 69 73 4c 65 66 74 4a 6f 69 6e    if( isLeftJoin
24110 3e 30 20 29 7b 0a 20 20 20 20 20 20 73 65 74 4a  >0 ){.      setJ
24120 6f 69 6e 45 78 70 72 28 70 57 68 65 72 65 2c 20  oinExpr(pWhere, 
24130 69 4e 65 77 50 61 72 65 6e 74 29 3b 0a 20 20 20  iNewParent);.   
24140 20 7d 0a 20 20 20 20 70 50 61 72 65 6e 74 2d 3e   }.    pParent->
24150 70 57 68 65 72 65 20 3d 20 73 71 6c 69 74 65 33  pWhere = sqlite3
24160 45 78 70 72 41 6e 64 28 64 62 2c 20 70 57 68 65  ExprAnd(db, pWhe
24170 72 65 2c 20 70 50 61 72 65 6e 74 2d 3e 70 57 68  re, pParent->pWh
24180 65 72 65 29 3b 0a 20 20 20 20 69 66 28 20 64 62  ere);.    if( db
24190 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 3d 3d  ->mallocFailed==
241a0 30 20 29 7b 0a 20 20 20 20 20 20 53 75 62 73 74  0 ){.      Subst
241b0 43 6f 6e 74 65 78 74 20 78 3b 0a 20 20 20 20 20  Context x;.     
241c0 20 78 2e 70 50 61 72 73 65 20 3d 20 70 50 61 72   x.pParse = pPar
241d0 73 65 3b 0a 20 20 20 20 20 20 78 2e 69 54 61 62  se;.      x.iTab
241e0 6c 65 20 3d 20 69 50 61 72 65 6e 74 3b 0a 20 20  le = iParent;.  
241f0 20 20 20 20 78 2e 69 4e 65 77 54 61 62 6c 65 20      x.iNewTable 
24200 3d 20 69 4e 65 77 50 61 72 65 6e 74 3b 0a 20 20  = iNewParent;.  
24210 20 20 20 20 78 2e 69 73 4c 65 66 74 4a 6f 69 6e      x.isLeftJoin
24220 20 3d 20 69 73 4c 65 66 74 4a 6f 69 6e 3b 0a 20   = isLeftJoin;. 
24230 20 20 20 20 20 78 2e 70 45 4c 69 73 74 20 3d 20       x.pEList = 
24240 70 53 75 62 2d 3e 70 45 4c 69 73 74 3b 0a 20 20  pSub->pEList;.  
24250 20 20 20 20 73 75 62 73 74 53 65 6c 65 63 74 28      substSelect(
24260 26 78 2c 20 70 50 61 72 65 6e 74 2c 20 30 29 3b  &x, pParent, 0);
24270 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a  .    }.  .    /*
24280 20 54 68 65 20 66 6c 61 74 74 65 6e 65 64 20 71   The flattened q
24290 75 65 72 79 20 69 73 20 64 69 73 74 69 6e 63 74  uery is distinct
242a0 20 69 66 20 65 69 74 68 65 72 20 74 68 65 20 69   if either the i
242b0 6e 6e 65 72 20 6f 72 20 74 68 65 0a 20 20 20 20  nner or the.    
242c0 2a 2a 20 6f 75 74 65 72 20 71 75 65 72 79 20 69  ** outer query i
242d0 73 20 64 69 73 74 69 6e 63 74 2e 20 0a 20 20 20  s distinct. .   
242e0 20 2a 2f 0a 20 20 20 20 70 50 61 72 65 6e 74 2d   */.    pParent-
242f0 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20 70 53 75  >selFlags |= pSu
24300 62 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46  b->selFlags & SF
24310 5f 44 69 73 74 69 6e 63 74 3b 0a 20 20 0a 20 20  _Distinct;.  .  
24320 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 53 45 4c 45    /*.    ** SELE
24330 43 54 20 2e 2e 2e 20 46 52 4f 4d 20 28 53 45 4c  CT ... FROM (SEL
24340 45 43 54 20 2e 2e 2e 20 4c 49 4d 49 54 20 61 20  ECT ... LIMIT a 
24350 4f 46 46 53 45 54 20 62 29 20 4c 49 4d 49 54 20  OFFSET b) LIMIT 
24360 78 20 4f 46 46 53 45 54 20 79 3b 0a 20 20 20 20  x OFFSET y;.    
24370 2a 2a 0a 20 20 20 20 2a 2a 20 4f 6e 65 20 69 73  **.    ** One is
24380 20 74 65 6d 70 74 65 64 20 74 6f 20 74 72 79 20   tempted to try 
24390 74 6f 20 61 64 64 20 61 20 61 6e 64 20 62 20 74  to add a and b t
243a0 6f 20 63 6f 6d 62 69 6e 65 20 74 68 65 20 6c 69  o combine the li
243b0 6d 69 74 73 2e 20 20 42 75 74 20 74 68 69 73 0a  mits.  But this.
243c0 20 20 20 20 2a 2a 20 64 6f 65 73 20 6e 6f 74 20      ** does not 
243d0 77 6f 72 6b 20 69 66 20 65 69 74 68 65 72 20 6c  work if either l
243e0 69 6d 69 74 20 69 73 20 6e 65 67 61 74 69 76 65  imit is negative
243f0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
24400 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20 29 7b   pSub->pLimit ){
24410 0a 20 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e  .      pParent->
24420 70 4c 69 6d 69 74 20 3d 20 70 53 75 62 2d 3e 70  pLimit = pSub->p
24430 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 70 53 75  Limit;.      pSu
24440 62 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20  b->pLimit = 0;. 
24450 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46     }.  }..  /* F
24460 69 6e 69 61 6c 6c 79 2c 20 64 65 6c 65 74 65 20  inially, delete 
24470 77 68 61 74 20 69 73 20 6c 65 66 74 20 6f 66 20  what is left of 
24480 74 68 65 20 73 75 62 71 75 65 72 79 20 61 6e 64  the subquery and
24490 20 72 65 74 75 72 6e 0a 20 20 2a 2a 20 73 75 63   return.  ** suc
244a0 63 65 73 73 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c  cess..  */.  sql
244b0 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65  ite3SelectDelete
244c0 28 64 62 2c 20 70 53 75 62 31 29 3b 0a 0a 23 69  (db, pSub1);..#i
244d0 66 20 53 45 4c 45 43 54 54 52 41 43 45 5f 45 4e  f SELECTTRACE_EN
244e0 41 42 4c 45 44 0a 20 20 69 66 28 20 73 71 6c 69  ABLED.  if( sqli
244f0 74 65 33 53 65 6c 65 63 74 54 72 61 63 65 20 26  te3SelectTrace &
24500 20 30 78 31 30 30 20 29 7b 0a 20 20 20 20 53 45   0x100 ){.    SE
24510 4c 45 43 54 54 52 41 43 45 28 30 78 31 30 30 2c  LECTTRACE(0x100,
24520 70 50 61 72 73 65 2c 70 2c 28 22 41 66 74 65 72  pParse,p,("After
24530 20 66 6c 61 74 74 65 6e 69 6e 67 3a 5c 6e 22 29   flattening:\n")
24540 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 54 72  );.    sqlite3Tr
24550 65 65 56 69 65 77 53 65 6c 65 63 74 28 30 2c 20  eeViewSelect(0, 
24560 70 2c 20 30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  p, 0);.  }.#endi
24570 66 0a 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d  f..  return 1;.}
24580 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69  .#endif /* !defi
24590 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
245a0 53 55 42 51 55 45 52 59 29 20 7c 7c 20 21 64 65  SUBQUERY) || !de
245b0 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
245c0 54 5f 56 49 45 57 29 20 2a 2f 0a 0a 2f 2a 0a 2a  T_VIEW) */../*.*
245d0 2a 20 41 20 73 74 72 75 63 74 75 72 65 20 74 6f  * A structure to
245e0 20 6b 65 65 70 20 74 72 61 63 6b 20 6f 66 20 61   keep track of a
245f0 6c 6c 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e  ll of the column
24600 20 76 61 6c 75 65 73 20 74 68 61 74 20 61 72 65   values that are
24610 20 66 69 78 65 64 20 74 6f 0a 2a 2a 20 61 20 6b   fixed to.** a k
24620 6e 6f 77 6e 20 76 61 6c 75 65 20 64 75 65 20 74  nown value due t
24630 6f 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 63  o WHERE clause c
24640 6f 6e 73 74 72 61 69 6e 74 73 20 6f 66 20 74 68  onstraints of th
24650 65 20 66 6f 72 6d 20 43 4f 4c 55 4d 4e 3d 56 41  e form COLUMN=VA
24660 4c 55 45 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20  LUE..*/.typedef 
24670 73 74 72 75 63 74 20 57 68 65 72 65 43 6f 6e 73  struct WhereCons
24680 74 20 57 68 65 72 65 43 6f 6e 73 74 3b 0a 73 74  t WhereConst;.st
24690 72 75 63 74 20 57 68 65 72 65 43 6f 6e 73 74 20  ruct WhereConst 
246a0 7b 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  {.  Parse *pPars
246b0 65 3b 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20  e;   /* Parsing 
246c0 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74  context */.  int
246d0 20 6e 43 6f 6e 73 74 3b 20 20 20 20 20 20 2f 2a   nConst;      /*
246e0 20 4e 75 6d 62 65 72 20 66 6f 72 20 43 4f 4c 55   Number for COLU
246f0 4d 4e 3d 43 4f 4e 53 54 41 4e 54 20 74 65 72 6d  MN=CONSTANT term
24700 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 68 6e 67  s */.  int nChng
24710 3b 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65  ;       /* Numbe
24720 72 20 6f 66 20 74 69 6d 65 73 20 61 20 63 6f 6e  r of times a con
24730 73 74 61 6e 74 20 69 73 20 70 72 6f 70 61 67 61  stant is propaga
24740 74 65 64 20 2a 2f 0a 20 20 45 78 70 72 20 2a 2a  ted */.  Expr **
24750 61 70 45 78 70 72 3b 20 20 20 2f 2a 20 5b 69 2a  apExpr;   /* [i*
24760 32 5d 20 69 73 20 43 4f 4c 55 4d 4e 20 61 6e 64  2] is COLUMN and
24770 20 5b 69 2a 32 2b 31 5d 20 69 73 20 56 41 4c 55   [i*2+1] is VALU
24780 45 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41  E */.};../*.** A
24790 64 64 20 61 20 6e 65 77 20 65 6e 74 72 79 20 74  dd a new entry t
247a0 6f 20 74 68 65 20 70 43 6f 6e 73 74 20 6f 62 6a  o the pConst obj
247b0 65 63 74 2e 20 20 45 78 63 65 70 74 2c 20 64 6f  ect.  Except, do
247c0 20 6e 6f 74 20 61 64 64 20 64 75 70 6c 69 63 61   not add duplica
247d0 74 65 0a 2a 2a 20 70 43 6f 6c 75 6d 6e 20 65 6e  te.** pColumn en
247e0 74 69 72 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  tires..*/.static
247f0 20 76 6f 69 64 20 63 6f 6e 73 74 49 6e 73 65 72   void constInser
24800 74 28 0a 20 20 57 68 65 72 65 43 6f 6e 73 74 20  t(.  WhereConst 
24810 2a 70 43 6f 6e 73 74 2c 20 20 20 20 20 20 2f 2a  *pConst,      /*
24820 20 54 68 65 20 57 68 65 72 65 43 6f 6e 73 74 20   The WhereConst 
24830 69 6e 74 6f 20 77 68 69 63 68 20 77 65 20 61 72  into which we ar
24840 65 20 69 6e 73 65 72 74 69 6e 67 20 2a 2f 0a 20  e inserting */. 
24850 20 45 78 70 72 20 2a 70 43 6f 6c 75 6d 6e 2c 20   Expr *pColumn, 
24860 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
24870 20 43 4f 4c 55 4d 4e 20 70 61 72 74 20 6f 66 20   COLUMN part of 
24880 74 68 65 20 63 6f 6e 73 74 72 61 69 6e 74 20 2a  the constraint *
24890 2f 0a 20 20 45 78 70 72 20 2a 70 56 61 6c 75 65  /.  Expr *pValue
248a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
248b0 54 68 65 20 56 41 4c 55 45 20 70 61 72 74 20 6f  The VALUE part o
248c0 66 20 74 68 65 20 63 6f 6e 73 74 72 61 69 6e 74  f the constraint
248d0 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a   */.){.  int i;.
248e0 20 20 61 73 73 65 72 74 28 20 70 43 6f 6c 75 6d    assert( pColum
248f0 6e 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e  n->op==TK_COLUMN
24900 20 29 3b 0a 0a 20 20 2f 2a 20 32 30 31 38 2d 31   );..  /* 2018-1
24910 30 2d 32 35 20 74 69 63 6b 65 74 20 5b 63 66 35  0-25 ticket [cf5
24920 65 64 32 30 66 5d 0a 20 20 2a 2a 20 4d 61 6b 65  ed20f].  ** Make
24930 20 73 75 72 65 20 74 68 65 20 73 61 6d 65 20 70   sure the same p
24940 43 6f 6c 75 6d 6e 20 69 73 20 6e 6f 74 20 69 6e  Column is not in
24950 73 65 72 74 65 64 20 6d 6f 72 65 20 74 68 61 6e  serted more than
24960 20 6f 6e 63 65 20 2a 2f 0a 20 20 66 6f 72 28 69   once */.  for(i
24970 3d 30 3b 20 69 3c 70 43 6f 6e 73 74 2d 3e 6e 43  =0; i<pConst->nC
24980 6f 6e 73 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  onst; i++){.    
24990 63 6f 6e 73 74 20 45 78 70 72 20 2a 70 45 78 70  const Expr *pExp
249a0 72 20 3d 20 70 43 6f 6e 73 74 2d 3e 61 70 45 78  r = pConst->apEx
249b0 70 72 5b 69 2a 32 5d 3b 0a 20 20 20 20 61 73 73  pr[i*2];.    ass
249c0 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d  ert( pExpr->op==
249d0 54 4b 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20  TK_COLUMN );.   
249e0 20 69 66 28 20 70 45 78 70 72 2d 3e 69 54 61 62   if( pExpr->iTab
249f0 6c 65 3d 3d 70 43 6f 6c 75 6d 6e 2d 3e 69 54 61  le==pColumn->iTa
24a00 62 6c 65 0a 20 20 20 20 20 26 26 20 70 45 78 70  ble.     && pExp
24a10 72 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 70 43 6f 6c  r->iColumn==pCol
24a20 75 6d 6e 2d 3e 69 43 6f 6c 75 6d 6e 0a 20 20 20  umn->iColumn.   
24a30 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
24a40 3b 20 20 2f 2a 20 41 6c 72 65 61 64 79 20 70 72  ;  /* Already pr
24a50 65 73 65 6e 74 2e 20 20 52 65 74 75 72 6e 20 77  esent.  Return w
24a60 69 74 68 6f 75 74 20 64 6f 69 6e 67 20 61 6e 79  ithout doing any
24a70 74 68 69 6e 67 2e 20 2a 2f 0a 20 20 20 20 7d 0a  thing. */.    }.
24a80 20 20 7d 0a 0a 20 20 70 43 6f 6e 73 74 2d 3e 6e    }..  pConst->n
24a90 43 6f 6e 73 74 2b 2b 3b 0a 20 20 70 43 6f 6e 73  Const++;.  pCons
24aa0 74 2d 3e 61 70 45 78 70 72 20 3d 20 73 71 6c 69  t->apExpr = sqli
24ab0 74 65 33 44 62 52 65 61 6c 6c 6f 63 4f 72 46 72  te3DbReallocOrFr
24ac0 65 65 28 70 43 6f 6e 73 74 2d 3e 70 50 61 72 73  ee(pConst->pPars
24ad0 65 2d 3e 64 62 2c 20 70 43 6f 6e 73 74 2d 3e 61  e->db, pConst->a
24ae0 70 45 78 70 72 2c 0a 20 20 20 20 20 20 20 20 20  pExpr,.         
24af0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24b00 70 43 6f 6e 73 74 2d 3e 6e 43 6f 6e 73 74 2a 32  pConst->nConst*2
24b10 2a 73 69 7a 65 6f 66 28 45 78 70 72 2a 29 29 3b  *sizeof(Expr*));
24b20 0a 20 20 69 66 28 20 70 43 6f 6e 73 74 2d 3e 61  .  if( pConst->a
24b30 70 45 78 70 72 3d 3d 30 20 29 7b 0a 20 20 20 20  pExpr==0 ){.    
24b40 70 43 6f 6e 73 74 2d 3e 6e 43 6f 6e 73 74 20 3d  pConst->nConst =
24b50 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   0;.  }else{.   
24b60 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70   if( ExprHasProp
24b70 65 72 74 79 28 70 56 61 6c 75 65 2c 20 45 50 5f  erty(pValue, EP_
24b80 46 69 78 65 64 43 6f 6c 29 20 29 20 70 56 61 6c  FixedCol) ) pVal
24b90 75 65 20 3d 20 70 56 61 6c 75 65 2d 3e 70 4c 65  ue = pValue->pLe
24ba0 66 74 3b 0a 20 20 20 20 70 43 6f 6e 73 74 2d 3e  ft;.    pConst->
24bb0 61 70 45 78 70 72 5b 70 43 6f 6e 73 74 2d 3e 6e  apExpr[pConst->n
24bc0 43 6f 6e 73 74 2a 32 2d 32 5d 20 3d 20 70 43 6f  Const*2-2] = pCo
24bd0 6c 75 6d 6e 3b 0a 20 20 20 20 70 43 6f 6e 73 74  lumn;.    pConst
24be0 2d 3e 61 70 45 78 70 72 5b 70 43 6f 6e 73 74 2d  ->apExpr[pConst-
24bf0 3e 6e 43 6f 6e 73 74 2a 32 2d 31 5d 20 3d 20 70  >nConst*2-1] = p
24c00 56 61 6c 75 65 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  Value;.  }.}../*
24c10 0a 2a 2a 20 46 69 6e 64 20 61 6c 6c 20 74 65 72  .** Find all ter
24c20 6d 73 20 6f 66 20 43 4f 4c 55 4d 4e 3d 56 41 4c  ms of COLUMN=VAL
24c30 55 45 20 6f 72 20 56 41 4c 55 45 3d 43 4f 4c 55  UE or VALUE=COLU
24c40 4d 4e 20 69 6e 20 70 45 78 70 72 20 77 68 65 72  MN in pExpr wher
24c50 65 20 56 41 4c 55 45 0a 2a 2a 20 69 73 20 61 20  e VALUE.** is a 
24c60 63 6f 6e 73 74 61 6e 74 20 65 78 70 72 65 73 73  constant express
24c70 69 6f 6e 20 61 6e 64 20 77 68 65 72 65 20 74 68  ion and where th
24c80 65 20 74 65 72 6d 20 6d 75 73 74 20 62 65 20 74  e term must be t
24c90 72 75 65 20 62 65 63 61 75 73 65 20 69 74 0a 2a  rue because it.*
24ca0 2a 20 69 73 20 70 61 72 74 20 6f 66 20 74 68 65  * is part of the
24cb0 20 41 4e 44 2d 63 6f 6e 6e 65 63 74 65 64 20 74   AND-connected t
24cc0 65 72 6d 73 20 6f 66 20 74 68 65 20 65 78 70 72  erms of the expr
24cd0 65 73 73 69 6f 6e 2e 20 20 46 6f 72 20 65 61 63  ession.  For eac
24ce0 68 20 74 65 72 6d 0a 2a 2a 20 66 6f 75 6e 64 2c  h term.** found,
24cf0 20 61 64 64 20 69 74 20 74 6f 20 74 68 65 20 70   add it to the p
24d00 43 6f 6e 73 74 20 73 74 72 75 63 74 75 72 65 2e  Const structure.
24d10 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
24d20 66 69 6e 64 43 6f 6e 73 74 49 6e 57 68 65 72 65  findConstInWhere
24d30 28 57 68 65 72 65 43 6f 6e 73 74 20 2a 70 43 6f  (WhereConst *pCo
24d40 6e 73 74 2c 20 45 78 70 72 20 2a 70 45 78 70 72  nst, Expr *pExpr
24d50 29 7b 0a 20 20 45 78 70 72 20 2a 70 52 69 67 68  ){.  Expr *pRigh
24d60 74 2c 20 2a 70 4c 65 66 74 3b 0a 20 20 69 66 28  t, *pLeft;.  if(
24d70 20 70 45 78 70 72 3d 3d 30 20 29 20 72 65 74 75   pExpr==0 ) retu
24d80 72 6e 3b 0a 20 20 69 66 28 20 45 78 70 72 48 61  rn;.  if( ExprHa
24d90 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
24da0 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29 20   EP_FromJoin) ) 
24db0 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 70 45  return;.  if( pE
24dc0 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 4e 44 20  xpr->op==TK_AND 
24dd0 29 7b 0a 20 20 20 20 66 69 6e 64 43 6f 6e 73 74  ){.    findConst
24de0 49 6e 57 68 65 72 65 28 70 43 6f 6e 73 74 2c 20  InWhere(pConst, 
24df0 70 45 78 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a  pExpr->pRight);.
24e00 20 20 20 20 66 69 6e 64 43 6f 6e 73 74 49 6e 57      findConstInW
24e10 68 65 72 65 28 70 43 6f 6e 73 74 2c 20 70 45 78  here(pConst, pEx
24e20 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20  pr->pLeft);.    
24e30 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66  return;.  }.  if
24e40 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f  ( pExpr->op!=TK_
24e50 45 51 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70  EQ ) return;.  p
24e60 52 69 67 68 74 20 3d 20 70 45 78 70 72 2d 3e 70  Right = pExpr->p
24e70 52 69 67 68 74 3b 0a 20 20 70 4c 65 66 74 20 3d  Right;.  pLeft =
24e80 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20   pExpr->pLeft;. 
24e90 20 61 73 73 65 72 74 28 20 70 52 69 67 68 74 21   assert( pRight!
24ea0 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
24eb0 70 4c 65 66 74 21 3d 30 20 29 3b 0a 20 20 69 66  pLeft!=0 );.  if
24ec0 28 20 70 52 69 67 68 74 2d 3e 6f 70 3d 3d 54 4b  ( pRight->op==TK
24ed0 5f 43 4f 4c 55 4d 4e 0a 20 20 20 26 26 20 21 45  _COLUMN.   && !E
24ee0 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
24ef0 52 69 67 68 74 2c 20 45 50 5f 46 69 78 65 64 43  Right, EP_FixedC
24f00 6f 6c 29 0a 20 20 20 26 26 20 73 71 6c 69 74 65  ol).   && sqlite
24f10 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 28  3ExprIsConstant(
24f20 70 4c 65 66 74 29 0a 20 20 20 26 26 20 73 71 6c  pLeft).   && sql
24f30 69 74 65 33 49 73 42 69 6e 61 72 79 28 73 71 6c  ite3IsBinary(sql
24f40 69 74 65 33 42 69 6e 61 72 79 43 6f 6d 70 61 72  ite3BinaryCompar
24f50 65 43 6f 6c 6c 53 65 71 28 70 43 6f 6e 73 74 2d  eCollSeq(pConst-
24f60 3e 70 50 61 72 73 65 2c 70 4c 65 66 74 2c 70 52  >pParse,pLeft,pR
24f70 69 67 68 74 29 29 0a 20 20 29 7b 0a 20 20 20 20  ight)).  ){.    
24f80 63 6f 6e 73 74 49 6e 73 65 72 74 28 70 43 6f 6e  constInsert(pCon
24f90 73 74 2c 20 70 52 69 67 68 74 2c 20 70 4c 65 66  st, pRight, pLef
24fa0 74 29 3b 0a 20 20 7d 65 6c 73 65 0a 20 20 69 66  t);.  }else.  if
24fb0 28 20 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f  ( pLeft->op==TK_
24fc0 43 4f 4c 55 4d 4e 0a 20 20 20 26 26 20 21 45 78  COLUMN.   && !Ex
24fd0 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 4c  prHasProperty(pL
24fe0 65 66 74 2c 20 45 50 5f 46 69 78 65 64 43 6f 6c  eft, EP_FixedCol
24ff0 29 0a 20 20 20 26 26 20 73 71 6c 69 74 65 33 45  ).   && sqlite3E
25000 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 28 70 52  xprIsConstant(pR
25010 69 67 68 74 29 0a 20 20 20 26 26 20 73 71 6c 69  ight).   && sqli
25020 74 65 33 49 73 42 69 6e 61 72 79 28 73 71 6c 69  te3IsBinary(sqli
25030 74 65 33 42 69 6e 61 72 79 43 6f 6d 70 61 72 65  te3BinaryCompare
25040 43 6f 6c 6c 53 65 71 28 70 43 6f 6e 73 74 2d 3e  CollSeq(pConst->
25050 70 50 61 72 73 65 2c 70 4c 65 66 74 2c 70 52 69  pParse,pLeft,pRi
25060 67 68 74 29 29 0a 20 20 29 7b 0a 20 20 20 20 63  ght)).  ){.    c
25070 6f 6e 73 74 49 6e 73 65 72 74 28 70 43 6f 6e 73  onstInsert(pCons
25080 74 2c 20 70 4c 65 66 74 2c 20 70 52 69 67 68 74  t, pLeft, pRight
25090 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
250a0 54 68 69 73 20 69 73 20 61 20 57 61 6c 6b 65 72  This is a Walker
250b0 20 65 78 70 72 65 73 73 69 6f 6e 20 63 61 6c 6c   expression call
250c0 62 61 63 6b 2e 20 20 70 45 78 70 72 20 69 73 20  back.  pExpr is 
250d0 61 20 63 61 6e 64 69 64 61 74 65 20 65 78 70 72  a candidate expr
250e0 65 73 73 69 6f 6e 0a 2a 2a 20 74 6f 20 62 65 20  ession.** to be 
250f0 72 65 70 6c 61 63 65 64 20 62 79 20 61 20 76 61  replaced by a va
25100 6c 75 65 2e 20 20 49 66 20 70 45 78 70 72 20 69  lue.  If pExpr i
25110 73 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 20  s equivalent to 
25120 6f 6e 65 20 6f 66 20 74 68 65 0a 2a 2a 20 63 6f  one of the.** co
25130 6c 75 6d 6e 73 20 6e 61 6d 65 64 20 69 6e 20 70  lumns named in p
25140 57 61 6c 6b 65 72 2d 3e 75 2e 70 43 6f 6e 73 74  Walker->u.pConst
25150 2c 20 74 68 65 6e 20 6f 76 65 72 77 72 69 74 65  , then overwrite
25160 20 69 74 20 77 69 74 68 20 69 74 73 0a 2a 2a 20   it with its.** 
25170 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 76 61  corresponding va
25180 6c 75 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  lue..*/.static i
25190 6e 74 20 70 72 6f 70 61 67 61 74 65 43 6f 6e 73  nt propagateCons
251a0 74 61 6e 74 45 78 70 72 52 65 77 72 69 74 65 28  tantExprRewrite(
251b0 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c  Walker *pWalker,
251c0 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20   Expr *pExpr){. 
251d0 20 69 6e 74 20 69 3b 0a 20 20 57 68 65 72 65 43   int i;.  WhereC
251e0 6f 6e 73 74 20 2a 70 43 6f 6e 73 74 3b 0a 20 20  onst *pConst;.  
251f0 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54  if( pExpr->op!=T
25200 4b 5f 43 4f 4c 55 4d 4e 20 29 20 72 65 74 75 72  K_COLUMN ) retur
25210 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a  n WRC_Continue;.
25220 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f    if( ExprHasPro
25230 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
25240 46 69 78 65 64 43 6f 6c 29 20 29 20 72 65 74 75  FixedCol) ) retu
25250 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b  rn WRC_Continue;
25260 0a 20 20 70 43 6f 6e 73 74 20 3d 20 70 57 61 6c  .  pConst = pWal
25270 6b 65 72 2d 3e 75 2e 70 43 6f 6e 73 74 3b 0a 20  ker->u.pConst;. 
25280 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 43 6f 6e   for(i=0; i<pCon
25290 73 74 2d 3e 6e 43 6f 6e 73 74 3b 20 69 2b 2b 29  st->nConst; i++)
252a0 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 43 6f 6c  {.    Expr *pCol
252b0 75 6d 6e 20 3d 20 70 43 6f 6e 73 74 2d 3e 61 70  umn = pConst->ap
252c0 45 78 70 72 5b 69 2a 32 5d 3b 0a 20 20 20 20 69  Expr[i*2];.    i
252d0 66 28 20 70 43 6f 6c 75 6d 6e 3d 3d 70 45 78 70  f( pColumn==pExp
252e0 72 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  r ) continue;.  
252f0 20 20 69 66 28 20 70 43 6f 6c 75 6d 6e 2d 3e 69    if( pColumn->i
25300 54 61 62 6c 65 21 3d 70 45 78 70 72 2d 3e 69 54  Table!=pExpr->iT
25310 61 62 6c 65 20 29 20 63 6f 6e 74 69 6e 75 65 3b  able ) continue;
25320 0a 20 20 20 20 69 66 28 20 70 43 6f 6c 75 6d 6e  .    if( pColumn
25330 2d 3e 69 43 6f 6c 75 6d 6e 21 3d 70 45 78 70 72  ->iColumn!=pExpr
25340 2d 3e 69 43 6f 6c 75 6d 6e 20 29 20 63 6f 6e 74  ->iColumn ) cont
25350 69 6e 75 65 3b 0a 20 20 20 20 2f 2a 20 41 20 6d  inue;.    /* A m
25360 61 74 63 68 20 69 73 20 66 6f 75 6e 64 2e 20 20  atch is found.  
25370 41 64 64 20 74 68 65 20 45 50 5f 46 69 78 65 64  Add the EP_Fixed
25380 43 6f 6c 20 70 72 6f 70 65 72 74 79 20 2a 2f 0a  Col property */.
25390 20 20 20 20 70 43 6f 6e 73 74 2d 3e 6e 43 68 6e      pConst->nChn
253a0 67 2b 2b 3b 0a 20 20 20 20 45 78 70 72 43 6c 65  g++;.    ExprCle
253b0 61 72 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  arProperty(pExpr
253c0 2c 20 45 50 5f 4c 65 61 66 29 3b 0a 20 20 20 20  , EP_Leaf);.    
253d0 45 78 70 72 53 65 74 50 72 6f 70 65 72 74 79 28  ExprSetProperty(
253e0 70 45 78 70 72 2c 20 45 50 5f 46 69 78 65 64 43  pExpr, EP_FixedC
253f0 6f 6c 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ol);.    assert(
25400 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3d 3d 30   pExpr->pLeft==0
25410 20 29 3b 0a 20 20 20 20 70 45 78 70 72 2d 3e 70   );.    pExpr->p
25420 4c 65 66 74 20 3d 20 73 71 6c 69 74 65 33 45 78  Left = sqlite3Ex
25430 70 72 44 75 70 28 70 43 6f 6e 73 74 2d 3e 70 50  prDup(pConst->pP
25440 61 72 73 65 2d 3e 64 62 2c 20 70 43 6f 6e 73 74  arse->db, pConst
25450 2d 3e 61 70 45 78 70 72 5b 69 2a 32 2b 31 5d 2c  ->apExpr[i*2+1],
25460 20 30 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a   0);.    break;.
25470 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 57 52 43    }.  return WRC
25480 5f 50 72 75 6e 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  _Prune;.}../*.**
25490 20 54 68 65 20 57 48 45 52 45 2d 63 6c 61 75 73   The WHERE-claus
254a0 65 20 63 6f 6e 73 74 61 6e 74 20 70 72 6f 70 61  e constant propa
254b0 67 61 74 69 6f 6e 20 6f 70 74 69 6d 69 7a 61 74  gation optimizat
254c0 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ion..**.** If th
254d0 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 63  e WHERE clause c
254e0 6f 6e 74 61 69 6e 73 20 74 65 72 6d 73 20 6f 66  ontains terms of
254f0 20 74 68 65 20 66 6f 72 6d 20 43 4f 4c 55 4d 4e   the form COLUMN
25500 3d 43 4f 4e 53 54 41 4e 54 20 6f 72 0a 2a 2a 20  =CONSTANT or.** 
25510 43 4f 4e 53 54 41 4e 54 3d 43 4f 4c 55 4d 4e 20  CONSTANT=COLUMN 
25520 74 68 61 74 20 6d 75 73 74 20 62 65 20 74 72 65  that must be tre
25530 65 20 28 69 6e 20 6f 74 68 65 72 20 77 6f 72 64  e (in other word
25540 73 2c 20 69 66 20 74 68 65 20 74 65 72 6d 73 20  s, if the terms 
25550 74 6f 70 2d 6c 65 76 65 6c 0a 2a 2a 20 41 4e 44  top-level.** AND
25560 2d 63 6f 6e 6e 65 63 74 65 64 20 74 65 72 6d 73  -connected terms
25570 20 74 68 61 74 20 61 72 65 20 6e 6f 74 20 70 61   that are not pa
25580 72 74 20 6f 66 20 61 20 4f 4e 20 63 6c 61 75 73  rt of a ON claus
25590 65 20 66 72 6f 6d 20 61 20 4c 45 46 54 20 4a 4f  e from a LEFT JO
255a0 49 4e 29 0a 2a 2a 20 74 68 65 6e 20 74 68 72 6f  IN).** then thro
255b0 75 67 68 6f 75 74 20 74 68 65 20 71 75 65 72 79  ughout the query
255c0 20 72 65 70 6c 61 63 65 20 61 6c 6c 20 6f 74 68   replace all oth
255d0 65 72 20 6f 63 63 75 72 72 65 6e 63 65 73 20 6f  er occurrences o
255e0 66 20 43 4f 4c 55 4d 4e 0a 2a 2a 20 77 69 74 68  f COLUMN.** with
255f0 20 43 4f 4e 53 54 41 4e 54 20 77 69 74 68 69 6e   CONSTANT within
25600 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
25610 65 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65 78 61  e..**.** For exa
25620 6d 70 6c 65 2c 20 74 68 65 20 71 75 65 72 79 3a  mple, the query:
25630 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 53 45 4c 45  .**.**      SELE
25640 43 54 20 2a 20 46 52 4f 4d 20 74 31 2c 20 74 32  CT * FROM t1, t2
25650 2c 20 74 33 20 57 48 45 52 45 20 74 31 2e 61 3d  , t3 WHERE t1.a=
25660 33 39 20 41 4e 44 20 74 32 2e 62 3d 74 31 2e 61  39 AND t2.b=t1.a
25670 20 41 4e 44 20 74 33 2e 63 3d 74 32 2e 62 0a 2a   AND t3.c=t2.b.*
25680 2a 0a 2a 2a 20 49 73 20 74 72 61 6e 73 66 6f 72  *.** Is transfor
25690 6d 65 64 20 69 6e 74 6f 0a 2a 2a 0a 2a 2a 20 20  med into.**.**  
256a0 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f      SELECT * FRO
256b0 4d 20 74 31 2c 20 74 32 2c 20 74 33 20 57 48 45  M t1, t2, t3 WHE
256c0 52 45 20 74 31 2e 61 3d 33 39 20 41 4e 44 20 74  RE t1.a=39 AND t
256d0 32 2e 62 3d 33 39 20 41 4e 44 20 74 33 2e 63 3d  2.b=39 AND t3.c=
256e0 33 39 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  39.**.** Return 
256f0 74 72 75 65 20 69 66 20 61 6e 79 20 74 72 61 6e  true if any tran
25700 73 66 6f 72 6d 61 74 69 6f 6e 73 20 77 68 65 72  sformations wher
25710 65 20 6d 61 64 65 20 61 6e 64 20 66 61 6c 73 65  e made and false
25720 20 69 66 20 6e 6f 74 2e 0a 2a 2a 0a 2a 2a 20 49   if not..**.** I
25730 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6e 6f  mplementation no
25740 74 65 3a 20 20 43 6f 6e 73 74 61 6e 74 20 70 72  te:  Constant pr
25750 6f 70 61 67 61 74 69 6f 6e 20 69 73 20 74 72 69  opagation is tri
25760 63 6b 79 20 64 75 65 20 74 6f 20 61 66 66 69 6e  cky due to affin
25770 69 74 79 0a 2a 2a 20 61 6e 64 20 63 6f 6c 6c 61  ity.** and colla
25780 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 69 6e  ting sequence in
25790 74 65 72 61 63 74 69 6f 6e 73 2e 20 20 43 6f 6e  teractions.  Con
257a0 73 69 64 65 72 20 74 68 69 73 20 65 78 61 6d 70  sider this examp
257b0 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 43 52 45  le:.**.**    CRE
257c0 41 54 45 20 54 41 42 4c 45 20 74 31 28 61 20 49  ATE TABLE t1(a I
257d0 4e 54 2c 62 20 54 45 58 54 29 3b 0a 2a 2a 20 20  NT,b TEXT);.**  
257e0 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
257f0 20 56 41 4c 55 45 53 28 31 32 33 2c 27 30 31 32   VALUES(123,'012
25800 33 27 29 3b 0a 2a 2a 20 20 20 20 53 45 4c 45 43  3');.**    SELEC
25810 54 20 2a 20 46 52 4f 4d 20 74 31 20 57 48 45 52  T * FROM t1 WHER
25820 45 20 61 3d 31 32 33 20 41 4e 44 20 62 3d 61 3b  E a=123 AND b=a;
25830 0a 2a 2a 20 20 20 20 53 45 4c 45 43 54 20 2a 20  .**    SELECT * 
25840 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 61 3d  FROM t1 WHERE a=
25850 31 32 33 20 41 4e 44 20 62 3d 31 32 33 3b 0a 2a  123 AND b=123;.*
25860 2a 0a 2a 2a 20 54 68 65 20 74 77 6f 20 53 45 4c  *.** The two SEL
25870 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73 20 61  ECT statements a
25880 62 6f 76 65 20 73 68 6f 75 6c 64 20 72 65 74 75  bove should retu
25890 72 6e 20 64 69 66 66 65 72 65 6e 74 20 61 6e 73  rn different ans
258a0 77 65 72 73 2e 20 20 62 3d 61 0a 2a 2a 20 69 73  wers.  b=a.** is
258b0 20 61 6c 77 61 79 20 74 72 75 65 20 62 65 63 61   alway true beca
258c0 75 73 65 20 74 68 65 20 63 6f 6d 70 61 72 69 73  use the comparis
258d0 6f 6e 20 75 73 65 73 20 6e 75 6d 65 72 69 63 20  on uses numeric 
258e0 61 66 66 69 6e 69 74 79 2c 20 62 75 74 20 62 3d  affinity, but b=
258f0 31 32 33 0a 2a 2a 20 69 73 20 66 61 6c 73 65 20  123.** is false 
25900 62 65 63 61 75 73 65 20 69 74 20 75 73 65 73 20  because it uses 
25910 74 65 78 74 20 61 66 66 69 6e 69 74 79 20 61 6e  text affinity an
25920 64 20 27 30 31 32 33 27 20 69 73 20 6e 6f 74 20  d '0123' is not 
25930 74 68 65 20 73 61 6d 65 20 61 73 20 27 31 32 33  the same as '123
25940 27 2e 0a 2a 2a 20 54 6f 20 77 6f 72 6b 20 61 72  '..** To work ar
25950 6f 75 6e 64 20 74 68 69 73 2c 20 74 68 65 20 65  ound this, the e
25960 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 20 69  xpression tree i
25970 73 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 63  s not actually c
25980 68 61 6e 67 65 64 20 66 72 6f 6d 0a 2a 2a 20 22  hanged from.** "
25990 62 3d 61 22 20 74 6f 20 22 62 3d 31 32 33 22 20  b=a" to "b=123" 
259a0 62 75 74 20 72 61 74 68 65 72 20 74 68 65 20 22  but rather the "
259b0 61 22 20 69 6e 20 22 62 3d 61 22 20 69 73 20 74  a" in "b=a" is t
259c0 61 67 67 65 64 20 77 69 74 68 20 45 50 5f 46 69  agged with EP_Fi
259d0 78 65 64 43 6f 6c 0a 2a 2a 20 61 6e 64 20 74 68  xedCol.** and th
259e0 65 20 22 31 32 33 22 20 76 61 6c 75 65 20 69 73  e "123" value is
259f0 20 68 75 6e 67 20 6f 66 66 20 6f 66 20 74 68 65   hung off of the
25a00 20 70 4c 65 66 74 20 70 6f 69 6e 74 65 72 2e 20   pLeft pointer. 
25a10 20 43 6f 64 65 20 67 65 6e 65 72 61 74 6f 72 0a   Code generator.
25a20 2a 2a 20 72 6f 75 74 69 6e 65 73 20 6b 6e 6f 77  ** routines know
25a30 20 74 6f 20 67 65 6e 65 72 61 74 65 20 74 68 65   to generate the
25a40 20 63 6f 6e 73 74 61 6e 74 20 22 31 32 33 22 20   constant "123" 
25a50 69 6e 73 74 65 61 64 20 6f 66 20 6c 6f 6f 6b 69  instead of looki
25a60 6e 67 20 75 70 20 74 68 65 0a 2a 2a 20 63 6f 6c  ng up the.** col
25a70 75 6d 6e 20 76 61 6c 75 65 2e 20 20 41 6c 73 6f  umn value.  Also
25a80 2c 20 74 6f 20 61 76 6f 69 64 20 63 6f 6c 6c 61  , to avoid colla
25a90 74 69 6f 6e 20 70 72 6f 62 6c 65 6d 73 2c 20 74  tion problems, t
25aa0 68 69 73 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  his optimization
25ab0 20 69 73 0a 2a 2a 20 6f 6e 6c 79 20 61 74 74 65   is.** only atte
25ac0 6d 70 74 65 64 20 69 66 20 74 68 65 20 22 61 3d  mpted if the "a=
25ad0 31 32 33 22 20 74 65 72 6d 20 75 73 65 73 20 74  123" term uses t
25ae0 68 65 20 64 65 66 61 75 6c 74 20 42 49 4e 41 52  he default BINAR
25af0 59 20 63 6f 6c 6c 61 74 69 6f 6e 2e 0a 2a 2f 0a  Y collation..*/.
25b00 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f 70 61  static int propa
25b10 67 61 74 65 43 6f 6e 73 74 61 6e 74 73 28 0a 20  gateConstants(. 
25b20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
25b30 20 20 2f 2a 20 54 68 65 20 70 61 72 73 69 6e 67    /* The parsing
25b40 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65   context */.  Se
25b50 6c 65 63 74 20 2a 70 20 20 20 20 20 20 20 20 2f  lect *p        /
25b60 2a 20 54 68 65 20 71 75 65 72 79 20 69 6e 20 77  * The query in w
25b70 68 69 63 68 20 74 6f 20 70 72 6f 70 61 67 61 74  hich to propagat
25b80 65 20 63 6f 6e 73 74 61 6e 74 73 20 2a 2f 0a 29  e constants */.)
25b90 7b 0a 20 20 57 68 65 72 65 43 6f 6e 73 74 20 78  {.  WhereConst x
25ba0 3b 0a 20 20 57 61 6c 6b 65 72 20 77 3b 0a 20 20  ;.  Walker w;.  
25bb0 69 6e 74 20 6e 43 68 6e 67 20 3d 20 30 3b 0a 20  int nChng = 0;. 
25bc0 20 78 2e 70 50 61 72 73 65 20 3d 20 70 50 61 72   x.pParse = pPar
25bd0 73 65 3b 0a 20 20 64 6f 7b 0a 20 20 20 20 78 2e  se;.  do{.    x.
25be0 6e 43 6f 6e 73 74 20 3d 20 30 3b 0a 20 20 20 20  nConst = 0;.    
25bf0 78 2e 6e 43 68 6e 67 20 3d 20 30 3b 0a 20 20 20  x.nChng = 0;.   
25c00 20 78 2e 61 70 45 78 70 72 20 3d 20 30 3b 0a 20   x.apExpr = 0;. 
25c10 20 20 20 66 69 6e 64 43 6f 6e 73 74 49 6e 57 68     findConstInWh
25c20 65 72 65 28 26 78 2c 20 70 2d 3e 70 57 68 65 72  ere(&x, p->pWher
25c30 65 29 3b 0a 20 20 20 20 69 66 28 20 78 2e 6e 43  e);.    if( x.nC
25c40 6f 6e 73 74 20 29 7b 0a 20 20 20 20 20 20 6d 65  onst ){.      me
25c50 6d 73 65 74 28 26 77 2c 20 30 2c 20 73 69 7a 65  mset(&w, 0, size
25c60 6f 66 28 77 29 29 3b 0a 20 20 20 20 20 20 77 2e  of(w));.      w.
25c70 70 50 61 72 73 65 20 3d 20 70 50 61 72 73 65 3b  pParse = pParse;
25c80 0a 20 20 20 20 20 20 77 2e 78 45 78 70 72 43 61  .      w.xExprCa
25c90 6c 6c 62 61 63 6b 20 3d 20 70 72 6f 70 61 67 61  llback = propaga
25ca0 74 65 43 6f 6e 73 74 61 6e 74 45 78 70 72 52 65  teConstantExprRe
25cb0 77 72 69 74 65 3b 0a 20 20 20 20 20 20 77 2e 78  write;.      w.x
25cc0 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20 3d  SelectCallback =
25cd0 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 57 61   sqlite3SelectWa
25ce0 6c 6b 4e 6f 6f 70 3b 0a 20 20 20 20 20 20 77 2e  lkNoop;.      w.
25cf0 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 32  xSelectCallback2
25d00 20 3d 20 30 3b 0a 20 20 20 20 20 20 77 2e 77 61   = 0;.      w.wa
25d10 6c 6b 65 72 44 65 70 74 68 20 3d 20 30 3b 0a 20  lkerDepth = 0;. 
25d20 20 20 20 20 20 77 2e 75 2e 70 43 6f 6e 73 74 20       w.u.pConst 
25d30 3d 20 26 78 3b 0a 20 20 20 20 20 20 73 71 6c 69  = &x;.      sqli
25d40 74 65 33 57 61 6c 6b 45 78 70 72 28 26 77 2c 20  te3WalkExpr(&w, 
25d50 70 2d 3e 70 57 68 65 72 65 29 3b 0a 20 20 20 20  p->pWhere);.    
25d60 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
25d70 78 2e 70 50 61 72 73 65 2d 3e 64 62 2c 20 78 2e  x.pParse->db, x.
25d80 61 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 6e  apExpr);.      n
25d90 43 68 6e 67 20 2b 3d 20 78 2e 6e 43 68 6e 67 3b  Chng += x.nChng;
25da0 0a 20 20 20 20 7d 0a 20 20 7d 77 68 69 6c 65 28  .    }.  }while(
25db0 20 78 2e 6e 43 68 6e 67 20 29 3b 20 20 0a 20 20   x.nChng );  .  
25dc0 72 65 74 75 72 6e 20 6e 43 68 6e 67 3b 0a 7d 0a  return nChng;.}.
25dd0 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
25de0 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
25df0 52 59 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28  RY) || !defined(
25e00 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57  SQLITE_OMIT_VIEW
25e10 29 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 63 6f 70  )./*.** Make cop
25e20 69 65 73 20 6f 66 20 72 65 6c 65 76 61 6e 74 20  ies of relevant 
25e30 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 65 72  WHERE clause ter
25e40 6d 73 20 6f 66 20 74 68 65 20 6f 75 74 65 72 20  ms of the outer 
25e50 71 75 65 72 79 20 69 6e 74 6f 0a 2a 2a 20 74 68  query into.** th
25e60 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 6f  e WHERE clause o
25e70 66 20 73 75 62 71 75 65 72 79 2e 20 20 45 78 61  f subquery.  Exa
25e80 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 53  mple:.**.**    S
25e90 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 28 53 45  ELECT * FROM (SE
25ea0 4c 45 43 54 20 61 20 41 53 20 78 2c 20 63 2d 64  LECT a AS x, c-d
25eb0 20 41 53 20 79 20 46 52 4f 4d 20 74 31 29 20 57   AS y FROM t1) W
25ec0 48 45 52 45 20 78 3d 35 20 41 4e 44 20 79 3d 31  HERE x=5 AND y=1
25ed0 30 3b 0a 2a 2a 0a 2a 2a 20 54 72 61 6e 73 66 6f  0;.**.** Transfo
25ee0 72 6d 65 64 20 69 6e 74 6f 3a 0a 2a 2a 0a 2a 2a  rmed into:.**.**
25ef0 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f      SELECT * FRO
25f00 4d 20 28 53 45 4c 45 43 54 20 61 20 41 53 20 78  M (SELECT a AS x
25f10 2c 20 63 2d 64 20 41 53 20 79 20 46 52 4f 4d 20  , c-d AS y FROM 
25f20 74 31 20 57 48 45 52 45 20 61 3d 35 20 41 4e 44  t1 WHERE a=5 AND
25f30 20 63 2d 64 3d 31 30 29 0a 2a 2a 20 20 20 20 20   c-d=10).**     
25f40 57 48 45 52 45 20 78 3d 35 20 41 4e 44 20 79 3d  WHERE x=5 AND y=
25f50 31 30 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 20 68 6f  10;.**.** The ho
25f60 70 65 20 69 73 20 74 68 61 74 20 74 68 65 20 74  pe is that the t
25f70 65 72 6d 73 20 61 64 64 65 64 20 74 6f 20 74 68  erms added to th
25f80 65 20 69 6e 6e 65 72 20 71 75 65 72 79 20 77 69  e inner query wi
25f90 6c 6c 20 6d 61 6b 65 20 69 74 20 6d 6f 72 65 0a  ll make it more.
25fa0 2a 2a 20 65 66 66 69 63 69 65 6e 74 2e 0a 2a 2a  ** efficient..**
25fb0 0a 2a 2a 20 44 6f 20 6e 6f 74 20 61 74 74 65 6d  .** Do not attem
25fc0 70 74 20 74 68 69 73 20 6f 70 74 69 6d 69 7a 61  pt this optimiza
25fd0 74 69 6f 6e 20 69 66 3a 0a 2a 2a 0a 2a 2a 20 20  tion if:.**.**  
25fe0 20 28 31 29 20 28 2a 2a 20 54 68 69 73 20 72 65   (1) (** This re
25ff0 73 74 72 69 63 74 69 6f 6e 20 77 61 73 20 72 65  striction was re
26000 6d 6f 76 65 64 20 6f 6e 20 32 30 31 37 2d 30 39  moved on 2017-09
26010 2d 32 39 2e 20 20 57 65 20 75 73 65 64 20 74 6f  -29.  We used to
26020 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 64 69  .**           di
26030 73 61 6c 6c 6f 77 20 74 68 69 73 20 6f 70 74 69  sallow this opti
26040 6d 69 7a 61 74 69 6f 6e 20 66 6f 72 20 61 67 67  mization for agg
26050 72 65 67 61 74 65 20 73 75 62 71 75 65 72 69 65  regate subquerie
26060 73 2c 20 62 75 74 20 6e 6f 77 0a 2a 2a 20 20 20  s, but now.**   
26070 20 20 20 20 20 20 20 20 69 74 20 69 73 20 61 6c          it is al
26080 6c 6f 77 65 64 20 62 79 20 70 75 74 74 69 6e 67  lowed by putting
26090 20 74 68 65 20 65 78 74 72 61 20 74 65 72 6d 73   the extra terms
260a0 20 6f 6e 20 74 68 65 20 48 41 56 49 4e 47 20 63   on the HAVING c
260b0 6c 61 75 73 65 2e 0a 2a 2a 20 20 20 20 20 20 20  lause..**       
260c0 20 20 20 20 54 68 65 20 61 64 64 65 64 20 48 41      The added HA
260d0 56 49 4e 47 20 63 6c 61 75 73 65 20 69 73 20 70  VING clause is p
260e0 6f 69 6e 74 6c 65 73 73 20 69 66 20 74 68 65 20  ointless if the 
260f0 73 75 62 71 75 65 72 79 20 6c 61 63 6b 73 0a 2a  subquery lacks.*
26100 2a 20 20 20 20 20 20 20 20 20 20 20 61 20 47 52  *           a GR
26110 4f 55 50 20 42 59 20 63 6c 61 75 73 65 2e 20 20  OUP BY clause.  
26120 42 75 74 20 73 75 63 68 20 61 20 48 41 56 49 4e  But such a HAVIN
26130 47 20 63 6c 61 75 73 65 20 69 73 20 61 6c 73 6f  G clause is also
26140 20 68 61 72 6d 6c 65 73 73 0a 2a 2a 20 20 20 20   harmless.**    
26150 20 20 20 20 20 20 20 73 6f 20 74 68 65 72 65 20         so there 
26160 64 6f 65 73 20 6e 6f 74 20 61 70 70 65 61 72 20  does not appear 
26170 74 6f 20 62 65 20 61 6e 79 20 72 65 61 73 6f 6e  to be any reason
26180 20 74 6f 20 61 64 64 20 65 78 74 72 61 20 6c 6f   to add extra lo
26190 67 69 63 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  gic.**          
261a0 20 74 6f 20 73 75 70 70 72 65 73 73 20 69 74 2e   to suppress it.
261b0 20 2a 2a 29 0a 2a 2a 0a 2a 2a 20 20 20 28 32 29   **).**.**   (2)
261c0 20 54 68 65 20 69 6e 6e 65 72 20 71 75 65 72 79   The inner query
261d0 20 69 73 20 74 68 65 20 72 65 63 75 72 73 69 76   is the recursiv
261e0 65 20 70 61 72 74 20 6f 66 20 61 20 63 6f 6d 6d  e part of a comm
261f0 6f 6e 20 74 61 62 6c 65 20 65 78 70 72 65 73 73  on table express
26200 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 33 29  ion..**.**   (3)
26210 20 54 68 65 20 69 6e 6e 65 72 20 71 75 65 72 79   The inner query
26220 20 68 61 73 20 61 20 4c 49 4d 49 54 20 63 6c 61   has a LIMIT cla
26230 75 73 65 20 28 73 69 6e 63 65 20 74 68 65 20 63  use (since the c
26240 68 61 6e 67 65 73 20 74 6f 20 74 68 65 20 57 48  hanges to the WH
26250 45 52 45 0a 2a 2a 20 20 20 20 20 20 20 63 6c 61  ERE.**       cla
26260 75 73 65 20 77 6f 75 6c 64 20 63 68 61 6e 67 65  use would change
26270 20 74 68 65 20 6d 65 61 6e 69 6e 67 20 6f 66 20   the meaning of 
26280 74 68 65 20 4c 49 4d 49 54 29 2e 0a 2a 2a 0a 2a  the LIMIT)..**.*
26290 2a 20 20 20 28 34 29 20 54 68 65 20 69 6e 6e 65  *   (4) The inne
262a0 72 20 71 75 65 72 79 20 69 73 20 74 68 65 20 72  r query is the r
262b0 69 67 68 74 20 6f 70 65 72 61 6e 64 20 6f 66 20  ight operand of 
262c0 61 20 4c 45 46 54 20 4a 4f 49 4e 20 61 6e 64 20  a LEFT JOIN and 
262d0 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 65 78 70  the.**       exp
262e0 72 65 73 73 69 6f 6e 20 74 6f 20 62 65 20 70 75  ression to be pu
262f0 73 68 65 64 20 64 6f 77 6e 20 64 6f 65 73 20 6e  shed down does n
26300 6f 74 20 63 6f 6d 65 20 66 72 6f 6d 20 74 68 65  ot come from the
26310 20 4f 4e 20 63 6c 61 75 73 65 0a 2a 2a 20 20 20   ON clause.**   
26320 20 20 20 20 6f 6e 20 74 68 61 74 20 4c 45 46 54      on that LEFT
26330 20 4a 4f 49 4e 2e 0a 2a 2a 0a 2a 2a 20 20 20 28   JOIN..**.**   (
26340 35 29 20 54 68 65 20 57 48 45 52 45 20 63 6c 61  5) The WHERE cla
26350 75 73 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6f  use expression o
26360 72 69 67 69 6e 61 74 65 73 20 69 6e 20 74 68 65  riginates in the
26370 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c 61   ON or USING cla
26380 75 73 65 0a 2a 2a 20 20 20 20 20 20 20 6f 66 20  use.**       of 
26390 61 20 4c 45 46 54 20 4a 4f 49 4e 20 77 68 65 72  a LEFT JOIN wher
263a0 65 20 69 43 75 72 73 6f 72 20 69 73 20 6e 6f 74  e iCursor is not
263b0 20 74 68 65 20 72 69 67 68 74 2d 68 61 6e 64 20   the right-hand 
263c0 74 61 62 6c 65 20 6f 66 20 74 68 61 74 0a 2a 2a  table of that.**
263d0 20 20 20 20 20 20 20 6c 65 66 74 20 6a 6f 69 6e         left join
263e0 2e 20 20 41 6e 20 65 78 61 6d 70 6c 65 3a 0a 2a  .  An example:.*
263f0 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 53  *.**           S
26400 45 4c 45 43 54 20 2a 0a 2a 2a 20 20 20 20 20 20  ELECT *.**      
26410 20 20 20 20 20 46 52 4f 4d 20 28 53 45 4c 45 43       FROM (SELEC
26420 54 20 31 20 41 53 20 61 31 20 55 4e 49 4f 4e 20  T 1 AS a1 UNION 
26430 41 4c 4c 20 53 45 4c 45 43 54 20 32 29 20 41 53  ALL SELECT 2) AS
26440 20 61 61 0a 2a 2a 20 20 20 20 20 20 20 20 20 20   aa.**          
26450 20 4a 4f 49 4e 20 28 53 45 4c 45 43 54 20 31 20   JOIN (SELECT 1 
26460 41 53 20 62 32 20 55 4e 49 4f 4e 20 41 4c 4c 20  AS b2 UNION ALL 
26470 53 45 4c 45 43 54 20 32 29 20 41 53 20 62 62 20  SELECT 2) AS bb 
26480 4f 4e 20 28 61 31 3d 62 32 29 0a 2a 2a 20 20 20  ON (a1=b2).**   
26490 20 20 20 20 20 20 20 20 4c 45 46 54 20 4a 4f 49          LEFT JOI
264a0 4e 20 28 53 45 4c 45 43 54 20 38 20 41 53 20 63  N (SELECT 8 AS c
264b0 33 20 55 4e 49 4f 4e 20 41 4c 4c 20 53 45 4c 45  3 UNION ALL SELE
264c0 43 54 20 39 29 20 41 53 20 63 63 20 4f 4e 20 28  CT 9) AS cc ON (
264d0 62 32 3d 32 29 3b 0a 2a 2a 0a 2a 2a 20 20 20 20  b2=2);.**.**    
264e0 20 20 20 54 68 65 20 63 6f 72 72 65 63 74 20 61     The correct a
264f0 6e 73 77 65 72 20 69 73 20 74 68 72 65 65 20 72  nswer is three r
26500 6f 77 73 3a 20 20 28 31 2c 31 2c 4e 55 4c 4c 29  ows:  (1,1,NULL)
26510 2c 28 32 2c 32 2c 38 29 2c 28 32 2c 32 2c 39 29  ,(2,2,8),(2,2,9)
26520 2e 0a 2a 2a 20 20 20 20 20 20 20 42 75 74 20 69  ..**       But i
26530 66 20 74 68 65 20 28 62 32 3d 32 29 20 74 65 72  f the (b2=2) ter
26540 6d 20 77 65 72 65 20 74 6f 20 62 65 20 70 75 73  m were to be pus
26550 68 65 64 20 64 6f 77 6e 20 69 6e 74 6f 20 74 68  hed down into th
26560 65 20 62 62 20 73 75 62 71 75 65 72 79 2c 0a 2a  e bb subquery,.*
26570 2a 20 20 20 20 20 20 20 74 68 65 6e 20 74 68 65  *       then the
26580 20 28 31 2c 31 2c 4e 55 4c 4c 29 20 72 6f 77 20   (1,1,NULL) row 
26590 77 6f 75 6c 64 20 62 65 20 73 75 70 70 72 65 73  would be suppres
265a0 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 36 29  sed..**.**   (6)
265b0 20 54 68 65 20 69 6e 6e 65 72 20 71 75 65 72 79   The inner query
265c0 20 66 65 61 74 75 72 65 73 20 6f 6e 65 20 6f 72   features one or
265d0 20 6d 6f 72 65 20 77 69 6e 64 6f 77 2d 66 75 6e   more window-fun
265e0 63 74 69 6f 6e 73 20 28 73 69 6e 63 65 20 0a 2a  ctions (since .*
265f0 2a 20 20 20 20 20 20 20 63 68 61 6e 67 65 73 20  *       changes 
26600 74 6f 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  to the WHERE cla
26610 75 73 65 20 6f 66 20 74 68 65 20 69 6e 6e 65 72  use of the inner
26620 20 71 75 65 72 79 20 63 6f 75 6c 64 20 63 68 61   query could cha
26630 6e 67 65 20 74 68 65 20 0a 2a 2a 20 20 20 20 20  nge the .**     
26640 20 20 77 69 6e 64 6f 77 20 6f 76 65 72 20 77 68    window over wh
26650 69 63 68 20 77 69 6e 64 6f 77 20 66 75 6e 63 74  ich window funct
26660 69 6f 6e 73 20 61 72 65 20 63 61 6c 63 75 6c 61  ions are calcula
26670 74 65 64 29 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75  ted)..**.** Retu
26680 72 6e 20 30 20 69 66 20 6e 6f 20 63 68 61 6e 67  rn 0 if no chang
26690 65 73 20 61 72 65 20 6d 61 64 65 20 61 6e 64 20  es are made and 
266a0 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 6f 6e 65 20  non-zero if one 
266b0 6f 72 20 6d 6f 72 65 20 57 48 45 52 45 20 63 6c  or more WHERE cl
266c0 61 75 73 65 0a 2a 2a 20 74 65 72 6d 73 20 61 72  ause.** terms ar
266d0 65 20 64 75 70 6c 69 63 61 74 65 64 20 69 6e 74  e duplicated int
266e0 6f 20 74 68 65 20 73 75 62 71 75 65 72 79 2e 0a  o the subquery..
266f0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 75  */.static int pu
26700 73 68 44 6f 77 6e 57 68 65 72 65 54 65 72 6d 73  shDownWhereTerms
26710 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
26720 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72  e,        /* Par
26730 73 65 20 63 6f 6e 74 65 78 74 20 28 66 6f 72 20  se context (for 
26740 6d 61 6c 6c 6f 63 28 29 20 61 6e 64 20 65 72 72  malloc() and err
26750 6f 72 20 72 65 70 6f 72 74 69 6e 67 29 20 2a 2f  or reporting) */
26760 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 75 62 71  .  Select *pSubq
26770 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ,        /* The 
26780 73 75 62 71 75 65 72 79 20 77 68 6f 73 65 20 57  subquery whose W
26790 48 45 52 45 20 63 6c 61 75 73 65 20 69 73 20 74  HERE clause is t
267a0 6f 20 62 65 20 61 75 67 6d 65 6e 74 65 64 20 2a  o be augmented *
267b0 2f 0a 20 20 45 78 70 72 20 2a 70 57 68 65 72 65  /.  Expr *pWhere
267c0 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  ,         /* The
267d0 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 6f 66   WHERE clause of
267e0 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
267f0 20 2a 2f 0a 20 20 69 6e 74 20 69 43 75 72 73 6f   */.  int iCurso
26800 72 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43  r,          /* C
26810 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20  ursor number of 
26820 74 68 65 20 73 75 62 71 75 65 72 79 20 2a 2f 0a  the subquery */.
26830 20 20 69 6e 74 20 69 73 4c 65 66 74 4a 6f 69 6e    int isLeftJoin
26840 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
26850 69 66 20 70 53 75 62 71 20 69 73 20 74 68 65 20  if pSubq is the 
26860 72 69 67 68 74 20 74 65 72 6d 20 6f 66 20 61 20  right term of a 
26870 4c 45 46 54 20 4a 4f 49 4e 20 2a 2f 0a 29 7b 0a  LEFT JOIN */.){.
26880 20 20 45 78 70 72 20 2a 70 4e 65 77 3b 0a 20 20    Expr *pNew;.  
26890 69 6e 74 20 6e 43 68 6e 67 20 3d 20 30 3b 0a 20  int nChng = 0;. 
268a0 20 69 66 28 20 70 57 68 65 72 65 3d 3d 30 20 29   if( pWhere==0 )
268b0 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28   return 0;.  if(
268c0 20 70 53 75 62 71 2d 3e 73 65 6c 46 6c 61 67 73   pSubq->selFlags
268d0 20 26 20 53 46 5f 52 65 63 75 72 73 69 76 65 20   & SF_Recursive 
268e0 29 20 72 65 74 75 72 6e 20 30 3b 20 20 2f 2a 20  ) return 0;  /* 
268f0 72 65 73 74 72 69 63 74 69 6f 6e 20 28 32 29 20  restriction (2) 
26900 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  */..#ifndef SQLI
26910 54 45 5f 4f 4d 49 54 5f 57 49 4e 44 4f 57 46 55  TE_OMIT_WINDOWFU
26920 4e 43 0a 20 20 69 66 28 20 70 53 75 62 71 2d 3e  NC.  if( pSubq->
26930 70 57 69 6e 20 29 20 72 65 74 75 72 6e 20 30 3b  pWin ) return 0;
26940 20 20 20 20 2f 2a 20 72 65 73 74 72 69 63 74 69      /* restricti
26950 6f 6e 20 28 36 29 20 2a 2f 0a 23 65 6e 64 69 66  on (6) */.#endif
26960 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
26970 44 45 42 55 47 0a 20 20 2f 2a 20 4f 6e 6c 79 20  DEBUG.  /* Only 
26980 74 68 65 20 66 69 72 73 74 20 74 65 72 6d 20 6f  the first term o
26990 66 20 61 20 63 6f 6d 70 6f 75 6e 64 20 63 61 6e  f a compound can
269a0 20 68 61 76 65 20 61 20 57 49 54 48 20 63 6c 61   have a WITH cla
269b0 75 73 65 2e 20 20 42 75 74 20 6d 61 6b 65 0a 20  use.  But make. 
269c0 20 2a 2a 20 73 75 72 65 20 6e 6f 20 6f 74 68 65   ** sure no othe
269d0 72 20 74 65 72 6d 73 20 61 72 65 20 6d 61 72 6b  r terms are mark
269e0 65 64 20 53 46 5f 52 65 63 75 72 73 69 76 65 20  ed SF_Recursive 
269f0 69 6e 20 63 61 73 65 20 73 6f 6d 65 74 68 69 6e  in case somethin
26a00 67 20 63 68 61 6e 67 65 73 0a 20 20 2a 2a 20 69  g changes.  ** i
26a10 6e 20 74 68 65 20 66 75 74 75 72 65 2e 0a 20 20  n the future..  
26a20 2a 2f 0a 20 20 7b 0a 20 20 20 20 53 65 6c 65 63  */.  {.    Selec
26a30 74 20 2a 70 58 3b 20 20 0a 20 20 20 20 66 6f 72  t *pX;  .    for
26a40 28 70 58 3d 70 53 75 62 71 3b 20 70 58 3b 20 70  (pX=pSubq; pX; p
26a50 58 3d 70 58 2d 3e 70 50 72 69 6f 72 29 7b 0a 20  X=pX->pPrior){. 
26a60 20 20 20 20 20 61 73 73 65 72 74 28 20 28 70 58       assert( (pX
26a70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 28 53 46  ->selFlags & (SF
26a80 5f 52 65 63 75 72 73 69 76 65 29 29 3d 3d 30 20  _Recursive))==0 
26a90 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e  );.    }.  }.#en
26aa0 64 69 66 0a 0a 20 20 69 66 28 20 70 53 75 62 71  dif..  if( pSubq
26ab0 2d 3e 70 4c 69 6d 69 74 21 3d 30 20 29 7b 0a 20  ->pLimit!=0 ){. 
26ac0 20 20 20 72 65 74 75 72 6e 20 30 3b 20 2f 2a 20     return 0; /* 
26ad0 72 65 73 74 72 69 63 74 69 6f 6e 20 28 33 29 20  restriction (3) 
26ae0 2a 2f 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28 20  */.  }.  while( 
26af0 70 57 68 65 72 65 2d 3e 6f 70 3d 3d 54 4b 5f 41  pWhere->op==TK_A
26b00 4e 44 20 29 7b 0a 20 20 20 20 6e 43 68 6e 67 20  ND ){.    nChng 
26b10 2b 3d 20 70 75 73 68 44 6f 77 6e 57 68 65 72 65  += pushDownWhere
26b20 54 65 72 6d 73 28 70 50 61 72 73 65 2c 20 70 53  Terms(pParse, pS
26b30 75 62 71 2c 20 70 57 68 65 72 65 2d 3e 70 52 69  ubq, pWhere->pRi
26b40 67 68 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ght,.           
26b50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26b60 20 20 20 20 20 69 43 75 72 73 6f 72 2c 20 69 73       iCursor, is
26b70 4c 65 66 74 4a 6f 69 6e 29 3b 0a 20 20 20 20 70  LeftJoin);.    p
26b80 57 68 65 72 65 20 3d 20 70 57 68 65 72 65 2d 3e  Where = pWhere->
26b90 70 4c 65 66 74 3b 0a 20 20 7d 0a 20 20 69 66 28  pLeft;.  }.  if(
26ba0 20 69 73 4c 65 66 74 4a 6f 69 6e 0a 20 20 20 26   isLeftJoin.   &
26bb0 26 20 28 45 78 70 72 48 61 73 50 72 6f 70 65 72  & (ExprHasProper
26bc0 74 79 28 70 57 68 65 72 65 2c 45 50 5f 46 72 6f  ty(pWhere,EP_Fro
26bd0 6d 4a 6f 69 6e 29 3d 3d 30 0a 20 20 20 20 20 20  mJoin)==0.      
26be0 20 20 20 7c 7c 20 70 57 68 65 72 65 2d 3e 69 52     || pWhere->iR
26bf0 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 21 3d 69  ightJoinTable!=i
26c00 43 75 72 73 6f 72 29 0a 20 20 29 7b 0a 20 20 20  Cursor).  ){.   
26c10 20 72 65 74 75 72 6e 20 30 3b 20 2f 2a 20 72 65   return 0; /* re
26c20 73 74 72 69 63 74 69 6f 6e 20 28 34 29 20 2a 2f  striction (4) */
26c30 0a 20 20 7d 0a 20 20 69 66 28 20 45 78 70 72 48  .  }.  if( ExprH
26c40 61 73 50 72 6f 70 65 72 74 79 28 70 57 68 65 72  asProperty(pWher
26c50 65 2c 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 26  e,EP_FromJoin) &
26c60 26 20 70 57 68 65 72 65 2d 3e 69 52 69 67 68 74  & pWhere->iRight
26c70 4a 6f 69 6e 54 61 62 6c 65 21 3d 69 43 75 72 73  JoinTable!=iCurs
26c80 6f 72 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  or ){.    return
26c90 20 30 3b 20 2f 2a 20 72 65 73 74 72 69 63 74 69   0; /* restricti
26ca0 6f 6e 20 28 35 29 20 2a 2f 0a 20 20 7d 0a 20 20  on (5) */.  }.  
26cb0 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 49  if( sqlite3ExprI
26cc0 73 54 61 62 6c 65 43 6f 6e 73 74 61 6e 74 28 70  sTableConstant(p
26cd0 57 68 65 72 65 2c 20 69 43 75 72 73 6f 72 29 20  Where, iCursor) 
26ce0 29 7b 0a 20 20 20 20 6e 43 68 6e 67 2b 2b 3b 0a  ){.    nChng++;.
26cf0 20 20 20 20 77 68 69 6c 65 28 20 70 53 75 62 71      while( pSubq
26d00 20 29 7b 0a 20 20 20 20 20 20 53 75 62 73 74 43   ){.      SubstC
26d10 6f 6e 74 65 78 74 20 78 3b 0a 20 20 20 20 20 20  ontext x;.      
26d20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 45 78  pNew = sqlite3Ex
26d30 70 72 44 75 70 28 70 50 61 72 73 65 2d 3e 64 62  prDup(pParse->db
26d40 2c 20 70 57 68 65 72 65 2c 20 30 29 3b 0a 20 20  , pWhere, 0);.  
26d50 20 20 20 20 75 6e 73 65 74 4a 6f 69 6e 45 78 70      unsetJoinExp
26d60 72 28 70 4e 65 77 2c 20 2d 31 29 3b 0a 20 20 20  r(pNew, -1);.   
26d70 20 20 20 78 2e 70 50 61 72 73 65 20 3d 20 70 50     x.pParse = pP
26d80 61 72 73 65 3b 0a 20 20 20 20 20 20 78 2e 69 54  arse;.      x.iT
26d90 61 62 6c 65 20 3d 20 69 43 75 72 73 6f 72 3b 0a  able = iCursor;.
26da0 20 20 20 20 20 20 78 2e 69 4e 65 77 54 61 62 6c        x.iNewTabl
26db0 65 20 3d 20 69 43 75 72 73 6f 72 3b 0a 20 20 20  e = iCursor;.   
26dc0 20 20 20 78 2e 69 73 4c 65 66 74 4a 6f 69 6e 20     x.isLeftJoin 
26dd0 3d 20 30 3b 0a 20 20 20 20 20 20 78 2e 70 45 4c  = 0;.      x.pEL
26de0 69 73 74 20 3d 20 70 53 75 62 71 2d 3e 70 45 4c  ist = pSubq->pEL
26df0 69 73 74 3b 0a 20 20 20 20 20 20 70 4e 65 77 20  ist;.      pNew 
26e00 3d 20 73 75 62 73 74 45 78 70 72 28 26 78 2c 20  = substExpr(&x, 
26e10 70 4e 65 77 29 3b 0a 20 20 20 20 20 20 69 66 28  pNew);.      if(
26e20 20 70 53 75 62 71 2d 3e 73 65 6c 46 6c 61 67 73   pSubq->selFlags
26e30 20 26 20 53 46 5f 41 67 67 72 65 67 61 74 65 20   & SF_Aggregate 
26e40 29 7b 0a 20 20 20 20 20 20 20 20 70 53 75 62 71  ){.        pSubq
26e50 2d 3e 70 48 61 76 69 6e 67 20 3d 20 73 71 6c 69  ->pHaving = sqli
26e60 74 65 33 45 78 70 72 41 6e 64 28 70 50 61 72 73  te3ExprAnd(pPars
26e70 65 2d 3e 64 62 2c 20 70 53 75 62 71 2d 3e 70 48  e->db, pSubq->pH
26e80 61 76 69 6e 67 2c 20 70 4e 65 77 29 3b 0a 20 20  aving, pNew);.  
26e90 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
26ea0 20 20 20 70 53 75 62 71 2d 3e 70 57 68 65 72 65     pSubq->pWhere
26eb0 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e   = sqlite3ExprAn
26ec0 64 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 53  d(pParse->db, pS
26ed0 75 62 71 2d 3e 70 57 68 65 72 65 2c 20 70 4e 65  ubq->pWhere, pNe
26ee0 77 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  w);.      }.    
26ef0 20 20 70 53 75 62 71 20 3d 20 70 53 75 62 71 2d    pSubq = pSubq-
26f00 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 7d 0a 20  >pPrior;.    }. 
26f10 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 43 68 6e   }.  return nChn
26f20 67 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21  g;.}.#endif /* !
26f30 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
26f40 4d 49 54 5f 53 55 42 51 55 45 52 59 29 20 7c 7c  MIT_SUBQUERY) ||
26f50 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
26f60 5f 4f 4d 49 54 5f 56 49 45 57 29 20 2a 2f 0a 0a  _OMIT_VIEW) */..
26f70 2f 2a 0a 2a 2a 20 54 68 65 20 70 46 75 6e 63 20  /*.** The pFunc 
26f80 69 73 20 74 68 65 20 6f 6e 6c 79 20 61 67 67 72  is the only aggr
26f90 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 20 69  egate function i
26fa0 6e 20 74 68 65 20 71 75 65 72 79 2e 20 20 43 68  n the query.  Ch
26fb0 65 63 6b 20 74 6f 20 73 65 65 0a 2a 2a 20 69 66  eck to see.** if
26fc0 20 74 68 65 20 71 75 65 72 79 20 69 73 20 61 20   the query is a 
26fd0 63 61 6e 64 69 64 61 74 65 20 66 6f 72 20 74 68  candidate for th
26fe0 65 20 6d 69 6e 2f 6d 61 78 20 6f 70 74 69 6d 69  e min/max optimi
26ff0 7a 61 74 69 6f 6e 2e 20 0a 2a 2a 0a 2a 2a 20 49  zation. .**.** I
27000 66 20 74 68 65 20 71 75 65 72 79 20 69 73 20 61  f the query is a
27010 20 63 61 6e 64 69 64 61 74 65 20 66 6f 72 20 74   candidate for t
27020 68 65 20 6d 69 6e 2f 6d 61 78 20 6f 70 74 69 6d  he min/max optim
27030 69 7a 61 74 69 6f 6e 2c 20 74 68 65 6e 20 73 65  ization, then se
27040 74 0a 2a 2a 20 2a 70 70 4d 69 6e 4d 61 78 20 74  t.** *ppMinMax t
27050 6f 20 62 65 20 61 6e 20 4f 52 44 45 52 20 42 59  o be an ORDER BY
27060 20 63 6c 61 75 73 65 20 74 6f 20 62 65 20 75 73   clause to be us
27070 65 64 20 66 6f 72 20 74 68 65 20 6f 70 74 69 6d  ed for the optim
27080 69 7a 61 74 69 6f 6e 0a 2a 2a 20 61 6e 64 20 72  ization.** and r
27090 65 74 75 72 6e 20 65 69 74 68 65 72 20 57 48 45  eturn either WHE
270a0 52 45 5f 4f 52 44 45 52 42 59 5f 4d 49 4e 20 6f  RE_ORDERBY_MIN o
270b0 72 20 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f  r WHERE_ORDERBY_
270c0 4d 41 58 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e  MAX depending on
270d0 0a 2a 2a 20 77 68 65 74 68 65 72 20 70 46 75 6e  .** whether pFun
270e0 63 20 69 73 20 61 20 6d 69 6e 28 29 20 6f 72 20  c is a min() or 
270f0 6d 61 78 28 29 20 66 75 6e 63 74 69 6f 6e 2e 0a  max() function..
27100 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 71 75 65  **.** If the que
27110 72 79 20 69 73 20 6e 6f 74 20 61 20 63 61 6e 64  ry is not a cand
27120 69 64 61 74 65 20 66 6f 72 20 74 68 65 20 6d 69  idate for the mi
27130 6e 2f 6d 61 78 20 6f 70 74 69 6d 69 7a 61 74 69  n/max optimizati
27140 6f 6e 2c 20 72 65 74 75 72 6e 0a 2a 2a 20 57 48  on, return.** WH
27150 45 52 45 5f 4f 52 44 45 52 42 59 5f 4e 4f 52 4d  ERE_ORDERBY_NORM
27160 41 4c 20 28 77 68 69 63 68 20 6d 75 73 74 20 62  AL (which must b
27170 65 20 7a 65 72 6f 29 2e 0a 2a 2a 0a 2a 2a 20 54  e zero)..**.** T
27180 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 75 73 74  his routine must
27190 20 62 65 20 63 61 6c 6c 65 64 20 61 66 74 65 72   be called after
271a0 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74   aggregate funct
271b0 69 6f 6e 73 20 68 61 76 65 20 62 65 65 6e 0a 2a  ions have been.*
271c0 2a 20 6c 6f 63 61 74 65 64 20 62 75 74 20 62 65  * located but be
271d0 66 6f 72 65 20 74 68 65 69 72 20 61 72 67 75 6d  fore their argum
271e0 65 6e 74 73 20 68 61 76 65 20 62 65 65 6e 20 73  ents have been s
271f0 75 62 6a 65 63 74 65 64 20 74 6f 20 61 67 67 72  ubjected to aggr
27200 65 67 61 74 65 0a 2a 2a 20 61 6e 61 6c 79 73 69  egate.** analysi
27210 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 38 20  s..*/.static u8 
27220 6d 69 6e 4d 61 78 51 75 65 72 79 28 73 71 6c 69  minMaxQuery(sqli
27230 74 65 33 20 2a 64 62 2c 20 45 78 70 72 20 2a 70  te3 *db, Expr *p
27240 46 75 6e 63 2c 20 45 78 70 72 4c 69 73 74 20 2a  Func, ExprList *
27250 2a 70 70 4d 69 6e 4d 61 78 29 7b 0a 20 20 69 6e  *ppMinMax){.  in
27260 74 20 65 52 65 74 20 3d 20 57 48 45 52 45 5f 4f  t eRet = WHERE_O
27270 52 44 45 52 42 59 5f 4e 4f 52 4d 41 4c 3b 20 20  RDERBY_NORMAL;  
27280 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 76 61      /* Return va
27290 6c 75 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  lue */.  ExprLis
272a0 74 20 2a 70 45 4c 69 73 74 20 3d 20 70 46 75 6e  t *pEList = pFun
272b0 63 2d 3e 78 2e 70 4c 69 73 74 3b 20 20 20 20 2f  c->x.pList;    /
272c0 2a 20 41 72 67 75 6d 65 6e 74 73 20 74 6f 20 61  * Arguments to a
272d0 67 67 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20  gg function */. 
272e0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 75   const char *zFu
272f0 6e 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  nc;             
27300 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
27310 66 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63  f aggregate func
27320 74 69 6f 6e 20 70 46 75 6e 63 20 2a 2f 0a 20 20  tion pFunc */.  
27330 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72  ExprList *pOrder
27340 42 79 3b 0a 20 20 75 38 20 73 6f 72 74 4f 72 64  By;.  u8 sortOrd
27350 65 72 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 2a  er;..  assert( *
27360 70 70 4d 69 6e 4d 61 78 3d 3d 30 20 29 3b 0a 20  ppMinMax==0 );. 
27370 20 61 73 73 65 72 74 28 20 70 46 75 6e 63 2d 3e   assert( pFunc->
27380 6f 70 3d 3d 54 4b 5f 41 47 47 5f 46 55 4e 43 54  op==TK_AGG_FUNCT
27390 49 4f 4e 20 29 3b 0a 20 20 69 66 28 20 70 45 4c  ION );.  if( pEL
273a0 69 73 74 3d 3d 30 20 7c 7c 20 70 45 4c 69 73 74  ist==0 || pEList
273b0 2d 3e 6e 45 78 70 72 21 3d 31 20 29 20 72 65 74  ->nExpr!=1 ) ret
273c0 75 72 6e 20 65 52 65 74 3b 0a 20 20 7a 46 75 6e  urn eRet;.  zFun
273d0 63 20 3d 20 70 46 75 6e 63 2d 3e 75 2e 7a 54 6f  c = pFunc->u.zTo
273e0 6b 65 6e 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  ken;.  if( sqlit
273f0 65 33 53 74 72 49 43 6d 70 28 7a 46 75 6e 63 2c  e3StrICmp(zFunc,
27400 20 22 6d 69 6e 22 29 3d 3d 30 20 29 7b 0a 20 20   "min")==0 ){.  
27410 20 20 65 52 65 74 20 3d 20 57 48 45 52 45 5f 4f    eRet = WHERE_O
27420 52 44 45 52 42 59 5f 4d 49 4e 3b 0a 20 20 20 20  RDERBY_MIN;.    
27430 73 6f 72 74 4f 72 64 65 72 20 3d 20 53 51 4c 49  sortOrder = SQLI
27440 54 45 5f 53 4f 5f 41 53 43 3b 0a 20 20 7d 65 6c  TE_SO_ASC;.  }el
27450 73 65 20 69 66 28 20 73 71 6c 69 74 65 33 53 74  se if( sqlite3St
27460 72 49 43 6d 70 28 7a 46 75 6e 63 2c 20 22 6d 61  rICmp(zFunc, "ma
27470 78 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 65 52  x")==0 ){.    eR
27480 65 74 20 3d 20 57 48 45 52 45 5f 4f 52 44 45 52  et = WHERE_ORDER
27490 42 59 5f 4d 41 58 3b 0a 20 20 20 20 73 6f 72 74  BY_MAX;.    sort
274a0 4f 72 64 65 72 20 3d 20 53 51 4c 49 54 45 5f 53  Order = SQLITE_S
274b0 4f 5f 44 45 53 43 3b 0a 20 20 7d 65 6c 73 65 7b  O_DESC;.  }else{
274c0 0a 20 20 20 20 72 65 74 75 72 6e 20 65 52 65 74  .    return eRet
274d0 3b 0a 20 20 7d 0a 20 20 2a 70 70 4d 69 6e 4d 61  ;.  }.  *ppMinMa
274e0 78 20 3d 20 70 4f 72 64 65 72 42 79 20 3d 20 73  x = pOrderBy = s
274f0 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75  qlite3ExprListDu
27500 70 28 64 62 2c 20 70 45 4c 69 73 74 2c 20 30 29  p(db, pEList, 0)
27510 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f 72 64  ;.  assert( pOrd
27520 65 72 42 79 21 3d 30 20 7c 7c 20 64 62 2d 3e 6d  erBy!=0 || db->m
27530 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20  allocFailed );. 
27540 20 69 66 28 20 70 4f 72 64 65 72 42 79 20 29 20   if( pOrderBy ) 
27550 70 4f 72 64 65 72 42 79 2d 3e 61 5b 30 5d 2e 73  pOrderBy->a[0].s
27560 6f 72 74 4f 72 64 65 72 20 3d 20 73 6f 72 74 4f  ortOrder = sortO
27570 72 64 65 72 3b 0a 20 20 72 65 74 75 72 6e 20 65  rder;.  return e
27580 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  Ret;.}../*.** Th
27590 65 20 73 65 6c 65 63 74 20 73 74 61 74 65 6d 65  e select stateme
275a0 6e 74 20 70 61 73 73 65 64 20 61 73 20 74 68 65  nt passed as the
275b0 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20   first argument 
275c0 69 73 20 61 6e 20 61 67 67 72 65 67 61 74 65 20  is an aggregate 
275d0 71 75 65 72 79 2e 0a 2a 2a 20 54 68 65 20 73 65  query..** The se
275e0 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73  cond argument is
275f0 20 74 68 65 20 61 73 73 6f 63 69 61 74 65 64 20   the associated 
27600 61 67 67 72 65 67 61 74 65 2d 69 6e 66 6f 20 6f  aggregate-info o
27610 62 6a 65 63 74 2e 20 54 68 69 73 20 0a 2a 2a 20  bject. This .** 
27620 66 75 6e 63 74 69 6f 6e 20 74 65 73 74 73 20 69  function tests i
27630 66 20 74 68 65 20 53 45 4c 45 43 54 20 69 73 20  f the SELECT is 
27640 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a 2a 2a 0a  of the form:.**.
27650 2a 2a 20 20 20 53 45 4c 45 43 54 20 63 6f 75 6e  **   SELECT coun
27660 74 28 2a 29 20 46 52 4f 4d 20 3c 74 62 6c 3e 0a  t(*) FROM <tbl>.
27670 2a 2a 0a 2a 2a 20 77 68 65 72 65 20 74 61 62 6c  **.** where tabl
27680 65 20 69 73 20 61 20 64 61 74 61 62 61 73 65 20  e is a database 
27690 74 61 62 6c 65 2c 20 6e 6f 74 20 61 20 73 75 62  table, not a sub
276a0 2d 73 65 6c 65 63 74 20 6f 72 20 76 69 65 77 2e  -select or view.
276b0 20 49 66 20 74 68 65 20 71 75 65 72 79 0a 2a 2a   If the query.**
276c0 20 64 6f 65 73 20 6d 61 74 63 68 20 74 68 69 73   does match this
276d0 20 70 61 74 74 65 72 6e 2c 20 74 68 65 6e 20 61   pattern, then a
276e0 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
276f0 54 61 62 6c 65 20 6f 62 6a 65 63 74 20 72 65 70  Table object rep
27700 72 65 73 65 6e 74 69 6e 67 0a 2a 2a 20 3c 74 62  resenting.** <tb
27710 6c 3e 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  l> is returned. 
27720 4f 74 68 65 72 77 69 73 65 2c 20 30 20 69 73 20  Otherwise, 0 is 
27730 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61  returned..*/.sta
27740 74 69 63 20 54 61 62 6c 65 20 2a 69 73 53 69 6d  tic Table *isSim
27750 70 6c 65 43 6f 75 6e 74 28 53 65 6c 65 63 74 20  pleCount(Select 
27760 2a 70 2c 20 41 67 67 49 6e 66 6f 20 2a 70 41 67  *p, AggInfo *pAg
27770 67 49 6e 66 6f 29 7b 0a 20 20 54 61 62 6c 65 20  gInfo){.  Table 
27780 2a 70 54 61 62 3b 0a 20 20 45 78 70 72 20 2a 70  *pTab;.  Expr *p
27790 45 78 70 72 3b 0a 0a 20 20 61 73 73 65 72 74 28  Expr;..  assert(
277a0 20 21 70 2d 3e 70 47 72 6f 75 70 42 79 20 29 3b   !p->pGroupBy );
277b0 0a 0a 20 20 69 66 28 20 70 2d 3e 70 57 68 65 72  ..  if( p->pWher
277c0 65 20 7c 7c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e  e || p->pEList->
277d0 6e 45 78 70 72 21 3d 31 20 0a 20 20 20 7c 7c 20  nExpr!=1 .   || 
277e0 70 2d 3e 70 53 72 63 2d 3e 6e 53 72 63 21 3d 31  p->pSrc->nSrc!=1
277f0 20 7c 7c 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 30   || p->pSrc->a[0
27800 5d 2e 70 53 65 6c 65 63 74 0a 20 20 29 7b 0a 20  ].pSelect.  ){. 
27810 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
27820 0a 20 20 70 54 61 62 20 3d 20 70 2d 3e 70 53 72  .  pTab = p->pSr
27830 63 2d 3e 61 5b 30 5d 2e 70 54 61 62 3b 0a 20 20  c->a[0].pTab;.  
27840 70 45 78 70 72 20 3d 20 70 2d 3e 70 45 4c 69 73  pExpr = p->pELis
27850 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20  t->a[0].pExpr;. 
27860 20 61 73 73 65 72 74 28 20 70 54 61 62 20 26 26   assert( pTab &&
27870 20 21 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 20   !pTab->pSelect 
27880 26 26 20 70 45 78 70 72 20 29 3b 0a 0a 20 20 69  && pExpr );..  i
27890 66 28 20 49 73 56 69 72 74 75 61 6c 28 70 54 61  f( IsVirtual(pTa
278a0 62 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  b) ) return 0;. 
278b0 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d   if( pExpr->op!=
278c0 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 20  TK_AGG_FUNCTION 
278d0 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66  ) return 0;.  if
278e0 28 20 4e 45 56 45 52 28 70 41 67 67 49 6e 66 6f  ( NEVER(pAggInfo
278f0 2d 3e 6e 46 75 6e 63 3d 3d 30 29 20 29 20 72 65  ->nFunc==0) ) re
27900 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 28 70  turn 0;.  if( (p
27910 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 30  AggInfo->aFunc[0
27920 5d 2e 70 46 75 6e 63 2d 3e 66 75 6e 63 46 6c 61  ].pFunc->funcFla
27930 67 73 26 53 51 4c 49 54 45 5f 46 55 4e 43 5f 43  gs&SQLITE_FUNC_C
27940 4f 55 4e 54 29 3d 3d 30 20 29 20 72 65 74 75 72  OUNT)==0 ) retur
27950 6e 20 30 3b 0a 20 20 69 66 28 20 70 45 78 70 72  n 0;.  if( pExpr
27960 2d 3e 66 6c 61 67 73 26 45 50 5f 44 69 73 74 69  ->flags&EP_Disti
27970 6e 63 74 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  nct ) return 0;.
27980 0a 20 20 72 65 74 75 72 6e 20 70 54 61 62 3b 0a  .  return pTab;.
27990 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20  }../*.** If the 
279a0 73 6f 75 72 63 65 2d 6c 69 73 74 20 69 74 65 6d  source-list item
279b0 20 70 61 73 73 65 64 20 61 73 20 61 6e 20 61 72   passed as an ar
279c0 67 75 6d 65 6e 74 20 77 61 73 20 61 75 67 6d 65  gument was augme
279d0 6e 74 65 64 20 77 69 74 68 20 61 6e 0a 2a 2a 20  nted with an.** 
279e0 49 4e 44 45 58 45 44 20 42 59 20 63 6c 61 75 73  INDEXED BY claus
279f0 65 2c 20 74 68 65 6e 20 74 72 79 20 74 6f 20 6c  e, then try to l
27a00 6f 63 61 74 65 20 74 68 65 20 73 70 65 63 69 66  ocate the specif
27a10 69 65 64 20 69 6e 64 65 78 2e 20 49 66 20 74 68  ied index. If th
27a20 65 72 65 0a 2a 2a 20 77 61 73 20 73 75 63 68 20  ere.** was such 
27a30 61 20 63 6c 61 75 73 65 20 61 6e 64 20 74 68 65  a clause and the
27a40 20 6e 61 6d 65 64 20 69 6e 64 65 78 20 63 61 6e   named index can
27a50 6e 6f 74 20 62 65 20 66 6f 75 6e 64 2c 20 72 65  not be found, re
27a60 74 75 72 6e 20 0a 2a 2a 20 53 51 4c 49 54 45 5f  turn .** SQLITE_
27a70 45 52 52 4f 52 20 61 6e 64 20 6c 65 61 76 65 20  ERROR and leave 
27a80 61 6e 20 65 72 72 6f 72 20 69 6e 20 70 50 61 72  an error in pPar
27a90 73 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 70  se. Otherwise, p
27aa0 6f 70 75 6c 61 74 65 20 0a 2a 2a 20 70 46 72 6f  opulate .** pFro
27ab0 6d 2d 3e 70 49 6e 64 65 78 20 61 6e 64 20 72 65  m->pIndex and re
27ac0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a  turn SQLITE_OK..
27ad0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 49 6e  */.int sqlite3In
27ae0 64 65 78 65 64 42 79 4c 6f 6f 6b 75 70 28 50 61  dexedByLookup(Pa
27af0 72 73 65 20 2a 70 50 61 72 73 65 2c 20 73 74 72  rse *pParse, str
27b00 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
27b10 20 2a 70 46 72 6f 6d 29 7b 0a 20 20 69 66 28 20   *pFrom){.  if( 
27b20 70 46 72 6f 6d 2d 3e 70 54 61 62 20 26 26 20 70  pFrom->pTab && p
27b30 46 72 6f 6d 2d 3e 66 67 2e 69 73 49 6e 64 65 78  From->fg.isIndex
27b40 65 64 42 79 20 29 7b 0a 20 20 20 20 54 61 62 6c  edBy ){.    Tabl
27b50 65 20 2a 70 54 61 62 20 3d 20 70 46 72 6f 6d 2d  e *pTab = pFrom-
27b60 3e 70 54 61 62 3b 0a 20 20 20 20 63 68 61 72 20  >pTab;.    char 
27b70 2a 7a 49 6e 64 65 78 65 64 42 79 20 3d 20 70 46  *zIndexedBy = pF
27b80 72 6f 6d 2d 3e 75 31 2e 7a 49 6e 64 65 78 65 64  rom->u1.zIndexed
27b90 42 79 3b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70  By;.    Index *p
27ba0 49 64 78 3b 0a 20 20 20 20 66 6f 72 28 70 49 64  Idx;.    for(pId
27bb0 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20  x=pTab->pIndex; 
27bc0 0a 20 20 20 20 20 20 20 20 70 49 64 78 20 26 26  .        pIdx &&
27bd0 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
27be0 70 49 64 78 2d 3e 7a 4e 61 6d 65 2c 20 7a 49 6e  pIdx->zName, zIn
27bf0 64 65 78 65 64 42 79 29 3b 20 0a 20 20 20 20 20  dexedBy); .     
27c00 20 20 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e     pIdx=pIdx->pN
27c10 65 78 74 0a 20 20 20 20 29 3b 0a 20 20 20 20 69  ext.    );.    i
27c20 66 28 20 21 70 49 64 78 20 29 7b 0a 20 20 20 20  f( !pIdx ){.    
27c30 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
27c40 67 28 70 50 61 72 73 65 2c 20 22 6e 6f 20 73 75  g(pParse, "no su
27c50 63 68 20 69 6e 64 65 78 3a 20 25 73 22 2c 20 7a  ch index: %s", z
27c60 49 6e 64 65 78 65 64 42 79 2c 20 30 29 3b 0a 20  IndexedBy, 0);. 
27c70 20 20 20 20 20 70 50 61 72 73 65 2d 3e 63 68 65       pParse->che
27c80 63 6b 53 63 68 65 6d 61 20 3d 20 31 3b 0a 20 20  ckSchema = 1;.  
27c90 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
27ca0 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20  E_ERROR;.    }. 
27cb0 20 20 20 70 46 72 6f 6d 2d 3e 70 49 42 49 6e 64     pFrom->pIBInd
27cc0 65 78 20 3d 20 70 49 64 78 3b 0a 20 20 7d 0a 20  ex = pIdx;.  }. 
27cd0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
27ce0 4b 3b 0a 7d 0a 2f 2a 0a 2a 2a 20 44 65 74 65 63  K;.}./*.** Detec
27cf0 74 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43  t compound SELEC
27d00 54 20 73 74 61 74 65 6d 65 6e 74 73 20 74 68 61  T statements tha
27d10 74 20 75 73 65 20 61 6e 20 4f 52 44 45 52 20 42  t use an ORDER B
27d20 59 20 63 6c 61 75 73 65 20 77 69 74 68 20 0a 2a  Y clause with .*
27d30 2a 20 61 6e 20 61 6c 74 65 72 6e 61 74 69 76 65  * an alternative
27d40 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
27d50 6e 63 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 53 45  nce..**.**    SE
27d60 4c 45 43 54 20 2e 2e 2e 20 46 52 4f 4d 20 74 31  LECT ... FROM t1
27d70 20 45 58 43 45 50 54 20 53 45 4c 45 43 54 20 2e   EXCEPT SELECT .
27d80 2e 2e 20 46 52 4f 4d 20 74 32 20 4f 52 44 45 52  .. FROM t2 ORDER
27d90 20 42 59 20 2e 2e 20 43 4f 4c 4c 41 54 45 20 2e   BY .. COLLATE .
27da0 2e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 73 65 20 61  ...**.** These a
27db0 72 65 20 72 65 77 72 69 74 74 65 6e 20 61 73 20  re rewritten as 
27dc0 61 20 73 75 62 71 75 65 72 79 3a 0a 2a 2a 0a 2a  a subquery:.**.*
27dd0 2a 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52  *    SELECT * FR
27de0 4f 4d 20 28 53 45 4c 45 43 54 20 2e 2e 2e 20 46  OM (SELECT ... F
27df0 52 4f 4d 20 74 31 20 45 58 43 45 50 54 20 53 45  ROM t1 EXCEPT SE
27e00 4c 45 43 54 20 2e 2e 2e 20 46 52 4f 4d 20 74 32  LECT ... FROM t2
27e10 29 0a 2a 2a 20 20 20 20 20 4f 52 44 45 52 20 42  ).**     ORDER B
27e20 59 20 2e 2e 2e 20 43 4f 4c 4c 41 54 45 20 2e 2e  Y ... COLLATE ..
27e30 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 74 72 61  ..**.** This tra
27e40 6e 73 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 6e  nsformation is n
27e50 65 63 65 73 73 61 72 79 20 62 65 63 61 75 73 65  ecessary because
27e60 20 74 68 65 20 6d 75 6c 74 69 53 65 6c 65 63 74   the multiSelect
27e70 4f 72 64 65 72 42 79 28 29 20 72 6f 75 74 69 6e  OrderBy() routin
27e80 65 0a 2a 2a 20 61 62 6f 76 65 20 74 68 61 74 20  e.** above that 
27e90 67 65 6e 65 72 61 74 65 73 20 74 68 65 20 63 6f  generates the co
27ea0 64 65 20 66 6f 72 20 61 20 63 6f 6d 70 6f 75 6e  de for a compoun
27eb0 64 20 53 45 4c 45 43 54 20 77 69 74 68 20 61 6e  d SELECT with an
27ec0 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
27ed0 0a 2a 2a 20 75 73 65 73 20 61 20 6d 65 72 67 65  .** uses a merge
27ee0 20 61 6c 67 6f 72 69 74 68 6d 20 74 68 61 74 20   algorithm that 
27ef0 72 65 71 75 69 72 65 73 20 74 68 65 20 73 61 6d  requires the sam
27f00 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  e collating sequ
27f10 65 6e 63 65 20 6f 6e 20 74 68 65 0a 2a 2a 20 72  ence on the.** r
27f20 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 61 73  esult columns as
27f30 20 6f 6e 20 74 68 65 20 4f 52 44 45 52 20 42 59   on the ORDER BY
27f40 20 63 6c 61 75 73 65 2e 20 20 53 65 65 20 74 69   clause.  See ti
27f50 63 6b 65 74 0a 2a 2a 20 68 74 74 70 3a 2f 2f 77  cket.** http://w
27f60 77 77 2e 73 71 6c 69 74 65 2e 6f 72 67 2f 73 72  ww.sqlite.org/sr
27f70 63 2f 69 6e 66 6f 2f 36 37 30 39 35 37 34 64 32  c/info/6709574d2
27f80 61 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 74 72 61  a.**.** This tra
27f90 6e 73 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 6f  nsformation is o
27fa0 6e 6c 79 20 6e 65 65 64 65 64 20 66 6f 72 20 45  nly needed for E
27fb0 58 43 45 50 54 2c 20 49 4e 54 45 52 53 45 43 54  XCEPT, INTERSECT
27fc0 2c 20 61 6e 64 20 55 4e 49 4f 4e 2e 0a 2a 2a 20  , and UNION..** 
27fd0 54 68 65 20 55 4e 49 4f 4e 20 41 4c 4c 20 6f 70  The UNION ALL op
27fe0 65 72 61 74 6f 72 20 77 6f 72 6b 73 20 66 69 6e  erator works fin
27ff0 65 20 77 69 74 68 20 6d 75 6c 74 69 53 65 6c 65  e with multiSele
28000 63 74 4f 72 64 65 72 42 79 28 29 20 65 76 65 6e  ctOrderBy() even
28010 20 77 68 65 6e 0a 2a 2a 20 74 68 65 72 65 20 61   when.** there a
28020 72 65 20 43 4f 4c 4c 41 54 45 20 74 65 72 6d 73  re COLLATE terms
28030 20 69 6e 20 74 68 65 20 4f 52 44 45 52 20 42 59   in the ORDER BY
28040 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
28050 63 6f 6e 76 65 72 74 43 6f 6d 70 6f 75 6e 64 53  convertCompoundS
28060 65 6c 65 63 74 54 6f 53 75 62 71 75 65 72 79 28  electToSubquery(
28070 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c  Walker *pWalker,
28080 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 69   Select *p){.  i
28090 6e 74 20 69 3b 0a 20 20 53 65 6c 65 63 74 20 2a  nt i;.  Select *
280a0 70 4e 65 77 3b 0a 20 20 53 65 6c 65 63 74 20 2a  pNew;.  Select *
280b0 70 58 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  pX;.  sqlite3 *d
280c0 62 3b 0a 20 20 73 74 72 75 63 74 20 45 78 70 72  b;.  struct Expr
280d0 4c 69 73 74 5f 69 74 65 6d 20 2a 61 3b 0a 20 20  List_item *a;.  
280e0 53 72 63 4c 69 73 74 20 2a 70 4e 65 77 53 72 63  SrcList *pNewSrc
280f0 3b 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  ;.  Parse *pPars
28100 65 3b 0a 20 20 54 6f 6b 65 6e 20 64 75 6d 6d 79  e;.  Token dummy
28110 3b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74  ;.  static const
28120 20 4f 6e 55 73 69 6e 67 20 6e 75 6c 6c 4f 6e 55   OnUsing nullOnU
28130 73 69 6e 67 20 3d 20 7b 20 30 2c 20 30 20 7d 3b  sing = { 0, 0 };
28140 0a 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 69 6f  ..  if( p->pPrio
28150 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 57 52  r==0 ) return WR
28160 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20 20 69 66  C_Continue;.  if
28170 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30  ( p->pOrderBy==0
28180 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f   ) return WRC_Co
28190 6e 74 69 6e 75 65 3b 0a 20 20 66 6f 72 28 70 58  ntinue;.  for(pX
281a0 3d 70 3b 20 70 58 20 26 26 20 28 70 58 2d 3e 6f  =p; pX && (pX->o
281b0 70 3d 3d 54 4b 5f 41 4c 4c 20 7c 7c 20 70 58 2d  p==TK_ALL || pX-
281c0 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 29 3b  >op==TK_SELECT);
281d0 20 70 58 3d 70 58 2d 3e 70 50 72 69 6f 72 29 7b   pX=pX->pPrior){
281e0 7d 0a 20 20 69 66 28 20 70 58 3d 3d 30 20 29 20  }.  if( pX==0 ) 
281f0 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69  return WRC_Conti
28200 6e 75 65 3b 0a 20 20 61 20 3d 20 70 2d 3e 70 4f  nue;.  a = p->pO
28210 72 64 65 72 42 79 2d 3e 61 3b 0a 20 20 66 6f 72  rderBy->a;.  for
28220 28 69 3d 70 2d 3e 70 4f 72 64 65 72 42 79 2d 3e  (i=p->pOrderBy->
28230 6e 45 78 70 72 2d 31 3b 20 69 3e 3d 30 3b 20 69  nExpr-1; i>=0; i
28240 2d 2d 29 7b 0a 20 20 20 20 69 66 28 20 61 5b 69  --){.    if( a[i
28250 5d 2e 70 45 78 70 72 2d 3e 66 6c 61 67 73 20 26  ].pExpr->flags &
28260 20 45 50 5f 43 6f 6c 6c 61 74 65 20 29 20 62 72   EP_Collate ) br
28270 65 61 6b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69  eak;.  }.  if( i
28280 3c 30 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f  <0 ) return WRC_
28290 43 6f 6e 74 69 6e 75 65 3b 0a 0a 20 20 2f 2a 20  Continue;..  /* 
282a0 49 66 20 77 65 20 72 65 61 63 68 20 74 68 69 73  If we reach this
282b0 20 70 6f 69 6e 74 2c 20 74 68 61 74 20 6d 65 61   point, that mea
282c0 6e 73 20 74 68 65 20 74 72 61 6e 73 66 6f 72 6d  ns the transform
282d0 61 74 69 6f 6e 20 69 73 20 72 65 71 75 69 72 65  ation is require
282e0 64 2e 20 2a 2f 0a 0a 20 20 70 50 61 72 73 65 20  d. */..  pParse 
282f0 3d 20 70 57 61 6c 6b 65 72 2d 3e 70 50 61 72 73  = pWalker->pPars
28300 65 3b 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65  e;.  db = pParse
28310 2d 3e 64 62 3b 0a 20 20 70 4e 65 77 20 3d 20 73  ->db;.  pNew = s
28320 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65  qlite3DbMallocZe
28330 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70  ro(db, sizeof(*p
28340 4e 65 77 29 20 29 3b 0a 20 20 69 66 28 20 70 4e  New) );.  if( pN
28350 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 57  ew==0 ) return W
28360 52 43 5f 41 62 6f 72 74 3b 0a 20 20 6d 65 6d 73  RC_Abort;.  mems
28370 65 74 28 26 64 75 6d 6d 79 2c 20 30 2c 20 73 69  et(&dummy, 0, si
28380 7a 65 6f 66 28 64 75 6d 6d 79 29 29 3b 0a 20 20  zeof(dummy));.  
28390 70 4e 65 77 53 72 63 20 3d 20 73 71 6c 69 74 65  pNewSrc = sqlite
283a0 33 53 72 63 4c 69 73 74 41 70 70 65 6e 64 46 72  3SrcListAppendFr
283b0 6f 6d 54 65 72 6d 28 70 50 61 72 73 65 2c 30 2c  omTerm(pParse,0,
283c0 30 2c 30 2c 26 64 75 6d 6d 79 2c 70 4e 65 77 2c  0,0,&dummy,pNew,
283d0 26 6e 75 6c 6c 4f 6e 55 73 69 6e 67 29 3b 0a 20  &nullOnUsing);. 
283e0 20 69 66 28 20 70 4e 65 77 53 72 63 3d 3d 30 20   if( pNewSrc==0 
283f0 29 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f  ) return WRC_Abo
28400 72 74 3b 0a 20 20 2a 70 4e 65 77 20 3d 20 2a 70  rt;.  *pNew = *p
28410 3b 0a 20 20 70 2d 3e 70 53 72 63 20 3d 20 70 4e  ;.  p->pSrc = pN
28420 65 77 53 72 63 3b 0a 20 20 70 2d 3e 70 45 4c 69  ewSrc;.  p->pELi
28430 73 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  st = sqlite3Expr
28440 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61 72 73  ListAppend(pPars
28450 65 2c 20 30 2c 20 73 71 6c 69 74 65 33 45 78 70  e, 0, sqlite3Exp
28460 72 28 64 62 2c 20 54 4b 5f 41 53 54 45 52 49 53  r(db, TK_ASTERIS
28470 4b 2c 20 30 29 29 3b 0a 20 20 70 2d 3e 6f 70 20  K, 0));.  p->op 
28480 3d 20 54 4b 5f 53 45 4c 45 43 54 3b 0a 20 20 70  = TK_SELECT;.  p
28490 2d 3e 70 57 68 65 72 65 20 3d 20 30 3b 0a 20 20  ->pWhere = 0;.  
284a0 70 4e 65 77 2d 3e 70 47 72 6f 75 70 42 79 20 3d  pNew->pGroupBy =
284b0 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 70 48 61 76   0;.  pNew->pHav
284c0 69 6e 67 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d  ing = 0;.  pNew-
284d0 3e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20  >pOrderBy = 0;. 
284e0 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a   p->pPrior = 0;.
284f0 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20 30 3b 0a    p->pNext = 0;.
28500 20 20 70 2d 3e 70 57 69 74 68 20 3d 20 30 3b 0a    p->pWith = 0;.
28510 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 3d    p->selFlags &=
28520 20 7e 53 46 5f 43 6f 6d 70 6f 75 6e 64 3b 0a 20   ~SF_Compound;. 
28530 20 61 73 73 65 72 74 28 20 28 70 2d 3e 73 65 6c   assert( (p->sel
28540 46 6c 61 67 73 20 26 20 53 46 5f 43 6f 6e 76 65  Flags & SF_Conve
28550 72 74 65 64 29 3d 3d 30 20 29 3b 0a 20 20 70 2d  rted)==0 );.  p-
28560 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f  >selFlags |= SF_
28570 43 6f 6e 76 65 72 74 65 64 3b 0a 20 20 61 73 73  Converted;.  ass
28580 65 72 74 28 20 70 4e 65 77 2d 3e 70 50 72 69 6f  ert( pNew->pPrio
28590 72 21 3d 30 20 29 3b 0a 20 20 70 4e 65 77 2d 3e  r!=0 );.  pNew->
285a0 70 50 72 69 6f 72 2d 3e 70 4e 65 78 74 20 3d 20  pPrior->pNext = 
285b0 70 4e 65 77 3b 0a 20 20 70 4e 65 77 2d 3e 70 4c  pNew;.  pNew->pL
285c0 69 6d 69 74 20 3d 20 30 3b 0a 20 20 72 65 74 75  imit = 0;.  retu
285d0 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b  rn WRC_Continue;
285e0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20  .}../*.** Check 
285f0 74 6f 20 73 65 65 20 69 66 20 74 68 65 20 46 52  to see if the FR
28600 4f 4d 20 63 6c 61 75 73 65 20 74 65 72 6d 20 70  OM clause term p
28610 46 72 6f 6d 20 68 61 73 20 74 61 62 6c 65 2d 76  From has table-v
28620 61 6c 75 65 64 20 66 75 6e 63 74 69 6f 6e 0a 2a  alued function.*
28630 2a 20 61 72 67 75 6d 65 6e 74 73 2e 20 20 49 66  * arguments.  If
28640 20 69 74 20 64 6f 65 73 2c 20 6c 65 61 76 65 20   it does, leave 
28650 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  an error message
28660 20 69 6e 20 70 50 61 72 73 65 20 61 6e 64 20 72   in pParse and r
28670 65 74 75 72 6e 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72  eturn.** non-zer
28680 6f 2c 20 73 69 6e 63 65 20 70 46 72 6f 6d 20 69  o, since pFrom i
28690 73 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 20 74 6f  s not allowed to
286a0 20 62 65 20 61 20 74 61 62 6c 65 2d 76 61 6c 75   be a table-valu
286b0 65 64 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a  ed function..*/.
286c0 73 74 61 74 69 63 20 69 6e 74 20 63 61 6e 6e 6f  static int canno
286d0 74 42 65 46 75 6e 63 74 69 6f 6e 28 50 61 72 73  tBeFunction(Pars
286e0 65 20 2a 70 50 61 72 73 65 2c 20 73 74 72 75 63  e *pParse, struc
286f0 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
28700 70 46 72 6f 6d 29 7b 0a 20 20 69 66 28 20 70 46  pFrom){.  if( pF
28710 72 6f 6d 2d 3e 66 67 2e 69 73 54 61 62 46 75 6e  rom->fg.isTabFun
28720 63 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  c ){.    sqlite3
28730 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
28740 20 22 27 25 73 27 20 69 73 20 6e 6f 74 20 61 20   "'%s' is not a 
28750 66 75 6e 63 74 69 6f 6e 22 2c 20 70 46 72 6f 6d  function", pFrom
28760 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 72 65  ->zName);.    re
28770 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65  turn 1;.  }.  re
28780 74 75 72 6e 20 30 3b 0a 7d 0a 0a 23 69 66 6e 64  turn 0;.}..#ifnd
28790 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43  ef SQLITE_OMIT_C
287a0 54 45 0a 2f 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e  TE./*.** Argumen
287b0 74 20 70 57 69 74 68 20 28 77 68 69 63 68 20 6d  t pWith (which m
287c0 61 79 20 62 65 20 4e 55 4c 4c 29 20 70 6f 69 6e  ay be NULL) poin
287d0 74 73 20 74 6f 20 61 20 6c 69 6e 6b 65 64 20 6c  ts to a linked l
287e0 69 73 74 20 6f 66 20 6e 65 73 74 65 64 20 0a 2a  ist of nested .*
287f0 2a 20 57 49 54 48 20 63 6f 6e 74 65 78 74 73 2c  * WITH contexts,
28800 20 66 72 6f 6d 20 69 6e 6e 65 72 20 74 6f 20 6f   from inner to o
28810 75 74 65 72 6d 6f 73 74 2e 20 49 66 20 74 68 65  utermost. If the
28820 20 74 61 62 6c 65 20 69 64 65 6e 74 69 66 69 65   table identifie
28830 64 20 62 79 20 0a 2a 2a 20 46 52 4f 4d 20 63 6c  d by .** FROM cl
28840 61 75 73 65 20 65 6c 65 6d 65 6e 74 20 70 49 74  ause element pIt
28850 65 6d 20 69 73 20 72 65 61 6c 6c 79 20 61 20 63  em is really a c
28860 6f 6d 6d 6f 6e 2d 74 61 62 6c 65 2d 65 78 70 72  ommon-table-expr
28870 65 73 73 69 6f 6e 20 28 43 54 45 29 20 0a 2a 2a  ession (CTE) .**
28880 20 74 68 65 6e 20 72 65 74 75 72 6e 20 61 20 70   then return a p
28890 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 43 54  ointer to the CT
288a0 45 20 64 65 66 69 6e 69 74 69 6f 6e 20 66 6f 72  E definition for
288b0 20 74 68 61 74 20 74 61 62 6c 65 2e 20 4f 74 68   that table. Oth
288c0 65 72 77 69 73 65 0a 2a 2a 20 72 65 74 75 72 6e  erwise.** return
288d0 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   NULL..**.** If 
288e0 61 20 6e 6f 6e 2d 4e 55 4c 4c 20 76 61 6c 75 65  a non-NULL value
288f0 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20 73 65   is returned, se
28900 74 20 2a 70 70 43 6f 6e 74 65 78 74 20 74 6f 20  t *ppContext to 
28910 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 57 69 74  point to the Wit
28920 68 0a 2a 2a 20 6f 62 6a 65 63 74 20 74 68 61 74  h.** object that
28930 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 43 54   the returned CT
28940 45 20 62 65 6c 6f 6e 67 73 20 74 6f 2e 0a 2a 2f  E belongs to..*/
28950 0a 73 74 61 74 69 63 20 73 74 72 75 63 74 20 43  .static struct C
28960 74 65 20 2a 73 65 61 72 63 68 57 69 74 68 28 0a  te *searchWith(.
28970 20 20 57 69 74 68 20 2a 70 57 69 74 68 2c 20 20    With *pWith,  
28980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28990 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 69 6e 6e    /* Current inn
289a0 65 72 6d 6f 73 74 20 57 49 54 48 20 63 6c 61 75  ermost WITH clau
289b0 73 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53  se */.  struct S
289c0 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  rcList_item *pIt
289d0 65 6d 2c 20 20 20 20 20 2f 2a 20 46 52 4f 4d 20  em,     /* FROM 
289e0 63 6c 61 75 73 65 20 65 6c 65 6d 65 6e 74 20 74  clause element t
289f0 6f 20 72 65 73 6f 6c 76 65 20 2a 2f 0a 20 20 57  o resolve */.  W
28a00 69 74 68 20 2a 2a 70 70 43 6f 6e 74 65 78 74 20  ith **ppContext 
28a10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
28a20 2a 20 4f 55 54 3a 20 57 49 54 48 20 63 6c 61 75  * OUT: WITH clau
28a30 73 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20  se return value 
28a40 62 65 6c 6f 6e 67 73 20 74 6f 20 2a 2f 0a 29 7b  belongs to */.){
28a50 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
28a60 4e 61 6d 65 3b 0a 20 20 69 66 28 20 70 49 74 65  Name;.  if( pIte
28a70 6d 2d 3e 7a 44 61 74 61 62 61 73 65 3d 3d 30 20  m->zDatabase==0 
28a80 26 26 20 28 7a 4e 61 6d 65 20 3d 20 70 49 74 65  && (zName = pIte
28a90 6d 2d 3e 7a 4e 61 6d 65 29 21 3d 30 20 29 7b 0a  m->zName)!=0 ){.
28aa0 20 20 20 20 57 69 74 68 20 2a 70 3b 0a 20 20 20      With *p;.   
28ab0 20 66 6f 72 28 70 3d 70 57 69 74 68 3b 20 70 3b   for(p=pWith; p;
28ac0 20 70 3d 70 2d 3e 70 4f 75 74 65 72 29 7b 0a 20   p=p->pOuter){. 
28ad0 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20       int i;.    
28ae0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e    for(i=0; i<p->
28af0 6e 43 74 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nCte; i++){.    
28b00 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53      if( sqlite3S
28b10 74 72 49 43 6d 70 28 7a 4e 61 6d 65 2c 20 70 2d  trICmp(zName, p-
28b20 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20  >a[i].zName)==0 
28b30 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2a 70 70  ){.          *pp
28b40 43 6f 6e 74 65 78 74 20 3d 20 70 3b 0a 20 20 20  Context = p;.   
28b50 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 26 70         return &p
28b60 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20  ->a[i];.        
28b70 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
28b80 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
28b90 7d 0a 0a 2f 2a 20 54 68 65 20 63 6f 64 65 20 67  }../* The code g
28ba0 65 6e 65 72 61 74 6f 72 20 6d 61 69 6e 74 61 69  enerator maintai
28bb0 6e 73 20 61 20 73 74 61 63 6b 20 6f 66 20 61 63  ns a stack of ac
28bc0 74 69 76 65 20 57 49 54 48 20 63 6c 61 75 73 65  tive WITH clause
28bd0 73 0a 2a 2a 20 77 69 74 68 20 74 68 65 20 69 6e  s.** with the in
28be0 6e 65 72 2d 6d 6f 73 74 20 57 49 54 48 20 63 6c  ner-most WITH cl
28bf0 61 75 73 65 20 62 65 69 6e 67 20 61 74 20 74 68  ause being at th
28c00 65 20 74 6f 70 20 6f 66 20 74 68 65 20 73 74 61  e top of the sta
28c10 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ck..**.** This r
28c20 6f 75 74 69 6e 65 20 70 75 73 68 65 73 20 74 68  outine pushes th
28c30 65 20 57 49 54 48 20 63 6c 61 75 73 65 20 70 61  e WITH clause pa
28c40 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f  ssed as the seco
28c50 6e 64 20 61 72 67 75 6d 65 6e 74 0a 2a 2a 20 6f  nd argument.** o
28c60 6e 74 6f 20 74 68 65 20 74 6f 70 20 6f 66 20 74  nto the top of t
28c70 68 65 20 73 74 61 63 6b 2e 20 49 66 20 61 72 67  he stack. If arg
28c80 75 6d 65 6e 74 20 62 46 72 65 65 20 69 73 20 74  ument bFree is t
28c90 72 75 65 2c 20 74 68 65 6e 20 74 68 69 73 0a 2a  rue, then this.*
28ca0 2a 20 57 49 54 48 20 63 6c 61 75 73 65 20 77 69  * WITH clause wi
28cb0 6c 6c 20 6e 65 76 65 72 20 62 65 20 70 6f 70 70  ll never be popp
28cc0 65 64 20 66 72 6f 6d 20 74 68 65 20 73 74 61 63  ed from the stac
28cd0 6b 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  k. In this case 
28ce0 69 74 0a 2a 2a 20 73 68 6f 75 6c 64 20 62 65 20  it.** should be 
28cf0 66 72 65 65 64 20 61 6c 6f 6e 67 20 77 69 74 68  freed along with
28d00 20 74 68 65 20 50 61 72 73 65 20 6f 62 6a 65 63   the Parse objec
28d10 74 2e 20 49 6e 20 6f 74 68 65 72 20 63 61 73 65  t. In other case
28d20 73 2c 20 77 68 65 6e 0a 2a 2a 20 62 46 72 65 65  s, when.** bFree
28d30 3d 3d 30 2c 20 74 68 65 20 57 69 74 68 20 6f 62  ==0, the With ob
28d40 6a 65 63 74 20 77 69 6c 6c 20 62 65 20 66 72 65  ject will be fre
28d50 65 64 20 61 6c 6f 6e 67 20 77 69 74 68 20 74 68  ed along with th
28d60 65 20 53 45 4c 45 43 54 20 0a 2a 2a 20 73 74 61  e SELECT .** sta
28d70 74 65 6d 65 6e 74 20 77 69 74 68 20 77 68 69 63  tement with whic
28d80 68 20 69 74 20 69 73 20 61 73 73 6f 63 69 61 74  h it is associat
28d90 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ed..*/.void sqli
28da0 74 65 33 57 69 74 68 50 75 73 68 28 50 61 72 73  te3WithPush(Pars
28db0 65 20 2a 70 50 61 72 73 65 2c 20 57 69 74 68 20  e *pParse, With 
28dc0 2a 70 57 69 74 68 2c 20 75 38 20 62 46 72 65 65  *pWith, u8 bFree
28dd0 29 7b 0a 20 20 61 73 73 65 72 74 28 20 62 46 72  ){.  assert( bFr
28de0 65 65 3d 3d 30 20 7c 7c 20 28 70 50 61 72 73 65  ee==0 || (pParse
28df0 2d 3e 70 57 69 74 68 3d 3d 30 20 26 26 20 70 50  ->pWith==0 && pP
28e00 61 72 73 65 2d 3e 70 57 69 74 68 54 6f 46 72 65  arse->pWithToFre
28e10 65 3d 3d 30 29 20 29 3b 0a 20 20 69 66 28 20 70  e==0) );.  if( p
28e20 57 69 74 68 20 29 7b 0a 20 20 20 20 61 73 73 65  With ){.    asse
28e30 72 74 28 20 70 50 61 72 73 65 2d 3e 70 57 69 74  rt( pParse->pWit
28e40 68 21 3d 70 57 69 74 68 20 29 3b 0a 20 20 20 20  h!=pWith );.    
28e50 70 57 69 74 68 2d 3e 70 4f 75 74 65 72 20 3d 20  pWith->pOuter = 
28e60 70 50 61 72 73 65 2d 3e 70 57 69 74 68 3b 0a 20  pParse->pWith;. 
28e70 20 20 20 70 50 61 72 73 65 2d 3e 70 57 69 74 68     pParse->pWith
28e80 20 3d 20 70 57 69 74 68 3b 0a 20 20 20 20 69 66   = pWith;.    if
28e90 28 20 62 46 72 65 65 20 29 20 70 50 61 72 73 65  ( bFree ) pParse
28ea0 2d 3e 70 57 69 74 68 54 6f 46 72 65 65 20 3d 20  ->pWithToFree = 
28eb0 70 57 69 74 68 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  pWith;.  }.}../*
28ec0 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
28ed0 6e 20 63 68 65 63 6b 73 20 69 66 20 61 72 67 75  n checks if argu
28ee0 6d 65 6e 74 20 70 46 72 6f 6d 20 72 65 66 65 72  ment pFrom refer
28ef0 73 20 74 6f 20 61 20 43 54 45 20 64 65 63 6c 61  s to a CTE decla
28f00 72 65 64 20 62 79 20 0a 2a 2a 20 61 20 57 49 54  red by .** a WIT
28f10 48 20 63 6c 61 75 73 65 20 6f 6e 20 74 68 65 20  H clause on the 
28f20 73 74 61 63 6b 20 63 75 72 72 65 6e 74 6c 79 20  stack currently 
28f30 6d 61 69 6e 74 61 69 6e 65 64 20 62 79 20 74 68  maintained by th
28f40 65 20 70 61 72 73 65 72 2e 20 41 6e 64 2c 0a 2a  e parser. And,.*
28f50 2a 20 69 66 20 63 75 72 72 65 6e 74 6c 79 20 70  * if currently p
28f60 72 6f 63 65 73 73 69 6e 67 20 61 20 43 54 45 20  rocessing a CTE 
28f70 65 78 70 72 65 73 73 69 6f 6e 2c 20 69 66 20 69  expression, if i
28f80 74 20 69 73 20 61 20 72 65 63 75 72 73 69 76 65  t is a recursive
28f90 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65 20 74 6f  .** reference to
28fa0 20 74 68 65 20 63 75 72 72 65 6e 74 20 43 54 45   the current CTE
28fb0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 46 72 6f 6d  ..**.** If pFrom
28fc0 20 66 61 6c 6c 73 20 69 6e 74 6f 20 65 69 74 68   falls into eith
28fd0 65 72 20 6f 66 20 74 68 65 20 74 77 6f 20 63 61  er of the two ca
28fe0 74 65 67 6f 72 69 65 73 20 61 62 6f 76 65 2c 20  tegories above, 
28ff0 70 46 72 6f 6d 2d 3e 70 54 61 62 0a 2a 2a 20 61  pFrom->pTab.** a
29000 6e 64 20 6f 74 68 65 72 20 66 69 65 6c 64 73 20  nd other fields 
29010 61 72 65 20 70 6f 70 75 6c 61 74 65 64 20 61 63  are populated ac
29020 63 6f 72 64 69 6e 67 6c 79 2e 20 54 68 65 20 63  cordingly. The c
29030 61 6c 6c 65 72 20 73 68 6f 75 6c 64 20 63 68 65  aller should che
29040 63 6b 0a 2a 2a 20 28 70 46 72 6f 6d 2d 3e 70 54  ck.** (pFrom->pT
29050 61 62 21 3d 30 29 20 74 6f 20 64 65 74 65 72 6d  ab!=0) to determ
29060 69 6e 65 20 77 68 65 74 68 65 72 20 6f 72 20 6e  ine whether or n
29070 6f 74 20 61 20 73 75 63 63 65 73 73 66 75 6c 20  ot a successful 
29080 6d 61 74 63 68 0a 2a 2a 20 77 61 73 20 66 6f 75  match.** was fou
29090 6e 64 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 74 68 65  nd..**.** Whethe
290a0 72 20 6f 72 20 6e 6f 74 20 61 20 6d 61 74 63 68  r or not a match
290b0 20 69 73 20 66 6f 75 6e 64 2c 20 53 51 4c 49 54   is found, SQLIT
290c0 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
290d0 20 69 66 20 6e 6f 20 65 72 72 6f 72 0a 2a 2a 20   if no error.** 
290e0 6f 63 63 75 72 73 2e 20 49 66 20 61 6e 20 65 72  occurs. If an er
290f0 72 6f 72 20 64 6f 65 73 20 6f 63 63 75 72 2c 20  ror does occur, 
29100 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  an error message
29110 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 74 68   is stored in th
29120 65 0a 2a 2a 20 70 61 72 73 65 72 20 61 6e 64 20  e.** parser and 
29130 73 6f 6d 65 20 65 72 72 6f 72 20 63 6f 64 65 20  some error code 
29140 6f 74 68 65 72 20 74 68 61 6e 20 53 51 4c 49 54  other than SQLIT
29150 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 0a 2a  E_OK returned..*
29160 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 74  /.static int wit
29170 68 45 78 70 61 6e 64 28 0a 20 20 57 61 6c 6b 65  hExpand(.  Walke
29180 72 20 2a 70 57 61 6c 6b 65 72 2c 20 0a 20 20 73  r *pWalker, .  s
29190 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
291a0 65 6d 20 2a 70 46 72 6f 6d 0a 29 7b 0a 20 20 50  em *pFrom.){.  P
291b0 61 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20 70  arse *pParse = p
291c0 57 61 6c 6b 65 72 2d 3e 70 50 61 72 73 65 3b 0a  Walker->pParse;.
291d0 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
291e0 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 73 74  pParse->db;.  st
291f0 72 75 63 74 20 43 74 65 20 2a 70 43 74 65 3b 20  ruct Cte *pCte; 
29200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
29210 20 4d 61 74 63 68 65 64 20 43 54 45 20 28 6f 72   Matched CTE (or
29220 20 4e 55 4c 4c 20 69 66 20 6e 6f 20 6d 61 74 63   NULL if no matc
29230 68 29 20 2a 2f 0a 20 20 57 69 74 68 20 2a 70 57  h) */.  With *pW
29240 69 74 68 3b 20 20 20 20 20 20 20 20 20 20 20 20  ith;            
29250 20 20 20 20 20 20 20 20 2f 2a 20 57 49 54 48 20          /* WITH 
29260 63 6c 61 75 73 65 20 74 68 61 74 20 70 43 74 65  clause that pCte
29270 20 62 65 6c 6f 6e 67 73 20 74 6f 20 2a 2f 0a 0a   belongs to */..
29280 20 20 61 73 73 65 72 74 28 20 70 46 72 6f 6d 2d    assert( pFrom-
29290 3e 70 54 61 62 3d 3d 30 20 29 3b 0a 0a 20 20 70  >pTab==0 );..  p
292a0 43 74 65 20 3d 20 73 65 61 72 63 68 57 69 74 68  Cte = searchWith
292b0 28 70 50 61 72 73 65 2d 3e 70 57 69 74 68 2c 20  (pParse->pWith, 
292c0 70 46 72 6f 6d 2c 20 26 70 57 69 74 68 29 3b 0a  pFrom, &pWith);.
292d0 20 20 69 66 28 20 70 43 74 65 20 29 7b 0a 20 20    if( pCte ){.  
292e0 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20    Table *pTab;. 
292f0 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c     ExprList *pEL
29300 69 73 74 3b 0a 20 20 20 20 53 65 6c 65 63 74 20  ist;.    Select 
29310 2a 70 53 65 6c 3b 0a 20 20 20 20 53 65 6c 65 63  *pSel;.    Selec
29320 74 20 2a 70 4c 65 66 74 3b 20 20 20 20 20 20 20  t *pLeft;       
29330 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 66 74           /* Left
29340 2d 6d 6f 73 74 20 53 45 4c 45 43 54 20 73 74 61  -most SELECT sta
29350 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 69 6e  tement */.    in
29360 74 20 62 4d 61 79 52 65 63 75 72 73 69 76 65 3b  t bMayRecursive;
29370 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
29380 72 75 65 20 69 66 20 63 6f 6d 70 6f 75 6e 64 20  rue if compound 
29390 6a 6f 69 6e 65 64 20 62 79 20 55 4e 49 4f 4e 20  joined by UNION 
293a0 5b 41 4c 4c 5d 20 2a 2f 0a 20 20 20 20 57 69 74  [ALL] */.    Wit
293b0 68 20 2a 70 53 61 76 65 64 57 69 74 68 3b 20 20  h *pSavedWith;  
293c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
293d0 69 74 69 61 6c 20 76 61 6c 75 65 20 6f 66 20 70  itial value of p
293e0 50 61 72 73 65 2d 3e 70 57 69 74 68 20 2a 2f 0a  Parse->pWith */.
293f0 0a 20 20 20 20 2f 2a 20 49 66 20 70 43 74 65 2d  .    /* If pCte-
29400 3e 7a 43 74 65 45 72 72 20 69 73 20 6e 6f 6e 2d  >zCteErr is non-
29410 4e 55 4c 4c 20 61 74 20 74 68 69 73 20 70 6f 69  NULL at this poi
29420 6e 74 2c 20 74 68 65 6e 20 74 68 69 73 20 69 73  nt, then this is
29430 20 61 6e 20 69 6c 6c 65 67 61 6c 0a 20 20 20 20   an illegal.    
29440 2a 2a 20 72 65 63 75 72 73 69 76 65 20 72 65 66  ** recursive ref
29450 65 72 65 6e 63 65 20 74 6f 20 43 54 45 20 70 43  erence to CTE pC
29460 74 65 2e 20 4c 65 61 76 65 20 61 6e 20 65 72 72  te. Leave an err
29470 6f 72 20 69 6e 20 70 50 61 72 73 65 20 61 6e 64  or in pParse and
29480 20 72 65 74 75 72 6e 0a 20 20 20 20 2a 2a 20 65   return.    ** e
29490 61 72 6c 79 2e 20 49 66 20 70 43 74 65 2d 3e 7a  arly. If pCte->z
294a0 43 74 65 45 72 72 20 69 73 20 4e 55 4c 4c 2c 20  CteErr is NULL, 
294b0 74 68 65 6e 20 74 68 69 73 20 69 73 20 6e 6f 74  then this is not
294c0 20 61 20 72 65 63 75 72 73 69 76 65 20 72 65 66   a recursive ref
294d0 65 72 65 6e 63 65 2e 0a 20 20 20 20 2a 2a 20 49  erence..    ** I
294e0 6e 20 74 68 69 73 20 63 61 73 65 2c 20 70 72 6f  n this case, pro
294f0 63 65 65 64 2e 20 20 2a 2f 0a 20 20 20 20 69 66  ceed.  */.    if
29500 28 20 70 43 74 65 2d 3e 7a 43 74 65 45 72 72 20  ( pCte->zCteErr 
29510 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
29520 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
29530 20 70 43 74 65 2d 3e 7a 43 74 65 45 72 72 2c 20   pCte->zCteErr, 
29540 70 43 74 65 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  pCte->zName);.  
29550 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
29560 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20  E_ERROR;.    }. 
29570 20 20 20 69 66 28 20 63 61 6e 6e 6f 74 42 65 46     if( cannotBeF
29580 75 6e 63 74 69 6f 6e 28 70 50 61 72 73 65 2c 20  unction(pParse, 
29590 70 46 72 6f 6d 29 20 29 20 72 65 74 75 72 6e 20  pFrom) ) return 
295a0 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 0a 20  SQLITE_ERROR;.. 
295b0 20 20 20 61 73 73 65 72 74 28 20 70 46 72 6f 6d     assert( pFrom
295c0 2d 3e 70 54 61 62 3d 3d 30 20 29 3b 0a 20 20 20  ->pTab==0 );.   
295d0 20 70 46 72 6f 6d 2d 3e 70 54 61 62 20 3d 20 70   pFrom->pTab = p
295e0 54 61 62 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  Tab = sqlite3DbM
295f0 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69  allocZero(db, si
29600 7a 65 6f 66 28 54 61 62 6c 65 29 29 3b 0a 20 20  zeof(Table));.  
29610 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29 20    if( pTab==0 ) 
29620 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74  return WRC_Abort
29630 3b 0a 20 20 20 20 70 54 61 62 2d 3e 6e 54 61 62  ;.    pTab->nTab
29640 52 65 66 20 3d 20 31 3b 0a 20 20 20 20 70 54 61  Ref = 1;.    pTa
29650 62 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74  b->zName = sqlit
29660 65 33 44 62 53 74 72 44 75 70 28 64 62 2c 20 70  e3DbStrDup(db, p
29670 43 74 65 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  Cte->zName);.   
29680 20 70 54 61 62 2d 3e 69 50 4b 65 79 20 3d 20 2d   pTab->iPKey = -
29690 31 3b 0a 20 20 20 20 70 54 61 62 2d 3e 6e 52 6f  1;.    pTab->nRo
296a0 77 4c 6f 67 45 73 74 20 3d 20 32 30 30 3b 20 61  wLogEst = 200; a
296b0 73 73 65 72 74 28 20 32 30 30 3d 3d 73 71 6c 69  ssert( 200==sqli
296c0 74 65 33 4c 6f 67 45 73 74 28 31 30 34 38 35 37  te3LogEst(104857
296d0 36 29 20 29 3b 0a 20 20 20 20 70 54 61 62 2d 3e  6) );.    pTab->
296e0 74 61 62 46 6c 61 67 73 20 7c 3d 20 54 46 5f 45  tabFlags |= TF_E
296f0 70 68 65 6d 65 72 61 6c 20 7c 20 54 46 5f 4e 6f  phemeral | TF_No
29700 56 69 73 69 62 6c 65 52 6f 77 69 64 3b 0a 20 20  VisibleRowid;.  
29710 20 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74    pFrom->pSelect
29720 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74   = sqlite3Select
29730 44 75 70 28 64 62 2c 20 70 43 74 65 2d 3e 70 53  Dup(db, pCte->pS
29740 65 6c 65 63 74 2c 20 30 29 3b 0a 20 20 20 20 69  elect, 0);.    i
29750 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  f( db->mallocFai
29760 6c 65 64 20 29 20 72 65 74 75 72 6e 20 53 51 4c  led ) return SQL
29770 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a  ITE_NOMEM_BKPT;.
29780 20 20 20 20 61 73 73 65 72 74 28 20 70 46 72 6f      assert( pFro
29790 6d 2d 3e 70 53 65 6c 65 63 74 20 29 3b 0a 0a 20  m->pSelect );.. 
297a0 20 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 74     /* Check if t
297b0 68 69 73 20 69 73 20 61 20 72 65 63 75 72 73 69  his is a recursi
297c0 76 65 20 43 54 45 2e 20 2a 2f 0a 20 20 20 20 70  ve CTE. */.    p
297d0 53 65 6c 20 3d 20 70 46 72 6f 6d 2d 3e 70 53 65  Sel = pFrom->pSe
297e0 6c 65 63 74 3b 0a 20 20 20 20 62 4d 61 79 52 65  lect;.    bMayRe
297f0 63 75 72 73 69 76 65 20 3d 20 28 20 70 53 65 6c  cursive = ( pSel
29800 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 7c 7c 20  ->op==TK_ALL || 
29810 70 53 65 6c 2d 3e 6f 70 3d 3d 54 4b 5f 55 4e 49  pSel->op==TK_UNI
29820 4f 4e 20 29 3b 0a 20 20 20 20 69 66 28 20 62 4d  ON );.    if( bM
29830 61 79 52 65 63 75 72 73 69 76 65 20 29 7b 0a 20  ayRecursive ){. 
29840 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20       int i;.    
29850 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63 20    SrcList *pSrc 
29860 3d 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74  = pFrom->pSelect
29870 2d 3e 70 53 72 63 3b 0a 20 20 20 20 20 20 66 6f  ->pSrc;.      fo
29880 72 28 69 3d 30 3b 20 69 3c 70 53 72 63 2d 3e 6e  r(i=0; i<pSrc->n
29890 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Src; i++){.     
298a0 20 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73     struct SrcLis
298b0 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20  t_item *pItem = 
298c0 26 70 53 72 63 2d 3e 61 5b 69 5d 3b 0a 20 20 20  &pSrc->a[i];.   
298d0 20 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e       if( pItem->
298e0 7a 44 61 74 61 62 61 73 65 3d 3d 30 20 0a 20 20  zDatabase==0 .  
298f0 20 20 20 20 20 20 20 26 26 20 70 49 74 65 6d 2d         && pItem-
29900 3e 7a 4e 61 6d 65 21 3d 30 20 0a 20 20 20 20 20  >zName!=0 .     
29910 20 20 20 20 26 26 20 30 3d 3d 73 71 6c 69 74 65      && 0==sqlite
29920 33 53 74 72 49 43 6d 70 28 70 49 74 65 6d 2d 3e  3StrICmp(pItem->
29930 7a 4e 61 6d 65 2c 20 70 43 74 65 2d 3e 7a 4e 61  zName, pCte->zNa
29940 6d 65 29 0a 20 20 20 20 20 20 20 20 20 20 29 7b  me).          ){
29950 0a 20 20 20 20 20 20 20 20 20 20 70 49 74 65 6d  .          pItem
29960 2d 3e 70 54 61 62 20 3d 20 70 54 61 62 3b 0a 20  ->pTab = pTab;. 
29970 20 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e           pItem->
29980 66 67 2e 69 73 52 65 63 75 72 73 69 76 65 20 3d  fg.isRecursive =
29990 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 70 54   1;.          pT
299a0 61 62 2d 3e 6e 54 61 62 52 65 66 2b 2b 3b 0a 20  ab->nTabRef++;. 
299b0 20 20 20 20 20 20 20 20 20 70 53 65 6c 2d 3e 73           pSel->s
299c0 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f 52 65  elFlags |= SF_Re
299d0 63 75 72 73 69 76 65 3b 0a 20 20 20 20 20 20 20  cursive;.       
299e0 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
299f0 0a 0a 20 20 20 20 2f 2a 20 4f 6e 6c 79 20 6f 6e  ..    /* Only on
29a00 65 20 72 65 63 75 72 73 69 76 65 20 72 65 66 65  e recursive refe
29a10 72 65 6e 63 65 20 69 73 20 70 65 72 6d 69 74 74  rence is permitt
29a20 65 64 2e 20 2a 2f 20 0a 20 20 20 20 69 66 28 20  ed. */ .    if( 
29a30 70 54 61 62 2d 3e 6e 54 61 62 52 65 66 3e 32 20  pTab->nTabRef>2 
29a40 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
29a50 45 72 72 6f 72 4d 73 67 28 0a 20 20 20 20 20 20  ErrorMsg(.      
29a60 20 20 20 20 70 50 61 72 73 65 2c 20 22 6d 75 6c      pParse, "mul
29a70 74 69 70 6c 65 20 72 65 66 65 72 65 6e 63 65 73  tiple references
29a80 20 74 6f 20 72 65 63 75 72 73 69 76 65 20 74 61   to recursive ta
29a90 62 6c 65 3a 20 25 73 22 2c 20 70 43 74 65 2d 3e  ble: %s", pCte->
29aa0 7a 4e 61 6d 65 0a 20 20 20 20 20 20 29 3b 0a 20  zName.      );. 
29ab0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
29ac0 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  TE_ERROR;.    }.
29ad0 20 20 20 20 61 73 73 65 72 74 28 20 70 54 61 62      assert( pTab
29ae0 2d 3e 6e 54 61 62 52 65 66 3d 3d 31 20 7c 7c 20  ->nTabRef==1 || 
29af0 0a 20 20 20 20 20 20 20 20 20 20 20 20 28 28 70  .            ((p
29b00 53 65 6c 2d 3e 73 65 6c 46 6c 61 67 73 26 53 46  Sel->selFlags&SF
29b10 5f 52 65 63 75 72 73 69 76 65 29 20 26 26 20 70  _Recursive) && p
29b20 54 61 62 2d 3e 6e 54 61 62 52 65 66 3d 3d 32 20  Tab->nTabRef==2 
29b30 29 29 3b 0a 0a 20 20 20 20 70 43 74 65 2d 3e 7a  ));..    pCte->z
29b40 43 74 65 45 72 72 20 3d 20 22 63 69 72 63 75 6c  CteErr = "circul
29b50 61 72 20 72 65 66 65 72 65 6e 63 65 3a 20 25 73  ar reference: %s
29b60 22 3b 0a 20 20 20 20 70 53 61 76 65 64 57 69 74  ";.    pSavedWit
29b70 68 20 3d 20 70 50 61 72 73 65 2d 3e 70 57 69 74  h = pParse->pWit
29b80 68 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 70  h;.    pParse->p
29b90 57 69 74 68 20 3d 20 70 57 69 74 68 3b 0a 20 20  With = pWith;.  
29ba0 20 20 69 66 28 20 62 4d 61 79 52 65 63 75 72 73    if( bMayRecurs
29bb0 69 76 65 20 29 7b 0a 20 20 20 20 20 20 53 65 6c  ive ){.      Sel
29bc0 65 63 74 20 2a 70 50 72 69 6f 72 20 3d 20 70 53  ect *pPrior = pS
29bd0 65 6c 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20  el->pPrior;.    
29be0 20 20 61 73 73 65 72 74 28 20 70 50 72 69 6f 72    assert( pPrior
29bf0 2d 3e 70 57 69 74 68 3d 3d 30 20 29 3b 0a 20 20  ->pWith==0 );.  
29c00 20 20 20 20 70 50 72 69 6f 72 2d 3e 70 57 69 74      pPrior->pWit
29c10 68 20 3d 20 70 53 65 6c 2d 3e 70 57 69 74 68 3b  h = pSel->pWith;
29c20 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 57 61  .      sqlite3Wa
29c30 6c 6b 53 65 6c 65 63 74 28 70 57 61 6c 6b 65 72  lkSelect(pWalker
29c40 2c 20 70 50 72 69 6f 72 29 3b 0a 20 20 20 20 20  , pPrior);.     
29c50 20 70 50 72 69 6f 72 2d 3e 70 57 69 74 68 20 3d   pPrior->pWith =
29c60 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   0;.    }else{. 
29c70 20 20 20 20 20 73 71 6c 69 74 65 33 57 61 6c 6b       sqlite3Walk
29c80 53 65 6c 65 63 74 28 70 57 61 6c 6b 65 72 2c 20  Select(pWalker, 
29c90 70 53 65 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20  pSel);.    }.   
29ca0 20 70 50 61 72 73 65 2d 3e 70 57 69 74 68 20 3d   pParse->pWith =
29cb0 20 70 57 69 74 68 3b 0a 0a 20 20 20 20 66 6f 72   pWith;..    for
29cc0 28 70 4c 65 66 74 3d 70 53 65 6c 3b 20 70 4c 65  (pLeft=pSel; pLe
29cd0 66 74 2d 3e 70 50 72 69 6f 72 3b 20 70 4c 65 66  ft->pPrior; pLef
29ce0 74 3d 70 4c 65 66 74 2d 3e 70 50 72 69 6f 72 29  t=pLeft->pPrior)
29cf0 3b 0a 20 20 20 20 70 45 4c 69 73 74 20 3d 20 70  ;.    pEList = p
29d00 4c 65 66 74 2d 3e 70 45 4c 69 73 74 3b 0a 20 20  Left->pEList;.  
29d10 20 20 69 66 28 20 70 43 74 65 2d 3e 70 43 6f 6c    if( pCte->pCol
29d20 73 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  s ){.      if( p
29d30 45 4c 69 73 74 20 26 26 20 70 45 4c 69 73 74 2d  EList && pEList-
29d40 3e 6e 45 78 70 72 21 3d 70 43 74 65 2d 3e 70 43  >nExpr!=pCte->pC
29d50 6f 6c 73 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20  ols->nExpr ){.  
29d60 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
29d70 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74  orMsg(pParse, "t
29d80 61 62 6c 65 20 25 73 20 68 61 73 20 25 64 20 76  able %s has %d v
29d90 61 6c 75 65 73 20 66 6f 72 20 25 64 20 63 6f 6c  alues for %d col
29da0 75 6d 6e 73 22 2c 0a 20 20 20 20 20 20 20 20 20  umns",.         
29db0 20 20 20 70 43 74 65 2d 3e 7a 4e 61 6d 65 2c 20     pCte->zName, 
29dc0 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 20 70  pEList->nExpr, p
29dd0 43 74 65 2d 3e 70 43 6f 6c 73 2d 3e 6e 45 78 70  Cte->pCols->nExp
29de0 72 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20  r.        );.   
29df0 20 20 20 20 20 70 50 61 72 73 65 2d 3e 70 57 69       pParse->pWi
29e00 74 68 20 3d 20 70 53 61 76 65 64 57 69 74 68 3b  th = pSavedWith;
29e10 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
29e20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
29e30 20 20 20 20 7d 0a 20 20 20 20 20 20 70 45 4c 69      }.      pELi
29e40 73 74 20 3d 20 70 43 74 65 2d 3e 70 43 6f 6c 73  st = pCte->pCols
29e50 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 73 71 6c  ;.    }..    sql
29e60 69 74 65 33 43 6f 6c 75 6d 6e 73 46 72 6f 6d 45  ite3ColumnsFromE
29e70 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20  xprList(pParse, 
29e80 70 45 4c 69 73 74 2c 20 26 70 54 61 62 2d 3e 6e  pEList, &pTab->n
29e90 43 6f 6c 2c 20 26 70 54 61 62 2d 3e 61 43 6f 6c  Col, &pTab->aCol
29ea0 29 3b 0a 20 20 20 20 69 66 28 20 62 4d 61 79 52  );.    if( bMayR
29eb0 65 63 75 72 73 69 76 65 20 29 7b 0a 20 20 20 20  ecursive ){.    
29ec0 20 20 69 66 28 20 70 53 65 6c 2d 3e 73 65 6c 46    if( pSel->selF
29ed0 6c 61 67 73 20 26 20 53 46 5f 52 65 63 75 72 73  lags & SF_Recurs
29ee0 69 76 65 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ive ){.        p
29ef0 43 74 65 2d 3e 7a 43 74 65 45 72 72 20 3d 20 22  Cte->zCteErr = "
29f00 6d 75 6c 74 69 70 6c 65 20 72 65 63 75 72 73 69  multiple recursi
29f10 76 65 20 72 65 66 65 72 65 6e 63 65 73 3a 20 25  ve references: %
29f20 73 22 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  s";.      }else{
29f30 0a 20 20 20 20 20 20 20 20 70 43 74 65 2d 3e 7a  .        pCte->z
29f40 43 74 65 45 72 72 20 3d 20 22 72 65 63 75 72 73  CteErr = "recurs
29f50 69 76 65 20 72 65 66 65 72 65 6e 63 65 20 69 6e  ive reference in
29f60 20 61 20 73 75 62 71 75 65 72 79 3a 20 25 73 22   a subquery: %s"
29f70 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
29f80 73 71 6c 69 74 65 33 57 61 6c 6b 53 65 6c 65 63  sqlite3WalkSelec
29f90 74 28 70 57 61 6c 6b 65 72 2c 20 70 53 65 6c 29  t(pWalker, pSel)
29fa0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 43 74 65  ;.    }.    pCte
29fb0 2d 3e 7a 43 74 65 45 72 72 20 3d 20 30 3b 0a 20  ->zCteErr = 0;. 
29fc0 20 20 20 70 50 61 72 73 65 2d 3e 70 57 69 74 68     pParse->pWith
29fd0 20 3d 20 70 53 61 76 65 64 57 69 74 68 3b 0a 20   = pSavedWith;. 
29fe0 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c   }..  return SQL
29ff0 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66  ITE_OK;.}.#endif
2a000 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
2a010 5f 4f 4d 49 54 5f 43 54 45 0a 2f 2a 0a 2a 2a 20  _OMIT_CTE./*.** 
2a020 49 66 20 74 68 65 20 53 45 4c 45 43 54 20 70 61  If the SELECT pa
2a030 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f  ssed as the seco
2a040 6e 64 20 61 72 67 75 6d 65 6e 74 20 68 61 73 20  nd argument has 
2a050 61 6e 20 61 73 73 6f 63 69 61 74 65 64 20 57 49  an associated WI
2a060 54 48 20 0a 2a 2a 20 63 6c 61 75 73 65 2c 20 70  TH .** clause, p
2a070 6f 70 20 69 74 20 66 72 6f 6d 20 74 68 65 20 73  op it from the s
2a080 74 61 63 6b 20 73 74 6f 72 65 64 20 61 73 20 70  tack stored as p
2a090 61 72 74 20 6f 66 20 74 68 65 20 50 61 72 73 65  art of the Parse
2a0a0 20 6f 62 6a 65 63 74 2e 0a 2a 2a 0a 2a 2a 20 54   object..**.** T
2a0b0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
2a0c0 75 73 65 64 20 61 73 20 74 68 65 20 78 53 65 6c  used as the xSel
2a0d0 65 63 74 43 61 6c 6c 62 61 63 6b 32 28 29 20 63  ectCallback2() c
2a0e0 61 6c 6c 62 61 63 6b 20 62 79 0a 2a 2a 20 73 71  allback by.** sq
2a0f0 6c 69 74 65 33 53 65 6c 65 63 74 45 78 70 61 6e  lite3SelectExpan
2a100 64 28 29 20 77 68 65 6e 20 77 61 6c 6b 69 6e 67  d() when walking
2a110 20 61 20 53 45 4c 45 43 54 20 74 72 65 65 20 74   a SELECT tree t
2a120 6f 20 72 65 73 6f 6c 76 65 20 74 61 62 6c 65 0a  o resolve table.
2a130 2a 2a 20 6e 61 6d 65 73 20 61 6e 64 20 6f 74 68  ** names and oth
2a140 65 72 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 65  er FROM clause e
2a150 6c 65 6d 65 6e 74 73 2e 20 0a 2a 2f 0a 73 74 61  lements. .*/.sta
2a160 74 69 63 20 76 6f 69 64 20 73 65 6c 65 63 74 50  tic void selectP
2a170 6f 70 57 69 74 68 28 57 61 6c 6b 65 72 20 2a 70  opWith(Walker *p
2a180 57 61 6c 6b 65 72 2c 20 53 65 6c 65 63 74 20 2a  Walker, Select *
2a190 70 29 7b 0a 20 20 50 61 72 73 65 20 2a 70 50 61  p){.  Parse *pPa
2a1a0 72 73 65 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 70  rse = pWalker->p
2a1b0 50 61 72 73 65 3b 0a 20 20 69 66 28 20 4f 4b 5f  Parse;.  if( OK_
2a1c0 49 46 5f 41 4c 57 41 59 53 5f 54 52 55 45 28 70  IF_ALWAYS_TRUE(p
2a1d0 50 61 72 73 65 2d 3e 70 57 69 74 68 29 20 26 26  Parse->pWith) &&
2a1e0 20 70 2d 3e 70 50 72 69 6f 72 3d 3d 30 20 29 7b   p->pPrior==0 ){
2a1f0 0a 20 20 20 20 57 69 74 68 20 2a 70 57 69 74 68  .    With *pWith
2a200 20 3d 20 66 69 6e 64 52 69 67 68 74 6d 6f 73 74   = findRightmost
2a210 28 70 29 2d 3e 70 57 69 74 68 3b 0a 20 20 20 20  (p)->pWith;.    
2a220 69 66 28 20 70 57 69 74 68 21 3d 30 20 29 7b 0a  if( pWith!=0 ){.
2a230 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
2a240 61 72 73 65 2d 3e 70 57 69 74 68 3d 3d 70 57 69  arse->pWith==pWi
2a250 74 68 20 29 3b 0a 20 20 20 20 20 20 70 50 61 72  th );.      pPar
2a260 73 65 2d 3e 70 57 69 74 68 20 3d 20 70 57 69 74  se->pWith = pWit
2a270 68 2d 3e 70 4f 75 74 65 72 3b 0a 20 20 20 20 7d  h->pOuter;.    }
2a280 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23 64 65  .  }.}.#else.#de
2a290 66 69 6e 65 20 73 65 6c 65 63 74 50 6f 70 57 69  fine selectPopWi
2a2a0 74 68 20 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  th 0.#endif../*.
2a2b0 2a 2a 20 54 68 65 20 53 72 63 4c 69 73 74 5f 69  ** The SrcList_i
2a2c0 74 65 6d 20 73 74 72 75 63 74 75 72 65 20 70 61  tem structure pa
2a2d0 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f  ssed as the seco
2a2e0 6e 64 20 61 72 67 75 6d 65 6e 74 20 72 65 70 72  nd argument repr
2a2f0 65 73 65 6e 74 73 20 61 0a 2a 2a 20 73 75 62 2d  esents a.** sub-
2a300 71 75 65 72 79 20 69 6e 20 74 68 65 20 46 52 4f  query in the FRO
2a310 4d 20 63 6c 61 75 73 65 20 6f 66 20 61 20 53 45  M clause of a SE
2a320 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 20  LECT statement. 
2a330 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a  This function.**
2a340 20 61 6c 6c 6f 63 61 74 65 73 20 61 6e 64 20 70   allocates and p
2a350 6f 70 75 6c 61 74 65 73 20 74 68 65 20 53 72 63  opulates the Src
2a360 4c 69 73 74 5f 69 74 65 6d 2e 70 54 61 62 20 6f  List_item.pTab o
2a370 62 6a 65 63 74 2e 20 49 66 20 73 75 63 63 65 73  bject. If succes
2a380 73 66 75 6c 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f  sful,.** SQLITE_
2a390 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  OK is returned. 
2a3a0 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 61 6e  Otherwise, if an
2a3b0 20 4f 4f 4d 20 65 72 72 6f 72 20 69 73 20 65 6e   OOM error is en
2a3c0 63 6f 75 6e 74 65 72 65 64 2c 0a 2a 2a 20 53 51  countered,.** SQ
2a3d0 4c 49 54 45 5f 4e 4f 4d 45 4d 2e 0a 2a 2f 0a 69  LITE_NOMEM..*/.i
2a3e0 6e 74 20 73 71 6c 69 74 65 33 45 78 70 61 6e 64  nt sqlite3Expand
2a3f0 53 75 62 71 75 65 72 79 28 50 61 72 73 65 20 2a  Subquery(Parse *
2a400 70 50 61 72 73 65 2c 20 73 74 72 75 63 74 20 53  pParse, struct S
2a410 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 46 72  rcList_item *pFr
2a420 6f 6d 29 7b 0a 20 20 53 65 6c 65 63 74 20 2a 70  om){.  Select *p
2a430 53 65 6c 20 3d 20 70 46 72 6f 6d 2d 3e 70 53 65  Sel = pFrom->pSe
2a440 6c 65 63 74 3b 0a 20 20 54 61 62 6c 65 20 2a 70  lect;.  Table *p
2a450 54 61 62 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  Tab;..  assert( 
2a460 70 53 65 6c 20 29 3b 0a 20 20 70 46 72 6f 6d 2d  pSel );.  pFrom-
2a470 3e 70 54 61 62 20 3d 20 70 54 61 62 20 3d 20 73  >pTab = pTab = s
2a480 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65  qlite3DbMallocZe
2a490 72 6f 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 73  ro(pParse->db, s
2a4a0 69 7a 65 6f 66 28 54 61 62 6c 65 29 29 3b 0a 20  izeof(Table));. 
2a4b0 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29 20 72   if( pTab==0 ) r
2a4c0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
2a4d0 45 4d 3b 0a 20 20 70 54 61 62 2d 3e 6e 54 61 62  EM;.  pTab->nTab
2a4e0 52 65 66 20 3d 20 31 3b 0a 20 20 69 66 28 20 70  Ref = 1;.  if( p
2a4f0 46 72 6f 6d 2d 3e 7a 41 6c 69 61 73 20 29 7b 0a  From->zAlias ){.
2a500 20 20 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 20      pTab->zName 
2a510 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75  = sqlite3DbStrDu
2a520 70 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 46  p(pParse->db, pF
2a530 72 6f 6d 2d 3e 7a 41 6c 69 61 73 29 3b 0a 20 20  rom->zAlias);.  
2a540 7d 65 6c 73 65 7b 0a 20 20 20 20 70 54 61 62 2d  }else{.    pTab-
2a550 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33  >zName = sqlite3
2a560 4d 50 72 69 6e 74 66 28 70 50 61 72 73 65 2d 3e  MPrintf(pParse->
2a570 64 62 2c 20 22 73 75 62 71 75 65 72 79 5f 25 75  db, "subquery_%u
2a580 22 2c 20 70 53 65 6c 2d 3e 73 65 6c 49 64 29 3b  ", pSel->selId);
2a590 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28 20 70 53  .  }.  while( pS
2a5a0 65 6c 2d 3e 70 50 72 69 6f 72 20 29 7b 20 70 53  el->pPrior ){ pS
2a5b0 65 6c 20 3d 20 70 53 65 6c 2d 3e 70 50 72 69 6f  el = pSel->pPrio
2a5c0 72 3b 20 7d 0a 20 20 73 71 6c 69 74 65 33 43 6f  r; }.  sqlite3Co
2a5d0 6c 75 6d 6e 73 46 72 6f 6d 45 78 70 72 4c 69 73  lumnsFromExprLis
2a5e0 74 28 70 50 61 72 73 65 2c 20 70 53 65 6c 2d 3e  t(pParse, pSel->
2a5f0 70 45 4c 69 73 74 2c 26 70 54 61 62 2d 3e 6e 43  pEList,&pTab->nC
2a600 6f 6c 2c 26 70 54 61 62 2d 3e 61 43 6f 6c 29 3b  ol,&pTab->aCol);
2a610 0a 20 20 70 54 61 62 2d 3e 69 50 4b 65 79 20 3d  .  pTab->iPKey =
2a620 20 2d 31 3b 0a 20 20 70 54 61 62 2d 3e 6e 52 6f   -1;.  pTab->nRo
2a630 77 4c 6f 67 45 73 74 20 3d 20 32 30 30 3b 20 61  wLogEst = 200; a
2a640 73 73 65 72 74 28 20 32 30 30 3d 3d 73 71 6c 69  ssert( 200==sqli
2a650 74 65 33 4c 6f 67 45 73 74 28 31 30 34 38 35 37  te3LogEst(104857
2a660 36 29 20 29 3b 0a 20 20 70 54 61 62 2d 3e 74 61  6) );.  pTab->ta
2a670 62 46 6c 61 67 73 20 7c 3d 20 54 46 5f 45 70 68  bFlags |= TF_Eph
2a680 65 6d 65 72 61 6c 3b 0a 0a 20 20 72 65 74 75 72  emeral;..  retur
2a690 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
2a6a0 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
2a6b0 6e 65 20 69 73 20 61 20 57 61 6c 6b 65 72 20 63  ne is a Walker c
2a6c0 61 6c 6c 62 61 63 6b 20 66 6f 72 20 22 65 78 70  allback for "exp
2a6d0 61 6e 64 69 6e 67 22 20 61 20 53 45 4c 45 43 54  anding" a SELECT
2a6e0 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 22   statement..** "
2a6f0 45 78 70 61 6e 64 69 6e 67 22 20 6d 65 61 6e 73  Expanding" means
2a700 20 74 6f 20 64 6f 20 74 68 65 20 66 6f 6c 6c 6f   to do the follo
2a710 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 28  wing:.**.**    (
2a720 31 29 20 20 4d 61 6b 65 20 73 75 72 65 20 56 44  1)  Make sure VD
2a730 42 45 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72  BE cursor number
2a740 73 20 68 61 76 65 20 62 65 65 6e 20 61 73 73 69  s have been assi
2a750 67 6e 65 64 20 74 6f 20 65 76 65 72 79 0a 2a 2a  gned to every.**
2a760 20 20 20 20 20 20 20 20 20 65 6c 65 6d 65 6e 74           element
2a770 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   of the FROM cla
2a780 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 32  use..**.**    (2
2a790 29 20 20 46 69 6c 6c 20 69 6e 20 74 68 65 20 70  )  Fill in the p
2a7a0 54 61 62 4c 69 73 74 2d 3e 61 5b 5d 2e 70 54 61  TabList->a[].pTa
2a7b0 62 20 66 69 65 6c 64 73 20 69 6e 20 74 68 65 20  b fields in the 
2a7c0 53 72 63 4c 69 73 74 20 74 68 61 74 20 0a 2a 2a  SrcList that .**
2a7d0 20 20 20 20 20 20 20 20 20 64 65 66 69 6e 65 73           defines
2a7e0 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20 20 57   FROM clause.  W
2a7f0 68 65 6e 20 76 69 65 77 73 20 61 70 70 65 61 72  hen views appear
2a800 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   in the FROM cla
2a810 75 73 65 2c 0a 2a 2a 20 20 20 20 20 20 20 20 20  use,.**         
2a820 66 69 6c 6c 20 70 54 61 62 4c 69 73 74 2d 3e 61  fill pTabList->a
2a830 5b 5d 2e 70 53 65 6c 65 63 74 20 77 69 74 68 20  [].pSelect with 
2a840 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 53 45  a copy of the SE
2a850 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 0a 2a  LECT statement.*
2a860 2a 20 20 20 20 20 20 20 20 20 74 68 61 74 20 69  *         that i
2a870 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65 20 76 69  mplements the vi
2a880 65 77 2e 20 20 41 20 63 6f 70 79 20 69 73 20 6d  ew.  A copy is m
2a890 61 64 65 20 6f 66 20 74 68 65 20 76 69 65 77 27  ade of the view'
2a8a0 73 20 53 45 4c 45 43 54 0a 2a 2a 20 20 20 20 20  s SELECT.**     
2a8b0 20 20 20 20 73 74 61 74 65 6d 65 6e 74 20 73 6f      statement so
2a8c0 20 74 68 61 74 20 77 65 20 63 61 6e 20 66 72 65   that we can fre
2a8d0 65 6c 79 20 6d 6f 64 69 66 79 20 6f 72 20 64 65  ely modify or de
2a8e0 6c 65 74 65 20 74 68 61 74 20 73 74 61 74 65 6d  lete that statem
2a8f0 65 6e 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 77  ent.**         w
2a900 69 74 68 6f 75 74 20 77 6f 72 72 79 69 6e 67 20  ithout worrying 
2a910 61 62 6f 75 74 20 6d 65 73 73 69 6e 67 20 75 70  about messing up
2a920 20 74 68 65 20 70 65 72 73 69 73 74 65 6e 74 20   the persistent 
2a930 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 0a 2a  representation.*
2a940 2a 20 20 20 20 20 20 20 20 20 6f 66 20 74 68 65  *         of the
2a950 20 76 69 65 77 2e 0a 2a 2a 0a 2a 2a 20 20 20 20   view..**.**    
2a960 28 33 29 20 20 41 64 64 20 74 65 72 6d 73 20 74  (3)  Add terms t
2a970 6f 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  o the WHERE clau
2a980 73 65 20 74 6f 20 61 63 63 6f 6d 6d 6f 64 61 74  se to accommodat
2a990 65 20 74 68 65 20 4e 41 54 55 52 41 4c 20 6b 65  e the NATURAL ke
2a9a0 79 77 6f 72 64 0a 2a 2a 20 20 20 20 20 20 20 20  yword.**        
2a9b0 20 6f 6e 20 6a 6f 69 6e 73 20 61 6e 64 20 74 68   on joins and th
2a9c0 65 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20 63  e ON and USING c
2a9d0 6c 61 75 73 65 20 6f 66 20 6a 6f 69 6e 73 2e 0a  lause of joins..
2a9e0 2a 2a 0a 2a 2a 20 20 20 20 28 34 29 20 20 53 63  **.**    (4)  Sc
2a9f0 61 6e 20 74 68 65 20 6c 69 73 74 20 6f 66 20 63  an the list of c
2aa00 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 72 65  olumns in the re
2aa10 73 75 6c 74 20 73 65 74 20 28 70 45 4c 69 73 74  sult set (pEList
2aa20 29 20 6c 6f 6f 6b 69 6e 67 0a 2a 2a 20 20 20 20  ) looking.**    
2aa30 20 20 20 20 20 66 6f 72 20 69 6e 73 74 61 6e 63       for instanc
2aa40 65 73 20 6f 66 20 74 68 65 20 22 2a 22 20 6f 70  es of the "*" op
2aa50 65 72 61 74 6f 72 20 6f 72 20 74 68 65 20 54 41  erator or the TA
2aa60 42 4c 45 2e 2a 20 6f 70 65 72 61 74 6f 72 2e 0a  BLE.* operator..
2aa70 2a 2a 20 20 20 20 20 20 20 20 20 49 66 20 66 6f  **         If fo
2aa80 75 6e 64 2c 20 65 78 70 61 6e 64 20 65 61 63 68  und, expand each
2aa90 20 22 2a 22 20 74 6f 20 62 65 20 65 76 65 72 79   "*" to be every
2aaa0 20 63 6f 6c 75 6d 6e 20 69 6e 20 65 76 65 72 79   column in every
2aab0 20 74 61 62 6c 65 0a 2a 2a 20 20 20 20 20 20 20   table.**       
2aac0 20 20 61 6e 64 20 54 41 42 4c 45 2e 2a 20 74 6f    and TABLE.* to
2aad0 20 62 65 20 65 76 65 72 79 20 63 6f 6c 75 6d 6e   be every column
2aae0 20 69 6e 20 54 41 42 4c 45 2e 0a 2a 2a 0a 2a 2f   in TABLE..**.*/
2aaf0 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65 6c 65  .static int sele
2ab00 63 74 45 78 70 61 6e 64 65 72 28 57 61 6c 6b 65  ctExpander(Walke
2ab10 72 20 2a 70 57 61 6c 6b 65 72 2c 20 53 65 6c 65  r *pWalker, Sele
2ab20 63 74 20 2a 70 29 7b 0a 20 20 50 61 72 73 65 20  ct *p){.  Parse 
2ab30 2a 70 50 61 72 73 65 20 3d 20 70 57 61 6c 6b 65  *pParse = pWalke
2ab40 72 2d 3e 70 50 61 72 73 65 3b 0a 20 20 69 6e 74  r->pParse;.  int
2ab50 20 69 2c 20 6a 2c 20 6b 3b 0a 20 20 53 72 63 4c   i, j, k;.  SrcL
2ab60 69 73 74 20 2a 70 54 61 62 4c 69 73 74 3b 0a 20  ist *pTabList;. 
2ab70 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73   ExprList *pELis
2ab80 74 3b 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c  t;.  struct SrcL
2ab90 69 73 74 5f 69 74 65 6d 20 2a 70 46 72 6f 6d 3b  ist_item *pFrom;
2aba0 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
2abb0 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 45   pParse->db;.  E
2abc0 78 70 72 20 2a 70 45 2c 20 2a 70 52 69 67 68 74  xpr *pE, *pRight
2abd0 2c 20 2a 70 45 78 70 72 3b 0a 20 20 75 31 36 20  , *pExpr;.  u16 
2abe0 73 65 6c 46 6c 61 67 73 20 3d 20 70 2d 3e 73 65  selFlags = p->se
2abf0 6c 46 6c 61 67 73 3b 0a 20 20 75 33 32 20 65 6c  lFlags;.  u32 el
2ac00 69 73 74 46 6c 61 67 73 20 3d 20 30 3b 0a 0a 20  istFlags = 0;.. 
2ac10 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20   p->selFlags |= 
2ac20 53 46 5f 45 78 70 61 6e 64 65 64 3b 0a 20 20 69  SF_Expanded;.  i
2ac30 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  f( db->mallocFai
2ac40 6c 65 64 20 20 29 7b 0a 20 20 20 20 72 65 74 75  led  ){.    retu
2ac50 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20  rn WRC_Abort;.  
2ac60 7d 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70  }.  assert( p->p
2ac70 53 72 63 21 3d 30 20 29 3b 0a 20 20 69 66 28 20  Src!=0 );.  if( 
2ac80 28 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 45  (selFlags & SF_E
2ac90 78 70 61 6e 64 65 64 29 21 3d 30 20 29 7b 0a 20  xpanded)!=0 ){. 
2aca0 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 50 72     return WRC_Pr
2acb0 75 6e 65 3b 0a 20 20 7d 0a 20 20 70 54 61 62 4c  une;.  }.  pTabL
2acc0 69 73 74 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20  ist = p->pSrc;. 
2acd0 20 70 45 4c 69 73 74 20 3d 20 70 2d 3e 70 45 4c   pEList = p->pEL
2ace0 69 73 74 3b 0a 20 20 73 71 6c 69 74 65 33 57 69  ist;.  sqlite3Wi
2acf0 74 68 50 75 73 68 28 70 50 61 72 73 65 2c 20 70  thPush(pParse, p
2ad00 2d 3e 70 57 69 74 68 2c 20 30 29 3b 0a 0a 20 20  ->pWith, 0);..  
2ad10 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 63 75 72  /* Make sure cur
2ad20 73 6f 72 20 6e 75 6d 62 65 72 73 20 68 61 76 65  sor numbers have
2ad30 20 62 65 65 6e 20 61 73 73 69 67 6e 65 64 20 74   been assigned t
2ad40 6f 20 61 6c 6c 20 65 6e 74 72 69 65 73 20 69 6e  o all entries in
2ad50 0a 20 20 2a 2a 20 74 68 65 20 46 52 4f 4d 20 63  .  ** the FROM c
2ad60 6c 61 75 73 65 20 6f 66 20 74 68 65 20 53 45 4c  lause of the SEL
2ad70 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a 20  ECT statement.. 
2ad80 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 53 72 63   */.  sqlite3Src
2ad90 4c 69 73 74 41 73 73 69 67 6e 43 75 72 73 6f 72  ListAssignCursor
2ada0 73 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69  s(pParse, pTabLi
2adb0 73 74 29 3b 0a 0a 20 20 2f 2a 20 4c 6f 6f 6b 20  st);..  /* Look 
2adc0 75 70 20 65 76 65 72 79 20 74 61 62 6c 65 20 6e  up every table n
2add0 61 6d 65 64 20 69 6e 20 74 68 65 20 46 52 4f 4d  amed in the FROM
2ade0 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 73   clause of the s
2adf0 65 6c 65 63 74 2e 20 20 49 66 0a 20 20 2a 2a 20  elect.  If.  ** 
2ae00 61 6e 20 65 6e 74 72 79 20 6f 66 20 74 68 65 20  an entry of the 
2ae10 46 52 4f 4d 20 63 6c 61 75 73 65 20 69 73 20 61  FROM clause is a
2ae20 20 73 75 62 71 75 65 72 79 20 69 6e 73 74 65 61   subquery instea
2ae30 64 20 6f 66 20 61 20 74 61 62 6c 65 20 6f 72 20  d of a table or 
2ae40 76 69 65 77 2c 0a 20 20 2a 2a 20 74 68 65 6e 20  view,.  ** then 
2ae50 63 72 65 61 74 65 20 61 20 74 72 61 6e 73 69 65  create a transie
2ae60 6e 74 20 74 61 62 6c 65 20 73 74 72 75 63 74 75  nt table structu
2ae70 72 65 20 74 6f 20 64 65 73 63 72 69 62 65 20 74  re to describe t
2ae80 68 65 20 73 75 62 71 75 65 72 79 2e 0a 20 20 2a  he subquery..  *
2ae90 2f 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 46 72  /.  for(i=0, pFr
2aea0 6f 6d 3d 70 54 61 62 4c 69 73 74 2d 3e 61 3b 20  om=pTabList->a; 
2aeb0 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63  i<pTabList->nSrc
2aec0 3b 20 69 2b 2b 2c 20 70 46 72 6f 6d 2b 2b 29 7b  ; i++, pFrom++){
2aed0 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62  .    Table *pTab
2aee0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 46  ;.    assert( pF
2aef0 72 6f 6d 2d 3e 66 67 2e 69 73 52 65 63 75 72 73  rom->fg.isRecurs
2af00 69 76 65 3d 3d 30 20 7c 7c 20 70 46 72 6f 6d 2d  ive==0 || pFrom-
2af10 3e 70 54 61 62 21 3d 30 20 29 3b 0a 20 20 20 20  >pTab!=0 );.    
2af20 69 66 28 20 70 46 72 6f 6d 2d 3e 66 67 2e 69 73  if( pFrom->fg.is
2af30 52 65 63 75 72 73 69 76 65 20 29 20 63 6f 6e 74  Recursive ) cont
2af40 69 6e 75 65 3b 0a 20 20 20 20 61 73 73 65 72 74  inue;.    assert
2af50 28 20 70 46 72 6f 6d 2d 3e 70 54 61 62 3d 3d 30  ( pFrom->pTab==0
2af60 20 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   );.#ifndef SQLI
2af70 54 45 5f 4f 4d 49 54 5f 43 54 45 0a 20 20 20 20  TE_OMIT_CTE.    
2af80 69 66 28 20 77 69 74 68 45 78 70 61 6e 64 28 70  if( withExpand(p
2af90 57 61 6c 6b 65 72 2c 20 70 46 72 6f 6d 29 20 29  Walker, pFrom) )
2afa0 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72   return WRC_Abor
2afb0 74 3b 0a 20 20 20 20 69 66 28 20 70 46 72 6f 6d  t;.    if( pFrom
2afc0 2d 3e 70 54 61 62 20 29 20 7b 7d 20 65 6c 73 65  ->pTab ) {} else
2afd0 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20  .#endif.    if( 
2afe0 70 46 72 6f 6d 2d 3e 7a 4e 61 6d 65 3d 3d 30 20  pFrom->zName==0 
2aff0 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ){.#ifndef SQLIT
2b000 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a  E_OMIT_SUBQUERY.
2b010 20 20 20 20 20 20 53 65 6c 65 63 74 20 2a 70 53        Select *pS
2b020 65 6c 20 3d 20 70 46 72 6f 6d 2d 3e 70 53 65 6c  el = pFrom->pSel
2b030 65 63 74 3b 0a 20 20 20 20 20 20 2f 2a 20 41 20  ect;.      /* A 
2b040 73 75 62 2d 71 75 65 72 79 20 69 6e 20 74 68 65  sub-query in the
2b050 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20   FROM clause of 
2b060 61 20 53 45 4c 45 43 54 20 2a 2f 0a 20 20 20 20  a SELECT */.    
2b070 20 20 61 73 73 65 72 74 28 20 70 53 65 6c 21 3d    assert( pSel!=
2b080 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  0 );.      asser
2b090 74 28 20 70 46 72 6f 6d 2d 3e 70 54 61 62 3d 3d  t( pFrom->pTab==
2b0a0 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73  0 );.      if( s
2b0b0 71 6c 69 74 65 33 57 61 6c 6b 53 65 6c 65 63 74  qlite3WalkSelect
2b0c0 28 70 57 61 6c 6b 65 72 2c 20 70 53 65 6c 29 20  (pWalker, pSel) 
2b0d0 29 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f  ) return WRC_Abo
2b0e0 72 74 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71  rt;.      if( sq
2b0f0 6c 69 74 65 33 45 78 70 61 6e 64 53 75 62 71 75  lite3ExpandSubqu
2b100 65 72 79 28 70 50 61 72 73 65 2c 20 70 46 72 6f  ery(pParse, pFro
2b110 6d 29 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f  m) ) return WRC_
2b120 41 62 6f 72 74 3b 0a 23 65 6e 64 69 66 0a 20 20  Abort;.#endif.  
2b130 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f    }else{.      /
2b140 2a 20 41 6e 20 6f 72 64 69 6e 61 72 79 20 74 61  * An ordinary ta
2b150 62 6c 65 20 6f 72 20 76 69 65 77 20 6e 61 6d 65  ble or view name
2b160 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   in the FROM cla
2b170 75 73 65 20 2a 2f 0a 20 20 20 20 20 20 61 73 73  use */.      ass
2b180 65 72 74 28 20 70 46 72 6f 6d 2d 3e 70 54 61 62  ert( pFrom->pTab
2b190 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 46 72  ==0 );.      pFr
2b1a0 6f 6d 2d 3e 70 54 61 62 20 3d 20 70 54 61 62 20  om->pTab = pTab 
2b1b0 3d 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 54  = sqlite3LocateT
2b1c0 61 62 6c 65 49 74 65 6d 28 70 50 61 72 73 65 2c  ableItem(pParse,
2b1d0 20 30 2c 20 70 46 72 6f 6d 29 3b 0a 20 20 20 20   0, pFrom);.    
2b1e0 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29 20    if( pTab==0 ) 
2b1f0 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74  return WRC_Abort
2b200 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54 61 62  ;.      if( pTab
2b210 2d 3e 6e 54 61 62 52 65 66 3e 3d 30 78 66 66 66  ->nTabRef>=0xfff
2b220 66 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  f ){.        sql
2b230 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
2b240 72 73 65 2c 20 22 74 6f 6f 20 6d 61 6e 79 20 72  rse, "too many r
2b250 65 66 65 72 65 6e 63 65 73 20 74 6f 20 5c 22 25  eferences to \"%
2b260 73 5c 22 3a 20 6d 61 78 20 36 35 35 33 35 22 2c  s\": max 65535",
2b270 0a 20 20 20 20 20 20 20 20 20 20 20 70 54 61 62  .           pTab
2b280 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ->zName);.      
2b290 20 20 70 46 72 6f 6d 2d 3e 70 54 61 62 20 3d 20    pFrom->pTab = 
2b2a0 30 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  0;.        retur
2b2b0 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20  n WRC_Abort;.   
2b2c0 20 20 20 7d 0a 20 20 20 20 20 20 70 54 61 62 2d     }.      pTab-
2b2d0 3e 6e 54 61 62 52 65 66 2b 2b 3b 0a 20 20 20 20  >nTabRef++;.    
2b2e0 20 20 69 66 28 20 21 49 73 56 69 72 74 75 61 6c    if( !IsVirtual
2b2f0 28 70 54 61 62 29 20 26 26 20 63 61 6e 6e 6f 74  (pTab) && cannot
2b300 42 65 46 75 6e 63 74 69 6f 6e 28 70 50 61 72 73  BeFunction(pPars
2b310 65 2c 20 70 46 72 6f 6d 29 20 29 7b 0a 20 20 20  e, pFrom) ){.   
2b320 20 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f       return WRC_
2b330 41 62 6f 72 74 3b 0a 20 20 20 20 20 20 7d 0a 23  Abort;.      }.#
2b340 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
2b350 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20 7c 7c  TE_OMIT_VIEW) ||
2b360 20 21 64 65 66 69 6e 65 64 20 28 53 51 4c 49 54   !defined (SQLIT
2b370 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
2b380 42 4c 45 29 0a 20 20 20 20 20 20 69 66 28 20 49  BLE).      if( I
2b390 73 56 69 72 74 75 61 6c 28 70 54 61 62 29 20 7c  sVirtual(pTab) |
2b3a0 7c 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 20  | pTab->pSelect 
2b3b0 29 7b 0a 20 20 20 20 20 20 20 20 69 31 36 20 6e  ){.        i16 n
2b3c0 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20 69 66 28  Col;.        if(
2b3d0 20 73 71 6c 69 74 65 33 56 69 65 77 47 65 74 43   sqlite3ViewGetC
2b3e0 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73  olumnNames(pPars
2b3f0 65 2c 20 70 54 61 62 29 20 29 20 72 65 74 75 72  e, pTab) ) retur
2b400 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20  n WRC_Abort;.   
2b410 20 20 20 20 20 61 73 73 65 72 74 28 20 70 46 72       assert( pFr
2b420 6f 6d 2d 3e 70 53 65 6c 65 63 74 3d 3d 30 20 29  om->pSelect==0 )
2b430 3b 0a 20 20 20 20 20 20 20 20 70 46 72 6f 6d 2d  ;.        pFrom-
2b440 3e 70 53 65 6c 65 63 74 20 3d 20 73 71 6c 69 74  >pSelect = sqlit
2b450 65 33 53 65 6c 65 63 74 44 75 70 28 64 62 2c 20  e3SelectDup(db, 
2b460 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 2c 20 30  pTab->pSelect, 0
2b470 29 3b 0a 20 20 20 20 20 20 20 20 6e 43 6f 6c 20  );.        nCol 
2b480 3d 20 70 54 61 62 2d 3e 6e 43 6f 6c 3b 0a 20 20  = pTab->nCol;.  
2b490 20 20 20 20 20 20 70 54 61 62 2d 3e 6e 43 6f 6c        pTab->nCol
2b4a0 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 73   = -1;.        s
2b4b0 71 6c 69 74 65 33 57 61 6c 6b 53 65 6c 65 63 74  qlite3WalkSelect
2b4c0 28 70 57 61 6c 6b 65 72 2c 20 70 46 72 6f 6d 2d  (pWalker, pFrom-
2b4d0 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 20  >pSelect);.     
2b4e0 20 20 20 70 54 61 62 2d 3e 6e 43 6f 6c 20 3d 20     pTab->nCol = 
2b4f0 6e 43 6f 6c 3b 0a 20 20 20 20 20 20 7d 0a 23 65  nCol;.      }.#e
2b500 6e 64 69 66 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ndif.    }..    
2b510 2f 2a 20 4c 6f 63 61 74 65 20 74 68 65 20 69 6e  /* Locate the in
2b520 64 65 78 20 6e 61 6d 65 64 20 62 79 20 74 68 65  dex named by the
2b530 20 49 4e 44 45 58 45 44 20 42 59 20 63 6c 61 75   INDEXED BY clau
2b540 73 65 2c 20 69 66 20 61 6e 79 2e 20 2a 2f 0a 20  se, if any. */. 
2b550 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 49 6e     if( sqlite3In
2b560 64 65 78 65 64 42 79 4c 6f 6f 6b 75 70 28 70 50  dexedByLookup(pP
2b570 61 72 73 65 2c 20 70 46 72 6f 6d 29 20 29 7b 0a  arse, pFrom) ){.
2b580 20 20 20 20 20 20 72 65 74 75 72 6e 20 57 52 43        return WRC
2b590 5f 41 62 6f 72 74 3b 0a 20 20 20 20 7d 0a 20 20  _Abort;.    }.  
2b5a0 7d 0a 0a 20 20 2f 2a 20 50 72 6f 63 65 73 73 20  }..  /* Process 
2b5b0 4e 41 54 55 52 41 4c 20 6b 65 79 77 6f 72 64 73  NATURAL keywords
2b5c0 2c 20 61 6e 64 20 4f 4e 20 61 6e 64 20 55 53 49  , and ON and USI
2b5d0 4e 47 20 63 6c 61 75 73 65 73 20 6f 66 20 6a 6f  NG clauses of jo
2b5e0 69 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ins..  */.  if( 
2b5f0 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
2b600 20 7c 7c 20 73 71 6c 69 74 65 50 72 6f 63 65 73   || sqliteProces
2b610 73 4a 6f 69 6e 28 70 50 61 72 73 65 2c 20 70 29  sJoin(pParse, p)
2b620 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 57   ){.    return W
2b630 52 43 5f 41 62 6f 72 74 3b 0a 20 20 7d 0a 0a 20  RC_Abort;.  }.. 
2b640 20 2f 2a 20 46 6f 72 20 65 76 65 72 79 20 22 2a   /* For every "*
2b650 22 20 74 68 61 74 20 6f 63 63 75 72 73 20 69 6e  " that occurs in
2b660 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6c 69 73 74   the column list
2b670 2c 20 69 6e 73 65 72 74 20 74 68 65 20 6e 61 6d  , insert the nam
2b680 65 73 20 6f 66 0a 20 20 2a 2a 20 61 6c 6c 20 63  es of.  ** all c
2b690 6f 6c 75 6d 6e 73 20 69 6e 20 61 6c 6c 20 74 61  olumns in all ta
2b6a0 62 6c 65 73 2e 20 20 41 6e 64 20 66 6f 72 20 65  bles.  And for e
2b6b0 76 65 72 79 20 54 41 42 4c 45 2e 2a 20 69 6e 73  very TABLE.* ins
2b6c0 65 72 74 20 74 68 65 20 6e 61 6d 65 73 0a 20 20  ert the names.  
2b6d0 2a 2a 20 6f 66 20 61 6c 6c 20 63 6f 6c 75 6d 6e  ** of all column
2b6e0 73 20 69 6e 20 54 41 42 4c 45 2e 20 20 54 68 65  s in TABLE.  The
2b6f0 20 70 61 72 73 65 72 20 69 6e 73 65 72 74 65 64   parser inserted
2b700 20 61 20 73 70 65 63 69 61 6c 20 65 78 70 72 65   a special expre
2b710 73 73 69 6f 6e 0a 20 20 2a 2a 20 77 69 74 68 20  ssion.  ** with 
2b720 74 68 65 20 54 4b 5f 41 53 54 45 52 49 53 4b 20  the TK_ASTERISK 
2b730 6f 70 65 72 61 74 6f 72 20 66 6f 72 20 65 61 63  operator for eac
2b740 68 20 22 2a 22 20 74 68 61 74 20 69 74 20 66 6f  h "*" that it fo
2b750 75 6e 64 20 69 6e 20 74 68 65 20 63 6f 6c 75 6d  und in the colum
2b760 6e 0a 20 20 2a 2a 20 6c 69 73 74 2e 20 20 54 68  n.  ** list.  Th
2b770 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 64 65  e following code
2b780 20 6a 75 73 74 20 68 61 73 20 74 6f 20 6c 6f 63   just has to loc
2b790 61 74 65 20 74 68 65 20 54 4b 5f 41 53 54 45 52  ate the TK_ASTER
2b7a0 49 53 4b 0a 20 20 2a 2a 20 65 78 70 72 65 73 73  ISK.  ** express
2b7b0 69 6f 6e 73 20 61 6e 64 20 65 78 70 61 6e 64 20  ions and expand 
2b7c0 65 61 63 68 20 6f 6e 65 20 74 6f 20 74 68 65 20  each one to the 
2b7d0 6c 69 73 74 20 6f 66 20 61 6c 6c 20 63 6f 6c 75  list of all colu
2b7e0 6d 6e 73 20 69 6e 0a 20 20 2a 2a 20 61 6c 6c 20  mns in.  ** all 
2b7f0 74 61 62 6c 65 73 2e 0a 20 20 2a 2a 0a 20 20 2a  tables..  **.  *
2b800 2a 20 54 68 65 20 66 69 72 73 74 20 6c 6f 6f 70  * The first loop
2b810 20 6a 75 73 74 20 63 68 65 63 6b 73 20 74 6f 20   just checks to 
2b820 73 65 65 20 69 66 20 74 68 65 72 65 20 61 72 65  see if there are
2b830 20 61 6e 79 20 22 2a 22 20 6f 70 65 72 61 74 6f   any "*" operato
2b840 72 73 0a 20 20 2a 2a 20 74 68 61 74 20 6e 65 65  rs.  ** that nee
2b850 64 20 65 78 70 61 6e 64 69 6e 67 2e 0a 20 20 2a  d expanding..  *
2b860 2f 0a 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 70  /.  for(k=0; k<p
2b870 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 6b 2b  EList->nExpr; k+
2b880 2b 29 7b 0a 20 20 20 20 70 45 20 3d 20 70 45 4c  +){.    pE = pEL
2b890 69 73 74 2d 3e 61 5b 6b 5d 2e 70 45 78 70 72 3b  ist->a[k].pExpr;
2b8a0 0a 20 20 20 20 69 66 28 20 70 45 2d 3e 6f 70 3d  .    if( pE->op=
2b8b0 3d 54 4b 5f 41 53 54 45 52 49 53 4b 20 29 20 62  =TK_ASTERISK ) b
2b8c0 72 65 61 6b 3b 0a 20 20 20 20 61 73 73 65 72 74  reak;.    assert
2b8d0 28 20 70 45 2d 3e 6f 70 21 3d 54 4b 5f 44 4f 54  ( pE->op!=TK_DOT
2b8e0 20 7c 7c 20 70 45 2d 3e 70 52 69 67 68 74 21 3d   || pE->pRight!=
2b8f0 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
2b900 20 70 45 2d 3e 6f 70 21 3d 54 4b 5f 44 4f 54 20   pE->op!=TK_DOT 
2b910 7c 7c 20 28 70 45 2d 3e 70 4c 65 66 74 21 3d 30  || (pE->pLeft!=0
2b920 20 26 26 20 70 45 2d 3e 70 4c 65 66 74 2d 3e 6f   && pE->pLeft->o
2b930 70 3d 3d 54 4b 5f 49 44 29 20 29 3b 0a 20 20 20  p==TK_ID) );.   
2b940 20 69 66 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f   if( pE->op==TK_
2b950 44 4f 54 20 26 26 20 70 45 2d 3e 70 52 69 67 68  DOT && pE->pRigh
2b960 74 2d 3e 6f 70 3d 3d 54 4b 5f 41 53 54 45 52 49  t->op==TK_ASTERI
2b970 53 4b 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  SK ) break;.    
2b980 65 6c 69 73 74 46 6c 61 67 73 20 7c 3d 20 70 45  elistFlags |= pE
2b990 2d 3e 66 6c 61 67 73 3b 0a 20 20 7d 0a 20 20 69  ->flags;.  }.  i
2b9a0 66 28 20 6b 3c 70 45 4c 69 73 74 2d 3e 6e 45 78  f( k<pEList->nEx
2b9b0 70 72 20 29 7b 0a 20 20 20 20 2f 2a 0a 20 20 20  pr ){.    /*.   
2b9c0 20 2a 2a 20 49 66 20 77 65 20 67 65 74 20 68 65   ** If we get he
2b9d0 72 65 20 69 74 20 6d 65 61 6e 73 20 74 68 65 20  re it means the 
2b9e0 72 65 73 75 6c 74 20 73 65 74 20 63 6f 6e 74 61  result set conta
2b9f0 69 6e 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20  ins one or more 
2ba00 22 2a 22 0a 20 20 20 20 2a 2a 20 6f 70 65 72 61  "*".    ** opera
2ba10 74 6f 72 73 20 74 68 61 74 20 6e 65 65 64 20 74  tors that need t
2ba20 6f 20 62 65 20 65 78 70 61 6e 64 65 64 2e 20 20  o be expanded.  
2ba30 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20 65 61 63  Loop through eac
2ba40 68 20 65 78 70 72 65 73 73 69 6f 6e 0a 20 20 20  h expression.   
2ba50 20 2a 2a 20 69 6e 20 74 68 65 20 72 65 73 75 6c   ** in the resul
2ba60 74 20 73 65 74 20 61 6e 64 20 65 78 70 61 6e 64  t set and expand
2ba70 20 74 68 65 6d 20 6f 6e 65 20 62 79 20 6f 6e 65   them one by one
2ba80 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 74 72  ..    */.    str
2ba90 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
2baa0 6d 20 2a 61 20 3d 20 70 45 4c 69 73 74 2d 3e 61  m *a = pEList->a
2bab0 3b 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a  ;.    ExprList *
2bac0 70 4e 65 77 20 3d 20 30 3b 0a 20 20 20 20 69 6e  pNew = 0;.    in
2bad0 74 20 66 6c 61 67 73 20 3d 20 70 50 61 72 73 65  t flags = pParse
2bae0 2d 3e 64 62 2d 3e 66 6c 61 67 73 3b 0a 20 20 20  ->db->flags;.   
2baf0 20 69 6e 74 20 6c 6f 6e 67 4e 61 6d 65 73 20 3d   int longNames =
2bb00 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45   (flags & SQLITE
2bb10 5f 46 75 6c 6c 43 6f 6c 4e 61 6d 65 73 29 21 3d  _FullColNames)!=
2bb20 30 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0.              
2bb30 20 20 20 20 20 20 20 20 26 26 20 28 66 6c 61 67          && (flag
2bb40 73 20 26 20 53 51 4c 49 54 45 5f 53 68 6f 72 74  s & SQLITE_Short
2bb50 43 6f 6c 4e 61 6d 65 73 29 3d 3d 30 3b 0a 0a 20  ColNames)==0;.. 
2bb60 20 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 70 45     for(k=0; k<pE
2bb70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 6b 2b 2b  List->nExpr; k++
2bb80 29 7b 0a 20 20 20 20 20 20 70 45 20 3d 20 61 5b  ){.      pE = a[
2bb90 6b 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20  k].pExpr;.      
2bba0 65 6c 69 73 74 46 6c 61 67 73 20 7c 3d 20 70 45  elistFlags |= pE
2bbb0 2d 3e 66 6c 61 67 73 3b 0a 20 20 20 20 20 20 70  ->flags;.      p
2bbc0 52 69 67 68 74 20 3d 20 70 45 2d 3e 70 52 69 67  Right = pE->pRig
2bbd0 68 74 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  ht;.      assert
2bbe0 28 20 70 45 2d 3e 6f 70 21 3d 54 4b 5f 44 4f 54  ( pE->op!=TK_DOT
2bbf0 20 7c 7c 20 70 52 69 67 68 74 21 3d 30 20 29 3b   || pRight!=0 );
2bc00 0a 20 20 20 20 20 20 69 66 28 20 70 45 2d 3e 6f  .      if( pE->o
2bc10 70 21 3d 54 4b 5f 41 53 54 45 52 49 53 4b 0a 20  p!=TK_ASTERISK. 
2bc20 20 20 20 20 20 20 26 26 20 28 70 45 2d 3e 6f 70        && (pE->op
2bc30 21 3d 54 4b 5f 44 4f 54 20 7c 7c 20 70 52 69 67  !=TK_DOT || pRig
2bc40 68 74 2d 3e 6f 70 21 3d 54 4b 5f 41 53 54 45 52  ht->op!=TK_ASTER
2bc50 49 53 4b 29 0a 20 20 20 20 20 20 29 7b 0a 20 20  ISK).      ){.  
2bc60 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 70 61        /* This pa
2bc70 72 74 69 63 75 6c 61 72 20 65 78 70 72 65 73 73  rticular express
2bc80 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65  ion does not nee
2bc90 64 20 74 6f 20 62 65 20 65 78 70 61 6e 64 65 64  d to be expanded
2bca0 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
2bcb0 20 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69       pNew = sqli
2bcc0 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e  te3ExprListAppen
2bcd0 64 28 70 50 61 72 73 65 2c 20 70 4e 65 77 2c 20  d(pParse, pNew, 
2bce0 61 5b 6b 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20  a[k].pExpr);.   
2bcf0 20 20 20 20 20 69 66 28 20 70 4e 65 77 20 29 7b       if( pNew ){
2bd00 0a 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d  .          pNew-
2bd10 3e 61 5b 70 4e 65 77 2d 3e 6e 45 78 70 72 2d 31  >a[pNew->nExpr-1
2bd20 5d 2e 7a 4e 61 6d 65 20 3d 20 61 5b 6b 5d 2e 7a  ].zName = a[k].z
2bd30 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 20 20  Name;.          
2bd40 70 4e 65 77 2d 3e 61 5b 70 4e 65 77 2d 3e 6e 45  pNew->a[pNew->nE
2bd50 78 70 72 2d 31 5d 2e 7a 53 70 61 6e 20 3d 20 61  xpr-1].zSpan = a
2bd60 5b 6b 5d 2e 7a 53 70 61 6e 3b 0a 20 20 20 20 20  [k].zSpan;.     
2bd70 20 20 20 20 20 61 5b 6b 5d 2e 7a 4e 61 6d 65 20       a[k].zName 
2bd80 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 61  = 0;.          a
2bd90 5b 6b 5d 2e 7a 53 70 61 6e 20 3d 20 30 3b 0a 20  [k].zSpan = 0;. 
2bda0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2bdb0 20 61 5b 6b 5d 2e 70 45 78 70 72 20 3d 20 30 3b   a[k].pExpr = 0;
2bdc0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
2bdd0 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 65 78        /* This ex
2bde0 70 72 65 73 73 69 6f 6e 20 69 73 20 61 20 22 2a  pression is a "*
2bdf0 22 20 6f 72 20 61 20 22 54 41 42 4c 45 2e 2a 22  " or a "TABLE.*"
2be00 20 61 6e 64 20 6e 65 65 64 73 20 74 6f 20 62 65   and needs to be
2be10 0a 20 20 20 20 20 20 20 20 2a 2a 20 65 78 70 61  .        ** expa
2be20 6e 64 65 64 2e 20 2a 2f 0a 20 20 20 20 20 20 20  nded. */.       
2be30 20 69 6e 74 20 74 61 62 6c 65 53 65 65 6e 20 3d   int tableSeen =
2be40 20 30 3b 20 20 20 20 20 20 2f 2a 20 53 65 74 20   0;      /* Set 
2be50 74 6f 20 31 20 77 68 65 6e 20 54 41 42 4c 45 20  to 1 when TABLE 
2be60 6d 61 74 63 68 65 73 20 2a 2f 0a 20 20 20 20 20  matches */.     
2be70 20 20 20 63 68 61 72 20 2a 7a 54 4e 61 6d 65 20     char *zTName 
2be80 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 74 65  = 0;       /* te
2be90 78 74 20 6f 66 20 6e 61 6d 65 20 6f 66 20 54 41  xt of name of TA
2bea0 42 4c 45 20 2a 2f 0a 20 20 20 20 20 20 20 20 69  BLE */.        i
2beb0 66 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f  f( pE->op==TK_DO
2bec0 54 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61  T ){.          a
2bed0 73 73 65 72 74 28 20 70 45 2d 3e 70 4c 65 66 74  ssert( pE->pLeft
2bee0 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20  !=0 );.         
2bef0 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61   assert( !ExprHa
2bf00 73 50 72 6f 70 65 72 74 79 28 70 45 2d 3e 70 4c  sProperty(pE->pL
2bf10 65 66 74 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65  eft, EP_IntValue
2bf20 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7a  ) );.          z
2bf30 54 4e 61 6d 65 20 3d 20 70 45 2d 3e 70 4c 65 66  TName = pE->pLef
2bf40 74 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 20  t->u.zToken;.   
2bf50 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 66       }.        f
2bf60 6f 72 28 69 3d 30 2c 20 70 46 72 6f 6d 3d 70 54  or(i=0, pFrom=pT
2bf70 61 62 4c 69 73 74 2d 3e 61 3b 20 69 3c 70 54 61  abList->a; i<pTa
2bf80 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b  bList->nSrc; i++
2bf90 2c 20 70 46 72 6f 6d 2b 2b 29 7b 0a 20 20 20 20  , pFrom++){.    
2bfa0 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61        Table *pTa
2bfb0 62 20 3d 20 70 46 72 6f 6d 2d 3e 70 54 61 62 3b  b = pFrom->pTab;
2bfc0 0a 20 20 20 20 20 20 20 20 20 20 53 65 6c 65 63  .          Selec
2bfd0 74 20 2a 70 53 75 62 20 3d 20 70 46 72 6f 6d 2d  t *pSub = pFrom-
2bfe0 3e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 20 20  >pSelect;.      
2bff0 20 20 20 20 63 68 61 72 20 2a 7a 54 61 62 4e 61      char *zTabNa
2c000 6d 65 20 3d 20 70 46 72 6f 6d 2d 3e 7a 41 6c 69  me = pFrom->zAli
2c010 61 73 3b 0a 20 20 20 20 20 20 20 20 20 20 63 6f  as;.          co
2c020 6e 73 74 20 63 68 61 72 20 2a 7a 53 63 68 65 6d  nst char *zSchem
2c030 61 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 20  aName = 0;.     
2c040 20 20 20 20 20 69 6e 74 20 69 44 62 3b 0a 20 20       int iDb;.  
2c050 20 20 20 20 20 20 20 20 69 66 28 20 7a 54 61 62          if( zTab
2c060 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Name==0 ){.     
2c070 20 20 20 20 20 20 20 7a 54 61 62 4e 61 6d 65 20         zTabName 
2c080 3d 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 3b 0a 20  = pTab->zName;. 
2c090 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
2c0a0 20 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c       if( db->mal
2c0b0 6c 6f 63 46 61 69 6c 65 64 20 29 20 62 72 65 61  locFailed ) brea
2c0c0 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  k;.          if(
2c0d0 20 70 53 75 62 3d 3d 30 20 7c 7c 20 28 70 53 75   pSub==0 || (pSu
2c0e0 62 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46  b->selFlags & SF
2c0f0 5f 4e 65 73 74 65 64 46 72 6f 6d 29 3d 3d 30 20  _NestedFrom)==0 
2c100 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  ){.            p
2c110 53 75 62 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  Sub = 0;.       
2c120 20 20 20 20 20 69 66 28 20 7a 54 4e 61 6d 65 20       if( zTName 
2c130 26 26 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  && sqlite3StrICm
2c140 70 28 7a 54 4e 61 6d 65 2c 20 7a 54 61 62 4e 61  p(zTName, zTabNa
2c150 6d 65 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  me)!=0 ){.      
2c160 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65          continue
2c170 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
2c180 20 20 20 20 20 20 20 20 20 20 20 20 69 44 62 20              iDb 
2c190 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54  = sqlite3SchemaT
2c1a0 6f 49 6e 64 65 78 28 64 62 2c 20 70 54 61 62 2d  oIndex(db, pTab-
2c1b0 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 20  >pSchema);.     
2c1c0 20 20 20 20 20 20 20 7a 53 63 68 65 6d 61 4e 61         zSchemaNa
2c1d0 6d 65 20 3d 20 69 44 62 3e 3d 30 20 3f 20 64 62  me = iDb>=0 ? db
2c1e0 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 44 62 53 4e  ->aDb[iDb].zDbSN
2c1f0 61 6d 65 20 3a 20 22 2a 22 3b 0a 20 20 20 20 20  ame : "*";.     
2c200 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
2c210 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 54 61 62   for(j=0; j<pTab
2c220 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20  ->nCol; j++){.  
2c230 20 20 20 20 20 20 20 20 20 20 63 68 61 72 20 2a            char *
2c240 7a 4e 61 6d 65 20 3d 20 70 54 61 62 2d 3e 61 43  zName = pTab->aC
2c250 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20  ol[j].zName;.   
2c260 20 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a           char *z
2c270 43 6f 6c 6e 61 6d 65 3b 20 20 2f 2a 20 54 68 65  Colname;  /* The
2c280 20 63 6f 6d 70 75 74 65 64 20 63 6f 6c 75 6d 6e   computed column
2c290 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 20 20 20   name */.       
2c2a0 20 20 20 20 20 63 68 61 72 20 2a 7a 54 6f 46 72       char *zToFr
2c2b0 65 65 3b 20 20 20 2f 2a 20 4d 61 6c 6c 6f 63 65  ee;   /* Malloce
2c2c0 64 20 73 74 72 69 6e 67 20 74 68 61 74 20 6e 65  d string that ne
2c2d0 65 64 73 20 74 6f 20 62 65 20 66 72 65 65 64 20  eds to be freed 
2c2e0 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 54  */.            T
2c2f0 6f 6b 65 6e 20 73 43 6f 6c 6e 61 6d 65 3b 20 20  oken sColname;  
2c300 2f 2a 20 43 6f 6d 70 75 74 65 64 20 63 6f 6c 75  /* Computed colu
2c310 6d 6e 20 6e 61 6d 65 20 61 73 20 61 20 74 6f 6b  mn name as a tok
2c320 65 6e 20 2a 2f 0a 0a 20 20 20 20 20 20 20 20 20  en */..         
2c330 20 20 20 61 73 73 65 72 74 28 20 7a 4e 61 6d 65     assert( zName
2c340 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   );.            
2c350 69 66 28 20 7a 54 4e 61 6d 65 20 26 26 20 70 53  if( zTName && pS
2c360 75 62 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ub.             
2c370 26 26 20 73 71 6c 69 74 65 33 4d 61 74 63 68 53  && sqlite3MatchS
2c380 70 61 6e 4e 61 6d 65 28 70 53 75 62 2d 3e 70 45  panName(pSub->pE
2c390 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 7a 53 70 61 6e  List->a[j].zSpan
2c3a0 2c 20 30 2c 20 7a 54 4e 61 6d 65 2c 20 30 29 3d  , 0, zTName, 0)=
2c3b0 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20 20 29  =0.            )
2c3c0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
2c3d0 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
2c3e0 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20        }..       
2c3f0 20 20 20 20 20 2f 2a 20 49 66 20 61 20 63 6f 6c       /* If a col
2c400 75 6d 6e 20 69 73 20 6d 61 72 6b 65 64 20 61 73  umn is marked as
2c410 20 27 68 69 64 64 65 6e 27 2c 20 6f 6d 69 74 20   'hidden', omit 
2c420 69 74 20 66 72 6f 6d 20 74 68 65 20 65 78 70 61  it from the expa
2c430 6e 64 65 64 0a 20 20 20 20 20 20 20 20 20 20 20  nded.           
2c440 20 2a 2a 20 72 65 73 75 6c 74 2d 73 65 74 20 6c   ** result-set l
2c450 69 73 74 20 75 6e 6c 65 73 73 20 74 68 65 20 53  ist unless the S
2c460 45 4c 45 43 54 20 68 61 73 20 74 68 65 20 53 46  ELECT has the SF
2c470 5f 49 6e 63 6c 75 64 65 48 69 64 64 65 6e 0a 20  _IncludeHidden. 
2c480 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 62 69             ** bi
2c490 74 20 73 65 74 2e 0a 20 20 20 20 20 20 20 20 20  t set..         
2c4a0 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20     */.          
2c4b0 20 20 69 66 28 20 28 70 2d 3e 73 65 6c 46 6c 61    if( (p->selFla
2c4c0 67 73 20 26 20 53 46 5f 49 6e 63 6c 75 64 65 48  gs & SF_IncludeH
2c4d0 69 64 64 65 6e 29 3d 3d 30 0a 20 20 20 20 20 20  idden)==0.      
2c4e0 20 20 20 20 20 20 20 26 26 20 49 73 48 69 64 64         && IsHidd
2c4f0 65 6e 43 6f 6c 75 6d 6e 28 26 70 54 61 62 2d 3e  enColumn(&pTab->
2c500 61 43 6f 6c 5b 6a 5d 29 20 0a 20 20 20 20 20 20  aCol[j]) .      
2c510 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
2c520 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b         continue;
2c530 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
2c540 20 20 20 20 20 20 20 20 20 20 20 74 61 62 6c 65             table
2c550 53 65 65 6e 20 3d 20 31 3b 0a 0a 20 20 20 20 20  Seen = 1;..     
2c560 20 20 20 20 20 20 20 69 66 28 20 69 3e 30 20 26         if( i>0 &
2c570 26 20 7a 54 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20  & zTName==0 ){. 
2c580 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28               if(
2c590 20 28 70 46 72 6f 6d 2d 3e 66 67 2e 6a 6f 69 6e   (pFrom->fg.join
2c5a0 74 79 70 65 20 26 20 4a 54 5f 4e 41 54 55 52 41  type & JT_NATURA
2c5b0 4c 29 21 3d 30 0a 20 20 20 20 20 20 20 20 20 20  L)!=0.          
2c5c0 20 20 20 20 20 20 26 26 20 74 61 62 6c 65 41 6e        && tableAn
2c5d0 64 43 6f 6c 75 6d 6e 49 6e 64 65 78 28 70 54 61  dColumnIndex(pTa
2c5e0 62 4c 69 73 74 2c 20 69 2c 20 7a 4e 61 6d 65 2c  bList, i, zName,
2c5f0 20 30 2c 20 30 29 0a 20 20 20 20 20 20 20 20 20   0, 0).         
2c600 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
2c610 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 20 61 20          /* In a 
2c620 4e 41 54 55 52 41 4c 20 6a 6f 69 6e 2c 20 6f 6d  NATURAL join, om
2c630 69 74 20 74 68 65 20 6a 6f 69 6e 20 63 6f 6c 75  it the join colu
2c640 6d 6e 73 20 66 72 6f 6d 20 74 68 65 20 0a 20 20  mns from the .  
2c650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a                **
2c660 20 74 61 62 6c 65 20 74 6f 20 74 68 65 20 72 69   table to the ri
2c670 67 68 74 20 6f 66 20 74 68 65 20 6a 6f 69 6e 20  ght of the join 
2c680 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  */.             
2c690 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
2c6a0 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
2c6b0 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73             if( s
2c6c0 71 6c 69 74 65 33 49 64 4c 69 73 74 49 6e 64 65  qlite3IdListInde
2c6d0 78 28 70 46 72 6f 6d 2d 3e 70 55 73 69 6e 67 2c  x(pFrom->pUsing,
2c6e0 20 7a 4e 61 6d 65 29 3e 3d 30 20 29 7b 0a 20 20   zName)>=0 ){.  
2c6f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2c700 20 49 6e 20 61 20 6a 6f 69 6e 20 77 69 74 68 20   In a join with 
2c710 61 20 55 53 49 4e 47 20 63 6c 61 75 73 65 2c 20  a USING clause, 
2c720 6f 6d 69 74 20 63 6f 6c 75 6d 6e 73 20 69 6e 20  omit columns in 
2c730 74 68 65 0a 20 20 20 20 20 20 20 20 20 20 20 20  the.            
2c740 20 20 20 20 2a 2a 20 75 73 69 6e 67 20 63 6c 61      ** using cla
2c750 75 73 65 20 66 72 6f 6d 20 74 68 65 20 74 61 62  use from the tab
2c760 6c 65 20 6f 6e 20 74 68 65 20 72 69 67 68 74 2e  le on the right.
2c770 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
2c780 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
2c790 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
2c7a0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2c7b0 20 20 20 20 20 20 20 20 70 52 69 67 68 74 20 3d          pRight =
2c7c0 20 73 71 6c 69 74 65 33 45 78 70 72 28 64 62 2c   sqlite3Expr(db,
2c7d0 20 54 4b 5f 49 44 2c 20 7a 4e 61 6d 65 29 3b 0a   TK_ID, zName);.
2c7e0 20 20 20 20 20 20 20 20 20 20 20 20 7a 43 6f 6c              zCol
2c7f0 6e 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20  name = zName;.  
2c800 20 20 20 20 20 20 20 20 20 20 7a 54 6f 46 72 65            zToFre
2c810 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  e = 0;.         
2c820 20 20 20 69 66 28 20 6c 6f 6e 67 4e 61 6d 65 73     if( longNames
2c830 20 7c 7c 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53   || pTabList->nS
2c840 72 63 3e 31 20 29 7b 0a 20 20 20 20 20 20 20 20  rc>1 ){.        
2c850 20 20 20 20 20 20 45 78 70 72 20 2a 70 4c 65 66        Expr *pLef
2c860 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  t;.             
2c870 20 70 4c 65 66 74 20 3d 20 73 71 6c 69 74 65 33   pLeft = sqlite3
2c880 45 78 70 72 28 64 62 2c 20 54 4b 5f 49 44 2c 20  Expr(db, TK_ID, 
2c890 7a 54 61 62 4e 61 6d 65 29 3b 0a 20 20 20 20 20  zTabName);.     
2c8a0 20 20 20 20 20 20 20 20 20 70 45 78 70 72 20 3d           pExpr =
2c8b0 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70 50   sqlite3PExpr(pP
2c8c0 61 72 73 65 2c 20 54 4b 5f 44 4f 54 2c 20 70 4c  arse, TK_DOT, pL
2c8d0 65 66 74 2c 20 70 52 69 67 68 74 29 3b 0a 20 20  eft, pRight);.  
2c8e0 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
2c8f0 7a 53 63 68 65 6d 61 4e 61 6d 65 20 29 7b 0a 20  zSchemaName ){. 
2c900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
2c910 4c 65 66 74 20 3d 20 73 71 6c 69 74 65 33 45 78  Left = sqlite3Ex
2c920 70 72 28 64 62 2c 20 54 4b 5f 49 44 2c 20 7a 53  pr(db, TK_ID, zS
2c930 63 68 65 6d 61 4e 61 6d 65 29 3b 0a 20 20 20 20  chemaName);.    
2c940 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70              pExp
2c950 72 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72  r = sqlite3PExpr
2c960 28 70 50 61 72 73 65 2c 20 54 4b 5f 44 4f 54 2c  (pParse, TK_DOT,
2c970 20 70 4c 65 66 74 2c 20 70 45 78 70 72 29 3b 0a   pLeft, pExpr);.
2c980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a                }.
2c990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
2c9a0 28 20 6c 6f 6e 67 4e 61 6d 65 73 20 29 7b 0a 20  ( longNames ){. 
2c9b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a                 z
2c9c0 43 6f 6c 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65  Colname = sqlite
2c9d0 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 25 73  3MPrintf(db, "%s
2c9e0 2e 25 73 22 2c 20 7a 54 61 62 4e 61 6d 65 2c 20  .%s", zTabName, 
2c9f0 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  zName);.        
2ca00 20 20 20 20 20 20 20 20 7a 54 6f 46 72 65 65 20          zToFree 
2ca10 3d 20 7a 43 6f 6c 6e 61 6d 65 3b 0a 20 20 20 20  = zColname;.    
2ca20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2ca30 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
2ca40 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78               pEx
2ca50 70 72 20 3d 20 70 52 69 67 68 74 3b 0a 20 20 20  pr = pRight;.   
2ca60 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
2ca70 20 20 20 20 20 20 20 70 4e 65 77 20 3d 20 73 71         pNew = sq
2ca80 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70 70  lite3ExprListApp
2ca90 65 6e 64 28 70 50 61 72 73 65 2c 20 70 4e 65 77  end(pParse, pNew
2caa0 2c 20 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20  , pExpr);.      
2cab0 20 20 20 20 20 20 73 71 6c 69 74 65 33 54 6f 6b        sqlite3Tok
2cac0 65 6e 49 6e 69 74 28 26 73 43 6f 6c 6e 61 6d 65  enInit(&sColname
2cad0 2c 20 7a 43 6f 6c 6e 61 6d 65 29 3b 0a 20 20 20  , zColname);.   
2cae0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
2caf0 45 78 70 72 4c 69 73 74 53 65 74 4e 61 6d 65 28  ExprListSetName(
2cb00 70 50 61 72 73 65 2c 20 70 4e 65 77 2c 20 26 73  pParse, pNew, &s
2cb10 43 6f 6c 6e 61 6d 65 2c 20 30 29 3b 0a 20 20 20  Colname, 0);.   
2cb20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 4e 65           if( pNe
2cb30 77 20 26 26 20 28 70 2d 3e 73 65 6c 46 6c 61 67  w && (p->selFlag
2cb40 73 20 26 20 53 46 5f 4e 65 73 74 65 64 46 72 6f  s & SF_NestedFro
2cb50 6d 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  m)!=0 ){.       
2cb60 20 20 20 20 20 20 20 73 74 72 75 63 74 20 45 78         struct Ex
2cb70 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 58 20  prList_item *pX 
2cb80 3d 20 26 70 4e 65 77 2d 3e 61 5b 70 4e 65 77 2d  = &pNew->a[pNew-
2cb90 3e 6e 45 78 70 72 2d 31 5d 3b 0a 20 20 20 20 20  >nExpr-1];.     
2cba0 20 20 20 20 20 20 20 20 20 69 66 28 20 70 53 75           if( pSu
2cbb0 62 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  b ){.           
2cbc0 20 20 20 20 20 70 58 2d 3e 7a 53 70 61 6e 20 3d       pX->zSpan =
2cbd0 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70   sqlite3DbStrDup
2cbe0 28 64 62 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73  (db, pSub->pELis
2cbf0 74 2d 3e 61 5b 6a 5d 2e 7a 53 70 61 6e 29 3b 0a  t->a[j].zSpan);.
2cc00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cc10 74 65 73 74 63 61 73 65 28 20 70 58 2d 3e 7a 53  testcase( pX->zS
2cc20 70 61 6e 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  pan==0 );.      
2cc30 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
2cc40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
2cc50 58 2d 3e 7a 53 70 61 6e 20 3d 20 73 71 6c 69 74  X->zSpan = sqlit
2cc60 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 25  e3MPrintf(db, "%
2cc70 73 2e 25 73 2e 25 73 22 2c 0a 20 20 20 20 20 20  s.%s.%s",.      
2cc80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cc90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cca0 20 20 20 20 20 7a 53 63 68 65 6d 61 4e 61 6d 65       zSchemaName
2ccb0 2c 20 7a 54 61 62 4e 61 6d 65 2c 20 7a 43 6f 6c  , zTabName, zCol
2ccc0 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20  name);.         
2ccd0 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
2cce0 20 70 58 2d 3e 7a 53 70 61 6e 3d 3d 30 20 29 3b   pX->zSpan==0 );
2ccf0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  .              }
2cd00 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
2cd10 58 2d 3e 62 53 70 61 6e 49 73 54 61 62 20 3d 20  X->bSpanIsTab = 
2cd20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  1;.            }
2cd30 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
2cd40 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a  ite3DbFree(db, z
2cd50 54 6f 46 72 65 65 29 3b 0a 20 20 20 20 20 20 20  ToFree);.       
2cd60 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
2cd70 20 20 20 20 20 20 20 69 66 28 20 21 74 61 62 6c         if( !tabl
2cd80 65 53 65 65 6e 20 29 7b 0a 20 20 20 20 20 20 20  eSeen ){.       
2cd90 20 20 20 69 66 28 20 7a 54 4e 61 6d 65 20 29 7b     if( zTName ){
2cda0 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
2cdb0 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
2cdc0 72 73 65 2c 20 22 6e 6f 20 73 75 63 68 20 74 61  rse, "no such ta
2cdd0 62 6c 65 3a 20 25 73 22 2c 20 7a 54 4e 61 6d 65  ble: %s", zTName
2cde0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c  );.          }el
2cdf0 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
2ce00 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
2ce10 70 50 61 72 73 65 2c 20 22 6e 6f 20 74 61 62 6c  pParse, "no tabl
2ce20 65 73 20 73 70 65 63 69 66 69 65 64 22 29 3b 0a  es specified");.
2ce30 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2ce40 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
2ce50 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 45    }.    sqlite3E
2ce60 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62  xprListDelete(db
2ce70 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 70  , pEList);.    p
2ce80 2d 3e 70 45 4c 69 73 74 20 3d 20 70 4e 65 77 3b  ->pEList = pNew;
2ce90 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70 45  .  }.  if( p->pE
2cea0 4c 69 73 74 20 29 7b 0a 20 20 20 20 69 66 28 20  List ){.    if( 
2ceb0 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  p->pEList->nExpr
2cec0 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49  >db->aLimit[SQLI
2ced0 54 45 5f 4c 49 4d 49 54 5f 43 4f 4c 55 4d 4e 5d  TE_LIMIT_COLUMN]
2cee0 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
2cef0 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
2cf00 2c 20 22 74 6f 6f 20 6d 61 6e 79 20 63 6f 6c 75  , "too many colu
2cf10 6d 6e 73 20 69 6e 20 72 65 73 75 6c 74 20 73 65  mns in result se
2cf20 74 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  t");.      retur
2cf30 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20  n WRC_Abort;.   
2cf40 20 7d 0a 20 20 20 20 69 66 28 20 28 65 6c 69 73   }.    if( (elis
2cf50 74 46 6c 61 67 73 20 26 20 28 45 50 5f 48 61 73  tFlags & (EP_Has
2cf60 46 75 6e 63 7c 45 50 5f 53 75 62 71 75 65 72 79  Func|EP_Subquery
2cf70 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 70  ))!=0 ){.      p
2cf80 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46  ->selFlags |= SF
2cf90 5f 43 6f 6d 70 6c 65 78 52 65 73 75 6c 74 3b 0a  _ComplexResult;.
2cfa0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
2cfb0 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b  rn WRC_Continue;
2cfc0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4e 6f 2d 6f 70 20  .}../*.** No-op 
2cfd0 72 6f 75 74 69 6e 65 20 66 6f 72 20 74 68 65 20  routine for the 
2cfe0 70 61 72 73 65 2d 74 72 65 65 20 77 61 6c 6b 65  parse-tree walke
2cff0 72 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68  r..**.** When th
2d000 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 74 68  is routine is th
2d010 65 20 57 61 6c 6b 65 72 2e 78 45 78 70 72 43 61  e Walker.xExprCa
2d020 6c 6c 62 61 63 6b 20 74 68 65 6e 20 65 78 70 72  llback then expr
2d030 65 73 73 69 6f 6e 20 74 72 65 65 73 0a 2a 2a 20  ession trees.** 
2d040 61 72 65 20 77 61 6c 6b 65 64 20 77 69 74 68 6f  are walked witho
2d050 75 74 20 61 6e 79 20 61 63 74 69 6f 6e 73 20 62  ut any actions b
2d060 65 69 6e 67 20 74 61 6b 65 6e 20 61 74 20 65 61  eing taken at ea
2d070 63 68 20 6e 6f 64 65 2e 20 20 50 72 65 73 75 6d  ch node.  Presum
2d080 61 62 6c 79 2c 0a 2a 2a 20 77 68 65 6e 20 74 68  ably,.** when th
2d090 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73  is routine is us
2d0a0 65 64 20 66 6f 72 20 57 61 6c 6b 65 72 2e 78 45  ed for Walker.xE
2d0b0 78 70 72 43 61 6c 6c 62 61 63 6b 20 74 68 65 6e  xprCallback then
2d0c0 20 0a 2a 2a 20 57 61 6c 6b 65 72 2e 78 53 65 6c   .** Walker.xSel
2d0d0 65 63 74 43 61 6c 6c 62 61 63 6b 20 69 73 20 73  ectCallback is s
2d0e0 65 74 20 74 6f 20 64 6f 20 73 6f 6d 65 74 68 69  et to do somethi
2d0f0 6e 67 20 75 73 65 66 75 6c 20 66 6f 72 20 65 76  ng useful for ev
2d100 65 72 79 20 0a 2a 2a 20 73 75 62 71 75 65 72 79  ery .** subquery
2d110 20 69 6e 20 74 68 65 20 70 61 72 73 65 72 20 74   in the parser t
2d120 72 65 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ree..*/.int sqli
2d130 74 65 33 45 78 70 72 57 61 6c 6b 4e 6f 6f 70 28  te3ExprWalkNoop(
2d140 57 61 6c 6b 65 72 20 2a 4e 6f 74 55 73 65 64 2c  Walker *NotUsed,
2d150 20 45 78 70 72 20 2a 4e 6f 74 55 73 65 64 32 29   Expr *NotUsed2)
2d160 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  {.  UNUSED_PARAM
2d170 45 54 45 52 32 28 4e 6f 74 55 73 65 64 2c 20 4e  ETER2(NotUsed, N
2d180 6f 74 55 73 65 64 32 29 3b 0a 20 20 72 65 74 75  otUsed2);.  retu
2d190 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b  rn WRC_Continue;
2d1a0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4e 6f 2d 6f 70 20  .}../*.** No-op 
2d1b0 72 6f 75 74 69 6e 65 20 66 6f 72 20 74 68 65 20  routine for the 
2d1c0 70 61 72 73 65 2d 74 72 65 65 20 77 61 6c 6b 65  parse-tree walke
2d1d0 72 20 66 6f 72 20 53 45 4c 45 43 54 20 73 74 61  r for SELECT sta
2d1e0 74 65 6d 65 6e 74 73 2e 0a 2a 2a 20 73 75 62 71  tements..** subq
2d1f0 75 65 72 79 20 69 6e 20 74 68 65 20 70 61 72 73  uery in the pars
2d200 65 72 20 74 72 65 65 2e 0a 2a 2f 0a 69 6e 74 20  er tree..*/.int 
2d210 73 71 6c 69 74 65 33 53 65 6c 65 63 74 57 61 6c  sqlite3SelectWal
2d220 6b 4e 6f 6f 70 28 57 61 6c 6b 65 72 20 2a 4e 6f  kNoop(Walker *No
2d230 74 55 73 65 64 2c 20 53 65 6c 65 63 74 20 2a 4e  tUsed, Select *N
2d240 6f 74 55 73 65 64 32 29 7b 0a 20 20 55 4e 55 53  otUsed2){.  UNUS
2d250 45 44 5f 50 41 52 41 4d 45 54 45 52 32 28 4e 6f  ED_PARAMETER2(No
2d260 74 55 73 65 64 2c 20 4e 6f 74 55 73 65 64 32 29  tUsed, NotUsed2)
2d270 3b 0a 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43  ;.  return WRC_C
2d280 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 23 69 66 20  ontinue;.}..#if 
2d290 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a  SQLITE_DEBUG./*.
2d2a0 2a 2a 20 41 6c 77 61 79 73 20 61 73 73 65 72 74  ** Always assert
2d2b0 2e 20 20 54 68 69 73 20 78 53 65 6c 65 63 74 43  .  This xSelectC
2d2c0 61 6c 6c 62 61 63 6b 32 20 69 6d 70 6c 65 6d 65  allback2 impleme
2d2d0 6e 74 61 74 69 6f 6e 20 70 72 6f 76 65 73 20 74  ntation proves t
2d2e0 68 61 74 20 74 68 65 0a 2a 2a 20 78 53 65 6c 65  hat the.** xSele
2d2f0 63 74 43 61 6c 6c 62 61 63 6b 32 20 69 73 20 6e  ctCallback2 is n
2d300 65 76 65 72 20 69 6e 76 6f 6b 65 64 2e 0a 2a 2f  ever invoked..*/
2d310 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53 65 6c  .void sqlite3Sel
2d320 65 63 74 57 61 6c 6b 41 73 73 65 72 74 32 28 57  ectWalkAssert2(W
2d330 61 6c 6b 65 72 20 2a 4e 6f 74 55 73 65 64 2c 20  alker *NotUsed, 
2d340 53 65 6c 65 63 74 20 2a 4e 6f 74 55 73 65 64 32  Select *NotUsed2
2d350 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  ){.  UNUSED_PARA
2d360 4d 45 54 45 52 32 28 4e 6f 74 55 73 65 64 2c 20  METER2(NotUsed, 
2d370 4e 6f 74 55 73 65 64 32 29 3b 0a 20 20 61 73 73  NotUsed2);.  ass
2d380 65 72 74 28 20 30 20 29 3b 0a 7d 0a 23 65 6e 64  ert( 0 );.}.#end
2d390 69 66 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  if./*.** This ro
2d3a0 75 74 69 6e 65 20 22 65 78 70 61 6e 64 73 22 20  utine "expands" 
2d3b0 61 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  a SELECT stateme
2d3c0 6e 74 20 61 6e 64 20 61 6c 6c 20 6f 66 20 69 74  nt and all of it
2d3d0 73 20 73 75 62 71 75 65 72 69 65 73 2e 0a 2a 2a  s subqueries..**
2d3e0 20 46 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20   For additional 
2d3f0 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f 6e 20 77  information on w
2d400 68 61 74 20 69 74 20 6d 65 61 6e 73 20 74 6f 20  hat it means to 
2d410 22 65 78 70 61 6e 64 22 20 61 20 53 45 4c 45 43  "expand" a SELEC
2d420 54 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 2c 20  T.** statement, 
2d430 73 65 65 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20  see the comment 
2d440 6f 6e 20 74 68 65 20 73 65 6c 65 63 74 45 78 70  on the selectExp
2d450 61 6e 64 20 77 6f 72 6b 65 72 20 63 61 6c 6c 62  and worker callb
2d460 61 63 6b 20 61 62 6f 76 65 2e 0a 2a 2a 0a 2a 2a  ack above..**.**
2d470 20 45 78 70 61 6e 64 69 6e 67 20 61 20 53 45 4c   Expanding a SEL
2d480 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 69 73  ECT statement is
2d490 20 74 68 65 20 66 69 72 73 74 20 73 74 65 70 20   the first step 
2d4a0 69 6e 20 70 72 6f 63 65 73 73 69 6e 67 20 61 0a  in processing a.
2d4b0 2a 2a 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  ** SELECT statem
2d4c0 65 6e 74 2e 20 20 54 68 65 20 53 45 4c 45 43 54  ent.  The SELECT
2d4d0 20 73 74 61 74 65 6d 65 6e 74 20 6d 75 73 74 20   statement must 
2d4e0 62 65 20 65 78 70 61 6e 64 65 64 20 62 65 66 6f  be expanded befo
2d4f0 72 65 0a 2a 2a 20 6e 61 6d 65 20 72 65 73 6f 6c  re.** name resol
2d500 75 74 69 6f 6e 20 69 73 20 70 65 72 66 6f 72 6d  ution is perform
2d510 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 79  ed..**.** If any
2d520 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67  thing goes wrong
2d530 2c 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61  , an error messa
2d540 67 65 20 69 73 20 77 72 69 74 74 65 6e 20 69 6e  ge is written in
2d550 74 6f 20 70 50 61 72 73 65 2e 0a 2a 2a 20 54 68  to pParse..** Th
2d560 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69  e calling functi
2d570 6f 6e 20 63 61 6e 20 64 65 74 65 63 74 20 74 68  on can detect th
2d580 65 20 70 72 6f 62 6c 65 6d 20 62 79 20 6c 6f 6f  e problem by loo
2d590 6b 69 6e 67 20 61 74 20 70 50 61 72 73 65 2d 3e  king at pParse->
2d5a0 6e 45 72 72 0a 2a 2a 20 61 6e 64 2f 6f 72 20 70  nErr.** and/or p
2d5b0 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  Parse->db->mallo
2d5c0 63 46 61 69 6c 65 64 2e 0a 2a 2f 0a 73 74 61 74  cFailed..*/.stat
2d5d0 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65 33 53  ic void sqlite3S
2d5e0 65 6c 65 63 74 45 78 70 61 6e 64 28 50 61 72 73  electExpand(Pars
2d5f0 65 20 2a 70 50 61 72 73 65 2c 20 53 65 6c 65 63  e *pParse, Selec
2d600 74 20 2a 70 53 65 6c 65 63 74 29 7b 0a 20 20 57  t *pSelect){.  W
2d610 61 6c 6b 65 72 20 77 3b 0a 20 20 77 2e 78 45 78  alker w;.  w.xEx
2d620 70 72 43 61 6c 6c 62 61 63 6b 20 3d 20 73 71 6c  prCallback = sql
2d630 69 74 65 33 45 78 70 72 57 61 6c 6b 4e 6f 6f 70  ite3ExprWalkNoop
2d640 3b 0a 20 20 77 2e 70 50 61 72 73 65 20 3d 20 70  ;.  w.pParse = p
2d650 50 61 72 73 65 3b 0a 20 20 69 66 28 20 4f 4b 5f  Parse;.  if( OK_
2d660 49 46 5f 41 4c 57 41 59 53 5f 54 52 55 45 28 70  IF_ALWAYS_TRUE(p
2d670 50 61 72 73 65 2d 3e 68 61 73 43 6f 6d 70 6f 75  Parse->hasCompou
2d680 6e 64 29 20 29 7b 0a 20 20 20 20 77 2e 78 53 65  nd) ){.    w.xSe
2d690 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20 3d 20 63  lectCallback = c
2d6a0 6f 6e 76 65 72 74 43 6f 6d 70 6f 75 6e 64 53 65  onvertCompoundSe
2d6b0 6c 65 63 74 54 6f 53 75 62 71 75 65 72 79 3b 0a  lectToSubquery;.
2d6c0 20 20 20 20 77 2e 78 53 65 6c 65 63 74 43 61 6c      w.xSelectCal
2d6d0 6c 62 61 63 6b 32 20 3d 20 30 3b 0a 20 20 20 20  lback2 = 0;.    
2d6e0 73 71 6c 69 74 65 33 57 61 6c 6b 53 65 6c 65 63  sqlite3WalkSelec
2d6f0 74 28 26 77 2c 20 70 53 65 6c 65 63 74 29 3b 0a  t(&w, pSelect);.
2d700 20 20 7d 0a 20 20 77 2e 78 53 65 6c 65 63 74 43    }.  w.xSelectC
2d710 61 6c 6c 62 61 63 6b 20 3d 20 73 65 6c 65 63 74  allback = select
2d720 45 78 70 61 6e 64 65 72 3b 0a 20 20 77 2e 78 53  Expander;.  w.xS
2d730 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 32 20 3d  electCallback2 =
2d740 20 73 65 6c 65 63 74 50 6f 70 57 69 74 68 3b 0a   selectPopWith;.
2d750 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 53 65 6c    sqlite3WalkSel
2d760 65 63 74 28 26 77 2c 20 70 53 65 6c 65 63 74 29  ect(&w, pSelect)
2d770 3b 0a 7d 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51  ;.}...#ifndef SQ
2d780 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
2d790 52 59 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73  RY./*.** This is
2d7a0 20 61 20 57 61 6c 6b 65 72 2e 78 53 65 6c 65 63   a Walker.xSelec
2d7b0 74 43 61 6c 6c 62 61 63 6b 20 63 61 6c 6c 62 61  tCallback callba
2d7c0 63 6b 20 66 6f 72 20 74 68 65 20 73 71 6c 69 74  ck for the sqlit
2d7d0 65 33 53 65 6c 65 63 74 54 79 70 65 49 6e 66 6f  e3SelectTypeInfo
2d7e0 28 29 0a 2a 2a 20 69 6e 74 65 72 66 61 63 65 2e  ().** interface.
2d7f0 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65 61 63 68 20  .**.** For each 
2d800 46 52 4f 4d 2d 63 6c 61 75 73 65 20 73 75 62 71  FROM-clause subq
2d810 75 65 72 79 2c 20 61 64 64 20 43 6f 6c 75 6d 6e  uery, add Column
2d820 2e 7a 54 79 70 65 20 61 6e 64 20 43 6f 6c 75 6d  .zType and Colum
2d830 6e 2e 7a 43 6f 6c 6c 0a 2a 2a 20 69 6e 66 6f 72  n.zColl.** infor
2d840 6d 61 74 69 6f 6e 20 74 6f 20 74 68 65 20 54 61  mation to the Ta
2d850 62 6c 65 20 73 74 72 75 63 74 75 72 65 20 74 68  ble structure th
2d860 61 74 20 72 65 70 72 65 73 65 6e 74 73 20 74 68  at represents th
2d870 65 20 72 65 73 75 6c 74 20 73 65 74 0a 2a 2a 20  e result set.** 
2d880 6f 66 20 74 68 61 74 20 73 75 62 71 75 65 72 79  of that subquery
2d890 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 54 61 62 6c  ..**.** The Tabl
2d8a0 65 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74  e structure that
2d8b0 20 72 65 70 72 65 73 65 6e 74 73 20 74 68 65 20   represents the 
2d8c0 72 65 73 75 6c 74 20 73 65 74 20 77 61 73 20 63  result set was c
2d8d0 6f 6e 73 74 72 75 63 74 65 64 0a 2a 2a 20 62 79  onstructed.** by
2d8e0 20 73 65 6c 65 63 74 45 78 70 61 6e 64 65 72 28   selectExpander(
2d8f0 29 20 62 75 74 20 74 68 65 20 74 79 70 65 20 61  ) but the type a
2d900 6e 64 20 63 6f 6c 6c 61 74 69 6f 6e 20 69 6e 66  nd collation inf
2d910 6f 72 6d 61 74 69 6f 6e 20 77 61 73 20 6f 6d 69  ormation was omi
2d920 74 74 65 64 0a 2a 2a 20 61 74 20 74 68 61 74 20  tted.** at that 
2d930 70 6f 69 6e 74 20 62 65 63 61 75 73 65 20 69 64  point because id
2d940 65 6e 74 69 66 69 65 72 73 20 68 61 64 20 6e 6f  entifiers had no
2d950 74 20 79 65 74 20 62 65 65 6e 20 72 65 73 6f 6c  t yet been resol
2d960 76 65 64 2e 20 20 54 68 69 73 0a 2a 2a 20 72 6f  ved.  This.** ro
2d970 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
2d980 61 66 74 65 72 20 69 64 65 6e 74 69 66 69 65 72  after identifier
2d990 20 72 65 73 6f 6c 75 74 69 6f 6e 2e 0a 2a 2f 0a   resolution..*/.
2d9a0 73 74 61 74 69 63 20 76 6f 69 64 20 73 65 6c 65  static void sele
2d9b0 63 74 41 64 64 53 75 62 71 75 65 72 79 54 79 70  ctAddSubqueryTyp
2d9c0 65 49 6e 66 6f 28 57 61 6c 6b 65 72 20 2a 70 57  eInfo(Walker *pW
2d9d0 61 6c 6b 65 72 2c 20 53 65 6c 65 63 74 20 2a 70  alker, Select *p
2d9e0 29 7b 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  ){.  Parse *pPar
2d9f0 73 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 53  se;.  int i;.  S
2da00 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74  rcList *pTabList
2da10 3b 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69  ;.  struct SrcLi
2da20 73 74 5f 69 74 65 6d 20 2a 70 46 72 6f 6d 3b 0a  st_item *pFrom;.
2da30 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 73 65  .  assert( p->se
2da40 6c 46 6c 61 67 73 20 26 20 53 46 5f 52 65 73 6f  lFlags & SF_Reso
2da50 6c 76 65 64 20 29 3b 0a 20 20 69 66 28 20 70 2d  lved );.  if( p-
2da60 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 48  >selFlags & SF_H
2da70 61 73 54 79 70 65 49 6e 66 6f 20 29 20 72 65 74  asTypeInfo ) ret
2da80 75 72 6e 3b 0a 20 20 70 2d 3e 73 65 6c 46 6c 61  urn;.  p->selFla
2da90 67 73 20 7c 3d 20 53 46 5f 48 61 73 54 79 70 65  gs |= SF_HasType
2daa0 49 6e 66 6f 3b 0a 20 20 70 50 61 72 73 65 20 3d  Info;.  pParse =
2dab0 20 70 57 61 6c 6b 65 72 2d 3e 70 50 61 72 73 65   pWalker->pParse
2dac0 3b 0a 20 20 70 54 61 62 4c 69 73 74 20 3d 20 70  ;.  pTabList = p
2dad0 2d 3e 70 53 72 63 3b 0a 20 20 66 6f 72 28 69 3d  ->pSrc;.  for(i=
2dae0 30 2c 20 70 46 72 6f 6d 3d 70 54 61 62 4c 69 73  0, pFrom=pTabLis
2daf0 74 2d 3e 61 3b 20 69 3c 70 54 61 62 4c 69 73 74  t->a; i<pTabList
2db00 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 46 72  ->nSrc; i++, pFr
2db10 6f 6d 2b 2b 29 7b 0a 20 20 20 20 54 61 62 6c 65  om++){.    Table
2db20 20 2a 70 54 61 62 20 3d 20 70 46 72 6f 6d 2d 3e   *pTab = pFrom->
2db30 70 54 61 62 3b 0a 20 20 20 20 61 73 73 65 72 74  pTab;.    assert
2db40 28 20 70 54 61 62 21 3d 30 20 29 3b 0a 20 20 20  ( pTab!=0 );.   
2db50 20 69 66 28 20 28 70 54 61 62 2d 3e 74 61 62 46   if( (pTab->tabF
2db60 6c 61 67 73 20 26 20 54 46 5f 45 70 68 65 6d 65  lags & TF_Epheme
2db70 72 61 6c 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  ral)!=0 ){.     
2db80 20 2f 2a 20 41 20 73 75 62 2d 71 75 65 72 79 20   /* A sub-query 
2db90 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  in the FROM clau
2dba0 73 65 20 6f 66 20 61 20 53 45 4c 45 43 54 20 2a  se of a SELECT *
2dbb0 2f 0a 20 20 20 20 20 20 53 65 6c 65 63 74 20 2a  /.      Select *
2dbc0 70 53 65 6c 20 3d 20 70 46 72 6f 6d 2d 3e 70 53  pSel = pFrom->pS
2dbd0 65 6c 65 63 74 3b 0a 20 20 20 20 20 20 69 66 28  elect;.      if(
2dbe0 20 70 53 65 6c 20 29 7b 0a 20 20 20 20 20 20 20   pSel ){.       
2dbf0 20 77 68 69 6c 65 28 20 70 53 65 6c 2d 3e 70 50   while( pSel->pP
2dc00 72 69 6f 72 20 29 20 70 53 65 6c 20 3d 20 70 53  rior ) pSel = pS
2dc10 65 6c 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20  el->pPrior;.    
2dc20 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63      sqlite3Selec
2dc30 74 41 64 64 43 6f 6c 75 6d 6e 54 79 70 65 41 6e  tAddColumnTypeAn
2dc40 64 43 6f 6c 6c 61 74 69 6f 6e 28 70 50 61 72 73  dCollation(pPars
2dc50 65 2c 20 70 54 61 62 2c 20 70 53 65 6c 29 3b 0a  e, pTab, pSel);.
2dc60 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
2dc70 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a  }.}.#endif.../*.
2dc80 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
2dc90 61 64 64 73 20 64 61 74 61 74 79 70 65 20 61 6e  adds datatype an
2dca0 64 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  d collating sequ
2dcb0 65 6e 63 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  ence information
2dcc0 20 74 6f 0a 2a 2a 20 74 68 65 20 54 61 62 6c 65   to.** the Table
2dcd0 20 73 74 72 75 63 74 75 72 65 73 20 6f 66 20 61   structures of a
2dce0 6c 6c 20 46 52 4f 4d 2d 63 6c 61 75 73 65 20 73  ll FROM-clause s
2dcf0 75 62 71 75 65 72 69 65 73 20 69 6e 20 61 0a 2a  ubqueries in a.*
2dd00 2a 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  * SELECT stateme
2dd10 6e 74 2e 0a 2a 2a 0a 2a 2a 20 55 73 65 20 74 68  nt..**.** Use th
2dd20 69 73 20 72 6f 75 74 69 6e 65 20 61 66 74 65 72  is routine after
2dd30 20 6e 61 6d 65 20 72 65 73 6f 6c 75 74 69 6f 6e   name resolution
2dd40 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
2dd50 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 41 64   sqlite3SelectAd
2dd60 64 54 79 70 65 49 6e 66 6f 28 50 61 72 73 65 20  dTypeInfo(Parse 
2dd70 2a 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74 20  *pParse, Select 
2dd80 2a 70 53 65 6c 65 63 74 29 7b 0a 23 69 66 6e 64  *pSelect){.#ifnd
2dd90 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
2dda0 55 42 51 55 45 52 59 0a 20 20 57 61 6c 6b 65 72  UBQUERY.  Walker
2ddb0 20 77 3b 0a 20 20 77 2e 78 53 65 6c 65 63 74 43   w;.  w.xSelectC
2ddc0 61 6c 6c 62 61 63 6b 20 3d 20 73 71 6c 69 74 65  allback = sqlite
2ddd0 33 53 65 6c 65 63 74 57 61 6c 6b 4e 6f 6f 70 3b  3SelectWalkNoop;
2dde0 0a 20 20 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c  .  w.xSelectCall
2ddf0 62 61 63 6b 32 20 3d 20 73 65 6c 65 63 74 41 64  back2 = selectAd
2de00 64 53 75 62 71 75 65 72 79 54 79 70 65 49 6e 66  dSubqueryTypeInf
2de10 6f 3b 0a 20 20 77 2e 78 45 78 70 72 43 61 6c 6c  o;.  w.xExprCall
2de20 62 61 63 6b 20 3d 20 73 71 6c 69 74 65 33 45 78  back = sqlite3Ex
2de30 70 72 57 61 6c 6b 4e 6f 6f 70 3b 0a 20 20 77 2e  prWalkNoop;.  w.
2de40 70 50 61 72 73 65 20 3d 20 70 50 61 72 73 65 3b  pParse = pParse;
2de50 0a 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 53 65  .  sqlite3WalkSe
2de60 6c 65 63 74 28 26 77 2c 20 70 53 65 6c 65 63 74  lect(&w, pSelect
2de70 29 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 0a 2f 2a  );.#endif.}.../*
2de80 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
2de90 20 73 65 74 73 20 75 70 20 61 20 53 45 4c 45 43   sets up a SELEC
2dea0 54 20 73 74 61 74 65 6d 65 6e 74 20 66 6f 72 20  T statement for 
2deb0 70 72 6f 63 65 73 73 69 6e 67 2e 20 20 54 68 65  processing.  The
2dec0 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 73  .** following is
2ded0 20 61 63 63 6f 6d 70 6c 69 73 68 65 64 3a 0a 2a   accomplished:.*
2dee0 2a 0a 2a 2a 20 20 20 20 20 2a 20 20 56 44 42 45  *.**     *  VDBE
2def0 20 43 75 72 73 6f 72 20 6e 75 6d 62 65 72 73 20   Cursor numbers 
2df00 61 72 65 20 61 73 73 69 67 6e 65 64 20 74 6f 20  are assigned to 
2df10 61 6c 6c 20 46 52 4f 4d 2d 63 6c 61 75 73 65 20  all FROM-clause 
2df20 74 65 72 6d 73 2e 0a 2a 2a 20 20 20 20 20 2a 20  terms..**     * 
2df30 20 45 70 68 65 6d 65 72 61 6c 20 54 61 62 6c 65   Ephemeral Table
2df40 20 6f 62 6a 65 63 74 73 20 61 72 65 20 63 72 65   objects are cre
2df50 61 74 65 64 20 66 6f 72 20 61 6c 6c 20 46 52 4f  ated for all FRO
2df60 4d 2d 63 6c 61 75 73 65 20 73 75 62 71 75 65 72  M-clause subquer
2df70 69 65 73 2e 0a 2a 2a 20 20 20 20 20 2a 20 20 4f  ies..**     *  O
2df80 4e 20 61 6e 64 20 55 53 49 4e 47 20 63 6c 61 75  N and USING clau
2df90 73 65 73 20 61 72 65 20 73 68 69 66 74 65 64 20  ses are shifted 
2dfa0 69 6e 74 6f 20 57 48 45 52 45 20 73 74 61 74 65  into WHERE state
2dfb0 6d 65 6e 74 73 0a 2a 2a 20 20 20 20 20 2a 20 20  ments.**     *  
2dfc0 57 69 6c 64 63 61 72 64 73 20 22 2a 22 20 61 6e  Wildcards "*" an
2dfd0 64 20 22 54 41 42 4c 45 2e 2a 22 20 69 6e 20 72  d "TABLE.*" in r
2dfe0 65 73 75 6c 74 20 73 65 74 73 20 61 72 65 20 65  esult sets are e
2dff0 78 70 61 6e 64 65 64 2e 0a 2a 2a 20 20 20 20 20  xpanded..**     
2e000 2a 20 20 49 64 65 6e 74 69 66 69 65 72 73 20 69  *  Identifiers i
2e010 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 61 72 65  n expression are
2e020 20 6d 61 74 63 68 65 64 20 74 6f 20 74 61 62 6c   matched to tabl
2e030 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  es..**.** This r
2e040 6f 75 74 69 6e 65 20 61 63 74 73 20 72 65 63 75  outine acts recu
2e050 72 73 69 76 65 6c 79 20 6f 6e 20 61 6c 6c 20 73  rsively on all s
2e060 75 62 71 75 65 72 69 65 73 20 77 69 74 68 69 6e  ubqueries within
2e070 20 74 68 65 20 53 45 4c 45 43 54 2e 0a 2a 2f 0a   the SELECT..*/.
2e080 76 6f 69 64 20 73 71 6c 69 74 65 33 53 65 6c 65  void sqlite3Sele
2e090 63 74 50 72 65 70 28 0a 20 20 50 61 72 73 65 20  ctPrep(.  Parse 
2e0a0 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
2e0b0 20 2f 2a 20 54 68 65 20 70 61 72 73 65 72 20 63   /* The parser c
2e0c0 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65  ontext */.  Sele
2e0d0 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  ct *p,          
2e0e0 20 20 20 2f 2a 20 54 68 65 20 53 45 4c 45 43 54     /* The SELECT
2e0f0 20 73 74 61 74 65 6d 65 6e 74 20 62 65 69 6e 67   statement being
2e100 20 63 6f 64 65 64 2e 20 2a 2f 0a 20 20 4e 61 6d   coded. */.  Nam
2e110 65 43 6f 6e 74 65 78 74 20 2a 70 4f 75 74 65 72  eContext *pOuter
2e120 4e 43 20 20 2f 2a 20 4e 61 6d 65 20 63 6f 6e 74  NC  /* Name cont
2e130 65 78 74 20 66 6f 72 20 63 6f 6e 74 61 69 6e 65  ext for containe
2e140 72 20 2a 2f 0a 29 7b 0a 20 20 61 73 73 65 72 74  r */.){.  assert
2e150 28 20 70 21 3d 30 20 7c 7c 20 70 50 61 72 73 65  ( p!=0 || pParse
2e160 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
2e170 65 64 20 29 3b 0a 20 20 69 66 28 20 70 50 61 72  ed );.  if( pPar
2e180 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  se->db->mallocFa
2e190 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20  iled ) return;. 
2e1a0 20 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73   if( p->selFlags
2e1b0 20 26 20 53 46 5f 48 61 73 54 79 70 65 49 6e 66   & SF_HasTypeInf
2e1c0 6f 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 73 71  o ) return;.  sq
2e1d0 6c 69 74 65 33 53 65 6c 65 63 74 45 78 70 61 6e  lite3SelectExpan
2e1e0 64 28 70 50 61 72 73 65 2c 20 70 29 3b 0a 20 20  d(pParse, p);.  
2e1f0 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72  if( pParse->nErr
2e200 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e   || pParse->db->
2e210 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72  mallocFailed ) r
2e220 65 74 75 72 6e 3b 0a 20 20 73 71 6c 69 74 65 33  eturn;.  sqlite3
2e230 52 65 73 6f 6c 76 65 53 65 6c 65 63 74 4e 61 6d  ResolveSelectNam
2e240 65 73 28 70 50 61 72 73 65 2c 20 70 2c 20 70 4f  es(pParse, p, pO
2e250 75 74 65 72 4e 43 29 3b 0a 20 20 69 66 28 20 70  uterNC);.  if( p
2e260 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 70  Parse->nErr || p
2e270 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  Parse->db->mallo
2e280 63 46 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e  cFailed ) return
2e290 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63  ;.  sqlite3Selec
2e2a0 74 41 64 64 54 79 70 65 49 6e 66 6f 28 70 50 61  tAddTypeInfo(pPa
2e2b0 72 73 65 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  rse, p);.}../*.*
2e2c0 2a 20 52 65 73 65 74 20 74 68 65 20 61 67 67 72  * Reset the aggr
2e2d0 65 67 61 74 65 20 61 63 63 75 6d 75 6c 61 74 6f  egate accumulato
2e2e0 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 67 67  r..**.** The agg
2e2f0 72 65 67 61 74 65 20 61 63 63 75 6d 75 6c 61 74  regate accumulat
2e300 6f 72 20 69 73 20 61 20 73 65 74 20 6f 66 20 6d  or is a set of m
2e310 65 6d 6f 72 79 20 63 65 6c 6c 73 20 74 68 61 74  emory cells that
2e320 20 68 6f 6c 64 0a 2a 2a 20 69 6e 74 65 72 6d 65   hold.** interme
2e330 64 69 61 74 65 20 72 65 73 75 6c 74 73 20 77 68  diate results wh
2e340 69 6c 65 20 63 61 6c 63 75 6c 61 74 69 6e 67 20  ile calculating 
2e350 61 6e 20 61 67 67 72 65 67 61 74 65 2e 20 20 54  an aggregate.  T
2e360 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 67  his.** routine g
2e370 65 6e 65 72 61 74 65 73 20 63 6f 64 65 20 74 68  enerates code th
2e380 61 74 20 73 74 6f 72 65 73 20 4e 55 4c 4c 73 20  at stores NULLs 
2e390 69 6e 20 61 6c 6c 20 6f 66 20 74 68 6f 73 65 20  in all of those 
2e3a0 6d 65 6d 6f 72 79 0a 2a 2a 20 63 65 6c 6c 73 2e  memory.** cells.
2e3b0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
2e3c0 72 65 73 65 74 41 63 63 75 6d 75 6c 61 74 6f 72  resetAccumulator
2e3d0 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
2e3e0 41 67 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66  AggInfo *pAggInf
2e3f0 6f 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  o){.  Vdbe *v = 
2e400 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20  pParse->pVdbe;. 
2e410 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74   int i;.  struct
2e420 20 41 67 67 49 6e 66 6f 5f 66 75 6e 63 20 2a 70   AggInfo_func *p
2e430 46 75 6e 63 3b 0a 20 20 69 6e 74 20 6e 52 65 67  Func;.  int nReg
2e440 20 3d 20 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75   = pAggInfo->nFu
2e450 6e 63 20 2b 20 70 41 67 67 49 6e 66 6f 2d 3e 6e  nc + pAggInfo->n
2e460 43 6f 6c 75 6d 6e 3b 0a 20 20 69 66 28 20 6e 52  Column;.  if( nR
2e470 65 67 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  eg==0 ) return;.
2e480 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
2e490 42 55 47 0a 20 20 2f 2a 20 56 65 72 69 66 79 20  BUG.  /* Verify 
2e4a0 74 68 61 74 20 61 6c 6c 20 41 67 67 49 6e 66 6f  that all AggInfo
2e4b0 20 72 65 67 69 73 74 65 72 73 20 61 72 65 20 77   registers are w
2e4c0 69 74 68 69 6e 20 74 68 65 20 72 61 6e 67 65 20  ithin the range 
2e4d0 73 70 65 63 69 66 69 65 64 20 62 79 0a 20 20 2a  specified by.  *
2e4e0 2a 20 41 67 67 49 6e 66 6f 2e 6d 6e 52 65 67 2e  * AggInfo.mnReg.
2e4f0 2e 41 67 67 49 6e 66 6f 2e 6d 78 52 65 67 20 2a  .AggInfo.mxReg *
2e500 2f 0a 20 20 61 73 73 65 72 74 28 20 6e 52 65 67  /.  assert( nReg
2e510 3d 3d 70 41 67 67 49 6e 66 6f 2d 3e 6d 78 52 65  ==pAggInfo->mxRe
2e520 67 2d 70 41 67 67 49 6e 66 6f 2d 3e 6d 6e 52 65  g-pAggInfo->mnRe
2e530 67 2b 31 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30  g+1 );.  for(i=0
2e540 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 43  ; i<pAggInfo->nC
2e550 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20  olumn; i++){.   
2e560 20 61 73 73 65 72 74 28 20 70 41 67 67 49 6e 66   assert( pAggInf
2e570 6f 2d 3e 61 43 6f 6c 5b 69 5d 2e 69 4d 65 6d 3e  o->aCol[i].iMem>
2e580 3d 70 41 67 67 49 6e 66 6f 2d 3e 6d 6e 52 65 67  =pAggInfo->mnReg
2e590 0a 20 20 20 20 20 20 20 20 20 26 26 20 70 41 67  .         && pAg
2e5a0 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 69 5d 2e 69  gInfo->aCol[i].i
2e5b0 4d 65 6d 3c 3d 70 41 67 67 49 6e 66 6f 2d 3e 6d  Mem<=pAggInfo->m
2e5c0 78 52 65 67 20 29 3b 0a 20 20 7d 0a 20 20 66 6f  xReg );.  }.  fo
2e5d0 72 28 69 3d 30 3b 20 69 3c 70 41 67 67 49 6e 66  r(i=0; i<pAggInf
2e5e0 6f 2d 3e 6e 46 75 6e 63 3b 20 69 2b 2b 29 7b 0a  o->nFunc; i++){.
2e5f0 20 20 20 20 61 73 73 65 72 74 28 20 70 41 67 67      assert( pAgg
2e600 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 69 5d 2e 69  Info->aFunc[i].i
2e610 4d 65 6d 3e 3d 70 41 67 67 49 6e 66 6f 2d 3e 6d  Mem>=pAggInfo->m
2e620 6e 52 65 67 0a 20 20 20 20 20 20 20 20 20 26 26  nReg.         &&
2e630 20 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63   pAggInfo->aFunc
2e640 5b 69 5d 2e 69 4d 65 6d 3c 3d 70 41 67 67 49 6e  [i].iMem<=pAggIn
2e650 66 6f 2d 3e 6d 78 52 65 67 20 29 3b 0a 20 20 7d  fo->mxReg );.  }
2e660 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65  .#endif.  sqlite
2e670 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
2e680 50 5f 4e 75 6c 6c 2c 20 30 2c 20 70 41 67 67 49  P_Null, 0, pAggI
2e690 6e 66 6f 2d 3e 6d 6e 52 65 67 2c 20 70 41 67 67  nfo->mnReg, pAgg
2e6a0 49 6e 66 6f 2d 3e 6d 78 52 65 67 29 3b 0a 20 20  Info->mxReg);.  
2e6b0 66 6f 72 28 70 46 75 6e 63 3d 70 41 67 67 49 6e  for(pFunc=pAggIn
2e6c0 66 6f 2d 3e 61 46 75 6e 63 2c 20 69 3d 30 3b 20  fo->aFunc, i=0; 
2e6d0 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e  i<pAggInfo->nFun
2e6e0 63 3b 20 69 2b 2b 2c 20 70 46 75 6e 63 2b 2b 29  c; i++, pFunc++)
2e6f0 7b 0a 20 20 20 20 69 66 28 20 70 46 75 6e 63 2d  {.    if( pFunc-
2e700 3e 69 44 69 73 74 69 6e 63 74 3e 3d 30 20 29 7b  >iDistinct>=0 ){
2e710 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 45 20  .      Expr *pE 
2e720 3d 20 70 46 75 6e 63 2d 3e 70 45 78 70 72 3b 0a  = pFunc->pExpr;.
2e730 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45        assert( !E
2e740 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
2e750 45 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29  E, EP_xIsSelect)
2e760 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45   );.      if( pE
2e770 2d 3e 78 2e 70 4c 69 73 74 3d 3d 30 20 7c 7c 20  ->x.pList==0 || 
2e780 70 45 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78  pE->x.pList->nEx
2e790 70 72 21 3d 31 20 29 7b 0a 20 20 20 20 20 20 20  pr!=1 ){.       
2e7a0 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
2e7b0 28 70 50 61 72 73 65 2c 20 22 44 49 53 54 49 4e  (pParse, "DISTIN
2e7c0 43 54 20 61 67 67 72 65 67 61 74 65 73 20 6d 75  CT aggregates mu
2e7d0 73 74 20 68 61 76 65 20 65 78 61 63 74 6c 79 20  st have exactly 
2e7e0 6f 6e 65 20 22 0a 20 20 20 20 20 20 20 20 20 20  one ".          
2e7f0 20 22 61 72 67 75 6d 65 6e 74 22 29 3b 0a 20 20   "argument");.  
2e800 20 20 20 20 20 20 70 46 75 6e 63 2d 3e 69 44 69        pFunc->iDi
2e810 73 74 69 6e 63 74 20 3d 20 2d 31 3b 0a 20 20 20  stinct = -1;.   
2e820 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2e830 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49    KeyInfo *pKeyI
2e840 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 4b 65 79  nfo = sqlite3Key
2e850 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74  InfoFromExprList
2e860 28 70 50 61 72 73 65 2c 20 70 45 2d 3e 78 2e 70  (pParse, pE->x.p
2e870 4c 69 73 74 2c 30 2c 30 29 3b 0a 20 20 20 20 20  List,0,0);.     
2e880 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
2e890 64 4f 70 34 28 76 2c 20 4f 50 5f 4f 70 65 6e 45  dOp4(v, OP_OpenE
2e8a0 70 68 65 6d 65 72 61 6c 2c 20 70 46 75 6e 63 2d  phemeral, pFunc-
2e8b0 3e 69 44 69 73 74 69 6e 63 74 2c 20 30 2c 20 30  >iDistinct, 0, 0
2e8c0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
2e8d0 20 20 20 20 20 20 20 20 20 20 20 20 28 63 68 61              (cha
2e8e0 72 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50 34 5f  r*)pKeyInfo, P4_
2e8f0 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 20 20 20 20  KEYINFO);.      
2e900 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  }.    }.  }.}../
2e910 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20  *.** Invoke the 
2e920 4f 50 5f 41 67 67 46 69 6e 61 6c 69 7a 65 20 6f  OP_AggFinalize o
2e930 70 63 6f 64 65 20 66 6f 72 20 65 76 65 72 79 20  pcode for every 
2e940 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69  aggregate functi
2e950 6f 6e 0a 2a 2a 20 69 6e 20 74 68 65 20 41 67 67  on.** in the Agg
2e960 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 2e 0a  Info structure..
2e970 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
2e980 69 6e 61 6c 69 7a 65 41 67 67 46 75 6e 63 74 69  inalizeAggFuncti
2e990 6f 6e 73 28 50 61 72 73 65 20 2a 70 50 61 72 73  ons(Parse *pPars
2e9a0 65 2c 20 41 67 67 49 6e 66 6f 20 2a 70 41 67 67  e, AggInfo *pAgg
2e9b0 49 6e 66 6f 29 7b 0a 20 20 56 64 62 65 20 2a 76  Info){.  Vdbe *v
2e9c0 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
2e9d0 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72  ;.  int i;.  str
2e9e0 75 63 74 20 41 67 67 49 6e 66 6f 5f 66 75 6e 63  uct AggInfo_func
2e9f0 20 2a 70 46 3b 0a 20 20 66 6f 72 28 69 3d 30 2c   *pF;.  for(i=0,
2ea00 20 70 46 3d 70 41 67 67 49 6e 66 6f 2d 3e 61 46   pF=pAggInfo->aF
2ea10 75 6e 63 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d  unc; i<pAggInfo-
2ea20 3e 6e 46 75 6e 63 3b 20 69 2b 2b 2c 20 70 46 2b  >nFunc; i++, pF+
2ea30 2b 29 7b 0a 20 20 20 20 45 78 70 72 4c 69 73 74  +){.    ExprList
2ea40 20 2a 70 4c 69 73 74 20 3d 20 70 46 2d 3e 70 45   *pList = pF->pE
2ea50 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20  xpr->x.pList;.  
2ea60 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48    assert( !ExprH
2ea70 61 73 50 72 6f 70 65 72 74 79 28 70 46 2d 3e 70  asProperty(pF->p
2ea80 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65  Expr, EP_xIsSele
2ea90 63 74 29 20 29 3b 0a 20 20 20 20 73 71 6c 69 74  ct) );.    sqlit
2eaa0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
2eab0 4f 50 5f 41 67 67 46 69 6e 61 6c 2c 20 70 46 2d  OP_AggFinal, pF-
2eac0 3e 69 4d 65 6d 2c 20 70 4c 69 73 74 20 3f 20 70  >iMem, pList ? p
2ead0 4c 69 73 74 2d 3e 6e 45 78 70 72 20 3a 20 30 29  List->nExpr : 0)
2eae0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
2eaf0 65 41 70 70 65 6e 64 50 34 28 76 2c 20 70 46 2d  eAppendP4(v, pF-
2eb00 3e 70 46 75 6e 63 2c 20 50 34 5f 46 55 4e 43 44  >pFunc, P4_FUNCD
2eb10 45 46 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a  EF);.  }.}.../*.
2eb20 2a 2a 20 55 70 64 61 74 65 20 74 68 65 20 61 63  ** Update the ac
2eb30 63 75 6d 75 6c 61 74 6f 72 20 6d 65 6d 6f 72 79  cumulator memory
2eb40 20 63 65 6c 6c 73 20 66 6f 72 20 61 6e 20 61 67   cells for an ag
2eb50 67 72 65 67 61 74 65 20 62 61 73 65 64 20 6f 6e  gregate based on
2eb60 0a 2a 2a 20 74 68 65 20 63 75 72 72 65 6e 74 20  .** the current 
2eb70 63 75 72 73 6f 72 20 70 6f 73 69 74 69 6f 6e 2e  cursor position.
2eb80 0a 2a 2a 0a 2a 2a 20 49 66 20 72 65 67 41 63 63  .**.** If regAcc
2eb90 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 20 61 6e 64   is non-zero and
2eba0 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 6d 69   there are no mi
2ebb0 6e 28 29 20 6f 72 20 6d 61 78 28 29 20 61 67 67  n() or max() agg
2ebc0 72 65 67 61 74 65 73 0a 2a 2a 20 69 6e 20 70 41  regates.** in pA
2ebd0 67 67 49 6e 66 6f 2c 20 74 68 65 6e 20 6f 6e 6c  ggInfo, then onl
2ebe0 79 20 70 6f 70 75 6c 61 74 65 20 74 68 65 20 70  y populate the p
2ebf0 41 67 67 49 6e 66 6f 2d 3e 6e 41 63 63 75 6d 75  AggInfo->nAccumu
2ec00 6c 61 74 6f 72 20 61 63 63 75 6d 75 6c 61 74 6f  lator accumulato
2ec10 72 0a 2a 2a 20 72 65 67 69 73 74 65 72 73 20 69  r.** registers i
2ec20 20 72 65 67 69 73 74 65 72 20 72 65 67 41 63 63   register regAcc
2ec30 20 63 6f 6e 74 61 69 6e 73 20 30 2e 20 54 68 65   contains 0. The
2ec40 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 74 61 6b   caller will tak
2ec50 65 20 63 61 72 65 0a 2a 2a 20 6f 66 20 73 65 74  e care.** of set
2ec60 74 69 6e 67 20 61 6e 64 20 63 6c 65 61 72 69 6e  ting and clearin
2ec70 67 20 72 65 67 41 63 63 2e 0a 2a 2f 0a 73 74 61  g regAcc..*/.sta
2ec80 74 69 63 20 76 6f 69 64 20 75 70 64 61 74 65 41  tic void updateA
2ec90 63 63 75 6d 75 6c 61 74 6f 72 28 50 61 72 73 65  ccumulator(Parse
2eca0 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 72 65   *pParse, int re
2ecb0 67 41 63 63 2c 20 41 67 67 49 6e 66 6f 20 2a 70  gAcc, AggInfo *p
2ecc0 41 67 67 49 6e 66 6f 29 7b 0a 20 20 56 64 62 65  AggInfo){.  Vdbe
2ecd0 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56   *v = pParse->pV
2ece0 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  dbe;.  int i;.  
2ecf0 69 6e 74 20 72 65 67 48 69 74 20 3d 20 30 3b 0a  int regHit = 0;.
2ed00 20 20 69 6e 74 20 61 64 64 72 48 69 74 54 65 73    int addrHitTes
2ed10 74 20 3d 20 30 3b 0a 20 20 73 74 72 75 63 74 20  t = 0;.  struct 
2ed20 41 67 67 49 6e 66 6f 5f 66 75 6e 63 20 2a 70 46  AggInfo_func *pF
2ed30 3b 0a 20 20 73 74 72 75 63 74 20 41 67 67 49 6e  ;.  struct AggIn
2ed40 66 6f 5f 63 6f 6c 20 2a 70 43 3b 0a 0a 20 20 70  fo_col *pC;..  p
2ed50 41 67 67 49 6e 66 6f 2d 3e 64 69 72 65 63 74 4d  AggInfo->directM
2ed60 6f 64 65 20 3d 20 31 3b 0a 20 20 66 6f 72 28 69  ode = 1;.  for(i
2ed70 3d 30 2c 20 70 46 3d 70 41 67 67 49 6e 66 6f 2d  =0, pF=pAggInfo-
2ed80 3e 61 46 75 6e 63 3b 20 69 3c 70 41 67 67 49 6e  >aFunc; i<pAggIn
2ed90 66 6f 2d 3e 6e 46 75 6e 63 3b 20 69 2b 2b 2c 20  fo->nFunc; i++, 
2eda0 70 46 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6e  pF++){.    int n
2edb0 41 72 67 3b 0a 20 20 20 20 69 6e 74 20 61 64 64  Arg;.    int add
2edc0 72 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20 20 69  rNext = 0;.    i
2edd0 6e 74 20 72 65 67 41 67 67 3b 0a 20 20 20 20 45  nt regAgg;.    E
2ede0 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d  xprList *pList =
2edf0 20 70 46 2d 3e 70 45 78 70 72 2d 3e 78 2e 70 4c   pF->pExpr->x.pL
2ee00 69 73 74 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ist;.    assert(
2ee10 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
2ee20 79 28 70 46 2d 3e 70 45 78 70 72 2c 20 45 50 5f  y(pF->pExpr, EP_
2ee30 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20  xIsSelect) );.  
2ee40 20 20 69 66 28 20 70 4c 69 73 74 20 29 7b 0a 20    if( pList ){. 
2ee50 20 20 20 20 20 6e 41 72 67 20 3d 20 70 4c 69 73       nArg = pLis
2ee60 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20  t->nExpr;.      
2ee70 72 65 67 41 67 67 20 3d 20 73 71 6c 69 74 65 33  regAgg = sqlite3
2ee80 47 65 74 54 65 6d 70 52 61 6e 67 65 28 70 50 61  GetTempRange(pPa
2ee90 72 73 65 2c 20 6e 41 72 67 29 3b 0a 20 20 20 20  rse, nArg);.    
2eea0 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
2eeb0 65 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65  eExprList(pParse
2eec0 2c 20 70 4c 69 73 74 2c 20 72 65 67 41 67 67 2c  , pList, regAgg,
2eed0 20 30 2c 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f   0, SQLITE_ECEL_
2eee0 44 55 50 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  DUP);.    }else{
2eef0 0a 20 20 20 20 20 20 6e 41 72 67 20 3d 20 30 3b  .      nArg = 0;
2ef00 0a 20 20 20 20 20 20 72 65 67 41 67 67 20 3d 20  .      regAgg = 
2ef10 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  0;.    }.    if(
2ef20 20 70 46 2d 3e 69 44 69 73 74 69 6e 63 74 3e 3d   pF->iDistinct>=
2ef30 30 20 29 7b 0a 20 20 20 20 20 20 61 64 64 72 4e  0 ){.      addrN
2ef40 65 78 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ext = sqlite3Vdb
2ef50 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
2ef60 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6e       testcase( n
2ef70 41 72 67 3d 3d 30 20 29 3b 20 20 2f 2a 20 45 72  Arg==0 );  /* Er
2ef80 72 6f 72 20 63 6f 6e 64 69 74 69 6f 6e 20 2a 2f  ror condition */
2ef90 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
2efa0 20 6e 41 72 67 3e 31 20 29 3b 20 20 20 2f 2a 20   nArg>1 );   /* 
2efb0 41 6c 73 6f 20 61 6e 20 65 72 72 6f 72 20 2a 2f  Also an error */
2efc0 0a 20 20 20 20 20 20 63 6f 64 65 44 69 73 74 69  .      codeDisti
2efd0 6e 63 74 28 70 50 61 72 73 65 2c 20 70 46 2d 3e  nct(pParse, pF->
2efe0 69 44 69 73 74 69 6e 63 74 2c 20 61 64 64 72 4e  iDistinct, addrN
2eff0 65 78 74 2c 20 31 2c 20 72 65 67 41 67 67 29 3b  ext, 1, regAgg);
2f000 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
2f010 46 2d 3e 70 46 75 6e 63 2d 3e 66 75 6e 63 46 6c  F->pFunc->funcFl
2f020 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46 55 4e  ags & SQLITE_FUN
2f030 43 5f 4e 45 45 44 43 4f 4c 4c 20 29 7b 0a 20 20  C_NEEDCOLL ){.  
2f040 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f      CollSeq *pCo
2f050 6c 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 74  ll = 0;.      st
2f060 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74  ruct ExprList_it
2f070 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 20 20 20  em *pItem;.     
2f080 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 61 73   int j;.      as
2f090 73 65 72 74 28 20 70 4c 69 73 74 21 3d 30 20 29  sert( pList!=0 )
2f0a0 3b 20 20 2f 2a 20 70 4c 69 73 74 21 3d 30 20 69  ;  /* pList!=0 i
2f0b0 66 20 70 46 2d 3e 70 46 75 6e 63 20 68 61 73 20  f pF->pFunc has 
2f0c0 4e 45 45 44 43 4f 4c 4c 20 2a 2f 0a 20 20 20 20  NEEDCOLL */.    
2f0d0 20 20 66 6f 72 28 6a 3d 30 2c 20 70 49 74 65 6d    for(j=0, pItem
2f0e0 3d 70 4c 69 73 74 2d 3e 61 3b 20 21 70 43 6f 6c  =pList->a; !pCol
2f0f0 6c 20 26 26 20 6a 3c 6e 41 72 67 3b 20 6a 2b 2b  l && j<nArg; j++
2f100 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20  , pItem++){.    
2f110 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69      pColl = sqli
2f120 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70  te3ExprCollSeq(p
2f130 50 61 72 73 65 2c 20 70 49 74 65 6d 2d 3e 70 45  Parse, pItem->pE
2f140 78 70 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  xpr);.      }.  
2f150 20 20 20 20 69 66 28 20 21 70 43 6f 6c 6c 20 29      if( !pColl )
2f160 7b 0a 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 20  {.        pColl 
2f170 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 70 44  = pParse->db->pD
2f180 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 7d  fltColl;.      }
2f190 0a 20 20 20 20 20 20 69 66 28 20 72 65 67 48 69  .      if( regHi
2f1a0 74 3d 3d 30 20 26 26 20 70 41 67 67 49 6e 66 6f  t==0 && pAggInfo
2f1b0 2d 3e 6e 41 63 63 75 6d 75 6c 61 74 6f 72 20 29  ->nAccumulator )
2f1c0 20 72 65 67 48 69 74 20 3d 20 2b 2b 70 50 61 72   regHit = ++pPar
2f1d0 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20  se->nMem;.      
2f1e0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
2f1f0 34 28 76 2c 20 4f 50 5f 43 6f 6c 6c 53 65 71 2c  4(v, OP_CollSeq,
2f200 20 72 65 67 48 69 74 2c 20 30 2c 20 30 2c 20 28   regHit, 0, 0, (
2f210 63 68 61 72 20 2a 29 70 43 6f 6c 6c 2c 20 50 34  char *)pColl, P4
2f220 5f 43 4f 4c 4c 53 45 51 29 3b 0a 20 20 20 20 7d  _COLLSEQ);.    }
2f230 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
2f240 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 41 67 67  AddOp3(v, OP_Agg
2f250 53 74 65 70 2c 20 30 2c 20 72 65 67 41 67 67 2c  Step, 0, regAgg,
2f260 20 70 46 2d 3e 69 4d 65 6d 29 3b 0a 20 20 20 20   pF->iMem);.    
2f270 73 71 6c 69 74 65 33 56 64 62 65 41 70 70 65 6e  sqlite3VdbeAppen
2f280 64 50 34 28 76 2c 20 70 46 2d 3e 70 46 75 6e 63  dP4(v, pF->pFunc
2f290 2c 20 50 34 5f 46 55 4e 43 44 45 46 29 3b 0a 20  , P4_FUNCDEF);. 
2f2a0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
2f2b0 61 6e 67 65 50 35 28 76 2c 20 28 75 38 29 6e 41  angeP5(v, (u8)nA
2f2c0 72 67 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  rg);.    sqlite3
2f2d0 52 65 6c 65 61 73 65 54 65 6d 70 52 61 6e 67 65  ReleaseTempRange
2f2e0 28 70 50 61 72 73 65 2c 20 72 65 67 41 67 67 2c  (pParse, regAgg,
2f2f0 20 6e 41 72 67 29 3b 0a 20 20 20 20 69 66 28 20   nArg);.    if( 
2f300 61 64 64 72 4e 65 78 74 20 29 7b 0a 20 20 20 20  addrNext ){.    
2f310 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
2f320 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61 64 64  olveLabel(v, add
2f330 72 4e 65 78 74 29 3b 0a 20 20 20 20 7d 0a 20 20  rNext);.    }.  
2f340 7d 0a 20 20 69 66 28 20 72 65 67 48 69 74 3d 3d  }.  if( regHit==
2f350 30 20 26 26 20 70 41 67 67 49 6e 66 6f 2d 3e 6e  0 && pAggInfo->n
2f360 41 63 63 75 6d 75 6c 61 74 6f 72 20 29 7b 0a 20  Accumulator ){. 
2f370 20 20 20 72 65 67 48 69 74 20 3d 20 72 65 67 41     regHit = regA
2f380 63 63 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 65  cc;.  }.  if( re
2f390 67 48 69 74 20 29 7b 0a 20 20 20 20 61 64 64 72  gHit ){.    addr
2f3a0 48 69 74 54 65 73 74 20 3d 20 73 71 6c 69 74 65  HitTest = sqlite
2f3b0 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
2f3c0 50 5f 49 66 2c 20 72 65 67 48 69 74 29 3b 20 56  P_If, regHit); V
2f3d0 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
2f3e0 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70    }.  for(i=0, p
2f3f0 43 3d 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c  C=pAggInfo->aCol
2f400 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 41  ; i<pAggInfo->nA
2f410 63 63 75 6d 75 6c 61 74 6f 72 3b 20 69 2b 2b 2c  ccumulator; i++,
2f420 20 70 43 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69   pC++){.    sqli
2f430 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72  te3ExprCode(pPar
2f440 73 65 2c 20 70 43 2d 3e 70 45 78 70 72 2c 20 70  se, pC->pExpr, p
2f450 43 2d 3e 69 4d 65 6d 29 3b 0a 20 20 7d 0a 20 20  C->iMem);.  }.  
2f460 70 41 67 67 49 6e 66 6f 2d 3e 64 69 72 65 63 74  pAggInfo->direct
2f470 4d 6f 64 65 20 3d 20 30 3b 0a 20 20 69 66 28 20  Mode = 0;.  if( 
2f480 61 64 64 72 48 69 74 54 65 73 74 20 29 7b 0a 20  addrHitTest ){. 
2f490 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
2f4a0 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 48 69  mpHere(v, addrHi
2f4b0 74 54 65 73 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  tTest);.  }.}../
2f4c0 2a 0a 2a 2a 20 41 64 64 20 61 20 73 69 6e 67 6c  *.** Add a singl
2f4d0 65 20 4f 50 5f 45 78 70 6c 61 69 6e 20 69 6e 73  e OP_Explain ins
2f4e0 74 72 75 63 74 69 6f 6e 20 74 6f 20 74 68 65 20  truction to the 
2f4f0 56 44 42 45 20 74 6f 20 65 78 70 6c 61 69 6e 20  VDBE to explain 
2f500 61 20 73 69 6d 70 6c 65 0a 2a 2a 20 63 6f 75 6e  a simple.** coun
2f510 74 28 2a 29 20 71 75 65 72 79 20 28 22 53 45 4c  t(*) query ("SEL
2f520 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f  ECT count(*) FRO
2f530 4d 20 70 54 61 62 22 29 2e 0a 2a 2f 0a 23 69 66  M pTab")..*/.#if
2f540 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
2f550 5f 45 58 50 4c 41 49 4e 0a 73 74 61 74 69 63 20  _EXPLAIN.static 
2f560 76 6f 69 64 20 65 78 70 6c 61 69 6e 53 69 6d 70  void explainSimp
2f570 6c 65 43 6f 75 6e 74 28 0a 20 20 50 61 72 73 65  leCount(.  Parse
2f580 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
2f590 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
2f5a0 72 73 65 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  rse context */. 
2f5b0 20 54 61 62 6c 65 20 2a 70 54 61 62 2c 20 20 20   Table *pTab,   
2f5c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f5d0 20 2f 2a 20 54 61 62 6c 65 20 62 65 69 6e 67 20   /* Table being 
2f5e0 71 75 65 72 69 65 64 20 2a 2f 0a 20 20 49 6e 64  queried */.  Ind
2f5f0 65 78 20 2a 70 49 64 78 20 20 20 20 20 20 20 20  ex *pIdx        
2f600 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2f610 49 6e 64 65 78 20 75 73 65 64 20 74 6f 20 6f 70  Index used to op
2f620 74 69 6d 69 7a 65 20 73 63 61 6e 2c 20 6f 72 20  timize scan, or 
2f630 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 69 66 28  NULL */.){.  if(
2f640 20 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e   pParse->explain
2f650 3d 3d 32 20 29 7b 0a 20 20 20 20 69 6e 74 20 62  ==2 ){.    int b
2f660 43 6f 76 65 72 20 3d 20 28 70 49 64 78 21 3d 30  Cover = (pIdx!=0
2f670 20 26 26 20 28 48 61 73 52 6f 77 69 64 28 70 54   && (HasRowid(pT
2f680 61 62 29 20 7c 7c 20 21 49 73 50 72 69 6d 61 72  ab) || !IsPrimar
2f690 79 4b 65 79 49 6e 64 65 78 28 70 49 64 78 29 29  yKeyIndex(pIdx))
2f6a0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
2f6b0 62 65 45 78 70 6c 61 69 6e 28 70 50 61 72 73 65  beExplain(pParse
2f6c0 2c 20 30 2c 20 22 53 43 41 4e 20 54 41 42 4c 45  , 0, "SCAN TABLE
2f6d0 20 25 73 25 73 25 73 22 2c 0a 20 20 20 20 20 20   %s%s%s",.      
2f6e0 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 0a 20    pTab->zName,. 
2f6f0 20 20 20 20 20 20 20 62 43 6f 76 65 72 20 3f 20         bCover ? 
2f700 22 20 55 53 49 4e 47 20 43 4f 56 45 52 49 4e 47  " USING COVERING
2f710 20 49 4e 44 45 58 20 22 20 3a 20 22 22 2c 0a 20   INDEX " : "",. 
2f720 20 20 20 20 20 20 20 62 43 6f 76 65 72 20 3f 20         bCover ? 
2f730 70 49 64 78 2d 3e 7a 4e 61 6d 65 20 3a 20 22 22  pIdx->zName : ""
2f740 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 7d 0a 23 65  .    );.  }.}.#e
2f750 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 65 78 70  lse.# define exp
2f760 6c 61 69 6e 53 69 6d 70 6c 65 43 6f 75 6e 74 28  lainSimpleCount(
2f770 61 2c 62 2c 63 29 0a 23 65 6e 64 69 66 0a 0a 2f  a,b,c).#endif../
2f780 2a 0a 2a 2a 20 73 71 6c 69 74 65 33 57 61 6c 6b  *.** sqlite3Walk
2f790 45 78 70 72 28 29 20 63 61 6c 6c 62 61 63 6b 20  Expr() callback 
2f7a0 75 73 65 64 20 62 79 20 68 61 76 69 6e 67 54 6f  used by havingTo
2f7b0 57 68 65 72 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 49  Where()..**.** I
2f7c0 66 20 74 68 65 20 6e 6f 64 65 20 70 61 73 73 65  f the node passe
2f7d0 64 20 74 6f 20 74 68 65 20 63 61 6c 6c 62 61 63  d to the callbac
2f7e0 6b 20 69 73 20 61 20 54 4b 5f 41 4e 44 20 6e 6f  k is a TK_AND no
2f7f0 64 65 2c 20 72 65 74 75 72 6e 20 0a 2a 2a 20 57  de, return .** W
2f800 52 43 5f 43 6f 6e 74 69 6e 75 65 20 74 6f 20 74  RC_Continue to t
2f810 65 6c 6c 20 73 71 6c 69 74 65 33 57 61 6c 6b 45  ell sqlite3WalkE
2f820 78 70 72 28 29 20 74 6f 20 69 74 65 72 61 74 65  xpr() to iterate
2f830 20 74 68 72 6f 75 67 68 20 63 68 69 6c 64 20 6e   through child n
2f840 6f 64 65 73 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65  odes..**.** Othe
2f850 72 77 69 73 65 2c 20 72 65 74 75 72 6e 20 57 52  rwise, return WR
2f860 43 5f 50 72 75 6e 65 2e 20 49 6e 20 74 68 69 73  C_Prune. In this
2f870 20 63 61 73 65 2c 20 61 6c 73 6f 20 63 68 65 63   case, also chec
2f880 6b 20 69 66 20 74 68 65 20 0a 2a 2a 20 73 75 62  k if the .** sub
2f890 2d 65 78 70 72 65 73 73 69 6f 6e 20 6d 61 74 63  -expression matc
2f8a0 68 65 73 20 74 68 65 20 63 72 69 74 65 72 69 61  hes the criteria
2f8b0 20 66 6f 72 20 62 65 69 6e 67 20 6d 6f 76 65 64   for being moved
2f8c0 20 74 6f 20 74 68 65 20 57 48 45 52 45 0a 2a 2a   to the WHERE.**
2f8d0 20 63 6c 61 75 73 65 2e 20 49 66 20 73 6f 2c 20   clause. If so, 
2f8e0 61 64 64 20 69 74 20 74 6f 20 74 68 65 20 57 48  add it to the WH
2f8f0 45 52 45 20 63 6c 61 75 73 65 20 61 6e 64 20 72  ERE clause and r
2f900 65 70 6c 61 63 65 20 74 68 65 20 73 75 62 2d 65  eplace the sub-e
2f910 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 77 69 74  xpression.** wit
2f920 68 69 6e 20 74 68 65 20 48 41 56 49 4e 47 20 65  hin the HAVING e
2f930 78 70 72 65 73 73 69 6f 6e 20 77 69 74 68 20 61  xpression with a
2f940 20 63 6f 6e 73 74 61 6e 74 20 22 31 22 2e 0a 2a   constant "1"..*
2f950 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 68 61 76  /.static int hav
2f960 69 6e 67 54 6f 57 68 65 72 65 45 78 70 72 43 62  ingToWhereExprCb
2f970 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72  (Walker *pWalker
2f980 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a  , Expr *pExpr){.
2f990 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 21    if( pExpr->op!
2f9a0 3d 54 4b 5f 41 4e 44 20 29 7b 0a 20 20 20 20 53  =TK_AND ){.    S
2f9b0 65 6c 65 63 74 20 2a 70 53 20 3d 20 70 57 61 6c  elect *pS = pWal
2f9c0 6b 65 72 2d 3e 75 2e 70 53 65 6c 65 63 74 3b 0a  ker->u.pSelect;.
2f9d0 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45      if( sqlite3E
2f9e0 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 4f 72 47  xprIsConstantOrG
2f9f0 72 6f 75 70 42 79 28 70 57 61 6c 6b 65 72 2d 3e  roupBy(pWalker->
2fa00 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 70  pParse, pExpr, p
2fa10 53 2d 3e 70 47 72 6f 75 70 42 79 29 20 29 7b 0a  S->pGroupBy) ){.
2fa20 20 20 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64        sqlite3 *d
2fa30 62 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 70 50 61  b = pWalker->pPa
2fa40 72 73 65 2d 3e 64 62 3b 0a 20 20 20 20 20 20 45  rse->db;.      E
2fa50 78 70 72 20 2a 70 4e 65 77 20 3d 20 73 71 6c 69  xpr *pNew = sqli
2fa60 74 65 33 45 78 70 72 41 6c 6c 6f 63 28 64 62 2c  te3ExprAlloc(db,
2fa70 20 54 4b 5f 49 4e 54 45 47 45 52 2c 20 26 73 71   TK_INTEGER, &sq
2fa80 6c 69 74 65 33 49 6e 74 54 6f 6b 65 6e 73 5b 31  lite3IntTokens[1
2fa90 5d 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28  ], 0);.      if(
2faa0 20 70 4e 65 77 20 29 7b 0a 20 20 20 20 20 20 20   pNew ){.       
2fab0 20 45 78 70 72 20 2a 70 57 68 65 72 65 20 3d 20   Expr *pWhere = 
2fac0 70 53 2d 3e 70 57 68 65 72 65 3b 0a 20 20 20 20  pS->pWhere;.    
2fad0 20 20 20 20 53 57 41 50 28 45 78 70 72 2c 20 2a      SWAP(Expr, *
2fae0 70 4e 65 77 2c 20 2a 70 45 78 70 72 29 3b 0a 20  pNew, *pExpr);. 
2faf0 20 20 20 20 20 20 20 70 4e 65 77 20 3d 20 73 71         pNew = sq
2fb00 6c 69 74 65 33 45 78 70 72 41 6e 64 28 64 62 2c  lite3ExprAnd(db,
2fb10 20 70 57 68 65 72 65 2c 20 70 4e 65 77 29 3b 0a   pWhere, pNew);.
2fb20 20 20 20 20 20 20 20 20 70 53 2d 3e 70 57 68 65          pS->pWhe
2fb30 72 65 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 20  re = pNew;.     
2fb40 20 20 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64     pWalker->eCod
2fb50 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20  e = 1;.      }. 
2fb60 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20     }.    return 
2fb70 57 52 43 5f 50 72 75 6e 65 3b 0a 20 20 7d 0a 20  WRC_Prune;.  }. 
2fb80 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74   return WRC_Cont
2fb90 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  inue;.}../*.** T
2fba0 72 61 6e 73 66 65 72 20 65 6c 69 67 69 62 6c 65  ransfer eligible
2fbb0 20 74 65 72 6d 73 20 66 72 6f 6d 20 74 68 65 20   terms from the 
2fbc0 48 41 56 49 4e 47 20 63 6c 61 75 73 65 20 6f 66  HAVING clause of
2fbd0 20 61 20 71 75 65 72 79 2c 20 77 68 69 63 68 20   a query, which 
2fbe0 69 73 0a 2a 2a 20 70 72 6f 63 65 73 73 65 64 20  is.** processed 
2fbf0 61 66 74 65 72 20 67 72 6f 75 70 69 6e 67 2c 20  after grouping, 
2fc00 74 6f 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  to the WHERE cla
2fc10 75 73 65 2c 20 77 68 69 63 68 20 69 73 20 70 72  use, which is pr
2fc20 6f 63 65 73 73 65 64 20 62 65 66 6f 72 65 0a 2a  ocessed before.*
2fc30 2a 20 67 72 6f 75 70 69 6e 67 2e 20 46 6f 72 20  * grouping. For 
2fc40 65 78 61 6d 70 6c 65 2c 20 74 68 65 20 71 75 65  example, the que
2fc50 72 79 3a 0a 2a 2a 0a 2a 2a 20 20 20 53 45 4c 45  ry:.**.**   SELE
2fc60 43 54 20 2a 20 46 52 4f 4d 20 3c 74 61 62 6c 65  CT * FROM <table
2fc70 73 3e 20 57 48 45 52 45 20 61 3d 3f 20 47 52 4f  s> WHERE a=? GRO
2fc80 55 50 20 42 59 20 62 20 48 41 56 49 4e 47 20 62  UP BY b HAVING b
2fc90 3d 3f 20 41 4e 44 20 63 3d 3f 0a 2a 2a 0a 2a 2a  =? AND c=?.**.**
2fca0 20 63 61 6e 20 62 65 20 72 65 77 72 69 74 74 65   can be rewritte
2fcb0 6e 20 61 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 53 45  n as:.**.**   SE
2fcc0 4c 45 43 54 20 2a 20 46 52 4f 4d 20 3c 74 61 62  LECT * FROM <tab
2fcd0 6c 65 73 3e 20 57 48 45 52 45 20 61 3d 3f 20 41  les> WHERE a=? A
2fce0 4e 44 20 62 3d 3f 20 47 52 4f 55 50 20 42 59 20  ND b=? GROUP BY 
2fcf0 62 20 48 41 56 49 4e 47 20 63 3d 3f 0a 2a 2a 0a  b HAVING c=?.**.
2fd00 2a 2a 20 41 20 74 65 72 6d 20 6f 66 20 74 68 65  ** A term of the
2fd10 20 48 41 56 49 4e 47 20 65 78 70 72 65 73 73 69   HAVING expressi
2fd20 6f 6e 20 69 73 20 65 6c 69 67 69 62 6c 65 20 66  on is eligible f
2fd30 6f 72 20 74 72 61 6e 73 66 65 72 20 69 66 20 69  or transfer if i
2fd40 74 20 63 6f 6e 73 69 73 74 73 0a 2a 2a 20 65 6e  t consists.** en
2fd50 74 69 72 65 6c 79 20 6f 66 20 63 6f 6e 73 74 61  tirely of consta
2fd60 6e 74 73 20 61 6e 64 20 65 78 70 72 65 73 73 69  nts and expressi
2fd70 6f 6e 73 20 74 68 61 74 20 61 72 65 20 61 6c 73  ons that are als
2fd80 6f 20 47 52 4f 55 50 20 42 59 20 74 65 72 6d 73  o GROUP BY terms
2fd90 20 74 68 61 74 0a 2a 2a 20 75 73 65 20 74 68 65   that.** use the
2fda0 20 22 42 49 4e 41 52 59 22 20 63 6f 6c 6c 61 74   "BINARY" collat
2fdb0 69 6f 6e 20 73 65 71 75 65 6e 63 65 2e 0a 2a 2f  ion sequence..*/
2fdc0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 68 61 76  .static void hav
2fdd0 69 6e 67 54 6f 57 68 65 72 65 28 50 61 72 73 65  ingToWhere(Parse
2fde0 20 2a 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74   *pParse, Select
2fdf0 20 2a 70 29 7b 0a 20 20 57 61 6c 6b 65 72 20 73   *p){.  Walker s
2fe00 57 61 6c 6b 65 72 3b 0a 20 20 6d 65 6d 73 65 74  Walker;.  memset
2fe10 28 26 73 57 61 6c 6b 65 72 2c 20 30 2c 20 73 69  (&sWalker, 0, si
2fe20 7a 65 6f 66 28 73 57 61 6c 6b 65 72 29 29 3b 0a  zeof(sWalker));.
2fe30 20 20 73 57 61 6c 6b 65 72 2e 70 50 61 72 73 65    sWalker.pParse
2fe40 20 3d 20 70 50 61 72 73 65 3b 0a 20 20 73 57 61   = pParse;.  sWa
2fe50 6c 6b 65 72 2e 78 45 78 70 72 43 61 6c 6c 62 61  lker.xExprCallba
2fe60 63 6b 20 3d 20 68 61 76 69 6e 67 54 6f 57 68 65  ck = havingToWhe
2fe70 72 65 45 78 70 72 43 62 3b 0a 20 20 73 57 61 6c  reExprCb;.  sWal
2fe80 6b 65 72 2e 75 2e 70 53 65 6c 65 63 74 20 3d 20  ker.u.pSelect = 
2fe90 70 3b 0a 20 20 73 71 6c 69 74 65 33 57 61 6c 6b  p;.  sqlite3Walk
2fea0 45 78 70 72 28 26 73 57 61 6c 6b 65 72 2c 20 70  Expr(&sWalker, p
2feb0 2d 3e 70 48 61 76 69 6e 67 29 3b 0a 23 69 66 20  ->pHaving);.#if 
2fec0 53 45 4c 45 43 54 54 52 41 43 45 5f 45 4e 41 42  SELECTTRACE_ENAB
2fed0 4c 45 44 0a 20 20 69 66 28 20 73 57 61 6c 6b 65  LED.  if( sWalke
2fee0 72 2e 65 43 6f 64 65 20 26 26 20 28 73 71 6c 69  r.eCode && (sqli
2fef0 74 65 33 53 65 6c 65 63 74 54 72 61 63 65 20 26  te3SelectTrace &
2ff00 20 30 78 31 30 30 29 21 3d 30 20 29 7b 0a 20 20   0x100)!=0 ){.  
2ff10 20 20 53 45 4c 45 43 54 54 52 41 43 45 28 30 78    SELECTTRACE(0x
2ff20 31 30 30 2c 70 50 61 72 73 65 2c 70 2c 28 22 4d  100,pParse,p,("M
2ff30 6f 76 65 20 48 41 56 49 4e 47 20 74 65 72 6d 73  ove HAVING terms
2ff40 20 69 6e 74 6f 20 57 48 45 52 45 3a 5c 6e 22 29   into WHERE:\n")
2ff50 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 54 72  );.    sqlite3Tr
2ff60 65 65 56 69 65 77 53 65 6c 65 63 74 28 30 2c 20  eeViewSelect(0, 
2ff70 70 2c 20 30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  p, 0);.  }.#endi
2ff80 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b  f.}../*.** Check
2ff90 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 20 70   to see if the p
2ffa0 54 68 69 73 20 65 6e 74 72 79 20 6f 66 20 70 54  This entry of pT
2ffb0 61 62 4c 69 73 74 20 69 73 20 61 20 73 65 6c 66  abList is a self
2ffc0 2d 6a 6f 69 6e 20 6f 66 20 61 20 70 72 69 6f 72  -join of a prior
2ffd0 20 76 69 65 77 2e 0a 2a 2a 20 49 66 20 69 74 20   view..** If it 
2ffe0 69 73 2c 20 74 68 65 6e 20 72 65 74 75 72 6e 20  is, then return 
2fff0 74 68 65 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  the SrcList_item
30000 20 66 6f 72 20 74 68 65 20 70 72 69 6f 72 20 76   for the prior v
30010 69 65 77 2e 20 20 49 66 20 69 74 20 69 73 20 6e  iew.  If it is n
30020 6f 74 2c 0a 2a 2a 20 74 68 65 6e 20 72 65 74 75  ot,.** then retu
30030 72 6e 20 30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rn 0..*/.static 
30040 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
30050 74 65 6d 20 2a 69 73 53 65 6c 66 4a 6f 69 6e 56  tem *isSelfJoinV
30060 69 65 77 28 0a 20 20 53 72 63 4c 69 73 74 20 2a  iew(.  SrcList *
30070 70 54 61 62 4c 69 73 74 2c 20 20 20 20 20 20 20  pTabList,       
30080 20 20 20 20 2f 2a 20 53 65 61 72 63 68 20 66 6f      /* Search fo
30090 72 20 73 65 6c 66 2d 6a 6f 69 6e 73 20 69 6e 20  r self-joins in 
300a0 74 68 69 73 20 46 52 4f 4d 20 63 6c 61 75 73 65  this FROM clause
300b0 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63   */.  struct Src
300c0 4c 69 73 74 5f 69 74 65 6d 20 2a 70 54 68 69 73  List_item *pThis
300d0 20 20 20 2f 2a 20 53 65 61 72 63 68 20 66 6f 72     /* Search for
300e0 20 70 72 69 6f 72 20 72 65 66 65 72 65 6e 63 65   prior reference
300f0 20 74 6f 20 74 68 69 73 20 73 75 62 71 75 65 72   to this subquer
30100 79 20 2a 2f 0a 29 7b 0a 20 20 73 74 72 75 63 74  y */.){.  struct
30110 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
30120 49 74 65 6d 3b 0a 20 20 66 6f 72 28 70 49 74 65  Item;.  for(pIte
30130 6d 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61 3b  m = pTabList->a;
30140 20 70 49 74 65 6d 3c 70 54 68 69 73 3b 20 70 49   pItem<pThis; pI
30150 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  tem++){.    if( 
30160 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 3d 3d  pItem->pSelect==
30170 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  0 ) continue;.  
30180 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 66 67 2e    if( pItem->fg.
30190 76 69 61 43 6f 72 6f 75 74 69 6e 65 20 29 20 63  viaCoroutine ) c
301a0 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28  ontinue;.    if(
301b0 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 3d 3d 30   pItem->zName==0
301c0 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
301d0 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73 74 72   if( sqlite3_str
301e0 69 63 6d 70 28 70 49 74 65 6d 2d 3e 7a 44 61 74  icmp(pItem->zDat
301f0 61 62 61 73 65 2c 20 70 54 68 69 73 2d 3e 7a 44  abase, pThis->zD
30200 61 74 61 62 61 73 65 29 21 3d 30 20 29 20 63 6f  atabase)!=0 ) co
30210 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20  ntinue;.    if( 
30220 73 71 6c 69 74 65 33 5f 73 74 72 69 63 6d 70 28  sqlite3_stricmp(
30230 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 2c 20 70 54  pItem->zName, pT
30240 68 69 73 2d 3e 7a 4e 61 6d 65 29 21 3d 30 20 29  his->zName)!=0 )
30250 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69   continue;.    i
30260 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  f( sqlite3ExprCo
30270 6d 70 61 72 65 28 30 2c 20 0a 20 20 20 20 20 20  mpare(0, .      
30280 20 20 20 20 70 54 68 69 73 2d 3e 70 53 65 6c 65      pThis->pSele
30290 63 74 2d 3e 70 57 68 65 72 65 2c 20 70 49 74 65  ct->pWhere, pIte
302a0 6d 2d 3e 70 53 65 6c 65 63 74 2d 3e 70 57 68 65  m->pSelect->pWhe
302b0 72 65 2c 20 2d 31 29 20 0a 20 20 20 20 29 7b 0a  re, -1) .    ){.
302c0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 76 69 65        /* The vie
302d0 77 20 77 61 73 20 6d 6f 64 69 66 69 65 64 20 62  w was modified b
302e0 79 20 73 6f 6d 65 20 6f 74 68 65 72 20 6f 70 74  y some other opt
302f0 69 6d 69 7a 61 74 69 6f 6e 20 73 75 63 68 20 61  imization such a
30300 73 0a 20 20 20 20 20 20 2a 2a 20 70 75 73 68 44  s.      ** pushD
30310 6f 77 6e 57 68 65 72 65 54 65 72 6d 73 28 29 20  ownWhereTerms() 
30320 2a 2f 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75  */.      continu
30330 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74  e;.    }.    ret
30340 75 72 6e 20 70 49 74 65 6d 3b 0a 20 20 7d 0a 20  urn pItem;.  }. 
30350 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 23 69   return 0;.}..#i
30360 66 64 65 66 20 53 51 4c 49 54 45 5f 43 4f 55 4e  fdef SQLITE_COUN
30370 54 4f 46 56 49 45 57 5f 4f 50 54 49 4d 49 5a 41  TOFVIEW_OPTIMIZA
30380 54 49 4f 4e 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d  TION./*.** Attem
30390 70 74 20 74 6f 20 74 72 61 6e 73 66 6f 72 6d 20  pt to transform 
303a0 61 20 71 75 65 72 79 20 6f 66 20 74 68 65 20 66  a query of the f
303b0 6f 72 6d 0a 2a 2a 0a 2a 2a 20 20 20 20 53 45 4c  orm.**.**    SEL
303c0 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f  ECT count(*) FRO
303d0 4d 20 28 53 45 4c 45 43 54 20 78 20 46 52 4f 4d  M (SELECT x FROM
303e0 20 74 31 20 55 4e 49 4f 4e 20 41 4c 4c 20 53 45   t1 UNION ALL SE
303f0 4c 45 43 54 20 79 20 46 52 4f 4d 20 74 32 29 0a  LECT y FROM t2).
30400 2a 2a 0a 2a 2a 20 49 6e 74 6f 20 74 68 69 73 3a  **.** Into this:
30410 0a 2a 2a 0a 2a 2a 20 20 20 20 53 45 4c 45 43 54  .**.**    SELECT
30420 20 28 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a   (SELECT count(*
30430 29 20 46 52 4f 4d 20 74 31 29 2b 28 53 45 4c 45  ) FROM t1)+(SELE
30440 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d  CT count(*) FROM
30450 20 74 32 29 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74   t2).**.** The t
30460 72 61 6e 73 66 6f 72 6d 61 74 69 6f 6e 20 6f 6e  ransformation on
30470 6c 79 20 77 6f 72 6b 73 20 69 66 20 61 6c 6c 20  ly works if all 
30480 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
30490 20 61 72 65 20 74 72 75 65 3a 0a 2a 2a 0a 2a 2a   are true:.**.**
304a0 20 20 20 2a 20 20 54 68 65 20 73 75 62 71 75 65     *  The subque
304b0 72 79 20 69 73 20 61 20 55 4e 49 4f 4e 20 41 4c  ry is a UNION AL
304c0 4c 20 6f 66 20 74 77 6f 20 6f 72 20 6d 6f 72 65  L of two or more
304d0 20 74 65 72 6d 73 0a 2a 2a 20 20 20 2a 20 20 54   terms.**   *  T
304e0 68 65 20 73 75 62 71 75 65 72 79 20 64 6f 65 73  he subquery does
304f0 20 6e 6f 74 20 68 61 76 65 20 61 20 4c 49 4d 49   not have a LIMI
30500 54 20 63 6c 61 75 73 65 0a 2a 2a 20 20 20 2a 20  T clause.**   * 
30510 20 54 68 65 72 65 20 69 73 20 6e 6f 20 57 48 45   There is no WHE
30520 52 45 20 6f 72 20 47 52 4f 55 50 20 42 59 20 6f  RE or GROUP BY o
30530 72 20 48 41 56 49 4e 47 20 63 6c 61 75 73 65 73  r HAVING clauses
30540 20 6f 6e 20 74 68 65 20 73 75 62 71 75 65 72 69   on the subqueri
30550 65 73 0a 2a 2a 20 20 20 2a 20 20 54 68 65 20 6f  es.**   *  The o
30560 75 74 65 72 20 71 75 65 72 79 20 69 73 20 61 20  uter query is a 
30570 73 69 6d 70 6c 65 20 63 6f 75 6e 74 28 2a 29 0a  simple count(*).
30580 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55  **.** Return TRU
30590 45 20 69 66 20 74 68 65 20 6f 70 74 69 6d 69 7a  E if the optimiz
305a0 61 74 69 6f 6e 20 69 73 20 75 6e 64 65 72 74 61  ation is underta
305b0 6b 65 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ken..*/.static i
305c0 6e 74 20 63 6f 75 6e 74 4f 66 56 69 65 77 4f 70  nt countOfViewOp
305d0 74 69 6d 69 7a 61 74 69 6f 6e 28 50 61 72 73 65  timization(Parse
305e0 20 2a 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74   *pParse, Select
305f0 20 2a 70 29 7b 0a 20 20 53 65 6c 65 63 74 20 2a   *p){.  Select *
30600 70 53 75 62 2c 20 2a 70 50 72 69 6f 72 3b 0a 20  pSub, *pPrior;. 
30610 20 45 78 70 72 20 2a 70 45 78 70 72 3b 0a 20 20   Expr *pExpr;.  
30620 45 78 70 72 20 2a 70 43 6f 75 6e 74 3b 0a 20 20  Expr *pCount;.  
30630 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 69  sqlite3 *db;.  i
30640 66 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20  f( (p->selFlags 
30650 26 20 53 46 5f 41 67 67 72 65 67 61 74 65 29 3d  & SF_Aggregate)=
30660 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20  =0 ) return 0;  
30670 20 2f 2a 20 54 68 69 73 20 69 73 20 61 6e 20 61   /* This is an a
30680 67 67 72 65 67 61 74 65 20 2a 2f 0a 20 20 69 66  ggregate */.  if
30690 28 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78  ( p->pEList->nEx
306a0 70 72 21 3d 31 20 29 20 72 65 74 75 72 6e 20 30  pr!=1 ) return 0
306b0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
306c0 2f 2a 20 53 69 6e 67 6c 65 20 72 65 73 75 6c 74  /* Single result
306d0 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 70 45 78   column */.  pEx
306e0 70 72 20 3d 20 70 2d 3e 70 45 4c 69 73 74 2d 3e  pr = p->pEList->
306f0 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20 69 66  a[0].pExpr;.  if
30700 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f  ( pExpr->op!=TK_
30710 41 47 47 5f 46 55 4e 43 54 49 4f 4e 20 29 20 72  AGG_FUNCTION ) r
30720 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20  eturn 0;        
30730 2f 2a 20 52 65 73 75 6c 74 20 69 73 20 61 6e 20  /* Result is an 
30740 61 67 67 72 65 67 61 74 65 20 2a 2f 0a 20 20 69  aggregate */.  i
30750 66 28 20 73 71 6c 69 74 65 33 5f 73 74 72 69 63  f( sqlite3_stric
30760 6d 70 28 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b  mp(pExpr->u.zTok
30770 65 6e 2c 22 63 6f 75 6e 74 22 29 20 29 20 72 65  en,"count") ) re
30780 74 75 72 6e 20 30 3b 20 20 2f 2a 20 49 73 20 63  turn 0;  /* Is c
30790 6f 75 6e 74 28 29 20 2a 2f 0a 20 20 69 66 28 20  ount() */.  if( 
307a0 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 21 3d  pExpr->x.pList!=
307b0 30 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20  0 ) return 0;   
307c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
307d0 20 4d 75 73 74 20 62 65 20 63 6f 75 6e 74 28 2a   Must be count(*
307e0 29 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 53  ) */.  if( p->pS
307f0 72 63 2d 3e 6e 53 72 63 21 3d 31 20 29 20 72 65  rc->nSrc!=1 ) re
30800 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20  turn 0;         
30810 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20           /* One 
30820 74 61 62 6c 65 20 69 6e 20 46 52 4f 4d 20 20 2a  table in FROM  *
30830 2f 0a 20 20 70 53 75 62 20 3d 20 70 2d 3e 70 53  /.  pSub = p->pS
30840 72 63 2d 3e 61 5b 30 5d 2e 70 53 65 6c 65 63 74  rc->a[0].pSelect
30850 3b 0a 20 20 69 66 28 20 70 53 75 62 3d 3d 30 20  ;.  if( pSub==0 
30860 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20  ) return 0;     
30870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30880 20 20 20 20 20 20 2f 2a 20 54 68 65 20 46 52 4f        /* The FRO
30890 4d 20 69 73 20 61 20 73 75 62 71 75 65 72 79 20  M is a subquery 
308a0 2a 2f 0a 20 20 69 66 28 20 70 53 75 62 2d 3e 70  */.  if( pSub->p
308b0 50 72 69 6f 72 3d 3d 30 20 29 20 72 65 74 75 72  Prior==0 ) retur
308c0 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  n 0;            
308d0 20 20 20 20 20 20 20 2f 2a 20 4d 75 73 74 20 62         /* Must b
308e0 65 20 61 20 63 6f 6d 70 6f 75 6e 64 20 72 79 20  e a compound ry 
308f0 2a 2f 0a 20 20 64 6f 7b 0a 20 20 20 20 69 66 28  */.  do{.    if(
30900 20 70 53 75 62 2d 3e 6f 70 21 3d 54 4b 5f 41 4c   pSub->op!=TK_AL
30910 4c 20 26 26 20 70 53 75 62 2d 3e 70 50 72 69 6f  L && pSub->pPrio
30920 72 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 2f  r ) return 0;  /
30930 2a 20 4d 75 73 74 20 62 65 20 55 4e 49 4f 4e 20  * Must be UNION 
30940 41 4c 4c 20 2a 2f 0a 20 20 20 20 69 66 28 20 70  ALL */.    if( p
30950 53 75 62 2d 3e 70 57 68 65 72 65 20 29 20 72 65  Sub->pWhere ) re
30960 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20  turn 0;         
30970 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
30980 4e 6f 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  No WHERE clause 
30990 2a 2f 0a 20 20 20 20 69 66 28 20 70 53 75 62 2d  */.    if( pSub-
309a0 3e 70 4c 69 6d 69 74 20 29 20 72 65 74 75 72 6e  >pLimit ) return
309b0 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
309c0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 20 4c           /* No L
309d0 49 4d 49 54 20 63 6c 61 75 73 65 20 2a 2f 0a 20  IMIT clause */. 
309e0 20 20 20 69 66 28 20 70 53 75 62 2d 3e 73 65 6c     if( pSub->sel
309f0 46 6c 61 67 73 20 26 20 53 46 5f 41 67 67 72 65  Flags & SF_Aggre
30a00 67 61 74 65 20 29 20 72 65 74 75 72 6e 20 30 3b  gate ) return 0;
30a10 20 20 20 20 20 2f 2a 20 4e 6f 74 20 61 6e 20 61       /* Not an a
30a20 67 67 72 65 67 61 74 65 20 2a 2f 0a 20 20 20 20  ggregate */.    
30a30 70 53 75 62 20 3d 20 70 53 75 62 2d 3e 70 50 72  pSub = pSub->pPr
30a40 69 6f 72 3b 20 20 20 20 20 20 20 20 20 20 20 20  ior;            
30a50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30a60 20 20 2f 2a 20 52 65 70 65 61 74 20 6f 76 65 72    /* Repeat over
30a70 20 63 6f 6d 70 6f 75 6e 64 20 2a 2f 0a 20 20 7d   compound */.  }
30a80 77 68 69 6c 65 28 20 70 53 75 62 20 29 3b 0a 0a  while( pSub );..
30a90 20 20 2f 2a 20 49 66 20 77 65 20 72 65 61 63 68    /* If we reach
30aa0 20 74 68 69 73 20 70 6f 69 6e 74 20 74 68 65 6e   this point then
30ab0 20 69 74 20 69 73 20 4f 4b 20 74 6f 20 70 65 72   it is OK to per
30ac0 66 6f 72 6d 20 74 68 65 20 74 72 61 6e 73 66 6f  form the transfo
30ad0 72 6d 61 74 69 6f 6e 20 2a 2f 0a 0a 20 20 64 62  rmation */..  db
30ae0 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
30af0 20 70 43 6f 75 6e 74 20 3d 20 70 45 78 70 72 3b   pCount = pExpr;
30b00 0a 20 20 70 45 78 70 72 20 3d 20 30 3b 0a 20 20  .  pExpr = 0;.  
30b10 70 53 75 62 20 3d 20 70 2d 3e 70 53 72 63 2d 3e  pSub = p->pSrc->
30b20 61 5b 30 5d 2e 70 53 65 6c 65 63 74 3b 0a 20 20  a[0].pSelect;.  
30b30 70 2d 3e 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 53  p->pSrc->a[0].pS
30b40 65 6c 65 63 74 20 3d 20 30 3b 0a 20 20 73 71 6c  elect = 0;.  sql
30b50 69 74 65 33 53 72 63 4c 69 73 74 44 65 6c 65 74  ite3SrcListDelet
30b60 65 28 64 62 2c 20 70 2d 3e 70 53 72 63 29 3b 0a  e(db, p->pSrc);.
30b70 20 20 70 2d 3e 70 53 72 63 20 3d 20 73 71 6c 69    p->pSrc = sqli
30b80 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28  te3DbMallocZero(
30b90 70 50 61 72 73 65 2d 3e 64 62 2c 20 73 69 7a 65  pParse->db, size
30ba0 6f 66 28 2a 70 2d 3e 70 53 72 63 29 29 3b 0a 20  of(*p->pSrc));. 
30bb0 20 77 68 69 6c 65 28 20 70 53 75 62 20 29 7b 0a   while( pSub ){.
30bc0 20 20 20 20 45 78 70 72 20 2a 70 54 65 72 6d 3b      Expr *pTerm;
30bd0 0a 20 20 20 20 70 50 72 69 6f 72 20 3d 20 70 53  .    pPrior = pS
30be0 75 62 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20  ub->pPrior;.    
30bf0 70 53 75 62 2d 3e 70 50 72 69 6f 72 20 3d 20 30  pSub->pPrior = 0
30c00 3b 0a 20 20 20 20 70 53 75 62 2d 3e 70 4e 65 78  ;.    pSub->pNex
30c10 74 20 3d 20 30 3b 0a 20 20 20 20 70 53 75 62 2d  t = 0;.    pSub-
30c20 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f  >selFlags |= SF_
30c30 41 67 67 72 65 67 61 74 65 3b 0a 20 20 20 20 70  Aggregate;.    p
30c40 53 75 62 2d 3e 73 65 6c 46 6c 61 67 73 20 26 3d  Sub->selFlags &=
30c50 20 7e 53 46 5f 43 6f 6d 70 6f 75 6e 64 3b 0a 20   ~SF_Compound;. 
30c60 20 20 20 70 53 75 62 2d 3e 6e 53 65 6c 65 63 74     pSub->nSelect
30c70 52 6f 77 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c  Row = 0;.    sql
30c80 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65  ite3ExprListDele
30c90 74 65 28 64 62 2c 20 70 53 75 62 2d 3e 70 45 4c  te(db, pSub->pEL
30ca0 69 73 74 29 3b 0a 20 20 20 20 70 54 65 72 6d 20  ist);.    pTerm 
30cb0 3d 20 70 50 72 69 6f 72 20 3f 20 73 71 6c 69 74  = pPrior ? sqlit
30cc0 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 43  e3ExprDup(db, pC
30cd0 6f 75 6e 74 2c 20 30 29 20 3a 20 70 43 6f 75 6e  ount, 0) : pCoun
30ce0 74 3b 0a 20 20 20 20 70 53 75 62 2d 3e 70 45 4c  t;.    pSub->pEL
30cf0 69 73 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ist = sqlite3Exp
30d00 72 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61 72  rListAppend(pPar
30d10 73 65 2c 20 30 2c 20 70 54 65 72 6d 29 3b 0a 20  se, 0, pTerm);. 
30d20 20 20 20 70 54 65 72 6d 20 3d 20 73 71 6c 69 74     pTerm = sqlit
30d30 65 33 50 45 78 70 72 28 70 50 61 72 73 65 2c 20  e3PExpr(pParse, 
30d40 54 4b 5f 53 45 4c 45 43 54 2c 20 30 2c 20 30 29  TK_SELECT, 0, 0)
30d50 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 45 78  ;.    sqlite3PEx
30d60 70 72 41 64 64 53 65 6c 65 63 74 28 70 50 61 72  prAddSelect(pPar
30d70 73 65 2c 20 70 54 65 72 6d 2c 20 70 53 75 62 29  se, pTerm, pSub)
30d80 3b 0a 20 20 20 20 69 66 28 20 70 45 78 70 72 3d  ;.    if( pExpr=
30d90 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 45 78 70  =0 ){.      pExp
30da0 72 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20 7d  r = pTerm;.    }
30db0 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 45 78 70  else{.      pExp
30dc0 72 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72  r = sqlite3PExpr
30dd0 28 70 50 61 72 73 65 2c 20 54 4b 5f 50 4c 55 53  (pParse, TK_PLUS
30de0 2c 20 70 54 65 72 6d 2c 20 70 45 78 70 72 29 3b  , pTerm, pExpr);
30df0 0a 20 20 20 20 7d 0a 20 20 20 20 70 53 75 62 20  .    }.    pSub 
30e00 3d 20 70 50 72 69 6f 72 3b 0a 20 20 7d 0a 20 20  = pPrior;.  }.  
30e10 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e  p->pEList->a[0].
30e20 70 45 78 70 72 20 3d 20 70 45 78 70 72 3b 0a 20  pExpr = pExpr;. 
30e30 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 3d 20   p->selFlags &= 
30e40 7e 53 46 5f 41 67 67 72 65 67 61 74 65 3b 0a 0a  ~SF_Aggregate;..
30e50 23 69 66 20 53 45 4c 45 43 54 54 52 41 43 45 5f  #if SELECTTRACE_
30e60 45 4e 41 42 4c 45 44 0a 20 20 69 66 28 20 73 71  ENABLED.  if( sq
30e70 6c 69 74 65 33 53 65 6c 65 63 74 54 72 61 63 65  lite3SelectTrace
30e80 20 26 20 30 78 34 30 30 20 29 7b 0a 20 20 20 20   & 0x400 ){.    
30e90 53 45 4c 45 43 54 54 52 41 43 45 28 30 78 34 30  SELECTTRACE(0x40
30ea0 30 2c 70 50 61 72 73 65 2c 70 2c 28 22 41 66 74  0,pParse,p,("Aft
30eb0 65 72 20 63 6f 75 6e 74 2d 6f 66 2d 76 69 65 77  er count-of-view
30ec0 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 3a 5c 6e   optimization:\n
30ed0 22 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  "));.    sqlite3
30ee0 54 72 65 65 56 69 65 77 53 65 6c 65 63 74 28 30  TreeViewSelect(0
30ef0 2c 20 70 2c 20 30 29 3b 0a 20 20 7d 0a 23 65 6e  , p, 0);.  }.#en
30f00 64 69 66 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a  dif.  return 1;.
30f10 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
30f20 54 45 5f 43 4f 55 4e 54 4f 46 56 49 45 57 5f 4f  TE_COUNTOFVIEW_O
30f30 50 54 49 4d 49 5a 41 54 49 4f 4e 20 2a 2f 0a 0a  PTIMIZATION */..
30f40 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  /*.** Generate c
30f50 6f 64 65 20 66 6f 72 20 74 68 65 20 53 45 4c 45  ode for the SELE
30f60 43 54 20 73 74 61 74 65 6d 65 6e 74 20 67 69 76  CT statement giv
30f70 65 6e 20 69 6e 20 74 68 65 20 70 20 61 72 67 75  en in the p argu
30f80 6d 65 6e 74 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68  ment.  .**.** Th
30f90 65 20 72 65 73 75 6c 74 73 20 61 72 65 20 72 65  e results are re
30fa0 74 75 72 6e 65 64 20 61 63 63 6f 72 64 69 6e 67  turned according
30fb0 20 74 6f 20 74 68 65 20 53 65 6c 65 63 74 44 65   to the SelectDe
30fc0 73 74 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a  st structure..**
30fd0 20 53 65 65 20 63 6f 6d 6d 65 6e 74 73 20 69 6e   See comments in
30fe0 20 73 71 6c 69 74 65 49 6e 74 2e 68 20 66 6f 72   sqliteInt.h for
30ff0 20 66 75 72 74 68 65 72 20 69 6e 66 6f 72 6d 61   further informa
31000 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  tion..**.** This
31010 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73   routine returns
31020 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65   the number of e
31030 72 72 6f 72 73 2e 20 20 49 66 20 61 6e 79 20 65  rrors.  If any e
31040 72 72 6f 72 73 20 61 72 65 0a 2a 2a 20 65 6e 63  rrors are.** enc
31050 6f 75 6e 74 65 72 65 64 2c 20 74 68 65 6e 20 61  ountered, then a
31060 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20 65 72  n appropriate er
31070 72 6f 72 20 6d 65 73 73 61 67 65 20 69 73 20 6c  ror message is l
31080 65 66 74 20 69 6e 0a 2a 2a 20 70 50 61 72 73 65  eft in.** pParse
31090 2d 3e 7a 45 72 72 4d 73 67 2e 0a 2a 2a 0a 2a 2a  ->zErrMsg..**.**
310a0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 64 6f   This routine do
310b0 65 73 20 4e 4f 54 20 66 72 65 65 20 74 68 65 20  es NOT free the 
310c0 53 65 6c 65 63 74 20 73 74 72 75 63 74 75 72 65  Select structure
310d0 20 70 61 73 73 65 64 20 69 6e 2e 20 20 54 68 65   passed in.  The
310e0 0a 2a 2a 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63  .** calling func
310f0 74 69 6f 6e 20 6e 65 65 64 73 20 74 6f 20 64 6f  tion needs to do
31100 20 74 68 61 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71   that..*/.int sq
31110 6c 69 74 65 33 53 65 6c 65 63 74 28 0a 20 20 50  lite3Select(.  P
31120 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
31130 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72        /* The par
31140 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ser context */. 
31150 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20   Select *p,     
31160 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 53          /* The S
31170 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
31180 62 65 69 6e 67 20 63 6f 64 65 64 2e 20 2a 2f 0a  being coded. */.
31190 20 20 53 65 6c 65 63 74 44 65 73 74 20 2a 70 44    SelectDest *pD
311a0 65 73 74 20 20 20 20 20 20 2f 2a 20 57 68 61 74  est      /* What
311b0 20 74 6f 20 64 6f 20 77 69 74 68 20 74 68 65 20   to do with the 
311c0 71 75 65 72 79 20 72 65 73 75 6c 74 73 20 2a 2f  query results */
311d0 0a 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 20  .){.  int i, j; 
311e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
311f0 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f  Loop counters */
31200 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57  .  WhereInfo *pW
31210 49 6e 66 6f 3b 20 20 20 20 20 2f 2a 20 52 65 74  Info;     /* Ret
31220 75 72 6e 20 66 72 6f 6d 20 73 71 6c 69 74 65 33  urn from sqlite3
31230 57 68 65 72 65 42 65 67 69 6e 28 29 20 2a 2f 0a  WhereBegin() */.
31240 20 20 56 64 62 65 20 2a 76 3b 20 20 20 20 20 20    Vdbe *v;      
31250 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
31260 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 20  virtual machine 
31270 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69  under constructi
31280 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 73 41 67  on */.  int isAg
31290 67 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  g;             /
312a0 2a 20 54 72 75 65 20 66 6f 72 20 73 65 6c 65 63  * True for selec
312b0 74 20 6c 69 73 74 73 20 6c 69 6b 65 20 22 63 6f  t lists like "co
312c0 75 6e 74 28 2a 29 22 20 2a 2f 0a 20 20 45 78 70  unt(*)" */.  Exp
312d0 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 20 3d 20  rList *pEList = 
312e0 30 3b 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 63  0;  /* List of c
312f0 6f 6c 75 6d 6e 73 20 74 6f 20 65 78 74 72 61 63  olumns to extrac
31300 74 2e 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20  t. */.  SrcList 
31310 2a 70 54 61 62 4c 69 73 74 3b 20 20 20 20 20 2f  *pTabList;     /
31320 2a 20 4c 69 73 74 20 6f 66 20 74 61 62 6c 65 73  * List of tables
31330 20 74 6f 20 73 65 6c 65 63 74 20 66 72 6f 6d 20   to select from 
31340 2a 2f 0a 20 20 45 78 70 72 20 2a 70 57 68 65 72  */.  Expr *pWher
31350 65 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  e;          /* T
31360 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e  he WHERE clause.
31370 20 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f    May be NULL */
31380 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 47 72  .  ExprList *pGr
31390 6f 75 70 42 79 3b 20 20 20 20 2f 2a 20 54 68 65  oupBy;    /* The
313a0 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65   GROUP BY clause
313b0 2e 20 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a  .  May be NULL *
313c0 2f 0a 20 20 45 78 70 72 20 2a 70 48 61 76 69 6e  /.  Expr *pHavin
313d0 67 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  g;         /* Th
313e0 65 20 48 41 56 49 4e 47 20 63 6c 61 75 73 65 2e  e HAVING clause.
313f0 20 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f    May be NULL */
31400 0a 20 20 69 6e 74 20 72 63 20 3d 20 31 3b 20 20  .  int rc = 1;  
31410 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c            /* Val
31420 75 65 20 74 6f 20 72 65 74 75 72 6e 20 66 72 6f  ue to return fro
31430 6d 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  m this function 
31440 2a 2f 0a 20 20 44 69 73 74 69 6e 63 74 43 74 78  */.  DistinctCtx
31450 20 73 44 69 73 74 69 6e 63 74 3b 20 2f 2a 20 49   sDistinct; /* I
31460 6e 66 6f 20 6f 6e 20 68 6f 77 20 74 6f 20 63 6f  nfo on how to co
31470 64 65 20 74 68 65 20 44 49 53 54 49 4e 43 54 20  de the DISTINCT 
31480 6b 65 79 77 6f 72 64 20 2a 2f 0a 20 20 53 6f 72  keyword */.  Sor
31490 74 43 74 78 20 73 53 6f 72 74 3b 20 20 20 20 20  tCtx sSort;     
314a0 20 20 20 20 2f 2a 20 49 6e 66 6f 20 6f 6e 20 68      /* Info on h
314b0 6f 77 20 74 6f 20 63 6f 64 65 20 74 68 65 20 4f  ow to code the O
314c0 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a  RDER BY clause *
314d0 2f 0a 20 20 41 67 67 49 6e 66 6f 20 73 41 67 67  /.  AggInfo sAgg
314e0 49 6e 66 6f 3b 20 20 20 20 20 20 2f 2a 20 49 6e  Info;      /* In
314f0 66 6f 72 6d 61 74 69 6f 6e 20 75 73 65 64 20 62  formation used b
31500 79 20 61 67 67 72 65 67 61 74 65 20 71 75 65 72  y aggregate quer
31510 69 65 73 20 2a 2f 0a 20 20 69 6e 74 20 69 45 6e  ies */.  int iEn
31520 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d;              
31530 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 68  /* Address of th
31540 65 20 65 6e 64 20 6f 66 20 74 68 65 20 71 75 65  e end of the que
31550 72 79 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20  ry */.  sqlite3 
31560 2a 64 62 3b 20 20 20 20 20 20 20 20 20 20 20 2f  *db;           /
31570 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20 63  * The database c
31580 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 45  onnection */.  E
31590 78 70 72 4c 69 73 74 20 2a 70 4d 69 6e 4d 61 78  xprList *pMinMax
315a0 4f 72 64 65 72 42 79 20 3d 20 30 3b 20 20 2f 2a  OrderBy = 0;  /*
315b0 20 41 64 64 65 64 20 4f 52 44 45 52 20 42 59 20   Added ORDER BY 
315c0 66 6f 72 20 6d 69 6e 2f 6d 61 78 20 71 75 65 72  for min/max quer
315d0 69 65 73 20 2a 2f 0a 20 20 75 38 20 6d 69 6e 4d  ies */.  u8 minM
315e0 61 78 46 6c 61 67 3b 20 20 20 20 20 20 20 20 20  axFlag;         
315f0 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 20          /* Flag 
31600 66 6f 72 20 6d 69 6e 2f 6d 61 78 20 71 75 65 72  for min/max quer
31610 69 65 73 20 2a 2f 0a 0a 20 20 64 62 20 3d 20 70  ies */..  db = p
31620 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 76 20 3d  Parse->db;.  v =
31630 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
31640 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 70  pParse);.  if( p
31650 3d 3d 30 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f  ==0 || db->mallo
31660 63 46 61 69 6c 65 64 20 7c 7c 20 70 50 61 72 73  cFailed || pPars
31670 65 2d 3e 6e 45 72 72 20 29 7b 0a 20 20 20 20 72  e->nErr ){.    r
31680 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 69  eturn 1;.  }.  i
31690 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68  f( sqlite3AuthCh
316a0 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49  eck(pParse, SQLI
316b0 54 45 5f 53 45 4c 45 43 54 2c 20 30 2c 20 30 2c  TE_SELECT, 0, 0,
316c0 20 30 29 20 29 20 72 65 74 75 72 6e 20 31 3b 0a   0) ) return 1;.
316d0 20 20 6d 65 6d 73 65 74 28 26 73 41 67 67 49 6e    memset(&sAggIn
316e0 66 6f 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 41  fo, 0, sizeof(sA
316f0 67 67 49 6e 66 6f 29 29 3b 0a 23 69 66 20 53 45  ggInfo));.#if SE
31700 4c 45 43 54 54 52 41 43 45 5f 45 4e 41 42 4c 45  LECTTRACE_ENABLE
31710 44 0a 20 20 53 45 4c 45 43 54 54 52 41 43 45 28  D.  SELECTTRACE(
31720 31 2c 70 50 61 72 73 65 2c 70 2c 20 28 22 62 65  1,pParse,p, ("be
31730 67 69 6e 20 70 72 6f 63 65 73 73 69 6e 67 3a 5c  gin processing:\
31740 6e 22 2c 20 70 50 61 72 73 65 2d 3e 61 64 64 72  n", pParse->addr
31750 45 78 70 6c 61 69 6e 29 29 3b 0a 20 20 69 66 28  Explain));.  if(
31760 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 54 72   sqlite3SelectTr
31770 61 63 65 20 26 20 30 78 31 30 30 20 29 7b 0a 20  ace & 0x100 ){. 
31780 20 20 20 73 71 6c 69 74 65 33 54 72 65 65 56 69     sqlite3TreeVi
31790 65 77 53 65 6c 65 63 74 28 30 2c 20 70 2c 20 30  ewSelect(0, p, 0
317a0 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  );.  }.#endif.. 
317b0 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4f 72 64   assert( p->pOrd
317c0 65 72 42 79 3d 3d 30 20 7c 7c 20 70 44 65 73 74  erBy==0 || pDest
317d0 2d 3e 65 44 65 73 74 21 3d 53 52 54 5f 44 69 73  ->eDest!=SRT_Dis
317e0 74 46 69 66 6f 20 29 3b 0a 20 20 61 73 73 65 72  tFifo );.  asser
317f0 74 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 3d 3d  t( p->pOrderBy==
31800 30 20 7c 7c 20 70 44 65 73 74 2d 3e 65 44 65 73  0 || pDest->eDes
31810 74 21 3d 53 52 54 5f 46 69 66 6f 20 29 3b 0a 20  t!=SRT_Fifo );. 
31820 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4f 72 64   assert( p->pOrd
31830 65 72 42 79 3d 3d 30 20 7c 7c 20 70 44 65 73 74  erBy==0 || pDest
31840 2d 3e 65 44 65 73 74 21 3d 53 52 54 5f 44 69 73  ->eDest!=SRT_Dis
31850 74 51 75 65 75 65 20 29 3b 0a 20 20 61 73 73 65  tQueue );.  asse
31860 72 74 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 3d  rt( p->pOrderBy=
31870 3d 30 20 7c 7c 20 70 44 65 73 74 2d 3e 65 44 65  =0 || pDest->eDe
31880 73 74 21 3d 53 52 54 5f 51 75 65 75 65 20 29 3b  st!=SRT_Queue );
31890 0a 20 20 69 66 28 20 49 67 6e 6f 72 61 62 6c 65  .  if( Ignorable
318a0 4f 72 64 65 72 62 79 28 70 44 65 73 74 29 20 29  Orderby(pDest) )
318b0 7b 0a 20 20 20 20 61 73 73 65 72 74 28 70 44 65  {.    assert(pDe
318c0 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 45  st->eDest==SRT_E
318d0 78 69 73 74 73 20 7c 7c 20 70 44 65 73 74 2d 3e  xists || pDest->
318e0 65 44 65 73 74 3d 3d 53 52 54 5f 55 6e 69 6f 6e  eDest==SRT_Union
318f0 20 7c 7c 20 0a 20 20 20 20 20 20 20 20 20 20 20   || .           
31900 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52  pDest->eDest==SR
31910 54 5f 45 78 63 65 70 74 20 7c 7c 20 70 44 65 73  T_Except || pDes
31920 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 44 69  t->eDest==SRT_Di
31930 73 63 61 72 64 20 7c 7c 0a 20 20 20 20 20 20 20  scard ||.       
31940 20 20 20 20 70 44 65 73 74 2d 3e 65 44 65 73 74      pDest->eDest
31950 3d 3d 53 52 54 5f 51 75 65 75 65 20 20 7c 7c 20  ==SRT_Queue  || 
31960 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52  pDest->eDest==SR
31970 54 5f 44 69 73 74 46 69 66 6f 20 7c 7c 0a 20 20  T_DistFifo ||.  
31980 20 20 20 20 20 20 20 20 20 70 44 65 73 74 2d 3e           pDest->
31990 65 44 65 73 74 3d 3d 53 52 54 5f 44 69 73 74 51  eDest==SRT_DistQ
319a0 75 65 75 65 20 7c 7c 20 70 44 65 73 74 2d 3e 65  ueue || pDest->e
319b0 44 65 73 74 3d 3d 53 52 54 5f 46 69 66 6f 29 3b  Dest==SRT_Fifo);
319c0 0a 20 20 20 20 2f 2a 20 49 66 20 4f 52 44 45 52  .    /* If ORDER
319d0 20 42 59 20 6d 61 6b 65 73 20 6e 6f 20 64 69 66   BY makes no dif
319e0 66 65 72 65 6e 63 65 20 69 6e 20 74 68 65 20 6f  ference in the o
319f0 75 74 70 75 74 20 74 68 65 6e 20 6e 65 69 74 68  utput then neith
31a00 65 72 20 64 6f 65 73 0a 20 20 20 20 2a 2a 20 44  er does.    ** D
31a10 49 53 54 49 4e 43 54 20 73 6f 20 69 74 20 63 61  ISTINCT so it ca
31a20 6e 20 62 65 20 72 65 6d 6f 76 65 64 20 74 6f 6f  n be removed too
31a30 2e 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33  . */.    sqlite3
31a40 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64  ExprListDelete(d
31a50 62 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79 29 3b  b, p->pOrderBy);
31a60 0a 20 20 20 20 70 2d 3e 70 4f 72 64 65 72 42 79  .    p->pOrderBy
31a70 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 73 65 6c   = 0;.    p->sel
31a80 46 6c 61 67 73 20 26 3d 20 7e 53 46 5f 44 69 73  Flags &= ~SF_Dis
31a90 74 69 6e 63 74 3b 0a 20 20 7d 0a 20 20 73 71 6c  tinct;.  }.  sql
31aa0 69 74 65 33 53 65 6c 65 63 74 50 72 65 70 28 70  ite3SelectPrep(p
31ab0 50 61 72 73 65 2c 20 70 2c 20 30 29 3b 0a 20 20  Parse, p, 0);.  
31ac0 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72  if( pParse->nErr
31ad0 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61   || db->mallocFa
31ae0 69 6c 65 64 20 29 7b 0a 20 20 20 20 67 6f 74 6f  iled ){.    goto
31af0 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d   select_end;.  }
31b00 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45  .  assert( p->pE
31b10 4c 69 73 74 21 3d 30 20 29 3b 0a 23 69 66 20 53  List!=0 );.#if S
31b20 45 4c 45 43 54 54 52 41 43 45 5f 45 4e 41 42 4c  ELECTTRACE_ENABL
31b30 45 44 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  ED.  if( sqlite3
31b40 53 65 6c 65 63 74 54 72 61 63 65 20 26 20 30 78  SelectTrace & 0x
31b50 31 30 34 20 29 7b 0a 20 20 20 20 53 45 4c 45 43  104 ){.    SELEC
31b60 54 54 52 41 43 45 28 30 78 31 30 34 2c 70 50 61  TTRACE(0x104,pPa
31b70 72 73 65 2c 70 2c 20 28 22 61 66 74 65 72 20 6e  rse,p, ("after n
31b80 61 6d 65 20 72 65 73 6f 6c 75 74 69 6f 6e 3a 5c  ame resolution:\
31b90 6e 22 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  n"));.    sqlite
31ba0 33 54 72 65 65 56 69 65 77 53 65 6c 65 63 74 28  3TreeViewSelect(
31bb0 30 2c 20 70 2c 20 30 29 3b 0a 20 20 7d 0a 23 65  0, p, 0);.  }.#e
31bc0 6e 64 69 66 0a 0a 20 20 69 66 28 20 70 44 65 73  ndif..  if( pDes
31bd0 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75  t->eDest==SRT_Ou
31be0 74 70 75 74 20 29 7b 0a 20 20 20 20 67 65 6e 65  tput ){.    gene
31bf0 72 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28  rateColumnNames(
31c00 70 50 61 72 73 65 2c 20 70 29 3b 0a 20 20 7d 0a  pParse, p);.  }.
31c10 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
31c20 4f 4d 49 54 5f 57 49 4e 44 4f 57 46 55 4e 43 0a  OMIT_WINDOWFUNC.
31c30 20 20 69 66 28 20 73 71 6c 69 74 65 33 57 69 6e    if( sqlite3Win
31c40 64 6f 77 52 65 77 72 69 74 65 28 70 50 61 72 73  dowRewrite(pPars
31c50 65 2c 20 70 29 20 29 7b 0a 20 20 20 20 67 6f 74  e, p) ){.    got
31c60 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  o select_end;.  
31c70 7d 0a 23 69 66 20 53 45 4c 45 43 54 54 52 41 43  }.#if SELECTTRAC
31c80 45 5f 45 4e 41 42 4c 45 44 0a 20 20 69 66 28 20  E_ENABLED.  if( 
31c90 73 71 6c 69 74 65 33 53 65 6c 65 63 74 54 72 61  sqlite3SelectTra
31ca0 63 65 20 26 20 30 78 31 30 38 20 29 7b 0a 20 20  ce & 0x108 ){.  
31cb0 20 20 53 45 4c 45 43 54 54 52 41 43 45 28 30 78    SELECTTRACE(0x
31cc0 31 30 34 2c 70 50 61 72 73 65 2c 70 2c 20 28 22  104,pParse,p, ("
31cd0 61 66 74 65 72 20 77 69 6e 64 6f 77 20 72 65 77  after window rew
31ce0 72 69 74 65 3a 5c 6e 22 29 29 3b 0a 20 20 20 20  rite:\n"));.    
31cf0 73 71 6c 69 74 65 33 54 72 65 65 56 69 65 77 53  sqlite3TreeViewS
31d00 65 6c 65 63 74 28 30 2c 20 70 2c 20 30 29 3b 0a  elect(0, p, 0);.
31d10 20 20 7d 0a 23 65 6e 64 69 66 0a 23 65 6e 64 69    }.#endif.#endi
31d20 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
31d30 5f 57 49 4e 44 4f 57 46 55 4e 43 20 2a 2f 0a 20  _WINDOWFUNC */. 
31d40 20 70 54 61 62 4c 69 73 74 20 3d 20 70 2d 3e 70   pTabList = p->p
31d50 53 72 63 3b 0a 20 20 69 73 41 67 67 20 3d 20 28  Src;.  isAgg = (
31d60 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46  p->selFlags & SF
31d70 5f 41 67 67 72 65 67 61 74 65 29 21 3d 30 3b 0a  _Aggregate)!=0;.
31d80 20 20 6d 65 6d 73 65 74 28 26 73 53 6f 72 74 2c    memset(&sSort,
31d90 20 30 2c 20 73 69 7a 65 6f 66 28 73 53 6f 72 74   0, sizeof(sSort
31da0 29 29 3b 0a 20 20 73 53 6f 72 74 2e 70 4f 72 64  ));.  sSort.pOrd
31db0 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72  erBy = p->pOrder
31dc0 42 79 3b 0a 0a 20 20 2f 2a 20 54 72 79 20 74 6f  By;..  /* Try to
31dd0 20 76 61 72 69 6f 75 73 20 6f 70 74 69 6d 69 7a   various optimiz
31de0 61 74 69 6f 6e 73 20 28 66 6c 61 74 74 65 6e 69  ations (flatteni
31df0 6e 67 20 73 75 62 71 75 65 72 69 65 73 2c 20 61  ng subqueries, a
31e00 6e 64 20 73 74 72 65 6e 67 74 68 0a 20 20 2a 2a  nd strength.  **
31e10 20 72 65 64 75 63 74 69 6f 6e 20 6f 66 20 6a 6f   reduction of jo
31e20 69 6e 20 6f 70 65 72 61 74 6f 72 73 29 20 69 6e  in operators) in
31e30 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
31e40 20 75 70 20 69 6e 74 6f 20 74 68 65 20 6d 61 69   up into the mai
31e50 6e 20 71 75 65 72 79 0a 20 20 2a 2f 0a 23 69 66  n query.  */.#if
31e60 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
31e70 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29 20  _OMIT_SUBQUERY) 
31e80 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  || !defined(SQLI
31e90 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 0a 20 20  TE_OMIT_VIEW).  
31ea0 66 6f 72 28 69 3d 30 3b 20 21 70 2d 3e 70 50 72  for(i=0; !p->pPr
31eb0 69 6f 72 20 26 26 20 69 3c 70 54 61 62 4c 69 73  ior && i<pTabLis
31ec0 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20  t->nSrc; i++){. 
31ed0 20 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73     struct SrcLis
31ee0 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20  t_item *pItem = 
31ef0 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 3b  &pTabList->a[i];
31f00 0a 20 20 20 20 53 65 6c 65 63 74 20 2a 70 53 75  .    Select *pSu
31f10 62 20 3d 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65  b = pItem->pSele
31f20 63 74 3b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70  ct;.    Table *p
31f30 54 61 62 20 3d 20 70 49 74 65 6d 2d 3e 70 54 61  Tab = pItem->pTa
31f40 62 3b 0a 0a 20 20 20 20 2f 2a 20 43 6f 6e 76 65  b;..    /* Conve
31f50 72 74 20 4c 45 46 54 20 4a 4f 49 4e 20 69 6e 74  rt LEFT JOIN int
31f60 6f 20 4a 4f 49 4e 20 69 66 20 74 68 65 72 65 20  o JOIN if there 
31f70 61 72 65 20 74 65 72 6d 73 20 6f 66 20 74 68 65  are terms of the
31f80 20 72 69 67 68 74 20 74 61 62 6c 65 0a 20 20 20   right table.   
31f90 20 2a 2a 20 6f 66 20 74 68 65 20 4c 45 46 54 20   ** of the LEFT 
31fa0 4a 4f 49 4e 20 75 73 65 64 20 69 6e 20 74 68 65  JOIN used in the
31fb0 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e 0a 20   WHERE clause.. 
31fc0 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 70     */.    if( (p
31fd0 49 74 65 6d 2d 3e 66 67 2e 6a 6f 69 6e 74 79 70  Item->fg.jointyp
31fe0 65 20 26 20 4a 54 5f 4c 45 46 54 29 21 3d 30 0a  e & JT_LEFT)!=0.
31ff0 20 20 20 20 20 26 26 20 73 71 6c 69 74 65 33 45       && sqlite3E
32000 78 70 72 49 6d 70 6c 69 65 73 4e 6f 6e 4e 75 6c  xprImpliesNonNul
32010 6c 52 6f 77 28 70 2d 3e 70 57 68 65 72 65 2c 20  lRow(p->pWhere, 
32020 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 29 0a  pItem->iCursor).
32030 20 20 20 20 20 26 26 20 4f 70 74 69 6d 69 7a 61       && Optimiza
32040 74 69 6f 6e 45 6e 61 62 6c 65 64 28 64 62 2c 20  tionEnabled(db, 
32050 53 51 4c 49 54 45 5f 53 69 6d 70 6c 69 66 79 4a  SQLITE_SimplifyJ
32060 6f 69 6e 29 0a 20 20 20 20 29 7b 0a 20 20 20 20  oin).    ){.    
32070 20 20 53 45 4c 45 43 54 54 52 41 43 45 28 30 78    SELECTTRACE(0x
32080 31 30 30 2c 70 50 61 72 73 65 2c 70 2c 0a 20 20  100,pParse,p,.  
32090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 22                ("
320a0 4c 45 46 54 2d 4a 4f 49 4e 20 73 69 6d 70 6c 69  LEFT-JOIN simpli
320b0 66 69 65 73 20 74 6f 20 4a 4f 49 4e 20 6f 6e 20  fies to JOIN on 
320c0 74 65 72 6d 20 25 64 5c 6e 22 2c 69 29 29 3b 0a  term %d\n",i));.
320d0 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 66 67 2e        pItem->fg.
320e0 6a 6f 69 6e 74 79 70 65 20 26 3d 20 7e 28 4a 54  jointype &= ~(JT
320f0 5f 4c 45 46 54 7c 4a 54 5f 4f 55 54 45 52 29 3b  _LEFT|JT_OUTER);
32100 0a 20 20 20 20 20 20 75 6e 73 65 74 4a 6f 69 6e  .      unsetJoin
32110 45 78 70 72 28 70 2d 3e 70 57 68 65 72 65 2c 20  Expr(p->pWhere, 
32120 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 29 3b  pItem->iCursor);
32130 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4e  .    }..    /* N
32140 6f 20 66 75 74 68 65 72 20 61 63 74 69 6f 6e 20  o futher action 
32150 69 66 20 74 68 69 73 20 74 65 72 6d 20 6f 66 20  if this term of 
32160 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
32170 69 73 20 6e 6f 20 61 20 73 75 62 71 75 65 72 79  is no a subquery
32180 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 53 75 62   */.    if( pSub
32190 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ==0 ) continue;.
321a0 0a 20 20 20 20 2f 2a 20 43 61 74 63 68 20 6d 69  .    /* Catch mi
321b0 73 6d 61 74 63 68 20 69 6e 20 74 68 65 20 64 65  smatch in the de
321c0 63 6c 61 72 65 64 20 63 6f 6c 75 6d 6e 73 20 6f  clared columns o
321d0 66 20 61 20 76 69 65 77 20 61 6e 64 20 74 68 65  f a view and the
321e0 20 6e 75 6d 62 65 72 20 6f 66 0a 20 20 20 20 2a   number of.    *
321f0 2a 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65  * columns in the
32200 20 53 45 4c 45 43 54 20 6f 6e 20 74 68 65 20 52   SELECT on the R
32210 48 53 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 54  HS */.    if( pT
32220 61 62 2d 3e 6e 43 6f 6c 21 3d 70 53 75 62 2d 3e  ab->nCol!=pSub->
32230 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 7b  pEList->nExpr ){
32240 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72  .      sqlite3Er
32250 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
32260 65 78 70 65 63 74 65 64 20 25 64 20 63 6f 6c 75  expected %d colu
32270 6d 6e 73 20 66 6f 72 20 27 25 73 27 20 62 75 74  mns for '%s' but
32280 20 67 6f 74 20 25 64 22 2c 0a 20 20 20 20 20 20   got %d",.      
32290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
322a0 70 54 61 62 2d 3e 6e 43 6f 6c 2c 20 70 54 61 62  pTab->nCol, pTab
322b0 2d 3e 7a 4e 61 6d 65 2c 20 70 53 75 62 2d 3e 70  ->zName, pSub->p
322c0 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b 0a 20  EList->nExpr);. 
322d0 20 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74       goto select
322e0 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  _end;.    }..   
322f0 20 2f 2a 20 44 6f 20 6e 6f 74 20 74 72 79 20 74   /* Do not try t
32300 6f 20 66 6c 61 74 74 65 6e 20 61 6e 20 61 67 67  o flatten an agg
32310 72 65 67 61 74 65 20 73 75 62 71 75 65 72 79 2e  regate subquery.
32320 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 46  .    **.    ** F
32330 6c 61 74 74 65 6e 69 6e 67 20 61 6e 20 61 67 67  lattening an agg
32340 72 65 67 61 74 65 20 73 75 62 71 75 65 72 79 20  regate subquery 
32350 69 73 20 6f 6e 6c 79 20 70 6f 73 73 69 62 6c 65  is only possible
32360 20 69 66 20 74 68 65 20 6f 75 74 65 72 20 71 75   if the outer qu
32370 65 72 79 0a 20 20 20 20 2a 2a 20 69 73 20 6e 6f  ery.    ** is no
32380 74 20 61 20 6a 6f 69 6e 2e 20 20 42 75 74 20 69  t a join.  But i
32390 66 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  f the outer quer
323a0 79 20 69 73 20 6e 6f 74 20 61 20 6a 6f 69 6e 2c  y is not a join,
323b0 20 74 68 65 6e 20 74 68 65 20 73 75 62 71 75 65   then the subque
323c0 72 79 0a 20 20 20 20 2a 2a 20 77 69 6c 6c 20 62  ry.    ** will b
323d0 65 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 61 73  e implemented as
323e0 20 61 20 63 6f 2d 72 6f 75 74 69 6e 65 20 61 6e   a co-routine an
323f0 64 20 74 68 65 72 65 20 69 73 20 6e 6f 20 61 64  d there is no ad
32400 76 61 6e 74 61 67 65 20 74 6f 0a 20 20 20 20 2a  vantage to.    *
32410 2a 20 66 6c 61 74 74 65 6e 69 6e 67 20 69 6e 20  * flattening in 
32420 74 68 61 74 20 63 61 73 65 2e 0a 20 20 20 20 2a  that case..    *
32430 2f 0a 20 20 20 20 69 66 28 20 28 70 53 75 62 2d  /.    if( (pSub-
32440 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 41  >selFlags & SF_A
32450 67 67 72 65 67 61 74 65 29 21 3d 30 20 29 20 63  ggregate)!=0 ) c
32460 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 61 73 73  ontinue;.    ass
32470 65 72 74 28 20 70 53 75 62 2d 3e 70 47 72 6f 75  ert( pSub->pGrou
32480 70 42 79 3d 3d 30 20 29 3b 0a 0a 20 20 20 20 2f  pBy==0 );..    /
32490 2a 20 49 66 20 74 68 65 20 6f 75 74 65 72 20 71  * If the outer q
324a0 75 65 72 79 20 63 6f 6e 74 61 69 6e 73 20 61 20  uery contains a 
324b0 22 63 6f 6d 70 6c 65 78 22 20 72 65 73 75 6c 74  "complex" result
324c0 20 73 65 74 20 28 74 68 61 74 20 69 73 2c 0a 20   set (that is,. 
324d0 20 20 20 2a 2a 20 69 66 20 74 68 65 20 72 65 73     ** if the res
324e0 75 6c 74 20 73 65 74 20 6f 66 20 74 68 65 20 6f  ult set of the o
324f0 75 74 65 72 20 71 75 65 72 79 20 75 73 65 73 20  uter query uses 
32500 66 75 6e 63 74 69 6f 6e 73 20 6f 72 20 73 75 62  functions or sub
32510 71 75 65 72 69 65 73 29 0a 20 20 20 20 2a 2a 20  queries).    ** 
32520 61 6e 64 20 69 66 20 74 68 65 20 73 75 62 71 75  and if the subqu
32530 65 72 79 20 63 6f 6e 74 61 69 6e 73 20 61 6e 20  ery contains an 
32540 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
32550 61 6e 64 20 69 66 0a 20 20 20 20 2a 2a 20 69 74  and if.    ** it
32560 20 77 69 6c 6c 20 62 65 20 69 6d 70 6c 65 6d 65   will be impleme
32570 6e 74 65 64 20 61 73 20 61 20 63 6f 2d 72 6f 75  nted as a co-rou
32580 74 69 6e 65 2c 20 74 68 65 6e 20 64 6f 20 6e 6f  tine, then do no
32590 74 20 66 6c 61 74 74 65 6e 2e 20 20 54 68 69 73  t flatten.  This
325a0 0a 20 20 20 20 2a 2a 20 72 65 73 74 72 69 63 74  .    ** restrict
325b0 69 6f 6e 20 61 6c 6c 6f 77 73 20 53 51 4c 20 63  ion allows SQL c
325c0 6f 6e 73 74 72 75 63 74 73 20 6c 69 6b 65 20 74  onstructs like t
325d0 68 69 73 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20  his:.    **.    
325e0 2a 2a 20 20 53 45 4c 45 43 54 20 65 78 70 65 6e  **  SELECT expen
325f0 73 69 76 65 5f 66 75 6e 63 74 69 6f 6e 28 78 29  sive_function(x)
32600 0a 20 20 20 20 2a 2a 20 20 20 20 46 52 4f 4d 20  .    **    FROM 
32610 28 53 45 4c 45 43 54 20 78 20 46 52 4f 4d 20 74  (SELECT x FROM t
32620 61 62 20 4f 52 44 45 52 20 42 59 20 79 20 4c 49  ab ORDER BY y LI
32630 4d 49 54 20 31 30 29 3b 0a 20 20 20 20 2a 2a 0a  MIT 10);.    **.
32640 20 20 20 20 2a 2a 20 54 68 65 20 65 78 70 65 6e      ** The expen
32650 73 69 76 65 5f 66 75 6e 63 74 69 6f 6e 28 29 20  sive_function() 
32660 69 73 20 6f 6e 6c 79 20 63 6f 6d 70 75 74 65 64  is only computed
32670 20 6f 6e 20 74 68 65 20 31 30 20 72 6f 77 73 20   on the 10 rows 
32680 74 68 61 74 0a 20 20 20 20 2a 2a 20 61 72 65 20  that.    ** are 
32690 6f 75 74 70 75 74 2c 20 72 61 74 68 65 72 20 74  output, rather t
326a0 68 61 6e 20 65 76 65 72 79 20 72 6f 77 20 6f 66  han every row of
326b0 20 74 68 65 20 74 61 62 6c 65 2e 0a 20 20 20 20   the table..    
326c0 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 72 65  **.    ** The re
326d0 71 75 69 72 65 6d 65 6e 74 20 74 68 61 74 20 74  quirement that t
326e0 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 68  he outer query h
326f0 61 76 65 20 61 20 63 6f 6d 70 6c 65 78 20 72 65  ave a complex re
32700 73 75 6c 74 20 73 65 74 0a 20 20 20 20 2a 2a 20  sult set.    ** 
32710 6d 65 61 6e 73 20 74 68 61 74 20 66 6c 61 74 74  means that flatt
32720 65 6e 69 6e 67 20 64 6f 65 73 20 6f 63 63 75 72  ening does occur
32730 20 6f 6e 20 73 69 6d 70 6c 65 72 20 53 51 4c 20   on simpler SQL 
32740 63 6f 6e 73 74 72 61 69 6e 74 73 20 77 69 74 68  constraints with
32750 6f 75 74 0a 20 20 20 20 2a 2a 20 74 68 65 20 65  out.    ** the e
32760 78 70 65 6e 73 69 76 65 5f 66 75 6e 63 74 69 6f  xpensive_functio
32770 6e 28 29 20 6c 69 6b 65 3a 0a 20 20 20 20 2a 2a  n() like:.    **
32780 0a 20 20 20 20 2a 2a 20 20 53 45 4c 45 43 54 20  .    **  SELECT 
32790 78 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20 78  x FROM (SELECT x
327a0 20 46 52 4f 4d 20 74 61 62 20 4f 52 44 45 52 20   FROM tab ORDER 
327b0 42 59 20 79 20 4c 49 4d 49 54 20 31 30 29 3b 0a  BY y LIMIT 10);.
327c0 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
327d0 53 75 62 2d 3e 70 4f 72 64 65 72 42 79 21 3d 30  Sub->pOrderBy!=0
327e0 0a 20 20 20 20 20 26 26 20 69 3d 3d 30 0a 20 20  .     && i==0.  
327f0 20 20 20 26 26 20 28 70 2d 3e 73 65 6c 46 6c 61     && (p->selFla
32800 67 73 20 26 20 53 46 5f 43 6f 6d 70 6c 65 78 52  gs & SF_ComplexR
32810 65 73 75 6c 74 29 21 3d 30 0a 20 20 20 20 20 26  esult)!=0.     &
32820 26 20 28 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72  & (pTabList->nSr
32830 63 3d 3d 31 0a 20 20 20 20 20 20 20 20 20 7c 7c  c==1.         ||
32840 20 28 70 54 61 62 4c 69 73 74 2d 3e 61 5b 31 5d   (pTabList->a[1]
32850 2e 66 67 2e 6a 6f 69 6e 74 79 70 65 26 28 4a 54  .fg.jointype&(JT
32860 5f 4c 45 46 54 7c 4a 54 5f 43 52 4f 53 53 29 29  _LEFT|JT_CROSS))
32870 21 3d 30 29 0a 20 20 20 20 29 7b 0a 20 20 20 20  !=0).    ){.    
32880 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
32890 7d 0a 0a 20 20 20 20 69 66 28 20 66 6c 61 74 74  }..    if( flatt
328a0 65 6e 53 75 62 71 75 65 72 79 28 70 50 61 72 73  enSubquery(pPars
328b0 65 2c 20 70 2c 20 69 2c 20 69 73 41 67 67 29 20  e, p, i, isAgg) 
328c0 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73  ){.      /* This
328d0 20 73 75 62 71 75 65 72 79 20 63 61 6e 20 62 65   subquery can be
328e0 20 61 62 73 6f 72 62 65 64 20 69 6e 74 6f 20 69   absorbed into i
328f0 74 73 20 70 61 72 65 6e 74 2e 20 2a 2f 0a 20 20  ts parent. */.  
32900 20 20 20 20 69 20 3d 20 2d 31 3b 0a 20 20 20 20      i = -1;.    
32910 7d 0a 20 20 20 20 70 54 61 62 4c 69 73 74 20 3d  }.    pTabList =
32920 20 70 2d 3e 70 53 72 63 3b 0a 20 20 20 20 69 66   p->pSrc;.    if
32930 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
32940 65 64 20 29 20 67 6f 74 6f 20 73 65 6c 65 63 74  ed ) goto select
32950 5f 65 6e 64 3b 0a 20 20 20 20 69 66 28 20 21 49  _end;.    if( !I
32960 67 6e 6f 72 61 62 6c 65 4f 72 64 65 72 62 79 28  gnorableOrderby(
32970 70 44 65 73 74 29 20 29 7b 0a 20 20 20 20 20 20  pDest) ){.      
32980 73 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 20 3d  sSort.pOrderBy =
32990 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20   p->pOrderBy;.  
329a0 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a    }.  }.#endif..
329b0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
329c0 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c  MIT_COMPOUND_SEL
329d0 45 43 54 0a 20 20 2f 2a 20 48 61 6e 64 6c 65 20  ECT.  /* Handle 
329e0 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 20  compound SELECT 
329f0 73 74 61 74 65 6d 65 6e 74 73 20 75 73 69 6e 67  statements using
32a00 20 74 68 65 20 73 65 70 61 72 61 74 65 20 6d 75   the separate mu
32a10 6c 74 69 53 65 6c 65 63 74 28 29 0a 20 20 2a 2a  ltiSelect().  **
32a20 20 70 72 6f 63 65 64 75 72 65 2e 0a 20 20 2a 2f   procedure..  */
32a30 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 69 6f 72  .  if( p->pPrior
32a40 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 6d 75 6c   ){.    rc = mul
32a50 74 69 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c  tiSelect(pParse,
32a60 20 70 2c 20 70 44 65 73 74 29 3b 0a 23 69 66 20   p, pDest);.#if 
32a70 53 45 4c 45 43 54 54 52 41 43 45 5f 45 4e 41 42  SELECTTRACE_ENAB
32a80 4c 45 44 0a 20 20 20 20 53 45 4c 45 43 54 54 52  LED.    SELECTTR
32a90 41 43 45 28 30 78 31 2c 70 50 61 72 73 65 2c 70  ACE(0x1,pParse,p
32aa0 2c 28 22 65 6e 64 20 63 6f 6d 70 6f 75 6e 64 2d  ,("end compound-
32ab0 73 65 6c 65 63 74 20 70 72 6f 63 65 73 73 69 6e  select processin
32ac0 67 5c 6e 22 29 29 3b 0a 20 20 20 20 69 66 28 20  g\n"));.    if( 
32ad0 28 73 71 6c 69 74 65 33 53 65 6c 65 63 74 54 72  (sqlite3SelectTr
32ae0 61 63 65 20 26 20 30 78 32 30 30 30 29 21 3d 30  ace & 0x2000)!=0
32af0 20 26 26 20 45 78 70 6c 61 69 6e 51 75 65 72 79   && ExplainQuery
32b00 50 6c 61 6e 50 61 72 65 6e 74 28 70 50 61 72 73  PlanParent(pPars
32b10 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73  e)==0 ){.      s
32b20 71 6c 69 74 65 33 54 72 65 65 56 69 65 77 53 65  qlite3TreeViewSe
32b30 6c 65 63 74 28 30 2c 20 70 2c 20 30 29 3b 0a 20  lect(0, p, 0);. 
32b40 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
32b50 69 66 28 20 70 2d 3e 70 4e 65 78 74 3d 3d 30 20  if( p->pNext==0 
32b60 29 20 45 78 70 6c 61 69 6e 51 75 65 72 79 50 6c  ) ExplainQueryPl
32b70 61 6e 50 6f 70 28 70 50 61 72 73 65 29 3b 0a 20  anPop(pParse);. 
32b80 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
32b90 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 44  }.#endif..  /* D
32ba0 6f 20 74 68 65 20 57 48 45 52 45 2d 63 6c 61 75  o the WHERE-clau
32bb0 73 65 20 63 6f 6e 73 74 61 6e 74 20 70 72 6f 70  se constant prop
32bc0 61 67 61 74 69 6f 6e 20 6f 70 74 69 6d 69 7a 61  agation optimiza
32bd0 74 69 6f 6e 20 69 66 20 74 68 69 73 20 69 73 0a  tion if this is.
32be0 20 20 2a 2a 20 61 20 6a 6f 69 6e 2e 20 20 4e 6f    ** a join.  No
32bf0 20 6e 65 65 64 20 74 6f 20 73 70 65 65 64 20 74   need to speed t
32c00 69 6d 65 20 6f 6e 20 74 68 69 73 20 6f 70 65 72  ime on this oper
32c10 61 74 69 6f 6e 20 66 6f 72 20 6e 6f 6e 2d 6a 6f  ation for non-jo
32c20 69 6e 20 71 75 65 72 69 65 73 0a 20 20 2a 2a 20  in queries.  ** 
32c30 61 73 20 74 68 65 20 65 71 75 69 76 61 6c 65 6e  as the equivalen
32c40 74 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 77  t optimization w
32c50 69 6c 6c 20 62 65 20 68 61 6e 64 6c 65 64 20 62  ill be handled b
32c60 79 20 71 75 65 72 79 20 70 6c 61 6e 6e 65 72 20  y query planner 
32c70 69 6e 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 57  in.  ** sqlite3W
32c80 68 65 72 65 42 65 67 69 6e 28 29 2e 0a 20 20 2a  hereBegin()..  *
32c90 2f 0a 20 20 69 66 28 20 70 54 61 62 4c 69 73 74  /.  if( pTabList
32ca0 2d 3e 6e 53 72 63 3e 31 0a 20 20 20 26 26 20 4f  ->nSrc>1.   && O
32cb0 70 74 69 6d 69 7a 61 74 69 6f 6e 45 6e 61 62 6c  ptimizationEnabl
32cc0 65 64 28 64 62 2c 20 53 51 4c 49 54 45 5f 50 72  ed(db, SQLITE_Pr
32cd0 6f 70 61 67 61 74 65 43 6f 6e 73 74 29 0a 20 20  opagateConst).  
32ce0 20 26 26 20 70 72 6f 70 61 67 61 74 65 43 6f 6e   && propagateCon
32cf0 73 74 61 6e 74 73 28 70 50 61 72 73 65 2c 20 70  stants(pParse, p
32d00 29 0a 20 20 29 7b 0a 23 69 66 20 53 45 4c 45 43  ).  ){.#if SELEC
32d10 54 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20  TTRACE_ENABLED. 
32d20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 65     if( sqlite3Se
32d30 6c 65 63 74 54 72 61 63 65 20 26 20 30 78 31 30  lectTrace & 0x10
32d40 30 20 29 7b 0a 20 20 20 20 20 20 53 45 4c 45 43  0 ){.      SELEC
32d50 54 54 52 41 43 45 28 30 78 31 30 30 2c 70 50 61  TTRACE(0x100,pPa
32d60 72 73 65 2c 70 2c 28 22 41 66 74 65 72 20 63 6f  rse,p,("After co
32d70 6e 73 74 61 6e 74 20 70 72 6f 70 61 67 61 74 69  nstant propagati
32d80 6f 6e 3a 5c 6e 22 29 29 3b 0a 20 20 20 20 20 20  on:\n"));.      
32d90 73 71 6c 69 74 65 33 54 72 65 65 56 69 65 77 53  sqlite3TreeViewS
32da0 65 6c 65 63 74 28 30 2c 20 70 2c 20 30 29 3b 0a  elect(0, p, 0);.
32db0 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d      }.#endif.  }
32dc0 65 6c 73 65 7b 0a 20 20 20 20 53 45 4c 45 43 54  else{.    SELECT
32dd0 54 52 41 43 45 28 30 78 31 30 30 2c 70 50 61 72  TRACE(0x100,pPar
32de0 73 65 2c 70 2c 28 22 43 6f 6e 73 74 61 6e 74 20  se,p,("Constant 
32df0 70 72 6f 70 61 67 61 74 69 6f 6e 20 6e 6f 74 20  propagation not 
32e00 68 65 6c 70 66 75 6c 5c 6e 22 29 29 3b 0a 20 20  helpful\n"));.  
32e10 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  }..#ifdef SQLITE
32e20 5f 43 4f 55 4e 54 4f 46 56 49 45 57 5f 4f 50 54  _COUNTOFVIEW_OPT
32e30 49 4d 49 5a 41 54 49 4f 4e 0a 20 20 69 66 28 20  IMIZATION.  if( 
32e40 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 45 6e 61 62  OptimizationEnab
32e50 6c 65 64 28 64 62 2c 20 53 51 4c 49 54 45 5f 51  led(db, SQLITE_Q
32e60 75 65 72 79 46 6c 61 74 74 65 6e 65 72 7c 53 51  ueryFlattener|SQ
32e70 4c 49 54 45 5f 43 6f 75 6e 74 4f 66 56 69 65 77  LITE_CountOfView
32e80 29 0a 20 20 20 26 26 20 63 6f 75 6e 74 4f 66 56  ).   && countOfV
32e90 69 65 77 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 28  iewOptimization(
32ea0 70 50 61 72 73 65 2c 20 70 29 0a 20 20 29 7b 0a  pParse, p).  ){.
32eb0 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c      if( db->mall
32ec0 6f 63 46 61 69 6c 65 64 20 29 20 67 6f 74 6f 20  ocFailed ) goto 
32ed0 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20  select_end;.    
32ee0 70 45 4c 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69  pEList = p->pELi
32ef0 73 74 3b 0a 20 20 20 20 70 54 61 62 4c 69 73 74  st;.    pTabList
32f00 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 7d 0a   = p->pSrc;.  }.
32f10 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 46 6f 72  #endif..  /* For
32f20 20 65 61 63 68 20 74 65 72 6d 20 69 6e 20 74 68   each term in th
32f30 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 2c 20 64  e FROM clause, d
32f40 6f 20 74 77 6f 20 74 68 69 6e 67 73 3a 0a 20 20  o two things:.  
32f50 2a 2a 20 28 31 29 20 41 75 74 68 6f 72 69 7a 65  ** (1) Authorize
32f60 64 20 75 6e 72 65 66 65 72 65 6e 63 65 64 20 74  d unreferenced t
32f70 61 62 6c 65 73 0a 20 20 2a 2a 20 28 32 29 20 47  ables.  ** (2) G
32f80 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72  enerate code for
32f90 20 61 6c 6c 20 73 75 62 2d 71 75 65 72 69 65 73   all sub-queries
32fa0 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b  .  */.  for(i=0;
32fb0 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72   i<pTabList->nSr
32fc0 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72  c; i++){.    str
32fd0 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
32fe0 20 2a 70 49 74 65 6d 20 3d 20 26 70 54 61 62 4c   *pItem = &pTabL
32ff0 69 73 74 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 53  ist->a[i];.    S
33000 65 6c 65 63 74 44 65 73 74 20 64 65 73 74 3b 0a  electDest dest;.
33010 20 20 20 20 53 65 6c 65 63 74 20 2a 70 53 75 62      Select *pSub
33020 3b 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  ;.#if !defined(S
33030 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
33040 45 52 59 29 20 7c 7c 20 21 64 65 66 69 6e 65 64  ERY) || !defined
33050 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45  (SQLITE_OMIT_VIE
33060 57 29 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  W).    const cha
33070 72 20 2a 7a 53 61 76 65 64 41 75 74 68 43 6f 6e  r *zSavedAuthCon
33080 74 65 78 74 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  text;.#endif..  
33090 20 20 2f 2a 20 49 73 73 75 65 20 53 51 4c 49 54    /* Issue SQLIT
330a0 45 5f 52 45 41 44 20 61 75 74 68 6f 72 69 7a 61  E_READ authoriza
330b0 74 69 6f 6e 73 20 77 69 74 68 20 61 20 66 61 6b  tions with a fak
330c0 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 66 6f  e column name fo
330d0 72 20 61 6e 79 0a 20 20 20 20 2a 2a 20 74 61 62  r any.    ** tab
330e0 6c 65 73 20 74 68 61 74 20 61 72 65 20 72 65 66  les that are ref
330f0 65 72 65 6e 63 65 64 20 62 75 74 20 66 72 6f 6d  erenced but from
33100 20 77 68 69 63 68 20 6e 6f 20 76 61 6c 75 65 73   which no values
33110 20 61 72 65 20 65 78 74 72 61 63 74 65 64 2e 0a   are extracted..
33120 20 20 20 20 2a 2a 20 45 78 61 6d 70 6c 65 73 20      ** Examples 
33130 6f 66 20 77 68 65 72 65 20 74 68 65 73 65 20 6b  of where these k
33140 69 6e 64 73 20 6f 66 20 6e 75 6c 6c 20 53 51 4c  inds of null SQL
33150 49 54 45 5f 52 45 41 44 20 61 75 74 68 6f 72 69  ITE_READ authori
33160 7a 61 74 69 6f 6e 73 0a 20 20 20 20 2a 2a 20 77  zations.    ** w
33170 6f 75 6c 64 20 6f 63 63 75 72 3a 0a 20 20 20 20  ould occur:.    
33180 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 53 45  **.    **     SE
33190 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52  LECT count(*) FR
331a0 4f 4d 20 74 31 3b 20 20 20 2d 2d 20 53 51 4c 49  OM t1;   -- SQLI
331b0 54 45 5f 52 45 41 44 20 74 31 2e 22 22 0a 20 20  TE_READ t1."".  
331c0 20 20 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20    **     SELECT 
331d0 74 31 2e 2a 20 46 52 4f 4d 20 74 31 2c 20 74 32  t1.* FROM t1, t2
331e0 3b 20 20 20 2d 2d 20 53 51 4c 49 54 45 5f 52 45  ;   -- SQLITE_RE
331f0 41 44 20 74 32 2e 22 22 0a 20 20 20 20 2a 2a 0a  AD t2."".    **.
33200 20 20 20 20 2a 2a 20 54 68 65 20 66 61 6b 65 20      ** The fake 
33210 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 69 73 20 61  column name is a
33220 6e 20 65 6d 70 74 79 20 73 74 72 69 6e 67 2e 20  n empty string. 
33230 20 49 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20   It is possible 
33240 66 6f 72 20 61 20 74 61 62 6c 65 20 74 6f 0a 20  for a table to. 
33250 20 20 20 2a 2a 20 68 61 76 65 20 61 20 63 6f 6c     ** have a col
33260 75 6d 6e 20 6e 61 6d 65 64 20 62 79 20 74 68 65  umn named by the
33270 20 65 6d 70 74 79 20 73 74 72 69 6e 67 2c 20 69   empty string, i
33280 6e 20 77 68 69 63 68 20 63 61 73 65 20 74 68 65  n which case the
33290 72 65 20 69 73 20 6e 6f 20 77 61 79 20 74 6f 0a  re is no way to.
332a0 20 20 20 20 2a 2a 20 64 69 73 74 69 6e 67 75 69      ** distingui
332b0 73 68 20 62 65 74 77 65 65 6e 20 61 6e 20 75 6e  sh between an un
332c0 72 65 66 65 72 65 6e 63 65 64 20 74 61 62 6c 65  referenced table
332d0 20 61 6e 64 20 61 6e 20 61 63 74 75 61 6c 20 72   and an actual r
332e0 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65 0a  eference to the.
332f0 20 20 20 20 2a 2a 20 22 22 20 63 6f 6c 75 6d 6e      ** "" column
33300 2e 20 54 68 65 20 6f 72 69 67 69 6e 61 6c 20 64  . The original d
33310 65 73 69 67 6e 20 77 61 73 20 66 6f 72 20 74 68  esign was for th
33320 65 20 66 61 6b 65 20 63 6f 6c 75 6d 6e 20 6e 61  e fake column na
33330 6d 65 20 74 6f 20 62 65 20 61 20 4e 55 4c 4c 2c  me to be a NULL,
33340 0a 20 20 20 20 2a 2a 20 77 68 69 63 68 20 77 6f  .    ** which wo
33350 75 6c 64 20 62 65 20 75 6e 61 6d 62 69 67 75 6f  uld be unambiguo
33360 75 73 2e 20 20 42 75 74 20 6c 65 67 61 63 79 20  us.  But legacy 
33370 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e 20 63 61  authorization ca
33380 6c 6c 62 61 63 6b 73 20 6d 69 67 68 74 0a 20 20  llbacks might.  
33390 20 20 2a 2a 20 61 73 73 75 6d 65 20 74 68 65 20    ** assume the 
333a0 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 69 73 20 6e  column name is n
333b0 6f 6e 2d 4e 55 4c 4c 20 61 6e 64 20 73 65 67 66  on-NULL and segf
333c0 61 75 6c 74 2e 20 20 54 68 65 20 75 73 65 20 6f  ault.  The use o
333d0 66 20 61 6e 20 65 6d 70 74 79 0a 20 20 20 20 2a  f an empty.    *
333e0 2a 20 73 74 72 69 6e 67 20 66 6f 72 20 74 68 65  * string for the
333f0 20 66 61 6b 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d   fake column nam
33400 65 20 73 65 65 6d 73 20 73 61 66 65 72 2e 0a 20  e seems safer.. 
33410 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 49     */.    if( pI
33420 74 65 6d 2d 3e 63 6f 6c 55 73 65 64 3d 3d 30 20  tem->colUsed==0 
33430 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
33440 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65  AuthCheck(pParse
33450 2c 20 53 51 4c 49 54 45 5f 52 45 41 44 2c 20 70  , SQLITE_READ, p
33460 49 74 65 6d 2d 3e 7a 4e 61 6d 65 2c 20 22 22 2c  Item->zName, "",
33470 20 70 49 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73   pItem->zDatabas
33480 65 29 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 20 21  e);.    }..#if !
33490 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
334a0 4d 49 54 5f 53 55 42 51 55 45 52 59 29 20 7c 7c  MIT_SUBQUERY) ||
334b0 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
334c0 5f 4f 4d 49 54 5f 56 49 45 57 29 0a 20 20 20 20  _OMIT_VIEW).    
334d0 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  /* Generate code
334e0 20 66 6f 72 20 61 6c 6c 20 73 75 62 2d 71 75 65   for all sub-que
334f0 72 69 65 73 20 69 6e 20 74 68 65 20 46 52 4f 4d  ries in the FROM
33500 20 63 6c 61 75 73 65 0a 20 20 20 20 2a 2f 0a 20   clause.    */. 
33510 20 20 20 70 53 75 62 20 3d 20 70 49 74 65 6d 2d     pSub = pItem-
33520 3e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 69 66  >pSelect;.    if
33530 28 20 70 53 75 62 3d 3d 30 20 29 20 63 6f 6e 74  ( pSub==0 ) cont
33540 69 6e 75 65 3b 0a 0a 20 20 20 20 2f 2a 20 53 6f  inue;..    /* So
33550 6d 65 74 69 6d 65 73 20 74 68 65 20 63 6f 64 65  metimes the code
33560 20 66 6f 72 20 61 20 73 75 62 71 75 65 72 79 20   for a subquery 
33570 77 69 6c 6c 20 62 65 20 67 65 6e 65 72 61 74 65  will be generate
33580 64 20 6d 6f 72 65 20 74 68 61 6e 0a 20 20 20 20  d more than.    
33590 2a 2a 20 6f 6e 63 65 2c 20 69 66 20 74 68 65 20  ** once, if the 
335a0 73 75 62 71 75 65 72 79 20 69 73 20 70 61 72 74  subquery is part
335b0 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 63 6c   of the WHERE cl
335c0 61 75 73 65 20 69 6e 20 61 20 4c 45 46 54 20 4a  ause in a LEFT J
335d0 4f 49 4e 2c 0a 20 20 20 20 2a 2a 20 66 6f 72 20  OIN,.    ** for 
335e0 65 78 61 6d 70 6c 65 2e 20 20 49 6e 20 74 68 61  example.  In tha
335f0 74 20 63 61 73 65 2c 20 64 6f 20 6e 6f 74 20 72  t case, do not r
33600 65 67 65 6e 65 72 61 74 65 20 74 68 65 20 63 6f  egenerate the co
33610 64 65 20 74 6f 20 6d 61 6e 69 66 65 73 74 0a 20  de to manifest. 
33620 20 20 20 2a 2a 20 61 20 76 69 65 77 20 6f 72 20     ** a view or 
33630 74 68 65 20 63 6f 2d 72 6f 75 74 69 6e 65 20 74  the co-routine t
33640 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 61 20 76 69  o implement a vi
33650 65 77 2e 20 20 54 68 65 20 66 69 72 73 74 20 69  ew.  The first i
33660 6e 73 74 61 6e 63 65 0a 20 20 20 20 2a 2a 20 69  nstance.    ** i
33670 73 20 73 75 66 66 69 63 69 65 6e 74 2c 20 74 68  s sufficient, th
33680 6f 75 67 68 20 74 68 65 20 73 75 62 72 6f 75 74  ough the subrout
33690 69 6e 65 20 74 6f 20 6d 61 6e 69 66 65 73 74 20  ine to manifest 
336a0 74 68 65 20 76 69 65 77 20 64 6f 65 73 20 6e 65  the view does ne
336b0 65 64 0a 20 20 20 20 2a 2a 20 74 6f 20 62 65 20  ed.    ** to be 
336c0 69 6e 76 6f 6b 65 64 20 61 67 61 69 6e 2e 20 2a  invoked again. *
336d0 2f 0a 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d  /.    if( pItem-
336e0 3e 61 64 64 72 46 69 6c 6c 53 75 62 20 29 7b 0a  >addrFillSub ){.
336f0 20 20 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d        if( pItem-
33700 3e 66 67 2e 76 69 61 43 6f 72 6f 75 74 69 6e 65  >fg.viaCoroutine
33710 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  ==0 ){.        /
33720 2a 20 54 68 65 20 73 75 62 72 6f 75 74 69 6e 65  * The subroutine
33730 20 74 68 61 74 20 6d 61 6e 69 66 65 73 74 73 20   that manifests 
33740 74 68 65 20 76 69 65 77 20 6d 69 67 68 74 20 62  the view might b
33750 65 20 61 20 6f 6e 65 2d 74 69 6d 65 20 72 6f 75  e a one-time rou
33760 74 69 6e 65 2c 0a 20 20 20 20 20 20 20 20 2a 2a  tine,.        **
33770 20 6f 72 20 69 74 20 6d 69 67 68 74 20 6e 65 65   or it might nee
33780 64 20 74 6f 20 62 65 20 72 65 72 75 6e 20 6f 6e  d to be rerun on
33790 20 65 61 63 68 20 69 74 65 72 61 74 69 6f 6e 20   each iteration 
337a0 62 65 63 61 75 73 65 20 69 74 0a 20 20 20 20 20  because it.     
337b0 20 20 20 2a 2a 20 65 6e 63 6f 64 65 73 20 61 20     ** encodes a 
337c0 63 6f 72 72 65 6c 61 74 65 64 20 73 75 62 71 75  correlated subqu
337d0 65 72 79 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  ery. */.        
337e0 74 65 73 74 63 61 73 65 28 20 73 71 6c 69 74 65  testcase( sqlite
337f0 33 56 64 62 65 47 65 74 4f 70 28 76 2c 20 70 49  3VdbeGetOp(v, pI
33800 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75 62  tem->addrFillSub
33810 29 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 4f 6e  )->opcode==OP_On
33820 63 65 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71  ce );.        sq
33830 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
33840 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 70 49 74  v, OP_Gosub, pIt
33850 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e 2c 20 70  em->regReturn, p
33860 49 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75  Item->addrFillSu
33870 62 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  b);.      }.    
33880 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
33890 7d 0a 0a 20 20 20 20 2f 2a 20 49 6e 63 72 65 6d  }..    /* Increm
338a0 65 6e 74 20 50 61 72 73 65 2e 6e 48 65 69 67 68  ent Parse.nHeigh
338b0 74 20 62 79 20 74 68 65 20 68 65 69 67 68 74 20  t by the height 
338c0 6f 66 20 74 68 65 20 6c 61 72 67 65 73 74 20 65  of the largest e
338d0 78 70 72 65 73 73 69 6f 6e 0a 20 20 20 20 2a 2a  xpression.    **
338e0 20 74 72 65 65 20 72 65 66 65 72 72 65 64 20 74   tree referred t
338f0 6f 20 62 79 20 74 68 69 73 2c 20 74 68 65 20 70  o by this, the p
33900 61 72 65 6e 74 20 73 65 6c 65 63 74 2e 20 54 68  arent select. Th
33910 65 20 63 68 69 6c 64 20 73 65 6c 65 63 74 0a 20  e child select. 
33920 20 20 20 2a 2a 20 6d 61 79 20 63 6f 6e 74 61 69     ** may contai
33930 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65  n expression tre
33940 65 73 20 6f 66 20 61 74 20 6d 6f 73 74 0a 20 20  es of at most.  
33950 20 20 2a 2a 20 28 53 51 4c 49 54 45 5f 4d 41 58    ** (SQLITE_MAX
33960 5f 45 58 50 52 5f 44 45 50 54 48 2d 50 61 72 73  _EXPR_DEPTH-Pars
33970 65 2e 6e 48 65 69 67 68 74 29 20 68 65 69 67 68  e.nHeight) heigh
33980 74 2e 20 54 68 69 73 20 69 73 20 61 20 62 69 74  t. This is a bit
33990 0a 20 20 20 20 2a 2a 20 6d 6f 72 65 20 63 6f 6e  .    ** more con
339a0 73 65 72 76 61 74 69 76 65 20 74 68 61 6e 20 6e  servative than n
339b0 65 63 65 73 73 61 72 79 2c 20 62 75 74 20 6d 75  ecessary, but mu
339c0 63 68 20 65 61 73 69 65 72 20 74 68 61 6e 20 65  ch easier than e
339d0 6e 66 6f 72 63 69 6e 67 0a 20 20 20 20 2a 2a 20  nforcing.    ** 
339e0 61 6e 20 65 78 61 63 74 20 6c 69 6d 69 74 2e 0a  an exact limit..
339f0 20 20 20 20 2a 2f 0a 20 20 20 20 70 50 61 72 73      */.    pPars
33a00 65 2d 3e 6e 48 65 69 67 68 74 20 2b 3d 20 73 71  e->nHeight += sq
33a10 6c 69 74 65 33 53 65 6c 65 63 74 45 78 70 72 48  lite3SelectExprH
33a20 65 69 67 68 74 28 70 29 3b 0a 0a 20 20 20 20 2f  eight(p);..    /
33a30 2a 20 4d 61 6b 65 20 63 6f 70 69 65 73 20 6f 66  * Make copies of
33a40 20 63 6f 6e 73 74 61 6e 74 20 57 48 45 52 45 2d   constant WHERE-
33a50 63 6c 61 75 73 65 20 74 65 72 6d 73 20 69 6e 20  clause terms in 
33a60 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  the outer query 
33a70 64 6f 77 6e 0a 20 20 20 20 2a 2a 20 69 6e 73 69  down.    ** insi
33a80 64 65 20 74 68 65 20 73 75 62 71 75 65 72 79 2e  de the subquery.
33a90 20 20 54 68 69 73 20 63 61 6e 20 68 65 6c 70 20    This can help 
33aa0 74 68 65 20 73 75 62 71 75 65 72 79 20 74 6f 20  the subquery to 
33ab0 72 75 6e 20 6d 6f 72 65 20 65 66 66 69 63 69 65  run more efficie
33ac0 6e 74 6c 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ntly..    */.   
33ad0 20 69 66 28 20 4f 70 74 69 6d 69 7a 61 74 69 6f   if( Optimizatio
33ae0 6e 45 6e 61 62 6c 65 64 28 64 62 2c 20 53 51 4c  nEnabled(db, SQL
33af0 49 54 45 5f 50 75 73 68 44 6f 77 6e 29 0a 20 20  ITE_PushDown).  
33b00 20 20 20 26 26 20 70 75 73 68 44 6f 77 6e 57 68     && pushDownWh
33b10 65 72 65 54 65 72 6d 73 28 70 50 61 72 73 65 2c  ereTerms(pParse,
33b20 20 70 53 75 62 2c 20 70 2d 3e 70 57 68 65 72 65   pSub, p->pWhere
33b30 2c 20 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72  , pItem->iCursor
33b40 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
33b50 20 20 20 20 20 20 20 20 20 20 20 20 20 28 70 49               (pI
33b60 74 65 6d 2d 3e 66 67 2e 6a 6f 69 6e 74 79 70 65  tem->fg.jointype
33b70 20 26 20 4a 54 5f 4f 55 54 45 52 29 21 3d 30 29   & JT_OUTER)!=0)
33b80 0a 20 20 20 20 29 7b 0a 23 69 66 20 53 45 4c 45  .    ){.#if SELE
33b90 43 54 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a  CTTRACE_ENABLED.
33ba0 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
33bb0 33 53 65 6c 65 63 74 54 72 61 63 65 20 26 20 30  3SelectTrace & 0
33bc0 78 31 30 30 20 29 7b 0a 20 20 20 20 20 20 20 20  x100 ){.        
33bd0 53 45 4c 45 43 54 54 52 41 43 45 28 30 78 31 30  SELECTTRACE(0x10
33be0 30 2c 70 50 61 72 73 65 2c 70 2c 0a 20 20 20 20  0,pParse,p,.    
33bf0 20 20 20 20 20 20 20 20 28 22 41 66 74 65 72 20          ("After 
33c00 57 48 45 52 45 2d 63 6c 61 75 73 65 20 70 75 73  WHERE-clause pus
33c10 68 2d 64 6f 77 6e 20 69 6e 74 6f 20 73 75 62 71  h-down into subq
33c20 75 65 72 79 20 25 64 3a 5c 6e 22 2c 20 70 53 75  uery %d:\n", pSu
33c30 62 2d 3e 73 65 6c 49 64 29 29 3b 0a 20 20 20 20  b->selId));.    
33c40 20 20 20 20 73 71 6c 69 74 65 33 54 72 65 65 56      sqlite3TreeV
33c50 69 65 77 53 65 6c 65 63 74 28 30 2c 20 70 2c 20  iewSelect(0, p, 
33c60 30 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64  0);.      }.#end
33c70 69 66 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  if.    }else{.  
33c80 20 20 20 20 53 45 4c 45 43 54 54 52 41 43 45 28      SELECTTRACE(
33c90 30 78 31 30 30 2c 70 50 61 72 73 65 2c 70 2c 28  0x100,pParse,p,(
33ca0 22 50 75 73 68 2d 64 6f 77 6e 20 6e 6f 74 20 70  "Push-down not p
33cb0 6f 73 73 69 62 6c 65 5c 6e 22 29 29 3b 0a 20 20  ossible\n"));.  
33cc0 20 20 7d 0a 0a 20 20 20 20 7a 53 61 76 65 64 41    }..    zSavedA
33cd0 75 74 68 43 6f 6e 74 65 78 74 20 3d 20 70 50 61  uthContext = pPa
33ce0 72 73 65 2d 3e 7a 41 75 74 68 43 6f 6e 74 65 78  rse->zAuthContex
33cf0 74 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 7a  t;.    pParse->z
33d00 41 75 74 68 43 6f 6e 74 65 78 74 20 3d 20 70 49  AuthContext = pI
33d10 74 65 6d 2d 3e 7a 4e 61 6d 65 3b 0a 0a 20 20 20  tem->zName;..   
33d20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64   /* Generate cod
33d30 65 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74  e to implement t
33d40 68 65 20 73 75 62 71 75 65 72 79 0a 20 20 20 20  he subquery.    
33d50 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 73 75  **.    ** The su
33d60 62 71 75 65 72 79 20 69 73 20 69 6d 70 6c 65 6d  bquery is implem
33d70 65 6e 74 65 64 20 61 73 20 61 20 63 6f 2d 72 6f  ented as a co-ro
33d80 75 74 69 6e 65 20 69 66 20 74 68 65 20 73 75 62  utine if the sub
33d90 71 75 65 72 79 20 69 73 0a 20 20 20 20 2a 2a 20  query is.    ** 
33da0 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 62 65  guaranteed to be
33db0 20 74 68 65 20 6f 75 74 65 72 20 6c 6f 6f 70 20   the outer loop 
33dc0 28 73 6f 20 74 68 61 74 20 69 74 20 64 6f 65 73  (so that it does
33dd0 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 0a   not need to be.
33de0 20 20 20 20 2a 2a 20 63 6f 6d 70 75 74 65 64 20      ** computed 
33df0 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 63 65 29 0a  more than once).
33e00 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 4f      **.    ** TO
33e10 44 4f 3a 20 41 72 65 20 74 68 65 72 65 20 6f 74  DO: Are there ot
33e20 68 65 72 20 72 65 61 73 6f 6e 73 20 62 65 73 69  her reasons besi
33e30 64 65 20 28 31 29 20 74 6f 20 75 73 65 20 61 20  de (1) to use a 
33e40 63 6f 2d 72 6f 75 74 69 6e 65 0a 20 20 20 20 2a  co-routine.    *
33e50 2a 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  * implementation
33e60 3f 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ?.    */.    if(
33e70 20 69 3d 3d 30 0a 20 20 20 20 20 26 26 20 28 70   i==0.     && (p
33e80 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3d 3d 31  TabList->nSrc==1
33e90 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20  .            || 
33ea0 28 70 54 61 62 4c 69 73 74 2d 3e 61 5b 31 5d 2e  (pTabList->a[1].
33eb0 66 67 2e 6a 6f 69 6e 74 79 70 65 26 28 4a 54 5f  fg.jointype&(JT_
33ec0 4c 45 46 54 7c 4a 54 5f 43 52 4f 53 53 29 29 21  LEFT|JT_CROSS))!
33ed0 3d 30 29 20 20 2f 2a 20 28 31 29 20 2a 2f 0a 20  =0)  /* (1) */. 
33ee0 20 20 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49     ){.      /* I
33ef0 6d 70 6c 65 6d 65 6e 74 20 61 20 63 6f 2d 72 6f  mplement a co-ro
33f00 75 74 69 6e 65 20 74 68 61 74 20 77 69 6c 6c 20  utine that will 
33f10 72 65 74 75 72 6e 20 61 20 73 69 6e 67 6c 65 20  return a single 
33f20 72 6f 77 20 6f 66 20 74 68 65 20 72 65 73 75 6c  row of the resul
33f30 74 0a 20 20 20 20 20 20 2a 2a 20 73 65 74 20 6f  t.      ** set o
33f40 6e 20 65 61 63 68 20 69 6e 76 6f 63 61 74 69 6f  n each invocatio
33f50 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  n..      */.    
33f60 20 20 69 6e 74 20 61 64 64 72 54 6f 70 20 3d 20    int addrTop = 
33f70 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
33f80 6e 74 41 64 64 72 28 76 29 2b 31 3b 0a 20 20 20  ntAddr(v)+1;.   
33f90 20 20 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e    .      pItem->
33fa0 72 65 67 52 65 74 75 72 6e 20 3d 20 2b 2b 70 50  regReturn = ++pP
33fb0 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20  arse->nMem;.    
33fc0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
33fd0 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 69 74 43 6f  Op3(v, OP_InitCo
33fe0 72 6f 75 74 69 6e 65 2c 20 70 49 74 65 6d 2d 3e  routine, pItem->
33ff0 72 65 67 52 65 74 75 72 6e 2c 20 30 2c 20 61 64  regReturn, 0, ad
34000 64 72 54 6f 70 29 3b 0a 20 20 20 20 20 20 56 64  drTop);.      Vd
34010 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 25  beComment((v, "%
34020 73 22 2c 20 70 49 74 65 6d 2d 3e 70 54 61 62 2d  s", pItem->pTab-
34030 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 20 20  >zName));.      
34040 70 49 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53  pItem->addrFillS
34050 75 62 20 3d 20 61 64 64 72 54 6f 70 3b 0a 20 20  ub = addrTop;.  
34060 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63      sqlite3Selec
34070 74 44 65 73 74 49 6e 69 74 28 26 64 65 73 74 2c  tDestInit(&dest,
34080 20 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 2c 20   SRT_Coroutine, 
34090 70 49 74 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e  pItem->regReturn
340a0 29 3b 0a 20 20 20 20 20 20 45 78 70 6c 61 69 6e  );.      Explain
340b0 51 75 65 72 79 50 6c 61 6e 28 28 70 50 61 72 73  QueryPlan((pPars
340c0 65 2c 20 31 2c 20 22 43 4f 2d 52 4f 55 54 49 4e  e, 1, "CO-ROUTIN
340d0 45 20 25 75 22 2c 20 70 53 75 62 2d 3e 73 65 6c  E %u", pSub->sel
340e0 49 64 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  Id));.      sqli
340f0 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65  te3Select(pParse
34100 2c 20 70 53 75 62 2c 20 26 64 65 73 74 29 3b 0a  , pSub, &dest);.
34110 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 70 54 61        pItem->pTa
34120 62 2d 3e 6e 52 6f 77 4c 6f 67 45 73 74 20 3d 20  b->nRowLogEst = 
34130 70 53 75 62 2d 3e 6e 53 65 6c 65 63 74 52 6f 77  pSub->nSelectRow
34140 3b 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 66  ;.      pItem->f
34150 67 2e 76 69 61 43 6f 72 6f 75 74 69 6e 65 20 3d  g.viaCoroutine =
34160 20 31 3b 0a 20 20 20 20 20 20 70 49 74 65 6d 2d   1;.      pItem-
34170 3e 72 65 67 52 65 73 75 6c 74 20 3d 20 64 65 73  >regResult = des
34180 74 2e 69 53 64 73 74 3b 0a 20 20 20 20 20 20 73  t.iSdst;.      s
34190 71 6c 69 74 65 33 56 64 62 65 45 6e 64 43 6f 72  qlite3VdbeEndCor
341a0 6f 75 74 69 6e 65 28 76 2c 20 70 49 74 65 6d 2d  outine(v, pItem-
341b0 3e 72 65 67 52 65 74 75 72 6e 29 3b 0a 20 20 20  >regReturn);.   
341c0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
341d0 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 54 6f  mpHere(v, addrTo
341e0 70 2d 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  p-1);.      sqli
341f0 74 65 33 43 6c 65 61 72 54 65 6d 70 52 65 67 43  te3ClearTempRegC
34200 61 63 68 65 28 70 50 61 72 73 65 29 3b 0a 20 20  ache(pParse);.  
34210 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f    }else{.      /
34220 2a 20 47 65 6e 65 72 61 74 65 20 61 20 73 75 62  * Generate a sub
34230 72 6f 75 74 69 6e 65 20 74 68 61 74 20 77 69 6c  routine that wil
34240 6c 20 66 69 6c 6c 20 61 6e 20 65 70 68 65 6d 65  l fill an epheme
34250 72 61 6c 20 74 61 62 6c 65 20 77 69 74 68 0a 20  ral table with. 
34260 20 20 20 20 20 2a 2a 20 74 68 65 20 63 6f 6e 74       ** the cont
34270 65 6e 74 20 6f 66 20 74 68 69 73 20 73 75 62 71  ent of this subq
34280 75 65 72 79 2e 20 20 70 49 74 65 6d 2d 3e 61 64  uery.  pItem->ad
34290 64 72 46 69 6c 6c 53 75 62 20 77 69 6c 6c 20 70  drFillSub will p
342a0 6f 69 6e 74 0a 20 20 20 20 20 20 2a 2a 20 74 6f  oint.      ** to
342b0 20 74 68 65 20 61 64 64 72 65 73 73 20 6f 66 20   the address of 
342c0 74 68 65 20 67 65 6e 65 72 61 74 65 64 20 73 75  the generated su
342d0 62 72 6f 75 74 69 6e 65 2e 20 20 70 49 74 65 6d  broutine.  pItem
342e0 2d 3e 72 65 67 52 65 74 75 72 6e 0a 20 20 20 20  ->regReturn.    
342f0 20 20 2a 2a 20 69 73 20 61 20 72 65 67 69 73 74    ** is a regist
34300 65 72 20 61 6c 6c 6f 63 61 74 65 64 20 74 6f 20  er allocated to 
34310 68 6f 6c 64 20 74 68 65 20 73 75 62 72 6f 75 74  hold the subrout
34320 69 6e 65 20 72 65 74 75 72 6e 20 61 64 64 72 65  ine return addre
34330 73 73 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  ss.      */.    
34340 20 20 69 6e 74 20 74 6f 70 41 64 64 72 3b 0a 20    int topAddr;. 
34350 20 20 20 20 20 69 6e 74 20 6f 6e 63 65 41 64 64       int onceAdd
34360 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 6e 74  r = 0;.      int
34370 20 72 65 74 41 64 64 72 3b 0a 20 20 20 20 20 20   retAddr;.      
34380 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
34390 74 65 6d 20 2a 70 50 72 69 6f 72 3b 0a 0a 20 20  tem *pPrior;..  
343a0 20 20 20 20 61 73 73 65 72 74 28 20 70 49 74 65      assert( pIte
343b0 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75 62 3d 3d  m->addrFillSub==
343c0 30 20 29 3b 0a 20 20 20 20 20 20 70 49 74 65 6d  0 );.      pItem
343d0 2d 3e 72 65 67 52 65 74 75 72 6e 20 3d 20 2b 2b  ->regReturn = ++
343e0 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
343f0 20 20 20 20 74 6f 70 41 64 64 72 20 3d 20 73 71      topAddr = sq
34400 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
34410 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30  v, OP_Integer, 0
34420 2c 20 70 49 74 65 6d 2d 3e 72 65 67 52 65 74 75  , pItem->regRetu
34430 72 6e 29 3b 0a 20 20 20 20 20 20 70 49 74 65 6d  rn);.      pItem
34440 2d 3e 61 64 64 72 46 69 6c 6c 53 75 62 20 3d 20  ->addrFillSub = 
34450 74 6f 70 41 64 64 72 2b 31 3b 0a 20 20 20 20 20  topAddr+1;.     
34460 20 69 66 28 20 70 49 74 65 6d 2d 3e 66 67 2e 69   if( pItem->fg.i
34470 73 43 6f 72 72 65 6c 61 74 65 64 3d 3d 30 20 29  sCorrelated==0 )
34480 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20  {.        /* If 
34490 74 68 65 20 73 75 62 71 75 65 72 79 20 69 73 20  the subquery is 
344a0 6e 6f 74 20 63 6f 72 72 65 6c 61 74 65 64 20 61  not correlated a
344b0 6e 64 20 69 66 20 77 65 20 61 72 65 20 6e 6f 74  nd if we are not
344c0 20 69 6e 73 69 64 65 20 6f 66 0a 20 20 20 20 20   inside of.     
344d0 20 20 20 2a 2a 20 61 20 74 72 69 67 67 65 72 2c     ** a trigger,
344e0 20 74 68 65 6e 20 77 65 20 6f 6e 6c 79 20 6e 65   then we only ne
344f0 65 64 20 74 6f 20 63 6f 6d 70 75 74 65 20 74 68  ed to compute th
34500 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 73  e value of the s
34510 75 62 71 75 65 72 79 0a 20 20 20 20 20 20 20 20  ubquery.        
34520 2a 2a 20 6f 6e 63 65 2e 20 2a 2f 0a 20 20 20 20  ** once. */.    
34530 20 20 20 20 6f 6e 63 65 41 64 64 72 20 3d 20 73      onceAddr = s
34540 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 30  qlite3VdbeAddOp0
34550 28 76 2c 20 4f 50 5f 4f 6e 63 65 29 3b 20 56 64  (v, OP_Once); Vd
34560 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
34570 20 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65         VdbeComme
34580 6e 74 28 28 76 2c 20 22 6d 61 74 65 72 69 61 6c  nt((v, "material
34590 69 7a 65 20 5c 22 25 73 5c 22 22 2c 20 70 49 74  ize \"%s\"", pIt
345a0 65 6d 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65 29  em->pTab->zName)
345b0 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
345c0 20 20 20 20 20 20 20 20 56 64 62 65 4e 6f 6f 70          VdbeNoop
345d0 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 6d 61 74  Comment((v, "mat
345e0 65 72 69 61 6c 69 7a 65 20 5c 22 25 73 5c 22 22  erialize \"%s\""
345f0 2c 20 70 49 74 65 6d 2d 3e 70 54 61 62 2d 3e 7a  , pItem->pTab->z
34600 4e 61 6d 65 29 29 3b 0a 20 20 20 20 20 20 7d 0a  Name));.      }.
34610 20 20 20 20 20 20 70 50 72 69 6f 72 20 3d 20 69        pPrior = i
34620 73 53 65 6c 66 4a 6f 69 6e 56 69 65 77 28 70 54  sSelfJoinView(pT
34630 61 62 4c 69 73 74 2c 20 70 49 74 65 6d 29 3b 0a  abList, pItem);.
34640 20 20 20 20 20 20 69 66 28 20 70 50 72 69 6f 72        if( pPrior
34650 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
34660 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
34670 20 4f 50 5f 4f 70 65 6e 44 75 70 2c 20 70 49 74   OP_OpenDup, pIt
34680 65 6d 2d 3e 69 43 75 72 73 6f 72 2c 20 70 50 72  em->iCursor, pPr
34690 69 6f 72 2d 3e 69 43 75 72 73 6f 72 29 3b 0a 20  ior->iCursor);. 
346a0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
346b0 50 72 69 6f 72 2d 3e 70 53 65 6c 65 63 74 21 3d  Prior->pSelect!=
346c0 30 20 29 3b 0a 20 20 20 20 20 20 20 20 70 53 75  0 );.        pSu
346d0 62 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20  b->nSelectRow = 
346e0 70 50 72 69 6f 72 2d 3e 70 53 65 6c 65 63 74 2d  pPrior->pSelect-
346f0 3e 6e 53 65 6c 65 63 74 52 6f 77 3b 0a 20 20 20  >nSelectRow;.   
34700 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
34710 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44    sqlite3SelectD
34720 65 73 74 49 6e 69 74 28 26 64 65 73 74 2c 20 53  estInit(&dest, S
34730 52 54 5f 45 70 68 65 6d 54 61 62 2c 20 70 49 74  RT_EphemTab, pIt
34740 65 6d 2d 3e 69 43 75 72 73 6f 72 29 3b 0a 20 20  em->iCursor);.  
34750 20 20 20 20 20 20 45 78 70 6c 61 69 6e 51 75 65        ExplainQue
34760 72 79 50 6c 61 6e 28 28 70 50 61 72 73 65 2c 20  ryPlan((pParse, 
34770 31 2c 20 22 4d 41 54 45 52 49 41 4c 49 5a 45 20  1, "MATERIALIZE 
34780 25 75 22 2c 20 70 53 75 62 2d 3e 73 65 6c 49 64  %u", pSub->selId
34790 29 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  ));.        sqli
347a0 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65  te3Select(pParse
347b0 2c 20 70 53 75 62 2c 20 26 64 65 73 74 29 3b 0a  , pSub, &dest);.
347c0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 49        }.      pI
347d0 74 65 6d 2d 3e 70 54 61 62 2d 3e 6e 52 6f 77 4c  tem->pTab->nRowL
347e0 6f 67 45 73 74 20 3d 20 70 53 75 62 2d 3e 6e 53  ogEst = pSub->nS
347f0 65 6c 65 63 74 52 6f 77 3b 0a 20 20 20 20 20 20  electRow;.      
34800 69 66 28 20 6f 6e 63 65 41 64 64 72 20 29 20 73  if( onceAddr ) s
34810 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
34820 72 65 28 76 2c 20 6f 6e 63 65 41 64 64 72 29 3b  re(v, onceAddr);
34830 0a 20 20 20 20 20 20 72 65 74 41 64 64 72 20 3d  .      retAddr =
34840 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
34850 70 31 28 76 2c 20 4f 50 5f 52 65 74 75 72 6e 2c  p1(v, OP_Return,
34860 20 70 49 74 65 6d 2d 3e 72 65 67 52 65 74 75 72   pItem->regRetur
34870 6e 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  n);.      VdbeCo
34880 6d 6d 65 6e 74 28 28 76 2c 20 22 65 6e 64 20 25  mment((v, "end %
34890 73 22 2c 20 70 49 74 65 6d 2d 3e 70 54 61 62 2d  s", pItem->pTab-
348a0 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 20 20  >zName));.      
348b0 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
348c0 65 50 31 28 76 2c 20 74 6f 70 41 64 64 72 2c 20  eP1(v, topAddr, 
348d0 72 65 74 41 64 64 72 29 3b 0a 20 20 20 20 20 20  retAddr);.      
348e0 73 71 6c 69 74 65 33 43 6c 65 61 72 54 65 6d 70  sqlite3ClearTemp
348f0 52 65 67 43 61 63 68 65 28 70 50 61 72 73 65 29  RegCache(pParse)
34900 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
34910 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
34920 20 29 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65   ) goto select_e
34930 6e 64 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e  nd;.    pParse->
34940 6e 48 65 69 67 68 74 20 2d 3d 20 73 71 6c 69 74  nHeight -= sqlit
34950 65 33 53 65 6c 65 63 74 45 78 70 72 48 65 69 67  e3SelectExprHeig
34960 68 74 28 70 29 3b 0a 20 20 20 20 70 50 61 72 73  ht(p);.    pPars
34970 65 2d 3e 7a 41 75 74 68 43 6f 6e 74 65 78 74 20  e->zAuthContext 
34980 3d 20 7a 53 61 76 65 64 41 75 74 68 43 6f 6e 74  = zSavedAuthCont
34990 65 78 74 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a  ext;.#endif.  }.
349a0 0a 20 20 2f 2a 20 56 61 72 69 6f 75 73 20 65 6c  .  /* Various el
349b0 65 6d 65 6e 74 73 20 6f 66 20 74 68 65 20 53 45  ements of the SE
349c0 4c 45 43 54 20 63 6f 70 69 65 64 20 69 6e 74 6f  LECT copied into
349d0 20 6c 6f 63 61 6c 20 76 61 72 69 61 62 6c 65 73   local variables
349e0 20 66 6f 72 0a 20 20 2a 2a 20 63 6f 6e 76 65 6e   for.  ** conven
349f0 69 65 6e 63 65 20 2a 2f 0a 20 20 70 45 4c 69 73  ience */.  pELis
34a00 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 20  t = p->pEList;. 
34a10 20 70 57 68 65 72 65 20 3d 20 70 2d 3e 70 57 68   pWhere = p->pWh
34a20 65 72 65 3b 0a 20 20 70 47 72 6f 75 70 42 79 20  ere;.  pGroupBy 
34a30 3d 20 70 2d 3e 70 47 72 6f 75 70 42 79 3b 0a 20  = p->pGroupBy;. 
34a40 20 70 48 61 76 69 6e 67 20 3d 20 70 2d 3e 70 48   pHaving = p->pH
34a50 61 76 69 6e 67 3b 0a 20 20 73 44 69 73 74 69 6e  aving;.  sDistin
34a60 63 74 2e 69 73 54 6e 63 74 20 3d 20 28 70 2d 3e  ct.isTnct = (p->
34a70 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 44 69  selFlags & SF_Di
34a80 73 74 69 6e 63 74 29 21 3d 30 3b 0a 0a 23 69 66  stinct)!=0;..#if
34a90 20 53 45 4c 45 43 54 54 52 41 43 45 5f 45 4e 41   SELECTTRACE_ENA
34aa0 42 4c 45 44 0a 20 20 69 66 28 20 73 71 6c 69 74  BLED.  if( sqlit
34ab0 65 33 53 65 6c 65 63 74 54 72 61 63 65 20 26 20  e3SelectTrace & 
34ac0 30 78 34 30 30 20 29 7b 0a 20 20 20 20 53 45 4c  0x400 ){.    SEL
34ad0 45 43 54 54 52 41 43 45 28 30 78 34 30 30 2c 70  ECTTRACE(0x400,p
34ae0 50 61 72 73 65 2c 70 2c 28 22 41 66 74 65 72 20  Parse,p,("After 
34af0 61 6c 6c 20 46 52 4f 4d 2d 63 6c 61 75 73 65 20  all FROM-clause 
34b00 61 6e 61 6c 79 73 69 73 3a 5c 6e 22 29 29 3b 0a  analysis:\n"));.
34b10 20 20 20 20 73 71 6c 69 74 65 33 54 72 65 65 56      sqlite3TreeV
34b20 69 65 77 53 65 6c 65 63 74 28 30 2c 20 70 2c 20  iewSelect(0, p, 
34b30 30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  0);.  }.#endif..
34b40 20 20 2f 2a 20 49 66 20 74 68 65 20 71 75 65 72    /* If the quer
34b50 79 20 69 73 20 44 49 53 54 49 4e 43 54 20 77 69  y is DISTINCT wi
34b60 74 68 20 61 6e 20 4f 52 44 45 52 20 42 59 20 62  th an ORDER BY b
34b70 75 74 20 69 73 20 6e 6f 74 20 61 6e 20 61 67 67  ut is not an agg
34b80 72 65 67 61 74 65 2c 20 61 6e 64 20 0a 20 20 2a  regate, and .  *
34b90 2a 20 69 66 20 74 68 65 20 73 65 6c 65 63 74 2d  * if the select-
34ba0 6c 69 73 74 20 69 73 20 74 68 65 20 73 61 6d 65  list is the same
34bb0 20 61 73 20 74 68 65 20 4f 52 44 45 52 20 42 59   as the ORDER BY
34bc0 20 6c 69 73 74 2c 20 74 68 65 6e 20 74 68 69 73   list, then this
34bd0 20 71 75 65 72 79 0a 20 20 2a 2a 20 63 61 6e 20   query.  ** can 
34be0 62 65 20 72 65 77 72 69 74 74 65 6e 20 61 73 20  be rewritten as 
34bf0 61 20 47 52 4f 55 50 20 42 59 2e 20 49 6e 20 6f  a GROUP BY. In o
34c00 74 68 65 72 20 77 6f 72 64 73 2c 20 74 68 69 73  ther words, this
34c10 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20  :.  **.  **     
34c20 53 45 4c 45 43 54 20 44 49 53 54 49 4e 43 54 20  SELECT DISTINCT 
34c30 78 79 7a 20 46 52 4f 4d 20 2e 2e 2e 20 4f 52 44  xyz FROM ... ORD
34c40 45 52 20 42 59 20 78 79 7a 0a 20 20 2a 2a 0a 20  ER BY xyz.  **. 
34c50 20 2a 2a 20 69 73 20 74 72 61 6e 73 66 6f 72 6d   ** is transform
34c60 65 64 20 74 6f 3a 0a 20 20 2a 2a 0a 20 20 2a 2a  ed to:.  **.  **
34c70 20 20 20 20 20 53 45 4c 45 43 54 20 78 79 7a 20       SELECT xyz 
34c80 46 52 4f 4d 20 2e 2e 2e 20 47 52 4f 55 50 20 42  FROM ... GROUP B
34c90 59 20 78 79 7a 20 4f 52 44 45 52 20 42 59 20 78  Y xyz ORDER BY x
34ca0 79 7a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65  yz.  **.  ** The
34cb0 20 73 65 63 6f 6e 64 20 66 6f 72 6d 20 69 73 20   second form is 
34cc0 70 72 65 66 65 72 72 65 64 20 61 73 20 61 20 73  preferred as a s
34cd0 69 6e 67 6c 65 20 69 6e 64 65 78 20 28 6f 72 20  ingle index (or 
34ce0 74 65 6d 70 2d 74 61 62 6c 65 29 20 6d 61 79 20  temp-table) may 
34cf0 62 65 20 0a 20 20 2a 2a 20 75 73 65 64 20 66 6f  be .  ** used fo
34d00 72 20 62 6f 74 68 20 74 68 65 20 4f 52 44 45 52  r both the ORDER
34d10 20 42 59 20 61 6e 64 20 44 49 53 54 49 4e 43 54   BY and DISTINCT
34d20 20 70 72 6f 63 65 73 73 69 6e 67 2e 20 41 73 20   processing. As 
34d30 6f 72 69 67 69 6e 61 6c 6c 79 20 0a 20 20 2a 2a  originally .  **
34d40 20 77 72 69 74 74 65 6e 20 74 68 65 20 71 75 65   written the que
34d50 72 79 20 6d 75 73 74 20 75 73 65 20 61 20 74 65  ry must use a te
34d60 6d 70 2d 74 61 62 6c 65 20 66 6f 72 20 61 74 20  mp-table for at 
34d70 6c 65 61 73 74 20 6f 6e 65 20 6f 66 20 74 68 65  least one of the
34d80 20 4f 52 44 45 52 20 0a 20 20 2a 2a 20 42 59 20   ORDER .  ** BY 
34d90 61 6e 64 20 44 49 53 54 49 4e 43 54 2c 20 61 6e  and DISTINCT, an
34da0 64 20 61 6e 20 69 6e 64 65 78 20 6f 72 20 73 65  d an index or se
34db0 70 61 72 61 74 65 20 74 65 6d 70 2d 74 61 62 6c  parate temp-tabl
34dc0 65 20 66 6f 72 20 74 68 65 20 6f 74 68 65 72 2e  e for the other.
34dd0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 70 2d 3e  .  */.  if( (p->
34de0 73 65 6c 46 6c 61 67 73 20 26 20 28 53 46 5f 44  selFlags & (SF_D
34df0 69 73 74 69 6e 63 74 7c 53 46 5f 41 67 67 72 65  istinct|SF_Aggre
34e00 67 61 74 65 29 29 3d 3d 53 46 5f 44 69 73 74 69  gate))==SF_Disti
34e10 6e 63 74 20 0a 20 20 20 26 26 20 73 71 6c 69 74  nct .   && sqlit
34e20 65 33 45 78 70 72 4c 69 73 74 43 6f 6d 70 61 72  e3ExprListCompar
34e30 65 28 73 53 6f 72 74 2e 70 4f 72 64 65 72 42 79  e(sSort.pOrderBy
34e40 2c 20 70 45 4c 69 73 74 2c 20 2d 31 29 3d 3d 30  , pEList, -1)==0
34e50 0a 20 20 29 7b 0a 20 20 20 20 70 2d 3e 73 65 6c  .  ){.    p->sel
34e60 46 6c 61 67 73 20 26 3d 20 7e 53 46 5f 44 69 73  Flags &= ~SF_Dis
34e70 74 69 6e 63 74 3b 0a 20 20 20 20 70 47 72 6f 75  tinct;.    pGrou
34e80 70 42 79 20 3d 20 70 2d 3e 70 47 72 6f 75 70 42  pBy = p->pGroupB
34e90 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c  y = sqlite3ExprL
34ea0 69 73 74 44 75 70 28 64 62 2c 20 70 45 4c 69 73  istDup(db, pELis
34eb0 74 2c 20 30 29 3b 0a 20 20 20 20 2f 2a 20 4e 6f  t, 0);.    /* No
34ec0 74 69 63 65 20 74 68 61 74 20 65 76 65 6e 20 74  tice that even t
34ed0 68 6f 75 67 68 74 20 53 46 5f 44 69 73 74 69 6e  hought SF_Distin
34ee0 63 74 20 68 61 73 20 62 65 65 6e 20 63 6c 65 61  ct has been clea
34ef0 72 65 64 20 66 72 6f 6d 20 70 2d 3e 73 65 6c 46  red from p->selF
34f00 6c 61 67 73 2c 0a 20 20 20 20 2a 2a 20 74 68 65  lags,.    ** the
34f10 20 73 44 69 73 74 69 6e 63 74 2e 69 73 54 6e 63   sDistinct.isTnc
34f20 74 20 69 73 20 73 74 69 6c 6c 20 73 65 74 2e 20  t is still set. 
34f30 20 48 65 6e 63 65 2c 20 69 73 54 6e 63 74 20 72   Hence, isTnct r
34f40 65 70 72 65 73 65 6e 74 73 20 74 68 65 0a 20 20  epresents the.  
34f50 20 20 2a 2a 20 6f 72 69 67 69 6e 61 6c 20 73 65    ** original se
34f60 74 74 69 6e 67 20 6f 66 20 74 68 65 20 53 46 5f  tting of the SF_
34f70 44 69 73 74 69 6e 63 74 20 66 6c 61 67 2c 20 6e  Distinct flag, n
34f80 6f 74 20 74 68 65 20 63 75 72 72 65 6e 74 20 73  ot the current s
34f90 65 74 74 69 6e 67 20 2a 2f 0a 20 20 20 20 61 73  etting */.    as
34fa0 73 65 72 74 28 20 73 44 69 73 74 69 6e 63 74 2e  sert( sDistinct.
34fb0 69 73 54 6e 63 74 20 29 3b 0a 0a 23 69 66 20 53  isTnct );..#if S
34fc0 45 4c 45 43 54 54 52 41 43 45 5f 45 4e 41 42 4c  ELECTTRACE_ENABL
34fd0 45 44 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  ED.    if( sqlit
34fe0 65 33 53 65 6c 65 63 74 54 72 61 63 65 20 26 20  e3SelectTrace & 
34ff0 30 78 34 30 30 20 29 7b 0a 20 20 20 20 20 20 53  0x400 ){.      S
35000 45 4c 45 43 54 54 52 41 43 45 28 30 78 34 30 30  ELECTTRACE(0x400
35010 2c 70 50 61 72 73 65 2c 70 2c 28 22 54 72 61 6e  ,pParse,p,("Tran
35020 73 66 6f 72 6d 20 44 49 53 54 49 4e 43 54 20 69  sform DISTINCT i
35030 6e 74 6f 20 47 52 4f 55 50 20 42 59 3a 5c 6e 22  nto GROUP BY:\n"
35040 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ));.      sqlite
35050 33 54 72 65 65 56 69 65 77 53 65 6c 65 63 74 28  3TreeViewSelect(
35060 30 2c 20 70 2c 20 30 29 3b 0a 20 20 20 20 7d 0a  0, p, 0);.    }.
35070 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 20 20 2f 2a  #endif.  }..  /*
35080 20 49 66 20 74 68 65 72 65 20 69 73 20 61 6e 20   If there is an 
35090 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 2c  ORDER BY clause,
350a0 20 74 68 65 6e 20 63 72 65 61 74 65 20 61 6e 20   then create an 
350b0 65 70 68 65 6d 65 72 61 6c 20 69 6e 64 65 78 20  ephemeral index 
350c0 74 6f 0a 20 20 2a 2a 20 64 6f 20 74 68 65 20 73  to.  ** do the s
350d0 6f 72 74 69 6e 67 2e 20 20 42 75 74 20 74 68 69  orting.  But thi
350e0 73 20 73 6f 72 74 69 6e 67 20 65 70 68 65 6d 65  s sorting epheme
350f0 72 61 6c 20 69 6e 64 65 78 20 6d 69 67 68 74 20  ral index might 
35100 65 6e 64 20 75 70 0a 20 20 2a 2a 20 62 65 69 6e  end up.  ** bein
35110 67 20 75 6e 75 73 65 64 20 69 66 20 74 68 65 20  g unused if the 
35120 64 61 74 61 20 63 61 6e 20 62 65 20 65 78 74 72  data can be extr
35130 61 63 74 65 64 20 69 6e 20 70 72 65 2d 73 6f 72  acted in pre-sor
35140 74 65 64 20 6f 72 64 65 72 2e 0a 20 20 2a 2a 20  ted order..  ** 
35150 49 66 20 74 68 61 74 20 69 73 20 74 68 65 20 63  If that is the c
35160 61 73 65 2c 20 74 68 65 6e 20 74 68 65 20 4f 50  ase, then the OP
35170 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 69  _OpenEphemeral i
35180 6e 73 74 72 75 63 74 69 6f 6e 20 77 69 6c 6c 20  nstruction will 
35190 62 65 0a 20 20 2a 2a 20 63 68 61 6e 67 65 64 20  be.  ** changed 
351a0 74 6f 20 61 6e 20 4f 50 5f 4e 6f 6f 70 20 6f 6e  to an OP_Noop on
351b0 63 65 20 77 65 20 66 69 67 75 72 65 20 6f 75 74  ce we figure out
351c0 20 74 68 61 74 20 74 68 65 20 73 6f 72 74 69 6e   that the sortin
351d0 67 20 69 6e 64 65 78 20 69 73 0a 20 20 2a 2a 20  g index is.  ** 
351e0 6e 6f 74 20 6e 65 65 64 65 64 2e 20 20 54 68 65  not needed.  The
351f0 20 73 53 6f 72 74 2e 61 64 64 72 53 6f 72 74 49   sSort.addrSortI
35200 6e 64 65 78 20 76 61 72 69 61 62 6c 65 20 69 73  ndex variable is
35210 20 75 73 65 64 20 74 6f 20 66 61 63 69 6c 69 74   used to facilit
35220 61 74 65 0a 20 20 2a 2a 20 74 68 61 74 20 63 68  ate.  ** that ch
35230 61 6e 67 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ange..  */.  if(
35240 20 73 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 20   sSort.pOrderBy 
35250 29 7b 0a 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a  ){.    KeyInfo *
35260 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 20 20 70 4b  pKeyInfo;.    pK
35270 65 79 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33  eyInfo = sqlite3
35280 4b 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c  KeyInfoFromExprL
35290 69 73 74 28 0a 20 20 20 20 20 20 20 20 70 50 61  ist(.        pPa
352a0 72 73 65 2c 20 73 53 6f 72 74 2e 70 4f 72 64 65  rse, sSort.pOrde
352b0 72 42 79 2c 20 30 2c 20 70 45 4c 69 73 74 2d 3e  rBy, 0, pEList->
352c0 6e 45 78 70 72 29 3b 0a 20 20 20 20 73 53 6f 72  nExpr);.    sSor
352d0 74 2e 69 45 43 75 72 73 6f 72 20 3d 20 70 50 61  t.iECursor = pPa
352e0 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20  rse->nTab++;.   
352f0 20 73 53 6f 72 74 2e 61 64 64 72 53 6f 72 74 49   sSort.addrSortI
35300 6e 64 65 78 20 3d 0a 20 20 20 20 20 20 73 71 6c  ndex =.      sql
35310 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
35320 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72  , OP_OpenEphemer
35330 61 6c 2c 0a 20 20 20 20 20 20 20 20 20 20 73 53  al,.          sS
35340 6f 72 74 2e 69 45 43 75 72 73 6f 72 2c 20 73 53  ort.iECursor, sS
35350 6f 72 74 2e 70 4f 72 64 65 72 42 79 2d 3e 6e 45  ort.pOrderBy->nE
35360 78 70 72 2b 31 2b 70 45 4c 69 73 74 2d 3e 6e 45  xpr+1+pEList->nE
35370 78 70 72 2c 20 30 2c 0a 20 20 20 20 20 20 20 20  xpr, 0,.        
35380 20 20 28 63 68 61 72 2a 29 70 4b 65 79 49 6e 66    (char*)pKeyInf
35390 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 0a 20 20  o, P4_KEYINFO.  
353a0 20 20 20 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a      );.  }else{.
353b0 20 20 20 20 73 53 6f 72 74 2e 61 64 64 72 53 6f      sSort.addrSo
353c0 72 74 49 6e 64 65 78 20 3d 20 2d 31 3b 0a 20 20  rtIndex = -1;.  
353d0 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 6f  }..  /* If the o
353e0 75 74 70 75 74 20 69 73 20 64 65 73 74 69 6e 65  utput is destine
353f0 64 20 66 6f 72 20 61 20 74 65 6d 70 6f 72 61 72  d for a temporar
35400 79 20 74 61 62 6c 65 2c 20 6f 70 65 6e 20 74 68  y table, open th
35410 61 74 20 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20  at table..  */. 
35420 20 69 66 28 20 70 44 65 73 74 2d 3e 65 44 65 73   if( pDest->eDes
35430 74 3d 3d 53 52 54 5f 45 70 68 65 6d 54 61 62 20  t==SRT_EphemTab 
35440 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
35450 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f  beAddOp2(v, OP_O
35460 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 70 44  penEphemeral, pD
35470 65 73 74 2d 3e 69 53 44 50 61 72 6d 2c 20 70 45  est->iSDParm, pE
35480 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b 0a 20 20  List->nExpr);.  
35490 7d 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20  }..  /* Set the 
354a0 6c 69 6d 69 74 65 72 2e 0a 20 20 2a 2f 0a 20 20  limiter..  */.  
354b0 69 45 6e 64 20 3d 20 73 71 6c 69 74 65 33 56 64  iEnd = sqlite3Vd
354c0 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
354d0 20 20 69 66 28 20 28 70 2d 3e 73 65 6c 46 6c 61    if( (p->selFla
354e0 67 73 20 26 20 53 46 5f 46 69 78 65 64 4c 69 6d  gs & SF_FixedLim
354f0 69 74 29 3d 3d 30 20 29 7b 0a 20 20 20 20 70 2d  it)==0 ){.    p-
35500 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 33 32  >nSelectRow = 32
35510 30 3b 20 20 2f 2a 20 34 20 62 69 6c 6c 69 6f 6e  0;  /* 4 billion
35520 20 72 6f 77 73 20 2a 2f 0a 20 20 7d 0a 20 20 63   rows */.  }.  c
35530 6f 6d 70 75 74 65 4c 69 6d 69 74 52 65 67 69 73  omputeLimitRegis
35540 74 65 72 73 28 70 50 61 72 73 65 2c 20 70 2c 20  ters(pParse, p, 
35550 69 45 6e 64 29 3b 0a 20 20 69 66 28 20 70 2d 3e  iEnd);.  if( p->
35560 69 4c 69 6d 69 74 3d 3d 30 20 26 26 20 73 53 6f  iLimit==0 && sSo
35570 72 74 2e 61 64 64 72 53 6f 72 74 49 6e 64 65 78  rt.addrSortIndex
35580 3e 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  >=0 ){.    sqlit
35590 65 33 56 64 62 65 43 68 61 6e 67 65 4f 70 63 6f  e3VdbeChangeOpco
355a0 64 65 28 76 2c 20 73 53 6f 72 74 2e 61 64 64 72  de(v, sSort.addr
355b0 53 6f 72 74 49 6e 64 65 78 2c 20 4f 50 5f 53 6f  SortIndex, OP_So
355c0 72 74 65 72 4f 70 65 6e 29 3b 0a 20 20 20 20 73  rterOpen);.    s
355d0 53 6f 72 74 2e 73 6f 72 74 46 6c 61 67 73 20 7c  Sort.sortFlags |
355e0 3d 20 53 4f 52 54 46 4c 41 47 5f 55 73 65 53 6f  = SORTFLAG_UseSo
355f0 72 74 65 72 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  rter;.  }..  /* 
35600 4f 70 65 6e 20 61 6e 20 65 70 68 65 6d 65 72 61  Open an ephemera
35610 6c 20 69 6e 64 65 78 20 74 6f 20 75 73 65 20 66  l index to use f
35620 6f 72 20 74 68 65 20 64 69 73 74 69 6e 63 74 20  or the distinct 
35630 73 65 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  set..  */.  if( 
35640 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46  p->selFlags & SF
35650 5f 44 69 73 74 69 6e 63 74 20 29 7b 0a 20 20 20  _Distinct ){.   
35660 20 73 44 69 73 74 69 6e 63 74 2e 74 61 62 54 6e   sDistinct.tabTn
35670 63 74 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61  ct = pParse->nTa
35680 62 2b 2b 3b 0a 20 20 20 20 73 44 69 73 74 69 6e  b++;.    sDistin
35690 63 74 2e 61 64 64 72 54 6e 63 74 20 3d 20 73 71  ct.addrTnct = sq
356a0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
356b0 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65  v, OP_OpenEpheme
356c0 72 61 6c 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ral,.           
356d0 20 20 20 20 20 20 20 20 20 20 20 20 73 44 69 73              sDis
356e0 74 69 6e 63 74 2e 74 61 62 54 6e 63 74 2c 20 30  tinct.tabTnct, 0
356f0 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20  , 0,.           
35700 20 20 20 20 20 20 20 20 20 20 20 20 28 63 68 61              (cha
35710 72 2a 29 73 71 6c 69 74 65 33 4b 65 79 49 6e 66  r*)sqlite3KeyInf
35720 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 70 50  oFromExprList(pP
35730 61 72 73 65 2c 20 70 2d 3e 70 45 4c 69 73 74 2c  arse, p->pEList,
35740 30 2c 30 29 2c 0a 20 20 20 20 20 20 20 20 20 20  0,0),.          
35750 20 20 20 20 20 20 20 20 20 20 20 20 20 50 34 5f               P4_
35760 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 20 20 73 71  KEYINFO);.    sq
35770 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
35780 35 28 76 2c 20 42 54 52 45 45 5f 55 4e 4f 52 44  5(v, BTREE_UNORD
35790 45 52 45 44 29 3b 0a 20 20 20 20 73 44 69 73 74  ERED);.    sDist
357a0 69 6e 63 74 2e 65 54 6e 63 74 54 79 70 65 20 3d  inct.eTnctType =
357b0 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f   WHERE_DISTINCT_
357c0 55 4e 4f 52 44 45 52 45 44 3b 0a 20 20 7d 65 6c  UNORDERED;.  }el
357d0 73 65 7b 0a 20 20 20 20 73 44 69 73 74 69 6e 63  se{.    sDistinc
357e0 74 2e 65 54 6e 63 74 54 79 70 65 20 3d 20 57 48  t.eTnctType = WH
357f0 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 4e 4f 4f  ERE_DISTINCT_NOO
35800 50 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 21 69  P;.  }..  if( !i
35810 73 41 67 67 20 26 26 20 70 47 72 6f 75 70 42 79  sAgg && pGroupBy
35820 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 6f  ==0 ){.    /* No
35830 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74   aggregate funct
35840 69 6f 6e 73 20 61 6e 64 20 6e 6f 20 47 52 4f 55  ions and no GROU
35850 50 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20  P BY clause */. 
35860 20 20 20 75 31 36 20 77 63 74 72 6c 46 6c 61 67     u16 wctrlFlag
35870 73 20 3d 20 28 73 44 69 73 74 69 6e 63 74 2e 69  s = (sDistinct.i
35880 73 54 6e 63 74 20 3f 20 57 48 45 52 45 5f 57 41  sTnct ? WHERE_WA
35890 4e 54 5f 44 49 53 54 49 4e 43 54 20 3a 20 30 29  NT_DISTINCT : 0)
358a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
358b0 20 20 20 20 7c 20 28 70 2d 3e 73 65 6c 46 6c 61      | (p->selFla
358c0 67 73 20 26 20 53 46 5f 46 69 78 65 64 4c 69 6d  gs & SF_FixedLim
358d0 69 74 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  it);.#ifndef SQL
358e0 49 54 45 5f 4f 4d 49 54 5f 57 49 4e 44 4f 57 46  ITE_OMIT_WINDOWF
358f0 55 4e 43 0a 20 20 20 20 57 69 6e 64 6f 77 20 2a  UNC.    Window *
35900 70 57 69 6e 20 3d 20 70 2d 3e 70 57 69 6e 3b 20  pWin = p->pWin; 
35910 20 20 20 20 20 2f 2a 20 4d 61 73 74 65 72 20 77       /* Master w
35920 69 6e 64 6f 77 20 6f 62 6a 65 63 74 20 28 6f 72  indow object (or
35930 20 4e 55 4c 4c 29 20 2a 2f 0a 20 20 20 20 69 66   NULL) */.    if
35940 28 20 70 57 69 6e 20 29 7b 0a 20 20 20 20 20 20  ( pWin ){.      
35950 73 71 6c 69 74 65 33 57 69 6e 64 6f 77 43 6f 64  sqlite3WindowCod
35960 65 49 6e 69 74 28 70 50 61 72 73 65 2c 20 70 57  eInit(pParse, pW
35970 69 6e 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  in);.    }.#endi
35980 66 0a 20 20 20 20 61 73 73 65 72 74 28 20 57 48  f.    assert( WH
35990 45 52 45 5f 55 53 45 5f 4c 49 4d 49 54 3d 3d 53  ERE_USE_LIMIT==S
359a0 46 5f 46 69 78 65 64 4c 69 6d 69 74 20 29 3b 0a  F_FixedLimit );.
359b0 0a 0a 20 20 20 20 2f 2a 20 42 65 67 69 6e 20 74  ..    /* Begin t
359c0 68 65 20 64 61 74 61 62 61 73 65 20 73 63 61 6e  he database scan
359d0 2e 20 2a 2f 0a 20 20 20 20 53 45 4c 45 43 54 54  . */.    SELECTT
359e0 52 41 43 45 28 31 2c 70 50 61 72 73 65 2c 70 2c  RACE(1,pParse,p,
359f0 28 22 57 68 65 72 65 42 65 67 69 6e 5c 6e 22 29  ("WhereBegin\n")
35a00 29 3b 0a 20 20 20 20 70 57 49 6e 66 6f 20 3d 20  );.    pWInfo = 
35a10 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69  sqlite3WhereBegi
35a20 6e 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69  n(pParse, pTabLi
35a30 73 74 2c 20 70 57 68 65 72 65 2c 20 73 53 6f 72  st, pWhere, sSor
35a40 74 2e 70 4f 72 64 65 72 42 79 2c 0a 20 20 20 20  t.pOrderBy,.    
35a50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35a60 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70 45             p->pE
35a70 4c 69 73 74 2c 20 77 63 74 72 6c 46 6c 61 67 73  List, wctrlFlags
35a80 2c 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 29  , p->nSelectRow)
35a90 3b 0a 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f  ;.    if( pWInfo
35aa0 3d 3d 30 20 29 20 67 6f 74 6f 20 73 65 6c 65 63  ==0 ) goto selec
35ab0 74 5f 65 6e 64 3b 0a 20 20 20 20 69 66 28 20 73  t_end;.    if( s
35ac0 71 6c 69 74 65 33 57 68 65 72 65 4f 75 74 70 75  qlite3WhereOutpu
35ad0 74 52 6f 77 43 6f 75 6e 74 28 70 57 49 6e 66 6f  tRowCount(pWInfo
35ae0 29 20 3c 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f  ) < p->nSelectRo
35af0 77 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6e 53  w ){.      p->nS
35b00 65 6c 65 63 74 52 6f 77 20 3d 20 73 71 6c 69 74  electRow = sqlit
35b10 65 33 57 68 65 72 65 4f 75 74 70 75 74 52 6f 77  e3WhereOutputRow
35b20 43 6f 75 6e 74 28 70 57 49 6e 66 6f 29 3b 0a 20  Count(pWInfo);. 
35b30 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73 44 69     }.    if( sDi
35b40 73 74 69 6e 63 74 2e 69 73 54 6e 63 74 20 26 26  stinct.isTnct &&
35b50 20 73 71 6c 69 74 65 33 57 68 65 72 65 49 73 44   sqlite3WhereIsD
35b60 69 73 74 69 6e 63 74 28 70 57 49 6e 66 6f 29 20  istinct(pWInfo) 
35b70 29 7b 0a 20 20 20 20 20 20 73 44 69 73 74 69 6e  ){.      sDistin
35b80 63 74 2e 65 54 6e 63 74 54 79 70 65 20 3d 20 73  ct.eTnctType = s
35b90 71 6c 69 74 65 33 57 68 65 72 65 49 73 44 69 73  qlite3WhereIsDis
35ba0 74 69 6e 63 74 28 70 57 49 6e 66 6f 29 3b 0a 20  tinct(pWInfo);. 
35bb0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73 53 6f     }.    if( sSo
35bc0 72 74 2e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20  rt.pOrderBy ){. 
35bd0 20 20 20 20 20 73 53 6f 72 74 2e 6e 4f 42 53 61       sSort.nOBSa
35be0 74 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65  t = sqlite3Where
35bf0 49 73 4f 72 64 65 72 65 64 28 70 57 49 6e 66 6f  IsOrdered(pWInfo
35c00 29 3b 0a 20 20 20 20 20 20 73 53 6f 72 74 2e 6c  );.      sSort.l
35c10 61 62 65 6c 4f 42 4c 6f 70 74 20 3d 20 73 71 6c  abelOBLopt = sql
35c20 69 74 65 33 57 68 65 72 65 4f 72 64 65 72 42 79  ite3WhereOrderBy
35c30 4c 69 6d 69 74 4f 70 74 4c 61 62 65 6c 28 70 57  LimitOptLabel(pW
35c40 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 69 66 28  Info);.      if(
35c50 20 73 53 6f 72 74 2e 6e 4f 42 53 61 74 3d 3d 73   sSort.nOBSat==s
35c60 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 2d 3e 6e  Sort.pOrderBy->n
35c70 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20 20 20  Expr ){.        
35c80 73 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 20 3d  sSort.pOrderBy =
35c90 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
35ca0 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 73 6f 72  }..    /* If sor
35cb0 74 69 6e 67 20 69 6e 64 65 78 20 74 68 61 74 20  ting index that 
35cc0 77 61 73 20 63 72 65 61 74 65 64 20 62 79 20 61  was created by a
35cd0 20 70 72 69 6f 72 20 4f 50 5f 4f 70 65 6e 45 70   prior OP_OpenEp
35ce0 68 65 6d 65 72 61 6c 20 0a 20 20 20 20 2a 2a 20  hemeral .    ** 
35cf0 69 6e 73 74 72 75 63 74 69 6f 6e 20 65 6e 64 65  instruction ende
35d00 64 20 75 70 20 6e 6f 74 20 62 65 69 6e 67 20 6e  d up not being n
35d10 65 65 64 65 64 2c 20 74 68 65 6e 20 63 68 61 6e  eeded, then chan
35d20 67 65 20 74 68 65 20 4f 50 5f 4f 70 65 6e 45 70  ge the OP_OpenEp
35d30 68 65 6d 65 72 61 6c 0a 20 20 20 20 2a 2a 20 69  hemeral.    ** i
35d40 6e 74 6f 20 61 6e 20 4f 50 5f 4e 6f 6f 70 2e 0a  nto an OP_Noop..
35d50 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 73      */.    if( s
35d60 53 6f 72 74 2e 61 64 64 72 53 6f 72 74 49 6e 64  Sort.addrSortInd
35d70 65 78 3e 3d 30 20 26 26 20 73 53 6f 72 74 2e 70  ex>=0 && sSort.p
35d80 4f 72 64 65 72 42 79 3d 3d 30 20 29 7b 0a 20 20  OrderBy==0 ){.  
35d90 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
35da0 68 61 6e 67 65 54 6f 4e 6f 6f 70 28 76 2c 20 73  hangeToNoop(v, s
35db0 53 6f 72 74 2e 61 64 64 72 53 6f 72 74 49 6e 64  Sort.addrSortInd
35dc0 65 78 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ex);.    }..    
35dd0 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73  assert( p->pELis
35de0 74 3d 3d 70 45 4c 69 73 74 20 29 3b 0a 23 69 66  t==pEList );.#if
35df0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
35e00 5f 57 49 4e 44 4f 57 46 55 4e 43 0a 20 20 20 20  _WINDOWFUNC.    
35e10 69 66 28 20 70 57 69 6e 20 29 7b 0a 20 20 20 20  if( pWin ){.    
35e20 20 20 69 6e 74 20 61 64 64 72 47 6f 73 75 62 20    int addrGosub 
35e30 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
35e40 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20  eLabel(v);.     
35e50 20 69 6e 74 20 69 43 6f 6e 74 20 3d 20 73 71 6c   int iCont = sql
35e60 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
35e70 6c 28 76 29 3b 0a 20 20 20 20 20 20 69 6e 74 20  l(v);.      int 
35e80 69 42 72 65 61 6b 20 3d 20 73 71 6c 69 74 65 33  iBreak = sqlite3
35e90 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
35ea0 3b 0a 20 20 20 20 20 20 69 6e 74 20 72 65 67 47  ;.      int regG
35eb0 6f 73 75 62 20 3d 20 2b 2b 70 50 61 72 73 65 2d  osub = ++pParse-
35ec0 3e 6e 4d 65 6d 3b 0a 0a 20 20 20 20 20 20 73 71  >nMem;..      sq
35ed0 6c 69 74 65 33 57 69 6e 64 6f 77 43 6f 64 65 53  lite3WindowCodeS
35ee0 74 65 70 28 70 50 61 72 73 65 2c 20 70 2c 20 70  tep(pParse, p, p
35ef0 57 49 6e 66 6f 2c 20 72 65 67 47 6f 73 75 62 2c  WInfo, regGosub,
35f00 20 61 64 64 72 47 6f 73 75 62 29 3b 0a 0a 20 20   addrGosub);..  
35f10 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
35f20 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f  ddOp2(v, OP_Goto
35f30 2c 20 30 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20  , 0, iBreak);.  
35f40 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52      sqlite3VdbeR
35f50 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61  esolveLabel(v, a
35f60 64 64 72 47 6f 73 75 62 29 3b 0a 20 20 20 20 20  ddrGosub);.     
35f70 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74   VdbeNoopComment
35f80 28 28 76 2c 20 22 69 6e 6e 65 72 2d 6c 6f 6f 70  ((v, "inner-loop
35f90 20 73 75 62 72 6f 75 74 69 6e 65 22 29 29 3b 0a   subroutine"));.
35fa0 20 20 20 20 20 20 73 53 6f 72 74 2e 6c 61 62 65        sSort.labe
35fb0 6c 4f 42 4c 6f 70 74 20 3d 20 30 3b 0a 20 20 20  lOBLopt = 0;.   
35fc0 20 20 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f     selectInnerLo
35fd0 6f 70 28 70 50 61 72 73 65 2c 20 70 2c 20 2d 31  op(pParse, p, -1
35fe0 2c 20 26 73 53 6f 72 74 2c 20 26 73 44 69 73 74  , &sSort, &sDist
35ff0 69 6e 63 74 2c 20 70 44 65 73 74 2c 20 69 43 6f  inct, pDest, iCo
36000 6e 74 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20  nt, iBreak);.   
36010 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
36020 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69 43  solveLabel(v, iC
36030 6f 6e 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ont);.      sqli
36040 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
36050 20 4f 50 5f 52 65 74 75 72 6e 2c 20 72 65 67 47   OP_Return, regG
36060 6f 73 75 62 29 3b 0a 20 20 20 20 20 20 56 64 62  osub);.      Vdb
36070 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 65 6e  eComment((v, "en
36080 64 20 69 6e 6e 65 72 2d 6c 6f 6f 70 20 73 75 62  d inner-loop sub
36090 72 6f 75 74 69 6e 65 22 29 29 3b 0a 20 20 20 20  routine"));.    
360a0 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
360b0 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69 42 72  olveLabel(v, iBr
360c0 65 61 6b 29 3b 0a 20 20 20 20 7d 65 6c 73 65 0a  eak);.    }else.
360d0 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
360e0 5f 4f 4d 49 54 5f 57 49 4e 44 4f 57 46 55 4e 43  _OMIT_WINDOWFUNC
360f0 20 2a 2f 0a 20 20 20 20 7b 0a 20 20 20 20 20 20   */.    {.      
36100 2f 2a 20 55 73 65 20 74 68 65 20 73 74 61 6e 64  /* Use the stand
36110 61 72 64 20 69 6e 6e 65 72 20 6c 6f 6f 70 2e 20  ard inner loop. 
36120 2a 2f 0a 20 20 20 20 20 20 73 65 6c 65 63 74 49  */.      selectI
36130 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c  nnerLoop(pParse,
36140 20 70 2c 20 2d 31 2c 20 26 73 53 6f 72 74 2c 20   p, -1, &sSort, 
36150 26 73 44 69 73 74 69 6e 63 74 2c 20 70 44 65 73  &sDistinct, pDes
36160 74 2c 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  t,.          sql
36170 69 74 65 33 57 68 65 72 65 43 6f 6e 74 69 6e 75  ite3WhereContinu
36180 65 4c 61 62 65 6c 28 70 57 49 6e 66 6f 29 2c 0a  eLabel(pWInfo),.
36190 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
361a0 33 57 68 65 72 65 42 72 65 61 6b 4c 61 62 65 6c  3WhereBreakLabel
361b0 28 70 57 49 6e 66 6f 29 29 3b 0a 0a 20 20 20 20  (pWInfo));..    
361c0 20 20 2f 2a 20 45 6e 64 20 74 68 65 20 64 61 74    /* End the dat
361d0 61 62 61 73 65 20 73 63 61 6e 20 6c 6f 6f 70 2e  abase scan loop.
361e0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
361f0 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28  sqlite3WhereEnd(
36200 70 57 49 6e 66 6f 29 3b 0a 20 20 20 20 7d 0a 20  pWInfo);.    }. 
36210 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54   }else{.    /* T
36220 68 69 73 20 63 61 73 65 20 77 68 65 6e 20 74 68  his case when th
36230 65 72 65 20 65 78 69 73 74 20 61 67 67 72 65 67  ere exist aggreg
36240 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 20 6f 72  ate functions or
36250 20 61 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75   a GROUP BY clau
36260 73 65 0a 20 20 20 20 2a 2a 20 6f 72 20 62 6f 74  se.    ** or bot
36270 68 20 2a 2f 0a 20 20 20 20 4e 61 6d 65 43 6f 6e  h */.    NameCon
36280 74 65 78 74 20 73 4e 43 3b 20 20 20 20 2f 2a 20  text sNC;    /* 
36290 4e 61 6d 65 20 63 6f 6e 74 65 78 74 20 66 6f 72  Name context for
362a0 20 70 72 6f 63 65 73 73 69 6e 67 20 61 67 67 72   processing aggr
362b0 65 67 61 74 65 20 69 6e 66 6f 72 6d 61 74 69 6f  egate informatio
362c0 6e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 41 4d  n */.    int iAM
362d0 65 6d 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  em;          /* 
362e0 46 69 72 73 74 20 4d 65 6d 20 61 64 64 72 65 73  First Mem addres
362f0 73 20 66 6f 72 20 73 74 6f 72 69 6e 67 20 63 75  s for storing cu
36300 72 72 65 6e 74 20 47 52 4f 55 50 20 42 59 20 2a  rrent GROUP BY *
36310 2f 0a 20 20 20 20 69 6e 74 20 69 42 4d 65 6d 3b  /.    int iBMem;
36320 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72            /* Fir
36330 73 74 20 4d 65 6d 20 61 64 64 72 65 73 73 20 66  st Mem address f
36340 6f 72 20 70 72 65 76 69 6f 75 73 20 47 52 4f 55  or previous GROU
36350 50 20 42 59 20 2a 2f 0a 20 20 20 20 69 6e 74 20  P BY */.    int 
36360 69 55 73 65 46 6c 61 67 3b 20 20 20 20 20 20 20  iUseFlag;       
36370 2f 2a 20 4d 65 6d 20 61 64 64 72 65 73 73 20 68  /* Mem address h
36380 6f 6c 64 69 6e 67 20 66 6c 61 67 20 69 6e 64 69  olding flag indi
36390 63 61 74 69 6e 67 20 74 68 61 74 20 61 74 20 6c  cating that at l
363a0 65 61 73 74 0a 20 20 20 20 20 20 20 20 20 20 20  east.           
363b0 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20               ** 
363c0 6f 6e 65 20 72 6f 77 20 6f 66 20 74 68 65 20 69  one row of the i
363d0 6e 70 75 74 20 74 6f 20 74 68 65 20 61 67 67 72  nput to the aggr
363e0 65 67 61 74 6f 72 20 68 61 73 20 62 65 65 6e 0a  egator has been.
363f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36400 20 20 20 20 20 20 20 20 2a 2a 20 70 72 6f 63 65          ** proce
36410 73 73 65 64 20 2a 2f 0a 20 20 20 20 69 6e 74 20  ssed */.    int 
36420 69 41 62 6f 72 74 46 6c 61 67 3b 20 20 20 20 20  iAbortFlag;     
36430 2f 2a 20 4d 65 6d 20 61 64 64 72 65 73 73 20 77  /* Mem address w
36440 68 69 63 68 20 63 61 75 73 65 73 20 71 75 65 72  hich causes quer
36450 79 20 61 62 6f 72 74 20 69 66 20 70 6f 73 69 74  y abort if posit
36460 69 76 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 67  ive */.    int g
36470 72 6f 75 70 42 79 53 6f 72 74 3b 20 20 20 20 2f  roupBySort;    /
36480 2a 20 52 6f 77 73 20 63 6f 6d 65 20 66 72 6f 6d  * Rows come from
36490 20 73 6f 75 72 63 65 20 69 6e 20 47 52 4f 55 50   source in GROUP
364a0 20 42 59 20 6f 72 64 65 72 20 2a 2f 0a 20 20 20   BY order */.   
364b0 20 69 6e 74 20 61 64 64 72 45 6e 64 3b 20 20 20   int addrEnd;   
364c0 20 20 20 20 20 2f 2a 20 45 6e 64 20 6f 66 20 70       /* End of p
364d0 72 6f 63 65 73 73 69 6e 67 20 66 6f 72 20 74 68  rocessing for th
364e0 69 73 20 53 45 4c 45 43 54 20 2a 2f 0a 20 20 20  is SELECT */.   
364f0 20 69 6e 74 20 73 6f 72 74 50 54 61 62 20 3d 20   int sortPTab = 
36500 30 3b 20 20 20 2f 2a 20 50 73 65 75 64 6f 74 61  0;   /* Pseudota
36510 62 6c 65 20 75 73 65 64 20 74 6f 20 64 65 63 6f  ble used to deco
36520 64 65 20 73 6f 72 74 69 6e 67 20 72 65 73 75 6c  de sorting resul
36530 74 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20 73 6f  ts */.    int so
36540 72 74 4f 75 74 20 3d 20 30 3b 20 20 20 20 2f 2a  rtOut = 0;    /*
36550 20 4f 75 74 70 75 74 20 72 65 67 69 73 74 65 72   Output register
36560 20 66 72 6f 6d 20 74 68 65 20 73 6f 72 74 65 72   from the sorter
36570 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6f 72 64 65   */.    int orde
36580 72 42 79 47 72 70 20 3d 20 30 3b 20 2f 2a 20 54  rByGrp = 0; /* T
36590 72 75 65 20 69 66 20 74 68 65 20 47 52 4f 55 50  rue if the GROUP
365a0 20 42 59 20 61 6e 64 20 4f 52 44 45 52 20 42 59   BY and ORDER BY
365b0 20 61 72 65 20 74 68 65 20 73 61 6d 65 20 2a 2f   are the same */
365c0 0a 0a 20 20 20 20 2f 2a 20 52 65 6d 6f 76 65 20  ..    /* Remove 
365d0 61 6e 79 20 61 6e 64 20 61 6c 6c 20 61 6c 69 61  any and all alia
365e0 73 65 73 20 62 65 74 77 65 65 6e 20 74 68 65 20  ses between the 
365f0 72 65 73 75 6c 74 20 73 65 74 20 61 6e 64 20 74  result set and t
36600 68 65 0a 20 20 20 20 2a 2a 20 47 52 4f 55 50 20  he.    ** GROUP 
36610 42 59 20 63 6c 61 75 73 65 2e 0a 20 20 20 20 2a  BY clause..    *
36620 2f 0a 20 20 20 20 69 66 28 20 70 47 72 6f 75 70  /.    if( pGroup
36630 42 79 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  By ){.      int 
36640 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k;              
36650 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
36660 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20  p counter */.   
36670 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69     struct ExprLi
36680 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 20  st_item *pItem; 
36690 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20   /* For looping 
366a0 6f 76 65 72 20 65 78 70 72 65 73 73 69 6f 6e 20  over expression 
366b0 69 6e 20 61 20 6c 69 73 74 20 2a 2f 0a 0a 20 20  in a list */..  
366c0 20 20 20 20 66 6f 72 28 6b 3d 70 2d 3e 70 45 4c      for(k=p->pEL
366d0 69 73 74 2d 3e 6e 45 78 70 72 2c 20 70 49 74 65  ist->nExpr, pIte
366e0 6d 3d 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 3b 20  m=p->pEList->a; 
366f0 6b 3e 30 3b 20 6b 2d 2d 2c 20 70 49 74 65 6d 2b  k>0; k--, pItem+
36700 2b 29 7b 0a 20 20 20 20 20 20 20 20 70 49 74 65  +){.        pIte
36710 6d 2d 3e 75 2e 78 2e 69 41 6c 69 61 73 20 3d 20  m->u.x.iAlias = 
36720 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  0;.      }.     
36730 20 66 6f 72 28 6b 3d 70 47 72 6f 75 70 42 79 2d   for(k=pGroupBy-
36740 3e 6e 45 78 70 72 2c 20 70 49 74 65 6d 3d 70 47  >nExpr, pItem=pG
36750 72 6f 75 70 42 79 2d 3e 61 3b 20 6b 3e 30 3b 20  roupBy->a; k>0; 
36760 6b 2d 2d 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20  k--, pItem++){. 
36770 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 75 2e         pItem->u.
36780 78 2e 69 41 6c 69 61 73 20 3d 20 30 3b 0a 20 20  x.iAlias = 0;.  
36790 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65      }.      asse
367a0 72 74 28 20 36 36 3d 3d 73 71 6c 69 74 65 33 4c  rt( 66==sqlite3L
367b0 6f 67 45 73 74 28 31 30 30 29 20 29 3b 0a 20 20  ogEst(100) );.  
367c0 20 20 20 20 69 66 28 20 70 2d 3e 6e 53 65 6c 65      if( p->nSele
367d0 63 74 52 6f 77 3e 36 36 20 29 20 70 2d 3e 6e 53  ctRow>66 ) p->nS
367e0 65 6c 65 63 74 52 6f 77 20 3d 20 36 36 3b 0a 20  electRow = 66;. 
367f0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
36800 61 73 73 65 72 74 28 20 30 3d 3d 73 71 6c 69 74  assert( 0==sqlit
36810 65 33 4c 6f 67 45 73 74 28 31 29 20 29 3b 0a 20  e3LogEst(1) );. 
36820 20 20 20 20 20 70 2d 3e 6e 53 65 6c 65 63 74 52       p->nSelectR
36830 6f 77 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a 20  ow = 0;.    }.. 
36840 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69     /* If there i
36850 73 20 62 6f 74 68 20 61 20 47 52 4f 55 50 20 42  s both a GROUP B
36860 59 20 61 6e 64 20 61 6e 20 4f 52 44 45 52 20 42  Y and an ORDER B
36870 59 20 63 6c 61 75 73 65 20 61 6e 64 20 74 68 65  Y clause and the
36880 79 20 61 72 65 0a 20 20 20 20 2a 2a 20 69 64 65  y are.    ** ide
36890 6e 74 69 63 61 6c 2c 20 74 68 65 6e 20 69 74 20  ntical, then it 
368a0 6d 61 79 20 62 65 20 70 6f 73 73 69 62 6c 65 20  may be possible 
368b0 74 6f 20 64 69 73 61 62 6c 65 20 74 68 65 20 4f  to disable the O
368c0 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 0a  RDER BY clause .
368d0 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20 67 72      ** on the gr
368e0 6f 75 6e 64 73 20 74 68 61 74 20 74 68 65 20 47  ounds that the G
368f0 52 4f 55 50 20 42 59 20 77 69 6c 6c 20 63 61 75  ROUP BY will cau
36900 73 65 20 65 6c 65 6d 65 6e 74 73 20 74 6f 20 63  se elements to c
36910 6f 6d 65 20 6f 75 74 20 0a 20 20 20 20 2a 2a 20  ome out .    ** 
36920 69 6e 20 74 68 65 20 63 6f 72 72 65 63 74 20 6f  in the correct o
36930 72 64 65 72 2e 20 49 74 20 61 6c 73 6f 20 6d 61  rder. It also ma
36940 79 20 6e 6f 74 20 2d 20 74 68 65 20 47 52 4f 55  y not - the GROU
36950 50 20 42 59 20 6d 69 67 68 74 20 75 73 65 20 61  P BY might use a
36960 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65  .    ** database
36970 20 69 6e 64 65 78 20 74 68 61 74 20 63 61 75 73   index that caus
36980 65 73 20 72 6f 77 73 20 74 6f 20 62 65 20 67 72  es rows to be gr
36990 6f 75 70 65 64 20 74 6f 67 65 74 68 65 72 20 61  ouped together a
369a0 73 20 72 65 71 75 69 72 65 64 0a 20 20 20 20 2a  s required.    *
369b0 2a 20 62 75 74 20 6e 6f 74 20 61 63 74 75 61 6c  * but not actual
369c0 6c 79 20 73 6f 72 74 65 64 2e 20 45 69 74 68 65  ly sorted. Eithe
369d0 72 20 77 61 79 2c 20 72 65 63 6f 72 64 20 74 68  r way, record th
369e0 65 20 66 61 63 74 20 74 68 61 74 20 74 68 65 0a  e fact that the.
369f0 20 20 20 20 2a 2a 20 4f 52 44 45 52 20 42 59 20      ** ORDER BY 
36a00 61 6e 64 20 47 52 4f 55 50 20 42 59 20 63 6c 61  and GROUP BY cla
36a10 75 73 65 73 20 61 72 65 20 74 68 65 20 73 61 6d  uses are the sam
36a20 65 20 62 79 20 73 65 74 74 69 6e 67 20 74 68 65  e by setting the
36a30 20 6f 72 64 65 72 42 79 47 72 70 0a 20 20 20 20   orderByGrp.    
36a40 2a 2a 20 76 61 72 69 61 62 6c 65 2e 20 20 2a 2f  ** variable.  */
36a50 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
36a60 45 78 70 72 4c 69 73 74 43 6f 6d 70 61 72 65 28  ExprListCompare(
36a70 70 47 72 6f 75 70 42 79 2c 20 73 53 6f 72 74 2e  pGroupBy, sSort.
36a80 70 4f 72 64 65 72 42 79 2c 20 2d 31 29 3d 3d 30  pOrderBy, -1)==0
36a90 20 29 7b 0a 20 20 20 20 20 20 6f 72 64 65 72 42   ){.      orderB
36aa0 79 47 72 70 20 3d 20 31 3b 0a 20 20 20 20 7d 0a  yGrp = 1;.    }.
36ab0 20 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20   .    /* Create 
36ac0 61 20 6c 61 62 65 6c 20 74 6f 20 6a 75 6d 70 20  a label to jump 
36ad0 74 6f 20 77 68 65 6e 20 77 65 20 77 61 6e 74 20  to when we want 
36ae0 74 6f 20 61 62 6f 72 74 20 74 68 65 20 71 75 65  to abort the que
36af0 72 79 20 2a 2f 0a 20 20 20 20 61 64 64 72 45 6e  ry */.    addrEn
36b00 64 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  d = sqlite3VdbeM
36b10 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 0a 20 20  akeLabel(v);..  
36b20 20 20 2f 2a 20 43 6f 6e 76 65 72 74 20 54 4b 5f    /* Convert TK_
36b30 43 4f 4c 55 4d 4e 20 6e 6f 64 65 73 20 69 6e 74  COLUMN nodes int
36b40 6f 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20  o TK_AGG_COLUMN 
36b50 61 6e 64 20 6d 61 6b 65 20 65 6e 74 72 69 65 73  and make entries
36b60 20 69 6e 0a 20 20 20 20 2a 2a 20 73 41 67 67 49   in.    ** sAggI
36b70 6e 66 6f 20 66 6f 72 20 61 6c 6c 20 54 4b 5f 41  nfo for all TK_A
36b80 47 47 5f 46 55 4e 43 54 49 4f 4e 20 6e 6f 64 65  GG_FUNCTION node
36b90 73 20 69 6e 20 65 78 70 72 65 73 73 69 6f 6e 73  s in expressions
36ba0 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 53   of the.    ** S
36bb0 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e  ELECT statement.
36bc0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 6d 65 6d 73  .    */.    mems
36bd0 65 74 28 26 73 4e 43 2c 20 30 2c 20 73 69 7a 65  et(&sNC, 0, size
36be0 6f 66 28 73 4e 43 29 29 3b 0a 20 20 20 20 73 4e  of(sNC));.    sN
36bf0 43 2e 70 50 61 72 73 65 20 3d 20 70 50 61 72 73  C.pParse = pPars
36c00 65 3b 0a 20 20 20 20 73 4e 43 2e 70 53 72 63 4c  e;.    sNC.pSrcL
36c10 69 73 74 20 3d 20 70 54 61 62 4c 69 73 74 3b 0a  ist = pTabList;.
36c20 20 20 20 20 73 4e 43 2e 75 4e 43 2e 70 41 67 67      sNC.uNC.pAgg
36c30 49 6e 66 6f 20 3d 20 26 73 41 67 67 49 6e 66 6f  Info = &sAggInfo
36c40 3b 0a 20 20 20 20 56 56 41 5f 4f 4e 4c 59 28 20  ;.    VVA_ONLY( 
36c50 73 4e 43 2e 6e 63 46 6c 61 67 73 20 3d 20 4e 43  sNC.ncFlags = NC
36c60 5f 55 41 67 67 49 6e 66 6f 3b 20 29 0a 20 20 20  _UAggInfo; ).   
36c70 20 73 41 67 67 49 6e 66 6f 2e 6d 6e 52 65 67 20   sAggInfo.mnReg 
36c80 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31  = pParse->nMem+1
36c90 3b 0a 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 6e  ;.    sAggInfo.n
36ca0 53 6f 72 74 69 6e 67 43 6f 6c 75 6d 6e 20 3d 20  SortingColumn = 
36cb0 70 47 72 6f 75 70 42 79 20 3f 20 70 47 72 6f 75  pGroupBy ? pGrou
36cc0 70 42 79 2d 3e 6e 45 78 70 72 20 3a 20 30 3b 0a  pBy->nExpr : 0;.
36cd0 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 70 47 72      sAggInfo.pGr
36ce0 6f 75 70 42 79 20 3d 20 70 47 72 6f 75 70 42 79  oupBy = pGroupBy
36cf0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  ;.    sqlite3Exp
36d00 72 41 6e 61 6c 79 7a 65 41 67 67 4c 69 73 74 28  rAnalyzeAggList(
36d10 26 73 4e 43 2c 20 70 45 4c 69 73 74 29 3b 0a 20  &sNC, pEList);. 
36d20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e     sqlite3ExprAn
36d30 61 6c 79 7a 65 41 67 67 4c 69 73 74 28 26 73 4e  alyzeAggList(&sN
36d40 43 2c 20 73 53 6f 72 74 2e 70 4f 72 64 65 72 42  C, sSort.pOrderB
36d50 79 29 3b 0a 20 20 20 20 69 66 28 20 70 48 61 76  y);.    if( pHav
36d60 69 6e 67 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ing ){.      if(
36d70 20 70 47 72 6f 75 70 42 79 20 29 7b 0a 20 20 20   pGroupBy ){.   
36d80 20 20 20 20 20 61 73 73 65 72 74 28 20 70 57 68       assert( pWh
36d90 65 72 65 3d 3d 70 2d 3e 70 57 68 65 72 65 20 29  ere==p->pWhere )
36da0 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
36db0 28 20 70 48 61 76 69 6e 67 3d 3d 70 2d 3e 70 48  ( pHaving==p->pH
36dc0 61 76 69 6e 67 20 29 3b 0a 20 20 20 20 20 20 20  aving );.       
36dd0 20 61 73 73 65 72 74 28 20 70 47 72 6f 75 70 42   assert( pGroupB
36de0 79 3d 3d 70 2d 3e 70 47 72 6f 75 70 42 79 20 29  y==p->pGroupBy )
36df0 3b 0a 20 20 20 20 20 20 20 20 68 61 76 69 6e 67  ;.        having
36e00 54 6f 57 68 65 72 65 28 70 50 61 72 73 65 2c 20  ToWhere(pParse, 
36e10 70 29 3b 0a 20 20 20 20 20 20 20 20 70 57 68 65  p);.        pWhe
36e20 72 65 20 3d 20 70 2d 3e 70 57 68 65 72 65 3b 0a  re = p->pWhere;.
36e30 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
36e40 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65  lite3ExprAnalyze
36e50 41 67 67 72 65 67 61 74 65 73 28 26 73 4e 43 2c  Aggregates(&sNC,
36e60 20 70 48 61 76 69 6e 67 29 3b 0a 20 20 20 20 7d   pHaving);.    }
36e70 0a 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 6e 41  .    sAggInfo.nA
36e80 63 63 75 6d 75 6c 61 74 6f 72 20 3d 20 73 41 67  ccumulator = sAg
36e90 67 49 6e 66 6f 2e 6e 43 6f 6c 75 6d 6e 3b 0a 20  gInfo.nColumn;. 
36ea0 20 20 20 69 66 28 20 70 2d 3e 70 47 72 6f 75 70     if( p->pGroup
36eb0 42 79 3d 3d 30 20 26 26 20 70 2d 3e 70 48 61 76  By==0 && p->pHav
36ec0 69 6e 67 3d 3d 30 20 26 26 20 73 41 67 67 49 6e  ing==0 && sAggIn
36ed0 66 6f 2e 6e 46 75 6e 63 3d 3d 31 20 29 7b 0a 20  fo.nFunc==1 ){. 
36ee0 20 20 20 20 20 6d 69 6e 4d 61 78 46 6c 61 67 20       minMaxFlag 
36ef0 3d 20 6d 69 6e 4d 61 78 51 75 65 72 79 28 64 62  = minMaxQuery(db
36f00 2c 20 73 41 67 67 49 6e 66 6f 2e 61 46 75 6e 63  , sAggInfo.aFunc
36f10 5b 30 5d 2e 70 45 78 70 72 2c 20 26 70 4d 69 6e  [0].pExpr, &pMin
36f20 4d 61 78 4f 72 64 65 72 42 79 29 3b 0a 20 20 20  MaxOrderBy);.   
36f30 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6d 69   }else{.      mi
36f40 6e 4d 61 78 46 6c 61 67 20 3d 20 57 48 45 52 45  nMaxFlag = WHERE
36f50 5f 4f 52 44 45 52 42 59 5f 4e 4f 52 4d 41 4c 3b  _ORDERBY_NORMAL;
36f60 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69  .    }.    for(i
36f70 3d 30 3b 20 69 3c 73 41 67 67 49 6e 66 6f 2e 6e  =0; i<sAggInfo.n
36f80 46 75 6e 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Func; i++){.    
36f90 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48    assert( !ExprH
36fa0 61 73 50 72 6f 70 65 72 74 79 28 73 41 67 67 49  asProperty(sAggI
36fb0 6e 66 6f 2e 61 46 75 6e 63 5b 69 5d 2e 70 45 78  nfo.aFunc[i].pEx
36fc0 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74  pr, EP_xIsSelect
36fd0 29 20 29 3b 0a 20 20 20 20 20 20 73 4e 43 2e 6e  ) );.      sNC.n
36fe0 63 46 6c 61 67 73 20 7c 3d 20 4e 43 5f 49 6e 41  cFlags |= NC_InA
36ff0 67 67 46 75 6e 63 3b 0a 20 20 20 20 20 20 73 71  ggFunc;.      sq
37000 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65  lite3ExprAnalyze
37010 41 67 67 4c 69 73 74 28 26 73 4e 43 2c 20 73 41  AggList(&sNC, sA
37020 67 67 49 6e 66 6f 2e 61 46 75 6e 63 5b 69 5d 2e  ggInfo.aFunc[i].
37030 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 29 3b  pExpr->x.pList);
37040 0a 20 20 20 20 20 20 73 4e 43 2e 6e 63 46 6c 61  .      sNC.ncFla
37050 67 73 20 26 3d 20 7e 4e 43 5f 49 6e 41 67 67 46  gs &= ~NC_InAggF
37060 75 6e 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  unc;.    }.    s
37070 41 67 67 49 6e 66 6f 2e 6d 78 52 65 67 20 3d 20  AggInfo.mxReg = 
37080 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
37090 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
370a0 46 61 69 6c 65 64 20 29 20 67 6f 74 6f 20 73 65  Failed ) goto se
370b0 6c 65 63 74 5f 65 6e 64 3b 0a 23 69 66 20 53 45  lect_end;.#if SE
370c0 4c 45 43 54 54 52 41 43 45 5f 45 4e 41 42 4c 45  LECTTRACE_ENABLE
370d0 44 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  D.    if( sqlite
370e0 33 53 65 6c 65 63 74 54 72 61 63 65 20 26 20 30  3SelectTrace & 0
370f0 78 34 30 30 20 29 7b 0a 20 20 20 20 20 20 69 6e  x400 ){.      in
37100 74 20 69 69 3b 0a 20 20 20 20 20 20 53 45 4c 45  t ii;.      SELE
37110 43 54 54 52 41 43 45 28 30 78 34 30 30 2c 70 50  CTTRACE(0x400,pP
37120 61 72 73 65 2c 70 2c 28 22 41 66 74 65 72 20 61  arse,p,("After a
37130 67 67 72 65 67 61 74 65 20 61 6e 61 6c 79 73 69  ggregate analysi
37140 73 3a 5c 6e 22 29 29 3b 0a 20 20 20 20 20 20 73  s:\n"));.      s
37150 71 6c 69 74 65 33 54 72 65 65 56 69 65 77 53 65  qlite3TreeViewSe
37160 6c 65 63 74 28 30 2c 20 70 2c 20 30 29 3b 0a 20  lect(0, p, 0);. 
37170 20 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 69       for(ii=0; i
37180 69 3c 73 41 67 67 49 6e 66 6f 2e 6e 43 6f 6c 75  i<sAggInfo.nColu
37190 6d 6e 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20  mn; ii++){.     
371a0 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
371b0 72 69 6e 74 66 28 22 61 67 67 2d 63 6f 6c 75 6d  rintf("agg-colum
371c0 6e 5b 25 64 5d 20 69 4d 65 6d 3d 25 64 5c 6e 22  n[%d] iMem=%d\n"
371d0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 69  ,.            ii
371e0 2c 20 73 41 67 67 49 6e 66 6f 2e 61 43 6f 6c 5b  , sAggInfo.aCol[
371f0 69 69 5d 2e 69 4d 65 6d 29 3b 0a 20 20 20 20 20  ii].iMem);.     
37200 20 20 20 73 71 6c 69 74 65 33 54 72 65 65 56 69     sqlite3TreeVi
37210 65 77 45 78 70 72 28 30 2c 20 73 41 67 67 49 6e  ewExpr(0, sAggIn
37220 66 6f 2e 61 43 6f 6c 5b 69 69 5d 2e 70 45 78 70  fo.aCol[ii].pExp
37230 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20  r, 0);.      }. 
37240 20 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 69       for(ii=0; i
37250 69 3c 73 41 67 67 49 6e 66 6f 2e 6e 46 75 6e 63  i<sAggInfo.nFunc
37260 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  ; ii++){.       
37270 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
37280 6e 74 66 28 22 61 67 67 2d 66 75 6e 63 5b 25 64  ntf("agg-func[%d
37290 5d 3a 20 69 4d 65 6d 3d 25 64 5c 6e 22 2c 0a 20  ]: iMem=%d\n",. 
372a0 20 20 20 20 20 20 20 20 20 20 20 69 69 2c 20 73             ii, s
372b0 41 67 67 49 6e 66 6f 2e 61 46 75 6e 63 5b 69 69  AggInfo.aFunc[ii
372c0 5d 2e 69 4d 65 6d 29 3b 0a 20 20 20 20 20 20 20  ].iMem);.       
372d0 20 73 71 6c 69 74 65 33 54 72 65 65 56 69 65 77   sqlite3TreeView
372e0 45 78 70 72 28 30 2c 20 73 41 67 67 49 6e 66 6f  Expr(0, sAggInfo
372f0 2e 61 46 75 6e 63 5b 69 69 5d 2e 70 45 78 70 72  .aFunc[ii].pExpr
37300 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , 0);.      }.  
37310 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 0a 20 20 20    }.#endif...   
37320 20 2f 2a 20 50 72 6f 63 65 73 73 69 6e 67 20 66   /* Processing f
37330 6f 72 20 61 67 67 72 65 67 61 74 65 73 20 77 69  or aggregates wi
37340 74 68 20 47 52 4f 55 50 20 42 59 20 69 73 20 76  th GROUP BY is v
37350 65 72 79 20 64 69 66 66 65 72 65 6e 74 20 61 6e  ery different an
37360 64 0a 20 20 20 20 2a 2a 20 6d 75 63 68 20 6d 6f  d.    ** much mo
37370 72 65 20 63 6f 6d 70 6c 65 78 20 74 68 61 6e 20  re complex than 
37380 61 67 67 72 65 67 61 74 65 73 20 77 69 74 68 6f  aggregates witho
37390 75 74 20 61 20 47 52 4f 55 50 20 42 59 2e 0a 20  ut a GROUP BY.. 
373a0 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 47     */.    if( pG
373b0 72 6f 75 70 42 79 20 29 7b 0a 20 20 20 20 20 20  roupBy ){.      
373c0 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66  KeyInfo *pKeyInf
373d0 6f 3b 20 20 2f 2a 20 4b 65 79 69 6e 67 20 69 6e  o;  /* Keying in
373e0 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20 74 68  formation for th
373f0 65 20 67 72 6f 75 70 20 62 79 20 63 6c 61 75 73  e group by claus
37400 65 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61  e */.      int a
37410 64 64 72 31 3b 20 20 20 20 20 20 20 20 20 20 2f  ddr1;          /
37420 2a 20 41 2d 76 73 2d 42 20 63 6f 6d 70 61 72 69  * A-vs-B compari
37430 73 69 6f 6e 20 6a 75 6d 70 20 2a 2f 0a 20 20 20  sion jump */.   
37440 20 20 20 69 6e 74 20 61 64 64 72 4f 75 74 70 75     int addrOutpu
37450 74 52 6f 77 3b 20 20 2f 2a 20 53 74 61 72 74 20  tRow;  /* Start 
37460 6f 66 20 73 75 62 72 6f 75 74 69 6e 65 20 74 68  of subroutine th
37470 61 74 20 6f 75 74 70 75 74 73 20 61 20 72 65 73  at outputs a res
37480 75 6c 74 20 72 6f 77 20 2a 2f 0a 20 20 20 20 20  ult row */.     
37490 20 69 6e 74 20 72 65 67 4f 75 74 70 75 74 52 6f   int regOutputRo
374a0 77 3b 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 61  w;   /* Return a
374b0 64 64 72 65 73 73 20 72 65 67 69 73 74 65 72 20  ddress register 
374c0 66 6f 72 20 6f 75 74 70 75 74 20 73 75 62 72 6f  for output subro
374d0 75 74 69 6e 65 20 2a 2f 0a 20 20 20 20 20 20 69  utine */.      i
374e0 6e 74 20 61 64 64 72 53 65 74 41 62 6f 72 74 3b  nt addrSetAbort;
374f0 20 20 20 2f 2a 20 53 65 74 20 74 68 65 20 61 62     /* Set the ab
37500 6f 72 74 20 66 6c 61 67 20 61 6e 64 20 72 65 74  ort flag and ret
37510 75 72 6e 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  urn */.      int
37520 20 61 64 64 72 54 6f 70 4f 66 4c 6f 6f 70 3b 20   addrTopOfLoop; 
37530 20 2f 2a 20 54 6f 70 20 6f 66 20 74 68 65 20 69   /* Top of the i
37540 6e 70 75 74 20 6c 6f 6f 70 20 2a 2f 0a 20 20 20  nput loop */.   
37550 20 20 20 69 6e 74 20 61 64 64 72 53 6f 72 74 69     int addrSorti
37560 6e 67 49 64 78 3b 20 2f 2a 20 54 68 65 20 4f 50  ngIdx; /* The OP
37570 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 66  _OpenEphemeral f
37580 6f 72 20 74 68 65 20 73 6f 72 74 69 6e 67 20 69  or the sorting i
37590 6e 64 65 78 20 2a 2f 0a 20 20 20 20 20 20 69 6e  ndex */.      in
375a0 74 20 61 64 64 72 52 65 73 65 74 3b 20 20 20 20  t addrReset;    
375b0 20 20 2f 2a 20 53 75 62 72 6f 75 74 69 6e 65 20    /* Subroutine 
375c0 66 6f 72 20 72 65 73 65 74 74 69 6e 67 20 74 68  for resetting th
375d0 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 20 2a 2f  e accumulator */
375e0 0a 20 20 20 20 20 20 69 6e 74 20 72 65 67 52 65  .      int regRe
375f0 73 65 74 3b 20 20 20 20 20 20 20 2f 2a 20 52 65  set;       /* Re
37600 74 75 72 6e 20 61 64 64 72 65 73 73 20 72 65 67  turn address reg
37610 69 73 74 65 72 20 66 6f 72 20 72 65 73 65 74 20  ister for reset 
37620 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 0a 20  subroutine */.. 
37630 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65       /* If there
37640 20 69 73 20 61 20 47 52 4f 55 50 20 42 59 20 63   is a GROUP BY c
37650 6c 61 75 73 65 20 77 65 20 6d 69 67 68 74 20 6e  lause we might n
37660 65 65 64 20 61 20 73 6f 72 74 69 6e 67 20 69 6e  eed a sorting in
37670 64 65 78 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20  dex to.      ** 
37680 69 6d 70 6c 65 6d 65 6e 74 20 69 74 2e 20 20 41  implement it.  A
37690 6c 6c 6f 63 61 74 65 20 74 68 61 74 20 73 6f 72  llocate that sor
376a0 74 69 6e 67 20 69 6e 64 65 78 20 6e 6f 77 2e 20  ting index now. 
376b0 20 49 66 20 69 74 20 74 75 72 6e 73 20 6f 75 74   If it turns out
376c0 0a 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 77  .      ** that w
376d0 65 20 64 6f 20 6e 6f 74 20 6e 65 65 64 20 69 74  e do not need it
376e0 20 61 66 74 65 72 20 61 6c 6c 2c 20 74 68 65 20   after all, the 
376f0 4f 50 5f 53 6f 72 74 65 72 4f 70 65 6e 20 69 6e  OP_SorterOpen in
37700 73 74 72 75 63 74 69 6f 6e 0a 20 20 20 20 20 20  struction.      
37710 2a 2a 20 77 69 6c 6c 20 62 65 20 63 6f 6e 76 65  ** will be conve
37720 72 74 65 64 20 69 6e 74 6f 20 61 20 4e 6f 6f 70  rted into a Noop
37730 2e 20 20 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  .  .      */.   
37740 20 20 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74     sAggInfo.sort
37750 69 6e 67 49 64 78 20 3d 20 70 50 61 72 73 65 2d  ingIdx = pParse-
37760 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 70  >nTab++;.      p
37770 4b 65 79 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65  KeyInfo = sqlite
37780 33 4b 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72  3KeyInfoFromExpr
37790 4c 69 73 74 28 70 50 61 72 73 65 2c 70 47 72 6f  List(pParse,pGro
377a0 75 70 42 79 2c 30 2c 73 41 67 67 49 6e 66 6f 2e  upBy,0,sAggInfo.
377b0 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20  nColumn);.      
377c0 61 64 64 72 53 6f 72 74 69 6e 67 49 64 78 20 3d  addrSortingIdx =
377d0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
377e0 70 34 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72 4f  p4(v, OP_SorterO
377f0 70 65 6e 2c 20 0a 20 20 20 20 20 20 20 20 20 20  pen, .          
37800 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67  sAggInfo.sorting
37810 49 64 78 2c 20 73 41 67 67 49 6e 66 6f 2e 6e 53  Idx, sAggInfo.nS
37820 6f 72 74 69 6e 67 43 6f 6c 75 6d 6e 2c 20 0a 20  ortingColumn, . 
37830 20 20 20 20 20 20 20 20 20 30 2c 20 28 63 68 61           0, (cha
37840 72 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50 34 5f  r*)pKeyInfo, P4_
37850 4b 45 59 49 4e 46 4f 29 3b 0a 0a 20 20 20 20 20  KEYINFO);..     
37860 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 6d   /* Initialize m
37870 65 6d 6f 72 79 20 6c 6f 63 61 74 69 6f 6e 73 20  emory locations 
37880 75 73 65 64 20 62 79 20 47 52 4f 55 50 20 42 59  used by GROUP BY
37890 20 61 67 67 72 65 67 61 74 65 20 70 72 6f 63 65   aggregate proce
378a0 73 73 69 6e 67 0a 20 20 20 20 20 20 2a 2f 0a 20  ssing.      */. 
378b0 20 20 20 20 20 69 55 73 65 46 6c 61 67 20 3d 20       iUseFlag = 
378c0 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
378d0 20 20 20 20 20 20 69 41 62 6f 72 74 46 6c 61 67        iAbortFlag
378e0 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
378f0 6d 3b 0a 20 20 20 20 20 20 72 65 67 4f 75 74 70  m;.      regOutp
37900 75 74 52 6f 77 20 3d 20 2b 2b 70 50 61 72 73 65  utRow = ++pParse
37910 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 61 64  ->nMem;.      ad
37920 64 72 4f 75 74 70 75 74 52 6f 77 20 3d 20 73 71  drOutputRow = sq
37930 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
37940 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 72 65 67  el(v);.      reg
37950 52 65 73 65 74 20 3d 20 2b 2b 70 50 61 72 73 65  Reset = ++pParse
37960 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 61 64  ->nMem;.      ad
37970 64 72 52 65 73 65 74 20 3d 20 73 71 6c 69 74 65  drReset = sqlite
37980 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
37990 29 3b 0a 20 20 20 20 20 20 69 41 4d 65 6d 20 3d  );.      iAMem =
379a0 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 20   pParse->nMem + 
379b0 31 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d  1;.      pParse-
379c0 3e 6e 4d 65 6d 20 2b 3d 20 70 47 72 6f 75 70 42  >nMem += pGroupB
379d0 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20  y->nExpr;.      
379e0 69 42 4d 65 6d 20 3d 20 70 50 61 72 73 65 2d 3e  iBMem = pParse->
379f0 6e 4d 65 6d 20 2b 20 31 3b 0a 20 20 20 20 20 20  nMem + 1;.      
37a00 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20  pParse->nMem += 
37a10 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 3b  pGroupBy->nExpr;
37a20 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
37a30 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
37a40 6e 74 65 67 65 72 2c 20 30 2c 20 69 41 62 6f 72  nteger, 0, iAbor
37a50 74 46 6c 61 67 29 3b 0a 20 20 20 20 20 20 56 64  tFlag);.      Vd
37a60 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 63  beComment((v, "c
37a70 6c 65 61 72 20 61 62 6f 72 74 20 66 6c 61 67 22  lear abort flag"
37a80 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ));.      sqlite
37a90 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
37aa0 50 5f 4e 75 6c 6c 2c 20 30 2c 20 69 41 4d 65 6d  P_Null, 0, iAMem
37ab0 2c 20 69 41 4d 65 6d 2b 70 47 72 6f 75 70 42 79  , iAMem+pGroupBy
37ac0 2d 3e 6e 45 78 70 72 2d 31 29 3b 0a 0a 20 20 20  ->nExpr-1);..   
37ad0 20 20 20 2f 2a 20 42 65 67 69 6e 20 61 20 6c 6f     /* Begin a lo
37ae0 6f 70 20 74 68 61 74 20 77 69 6c 6c 20 65 78 74  op that will ext
37af0 72 61 63 74 20 61 6c 6c 20 73 6f 75 72 63 65 20  ract all source 
37b00 72 6f 77 73 20 69 6e 20 47 52 4f 55 50 20 42 59  rows in GROUP BY
37b10 20 6f 72 64 65 72 2e 0a 20 20 20 20 20 20 2a 2a   order..      **
37b20 20 54 68 69 73 20 6d 69 67 68 74 20 69 6e 76 6f   This might invo
37b30 6c 76 65 20 74 77 6f 20 73 65 70 61 72 61 74 65  lve two separate
37b40 20 6c 6f 6f 70 73 20 77 69 74 68 20 61 6e 20 4f   loops with an O
37b50 50 5f 53 6f 72 74 20 69 6e 20 62 65 74 77 65 65  P_Sort in betwee
37b60 6e 2c 20 6f 72 0a 20 20 20 20 20 20 2a 2a 20 69  n, or.      ** i
37b70 74 20 6d 69 67 68 74 20 62 65 20 61 20 73 69 6e  t might be a sin
37b80 67 6c 65 20 6c 6f 6f 70 20 74 68 61 74 20 75 73  gle loop that us
37b90 65 73 20 61 6e 20 69 6e 64 65 78 20 74 6f 20 65  es an index to e
37ba0 78 74 72 61 63 74 20 69 6e 66 6f 72 6d 61 74 69  xtract informati
37bb0 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 69 6e 20 74  on.      ** in t
37bc0 68 65 20 72 69 67 68 74 20 6f 72 64 65 72 20 74  he right order t
37bd0 6f 20 62 65 67 69 6e 20 77 69 74 68 2e 0a 20 20  o begin with..  
37be0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c      */.      sql
37bf0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
37c00 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 52  , OP_Gosub, regR
37c10 65 73 65 74 2c 20 61 64 64 72 52 65 73 65 74 29  eset, addrReset)
37c20 3b 0a 20 20 20 20 20 20 53 45 4c 45 43 54 54 52  ;.      SELECTTR
37c30 41 43 45 28 31 2c 70 50 61 72 73 65 2c 70 2c 28  ACE(1,pParse,p,(
37c40 22 57 68 65 72 65 42 65 67 69 6e 5c 6e 22 29 29  "WhereBegin\n"))
37c50 3b 0a 20 20 20 20 20 20 70 57 49 6e 66 6f 20 3d  ;.      pWInfo =
37c60 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67   sqlite3WhereBeg
37c70 69 6e 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c  in(pParse, pTabL
37c80 69 73 74 2c 20 70 57 68 65 72 65 2c 20 70 47 72  ist, pWhere, pGr
37c90 6f 75 70 42 79 2c 20 30 2c 0a 20 20 20 20 20 20  oupBy, 0,.      
37ca0 20 20 20 20 57 48 45 52 45 5f 47 52 4f 55 50 42      WHERE_GROUPB
37cb0 59 20 7c 20 28 6f 72 64 65 72 42 79 47 72 70 20  Y | (orderByGrp 
37cc0 3f 20 57 48 45 52 45 5f 53 4f 52 54 42 59 47 52  ? WHERE_SORTBYGR
37cd0 4f 55 50 20 3a 20 30 29 2c 20 30 0a 20 20 20 20  OUP : 0), 0.    
37ce0 20 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70    );.      if( p
37cf0 57 49 6e 66 6f 3d 3d 30 20 29 20 67 6f 74 6f 20  WInfo==0 ) goto 
37d00 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20  select_end;.    
37d10 20 20 69 66 28 20 73 71 6c 69 74 65 33 57 68 65    if( sqlite3Whe
37d20 72 65 49 73 4f 72 64 65 72 65 64 28 70 57 49 6e  reIsOrdered(pWIn
37d30 66 6f 29 3d 3d 70 47 72 6f 75 70 42 79 2d 3e 6e  fo)==pGroupBy->n
37d40 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20 20 20  Expr ){.        
37d50 2f 2a 20 54 68 65 20 6f 70 74 69 6d 69 7a 65 72  /* The optimizer
37d60 20 69 73 20 61 62 6c 65 20 74 6f 20 64 65 6c 69   is able to deli
37d70 76 65 72 20 72 6f 77 73 20 69 6e 20 67 72 6f 75  ver rows in grou
37d80 70 20 62 79 20 6f 72 64 65 72 20 73 6f 0a 20 20  p by order so.  
37d90 20 20 20 20 20 20 2a 2a 20 77 65 20 64 6f 20 6e        ** we do n
37da0 6f 74 20 68 61 76 65 20 74 6f 20 73 6f 72 74 2e  ot have to sort.
37db0 20 20 54 68 65 20 4f 50 5f 4f 70 65 6e 45 70 68    The OP_OpenEph
37dc0 65 6d 65 72 61 6c 20 74 61 62 6c 65 20 77 69 6c  emeral table wil
37dd0 6c 20 62 65 0a 20 20 20 20 20 20 20 20 2a 2a 20  l be.        ** 
37de0 63 61 6e 63 65 6c 6c 65 64 20 6c 61 74 65 72 20  cancelled later 
37df0 62 65 63 61 75 73 65 20 77 65 20 73 74 69 6c 6c  because we still
37e00 20 6e 65 65 64 20 74 6f 20 75 73 65 20 74 68 65   need to use the
37e10 20 70 4b 65 79 49 6e 66 6f 0a 20 20 20 20 20 20   pKeyInfo.      
37e20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 67 72 6f    */.        gro
37e30 75 70 42 79 53 6f 72 74 20 3d 20 30 3b 0a 20 20  upBySort = 0;.  
37e40 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
37e50 20 20 20 2f 2a 20 52 6f 77 73 20 61 72 65 20 63     /* Rows are c
37e60 6f 6d 69 6e 67 20 6f 75 74 20 69 6e 20 75 6e 64  oming out in und
37e70 65 74 65 72 6d 69 6e 65 64 20 6f 72 64 65 72 2e  etermined order.
37e80 20 20 57 65 20 68 61 76 65 20 74 6f 20 70 75 73    We have to pus
37e90 68 0a 20 20 20 20 20 20 20 20 2a 2a 20 65 61 63  h.        ** eac
37ea0 68 20 72 6f 77 20 69 6e 74 6f 20 61 20 73 6f 72  h row into a sor
37eb0 74 69 6e 67 20 69 6e 64 65 78 2c 20 74 65 72 6d  ting index, term
37ec0 69 6e 61 74 65 20 74 68 65 20 66 69 72 73 74 20  inate the first 
37ed0 6c 6f 6f 70 2c 0a 20 20 20 20 20 20 20 20 2a 2a  loop,.        **
37ee0 20 74 68 65 6e 20 6c 6f 6f 70 20 6f 76 65 72 20   then loop over 
37ef0 74 68 65 20 73 6f 72 74 69 6e 67 20 69 6e 64 65  the sorting inde
37f00 78 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 67 65  x in order to ge
37f10 74 20 74 68 65 20 6f 75 74 70 75 74 0a 20 20 20  t the output.   
37f20 20 20 20 20 20 2a 2a 20 69 6e 20 73 6f 72 74 65       ** in sorte
37f30 64 20 6f 72 64 65 72 0a 20 20 20 20 20 20 20 20  d order.        
37f40 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72  */.        int r
37f50 65 67 42 61 73 65 3b 0a 20 20 20 20 20 20 20 20  egBase;.        
37f60 69 6e 74 20 72 65 67 52 65 63 6f 72 64 3b 0a 20  int regRecord;. 
37f70 20 20 20 20 20 20 20 69 6e 74 20 6e 43 6f 6c 3b         int nCol;
37f80 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 47 72  .        int nGr
37f90 6f 75 70 42 79 3b 0a 0a 20 20 20 20 20 20 20 20  oupBy;..        
37fa0 65 78 70 6c 61 69 6e 54 65 6d 70 54 61 62 6c 65  explainTempTable
37fb0 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20  (pParse, .      
37fc0 20 20 20 20 20 20 28 73 44 69 73 74 69 6e 63 74        (sDistinct
37fd0 2e 69 73 54 6e 63 74 20 26 26 20 28 70 2d 3e 73  .isTnct && (p->s
37fe0 65 6c 46 6c 61 67 73 26 53 46 5f 44 69 73 74 69  elFlags&SF_Disti
37ff0 6e 63 74 29 3d 3d 30 29 20 3f 0a 20 20 20 20 20  nct)==0) ?.     
38000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
38010 44 49 53 54 49 4e 43 54 22 20 3a 20 22 47 52 4f  DISTINCT" : "GRO
38020 55 50 20 42 59 22 29 3b 0a 0a 20 20 20 20 20 20  UP BY");..      
38030 20 20 67 72 6f 75 70 42 79 53 6f 72 74 20 3d 20    groupBySort = 
38040 31 3b 0a 20 20 20 20 20 20 20 20 6e 47 72 6f 75  1;.        nGrou
38050 70 42 79 20 3d 20 70 47 72 6f 75 70 42 79 2d 3e  pBy = pGroupBy->
38060 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 6e  nExpr;.        n
38070 43 6f 6c 20 3d 20 6e 47 72 6f 75 70 42 79 3b 0a  Col = nGroupBy;.
38080 20 20 20 20 20 20 20 20 6a 20 3d 20 6e 47 72 6f          j = nGro
38090 75 70 42 79 3b 0a 20 20 20 20 20 20 20 20 66 6f  upBy;.        fo
380a0 72 28 69 3d 30 3b 20 69 3c 73 41 67 67 49 6e 66  r(i=0; i<sAggInf
380b0 6f 2e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b  o.nColumn; i++){
380c0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73  .          if( s
380d0 41 67 67 49 6e 66 6f 2e 61 43 6f 6c 5b 69 5d 2e  AggInfo.aCol[i].
380e0 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 3e 3d 6a  iSorterColumn>=j
380f0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
38100 6e 43 6f 6c 2b 2b 3b 0a 20 20 20 20 20 20 20 20  nCol++;.        
38110 20 20 20 20 6a 2b 2b 3b 0a 20 20 20 20 20 20 20      j++;.       
38120 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
38130 20 20 20 20 20 20 20 72 65 67 42 61 73 65 20 3d         regBase =
38140 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
38150 61 6e 67 65 28 70 50 61 72 73 65 2c 20 6e 43 6f  ange(pParse, nCo
38160 6c 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  l);.        sqli
38170 74 65 33 45 78 70 72 43 6f 64 65 45 78 70 72 4c  te3ExprCodeExprL
38180 69 73 74 28 70 50 61 72 73 65 2c 20 70 47 72 6f  ist(pParse, pGro
38190 75 70 42 79 2c 20 72 65 67 42 61 73 65 2c 20 30  upBy, regBase, 0
381a0 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 6a 20  , 0);.        j 
381b0 3d 20 6e 47 72 6f 75 70 42 79 3b 0a 20 20 20 20  = nGroupBy;.    
381c0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73      for(i=0; i<s
381d0 41 67 67 49 6e 66 6f 2e 6e 43 6f 6c 75 6d 6e 3b  AggInfo.nColumn;
381e0 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20   i++){.         
381f0 20 73 74 72 75 63 74 20 41 67 67 49 6e 66 6f 5f   struct AggInfo_
38200 63 6f 6c 20 2a 70 43 6f 6c 20 3d 20 26 73 41 67  col *pCol = &sAg
38210 67 49 6e 66 6f 2e 61 43 6f 6c 5b 69 5d 3b 0a 20  gInfo.aCol[i];. 
38220 20 20 20 20 20 20 20 20 20 69 66 28 20 70 43 6f           if( pCo
38230 6c 2d 3e 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e  l->iSorterColumn
38240 3e 3d 6a 20 29 7b 0a 20 20 20 20 20 20 20 20 20  >=j ){.         
38250 20 20 20 69 6e 74 20 72 31 20 3d 20 6a 20 2b 20     int r1 = j + 
38260 72 65 67 42 61 73 65 3b 0a 20 20 20 20 20 20 20  regBase;.       
38270 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
38280 43 6f 64 65 47 65 74 43 6f 6c 75 6d 6e 4f 66 54  CodeGetColumnOfT
38290 61 62 6c 65 28 76 2c 0a 20 20 20 20 20 20 20 20  able(v,.        
382a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
382b0 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 70 54 61         pCol->pTa
382c0 62 2c 20 70 43 6f 6c 2d 3e 69 54 61 62 6c 65 2c  b, pCol->iTable,
382d0 20 70 43 6f 6c 2d 3e 69 43 6f 6c 75 6d 6e 2c 20   pCol->iColumn, 
382e0 72 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  r1);.           
382f0 20 6a 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20   j++;.          
38300 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
38310 20 20 20 20 72 65 67 52 65 63 6f 72 64 20 3d 20      regRecord = 
38320 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65  sqlite3GetTempRe
38330 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  g(pParse);.     
38340 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
38350 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52  dOp3(v, OP_MakeR
38360 65 63 6f 72 64 2c 20 72 65 67 42 61 73 65 2c 20  ecord, regBase, 
38370 6e 43 6f 6c 2c 20 72 65 67 52 65 63 6f 72 64 29  nCol, regRecord)
38380 3b 0a 20 20