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

Artifact 80b8b4c857db2f20d98f80b71ef3bb0d70cdd17bd6b00217dcff803e9b989bd8:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ******.** This f
0180: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 43 20 63  ile contains C c
0190: 6f 64 65 20 72 6f 75 74 69 6e 65 73 20 74 68 61  ode routines tha
01a0: 74 20 61 72 65 20 63 61 6c 6c 65 64 20 62 79 20  t are called by 
01b0: 74 68 65 20 70 61 72 73 65 72 0a 2a 2a 20 74 6f  the parser.** to
01c0: 20 68 61 6e 64 6c 65 20 53 45 4c 45 43 54 20 73   handle SELECT s
01d0: 74 61 74 65 6d 65 6e 74 73 20 69 6e 20 53 51 4c  tatements in SQL
01e0: 69 74 65 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65  ite..*/.#include
01f0: 20 22 73 71 6c 69 74 65 49 6e 74 2e 68 22 0a 0a   "sqliteInt.h"..
0200: 2f 2a 0a 2a 2a 20 54 72 61 63 65 20 6f 75 74 70  /*.** Trace outp
0210: 75 74 20 6d 61 63 72 6f 73 0a 2a 2f 0a 23 69 66  ut macros.*/.#if
0220: 20 53 45 4c 45 43 54 54 52 41 43 45 5f 45 4e 41   SELECTTRACE_ENA
0230: 42 4c 45 44 0a 2f 2a 2a 2a 2f 20 69 6e 74 20 73  BLED./***/ int s
0240: 71 6c 69 74 65 33 53 65 6c 65 63 74 54 72 61 63  qlite3SelectTrac
0250: 65 20 3d 20 30 3b 0a 23 20 64 65 66 69 6e 65 20  e = 0;.# define 
0260: 53 45 4c 45 43 54 54 52 41 43 45 28 4b 2c 50 2c  SELECTTRACE(K,P,
0270: 53 2c 58 29 20 20 5c 0a 20 20 69 66 28 73 71 6c  S,X)  \.  if(sql
0280: 69 74 65 33 53 65 6c 65 63 74 54 72 61 63 65 26  ite3SelectTrace&
0290: 28 4b 29 29 20 20 20 5c 0a 20 20 20 20 73 71 6c  (K))   \.    sql
02a0: 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
02b0: 22 25 75 2f 25 64 2f 25 70 3a 20 22 2c 28 53 29  "%u/%d/%p: ",(S)
02c0: 2d 3e 73 65 6c 49 64 2c 28 50 29 2d 3e 61 64 64  ->selId,(P)->add
02d0: 72 45 78 70 6c 61 69 6e 2c 28 53 29 29 2c 5c 0a  rExplain,(S)),\.
02e0: 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
02f0: 50 72 69 6e 74 66 20 58 0a 23 65 6c 73 65 0a 23  Printf X.#else.#
0300: 20 64 65 66 69 6e 65 20 53 45 4c 45 43 54 54 52   define SELECTTR
0310: 41 43 45 28 4b 2c 50 2c 53 2c 58 29 0a 23 65 6e  ACE(K,P,S,X).#en
0320: 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69  dif.../*.** An i
0330: 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66  nstance of the f
0340: 6f 6c 6c 6f 77 69 6e 67 20 6f 62 6a 65 63 74 20  ollowing object 
0350: 69 73 20 75 73 65 64 20 74 6f 20 72 65 63 6f 72  is used to recor
0360: 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62  d information ab
0370: 6f 75 74 0a 2a 2a 20 68 6f 77 20 74 6f 20 70 72  out.** how to pr
0380: 6f 63 65 73 73 20 74 68 65 20 44 49 53 54 49 4e  ocess the DISTIN
0390: 43 54 20 6b 65 79 77 6f 72 64 2c 20 74 6f 20 73  CT keyword, to s
03a0: 69 6d 70 6c 69 66 79 20 70 61 73 73 69 6e 67 20  implify passing 
03b0: 74 68 61 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  that information
03c0: 0a 2a 2a 20 69 6e 74 6f 20 74 68 65 20 73 65 6c  .** into the sel
03d0: 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 29 20 72  ectInnerLoop() r
03e0: 6f 75 74 69 6e 65 2e 0a 2a 2f 0a 74 79 70 65 64  outine..*/.typed
03f0: 65 66 20 73 74 72 75 63 74 20 44 69 73 74 69 6e  ef struct Distin
0400: 63 74 43 74 78 20 44 69 73 74 69 6e 63 74 43 74  ctCtx DistinctCt
0410: 78 3b 0a 73 74 72 75 63 74 20 44 69 73 74 69 6e  x;.struct Distin
0420: 63 74 43 74 78 20 7b 0a 20 20 75 38 20 69 73 54  ctCtx {.  u8 isT
0430: 6e 63 74 3b 20 20 20 20 20 20 2f 2a 20 54 72 75  nct;      /* Tru
0440: 65 20 69 66 20 74 68 65 20 44 49 53 54 49 4e 43  e if the DISTINC
0450: 54 20 6b 65 79 77 6f 72 64 20 69 73 20 70 72 65  T keyword is pre
0460: 73 65 6e 74 20 2a 2f 0a 20 20 75 38 20 65 54 6e  sent */.  u8 eTn
0470: 63 74 54 79 70 65 3b 20 20 20 2f 2a 20 4f 6e 65  ctType;   /* One
0480: 20 6f 66 20 74 68 65 20 57 48 45 52 45 5f 44 49   of the WHERE_DI
0490: 53 54 49 4e 43 54 5f 2a 20 6f 70 65 72 61 74 6f  STINCT_* operato
04a0: 72 73 20 2a 2f 0a 20 20 69 6e 74 20 74 61 62 54  rs */.  int tabT
04b0: 6e 63 74 3b 20 20 20 20 2f 2a 20 45 70 68 65 6d  nct;    /* Ephem
04c0: 65 72 61 6c 20 74 61 62 6c 65 20 75 73 65 64 20  eral table used 
04d0: 66 6f 72 20 44 49 53 54 49 4e 43 54 20 70 72 6f  for DISTINCT pro
04e0: 63 65 73 73 69 6e 67 20 2a 2f 0a 20 20 69 6e 74  cessing */.  int
04f0: 20 61 64 64 72 54 6e 63 74 3b 20 20 20 2f 2a 20   addrTnct;   /* 
0500: 41 64 64 72 65 73 73 20 6f 66 20 4f 50 5f 4f 70  Address of OP_Op
0510: 65 6e 45 70 68 65 6d 65 72 61 6c 20 6f 70 63 6f  enEphemeral opco
0520: 64 65 20 66 6f 72 20 74 61 62 54 6e 63 74 20 2a  de for tabTnct *
0530: 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69  /.};../*.** An i
0540: 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66  nstance of the f
0550: 6f 6c 6c 6f 77 69 6e 67 20 6f 62 6a 65 63 74 20  ollowing object 
0560: 69 73 20 75 73 65 64 20 74 6f 20 72 65 63 6f 72  is used to recor
0570: 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62  d information ab
0580: 6f 75 74 0a 2a 2a 20 74 68 65 20 4f 52 44 45 52  out.** the ORDER
0590: 20 42 59 20 28 6f 72 20 47 52 4f 55 50 20 42 59   BY (or GROUP BY
05a0: 29 20 63 6c 61 75 73 65 20 6f 66 20 71 75 65 72  ) clause of quer
05b0: 79 20 69 73 20 62 65 69 6e 67 20 63 6f 64 65 64  y is being coded
05c0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 44 65 66  ..**.** The aDef
05d0: 65 72 5b 5d 20 61 72 72 61 79 20 69 73 20 75 73  er[] array is us
05e0: 65 64 20 62 79 20 74 68 65 20 73 6f 72 74 65 72  ed by the sorter
05f0: 2d 72 65 66 65 72 65 6e 63 65 73 20 6f 70 74 69  -references opti
0600: 6d 69 7a 61 74 69 6f 6e 2e 20 46 6f 72 0a 2a 2a  mization. For.**
0610: 20 65 78 61 6d 70 6c 65 2c 20 61 73 73 75 6d 69   example, assumi
0620: 6e 67 20 74 68 65 72 65 20 69 73 20 6e 6f 20 69  ng there is no i
0630: 6e 64 65 78 20 74 68 61 74 20 63 61 6e 20 62 65  ndex that can be
0640: 20 75 73 65 64 20 66 6f 72 20 74 68 65 20 4f 52   used for the OR
0650: 44 45 52 20 42 59 2c 0a 2a 2a 20 66 6f 72 20 74  DER BY,.** for t
0660: 68 65 20 71 75 65 72 79 3a 0a 2a 2a 0a 2a 2a 20  he query:.**.** 
0670: 20 20 20 20 53 45 4c 45 43 54 20 61 2c 20 62 69      SELECT a, bi
0680: 67 62 6c 6f 62 20 46 52 4f 4d 20 74 31 20 4f 52  gblob FROM t1 OR
0690: 44 45 52 20 42 59 20 61 20 4c 49 4d 49 54 20 31  DER BY a LIMIT 1
06a0: 30 3b 0a 2a 2a 0a 2a 2a 20 69 74 20 6d 61 79 20  0;.**.** it may 
06b0: 62 65 20 6d 6f 72 65 20 65 66 66 69 63 69 65 6e  be more efficien
06c0: 74 20 74 6f 20 61 64 64 20 6a 75 73 74 20 74 68  t to add just th
06d0: 65 20 22 61 22 20 76 61 6c 75 65 73 20 74 6f 20  e "a" values to 
06e0: 74 68 65 20 73 6f 72 74 65 72 2c 20 61 6e 64 0a  the sorter, and.
06f0: 2a 2a 20 72 65 74 72 69 65 76 65 20 74 68 65 20  ** retrieve the 
0700: 61 73 73 6f 63 69 61 74 65 64 20 22 62 69 67 62  associated "bigb
0710: 6c 6f 62 22 20 76 61 6c 75 65 73 20 64 69 72 65  lob" values dire
0720: 63 74 6c 79 20 66 72 6f 6d 20 74 61 62 6c 65 20  ctly from table 
0730: 74 31 20 61 73 20 74 68 65 0a 2a 2a 20 31 30 20  t1 as the.** 10 
0740: 73 6d 61 6c 6c 65 73 74 20 22 61 22 20 76 61 6c  smallest "a" val
0750: 75 65 73 20 61 72 65 20 65 78 74 72 61 63 74 65  ues are extracte
0760: 64 20 66 72 6f 6d 20 74 68 65 20 73 6f 72 74 65  d from the sorte
0770: 72 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68  r..**.** When th
0780: 65 20 73 6f 72 74 65 72 2d 72 65 66 65 72 65 6e  e sorter-referen
0790: 63 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20  ce optimization 
07a0: 69 73 20 75 73 65 64 2c 20 74 68 65 72 65 20 69  is used, there i
07b0: 73 20 6f 6e 65 20 65 6e 74 72 79 20 69 6e 20 74  s one entry in t
07c0: 68 65 0a 2a 2a 20 61 44 65 66 65 72 5b 5d 20 61  he.** aDefer[] a
07d0: 72 72 61 79 20 66 6f 72 20 65 61 63 68 20 64 61  rray for each da
07e0: 74 61 62 61 73 65 20 74 61 62 6c 65 20 74 68 61  tabase table tha
07f0: 74 20 6d 61 79 20 62 65 20 72 65 61 64 20 61 73  t may be read as
0800: 20 76 61 6c 75 65 73 20 61 72 65 0a 2a 2a 20 65   values are.** e
0810: 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20 74 68  xtracted from th
0820: 65 20 73 6f 72 74 65 72 2e 0a 2a 2f 0a 74 79 70  e sorter..*/.typ
0830: 65 64 65 66 20 73 74 72 75 63 74 20 53 6f 72 74  edef struct Sort
0840: 43 74 78 20 53 6f 72 74 43 74 78 3b 0a 73 74 72  Ctx SortCtx;.str
0850: 75 63 74 20 53 6f 72 74 43 74 78 20 7b 0a 20 20  uct SortCtx {.  
0860: 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72  ExprList *pOrder
0870: 42 79 3b 20 20 20 2f 2a 20 54 68 65 20 4f 52 44  By;   /* The ORD
0880: 45 52 20 42 59 20 28 6f 72 20 47 52 4f 55 50 20  ER BY (or GROUP 
0890: 42 59 20 63 6c 61 75 73 65 29 20 2a 2f 0a 20 20  BY clause) */.  
08a0: 69 6e 74 20 6e 4f 42 53 61 74 3b 20 20 20 20 20  int nOBSat;     
08b0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
08c0: 6f 66 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d  of ORDER BY term
08d0: 73 20 73 61 74 69 73 66 69 65 64 20 62 79 20 69  s satisfied by i
08e0: 6e 64 69 63 65 73 20 2a 2f 0a 20 20 69 6e 74 20  ndices */.  int 
08f0: 69 45 43 75 72 73 6f 72 3b 20 20 20 20 20 20 20  iECursor;       
0900: 20 20 2f 2a 20 43 75 72 73 6f 72 20 6e 75 6d 62    /* Cursor numb
0910: 65 72 20 66 6f 72 20 74 68 65 20 73 6f 72 74 65  er for the sorte
0920: 72 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 52 65  r */.  int regRe
0930: 74 75 72 6e 3b 20 20 20 20 20 20 20 20 2f 2a 20  turn;        /* 
0940: 52 65 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67  Register holding
0950: 20 62 6c 6f 63 6b 2d 6f 75 74 70 75 74 20 72 65   block-output re
0960: 74 75 72 6e 20 61 64 64 72 65 73 73 20 2a 2f 0a  turn address */.
0970: 20 20 69 6e 74 20 6c 61 62 65 6c 42 6b 4f 75 74    int labelBkOut
0980: 3b 20 20 20 20 20 20 20 2f 2a 20 53 74 61 72 74  ;       /* Start
0990: 20 6c 61 62 65 6c 20 66 6f 72 20 74 68 65 20 62   label for the b
09a0: 6c 6f 63 6b 2d 6f 75 74 70 75 74 20 73 75 62 72  lock-output subr
09b0: 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20  outine */.  int 
09c0: 61 64 64 72 53 6f 72 74 49 6e 64 65 78 3b 20 20  addrSortIndex;  
09d0: 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20    /* Address of 
09e0: 74 68 65 20 4f 50 5f 53 6f 72 74 65 72 4f 70 65  the OP_SorterOpe
09f0: 6e 20 6f 72 20 4f 50 5f 4f 70 65 6e 45 70 68 65  n or OP_OpenEphe
0a00: 6d 65 72 61 6c 20 2a 2f 0a 20 20 69 6e 74 20 6c  meral */.  int l
0a10: 61 62 65 6c 44 6f 6e 65 3b 20 20 20 20 20 20 20  abelDone;       
0a20: 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 77 68   /* Jump here wh
0a30: 65 6e 20 64 6f 6e 65 2c 20 65 78 3a 20 4c 49 4d  en done, ex: LIM
0a40: 49 54 20 72 65 61 63 68 65 64 20 2a 2f 0a 20 20  IT reached */.  
0a50: 69 6e 74 20 6c 61 62 65 6c 4f 42 4c 6f 70 74 3b  int labelOBLopt;
0a60: 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65        /* Jump he
0a70: 72 65 20 77 68 65 6e 20 73 6f 72 74 65 72 20 69  re when sorter i
0a80: 73 20 66 75 6c 6c 20 2a 2f 0a 20 20 75 38 20 73  s full */.  u8 s
0a90: 6f 72 74 46 6c 61 67 73 3b 20 20 20 20 20 20 20  ortFlags;       
0aa0: 20 20 2f 2a 20 5a 65 72 6f 20 6f 72 20 6d 6f 72    /* Zero or mor
0ab0: 65 20 53 4f 52 54 46 4c 41 47 5f 2a 20 62 69 74  e SORTFLAG_* bit
0ac0: 73 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  s */.#ifdef SQLI
0ad0: 54 45 5f 45 4e 41 42 4c 45 5f 53 4f 52 54 45 52  TE_ENABLE_SORTER
0ae0: 5f 52 45 46 45 52 45 4e 43 45 53 0a 20 20 75 38  _REFERENCES.  u8
0af0: 20 6e 44 65 66 65 72 3b 20 20 20 20 20 20 20 20   nDefer;        
0b00: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
0b10: 20 76 61 6c 69 64 20 65 6e 74 72 69 65 73 20 69   valid entries i
0b20: 6e 20 61 44 65 66 65 72 5b 5d 20 2a 2f 0a 20 20  n aDefer[] */.  
0b30: 73 74 72 75 63 74 20 44 65 66 65 72 72 65 64 43  struct DeferredC
0b40: 73 72 20 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a  sr {.    Table *
0b50: 70 54 61 62 3b 20 20 20 20 20 20 20 20 2f 2a 20  pTab;        /* 
0b60: 54 61 62 6c 65 20 64 65 66 69 6e 69 74 69 6f 6e  Table definition
0b70: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 43 73 72   */.    int iCsr
0b80: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43  ;           /* C
0b90: 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 66 6f 72  ursor number for
0ba0: 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 69 6e   table */.    in
0bb0: 74 20 6e 4b 65 79 3b 20 20 20 20 20 20 20 20 20  t nKey;         
0bc0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 50    /* Number of P
0bd0: 4b 20 63 6f 6c 75 6d 6e 73 20 66 6f 72 20 74 61  K columns for ta
0be0: 62 6c 65 20 70 54 61 62 20 28 3e 3d 31 29 20 2a  ble pTab (>=1) *
0bf0: 2f 0a 20 20 7d 20 61 44 65 66 65 72 5b 34 5d 3b  /.  } aDefer[4];
0c00: 0a 23 65 6e 64 69 66 0a 20 20 73 74 72 75 63 74  .#endif.  struct
0c10: 20 52 6f 77 4c 6f 61 64 49 6e 66 6f 20 2a 70 44   RowLoadInfo *pD
0c20: 65 66 65 72 72 65 64 52 6f 77 4c 6f 61 64 3b 20  eferredRowLoad; 
0c30: 20 2f 2a 20 44 65 66 65 72 72 65 64 20 72 6f 77   /* Deferred row
0c40: 20 6c 6f 61 64 69 6e 67 20 69 6e 66 6f 20 6f 72   loading info or
0c50: 20 4e 55 4c 4c 20 2a 2f 0a 7d 3b 0a 23 64 65 66   NULL */.};.#def
0c60: 69 6e 65 20 53 4f 52 54 46 4c 41 47 5f 55 73 65  ine SORTFLAG_Use
0c70: 53 6f 72 74 65 72 20 20 30 78 30 31 20 20 20 2f  Sorter  0x01   /
0c80: 2a 20 55 73 65 20 53 6f 72 74 65 72 4f 70 65 6e  * Use SorterOpen
0c90: 20 69 6e 73 74 65 61 64 20 6f 66 20 4f 70 65 6e   instead of Open
0ca0: 45 70 68 65 6d 65 72 61 6c 20 2a 2f 0a 0a 2f 2a  Ephemeral */../*
0cb0: 0a 2a 2a 20 44 65 6c 65 74 65 20 61 6c 6c 20 74  .** Delete all t
0cc0: 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 20  he content of a 
0cd0: 53 65 6c 65 63 74 20 73 74 72 75 63 74 75 72 65  Select structure
0ce0: 2e 20 20 44 65 61 6c 6c 6f 63 61 74 65 20 74 68  .  Deallocate th
0cf0: 65 20 73 74 72 75 63 74 75 72 65 0a 2a 2a 20 69  e structure.** i
0d00: 74 73 65 6c 66 20 6f 6e 6c 79 20 69 66 20 62 46  tself only if bF
0d10: 72 65 65 20 69 73 20 74 72 75 65 2e 0a 2a 2f 0a  ree is true..*/.
0d20: 73 74 61 74 69 63 20 76 6f 69 64 20 63 6c 65 61  static void clea
0d30: 72 53 65 6c 65 63 74 28 73 71 6c 69 74 65 33 20  rSelect(sqlite3 
0d40: 2a 64 62 2c 20 53 65 6c 65 63 74 20 2a 70 2c 20  *db, Select *p, 
0d50: 69 6e 74 20 62 46 72 65 65 29 7b 0a 20 20 77 68  int bFree){.  wh
0d60: 69 6c 65 28 20 70 20 29 7b 0a 20 20 20 20 53 65  ile( p ){.    Se
0d70: 6c 65 63 74 20 2a 70 50 72 69 6f 72 20 3d 20 70  lect *pPrior = p
0d80: 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 73 71  ->pPrior;.    sq
0d90: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c  lite3ExprListDel
0da0: 65 74 65 28 64 62 2c 20 70 2d 3e 70 45 4c 69 73  ete(db, p->pELis
0db0: 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 53  t);.    sqlite3S
0dc0: 72 63 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c  rcListDelete(db,
0dd0: 20 70 2d 3e 70 53 72 63 29 3b 0a 20 20 20 20 73   p->pSrc);.    s
0de0: 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
0df0: 28 64 62 2c 20 70 2d 3e 70 57 68 65 72 65 29 3b  (db, p->pWhere);
0e00: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
0e10: 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70  ListDelete(db, p
0e20: 2d 3e 70 47 72 6f 75 70 42 79 29 3b 0a 20 20 20  ->pGroupBy);.   
0e30: 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
0e40: 74 65 28 64 62 2c 20 70 2d 3e 70 48 61 76 69 6e  te(db, p->pHavin
0e50: 67 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  g);.    sqlite3E
0e60: 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62  xprListDelete(db
0e70: 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79 29 3b 0a  , p->pOrderBy);.
0e80: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44      sqlite3ExprD
0e90: 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 4c 69  elete(db, p->pLi
0ea0: 6d 69 74 29 3b 0a 23 69 66 6e 64 65 66 20 53 51  mit);.#ifndef SQ
0eb0: 4c 49 54 45 5f 4f 4d 49 54 5f 57 49 4e 44 4f 57  LITE_OMIT_WINDOW
0ec0: 46 55 4e 43 0a 20 20 20 20 69 66 28 20 4f 4b 5f  FUNC.    if( OK_
0ed0: 49 46 5f 41 4c 57 41 59 53 5f 54 52 55 45 28 70  IF_ALWAYS_TRUE(p
0ee0: 2d 3e 70 57 69 6e 44 65 66 6e 29 20 29 7b 0a 20  ->pWinDefn) ){. 
0ef0: 20 20 20 20 20 73 71 6c 69 74 65 33 57 69 6e 64       sqlite3Wind
0f00: 6f 77 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c  owListDelete(db,
0f10: 20 70 2d 3e 70 57 69 6e 44 65 66 6e 29 3b 0a 20   p->pWinDefn);. 
0f20: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
0f30: 69 66 28 20 4f 4b 5f 49 46 5f 41 4c 57 41 59 53  if( OK_IF_ALWAYS
0f40: 5f 54 52 55 45 28 70 2d 3e 70 57 69 74 68 29 20  _TRUE(p->pWith) 
0f50: 29 20 73 71 6c 69 74 65 33 57 69 74 68 44 65 6c  ) sqlite3WithDel
0f60: 65 74 65 28 64 62 2c 20 70 2d 3e 70 57 69 74 68  ete(db, p->pWith
0f70: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
0f80: 2d 3e 70 57 69 6e 3d 3d 30 20 29 3b 0a 20 20 20  ->pWin==0 );.   
0f90: 20 69 66 28 20 62 46 72 65 65 20 29 20 73 71 6c   if( bFree ) sql
0fa0: 69 74 65 33 44 62 46 72 65 65 4e 4e 28 64 62 2c  ite3DbFreeNN(db,
0fb0: 20 70 29 3b 0a 20 20 20 20 70 20 3d 20 70 50 72   p);.    p = pPr
0fc0: 69 6f 72 3b 0a 20 20 20 20 62 46 72 65 65 20 3d  ior;.    bFree =
0fd0: 20 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a   1;.  }.}../*.**
0fe0: 20 49 6e 69 74 69 61 6c 69 7a 65 20 61 20 53 65   Initialize a Se
0ff0: 6c 65 63 74 44 65 73 74 20 73 74 72 75 63 74 75  lectDest structu
1000: 72 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  re..*/.void sqli
1010: 74 65 33 53 65 6c 65 63 74 44 65 73 74 49 6e 69  te3SelectDestIni
1020: 74 28 53 65 6c 65 63 74 44 65 73 74 20 2a 70 44  t(SelectDest *pD
1030: 65 73 74 2c 20 69 6e 74 20 65 44 65 73 74 2c 20  est, int eDest, 
1040: 69 6e 74 20 69 50 61 72 6d 29 7b 0a 20 20 70 44  int iParm){.  pD
1050: 65 73 74 2d 3e 65 44 65 73 74 20 3d 20 28 75 38  est->eDest = (u8
1060: 29 65 44 65 73 74 3b 0a 20 20 70 44 65 73 74 2d  )eDest;.  pDest-
1070: 3e 69 53 44 50 61 72 6d 20 3d 20 69 50 61 72 6d  >iSDParm = iParm
1080: 3b 0a 20 20 70 44 65 73 74 2d 3e 7a 41 66 66 53  ;.  pDest->zAffS
1090: 64 73 74 20 3d 20 30 3b 0a 20 20 70 44 65 73 74  dst = 0;.  pDest
10a0: 2d 3e 69 53 64 73 74 20 3d 20 30 3b 0a 20 20 70  ->iSdst = 0;.  p
10b0: 44 65 73 74 2d 3e 6e 53 64 73 74 20 3d 20 30 3b  Dest->nSdst = 0;
10c0: 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63  .}.../*.** Alloc
10d0: 61 74 65 20 61 20 6e 65 77 20 53 65 6c 65 63 74  ate a new Select
10e0: 20 73 74 72 75 63 74 75 72 65 20 61 6e 64 20 72   structure and r
10f0: 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
1100: 74 6f 20 74 68 61 74 0a 2a 2a 20 73 74 72 75 63  to that.** struc
1110: 74 75 72 65 2e 0a 2a 2f 0a 53 65 6c 65 63 74 20  ture..*/.Select 
1120: 2a 73 71 6c 69 74 65 33 53 65 6c 65 63 74 4e 65  *sqlite3SelectNe
1130: 77 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  w(.  Parse *pPar
1140: 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 61  se,        /* Pa
1150: 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
1160: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c  .  ExprList *pEL
1170: 69 73 74 2c 20 20 20 20 20 2f 2a 20 77 68 69 63  ist,     /* whic
1180: 68 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 69 6e 63  h columns to inc
1190: 6c 75 64 65 20 69 6e 20 74 68 65 20 72 65 73 75  lude in the resu
11a0: 6c 74 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20  lt */.  SrcList 
11b0: 2a 70 53 72 63 2c 20 20 20 20 20 20 20 20 2f 2a  *pSrc,        /*
11c0: 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
11d0: 20 2d 2d 20 77 68 69 63 68 20 74 61 62 6c 65 73   -- which tables
11e0: 20 74 6f 20 73 63 61 6e 20 2a 2f 0a 20 20 45 78   to scan */.  Ex
11f0: 70 72 20 2a 70 57 68 65 72 65 2c 20 20 20 20 20  pr *pWhere,     
1200: 20 20 20 20 2f 2a 20 74 68 65 20 57 48 45 52 45      /* the WHERE
1210: 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45 78 70   clause */.  Exp
1220: 72 4c 69 73 74 20 2a 70 47 72 6f 75 70 42 79 2c  rList *pGroupBy,
1230: 20 20 20 2f 2a 20 74 68 65 20 47 52 4f 55 50 20     /* the GROUP 
1240: 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45  BY clause */.  E
1250: 78 70 72 20 2a 70 48 61 76 69 6e 67 2c 20 20 20  xpr *pHaving,   
1260: 20 20 20 20 20 2f 2a 20 74 68 65 20 48 41 56 49       /* the HAVI
1270: 4e 47 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45  NG clause */.  E
1280: 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42  xprList *pOrderB
1290: 79 2c 20 20 20 2f 2a 20 74 68 65 20 4f 52 44 45  y,   /* the ORDE
12a0: 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20  R BY clause */. 
12b0: 20 75 33 32 20 73 65 6c 46 6c 61 67 73 2c 20 20   u32 selFlags,  
12c0: 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 20 70         /* Flag p
12d0: 61 72 61 6d 65 74 65 72 73 2c 20 73 75 63 68 20  arameters, such 
12e0: 61 73 20 53 46 5f 44 69 73 74 69 6e 63 74 20 2a  as SF_Distinct *
12f0: 2f 0a 20 20 45 78 70 72 20 2a 70 4c 69 6d 69 74  /.  Expr *pLimit
1300: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 49 4d            /* LIM
1310: 49 54 20 76 61 6c 75 65 2e 20 20 4e 55 4c 4c 20  IT value.  NULL 
1320: 6d 65 61 6e 73 20 6e 6f 74 20 75 73 65 64 20 2a  means not used *
1330: 2f 0a 29 7b 0a 20 20 53 65 6c 65 63 74 20 2a 70  /.){.  Select *p
1340: 4e 65 77 3b 0a 20 20 53 65 6c 65 63 74 20 73 74  New;.  Select st
1350: 61 6e 64 69 6e 3b 0a 20 20 70 4e 65 77 20 3d 20  andin;.  pNew = 
1360: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52  sqlite3DbMallocR
1370: 61 77 4e 4e 28 70 50 61 72 73 65 2d 3e 64 62 2c  awNN(pParse->db,
1380: 20 73 69 7a 65 6f 66 28 2a 70 4e 65 77 29 20 29   sizeof(*pNew) )
1390: 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20  ;.  if( pNew==0 
13a0: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
13b0: 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  Parse->db->mallo
13c0: 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 70  cFailed );.    p
13d0: 4e 65 77 20 3d 20 26 73 74 61 6e 64 69 6e 3b 0a  New = &standin;.
13e0: 20 20 7d 0a 20 20 69 66 28 20 70 45 4c 69 73 74    }.  if( pEList
13f0: 3d 3d 30 20 29 7b 0a 20 20 20 20 70 45 4c 69 73  ==0 ){.    pELis
1400: 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c  t = sqlite3ExprL
1410: 69 73 74 41 70 70 65 6e 64 28 70 50 61 72 73 65  istAppend(pParse
1420: 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20  , 0,.           
1430: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1440: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
1450: 78 70 72 28 70 50 61 72 73 65 2d 3e 64 62 2c 54  xpr(pParse->db,T
1460: 4b 5f 41 53 54 45 52 49 53 4b 2c 30 29 29 3b 0a  K_ASTERISK,0));.
1470: 20 20 7d 0a 20 20 70 4e 65 77 2d 3e 70 45 4c 69    }.  pNew->pELi
1480: 73 74 20 3d 20 70 45 4c 69 73 74 3b 0a 20 20 70  st = pEList;.  p
1490: 4e 65 77 2d 3e 6f 70 20 3d 20 54 4b 5f 53 45 4c  New->op = TK_SEL
14a0: 45 43 54 3b 0a 20 20 70 4e 65 77 2d 3e 73 65 6c  ECT;.  pNew->sel
14b0: 46 6c 61 67 73 20 3d 20 73 65 6c 46 6c 61 67 73  Flags = selFlags
14c0: 3b 0a 20 20 70 4e 65 77 2d 3e 69 4c 69 6d 69 74  ;.  pNew->iLimit
14d0: 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 69 4f   = 0;.  pNew->iO
14e0: 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 70 4e 65  ffset = 0;.  pNe
14f0: 77 2d 3e 73 65 6c 49 64 20 3d 20 2b 2b 70 50 61  w->selId = ++pPa
1500: 72 73 65 2d 3e 6e 53 65 6c 65 63 74 3b 0a 20 20  rse->nSelect;.  
1510: 70 4e 65 77 2d 3e 61 64 64 72 4f 70 65 6e 45 70  pNew->addrOpenEp
1520: 68 6d 5b 30 5d 20 3d 20 2d 31 3b 0a 20 20 70 4e  hm[0] = -1;.  pN
1530: 65 77 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d  ew->addrOpenEphm
1540: 5b 31 5d 20 3d 20 2d 31 3b 0a 20 20 70 4e 65 77  [1] = -1;.  pNew
1550: 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 30  ->nSelectRow = 0
1560: 3b 0a 20 20 69 66 28 20 70 53 72 63 3d 3d 30 20  ;.  if( pSrc==0 
1570: 29 20 70 53 72 63 20 3d 20 73 71 6c 69 74 65 33  ) pSrc = sqlite3
1580: 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 70 50 61  DbMallocZero(pPa
1590: 72 73 65 2d 3e 64 62 2c 20 73 69 7a 65 6f 66 28  rse->db, sizeof(
15a0: 2a 70 53 72 63 29 29 3b 0a 20 20 70 4e 65 77 2d  *pSrc));.  pNew-
15b0: 3e 70 53 72 63 20 3d 20 70 53 72 63 3b 0a 20 20  >pSrc = pSrc;.  
15c0: 70 4e 65 77 2d 3e 70 57 68 65 72 65 20 3d 20 70  pNew->pWhere = p
15d0: 57 68 65 72 65 3b 0a 20 20 70 4e 65 77 2d 3e 70  Where;.  pNew->p
15e0: 47 72 6f 75 70 42 79 20 3d 20 70 47 72 6f 75 70  GroupBy = pGroup
15f0: 42 79 3b 0a 20 20 70 4e 65 77 2d 3e 70 48 61 76  By;.  pNew->pHav
1600: 69 6e 67 20 3d 20 70 48 61 76 69 6e 67 3b 0a 20  ing = pHaving;. 
1610: 20 70 4e 65 77 2d 3e 70 4f 72 64 65 72 42 79 20   pNew->pOrderBy 
1620: 3d 20 70 4f 72 64 65 72 42 79 3b 0a 20 20 70 4e  = pOrderBy;.  pN
1630: 65 77 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a  ew->pPrior = 0;.
1640: 20 20 70 4e 65 77 2d 3e 70 4e 65 78 74 20 3d 20    pNew->pNext = 
1650: 30 3b 0a 20 20 70 4e 65 77 2d 3e 70 4c 69 6d 69  0;.  pNew->pLimi
1660: 74 20 3d 20 70 4c 69 6d 69 74 3b 0a 20 20 70 4e  t = pLimit;.  pN
1670: 65 77 2d 3e 70 57 69 74 68 20 3d 20 30 3b 0a 23  ew->pWith = 0;.#
1680: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1690: 49 54 5f 57 49 4e 44 4f 57 46 55 4e 43 0a 20 20  IT_WINDOWFUNC.  
16a0: 70 4e 65 77 2d 3e 70 57 69 6e 20 3d 20 30 3b 0a  pNew->pWin = 0;.
16b0: 20 20 70 4e 65 77 2d 3e 70 57 69 6e 44 65 66 6e    pNew->pWinDefn
16c0: 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20 69   = 0;.#endif.  i
16d0: 66 28 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d  f( pParse->db->m
16e0: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 7b 0a  allocFailed ) {.
16f0: 20 20 20 20 63 6c 65 61 72 53 65 6c 65 63 74 28      clearSelect(
1700: 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 4e 65 77  pParse->db, pNew
1710: 2c 20 70 4e 65 77 21 3d 26 73 74 61 6e 64 69 6e  , pNew!=&standin
1720: 29 3b 0a 20 20 20 20 70 4e 65 77 20 3d 20 30 3b  );.    pNew = 0;
1730: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73  .  }else{.    as
1740: 73 65 72 74 28 20 70 4e 65 77 2d 3e 70 53 72 63  sert( pNew->pSrc
1750: 21 3d 30 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e  !=0 || pParse->n
1760: 45 72 72 3e 30 20 29 3b 0a 20 20 7d 0a 20 20 61  Err>0 );.  }.  a
1770: 73 73 65 72 74 28 20 70 4e 65 77 21 3d 26 73 74  ssert( pNew!=&st
1780: 61 6e 64 69 6e 20 29 3b 0a 20 20 72 65 74 75 72  andin );.  retur
1790: 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  n pNew;.}.../*.*
17a0: 2a 20 44 65 6c 65 74 65 20 74 68 65 20 67 69 76  * Delete the giv
17b0: 65 6e 20 53 65 6c 65 63 74 20 73 74 72 75 63 74  en Select struct
17c0: 75 72 65 20 61 6e 64 20 61 6c 6c 20 6f 66 20 69  ure and all of i
17d0: 74 73 20 73 75 62 73 74 72 75 63 74 75 72 65 73  ts substructures
17e0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
17f0: 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 73 71  3SelectDelete(sq
1800: 6c 69 74 65 33 20 2a 64 62 2c 20 53 65 6c 65 63  lite3 *db, Selec
1810: 74 20 2a 70 29 7b 0a 20 20 69 66 28 20 4f 4b 5f  t *p){.  if( OK_
1820: 49 46 5f 41 4c 57 41 59 53 5f 54 52 55 45 28 70  IF_ALWAYS_TRUE(p
1830: 29 20 29 20 63 6c 65 61 72 53 65 6c 65 63 74 28  ) ) clearSelect(
1840: 64 62 2c 20 70 2c 20 31 29 3b 0a 7d 0a 0a 2f 2a  db, p, 1);.}../*
1850: 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69  .** Return a poi
1860: 6e 74 65 72 20 74 6f 20 74 68 65 20 72 69 67 68  nter to the righ
1870: 74 2d 6d 6f 73 74 20 53 45 4c 45 43 54 20 73 74  t-most SELECT st
1880: 61 74 65 6d 65 6e 74 20 69 6e 20 61 20 63 6f 6d  atement in a com
1890: 70 6f 75 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  pound..*/.static
18a0: 20 53 65 6c 65 63 74 20 2a 66 69 6e 64 52 69 67   Select *findRig
18b0: 68 74 6d 6f 73 74 28 53 65 6c 65 63 74 20 2a 70  htmost(Select *p
18c0: 29 7b 0a 20 20 77 68 69 6c 65 28 20 70 2d 3e 70  ){.  while( p->p
18d0: 4e 65 78 74 20 29 20 70 20 3d 20 70 2d 3e 70 4e  Next ) p = p->pN
18e0: 65 78 74 3b 0a 20 20 72 65 74 75 72 6e 20 70 3b  ext;.  return p;
18f0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20  .}../*.** Given 
1900: 31 20 74 6f 20 33 20 69 64 65 6e 74 69 66 69 65  1 to 3 identifie
1910: 72 73 20 70 72 65 63 65 64 69 6e 67 20 74 68 65  rs preceding the
1920: 20 4a 4f 49 4e 20 6b 65 79 77 6f 72 64 2c 20 64   JOIN keyword, d
1930: 65 74 65 72 6d 69 6e 65 20 74 68 65 0a 2a 2a 20  etermine the.** 
1940: 74 79 70 65 20 6f 66 20 6a 6f 69 6e 2e 20 20 52  type of join.  R
1950: 65 74 75 72 6e 20 61 6e 20 69 6e 74 65 67 65 72  eturn an integer
1960: 20 63 6f 6e 73 74 61 6e 74 20 74 68 61 74 20 65   constant that e
1970: 78 70 72 65 73 73 65 73 20 74 68 61 74 20 74 79  xpresses that ty
1980: 70 65 0a 2a 2a 20 69 6e 20 74 65 72 6d 73 20 6f  pe.** in terms o
1990: 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
19a0: 62 69 74 20 76 61 6c 75 65 73 3a 0a 2a 2a 0a 2a  bit values:.**.*
19b0: 2a 20 20 20 20 20 4a 54 5f 49 4e 4e 45 52 0a 2a  *     JT_INNER.*
19c0: 2a 20 20 20 20 20 4a 54 5f 43 52 4f 53 53 0a 2a  *     JT_CROSS.*
19d0: 2a 20 20 20 20 20 4a 54 5f 4f 55 54 45 52 0a 2a  *     JT_OUTER.*
19e0: 2a 20 20 20 20 20 4a 54 5f 4e 41 54 55 52 41 4c  *     JT_NATURAL
19f0: 0a 2a 2a 20 20 20 20 20 4a 54 5f 4c 45 46 54 0a  .**     JT_LEFT.
1a00: 2a 2a 20 20 20 20 20 4a 54 5f 52 49 47 48 54 0a  **     JT_RIGHT.
1a10: 2a 2a 0a 2a 2a 20 41 20 66 75 6c 6c 20 6f 75 74  **.** A full out
1a20: 65 72 20 6a 6f 69 6e 20 69 73 20 74 68 65 20 63  er join is the c
1a30: 6f 6d 62 69 6e 61 74 69 6f 6e 20 6f 66 20 4a 54  ombination of JT
1a40: 5f 4c 45 46 54 20 61 6e 64 20 4a 54 5f 52 49 47  _LEFT and JT_RIG
1a50: 48 54 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  HT..**.** If an 
1a60: 69 6c 6c 65 67 61 6c 20 6f 72 20 75 6e 73 75 70  illegal or unsup
1a70: 70 6f 72 74 65 64 20 6a 6f 69 6e 20 74 79 70 65  ported join type
1a80: 20 69 73 20 73 65 65 6e 2c 20 74 68 65 6e 20 73   is seen, then s
1a90: 74 69 6c 6c 20 72 65 74 75 72 6e 0a 2a 2a 20 61  till return.** a
1aa0: 20 6a 6f 69 6e 20 74 79 70 65 2c 20 62 75 74 20   join type, but 
1ab0: 70 75 74 20 61 6e 20 65 72 72 6f 72 20 69 6e 20  put an error in 
1ac0: 74 68 65 20 70 50 61 72 73 65 20 73 74 72 75 63  the pParse struc
1ad0: 74 75 72 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ture..*/.int sql
1ae0: 69 74 65 33 4a 6f 69 6e 54 79 70 65 28 50 61 72  ite3JoinType(Par
1af0: 73 65 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65  se *pParse, Toke
1b00: 6e 20 2a 70 41 2c 20 54 6f 6b 65 6e 20 2a 70 42  n *pA, Token *pB
1b10: 2c 20 54 6f 6b 65 6e 20 2a 70 43 29 7b 0a 20 20  , Token *pC){.  
1b20: 69 6e 74 20 6a 6f 69 6e 74 79 70 65 20 3d 20 30  int jointype = 0
1b30: 3b 0a 20 20 54 6f 6b 65 6e 20 2a 61 70 41 6c 6c  ;.  Token *apAll
1b40: 5b 33 5d 3b 0a 20 20 54 6f 6b 65 6e 20 2a 70 3b  [3];.  Token *p;
1b50: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1b60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1b70: 20 20 20 30 31 32 33 34 35 36 37 38 39 20 31 32     0123456789 12
1b80: 33 34 35 36 37 38 39 20 31 32 33 34 35 36 37 38  3456789 12345678
1b90: 39 20 31 32 33 20 2a 2f 0a 20 20 73 74 61 74 69  9 123 */.  stati
1ba0: 63 20 63 6f 6e 73 74 20 63 68 61 72 20 7a 4b 65  c const char zKe
1bb0: 79 54 65 78 74 5b 5d 20 3d 20 22 6e 61 74 75 72  yText[] = "natur
1bc0: 61 6c 65 66 74 6f 75 74 65 72 69 67 68 74 66 75  aleftouterightfu
1bd0: 6c 6c 69 6e 6e 65 72 63 72 6f 73 73 22 3b 0a 20  llinnercross";. 
1be0: 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 74   static const st
1bf0: 72 75 63 74 20 7b 0a 20 20 20 20 75 38 20 69 3b  ruct {.    u8 i;
1c00: 20 20 20 20 20 20 20 20 2f 2a 20 42 65 67 69 6e          /* Begin
1c10: 6e 69 6e 67 20 6f 66 20 6b 65 79 77 6f 72 64 20  ning of keyword 
1c20: 74 65 78 74 20 69 6e 20 7a 4b 65 79 54 65 78 74  text in zKeyText
1c30: 5b 5d 20 2a 2f 0a 20 20 20 20 75 38 20 6e 43 68  [] */.    u8 nCh
1c40: 61 72 3b 20 20 20 20 2f 2a 20 4c 65 6e 67 74 68  ar;    /* Length
1c50: 20 6f 66 20 74 68 65 20 6b 65 79 77 6f 72 64 20   of the keyword 
1c60: 69 6e 20 63 68 61 72 61 63 74 65 72 73 20 2a 2f  in characters */
1c70: 0a 20 20 20 20 75 38 20 63 6f 64 65 3b 20 20 20  .    u8 code;   
1c80: 20 20 2f 2a 20 4a 6f 69 6e 20 74 79 70 65 20 6d    /* Join type m
1c90: 61 73 6b 20 2a 2f 0a 20 20 7d 20 61 4b 65 79 77  ask */.  } aKeyw
1ca0: 6f 72 64 5b 5d 20 3d 20 7b 0a 20 20 20 20 2f 2a  ord[] = {.    /*
1cb0: 20 6e 61 74 75 72 61 6c 20 2a 2f 20 7b 20 30 2c   natural */ { 0,
1cc0: 20 20 37 2c 20 4a 54 5f 4e 41 54 55 52 41 4c 20    7, JT_NATURAL 
1cd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
1ce0: 2c 0a 20 20 20 20 2f 2a 20 6c 65 66 74 20 20 20  ,.    /* left   
1cf0: 20 2a 2f 20 7b 20 36 2c 20 20 34 2c 20 4a 54 5f   */ { 6,  4, JT_
1d00: 4c 45 46 54 7c 4a 54 5f 4f 55 54 45 52 20 20 20  LEFT|JT_OUTER   
1d10: 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 2f 2a         },.    /*
1d20: 20 6f 75 74 65 72 20 20 20 2a 2f 20 7b 20 31 30   outer   */ { 10
1d30: 2c 20 35 2c 20 4a 54 5f 4f 55 54 45 52 20 20 20  , 5, JT_OUTER   
1d40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
1d50: 2c 0a 20 20 20 20 2f 2a 20 72 69 67 68 74 20 20  ,.    /* right  
1d60: 20 2a 2f 20 7b 20 31 34 2c 20 35 2c 20 4a 54 5f   */ { 14, 5, JT_
1d70: 52 49 47 48 54 7c 4a 54 5f 4f 55 54 45 52 20 20  RIGHT|JT_OUTER  
1d80: 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 2f 2a         },.    /*
1d90: 20 66 75 6c 6c 20 20 20 20 2a 2f 20 7b 20 31 39   full    */ { 19
1da0: 2c 20 34 2c 20 4a 54 5f 4c 45 46 54 7c 4a 54 5f  , 4, JT_LEFT|JT_
1db0: 52 49 47 48 54 7c 4a 54 5f 4f 55 54 45 52 20 7d  RIGHT|JT_OUTER }
1dc0: 2c 0a 20 20 20 20 2f 2a 20 69 6e 6e 65 72 20 20  ,.    /* inner  
1dd0: 20 2a 2f 20 7b 20 32 33 2c 20 35 2c 20 4a 54 5f   */ { 23, 5, JT_
1de0: 49 4e 4e 45 52 20 20 20 20 20 20 20 20 20 20 20  INNER           
1df0: 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 2f 2a         },.    /*
1e00: 20 63 72 6f 73 73 20 20 20 2a 2f 20 7b 20 32 38   cross   */ { 28
1e10: 2c 20 35 2c 20 4a 54 5f 49 4e 4e 45 52 7c 4a 54  , 5, JT_INNER|JT
1e20: 5f 43 52 4f 53 53 20 20 20 20 20 20 20 20 20 7d  _CROSS         }
1e30: 2c 0a 20 20 7d 3b 0a 20 20 69 6e 74 20 69 2c 20  ,.  };.  int i, 
1e40: 6a 3b 0a 20 20 61 70 41 6c 6c 5b 30 5d 20 3d 20  j;.  apAll[0] = 
1e50: 70 41 3b 0a 20 20 61 70 41 6c 6c 5b 31 5d 20 3d  pA;.  apAll[1] =
1e60: 20 70 42 3b 0a 20 20 61 70 41 6c 6c 5b 32 5d 20   pB;.  apAll[2] 
1e70: 3d 20 70 43 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  = pC;.  for(i=0;
1e80: 20 69 3c 33 20 26 26 20 61 70 41 6c 6c 5b 69 5d   i<3 && apAll[i]
1e90: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 70 20 3d 20  ; i++){.    p = 
1ea0: 61 70 41 6c 6c 5b 69 5d 3b 0a 20 20 20 20 66 6f  apAll[i];.    fo
1eb0: 72 28 6a 3d 30 3b 20 6a 3c 41 72 72 61 79 53 69  r(j=0; j<ArraySi
1ec0: 7a 65 28 61 4b 65 79 77 6f 72 64 29 3b 20 6a 2b  ze(aKeyword); j+
1ed0: 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d  +){.      if( p-
1ee0: 3e 6e 3d 3d 61 4b 65 79 77 6f 72 64 5b 6a 5d 2e  >n==aKeyword[j].
1ef0: 6e 43 68 61 72 20 0a 20 20 20 20 20 20 20 20 20  nChar .         
1f00: 20 26 26 20 73 71 6c 69 74 65 33 53 74 72 4e 49   && sqlite3StrNI
1f10: 43 6d 70 28 28 63 68 61 72 2a 29 70 2d 3e 7a 2c  Cmp((char*)p->z,
1f20: 20 26 7a 4b 65 79 54 65 78 74 5b 61 4b 65 79 77   &zKeyText[aKeyw
1f30: 6f 72 64 5b 6a 5d 2e 69 5d 2c 20 70 2d 3e 6e 29  ord[j].i], p->n)
1f40: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 6a  ==0 ){.        j
1f50: 6f 69 6e 74 79 70 65 20 7c 3d 20 61 4b 65 79 77  ointype |= aKeyw
1f60: 6f 72 64 5b 6a 5d 2e 63 6f 64 65 3b 0a 20 20 20  ord[j].code;.   
1f70: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1f80: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 74 65    }.    }.    te
1f90: 73 74 63 61 73 65 28 20 6a 3d 3d 30 20 7c 7c 20  stcase( j==0 || 
1fa0: 6a 3d 3d 31 20 7c 7c 20 6a 3d 3d 32 20 7c 7c 20  j==1 || j==2 || 
1fb0: 6a 3d 3d 33 20 7c 7c 20 6a 3d 3d 34 20 7c 7c 20  j==3 || j==4 || 
1fc0: 6a 3d 3d 35 20 7c 7c 20 6a 3d 3d 36 20 29 3b 0a  j==5 || j==6 );.
1fd0: 20 20 20 20 69 66 28 20 6a 3e 3d 41 72 72 61 79      if( j>=Array
1fe0: 53 69 7a 65 28 61 4b 65 79 77 6f 72 64 29 20 29  Size(aKeyword) )
1ff0: 7b 0a 20 20 20 20 20 20 6a 6f 69 6e 74 79 70 65  {.      jointype
2000: 20 7c 3d 20 4a 54 5f 45 52 52 4f 52 3b 0a 20 20   |= JT_ERROR;.  
2010: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
2020: 0a 20 20 7d 0a 20 20 69 66 28 0a 20 20 20 20 20  .  }.  if(.     
2030: 28 6a 6f 69 6e 74 79 70 65 20 26 20 28 4a 54 5f  (jointype & (JT_
2040: 49 4e 4e 45 52 7c 4a 54 5f 4f 55 54 45 52 29 29  INNER|JT_OUTER))
2050: 3d 3d 28 4a 54 5f 49 4e 4e 45 52 7c 4a 54 5f 4f  ==(JT_INNER|JT_O
2060: 55 54 45 52 29 20 7c 7c 0a 20 20 20 20 20 28 6a  UTER) ||.     (j
2070: 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 45 52 52  ointype & JT_ERR
2080: 4f 52 29 21 3d 30 0a 20 20 29 7b 0a 20 20 20 20  OR)!=0.  ){.    
2090: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 70 20  const char *zSp 
20a0: 3d 20 22 20 22 3b 0a 20 20 20 20 61 73 73 65 72  = " ";.    asser
20b0: 74 28 20 70 42 21 3d 30 20 29 3b 0a 20 20 20 20  t( pB!=0 );.    
20c0: 69 66 28 20 70 43 3d 3d 30 20 29 7b 20 7a 53 70  if( pC==0 ){ zSp
20d0: 2b 2b 3b 20 7d 0a 20 20 20 20 73 71 6c 69 74 65  ++; }.    sqlite
20e0: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
20f0: 2c 20 22 75 6e 6b 6e 6f 77 6e 20 6f 72 20 75 6e  , "unknown or un
2100: 73 75 70 70 6f 72 74 65 64 20 6a 6f 69 6e 20 74  supported join t
2110: 79 70 65 3a 20 22 0a 20 20 20 20 20 20 20 22 25  ype: ".       "%
2120: 54 20 25 54 25 73 25 54 22 2c 20 70 41 2c 20 70  T %T%s%T", pA, p
2130: 42 2c 20 7a 53 70 2c 20 70 43 29 3b 0a 20 20 20  B, zSp, pC);.   
2140: 20 6a 6f 69 6e 74 79 70 65 20 3d 20 4a 54 5f 49   jointype = JT_I
2150: 4e 4e 45 52 3b 0a 20 20 7d 65 6c 73 65 20 69 66  NNER;.  }else if
2160: 28 20 28 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54  ( (jointype & JT
2170: 5f 4f 55 54 45 52 29 21 3d 30 20 0a 20 20 20 20  _OUTER)!=0 .    
2180: 20 20 20 20 20 26 26 20 28 6a 6f 69 6e 74 79 70       && (jointyp
2190: 65 20 26 20 28 4a 54 5f 4c 45 46 54 7c 4a 54 5f  e & (JT_LEFT|JT_
21a0: 52 49 47 48 54 29 29 21 3d 4a 54 5f 4c 45 46 54  RIGHT))!=JT_LEFT
21b0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
21c0: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
21d0: 0a 20 20 20 20 20 20 22 52 49 47 48 54 20 61 6e  .      "RIGHT an
21e0: 64 20 46 55 4c 4c 20 4f 55 54 45 52 20 4a 4f 49  d FULL OUTER JOI
21f0: 4e 73 20 61 72 65 20 6e 6f 74 20 63 75 72 72 65  Ns are not curre
2200: 6e 74 6c 79 20 73 75 70 70 6f 72 74 65 64 22 29  ntly supported")
2210: 3b 0a 20 20 20 20 6a 6f 69 6e 74 79 70 65 20 3d  ;.    jointype =
2220: 20 4a 54 5f 49 4e 4e 45 52 3b 0a 20 20 7d 0a 20   JT_INNER;.  }. 
2230: 20 72 65 74 75 72 6e 20 6a 6f 69 6e 74 79 70 65   return jointype
2240: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
2250: 6e 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 61  n the index of a
2260: 20 63 6f 6c 75 6d 6e 20 69 6e 20 61 20 74 61 62   column in a tab
2270: 6c 65 2e 20 20 52 65 74 75 72 6e 20 2d 31 20 69  le.  Return -1 i
2280: 66 20 74 68 65 20 63 6f 6c 75 6d 6e 0a 2a 2a 20  f the column.** 
2290: 69 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 65 64  is not contained
22a0: 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a   in the table..*
22b0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f 6c  /.static int col
22c0: 75 6d 6e 49 6e 64 65 78 28 54 61 62 6c 65 20 2a  umnIndex(Table *
22d0: 70 54 61 62 2c 20 63 6f 6e 73 74 20 63 68 61 72  pTab, const char
22e0: 20 2a 7a 43 6f 6c 29 7b 0a 20 20 69 6e 74 20 69   *zCol){.  int i
22f0: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
2300: 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b  Tab->nCol; i++){
2310: 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
2320: 53 74 72 49 43 6d 70 28 70 54 61 62 2d 3e 61 43  StrICmp(pTab->aC
2330: 6f 6c 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 7a 43 6f  ol[i].zName, zCo
2340: 6c 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 69  l)==0 ) return i
2350: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 2d  ;.  }.  return -
2360: 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 61 72  1;.}../*.** Sear
2370: 63 68 20 74 68 65 20 66 69 72 73 74 20 4e 20 74  ch the first N t
2380: 61 62 6c 65 73 20 69 6e 20 70 53 72 63 2c 20 66  ables in pSrc, f
2390: 72 6f 6d 20 6c 65 66 74 20 74 6f 20 72 69 67 68  rom left to righ
23a0: 74 2c 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 61  t, looking for a
23b0: 0a 2a 2a 20 74 61 62 6c 65 20 74 68 61 74 20 68  .** table that h
23c0: 61 73 20 61 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65  as a column name
23d0: 64 20 7a 43 6f 6c 2e 20 20 0a 2a 2a 0a 2a 2a 20  d zCol.  .**.** 
23e0: 57 68 65 6e 20 66 6f 75 6e 64 2c 20 73 65 74 20  When found, set 
23f0: 2a 70 69 54 61 62 20 61 6e 64 20 2a 70 69 43 6f  *piTab and *piCo
2400: 6c 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20 69  l to the table i
2410: 6e 64 65 78 20 61 6e 64 20 63 6f 6c 75 6d 6e 20  ndex and column 
2420: 69 6e 64 65 78 0a 2a 2a 20 6f 66 20 74 68 65 20  index.** of the 
2430: 6d 61 74 63 68 69 6e 67 20 63 6f 6c 75 6d 6e 20  matching column 
2440: 61 6e 64 20 72 65 74 75 72 6e 20 54 52 55 45 2e  and return TRUE.
2450: 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 74 20 66 6f  .**.** If not fo
2460: 75 6e 64 2c 20 72 65 74 75 72 6e 20 46 41 4c 53  und, return FALS
2470: 45 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  E..*/.static int
2480: 20 74 61 62 6c 65 41 6e 64 43 6f 6c 75 6d 6e 49   tableAndColumnI
2490: 6e 64 65 78 28 0a 20 20 53 72 63 4c 69 73 74 20  ndex(.  SrcList 
24a0: 2a 70 53 72 63 2c 20 20 20 20 20 20 20 2f 2a 20  *pSrc,       /* 
24b0: 41 72 72 61 79 20 6f 66 20 74 61 62 6c 65 73 20  Array of tables 
24c0: 74 6f 20 73 65 61 72 63 68 20 2a 2f 0a 20 20 69  to search */.  i
24d0: 6e 74 20 4e 2c 20 20 20 20 20 20 20 20 20 20 20  nt N,           
24e0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
24f0: 20 74 61 62 6c 65 73 20 69 6e 20 70 53 72 63 2d   tables in pSrc-
2500: 3e 61 5b 5d 20 74 6f 20 73 65 61 72 63 68 20 2a  >a[] to search *
2510: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
2520: 7a 43 6f 6c 2c 20 20 20 20 2f 2a 20 4e 61 6d 65  zCol,    /* Name
2530: 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 77   of the column w
2540: 65 20 61 72 65 20 6c 6f 6f 6b 69 6e 67 20 66 6f  e are looking fo
2550: 72 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 69 54 61  r */.  int *piTa
2560: 62 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57  b,          /* W
2570: 72 69 74 65 20 69 6e 64 65 78 20 6f 66 20 70 53  rite index of pS
2580: 72 63 2d 3e 61 5b 5d 20 68 65 72 65 20 2a 2f 0a  rc->a[] here */.
2590: 20 20 69 6e 74 20 2a 70 69 43 6f 6c 20 20 20 20    int *piCol    
25a0: 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20         /* Write 
25b0: 69 6e 64 65 78 20 6f 66 20 70 53 72 63 2d 3e 61  index of pSrc->a
25c0: 5b 2a 70 69 54 61 62 5d 2e 70 54 61 62 2d 3e 61  [*piTab].pTab->a
25d0: 43 6f 6c 5b 5d 20 68 65 72 65 20 2a 2f 0a 29 7b  Col[] here */.){
25e0: 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20  .  int i;       
25f0: 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c          /* For l
2600: 6f 6f 70 69 6e 67 20 6f 76 65 72 20 74 61 62 6c  ooping over tabl
2610: 65 73 20 69 6e 20 70 53 72 63 20 2a 2f 0a 20 20  es in pSrc */.  
2620: 69 6e 74 20 69 43 6f 6c 3b 20 20 20 20 20 20 20  int iCol;       
2630: 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66       /* Index of
2640: 20 63 6f 6c 75 6d 6e 20 6d 61 74 63 68 69 6e 67   column matching
2650: 20 7a 43 6f 6c 20 2a 2f 0a 0a 20 20 61 73 73 65   zCol */..  asse
2660: 72 74 28 20 28 70 69 54 61 62 3d 3d 30 29 3d 3d  rt( (piTab==0)==
2670: 28 70 69 43 6f 6c 3d 3d 30 29 20 29 3b 20 20 2f  (piCol==0) );  /
2680: 2a 20 42 6f 74 68 20 6f 72 20 6e 65 69 74 68 65  * Both or neithe
2690: 72 20 61 72 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20  r are NULL */.  
26a0: 66 6f 72 28 69 3d 30 3b 20 69 3c 4e 3b 20 69 2b  for(i=0; i<N; i+
26b0: 2b 29 7b 0a 20 20 20 20 69 43 6f 6c 20 3d 20 63  +){.    iCol = c
26c0: 6f 6c 75 6d 6e 49 6e 64 65 78 28 70 53 72 63 2d  olumnIndex(pSrc-
26d0: 3e 61 5b 69 5d 2e 70 54 61 62 2c 20 7a 43 6f 6c  >a[i].pTab, zCol
26e0: 29 3b 0a 20 20 20 20 69 66 28 20 69 43 6f 6c 3e  );.    if( iCol>
26f0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  =0 ){.      if( 
2700: 70 69 54 61 62 20 29 7b 0a 20 20 20 20 20 20 20  piTab ){.       
2710: 20 2a 70 69 54 61 62 20 3d 20 69 3b 0a 20 20 20   *piTab = i;.   
2720: 20 20 20 20 20 2a 70 69 43 6f 6c 20 3d 20 69 43       *piCol = iC
2730: 6f 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ol;.      }.    
2740: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
2750: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  }.  }.  return 0
2760: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
2770: 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64  function is used
2780: 20 74 6f 20 61 64 64 20 74 65 72 6d 73 20 69 6d   to add terms im
2790: 70 6c 69 65 64 20 62 79 20 4a 4f 49 4e 20 73 79  plied by JOIN sy
27a0: 6e 74 61 78 20 74 6f 20 74 68 65 0a 2a 2a 20 57  ntax to the.** W
27b0: 48 45 52 45 20 63 6c 61 75 73 65 20 65 78 70 72  HERE clause expr
27c0: 65 73 73 69 6f 6e 20 6f 66 20 61 20 53 45 4c 45  ession of a SELE
27d0: 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 20 54 68  CT statement. Th
27e0: 65 20 6e 65 77 20 74 65 72 6d 2c 20 77 68 69 63  e new term, whic
27f0: 68 0a 2a 2a 20 69 73 20 41 4e 44 65 64 20 77 69  h.** is ANDed wi
2800: 74 68 20 74 68 65 20 65 78 69 73 74 69 6e 67 20  th the existing 
2810: 57 48 45 52 45 20 63 6c 61 75 73 65 2c 20 69 73  WHERE clause, is
2820: 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a 2a 2a   of the form:.**
2830: 0a 2a 2a 20 20 20 20 28 74 61 62 31 2e 63 6f 6c  .**    (tab1.col
2840: 31 20 3d 20 74 61 62 32 2e 63 6f 6c 32 29 0a 2a  1 = tab2.col2).*
2850: 2a 0a 2a 2a 20 77 68 65 72 65 20 74 61 62 31 20  *.** where tab1 
2860: 69 73 20 74 68 65 20 69 53 72 63 27 74 68 20 74  is the iSrc'th t
2870: 61 62 6c 65 20 69 6e 20 53 72 63 4c 69 73 74 20  able in SrcList 
2880: 70 53 72 63 20 61 6e 64 20 74 61 62 32 20 69 73  pSrc and tab2 is
2890: 20 74 68 65 20 0a 2a 2a 20 28 69 53 72 63 2b 31   the .** (iSrc+1
28a0: 29 27 74 68 2e 20 43 6f 6c 75 6d 6e 20 63 6f 6c  )'th. Column col
28b0: 31 20 69 73 20 63 6f 6c 75 6d 6e 20 69 43 6f 6c  1 is column iCol
28c0: 4c 65 66 74 20 6f 66 20 74 61 62 31 2c 20 61 6e  Left of tab1, an
28d0: 64 20 63 6f 6c 32 20 69 73 0a 2a 2a 20 63 6f 6c  d col2 is.** col
28e0: 75 6d 6e 20 69 43 6f 6c 52 69 67 68 74 20 6f 66  umn iColRight of
28f0: 20 74 61 62 32 2e 0a 2a 2f 0a 73 74 61 74 69 63   tab2..*/.static
2900: 20 76 6f 69 64 20 61 64 64 57 68 65 72 65 54 65   void addWhereTe
2910: 72 6d 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  rm(.  Parse *pPa
2920: 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  rse,            
2930: 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
2940: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 72   context */.  Sr
2950: 63 4c 69 73 74 20 2a 70 53 72 63 2c 20 20 20 20  cList *pSrc,    
2960: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2970: 20 4c 69 73 74 20 6f 66 20 74 61 62 6c 65 73 20   List of tables 
2980: 69 6e 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a  in FROM clause *
2990: 2f 0a 20 20 69 6e 74 20 69 4c 65 66 74 2c 20 20  /.  int iLeft,  
29a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29b0: 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20      /* Index of 
29c0: 66 69 72 73 74 20 74 61 62 6c 65 20 74 6f 20 6a  first table to j
29d0: 6f 69 6e 20 69 6e 20 70 53 72 63 20 2a 2f 0a 20  oin in pSrc */. 
29e0: 20 69 6e 74 20 69 43 6f 6c 4c 65 66 74 2c 20 20   int iColLeft,  
29f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a00: 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 63 6f 6c   /* Index of col
2a10: 75 6d 6e 20 69 6e 20 66 69 72 73 74 20 74 61 62  umn in first tab
2a20: 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 52 69 67  le */.  int iRig
2a30: 68 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ht,             
2a40: 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
2a50: 20 6f 66 20 73 65 63 6f 6e 64 20 74 61 62 6c 65   of second table
2a60: 20 69 6e 20 70 53 72 63 20 2a 2f 0a 20 20 69 6e   in pSrc */.  in
2a70: 74 20 69 43 6f 6c 52 69 67 68 74 2c 20 20 20 20  t iColRight,    
2a80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2a90: 20 49 6e 64 65 78 20 6f 66 20 63 6f 6c 75 6d 6e   Index of column
2aa0: 20 69 6e 20 73 65 63 6f 6e 64 20 74 61 62 6c 65   in second table
2ab0: 20 2a 2f 0a 20 20 69 6e 74 20 69 73 4f 75 74 65   */.  int isOute
2ac0: 72 4a 6f 69 6e 2c 20 20 20 20 20 20 20 20 20 20  rJoin,          
2ad0: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
2ae0: 20 74 68 69 73 20 69 73 20 61 6e 20 4f 55 54 45   this is an OUTE
2af0: 52 20 6a 6f 69 6e 20 2a 2f 0a 20 20 45 78 70 72  R join */.  Expr
2b00: 20 2a 2a 70 70 57 68 65 72 65 20 20 20 20 20 20   **ppWhere      
2b10: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
2b20: 4e 2f 4f 55 54 3a 20 54 68 65 20 57 48 45 52 45  N/OUT: The WHERE
2b30: 20 63 6c 61 75 73 65 20 74 6f 20 61 64 64 20 74   clause to add t
2b40: 6f 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65  o */.){.  sqlite
2b50: 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
2b60: 64 62 3b 0a 20 20 45 78 70 72 20 2a 70 45 31 3b  db;.  Expr *pE1;
2b70: 0a 20 20 45 78 70 72 20 2a 70 45 32 3b 0a 20 20  .  Expr *pE2;.  
2b80: 45 78 70 72 20 2a 70 45 71 3b 0a 0a 20 20 61 73  Expr *pEq;..  as
2b90: 73 65 72 74 28 20 69 4c 65 66 74 3c 69 52 69 67  sert( iLeft<iRig
2ba0: 68 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ht );.  assert( 
2bb0: 70 53 72 63 2d 3e 6e 53 72 63 3e 69 52 69 67 68  pSrc->nSrc>iRigh
2bc0: 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  t );.  assert( p
2bd0: 53 72 63 2d 3e 61 5b 69 4c 65 66 74 5d 2e 70 54  Src->a[iLeft].pT
2be0: 61 62 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ab );.  assert( 
2bf0: 70 53 72 63 2d 3e 61 5b 69 52 69 67 68 74 5d 2e  pSrc->a[iRight].
2c00: 70 54 61 62 20 29 3b 0a 0a 20 20 70 45 31 20 3d  pTab );..  pE1 =
2c10: 20 73 71 6c 69 74 65 33 43 72 65 61 74 65 43 6f   sqlite3CreateCo
2c20: 6c 75 6d 6e 45 78 70 72 28 64 62 2c 20 70 53 72  lumnExpr(db, pSr
2c30: 63 2c 20 69 4c 65 66 74 2c 20 69 43 6f 6c 4c 65  c, iLeft, iColLe
2c40: 66 74 29 3b 0a 20 20 70 45 32 20 3d 20 73 71 6c  ft);.  pE2 = sql
2c50: 69 74 65 33 43 72 65 61 74 65 43 6f 6c 75 6d 6e  ite3CreateColumn
2c60: 45 78 70 72 28 64 62 2c 20 70 53 72 63 2c 20 69  Expr(db, pSrc, i
2c70: 52 69 67 68 74 2c 20 69 43 6f 6c 52 69 67 68 74  Right, iColRight
2c80: 29 3b 0a 0a 20 20 70 45 71 20 3d 20 73 71 6c 69  );..  pEq = sqli
2c90: 74 65 33 50 45 78 70 72 28 70 50 61 72 73 65 2c  te3PExpr(pParse,
2ca0: 20 54 4b 5f 45 51 2c 20 70 45 31 2c 20 70 45 32   TK_EQ, pE1, pE2
2cb0: 29 3b 0a 20 20 69 66 28 20 70 45 71 20 26 26 20  );.  if( pEq && 
2cc0: 69 73 4f 75 74 65 72 4a 6f 69 6e 20 29 7b 0a 20  isOuterJoin ){. 
2cd0: 20 20 20 45 78 70 72 53 65 74 50 72 6f 70 65 72     ExprSetProper
2ce0: 74 79 28 70 45 71 2c 20 45 50 5f 46 72 6f 6d 4a  ty(pEq, EP_FromJ
2cf0: 6f 69 6e 29 3b 0a 20 20 20 20 61 73 73 65 72 74  oin);.    assert
2d00: 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
2d10: 74 79 28 70 45 71 2c 20 45 50 5f 54 6f 6b 65 6e  ty(pEq, EP_Token
2d20: 4f 6e 6c 79 7c 45 50 5f 52 65 64 75 63 65 64 29  Only|EP_Reduced)
2d30: 20 29 3b 0a 20 20 20 20 45 78 70 72 53 65 74 56   );.    ExprSetV
2d40: 56 41 50 72 6f 70 65 72 74 79 28 70 45 71 2c 20  VAProperty(pEq, 
2d50: 45 50 5f 4e 6f 52 65 64 75 63 65 29 3b 0a 20 20  EP_NoReduce);.  
2d60: 20 20 70 45 71 2d 3e 69 52 69 67 68 74 4a 6f 69    pEq->iRightJoi
2d70: 6e 54 61 62 6c 65 20 3d 20 28 69 31 36 29 70 45  nTable = (i16)pE
2d80: 32 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 7d 0a 20  2->iTable;.  }. 
2d90: 20 2a 70 70 57 68 65 72 65 20 3d 20 73 71 6c 69   *ppWhere = sqli
2da0: 74 65 33 45 78 70 72 41 6e 64 28 70 50 61 72 73  te3ExprAnd(pPars
2db0: 65 2c 20 2a 70 70 57 68 65 72 65 2c 20 70 45 71  e, *ppWhere, pEq
2dc0: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20  );.}../*.** Set 
2dd0: 74 68 65 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 20  the EP_FromJoin 
2de0: 70 72 6f 70 65 72 74 79 20 6f 6e 20 61 6c 6c 20  property on all 
2df0: 74 65 72 6d 73 20 6f 66 20 74 68 65 20 67 69 76  terms of the giv
2e00: 65 6e 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a  en expression..*
2e10: 2a 20 41 6e 64 20 73 65 74 20 74 68 65 20 45 78  * And set the Ex
2e20: 70 72 2e 69 52 69 67 68 74 4a 6f 69 6e 54 61 62  pr.iRightJoinTab
2e30: 6c 65 20 74 6f 20 69 54 61 62 6c 65 20 66 6f 72  le to iTable for
2e40: 20 65 76 65 72 79 20 74 65 72 6d 20 69 6e 20 74   every term in t
2e50: 68 65 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e  he.** expression
2e60: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 45 50 5f 46  ..**.** The EP_F
2e70: 72 6f 6d 4a 6f 69 6e 20 70 72 6f 70 65 72 74 79  romJoin property
2e80: 20 69 73 20 75 73 65 64 20 6f 6e 20 74 65 72 6d   is used on term
2e90: 73 20 6f 66 20 61 6e 20 65 78 70 72 65 73 73 69  s of an expressi
2ea0: 6f 6e 20 74 6f 20 74 65 6c 6c 0a 2a 2a 20 74 68  on to tell.** th
2eb0: 65 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49  e LEFT OUTER JOI
2ec0: 4e 20 70 72 6f 63 65 73 73 69 6e 67 20 6c 6f 67  N processing log
2ed0: 69 63 20 74 68 61 74 20 74 68 69 73 20 74 65 72  ic that this ter
2ee0: 6d 20 69 73 20 70 61 72 74 20 6f 66 20 74 68 65  m is part of the
2ef0: 0a 2a 2a 20 6a 6f 69 6e 20 72 65 73 74 72 69 63  .** join restric
2f00: 74 69 6f 6e 20 73 70 65 63 69 66 69 65 64 20 69  tion specified i
2f10: 6e 20 74 68 65 20 4f 4e 20 6f 72 20 55 53 49 4e  n the ON or USIN
2f20: 47 20 63 6c 61 75 73 65 20 61 6e 64 20 6e 6f 74  G clause and not
2f30: 20 61 20 70 61 72 74 0a 2a 2a 20 6f 66 20 74 68   a part.** of th
2f40: 65 20 6d 6f 72 65 20 67 65 6e 65 72 61 6c 20 57  e more general W
2f50: 48 45 52 45 20 63 6c 61 75 73 65 2e 20 20 54 68  HERE clause.  Th
2f60: 65 73 65 20 74 65 72 6d 73 20 61 72 65 20 6d 6f  ese terms are mo
2f70: 76 65 64 20 6f 76 65 72 20 74 6f 20 74 68 65 0a  ved over to the.
2f80: 2a 2a 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  ** WHERE clause 
2f90: 64 75 72 69 6e 67 20 6a 6f 69 6e 20 70 72 6f 63  during join proc
2fa0: 65 73 73 69 6e 67 20 62 75 74 20 77 65 20 6e 65  essing but we ne
2fb0: 65 64 20 74 6f 20 72 65 6d 65 6d 62 65 72 20 74  ed to remember t
2fc0: 68 61 74 20 74 68 65 79 0a 2a 2a 20 6f 72 69 67  hat they.** orig
2fd0: 69 6e 61 74 65 64 20 69 6e 20 74 68 65 20 4f 4e  inated in the ON
2fe0: 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65   or USING clause
2ff0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 45 78 70 72  ..**.** The Expr
3000: 2e 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65  .iRightJoinTable
3010: 20 74 65 6c 6c 73 20 74 68 65 20 57 48 45 52 45   tells the WHERE
3020: 20 63 6c 61 75 73 65 20 70 72 6f 63 65 73 73 69   clause processi
3030: 6e 67 20 74 68 61 74 20 74 68 65 0a 2a 2a 20 65  ng that the.** e
3040: 78 70 72 65 73 73 69 6f 6e 20 64 65 70 65 6e 64  xpression depend
3050: 73 20 6f 6e 20 74 61 62 6c 65 20 69 52 69 67 68  s on table iRigh
3060: 74 4a 6f 69 6e 54 61 62 6c 65 20 65 76 65 6e 20  tJoinTable even 
3070: 69 66 20 74 68 61 74 20 74 61 62 6c 65 20 69 73  if that table is
3080: 20 6e 6f 74 0a 2a 2a 20 65 78 70 6c 69 63 69 74   not.** explicit
3090: 6c 79 20 6d 65 6e 74 69 6f 6e 65 64 20 69 6e 20  ly mentioned in 
30a0: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 2e 20  the expression. 
30b0: 20 54 68 61 74 20 69 6e 66 6f 72 6d 61 74 69 6f   That informatio
30c0: 6e 20 69 73 20 6e 65 65 64 65 64 0a 2a 2a 20 66  n is needed.** f
30d0: 6f 72 20 63 61 73 65 73 20 6c 69 6b 65 20 74 68  or cases like th
30e0: 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 53 45 4c  is:.**.**    SEL
30f0: 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 4c 45  ECT * FROM t1 LE
3100: 46 54 20 4a 4f 49 4e 20 74 32 20 4f 4e 20 74 31  FT JOIN t2 ON t1
3110: 2e 61 3d 74 32 2e 62 20 41 4e 44 20 74 31 2e 78  .a=t2.b AND t1.x
3120: 3d 35 0a 2a 2a 0a 2a 2a 20 54 68 65 20 77 68 65  =5.**.** The whe
3130: 72 65 20 63 6c 61 75 73 65 20 6e 65 65 64 73 20  re clause needs 
3140: 74 6f 20 64 65 66 65 72 20 74 68 65 20 68 61 6e  to defer the han
3150: 64 6c 69 6e 67 20 6f 66 20 74 68 65 20 74 31 2e  dling of the t1.
3160: 78 3d 35 0a 2a 2a 20 74 65 72 6d 20 75 6e 74 69  x=5.** term unti
3170: 6c 20 61 66 74 65 72 20 74 68 65 20 74 32 20 6c  l after the t2 l
3180: 6f 6f 70 20 6f 66 20 74 68 65 20 6a 6f 69 6e 2e  oop of the join.
3190: 20 20 49 6e 20 74 68 61 74 20 77 61 79 2c 20 61    In that way, a
31a0: 0a 2a 2a 20 4e 55 4c 4c 20 74 32 20 72 6f 77 20  .** NULL t2 row 
31b0: 77 69 6c 6c 20 62 65 20 69 6e 73 65 72 74 65 64  will be inserted
31c0: 20 77 68 65 6e 65 76 65 72 20 74 31 2e 78 21 3d   whenever t1.x!=
31d0: 35 2e 20 20 49 66 20 77 65 20 64 6f 20 6e 6f 74  5.  If we do not
31e0: 0a 2a 2a 20 64 65 66 65 72 20 74 68 65 20 68 61  .** defer the ha
31f0: 6e 64 6c 69 6e 67 20 6f 66 20 74 31 2e 78 3d 35  ndling of t1.x=5
3200: 2c 20 69 74 20 77 69 6c 6c 20 62 65 20 70 72 6f  , it will be pro
3210: 63 65 73 73 65 64 20 69 6d 6d 65 64 69 61 74 65  cessed immediate
3220: 6c 79 0a 2a 2a 20 61 66 74 65 72 20 74 68 65 20  ly.** after the 
3230: 74 31 20 6c 6f 6f 70 20 61 6e 64 20 72 6f 77 73  t1 loop and rows
3240: 20 77 69 74 68 20 74 31 2e 78 21 3d 35 20 77 69   with t1.x!=5 wi
3250: 6c 6c 20 6e 65 76 65 72 20 61 70 70 65 61 72 20  ll never appear 
3260: 69 6e 0a 2a 2a 20 74 68 65 20 6f 75 74 70 75 74  in.** the output
3270: 2c 20 77 68 69 63 68 20 69 73 20 69 6e 63 6f 72  , which is incor
3280: 72 65 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rect..*/.static 
3290: 76 6f 69 64 20 73 65 74 4a 6f 69 6e 45 78 70 72  void setJoinExpr
32a0: 28 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 69 54  (Expr *p, int iT
32b0: 61 62 6c 65 29 7b 0a 20 20 77 68 69 6c 65 28 20  able){.  while( 
32c0: 70 20 29 7b 0a 20 20 20 20 45 78 70 72 53 65 74  p ){.    ExprSet
32d0: 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 46  Property(p, EP_F
32e0: 72 6f 6d 4a 6f 69 6e 29 3b 0a 20 20 20 20 61 73  romJoin);.    as
32f0: 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72  sert( !ExprHasPr
3300: 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 54 6f 6b  operty(p, EP_Tok
3310: 65 6e 4f 6e 6c 79 7c 45 50 5f 52 65 64 75 63 65  enOnly|EP_Reduce
3320: 64 29 20 29 3b 0a 20 20 20 20 45 78 70 72 53 65  d) );.    ExprSe
3330: 74 56 56 41 50 72 6f 70 65 72 74 79 28 70 2c 20  tVVAProperty(p, 
3340: 45 50 5f 4e 6f 52 65 64 75 63 65 29 3b 0a 20 20  EP_NoReduce);.  
3350: 20 20 70 2d 3e 69 52 69 67 68 74 4a 6f 69 6e 54    p->iRightJoinT
3360: 61 62 6c 65 20 3d 20 28 69 31 36 29 69 54 61 62  able = (i16)iTab
3370: 6c 65 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6f  le;.    if( p->o
3380: 70 3d 3d 54 4b 5f 46 55 4e 43 54 49 4f 4e 20 26  p==TK_FUNCTION &
3390: 26 20 70 2d 3e 78 2e 70 4c 69 73 74 20 29 7b 0a  & p->x.pList ){.
33a0: 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20        int i;.   
33b0: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d     for(i=0; i<p-
33c0: 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b  >x.pList->nExpr;
33d0: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 73   i++){.        s
33e0: 65 74 4a 6f 69 6e 45 78 70 72 28 70 2d 3e 78 2e  etJoinExpr(p->x.
33f0: 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70  pList->a[i].pExp
3400: 72 2c 20 69 54 61 62 6c 65 29 3b 0a 20 20 20 20  r, iTable);.    
3410: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 65    }.    }.    se
3420: 74 4a 6f 69 6e 45 78 70 72 28 70 2d 3e 70 4c 65  tJoinExpr(p->pLe
3430: 66 74 2c 20 69 54 61 62 6c 65 29 3b 0a 20 20 20  ft, iTable);.   
3440: 20 70 20 3d 20 70 2d 3e 70 52 69 67 68 74 3b 0a   p = p->pRight;.
3450: 20 20 7d 20 0a 7d 0a 0a 2f 2a 20 55 6e 64 6f 20    } .}../* Undo 
3460: 74 68 65 20 77 6f 72 6b 20 6f 66 20 73 65 74 4a  the work of setJ
3470: 6f 69 6e 45 78 70 72 28 29 2e 20 20 49 6e 20 74  oinExpr().  In t
3480: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72  he expression tr
3490: 65 65 20 70 2c 20 63 6f 6e 76 65 72 74 20 65 76  ee p, convert ev
34a0: 65 72 79 0a 2a 2a 20 74 65 72 6d 20 74 68 61 74  ery.** term that
34b0: 20 69 73 20 6d 61 72 6b 65 64 20 77 69 74 68 20   is marked with 
34c0: 45 50 5f 46 72 6f 6d 4a 6f 69 6e 20 61 6e 64 20  EP_FromJoin and 
34d0: 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 3d  iRightJoinTable=
34e0: 3d 69 54 61 62 6c 65 20 69 6e 74 6f 0a 2a 2a 20  =iTable into.** 
34f0: 61 6e 20 6f 72 64 69 6e 61 72 79 20 74 65 72 6d  an ordinary term
3500: 20 74 68 61 74 20 6f 6d 69 74 73 20 74 68 65 20   that omits the 
3510: 45 50 5f 46 72 6f 6d 4a 6f 69 6e 20 6d 61 72 6b  EP_FromJoin mark
3520: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 68 61 70  ..**.** This hap
3530: 70 65 6e 73 20 77 68 65 6e 20 61 20 4c 45 46 54  pens when a LEFT
3540: 20 4a 4f 49 4e 20 69 73 20 73 69 6d 70 6c 69 66   JOIN is simplif
3550: 69 65 64 20 69 6e 74 6f 20 61 6e 20 6f 72 64 69  ied into an ordi
3560: 6e 61 72 79 20 4a 4f 49 4e 2e 0a 2a 2f 0a 73 74  nary JOIN..*/.st
3570: 61 74 69 63 20 76 6f 69 64 20 75 6e 73 65 74 4a  atic void unsetJ
3580: 6f 69 6e 45 78 70 72 28 45 78 70 72 20 2a 70 2c  oinExpr(Expr *p,
3590: 20 69 6e 74 20 69 54 61 62 6c 65 29 7b 0a 20 20   int iTable){.  
35a0: 77 68 69 6c 65 28 20 70 20 29 7b 0a 20 20 20 20  while( p ){.    
35b0: 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65  if( ExprHasPrope
35c0: 72 74 79 28 70 2c 20 45 50 5f 46 72 6f 6d 4a 6f  rty(p, EP_FromJo
35d0: 69 6e 29 0a 20 20 20 20 20 26 26 20 28 69 54 61  in).     && (iTa
35e0: 62 6c 65 3c 30 20 7c 7c 20 70 2d 3e 69 52 69 67  ble<0 || p->iRig
35f0: 68 74 4a 6f 69 6e 54 61 62 6c 65 3d 3d 69 54 61  htJoinTable==iTa
3600: 62 6c 65 29 20 29 7b 0a 20 20 20 20 20 20 45 78  ble) ){.      Ex
3610: 70 72 43 6c 65 61 72 50 72 6f 70 65 72 74 79 28  prClearProperty(
3620: 70 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 3b  p, EP_FromJoin);
3630: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
3640: 2d 3e 6f 70 3d 3d 54 4b 5f 46 55 4e 43 54 49 4f  ->op==TK_FUNCTIO
3650: 4e 20 26 26 20 70 2d 3e 78 2e 70 4c 69 73 74 20  N && p->x.pList 
3660: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a  ){.      int i;.
3670: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
3680: 3c 70 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78  <p->x.pList->nEx
3690: 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  pr; i++){.      
36a0: 20 20 75 6e 73 65 74 4a 6f 69 6e 45 78 70 72 28    unsetJoinExpr(
36b0: 70 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 69 5d  p->x.pList->a[i]
36c0: 2e 70 45 78 70 72 2c 20 69 54 61 62 6c 65 29 3b  .pExpr, iTable);
36d0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
36e0: 20 20 20 75 6e 73 65 74 4a 6f 69 6e 45 78 70 72     unsetJoinExpr
36f0: 28 70 2d 3e 70 4c 65 66 74 2c 20 69 54 61 62 6c  (p->pLeft, iTabl
3700: 65 29 3b 0a 20 20 20 20 70 20 3d 20 70 2d 3e 70  e);.    p = p->p
3710: 52 69 67 68 74 3b 0a 20 20 7d 20 0a 7d 0a 0a 2f  Right;.  } .}../
3720: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
3730: 65 20 70 72 6f 63 65 73 73 65 73 20 74 68 65 20  e processes the 
3740: 6a 6f 69 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  join information
3750: 20 66 6f 72 20 61 20 53 45 4c 45 43 54 20 73 74   for a SELECT st
3760: 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 4f 4e 20 61  atement..** ON a
3770: 6e 64 20 55 53 49 4e 47 20 63 6c 61 75 73 65 73  nd USING clauses
3780: 20 61 72 65 20 63 6f 6e 76 65 72 74 65 64 20 69   are converted i
3790: 6e 74 6f 20 65 78 74 72 61 20 74 65 72 6d 73 20  nto extra terms 
37a0: 6f 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  of the WHERE cla
37b0: 75 73 65 2e 0a 2a 2a 20 4e 41 54 55 52 41 4c 20  use..** NATURAL 
37c0: 6a 6f 69 6e 73 20 61 6c 73 6f 20 63 72 65 61 74  joins also creat
37d0: 65 20 65 78 74 72 61 20 57 48 45 52 45 20 63 6c  e extra WHERE cl
37e0: 61 75 73 65 20 74 65 72 6d 73 2e 0a 2a 2a 0a 2a  ause terms..**.*
37f0: 2a 20 54 68 65 20 74 65 72 6d 73 20 6f 66 20 61  * The terms of a
3800: 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 61 72 65   FROM clause are
3810: 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 74 68   contained in th
3820: 65 20 53 65 6c 65 63 74 2e 70 53 72 63 20 73 74  e Select.pSrc st
3830: 72 75 63 74 75 72 65 2e 0a 2a 2a 20 54 68 65 20  ructure..** The 
3840: 6c 65 66 74 20 6d 6f 73 74 20 74 61 62 6c 65 20  left most table 
3850: 69 73 20 74 68 65 20 66 69 72 73 74 20 65 6e 74  is the first ent
3860: 72 79 20 69 6e 20 53 65 6c 65 63 74 2e 70 53 72  ry in Select.pSr
3870: 63 2e 20 20 54 68 65 20 72 69 67 68 74 2d 6d 6f  c.  The right-mo
3880: 73 74 0a 2a 2a 20 74 61 62 6c 65 20 69 73 20 74  st.** table is t
3890: 68 65 20 6c 61 73 74 20 65 6e 74 72 79 2e 20 20  he last entry.  
38a0: 54 68 65 20 6a 6f 69 6e 20 6f 70 65 72 61 74 6f  The join operato
38b0: 72 20 69 73 20 68 65 6c 64 20 69 6e 20 74 68 65  r is held in the
38c0: 20 65 6e 74 72 79 20 74 6f 0a 2a 2a 20 74 68 65   entry to.** the
38d0: 20 6c 65 66 74 2e 20 20 54 68 75 73 20 65 6e 74   left.  Thus ent
38e0: 72 79 20 30 20 63 6f 6e 74 61 69 6e 73 20 74 68  ry 0 contains th
38f0: 65 20 6a 6f 69 6e 20 6f 70 65 72 61 74 6f 72 20  e join operator 
3900: 66 6f 72 20 74 68 65 20 6a 6f 69 6e 20 62 65 74  for the join bet
3910: 77 65 65 6e 0a 2a 2a 20 65 6e 74 72 69 65 73 20  ween.** entries 
3920: 30 20 61 6e 64 20 31 2e 20 20 41 6e 79 20 4f 4e  0 and 1.  Any ON
3930: 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65   or USING clause
3940: 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  s associated wit
3950: 68 20 74 68 65 20 6a 6f 69 6e 20 61 72 65 0a 2a  h the join are.*
3960: 2a 20 61 6c 73 6f 20 61 74 74 61 63 68 65 64 20  * also attached 
3970: 74 6f 20 74 68 65 20 6c 65 66 74 20 65 6e 74 72  to the left entr
3980: 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  y..**.** This ro
3990: 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 74 68  utine returns th
39a0: 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f  e number of erro
39b0: 72 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 2e 0a  rs encountered..
39c0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71  */.static int sq
39d0: 6c 69 74 65 50 72 6f 63 65 73 73 4a 6f 69 6e 28  liteProcessJoin(
39e0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53  Parse *pParse, S
39f0: 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 53 72 63  elect *p){.  Src
3a00: 4c 69 73 74 20 2a 70 53 72 63 3b 20 20 20 20 20  List *pSrc;     
3a10: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3a20: 41 6c 6c 20 74 61 62 6c 65 73 20 69 6e 20 74 68  All tables in th
3a30: 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f  e FROM clause */
3a40: 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 20 20 20 20  .  int i, j;    
3a50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3a60: 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
3a70: 65 72 73 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  ers */.  struct 
3a80: 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4c  SrcList_item *pL
3a90: 65 66 74 3b 20 20 20 20 20 2f 2a 20 4c 65 66 74  eft;     /* Left
3aa0: 20 74 61 62 6c 65 20 62 65 69 6e 67 20 6a 6f 69   table being joi
3ab0: 6e 65 64 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  ned */.  struct 
3ac0: 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 52  SrcList_item *pR
3ad0: 69 67 68 74 3b 20 20 20 20 2f 2a 20 52 69 67 68  ight;    /* Righ
3ae0: 74 20 74 61 62 6c 65 20 62 65 69 6e 67 20 6a 6f  t table being jo
3af0: 69 6e 65 64 20 2a 2f 0a 0a 20 20 70 53 72 63 20  ined */..  pSrc 
3b00: 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 70 4c 65  = p->pSrc;.  pLe
3b10: 66 74 20 3d 20 26 70 53 72 63 2d 3e 61 5b 30 5d  ft = &pSrc->a[0]
3b20: 3b 0a 20 20 70 52 69 67 68 74 20 3d 20 26 70 4c  ;.  pRight = &pL
3b30: 65 66 74 5b 31 5d 3b 0a 20 20 66 6f 72 28 69 3d  eft[1];.  for(i=
3b40: 30 3b 20 69 3c 70 53 72 63 2d 3e 6e 53 72 63 2d  0; i<pSrc->nSrc-
3b50: 31 3b 20 69 2b 2b 2c 20 70 52 69 67 68 74 2b 2b  1; i++, pRight++
3b60: 2c 20 70 4c 65 66 74 2b 2b 29 7b 0a 20 20 20 20  , pLeft++){.    
3b70: 54 61 62 6c 65 20 2a 70 52 69 67 68 74 54 61 62  Table *pRightTab
3b80: 20 3d 20 70 52 69 67 68 74 2d 3e 70 54 61 62 3b   = pRight->pTab;
3b90: 0a 20 20 20 20 69 6e 74 20 69 73 4f 75 74 65 72  .    int isOuter
3ba0: 3b 0a 0a 20 20 20 20 69 66 28 20 4e 45 56 45 52  ;..    if( NEVER
3bb0: 28 70 4c 65 66 74 2d 3e 70 54 61 62 3d 3d 30 20  (pLeft->pTab==0 
3bc0: 7c 7c 20 70 52 69 67 68 74 54 61 62 3d 3d 30 29  || pRightTab==0)
3bd0: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
3be0: 20 69 73 4f 75 74 65 72 20 3d 20 28 70 52 69 67   isOuter = (pRig
3bf0: 68 74 2d 3e 66 67 2e 6a 6f 69 6e 74 79 70 65 20  ht->fg.jointype 
3c00: 26 20 4a 54 5f 4f 55 54 45 52 29 21 3d 30 3b 0a  & JT_OUTER)!=0;.
3c10: 0a 20 20 20 20 2f 2a 20 57 68 65 6e 20 74 68 65  .    /* When the
3c20: 20 4e 41 54 55 52 41 4c 20 6b 65 79 77 6f 72 64   NATURAL keyword
3c30: 20 69 73 20 70 72 65 73 65 6e 74 2c 20 61 64 64   is present, add
3c40: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 65   WHERE clause te
3c50: 72 6d 73 20 66 6f 72 0a 20 20 20 20 2a 2a 20 65  rms for.    ** e
3c60: 76 65 72 79 20 63 6f 6c 75 6d 6e 20 74 68 61 74  very column that
3c70: 20 74 68 65 20 74 77 6f 20 74 61 62 6c 65 73 20   the two tables 
3c80: 68 61 76 65 20 69 6e 20 63 6f 6d 6d 6f 6e 2e 0a  have in common..
3c90: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
3ca0: 52 69 67 68 74 2d 3e 66 67 2e 6a 6f 69 6e 74 79  Right->fg.jointy
3cb0: 70 65 20 26 20 4a 54 5f 4e 41 54 55 52 41 4c 20  pe & JT_NATURAL 
3cc0: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 52 69  ){.      if( pRi
3cd0: 67 68 74 2d 3e 70 4f 6e 20 7c 7c 20 70 52 69 67  ght->pOn || pRig
3ce0: 68 74 2d 3e 70 55 73 69 6e 67 20 29 7b 0a 20 20  ht->pUsing ){.  
3cf0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
3d00: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 61  orMsg(pParse, "a
3d10: 20 4e 41 54 55 52 41 4c 20 6a 6f 69 6e 20 6d 61   NATURAL join ma
3d20: 79 20 6e 6f 74 20 68 61 76 65 20 22 0a 20 20 20  y not have ".   
3d30: 20 20 20 20 20 20 20 20 22 61 6e 20 4f 4e 20 6f          "an ON o
3d40: 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65 22 2c  r USING clause",
3d50: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74   0);.        ret
3d60: 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20  urn 1;.      }. 
3d70: 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c       for(j=0; j<
3d80: 70 52 69 67 68 74 54 61 62 2d 3e 6e 43 6f 6c 3b  pRightTab->nCol;
3d90: 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 63   j++){.        c
3da0: 68 61 72 20 2a 7a 4e 61 6d 65 3b 20 20 20 2f 2a  har *zName;   /*
3db0: 20 4e 61 6d 65 20 6f 66 20 63 6f 6c 75 6d 6e 20   Name of column 
3dc0: 69 6e 20 74 68 65 20 72 69 67 68 74 20 74 61 62  in the right tab
3dd0: 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e  le */.        in
3de0: 74 20 69 4c 65 66 74 3b 20 20 20 20 20 2f 2a 20  t iLeft;     /* 
3df0: 4d 61 74 63 68 69 6e 67 20 6c 65 66 74 20 74 61  Matching left ta
3e00: 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 69  ble */.        i
3e10: 6e 74 20 69 4c 65 66 74 43 6f 6c 3b 20 20 2f 2a  nt iLeftCol;  /*
3e20: 20 4d 61 74 63 68 69 6e 67 20 63 6f 6c 75 6d 6e   Matching column
3e30: 20 69 6e 20 74 68 65 20 6c 65 66 74 20 74 61 62   in the left tab
3e40: 6c 65 20 2a 2f 0a 0a 20 20 20 20 20 20 20 20 7a  le */..        z
3e50: 4e 61 6d 65 20 3d 20 70 52 69 67 68 74 54 61 62  Name = pRightTab
3e60: 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 3b  ->aCol[j].zName;
3e70: 0a 20 20 20 20 20 20 20 20 69 66 28 20 74 61 62  .        if( tab
3e80: 6c 65 41 6e 64 43 6f 6c 75 6d 6e 49 6e 64 65 78  leAndColumnIndex
3e90: 28 70 53 72 63 2c 20 69 2b 31 2c 20 7a 4e 61 6d  (pSrc, i+1, zNam
3ea0: 65 2c 20 26 69 4c 65 66 74 2c 20 26 69 4c 65 66  e, &iLeft, &iLef
3eb0: 74 43 6f 6c 29 20 29 7b 0a 20 20 20 20 20 20 20  tCol) ){.       
3ec0: 20 20 20 61 64 64 57 68 65 72 65 54 65 72 6d 28     addWhereTerm(
3ed0: 70 50 61 72 73 65 2c 20 70 53 72 63 2c 20 69 4c  pParse, pSrc, iL
3ee0: 65 66 74 2c 20 69 4c 65 66 74 43 6f 6c 2c 20 69  eft, iLeftCol, i
3ef0: 2b 31 2c 20 6a 2c 0a 20 20 20 20 20 20 20 20 20  +1, j,.         
3f00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 73                is
3f10: 4f 75 74 65 72 2c 20 26 70 2d 3e 70 57 68 65 72  Outer, &p->pWher
3f20: 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  e);.        }.  
3f30: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
3f40: 20 2f 2a 20 44 69 73 61 6c 6c 6f 77 20 62 6f 74   /* Disallow bot
3f50: 68 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20 63  h ON and USING c
3f60: 6c 61 75 73 65 73 20 69 6e 20 74 68 65 20 73 61  lauses in the sa
3f70: 6d 65 20 6a 6f 69 6e 0a 20 20 20 20 2a 2f 0a 20  me join.    */. 
3f80: 20 20 20 69 66 28 20 70 52 69 67 68 74 2d 3e 70     if( pRight->p
3f90: 4f 6e 20 26 26 20 70 52 69 67 68 74 2d 3e 70 55  On && pRight->pU
3fa0: 73 69 6e 67 20 29 7b 0a 20 20 20 20 20 20 73 71  sing ){.      sq
3fb0: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
3fc0: 61 72 73 65 2c 20 22 63 61 6e 6e 6f 74 20 68 61  arse, "cannot ha
3fd0: 76 65 20 62 6f 74 68 20 4f 4e 20 61 6e 64 20 55  ve both ON and U
3fe0: 53 49 4e 47 20 22 0a 20 20 20 20 20 20 20 20 22  SING ".        "
3ff0: 63 6c 61 75 73 65 73 20 69 6e 20 74 68 65 20 73  clauses in the s
4000: 61 6d 65 20 6a 6f 69 6e 22 29 3b 0a 20 20 20 20  ame join");.    
4010: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
4020: 7d 0a 0a 20 20 20 20 2f 2a 20 41 64 64 20 74 68  }..    /* Add th
4030: 65 20 4f 4e 20 63 6c 61 75 73 65 20 74 6f 20 74  e ON clause to t
4040: 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 57 48  he end of the WH
4050: 45 52 45 20 63 6c 61 75 73 65 2c 20 63 6f 6e 6e  ERE clause, conn
4060: 65 63 74 65 64 20 62 79 0a 20 20 20 20 2a 2a 20  ected by.    ** 
4070: 61 6e 20 41 4e 44 20 6f 70 65 72 61 74 6f 72 2e  an AND operator.
4080: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
4090: 70 52 69 67 68 74 2d 3e 70 4f 6e 20 29 7b 0a 20  pRight->pOn ){. 
40a0: 20 20 20 20 20 69 66 28 20 69 73 4f 75 74 65 72       if( isOuter
40b0: 20 29 20 73 65 74 4a 6f 69 6e 45 78 70 72 28 70   ) setJoinExpr(p
40c0: 52 69 67 68 74 2d 3e 70 4f 6e 2c 20 70 52 69 67  Right->pOn, pRig
40d0: 68 74 2d 3e 69 43 75 72 73 6f 72 29 3b 0a 20 20  ht->iCursor);.  
40e0: 20 20 20 20 70 2d 3e 70 57 68 65 72 65 20 3d 20      p->pWhere = 
40f0: 73 71 6c 69 74 65 33 45 78 70 72 41 6e 64 28 70  sqlite3ExprAnd(p
4100: 50 61 72 73 65 2c 20 70 2d 3e 70 57 68 65 72 65  Parse, p->pWhere
4110: 2c 20 70 52 69 67 68 74 2d 3e 70 4f 6e 29 3b 0a  , pRight->pOn);.
4120: 20 20 20 20 20 20 70 52 69 67 68 74 2d 3e 70 4f        pRight->pO
4130: 6e 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20  n = 0;.    }..  
4140: 20 20 2f 2a 20 43 72 65 61 74 65 20 65 78 74 72    /* Create extr
4150: 61 20 74 65 72 6d 73 20 6f 6e 20 74 68 65 20 57  a terms on the W
4160: 48 45 52 45 20 63 6c 61 75 73 65 20 66 6f 72 20  HERE clause for 
4170: 65 61 63 68 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65  each column name
4180: 64 0a 20 20 20 20 2a 2a 20 69 6e 20 74 68 65 20  d.    ** in the 
4190: 55 53 49 4e 47 20 63 6c 61 75 73 65 2e 20 20 45  USING clause.  E
41a0: 78 61 6d 70 6c 65 3a 20 49 66 20 74 68 65 20 74  xample: If the t
41b0: 77 6f 20 74 61 62 6c 65 73 20 74 6f 20 62 65 20  wo tables to be 
41c0: 6a 6f 69 6e 65 64 20 61 72 65 20 0a 20 20 20 20  joined are .    
41d0: 2a 2a 20 41 20 61 6e 64 20 42 20 61 6e 64 20 74  ** A and B and t
41e0: 68 65 20 55 53 49 4e 47 20 63 6c 61 75 73 65 20  he USING clause 
41f0: 6e 61 6d 65 73 20 58 2c 20 59 2c 20 61 6e 64 20  names X, Y, and 
4200: 5a 2c 20 74 68 65 6e 20 61 64 64 20 74 68 69 73  Z, then add this
4210: 0a 20 20 20 20 2a 2a 20 74 6f 20 74 68 65 20 57  .    ** to the W
4220: 48 45 52 45 20 63 6c 61 75 73 65 3a 20 20 20 20  HERE clause:    
4230: 41 2e 58 3d 42 2e 58 20 41 4e 44 20 41 2e 59 3d  A.X=B.X AND A.Y=
4240: 42 2e 59 20 41 4e 44 20 41 2e 5a 3d 42 2e 5a 0a  B.Y AND A.Z=B.Z.
4250: 20 20 20 20 2a 2a 20 52 65 70 6f 72 74 20 61 6e      ** Report an
4260: 20 65 72 72 6f 72 20 69 66 20 61 6e 79 20 63 6f   error if any co
4270: 6c 75 6d 6e 20 6d 65 6e 74 69 6f 6e 65 64 20 69  lumn mentioned i
4280: 6e 20 74 68 65 20 55 53 49 4e 47 20 63 6c 61 75  n the USING clau
4290: 73 65 20 69 73 0a 20 20 20 20 2a 2a 20 6e 6f 74  se is.    ** not
42a0: 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 62 6f   contained in bo
42b0: 74 68 20 74 61 62 6c 65 73 20 74 6f 20 62 65 20  th tables to be 
42c0: 6a 6f 69 6e 65 64 2e 0a 20 20 20 20 2a 2f 0a 20  joined..    */. 
42d0: 20 20 20 69 66 28 20 70 52 69 67 68 74 2d 3e 70     if( pRight->p
42e0: 55 73 69 6e 67 20 29 7b 0a 20 20 20 20 20 20 49  Using ){.      I
42f0: 64 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d 20 70  dList *pList = p
4300: 52 69 67 68 74 2d 3e 70 55 73 69 6e 67 3b 0a 20  Right->pUsing;. 
4310: 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c       for(j=0; j<
4320: 70 4c 69 73 74 2d 3e 6e 49 64 3b 20 6a 2b 2b 29  pList->nId; j++)
4330: 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a  {.        char *
4340: 7a 4e 61 6d 65 3b 20 20 20 20 20 2f 2a 20 4e 61  zName;     /* Na
4350: 6d 65 20 6f 66 20 74 68 65 20 74 65 72 6d 20 69  me of the term i
4360: 6e 20 74 68 65 20 55 53 49 4e 47 20 63 6c 61 75  n the USING clau
4370: 73 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e  se */.        in
4380: 74 20 69 4c 65 66 74 3b 20 20 20 20 20 20 20 2f  t iLeft;       /
4390: 2a 20 54 61 62 6c 65 20 6f 6e 20 74 68 65 20 6c  * Table on the l
43a0: 65 66 74 20 77 69 74 68 20 6d 61 74 63 68 69 6e  eft with matchin
43b0: 67 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 2a 2f  g column name */
43c0: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 4c 65  .        int iLe
43d0: 66 74 43 6f 6c 3b 20 20 20 20 2f 2a 20 43 6f 6c  ftCol;    /* Col
43e0: 75 6d 6e 20 6e 75 6d 62 65 72 20 6f 66 20 6d 61  umn number of ma
43f0: 74 63 68 69 6e 67 20 63 6f 6c 75 6d 6e 20 6f 6e  tching column on
4400: 20 74 68 65 20 6c 65 66 74 20 2a 2f 0a 20 20 20   the left */.   
4410: 20 20 20 20 20 69 6e 74 20 69 52 69 67 68 74 43       int iRightC
4420: 6f 6c 3b 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20  ol;   /* Column 
4430: 6e 75 6d 62 65 72 20 6f 66 20 6d 61 74 63 68 69  number of matchi
4440: 6e 67 20 63 6f 6c 75 6d 6e 20 6f 6e 20 74 68 65  ng column on the
4450: 20 72 69 67 68 74 20 2a 2f 0a 0a 20 20 20 20 20   right */..     
4460: 20 20 20 7a 4e 61 6d 65 20 3d 20 70 4c 69 73 74     zName = pList
4470: 2d 3e 61 5b 6a 5d 2e 7a 4e 61 6d 65 3b 0a 20 20  ->a[j].zName;.  
4480: 20 20 20 20 20 20 69 52 69 67 68 74 43 6f 6c 20        iRightCol 
4490: 3d 20 63 6f 6c 75 6d 6e 49 6e 64 65 78 28 70 52  = columnIndex(pR
44a0: 69 67 68 74 54 61 62 2c 20 7a 4e 61 6d 65 29 3b  ightTab, zName);
44b0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 52 69  .        if( iRi
44c0: 67 68 74 43 6f 6c 3c 30 0a 20 20 20 20 20 20 20  ghtCol<0.       
44d0: 20 20 7c 7c 20 21 74 61 62 6c 65 41 6e 64 43 6f    || !tableAndCo
44e0: 6c 75 6d 6e 49 6e 64 65 78 28 70 53 72 63 2c 20  lumnIndex(pSrc, 
44f0: 69 2b 31 2c 20 7a 4e 61 6d 65 2c 20 26 69 4c 65  i+1, zName, &iLe
4500: 66 74 2c 20 26 69 4c 65 66 74 43 6f 6c 29 0a 20  ft, &iLeftCol). 
4510: 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20         ){.      
4520: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
4530: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 63 61 6e  Msg(pParse, "can
4540: 6e 6f 74 20 6a 6f 69 6e 20 75 73 69 6e 67 20 63  not join using c
4550: 6f 6c 75 6d 6e 20 25 73 20 2d 20 63 6f 6c 75 6d  olumn %s - colum
4560: 6e 20 22 0a 20 20 20 20 20 20 20 20 20 20 20 20  n ".            
4570: 22 6e 6f 74 20 70 72 65 73 65 6e 74 20 69 6e 20  "not present in 
4580: 62 6f 74 68 20 74 61 62 6c 65 73 22 2c 20 7a 4e  both tables", zN
4590: 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ame);.          
45a0: 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20  return 1;.      
45b0: 20 20 7d 0a 20 20 20 20 20 20 20 20 61 64 64 57    }.        addW
45c0: 68 65 72 65 54 65 72 6d 28 70 50 61 72 73 65 2c  hereTerm(pParse,
45d0: 20 70 53 72 63 2c 20 69 4c 65 66 74 2c 20 69 4c   pSrc, iLeft, iL
45e0: 65 66 74 43 6f 6c 2c 20 69 2b 31 2c 20 69 52 69  eftCol, i+1, iRi
45f0: 67 68 74 43 6f 6c 2c 0a 20 20 20 20 20 20 20 20  ghtCol,.        
4600: 20 20 20 20 20 20 20 20 20 20 20 20 20 69 73 4f               isO
4610: 75 74 65 72 2c 20 26 70 2d 3e 70 57 68 65 72 65  uter, &p->pWhere
4620: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
4630: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
4640: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73  .}../*.** An ins
4650: 74 61 6e 63 65 20 6f 66 20 74 68 69 73 20 6f 62  tance of this ob
4660: 6a 65 63 74 20 68 6f 6c 64 73 20 69 6e 66 6f 72  ject holds infor
4670: 6d 61 74 69 6f 6e 20 28 62 65 79 6f 6e 64 20 70  mation (beyond p
4680: 50 61 72 73 65 20 61 6e 64 20 70 53 65 6c 65 63  Parse and pSelec
4690: 74 29 0a 2a 2a 20 6e 65 65 64 65 64 20 74 6f 20  t).** needed to 
46a0: 6c 6f 61 64 20 74 68 65 20 6e 65 78 74 20 72 65  load the next re
46b0: 73 75 6c 74 20 72 6f 77 20 74 68 61 74 20 69 73  sult row that is
46c0: 20 74 6f 20 62 65 20 61 64 64 65 64 20 74 6f 20   to be added to 
46d0: 74 68 65 20 73 6f 72 74 65 72 2e 0a 2a 2f 0a 74  the sorter..*/.t
46e0: 79 70 65 64 65 66 20 73 74 72 75 63 74 20 52 6f  ypedef struct Ro
46f0: 77 4c 6f 61 64 49 6e 66 6f 20 52 6f 77 4c 6f 61  wLoadInfo RowLoa
4700: 64 49 6e 66 6f 3b 0a 73 74 72 75 63 74 20 52 6f  dInfo;.struct Ro
4710: 77 4c 6f 61 64 49 6e 66 6f 20 7b 0a 20 20 69 6e  wLoadInfo {.  in
4720: 74 20 72 65 67 52 65 73 75 6c 74 3b 20 20 20 20  t regResult;    
4730: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74             /* St
4740: 6f 72 65 20 72 65 73 75 6c 74 73 20 69 6e 20 61  ore results in a
4750: 72 72 61 79 20 6f 66 20 72 65 67 69 73 74 65 72  rray of register
4760: 73 20 68 65 72 65 20 2a 2f 0a 20 20 75 38 20 65  s here */.  u8 e
4770: 63 65 6c 46 6c 61 67 73 3b 20 20 20 20 20 20 20  celFlags;       
4780: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67           /* Flag
4790: 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 45 78 70   argument to Exp
47a0: 72 43 6f 64 65 45 78 70 72 4c 69 73 74 28 29 20  rCodeExprList() 
47b0: 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
47c0: 5f 45 4e 41 42 4c 45 5f 53 4f 52 54 45 52 5f 52  _ENABLE_SORTER_R
47d0: 45 46 45 52 45 4e 43 45 53 0a 20 20 45 78 70 72  EFERENCES.  Expr
47e0: 4c 69 73 74 20 2a 70 45 78 74 72 61 3b 20 20 20  List *pExtra;   
47f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 74 72           /* Extr
4800: 61 20 63 6f 6c 75 6d 6e 73 20 6e 65 65 64 65 64  a columns needed
4810: 20 62 79 20 73 6f 72 74 65 72 20 72 65 66 73 20   by sorter refs 
4820: 2a 2f 0a 20 20 69 6e 74 20 72 65 67 45 78 74 72  */.  int regExtr
4830: 61 52 65 73 75 6c 74 3b 20 20 20 20 20 20 20 20  aResult;        
4840: 20 20 2f 2a 20 57 68 65 72 65 20 74 6f 20 6c 6f    /* Where to lo
4850: 61 64 20 74 68 65 20 65 78 74 72 61 20 63 6f 6c  ad the extra col
4860: 75 6d 6e 73 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d  umns */.#endif.}
4870: 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  ;../*.** This ro
4880: 75 74 69 6e 65 20 64 6f 65 73 20 74 68 65 20 77  utine does the w
4890: 6f 72 6b 20 6f 66 20 6c 6f 61 64 69 6e 67 20 71  ork of loading q
48a0: 75 65 72 79 20 64 61 74 61 20 69 6e 74 6f 20 61  uery data into a
48b0: 6e 20 61 72 72 61 79 20 6f 66 0a 2a 2a 20 72 65  n array of.** re
48c0: 67 69 73 74 65 72 73 20 73 6f 20 74 68 61 74 20  gisters so that 
48d0: 69 74 20 63 61 6e 20 62 65 20 61 64 64 65 64 20  it can be added 
48e0: 74 6f 20 74 68 65 20 73 6f 72 74 65 72 2e 0a 2a  to the sorter..*
48f0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 69 6e  /.static void in
4900: 6e 65 72 4c 6f 6f 70 4c 6f 61 64 52 6f 77 28 0a  nerLoopLoadRow(.
4910: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
4920: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
4930: 53 74 61 74 65 6d 65 6e 74 20 75 6e 64 65 72 20  Statement under 
4940: 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a  construction */.
4950: 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63    Select *pSelec
4960: 74 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  t,           /* 
4970: 54 68 65 20 71 75 65 72 79 20 62 65 69 6e 67 20  The query being 
4980: 63 6f 64 65 64 20 2a 2f 0a 20 20 52 6f 77 4c 6f  coded */.  RowLo
4990: 61 64 49 6e 66 6f 20 2a 70 49 6e 66 6f 20 20 20  adInfo *pInfo   
49a0: 20 20 20 20 20 20 2f 2a 20 49 6e 66 6f 20 6e 65        /* Info ne
49b0: 65 64 65 64 20 74 6f 20 63 6f 6d 70 6c 65 74 65  eded to complete
49c0: 20 74 68 65 20 72 6f 77 20 6c 6f 61 64 20 2a 2f   the row load */
49d0: 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 45 78 70  .){.  sqlite3Exp
49e0: 72 43 6f 64 65 45 78 70 72 4c 69 73 74 28 70 50  rCodeExprList(pP
49f0: 61 72 73 65 2c 20 70 53 65 6c 65 63 74 2d 3e 70  arse, pSelect->p
4a00: 45 4c 69 73 74 2c 20 70 49 6e 66 6f 2d 3e 72 65  EList, pInfo->re
4a10: 67 52 65 73 75 6c 74 2c 0a 20 20 20 20 20 20 20  gResult,.       
4a20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4a30: 20 20 20 30 2c 20 70 49 6e 66 6f 2d 3e 65 63 65     0, pInfo->ece
4a40: 6c 46 6c 61 67 73 29 3b 0a 23 69 66 64 65 66 20  lFlags);.#ifdef 
4a50: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 4f  SQLITE_ENABLE_SO
4a60: 52 54 45 52 5f 52 45 46 45 52 45 4e 43 45 53 0a  RTER_REFERENCES.
4a70: 20 20 69 66 28 20 70 49 6e 66 6f 2d 3e 70 45 78    if( pInfo->pEx
4a80: 74 72 61 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  tra ){.    sqlit
4a90: 65 33 45 78 70 72 43 6f 64 65 45 78 70 72 4c 69  e3ExprCodeExprLi
4aa0: 73 74 28 70 50 61 72 73 65 2c 20 70 49 6e 66 6f  st(pParse, pInfo
4ab0: 2d 3e 70 45 78 74 72 61 2c 20 70 49 6e 66 6f 2d  ->pExtra, pInfo-
4ac0: 3e 72 65 67 45 78 74 72 61 52 65 73 75 6c 74 2c  >regExtraResult,
4ad0: 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69   0, 0);.    sqli
4ae0: 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74  te3ExprListDelet
4af0: 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 49  e(pParse->db, pI
4b00: 6e 66 6f 2d 3e 70 45 78 74 72 61 29 3b 0a 20 20  nfo->pExtra);.  
4b10: 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a  }.#endif.}../*.*
4b20: 2a 20 43 6f 64 65 20 74 68 65 20 4f 50 5f 4d 61  * Code the OP_Ma
4b30: 6b 65 52 65 63 6f 72 64 20 69 6e 73 74 72 75 63  keRecord instruc
4b40: 74 69 6f 6e 20 74 68 61 74 20 67 65 6e 65 72 61  tion that genera
4b50: 74 65 73 20 74 68 65 20 65 6e 74 72 79 20 74 6f  tes the entry to
4b60: 20 62 65 0a 2a 2a 20 61 64 64 65 64 20 69 6e 74   be.** added int
4b70: 6f 20 74 68 65 20 73 6f 72 74 65 72 2e 0a 2a 2a  o the sorter..**
4b80: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 72  .** Return the r
4b90: 65 67 69 73 74 65 72 20 69 6e 20 77 68 69 63 68  egister in which
4ba0: 20 74 68 65 20 72 65 73 75 6c 74 20 69 73 20 73   the result is s
4bb0: 74 6f 72 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  tored..*/.static
4bc0: 20 69 6e 74 20 6d 61 6b 65 53 6f 72 74 65 72 52   int makeSorterR
4bd0: 65 63 6f 72 64 28 0a 20 20 50 61 72 73 65 20 2a  ecord(.  Parse *
4be0: 70 50 61 72 73 65 2c 0a 20 20 53 6f 72 74 43 74  pParse,.  SortCt
4bf0: 78 20 2a 70 53 6f 72 74 2c 0a 20 20 53 65 6c 65  x *pSort,.  Sele
4c00: 63 74 20 2a 70 53 65 6c 65 63 74 2c 0a 20 20 69  ct *pSelect,.  i
4c10: 6e 74 20 72 65 67 42 61 73 65 2c 0a 20 20 69 6e  nt regBase,.  in
4c20: 74 20 6e 42 61 73 65 0a 29 7b 0a 20 20 69 6e 74  t nBase.){.  int
4c30: 20 6e 4f 42 53 61 74 20 3d 20 70 53 6f 72 74 2d   nOBSat = pSort-
4c40: 3e 6e 4f 42 53 61 74 3b 0a 20 20 56 64 62 65 20  >nOBSat;.  Vdbe 
4c50: 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64  *v = pParse->pVd
4c60: 62 65 3b 0a 20 20 69 6e 74 20 72 65 67 4f 75 74  be;.  int regOut
4c70: 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
4c80: 6d 3b 0a 20 20 69 66 28 20 70 53 6f 72 74 2d 3e  m;.  if( pSort->
4c90: 70 44 65 66 65 72 72 65 64 52 6f 77 4c 6f 61 64  pDeferredRowLoad
4ca0: 20 29 7b 0a 20 20 20 20 69 6e 6e 65 72 4c 6f 6f   ){.    innerLoo
4cb0: 70 4c 6f 61 64 52 6f 77 28 70 50 61 72 73 65 2c  pLoadRow(pParse,
4cc0: 20 70 53 65 6c 65 63 74 2c 20 70 53 6f 72 74 2d   pSelect, pSort-
4cd0: 3e 70 44 65 66 65 72 72 65 64 52 6f 77 4c 6f 61  >pDeferredRowLoa
4ce0: 64 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  d);.  }.  sqlite
4cf0: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
4d00: 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 65  P_MakeRecord, re
4d10: 67 42 61 73 65 2b 6e 4f 42 53 61 74 2c 20 6e 42  gBase+nOBSat, nB
4d20: 61 73 65 2d 6e 4f 42 53 61 74 2c 20 72 65 67 4f  ase-nOBSat, regO
4d30: 75 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 65  ut);.  return re
4d40: 67 4f 75 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  gOut;.}../*.** G
4d50: 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61  enerate code tha
4d60: 74 20 77 69 6c 6c 20 70 75 73 68 20 74 68 65 20  t will push the 
4d70: 72 65 63 6f 72 64 20 69 6e 20 72 65 67 69 73 74  record in regist
4d80: 65 72 73 20 72 65 67 44 61 74 61 0a 2a 2a 20 74  ers regData.** t
4d90: 68 72 6f 75 67 68 20 72 65 67 44 61 74 61 2b 6e  hrough regData+n
4da0: 44 61 74 61 2d 31 20 6f 6e 74 6f 20 74 68 65 20  Data-1 onto the 
4db0: 73 6f 72 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69  sorter..*/.stati
4dc0: 63 20 76 6f 69 64 20 70 75 73 68 4f 6e 74 6f 53  c void pushOntoS
4dd0: 6f 72 74 65 72 28 0a 20 20 50 61 72 73 65 20 2a  orter(.  Parse *
4de0: 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20  pParse,         
4df0: 2f 2a 20 50 61 72 73 65 72 20 63 6f 6e 74 65 78  /* Parser contex
4e00: 74 20 2a 2f 0a 20 20 53 6f 72 74 43 74 78 20 2a  t */.  SortCtx *
4e10: 70 53 6f 72 74 2c 20 20 20 20 20 20 20 20 2f 2a  pSort,        /*
4e20: 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f   Information abo
4e30: 75 74 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  ut the ORDER BY 
4e40: 63 6c 61 75 73 65 20 2a 2f 0a 20 20 53 65 6c 65  clause */.  Sele
4e50: 63 74 20 2a 70 53 65 6c 65 63 74 2c 20 20 20 20  ct *pSelect,    
4e60: 20 20 20 2f 2a 20 54 68 65 20 77 68 6f 6c 65 20     /* The whole 
4e70: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
4e80: 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 44 61 74   */.  int regDat
4e90: 61 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  a,           /* 
4ea0: 46 69 72 73 74 20 72 65 67 69 73 74 65 72 20 68  First register h
4eb0: 6f 6c 64 69 6e 67 20 64 61 74 61 20 74 6f 20 62  olding data to b
4ec0: 65 20 73 6f 72 74 65 64 20 2a 2f 0a 20 20 69 6e  e sorted */.  in
4ed0: 74 20 72 65 67 4f 72 69 67 44 61 74 61 2c 20 20  t regOrigData,  
4ee0: 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 72 65       /* First re
4ef0: 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 64  gister holding d
4f00: 61 74 61 20 62 65 66 6f 72 65 20 70 61 63 6b 69  ata before packi
4f10: 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 6e 44 61 74  ng */.  int nDat
4f20: 61 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  a,             /
4f30: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d  * Number of elem
4f40: 65 6e 74 73 20 69 6e 20 74 68 65 20 72 65 67 44  ents in the regD
4f50: 61 74 61 20 64 61 74 61 20 61 72 72 61 79 20 2a  ata data array *
4f60: 2f 0a 20 20 69 6e 74 20 6e 50 72 65 66 69 78 52  /.  int nPrefixR
4f70: 65 67 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f  eg         /* No
4f80: 2e 20 6f 66 20 72 65 67 20 70 72 69 6f 72 20 74  . of reg prior t
4f90: 6f 20 72 65 67 44 61 74 61 20 61 76 61 69 6c 61  o regData availa
4fa0: 62 6c 65 20 66 6f 72 20 75 73 65 20 2a 2f 0a 29  ble for use */.)
4fb0: 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50  {.  Vdbe *v = pP
4fc0: 61 72 73 65 2d 3e 70 56 64 62 65 3b 20 20 20 20  arse->pVdbe;    
4fd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4fe0: 20 20 20 20 20 2f 2a 20 53 74 6d 74 20 75 6e 64       /* Stmt und
4ff0: 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20  er construction 
5000: 2a 2f 0a 20 20 69 6e 74 20 62 53 65 71 20 3d 20  */.  int bSeq = 
5010: 28 28 70 53 6f 72 74 2d 3e 73 6f 72 74 46 6c 61  ((pSort->sortFla
5020: 67 73 20 26 20 53 4f 52 54 46 4c 41 47 5f 55 73  gs & SORTFLAG_Us
5030: 65 53 6f 72 74 65 72 29 3d 3d 30 29 3b 0a 20 20  eSorter)==0);.  
5040: 69 6e 74 20 6e 45 78 70 72 20 3d 20 70 53 6f 72  int nExpr = pSor
5050: 74 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78  t->pOrderBy->nEx
5060: 70 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  pr;             
5070: 20 2f 2a 20 4e 6f 2e 20 6f 66 20 4f 52 44 45 52   /* No. of ORDER
5080: 20 42 59 20 74 65 72 6d 73 20 2a 2f 0a 20 20 69   BY terms */.  i
5090: 6e 74 20 6e 42 61 73 65 20 3d 20 6e 45 78 70 72  nt nBase = nExpr
50a0: 20 2b 20 62 53 65 71 20 2b 20 6e 44 61 74 61 3b   + bSeq + nData;
50b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
50c0: 2f 2a 20 46 69 65 6c 64 73 20 69 6e 20 73 6f 72  /* Fields in sor
50d0: 74 65 72 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20  ter record */.  
50e0: 69 6e 74 20 72 65 67 42 61 73 65 3b 20 20 20 20  int regBase;    
50f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5100: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5110: 20 2f 2a 20 52 65 67 73 20 66 6f 72 20 73 6f 72   /* Regs for sor
5120: 74 65 72 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20  ter record */.  
5130: 69 6e 74 20 72 65 67 52 65 63 6f 72 64 20 3d 20  int regRecord = 
5140: 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
5150: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5160: 20 2f 2a 20 41 73 73 65 6d 62 6c 65 64 20 73 6f   /* Assembled so
5170: 72 74 65 72 20 72 65 63 6f 72 64 20 2a 2f 0a 20  rter record */. 
5180: 20 69 6e 74 20 6e 4f 42 53 61 74 20 3d 20 70 53   int nOBSat = pS
5190: 6f 72 74 2d 3e 6e 4f 42 53 61 74 3b 20 20 20 20  ort->nOBSat;    
51a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
51b0: 20 20 2f 2a 20 4f 52 44 45 52 20 42 59 20 74 65    /* ORDER BY te
51c0: 72 6d 73 20 74 6f 20 73 6b 69 70 20 2a 2f 0a 20  rms to skip */. 
51d0: 20 69 6e 74 20 6f 70 3b 20 20 20 20 20 20 20 20   int op;        
51e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
51f0: 20 20 20 20 2f 2a 20 4f 70 63 6f 64 65 20 74 6f      /* Opcode to
5200: 20 61 64 64 20 73 6f 72 74 65 72 20 72 65 63 6f   add sorter reco
5210: 72 64 20 74 6f 20 73 6f 72 74 65 72 20 2a 2f 0a  rd to sorter */.
5220: 20 20 69 6e 74 20 69 4c 69 6d 69 74 3b 20 20 20    int iLimit;   
5230: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5240: 20 20 20 20 20 2f 2a 20 4c 49 4d 49 54 20 63 6f       /* LIMIT co
5250: 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 69  unter */.  int i
5260: 53 6b 69 70 20 3d 20 30 3b 20 20 20 20 20 20 20  Skip = 0;       
5270: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
5280: 20 45 6e 64 20 6f 66 20 74 68 65 20 73 6f 72 74   End of the sort
5290: 65 72 20 69 6e 73 65 72 74 20 6c 6f 6f 70 20 2a  er insert loop *
52a0: 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 62 53 65  /..  assert( bSe
52b0: 71 3d 3d 30 20 7c 7c 20 62 53 65 71 3d 3d 31 20  q==0 || bSeq==1 
52c0: 29 3b 0a 0a 20 20 2f 2a 20 54 68 72 65 65 20 63  );..  /* Three c
52d0: 61 73 65 73 3a 0a 20 20 2a 2a 20 20 20 28 31 29  ases:.  **   (1)
52e0: 20 54 68 65 20 64 61 74 61 20 74 6f 20 62 65 20   The data to be 
52f0: 73 6f 72 74 65 64 20 68 61 73 20 61 6c 72 65 61  sorted has alrea
5300: 64 79 20 62 65 65 6e 20 70 61 63 6b 65 64 20 69  dy been packed i
5310: 6e 74 6f 20 61 20 52 65 63 6f 72 64 0a 20 20 2a  nto a Record.  *
5320: 2a 20 20 20 20 20 20 20 62 79 20 61 20 70 72 69  *       by a pri
5330: 6f 72 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64  or OP_MakeRecord
5340: 2e 20 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  .  In this case 
5350: 6e 44 61 74 61 3d 3d 31 20 61 6e 64 20 72 65 67  nData==1 and reg
5360: 44 61 74 61 0a 20 20 2a 2a 20 20 20 20 20 20 20  Data.  **       
5370: 77 69 6c 6c 20 62 65 20 63 6f 6d 70 6c 65 74 65  will be complete
5380: 6c 79 20 75 6e 72 65 6c 61 74 65 64 20 74 6f 20  ly unrelated to 
5390: 72 65 67 4f 72 69 67 44 61 74 61 2e 0a 20 20 2a  regOrigData..  *
53a0: 2a 20 20 20 28 32 29 20 41 6c 6c 20 6f 75 74 70  *   (2) All outp
53b0: 75 74 20 63 6f 6c 75 6d 6e 73 20 61 72 65 20 69  ut columns are i
53c0: 6e 63 6c 75 64 65 64 20 69 6e 20 74 68 65 20 73  ncluded in the s
53d0: 6f 72 74 20 72 65 63 6f 72 64 2e 20 20 49 6e 20  ort record.  In 
53e0: 74 68 61 74 0a 20 20 2a 2a 20 20 20 20 20 20 20  that.  **       
53f0: 63 61 73 65 20 72 65 67 44 61 74 61 3d 3d 72 65  case regData==re
5400: 67 4f 72 69 67 44 61 74 61 2e 0a 20 20 2a 2a 20  gOrigData..  ** 
5410: 20 20 28 33 29 20 53 6f 6d 65 20 6f 75 74 70 75    (3) Some outpu
5420: 74 20 63 6f 6c 75 6d 6e 73 20 61 72 65 20 6f 6d  t columns are om
5430: 69 74 74 65 64 20 66 72 6f 6d 20 74 68 65 20 73  itted from the s
5440: 6f 72 74 20 72 65 63 6f 72 64 20 64 75 65 20 74  ort record due t
5450: 6f 0a 20 20 2a 2a 20 20 20 20 20 20 20 74 68 65  o.  **       the
5460: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53   SQLITE_ENABLE_S
5470: 4f 52 54 45 52 5f 52 45 46 45 52 45 4e 43 45 20  ORTER_REFERENCE 
5480: 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2c 20 6f 72  optimization, or
5490: 20 64 75 65 20 74 6f 20 74 68 65 0a 20 20 2a 2a   due to the.  **
54a0: 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 45 43         SQLITE_EC
54b0: 45 4c 5f 4f 4d 49 54 52 45 46 20 6f 70 74 69 6d  EL_OMITREF optim
54c0: 69 7a 61 74 69 6f 6e 2c 20 6f 72 20 64 75 65 20  ization, or due 
54d0: 74 6f 20 74 68 65 20 0a 20 20 2a 2a 20 20 20 20  to the .  **    
54e0: 20 20 20 53 6f 72 74 43 74 78 2e 70 44 65 66 65     SortCtx.pDefe
54f0: 72 72 65 64 52 6f 77 4c 6f 61 64 20 6f 70 74 69  rredRowLoad opti
5500: 6d 69 61 74 69 6f 6e 2e 20 20 49 6e 20 61 6e 79  miation.  In any
5510: 20 6f 66 20 74 68 65 73 65 20 63 61 73 65 73 0a   of these cases.
5520: 20 20 2a 2a 20 20 20 20 20 20 20 72 65 67 4f 72    **       regOr
5530: 69 67 44 61 74 61 20 69 73 20 30 20 74 6f 20 70  igData is 0 to p
5540: 72 65 76 65 6e 74 20 74 68 69 73 20 72 6f 75 74  revent this rout
5550: 69 6e 65 20 66 72 6f 6d 20 74 72 79 69 6e 67 20  ine from trying 
5560: 74 6f 20 63 6f 70 79 0a 20 20 2a 2a 20 20 20 20  to copy.  **    
5570: 20 20 20 76 61 6c 75 65 73 20 74 68 61 74 20 6d     values that m
5580: 69 67 68 74 20 6e 6f 74 20 79 65 74 20 65 78 69  ight not yet exi
5590: 73 74 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  st..  */.  asser
55a0: 74 28 20 6e 44 61 74 61 3d 3d 31 20 7c 7c 20 72  t( nData==1 || r
55b0: 65 67 44 61 74 61 3d 3d 72 65 67 4f 72 69 67 44  egData==regOrigD
55c0: 61 74 61 20 7c 7c 20 72 65 67 4f 72 69 67 44 61  ata || regOrigDa
55d0: 74 61 3d 3d 30 20 29 3b 0a 0a 20 20 69 66 28 20  ta==0 );..  if( 
55e0: 6e 50 72 65 66 69 78 52 65 67 20 29 7b 0a 20 20  nPrefixReg ){.  
55f0: 20 20 61 73 73 65 72 74 28 20 6e 50 72 65 66 69    assert( nPrefi
5600: 78 52 65 67 3d 3d 6e 45 78 70 72 2b 62 53 65 71  xReg==nExpr+bSeq
5610: 20 29 3b 0a 20 20 20 20 72 65 67 42 61 73 65 20   );.    regBase 
5620: 3d 20 72 65 67 44 61 74 61 20 2d 20 6e 50 72 65  = regData - nPre
5630: 66 69 78 52 65 67 3b 0a 20 20 7d 65 6c 73 65 7b  fixReg;.  }else{
5640: 0a 20 20 20 20 72 65 67 42 61 73 65 20 3d 20 70  .    regBase = p
5650: 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 20 31 3b  Parse->nMem + 1;
5660: 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65  .    pParse->nMe
5670: 6d 20 2b 3d 20 6e 42 61 73 65 3b 0a 20 20 7d 0a  m += nBase;.  }.
5680: 20 20 61 73 73 65 72 74 28 20 70 53 65 6c 65 63    assert( pSelec
5690: 74 2d 3e 69 4f 66 66 73 65 74 3d 3d 30 20 7c 7c  t->iOffset==0 ||
56a0: 20 70 53 65 6c 65 63 74 2d 3e 69 4c 69 6d 69 74   pSelect->iLimit
56b0: 21 3d 30 20 29 3b 0a 20 20 69 4c 69 6d 69 74 20  !=0 );.  iLimit 
56c0: 3d 20 70 53 65 6c 65 63 74 2d 3e 69 4f 66 66 73  = pSelect->iOffs
56d0: 65 74 20 3f 20 70 53 65 6c 65 63 74 2d 3e 69 4f  et ? pSelect->iO
56e0: 66 66 73 65 74 2b 31 20 3a 20 70 53 65 6c 65 63  ffset+1 : pSelec
56f0: 74 2d 3e 69 4c 69 6d 69 74 3b 0a 20 20 70 53 6f  t->iLimit;.  pSo
5700: 72 74 2d 3e 6c 61 62 65 6c 44 6f 6e 65 20 3d 20  rt->labelDone = 
5710: 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
5720: 61 62 65 6c 28 70 50 61 72 73 65 29 3b 0a 20 20  abel(pParse);.  
5730: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 45  sqlite3ExprCodeE
5740: 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20  xprList(pParse, 
5750: 70 53 6f 72 74 2d 3e 70 4f 72 64 65 72 42 79 2c  pSort->pOrderBy,
5760: 20 72 65 67 42 61 73 65 2c 20 72 65 67 4f 72 69   regBase, regOri
5770: 67 44 61 74 61 2c 0a 20 20 20 20 20 20 20 20 20  gData,.         
5780: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5790: 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f 44 55 50   SQLITE_ECEL_DUP
57a0: 20 7c 20 28 72 65 67 4f 72 69 67 44 61 74 61 3f   | (regOrigData?
57b0: 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f 52 45 46   SQLITE_ECEL_REF
57c0: 20 3a 20 30 29 29 3b 0a 20 20 69 66 28 20 62 53   : 0));.  if( bS
57d0: 65 71 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  eq ){.    sqlite
57e0: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
57f0: 50 5f 53 65 71 75 65 6e 63 65 2c 20 70 53 6f 72  P_Sequence, pSor
5800: 74 2d 3e 69 45 43 75 72 73 6f 72 2c 20 72 65 67  t->iECursor, reg
5810: 42 61 73 65 2b 6e 45 78 70 72 29 3b 0a 20 20 7d  Base+nExpr);.  }
5820: 0a 20 20 69 66 28 20 6e 50 72 65 66 69 78 52 65  .  if( nPrefixRe
5830: 67 3d 3d 30 20 26 26 20 6e 44 61 74 61 3e 30 20  g==0 && nData>0 
5840: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  ){.    sqlite3Ex
5850: 70 72 43 6f 64 65 4d 6f 76 65 28 70 50 61 72 73  prCodeMove(pPars
5860: 65 2c 20 72 65 67 44 61 74 61 2c 20 72 65 67 42  e, regData, regB
5870: 61 73 65 2b 6e 45 78 70 72 2b 62 53 65 71 2c 20  ase+nExpr+bSeq, 
5880: 6e 44 61 74 61 29 3b 0a 20 20 7d 0a 20 20 69 66  nData);.  }.  if
5890: 28 20 6e 4f 42 53 61 74 3e 30 20 29 7b 0a 20 20  ( nOBSat>0 ){.  
58a0: 20 20 69 6e 74 20 72 65 67 50 72 65 76 4b 65 79    int regPrevKey
58b0: 3b 20 20 20 2f 2a 20 54 68 65 20 66 69 72 73 74  ;   /* The first
58c0: 20 6e 4f 42 53 61 74 20 63 6f 6c 75 6d 6e 73 20   nOBSat columns 
58d0: 6f 66 20 74 68 65 20 70 72 65 76 69 6f 75 73 20  of the previous 
58e0: 72 6f 77 20 2a 2f 0a 20 20 20 20 69 6e 74 20 61  row */.    int a
58f0: 64 64 72 46 69 72 73 74 3b 20 20 20 20 2f 2a 20  ddrFirst;    /* 
5900: 41 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 4f  Address of the O
5910: 50 5f 49 66 4e 6f 74 20 6f 70 63 6f 64 65 20 2a  P_IfNot opcode *
5920: 2f 0a 20 20 20 20 69 6e 74 20 61 64 64 72 4a 6d  /.    int addrJm
5930: 70 3b 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65  p;      /* Addre
5940: 73 73 20 6f 66 20 74 68 65 20 4f 50 5f 4a 75 6d  ss of the OP_Jum
5950: 70 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 20 20  p opcode */.    
5960: 56 64 62 65 4f 70 20 2a 70 4f 70 3b 20 20 20 20  VdbeOp *pOp;    
5970: 20 20 2f 2a 20 4f 70 63 6f 64 65 20 74 68 61 74    /* Opcode that
5980: 20 6f 70 65 6e 73 20 74 68 65 20 73 6f 72 74 65   opens the sorte
5990: 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 4b 65  r */.    int nKe
59a0: 79 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75  y;         /* Nu
59b0: 6d 62 65 72 20 6f 66 20 73 6f 72 74 69 6e 67 20  mber of sorting 
59c0: 6b 65 79 20 63 6f 6c 75 6d 6e 73 2c 20 69 6e 63  key columns, inc
59d0: 6c 75 64 69 6e 67 20 4f 50 5f 53 65 71 75 65 6e  luding OP_Sequen
59e0: 63 65 20 2a 2f 0a 20 20 20 20 4b 65 79 49 6e 66  ce */.    KeyInf
59f0: 6f 20 2a 70 4b 49 3b 20 20 20 20 20 2f 2a 20 4f  o *pKI;     /* O
5a00: 72 69 67 69 6e 61 6c 20 4b 65 79 49 6e 66 6f 20  riginal KeyInfo 
5a10: 6f 6e 20 74 68 65 20 73 6f 72 74 65 72 20 74 61  on the sorter ta
5a20: 62 6c 65 20 2a 2f 0a 0a 20 20 20 20 72 65 67 52  ble */..    regR
5a30: 65 63 6f 72 64 20 3d 20 6d 61 6b 65 53 6f 72 74  ecord = makeSort
5a40: 65 72 52 65 63 6f 72 64 28 70 50 61 72 73 65 2c  erRecord(pParse,
5a50: 20 70 53 6f 72 74 2c 20 70 53 65 6c 65 63 74 2c   pSort, pSelect,
5a60: 20 72 65 67 42 61 73 65 2c 20 6e 42 61 73 65 29   regBase, nBase)
5a70: 3b 0a 20 20 20 20 72 65 67 50 72 65 76 4b 65 79  ;.    regPrevKey
5a80: 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b   = pParse->nMem+
5a90: 31 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  1;.    pParse->n
5aa0: 4d 65 6d 20 2b 3d 20 70 53 6f 72 74 2d 3e 6e 4f  Mem += pSort->nO
5ab0: 42 53 61 74 3b 0a 20 20 20 20 6e 4b 65 79 20 3d  BSat;.    nKey =
5ac0: 20 6e 45 78 70 72 20 2d 20 70 53 6f 72 74 2d 3e   nExpr - pSort->
5ad0: 6e 4f 42 53 61 74 20 2b 20 62 53 65 71 3b 0a 20  nOBSat + bSeq;. 
5ae0: 20 20 20 69 66 28 20 62 53 65 71 20 29 7b 0a 20     if( bSeq ){. 
5af0: 20 20 20 20 20 61 64 64 72 46 69 72 73 74 20 3d       addrFirst =
5b00: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
5b10: 70 31 28 76 2c 20 4f 50 5f 49 66 4e 6f 74 2c 20  p1(v, OP_IfNot, 
5b20: 72 65 67 42 61 73 65 2b 6e 45 78 70 72 29 3b 20  regBase+nExpr); 
5b30: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
5b40: 20 20 61 64 64 72 46 69 72 73 74 20 3d 20 73 71    addrFirst = sq
5b50: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
5b60: 76 2c 20 4f 50 5f 53 65 71 75 65 6e 63 65 54 65  v, OP_SequenceTe
5b70: 73 74 2c 20 70 53 6f 72 74 2d 3e 69 45 43 75 72  st, pSort->iECur
5b80: 73 6f 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  sor);.    }.    
5b90: 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
5ba0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
5bb0: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6d  AddOp3(v, OP_Com
5bc0: 70 61 72 65 2c 20 72 65 67 50 72 65 76 4b 65 79  pare, regPrevKey
5bd0: 2c 20 72 65 67 42 61 73 65 2c 20 70 53 6f 72 74  , regBase, pSort
5be0: 2d 3e 6e 4f 42 53 61 74 29 3b 0a 20 20 20 20 70  ->nOBSat);.    p
5bf0: 4f 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  Op = sqlite3Vdbe
5c00: 47 65 74 4f 70 28 76 2c 20 70 53 6f 72 74 2d 3e  GetOp(v, pSort->
5c10: 61 64 64 72 53 6f 72 74 49 6e 64 65 78 29 3b 0a  addrSortIndex);.
5c20: 20 20 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e      if( pParse->
5c30: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
5c40: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 70   ) return;.    p
5c50: 4f 70 2d 3e 70 32 20 3d 20 6e 4b 65 79 20 2b 20  Op->p2 = nKey + 
5c60: 6e 44 61 74 61 3b 0a 20 20 20 20 70 4b 49 20 3d  nData;.    pKI =
5c70: 20 70 4f 70 2d 3e 70 34 2e 70 4b 65 79 49 6e 66   pOp->p4.pKeyInf
5c80: 6f 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 4b  o;.    memset(pK
5c90: 49 2d 3e 61 53 6f 72 74 4f 72 64 65 72 2c 20 30  I->aSortOrder, 0
5ca0: 2c 20 70 4b 49 2d 3e 6e 4b 65 79 46 69 65 6c 64  , pKI->nKeyField
5cb0: 29 3b 20 2f 2a 20 4d 61 6b 65 73 20 4f 50 5f 4a  ); /* Makes OP_J
5cc0: 75 6d 70 20 74 65 73 74 61 62 6c 65 20 2a 2f 0a  ump testable */.
5cd0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
5ce0: 68 61 6e 67 65 50 34 28 76 2c 20 2d 31 2c 20 28  hangeP4(v, -1, (
5cf0: 63 68 61 72 2a 29 70 4b 49 2c 20 50 34 5f 4b 45  char*)pKI, P4_KE
5d00: 59 49 4e 46 4f 29 3b 0a 20 20 20 20 74 65 73 74  YINFO);.    test
5d10: 63 61 73 65 28 20 70 4b 49 2d 3e 6e 41 6c 6c 46  case( pKI->nAllF
5d20: 69 65 6c 64 20 3e 20 70 4b 49 2d 3e 6e 4b 65 79  ield > pKI->nKey
5d30: 46 69 65 6c 64 2b 32 20 29 3b 0a 20 20 20 20 70  Field+2 );.    p
5d40: 4f 70 2d 3e 70 34 2e 70 4b 65 79 49 6e 66 6f 20  Op->p4.pKeyInfo 
5d50: 3d 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f  = sqlite3KeyInfo
5d60: 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 70 50 61  FromExprList(pPa
5d70: 72 73 65 2c 70 53 6f 72 74 2d 3e 70 4f 72 64 65  rse,pSort->pOrde
5d80: 72 42 79 2c 6e 4f 42 53 61 74 2c 0a 20 20 20 20  rBy,nOBSat,.    
5d90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5da0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5db0: 20 20 20 20 20 20 20 70 4b 49 2d 3e 6e 41 6c 6c         pKI->nAll
5dc0: 46 69 65 6c 64 2d 70 4b 49 2d 3e 6e 4b 65 79 46  Field-pKI->nKeyF
5dd0: 69 65 6c 64 2d 31 29 3b 0a 20 20 20 20 61 64 64  ield-1);.    add
5de0: 72 4a 6d 70 20 3d 20 73 71 6c 69 74 65 33 56 64  rJmp = sqlite3Vd
5df0: 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
5e00: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
5e10: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4a 75  eAddOp3(v, OP_Ju
5e20: 6d 70 2c 20 61 64 64 72 4a 6d 70 2b 31 2c 20 30  mp, addrJmp+1, 0
5e30: 2c 20 61 64 64 72 4a 6d 70 2b 31 29 3b 20 56 64  , addrJmp+1); Vd
5e40: 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
5e50: 20 20 20 70 53 6f 72 74 2d 3e 6c 61 62 65 6c 42     pSort->labelB
5e60: 6b 4f 75 74 20 3d 20 73 71 6c 69 74 65 33 56 64  kOut = sqlite3Vd
5e70: 62 65 4d 61 6b 65 4c 61 62 65 6c 28 70 50 61 72  beMakeLabel(pPar
5e80: 73 65 29 3b 0a 20 20 20 20 70 53 6f 72 74 2d 3e  se);.    pSort->
5e90: 72 65 67 52 65 74 75 72 6e 20 3d 20 2b 2b 70 50  regReturn = ++pP
5ea0: 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20  arse->nMem;.    
5eb0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
5ec0: 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 70  2(v, OP_Gosub, p
5ed0: 53 6f 72 74 2d 3e 72 65 67 52 65 74 75 72 6e 2c  Sort->regReturn,
5ee0: 20 70 53 6f 72 74 2d 3e 6c 61 62 65 6c 42 6b 4f   pSort->labelBkO
5ef0: 75 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ut);.    sqlite3
5f00: 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
5f10: 5f 52 65 73 65 74 53 6f 72 74 65 72 2c 20 70 53  _ResetSorter, pS
5f20: 6f 72 74 2d 3e 69 45 43 75 72 73 6f 72 29 3b 0a  ort->iECursor);.
5f30: 20 20 20 20 69 66 28 20 69 4c 69 6d 69 74 20 29      if( iLimit )
5f40: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
5f50: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
5f60: 49 66 4e 6f 74 2c 20 69 4c 69 6d 69 74 2c 20 70  IfNot, iLimit, p
5f70: 53 6f 72 74 2d 3e 6c 61 62 65 6c 44 6f 6e 65 29  Sort->labelDone)
5f80: 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65  ;.      VdbeCove
5f90: 72 61 67 65 28 76 29 3b 0a 20 20 20 20 7d 0a 20  rage(v);.    }. 
5fa0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
5fb0: 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 46 69  mpHere(v, addrFi
5fc0: 72 73 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  rst);.    sqlite
5fd0: 33 45 78 70 72 43 6f 64 65 4d 6f 76 65 28 70 50  3ExprCodeMove(pP
5fe0: 61 72 73 65 2c 20 72 65 67 42 61 73 65 2c 20 72  arse, regBase, r
5ff0: 65 67 50 72 65 76 4b 65 79 2c 20 70 53 6f 72 74  egPrevKey, pSort
6000: 2d 3e 6e 4f 42 53 61 74 29 3b 0a 20 20 20 20 73  ->nOBSat);.    s
6010: 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
6020: 72 65 28 76 2c 20 61 64 64 72 4a 6d 70 29 3b 0a  re(v, addrJmp);.
6030: 20 20 7d 0a 20 20 69 66 28 20 69 4c 69 6d 69 74    }.  if( iLimit
6040: 20 29 7b 0a 20 20 20 20 2f 2a 20 41 74 20 74 68   ){.    /* At th
6050: 69 73 20 70 6f 69 6e 74 20 74 68 65 20 76 61 6c  is point the val
6060: 75 65 73 20 66 6f 72 20 74 68 65 20 6e 65 77 20  ues for the new 
6070: 73 6f 72 74 65 72 20 65 6e 74 72 79 20 61 72 65  sorter entry are
6080: 20 73 74 6f 72 65 64 0a 20 20 20 20 2a 2a 20 69   stored.    ** i
6090: 6e 20 61 6e 20 61 72 72 61 79 20 6f 66 20 72 65  n an array of re
60a0: 67 69 73 74 65 72 73 2e 20 54 68 65 79 20 6e 65  gisters. They ne
60b0: 65 64 20 74 6f 20 62 65 20 63 6f 6d 70 6f 73 65  ed to be compose
60c0: 64 20 69 6e 74 6f 20 61 20 72 65 63 6f 72 64 0a  d into a record.
60d0: 20 20 20 20 2a 2a 20 61 6e 64 20 69 6e 73 65 72      ** and inser
60e0: 74 65 64 20 69 6e 74 6f 20 74 68 65 20 73 6f 72  ted into the sor
60f0: 74 65 72 20 69 66 20 65 69 74 68 65 72 20 28 61  ter if either (a
6100: 29 20 74 68 65 72 65 20 61 72 65 20 63 75 72 72  ) there are curr
6110: 65 6e 74 6c 79 0a 20 20 20 20 2a 2a 20 6c 65 73  ently.    ** les
6120: 73 20 74 68 61 6e 20 4c 49 4d 49 54 2b 4f 46 46  s than LIMIT+OFF
6130: 53 45 54 20 69 74 65 6d 73 20 6f 72 20 28 62 29  SET items or (b)
6140: 20 74 68 65 20 6e 65 77 20 72 65 63 6f 72 64 20   the new record 
6150: 69 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20  is smaller than 
6160: 0a 20 20 20 20 2a 2a 20 74 68 65 20 6c 61 72 67  .    ** the larg
6170: 65 73 74 20 72 65 63 6f 72 64 20 63 75 72 72 65  est record curre
6180: 6e 74 6c 79 20 69 6e 20 74 68 65 20 73 6f 72 74  ntly in the sort
6190: 65 72 2e 20 49 66 20 28 62 29 20 69 73 20 74 72  er. If (b) is tr
61a0: 75 65 20 61 6e 64 20 74 68 65 72 65 0a 20 20 20  ue and there.   
61b0: 20 2a 2a 20 61 72 65 20 61 6c 72 65 61 64 79 20   ** are already 
61c0: 4c 49 4d 49 54 2b 4f 46 46 53 45 54 20 69 74 65  LIMIT+OFFSET ite
61d0: 6d 73 20 69 6e 20 74 68 65 20 73 6f 72 74 65 72  ms in the sorter
61e0: 2c 20 64 65 6c 65 74 65 20 74 68 65 20 6c 61 72  , delete the lar
61f0: 67 65 73 74 0a 20 20 20 20 2a 2a 20 65 6e 74 72  gest.    ** entr
6200: 79 20 62 65 66 6f 72 65 20 69 6e 73 65 72 74 69  y before inserti
6210: 6e 67 20 74 68 65 20 6e 65 77 20 6f 6e 65 2e 20  ng the new one. 
6220: 54 68 69 73 20 77 61 79 20 74 68 65 72 65 20 61  This way there a
6230: 72 65 20 6e 65 76 65 72 20 6d 6f 72 65 20 0a 20  re never more . 
6240: 20 20 20 2a 2a 20 74 68 61 6e 20 4c 49 4d 49 54     ** than LIMIT
6250: 2b 4f 46 46 53 45 54 20 69 74 65 6d 73 20 69 6e  +OFFSET items in
6260: 20 74 68 65 20 73 6f 72 74 65 72 2e 0a 20 20 20   the sorter..   
6270: 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20 74 68   **.    ** If th
6280: 65 20 6e 65 77 20 72 65 63 6f 72 64 20 64 6f 65  e new record doe
6290: 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65  s not need to be
62a0: 20 69 6e 73 65 72 74 65 64 20 69 6e 74 6f 20 74   inserted into t
62b0: 68 65 20 73 6f 72 74 65 72 2c 0a 20 20 20 20 2a  he sorter,.    *
62c0: 2a 20 6a 75 6d 70 20 74 6f 20 74 68 65 20 6e 65  * jump to the ne
62d0: 78 74 20 69 74 65 72 61 74 69 6f 6e 20 6f 66 20  xt iteration of 
62e0: 74 68 65 20 6c 6f 6f 70 2e 20 49 66 20 74 68 65  the loop. If the
62f0: 20 70 53 6f 72 74 2d 3e 6c 61 62 65 6c 4f 42 4c   pSort->labelOBL
6300: 6f 70 74 0a 20 20 20 20 2a 2a 20 76 61 6c 75 65  opt.    ** value
6310: 20 69 73 20 6e 6f 74 20 7a 65 72 6f 2c 20 74 68   is not zero, th
6320: 65 6e 20 69 74 20 69 73 20 61 20 6c 61 62 65 6c  en it is a label
6330: 20 6f 66 20 77 68 65 72 65 20 74 6f 20 6a 75 6d   of where to jum
6340: 70 2e 20 20 4f 74 68 65 72 77 69 73 65 2c 0a 20  p.  Otherwise,. 
6350: 20 20 20 2a 2a 20 6a 75 73 74 20 62 79 70 61 73     ** just bypas
6360: 73 20 74 68 65 20 72 6f 77 20 69 6e 73 65 72 74  s the row insert
6370: 20 6c 6f 67 69 63 2e 20 20 53 65 65 20 74 68 65   logic.  See the
6380: 20 68 65 61 64 65 72 20 63 6f 6d 6d 65 6e 74 20   header comment 
6390: 6f 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 73 71  on the.    ** sq
63a0: 6c 69 74 65 33 57 68 65 72 65 4f 72 64 65 72 42  lite3WhereOrderB
63b0: 79 4c 69 6d 69 74 4f 70 74 4c 61 62 65 6c 28 29  yLimitOptLabel()
63c0: 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20 61 64   function for ad
63d0: 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 2e 0a 20  ditional info.. 
63e0: 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 43     */.    int iC
63f0: 73 72 20 3d 20 70 53 6f 72 74 2d 3e 69 45 43 75  sr = pSort->iECu
6400: 72 73 6f 72 3b 0a 20 20 20 20 73 71 6c 69 74 65  rsor;.    sqlite
6410: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
6420: 50 5f 49 66 4e 6f 74 5a 65 72 6f 2c 20 69 4c 69  P_IfNotZero, iLi
6430: 6d 69 74 2c 20 73 71 6c 69 74 65 33 56 64 62 65  mit, sqlite3Vdbe
6440: 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 2b 34  CurrentAddr(v)+4
6450: 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 76 65 72  );.    VdbeCover
6460: 61 67 65 28 76 29 3b 0a 20 20 20 20 73 71 6c 69  age(v);.    sqli
6470: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
6480: 20 4f 50 5f 4c 61 73 74 2c 20 69 43 73 72 2c 20   OP_Last, iCsr, 
6490: 30 29 3b 0a 20 20 20 20 69 53 6b 69 70 20 3d 20  0);.    iSkip = 
64a0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
64b0: 34 49 6e 74 28 76 2c 20 4f 50 5f 49 64 78 4c 45  4Int(v, OP_IdxLE
64c0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
64d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
64e0: 20 20 20 69 43 73 72 2c 20 30 2c 20 72 65 67 42     iCsr, 0, regB
64f0: 61 73 65 2b 6e 4f 42 53 61 74 2c 20 6e 45 78 70  ase+nOBSat, nExp
6500: 72 2d 6e 4f 42 53 61 74 29 3b 0a 20 20 20 20 56  r-nOBSat);.    V
6510: 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
6520: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
6530: 64 64 4f 70 31 28 76 2c 20 4f 50 5f 44 65 6c 65  ddOp1(v, OP_Dele
6540: 74 65 2c 20 69 43 73 72 29 3b 0a 20 20 7d 0a 20  te, iCsr);.  }. 
6550: 20 69 66 28 20 72 65 67 52 65 63 6f 72 64 3d 3d   if( regRecord==
6560: 30 20 29 7b 0a 20 20 20 20 72 65 67 52 65 63 6f  0 ){.    regReco
6570: 72 64 20 3d 20 6d 61 6b 65 53 6f 72 74 65 72 52  rd = makeSorterR
6580: 65 63 6f 72 64 28 70 50 61 72 73 65 2c 20 70 53  ecord(pParse, pS
6590: 6f 72 74 2c 20 70 53 65 6c 65 63 74 2c 20 72 65  ort, pSelect, re
65a0: 67 42 61 73 65 2c 20 6e 42 61 73 65 29 3b 0a 20  gBase, nBase);. 
65b0: 20 7d 0a 20 20 69 66 28 20 70 53 6f 72 74 2d 3e   }.  if( pSort->
65c0: 73 6f 72 74 46 6c 61 67 73 20 26 20 53 4f 52 54  sortFlags & SORT
65d0: 46 4c 41 47 5f 55 73 65 53 6f 72 74 65 72 20 29  FLAG_UseSorter )
65e0: 7b 0a 20 20 20 20 6f 70 20 3d 20 4f 50 5f 53 6f  {.    op = OP_So
65f0: 72 74 65 72 49 6e 73 65 72 74 3b 0a 20 20 7d 65  rterInsert;.  }e
6600: 6c 73 65 7b 0a 20 20 20 20 6f 70 20 3d 20 4f 50  lse{.    op = OP
6610: 5f 49 64 78 49 6e 73 65 72 74 3b 0a 20 20 7d 0a  _IdxInsert;.  }.
6620: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
6630: 4f 70 34 49 6e 74 28 76 2c 20 6f 70 2c 20 70 53  Op4Int(v, op, pS
6640: 6f 72 74 2d 3e 69 45 43 75 72 73 6f 72 2c 20 72  ort->iECursor, r
6650: 65 67 52 65 63 6f 72 64 2c 0a 20 20 20 20 20 20  egRecord,.      
6660: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6670: 20 72 65 67 42 61 73 65 2b 6e 4f 42 53 61 74 2c   regBase+nOBSat,
6680: 20 6e 42 61 73 65 2d 6e 4f 42 53 61 74 29 3b 0a   nBase-nOBSat);.
6690: 20 20 69 66 28 20 69 53 6b 69 70 20 29 7b 0a 20    if( iSkip ){. 
66a0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
66b0: 61 6e 67 65 50 32 28 76 2c 20 69 53 6b 69 70 2c  angeP2(v, iSkip,
66c0: 0a 20 20 20 20 20 20 20 20 20 70 53 6f 72 74 2d  .         pSort-
66d0: 3e 6c 61 62 65 6c 4f 42 4c 6f 70 74 20 3f 20 70  >labelOBLopt ? p
66e0: 53 6f 72 74 2d 3e 6c 61 62 65 6c 4f 42 4c 6f 70  Sort->labelOBLop
66f0: 74 20 3a 20 73 71 6c 69 74 65 33 56 64 62 65 43  t : sqlite3VdbeC
6700: 75 72 72 65 6e 74 41 64 64 72 28 76 29 29 3b 0a  urrentAddr(v));.
6710: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64    }.}../*.** Add
6720: 20 63 6f 64 65 20 74 6f 20 69 6d 70 6c 65 6d 65   code to impleme
6730: 6e 74 20 74 68 65 20 4f 46 46 53 45 54 0a 2a 2f  nt the OFFSET.*/
6740: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f 64  .static void cod
6750: 65 4f 66 66 73 65 74 28 0a 20 20 56 64 62 65 20  eOffset(.  Vdbe 
6760: 2a 76 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  *v,          /* 
6770: 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 69 6e  Generate code in
6780: 74 6f 20 74 68 69 73 20 56 4d 20 2a 2f 0a 20 20  to this VM */.  
6790: 69 6e 74 20 69 4f 66 66 73 65 74 2c 20 20 20 20  int iOffset,    
67a0: 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 68 6f    /* Register ho
67b0: 6c 64 69 6e 67 20 74 68 65 20 6f 66 66 73 65 74  lding the offset
67c0: 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e   counter */.  in
67d0: 74 20 69 43 6f 6e 74 69 6e 75 65 20 20 20 20 20  t iContinue     
67e0: 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 74 6f 20  /* Jump here to 
67f0: 73 6b 69 70 20 74 68 65 20 63 75 72 72 65 6e 74  skip the current
6800: 20 72 65 63 6f 72 64 20 2a 2f 0a 29 7b 0a 20 20   record */.){.  
6810: 69 66 28 20 69 4f 66 66 73 65 74 3e 30 20 29 7b  if( iOffset>0 ){
6820: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
6830: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 66 50  AddOp3(v, OP_IfP
6840: 6f 73 2c 20 69 4f 66 66 73 65 74 2c 20 69 43 6f  os, iOffset, iCo
6850: 6e 74 69 6e 75 65 2c 20 31 29 3b 20 56 64 62 65  ntinue, 1); Vdbe
6860: 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
6870: 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
6880: 20 22 4f 46 46 53 45 54 22 29 29 3b 0a 20 20 7d   "OFFSET"));.  }
6890: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 63 6f  .}../*.** Add co
68a0: 64 65 20 74 68 61 74 20 77 69 6c 6c 20 63 68 65  de that will che
68b0: 63 6b 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20  ck to make sure 
68c0: 74 68 65 20 4e 20 72 65 67 69 73 74 65 72 73 20  the N registers 
68d0: 73 74 61 72 74 69 6e 67 20 61 74 20 69 4d 65 6d  starting at iMem
68e0: 0a 2a 2a 20 66 6f 72 6d 20 61 20 64 69 73 74 69  .** form a disti
68f0: 6e 63 74 20 65 6e 74 72 79 2e 20 20 69 54 61 62  nct entry.  iTab
6900: 20 69 73 20 61 20 73 6f 72 74 69 6e 67 20 69 6e   is a sorting in
6910: 64 65 78 20 74 68 61 74 20 68 6f 6c 64 73 20 70  dex that holds p
6920: 72 65 76 69 6f 75 73 6c 79 0a 2a 2a 20 73 65 65  reviously.** see
6930: 6e 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 73 20 6f  n combinations o
6940: 66 20 74 68 65 20 4e 20 76 61 6c 75 65 73 2e 20  f the N values. 
6950: 20 41 20 6e 65 77 20 65 6e 74 72 79 20 69 73 20   A new entry is 
6960: 6d 61 64 65 20 69 6e 20 69 54 61 62 0a 2a 2a 20  made in iTab.** 
6970: 69 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 4e  if the current N
6980: 20 76 61 6c 75 65 73 20 61 72 65 20 6e 65 77 2e   values are new.
6990: 0a 2a 2a 0a 2a 2a 20 41 20 6a 75 6d 70 20 74 6f  .**.** A jump to
69a0: 20 61 64 64 72 52 65 70 65 61 74 20 69 73 20 6d   addrRepeat is m
69b0: 61 64 65 20 61 6e 64 20 74 68 65 20 4e 2b 31 20  ade and the N+1 
69c0: 76 61 6c 75 65 73 20 61 72 65 20 70 6f 70 70 65  values are poppe
69d0: 64 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20 73 74  d from the.** st
69e0: 61 63 6b 20 69 66 20 74 68 65 20 74 6f 70 20 4e  ack if the top N
69f0: 20 65 6c 65 6d 65 6e 74 73 20 61 72 65 20 6e 6f   elements are no
6a00: 74 20 64 69 73 74 69 6e 63 74 2e 0a 2a 2f 0a 73  t distinct..*/.s
6a10: 74 61 74 69 63 20 76 6f 69 64 20 63 6f 64 65 44  tatic void codeD
6a20: 69 73 74 69 6e 63 74 28 0a 20 20 50 61 72 73 65  istinct(.  Parse
6a30: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 2f 2a   *pParse,     /*
6a40: 20 50 61 72 73 69 6e 67 20 61 6e 64 20 63 6f 64   Parsing and cod
6a50: 65 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e  e generating con
6a60: 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20 69 54  text */.  int iT
6a70: 61 62 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ab,          /* 
6a80: 41 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 20  A sorting index 
6a90: 75 73 65 64 20 74 6f 20 74 65 73 74 20 66 6f 72  used to test for
6aa0: 20 64 69 73 74 69 6e 63 74 6e 65 73 73 20 2a 2f   distinctness */
6ab0: 0a 20 20 69 6e 74 20 61 64 64 72 52 65 70 65 61  .  int addrRepea
6ac0: 74 2c 20 20 20 20 2f 2a 20 4a 75 6d 70 20 74 6f  t,    /* Jump to
6ad0: 20 68 65 72 65 20 69 66 20 6e 6f 74 20 64 69 73   here if not dis
6ae0: 74 69 6e 63 74 20 2a 2f 0a 20 20 69 6e 74 20 4e  tinct */.  int N
6af0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
6b00: 20 4e 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65   Number of eleme
6b10: 6e 74 73 20 2a 2f 0a 20 20 69 6e 74 20 69 4d 65  nts */.  int iMe
6b20: 6d 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46  m           /* F
6b30: 69 72 73 74 20 65 6c 65 6d 65 6e 74 20 2a 2f 0a  irst element */.
6b40: 29 7b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20 20  ){.  Vdbe *v;.  
6b50: 69 6e 74 20 72 31 3b 0a 0a 20 20 76 20 3d 20 70  int r1;..  v = p
6b60: 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
6b70: 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  r1 = sqlite3GetT
6b80: 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a  empReg(pParse);.
6b90: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
6ba0: 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 46 6f 75  Op4Int(v, OP_Fou
6bb0: 6e 64 2c 20 69 54 61 62 2c 20 61 64 64 72 52 65  nd, iTab, addrRe
6bc0: 70 65 61 74 2c 20 69 4d 65 6d 2c 20 4e 29 3b 20  peat, iMem, N); 
6bd0: 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
6be0: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
6bf0: 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52  dOp3(v, OP_MakeR
6c00: 65 63 6f 72 64 2c 20 69 4d 65 6d 2c 20 4e 2c 20  ecord, iMem, N, 
6c10: 72 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  r1);.  sqlite3Vd
6c20: 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f  beAddOp4Int(v, O
6c30: 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 69 54 61  P_IdxInsert, iTa
6c40: 62 2c 20 72 31 2c 20 69 4d 65 6d 2c 20 4e 29 3b  b, r1, iMem, N);
6c50: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68  .  sqlite3VdbeCh
6c60: 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41 47  angeP5(v, OPFLAG
6c70: 5f 55 53 45 53 45 45 4b 52 45 53 55 4c 54 29 3b  _USESEEKRESULT);
6c80: 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73  .  sqlite3Releas
6c90: 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
6ca0: 20 72 31 29 3b 0a 7d 0a 0a 23 69 66 64 65 66 20   r1);.}..#ifdef 
6cb0: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 4f  SQLITE_ENABLE_SO
6cc0: 52 54 45 52 5f 52 45 46 45 52 45 4e 43 45 53 0a  RTER_REFERENCES.
6cd0: 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
6ce0: 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 61 73  ion is called as
6cf0: 20 70 61 72 74 20 6f 66 20 69 6e 6e 65 72 2d 6c   part of inner-l
6d00: 6f 6f 70 20 67 65 6e 65 72 61 74 69 6f 6e 20 66  oop generation f
6d10: 6f 72 20 61 20 53 45 4c 45 43 54 0a 2a 2a 20 73  or a SELECT.** s
6d20: 74 61 74 65 6d 65 6e 74 20 77 69 74 68 20 61 6e  tatement with an
6d30: 20 4f 52 44 45 52 20 42 59 20 74 68 61 74 20 69   ORDER BY that i
6d40: 73 20 6e 6f 74 20 6f 70 74 69 6d 69 7a 65 64 20  s not optimized 
6d50: 62 79 20 61 6e 20 69 6e 64 65 78 2e 20 49 74 20  by an index. It 
6d60: 0a 2a 2a 20 64 65 74 65 72 6d 69 6e 65 73 20 74  .** determines t
6d70: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 73 2c 20  he expressions, 
6d80: 69 66 20 61 6e 79 2c 20 74 68 61 74 20 74 68 65  if any, that the
6d90: 20 73 6f 72 74 65 72 2d 72 65 66 65 72 65 6e 63   sorter-referenc
6da0: 65 20 0a 2a 2a 20 6f 70 74 69 6d 69 7a 61 74 69  e .** optimizati
6db0: 6f 6e 20 73 68 6f 75 6c 64 20 62 65 20 75 73 65  on should be use
6dc0: 64 20 66 6f 72 2e 20 54 68 65 20 73 6f 72 74 65  d for. The sorte
6dd0: 72 2d 72 65 66 65 72 65 6e 63 65 20 6f 70 74 69  r-reference opti
6de0: 6d 69 7a 61 74 69 6f 6e 0a 2a 2a 20 69 73 20 75  mization.** is u
6df0: 73 65 64 20 66 6f 72 20 53 45 4c 45 43 54 20 71  sed for SELECT q
6e00: 75 65 72 69 65 73 20 6c 69 6b 65 3a 0a 2a 2a 0a  ueries like:.**.
6e10: 2a 2a 20 20 20 53 45 4c 45 43 54 20 61 2c 20 62  **   SELECT a, b
6e20: 69 67 62 6c 6f 62 20 46 52 4f 4d 20 74 31 20 4f  igblob FROM t1 O
6e30: 52 44 45 52 20 42 59 20 61 20 4c 49 4d 49 54 20  RDER BY a LIMIT 
6e40: 31 30 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  10.**.** If the 
6e50: 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20  optimization is 
6e60: 75 73 65 64 20 66 6f 72 20 65 78 70 72 65 73 73  used for express
6e70: 69 6f 6e 20 22 62 69 67 62 6c 6f 62 22 2c 20 74  ion "bigblob", t
6e80: 68 65 6e 20 69 6e 73 74 65 61 64 20 6f 66 0a 2a  hen instead of.*
6e90: 2a 20 73 74 6f 72 69 6e 67 20 76 61 6c 75 65 73  * storing values
6ea0: 20 72 65 61 64 20 66 72 6f 6d 20 74 68 61 74 20   read from that 
6eb0: 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20 73 6f  column in the so
6ec0: 72 74 65 72 20 72 65 63 6f 72 64 73 2c 20 74 68  rter records, th
6ed0: 65 20 50 4b 20 6f 66 0a 2a 2a 20 74 68 65 20 72  e PK of.** the r
6ee0: 6f 77 20 66 72 6f 6d 20 74 61 62 6c 65 20 74 31  ow from table t1
6ef0: 20 69 73 20 73 74 6f 72 65 64 20 69 6e 73 74 65   is stored inste
6f00: 61 64 2e 20 54 68 65 6e 2c 20 61 73 20 72 65 63  ad. Then, as rec
6f10: 6f 72 64 73 20 61 72 65 20 65 78 74 72 61 63 74  ords are extract
6f20: 65 64 20 66 72 6f 6d 0a 2a 2a 20 74 68 65 20 73  ed from.** the s
6f30: 6f 72 74 65 72 20 74 6f 20 72 65 74 75 72 6e 20  orter to return 
6f40: 74 6f 20 74 68 65 20 75 73 65 72 2c 20 74 68 65  to the user, the
6f50: 20 72 65 71 75 69 72 65 64 20 76 61 6c 75 65 20   required value 
6f60: 6f 66 20 62 69 67 62 6c 6f 62 20 69 73 0a 2a 2a  of bigblob is.**
6f70: 20 72 65 74 72 69 65 76 65 64 20 64 69 72 65 63   retrieved direc
6f80: 74 6c 79 20 66 72 6f 6d 20 74 61 62 6c 65 20 74  tly from table t
6f90: 31 2e 20 49 66 20 74 68 65 20 76 61 6c 75 65 73  1. If the values
6fa0: 20 61 72 65 20 76 65 72 79 20 6c 61 72 67 65 2c   are very large,
6fb0: 20 74 68 69 73 20 0a 2a 2a 20 63 61 6e 20 62 65   this .** can be
6fc0: 20 6d 6f 72 65 20 65 66 66 69 63 69 65 6e 74 20   more efficient 
6fd0: 74 68 61 6e 20 73 74 6f 72 69 6e 67 20 74 68 65  than storing the
6fe0: 6d 20 64 69 72 65 63 74 6c 79 20 69 6e 20 74 68  m directly in th
6ff0: 65 20 73 6f 72 74 65 72 20 72 65 63 6f 72 64 73  e sorter records
7000: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 45 78 70 72  ..**.** The Expr
7010: 4c 69 73 74 5f 69 74 65 6d 2e 62 53 6f 72 74 65  List_item.bSorte
7020: 72 52 65 66 20 66 6c 61 67 20 69 73 20 73 65 74  rRef flag is set
7030: 20 66 6f 72 20 65 61 63 68 20 65 78 70 72 65 73   for each expres
7040: 73 69 6f 6e 20 69 6e 20 70 45 4c 69 73 74 20 0a  sion in pEList .
7050: 2a 2a 20 66 6f 72 20 77 68 69 63 68 20 74 68 65  ** for which the
7060: 20 73 6f 72 74 65 72 2d 72 65 66 65 72 65 6e 63   sorter-referenc
7070: 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 73  e optimization s
7080: 68 6f 75 6c 64 20 62 65 20 65 6e 61 62 6c 65 64  hould be enabled
7090: 2e 20 0a 2a 2a 20 41 64 64 69 74 69 6f 6e 61 6c  . .** Additional
70a0: 6c 79 2c 20 74 68 65 20 70 53 6f 72 74 2d 3e 61  ly, the pSort->a
70b0: 44 65 66 65 72 5b 5d 20 61 72 72 61 79 20 69 73  Defer[] array is
70c0: 20 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68 20   populated with 
70d0: 65 6e 74 72 69 65 73 0a 2a 2a 20 66 6f 72 20 61  entries.** for a
70e0: 6c 6c 20 63 75 72 73 6f 72 73 20 72 65 71 75 69  ll cursors requi
70f0: 72 65 64 20 74 6f 20 65 76 61 6c 75 61 74 65 20  red to evaluate 
7100: 61 6c 6c 20 73 65 6c 65 63 74 65 64 20 65 78 70  all selected exp
7110: 72 65 73 73 69 6f 6e 73 2e 20 46 69 6e 61 6c 6c  ressions. Finall
7120: 79 2e 0a 2a 2a 20 6f 75 74 70 75 74 20 76 61 72  y..** output var
7130: 69 61 62 6c 65 20 28 2a 70 70 45 78 74 72 61 29  iable (*ppExtra)
7140: 20 69 73 20 73 65 74 20 74 6f 20 61 6e 20 65 78   is set to an ex
7150: 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 20 63 6f  pression list co
7160: 6e 74 61 69 6e 69 6e 67 0a 2a 2a 20 65 78 70 72  ntaining.** expr
7170: 65 73 73 69 6f 6e 73 20 66 6f 72 20 61 6c 6c 20  essions for all 
7180: 65 78 74 72 61 20 50 4b 20 76 61 6c 75 65 73 20  extra PK values 
7190: 74 68 61 74 20 73 68 6f 75 6c 64 20 62 65 20 73  that should be s
71a0: 74 6f 72 65 64 20 69 6e 20 74 68 65 0a 2a 2a 20  tored in the.** 
71b0: 73 6f 72 74 65 72 20 72 65 63 6f 72 64 73 2e 0a  sorter records..
71c0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  */.static void s
71d0: 65 6c 65 63 74 45 78 70 72 44 65 66 65 72 28 0a  electExprDefer(.
71e0: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
71f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7200: 20 20 2f 2a 20 4c 65 61 76 65 20 61 6e 79 20 65    /* Leave any e
7210: 72 72 6f 72 20 68 65 72 65 20 2a 2f 0a 20 20 53  rror here */.  S
7220: 6f 72 74 43 74 78 20 2a 70 53 6f 72 74 2c 20 20  ortCtx *pSort,  
7230: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
7240: 2a 20 53 6f 72 74 65 72 20 63 6f 6e 74 65 78 74  * Sorter context
7250: 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
7260: 70 45 4c 69 73 74 2c 20 20 20 20 20 20 20 20 20  pEList,         
7270: 20 20 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73        /* Express
7280: 69 6f 6e 73 20 64 65 73 74 69 6e 65 64 20 66 6f  ions destined fo
7290: 72 20 73 6f 72 74 65 72 20 2a 2f 0a 20 20 45 78  r sorter */.  Ex
72a0: 70 72 4c 69 73 74 20 2a 2a 70 70 45 78 74 72 61  prList **ppExtra
72b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
72c0: 20 45 78 70 72 65 73 73 69 6f 6e 73 20 74 6f 20   Expressions to 
72d0: 61 70 70 65 6e 64 20 74 6f 20 73 6f 72 74 65 72  append to sorter
72e0: 20 72 65 63 6f 72 64 20 2a 2f 0a 29 7b 0a 20 20   record */.){.  
72f0: 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e 44 65  int i;.  int nDe
7300: 66 65 72 20 3d 20 30 3b 0a 20 20 45 78 70 72 4c  fer = 0;.  ExprL
7310: 69 73 74 20 2a 70 45 78 74 72 61 20 3d 20 30 3b  ist *pExtra = 0;
7320: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 45  .  for(i=0; i<pE
7330: 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b  List->nExpr; i++
7340: 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 45 78  ){.    struct Ex
7350: 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  prList_item *pIt
7360: 65 6d 20 3d 20 26 70 45 4c 69 73 74 2d 3e 61 5b  em = &pEList->a[
7370: 69 5d 3b 0a 20 20 20 20 69 66 28 20 70 49 74 65  i];.    if( pIte
7380: 6d 2d 3e 75 2e 78 2e 69 4f 72 64 65 72 42 79 43  m->u.x.iOrderByC
7390: 6f 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 45  ol==0 ){.      E
73a0: 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70 49 74  xpr *pExpr = pIt
73b0: 65 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20  em->pExpr;.     
73c0: 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70   Table *pTab = p
73d0: 45 78 70 72 2d 3e 79 2e 70 54 61 62 3b 0a 20 20  Expr->y.pTab;.  
73e0: 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f      if( pExpr->o
73f0: 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20  p==TK_COLUMN && 
7400: 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3e 3d  pExpr->iColumn>=
7410: 30 20 26 26 20 70 54 61 62 20 26 26 20 21 49 73  0 && pTab && !Is
7420: 56 69 72 74 75 61 6c 28 70 54 61 62 29 0a 20 20  Virtual(pTab).  
7430: 20 20 20 20 20 26 26 20 28 70 54 61 62 2d 3e 61       && (pTab->a
7440: 43 6f 6c 5b 70 45 78 70 72 2d 3e 69 43 6f 6c 75  Col[pExpr->iColu
7450: 6d 6e 5d 2e 63 6f 6c 46 6c 61 67 73 20 26 20 43  mn].colFlags & C
7460: 4f 4c 46 4c 41 47 5f 53 4f 52 54 45 52 52 45 46  OLFLAG_SORTERREF
7470: 29 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20  ).      ){.     
7480: 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20     int j;.      
7490: 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 44 65    for(j=0; j<nDe
74a0: 66 65 72 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  fer; j++){.     
74b0: 20 20 20 20 20 69 66 28 20 70 53 6f 72 74 2d 3e       if( pSort->
74c0: 61 44 65 66 65 72 5b 6a 5d 2e 69 43 73 72 3d 3d  aDefer[j].iCsr==
74d0: 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 29 20  pExpr->iTable ) 
74e0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d  break;.        }
74f0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 6a 3d 3d  .        if( j==
7500: 6e 44 65 66 65 72 20 29 7b 0a 20 20 20 20 20 20  nDefer ){.      
7510: 20 20 20 20 69 66 28 20 6e 44 65 66 65 72 3d 3d      if( nDefer==
7520: 41 72 72 61 79 53 69 7a 65 28 70 53 6f 72 74 2d  ArraySize(pSort-
7530: 3e 61 44 65 66 65 72 29 20 29 7b 0a 20 20 20 20  >aDefer) ){.    
7540: 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65          continue
7550: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73  ;.          }els
7560: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  e{.            i
7570: 6e 74 20 6e 4b 65 79 20 3d 20 31 3b 0a 20 20 20  nt nKey = 1;.   
7580: 20 20 20 20 20 20 20 20 20 69 6e 74 20 6b 3b 0a           int k;.
7590: 20 20 20 20 20 20 20 20 20 20 20 20 49 6e 64 65              Inde
75a0: 78 20 2a 70 50 6b 20 3d 20 30 3b 0a 20 20 20 20  x *pPk = 0;.    
75b0: 20 20 20 20 20 20 20 20 69 66 28 20 21 48 61 73          if( !Has
75c0: 52 6f 77 69 64 28 70 54 61 62 29 20 29 7b 0a 20  Rowid(pTab) ){. 
75d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 50 6b               pPk
75e0: 20 3d 20 73 71 6c 69 74 65 33 50 72 69 6d 61 72   = sqlite3Primar
75f0: 79 4b 65 79 49 6e 64 65 78 28 70 54 61 62 29 3b  yKeyIndex(pTab);
7600: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6e  .              n
7610: 4b 65 79 20 3d 20 70 50 6b 2d 3e 6e 4b 65 79 43  Key = pPk->nKeyC
7620: 6f 6c 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ol;.            
7630: 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 6f  }.            fo
7640: 72 28 6b 3d 30 3b 20 6b 3c 6e 4b 65 79 3b 20 6b  r(k=0; k<nKey; k
7650: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ++){.           
7660: 20 20 20 45 78 70 72 20 2a 70 4e 65 77 20 3d 20     Expr *pNew = 
7670: 73 71 6c 69 74 65 33 50 45 78 70 72 28 70 50 61  sqlite3PExpr(pPa
7680: 72 73 65 2c 20 54 4b 5f 43 4f 4c 55 4d 4e 2c 20  rse, TK_COLUMN, 
7690: 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20  0, 0);.         
76a0: 20 20 20 20 20 69 66 28 20 70 4e 65 77 20 29 7b       if( pNew ){
76b0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
76c0: 20 70 4e 65 77 2d 3e 69 54 61 62 6c 65 20 3d 20   pNew->iTable = 
76d0: 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3b 0a 20  pExpr->iTable;. 
76e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
76f0: 4e 65 77 2d 3e 79 2e 70 54 61 62 20 3d 20 70 45  New->y.pTab = pE
7700: 78 70 72 2d 3e 79 2e 70 54 61 62 3b 0a 20 20 20  xpr->y.pTab;.   
7710: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 4e 65               pNe
7720: 77 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 70 50 6b  w->iColumn = pPk
7730: 20 3f 20 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e   ? pPk->aiColumn
7740: 5b 6b 5d 20 3a 20 2d 31 3b 0a 20 20 20 20 20 20  [k] : -1;.      
7750: 20 20 20 20 20 20 20 20 20 20 70 45 78 74 72 61            pExtra
7760: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69   = sqlite3ExprLi
7770: 73 74 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c  stAppend(pParse,
7780: 20 70 45 78 74 72 61 2c 20 70 4e 65 77 29 3b 0a   pExtra, pNew);.
7790: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a                }.
77a0: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
77b0: 20 20 20 20 20 20 20 20 20 20 70 53 6f 72 74 2d            pSort-
77c0: 3e 61 44 65 66 65 72 5b 6e 44 65 66 65 72 5d 2e  >aDefer[nDefer].
77d0: 70 54 61 62 20 3d 20 70 45 78 70 72 2d 3e 79 2e  pTab = pExpr->y.
77e0: 70 54 61 62 3b 0a 20 20 20 20 20 20 20 20 20 20  pTab;.          
77f0: 20 20 70 53 6f 72 74 2d 3e 61 44 65 66 65 72 5b    pSort->aDefer[
7800: 6e 44 65 66 65 72 5d 2e 69 43 73 72 20 3d 20 70  nDefer].iCsr = p
7810: 45 78 70 72 2d 3e 69 54 61 62 6c 65 3b 0a 20 20  Expr->iTable;.  
7820: 20 20 20 20 20 20 20 20 20 20 70 53 6f 72 74 2d            pSort-
7830: 3e 61 44 65 66 65 72 5b 6e 44 65 66 65 72 5d 2e  >aDefer[nDefer].
7840: 6e 4b 65 79 20 3d 20 6e 4b 65 79 3b 0a 20 20 20  nKey = nKey;.   
7850: 20 20 20 20 20 20 20 20 20 6e 44 65 66 65 72 2b           nDefer+
7860: 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  +;.          }. 
7870: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
7880: 20 70 49 74 65 6d 2d 3e 62 53 6f 72 74 65 72 52   pItem->bSorterR
7890: 65 66 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a  ef = 1;.      }.
78a0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 53 6f 72      }.  }.  pSor
78b0: 74 2d 3e 6e 44 65 66 65 72 20 3d 20 28 75 38 29  t->nDefer = (u8)
78c0: 6e 44 65 66 65 72 3b 0a 20 20 2a 70 70 45 78 74  nDefer;.  *ppExt
78d0: 72 61 20 3d 20 70 45 78 74 72 61 3b 0a 7d 0a 23  ra = pExtra;.}.#
78e0: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  endif../*.** Thi
78f0: 73 20 72 6f 75 74 69 6e 65 20 67 65 6e 65 72 61  s routine genera
7900: 74 65 73 20 74 68 65 20 63 6f 64 65 20 66 6f 72  tes the code for
7910: 20 74 68 65 20 69 6e 73 69 64 65 20 6f 66 20 74   the inside of t
7920: 68 65 20 69 6e 6e 65 72 20 6c 6f 6f 70 0a 2a 2a  he inner loop.**
7930: 20 6f 66 20 61 20 53 45 4c 45 43 54 2e 0a 2a 2a   of a SELECT..**
7940: 0a 2a 2a 20 49 66 20 73 72 63 54 61 62 20 69 73  .** If srcTab is
7950: 20 6e 65 67 61 74 69 76 65 2c 20 74 68 65 6e 20   negative, then 
7960: 74 68 65 20 70 2d 3e 70 45 4c 69 73 74 20 65 78  the p->pEList ex
7970: 70 72 65 73 73 69 6f 6e 73 0a 2a 2a 20 61 72 65  pressions.** are
7980: 20 65 76 61 6c 75 61 74 65 64 20 69 6e 20 6f 72   evaluated in or
7990: 64 65 72 20 74 6f 20 67 65 74 20 74 68 65 20 64  der to get the d
79a0: 61 74 61 20 66 6f 72 20 74 68 69 73 20 72 6f 77  ata for this row
79b0: 2e 20 20 49 66 20 73 72 63 54 61 62 20 69 73 0a  .  If srcTab is.
79c0: 2a 2a 20 7a 65 72 6f 20 6f 72 20 6d 6f 72 65 2c  ** zero or more,
79d0: 20 74 68 65 6e 20 64 61 74 61 20 69 73 20 70 75   then data is pu
79e0: 6c 6c 65 64 20 66 72 6f 6d 20 73 72 63 54 61 62  lled from srcTab
79f0: 20 61 6e 64 20 70 2d 3e 70 45 4c 69 73 74 20 69   and p->pEList i
7a00: 73 20 75 73 65 64 20 6f 6e 6c 79 20 0a 2a 2a 20  s used only .** 
7a10: 74 6f 20 67 65 74 20 74 68 65 20 6e 75 6d 62 65  to get the numbe
7a20: 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 61 6e 64  r of columns and
7a30: 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73   the collation s
7a40: 65 71 75 65 6e 63 65 20 66 6f 72 20 65 61 63 68  equence for each
7a50: 20 63 6f 6c 75 6d 6e 2e 0a 2a 2f 0a 73 74 61 74   column..*/.stat
7a60: 69 63 20 76 6f 69 64 20 73 65 6c 65 63 74 49 6e  ic void selectIn
7a70: 6e 65 72 4c 6f 6f 70 28 0a 20 20 50 61 72 73 65  nerLoop(.  Parse
7a80: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
7a90: 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 65 72     /* The parser
7aa0: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65   context */.  Se
7ab0: 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20  lect *p,        
7ac0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6d        /* The com
7ad0: 70 6c 65 74 65 20 73 65 6c 65 63 74 20 73 74 61  plete select sta
7ae0: 74 65 6d 65 6e 74 20 62 65 69 6e 67 20 63 6f 64  tement being cod
7af0: 65 64 20 2a 2f 0a 20 20 69 6e 74 20 73 72 63 54  ed */.  int srcT
7b00: 61 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ab,             
7b10: 2f 2a 20 50 75 6c 6c 20 64 61 74 61 20 66 72 6f  /* Pull data fro
7b20: 6d 20 74 68 69 73 20 74 61 62 6c 65 20 69 66 20  m this table if 
7b30: 6e 6f 6e 2d 6e 65 67 61 74 69 76 65 20 2a 2f 0a  non-negative */.
7b40: 20 20 53 6f 72 74 43 74 78 20 2a 70 53 6f 72 74    SortCtx *pSort
7b50: 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20  ,         /* If 
7b60: 6e 6f 74 20 4e 55 4c 4c 2c 20 69 6e 66 6f 20 6f  not NULL, info o
7b70: 6e 20 68 6f 77 20 74 6f 20 70 72 6f 63 65 73 73  n how to process
7b80: 20 4f 52 44 45 52 20 42 59 20 2a 2f 0a 20 20 44   ORDER BY */.  D
7b90: 69 73 74 69 6e 63 74 43 74 78 20 2a 70 44 69 73  istinctCtx *pDis
7ba0: 74 69 6e 63 74 2c 20 2f 2a 20 49 66 20 6e 6f 74  tinct, /* If not
7bb0: 20 4e 55 4c 4c 2c 20 69 6e 66 6f 20 6f 6e 20 68   NULL, info on h
7bc0: 6f 77 20 74 6f 20 70 72 6f 63 65 73 73 20 44 49  ow to process DI
7bd0: 53 54 49 4e 43 54 20 2a 2f 0a 20 20 53 65 6c 65  STINCT */.  Sele
7be0: 63 74 44 65 73 74 20 2a 70 44 65 73 74 2c 20 20  ctDest *pDest,  
7bf0: 20 20 20 20 2f 2a 20 48 6f 77 20 74 6f 20 64 69      /* How to di
7c00: 73 70 6f 73 65 20 6f 66 20 74 68 65 20 72 65 73  spose of the res
7c10: 75 6c 74 73 20 2a 2f 0a 20 20 69 6e 74 20 69 43  ults */.  int iC
7c20: 6f 6e 74 69 6e 75 65 2c 20 20 20 20 20 20 20 20  ontinue,        
7c30: 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 74    /* Jump here t
7c40: 6f 20 63 6f 6e 74 69 6e 75 65 20 77 69 74 68 20  o continue with 
7c50: 6e 65 78 74 20 72 6f 77 20 2a 2f 0a 20 20 69 6e  next row */.  in
7c60: 74 20 69 42 72 65 61 6b 20 20 20 20 20 20 20 20  t iBreak        
7c70: 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65        /* Jump he
7c80: 72 65 20 74 6f 20 62 72 65 61 6b 20 6f 75 74 20  re to break out 
7c90: 6f 66 20 74 68 65 20 69 6e 6e 65 72 20 6c 6f 6f  of the inner loo
7ca0: 70 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a  p */.){.  Vdbe *
7cb0: 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
7cc0: 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e  e;.  int i;.  in
7cd0: 74 20 68 61 73 44 69 73 74 69 6e 63 74 3b 20 20  t hasDistinct;  
7ce0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
7cf0: 65 20 69 66 20 74 68 65 20 44 49 53 54 49 4e 43  e if the DISTINC
7d00: 54 20 6b 65 79 77 6f 72 64 20 69 73 20 70 72 65  T keyword is pre
7d10: 73 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 65 44  sent */.  int eD
7d20: 65 73 74 20 3d 20 70 44 65 73 74 2d 3e 65 44 65  est = pDest->eDe
7d30: 73 74 3b 20 20 20 2f 2a 20 48 6f 77 20 74 6f 20  st;   /* How to 
7d40: 64 69 73 70 6f 73 65 20 6f 66 20 72 65 73 75 6c  dispose of resul
7d50: 74 73 20 2a 2f 0a 20 20 69 6e 74 20 69 50 61 72  ts */.  int iPar
7d60: 6d 20 3d 20 70 44 65 73 74 2d 3e 69 53 44 50 61  m = pDest->iSDPa
7d70: 72 6d 3b 20 2f 2a 20 46 69 72 73 74 20 61 72 67  rm; /* First arg
7d80: 75 6d 65 6e 74 20 74 6f 20 64 69 73 70 6f 73 61  ument to disposa
7d90: 6c 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 69 6e  l method */.  in
7da0: 74 20 6e 52 65 73 75 6c 74 43 6f 6c 3b 20 20 20  t nResultCol;   
7db0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
7dc0: 62 65 72 20 6f 66 20 72 65 73 75 6c 74 20 63 6f  ber of result co
7dd0: 6c 75 6d 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 6e  lumns */.  int n
7de0: 50 72 65 66 69 78 52 65 67 20 3d 20 30 3b 20 20  PrefixReg = 0;  
7df0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
7e00: 20 6f 66 20 65 78 74 72 61 20 72 65 67 69 73 74   of extra regist
7e10: 65 72 73 20 62 65 66 6f 72 65 20 72 65 67 52 65  ers before regRe
7e20: 73 75 6c 74 20 2a 2f 0a 20 20 52 6f 77 4c 6f 61  sult */.  RowLoa
7e30: 64 49 6e 66 6f 20 73 52 6f 77 4c 6f 61 64 49 6e  dInfo sRowLoadIn
7e40: 66 6f 3b 20 20 20 2f 2a 20 49 6e 66 6f 20 66 6f  fo;   /* Info fo
7e50: 72 20 64 65 66 65 72 72 65 64 20 72 6f 77 20 6c  r deferred row l
7e60: 6f 61 64 69 6e 67 20 2a 2f 0a 0a 20 20 2f 2a 20  oading */..  /* 
7e70: 55 73 75 61 6c 6c 79 2c 20 72 65 67 52 65 73 75  Usually, regResu
7e80: 6c 74 20 69 73 20 74 68 65 20 66 69 72 73 74 20  lt is the first 
7e90: 63 65 6c 6c 20 69 6e 20 61 6e 20 61 72 72 61 79  cell in an array
7ea0: 20 6f 66 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73   of memory cells
7eb0: 0a 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 69 6e 67  .  ** containing
7ec0: 20 74 68 65 20 63 75 72 72 65 6e 74 20 72 65 73   the current res
7ed0: 75 6c 74 20 72 6f 77 2e 20 49 6e 20 74 68 69 73  ult row. In this
7ee0: 20 63 61 73 65 20 72 65 67 4f 72 69 67 20 69 73   case regOrig is
7ef0: 20 73 65 74 20 74 6f 20 74 68 65 0a 20 20 2a 2a   set to the.  **
7f00: 20 73 61 6d 65 20 76 61 6c 75 65 2e 20 48 6f 77   same value. How
7f10: 65 76 65 72 2c 20 69 66 20 74 68 65 20 72 65 73  ever, if the res
7f20: 75 6c 74 73 20 61 72 65 20 62 65 69 6e 67 20 73  ults are being s
7f30: 65 6e 74 20 74 6f 20 74 68 65 20 73 6f 72 74 65  ent to the sorte
7f40: 72 2c 20 74 68 65 0a 20 20 2a 2a 20 76 61 6c 75  r, the.  ** valu
7f50: 65 73 20 66 6f 72 20 61 6e 79 20 65 78 70 72 65  es for any expre
7f60: 73 73 69 6f 6e 73 20 74 68 61 74 20 61 72 65 20  ssions that are 
7f70: 61 6c 73 6f 20 70 61 72 74 20 6f 66 20 74 68 65  also part of the
7f80: 20 73 6f 72 74 2d 6b 65 79 20 61 72 65 20 6f 6d   sort-key are om
7f90: 69 74 74 65 64 0a 20 20 2a 2a 20 66 72 6f 6d 20  itted.  ** from 
7fa0: 74 68 69 73 20 61 72 72 61 79 2e 20 49 6e 20 74  this array. In t
7fb0: 68 69 73 20 63 61 73 65 20 72 65 67 4f 72 69 67  his case regOrig
7fc0: 20 69 73 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e   is set to zero.
7fd0: 20 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 52 65    */.  int regRe
7fe0: 73 75 6c 74 3b 20 20 20 20 20 20 20 20 20 20 20  sult;           
7ff0: 20 20 20 2f 2a 20 53 74 61 72 74 20 6f 66 20 6d     /* Start of m
8000: 65 6d 6f 72 79 20 68 6f 6c 64 69 6e 67 20 63 75  emory holding cu
8010: 72 72 65 6e 74 20 72 65 73 75 6c 74 73 20 2a 2f  rrent results */
8020: 0a 20 20 69 6e 74 20 72 65 67 4f 72 69 67 3b 20  .  int regOrig; 
8030: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
8040: 2a 20 53 74 61 72 74 20 6f 66 20 6d 65 6d 6f 72  * Start of memor
8050: 79 20 68 6f 6c 64 69 6e 67 20 66 75 6c 6c 20 72  y holding full r
8060: 65 73 75 6c 74 20 28 6f 72 20 30 29 20 2a 2f 0a  esult (or 0) */.
8070: 0a 20 20 61 73 73 65 72 74 28 20 76 20 29 3b 0a  .  assert( v );.
8080: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c    assert( p->pEL
8090: 69 73 74 21 3d 30 20 29 3b 0a 20 20 68 61 73 44  ist!=0 );.  hasD
80a0: 69 73 74 69 6e 63 74 20 3d 20 70 44 69 73 74 69  istinct = pDisti
80b0: 6e 63 74 20 3f 20 70 44 69 73 74 69 6e 63 74 2d  nct ? pDistinct-
80c0: 3e 65 54 6e 63 74 54 79 70 65 20 3a 20 57 48 45  >eTnctType : WHE
80d0: 52 45 5f 44 49 53 54 49 4e 43 54 5f 4e 4f 4f 50  RE_DISTINCT_NOOP
80e0: 3b 0a 20 20 69 66 28 20 70 53 6f 72 74 20 26 26  ;.  if( pSort &&
80f0: 20 70 53 6f 72 74 2d 3e 70 4f 72 64 65 72 42 79   pSort->pOrderBy
8100: 3d 3d 30 20 29 20 70 53 6f 72 74 20 3d 20 30 3b  ==0 ) pSort = 0;
8110: 0a 20 20 69 66 28 20 70 53 6f 72 74 3d 3d 30 20  .  if( pSort==0 
8120: 26 26 20 21 68 61 73 44 69 73 74 69 6e 63 74 20  && !hasDistinct 
8130: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69  ){.    assert( i
8140: 43 6f 6e 74 69 6e 75 65 21 3d 30 20 29 3b 0a 20  Continue!=0 );. 
8150: 20 20 20 63 6f 64 65 4f 66 66 73 65 74 28 76 2c     codeOffset(v,
8160: 20 70 2d 3e 69 4f 66 66 73 65 74 2c 20 69 43 6f   p->iOffset, iCo
8170: 6e 74 69 6e 75 65 29 3b 0a 20 20 7d 0a 0a 20 20  ntinue);.  }..  
8180: 2f 2a 20 50 75 6c 6c 20 74 68 65 20 72 65 71 75  /* Pull the requ
8190: 65 73 74 65 64 20 63 6f 6c 75 6d 6e 73 2e 0a 20  ested columns.. 
81a0: 20 2a 2f 0a 20 20 6e 52 65 73 75 6c 74 43 6f 6c   */.  nResultCol
81b0: 20 3d 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45   = p->pEList->nE
81c0: 78 70 72 3b 0a 0a 20 20 69 66 28 20 70 44 65 73  xpr;..  if( pDes
81d0: 74 2d 3e 69 53 64 73 74 3d 3d 30 20 29 7b 0a 20  t->iSdst==0 ){. 
81e0: 20 20 20 69 66 28 20 70 53 6f 72 74 20 29 7b 0a     if( pSort ){.
81f0: 20 20 20 20 20 20 6e 50 72 65 66 69 78 52 65 67        nPrefixReg
8200: 20 3d 20 70 53 6f 72 74 2d 3e 70 4f 72 64 65 72   = pSort->pOrder
8210: 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20  By->nExpr;.     
8220: 20 69 66 28 20 21 28 70 53 6f 72 74 2d 3e 73 6f   if( !(pSort->so
8230: 72 74 46 6c 61 67 73 20 26 20 53 4f 52 54 46 4c  rtFlags & SORTFL
8240: 41 47 5f 55 73 65 53 6f 72 74 65 72 29 20 29 20  AG_UseSorter) ) 
8250: 6e 50 72 65 66 69 78 52 65 67 2b 2b 3b 0a 20 20  nPrefixReg++;.  
8260: 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d      pParse->nMem
8270: 20 2b 3d 20 6e 50 72 65 66 69 78 52 65 67 3b 0a   += nPrefixReg;.
8280: 20 20 20 20 7d 0a 20 20 20 20 70 44 65 73 74 2d      }.    pDest-
8290: 3e 69 53 64 73 74 20 3d 20 70 50 61 72 73 65 2d  >iSdst = pParse-
82a0: 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20 70 50 61  >nMem+1;.    pPa
82b0: 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 52 65  rse->nMem += nRe
82c0: 73 75 6c 74 43 6f 6c 3b 0a 20 20 7d 65 6c 73 65  sultCol;.  }else
82d0: 20 69 66 28 20 70 44 65 73 74 2d 3e 69 53 64 73   if( pDest->iSds
82e0: 74 2b 6e 52 65 73 75 6c 74 43 6f 6c 20 3e 20 70  t+nResultCol > p
82f0: 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 29 7b 0a 20  Parse->nMem ){. 
8300: 20 20 20 2f 2a 20 54 68 69 73 20 69 73 20 61 6e     /* This is an
8310: 20 65 72 72 6f 72 20 63 6f 6e 64 69 74 69 6f 6e   error condition
8320: 20 74 68 61 74 20 63 61 6e 20 72 65 73 75 6c 74   that can result
8330: 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 2c 20 77  , for example, w
8340: 68 65 6e 20 61 20 53 45 4c 45 43 54 0a 20 20 20  hen a SELECT.   
8350: 20 2a 2a 20 6f 6e 20 74 68 65 20 72 69 67 68 74   ** on the right
8360: 2d 68 61 6e 64 20 73 69 64 65 20 6f 66 20 61 6e  -hand side of an
8370: 20 49 4e 53 45 52 54 20 63 6f 6e 74 61 69 6e 73   INSERT contains
8380: 20 6d 6f 72 65 20 72 65 73 75 6c 74 20 63 6f 6c   more result col
8390: 75 6d 6e 73 20 74 68 61 6e 0a 20 20 20 20 2a 2a  umns than.    **
83a0: 20 74 68 65 72 65 20 61 72 65 20 63 6f 6c 75 6d   there are colum
83b0: 6e 73 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20  ns in the table 
83c0: 6f 6e 20 74 68 65 20 6c 65 66 74 2e 20 20 54 68  on the left.  Th
83d0: 65 20 65 72 72 6f 72 20 77 69 6c 6c 20 62 65 20  e error will be 
83e0: 63 61 75 67 68 74 0a 20 20 20 20 2a 2a 20 61 6e  caught.    ** an
83f0: 64 20 72 65 70 6f 72 74 65 64 20 6c 61 74 65 72  d reported later
8400: 2e 20 20 42 75 74 20 77 65 20 6e 65 65 64 20 74  .  But we need t
8410: 6f 20 6d 61 6b 65 20 73 75 72 65 20 65 6e 6f 75  o make sure enou
8420: 67 68 20 6d 65 6d 6f 72 79 20 69 73 20 61 6c 6c  gh memory is all
8430: 6f 63 61 74 65 64 0a 20 20 20 20 2a 2a 20 74 6f  ocated.    ** to
8440: 20 61 76 6f 69 64 20 6f 74 68 65 72 20 73 70 75   avoid other spu
8450: 72 69 6f 75 73 20 65 72 72 6f 72 73 20 69 6e 20  rious errors in 
8460: 74 68 65 20 6d 65 61 6e 74 69 6d 65 2e 20 2a 2f  the meantime. */
8470: 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65  .    pParse->nMe
8480: 6d 20 2b 3d 20 6e 52 65 73 75 6c 74 43 6f 6c 3b  m += nResultCol;
8490: 0a 20 20 7d 0a 20 20 70 44 65 73 74 2d 3e 6e 53  .  }.  pDest->nS
84a0: 64 73 74 20 3d 20 6e 52 65 73 75 6c 74 43 6f 6c  dst = nResultCol
84b0: 3b 0a 20 20 72 65 67 4f 72 69 67 20 3d 20 72 65  ;.  regOrig = re
84c0: 67 52 65 73 75 6c 74 20 3d 20 70 44 65 73 74 2d  gResult = pDest-
84d0: 3e 69 53 64 73 74 3b 0a 20 20 69 66 28 20 73 72  >iSdst;.  if( sr
84e0: 63 54 61 62 3e 3d 30 20 29 7b 0a 20 20 20 20 66  cTab>=0 ){.    f
84f0: 6f 72 28 69 3d 30 3b 20 69 3c 6e 52 65 73 75 6c  or(i=0; i<nResul
8500: 74 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  tCol; i++){.    
8510: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
8520: 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e  Op3(v, OP_Column
8530: 2c 20 73 72 63 54 61 62 2c 20 69 2c 20 72 65 67  , srcTab, i, reg
8540: 52 65 73 75 6c 74 2b 69 29 3b 0a 20 20 20 20 20  Result+i);.     
8550: 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
8560: 20 22 25 73 22 2c 20 70 2d 3e 70 45 4c 69 73 74   "%s", p->pEList
8570: 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 29 3b 0a  ->a[i].zName));.
8580: 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66      }.  }else if
8590: 28 20 65 44 65 73 74 21 3d 53 52 54 5f 45 78 69  ( eDest!=SRT_Exi
85a0: 73 74 73 20 29 7b 0a 23 69 66 64 65 66 20 53 51  sts ){.#ifdef SQ
85b0: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 4f 52 54  LITE_ENABLE_SORT
85c0: 45 52 5f 52 45 46 45 52 45 4e 43 45 53 0a 20 20  ER_REFERENCES.  
85d0: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 78 74    ExprList *pExt
85e0: 72 61 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 20  ra = 0;.#endif. 
85f0: 20 20 20 2f 2a 20 49 66 20 74 68 65 20 64 65 73     /* If the des
8600: 74 69 6e 61 74 69 6f 6e 20 69 73 20 61 6e 20 45  tination is an E
8610: 58 49 53 54 53 28 2e 2e 2e 29 20 65 78 70 72 65  XISTS(...) expre
8620: 73 73 69 6f 6e 2c 20 74 68 65 20 61 63 74 75 61  ssion, the actua
8630: 6c 0a 20 20 20 20 2a 2a 20 76 61 6c 75 65 73 20  l.    ** values 
8640: 72 65 74 75 72 6e 65 64 20 62 79 20 74 68 65 20  returned by the 
8650: 53 45 4c 45 43 54 20 61 72 65 20 6e 6f 74 20 72  SELECT are not r
8660: 65 71 75 69 72 65 64 2e 0a 20 20 20 20 2a 2f 0a  equired..    */.
8670: 20 20 20 20 75 38 20 65 63 65 6c 46 6c 61 67 73      u8 ecelFlags
8680: 3b 20 20 20 20 2f 2a 20 22 65 63 65 6c 22 20 69  ;    /* "ecel" i
8690: 73 20 61 6e 20 61 62 62 72 65 76 69 61 74 69 6f  s an abbreviatio
86a0: 6e 20 6f 66 20 22 45 78 70 72 43 6f 64 65 45 78  n of "ExprCodeEx
86b0: 70 72 4c 69 73 74 22 20 2a 2f 0a 20 20 20 20 45  prList" */.    E
86c0: 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b  xprList *pEList;
86d0: 0a 20 20 20 20 69 66 28 20 65 44 65 73 74 3d 3d  .    if( eDest==
86e0: 53 52 54 5f 4d 65 6d 20 7c 7c 20 65 44 65 73 74  SRT_Mem || eDest
86f0: 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20 7c 7c 20  ==SRT_Output || 
8700: 65 44 65 73 74 3d 3d 53 52 54 5f 43 6f 72 6f 75  eDest==SRT_Corou
8710: 74 69 6e 65 20 29 7b 0a 20 20 20 20 20 20 65 63  tine ){.      ec
8720: 65 6c 46 6c 61 67 73 20 3d 20 53 51 4c 49 54 45  elFlags = SQLITE
8730: 5f 45 43 45 4c 5f 44 55 50 3b 0a 20 20 20 20 7d  _ECEL_DUP;.    }
8740: 65 6c 73 65 7b 0a 20 20 20 20 20 20 65 63 65 6c  else{.      ecel
8750: 46 6c 61 67 73 20 3d 20 30 3b 0a 20 20 20 20 7d  Flags = 0;.    }
8760: 0a 20 20 20 20 69 66 28 20 70 53 6f 72 74 20 26  .    if( pSort &
8770: 26 20 68 61 73 44 69 73 74 69 6e 63 74 3d 3d 30  & hasDistinct==0
8780: 20 26 26 20 65 44 65 73 74 21 3d 53 52 54 5f 45   && eDest!=SRT_E
8790: 70 68 65 6d 54 61 62 20 26 26 20 65 44 65 73 74  phemTab && eDest
87a0: 21 3d 53 52 54 5f 54 61 62 6c 65 20 29 7b 0a 20  !=SRT_Table ){. 
87b0: 20 20 20 20 20 2f 2a 20 46 6f 72 20 65 61 63 68       /* For each
87c0: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 70   expression in p
87d0: 2d 3e 70 45 4c 69 73 74 20 74 68 61 74 20 69 73  ->pEList that is
87e0: 20 61 20 63 6f 70 79 20 6f 66 20 61 6e 20 65 78   a copy of an ex
87f0: 70 72 65 73 73 69 6f 6e 20 69 6e 0a 20 20 20 20  pression in.    
8800: 20 20 2a 2a 20 74 68 65 20 4f 52 44 45 52 20 42    ** the ORDER B
8810: 59 20 63 6c 61 75 73 65 20 28 70 53 6f 72 74 2d  Y clause (pSort-
8820: 3e 70 4f 72 64 65 72 42 79 29 2c 20 73 65 74 20  >pOrderBy), set 
8830: 74 68 65 20 61 73 73 6f 63 69 61 74 65 64 20 0a  the associated .
8840: 20 20 20 20 20 20 2a 2a 20 69 4f 72 64 65 72 42        ** iOrderB
8850: 79 43 6f 6c 20 76 61 6c 75 65 20 74 6f 20 6f 6e  yCol value to on
8860: 65 20 6d 6f 72 65 20 74 68 61 6e 20 74 68 65 20  e more than the 
8870: 69 6e 64 65 78 20 6f 66 20 74 68 65 20 4f 52 44  index of the ORD
8880: 45 52 20 42 59 20 0a 20 20 20 20 20 20 2a 2a 20  ER BY .      ** 
8890: 65 78 70 72 65 73 73 69 6f 6e 20 77 69 74 68 69  expression withi
88a0: 6e 20 74 68 65 20 73 6f 72 74 2d 6b 65 79 20 74  n the sort-key t
88b0: 68 61 74 20 70 75 73 68 4f 6e 74 6f 53 6f 72 74  hat pushOntoSort
88c0: 65 72 28 29 20 77 69 6c 6c 20 67 65 6e 65 72 61  er() will genera
88d0: 74 65 2e 0a 20 20 20 20 20 20 2a 2a 20 54 68 69  te..      ** Thi
88e0: 73 20 61 6c 6c 6f 77 73 20 74 68 65 20 70 2d 3e  s allows the p->
88f0: 70 45 4c 69 73 74 20 66 69 65 6c 64 20 74 6f 20  pEList field to 
8900: 62 65 20 6f 6d 69 74 74 65 64 20 66 72 6f 6d 20  be omitted from 
8910: 74 68 65 20 73 6f 72 74 65 64 20 72 65 63 6f 72  the sorted recor
8920: 64 2c 0a 20 20 20 20 20 20 2a 2a 20 73 61 76 69  d,.      ** savi
8930: 6e 67 20 73 70 61 63 65 20 61 6e 64 20 43 50 55  ng space and CPU
8940: 20 63 79 63 6c 65 73 2e 20 20 2a 2f 0a 20 20 20   cycles.  */.   
8950: 20 20 20 65 63 65 6c 46 6c 61 67 73 20 7c 3d 20     ecelFlags |= 
8960: 28 53 51 4c 49 54 45 5f 45 43 45 4c 5f 4f 4d 49  (SQLITE_ECEL_OMI
8970: 54 52 45 46 7c 53 51 4c 49 54 45 5f 45 43 45 4c  TREF|SQLITE_ECEL
8980: 5f 52 45 46 29 3b 0a 0a 20 20 20 20 20 20 66 6f  _REF);..      fo
8990: 72 28 69 3d 70 53 6f 72 74 2d 3e 6e 4f 42 53 61  r(i=pSort->nOBSa
89a0: 74 3b 20 69 3c 70 53 6f 72 74 2d 3e 70 4f 72 64  t; i<pSort->pOrd
89b0: 65 72 42 79 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b  erBy->nExpr; i++
89c0: 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6a  ){.        int j
89d0: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 6a  ;.        if( (j
89e0: 20 3d 20 70 53 6f 72 74 2d 3e 70 4f 72 64 65 72   = pSort->pOrder
89f0: 42 79 2d 3e 61 5b 69 5d 2e 75 2e 78 2e 69 4f 72  By->a[i].u.x.iOr
8a00: 64 65 72 42 79 43 6f 6c 29 3e 30 20 29 7b 0a 20  derByCol)>0 ){. 
8a10: 20 20 20 20 20 20 20 20 20 70 2d 3e 70 45 4c 69           p->pELi
8a20: 73 74 2d 3e 61 5b 6a 2d 31 5d 2e 75 2e 78 2e 69  st->a[j-1].u.x.i
8a30: 4f 72 64 65 72 42 79 43 6f 6c 20 3d 20 69 2b 31  OrderByCol = i+1
8a40: 2d 70 53 6f 72 74 2d 3e 6e 4f 42 53 61 74 3b 0a  -pSort->nOBSat;.
8a50: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
8a60: 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  }.#ifdef SQLITE_
8a70: 45 4e 41 42 4c 45 5f 53 4f 52 54 45 52 5f 52 45  ENABLE_SORTER_RE
8a80: 46 45 52 45 4e 43 45 53 0a 20 20 20 20 20 20 73  FERENCES.      s
8a90: 65 6c 65 63 74 45 78 70 72 44 65 66 65 72 28 70  electExprDefer(p
8aa0: 50 61 72 73 65 2c 20 70 53 6f 72 74 2c 20 70 2d  Parse, pSort, p-
8ab0: 3e 70 45 4c 69 73 74 2c 20 26 70 45 78 74 72 61  >pEList, &pExtra
8ac0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45 78  );.      if( pEx
8ad0: 74 72 61 20 26 26 20 70 50 61 72 73 65 2d 3e 64  tra && pParse->d
8ae0: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 3d  b->mallocFailed=
8af0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  =0 ){.        /*
8b00: 20 49 66 20 74 68 65 72 65 20 61 72 65 20 61 6e   If there are an
8b10: 79 20 65 78 74 72 61 20 50 4b 20 63 6f 6c 75 6d  y extra PK colum
8b20: 6e 73 20 74 6f 20 61 64 64 20 74 6f 20 74 68 65  ns to add to the
8b30: 20 73 6f 72 74 65 72 20 72 65 63 6f 72 64 73 2c   sorter records,
8b40: 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6c 6c 6f  .        ** allo
8b50: 63 61 74 65 20 65 78 74 72 61 20 6d 65 6d 6f 72  cate extra memor
8b60: 79 20 63 65 6c 6c 73 20 61 6e 64 20 61 64 6a 75  y cells and adju
8b70: 73 74 20 74 68 65 20 4f 70 65 6e 45 70 68 65 6d  st the OpenEphem
8b80: 65 72 61 6c 20 0a 20 20 20 20 20 20 20 20 2a 2a  eral .        **
8b90: 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f 20   instruction to 
8ba0: 61 63 63 6f 75 6e 74 20 66 6f 72 20 74 68 65 20  account for the 
8bb0: 6c 61 72 67 65 72 20 72 65 63 6f 72 64 73 2e 20  larger records. 
8bc0: 54 68 69 73 20 69 73 20 6f 6e 6c 79 0a 20 20 20  This is only.   
8bd0: 20 20 20 20 20 2a 2a 20 72 65 71 75 69 72 65 64       ** required
8be0: 20 69 66 20 74 68 65 72 65 20 61 72 65 20 6f 6e   if there are on
8bf0: 65 20 6f 72 20 6d 6f 72 65 20 57 49 54 48 4f 55  e or more WITHOU
8c00: 54 20 52 4f 57 49 44 20 74 61 62 6c 65 73 20 77  T ROWID tables w
8c10: 69 74 68 0a 20 20 20 20 20 20 20 20 2a 2a 20 63  ith.        ** c
8c20: 6f 6d 70 6f 73 69 74 65 20 70 72 69 6d 61 72 79  omposite primary
8c30: 20 6b 65 79 73 20 69 6e 20 74 68 65 20 53 6f 72   keys in the Sor
8c40: 74 43 74 78 2e 61 44 65 66 65 72 5b 5d 20 61 72  tCtx.aDefer[] ar
8c50: 72 61 79 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20  ray.  */.       
8c60: 20 56 64 62 65 4f 70 20 2a 70 4f 70 20 3d 20 73   VdbeOp *pOp = s
8c70: 71 6c 69 74 65 33 56 64 62 65 47 65 74 4f 70 28  qlite3VdbeGetOp(
8c80: 76 2c 20 70 53 6f 72 74 2d 3e 61 64 64 72 53 6f  v, pSort->addrSo
8c90: 72 74 49 6e 64 65 78 29 3b 0a 20 20 20 20 20 20  rtIndex);.      
8ca0: 20 20 70 4f 70 2d 3e 70 32 20 2b 3d 20 28 70 45    pOp->p2 += (pE
8cb0: 78 74 72 61 2d 3e 6e 45 78 70 72 20 2d 20 70 53  xtra->nExpr - pS
8cc0: 6f 72 74 2d 3e 6e 44 65 66 65 72 29 3b 0a 20 20  ort->nDefer);.  
8cd0: 20 20 20 20 20 20 70 4f 70 2d 3e 70 34 2e 70 4b        pOp->p4.pK
8ce0: 65 79 49 6e 66 6f 2d 3e 6e 41 6c 6c 46 69 65 6c  eyInfo->nAllFiel
8cf0: 64 20 2b 3d 20 28 70 45 78 74 72 61 2d 3e 6e 45  d += (pExtra->nE
8d00: 78 70 72 20 2d 20 70 53 6f 72 74 2d 3e 6e 44 65  xpr - pSort->nDe
8d10: 66 65 72 29 3b 0a 20 20 20 20 20 20 20 20 70 50  fer);.        pP
8d20: 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 70 45  arse->nMem += pE
8d30: 78 74 72 61 2d 3e 6e 45 78 70 72 3b 0a 20 20 20  xtra->nExpr;.   
8d40: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20     }.#endif..   
8d50: 20 20 20 2f 2a 20 41 64 6a 75 73 74 20 6e 52 65     /* Adjust nRe
8d60: 73 75 6c 74 43 6f 6c 20 74 6f 20 61 63 63 6f 75  sultCol to accou
8d70: 6e 74 20 66 6f 72 20 63 6f 6c 75 6d 6e 73 20 74  nt for columns t
8d80: 68 61 74 20 61 72 65 20 6f 6d 69 74 74 65 64 0a  hat are omitted.
8d90: 20 20 20 20 20 20 2a 2a 20 66 72 6f 6d 20 74 68        ** from th
8da0: 65 20 73 6f 72 74 65 72 20 62 79 20 74 68 65 20  e sorter by the 
8db0: 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20 69 6e  optimizations in
8dc0: 20 74 68 69 73 20 62 72 61 6e 63 68 20 2a 2f 0a   this branch */.
8dd0: 20 20 20 20 20 20 70 45 4c 69 73 74 20 3d 20 70        pEList = p
8de0: 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 20 20 20 20  ->pEList;.      
8df0: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 45 4c 69 73  for(i=0; i<pELis
8e00: 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a  t->nExpr; i++){.
8e10: 20 20 20 20 20 20 20 20 69 66 28 20 70 45 4c 69          if( pELi
8e20: 73 74 2d 3e 61 5b 69 5d 2e 75 2e 78 2e 69 4f 72  st->a[i].u.x.iOr
8e30: 64 65 72 42 79 43 6f 6c 3e 30 0a 23 69 66 64 65  derByCol>0.#ifde
8e40: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
8e50: 53 4f 52 54 45 52 5f 52 45 46 45 52 45 4e 43 45  SORTER_REFERENCE
8e60: 53 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 70 45  S.         || pE
8e70: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 62 53 6f 72 74  List->a[i].bSort
8e80: 65 72 52 65 66 0a 23 65 6e 64 69 66 0a 20 20 20  erRef.#endif.   
8e90: 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
8ea0: 20 20 6e 52 65 73 75 6c 74 43 6f 6c 2d 2d 3b 0a    nResultCol--;.
8eb0: 20 20 20 20 20 20 20 20 20 20 72 65 67 4f 72 69            regOri
8ec0: 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d  g = 0;.        }
8ed0: 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
8ee0: 74 65 73 74 63 61 73 65 28 20 72 65 67 4f 72 69  testcase( regOri
8ef0: 67 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  g );.      testc
8f00: 61 73 65 28 20 65 44 65 73 74 3d 3d 53 52 54 5f  ase( eDest==SRT_
8f10: 53 65 74 20 29 3b 0a 20 20 20 20 20 20 74 65 73  Set );.      tes
8f20: 74 63 61 73 65 28 20 65 44 65 73 74 3d 3d 53 52  tcase( eDest==SR
8f30: 54 5f 4d 65 6d 20 29 3b 0a 20 20 20 20 20 20 74  T_Mem );.      t
8f40: 65 73 74 63 61 73 65 28 20 65 44 65 73 74 3d 3d  estcase( eDest==
8f50: 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 20 29 3b  SRT_Coroutine );
8f60: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
8f70: 20 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70   eDest==SRT_Outp
8f80: 75 74 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  ut );.      asse
8f90: 72 74 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 53  rt( eDest==SRT_S
8fa0: 65 74 20 7c 7c 20 65 44 65 73 74 3d 3d 53 52 54  et || eDest==SRT
8fb0: 5f 4d 65 6d 20 0a 20 20 20 20 20 20 20 20 20 20  _Mem .          
8fc0: 20 7c 7c 20 65 44 65 73 74 3d 3d 53 52 54 5f 43   || eDest==SRT_C
8fd0: 6f 72 6f 75 74 69 6e 65 20 7c 7c 20 65 44 65 73  oroutine || eDes
8fe0: 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20 29 3b  t==SRT_Output );
8ff0: 0a 20 20 20 20 7d 0a 20 20 20 20 73 52 6f 77 4c  .    }.    sRowL
9000: 6f 61 64 49 6e 66 6f 2e 72 65 67 52 65 73 75 6c  oadInfo.regResul
9010: 74 20 3d 20 72 65 67 52 65 73 75 6c 74 3b 0a 20  t = regResult;. 
9020: 20 20 20 73 52 6f 77 4c 6f 61 64 49 6e 66 6f 2e     sRowLoadInfo.
9030: 65 63 65 6c 46 6c 61 67 73 20 3d 20 65 63 65 6c  ecelFlags = ecel
9040: 46 6c 61 67 73 3b 0a 23 69 66 64 65 66 20 53 51  Flags;.#ifdef SQ
9050: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 4f 52 54  LITE_ENABLE_SORT
9060: 45 52 5f 52 45 46 45 52 45 4e 43 45 53 0a 20 20  ER_REFERENCES.  
9070: 20 20 73 52 6f 77 4c 6f 61 64 49 6e 66 6f 2e 70    sRowLoadInfo.p
9080: 45 78 74 72 61 20 3d 20 70 45 78 74 72 61 3b 0a  Extra = pExtra;.
9090: 20 20 20 20 73 52 6f 77 4c 6f 61 64 49 6e 66 6f      sRowLoadInfo
90a0: 2e 72 65 67 45 78 74 72 61 52 65 73 75 6c 74 20  .regExtraResult 
90b0: 3d 20 72 65 67 52 65 73 75 6c 74 20 2b 20 6e 52  = regResult + nR
90c0: 65 73 75 6c 74 43 6f 6c 3b 0a 20 20 20 20 69 66  esultCol;.    if
90d0: 28 20 70 45 78 74 72 61 20 29 20 6e 52 65 73 75  ( pExtra ) nResu
90e0: 6c 74 43 6f 6c 20 2b 3d 20 70 45 78 74 72 61 2d  ltCol += pExtra-
90f0: 3e 6e 45 78 70 72 3b 0a 23 65 6e 64 69 66 0a 20  >nExpr;.#endif. 
9100: 20 20 20 69 66 28 20 70 2d 3e 69 4c 69 6d 69 74     if( p->iLimit
9110: 0a 20 20 20 20 20 26 26 20 28 65 63 65 6c 46 6c  .     && (ecelFl
9120: 61 67 73 20 26 20 53 51 4c 49 54 45 5f 45 43 45  ags & SQLITE_ECE
9130: 4c 5f 4f 4d 49 54 52 45 46 29 21 3d 30 20 0a 20  L_OMITREF)!=0 . 
9140: 20 20 20 20 26 26 20 6e 50 72 65 66 69 78 52 65      && nPrefixRe
9150: 67 3e 30 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  g>0.    ){.     
9160: 20 61 73 73 65 72 74 28 20 70 53 6f 72 74 21 3d   assert( pSort!=
9170: 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  0 );.      asser
9180: 74 28 20 68 61 73 44 69 73 74 69 6e 63 74 3d 3d  t( hasDistinct==
9190: 30 20 29 3b 0a 20 20 20 20 20 20 70 53 6f 72 74  0 );.      pSort
91a0: 2d 3e 70 44 65 66 65 72 72 65 64 52 6f 77 4c 6f  ->pDeferredRowLo
91b0: 61 64 20 3d 20 26 73 52 6f 77 4c 6f 61 64 49 6e  ad = &sRowLoadIn
91c0: 66 6f 3b 0a 20 20 20 20 20 20 72 65 67 4f 72 69  fo;.      regOri
91d0: 67 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65  g = 0;.    }else
91e0: 7b 0a 20 20 20 20 20 20 69 6e 6e 65 72 4c 6f 6f  {.      innerLoo
91f0: 70 4c 6f 61 64 52 6f 77 28 70 50 61 72 73 65 2c  pLoadRow(pParse,
9200: 20 70 2c 20 26 73 52 6f 77 4c 6f 61 64 49 6e 66   p, &sRowLoadInf
9210: 6f 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  o);.    }.  }.. 
9220: 20 2f 2a 20 49 66 20 74 68 65 20 44 49 53 54 49   /* If the DISTI
9230: 4e 43 54 20 6b 65 79 77 6f 72 64 20 77 61 73 20  NCT keyword was 
9240: 70 72 65 73 65 6e 74 20 6f 6e 20 74 68 65 20 53  present on the S
9250: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 0a  ELECT statement.
9260: 20 20 2a 2a 20 61 6e 64 20 74 68 69 73 20 72 6f    ** and this ro
9270: 77 20 68 61 73 20 62 65 65 6e 20 73 65 65 6e 20  w has been seen 
9280: 62 65 66 6f 72 65 2c 20 74 68 65 6e 20 64 6f 20  before, then do 
9290: 6e 6f 74 20 6d 61 6b 65 20 74 68 69 73 20 72 6f  not make this ro
92a0: 77 0a 20 20 2a 2a 20 70 61 72 74 20 6f 66 20 74  w.  ** part of t
92b0: 68 65 20 72 65 73 75 6c 74 2e 0a 20 20 2a 2f 0a  he result..  */.
92c0: 20 20 69 66 28 20 68 61 73 44 69 73 74 69 6e 63    if( hasDistinc
92d0: 74 20 29 7b 0a 20 20 20 20 73 77 69 74 63 68 28  t ){.    switch(
92e0: 20 70 44 69 73 74 69 6e 63 74 2d 3e 65 54 6e 63   pDistinct->eTnc
92f0: 74 54 79 70 65 20 29 7b 0a 20 20 20 20 20 20 63  tType ){.      c
9300: 61 73 65 20 57 48 45 52 45 5f 44 49 53 54 49 4e  ase WHERE_DISTIN
9310: 43 54 5f 4f 52 44 45 52 45 44 3a 20 7b 0a 20 20  CT_ORDERED: {.  
9320: 20 20 20 20 20 20 56 64 62 65 4f 70 20 2a 70 4f        VdbeOp *pO
9330: 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  p;            /*
9340: 20 4e 6f 20 6c 6f 6e 67 65 72 20 72 65 71 75 69   No longer requi
9350: 72 65 64 20 4f 70 65 6e 45 70 68 65 6d 65 72 61  red OpenEphemera
9360: 6c 20 69 6e 73 74 72 2e 20 2a 2f 0a 20 20 20 20  l instr. */.    
9370: 20 20 20 20 69 6e 74 20 69 4a 75 6d 70 3b 20 20      int iJump;  
9380: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4a              /* J
9390: 75 6d 70 20 64 65 73 74 69 6e 61 74 69 6f 6e 20  ump destination 
93a0: 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72  */.        int r
93b0: 65 67 50 72 65 76 3b 20 20 20 20 20 20 20 20 20  egPrev;         
93c0: 20 20 20 2f 2a 20 50 72 65 76 69 6f 75 73 20 72     /* Previous r
93d0: 6f 77 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 0a 20  ow content */.. 
93e0: 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 6f 63 61         /* Alloca
93f0: 74 65 20 73 70 61 63 65 20 66 6f 72 20 74 68 65  te space for the
9400: 20 70 72 65 76 69 6f 75 73 20 72 6f 77 20 2a 2f   previous row */
9410: 0a 20 20 20 20 20 20 20 20 72 65 67 50 72 65 76  .        regPrev
9420: 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b   = pParse->nMem+
9430: 31 3b 0a 20 20 20 20 20 20 20 20 70 50 61 72 73  1;.        pPars
9440: 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 52 65 73 75  e->nMem += nResu
9450: 6c 74 43 6f 6c 3b 0a 0a 20 20 20 20 20 20 20 20  ltCol;..        
9460: 2f 2a 20 43 68 61 6e 67 65 20 74 68 65 20 4f 50  /* Change the OP
9470: 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 63  _OpenEphemeral c
9480: 6f 64 65 64 20 65 61 72 6c 69 65 72 20 74 6f 20  oded earlier to 
9490: 61 6e 20 4f 50 5f 4e 75 6c 6c 0a 20 20 20 20 20  an OP_Null.     
94a0: 20 20 20 2a 2a 20 73 65 74 73 20 74 68 65 20 4d     ** sets the M
94b0: 45 4d 5f 43 6c 65 61 72 65 64 20 62 69 74 20 6f  EM_Cleared bit o
94c0: 6e 20 74 68 65 20 66 69 72 73 74 20 72 65 67 69  n the first regi
94d0: 73 74 65 72 20 6f 66 20 74 68 65 0a 20 20 20 20  ster of the.    
94e0: 20 20 20 20 2a 2a 20 70 72 65 76 69 6f 75 73 20      ** previous 
94f0: 76 61 6c 75 65 2e 20 20 54 68 69 73 20 77 69 6c  value.  This wil
9500: 6c 20 63 61 75 73 65 20 74 68 65 20 4f 50 5f 4e  l cause the OP_N
9510: 65 20 62 65 6c 6f 77 20 74 6f 20 61 6c 77 61 79  e below to alway
9520: 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 61 69  s.        ** fai
9530: 6c 20 6f 6e 20 74 68 65 20 66 69 72 73 74 20 69  l on the first i
9540: 74 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  teration of the 
9550: 6c 6f 6f 70 20 65 76 65 6e 20 69 66 20 74 68 65  loop even if the
9560: 20 66 69 72 73 74 0a 20 20 20 20 20 20 20 20 2a   first.        *
9570: 2a 20 72 6f 77 20 69 73 20 61 6c 6c 20 4e 55 4c  * row is all NUL
9580: 4c 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  Ls..        */. 
9590: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
95a0: 62 65 43 68 61 6e 67 65 54 6f 4e 6f 6f 70 28 76  beChangeToNoop(v
95b0: 2c 20 70 44 69 73 74 69 6e 63 74 2d 3e 61 64 64  , pDistinct->add
95c0: 72 54 6e 63 74 29 3b 0a 20 20 20 20 20 20 20 20  rTnct);.        
95d0: 70 4f 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62  pOp = sqlite3Vdb
95e0: 65 47 65 74 4f 70 28 76 2c 20 70 44 69 73 74 69  eGetOp(v, pDisti
95f0: 6e 63 74 2d 3e 61 64 64 72 54 6e 63 74 29 3b 0a  nct->addrTnct);.
9600: 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 6f 70 63          pOp->opc
9610: 6f 64 65 20 3d 20 4f 50 5f 4e 75 6c 6c 3b 0a 20  ode = OP_Null;. 
9620: 20 20 20 20 20 20 20 70 4f 70 2d 3e 70 31 20 3d         pOp->p1 =
9630: 20 31 3b 0a 20 20 20 20 20 20 20 20 70 4f 70 2d   1;.        pOp-
9640: 3e 70 32 20 3d 20 72 65 67 50 72 65 76 3b 0a 0a  >p2 = regPrev;..
9650: 20 20 20 20 20 20 20 20 69 4a 75 6d 70 20 3d 20          iJump = 
9660: 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
9670: 6e 74 41 64 64 72 28 76 29 20 2b 20 6e 52 65 73  ntAddr(v) + nRes
9680: 75 6c 74 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20  ultCol;.        
9690: 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 52 65 73 75  for(i=0; i<nResu
96a0: 6c 74 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  ltCol; i++){.   
96b0: 20 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a         CollSeq *
96c0: 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45  pColl = sqlite3E
96d0: 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  xprCollSeq(pPars
96e0: 65 2c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b  e, p->pEList->a[
96f0: 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20  i].pExpr);.     
9700: 20 20 20 20 20 69 66 28 20 69 3c 6e 52 65 73 75       if( i<nResu
9710: 6c 74 43 6f 6c 2d 31 20 29 7b 0a 20 20 20 20 20  ltCol-1 ){.     
9720: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
9730: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4e  beAddOp3(v, OP_N
9740: 65 2c 20 72 65 67 52 65 73 75 6c 74 2b 69 2c 20  e, regResult+i, 
9750: 69 4a 75 6d 70 2c 20 72 65 67 50 72 65 76 2b 69  iJump, regPrev+i
9760: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 56  );.            V
9770: 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
9780: 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
9790: 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
97a0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
97b0: 2c 20 4f 50 5f 45 71 2c 20 72 65 67 52 65 73 75  , OP_Eq, regResu
97c0: 6c 74 2b 69 2c 20 69 43 6f 6e 74 69 6e 75 65 2c  lt+i, iContinue,
97d0: 20 72 65 67 50 72 65 76 2b 69 29 3b 0a 20 20 20   regPrev+i);.   
97e0: 20 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 76           VdbeCov
97f0: 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20  erage(v);.      
9800: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
9810: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
9820: 67 65 50 34 28 76 2c 20 2d 31 2c 20 28 63 6f 6e  geP4(v, -1, (con
9830: 73 74 20 63 68 61 72 20 2a 29 70 43 6f 6c 6c 2c  st char *)pColl,
9840: 20 50 34 5f 43 4f 4c 4c 53 45 51 29 3b 0a 20 20   P4_COLLSEQ);.  
9850: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
9860: 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 53  dbeChangeP5(v, S
9870: 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 29 3b 0a 20  QLITE_NULLEQ);. 
9880: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
9890: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
98a0: 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
98b0: 76 29 3d 3d 69 4a 75 6d 70 20 7c 7c 20 70 50 61  v)==iJump || pPa
98c0: 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  rse->db->mallocF
98d0: 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 20 20 20  ailed );.       
98e0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
98f0: 70 33 28 76 2c 20 4f 50 5f 43 6f 70 79 2c 20 72  p3(v, OP_Copy, r
9900: 65 67 52 65 73 75 6c 74 2c 20 72 65 67 50 72 65  egResult, regPre
9910: 76 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 2d 31 29  v, nResultCol-1)
9920: 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
9930: 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
9940: 63 61 73 65 20 57 48 45 52 45 5f 44 49 53 54 49  case WHERE_DISTI
9950: 4e 43 54 5f 55 4e 49 51 55 45 3a 20 7b 0a 20 20  NCT_UNIQUE: {.  
9960: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
9970: 65 43 68 61 6e 67 65 54 6f 4e 6f 6f 70 28 76 2c  eChangeToNoop(v,
9980: 20 70 44 69 73 74 69 6e 63 74 2d 3e 61 64 64 72   pDistinct->addr
9990: 54 6e 63 74 29 3b 0a 20 20 20 20 20 20 20 20 62  Tnct);.        b
99a0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  reak;.      }.. 
99b0: 20 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a       default: {.
99c0: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
99d0: 70 44 69 73 74 69 6e 63 74 2d 3e 65 54 6e 63 74  pDistinct->eTnct
99e0: 54 79 70 65 3d 3d 57 48 45 52 45 5f 44 49 53 54  Type==WHERE_DIST
99f0: 49 4e 43 54 5f 55 4e 4f 52 44 45 52 45 44 20 29  INCT_UNORDERED )
9a00: 3b 0a 20 20 20 20 20 20 20 20 63 6f 64 65 44 69  ;.        codeDi
9a10: 73 74 69 6e 63 74 28 70 50 61 72 73 65 2c 20 70  stinct(pParse, p
9a20: 44 69 73 74 69 6e 63 74 2d 3e 74 61 62 54 6e 63  Distinct->tabTnc
9a30: 74 2c 20 69 43 6f 6e 74 69 6e 75 65 2c 20 6e 52  t, iContinue, nR
9a40: 65 73 75 6c 74 43 6f 6c 2c 0a 20 20 20 20 20 20  esultCol,.      
9a50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
9a60: 65 67 52 65 73 75 6c 74 29 3b 0a 20 20 20 20 20  egResult);.     
9a70: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
9a80: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
9a90: 70 53 6f 72 74 3d 3d 30 20 29 7b 0a 20 20 20 20  pSort==0 ){.    
9aa0: 20 20 63 6f 64 65 4f 66 66 73 65 74 28 76 2c 20    codeOffset(v, 
9ab0: 70 2d 3e 69 4f 66 66 73 65 74 2c 20 69 43 6f 6e  p->iOffset, iCon
9ac0: 74 69 6e 75 65 29 3b 0a 20 20 20 20 7d 0a 20 20  tinue);.    }.  
9ad0: 7d 0a 0a 20 20 73 77 69 74 63 68 28 20 65 44 65  }..  switch( eDe
9ae0: 73 74 20 29 7b 0a 20 20 20 20 2f 2a 20 49 6e 20  st ){.    /* In 
9af0: 74 68 69 73 20 6d 6f 64 65 2c 20 77 72 69 74 65  this mode, write
9b00: 20 65 61 63 68 20 71 75 65 72 79 20 72 65 73 75   each query resu
9b10: 6c 74 20 74 6f 20 74 68 65 20 6b 65 79 20 6f 66  lt to the key of
9b20: 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 0a 20   the temporary. 
9b30: 20 20 20 2a 2a 20 74 61 62 6c 65 20 69 50 61 72     ** table iPar
9b40: 6d 2e 0a 20 20 20 20 2a 2f 0a 23 69 66 6e 64 65  m..    */.#ifnde
9b50: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f  f SQLITE_OMIT_CO
9b60: 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 0a 20 20  MPOUND_SELECT.  
9b70: 20 20 63 61 73 65 20 53 52 54 5f 55 6e 69 6f 6e    case SRT_Union
9b80: 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 31  : {.      int r1
9b90: 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c  ;.      r1 = sql
9ba0: 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70  ite3GetTempReg(p
9bb0: 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 73 71  Parse);.      sq
9bc0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
9bd0: 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64  v, OP_MakeRecord
9be0: 2c 20 72 65 67 52 65 73 75 6c 74 2c 20 6e 52 65  , regResult, nRe
9bf0: 73 75 6c 74 43 6f 6c 2c 20 72 31 29 3b 0a 20 20  sultCol, r1);.  
9c00: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
9c10: 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 49  ddOp4Int(v, OP_I
9c20: 64 78 49 6e 73 65 72 74 2c 20 69 50 61 72 6d 2c  dxInsert, iParm,
9c30: 20 72 31 2c 20 72 65 67 52 65 73 75 6c 74 2c 20   r1, regResult, 
9c40: 6e 52 65 73 75 6c 74 43 6f 6c 29 3b 0a 20 20 20  nResultCol);.   
9c50: 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
9c60: 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
9c70: 20 72 31 29 3b 0a 20 20 20 20 20 20 62 72 65 61   r1);.      brea
9c80: 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  k;.    }..    /*
9c90: 20 43 6f 6e 73 74 72 75 63 74 20 61 20 72 65 63   Construct a rec
9ca0: 6f 72 64 20 66 72 6f 6d 20 74 68 65 20 71 75 65  ord from the que
9cb0: 72 79 20 72 65 73 75 6c 74 2c 20 62 75 74 20 69  ry result, but i
9cc0: 6e 73 74 65 61 64 20 6f 66 0a 20 20 20 20 2a 2a  nstead of.    **
9cd0: 20 73 61 76 69 6e 67 20 74 68 61 74 20 72 65 63   saving that rec
9ce0: 6f 72 64 2c 20 75 73 65 20 69 74 20 61 73 20 61  ord, use it as a
9cf0: 20 6b 65 79 20 74 6f 20 64 65 6c 65 74 65 20 65   key to delete e
9d00: 6c 65 6d 65 6e 74 73 20 66 72 6f 6d 0a 20 20 20  lements from.   
9d10: 20 2a 2a 20 74 68 65 20 74 65 6d 70 6f 72 61 72   ** the temporar
9d20: 79 20 74 61 62 6c 65 20 69 50 61 72 6d 2e 0a 20  y table iParm.. 
9d30: 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53     */.    case S
9d40: 52 54 5f 45 78 63 65 70 74 3a 20 7b 0a 20 20 20  RT_Except: {.   
9d50: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
9d60: 64 4f 70 33 28 76 2c 20 4f 50 5f 49 64 78 44 65  dOp3(v, OP_IdxDe
9d70: 6c 65 74 65 2c 20 69 50 61 72 6d 2c 20 72 65 67  lete, iParm, reg
9d80: 52 65 73 75 6c 74 2c 20 6e 52 65 73 75 6c 74 43  Result, nResultC
9d90: 6f 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  ol);.      break
9da0: 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f  ;.    }.#endif /
9db0: 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f  * SQLITE_OMIT_CO
9dc0: 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 20 2a 2f  MPOUND_SELECT */
9dd0: 0a 0a 20 20 20 20 2f 2a 20 53 74 6f 72 65 20 74  ..    /* Store t
9de0: 68 65 20 72 65 73 75 6c 74 20 61 73 20 64 61 74  he result as dat
9df0: 61 20 75 73 69 6e 67 20 61 20 75 6e 69 71 75 65  a using a unique
9e00: 20 6b 65 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20   key..    */.   
9e10: 20 63 61 73 65 20 53 52 54 5f 46 69 66 6f 3a 0a   case SRT_Fifo:.
9e20: 20 20 20 20 63 61 73 65 20 53 52 54 5f 44 69 73      case SRT_Dis
9e30: 74 46 69 66 6f 3a 0a 20 20 20 20 63 61 73 65 20  tFifo:.    case 
9e40: 53 52 54 5f 54 61 62 6c 65 3a 0a 20 20 20 20 63  SRT_Table:.    c
9e50: 61 73 65 20 53 52 54 5f 45 70 68 65 6d 54 61 62  ase SRT_EphemTab
9e60: 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 31  : {.      int r1
9e70: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
9e80: 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 6e  pRange(pParse, n
9e90: 50 72 65 66 69 78 52 65 67 2b 31 29 3b 0a 20 20  PrefixReg+1);.  
9ea0: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 65 44      testcase( eD
9eb0: 65 73 74 3d 3d 53 52 54 5f 54 61 62 6c 65 20 29  est==SRT_Table )
9ec0: 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
9ed0: 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 45 70 68  ( eDest==SRT_Eph
9ee0: 65 6d 54 61 62 20 29 3b 0a 20 20 20 20 20 20 74  emTab );.      t
9ef0: 65 73 74 63 61 73 65 28 20 65 44 65 73 74 3d 3d  estcase( eDest==
9f00: 53 52 54 5f 46 69 66 6f 20 29 3b 0a 20 20 20 20  SRT_Fifo );.    
9f10: 20 20 74 65 73 74 63 61 73 65 28 20 65 44 65 73    testcase( eDes
9f20: 74 3d 3d 53 52 54 5f 44 69 73 74 46 69 66 6f 20  t==SRT_DistFifo 
9f30: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
9f40: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
9f50: 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 65 67  _MakeRecord, reg
9f60: 52 65 73 75 6c 74 2c 20 6e 52 65 73 75 6c 74 43  Result, nResultC
9f70: 6f 6c 2c 20 72 31 2b 6e 50 72 65 66 69 78 52 65  ol, r1+nPrefixRe
9f80: 67 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  g);.#ifndef SQLI
9f90: 54 45 5f 4f 4d 49 54 5f 43 54 45 0a 20 20 20 20  TE_OMIT_CTE.    
9fa0: 20 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54    if( eDest==SRT
9fb0: 5f 44 69 73 74 46 69 66 6f 20 29 7b 0a 20 20 20  _DistFifo ){.   
9fc0: 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 64       /* If the d
9fd0: 65 73 74 69 6e 61 74 69 6f 6e 20 69 73 20 44 69  estination is Di
9fe0: 73 74 46 69 66 6f 2c 20 74 68 65 6e 20 63 75 72  stFifo, then cur
9ff0: 73 6f 72 20 28 69 50 61 72 6d 2b 31 29 20 69 73  sor (iParm+1) is
a000: 20 6f 70 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a   open.        **
a010: 20 6f 6e 20 61 6e 20 65 70 68 65 6d 65 72 61 6c   on an ephemeral
a020: 20 69 6e 64 65 78 2e 20 49 66 20 74 68 65 20 63   index. If the c
a030: 75 72 72 65 6e 74 20 72 6f 77 20 69 73 20 61 6c  urrent row is al
a040: 72 65 61 64 79 20 70 72 65 73 65 6e 74 0a 20 20  ready present.  
a050: 20 20 20 20 20 20 2a 2a 20 69 6e 20 74 68 65 20        ** in the 
a060: 69 6e 64 65 78 2c 20 64 6f 20 6e 6f 74 20 77 72  index, do not wr
a070: 69 74 65 20 69 74 20 74 6f 20 74 68 65 20 6f 75  ite it to the ou
a080: 74 70 75 74 2e 20 49 66 20 6e 6f 74 2c 20 61 64  tput. If not, ad
a090: 64 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a  d the.        **
a0a0: 20 63 75 72 72 65 6e 74 20 72 6f 77 20 74 6f 20   current row to 
a0b0: 74 68 65 20 69 6e 64 65 78 20 61 6e 64 20 70 72  the index and pr
a0c0: 6f 63 65 65 64 20 77 69 74 68 20 77 72 69 74 69  oceed with writi
a0d0: 6e 67 20 69 74 20 74 6f 20 74 68 65 0a 20 20 20  ng it to the.   
a0e0: 20 20 20 20 20 2a 2a 20 6f 75 74 70 75 74 20 74       ** output t
a0f0: 61 62 6c 65 20 61 73 20 77 65 6c 6c 2e 20 20 2a  able as well.  *
a100: 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 61 64  /.        int ad
a110: 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  dr = sqlite3Vdbe
a120: 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 20 2b  CurrentAddr(v) +
a130: 20 34 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   4;.        sqli
a140: 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74  te3VdbeAddOp4Int
a150: 28 76 2c 20 4f 50 5f 46 6f 75 6e 64 2c 20 69 50  (v, OP_Found, iP
a160: 61 72 6d 2b 31 2c 20 61 64 64 72 2c 20 72 31 2c  arm+1, addr, r1,
a170: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62   0);.        Vdb
a180: 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
a190: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
a1a0: 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50  eAddOp4Int(v, OP
a1b0: 5f 49 64 78 49 6e 73 65 72 74 2c 20 69 50 61 72  _IdxInsert, iPar
a1c0: 6d 2b 31 2c 20 72 31 2c 72 65 67 52 65 73 75 6c  m+1, r1,regResul
a1d0: 74 2c 6e 52 65 73 75 6c 74 43 6f 6c 29 3b 0a 20  t,nResultCol);. 
a1e0: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
a1f0: 53 6f 72 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20  Sort==0 );.     
a200: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20   }.#endif.      
a210: 69 66 28 20 70 53 6f 72 74 20 29 7b 0a 20 20 20  if( pSort ){.   
a220: 20 20 20 20 20 61 73 73 65 72 74 28 20 72 65 67       assert( reg
a230: 52 65 73 75 6c 74 3d 3d 72 65 67 4f 72 69 67 20  Result==regOrig 
a240: 29 3b 0a 20 20 20 20 20 20 20 20 70 75 73 68 4f  );.        pushO
a250: 6e 74 6f 53 6f 72 74 65 72 28 70 50 61 72 73 65  ntoSorter(pParse
a260: 2c 20 70 53 6f 72 74 2c 20 70 2c 20 72 31 2b 6e  , pSort, p, r1+n
a270: 50 72 65 66 69 78 52 65 67 2c 20 72 65 67 4f 72  PrefixReg, regOr
a280: 69 67 2c 20 31 2c 20 6e 50 72 65 66 69 78 52 65  ig, 1, nPrefixRe
a290: 67 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  g);.      }else{
a2a0: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72 32 20  .        int r2 
a2b0: 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
a2c0: 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20  Reg(pParse);.   
a2d0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
a2e0: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 77  AddOp2(v, OP_New
a2f0: 52 6f 77 69 64 2c 20 69 50 61 72 6d 2c 20 72 32  Rowid, iParm, r2
a300: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
a310: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
a320: 4f 50 5f 49 6e 73 65 72 74 2c 20 69 50 61 72 6d  OP_Insert, iParm
a330: 2c 20 72 31 2c 20 72 32 29 3b 0a 20 20 20 20 20  , r1, r2);.     
a340: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
a350: 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41 47  angeP5(v, OPFLAG
a360: 5f 41 50 50 45 4e 44 29 3b 0a 20 20 20 20 20 20  _APPEND);.      
a370: 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
a380: 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
a390: 72 32 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  r2);.      }.   
a3a0: 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
a3b0: 65 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73  eTempRange(pPars
a3c0: 65 2c 20 72 31 2c 20 6e 50 72 65 66 69 78 52 65  e, r1, nPrefixRe
a3d0: 67 2b 31 29 3b 0a 20 20 20 20 20 20 62 72 65 61  g+1);.      brea
a3e0: 6b 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 6e 64 65  k;.    }..#ifnde
a3f0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  f SQLITE_OMIT_SU
a400: 42 51 55 45 52 59 0a 20 20 20 20 2f 2a 20 49 66  BQUERY.    /* If
a410: 20 77 65 20 61 72 65 20 63 72 65 61 74 69 6e 67   we are creating
a420: 20 61 20 73 65 74 20 66 6f 72 20 61 6e 20 22 65   a set for an "e
a430: 78 70 72 20 49 4e 20 28 53 45 4c 45 43 54 20 2e  xpr IN (SELECT .
a440: 2e 2e 29 22 20 63 6f 6e 73 74 72 75 63 74 2c 0a  ..)" construct,.
a450: 20 20 20 20 2a 2a 20 74 68 65 6e 20 74 68 65 72      ** then ther
a460: 65 20 73 68 6f 75 6c 64 20 62 65 20 61 20 73 69  e should be a si
a470: 6e 67 6c 65 20 69 74 65 6d 20 6f 6e 20 74 68 65  ngle item on the
a480: 20 73 74 61 63 6b 2e 20 20 57 72 69 74 65 20 74   stack.  Write t
a490: 68 69 73 0a 20 20 20 20 2a 2a 20 69 74 65 6d 20  his.    ** item 
a4a0: 69 6e 74 6f 20 74 68 65 20 73 65 74 20 74 61 62  into the set tab
a4b0: 6c 65 20 77 69 74 68 20 62 6f 67 75 73 20 64 61  le with bogus da
a4c0: 74 61 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63  ta..    */.    c
a4d0: 61 73 65 20 53 52 54 5f 53 65 74 3a 20 7b 0a 20  ase SRT_Set: {. 
a4e0: 20 20 20 20 20 69 66 28 20 70 53 6f 72 74 20 29       if( pSort )
a4f0: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 74 20  {.        /* At 
a500: 66 69 72 73 74 20 67 6c 61 6e 63 65 20 79 6f 75  first glance you
a510: 20 77 6f 75 6c 64 20 74 68 69 6e 6b 20 77 65 20   would think we 
a520: 63 6f 75 6c 64 20 6f 70 74 69 6d 69 7a 65 20 6f  could optimize o
a530: 75 74 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a  ut the.        *
a540: 2a 20 4f 52 44 45 52 20 42 59 20 69 6e 20 74 68  * ORDER BY in th
a550: 69 73 20 63 61 73 65 20 73 69 6e 63 65 20 74 68  is case since th
a560: 65 20 6f 72 64 65 72 20 6f 66 20 65 6e 74 72 69  e order of entri
a570: 65 73 20 69 6e 20 74 68 65 20 73 65 74 0a 20 20  es in the set.  
a580: 20 20 20 20 20 20 2a 2a 20 64 6f 65 73 20 6e 6f        ** does no
a590: 74 20 6d 61 74 74 65 72 2e 20 20 42 75 74 20 74  t matter.  But t
a5a0: 68 65 72 65 20 6d 69 67 68 74 20 62 65 20 61 20  here might be a 
a5b0: 4c 49 4d 49 54 20 63 6c 61 75 73 65 2c 20 69 6e  LIMIT clause, in
a5c0: 20 77 68 69 63 68 0a 20 20 20 20 20 20 20 20 2a   which.        *
a5d0: 2a 20 63 61 73 65 20 74 68 65 20 6f 72 64 65 72  * case the order
a5e0: 20 64 6f 65 73 20 6d 61 74 74 65 72 20 2a 2f 0a   does matter */.
a5f0: 20 20 20 20 20 20 20 20 70 75 73 68 4f 6e 74 6f          pushOnto
a600: 53 6f 72 74 65 72 28 0a 20 20 20 20 20 20 20 20  Sorter(.        
a610: 20 20 20 20 70 50 61 72 73 65 2c 20 70 53 6f 72      pParse, pSor
a620: 74 2c 20 70 2c 20 72 65 67 52 65 73 75 6c 74 2c  t, p, regResult,
a630: 20 72 65 67 4f 72 69 67 2c 20 6e 52 65 73 75 6c   regOrig, nResul
a640: 74 43 6f 6c 2c 20 6e 50 72 65 66 69 78 52 65 67  tCol, nPrefixReg
a650: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
a660: 20 20 20 20 20 20 20 20 69 6e 74 20 72 31 20 3d          int r1 =
a670: 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
a680: 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  eg(pParse);.    
a690: 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
a6a0: 74 65 33 53 74 72 6c 65 6e 33 30 28 70 44 65 73  te3Strlen30(pDes
a6b0: 74 2d 3e 7a 41 66 66 53 64 73 74 29 3d 3d 6e 52  t->zAffSdst)==nR
a6c0: 65 73 75 6c 74 43 6f 6c 20 29 3b 0a 20 20 20 20  esultCol );.    
a6d0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
a6e0: 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4d 61 6b 65  ddOp4(v, OP_Make
a6f0: 52 65 63 6f 72 64 2c 20 72 65 67 52 65 73 75 6c  Record, regResul
a700: 74 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 2c 20 0a  t, nResultCol, .
a710: 20 20 20 20 20 20 20 20 20 20 20 20 72 31 2c 20              r1, 
a720: 70 44 65 73 74 2d 3e 7a 41 66 66 53 64 73 74 2c  pDest->zAffSdst,
a730: 20 6e 52 65 73 75 6c 74 43 6f 6c 29 3b 0a 20 20   nResultCol);.  
a740: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
a750: 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50  eAddOp4Int(v, OP
a760: 5f 49 64 78 49 6e 73 65 72 74 2c 20 69 50 61 72  _IdxInsert, iPar
a770: 6d 2c 20 72 31 2c 20 72 65 67 52 65 73 75 6c 74  m, r1, regResult
a780: 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 29 3b 0a 20  , nResultCol);. 
a790: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65         sqlite3Re
a7a0: 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
a7b0: 72 73 65 2c 20 72 31 29 3b 0a 20 20 20 20 20 20  rse, r1);.      
a7c0: 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
a7d0: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20     }..    /* If 
a7e0: 61 6e 79 20 72 6f 77 20 65 78 69 73 74 20 69 6e  any row exist in
a7f0: 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 2c   the result set,
a800: 20 72 65 63 6f 72 64 20 74 68 61 74 20 66 61 63   record that fac
a810: 74 20 61 6e 64 20 61 62 6f 72 74 2e 0a 20 20 20  t and abort..   
a820: 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54   */.    case SRT
a830: 5f 45 78 69 73 74 73 3a 20 7b 0a 20 20 20 20 20  _Exists: {.     
a840: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
a850: 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
a860: 2c 20 31 2c 20 69 50 61 72 6d 29 3b 0a 20 20 20  , 1, iParm);.   
a870: 20 20 20 2f 2a 20 54 68 65 20 4c 49 4d 49 54 20     /* The LIMIT 
a880: 63 6c 61 75 73 65 20 77 69 6c 6c 20 74 65 72 6d  clause will term
a890: 69 6e 61 74 65 20 74 68 65 20 6c 6f 6f 70 20 66  inate the loop f
a8a0: 6f 72 20 75 73 20 2a 2f 0a 20 20 20 20 20 20 62  or us */.      b
a8b0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  reak;.    }..   
a8c0: 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61   /* If this is a
a8d0: 20 73 63 61 6c 61 72 20 73 65 6c 65 63 74 20 74   scalar select t
a8e0: 68 61 74 20 69 73 20 70 61 72 74 20 6f 66 20 61  hat is part of a
a8f0: 6e 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 74 68  n expression, th
a900: 65 6e 0a 20 20 20 20 2a 2a 20 73 74 6f 72 65 20  en.    ** store 
a910: 74 68 65 20 72 65 73 75 6c 74 73 20 69 6e 20 74  the results in t
a920: 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 20 6d  he appropriate m
a930: 65 6d 6f 72 79 20 63 65 6c 6c 20 6f 72 20 61 72  emory cell or ar
a940: 72 61 79 20 6f 66 20 0a 20 20 20 20 2a 2a 20 6d  ray of .    ** m
a950: 65 6d 6f 72 79 20 63 65 6c 6c 73 20 61 6e 64 20  emory cells and 
a960: 62 72 65 61 6b 20 6f 75 74 20 6f 66 20 74 68 65  break out of the
a970: 20 73 63 61 6e 20 6c 6f 6f 70 2e 0a 20 20 20 20   scan loop..    
a980: 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f  */.    case SRT_
a990: 4d 65 6d 3a 20 7b 0a 20 20 20 20 20 20 69 66 28  Mem: {.      if(
a9a0: 20 70 53 6f 72 74 20 29 7b 0a 20 20 20 20 20 20   pSort ){.      
a9b0: 20 20 61 73 73 65 72 74 28 20 6e 52 65 73 75 6c    assert( nResul
a9c0: 74 43 6f 6c 3c 3d 70 44 65 73 74 2d 3e 6e 53 64  tCol<=pDest->nSd
a9d0: 73 74 20 29 3b 0a 20 20 20 20 20 20 20 20 70 75  st );.        pu
a9e0: 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28 0a 20 20  shOntoSorter(.  
a9f0: 20 20 20 20 20 20 20 20 20 20 70 50 61 72 73 65            pParse
aa00: 2c 20 70 53 6f 72 74 2c 20 70 2c 20 72 65 67 52  , pSort, p, regR
aa10: 65 73 75 6c 74 2c 20 72 65 67 4f 72 69 67 2c 20  esult, regOrig, 
aa20: 6e 52 65 73 75 6c 74 43 6f 6c 2c 20 6e 50 72 65  nResultCol, nPre
aa30: 66 69 78 52 65 67 29 3b 0a 20 20 20 20 20 20 7d  fixReg);.      }
aa40: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61 73  else{.        as
aa50: 73 65 72 74 28 20 6e 52 65 73 75 6c 74 43 6f 6c  sert( nResultCol
aa60: 3d 3d 70 44 65 73 74 2d 3e 6e 53 64 73 74 20 29  ==pDest->nSdst )
aa70: 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
aa80: 28 20 72 65 67 52 65 73 75 6c 74 3d 3d 69 50 61  ( regResult==iPa
aa90: 72 6d 20 29 3b 0a 20 20 20 20 20 20 20 20 2f 2a  rm );.        /*
aaa0: 20 54 68 65 20 4c 49 4d 49 54 20 63 6c 61 75 73   The LIMIT claus
aab0: 65 20 77 69 6c 6c 20 6a 75 6d 70 20 6f 75 74 20  e will jump out 
aac0: 6f 66 20 74 68 65 20 6c 6f 6f 70 20 66 6f 72 20  of the loop for 
aad0: 75 73 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20  us */.      }.  
aae0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
aaf0: 0a 23 65 6e 64 69 66 20 2f 2a 20 23 69 66 6e 64  .#endif /* #ifnd
ab00: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
ab10: 55 42 51 55 45 52 59 20 2a 2f 0a 0a 20 20 20 20  UBQUERY */..    
ab20: 63 61 73 65 20 53 52 54 5f 43 6f 72 6f 75 74 69  case SRT_Corouti
ab30: 6e 65 3a 20 20 20 20 20 20 20 2f 2a 20 53 65 6e  ne:       /* Sen
ab40: 64 20 64 61 74 61 20 74 6f 20 61 20 63 6f 2d 72  d data to a co-r
ab50: 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 20 20 63 61  outine */.    ca
ab60: 73 65 20 53 52 54 5f 4f 75 74 70 75 74 3a 20 7b  se SRT_Output: {
ab70: 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
ab80: 6e 20 74 68 65 20 72 65 73 75 6c 74 73 20 2a 2f  n the results */
ab90: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
aba0: 20 65 44 65 73 74 3d 3d 53 52 54 5f 43 6f 72 6f   eDest==SRT_Coro
abb0: 75 74 69 6e 65 20 29 3b 0a 20 20 20 20 20 20 74  utine );.      t
abc0: 65 73 74 63 61 73 65 28 20 65 44 65 73 74 3d 3d  estcase( eDest==
abd0: 53 52 54 5f 4f 75 74 70 75 74 20 29 3b 0a 20 20  SRT_Output );.  
abe0: 20 20 20 20 69 66 28 20 70 53 6f 72 74 20 29 7b      if( pSort ){
abf0: 0a 20 20 20 20 20 20 20 20 70 75 73 68 4f 6e 74  .        pushOnt
ac00: 6f 53 6f 72 74 65 72 28 70 50 61 72 73 65 2c 20  oSorter(pParse, 
ac10: 70 53 6f 72 74 2c 20 70 2c 20 72 65 67 52 65 73  pSort, p, regRes
ac20: 75 6c 74 2c 20 72 65 67 4f 72 69 67 2c 20 6e 52  ult, regOrig, nR
ac30: 65 73 75 6c 74 43 6f 6c 2c 0a 20 20 20 20 20 20  esultCol,.      
ac40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ac50: 20 6e 50 72 65 66 69 78 52 65 67 29 3b 0a 20 20   nPrefixReg);.  
ac60: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 65 44      }else if( eD
ac70: 65 73 74 3d 3d 53 52 54 5f 43 6f 72 6f 75 74 69  est==SRT_Corouti
ac80: 6e 65 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  ne ){.        sq
ac90: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
aca0: 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 70 44 65  v, OP_Yield, pDe
acb0: 73 74 2d 3e 69 53 44 50 61 72 6d 29 3b 0a 20 20  st->iSDParm);.  
acc0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
acd0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
ace0: 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 73 75 6c  dOp2(v, OP_Resul
acf0: 74 52 6f 77 2c 20 72 65 67 52 65 73 75 6c 74 2c  tRow, regResult,
ad00: 20 6e 52 65 73 75 6c 74 43 6f 6c 29 3b 0a 20 20   nResultCol);.  
ad10: 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
ad20: 6b 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 6e 64 65  k;.    }..#ifnde
ad30: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 54  f SQLITE_OMIT_CT
ad40: 45 0a 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74  E.    /* Write t
ad50: 68 65 20 72 65 73 75 6c 74 73 20 69 6e 74 6f 20  he results into 
ad60: 61 20 70 72 69 6f 72 69 74 79 20 71 75 65 75 65  a priority queue
ad70: 20 74 68 61 74 20 69 73 20 6f 72 64 65 72 20 61   that is order a
ad80: 63 63 6f 72 64 69 6e 67 20 74 6f 0a 20 20 20 20  ccording to.    
ad90: 2a 2a 20 70 44 65 73 74 2d 3e 70 4f 72 64 65 72  ** pDest->pOrder
ada0: 42 79 20 28 69 6e 20 70 53 4f 29 2e 20 20 70 44  By (in pSO).  pD
adb0: 65 73 74 2d 3e 69 53 44 50 61 72 6d 20 28 69 6e  est->iSDParm (in
adc0: 20 69 50 61 72 6d 29 20 69 73 20 74 68 65 20 63   iParm) is the c
add0: 75 72 73 6f 72 20 66 6f 72 20 61 6e 0a 20 20 20  ursor for an.   
ade0: 20 2a 2a 20 69 6e 64 65 78 20 77 69 74 68 20 70   ** index with p
adf0: 53 4f 2d 3e 6e 45 78 70 72 2b 32 20 63 6f 6c 75  SO->nExpr+2 colu
ae00: 6d 6e 73 2e 20 20 42 75 69 6c 64 20 61 20 6b 65  mns.  Build a ke
ae10: 79 20 75 73 69 6e 67 20 70 53 4f 20 66 6f 72 20  y using pSO for 
ae20: 74 68 65 20 66 69 72 73 74 0a 20 20 20 20 2a 2a  the first.    **
ae30: 20 70 53 4f 2d 3e 6e 45 78 70 72 20 63 6f 6c 75   pSO->nExpr colu
ae40: 6d 6e 73 2c 20 74 68 65 6e 20 6d 61 6b 65 20 73  mns, then make s
ae50: 75 72 65 20 61 6c 6c 20 6b 65 79 73 20 61 72 65  ure all keys are
ae60: 20 75 6e 69 71 75 65 20 62 79 20 61 64 64 69 6e   unique by addin
ae70: 67 20 61 0a 20 20 20 20 2a 2a 20 66 69 6e 61 6c  g a.    ** final
ae80: 20 4f 50 5f 53 65 71 75 65 6e 63 65 20 63 6f 6c   OP_Sequence col
ae90: 75 6d 6e 2e 20 20 54 68 65 20 6c 61 73 74 20 63  umn.  The last c
aea0: 6f 6c 75 6d 6e 20 69 73 20 74 68 65 20 72 65 63  olumn is the rec
aeb0: 6f 72 64 20 61 73 20 61 20 62 6c 6f 62 2e 0a 20  ord as a blob.. 
aec0: 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53     */.    case S
aed0: 52 54 5f 44 69 73 74 51 75 65 75 65 3a 0a 20 20  RT_DistQueue:.  
aee0: 20 20 63 61 73 65 20 53 52 54 5f 51 75 65 75 65    case SRT_Queue
aef0: 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 4b  : {.      int nK
af00: 65 79 3b 0a 20 20 20 20 20 20 69 6e 74 20 72 31  ey;.      int r1
af10: 2c 20 72 32 2c 20 72 33 3b 0a 20 20 20 20 20 20  , r2, r3;.      
af20: 69 6e 74 20 61 64 64 72 54 65 73 74 20 3d 20 30  int addrTest = 0
af30: 3b 0a 20 20 20 20 20 20 45 78 70 72 4c 69 73 74  ;.      ExprList
af40: 20 2a 70 53 4f 3b 0a 20 20 20 20 20 20 70 53 4f   *pSO;.      pSO
af50: 20 3d 20 70 44 65 73 74 2d 3e 70 4f 72 64 65 72   = pDest->pOrder
af60: 42 79 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  By;.      assert
af70: 28 20 70 53 4f 20 29 3b 0a 20 20 20 20 20 20 6e  ( pSO );.      n
af80: 4b 65 79 20 3d 20 70 53 4f 2d 3e 6e 45 78 70 72  Key = pSO->nExpr
af90: 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c  ;.      r1 = sql
afa0: 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70  ite3GetTempReg(p
afb0: 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 72 32  Parse);.      r2
afc0: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
afd0: 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 6e  pRange(pParse, n
afe0: 4b 65 79 2b 32 29 3b 0a 20 20 20 20 20 20 72 33  Key+2);.      r3
aff0: 20 3d 20 72 32 2b 6e 4b 65 79 2b 31 3b 0a 20 20   = r2+nKey+1;.  
b000: 20 20 20 20 69 66 28 20 65 44 65 73 74 3d 3d 53      if( eDest==S
b010: 52 54 5f 44 69 73 74 51 75 65 75 65 20 29 7b 0a  RT_DistQueue ){.
b020: 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68          /* If th
b030: 65 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 69 73  e destination is
b040: 20 44 69 73 74 51 75 65 75 65 2c 20 74 68 65 6e   DistQueue, then
b050: 20 63 75 72 73 6f 72 20 28 69 50 61 72 6d 2b 31   cursor (iParm+1
b060: 29 20 69 73 20 6f 70 65 6e 0a 20 20 20 20 20 20  ) is open.      
b070: 20 20 2a 2a 20 6f 6e 20 61 20 73 65 63 6f 6e 64    ** on a second
b080: 20 65 70 68 65 6d 65 72 61 6c 20 69 6e 64 65 78   ephemeral index
b090: 20 74 68 61 74 20 68 6f 6c 64 73 20 61 6c 6c 20   that holds all 
b0a0: 76 61 6c 75 65 73 20 65 76 65 72 79 20 70 72 65  values every pre
b0b0: 76 69 6f 75 73 6c 79 0a 20 20 20 20 20 20 20 20  viously.        
b0c0: 2a 2a 20 61 64 64 65 64 20 74 6f 20 74 68 65 20  ** added to the 
b0d0: 71 75 65 75 65 2e 20 2a 2f 0a 20 20 20 20 20 20  queue. */.      
b0e0: 20 20 61 64 64 72 54 65 73 74 20 3d 20 73 71 6c    addrTest = sql
b0f0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e  ite3VdbeAddOp4In
b100: 74 28 76 2c 20 4f 50 5f 46 6f 75 6e 64 2c 20 69  t(v, OP_Found, i
b110: 50 61 72 6d 2b 31 2c 20 30 2c 20 0a 20 20 20 20  Parm+1, 0, .    
b120: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b130: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b140: 20 20 20 20 72 65 67 52 65 73 75 6c 74 2c 20 6e      regResult, n
b150: 52 65 73 75 6c 74 43 6f 6c 29 3b 0a 20 20 20 20  ResultCol);.    
b160: 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
b170: 28 76 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  (v);.      }.   
b180: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
b190: 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52  dOp3(v, OP_MakeR
b1a0: 65 63 6f 72 64 2c 20 72 65 67 52 65 73 75 6c 74  ecord, regResult
b1b0: 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 2c 20 72 33  , nResultCol, r3
b1c0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 65 44 65  );.      if( eDe
b1d0: 73 74 3d 3d 53 52 54 5f 44 69 73 74 51 75 65 75  st==SRT_DistQueu
b1e0: 65 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  e ){.        sql
b1f0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
b200: 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20  , OP_IdxInsert, 
b210: 69 50 61 72 6d 2b 31 2c 20 72 33 29 3b 0a 20 20  iParm+1, r3);.  
b220: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
b230: 65 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46  eChangeP5(v, OPF
b240: 4c 41 47 5f 55 53 45 53 45 45 4b 52 45 53 55 4c  LAG_USESEEKRESUL
b250: 54 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  T);.      }.    
b260: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4b 65    for(i=0; i<nKe
b270: 79 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  y; i++){.       
b280: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
b290: 70 32 28 76 2c 20 4f 50 5f 53 43 6f 70 79 2c 0a  p2(v, OP_SCopy,.
b2a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b2b0: 20 20 20 20 20 20 20 20 20 20 72 65 67 52 65 73            regRes
b2c0: 75 6c 74 20 2b 20 70 53 4f 2d 3e 61 5b 69 5d 2e  ult + pSO->a[i].
b2d0: 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 20  u.x.iOrderByCol 
b2e0: 2d 20 31 2c 0a 20 20 20 20 20 20 20 20 20 20 20  - 1,.           
b2f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
b300: 32 2b 69 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  2+i);.      }.  
b310: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
b320: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 65 71 75  ddOp2(v, OP_Sequ
b330: 65 6e 63 65 2c 20 69 50 61 72 6d 2c 20 72 32 2b  ence, iParm, r2+
b340: 6e 4b 65 79 29 3b 0a 20 20 20 20 20 20 73 71 6c  nKey);.      sql
b350: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
b360: 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c  , OP_MakeRecord,
b370: 20 72 32 2c 20 6e 4b 65 79 2b 32 2c 20 72 31 29   r2, nKey+2, r1)
b380: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
b390: 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20  dbeAddOp4Int(v, 
b3a0: 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 69 50  OP_IdxInsert, iP
b3b0: 61 72 6d 2c 20 72 31 2c 20 72 32 2c 20 6e 4b 65  arm, r1, r2, nKe
b3c0: 79 2b 32 29 3b 0a 20 20 20 20 20 20 69 66 28 20  y+2);.      if( 
b3d0: 61 64 64 72 54 65 73 74 20 29 20 73 71 6c 69 74  addrTest ) sqlit
b3e0: 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
b3f0: 2c 20 61 64 64 72 54 65 73 74 29 3b 0a 20 20 20  , addrTest);.   
b400: 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
b410: 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
b420: 20 72 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69   r1);.      sqli
b430: 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 61  te3ReleaseTempRa
b440: 6e 67 65 28 70 50 61 72 73 65 2c 20 72 32 2c 20  nge(pParse, r2, 
b450: 6e 4b 65 79 2b 32 29 3b 0a 20 20 20 20 20 20 62  nKey+2);.      b
b460: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  reak;.    }.#end
b470: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
b480: 54 5f 43 54 45 20 2a 2f 0a 0a 0a 0a 23 69 66 20  T_CTE */....#if 
b490: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
b4a0: 4f 4d 49 54 5f 54 52 49 47 47 45 52 29 0a 20 20  OMIT_TRIGGER).  
b4b0: 20 20 2f 2a 20 44 69 73 63 61 72 64 20 74 68 65    /* Discard the
b4c0: 20 72 65 73 75 6c 74 73 2e 20 20 54 68 69 73 20   results.  This 
b4d0: 69 73 20 75 73 65 64 20 66 6f 72 20 53 45 4c 45  is used for SELE
b4e0: 43 54 20 73 74 61 74 65 6d 65 6e 74 73 20 69 6e  CT statements in
b4f0: 73 69 64 65 0a 20 20 20 20 2a 2a 20 74 68 65 20  side.    ** the 
b500: 62 6f 64 79 20 6f 66 20 61 20 54 52 49 47 47 45  body of a TRIGGE
b510: 52 2e 20 20 54 68 65 20 70 75 72 70 6f 73 65 20  R.  The purpose 
b520: 6f 66 20 73 75 63 68 20 73 65 6c 65 63 74 73 20  of such selects 
b530: 69 73 20 74 6f 20 63 61 6c 6c 0a 20 20 20 20 2a  is to call.    *
b540: 2a 20 75 73 65 72 2d 64 65 66 69 6e 65 64 20 66  * user-defined f
b550: 75 6e 63 74 69 6f 6e 73 20 74 68 61 74 20 68 61  unctions that ha
b560: 76 65 20 73 69 64 65 20 65 66 66 65 63 74 73 2e  ve side effects.
b570: 20 20 57 65 20 64 6f 20 6e 6f 74 20 63 61 72 65    We do not care
b580: 0a 20 20 20 20 2a 2a 20 61 62 6f 75 74 20 74 68  .    ** about th
b590: 65 20 61 63 74 75 61 6c 20 72 65 73 75 6c 74 73  e actual results
b5a0: 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74 2e 0a   of the select..
b5b0: 20 20 20 20 2a 2f 0a 20 20 20 20 64 65 66 61 75      */.    defau
b5c0: 6c 74 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65  lt: {.      asse
b5d0: 72 74 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 44  rt( eDest==SRT_D
b5e0: 69 73 63 61 72 64 20 29 3b 0a 20 20 20 20 20 20  iscard );.      
b5f0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e  break;.    }.#en
b600: 64 69 66 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4a 75  dif.  }..  /* Ju
b610: 6d 70 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66  mp to the end of
b620: 20 74 68 65 20 6c 6f 6f 70 20 69 66 20 74 68 65   the loop if the
b630: 20 4c 49 4d 49 54 20 69 73 20 72 65 61 63 68 65   LIMIT is reache
b640: 64 2e 20 20 45 78 63 65 70 74 2c 20 69 66 0a 20  d.  Except, if. 
b650: 20 2a 2a 20 74 68 65 72 65 20 69 73 20 61 20 73   ** there is a s
b660: 6f 72 74 65 72 2c 20 69 6e 20 77 68 69 63 68 20  orter, in which 
b670: 63 61 73 65 20 74 68 65 20 73 6f 72 74 65 72 20  case the sorter 
b680: 68 61 73 20 61 6c 72 65 61 64 79 20 6c 69 6d 69  has already limi
b690: 74 65 64 0a 20 20 2a 2a 20 74 68 65 20 6f 75 74  ted.  ** the out
b6a0: 70 75 74 20 66 6f 72 20 75 73 2e 0a 20 20 2a 2f  put for us..  */
b6b0: 0a 20 20 69 66 28 20 70 53 6f 72 74 3d 3d 30 20  .  if( pSort==0 
b6c0: 26 26 20 70 2d 3e 69 4c 69 6d 69 74 20 29 7b 0a  && p->iLimit ){.
b6d0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
b6e0: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 44 65 63 72  ddOp2(v, OP_Decr
b6f0: 4a 75 6d 70 5a 65 72 6f 2c 20 70 2d 3e 69 4c 69  JumpZero, p->iLi
b700: 6d 69 74 2c 20 69 42 72 65 61 6b 29 3b 20 56 64  mit, iBreak); Vd
b710: 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
b720: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f   }.}../*.** Allo
b730: 63 61 74 65 20 61 20 4b 65 79 49 6e 66 6f 20 6f  cate a KeyInfo o
b740: 62 6a 65 63 74 20 73 75 66 66 69 63 69 65 6e 74  bject sufficient
b750: 20 66 6f 72 20 61 6e 20 69 6e 64 65 78 20 6f 66   for an index of
b760: 20 4e 20 6b 65 79 20 63 6f 6c 75 6d 6e 73 20 61   N key columns a
b770: 6e 64 0a 2a 2a 20 58 20 65 78 74 72 61 20 63 6f  nd.** X extra co
b780: 6c 75 6d 6e 73 2e 0a 2a 2f 0a 4b 65 79 49 6e 66  lumns..*/.KeyInf
b790: 6f 20 2a 73 71 6c 69 74 65 33 4b 65 79 49 6e 66  o *sqlite3KeyInf
b7a0: 6f 41 6c 6c 6f 63 28 73 71 6c 69 74 65 33 20 2a  oAlloc(sqlite3 *
b7b0: 64 62 2c 20 69 6e 74 20 4e 2c 20 69 6e 74 20 58  db, int N, int X
b7c0: 29 7b 0a 20 20 69 6e 74 20 6e 45 78 74 72 61 20  ){.  int nExtra 
b7d0: 3d 20 28 4e 2b 58 29 2a 28 73 69 7a 65 6f 66 28  = (N+X)*(sizeof(
b7e0: 43 6f 6c 6c 53 65 71 2a 29 2b 31 29 20 2d 20 73  CollSeq*)+1) - s
b7f0: 69 7a 65 6f 66 28 43 6f 6c 6c 53 65 71 2a 29 3b  izeof(CollSeq*);
b800: 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 20 3d 20  .  KeyInfo *p = 
b810: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52  sqlite3DbMallocR
b820: 61 77 4e 4e 28 64 62 2c 20 73 69 7a 65 6f 66 28  awNN(db, sizeof(
b830: 4b 65 79 49 6e 66 6f 29 20 2b 20 6e 45 78 74 72  KeyInfo) + nExtr
b840: 61 29 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20  a);.  if( p ){. 
b850: 20 20 20 70 2d 3e 61 53 6f 72 74 4f 72 64 65 72     p->aSortOrder
b860: 20 3d 20 28 75 38 2a 29 26 70 2d 3e 61 43 6f 6c   = (u8*)&p->aCol
b870: 6c 5b 4e 2b 58 5d 3b 0a 20 20 20 20 70 2d 3e 6e  l[N+X];.    p->n
b880: 4b 65 79 46 69 65 6c 64 20 3d 20 28 75 31 36 29  KeyField = (u16)
b890: 4e 3b 0a 20 20 20 20 70 2d 3e 6e 41 6c 6c 46 69  N;.    p->nAllFi
b8a0: 65 6c 64 20 3d 20 28 75 31 36 29 28 4e 2b 58 29  eld = (u16)(N+X)
b8b0: 3b 0a 20 20 20 20 70 2d 3e 65 6e 63 20 3d 20 45  ;.    p->enc = E
b8c0: 4e 43 28 64 62 29 3b 0a 20 20 20 20 70 2d 3e 64  NC(db);.    p->d
b8d0: 62 20 3d 20 64 62 3b 0a 20 20 20 20 70 2d 3e 6e  b = db;.    p->n
b8e0: 52 65 66 20 3d 20 31 3b 0a 20 20 20 20 6d 65 6d  Ref = 1;.    mem
b8f0: 73 65 74 28 26 70 5b 31 5d 2c 20 30 2c 20 6e 45  set(&p[1], 0, nE
b900: 78 74 72 61 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  xtra);.  }else{.
b910: 20 20 20 20 73 71 6c 69 74 65 33 4f 6f 6d 46 61      sqlite3OomFa
b920: 75 6c 74 28 64 62 29 3b 0a 20 20 7d 0a 20 20 72  ult(db);.  }.  r
b930: 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn p;.}../*.*
b940: 2a 20 44 65 61 6c 6c 6f 63 61 74 65 20 61 20 4b  * Deallocate a K
b950: 65 79 49 6e 66 6f 20 6f 62 6a 65 63 74 0a 2a 2f  eyInfo object.*/
b960: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 4b 65 79  .void sqlite3Key
b970: 49 6e 66 6f 55 6e 72 65 66 28 4b 65 79 49 6e 66  InfoUnref(KeyInf
b980: 6f 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 20 29  o *p){.  if( p )
b990: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  {.    assert( p-
b9a0: 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20 20 20 70  >nRef>0 );.    p
b9b0: 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 20 20 69 66  ->nRef--;.    if
b9c0: 28 20 70 2d 3e 6e 52 65 66 3d 3d 30 20 29 20 73  ( p->nRef==0 ) s
b9d0: 71 6c 69 74 65 33 44 62 46 72 65 65 4e 4e 28 70  qlite3DbFreeNN(p
b9e0: 2d 3e 64 62 2c 20 70 29 3b 0a 20 20 7d 0a 7d 0a  ->db, p);.  }.}.
b9f0: 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 61 20 6e 65  ./*.** Make a ne
ba00: 77 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 4b  w pointer to a K
ba10: 65 79 49 6e 66 6f 20 6f 62 6a 65 63 74 0a 2a 2f  eyInfo object.*/
ba20: 0a 4b 65 79 49 6e 66 6f 20 2a 73 71 6c 69 74 65  .KeyInfo *sqlite
ba30: 33 4b 65 79 49 6e 66 6f 52 65 66 28 4b 65 79 49  3KeyInfoRef(KeyI
ba40: 6e 66 6f 20 2a 70 29 7b 0a 20 20 69 66 28 20 70  nfo *p){.  if( p
ba50: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
ba60: 70 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20 20  p->nRef>0 );.   
ba70: 20 70 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 7d 0a   p->nRef++;.  }.
ba80: 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 23    return p;.}..#
ba90: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
baa0: 55 47 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  UG./*.** Return 
bab0: 54 52 55 45 20 69 66 20 61 20 4b 65 79 49 6e 66  TRUE if a KeyInf
bac0: 6f 20 6f 62 6a 65 63 74 20 63 61 6e 20 62 65 20  o object can be 
bad0: 63 68 61 6e 67 65 2e 20 20 54 68 65 20 4b 65 79  change.  The Key
bae0: 49 6e 66 6f 20 6f 62 6a 65 63 74 0a 2a 2a 20 63  Info object.** c
baf0: 61 6e 20 6f 6e 6c 79 20 62 65 20 63 68 61 6e 67  an only be chang
bb00: 65 64 20 69 66 20 74 68 69 73 20 69 73 20 6a 75  ed if this is ju
bb10: 73 74 20 61 20 73 69 6e 67 6c 65 20 72 65 66 65  st a single refe
bb20: 72 65 6e 63 65 20 74 6f 20 74 68 65 20 6f 62 6a  rence to the obj
bb30: 65 63 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ect..**.** This 
bb40: 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20  routine is used 
bb50: 6f 6e 6c 79 20 69 6e 73 69 64 65 20 6f 66 20 61  only inside of a
bb60: 73 73 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e  ssert() statemen
bb70: 74 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ts..*/.int sqlit
bb80: 65 33 4b 65 79 49 6e 66 6f 49 73 57 72 69 74 65  e3KeyInfoIsWrite
bb90: 61 62 6c 65 28 4b 65 79 49 6e 66 6f 20 2a 70 29  able(KeyInfo *p)
bba0: 7b 20 72 65 74 75 72 6e 20 70 2d 3e 6e 52 65 66  { return p->nRef
bbb0: 3d 3d 31 3b 20 7d 0a 23 65 6e 64 69 66 20 2f 2a  ==1; }.#endif /*
bbc0: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20 2a 2f   SQLITE_DEBUG */
bbd0: 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 6e  ../*.** Given an
bbe0: 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74   expression list
bbf0: 2c 20 67 65 6e 65 72 61 74 65 20 61 20 4b 65 79  , generate a Key
bc00: 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 74  Info structure t
bc10: 68 61 74 20 72 65 63 6f 72 64 73 0a 2a 2a 20 74  hat records.** t
bc20: 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71  he collating seq
bc30: 75 65 6e 63 65 20 66 6f 72 20 65 61 63 68 20 65  uence for each e
bc40: 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 74 68 61  xpression in tha
bc50: 74 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73  t expression lis
bc60: 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  t..**.** If the 
bc70: 45 78 70 72 4c 69 73 74 20 69 73 20 61 6e 20 4f  ExprList is an O
bc80: 52 44 45 52 20 42 59 20 6f 72 20 47 52 4f 55 50  RDER BY or GROUP
bc90: 20 42 59 20 63 6c 61 75 73 65 20 74 68 65 6e 20   BY clause then 
bca0: 74 68 65 20 72 65 73 75 6c 74 69 6e 67 0a 2a 2a  the resulting.**
bcb0: 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75   KeyInfo structu
bcc0: 72 65 20 69 73 20 61 70 70 72 6f 70 72 69 61 74  re is appropriat
bcd0: 65 20 66 6f 72 20 69 6e 69 74 69 61 6c 69 7a 69  e for initializi
bce0: 6e 67 20 61 20 76 69 72 74 75 61 6c 20 69 6e 64  ng a virtual ind
bcf0: 65 78 20 74 6f 0a 2a 2a 20 69 6d 70 6c 65 6d 65  ex to.** impleme
bd00: 6e 74 20 74 68 61 74 20 63 6c 61 75 73 65 2e 20  nt that clause. 
bd10: 20 49 66 20 74 68 65 20 45 78 70 72 4c 69 73 74   If the ExprList
bd20: 20 69 73 20 74 68 65 20 72 65 73 75 6c 74 20 73   is the result s
bd30: 65 74 20 6f 66 20 61 20 53 45 4c 45 43 54 0a 2a  et of a SELECT.*
bd40: 2a 20 74 68 65 6e 20 74 68 65 20 4b 65 79 49 6e  * then the KeyIn
bd50: 66 6f 20 73 74 72 75 63 74 75 72 65 20 69 73 20  fo structure is 
bd60: 61 70 70 72 6f 70 72 69 61 74 65 20 66 6f 72 20  appropriate for 
bd70: 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20 61 20 76  initializing a v
bd80: 69 72 74 75 61 6c 0a 2a 2a 20 69 6e 64 65 78 20  irtual.** index 
bd90: 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 61 20 44  to implement a D
bda0: 49 53 54 49 4e 43 54 20 74 65 73 74 2e 0a 2a 2a  ISTINCT test..**
bdb0: 0a 2a 2a 20 53 70 61 63 65 20 74 6f 20 68 6f 6c  .** Space to hol
bdc0: 64 20 74 68 65 20 4b 65 79 49 6e 66 6f 20 73 74  d the KeyInfo st
bdd0: 72 75 63 74 75 72 65 20 69 73 20 6f 62 74 61 69  ructure is obtai
bde0: 6e 65 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 2e  ned from malloc.
bdf0: 20 20 54 68 65 20 63 61 6c 6c 69 6e 67 0a 2a 2a    The calling.**
be00: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 72 65 73   function is res
be10: 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 73 65 65  ponsible for see
be20: 69 6e 67 20 74 68 61 74 20 74 68 69 73 20 73 74  ing that this st
be30: 72 75 63 74 75 72 65 20 69 73 20 65 76 65 6e 74  ructure is event
be40: 75 61 6c 6c 79 0a 2a 2a 20 66 72 65 65 64 2e 0a  ually.** freed..
be50: 2a 2f 0a 4b 65 79 49 6e 66 6f 20 2a 73 71 6c 69  */.KeyInfo *sqli
be60: 74 65 33 4b 65 79 49 6e 66 6f 46 72 6f 6d 45 78  te3KeyInfoFromEx
be70: 70 72 4c 69 73 74 28 0a 20 20 50 61 72 73 65 20  prList(.  Parse 
be80: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 2f  *pParse,       /
be90: 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
bea0: 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  t */.  ExprList 
beb0: 2a 70 4c 69 73 74 2c 20 20 20 20 20 2f 2a 20 46  *pList,     /* F
bec0: 6f 72 6d 20 74 68 65 20 4b 65 79 49 6e 66 6f 20  orm the KeyInfo 
bed0: 6f 62 6a 65 63 74 20 66 72 6f 6d 20 74 68 69 73  object from this
bee0: 20 45 78 70 72 4c 69 73 74 20 2a 2f 0a 20 20 69   ExprList */.  i
bef0: 6e 74 20 69 53 74 61 72 74 2c 20 20 20 20 20 20  nt iStart,      
bf00: 20 20 20 20 2f 2a 20 42 65 67 69 6e 20 77 69 74      /* Begin wit
bf10: 68 20 74 68 69 73 20 63 6f 6c 75 6d 6e 20 6f 66  h this column of
bf20: 20 70 4c 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20   pList */.  int 
bf30: 6e 45 78 74 72 61 20 20 20 20 20 20 20 20 20 20  nExtra          
bf40: 20 2f 2a 20 41 64 64 20 74 68 69 73 20 6d 61 6e   /* Add this man
bf50: 79 20 65 78 74 72 61 20 63 6f 6c 75 6d 6e 73 20  y extra columns 
bf60: 74 6f 20 74 68 65 20 65 6e 64 20 2a 2f 0a 29 7b  to the end */.){
bf70: 0a 20 20 69 6e 74 20 6e 45 78 70 72 3b 0a 20 20  .  int nExpr;.  
bf80: 4b 65 79 49 6e 66 6f 20 2a 70 49 6e 66 6f 3b 0a  KeyInfo *pInfo;.
bf90: 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
bfa0: 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20  t_item *pItem;. 
bfb0: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
bfc0: 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74  Parse->db;.  int
bfd0: 20 69 3b 0a 0a 20 20 6e 45 78 70 72 20 3d 20 70   i;..  nExpr = p
bfe0: 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 70  List->nExpr;.  p
bff0: 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 4b 65  Info = sqlite3Ke
c000: 79 49 6e 66 6f 41 6c 6c 6f 63 28 64 62 2c 20 6e  yInfoAlloc(db, n
c010: 45 78 70 72 2d 69 53 74 61 72 74 2c 20 6e 45 78  Expr-iStart, nEx
c020: 74 72 61 2b 31 29 3b 0a 20 20 69 66 28 20 70 49  tra+1);.  if( pI
c030: 6e 66 6f 20 29 7b 0a 20 20 20 20 61 73 73 65 72  nfo ){.    asser
c040: 74 28 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66  t( sqlite3KeyInf
c050: 6f 49 73 57 72 69 74 65 61 62 6c 65 28 70 49 6e  oIsWriteable(pIn
c060: 66 6f 29 20 29 3b 0a 20 20 20 20 66 6f 72 28 69  fo) );.    for(i
c070: 3d 69 53 74 61 72 74 2c 20 70 49 74 65 6d 3d 70  =iStart, pItem=p
c080: 4c 69 73 74 2d 3e 61 2b 69 53 74 61 72 74 3b 20  List->a+iStart; 
c090: 69 3c 6e 45 78 70 72 3b 20 69 2b 2b 2c 20 70 49  i<nExpr; i++, pI
c0a0: 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 70 49  tem++){.      pI
c0b0: 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 69 2d 69 53 74  nfo->aColl[i-iSt
c0c0: 61 72 74 5d 20 3d 20 73 71 6c 69 74 65 33 45 78  art] = sqlite3Ex
c0d0: 70 72 4e 4e 43 6f 6c 6c 53 65 71 28 70 50 61 72  prNNCollSeq(pPar
c0e0: 73 65 2c 20 70 49 74 65 6d 2d 3e 70 45 78 70 72  se, pItem->pExpr
c0f0: 29 3b 0a 20 20 20 20 20 20 70 49 6e 66 6f 2d 3e  );.      pInfo->
c100: 61 53 6f 72 74 4f 72 64 65 72 5b 69 2d 69 53 74  aSortOrder[i-iSt
c110: 61 72 74 5d 20 3d 20 70 49 74 65 6d 2d 3e 73 6f  art] = pItem->so
c120: 72 74 4f 72 64 65 72 3b 0a 20 20 20 20 7d 0a 20  rtOrder;.    }. 
c130: 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 49 6e 66   }.  return pInf
c140: 6f 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4e 61 6d 65  o;.}../*.** Name
c150: 20 6f 66 20 74 68 65 20 63 6f 6e 6e 65 63 74 69   of the connecti
c160: 6f 6e 20 6f 70 65 72 61 74 6f 72 2c 20 75 73 65  on operator, use
c170: 64 20 66 6f 72 20 65 72 72 6f 72 20 6d 65 73 73  d for error mess
c180: 61 67 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ages..*/.static 
c190: 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 65 6c 65  const char *sele
c1a0: 63 74 4f 70 4e 61 6d 65 28 69 6e 74 20 69 64 29  ctOpName(int id)
c1b0: 7b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20 73  {.  char *z;.  s
c1c0: 77 69 74 63 68 28 20 69 64 20 29 7b 0a 20 20 20  witch( id ){.   
c1d0: 20 63 61 73 65 20 54 4b 5f 41 4c 4c 3a 20 20 20   case TK_ALL:   
c1e0: 20 20 20 20 7a 20 3d 20 22 55 4e 49 4f 4e 20 41      z = "UNION A
c1f0: 4c 4c 22 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20  LL";   break;.  
c200: 20 20 63 61 73 65 20 54 4b 5f 49 4e 54 45 52 53    case TK_INTERS
c210: 45 43 54 3a 20 7a 20 3d 20 22 49 4e 54 45 52 53  ECT: z = "INTERS
c220: 45 43 54 22 3b 20 20 20 62 72 65 61 6b 3b 0a 20  ECT";   break;. 
c230: 20 20 20 63 61 73 65 20 54 4b 5f 45 58 43 45 50     case TK_EXCEP
c240: 54 3a 20 20 20 20 7a 20 3d 20 22 45 58 43 45 50  T:    z = "EXCEP
c250: 54 22 3b 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  T";      break;.
c260: 20 20 20 20 64 65 66 61 75 6c 74 3a 20 20 20 20      default:    
c270: 20 20 20 20 20 20 20 7a 20 3d 20 22 55 4e 49 4f         z = "UNIO
c280: 4e 22 3b 20 20 20 20 20 20 20 62 72 65 61 6b 3b  N";       break;
c290: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 3b  .  }.  return z;
c2a0: 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
c2b0: 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a  TE_OMIT_EXPLAIN.
c2c0: 2f 2a 0a 2a 2a 20 55 6e 6c 65 73 73 20 61 6e 20  /*.** Unless an 
c2d0: 22 45 58 50 4c 41 49 4e 20 51 55 45 52 59 20 50  "EXPLAIN QUERY P
c2e0: 4c 41 4e 22 20 63 6f 6d 6d 61 6e 64 20 69 73 20  LAN" command is 
c2f0: 62 65 69 6e 67 20 70 72 6f 63 65 73 73 65 64 2c  being processed,
c300: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a   this function.*
c310: 2a 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 4f 74  * is a no-op. Ot
c320: 68 65 72 77 69 73 65 2c 20 69 74 20 61 64 64 73  herwise, it adds
c330: 20 61 20 73 69 6e 67 6c 65 20 72 6f 77 20 6f 66   a single row of
c340: 20 6f 75 74 70 75 74 20 74 6f 20 74 68 65 20 45   output to the E
c350: 51 50 20 72 65 73 75 6c 74 2c 0a 2a 2a 20 77 68  QP result,.** wh
c360: 65 72 65 20 74 68 65 20 63 61 70 74 69 6f 6e 20  ere the caption 
c370: 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a  is of the form:.
c380: 2a 2a 0a 2a 2a 20 20 20 22 55 53 45 20 54 45 4d  **.**   "USE TEM
c390: 50 20 42 2d 54 52 45 45 20 46 4f 52 20 78 78 78  P B-TREE FOR xxx
c3a0: 22 0a 2a 2a 0a 2a 2a 20 77 68 65 72 65 20 78 78  ".**.** where xx
c3b0: 78 20 69 73 20 6f 6e 65 20 6f 66 20 22 44 49 53  x is one of "DIS
c3c0: 54 49 4e 43 54 22 2c 20 22 4f 52 44 45 52 20 42  TINCT", "ORDER B
c3d0: 59 22 20 6f 72 20 22 47 52 4f 55 50 20 42 59 22  Y" or "GROUP BY"
c3e0: 2e 20 45 78 61 63 74 6c 79 20 77 68 69 63 68 0a  . Exactly which.
c3f0: 2a 2a 20 69 73 20 64 65 74 65 72 6d 69 6e 65 64  ** is determined
c400: 20 62 79 20 74 68 65 20 7a 55 73 61 67 65 20 61   by the zUsage a
c410: 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74  rgument..*/.stat
c420: 69 63 20 76 6f 69 64 20 65 78 70 6c 61 69 6e 54  ic void explainT
c430: 65 6d 70 54 61 62 6c 65 28 50 61 72 73 65 20 2a  empTable(Parse *
c440: 70 50 61 72 73 65 2c 20 63 6f 6e 73 74 20 63 68  pParse, const ch
c450: 61 72 20 2a 7a 55 73 61 67 65 29 7b 0a 20 20 45  ar *zUsage){.  E
c460: 78 70 6c 61 69 6e 51 75 65 72 79 50 6c 61 6e 28  xplainQueryPlan(
c470: 28 70 50 61 72 73 65 2c 20 30 2c 20 22 55 53 45  (pParse, 0, "USE
c480: 20 54 45 4d 50 20 42 2d 54 52 45 45 20 46 4f 52   TEMP B-TREE FOR
c490: 20 25 73 22 2c 20 7a 55 73 61 67 65 29 29 3b 0a   %s", zUsage));.
c4a0: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 73 73 69 67 6e 20  }../*.** Assign 
c4b0: 65 78 70 72 65 73 73 69 6f 6e 20 62 20 74 6f 20  expression b to 
c4c0: 6c 76 61 6c 75 65 20 61 2e 20 41 20 73 65 63 6f  lvalue a. A seco
c4d0: 6e 64 2c 20 6e 6f 2d 6f 70 2c 20 76 65 72 73 69  nd, no-op, versi
c4e0: 6f 6e 20 6f 66 20 74 68 69 73 20 6d 61 63 72 6f  on of this macro
c4f0: 0a 2a 2a 20 69 73 20 70 72 6f 76 69 64 65 64 20  .** is provided 
c500: 77 68 65 6e 20 53 51 4c 49 54 45 5f 4f 4d 49 54  when SQLITE_OMIT
c510: 5f 45 58 50 4c 41 49 4e 20 69 73 20 64 65 66 69  _EXPLAIN is defi
c520: 6e 65 64 2e 20 54 68 69 73 20 61 6c 6c 6f 77 73  ned. This allows
c530: 20 74 68 65 20 63 6f 64 65 0a 2a 2a 20 69 6e 20   the code.** in 
c540: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 29 20  sqlite3Select() 
c550: 74 6f 20 61 73 73 69 67 6e 20 76 61 6c 75 65 73  to assign values
c560: 20 74 6f 20 73 74 72 75 63 74 75 72 65 20 6d 65   to structure me
c570: 6d 62 65 72 20 76 61 72 69 61 62 6c 65 73 20 74  mber variables t
c580: 68 61 74 0a 2a 2a 20 6f 6e 6c 79 20 65 78 69 73  hat.** only exis
c590: 74 20 69 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  t if SQLITE_OMIT
c5a0: 5f 45 58 50 4c 41 49 4e 20 69 73 20 6e 6f 74 20  _EXPLAIN is not 
c5b0: 64 65 66 69 6e 65 64 20 77 69 74 68 6f 75 74 20  defined without 
c5c0: 70 6f 6c 6c 75 74 69 6e 67 20 74 68 65 0a 2a 2a  polluting the.**
c5d0: 20 63 6f 64 65 20 77 69 74 68 20 23 69 66 6e 64   code with #ifnd
c5e0: 65 66 20 64 69 72 65 63 74 69 76 65 73 2e 0a 2a  ef directives..*
c5f0: 2f 0a 23 20 64 65 66 69 6e 65 20 65 78 70 6c 61  /.# define expla
c600: 69 6e 53 65 74 49 6e 74 65 67 65 72 28 61 2c 20  inSetInteger(a, 
c610: 62 29 20 61 20 3d 20 62 0a 0a 23 65 6c 73 65 0a  b) a = b..#else.
c620: 2f 2a 20 4e 6f 2d 6f 70 20 76 65 72 73 69 6f 6e  /* No-op version
c630: 73 20 6f 66 20 74 68 65 20 65 78 70 6c 61 69 6e  s of the explain
c640: 58 58 58 28 29 20 66 75 6e 63 74 69 6f 6e 73 20  XXX() functions 
c650: 61 6e 64 20 6d 61 63 72 6f 73 2e 20 2a 2f 0a 23  and macros. */.#
c660: 20 64 65 66 69 6e 65 20 65 78 70 6c 61 69 6e 54   define explainT
c670: 65 6d 70 54 61 62 6c 65 28 79 2c 7a 29 0a 23 20  empTable(y,z).# 
c680: 64 65 66 69 6e 65 20 65 78 70 6c 61 69 6e 53 65  define explainSe
c690: 74 49 6e 74 65 67 65 72 28 79 2c 7a 29 0a 23 65  tInteger(y,z).#e
c6a0: 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 49 66 20  ndif.../*.** If 
c6b0: 74 68 65 20 69 6e 6e 65 72 20 6c 6f 6f 70 20 77  the inner loop w
c6c0: 61 73 20 67 65 6e 65 72 61 74 65 64 20 75 73 69  as generated usi
c6d0: 6e 67 20 61 20 6e 6f 6e 2d 6e 75 6c 6c 20 70 4f  ng a non-null pO
c6e0: 72 64 65 72 42 79 20 61 72 67 75 6d 65 6e 74 2c  rderBy argument,
c6f0: 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20 72 65 73  .** then the res
c700: 75 6c 74 73 20 77 65 72 65 20 70 6c 61 63 65 64  ults were placed
c710: 20 69 6e 20 61 20 73 6f 72 74 65 72 2e 20 20 41   in a sorter.  A
c720: 66 74 65 72 20 74 68 65 20 6c 6f 6f 70 20 69 73  fter the loop is
c730: 20 74 65 72 6d 69 6e 61 74 65 64 0a 2a 2a 20 77   terminated.** w
c740: 65 20 6e 65 65 64 20 74 6f 20 72 75 6e 20 74 68  e need to run th
c750: 65 20 73 6f 72 74 65 72 20 61 6e 64 20 6f 75 74  e sorter and out
c760: 70 75 74 20 74 68 65 20 72 65 73 75 6c 74 73 2e  put the results.
c770: 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a    The following.
c780: 2a 2a 20 72 6f 75 74 69 6e 65 20 67 65 6e 65 72  ** routine gener
c790: 61 74 65 73 20 74 68 65 20 63 6f 64 65 20 6e 65  ates the code ne
c7a0: 65 64 65 64 20 74 6f 20 64 6f 20 74 68 61 74 2e  eded to do that.
c7b0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
c7c0: 67 65 6e 65 72 61 74 65 53 6f 72 74 54 61 69 6c  generateSortTail
c7d0: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
c7e0: 65 2c 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67  e,    /* Parsing
c7f0: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65   context */.  Se
c800: 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20  lect *p,        
c810: 2f 2a 20 54 68 65 20 53 45 4c 45 43 54 20 73 74  /* The SELECT st
c820: 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 53 6f 72  atement */.  Sor
c830: 74 43 74 78 20 2a 70 53 6f 72 74 2c 20 20 20 2f  tCtx *pSort,   /
c840: 2a 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f 6e  * Information on
c850: 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   the ORDER BY cl
c860: 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 43  ause */.  int nC
c870: 6f 6c 75 6d 6e 2c 20 20 20 20 20 20 2f 2a 20 4e  olumn,      /* N
c880: 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73  umber of columns
c890: 20 6f 66 20 64 61 74 61 20 2a 2f 0a 20 20 53 65   of data */.  Se
c8a0: 6c 65 63 74 44 65 73 74 20 2a 70 44 65 73 74 20  lectDest *pDest 
c8b0: 2f 2a 20 57 72 69 74 65 20 74 68 65 20 73 6f 72  /* Write the sor
c8c0: 74 65 64 20 72 65 73 75 6c 74 73 20 68 65 72 65  ted results here
c8d0: 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76   */.){.  Vdbe *v
c8e0: 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
c8f0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
c900: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 72 65        /* The pre
c910: 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20  pared statement 
c920: 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 42 72 65  */.  int addrBre
c930: 61 6b 20 3d 20 70 53 6f 72 74 2d 3e 6c 61 62 65  ak = pSort->labe
c940: 6c 44 6f 6e 65 3b 20 20 20 20 20 20 20 20 20 20  lDone;          
c950: 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 74    /* Jump here t
c960: 6f 20 65 78 69 74 20 6c 6f 6f 70 20 2a 2f 0a 20  o exit loop */. 
c970: 20 69 6e 74 20 61 64 64 72 43 6f 6e 74 69 6e 75   int addrContinu
c980: 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  e = sqlite3VdbeM
c990: 61 6b 65 4c 61 62 65 6c 28 70 50 61 72 73 65 29  akeLabel(pParse)
c9a0: 3b 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 66 6f  ;/* Jump here fo
c9b0: 72 20 6e 65 78 74 20 63 79 63 6c 65 20 2a 2f 0a  r next cycle */.
c9c0: 20 20 69 6e 74 20 61 64 64 72 3b 20 20 20 20 20    int addr;     
c9d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c9e0: 20 20 2f 2a 20 54 6f 70 20 6f 66 20 6f 75 74 70    /* Top of outp
c9f0: 75 74 20 6c 6f 6f 70 2e 20 4a 75 6d 70 20 66 6f  ut loop. Jump fo
ca00: 72 20 4e 65 78 74 2e 20 2a 2f 0a 20 20 69 6e 74  r Next. */.  int
ca10: 20 61 64 64 72 4f 6e 63 65 20 3d 20 30 3b 0a 20   addrOnce = 0;. 
ca20: 20 69 6e 74 20 69 54 61 62 3b 0a 20 20 45 78 70   int iTab;.  Exp
ca30: 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 20  rList *pOrderBy 
ca40: 3d 20 70 53 6f 72 74 2d 3e 70 4f 72 64 65 72 42  = pSort->pOrderB
ca50: 79 3b 0a 20 20 69 6e 74 20 65 44 65 73 74 20 3d  y;.  int eDest =
ca60: 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3b 0a 20   pDest->eDest;. 
ca70: 20 69 6e 74 20 69 50 61 72 6d 20 3d 20 70 44 65   int iParm = pDe
ca80: 73 74 2d 3e 69 53 44 50 61 72 6d 3b 0a 20 20 69  st->iSDParm;.  i
ca90: 6e 74 20 72 65 67 52 6f 77 3b 0a 20 20 69 6e 74  nt regRow;.  int
caa0: 20 72 65 67 52 6f 77 69 64 3b 0a 20 20 69 6e 74   regRowid;.  int
cab0: 20 69 43 6f 6c 3b 0a 20 20 69 6e 74 20 6e 4b 65   iCol;.  int nKe
cac0: 79 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  y;              
cad0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
cae0: 65 72 20 6f 66 20 6b 65 79 20 63 6f 6c 75 6d 6e  er of key column
caf0: 73 20 69 6e 20 73 6f 72 74 65 72 20 72 65 63 6f  s in sorter reco
cb00: 72 64 20 2a 2f 0a 20 20 69 6e 74 20 69 53 6f 72  rd */.  int iSor
cb10: 74 54 61 62 3b 20 20 20 20 20 20 20 20 20 20 20  tTab;           
cb20: 20 20 20 20 20 20 20 20 2f 2a 20 53 6f 72 74 65          /* Sorte
cb30: 72 20 63 75 72 73 6f 72 20 74 6f 20 72 65 61 64  r cursor to read
cb40: 20 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20 69   from */.  int i
cb50: 3b 0a 20 20 69 6e 74 20 62 53 65 71 3b 20 20 20  ;.  int bSeq;   
cb60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cb70: 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 73      /* True if s
cb80: 6f 72 74 65 72 20 72 65 63 6f 72 64 20 69 6e 63  orter record inc
cb90: 6c 75 64 65 73 20 73 65 71 2e 20 6e 6f 2e 20 2a  ludes seq. no. *
cba0: 2f 0a 20 20 69 6e 74 20 6e 52 65 66 4b 65 79 20  /.  int nRefKey 
cbb0: 3d 20 30 3b 0a 20 20 73 74 72 75 63 74 20 45 78  = 0;.  struct Ex
cbc0: 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 61 4f 75  prList_item *aOu
cbd0: 74 45 78 20 3d 20 70 2d 3e 70 45 4c 69 73 74 2d  tEx = p->pEList-
cbe0: 3e 61 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 61  >a;..  assert( a
cbf0: 64 64 72 42 72 65 61 6b 3c 30 20 29 3b 0a 20 20  ddrBreak<0 );.  
cc00: 69 66 28 20 70 53 6f 72 74 2d 3e 6c 61 62 65 6c  if( pSort->label
cc10: 42 6b 4f 75 74 20 29 7b 0a 20 20 20 20 73 71 6c  BkOut ){.    sql
cc20: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
cc30: 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 70 53 6f 72  , OP_Gosub, pSor
cc40: 74 2d 3e 72 65 67 52 65 74 75 72 6e 2c 20 70 53  t->regReturn, pS
cc50: 6f 72 74 2d 3e 6c 61 62 65 6c 42 6b 4f 75 74 29  ort->labelBkOut)
cc60: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
cc70: 65 47 6f 74 6f 28 76 2c 20 61 64 64 72 42 72 65  eGoto(v, addrBre
cc80: 61 6b 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ak);.    sqlite3
cc90: 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
cca0: 28 76 2c 20 70 53 6f 72 74 2d 3e 6c 61 62 65 6c  (v, pSort->label
ccb0: 42 6b 4f 75 74 29 3b 0a 20 20 7d 0a 0a 23 69 66  BkOut);.  }..#if
ccc0: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
ccd0: 45 5f 53 4f 52 54 45 52 5f 52 45 46 45 52 45 4e  E_SORTER_REFEREN
cce0: 43 45 53 0a 20 20 2f 2a 20 4f 70 65 6e 20 61 6e  CES.  /* Open an
ccf0: 79 20 63 75 72 73 6f 72 73 20 6e 65 65 64 65 64  y cursors needed
cd00: 20 66 6f 72 20 73 6f 72 74 65 72 2d 72 65 66 65   for sorter-refe
cd10: 72 65 6e 63 65 20 65 78 70 72 65 73 73 69 6f 6e  rence expression
cd20: 73 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20  s */.  for(i=0; 
cd30: 69 3c 70 53 6f 72 74 2d 3e 6e 44 65 66 65 72 3b  i<pSort->nDefer;
cd40: 20 69 2b 2b 29 7b 0a 20 20 20 20 54 61 62 6c 65   i++){.    Table
cd50: 20 2a 70 54 61 62 20 3d 20 70 53 6f 72 74 2d 3e   *pTab = pSort->
cd60: 61 44 65 66 65 72 5b 69 5d 2e 70 54 61 62 3b 0a  aDefer[i].pTab;.
cd70: 20 20 20 20 69 6e 74 20 69 44 62 20 3d 20 73 71      int iDb = sq
cd80: 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64  lite3SchemaToInd
cd90: 65 78 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  ex(pParse->db, p
cda0: 54 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20  Tab->pSchema);. 
cdb0: 20 20 20 73 71 6c 69 74 65 33 4f 70 65 6e 54 61     sqlite3OpenTa
cdc0: 62 6c 65 28 70 50 61 72 73 65 2c 20 70 53 6f 72  ble(pParse, pSor
cdd0: 74 2d 3e 61 44 65 66 65 72 5b 69 5d 2e 69 43 73  t->aDefer[i].iCs
cde0: 72 2c 20 69 44 62 2c 20 70 54 61 62 2c 20 4f 50  r, iDb, pTab, OP
cdf0: 5f 4f 70 65 6e 52 65 61 64 29 3b 0a 20 20 20 20  _OpenRead);.    
ce00: 6e 52 65 66 4b 65 79 20 3d 20 4d 41 58 28 6e 52  nRefKey = MAX(nR
ce10: 65 66 4b 65 79 2c 20 70 53 6f 72 74 2d 3e 61 44  efKey, pSort->aD
ce20: 65 66 65 72 5b 69 5d 2e 6e 4b 65 79 29 3b 0a 20  efer[i].nKey);. 
ce30: 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 69 54 61   }.#endif..  iTa
ce40: 62 20 3d 20 70 53 6f 72 74 2d 3e 69 45 43 75 72  b = pSort->iECur
ce50: 73 6f 72 3b 0a 20 20 69 66 28 20 65 44 65 73 74  sor;.  if( eDest
ce60: 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20 7c 7c 20  ==SRT_Output || 
ce70: 65 44 65 73 74 3d 3d 53 52 54 5f 43 6f 72 6f 75  eDest==SRT_Corou
ce80: 74 69 6e 65 20 7c 7c 20 65 44 65 73 74 3d 3d 53  tine || eDest==S
ce90: 52 54 5f 4d 65 6d 20 29 7b 0a 20 20 20 20 72 65  RT_Mem ){.    re
cea0: 67 52 6f 77 69 64 20 3d 20 30 3b 0a 20 20 20 20  gRowid = 0;.    
ceb0: 72 65 67 52 6f 77 20 3d 20 70 44 65 73 74 2d 3e  regRow = pDest->
cec0: 69 53 64 73 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a  iSdst;.  }else{.
ced0: 20 20 20 20 72 65 67 52 6f 77 69 64 20 3d 20 73      regRowid = s
cee0: 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67  qlite3GetTempReg
cef0: 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 69 66  (pParse);.    if
cf00: 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 45 70 68  ( eDest==SRT_Eph
cf10: 65 6d 54 61 62 20 7c 7c 20 65 44 65 73 74 3d 3d  emTab || eDest==
cf20: 53 52 54 5f 54 61 62 6c 65 20 29 7b 0a 20 20 20  SRT_Table ){.   
cf30: 20 20 20 72 65 67 52 6f 77 20 3d 20 73 71 6c 69     regRow = sqli
cf40: 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50  te3GetTempReg(pP
cf50: 61 72 73 65 29 3b 0a 20 20 20 20 20 20 6e 43 6f  arse);.      nCo
cf60: 6c 75 6d 6e 20 3d 20 30 3b 0a 20 20 20 20 7d 65  lumn = 0;.    }e
cf70: 6c 73 65 7b 0a 20 20 20 20 20 20 72 65 67 52 6f  lse{.      regRo
cf80: 77 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  w = sqlite3GetTe
cf90: 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20  mpRange(pParse, 
cfa0: 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 7d 0a  nColumn);.    }.
cfb0: 20 20 7d 0a 20 20 6e 4b 65 79 20 3d 20 70 4f 72    }.  nKey = pOr
cfc0: 64 65 72 42 79 2d 3e 6e 45 78 70 72 20 2d 20 70  derBy->nExpr - p
cfd0: 53 6f 72 74 2d 3e 6e 4f 42 53 61 74 3b 0a 20 20  Sort->nOBSat;.  
cfe0: 69 66 28 20 70 53 6f 72 74 2d 3e 73 6f 72 74 46  if( pSort->sortF
cff0: 6c 61 67 73 20 26 20 53 4f 52 54 46 4c 41 47 5f  lags & SORTFLAG_
d000: 55 73 65 53 6f 72 74 65 72 20 29 7b 0a 20 20 20  UseSorter ){.   
d010: 20 69 6e 74 20 72 65 67 53 6f 72 74 4f 75 74 20   int regSortOut 
d020: 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
d030: 3b 0a 20 20 20 20 69 53 6f 72 74 54 61 62 20 3d  ;.    iSortTab =
d040: 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b   pParse->nTab++;
d050: 0a 20 20 20 20 69 66 28 20 70 53 6f 72 74 2d 3e  .    if( pSort->
d060: 6c 61 62 65 6c 42 6b 4f 75 74 20 29 7b 0a 20 20  labelBkOut ){.  
d070: 20 20 20 20 61 64 64 72 4f 6e 63 65 20 3d 20 73      addrOnce = s
d080: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 30  qlite3VdbeAddOp0
d090: 28 76 2c 20 4f 50 5f 4f 6e 63 65 29 3b 20 56 64  (v, OP_Once); Vd
d0a0: 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
d0b0: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
d0c0: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
d0d0: 5f 4f 70 65 6e 50 73 65 75 64 6f 2c 20 69 53 6f  _OpenPseudo, iSo
d0e0: 72 74 54 61 62 2c 20 72 65 67 53 6f 72 74 4f 75  rtTab, regSortOu
d0f0: 74 2c 20 0a 20 20 20 20 20 20 20 20 6e 4b 65 79  t, .        nKey
d100: 2b 31 2b 6e 43 6f 6c 75 6d 6e 2b 6e 52 65 66 4b  +1+nColumn+nRefK
d110: 65 79 29 3b 0a 20 20 20 20 69 66 28 20 61 64 64  ey);.    if( add
d120: 72 4f 6e 63 65 20 29 20 73 71 6c 69 74 65 33 56  rOnce ) sqlite3V
d130: 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61  dbeJumpHere(v, a
d140: 64 64 72 4f 6e 63 65 29 3b 0a 20 20 20 20 61 64  ddrOnce);.    ad
d150: 64 72 20 3d 20 31 20 2b 20 73 71 6c 69 74 65 33  dr = 1 + sqlite3
d160: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
d170: 5f 53 6f 72 74 65 72 53 6f 72 74 2c 20 69 54 61  _SorterSort, iTa
d180: 62 2c 20 61 64 64 72 42 72 65 61 6b 29 3b 0a 20  b, addrBreak);. 
d190: 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28     VdbeCoverage(
d1a0: 76 29 3b 0a 20 20 20 20 63 6f 64 65 4f 66 66 73  v);.    codeOffs
d1b0: 65 74 28 76 2c 20 70 2d 3e 69 4f 66 66 73 65 74  et(v, p->iOffset
d1c0: 2c 20 61 64 64 72 43 6f 6e 74 69 6e 75 65 29 3b  , addrContinue);
d1d0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
d1e0: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 53 6f 72  AddOp3(v, OP_Sor
d1f0: 74 65 72 44 61 74 61 2c 20 69 54 61 62 2c 20 72  terData, iTab, r
d200: 65 67 53 6f 72 74 4f 75 74 2c 20 69 53 6f 72 74  egSortOut, iSort
d210: 54 61 62 29 3b 0a 20 20 20 20 62 53 65 71 20 3d  Tab);.    bSeq =
d220: 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   0;.  }else{.   
d230: 20 61 64 64 72 20 3d 20 31 20 2b 20 73 71 6c 69   addr = 1 + sqli
d240: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
d250: 20 4f 50 5f 53 6f 72 74 2c 20 69 54 61 62 2c 20   OP_Sort, iTab, 
d260: 61 64 64 72 42 72 65 61 6b 29 3b 20 56 64 62 65  addrBreak); Vdbe
d270: 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
d280: 20 63 6f 64 65 4f 66 66 73 65 74 28 76 2c 20 70   codeOffset(v, p
d290: 2d 3e 69 4f 66 66 73 65 74 2c 20 61 64 64 72 43  ->iOffset, addrC
d2a0: 6f 6e 74 69 6e 75 65 29 3b 0a 20 20 20 20 69 53  ontinue);.    iS
d2b0: 6f 72 74 54 61 62 20 3d 20 69 54 61 62 3b 0a 20  ortTab = iTab;. 
d2c0: 20 20 20 62 53 65 71 20 3d 20 31 3b 0a 20 20 7d     bSeq = 1;.  }
d2d0: 0a 20 20 66 6f 72 28 69 3d 30 2c 20 69 43 6f 6c  .  for(i=0, iCol
d2e0: 3d 6e 4b 65 79 2b 62 53 65 71 2d 31 3b 20 69 3c  =nKey+bSeq-1; i<
d2f0: 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 23  nColumn; i++){.#
d300: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
d310: 42 4c 45 5f 53 4f 52 54 45 52 5f 52 45 46 45 52  BLE_SORTER_REFER
d320: 45 4e 43 45 53 0a 20 20 20 20 69 66 28 20 61 4f  ENCES.    if( aO
d330: 75 74 45 78 5b 69 5d 2e 62 53 6f 72 74 65 72 52  utEx[i].bSorterR
d340: 65 66 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 23  ef ) continue;.#
d350: 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20 61 4f  endif.    if( aO
d360: 75 74 45 78 5b 69 5d 2e 75 2e 78 2e 69 4f 72 64  utEx[i].u.x.iOrd
d370: 65 72 42 79 43 6f 6c 3d 3d 30 20 29 20 69 43 6f  erByCol==0 ) iCo
d380: 6c 2b 2b 3b 0a 20 20 7d 0a 23 69 66 64 65 66 20  l++;.  }.#ifdef 
d390: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 4f  SQLITE_ENABLE_SO
d3a0: 52 54 45 52 5f 52 45 46 45 52 45 4e 43 45 53 0a  RTER_REFERENCES.
d3b0: 20 20 69 66 28 20 70 53 6f 72 74 2d 3e 6e 44 65    if( pSort->nDe
d3c0: 66 65 72 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  fer ){.    int i
d3d0: 4b 65 79 20 3d 20 69 43 6f 6c 2b 31 3b 0a 20 20  Key = iCol+1;.  
d3e0: 20 20 69 6e 74 20 72 65 67 4b 65 79 20 3d 20 73    int regKey = s
d3f0: 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 61 6e  qlite3GetTempRan
d400: 67 65 28 70 50 61 72 73 65 2c 20 6e 52 65 66 4b  ge(pParse, nRefK
d410: 65 79 29 3b 0a 0a 20 20 20 20 66 6f 72 28 69 3d  ey);..    for(i=
d420: 30 3b 20 69 3c 70 53 6f 72 74 2d 3e 6e 44 65 66  0; i<pSort->nDef
d430: 65 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  er; i++){.      
d440: 69 6e 74 20 69 43 73 72 20 3d 20 70 53 6f 72 74  int iCsr = pSort
d450: 2d 3e 61 44 65 66 65 72 5b 69 5d 2e 69 43 73 72  ->aDefer[i].iCsr
d460: 3b 0a 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70  ;.      Table *p
d470: 54 61 62 20 3d 20 70 53 6f 72 74 2d 3e 61 44 65  Tab = pSort->aDe
d480: 66 65 72 5b 69 5d 2e 70 54 61 62 3b 0a 20 20 20  fer[i].pTab;.   
d490: 20 20 20 69 6e 74 20 6e 4b 65 79 20 3d 20 70 53     int nKey = pS
d4a0: 6f 72 74 2d 3e 61 44 65 66 65 72 5b 69 5d 2e 6e  ort->aDefer[i].n
d4b0: 4b 65 79 3b 0a 0a 20 20 20 20 20 20 73 71 6c 69  Key;..      sqli
d4c0: 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
d4d0: 20 4f 50 5f 4e 75 6c 6c 52 6f 77 2c 20 69 43 73   OP_NullRow, iCs
d4e0: 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20 48 61  r);.      if( Ha
d4f0: 73 52 6f 77 69 64 28 70 54 61 62 29 20 29 7b 0a  sRowid(pTab) ){.
d500: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
d510: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
d520: 43 6f 6c 75 6d 6e 2c 20 69 53 6f 72 74 54 61 62  Column, iSortTab
d530: 2c 20 69 4b 65 79 2b 2b 2c 20 72 65 67 4b 65 79  , iKey++, regKey
d540: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
d550: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
d560: 4f 50 5f 53 65 65 6b 52 6f 77 69 64 2c 20 69 43  OP_SeekRowid, iC
d570: 73 72 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  sr, .           
d580: 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
d590: 65 6e 74 41 64 64 72 28 76 29 2b 31 2c 20 72 65  entAddr(v)+1, re
d5a0: 67 4b 65 79 29 3b 0a 20 20 20 20 20 20 7d 65 6c  gKey);.      }el
d5b0: 73 65 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  se{.        int 
d5c0: 6b 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69  k;.        int i
d5d0: 4a 6d 70 3b 0a 20 20 20 20 20 20 20 20 61 73 73  Jmp;.        ass
d5e0: 65 72 74 28 20 73 71 6c 69 74 65 33 50 72 69 6d  ert( sqlite3Prim
d5f0: 61 72 79 4b 65 79 49 6e 64 65 78 28 70 54 61 62  aryKeyIndex(pTab
d600: 29 2d 3e 6e 4b 65 79 43 6f 6c 3d 3d 6e 4b 65 79  )->nKeyCol==nKey
d610: 20 29 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28   );.        for(
d620: 6b 3d 30 3b 20 6b 3c 6e 4b 65 79 3b 20 6b 2b 2b  k=0; k<nKey; k++
d630: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
d640: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
d650: 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69 53 6f  , OP_Column, iSo
d660: 72 74 54 61 62 2c 20 69 4b 65 79 2b 2b 2c 20 72  rtTab, iKey++, r
d670: 65 67 4b 65 79 2b 6b 29 3b 0a 20 20 20 20 20 20  egKey+k);.      
d680: 20 20 7d 0a 20 20 20 20 20 20 20 20 69 4a 6d 70    }.        iJmp
d690: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75   = sqlite3VdbeCu
d6a0: 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20  rrentAddr(v);.  
d6b0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
d6c0: 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50  eAddOp4Int(v, OP
d6d0: 5f 53 65 65 6b 47 45 2c 20 69 43 73 72 2c 20 69  _SeekGE, iCsr, i
d6e0: 4a 6d 70 2b 32 2c 20 72 65 67 4b 65 79 2c 20 6e  Jmp+2, regKey, n
d6f0: 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20 73 71  Key);.        sq
d700: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 49  lite3VdbeAddOp4I
d710: 6e 74 28 76 2c 20 4f 50 5f 49 64 78 4c 45 2c 20  nt(v, OP_IdxLE, 
d720: 69 43 73 72 2c 20 69 4a 6d 70 2b 33 2c 20 72 65  iCsr, iJmp+3, re
d730: 67 4b 65 79 2c 20 6e 4b 65 79 29 3b 0a 20 20 20  gKey, nKey);.   
d740: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
d750: 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4e 75 6c  AddOp1(v, OP_Nul
d760: 6c 52 6f 77 2c 20 69 43 73 72 29 3b 0a 20 20 20  lRow, iCsr);.   
d770: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73     }.    }.    s
d780: 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
d790: 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72  pRange(pParse, r
d7a0: 65 67 4b 65 79 2c 20 6e 52 65 66 4b 65 79 29 3b  egKey, nRefKey);
d7b0: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 66 6f  .  }.#endif.  fo
d7c0: 72 28 69 3d 6e 43 6f 6c 75 6d 6e 2d 31 3b 20 69  r(i=nColumn-1; i
d7d0: 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 23 69 66 64 65  >=0; i--){.#ifde
d7e0: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
d7f0: 53 4f 52 54 45 52 5f 52 45 46 45 52 45 4e 43 45  SORTER_REFERENCE
d800: 53 0a 20 20 20 20 69 66 28 20 61 4f 75 74 45 78  S.    if( aOutEx
d810: 5b 69 5d 2e 62 53 6f 72 74 65 72 52 65 66 20 29  [i].bSorterRef )
d820: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
d830: 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
d840: 61 4f 75 74 45 78 5b 69 5d 2e 70 45 78 70 72 2c  aOutEx[i].pExpr,
d850: 20 72 65 67 52 6f 77 2b 69 29 3b 0a 20 20 20 20   regRow+i);.    
d860: 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 20  }else.#endif.   
d870: 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 52 65   {.      int iRe
d880: 61 64 3b 0a 20 20 20 20 20 20 69 66 28 20 61 4f  ad;.      if( aO
d890: 75 74 45 78 5b 69 5d 2e 75 2e 78 2e 69 4f 72 64  utEx[i].u.x.iOrd
d8a0: 65 72 42 79 43 6f 6c 20 29 7b 0a 20 20 20 20 20  erByCol ){.     
d8b0: 20 20 20 69 52 65 61 64 20 3d 20 61 4f 75 74 45     iRead = aOutE
d8c0: 78 5b 69 5d 2e 75 2e 78 2e 69 4f 72 64 65 72 42  x[i].u.x.iOrderB
d8d0: 79 43 6f 6c 2d 31 3b 0a 20 20 20 20 20 20 7d 65  yCol-1;.      }e
d8e0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 52 65  lse{.        iRe
d8f0: 61 64 20 3d 20 69 43 6f 6c 2d 2d 3b 0a 20 20 20  ad = iCol--;.   
d900: 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
d910: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
d920: 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69 53 6f 72 74  OP_Column, iSort
d930: 54 61 62 2c 20 69 52 65 61 64 2c 20 72 65 67 52  Tab, iRead, regR
d940: 6f 77 2b 69 29 3b 0a 20 20 20 20 20 20 56 64 62  ow+i);.      Vdb
d950: 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 25 73  eComment((v, "%s
d960: 22 2c 20 61 4f 75 74 45 78 5b 69 5d 2e 7a 4e 61  ", aOutEx[i].zNa
d970: 6d 65 3f 61 4f 75 74 45 78 5b 69 5d 2e 7a 4e 61  me?aOutEx[i].zNa
d980: 6d 65 20 3a 20 61 4f 75 74 45 78 5b 69 5d 2e 7a  me : aOutEx[i].z
d990: 53 70 61 6e 29 29 3b 0a 20 20 20 20 7d 0a 20 20  Span));.    }.  
d9a0: 7d 0a 20 20 73 77 69 74 63 68 28 20 65 44 65 73  }.  switch( eDes
d9b0: 74 20 29 7b 0a 20 20 20 20 63 61 73 65 20 53 52  t ){.    case SR
d9c0: 54 5f 54 61 62 6c 65 3a 0a 20 20 20 20 63 61 73  T_Table:.    cas
d9d0: 65 20 53 52 54 5f 45 70 68 65 6d 54 61 62 3a 20  e SRT_EphemTab: 
d9e0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
d9f0: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
da00: 43 6f 6c 75 6d 6e 2c 20 69 53 6f 72 74 54 61 62  Column, iSortTab
da10: 2c 20 6e 4b 65 79 2b 62 53 65 71 2c 20 72 65 67  , nKey+bSeq, reg
da20: 52 6f 77 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  Row);.      sqli
da30: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
da40: 20 4f 50 5f 4e 65 77 52 6f 77 69 64 2c 20 69 50   OP_NewRowid, iP
da50: 61 72 6d 2c 20 72 65 67 52 6f 77 69 64 29 3b 0a  arm, regRowid);.
da60: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
da70: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e  eAddOp3(v, OP_In
da80: 73 65 72 74 2c 20 69 50 61 72 6d 2c 20 72 65 67  sert, iParm, reg
da90: 52 6f 77 2c 20 72 65 67 52 6f 77 69 64 29 3b 0a  Row, regRowid);.
daa0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
dab0: 65 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46  eChangeP5(v, OPF
dac0: 4c 41 47 5f 41 50 50 45 4e 44 29 3b 0a 20 20 20  LAG_APPEND);.   
dad0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
dae0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
daf0: 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20 20  MIT_SUBQUERY.   
db00: 20 63 61 73 65 20 53 52 54 5f 53 65 74 3a 20 7b   case SRT_Set: {
db10: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e  .      assert( n
db20: 43 6f 6c 75 6d 6e 3d 3d 73 71 6c 69 74 65 33 53  Column==sqlite3S
db30: 74 72 6c 65 6e 33 30 28 70 44 65 73 74 2d 3e 7a  trlen30(pDest->z
db40: 41 66 66 53 64 73 74 29 20 29 3b 0a 20 20 20 20  AffSdst) );.    
db50: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
db60: 4f 70 34 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65  Op4(v, OP_MakeRe
db70: 63 6f 72 64 2c 20 72 65 67 52 6f 77 2c 20 6e 43  cord, regRow, nC
db80: 6f 6c 75 6d 6e 2c 20 72 65 67 52 6f 77 69 64 2c  olumn, regRowid,
db90: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
dba0: 20 20 20 20 20 20 20 20 20 70 44 65 73 74 2d 3e           pDest->
dbb0: 7a 41 66 66 53 64 73 74 2c 20 6e 43 6f 6c 75 6d  zAffSdst, nColum
dbc0: 6e 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  n);.      sqlite
dbd0: 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76  3VdbeAddOp4Int(v
dbe0: 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20  , OP_IdxInsert, 
dbf0: 69 50 61 72 6d 2c 20 72 65 67 52 6f 77 69 64 2c  iParm, regRowid,
dc00: 20 72 65 67 52 6f 77 2c 20 6e 43 6f 6c 75 6d 6e   regRow, nColumn
dc10: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
dc20: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53      }.    case S
dc30: 52 54 5f 4d 65 6d 3a 20 7b 0a 20 20 20 20 20 20  RT_Mem: {.      
dc40: 2f 2a 20 54 68 65 20 4c 49 4d 49 54 20 63 6c 61  /* The LIMIT cla
dc50: 75 73 65 20 77 69 6c 6c 20 74 65 72 6d 69 6e 61  use will termina
dc60: 74 65 20 74 68 65 20 6c 6f 6f 70 20 66 6f 72 20  te the loop for 
dc70: 75 73 20 2a 2f 0a 20 20 20 20 20 20 62 72 65 61  us */.      brea
dc80: 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  k;.    }.#endif.
dc90: 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20      default: {. 
dca0: 20 20 20 20 20 61 73 73 65 72 74 28 20 65 44 65       assert( eDe
dcb0: 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20 7c  st==SRT_Output |
dcc0: 7c 20 65 44 65 73 74 3d 3d 53 52 54 5f 43 6f 72  | eDest==SRT_Cor
dcd0: 6f 75 74 69 6e 65 20 29 3b 20 0a 20 20 20 20 20  outine ); .     
dce0: 20 74 65 73 74 63 61 73 65 28 20 65 44 65 73 74   testcase( eDest
dcf0: 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20 29 3b 0a  ==SRT_Output );.
dd00: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
dd10: 65 44 65 73 74 3d 3d 53 52 54 5f 43 6f 72 6f 75  eDest==SRT_Corou
dd20: 74 69 6e 65 20 29 3b 0a 20 20 20 20 20 20 69 66  tine );.      if
dd30: 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74  ( eDest==SRT_Out
dd40: 70 75 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73  put ){.        s
dd50: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
dd60: 28 76 2c 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77  (v, OP_ResultRow
dd70: 2c 20 70 44 65 73 74 2d 3e 69 53 64 73 74 2c 20  , pDest->iSdst, 
dd80: 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20  nColumn);.      
dd90: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
dda0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
ddb0: 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 70 44  (v, OP_Yield, pD
ddc0: 65 73 74 2d 3e 69 53 44 50 61 72 6d 29 3b 0a 20  est->iSDParm);. 
ddd0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
dde0: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ak;.    }.  }.  
ddf0: 69 66 28 20 72 65 67 52 6f 77 69 64 20 29 7b 0a  if( regRowid ){.
de00: 20 20 20 20 69 66 28 20 65 44 65 73 74 3d 3d 53      if( eDest==S
de10: 52 54 5f 53 65 74 20 29 7b 0a 20 20 20 20 20 20  RT_Set ){.      
de20: 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
de30: 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20  mpRange(pParse, 
de40: 72 65 67 52 6f 77 2c 20 6e 43 6f 6c 75 6d 6e 29  regRow, nColumn)
de50: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
de60: 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
de70: 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
de80: 20 72 65 67 52 6f 77 29 3b 0a 20 20 20 20 7d 0a   regRow);.    }.
de90: 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61      sqlite3Relea
dea0: 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
deb0: 2c 20 72 65 67 52 6f 77 69 64 29 3b 0a 20 20 7d  , regRowid);.  }
dec0: 0a 20 20 2f 2a 20 54 68 65 20 62 6f 74 74 6f 6d  .  /* The bottom
ded0: 20 6f 66 20 74 68 65 20 6c 6f 6f 70 0a 20 20 2a   of the loop.  *
dee0: 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 52  /.  sqlite3VdbeR
def0: 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61  esolveLabel(v, a
df00: 64 64 72 43 6f 6e 74 69 6e 75 65 29 3b 0a 20 20  ddrContinue);.  
df10: 69 66 28 20 70 53 6f 72 74 2d 3e 73 6f 72 74 46  if( pSort->sortF
df20: 6c 61 67 73 20 26 20 53 4f 52 54 46 4c 41 47 5f  lags & SORTFLAG_
df30: 55 73 65 53 6f 72 74 65 72 20 29 7b 0a 20 20 20  UseSorter ){.   
df40: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
df50: 70 32 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72 4e  p2(v, OP_SorterN
df60: 65 78 74 2c 20 69 54 61 62 2c 20 61 64 64 72 29  ext, iTab, addr)
df70: 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
df80: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
df90: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
dfa0: 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 69 54  2(v, OP_Next, iT
dfb0: 61 62 2c 20 61 64 64 72 29 3b 20 56 64 62 65 43  ab, addr); VdbeC
dfc0: 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 7d 0a  overage(v);.  }.
dfd0: 20 20 69 66 28 20 70 53 6f 72 74 2d 3e 72 65 67    if( pSort->reg
dfe0: 52 65 74 75 72 6e 20 29 20 73 71 6c 69 74 65 33  Return ) sqlite3
dff0: 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
e000: 5f 52 65 74 75 72 6e 2c 20 70 53 6f 72 74 2d 3e  _Return, pSort->
e010: 72 65 67 52 65 74 75 72 6e 29 3b 0a 20 20 73 71  regReturn);.  sq
e020: 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
e030: 4c 61 62 65 6c 28 76 2c 20 61 64 64 72 42 72 65  Label(v, addrBre
e040: 61 6b 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  ak);.}../*.** Re
e050: 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
e060: 6f 20 61 20 73 74 72 69 6e 67 20 63 6f 6e 74 61  o a string conta
e070: 69 6e 69 6e 67 20 74 68 65 20 27 64 65 63 6c 61  ining the 'decla
e080: 72 61 74 69 6f 6e 20 74 79 70 65 27 20 6f 66 20  ration type' of 
e090: 74 68 65 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f  the.** expressio
e0a0: 6e 20 70 45 78 70 72 2e 20 54 68 65 20 73 74 72  n pExpr. The str
e0b0: 69 6e 67 20 6d 61 79 20 62 65 20 74 72 65 61 74  ing may be treat
e0c0: 65 64 20 61 73 20 73 74 61 74 69 63 20 62 79 20  ed as static by 
e0d0: 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2a 0a 2a  the caller..**.*
e0e0: 2a 20 41 6c 73 6f 20 74 72 79 20 74 6f 20 65 73  * Also try to es
e0f0: 74 69 6d 61 74 65 20 74 68 65 20 73 69 7a 65 20  timate the size 
e100: 6f 66 20 74 68 65 20 72 65 74 75 72 6e 65 64 20  of the returned 
e110: 76 61 6c 75 65 20 61 6e 64 20 72 65 74 75 72 6e  value and return
e120: 20 74 68 61 74 0a 2a 2a 20 72 65 73 75 6c 74 20   that.** result 
e130: 69 6e 20 2a 70 45 73 74 57 69 64 74 68 2e 0a 2a  in *pEstWidth..*
e140: 2a 0a 2a 2a 20 54 68 65 20 64 65 63 6c 61 72 61  *.** The declara
e150: 74 69 6f 6e 20 74 79 70 65 20 69 73 20 74 68 65  tion type is the
e160: 20 65 78 61 63 74 20 64 61 74 61 74 79 70 65 20   exact datatype 
e170: 64 65 66 69 6e 69 74 69 6f 6e 20 65 78 74 72 61  definition extra
e180: 63 74 65 64 20 66 72 6f 6d 20 74 68 65 0a 2a 2a  cted from the.**
e190: 20 6f 72 69 67 69 6e 61 6c 20 43 52 45 41 54 45   original CREATE
e1a0: 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74   TABLE statement
e1b0: 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73 69   if the expressi
e1c0: 6f 6e 20 69 73 20 61 20 63 6f 6c 75 6d 6e 2e 20  on is a column. 
e1d0: 54 68 65 0a 2a 2a 20 64 65 63 6c 61 72 61 74 69  The.** declarati
e1e0: 6f 6e 20 74 79 70 65 20 66 6f 72 20 61 20 52 4f  on type for a RO
e1f0: 57 49 44 20 66 69 65 6c 64 20 69 73 20 49 4e 54  WID field is INT
e200: 45 47 45 52 2e 20 45 78 61 63 74 6c 79 20 77 68  EGER. Exactly wh
e210: 65 6e 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e  en an expression
e220: 0a 2a 2a 20 69 73 20 63 6f 6e 73 69 64 65 72 65  .** is considere
e230: 64 20 61 20 63 6f 6c 75 6d 6e 20 63 61 6e 20 62  d a column can b
e240: 65 20 63 6f 6d 70 6c 65 78 20 69 6e 20 74 68 65  e complex in the
e250: 20 70 72 65 73 65 6e 63 65 20 6f 66 20 73 75 62   presence of sub
e260: 71 75 65 72 69 65 73 2e 20 54 68 65 0a 2a 2a 20  queries. The.** 
e270: 72 65 73 75 6c 74 2d 73 65 74 20 65 78 70 72 65  result-set expre
e280: 73 73 69 6f 6e 20 69 6e 20 61 6c 6c 20 6f 66 20  ssion in all of 
e290: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 53 45  the following SE
e2a0: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73 20  LECT statements 
e2b0: 69 73 20 0a 2a 2a 20 63 6f 6e 73 69 64 65 72 65  is .** considere
e2c0: 64 20 61 20 63 6f 6c 75 6d 6e 20 62 79 20 74 68  d a column by th
e2d0: 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a  is function..**.
e2e0: 2a 2a 20 20 20 53 45 4c 45 43 54 20 63 6f 6c 20  **   SELECT col 
e2f0: 46 52 4f 4d 20 74 62 6c 3b 0a 2a 2a 20 20 20 53  FROM tbl;.**   S
e300: 45 4c 45 43 54 20 28 53 45 4c 45 43 54 20 63 6f  ELECT (SELECT co
e310: 6c 20 46 52 4f 4d 20 74 62 6c 3b 0a 2a 2a 20 20  l FROM tbl;.**  
e320: 20 53 45 4c 45 43 54 20 28 53 45 4c 45 43 54 20   SELECT (SELECT 
e330: 63 6f 6c 20 46 52 4f 4d 20 74 62 6c 29 3b 0a 2a  col FROM tbl);.*
e340: 2a 20 20 20 53 45 4c 45 43 54 20 61 62 63 20 46  *   SELECT abc F
e350: 52 4f 4d 20 28 53 45 4c 45 43 54 20 63 6f 6c 20  ROM (SELECT col 
e360: 41 53 20 61 62 63 20 46 52 4f 4d 20 74 62 6c 29  AS abc FROM tbl)
e370: 3b 0a 2a 2a 20 0a 2a 2a 20 54 68 65 20 64 65 63  ;.** .** The dec
e380: 6c 61 72 61 74 69 6f 6e 20 74 79 70 65 20 66 6f  laration type fo
e390: 72 20 61 6e 79 20 65 78 70 72 65 73 73 69 6f 6e  r any expression
e3a0: 20 6f 74 68 65 72 20 74 68 61 6e 20 61 20 63 6f   other than a co
e3b0: 6c 75 6d 6e 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2a  lumn is NULL..**
e3c0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
e3d0: 20 68 61 73 20 65 69 74 68 65 72 20 33 20 6f 72   has either 3 or
e3e0: 20 36 20 70 61 72 61 6d 65 74 65 72 73 20 64 65   6 parameters de
e3f0: 70 65 6e 64 69 6e 67 20 6f 6e 20 77 68 65 74 68  pending on wheth
e400: 65 72 20 6f 72 20 6e 6f 74 0a 2a 2a 20 74 68 65  er or not.** the
e410: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43   SQLITE_ENABLE_C
e420: 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41 54 41 20 63  OLUMN_METADATA c
e430: 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 6f 70 74 69  ompile-time opti
e440: 6f 6e 20 69 73 20 75 73 65 64 2e 0a 2a 2f 0a 23  on is used..*/.#
e450: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
e460: 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44  BLE_COLUMN_METAD
e470: 41 54 41 0a 23 20 64 65 66 69 6e 65 20 63 6f 6c  ATA.# define col
e480: 75 6d 6e 54 79 70 65 28 41 2c 42 2c 43 2c 44 2c  umnType(A,B,C,D,
e490: 45 29 20 63 6f 6c 75 6d 6e 54 79 70 65 49 6d 70  E) columnTypeImp
e4a0: 6c 28 41 2c 42 2c 43 2c 44 2c 45 29 0a 23 65 6c  l(A,B,C,D,E).#el
e4b0: 73 65 20 2f 2a 20 69 66 20 21 64 65 66 69 6e 65  se /* if !define
e4c0: 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  d(SQLITE_ENABLE_
e4d0: 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41 54 41 29  COLUMN_METADATA)
e4e0: 20 2a 2f 0a 23 20 64 65 66 69 6e 65 20 63 6f 6c   */.# define col
e4f0: 75 6d 6e 54 79 70 65 28 41 2c 42 2c 43 2c 44 2c  umnType(A,B,C,D,
e500: 45 29 20 63 6f 6c 75 6d 6e 54 79 70 65 49 6d 70  E) columnTypeImp
e510: 6c 28 41 2c 42 29 0a 23 65 6e 64 69 66 0a 73 74  l(A,B).#endif.st
e520: 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20  atic const char 
e530: 2a 63 6f 6c 75 6d 6e 54 79 70 65 49 6d 70 6c 28  *columnTypeImpl(
e540: 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a  .  NameContext *
e550: 70 4e 43 2c 20 0a 23 69 66 6e 64 65 66 20 53 51  pNC, .#ifndef SQ
e560: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55  LITE_ENABLE_COLU
e570: 4d 4e 5f 4d 45 54 41 44 41 54 41 0a 20 20 45 78  MN_METADATA.  Ex
e580: 70 72 20 2a 70 45 78 70 72 0a 23 65 6c 73 65 0a  pr *pExpr.#else.
e590: 20 20 45 78 70 72 20 2a 70 45 78 70 72 2c 0a 20    Expr *pExpr,. 
e5a0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a 70 7a   const char **pz
e5b0: 4f 72 69 67 44 62 2c 0a 20 20 63 6f 6e 73 74 20  OrigDb,.  const 
e5c0: 63 68 61 72 20 2a 2a 70 7a 4f 72 69 67 54 61 62  char **pzOrigTab
e5d0: 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ,.  const char *
e5e0: 2a 70 7a 4f 72 69 67 43 6f 6c 0a 23 65 6e 64 69  *pzOrigCol.#endi
e5f0: 66 0a 29 7b 0a 20 20 63 68 61 72 20 63 6f 6e 73  f.){.  char cons
e600: 74 20 2a 7a 54 79 70 65 20 3d 20 30 3b 0a 20 20  t *zType = 0;.  
e610: 69 6e 74 20 6a 3b 0a 23 69 66 64 65 66 20 53 51  int j;.#ifdef SQ
e620: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55  LITE_ENABLE_COLU
e630: 4d 4e 5f 4d 45 54 41 44 41 54 41 0a 20 20 63 68  MN_METADATA.  ch
e640: 61 72 20 63 6f 6e 73 74 20 2a 7a 4f 72 69 67 44  ar const *zOrigD
e650: 62 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 63 6f  b = 0;.  char co
e660: 6e 73 74 20 2a 7a 4f 72 69 67 54 61 62 20 3d 20  nst *zOrigTab = 
e670: 30 3b 0a 20 20 63 68 61 72 20 63 6f 6e 73 74 20  0;.  char const 
e680: 2a 7a 4f 72 69 67 43 6f 6c 20 3d 20 30 3b 0a 23  *zOrigCol = 0;.#
e690: 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28  endif..  assert(
e6a0: 20 70 45 78 70 72 21 3d 30 20 29 3b 0a 20 20 61   pExpr!=0 );.  a
e6b0: 73 73 65 72 74 28 20 70 4e 43 2d 3e 70 53 72 63  ssert( pNC->pSrc
e6c0: 4c 69 73 74 21 3d 30 20 29 3b 0a 20 20 73 77 69  List!=0 );.  swi
e6d0: 74 63 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29  tch( pExpr->op )
e6e0: 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f  {.    case TK_CO
e6f0: 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20 20 20 2f 2a  LUMN: {.      /*
e700: 20 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   The expression 
e710: 69 73 20 61 20 63 6f 6c 75 6d 6e 2e 20 4c 6f 63  is a column. Loc
e720: 61 74 65 20 74 68 65 20 74 61 62 6c 65 20 74 68  ate the table th
e730: 65 20 63 6f 6c 75 6d 6e 20 69 73 20 62 65 69 6e  e column is bein
e740: 67 0a 20 20 20 20 20 20 2a 2a 20 65 78 74 72 61  g.      ** extra
e750: 63 74 65 64 20 66 72 6f 6d 20 69 6e 20 4e 61 6d  cted from in Nam
e760: 65 43 6f 6e 74 65 78 74 2e 70 53 72 63 4c 69 73  eContext.pSrcLis
e770: 74 2e 20 54 68 69 73 20 74 61 62 6c 65 20 6d 61  t. This table ma
e780: 79 20 62 65 20 72 65 61 6c 0a 20 20 20 20 20 20  y be real.      
e790: 2a 2a 20 64 61 74 61 62 61 73 65 20 74 61 62 6c  ** database tabl
e7a0: 65 20 6f 72 20 61 20 73 75 62 71 75 65 72 79 2e  e or a subquery.
e7b0: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
e7c0: 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 30 3b  Table *pTab = 0;
e7d0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
e7e0: 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 20 63  able structure c
e7f0: 6f 6c 75 6d 6e 20 69 73 20 65 78 74 72 61 63 74  olumn is extract
e800: 65 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 20 20 20  ed from */.     
e810: 20 53 65 6c 65 63 74 20 2a 70 53 20 3d 20 30 3b   Select *pS = 0;
e820: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
e830: 53 65 6c 65 63 74 20 74 68 65 20 63 6f 6c 75 6d  Select the colum
e840: 6e 20 69 73 20 65 78 74 72 61 63 74 65 64 20 66  n is extracted f
e850: 72 6f 6d 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  rom */.      int
e860: 20 69 43 6f 6c 20 3d 20 70 45 78 70 72 2d 3e 69   iCol = pExpr->i
e870: 43 6f 6c 75 6d 6e 3b 20 20 2f 2a 20 49 6e 64 65  Column;  /* Inde
e880: 78 20 6f 66 20 63 6f 6c 75 6d 6e 20 69 6e 20 70  x of column in p
e890: 54 61 62 20 2a 2f 0a 20 20 20 20 20 20 77 68 69  Tab */.      whi
e8a0: 6c 65 28 20 70 4e 43 20 26 26 20 21 70 54 61 62  le( pNC && !pTab
e8b0: 20 29 7b 0a 20 20 20 20 20 20 20 20 53 72 63 4c   ){.        SrcL
e8c0: 69 73 74 20 2a 70 54 61 62 4c 69 73 74 20 3d 20  ist *pTabList = 
e8d0: 70 4e 43 2d 3e 70 53 72 63 4c 69 73 74 3b 0a 20  pNC->pSrcList;. 
e8e0: 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 6a         for(j=0;j
e8f0: 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 20  <pTabList->nSrc 
e900: 26 26 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 6a  && pTabList->a[j
e910: 5d 2e 69 43 75 72 73 6f 72 21 3d 70 45 78 70 72  ].iCursor!=pExpr
e920: 2d 3e 69 54 61 62 6c 65 3b 6a 2b 2b 29 3b 0a 20  ->iTable;j++);. 
e930: 20 20 20 20 20 20 20 69 66 28 20 6a 3c 70 54 61         if( j<pTa
e940: 62 4c 69 73 74 2d 3e 6e 53 72 63 20 29 7b 0a 20  bList->nSrc ){. 
e950: 20 20 20 20 20 20 20 20 20 70 54 61 62 20 3d 20           pTab = 
e960: 70 54 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 70  pTabList->a[j].p
e970: 54 61 62 3b 0a 20 20 20 20 20 20 20 20 20 20 70  Tab;.          p
e980: 53 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b  S = pTabList->a[
e990: 6a 5d 2e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20  j].pSelect;.    
e9a0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
e9b0: 20 20 20 20 20 70 4e 43 20 3d 20 70 4e 43 2d 3e       pNC = pNC->
e9c0: 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 20 20 7d  pNext;.        }
e9d0: 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
e9e0: 69 66 28 20 70 54 61 62 3d 3d 30 20 29 7b 0a 20  if( pTab==0 ){. 
e9f0: 20 20 20 20 20 20 20 2f 2a 20 41 74 20 6f 6e 65         /* At one
ea00: 20 74 69 6d 65 2c 20 63 6f 64 65 20 73 75 63 68   time, code such
ea10: 20 61 73 20 22 53 45 4c 45 43 54 20 6e 65 77 2e   as "SELECT new.
ea20: 78 22 20 77 69 74 68 69 6e 20 61 20 74 72 69 67  x" within a trig
ea30: 67 65 72 20 77 6f 75 6c 64 0a 20 20 20 20 20 20  ger would.      
ea40: 20 20 2a 2a 20 63 61 75 73 65 20 74 68 69 73 20    ** cause this 
ea50: 63 6f 6e 64 69 74 69 6f 6e 20 74 6f 20 72 75 6e  condition to run
ea60: 2e 20 20 53 69 6e 63 65 20 74 68 65 6e 2c 20 77  .  Since then, w
ea70: 65 20 68 61 76 65 20 72 65 73 74 72 75 63 74 75  e have restructu
ea80: 72 65 64 20 68 6f 77 0a 20 20 20 20 20 20 20 20  red how.        
ea90: 2a 2a 20 74 72 69 67 67 65 72 20 63 6f 64 65 20  ** trigger code 
eaa0: 69 73 20 67 65 6e 65 72 61 74 65 64 20 61 6e 64  is generated and
eab0: 20 73 6f 20 74 68 69 73 20 63 6f 6e 64 69 74 69   so this conditi
eac0: 6f 6e 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20  on is no longer 
ead0: 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 6f 73 73  .        ** poss
eae0: 69 62 6c 65 2e 20 48 6f 77 65 76 65 72 2c 20 69  ible. However, i
eaf0: 74 20 63 61 6e 20 73 74 69 6c 6c 20 62 65 20 74  t can still be t
eb00: 72 75 65 20 66 6f 72 20 73 74 61 74 65 6d 65 6e  rue for statemen
eb10: 74 73 20 6c 69 6b 65 0a 20 20 20 20 20 20 20 20  ts like.        
eb20: 2a 2a 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** the following
eb30: 3a 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20  :.        **.   
eb40: 20 20 20 20 20 2a 2a 20 20 20 43 52 45 41 54 45       **   CREATE
eb50: 20 54 41 42 4c 45 20 74 31 28 63 6f 6c 20 49 4e   TABLE t1(col IN
eb60: 54 45 47 45 52 29 3b 0a 20 20 20 20 20 20 20 20  TEGER);.        
eb70: 2a 2a 20 20 20 53 45 4c 45 43 54 20 28 53 45 4c  **   SELECT (SEL
eb80: 45 43 54 20 74 31 2e 63 6f 6c 29 20 46 52 4f 4d  ECT t1.col) FROM
eb90: 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 20 20   FROM t1;.      
eba0: 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20    **.        ** 
ebb0: 77 68 65 6e 20 63 6f 6c 75 6d 6e 54 79 70 65 28  when columnType(
ebc0: 29 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e 20 74  ) is called on t
ebd0: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 22 74  he expression "t
ebe0: 31 2e 63 6f 6c 22 20 69 6e 20 74 68 65 20 0a 20  1.col" in the . 
ebf0: 20 20 20 20 20 20 20 2a 2a 20 73 75 62 2d 73 65         ** sub-se
ec00: 6c 65 63 74 2e 20 49 6e 20 74 68 69 73 20 63 61  lect. In this ca
ec10: 73 65 2c 20 73 65 74 20 74 68 65 20 63 6f 6c 75  se, set the colu
ec20: 6d 6e 20 74 79 70 65 20 74 6f 20 4e 55 4c 4c 2c  mn type to NULL,
ec30: 20 65 76 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a   even.        **
ec40: 20 74 68 6f 75 67 68 20 69 74 20 73 68 6f 75 6c   though it shoul
ec50: 64 20 72 65 61 6c 6c 79 20 62 65 20 22 49 4e 54  d really be "INT
ec60: 45 47 45 52 22 2e 0a 20 20 20 20 20 20 20 20 2a  EGER"..        *
ec70: 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 54 68 69  *.        ** Thi
ec80: 73 20 69 73 20 6e 6f 74 20 61 20 70 72 6f 62 6c  s is not a probl
ec90: 65 6d 2c 20 61 73 20 74 68 65 20 63 6f 6c 75 6d  em, as the colum
eca0: 6e 20 74 79 70 65 20 6f 66 20 22 74 31 2e 63 6f  n type of "t1.co
ecb0: 6c 22 20 69 73 20 6e 65 76 65 72 0a 20 20 20 20  l" is never.    
ecc0: 20 20 20 20 2a 2a 20 75 73 65 64 2e 20 57 68 65      ** used. Whe
ecd0: 6e 20 63 6f 6c 75 6d 6e 54 79 70 65 28 29 20 69  n columnType() i
ece0: 73 20 63 61 6c 6c 65 64 20 6f 6e 20 74 68 65 20  s called on the 
ecf0: 65 78 70 72 65 73 73 69 6f 6e 20 0a 20 20 20 20  expression .    
ed00: 20 20 20 20 2a 2a 20 22 28 53 45 4c 45 43 54 20      ** "(SELECT 
ed10: 74 31 2e 63 6f 6c 29 22 2c 20 74 68 65 20 63 6f  t1.col)", the co
ed20: 72 72 65 63 74 20 74 79 70 65 20 69 73 20 72 65  rrect type is re
ed30: 74 75 72 6e 65 64 20 28 73 65 65 20 74 68 65 20  turned (see the 
ed40: 54 4b 5f 53 45 4c 45 43 54 0a 20 20 20 20 20 20  TK_SELECT.      
ed50: 20 20 2a 2a 20 62 72 61 6e 63 68 20 62 65 6c 6f    ** branch belo
ed60: 77 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 62  w.  */.        b
ed70: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  reak;.      }.. 
ed80: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54 61       assert( pTa
ed90: 62 20 26 26 20 70 45 78 70 72 2d 3e 79 2e 70 54  b && pExpr->y.pT
eda0: 61 62 3d 3d 70 54 61 62 20 29 3b 0a 20 20 20 20  ab==pTab );.    
edb0: 20 20 69 66 28 20 70 53 20 29 7b 0a 20 20 20 20    if( pS ){.    
edc0: 20 20 20 20 2f 2a 20 54 68 65 20 22 74 61 62 6c      /* The "tabl
edd0: 65 22 20 69 73 20 61 63 74 75 61 6c 6c 79 20 61  e" is actually a
ede0: 20 73 75 62 2d 73 65 6c 65 63 74 20 6f 72 20 61   sub-select or a
edf0: 20 76 69 65 77 20 69 6e 20 74 68 65 20 46 52 4f   view in the FRO
ee00: 4d 20 63 6c 61 75 73 65 0a 20 20 20 20 20 20 20  M clause.       
ee10: 20 2a 2a 20 6f 66 20 74 68 65 20 53 45 4c 45 43   ** of the SELEC
ee20: 54 20 73 74 61 74 65 6d 65 6e 74 2e 20 52 65 74  T statement. Ret
ee30: 75 72 6e 20 74 68 65 20 64 65 63 6c 61 72 61 74  urn the declarat
ee40: 69 6f 6e 20 74 79 70 65 20 61 6e 64 20 6f 72 69  ion type and ori
ee50: 67 69 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 64  gin.        ** d
ee60: 61 74 61 20 66 6f 72 20 74 68 65 20 72 65 73 75  ata for the resu
ee70: 6c 74 2d 73 65 74 20 63 6f 6c 75 6d 6e 20 6f 66  lt-set column of
ee80: 20 74 68 65 20 73 75 62 2d 73 65 6c 65 63 74 2e   the sub-select.
ee90: 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
eea0: 20 20 20 20 69 66 28 20 69 43 6f 6c 3e 3d 30 20      if( iCol>=0 
eeb0: 26 26 20 69 43 6f 6c 3c 70 53 2d 3e 70 45 4c 69  && iCol<pS->pELi
eec0: 73 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20  st->nExpr ){.   
eed0: 20 20 20 20 20 20 20 2f 2a 20 49 66 20 69 43 6f         /* If iCo
eee0: 6c 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 7a  l is less than z
eef0: 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 65 78  ero, then the ex
ef00: 70 72 65 73 73 69 6f 6e 20 72 65 71 75 65 73 74  pression request
ef10: 73 20 74 68 65 0a 20 20 20 20 20 20 20 20 20 20  s the.          
ef20: 2a 2a 20 72 6f 77 69 64 20 6f 66 20 74 68 65 20  ** rowid of the 
ef30: 73 75 62 2d 73 65 6c 65 63 74 20 6f 72 20 76 69  sub-select or vi
ef40: 65 77 2e 20 54 68 69 73 20 65 78 70 72 65 73 73  ew. This express
ef50: 69 6f 6e 20 69 73 20 6c 65 67 61 6c 20 28 73 65  ion is legal (se
ef60: 65 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  e .          ** 
ef70: 74 65 73 74 20 63 61 73 65 20 6d 69 73 63 32 2e  test case misc2.
ef80: 32 2e 32 29 20 2d 20 69 74 20 61 6c 77 61 79 73  2.2) - it always
ef90: 20 65 76 61 6c 75 61 74 65 73 20 74 6f 20 4e 55   evaluates to NU
efa0: 4c 4c 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f  LL..          */
efb0: 0a 20 20 20 20 20 20 20 20 20 20 4e 61 6d 65 43  .          NameC
efc0: 6f 6e 74 65 78 74 20 73 4e 43 3b 0a 20 20 20 20  ontext sNC;.    
efd0: 20 20 20 20 20 20 45 78 70 72 20 2a 70 20 3d 20        Expr *p = 
efe0: 70 53 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 69 43  pS->pEList->a[iC
eff0: 6f 6c 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20  ol].pExpr;.     
f000: 20 20 20 20 20 73 4e 43 2e 70 53 72 63 4c 69 73       sNC.pSrcLis
f010: 74 20 3d 20 70 53 2d 3e 70 53 72 63 3b 0a 20 20  t = pS->pSrc;.  
f020: 20 20 20 20 20 20 20 20 73 4e 43 2e 70 4e 65 78          sNC.pNex
f030: 74 20 3d 20 70 4e 43 3b 0a 20 20 20 20 20 20 20  t = pNC;.       
f040: 20 20 20 73 4e 43 2e 70 50 61 72 73 65 20 3d 20     sNC.pParse = 
f050: 70 4e 43 2d 3e 70 50 61 72 73 65 3b 0a 20 20 20  pNC->pParse;.   
f060: 20 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20 63         zType = c
f070: 6f 6c 75 6d 6e 54 79 70 65 28 26 73 4e 43 2c 20  olumnType(&sNC, 
f080: 70 2c 26 7a 4f 72 69 67 44 62 2c 26 7a 4f 72 69  p,&zOrigDb,&zOri
f090: 67 54 61 62 2c 26 7a 4f 72 69 67 43 6f 6c 29 3b  gTab,&zOrigCol);
f0a0: 20 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20   .        }.    
f0b0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
f0c0: 20 2f 2a 20 41 20 72 65 61 6c 20 74 61 62 6c 65   /* A real table
f0d0: 20 6f 72 20 61 20 43 54 45 20 74 61 62 6c 65 20   or a CTE table 
f0e0: 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  */.        asser
f0f0: 74 28 20 21 70 53 20 29 3b 0a 23 69 66 64 65 66  t( !pS );.#ifdef
f100: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43   SQLITE_ENABLE_C
f110: 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41 54 41 0a 20  OLUMN_METADATA. 
f120: 20 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3c         if( iCol<
f130: 30 20 29 20 69 43 6f 6c 20 3d 20 70 54 61 62 2d  0 ) iCol = pTab-
f140: 3e 69 50 4b 65 79 3b 0a 20 20 20 20 20 20 20 20  >iPKey;.        
f150: 61 73 73 65 72 74 28 20 69 43 6f 6c 3d 3d 58 4e  assert( iCol==XN
f160: 5f 52 4f 57 49 44 20 7c 7c 20 28 69 43 6f 6c 3e  _ROWID || (iCol>
f170: 3d 30 20 26 26 20 69 43 6f 6c 3c 70 54 61 62 2d  =0 && iCol<pTab-
f180: 3e 6e 43 6f 6c 29 20 29 3b 0a 20 20 20 20 20 20  >nCol) );.      
f190: 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 29 7b 0a    if( iCol<0 ){.
f1a0: 20 20 20 20 20 20 20 20 20 20 7a 54 79 70 65 20            zType 
f1b0: 3d 20 22 49 4e 54 45 47 45 52 22 3b 0a 20 20 20  = "INTEGER";.   
f1c0: 20 20 20 20 20 20 20 7a 4f 72 69 67 43 6f 6c 20         zOrigCol 
f1d0: 3d 20 22 72 6f 77 69 64 22 3b 0a 20 20 20 20 20  = "rowid";.     
f1e0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
f1f0: 20 20 20 20 7a 4f 72 69 67 43 6f 6c 20 3d 20 70      zOrigCol = p
f200: 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e  Tab->aCol[iCol].
f210: 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 20  zName;.         
f220: 20 7a 54 79 70 65 20 3d 20 73 71 6c 69 74 65 33   zType = sqlite3
f230: 43 6f 6c 75 6d 6e 54 79 70 65 28 26 70 54 61 62  ColumnType(&pTab
f240: 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2c 30 29 3b  ->aCol[iCol],0);
f250: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
f260: 20 20 20 7a 4f 72 69 67 54 61 62 20 3d 20 70 54     zOrigTab = pT
f270: 61 62 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20  ab->zName;.     
f280: 20 20 20 69 66 28 20 70 4e 43 2d 3e 70 50 61 72     if( pNC->pPar
f290: 73 65 20 26 26 20 70 54 61 62 2d 3e 70 53 63 68  se && pTab->pSch
f2a0: 65 6d 61 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ema ){.         
f2b0: 20 69 6e 74 20 69 44 62 20 3d 20 73 71 6c 69 74   int iDb = sqlit
f2c0: 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28  e3SchemaToIndex(
f2d0: 70 4e 43 2d 3e 70 50 61 72 73 65 2d 3e 64 62 2c  pNC->pParse->db,
f2e0: 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b   pTab->pSchema);
f2f0: 0a 20 20 20 20 20 20 20 20 20 20 7a 4f 72 69 67  .          zOrig
f300: 44 62 20 3d 20 70 4e 43 2d 3e 70 50 61 72 73 65  Db = pNC->pParse
f310: 2d 3e 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a  ->db->aDb[iDb].z
f320: 44 62 53 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20  DbSName;.       
f330: 20 7d 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 20   }.#else.       
f340: 20 61 73 73 65 72 74 28 20 69 43 6f 6c 3d 3d 58   assert( iCol==X
f350: 4e 5f 52 4f 57 49 44 20 7c 7c 20 28 69 43 6f 6c  N_ROWID || (iCol
f360: 3e 3d 30 20 26 26 20 69 43 6f 6c 3c 70 54 61 62  >=0 && iCol<pTab
f370: 2d 3e 6e 43 6f 6c 29 20 29 3b 0a 20 20 20 20 20  ->nCol) );.     
f380: 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 29 7b     if( iCol<0 ){
f390: 0a 20 20 20 20 20 20 20 20 20 20 7a 54 79 70 65  .          zType
f3a0: 20 3d 20 22 49 4e 54 45 47 45 52 22 3b 0a 20 20   = "INTEGER";.  
f3b0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
f3c0: 20 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20 73         zType = s
f3d0: 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 54 79 70 65  qlite3ColumnType
f3e0: 28 26 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f  (&pTab->aCol[iCo
f3f0: 6c 5d 2c 30 29 3b 0a 20 20 20 20 20 20 20 20 7d  l],0);.        }
f400: 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 7d 0a  .#endif.      }.
f410: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
f420: 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54   }.#ifndef SQLIT
f430: 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a  E_OMIT_SUBQUERY.
f440: 20 20 20 20 63 61 73 65 20 54 4b 5f 53 45 4c 45      case TK_SELE
f450: 43 54 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 54  CT: {.      /* T
f460: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  he expression is
f470: 20 61 20 73 75 62 2d 73 65 6c 65 63 74 2e 20 52   a sub-select. R
f480: 65 74 75 72 6e 20 74 68 65 20 64 65 63 6c 61 72  eturn the declar
f490: 61 74 69 6f 6e 20 74 79 70 65 20 61 6e 64 0a 20  ation type and. 
f4a0: 20 20 20 20 20 2a 2a 20 6f 72 69 67 69 6e 20 69       ** origin i
f4b0: 6e 66 6f 20 66 6f 72 20 74 68 65 20 73 69 6e 67  nfo for the sing
f4c0: 6c 65 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65  le column in the
f4d0: 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20 74   result set of t
f4e0: 68 65 20 53 45 4c 45 43 54 0a 20 20 20 20 20 20  he SELECT.      
f4f0: 2a 2a 20 73 74 61 74 65 6d 65 6e 74 2e 0a 20 20  ** statement..  
f500: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 4e 61 6d      */.      Nam
f510: 65 43 6f 6e 74 65 78 74 20 73 4e 43 3b 0a 20 20  eContext sNC;.  
f520: 20 20 20 20 53 65 6c 65 63 74 20 2a 70 53 20 3d      Select *pS =
f530: 20 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63   pExpr->x.pSelec
f540: 74 3b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70  t;.      Expr *p
f550: 20 3d 20 70 53 2d 3e 70 45 4c 69 73 74 2d 3e 61   = pS->pEList->a
f560: 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20  [0].pExpr;.     
f570: 20 61 73 73 65 72 74 28 20 45 78 70 72 48 61 73   assert( ExprHas
f580: 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
f590: 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b  EP_xIsSelect) );
f5a0: 0a 20 20 20 20 20 20 73 4e 43 2e 70 53 72 63 4c  .      sNC.pSrcL
f5b0: 69 73 74 20 3d 20 70 53 2d 3e 70 53 72 63 3b 0a  ist = pS->pSrc;.
f5c0: 20 20 20 20 20 20 73 4e 43 2e 70 4e 65 78 74 20        sNC.pNext 
f5d0: 3d 20 70 4e 43 3b 0a 20 20 20 20 20 20 73 4e 43  = pNC;.      sNC
f5e0: 2e 70 50 61 72 73 65 20 3d 20 70 4e 43 2d 3e 70  .pParse = pNC->p
f5f0: 50 61 72 73 65 3b 0a 20 20 20 20 20 20 7a 54 79  Parse;.      zTy
f600: 70 65 20 3d 20 63 6f 6c 75 6d 6e 54 79 70 65 28  pe = columnType(
f610: 26 73 4e 43 2c 20 70 2c 20 26 7a 4f 72 69 67 44  &sNC, p, &zOrigD
f620: 62 2c 20 26 7a 4f 72 69 67 54 61 62 2c 20 26 7a  b, &zOrigTab, &z
f630: 4f 72 69 67 43 6f 6c 29 3b 20 0a 20 20 20 20 20  OrigCol); .     
f640: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65   break;.    }.#e
f650: 6e 64 69 66 0a 20 20 7d 0a 0a 23 69 66 64 65 66  ndif.  }..#ifdef
f660: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43   SQLITE_ENABLE_C
f670: 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41 54 41 20 20  OLUMN_METADATA  
f680: 0a 20 20 69 66 28 20 70 7a 4f 72 69 67 44 62 20  .  if( pzOrigDb 
f690: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
f6a0: 7a 4f 72 69 67 54 61 62 20 26 26 20 70 7a 4f 72  zOrigTab && pzOr
f6b0: 69 67 43 6f 6c 20 29 3b 0a 20 20 20 20 2a 70 7a  igCol );.    *pz
f6c0: 4f 72 69 67 44 62 20 3d 20 7a 4f 72 69 67 44 62  OrigDb = zOrigDb
f6d0: 3b 0a 20 20 20 20 2a 70 7a 4f 72 69 67 54 61 62  ;.    *pzOrigTab
f6e0: 20 3d 20 7a 4f 72 69 67 54 61 62 3b 0a 20 20 20   = zOrigTab;.   
f6f0: 20 2a 70 7a 4f 72 69 67 43 6f 6c 20 3d 20 7a 4f   *pzOrigCol = zO
f700: 72 69 67 43 6f 6c 3b 0a 20 20 7d 0a 23 65 6e 64  rigCol;.  }.#end
f710: 69 66 0a 20 20 72 65 74 75 72 6e 20 7a 54 79 70  if.  return zTyp
f720: 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  e;.}../*.** Gene
f730: 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 77  rate code that w
f740: 69 6c 6c 20 74 65 6c 6c 20 74 68 65 20 56 44 42  ill tell the VDB
f750: 45 20 74 68 65 20 64 65 63 6c 61 72 61 74 69 6f  E the declaratio
f760: 6e 20 74 79 70 65 73 20 6f 66 20 63 6f 6c 75 6d  n types of colum
f770: 6e 73 0a 2a 2a 20 69 6e 20 74 68 65 20 72 65 73  ns.** in the res
f780: 75 6c 74 20 73 65 74 2e 0a 2a 2f 0a 73 74 61 74  ult set..*/.stat
f790: 69 63 20 76 6f 69 64 20 67 65 6e 65 72 61 74 65  ic void generate
f7a0: 43 6f 6c 75 6d 6e 54 79 70 65 73 28 0a 20 20 50  ColumnTypes(.  P
f7b0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
f7c0: 20 20 20 2f 2a 20 50 61 72 73 65 72 20 63 6f 6e     /* Parser con
f7d0: 74 65 78 74 20 2a 2f 0a 20 20 53 72 63 4c 69 73  text */.  SrcLis
f7e0: 74 20 2a 70 54 61 62 4c 69 73 74 2c 20 20 2f 2a  t *pTabList,  /*
f7f0: 20 4c 69 73 74 20 6f 66 20 74 61 62 6c 65 73 20   List of tables 
f800: 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
f810: 45 4c 69 73 74 20 20 20 20 2f 2a 20 45 78 70 72  EList    /* Expr
f820: 65 73 73 69 6f 6e 73 20 64 65 66 69 6e 69 6e 67  essions defining
f830: 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20   the result set 
f840: 2a 2f 0a 29 7b 0a 23 69 66 6e 64 65 66 20 53 51  */.){.#ifndef SQ
f850: 4c 49 54 45 5f 4f 4d 49 54 5f 44 45 43 4c 54 59  LITE_OMIT_DECLTY
f860: 50 45 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  PE.  Vdbe *v = p
f870: 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
f880: 69 6e 74 20 69 3b 0a 20 20 4e 61 6d 65 43 6f 6e  int i;.  NameCon
f890: 74 65 78 74 20 73 4e 43 3b 0a 20 20 73 4e 43 2e  text sNC;.  sNC.
f8a0: 70 53 72 63 4c 69 73 74 20 3d 20 70 54 61 62 4c  pSrcList = pTabL
f8b0: 69 73 74 3b 0a 20 20 73 4e 43 2e 70 50 61 72 73  ist;.  sNC.pPars
f8c0: 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20 73 4e  e = pParse;.  sN
f8d0: 43 2e 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 66  C.pNext = 0;.  f
f8e0: 6f 72 28 69 3d 30 3b 20 69 3c 70 45 4c 69 73 74  or(i=0; i<pEList
f8f0: 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20  ->nExpr; i++){. 
f900: 20 20 20 45 78 70 72 20 2a 70 20 3d 20 70 45 4c     Expr *p = pEL
f910: 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b  ist->a[i].pExpr;
f920: 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
f930: 2a 7a 54 79 70 65 3b 0a 23 69 66 64 65 66 20 53  *zType;.#ifdef S
f940: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c  QLITE_ENABLE_COL
f950: 55 4d 4e 5f 4d 45 54 41 44 41 54 41 0a 20 20 20  UMN_METADATA.   
f960: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f 72   const char *zOr
f970: 69 67 44 62 20 3d 20 30 3b 0a 20 20 20 20 63 6f  igDb = 0;.    co
f980: 6e 73 74 20 63 68 61 72 20 2a 7a 4f 72 69 67 54  nst char *zOrigT
f990: 61 62 20 3d 20 30 3b 0a 20 20 20 20 63 6f 6e 73  ab = 0;.    cons
f9a0: 74 20 63 68 61 72 20 2a 7a 4f 72 69 67 43 6f 6c  t char *zOrigCol
f9b0: 20 3d 20 30 3b 0a 20 20 20 20 7a 54 79 70 65 20   = 0;.    zType 
f9c0: 3d 20 63 6f 6c 75 6d 6e 54 79 70 65 28 26 73 4e  = columnType(&sN
f9d0: 43 2c 20 70 2c 20 26 7a 4f 72 69 67 44 62 2c 20  C, p, &zOrigDb, 
f9e0: 26 7a 4f 72 69 67 54 61 62 2c 20 26 7a 4f 72 69  &zOrigTab, &zOri
f9f0: 67 43 6f 6c 29 3b 0a 0a 20 20 20 20 2f 2a 20 54  gCol);..    /* T
fa00: 68 65 20 76 64 62 65 20 6d 75 73 74 20 6d 61 6b  he vdbe must mak
fa10: 65 20 69 74 73 20 6f 77 6e 20 63 6f 70 79 20 6f  e its own copy o
fa20: 66 20 74 68 65 20 63 6f 6c 75 6d 6e 2d 74 79 70  f the column-typ
fa30: 65 20 61 6e 64 20 6f 74 68 65 72 20 0a 20 20 20  e and other .   
fa40: 20 2a 2a 20 63 6f 6c 75 6d 6e 20 73 70 65 63 69   ** column speci
fa50: 66 69 63 20 73 74 72 69 6e 67 73 2c 20 69 6e 20  fic strings, in 
fa60: 63 61 73 65 20 74 68 65 20 73 63 68 65 6d 61 20  case the schema 
fa70: 69 73 20 72 65 73 65 74 20 62 65 66 6f 72 65 20  is reset before 
fa80: 74 68 69 73 0a 20 20 20 20 2a 2a 20 76 69 72 74  this.    ** virt
fa90: 75 61 6c 20 6d 61 63 68 69 6e 65 20 69 73 20 64  ual machine is d
faa0: 65 6c 65 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20  eleted..    */. 
fab0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65     sqlite3VdbeSe
fac0: 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43  tColName(v, i, C
fad0: 4f 4c 4e 41 4d 45 5f 44 41 54 41 42 41 53 45 2c  OLNAME_DATABASE,
fae0: 20 7a 4f 72 69 67 44 62 2c 20 53 51 4c 49 54 45   zOrigDb, SQLITE
faf0: 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20  _TRANSIENT);.   
fb00: 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43   sqlite3VdbeSetC
fb10: 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c  olName(v, i, COL
fb20: 4e 41 4d 45 5f 54 41 42 4c 45 2c 20 7a 4f 72 69  NAME_TABLE, zOri
fb30: 67 54 61 62 2c 20 53 51 4c 49 54 45 5f 54 52 41  gTab, SQLITE_TRA
fb40: 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20 73 71 6c  NSIENT);.    sql
fb50: 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61  ite3VdbeSetColNa
fb60: 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45  me(v, i, COLNAME
fb70: 5f 43 4f 4c 55 4d 4e 2c 20 7a 4f 72 69 67 43 6f  _COLUMN, zOrigCo
fb80: 6c 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49  l, SQLITE_TRANSI
fb90: 45 4e 54 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20  ENT);.#else.    
fba0: 7a 54 79 70 65 20 3d 20 63 6f 6c 75 6d 6e 54 79  zType = columnTy
fbb0: 70 65 28 26 73 4e 43 2c 20 70 2c 20 30 2c 20 30  pe(&sNC, p, 0, 0
fbc0: 2c 20 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  , 0);.#endif.   
fbd0: 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43   sqlite3VdbeSetC
fbe0: 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c  olName(v, i, COL
fbf0: 4e 41 4d 45 5f 44 45 43 4c 54 59 50 45 2c 20 7a  NAME_DECLTYPE, z
fc00: 54 79 70 65 2c 20 53 51 4c 49 54 45 5f 54 52 41  Type, SQLITE_TRA
fc10: 4e 53 49 45 4e 54 29 3b 0a 20 20 7d 0a 23 65 6e  NSIENT);.  }.#en
fc20: 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28  dif /* !defined(
fc30: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 45 43 4c  SQLITE_OMIT_DECL
fc40: 54 59 50 45 29 20 2a 2f 0a 7d 0a 0a 0a 2f 2a 0a  TYPE) */.}.../*.
fc50: 2a 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20 63  ** Compute the c
fc60: 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 66 6f 72 20  olumn names for 
fc70: 61 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  a SELECT stateme
fc80: 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 6e  nt..**.** The on
fc90: 6c 79 20 67 75 61 72 61 6e 74 65 65 20 74 68 61  ly guarantee tha
fca0: 74 20 53 51 4c 69 74 65 20 6d 61 6b 65 73 20 61  t SQLite makes a
fcb0: 62 6f 75 74 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65  bout column name
fcc0: 73 20 69 73 20 74 68 61 74 20 69 66 20 74 68 65  s is that if the
fcd0: 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 68 61 73 20 61  .** column has a
fce0: 6e 20 41 53 20 63 6c 61 75 73 65 20 61 73 73 69  n AS clause assi
fcf0: 67 6e 69 6e 67 20 69 74 20 61 20 6e 61 6d 65 2c  gning it a name,
fd00: 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20 74 68   that will be th
fd10: 65 20 6e 61 6d 65 20 75 73 65 64 2e 0a 2a 2a 20  e name used..** 
fd20: 54 68 61 74 20 69 73 20 74 68 65 20 6f 6e 6c 79  That is the only
fd30: 20 64 6f 63 75 6d 65 6e 74 65 64 20 67 75 61 72   documented guar
fd40: 61 6e 74 65 65 2e 20 20 48 6f 77 65 76 65 72 2c  antee.  However,
fd50: 20 63 6f 75 6e 74 6c 65 73 73 20 61 70 70 6c 69   countless appli
fd60: 63 61 74 69 6f 6e 73 0a 2a 2a 20 64 65 76 65 6c  cations.** devel
fd70: 6f 70 65 64 20 6f 76 65 72 20 74 68 65 20 79 65  oped over the ye
fd80: 61 72 73 20 68 61 76 65 20 6d 61 64 65 20 62 61  ars have made ba
fd90: 73 65 6c 65 73 73 20 61 73 73 75 6d 70 74 69 6f  seless assumptio
fda0: 6e 73 20 61 62 6f 75 74 20 63 6f 6c 75 6d 6e 20  ns about column 
fdb0: 6e 61 6d 65 73 0a 2a 2a 20 61 6e 64 20 77 69 6c  names.** and wil
fdc0: 6c 20 62 72 65 61 6b 20 69 66 20 74 68 6f 73 65  l break if those
fdd0: 20 61 73 73 75 6d 70 74 69 6f 6e 73 20 63 68 61   assumptions cha
fde0: 6e 67 65 73 2e 20 20 48 65 6e 63 65 2c 20 75 73  nges.  Hence, us
fdf0: 65 20 65 78 74 72 65 6d 65 20 63 61 75 74 69 6f  e extreme cautio
fe00: 6e 0a 2a 2a 20 77 68 65 6e 20 6d 6f 64 69 66 79  n.** when modify
fe10: 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ing this routine
fe20: 20 74 6f 20 61 76 6f 69 64 20 62 72 65 61 6b 69   to avoid breaki
fe30: 6e 67 20 6c 65 67 61 63 79 2e 0a 2a 2a 0a 2a 2a  ng legacy..**.**
fe40: 20 53 65 65 20 41 6c 73 6f 3a 20 73 71 6c 69 74   See Also: sqlit
fe50: 65 33 43 6f 6c 75 6d 6e 73 46 72 6f 6d 45 78 70  e3ColumnsFromExp
fe60: 72 4c 69 73 74 28 29 0a 2a 2a 0a 2a 2a 20 54 68  rList().**.** Th
fe70: 65 20 50 52 41 47 4d 41 20 73 68 6f 72 74 5f 63  e PRAGMA short_c
fe80: 6f 6c 75 6d 6e 5f 6e 61 6d 65 73 20 61 6e 64 20  olumn_names and 
fe90: 50 52 41 47 4d 41 20 66 75 6c 6c 5f 63 6f 6c 75  PRAGMA full_colu
fea0: 6d 6e 5f 6e 61 6d 65 73 20 73 65 74 74 69 6e 67  mn_names setting
feb0: 73 20 61 72 65 0a 2a 2a 20 64 65 70 72 65 63 61  s are.** depreca
fec0: 74 65 64 2e 20 20 54 68 65 20 64 65 66 61 75 6c  ted.  The defaul
fed0: 74 20 73 65 74 74 69 6e 67 20 69 73 20 73 68 6f  t setting is sho
fee0: 72 74 3d 4f 4e 2c 20 66 75 6c 6c 3d 4f 46 46 2e  rt=ON, full=OFF.
fef0: 20 20 39 39 2e 39 25 20 6f 66 20 61 6c 6c 0a 2a    99.9% of all.*
ff00: 2a 20 61 70 70 6c 69 63 61 74 69 6f 6e 73 20 73  * applications s
ff10: 68 6f 75 6c 64 20 6f 70 65 72 61 74 65 20 74 68  hould operate th
ff20: 69 73 20 77 61 79 2e 20 20 4e 65 76 65 72 74 68  is way.  Neverth
ff30: 65 6c 65 73 73 2c 20 77 65 20 6e 65 65 64 20 74  eless, we need t
ff40: 6f 20 73 75 70 70 6f 72 74 20 74 68 65 0a 2a 2a  o support the.**
ff50: 20 6f 74 68 65 72 20 6d 6f 64 65 73 20 66 6f 72   other modes for
ff60: 20 6c 65 67 61 63 79 3a 0a 2a 2a 0a 2a 2a 20 20   legacy:.**.**  
ff70: 20 20 73 68 6f 72 74 3d 4f 46 46 2c 20 66 75 6c    short=OFF, ful
ff80: 6c 3d 4f 46 46 3a 20 20 20 20 20 20 43 6f 6c 75  l=OFF:      Colu
ff90: 6d 6e 20 6e 61 6d 65 20 69 73 20 74 68 65 20 74  mn name is the t
ffa0: 65 78 74 20 6f 66 20 74 68 65 20 65 78 70 72 65  ext of the expre
ffb0: 73 73 69 6f 6e 20 68 61 73 20 69 74 0a 2a 2a 20  ssion has it.** 
ffc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ffd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 72 69               ori
ffe0: 67 69 6e 61 6c 6c 79 20 61 70 70 65 61 72 73 20  ginally appears 
fff0: 69 6e 20 74 68 65 20 53 45 4c 45 43 54 20 73 74  in the SELECT st
10000 61 74 65 6d 65 6e 74 2e 20 20 49 6e 0a 2a 2a 20  atement.  In.** 
10010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10020 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 74 68               oth
10030 65 72 20 77 6f 72 64 73 2c 20 74 68 65 20 7a 53  er words, the zS
10040 70 61 6e 20 6f 66 20 74 68 65 20 72 65 73 75 6c  pan of the resul
10050 74 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a  t expression..**
10060 0a 2a 2a 20 20 20 20 73 68 6f 72 74 3d 4f 4e 2c  .**    short=ON,
10070 20 66 75 6c 6c 3d 4f 46 46 3a 20 20 20 20 20 20   full=OFF:      
10080 20 28 54 68 69 73 20 69 73 20 74 68 65 20 64 65   (This is the de
10090 66 61 75 6c 74 20 73 65 74 74 69 6e 67 29 2e 20  fault setting). 
100a0 20 49 66 20 74 68 65 20 72 65 73 75 6c 74 0a 2a   If the result.*
100b0 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
100c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
100d0 65 66 65 72 73 20 64 69 72 65 63 74 6c 79 20 74  efers directly t
100e0 6f 20 61 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e  o a table column
100f0 2c 20 74 68 65 6e 20 74 68 65 0a 2a 2a 20 20 20  , then the.**   
10100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10110 20 20 20 20 20 20 20 20 20 20 20 72 65 73 75 6c             resul
10120 74 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 69 73  t column name is
10130 20 6a 75 73 74 20 74 68 65 20 74 61 62 6c 65 20   just the table 
10140 63 6f 6c 75 6d 6e 0a 2a 2a 20 20 20 20 20 20 20  column.**       
10150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10160 20 20 20 20 20 20 20 6e 61 6d 65 3a 20 43 4f 4c         name: COL
10170 55 4d 4e 2e 20 20 4f 74 68 65 72 77 69 73 65 20  UMN.  Otherwise 
10180 75 73 65 20 7a 53 70 61 6e 2e 0a 2a 2a 0a 2a 2a  use zSpan..**.**
10190 20 20 20 20 66 75 6c 6c 3d 4f 4e 2c 20 73 68 6f      full=ON, sho
101a0 72 74 3d 41 4e 59 3a 20 20 20 20 20 20 20 49 66  rt=ANY:       If
101b0 20 74 68 65 20 72 65 73 75 6c 74 20 72 65 66 65   the result refe
101c0 72 73 20 64 69 72 65 63 74 6c 79 20 74 6f 20 61  rs directly to a
101d0 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 2c 0a 2a   table column,.*
101e0 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
101f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74                 t
10200 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74 20 63  hen the result c
10210 6f 6c 75 6d 6e 20 6e 61 6d 65 20 77 69 74 68 20  olumn name with 
10220 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 0a 2a  the table name.*
10230 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
10240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
10250 72 65 66 69 78 2c 20 65 78 3a 20 54 41 42 4c 45  refix, ex: TABLE
10260 2e 43 4f 4c 55 4d 4e 2e 20 20 4f 74 68 65 72 77  .COLUMN.  Otherw
10270 69 73 65 20 75 73 65 20 7a 53 70 61 6e 2e 0a 2a  ise use zSpan..*
10280 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 67 65  /.static void ge
10290 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65  nerateColumnName
102a0 73 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  s(.  Parse *pPar
102b0 73 65 2c 20 20 20 20 20 20 2f 2a 20 50 61 72 73  se,      /* Pars
102c0 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  er context */.  
102d0 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 20  Select *pSelect 
102e0 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20      /* Generate 
102f0 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 66 6f 72  column names for
10300 20 74 68 69 73 20 53 45 4c 45 43 54 20 73 74 61   this SELECT sta
10310 74 65 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 56  tement */.){.  V
10320 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
10330 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b  >pVdbe;.  int i;
10340 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a  .  Table *pTab;.
10350 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c    SrcList *pTabL
10360 69 73 74 3b 0a 20 20 45 78 70 72 4c 69 73 74 20  ist;.  ExprList 
10370 2a 70 45 4c 69 73 74 3b 0a 20 20 73 71 6c 69 74  *pEList;.  sqlit
10380 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
10390 3e 64 62 3b 0a 20 20 69 6e 74 20 66 75 6c 6c 4e  >db;.  int fullN
103a0 61 6d 65 3b 20 20 20 20 2f 2a 20 54 41 42 4c 45  ame;    /* TABLE
103b0 2e 43 4f 4c 55 4d 4e 20 69 66 20 6e 6f 20 41 53  .COLUMN if no AS
103c0 20 63 6c 61 75 73 65 20 61 6e 64 20 69 73 20 61   clause and is a
103d0 20 64 69 72 65 63 74 20 74 61 62 6c 65 20 72 65   direct table re
103e0 66 20 2a 2f 0a 20 20 69 6e 74 20 73 72 63 4e 61  f */.  int srcNa
103f0 6d 65 3b 20 20 20 20 20 2f 2a 20 43 4f 4c 55 4d  me;     /* COLUM
10400 4e 20 6f 72 20 54 41 42 4c 45 2e 43 4f 4c 55 4d  N or TABLE.COLUM
10410 4e 20 69 66 20 6e 6f 20 41 53 20 63 6c 61 75 73  N if no AS claus
10420 65 20 61 6e 64 20 69 73 20 64 69 72 65 63 74 20  e and is direct 
10430 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  */..#ifndef SQLI
10440 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a  TE_OMIT_EXPLAIN.
10450 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20    /* If this is 
10460 61 6e 20 45 58 50 4c 41 49 4e 2c 20 73 6b 69 70  an EXPLAIN, skip
10470 20 74 68 69 73 20 73 74 65 70 20 2a 2f 0a 20 20   this step */.  
10480 69 66 28 20 70 50 61 72 73 65 2d 3e 65 78 70 6c  if( pParse->expl
10490 61 69 6e 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ain ){.    retur
104a0 6e 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  n;.  }.#endif.. 
104b0 20 69 66 28 20 70 50 61 72 73 65 2d 3e 63 6f 6c   if( pParse->col
104c0 4e 61 6d 65 73 53 65 74 20 29 20 72 65 74 75 72  NamesSet ) retur
104d0 6e 3b 0a 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 6e  n;.  /* Column n
104e0 61 6d 65 73 20 61 72 65 20 64 65 74 65 72 6d 69  ames are determi
104f0 6e 65 64 20 62 79 20 74 68 65 20 6c 65 66 74 2d  ned by the left-
10500 6d 6f 73 74 20 74 65 72 6d 20 6f 66 20 61 20 63  most term of a c
10510 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 20 2a  ompound select *
10520 2f 0a 20 20 77 68 69 6c 65 28 20 70 53 65 6c 65  /.  while( pSele
10530 63 74 2d 3e 70 50 72 69 6f 72 20 29 20 70 53 65  ct->pPrior ) pSe
10540 6c 65 63 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e  lect = pSelect->
10550 70 50 72 69 6f 72 3b 0a 20 20 53 45 4c 45 43 54  pPrior;.  SELECT
10560 54 52 41 43 45 28 31 2c 70 50 61 72 73 65 2c 70  TRACE(1,pParse,p
10570 53 65 6c 65 63 74 2c 28 22 67 65 6e 65 72 61 74  Select,("generat
10580 69 6e 67 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73  ing column names
10590 5c 6e 22 29 29 3b 0a 20 20 70 54 61 62 4c 69 73  \n"));.  pTabLis
105a0 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70 53 72  t = pSelect->pSr
105b0 63 3b 0a 20 20 70 45 4c 69 73 74 20 3d 20 70 53  c;.  pEList = pS
105c0 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 3b 0a 20  elect->pEList;. 
105d0 20 61 73 73 65 72 74 28 20 76 21 3d 30 20 29 3b   assert( v!=0 );
105e0 0a 20 20 61 73 73 65 72 74 28 20 70 54 61 62 4c  .  assert( pTabL
105f0 69 73 74 21 3d 30 20 29 3b 0a 20 20 70 50 61 72  ist!=0 );.  pPar
10600 73 65 2d 3e 63 6f 6c 4e 61 6d 65 73 53 65 74 20  se->colNamesSet 
10610 3d 20 31 3b 0a 20 20 66 75 6c 6c 4e 61 6d 65 20  = 1;.  fullName 
10620 3d 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20 53  = (db->flags & S
10630 51 4c 49 54 45 5f 46 75 6c 6c 43 6f 6c 4e 61 6d  QLITE_FullColNam
10640 65 73 29 21 3d 30 3b 0a 20 20 73 72 63 4e 61 6d  es)!=0;.  srcNam
10650 65 20 3d 20 28 64 62 2d 3e 66 6c 61 67 73 20 26  e = (db->flags &
10660 20 53 51 4c 49 54 45 5f 53 68 6f 72 74 43 6f 6c   SQLITE_ShortCol
10670 4e 61 6d 65 73 29 21 3d 30 20 7c 7c 20 66 75 6c  Names)!=0 || ful
10680 6c 4e 61 6d 65 3b 0a 20 20 73 71 6c 69 74 65 33  lName;.  sqlite3
10690 56 64 62 65 53 65 74 4e 75 6d 43 6f 6c 73 28 76  VdbeSetNumCols(v
106a0 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29  , pEList->nExpr)
106b0 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
106c0 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b  EList->nExpr; i+
106d0 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 20  +){.    Expr *p 
106e0 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70  = pEList->a[i].p
106f0 45 78 70 72 3b 0a 0a 20 20 20 20 61 73 73 65 72  Expr;..    asser
10700 74 28 20 70 21 3d 30 20 29 3b 0a 20 20 20 20 61  t( p!=0 );.    a
10710 73 73 65 72 74 28 20 70 2d 3e 6f 70 21 3d 54 4b  ssert( p->op!=TK
10720 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 29 3b 20 20  _AGG_COLUMN );  
10730 2f 2a 20 41 67 67 20 70 72 6f 63 65 73 73 69 6e  /* Agg processin
10740 67 20 68 61 73 20 6e 6f 74 20 72 75 6e 20 79 65  g has not run ye
10750 74 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28  t */.    assert(
10760 20 70 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d   p->op!=TK_COLUM
10770 4e 20 7c 7c 20 70 2d 3e 79 2e 70 54 61 62 21 3d  N || p->y.pTab!=
10780 30 20 29 3b 20 2f 2a 20 43 6f 76 65 72 69 6e 67  0 ); /* Covering
10790 20 69 64 78 20 6e 6f 74 20 79 65 74 20 63 6f 64   idx not yet cod
107a0 65 64 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 45  ed */.    if( pE
107b0 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65  List->a[i].zName
107c0 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 6e 20   ){.      /* An 
107d0 41 53 20 63 6c 61 75 73 65 20 61 6c 77 61 79 73  AS clause always
107e0 20 74 61 6b 65 73 20 66 69 72 73 74 20 70 72 69   takes first pri
107f0 6f 72 69 74 79 20 2a 2f 0a 20 20 20 20 20 20 63  ority */.      c
10800 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 70 45 4c  har *zName = pEL
10810 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 3b  ist->a[i].zName;
10820 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
10830 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20  beSetColName(v, 
10840 69 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c  i, COLNAME_NAME,
10850 20 7a 4e 61 6d 65 2c 20 53 51 4c 49 54 45 5f 54   zName, SQLITE_T
10860 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20 7d  RANSIENT);.    }
10870 65 6c 73 65 20 69 66 28 20 73 72 63 4e 61 6d 65  else if( srcName
10880 20 26 26 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f   && p->op==TK_CO
10890 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 20 20 63 68  LUMN ){.      ch
108a0 61 72 20 2a 7a 43 6f 6c 3b 0a 20 20 20 20 20 20  ar *zCol;.      
108b0 69 6e 74 20 69 43 6f 6c 20 3d 20 70 2d 3e 69 43  int iCol = p->iC
108c0 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 70 54 61  olumn;.      pTa
108d0 62 20 3d 20 70 2d 3e 79 2e 70 54 61 62 3b 0a 20  b = p->y.pTab;. 
108e0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54 61       assert( pTa
108f0 62 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66  b!=0 );.      if
10900 28 20 69 43 6f 6c 3c 30 20 29 20 69 43 6f 6c 20  ( iCol<0 ) iCol 
10910 3d 20 70 54 61 62 2d 3e 69 50 4b 65 79 3b 0a 20  = pTab->iPKey;. 
10920 20 20 20 20 20 61 73 73 65 72 74 28 20 69 43 6f       assert( iCo
10930 6c 3d 3d 2d 31 20 7c 7c 20 28 69 43 6f 6c 3e 3d  l==-1 || (iCol>=
10940 30 20 26 26 20 69 43 6f 6c 3c 70 54 61 62 2d 3e  0 && iCol<pTab->
10950 6e 43 6f 6c 29 20 29 3b 0a 20 20 20 20 20 20 69  nCol) );.      i
10960 66 28 20 69 43 6f 6c 3c 30 20 29 7b 0a 20 20 20  f( iCol<0 ){.   
10970 20 20 20 20 20 7a 43 6f 6c 20 3d 20 22 72 6f 77       zCol = "row
10980 69 64 22 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  id";.      }else
10990 7b 0a 20 20 20 20 20 20 20 20 7a 43 6f 6c 20 3d  {.        zCol =
109a0 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c   pTab->aCol[iCol
109b0 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 7d  ].zName;.      }
109c0 0a 20 20 20 20 20 20 69 66 28 20 66 75 6c 6c 4e  .      if( fullN
109d0 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 20 20 63  ame ){.        c
109e0 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 30 3b 0a  har *zName = 0;.
109f0 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20          zName = 
10a00 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64  sqlite3MPrintf(d
10a10 62 2c 20 22 25 73 2e 25 73 22 2c 20 70 54 61 62  b, "%s.%s", pTab
10a20 2d 3e 7a 4e 61 6d 65 2c 20 7a 43 6f 6c 29 3b 0a  ->zName, zCol);.
10a30 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
10a40 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c  dbeSetColName(v,
10a50 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45   i, COLNAME_NAME
10a60 2c 20 7a 4e 61 6d 65 2c 20 53 51 4c 49 54 45 5f  , zName, SQLITE_
10a70 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 20 20  DYNAMIC);.      
10a80 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
10a90 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c  qlite3VdbeSetCol
10aa0 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41  Name(v, i, COLNA
10ab0 4d 45 5f 4e 41 4d 45 2c 20 7a 43 6f 6c 2c 20 53  ME_NAME, zCol, S
10ac0 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29  QLITE_TRANSIENT)
10ad0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
10ae0 6c 73 65 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74  lse{.      const
10af0 20 63 68 61 72 20 2a 7a 20 3d 20 70 45 4c 69 73   char *z = pELis
10b00 74 2d 3e 61 5b 69 5d 2e 7a 53 70 61 6e 3b 0a 20  t->a[i].zSpan;. 
10b10 20 20 20 20 20 7a 20 3d 20 7a 3d 3d 30 20 3f 20       z = z==0 ? 
10b20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64  sqlite3MPrintf(d
10b30 62 2c 20 22 63 6f 6c 75 6d 6e 25 64 22 2c 20 69  b, "column%d", i
10b40 2b 31 29 20 3a 20 73 71 6c 69 74 65 33 44 62 53  +1) : sqlite3DbS
10b50 74 72 44 75 70 28 64 62 2c 20 7a 29 3b 0a 20 20  trDup(db, z);.  
10b60 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53      sqlite3VdbeS
10b70 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20  etColName(v, i, 
10b80 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20 7a 2c  COLNAME_NAME, z,
10b90 20 53 51 4c 49 54 45 5f 44 59 4e 41 4d 49 43 29   SQLITE_DYNAMIC)
10ba0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 67 65  ;.    }.  }.  ge
10bb0 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 54 79 70 65  nerateColumnType
10bc0 73 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69  s(pParse, pTabLi
10bd0 73 74 2c 20 70 45 4c 69 73 74 29 3b 0a 7d 0a 0a  st, pEList);.}..
10be0 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 6e 20 65  /*.** Given an e
10bf0 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 20 28  xpression list (
10c00 77 68 69 63 68 20 69 73 20 72 65 61 6c 6c 79 20  which is really 
10c10 74 68 65 20 6c 69 73 74 20 6f 66 20 65 78 70 72  the list of expr
10c20 65 73 73 69 6f 6e 73 0a 2a 2a 20 74 68 61 74 20  essions.** that 
10c30 66 6f 72 6d 20 74 68 65 20 72 65 73 75 6c 74 20  form the result 
10c40 73 65 74 20 6f 66 20 61 20 53 45 4c 45 43 54 20  set of a SELECT 
10c50 73 74 61 74 65 6d 65 6e 74 29 20 63 6f 6d 70 75  statement) compu
10c60 74 65 20 61 70 70 72 6f 70 72 69 61 74 65 0a 2a  te appropriate.*
10c70 2a 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 66  * column names f
10c80 6f 72 20 61 20 74 61 62 6c 65 20 74 68 61 74 20  or a table that 
10c90 77 6f 75 6c 64 20 68 6f 6c 64 20 74 68 65 20 65  would hold the e
10ca0 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e 0a  xpression list..
10cb0 2a 2a 0a 2a 2a 20 41 6c 6c 20 63 6f 6c 75 6d 6e  **.** All column
10cc0 20 6e 61 6d 65 73 20 77 69 6c 6c 20 62 65 20 75   names will be u
10cd0 6e 69 71 75 65 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c  nique..**.** Onl
10ce0 79 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d  y the column nam
10cf0 65 73 20 61 72 65 20 63 6f 6d 70 75 74 65 64 2e  es are computed.
10d00 20 20 43 6f 6c 75 6d 6e 2e 7a 54 79 70 65 2c 20    Column.zType, 
10d10 43 6f 6c 75 6d 6e 2e 7a 43 6f 6c 6c 2c 0a 2a 2a  Column.zColl,.**
10d20 20 61 6e 64 20 6f 74 68 65 72 20 66 69 65 6c 64   and other field
10d30 73 20 6f 66 20 43 6f 6c 75 6d 6e 20 61 72 65 20  s of Column are 
10d40 7a 65 72 6f 65 64 2e 0a 2a 2a 0a 2a 2a 20 52 65  zeroed..**.** Re
10d50 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f  turn SQLITE_OK o
10d60 6e 20 73 75 63 63 65 73 73 2e 20 20 49 66 20 61  n success.  If a
10d70 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69   memory allocati
10d80 6f 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  on error occurs,
10d90 0a 2a 2a 20 73 74 6f 72 65 20 4e 55 4c 4c 20 69  .** store NULL i
10da0 6e 20 2a 70 61 43 6f 6c 20 61 6e 64 20 30 20 69  n *paCol and 0 i
10db0 6e 20 2a 70 6e 43 6f 6c 20 61 6e 64 20 72 65 74  n *pnCol and ret
10dc0 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
10dd0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 6e 6c 79  ..**.** The only
10de0 20 67 75 61 72 61 6e 74 65 65 20 74 68 61 74 20   guarantee that 
10df0 53 51 4c 69 74 65 20 6d 61 6b 65 73 20 61 62 6f  SQLite makes abo
10e00 75 74 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20  ut column names 
10e10 69 73 20 74 68 61 74 20 69 66 20 74 68 65 0a 2a  is that if the.*
10e20 2a 20 63 6f 6c 75 6d 6e 20 68 61 73 20 61 6e 20  * column has an 
10e30 41 53 20 63 6c 61 75 73 65 20 61 73 73 69 67 6e  AS clause assign
10e40 69 6e 67 20 69 74 20 61 20 6e 61 6d 65 2c 20 74  ing it a name, t
10e50 68 61 74 20 77 69 6c 6c 20 62 65 20 74 68 65 20  hat will be the 
10e60 6e 61 6d 65 20 75 73 65 64 2e 0a 2a 2a 20 54 68  name used..** Th
10e70 61 74 20 69 73 20 74 68 65 20 6f 6e 6c 79 20 64  at is the only d
10e80 6f 63 75 6d 65 6e 74 65 64 20 67 75 61 72 61 6e  ocumented guaran
10e90 74 65 65 2e 20 20 48 6f 77 65 76 65 72 2c 20 63  tee.  However, c
10ea0 6f 75 6e 74 6c 65 73 73 20 61 70 70 6c 69 63 61  ountless applica
10eb0 74 69 6f 6e 73 0a 2a 2a 20 64 65 76 65 6c 6f 70  tions.** develop
10ec0 65 64 20 6f 76 65 72 20 74 68 65 20 79 65 61 72  ed over the year
10ed0 73 20 68 61 76 65 20 6d 61 64 65 20 62 61 73 65  s have made base
10ee0 6c 65 73 73 20 61 73 73 75 6d 70 74 69 6f 6e 73  less assumptions
10ef0 20 61 62 6f 75 74 20 63 6f 6c 75 6d 6e 20 6e 61   about column na
10f00 6d 65 73 0a 2a 2a 20 61 6e 64 20 77 69 6c 6c 20  mes.** and will 
10f10 62 72 65 61 6b 20 69 66 20 74 68 6f 73 65 20 61  break if those a
10f20 73 73 75 6d 70 74 69 6f 6e 73 20 63 68 61 6e 67  ssumptions chang
10f30 65 73 2e 20 20 48 65 6e 63 65 2c 20 75 73 65 20  es.  Hence, use 
10f40 65 78 74 72 65 6d 65 20 63 61 75 74 69 6f 6e 0a  extreme caution.
10f50 2a 2a 20 77 68 65 6e 20 6d 6f 64 69 66 79 69 6e  ** when modifyin
10f60 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 74  g this routine t
10f70 6f 20 61 76 6f 69 64 20 62 72 65 61 6b 69 6e 67  o avoid breaking
10f80 20 6c 65 67 61 63 79 2e 0a 2a 2a 0a 2a 2a 20 53   legacy..**.** S
10f90 65 65 20 41 6c 73 6f 3a 20 67 65 6e 65 72 61 74  ee Also: generat
10fa0 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 29 0a 2a  eColumnNames().*
10fb0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 43 6f 6c  /.int sqlite3Col
10fc0 75 6d 6e 73 46 72 6f 6d 45 78 70 72 4c 69 73 74  umnsFromExprList
10fd0 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
10fe0 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50  e,          /* P
10ff0 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
11000 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45  /.  ExprList *pE
11010 4c 69 73 74 2c 20 20 20 20 20 20 20 2f 2a 20 45  List,       /* E
11020 78 70 72 20 6c 69 73 74 20 66 72 6f 6d 20 77 68  xpr list from wh
11030 69 63 68 20 74 6f 20 64 65 72 69 76 65 20 63 6f  ich to derive co
11040 6c 75 6d 6e 20 6e 61 6d 65 73 20 2a 2f 0a 20 20  lumn names */.  
11050 69 31 36 20 2a 70 6e 43 6f 6c 2c 20 20 20 20 20  i16 *pnCol,     
11060 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65          /* Write
11070 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63   the number of c
11080 6f 6c 75 6d 6e 73 20 68 65 72 65 20 2a 2f 0a 20  olumns here */. 
11090 20 43 6f 6c 75 6d 6e 20 2a 2a 70 61 43 6f 6c 20   Column **paCol 
110a0 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74           /* Writ
110b0 65 20 74 68 65 20 6e 65 77 20 63 6f 6c 75 6d 6e  e the new column
110c0 20 6c 69 73 74 20 68 65 72 65 20 2a 2f 0a 29 7b   list here */.){
110d0 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
110e0 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 20 2f   pParse->db;   /
110f0 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  * Database conne
11100 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 69  ction */.  int i
11110 2c 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20  , j;            
11120 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
11130 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 75 33 32  ounters */.  u32
11140 20 63 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20   cnt;           
11150 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
11160 78 20 61 64 64 65 64 20 74 6f 20 6d 61 6b 65 20  x added to make 
11170 74 68 65 20 6e 61 6d 65 20 75 6e 69 71 75 65 20  the name unique 
11180 2a 2f 0a 20 20 43 6f 6c 75 6d 6e 20 2a 61 43 6f  */.  Column *aCo
11190 6c 2c 20 2a 70 43 6f 6c 3b 20 20 20 20 20 20 20  l, *pCol;       
111a0 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20   /* For looping 
111b0 6f 76 65 72 20 72 65 73 75 6c 74 20 63 6f 6c 75  over result colu
111c0 6d 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f  mns */.  int nCo
111d0 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
111e0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
111f0 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65  f columns in the
11200 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 20   result set */. 
11210 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 20 20 20   char *zName;   
11220 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
11230 43 6f 6c 75 6d 6e 20 6e 61 6d 65 20 2a 2f 0a 20  Column name */. 
11240 20 69 6e 74 20 6e 4e 61 6d 65 3b 20 20 20 20 20   int nName;     
11250 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
11260 53 69 7a 65 20 6f 66 20 6e 61 6d 65 20 69 6e 20  Size of name in 
11270 7a 4e 61 6d 65 5b 5d 20 2a 2f 0a 20 20 48 61 73  zName[] */.  Has
11280 68 20 68 74 3b 20 20 20 20 20 20 20 20 20 20 20  h ht;           
11290 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61 73 68           /* Hash
112a0 20 74 61 62 6c 65 20 6f 66 20 63 6f 6c 75 6d 6e   table of column
112b0 20 6e 61 6d 65 73 20 2a 2f 0a 0a 20 20 73 71 6c   names */..  sql
112c0 69 74 65 33 48 61 73 68 49 6e 69 74 28 26 68 74  ite3HashInit(&ht
112d0 29 3b 0a 20 20 69 66 28 20 70 45 4c 69 73 74 20  );.  if( pEList 
112e0 29 7b 0a 20 20 20 20 6e 43 6f 6c 20 3d 20 70 45  ){.    nCol = pE
112f0 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 20  List->nExpr;.   
11300 20 61 43 6f 6c 20 3d 20 73 71 6c 69 74 65 33 44   aCol = sqlite3D
11310 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20  bMallocZero(db, 
11320 73 69 7a 65 6f 66 28 61 43 6f 6c 5b 30 5d 29 2a  sizeof(aCol[0])*
11330 6e 43 6f 6c 29 3b 0a 20 20 20 20 74 65 73 74 63  nCol);.    testc
11340 61 73 65 28 20 61 43 6f 6c 3d 3d 30 20 29 3b 0a  ase( aCol==0 );.
11350 20 20 20 20 69 66 28 20 6e 43 6f 6c 3e 33 32 37      if( nCol>327
11360 36 37 20 29 20 6e 43 6f 6c 20 3d 20 33 32 37 36  67 ) nCol = 3276
11370 37 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  7;.  }else{.    
11380 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 61 43  nCol = 0;.    aC
11390 6f 6c 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 61 73  ol = 0;.  }.  as
113a0 73 65 72 74 28 20 6e 43 6f 6c 3d 3d 28 69 31 36  sert( nCol==(i16
113b0 29 6e 43 6f 6c 20 29 3b 0a 20 20 2a 70 6e 43 6f  )nCol );.  *pnCo
113c0 6c 20 3d 20 6e 43 6f 6c 3b 0a 20 20 2a 70 61 43  l = nCol;.  *paC
113d0 6f 6c 20 3d 20 61 43 6f 6c 3b 0a 0a 20 20 66 6f  ol = aCol;..  fo
113e0 72 28 69 3d 30 2c 20 70 43 6f 6c 3d 61 43 6f 6c  r(i=0, pCol=aCol
113f0 3b 20 69 3c 6e 43 6f 6c 20 26 26 20 21 64 62 2d  ; i<nCol && !db-
11400 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 3b 20 69  >mallocFailed; i
11410 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20  ++, pCol++){.   
11420 20 2f 2a 20 47 65 74 20 61 6e 20 61 70 70 72 6f   /* Get an appro
11430 70 72 69 61 74 65 20 6e 61 6d 65 20 66 6f 72 20  priate name for 
11440 74 68 65 20 63 6f 6c 75 6d 6e 0a 20 20 20 20 2a  the column.    *
11450 2f 0a 20 20 20 20 69 66 28 20 28 7a 4e 61 6d 65  /.    if( (zName
11460 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e   = pEList->a[i].
11470 7a 4e 61 6d 65 29 21 3d 30 20 29 7b 0a 20 20 20  zName)!=0 ){.   
11480 20 20 20 2f 2a 20 49 66 20 74 68 65 20 63 6f 6c     /* If the col
11490 75 6d 6e 20 63 6f 6e 74 61 69 6e 73 20 61 6e 20  umn contains an 
114a0 22 41 53 20 3c 6e 61 6d 65 3e 22 20 70 68 72 61  "AS <name>" phra
114b0 73 65 2c 20 75 73 65 20 3c 6e 61 6d 65 3e 20 61  se, use <name> a
114c0 73 20 74 68 65 20 6e 61 6d 65 20 2a 2f 0a 20 20  s the name */.  
114d0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 45    }else{.      E
114e0 78 70 72 20 2a 70 43 6f 6c 45 78 70 72 20 3d 20  xpr *pColExpr = 
114f0 73 71 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43  sqlite3ExprSkipC
11500 6f 6c 6c 61 74 65 28 70 45 4c 69 73 74 2d 3e 61  ollate(pEList->a
11510 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20  [i].pExpr);.    
11520 20 20 77 68 69 6c 65 28 20 70 43 6f 6c 45 78 70    while( pColExp
11530 72 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f 54 20 29 7b  r->op==TK_DOT ){
11540 0a 20 20 20 20 20 20 20 20 70 43 6f 6c 45 78 70  .        pColExp
11550 72 20 3d 20 70 43 6f 6c 45 78 70 72 2d 3e 70 52  r = pColExpr->pR
11560 69 67 68 74 3b 0a 20 20 20 20 20 20 20 20 61 73  ight;.        as
11570 73 65 72 74 28 20 70 43 6f 6c 45 78 70 72 21 3d  sert( pColExpr!=
11580 30 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  0 );.      }.   
11590 20 20 20 69 66 28 20 70 43 6f 6c 45 78 70 72 2d     if( pColExpr-
115a0 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29  >op==TK_COLUMN )
115b0 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72  {.        /* For
115c0 20 63 6f 6c 75 6d 6e 73 20 75 73 65 20 74 68 65   columns use the
115d0 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 6e 61 6d   column name nam
115e0 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74  e */.        int
115f0 20 69 43 6f 6c 20 3d 20 70 43 6f 6c 45 78 70 72   iCol = pColExpr
11600 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20  ->iColumn;.     
11610 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d     Table *pTab =
11620 20 70 43 6f 6c 45 78 70 72 2d 3e 79 2e 70 54 61   pColExpr->y.pTa
11630 62 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  b;.        asser
11640 74 28 20 70 54 61 62 21 3d 30 20 29 3b 0a 20 20  t( pTab!=0 );.  
11650 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30        if( iCol<0
11660 20 29 20 69 43 6f 6c 20 3d 20 70 54 61 62 2d 3e   ) iCol = pTab->
11670 69 50 4b 65 79 3b 0a 20 20 20 20 20 20 20 20 7a  iPKey;.        z
11680 4e 61 6d 65 20 3d 20 69 43 6f 6c 3e 3d 30 20 3f  Name = iCol>=0 ?
11690 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c   pTab->aCol[iCol
116a0 5d 2e 7a 4e 61 6d 65 20 3a 20 22 72 6f 77 69 64  ].zName : "rowid
116b0 22 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  ";.      }else i
116c0 66 28 20 70 43 6f 6c 45 78 70 72 2d 3e 6f 70 3d  f( pColExpr->op=
116d0 3d 54 4b 5f 49 44 20 29 7b 0a 20 20 20 20 20 20  =TK_ID ){.      
116e0 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48    assert( !ExprH
116f0 61 73 50 72 6f 70 65 72 74 79 28 70 43 6f 6c 45  asProperty(pColE
11700 78 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65  xpr, EP_IntValue
11710 29 20 29 3b 0a 20 20 20 20 20 20 20 20 7a 4e 61  ) );.        zNa
11720 6d 65 20 3d 20 70 43 6f 6c 45 78 70 72 2d 3e 75  me = pColExpr->u
11730 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 7d  .zToken;.      }
11740 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a  else{.        /*
11750 20 55 73 65 20 74 68 65 20 6f 72 69 67 69 6e 61   Use the origina
11760 6c 20 74 65 78 74 20 6f 66 20 74 68 65 20 63 6f  l text of the co
11770 6c 75 6d 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  lumn expression 
11780 61 73 20 69 74 73 20 6e 61 6d 65 20 2a 2f 0a 20  as its name */. 
11790 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 70         zName = p
117a0 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 53 70 61  EList->a[i].zSpa
117b0 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  n;.      }.    }
117c0 0a 20 20 20 20 69 66 28 20 7a 4e 61 6d 65 20 29  .    if( zName )
117d0 7b 0a 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20  {.      zName = 
117e0 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28  sqlite3DbStrDup(
117f0 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  db, zName);.    
11800 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 7a 4e 61  }else{.      zNa
11810 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69  me = sqlite3MPri
11820 6e 74 66 28 64 62 2c 22 63 6f 6c 75 6d 6e 25 64  ntf(db,"column%d
11830 22 2c 69 2b 31 29 3b 0a 20 20 20 20 7d 0a 0a 20  ",i+1);.    }.. 
11840 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20     /* Make sure 
11850 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20  the column name 
11860 69 73 20 75 6e 69 71 75 65 2e 20 20 49 66 20 74  is unique.  If t
11870 68 65 20 6e 61 6d 65 20 69 73 20 6e 6f 74 20 75  he name is not u
11880 6e 69 71 75 65 2c 0a 20 20 20 20 2a 2a 20 61 70  nique,.    ** ap
11890 70 65 6e 64 20 61 6e 20 69 6e 74 65 67 65 72 20  pend an integer 
118a0 74 6f 20 74 68 65 20 6e 61 6d 65 20 73 6f 20 74  to the name so t
118b0 68 61 74 20 69 74 20 62 65 63 6f 6d 65 73 20 75  hat it becomes u
118c0 6e 69 71 75 65 2e 0a 20 20 20 20 2a 2f 0a 20 20  nique..    */.  
118d0 20 20 63 6e 74 20 3d 20 30 3b 0a 20 20 20 20 77    cnt = 0;.    w
118e0 68 69 6c 65 28 20 7a 4e 61 6d 65 20 26 26 20 73  hile( zName && s
118f0 71 6c 69 74 65 33 48 61 73 68 46 69 6e 64 28 26  qlite3HashFind(&
11900 68 74 2c 20 7a 4e 61 6d 65 29 21 3d 30 20 29 7b  ht, zName)!=0 ){
11910 0a 20 20 20 20 20 20 6e 4e 61 6d 65 20 3d 20 73  .      nName = s
11920 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
11930 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 69 66 28  Name);.      if(
11940 20 6e 4e 61 6d 65 3e 30 20 29 7b 0a 20 20 20 20   nName>0 ){.    
11950 20 20 20 20 66 6f 72 28 6a 3d 6e 4e 61 6d 65 2d      for(j=nName-
11960 31 3b 20 6a 3e 30 20 26 26 20 73 71 6c 69 74 65  1; j>0 && sqlite
11970 33 49 73 64 69 67 69 74 28 7a 4e 61 6d 65 5b 6a  3Isdigit(zName[j
11980 5d 29 3b 20 6a 2d 2d 29 7b 7d 0a 20 20 20 20 20  ]); j--){}.     
11990 20 20 20 69 66 28 20 7a 4e 61 6d 65 5b 6a 5d 3d     if( zName[j]=
119a0 3d 27 3a 27 20 29 20 6e 4e 61 6d 65 20 3d 20 6a  =':' ) nName = j
119b0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
119c0 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d  zName = sqlite3M
119d0 50 72 69 6e 74 66 28 64 62 2c 20 22 25 2e 2a 7a  Printf(db, "%.*z
119e0 3a 25 75 22 2c 20 6e 4e 61 6d 65 2c 20 7a 4e 61  :%u", nName, zNa
119f0 6d 65 2c 20 2b 2b 63 6e 74 29 3b 0a 20 20 20 20  me, ++cnt);.    
11a00 20 20 69 66 28 20 63 6e 74 3e 33 20 29 20 73 71    if( cnt>3 ) sq
11a10 6c 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73  lite3_randomness
11a20 28 73 69 7a 65 6f 66 28 63 6e 74 29 2c 20 26 63  (sizeof(cnt), &c
11a30 6e 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  nt);.    }.    p
11a40 43 6f 6c 2d 3e 7a 4e 61 6d 65 20 3d 20 7a 4e 61  Col->zName = zNa
11a50 6d 65 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 43  me;.    sqlite3C
11a60 6f 6c 75 6d 6e 50 72 6f 70 65 72 74 69 65 73 46  olumnPropertiesF
11a70 72 6f 6d 4e 61 6d 65 28 30 2c 20 70 43 6f 6c 29  romName(0, pCol)
11a80 3b 0a 20 20 20 20 69 66 28 20 7a 4e 61 6d 65 20  ;.    if( zName 
11a90 26 26 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e  && sqlite3HashIn
11aa0 73 65 72 74 28 26 68 74 2c 20 7a 4e 61 6d 65 2c  sert(&ht, zName,
11ab0 20 70 43 6f 6c 29 3d 3d 70 43 6f 6c 20 29 7b 0a   pCol)==pCol ){.
11ac0 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 6f 6d        sqlite3Oom
11ad0 46 61 75 6c 74 28 64 62 29 3b 0a 20 20 20 20 7d  Fault(db);.    }
11ae0 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 48 61  .  }.  sqlite3Ha
11af0 73 68 43 6c 65 61 72 28 26 68 74 29 3b 0a 20 20  shClear(&ht);.  
11b00 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
11b10 69 6c 65 64 20 29 7b 0a 20 20 20 20 66 6f 72 28  iled ){.    for(
11b20 6a 3d 30 3b 20 6a 3c 69 3b 20 6a 2b 2b 29 7b 0a  j=0; j<i; j++){.
11b30 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46        sqlite3DbF
11b40 72 65 65 28 64 62 2c 20 61 43 6f 6c 5b 6a 5d 2e  ree(db, aCol[j].
11b50 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20  zName);.    }.  
11b60 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
11b70 64 62 2c 20 61 43 6f 6c 29 3b 0a 20 20 20 20 2a  db, aCol);.    *
11b80 70 61 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 2a  paCol = 0;.    *
11b90 70 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 72  pnCol = 0;.    r
11ba0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
11bb0 45 4d 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 72  EM_BKPT;.  }.  r
11bc0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
11bd0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 74 79  .}../*.** Add ty
11be0 70 65 20 61 6e 64 20 63 6f 6c 6c 61 74 69 6f 6e  pe and collation
11bf0 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 6f 20   information to 
11c00 61 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 20 62 61  a column list ba
11c10 73 65 64 20 6f 6e 0a 2a 2a 20 61 20 53 45 4c 45  sed on.** a SELE
11c20 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a  CT statement..**
11c30 20 0a 2a 2a 20 54 68 65 20 63 6f 6c 75 6d 6e 20   .** The column 
11c40 6c 69 73 74 20 70 72 65 73 75 6d 61 62 6c 79 20  list presumably 
11c50 63 61 6d 65 20 66 72 6f 6d 20 73 65 6c 65 63 74  came from select
11c60 43 6f 6c 75 6d 6e 4e 61 6d 65 73 46 72 6f 6d 45  ColumnNamesFromE
11c70 78 70 72 4c 69 73 74 28 29 2e 0a 2a 2a 20 54 68  xprList()..** Th
11c80 65 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 20 68 61  e column list ha
11c90 73 20 6f 6e 6c 79 20 6e 61 6d 65 73 2c 20 6e 6f  s only names, no
11ca0 74 20 74 79 70 65 73 20 6f 72 20 63 6f 6c 6c 61  t types or colla
11cb0 74 69 6f 6e 73 2e 20 20 54 68 69 73 0a 2a 2a 20  tions.  This.** 
11cc0 72 6f 75 74 69 6e 65 20 67 6f 65 73 20 74 68 72  routine goes thr
11cd0 6f 75 67 68 20 61 6e 64 20 61 64 64 73 20 74 68  ough and adds th
11ce0 65 20 74 79 70 65 73 20 61 6e 64 20 63 6f 6c 6c  e types and coll
11cf0 61 74 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20 54 68  ations..**.** Th
11d00 69 73 20 72 6f 75 74 69 6e 65 20 72 65 71 75 69  is routine requi
11d10 72 65 73 20 74 68 61 74 20 61 6c 6c 20 69 64 65  res that all ide
11d20 6e 74 69 66 69 65 72 73 20 69 6e 20 74 68 65 20  ntifiers in the 
11d30 53 45 4c 45 43 54 0a 2a 2a 20 73 74 61 74 65 6d  SELECT.** statem
11d40 65 6e 74 20 62 65 20 72 65 73 6f 6c 76 65 64 2e  ent be resolved.
11d50 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
11d60 53 65 6c 65 63 74 41 64 64 43 6f 6c 75 6d 6e 54  SelectAddColumnT
11d70 79 70 65 41 6e 64 43 6f 6c 6c 61 74 69 6f 6e 28  ypeAndCollation(
11d80 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
11d90 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73  ,        /* Pars
11da0 69 6e 67 20 63 6f 6e 74 65 78 74 73 20 2a 2f 0a  ing contexts */.
11db0 20 20 54 61 62 6c 65 20 2a 70 54 61 62 2c 20 20    Table *pTab,  
11dc0 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20 63          /* Add c
11dd0 6f 6c 75 6d 6e 20 74 79 70 65 20 69 6e 66 6f 72  olumn type infor
11de0 6d 61 74 69 6f 6e 20 74 6f 20 74 68 69 73 20 74  mation to this t
11df0 61 62 6c 65 20 2a 2f 0a 20 20 53 65 6c 65 63 74  able */.  Select
11e00 20 2a 70 53 65 6c 65 63 74 2c 20 20 20 20 20 20   *pSelect,      
11e10 2f 2a 20 53 45 4c 45 43 54 20 75 73 65 64 20 74  /* SELECT used t
11e20 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 79 70 65  o determine type
11e30 73 20 61 6e 64 20 63 6f 6c 6c 61 74 69 6f 6e 73  s and collations
11e40 20 2a 2f 0a 20 20 63 68 61 72 20 61 66 66 20 20   */.  char aff  
11e50 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
11e60 65 66 61 75 6c 74 20 61 66 66 69 6e 69 74 79 20  efault affinity 
11e70 66 6f 72 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 29  for columns */.)
11e80 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  {.  sqlite3 *db 
11e90 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
11ea0 4e 61 6d 65 43 6f 6e 74 65 78 74 20 73 4e 43 3b  NameContext sNC;
11eb0 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b  .  Column *pCol;
11ec0 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c  .  CollSeq *pCol
11ed0 6c 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 45 78  l;.  int i;.  Ex
11ee0 70 72 20 2a 70 3b 0a 20 20 73 74 72 75 63 74 20  pr *p;.  struct 
11ef0 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 61  ExprList_item *a
11f00 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 53 65  ;..  assert( pSe
11f10 6c 65 63 74 21 3d 30 20 29 3b 0a 20 20 61 73 73  lect!=0 );.  ass
11f20 65 72 74 28 20 28 70 53 65 6c 65 63 74 2d 3e 73  ert( (pSelect->s
11f30 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 52 65 73  elFlags & SF_Res
11f40 6f 6c 76 65 64 29 21 3d 30 20 29 3b 0a 20 20 61  olved)!=0 );.  a
11f50 73 73 65 72 74 28 20 70 54 61 62 2d 3e 6e 43 6f  ssert( pTab->nCo
11f60 6c 3d 3d 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69  l==pSelect->pELi
11f70 73 74 2d 3e 6e 45 78 70 72 20 7c 7c 20 64 62 2d  st->nExpr || db-
11f80 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b  >mallocFailed );
11f90 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f  .  if( db->mallo
11fa0 63 46 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e  cFailed ) return
11fb0 3b 0a 20 20 6d 65 6d 73 65 74 28 26 73 4e 43 2c  ;.  memset(&sNC,
11fc0 20 30 2c 20 73 69 7a 65 6f 66 28 73 4e 43 29 29   0, sizeof(sNC))
11fd0 3b 0a 20 20 73 4e 43 2e 70 53 72 63 4c 69 73 74  ;.  sNC.pSrcList
11fe0 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70 53 72 63   = pSelect->pSrc
11ff0 3b 0a 20 20 61 20 3d 20 70 53 65 6c 65 63 74 2d  ;.  a = pSelect-
12000 3e 70 45 4c 69 73 74 2d 3e 61 3b 0a 20 20 66 6f  >pEList->a;.  fo
12010 72 28 69 3d 30 2c 20 70 43 6f 6c 3d 70 54 61 62  r(i=0, pCol=pTab
12020 2d 3e 61 43 6f 6c 3b 20 69 3c 70 54 61 62 2d 3e  ->aCol; i<pTab->
12030 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 70 43 6f 6c 2b  nCol; i++, pCol+
12040 2b 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68  +){.    const ch
12050 61 72 20 2a 7a 54 79 70 65 3b 0a 20 20 20 20 69  ar *zType;.    i
12060 6e 74 20 6e 2c 20 6d 3b 0a 20 20 20 20 70 20 3d  nt n, m;.    p =
12070 20 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20   a[i].pExpr;.   
12080 20 7a 54 79 70 65 20 3d 20 63 6f 6c 75 6d 6e 54   zType = columnT
12090 79 70 65 28 26 73 4e 43 2c 20 70 2c 20 30 2c 20  ype(&sNC, p, 0, 
120a0 30 2c 20 30 29 3b 0a 20 20 20 20 2f 2a 20 70 43  0, 0);.    /* pC
120b0 6f 6c 2d 3e 73 7a 45 73 74 20 3d 20 2e 2e 2e 20  ol->szEst = ... 
120c0 2f 2f 20 43 6f 6c 75 6d 6e 20 73 69 7a 65 20 65  // Column size e
120d0 73 74 20 66 6f 72 20 53 45 4c 45 43 54 20 74 61  st for SELECT ta
120e0 62 6c 65 73 20 6e 65 76 65 72 20 75 73 65 64 20  bles never used 
120f0 2a 2f 0a 20 20 20 20 70 43 6f 6c 2d 3e 61 66 66  */.    pCol->aff
12100 69 6e 69 74 79 20 3d 20 73 71 6c 69 74 65 33 45  inity = sqlite3E
12110 78 70 72 41 66 66 69 6e 69 74 79 28 70 29 3b 0a  xprAffinity(p);.
12120 20 20 20 20 69 66 28 20 7a 54 79 70 65 20 29 7b      if( zType ){
12130 0a 20 20 20 20 20 20 6d 20 3d 20 73 71 6c 69 74  .      m = sqlit
12140 65 33 53 74 72 6c 65 6e 33 30 28 7a 54 79 70 65  e3Strlen30(zType
12150 29 3b 0a 20 20 20 20 20 20 6e 20 3d 20 73 71 6c  );.      n = sql
12160 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70 43 6f  ite3Strlen30(pCo
12170 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  l->zName);.     
12180 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 20 3d 20 73   pCol->zName = s
12190 71 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f 63 4f  qlite3DbReallocO
121a0 72 46 72 65 65 28 64 62 2c 20 70 43 6f 6c 2d 3e  rFree(db, pCol->
121b0 7a 4e 61 6d 65 2c 20 6e 2b 6d 2b 32 29 3b 0a 20  zName, n+m+2);. 
121c0 20 20 20 20 20 69 66 28 20 70 43 6f 6c 2d 3e 7a       if( pCol->z
121d0 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Name ){.        
121e0 6d 65 6d 63 70 79 28 26 70 43 6f 6c 2d 3e 7a 4e  memcpy(&pCol->zN
121f0 61 6d 65 5b 6e 2b 31 5d 2c 20 7a 54 79 70 65 2c  ame[n+1], zType,
12200 20 6d 2b 31 29 3b 0a 20 20 20 20 20 20 20 20 70   m+1);.        p
12210 43 6f 6c 2d 3e 63 6f 6c 46 6c 61 67 73 20 7c 3d  Col->colFlags |=
12220 20 43 4f 4c 46 4c 41 47 5f 48 41 53 54 59 50 45   COLFLAG_HASTYPE
12230 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
12240 20 20 20 20 69 66 28 20 70 43 6f 6c 2d 3e 61 66      if( pCol->af
12250 66 69 6e 69 74 79 3c 3d 53 51 4c 49 54 45 5f 41  finity<=SQLITE_A
12260 46 46 5f 4e 4f 4e 45 20 29 20 70 43 6f 6c 2d 3e  FF_NONE ) pCol->
12270 61 66 66 69 6e 69 74 79 20 3d 20 61 66 66 3b 0a  affinity = aff;.
12280 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69      pColl = sqli
12290 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70  te3ExprCollSeq(p
122a0 50 61 72 73 65 2c 20 70 29 3b 0a 20 20 20 20 69  Parse, p);.    i
122b0 66 28 20 70 43 6f 6c 6c 20 26 26 20 70 43 6f 6c  f( pColl && pCol
122c0 2d 3e 7a 43 6f 6c 6c 3d 3d 30 20 29 7b 0a 20 20  ->zColl==0 ){.  
122d0 20 20 20 20 70 43 6f 6c 2d 3e 7a 43 6f 6c 6c 20      pCol->zColl 
122e0 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75  = sqlite3DbStrDu
122f0 70 28 64 62 2c 20 70 43 6f 6c 6c 2d 3e 7a 4e 61  p(db, pColl->zNa
12300 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  me);.    }.  }. 
12310 20 70 54 61 62 2d 3e 73 7a 54 61 62 52 6f 77 20   pTab->szTabRow 
12320 3d 20 31 3b 20 2f 2a 20 41 6e 79 20 6e 6f 6e 2d  = 1; /* Any non-
12330 7a 65 72 6f 20 76 61 6c 75 65 20 77 6f 72 6b 73  zero value works
12340 20 2a 2f 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76   */.}../*.** Giv
12350 65 6e 20 61 20 53 45 4c 45 43 54 20 73 74 61 74  en a SELECT stat
12360 65 6d 65 6e 74 2c 20 67 65 6e 65 72 61 74 65 20  ement, generate 
12370 61 20 54 61 62 6c 65 20 73 74 72 75 63 74 75 72  a Table structur
12380 65 20 74 68 61 74 20 64 65 73 63 72 69 62 65 73  e that describes
12390 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 20 73  .** the result s
123a0 65 74 20 6f 66 20 74 68 61 74 20 53 45 4c 45 43  et of that SELEC
123b0 54 2e 0a 2a 2f 0a 54 61 62 6c 65 20 2a 73 71 6c  T..*/.Table *sql
123c0 69 74 65 33 52 65 73 75 6c 74 53 65 74 4f 66 53  ite3ResultSetOfS
123d0 65 6c 65 63 74 28 50 61 72 73 65 20 2a 70 50 61  elect(Parse *pPa
123e0 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 53 65  rse, Select *pSe
123f0 6c 65 63 74 2c 20 63 68 61 72 20 61 66 66 29 7b  lect, char aff){
12400 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a  .  Table *pTab;.
12410 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
12420 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 75 36  pParse->db;.  u6
12430 34 20 73 61 76 65 64 46 6c 61 67 73 3b 0a 0a 20  4 savedFlags;.. 
12440 20 73 61 76 65 64 46 6c 61 67 73 20 3d 20 64 62   savedFlags = db
12450 2d 3e 66 6c 61 67 73 3b 0a 20 20 64 62 2d 3e 66  ->flags;.  db->f
12460 6c 61 67 73 20 26 3d 20 7e 28 75 36 34 29 53 51  lags &= ~(u64)SQ
12470 4c 49 54 45 5f 46 75 6c 6c 43 6f 6c 4e 61 6d 65  LITE_FullColName
12480 73 3b 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c  s;.  db->flags |
12490 3d 20 53 51 4c 49 54 45 5f 53 68 6f 72 74 43 6f  = SQLITE_ShortCo
124a0 6c 4e 61 6d 65 73 3b 0a 20 20 73 71 6c 69 74 65  lNames;.  sqlite
124b0 33 53 65 6c 65 63 74 50 72 65 70 28 70 50 61 72  3SelectPrep(pPar
124c0 73 65 2c 20 70 53 65 6c 65 63 74 2c 20 30 29 3b  se, pSelect, 0);
124d0 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20 3d 20 73  .  db->flags = s
124e0 61 76 65 64 46 6c 61 67 73 3b 0a 20 20 69 66 28  avedFlags;.  if(
124f0 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 29 20   pParse->nErr ) 
12500 72 65 74 75 72 6e 20 30 3b 0a 20 20 77 68 69 6c  return 0;.  whil
12510 65 28 20 70 53 65 6c 65 63 74 2d 3e 70 50 72 69  e( pSelect->pPri
12520 6f 72 20 29 20 70 53 65 6c 65 63 74 20 3d 20 70  or ) pSelect = p
12530 53 65 6c 65 63 74 2d 3e 70 50 72 69 6f 72 3b 0a  Select->pPrior;.
12540 20 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33    pTab = sqlite3
12550 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c  DbMallocZero(db,
12560 20 73 69 7a 65 6f 66 28 54 61 62 6c 65 29 20 29   sizeof(Table) )
12570 3b 0a 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20  ;.  if( pTab==0 
12580 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
12590 0a 20 20 7d 0a 20 20 70 54 61 62 2d 3e 6e 54 61  .  }.  pTab->nTa
125a0 62 52 65 66 20 3d 20 31 3b 0a 20 20 70 54 61 62  bRef = 1;.  pTab
125b0 2d 3e 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 70  ->zName = 0;.  p
125c0 54 61 62 2d 3e 6e 52 6f 77 4c 6f 67 45 73 74 20  Tab->nRowLogEst 
125d0 3d 20 32 30 30 3b 20 61 73 73 65 72 74 28 20 32  = 200; assert( 2
125e0 30 30 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73  00==sqlite3LogEs
125f0 74 28 31 30 34 38 35 37 36 29 20 29 3b 0a 20 20  t(1048576) );.  
12600 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 73 46 72  sqlite3ColumnsFr
12610 6f 6d 45 78 70 72 4c 69 73 74 28 70 50 61 72 73  omExprList(pPars
12620 65 2c 20 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69  e, pSelect->pELi
12630 73 74 2c 20 26 70 54 61 62 2d 3e 6e 43 6f 6c 2c  st, &pTab->nCol,
12640 20 26 70 54 61 62 2d 3e 61 43 6f 6c 29 3b 0a 20   &pTab->aCol);. 
12650 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 41 64   sqlite3SelectAd
12660 64 43 6f 6c 75 6d 6e 54 79 70 65 41 6e 64 43 6f  dColumnTypeAndCo
12670 6c 6c 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20  llation(pParse, 
12680 70 54 61 62 2c 20 70 53 65 6c 65 63 74 2c 20 61  pTab, pSelect, a
12690 66 66 29 3b 0a 20 20 70 54 61 62 2d 3e 69 50 4b  ff);.  pTab->iPK
126a0 65 79 20 3d 20 2d 31 3b 0a 20 20 69 66 28 20 64  ey = -1;.  if( d
126b0 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
126c0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65  ){.    sqlite3De
126d0 6c 65 74 65 54 61 62 6c 65 28 64 62 2c 20 70 54  leteTable(db, pT
126e0 61 62 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  ab);.    return 
126f0 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  0;.  }.  return 
12700 70 54 61 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  pTab;.}../*.** G
12710 65 74 20 61 20 56 44 42 45 20 66 6f 72 20 74 68  et a VDBE for th
12720 65 20 67 69 76 65 6e 20 70 61 72 73 65 72 20 63  e given parser c
12730 6f 6e 74 65 78 74 2e 20 20 43 72 65 61 74 65 20  ontext.  Create 
12740 61 20 6e 65 77 20 6f 6e 65 20 69 66 20 6e 65 63  a new one if nec
12750 65 73 73 61 72 79 2e 0a 2a 2a 20 49 66 20 61 6e  essary..** If an
12760 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 72   error occurs, r
12770 65 74 75 72 6e 20 4e 55 4c 4c 20 61 6e 64 20 6c  eturn NULL and l
12780 65 61 76 65 20 61 20 6d 65 73 73 61 67 65 20 69  eave a message i
12790 6e 20 70 50 61 72 73 65 2e 0a 2a 2f 0a 56 64 62  n pParse..*/.Vdb
127a0 65 20 2a 73 71 6c 69 74 65 33 47 65 74 56 64 62  e *sqlite3GetVdb
127b0 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 29  e(Parse *pParse)
127c0 7b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  {.  if( pParse->
127d0 70 56 64 62 65 20 29 7b 0a 20 20 20 20 72 65 74  pVdbe ){.    ret
127e0 75 72 6e 20 70 50 61 72 73 65 2d 3e 70 56 64 62  urn pParse->pVdb
127f0 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61  e;.  }.  if( pPa
12800 72 73 65 2d 3e 70 54 6f 70 6c 65 76 65 6c 3d 3d  rse->pToplevel==
12810 30 0a 20 20 20 26 26 20 4f 70 74 69 6d 69 7a 61  0.   && Optimiza
12820 74 69 6f 6e 45 6e 61 62 6c 65 64 28 70 50 61 72  tionEnabled(pPar
12830 73 65 2d 3e 64 62 2c 53 51 4c 49 54 45 5f 46 61  se->db,SQLITE_Fa
12840 63 74 6f 72 4f 75 74 43 6f 6e 73 74 29 0a 20 20  ctorOutConst).  
12850 29 7b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6f  ){.    pParse->o
12860 6b 43 6f 6e 73 74 46 61 63 74 6f 72 20 3d 20 31  kConstFactor = 1
12870 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 73  ;.  }.  return s
12880 71 6c 69 74 65 33 56 64 62 65 43 72 65 61 74 65  qlite3VdbeCreate
12890 28 70 50 61 72 73 65 29 3b 0a 7d 0a 0a 0a 2f 2a  (pParse);.}.../*
128a0 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20  .** Compute the 
128b0 69 4c 69 6d 69 74 20 61 6e 64 20 69 4f 66 66 73  iLimit and iOffs
128c0 65 74 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65  et fields of the
128d0 20 53 45 4c 45 43 54 20 62 61 73 65 64 20 6f 6e   SELECT based on
128e0 20 74 68 65 0a 2a 2a 20 70 4c 69 6d 69 74 20 65   the.** pLimit e
128f0 78 70 72 65 73 73 69 6f 6e 73 2e 20 20 70 4c 69  xpressions.  pLi
12900 6d 69 74 2d 3e 70 4c 65 66 74 20 61 6e 64 20 70  mit->pLeft and p
12910 4c 69 6d 69 74 2d 3e 70 52 69 67 68 74 20 68 6f  Limit->pRight ho
12920 6c 64 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  ld the expressio
12930 6e 73 0a 2a 2a 20 74 68 61 74 20 61 70 70 65 61  ns.** that appea
12940 72 20 69 6e 20 74 68 65 20 6f 72 69 67 69 6e 61  r in the origina
12950 6c 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20  l SQL statement 
12960 61 66 74 65 72 20 74 68 65 20 4c 49 4d 49 54 20  after the LIMIT 
12970 61 6e 64 20 4f 46 46 53 45 54 0a 2a 2a 20 6b 65  and OFFSET.** ke
12980 79 77 6f 72 64 73 2e 20 20 4f 72 20 4e 55 4c 4c  ywords.  Or NULL
12990 20 69 66 20 74 68 6f 73 65 20 6b 65 79 77 6f 72   if those keywor
129a0 64 73 20 61 72 65 20 6f 6d 69 74 74 65 64 2e 20  ds are omitted. 
129b0 69 4c 69 6d 69 74 20 61 6e 64 20 69 4f 66 66 73  iLimit and iOffs
129c0 65 74 20 0a 2a 2a 20 61 72 65 20 74 68 65 20 69  et .** are the i
129d0 6e 74 65 67 65 72 20 6d 65 6d 6f 72 79 20 72 65  nteger memory re
129e0 67 69 73 74 65 72 20 6e 75 6d 62 65 72 73 20 66  gister numbers f
129f0 6f 72 20 63 6f 75 6e 74 65 72 73 20 75 73 65 64  or counters used
12a00 20 74 6f 20 63 6f 6d 70 75 74 65 20 0a 2a 2a 20   to compute .** 
12a10 74 68 65 20 6c 69 6d 69 74 20 61 6e 64 20 6f 66  the limit and of
12a20 66 73 65 74 2e 20 20 49 66 20 74 68 65 72 65 20  fset.  If there 
12a30 69 73 20 6e 6f 20 6c 69 6d 69 74 20 61 6e 64 2f  is no limit and/
12a40 6f 72 20 6f 66 66 73 65 74 2c 20 74 68 65 6e 20  or offset, then 
12a50 0a 2a 2a 20 69 4c 69 6d 69 74 20 61 6e 64 20 69  .** iLimit and i
12a60 4f 66 66 73 65 74 20 61 72 65 20 6e 65 67 61 74  Offset are negat
12a70 69 76 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ive..**.** This 
12a80 72 6f 75 74 69 6e 65 20 63 68 61 6e 67 65 73 20  routine changes 
12a90 74 68 65 20 76 61 6c 75 65 73 20 6f 66 20 69 4c  the values of iL
12aa0 69 6d 69 74 20 61 6e 64 20 69 4f 66 66 73 65 74  imit and iOffset
12ab0 20 6f 6e 6c 79 20 69 66 0a 2a 2a 20 61 20 6c 69   only if.** a li
12ac0 6d 69 74 20 6f 72 20 6f 66 66 73 65 74 20 69 73  mit or offset is
12ad0 20 64 65 66 69 6e 65 64 20 62 79 20 70 4c 69 6d   defined by pLim
12ae0 69 74 2d 3e 70 4c 65 66 74 20 61 6e 64 20 70 4c  it->pLeft and pL
12af0 69 6d 69 74 2d 3e 70 52 69 67 68 74 2e 20 20 69  imit->pRight.  i
12b00 4c 69 6d 69 74 0a 2a 2a 20 61 6e 64 20 69 4f 66  Limit.** and iOf
12b10 66 73 65 74 20 73 68 6f 75 6c 64 20 68 61 76 65  fset should have
12b20 20 62 65 65 6e 20 70 72 65 73 65 74 20 74 6f 20   been preset to 
12b30 61 70 70 72 6f 70 72 69 61 74 65 20 64 65 66 61  appropriate defa
12b40 75 6c 74 20 76 61 6c 75 65 73 20 28 7a 65 72 6f  ult values (zero
12b50 29 0a 2a 2a 20 70 72 69 6f 72 20 74 6f 20 63 61  ).** prior to ca
12b60 6c 6c 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69  lling this routi
12b70 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 4f  ne..**.** The iO
12b80 66 66 73 65 74 20 72 65 67 69 73 74 65 72 20 28  ffset register (
12b90 69 66 20 69 74 20 65 78 69 73 74 73 29 20 69 73  if it exists) is
12ba0 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20   initialized to 
12bb0 74 68 65 20 76 61 6c 75 65 0a 2a 2a 20 6f 66 20  the value.** of 
12bc0 74 68 65 20 4f 46 46 53 45 54 2e 20 20 54 68 65  the OFFSET.  The
12bd0 20 69 4c 69 6d 69 74 20 72 65 67 69 73 74 65 72   iLimit register
12be0 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20   is initialized 
12bf0 74 6f 20 4c 49 4d 49 54 2e 20 20 52 65 67 69 73  to LIMIT.  Regis
12c00 74 65 72 0a 2a 2a 20 69 4f 66 66 73 65 74 2b 31  ter.** iOffset+1
12c10 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20   is initialized 
12c20 74 6f 20 4c 49 4d 49 54 2b 4f 46 46 53 45 54 2e  to LIMIT+OFFSET.
12c30 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20 69 66 20 70  .**.** Only if p
12c40 4c 69 6d 69 74 2d 3e 70 4c 65 66 74 21 3d 30 20  Limit->pLeft!=0 
12c50 64 6f 20 74 68 65 20 6c 69 6d 69 74 20 72 65 67  do the limit reg
12c60 69 73 74 65 72 73 20 67 65 74 0a 2a 2a 20 72 65  isters get.** re
12c70 64 65 66 69 6e 65 64 2e 20 20 54 68 65 20 55 4e  defined.  The UN
12c80 49 4f 4e 20 41 4c 4c 20 6f 70 65 72 61 74 6f 72  ION ALL operator
12c90 20 75 73 65 73 20 74 68 69 73 20 70 72 6f 70 65   uses this prope
12ca0 72 74 79 20 74 6f 20 66 6f 72 63 65 0a 2a 2a 20  rty to force.** 
12cb0 74 68 65 20 72 65 75 73 65 20 6f 66 20 74 68 65  the reuse of the
12cc0 20 73 61 6d 65 20 6c 69 6d 69 74 20 61 6e 64 20   same limit and 
12cd0 6f 66 66 73 65 74 20 72 65 67 69 73 74 65 72 73  offset registers
12ce0 20 61 63 72 6f 73 73 20 6d 75 6c 74 69 70 6c 65   across multiple
12cf0 0a 2a 2a 20 53 45 4c 45 43 54 20 73 74 61 74 65  .** SELECT state
12d00 6d 65 6e 74 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  ments..*/.static
12d10 20 76 6f 69 64 20 63 6f 6d 70 75 74 65 4c 69 6d   void computeLim
12d20 69 74 52 65 67 69 73 74 65 72 73 28 50 61 72 73  itRegisters(Pars
12d30 65 20 2a 70 50 61 72 73 65 2c 20 53 65 6c 65 63  e *pParse, Selec
12d40 74 20 2a 70 2c 20 69 6e 74 20 69 42 72 65 61 6b  t *p, int iBreak
12d50 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 30  ){.  Vdbe *v = 0
12d60 3b 0a 20 20 69 6e 74 20 69 4c 69 6d 69 74 20 3d  ;.  int iLimit =
12d70 20 30 3b 0a 20 20 69 6e 74 20 69 4f 66 66 73 65   0;.  int iOffse
12d80 74 3b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 45 78  t;.  int n;.  Ex
12d90 70 72 20 2a 70 4c 69 6d 69 74 20 3d 20 70 2d 3e  pr *pLimit = p->
12da0 70 4c 69 6d 69 74 3b 0a 0a 20 20 69 66 28 20 70  pLimit;..  if( p
12db0 2d 3e 69 4c 69 6d 69 74 20 29 20 72 65 74 75 72  ->iLimit ) retur
12dc0 6e 3b 0a 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20 22  n;..  /* .  ** "
12dd0 4c 49 4d 49 54 20 2d 31 22 20 61 6c 77 61 79 73  LIMIT -1" always
12de0 20 73 68 6f 77 73 20 61 6c 6c 20 72 6f 77 73 2e   shows all rows.
12df0 20 20 54 68 65 72 65 20 69 73 20 73 6f 6d 65 0a    There is some.
12e00 20 20 2a 2a 20 63 6f 6e 74 72 6f 76 65 72 73 79    ** controversy
12e10 20 61 62 6f 75 74 20 77 68 61 74 20 74 68 65 20   about what the 
12e20 63 6f 72 72 65 63 74 20 62 65 68 61 76 69 6f 72  correct behavior
12e30 20 73 68 6f 75 6c 64 20 62 65 2e 0a 20 20 2a 2a   should be..  **
12e40 20 54 68 65 20 63 75 72 72 65 6e 74 20 69 6d 70   The current imp
12e50 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 69 6e 74 65  lementation inte
12e60 72 70 72 65 74 73 20 22 4c 49 4d 49 54 20 30 22  rprets "LIMIT 0"
12e70 20 74 6f 20 6d 65 61 6e 0a 20 20 2a 2a 20 6e 6f   to mean.  ** no
12e80 20 72 6f 77 73 2e 0a 20 20 2a 2f 0a 20 20 69 66   rows..  */.  if
12e90 28 20 70 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20  ( pLimit ){.    
12ea0 61 73 73 65 72 74 28 20 70 4c 69 6d 69 74 2d 3e  assert( pLimit->
12eb0 6f 70 3d 3d 54 4b 5f 4c 49 4d 49 54 20 29 3b 0a  op==TK_LIMIT );.
12ec0 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 69 6d      assert( pLim
12ed0 69 74 2d 3e 70 4c 65 66 74 21 3d 30 20 29 3b 0a  it->pLeft!=0 );.
12ee0 20 20 20 20 70 2d 3e 69 4c 69 6d 69 74 20 3d 20      p->iLimit = 
12ef0 69 4c 69 6d 69 74 20 3d 20 2b 2b 70 50 61 72 73  iLimit = ++pPars
12f00 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 76 20 3d  e->nMem;.    v =
12f10 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
12f20 70 50 61 72 73 65 29 3b 0a 20 20 20 20 61 73 73  pParse);.    ass
12f30 65 72 74 28 20 76 21 3d 30 20 29 3b 0a 20 20 20  ert( v!=0 );.   
12f40 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72   if( sqlite3Expr
12f50 49 73 49 6e 74 65 67 65 72 28 70 4c 69 6d 69 74  IsInteger(pLimit
12f60 2d 3e 70 4c 65 66 74 2c 20 26 6e 29 20 29 7b 0a  ->pLeft, &n) ){.
12f70 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
12f80 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e  eAddOp2(v, OP_In
12f90 74 65 67 65 72 2c 20 6e 2c 20 69 4c 69 6d 69 74  teger, n, iLimit
12fa0 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d  );.      VdbeCom
12fb0 6d 65 6e 74 28 28 76 2c 20 22 4c 49 4d 49 54 20  ment((v, "LIMIT 
12fc0 63 6f 75 6e 74 65 72 22 29 29 3b 0a 20 20 20 20  counter"));.    
12fd0 20 20 69 66 28 20 6e 3d 3d 30 20 29 7b 0a 20 20    if( n==0 ){.  
12fe0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
12ff0 65 47 6f 74 6f 28 76 2c 20 69 42 72 65 61 6b 29  eGoto(v, iBreak)
13000 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
13010 28 20 6e 3e 3d 30 20 26 26 20 70 2d 3e 6e 53 65  ( n>=0 && p->nSe
13020 6c 65 63 74 52 6f 77 3e 73 71 6c 69 74 65 33 4c  lectRow>sqlite3L
13030 6f 67 45 73 74 28 28 75 36 34 29 6e 29 20 29 7b  ogEst((u64)n) ){
13040 0a 20 20 20 20 20 20 20 20 70 2d 3e 6e 53 65 6c  .        p->nSel
13050 65 63 74 52 6f 77 20 3d 20 73 71 6c 69 74 65 33  ectRow = sqlite3
13060 4c 6f 67 45 73 74 28 28 75 36 34 29 6e 29 3b 0a  LogEst((u64)n);.
13070 20 20 20 20 20 20 20 20 70 2d 3e 73 65 6c 46 6c          p->selFl
13080 61 67 73 20 7c 3d 20 53 46 5f 46 69 78 65 64 4c  ags |= SF_FixedL
13090 69 6d 69 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20  imit;.      }.  
130a0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73    }else{.      s
130b0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70  qlite3ExprCode(p
130c0 50 61 72 73 65 2c 20 70 4c 69 6d 69 74 2d 3e 70  Parse, pLimit->p
130d0 4c 65 66 74 2c 20 69 4c 69 6d 69 74 29 3b 0a 20  Left, iLimit);. 
130e0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
130f0 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4d 75 73  AddOp1(v, OP_Mus
13100 74 42 65 49 6e 74 2c 20 69 4c 69 6d 69 74 29 3b  tBeInt, iLimit);
13110 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
13120 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d  ;.      VdbeComm
13130 65 6e 74 28 28 76 2c 20 22 4c 49 4d 49 54 20 63  ent((v, "LIMIT c
13140 6f 75 6e 74 65 72 22 29 29 3b 0a 20 20 20 20 20  ounter"));.     
13150 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
13160 70 32 28 76 2c 20 4f 50 5f 49 66 4e 6f 74 2c 20  p2(v, OP_IfNot, 
13170 69 4c 69 6d 69 74 2c 20 69 42 72 65 61 6b 29 3b  iLimit, iBreak);
13180 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
13190 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
131a0 70 4c 69 6d 69 74 2d 3e 70 52 69 67 68 74 20 29  pLimit->pRight )
131b0 7b 0a 20 20 20 20 20 20 70 2d 3e 69 4f 66 66 73  {.      p->iOffs
131c0 65 74 20 3d 20 69 4f 66 66 73 65 74 20 3d 20 2b  et = iOffset = +
131d0 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
131e0 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65       pParse->nMe
131f0 6d 2b 2b 3b 20 20 20 2f 2a 20 41 6c 6c 6f 63 61  m++;   /* Alloca
13200 74 65 20 61 6e 20 65 78 74 72 61 20 72 65 67 69  te an extra regi
13210 73 74 65 72 20 66 6f 72 20 6c 69 6d 69 74 2b 6f  ster for limit+o
13220 66 66 73 65 74 20 2a 2f 0a 20 20 20 20 20 20 73  ffset */.      s
13230 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70  qlite3ExprCode(p
13240 50 61 72 73 65 2c 20 70 4c 69 6d 69 74 2d 3e 70  Parse, pLimit->p
13250 52 69 67 68 74 2c 20 69 4f 66 66 73 65 74 29 3b  Right, iOffset);
13260 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
13270 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4d  beAddOp1(v, OP_M
13280 75 73 74 42 65 49 6e 74 2c 20 69 4f 66 66 73 65  ustBeInt, iOffse
13290 74 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  t); VdbeCoverage
132a0 28 76 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  (v);.      VdbeC
132b0 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4f 46 46 53  omment((v, "OFFS
132c0 45 54 20 63 6f 75 6e 74 65 72 22 29 29 3b 0a 20  ET counter"));. 
132d0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
132e0 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4f 66 66  AddOp3(v, OP_Off
132f0 73 65 74 4c 69 6d 69 74 2c 20 69 4c 69 6d 69 74  setLimit, iLimit
13300 2c 20 69 4f 66 66 73 65 74 2b 31 2c 20 69 4f 66  , iOffset+1, iOf
13310 66 73 65 74 29 3b 0a 20 20 20 20 20 20 56 64 62  fset);.      Vdb
13320 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4c 49  eComment((v, "LI
13330 4d 49 54 2b 4f 46 46 53 45 54 22 29 29 3b 0a 20  MIT+OFFSET"));. 
13340 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e     }.  }.}..#ifn
13350 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
13360 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 0a  COMPOUND_SELECT.
13370 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
13380 20 61 70 70 72 6f 70 72 69 61 74 65 20 63 6f 6c   appropriate col
13390 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20  lating sequence 
133a0 66 6f 72 20 74 68 65 20 69 43 6f 6c 2d 74 68 20  for the iCol-th 
133b0 63 6f 6c 75 6d 6e 20 6f 66 0a 2a 2a 20 74 68 65  column of.** the
133c0 20 72 65 73 75 6c 74 20 73 65 74 20 66 6f 72 20   result set for 
133d0 74 68 65 20 63 6f 6d 70 6f 75 6e 64 2d 73 65 6c  the compound-sel
133e0 65 63 74 20 73 74 61 74 65 6d 65 6e 74 20 22 70  ect statement "p
133f0 22 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20  ".  Return NULL 
13400 69 66 0a 2a 2a 20 74 68 65 20 63 6f 6c 75 6d 6e  if.** the column
13410 20 68 61 73 20 6e 6f 20 64 65 66 61 75 6c 74 20   has no default 
13420 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  collating sequen
13430 63 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f  ce..**.** The co
13440 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
13450 20 66 6f 72 20 74 68 65 20 63 6f 6d 70 6f 75 6e   for the compoun
13460 64 20 73 65 6c 65 63 74 20 69 73 20 74 61 6b 65  d select is take
13470 6e 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20 6c 65  n from the.** le
13480 66 74 2d 6d 6f 73 74 20 74 65 72 6d 20 6f 66 20  ft-most term of 
13490 74 68 65 20 73 65 6c 65 63 74 20 74 68 61 74 20  the select that 
134a0 68 61 73 20 61 20 63 6f 6c 6c 61 74 69 6e 67 20  has a collating 
134b0 73 65 71 75 65 6e 63 65 2e 0a 2a 2f 0a 73 74 61  sequence..*/.sta
134c0 74 69 63 20 43 6f 6c 6c 53 65 71 20 2a 6d 75 6c  tic CollSeq *mul
134d0 74 69 53 65 6c 65 63 74 43 6f 6c 6c 53 65 71 28  tiSelectCollSeq(
134e0 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53  Parse *pParse, S
134f0 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20 69 43  elect *p, int iC
13500 6f 6c 29 7b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a  ol){.  CollSeq *
13510 70 52 65 74 3b 0a 20 20 69 66 28 20 70 2d 3e 70  pRet;.  if( p->p
13520 50 72 69 6f 72 20 29 7b 0a 20 20 20 20 70 52 65  Prior ){.    pRe
13530 74 20 3d 20 6d 75 6c 74 69 53 65 6c 65 63 74 43  t = multiSelectC
13540 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70  ollSeq(pParse, p
13550 2d 3e 70 50 72 69 6f 72 2c 20 69 43 6f 6c 29 3b  ->pPrior, iCol);
13560 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 52  .  }else{.    pR
13570 65 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 61 73  et = 0;.  }.  as
13580 73 65 72 74 28 20 69 43 6f 6c 3e 3d 30 20 29 3b  sert( iCol>=0 );
13590 0a 20 20 2f 2a 20 69 43 6f 6c 20 6d 75 73 74 20  .  /* iCol must 
135a0 62 65 20 6c 65 73 73 20 74 68 61 6e 20 70 2d 3e  be less than p->
135b0 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2e 20 20  pEList->nExpr.  
135c0 4f 74 68 65 72 77 69 73 65 20 61 6e 20 65 72 72  Otherwise an err
135d0 6f 72 20 77 6f 75 6c 64 0a 20 20 2a 2a 20 68 61  or would.  ** ha
135e0 76 65 20 62 65 65 6e 20 74 68 72 6f 77 6e 20 64  ve been thrown d
135f0 75 72 69 6e 67 20 6e 61 6d 65 20 72 65 73 6f 6c  uring name resol
13600 75 74 69 6f 6e 20 61 6e 64 20 77 65 20 77 6f 75  ution and we wou
13610 6c 64 20 6e 6f 74 20 68 61 76 65 20 67 6f 74 74  ld not have gott
13620 65 6e 0a 20 20 2a 2a 20 74 68 69 73 20 66 61 72  en.  ** this far
13630 20 2a 2f 0a 20 20 69 66 28 20 70 52 65 74 3d 3d   */.  if( pRet==
13640 30 20 26 26 20 41 4c 57 41 59 53 28 69 43 6f 6c  0 && ALWAYS(iCol
13650 3c 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70  <p->pEList->nExp
13660 72 29 20 29 7b 0a 20 20 20 20 70 52 65 74 20 3d  r) ){.    pRet =
13670 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c   sqlite3ExprColl
13680 53 65 71 28 70 50 61 72 73 65 2c 20 70 2d 3e 70  Seq(pParse, p->p
13690 45 4c 69 73 74 2d 3e 61 5b 69 43 6f 6c 5d 2e 70  EList->a[iCol].p
136a0 45 78 70 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74  Expr);.  }.  ret
136b0 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a  urn pRet;.}../*.
136c0 2a 2a 20 54 68 65 20 73 65 6c 65 63 74 20 73 74  ** The select st
136d0 61 74 65 6d 65 6e 74 20 70 61 73 73 65 64 20 61  atement passed a
136e0 73 20 74 68 65 20 73 65 63 6f 6e 64 20 70 61 72  s the second par
136f0 61 6d 65 74 65 72 20 69 73 20 61 20 63 6f 6d 70  ameter is a comp
13700 6f 75 6e 64 20 53 45 4c 45 43 54 0a 2a 2a 20 77  ound SELECT.** w
13710 69 74 68 20 61 6e 20 4f 52 44 45 52 20 42 59 20  ith an ORDER BY 
13720 63 6c 61 75 73 65 2e 20 54 68 69 73 20 66 75 6e  clause. This fun
13730 63 74 69 6f 6e 20 61 6c 6c 6f 63 61 74 65 73 20  ction allocates 
13740 61 6e 64 20 72 65 74 75 72 6e 73 20 61 20 4b 65  and returns a Ke
13750 79 49 6e 66 6f 0a 2a 2a 20 73 74 72 75 63 74 75  yInfo.** structu
13760 72 65 20 73 75 69 74 61 62 6c 65 20 66 6f 72 20  re suitable for 
13770 69 6d 70 6c 65 6d 65 6e 74 69 6e 67 20 74 68 65  implementing the
13780 20 4f 52 44 45 52 20 42 59 2e 0a 2a 2a 0a 2a 2a   ORDER BY..**.**
13790 20 53 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 74   Space to hold t
137a0 68 65 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63  he KeyInfo struc
137b0 74 75 72 65 20 69 73 20 6f 62 74 61 69 6e 65 64  ture is obtained
137c0 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 2e 20 54 68   from malloc. Th
137d0 65 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 66 75 6e  e calling.** fun
137e0 63 74 69 6f 6e 20 69 73 20 72 65 73 70 6f 6e 73  ction is respons
137f0 69 62 6c 65 20 66 6f 72 20 65 6e 73 75 72 69 6e  ible for ensurin
13800 67 20 74 68 61 74 20 74 68 69 73 20 73 74 72 75  g that this stru
13810 63 74 75 72 65 20 69 73 20 65 76 65 6e 74 75 61  cture is eventua
13820 6c 6c 79 0a 2a 2a 20 66 72 65 65 64 2e 0a 2a 2f  lly.** freed..*/
13830 0a 73 74 61 74 69 63 20 4b 65 79 49 6e 66 6f 20  .static KeyInfo 
13840 2a 6d 75 6c 74 69 53 65 6c 65 63 74 4f 72 64 65  *multiSelectOrde
13850 72 42 79 4b 65 79 49 6e 66 6f 28 50 61 72 73 65  rByKeyInfo(Parse
13860 20 2a 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74   *pParse, Select
13870 20 2a 70 2c 20 69 6e 74 20 6e 45 78 74 72 61 29   *p, int nExtra)
13880 7b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f  {.  ExprList *pO
13890 72 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64  rderBy = p->pOrd
138a0 65 72 42 79 3b 0a 20 20 69 6e 74 20 6e 4f 72 64  erBy;.  int nOrd
138b0 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72  erBy = p->pOrder
138c0 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 73 71 6c  By->nExpr;.  sql
138d0 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
138e0 65 2d 3e 64 62 3b 0a 20 20 4b 65 79 49 6e 66 6f  e->db;.  KeyInfo
138f0 20 2a 70 52 65 74 20 3d 20 73 71 6c 69 74 65 33   *pRet = sqlite3
13900 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63 28 64 62 2c  KeyInfoAlloc(db,
13910 20 6e 4f 72 64 65 72 42 79 2b 6e 45 78 74 72 61   nOrderBy+nExtra
13920 2c 20 31 29 3b 0a 20 20 69 66 28 20 70 52 65 74  , 1);.  if( pRet
13930 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20   ){.    int i;. 
13940 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f     for(i=0; i<nO
13950 72 64 65 72 42 79 3b 20 69 2b 2b 29 7b 0a 20 20  rderBy; i++){.  
13960 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c      struct ExprL
13970 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20  ist_item *pItem 
13980 3d 20 26 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69  = &pOrderBy->a[i
13990 5d 3b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70  ];.      Expr *p
139a0 54 65 72 6d 20 3d 20 70 49 74 65 6d 2d 3e 70 45  Term = pItem->pE
139b0 78 70 72 3b 0a 20 20 20 20 20 20 43 6f 6c 6c 53  xpr;.      CollS
139c0 65 71 20 2a 70 43 6f 6c 6c 3b 0a 0a 20 20 20 20  eq *pColl;..    
139d0 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 66 6c 61    if( pTerm->fla
139e0 67 73 20 26 20 45 50 5f 43 6f 6c 6c 61 74 65 20  gs & EP_Collate 
139f0 29 7b 0a 20 20 20 20 20 20 20 20 70 43 6f 6c 6c  ){.        pColl
13a00 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
13a10 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 54  llSeq(pParse, pT
13a20 65 72 6d 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  erm);.      }els
13a30 65 7b 0a 20 20 20 20 20 20 20 20 70 43 6f 6c 6c  e{.        pColl
13a40 20 3d 20 6d 75 6c 74 69 53 65 6c 65 63 74 43 6f   = multiSelectCo
13a50 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 2c  llSeq(pParse, p,
13a60 20 70 49 74 65 6d 2d 3e 75 2e 78 2e 69 4f 72 64   pItem->u.x.iOrd
13a70 65 72 42 79 43 6f 6c 2d 31 29 3b 0a 20 20 20 20  erByCol-1);.    
13a80 20 20 20 20 69 66 28 20 70 43 6f 6c 6c 3d 3d 30      if( pColl==0
13a90 20 29 20 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70   ) pColl = db->p
13aa0 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20 20  DfltColl;.      
13ab0 20 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d    pOrderBy->a[i]
13ac0 2e 70 45 78 70 72 20 3d 0a 20 20 20 20 20 20 20  .pExpr =.       
13ad0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 41 64     sqlite3ExprAd
13ae0 64 43 6f 6c 6c 61 74 65 53 74 72 69 6e 67 28 70  dCollateString(p
13af0 50 61 72 73 65 2c 20 70 54 65 72 6d 2c 20 70 43  Parse, pTerm, pC
13b00 6f 6c 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  oll->zName);.   
13b10 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72     }.      asser
13b20 74 28 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66  t( sqlite3KeyInf
13b30 6f 49 73 57 72 69 74 65 61 62 6c 65 28 70 52 65  oIsWriteable(pRe
13b40 74 29 20 29 3b 0a 20 20 20 20 20 20 70 52 65 74  t) );.      pRet
13b50 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 3d 20 70 43 6f  ->aColl[i] = pCo
13b60 6c 6c 3b 0a 20 20 20 20 20 20 70 52 65 74 2d 3e  ll;.      pRet->
13b70 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d 20 3d 20  aSortOrder[i] = 
13b80 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 73  pOrderBy->a[i].s
13b90 6f 72 74 4f 72 64 65 72 3b 0a 20 20 20 20 7d 0a  ortOrder;.    }.
13ba0 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70 52    }..  return pR
13bb0 65 74 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53  et;.}..#ifndef S
13bc0 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 54 45 0a 2f  QLITE_OMIT_CTE./
13bd0 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
13be0 65 20 67 65 6e 65 72 61 74 65 73 20 56 44 42 45  e generates VDBE
13bf0 20 63 6f 64 65 20 74 6f 20 63 6f 6d 70 75 74 65   code to compute
13c00 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20   the content of 
13c10 61 20 57 49 54 48 20 52 45 43 55 52 53 49 56 45  a WITH RECURSIVE
13c20 0a 2a 2a 20 71 75 65 72 79 20 6f 66 20 74 68 65  .** query of the
13c30 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 3c   form:.**.**   <
13c40 72 65 63 75 72 73 69 76 65 2d 74 61 62 6c 65 3e  recursive-table>
13c50 20 41 53 20 28 3c 73 65 74 75 70 2d 71 75 65 72   AS (<setup-quer
13c60 79 3e 20 55 4e 49 4f 4e 20 5b 41 4c 4c 5d 20 3c  y> UNION [ALL] <
13c70 72 65 63 75 72 73 69 76 65 2d 71 75 65 72 79 3e  recursive-query>
13c80 29 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  ).**            
13c90 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 5f 5f               \__
13ca0 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 20 20 20 20 20 20  _________/      
13cb0 20 20 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f         \________
13cc0 5f 5f 5f 5f 5f 5f 5f 2f 0a 2a 2a 20 20 20 20 20  _______/.**     
13cd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13ce0 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20        p->pPrior 
13cf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13d00 20 20 20 20 20 70 0a 2a 2a 0a 2a 2a 0a 2a 2a 20       p.**.**.** 
13d10 54 68 65 72 65 20 69 73 20 65 78 61 63 74 6c 79  There is exactly
13d20 20 6f 6e 65 20 72 65 66 65 72 65 6e 63 65 20 74   one reference t
13d30 6f 20 74 68 65 20 72 65 63 75 72 73 69 76 65 2d  o the recursive-
13d40 74 61 62 6c 65 20 69 6e 20 74 68 65 20 46 52 4f  table in the FRO
13d50 4d 20 63 6c 61 75 73 65 0a 2a 2a 20 6f 66 20 72  M clause.** of r
13d60 65 63 75 72 73 69 76 65 2d 71 75 65 72 79 2c 20  ecursive-query, 
13d70 6d 61 72 6b 65 64 20 77 69 74 68 20 74 68 65 20  marked with the 
13d80 53 72 63 4c 69 73 74 2d 3e 61 5b 5d 2e 66 67 2e  SrcList->a[].fg.
13d90 69 73 52 65 63 75 72 73 69 76 65 20 66 6c 61 67  isRecursive flag
13da0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 65 74 75  ..**.** The setu
13db0 70 2d 71 75 65 72 79 20 72 75 6e 73 20 6f 6e 63  p-query runs onc
13dc0 65 20 74 6f 20 67 65 6e 65 72 61 74 65 20 61 6e  e to generate an
13dd0 20 69 6e 69 74 69 61 6c 20 73 65 74 20 6f 66 20   initial set of 
13de0 72 6f 77 73 20 74 68 61 74 20 67 6f 0a 2a 2a 20  rows that go.** 
13df0 69 6e 74 6f 20 61 20 51 75 65 75 65 20 74 61 62  into a Queue tab
13e00 6c 65 2e 20 20 52 6f 77 73 20 61 72 65 20 65 78  le.  Rows are ex
13e10 74 72 61 63 74 65 64 20 66 72 6f 6d 20 74 68 65  tracted from the
13e20 20 51 75 65 75 65 20 74 61 62 6c 65 20 6f 6e 65   Queue table one
13e30 20 62 79 0a 2a 2a 20 6f 6e 65 2e 20 20 45 61 63   by.** one.  Eac
13e40 68 20 72 6f 77 20 65 78 74 72 61 63 74 65 64 20  h row extracted 
13e50 66 72 6f 6d 20 51 75 65 75 65 20 69 73 20 6f 75  from Queue is ou
13e60 74 70 75 74 20 74 6f 20 70 44 65 73 74 2e 20 20  tput to pDest.  
13e70 54 68 65 6e 20 74 68 65 20 73 69 6e 67 6c 65 0a  Then the single.
13e80 2a 2a 20 65 78 74 72 61 63 74 65 64 20 72 6f 77  ** extracted row
13e90 20 28 6e 6f 77 20 69 6e 20 74 68 65 20 69 43 75   (now in the iCu
13ea0 72 72 65 6e 74 20 74 61 62 6c 65 29 20 62 65 63  rrent table) bec
13eb0 6f 6d 65 73 20 74 68 65 20 63 6f 6e 74 65 6e 74  omes the content
13ec0 20 6f 66 20 74 68 65 0a 2a 2a 20 72 65 63 75 72   of the.** recur
13ed0 73 69 76 65 2d 74 61 62 6c 65 20 66 6f 72 20 61  sive-table for a
13ee0 20 72 65 63 75 72 73 69 76 65 2d 71 75 65 72 79   recursive-query
13ef0 20 72 75 6e 2e 20 20 54 68 65 20 6f 75 74 70 75   run.  The outpu
13f00 74 20 6f 66 20 74 68 65 20 72 65 63 75 72 73 69  t of the recursi
13f10 76 65 2d 71 75 65 72 79 0a 2a 2a 20 69 73 20 61  ve-query.** is a
13f20 64 64 65 64 20 62 61 63 6b 20 69 6e 74 6f 20 74  dded back into t
13f30 68 65 20 51 75 65 75 65 20 74 61 62 6c 65 2e 20  he Queue table. 
13f40 20 54 68 65 6e 20 61 6e 6f 74 68 65 72 20 72 6f   Then another ro
13f50 77 20 69 73 20 65 78 74 72 61 63 74 65 64 20 66  w is extracted f
13f60 72 6f 6d 20 51 75 65 75 65 0a 2a 2a 20 61 6e 64  rom Queue.** and
13f70 20 74 68 65 20 69 74 65 72 61 74 69 6f 6e 20 63   the iteration c
13f80 6f 6e 74 69 6e 75 65 73 20 75 6e 74 69 6c 20 74  ontinues until t
13f90 68 65 20 51 75 65 75 65 20 74 61 62 6c 65 20 69  he Queue table i
13fa0 73 20 65 6d 70 74 79 2e 0a 2a 2a 0a 2a 2a 20 49  s empty..**.** I
13fb0 66 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 71  f the compound q
13fc0 75 65 72 79 20 6f 70 65 72 61 74 6f 72 20 69 73  uery operator is
13fd0 20 55 4e 49 4f 4e 20 74 68 65 6e 20 6e 6f 20 64   UNION then no d
13fe0 75 70 6c 69 63 61 74 65 20 72 6f 77 73 20 61 72  uplicate rows ar
13ff0 65 20 65 76 65 72 0a 2a 2a 20 69 6e 73 65 72 74  e ever.** insert
14000 65 64 20 69 6e 74 6f 20 74 68 65 20 51 75 65 75  ed into the Queu
14010 65 20 74 61 62 6c 65 2e 20 20 54 68 65 20 69 44  e table.  The iD
14020 69 73 74 69 6e 63 74 20 74 61 62 6c 65 20 6b 65  istinct table ke
14030 65 70 73 20 61 20 63 6f 70 79 20 6f 66 20 61 6c  eps a copy of al
14040 6c 20 72 6f 77 73 0a 2a 2a 20 74 68 61 74 20 68  l rows.** that h
14050 61 76 65 20 65 76 65 72 20 62 65 65 6e 20 69 6e  ave ever been in
14060 73 65 72 74 65 64 20 69 6e 74 6f 20 51 75 65 75  serted into Queu
14070 65 20 61 6e 64 20 63 61 75 73 65 73 20 64 75 70  e and causes dup
14080 6c 69 63 61 74 65 73 20 74 6f 20 62 65 0a 2a 2a  licates to be.**
14090 20 64 69 73 63 61 72 64 65 64 2e 20 20 49 66 20   discarded.  If 
140a0 74 68 65 20 6f 70 65 72 61 74 6f 72 20 69 73 20  the operator is 
140b0 55 4e 49 4f 4e 20 41 4c 4c 2c 20 74 68 65 6e 20  UNION ALL, then 
140c0 64 75 70 6c 69 63 61 74 65 73 20 61 72 65 20 61  duplicates are a
140d0 6c 6c 6f 77 65 64 2e 0a 2a 2a 20 0a 2a 2a 20 49  llowed..** .** I
140e0 66 20 74 68 65 20 71 75 65 72 79 20 68 61 73 20  f the query has 
140f0 61 6e 20 4f 52 44 45 52 20 42 59 2c 20 74 68 65  an ORDER BY, the
14100 6e 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65  n entries in the
14110 20 51 75 65 75 65 20 74 61 62 6c 65 20 61 72 65   Queue table are
14120 20 6b 65 70 74 20 69 6e 0a 2a 2a 20 4f 52 44 45   kept in.** ORDE
14130 52 20 42 59 20 6f 72 64 65 72 20 61 6e 64 20 74  R BY order and t
14140 68 65 20 66 69 72 73 74 20 65 6e 74 72 79 20 69  he first entry i
14150 73 20 65 78 74 72 61 63 74 65 64 20 66 6f 72 20  s extracted for 
14160 65 61 63 68 20 63 79 63 6c 65 2e 20 20 57 69 74  each cycle.  Wit
14170 68 6f 75 74 0a 2a 2a 20 61 6e 20 4f 52 44 45 52  hout.** an ORDER
14180 20 42 59 2c 20 74 68 65 20 51 75 65 75 65 20 74   BY, the Queue t
14190 61 62 6c 65 20 69 73 20 6a 75 73 74 20 61 20 46  able is just a F
141a0 49 46 4f 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20  IFO..**.** If a 
141b0 4c 49 4d 49 54 20 63 6c 61 75 73 65 20 69 73 20  LIMIT clause is 
141c0 70 72 6f 76 69 64 65 64 2c 20 74 68 65 6e 20 74  provided, then t
141d0 68 65 20 69 74 65 72 61 74 69 6f 6e 20 73 74 6f  he iteration sto
141e0 70 73 20 61 66 74 65 72 20 4c 49 4d 49 54 20 72  ps after LIMIT r
141f0 6f 77 73 0a 2a 2a 20 68 61 76 65 20 62 65 65 6e  ows.** have been
14200 20 6f 75 74 70 75 74 20 74 6f 20 70 44 65 73 74   output to pDest
14210 2e 20 20 41 20 4c 49 4d 49 54 20 6f 66 20 7a 65  .  A LIMIT of ze
14220 72 6f 20 6d 65 61 6e 73 20 74 6f 20 6f 75 74 70  ro means to outp
14230 75 74 20 6e 6f 20 72 6f 77 73 20 61 6e 64 20 61  ut no rows and a
14240 0a 2a 2a 20 6e 65 67 61 74 69 76 65 20 4c 49 4d  .** negative LIM
14250 49 54 20 6d 65 61 6e 73 20 74 6f 20 6f 75 74 70  IT means to outp
14260 75 74 20 61 6c 6c 20 72 6f 77 73 2e 20 20 49 66  ut all rows.  If
14270 20 74 68 65 72 65 20 69 73 20 61 6c 73 6f 20 61   there is also a
14280 6e 20 4f 46 46 53 45 54 20 63 6c 61 75 73 65 0a  n OFFSET clause.
14290 2a 2a 20 77 69 74 68 20 61 20 70 6f 73 69 74 69  ** with a positi
142a0 76 65 20 76 61 6c 75 65 2c 20 74 68 65 6e 20 74  ve value, then t
142b0 68 65 20 66 69 72 73 74 20 4f 46 46 53 45 54 20  he first OFFSET 
142c0 6f 75 74 70 75 74 73 20 61 72 65 20 64 69 73 63  outputs are disc
142d0 61 72 64 65 64 20 72 61 74 68 65 72 0a 2a 2a 20  arded rather.** 
142e0 74 68 61 6e 20 62 65 69 6e 67 20 73 65 6e 74 20  than being sent 
142f0 74 6f 20 70 44 65 73 74 2e 20 20 54 68 65 20 4c  to pDest.  The L
14300 49 4d 49 54 20 63 6f 75 6e 74 20 64 6f 65 73 20  IMIT count does 
14310 6e 6f 74 20 62 65 67 69 6e 20 75 6e 74 69 6c 20  not begin until 
14320 61 66 74 65 72 20 4f 46 46 53 45 54 0a 2a 2a 20  after OFFSET.** 
14330 72 6f 77 73 20 68 61 76 65 20 62 65 65 6e 20 73  rows have been s
14340 6b 69 70 70 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  kipped..*/.stati
14350 63 20 76 6f 69 64 20 67 65 6e 65 72 61 74 65 57  c void generateW
14360 69 74 68 52 65 63 75 72 73 69 76 65 51 75 65 72  ithRecursiveQuer
14370 79 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  y(.  Parse *pPar
14380 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 61  se,        /* Pa
14390 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
143a0 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20  .  Select *p,   
143b0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
143c0 72 65 63 75 72 73 69 76 65 20 53 45 4c 45 43 54  recursive SELECT
143d0 20 74 6f 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a   to be coded */.
143e0 20 20 53 65 6c 65 63 74 44 65 73 74 20 2a 70 44    SelectDest *pD
143f0 65 73 74 20 20 20 20 20 2f 2a 20 57 68 61 74 20  est     /* What 
14400 74 6f 20 64 6f 20 77 69 74 68 20 71 75 65 72 79  to do with query
14410 20 72 65 73 75 6c 74 73 20 2a 2f 0a 29 7b 0a 20   results */.){. 
14420 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63 20 3d   SrcList *pSrc =
14430 20 70 2d 3e 70 53 72 63 3b 20 20 20 20 20 20 2f   p->pSrc;      /
14440 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  * The FROM claus
14450 65 20 6f 66 20 74 68 65 20 72 65 63 75 72 73 69  e of the recursi
14460 76 65 20 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e  ve query */.  in
14470 74 20 6e 43 6f 6c 20 3d 20 70 2d 3e 70 45 4c 69  t nCol = p->pELi
14480 73 74 2d 3e 6e 45 78 70 72 3b 20 20 2f 2a 20 4e  st->nExpr;  /* N
14490 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73  umber of columns
144a0 20 69 6e 20 74 68 65 20 72 65 63 75 72 73 69 76   in the recursiv
144b0 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 56 64 62  e table */.  Vdb
144c0 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
144d0 56 64 62 65 3b 20 20 20 20 20 20 2f 2a 20 54 68  Vdbe;      /* Th
144e0 65 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65  e prepared state
144f0 6d 65 6e 74 20 75 6e 64 65 72 20 63 6f 6e 73 74  ment under const
14500 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 53 65 6c  ruction */.  Sel
14510 65 63 74 20 2a 70 53 65 74 75 70 20 3d 20 70 2d  ect *pSetup = p-
14520 3e 70 50 72 69 6f 72 3b 20 20 20 2f 2a 20 54 68  >pPrior;   /* Th
14530 65 20 73 65 74 75 70 20 71 75 65 72 79 20 2a 2f  e setup query */
14540 0a 20 20 69 6e 74 20 61 64 64 72 54 6f 70 3b 20  .  int addrTop; 
14550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14560 20 2f 2a 20 54 6f 70 20 6f 66 20 74 68 65 20 6c   /* Top of the l
14570 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64  oop */.  int add
14580 72 43 6f 6e 74 2c 20 61 64 64 72 42 72 65 61 6b  rCont, addrBreak
14590 3b 20 20 20 20 20 20 2f 2a 20 43 4f 4e 54 49 4e  ;      /* CONTIN
145a0 55 45 20 61 6e 64 20 42 52 45 41 4b 20 61 64 64  UE and BREAK add
145b0 72 65 73 73 65 73 20 2a 2f 0a 20 20 69 6e 74 20  resses */.  int 
145c0 69 43 75 72 72 65 6e 74 20 3d 20 30 3b 20 20 20  iCurrent = 0;   
145d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
145e0 20 43 75 72 72 65 6e 74 20 74 61 62 6c 65 20 2a   Current table *
145f0 2f 0a 20 20 69 6e 74 20 72 65 67 43 75 72 72 65  /.  int regCurre
14600 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  nt;             
14610 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 68 6f    /* Register ho
14620 6c 64 69 6e 67 20 43 75 72 72 65 6e 74 20 74 61  lding Current ta
14630 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 51 75  ble */.  int iQu
14640 65 75 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  eue;            
14650 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 51 75         /* The Qu
14660 65 75 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69  eue table */.  i
14670 6e 74 20 69 44 69 73 74 69 6e 63 74 20 3d 20 30  nt iDistinct = 0
14680 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
14690 54 6f 20 65 6e 73 75 72 65 20 75 6e 69 71 75 65  To ensure unique
146a0 20 72 65 73 75 6c 74 73 20 69 66 20 55 4e 49 4f   results if UNIO
146b0 4e 20 2a 2f 0a 20 20 69 6e 74 20 65 44 65 73 74  N */.  int eDest
146c0 20 3d 20 53 52 54 5f 46 69 66 6f 3b 20 20 20 20   = SRT_Fifo;    
146d0 20 20 20 20 20 2f 2a 20 48 6f 77 20 74 6f 20 77       /* How to w
146e0 72 69 74 65 20 74 6f 20 51 75 65 75 65 20 2a 2f  rite to Queue */
146f0 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 64 65  .  SelectDest de
14700 73 74 51 75 65 75 65 3b 20 20 20 20 20 20 20 20  stQueue;        
14710 20 2f 2a 20 53 65 6c 65 63 74 44 65 73 74 20 74   /* SelectDest t
14720 61 72 67 65 74 74 69 6e 67 20 74 68 65 20 51 75  argetting the Qu
14730 65 75 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69  eue table */.  i
14740 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20  nt i;           
14750 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
14760 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  Loop counter */.
14770 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
14780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14790 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20 2a  /* Result code *
147a0 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f  /.  ExprList *pO
147b0 72 64 65 72 42 79 3b 20 20 20 20 20 20 20 20 20  rderBy;         
147c0 20 20 2f 2a 20 54 68 65 20 4f 52 44 45 52 20 42    /* The ORDER B
147d0 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45 78  Y clause */.  Ex
147e0 70 72 20 2a 70 4c 69 6d 69 74 3b 20 20 20 20 20  pr *pLimit;     
147f0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
14800 61 76 65 64 20 4c 49 4d 49 54 20 61 6e 64 20 4f  aved LIMIT and O
14810 46 46 53 45 54 20 2a 2f 0a 20 20 69 6e 74 20 72  FFSET */.  int r
14820 65 67 4c 69 6d 69 74 2c 20 72 65 67 4f 66 66 73  egLimit, regOffs
14830 65 74 3b 20 20 20 20 20 20 2f 2a 20 52 65 67 69  et;      /* Regi
14840 73 74 65 72 73 20 75 73 65 64 20 62 79 20 4c 49  sters used by LI
14850 4d 49 54 20 61 6e 64 20 4f 46 46 53 45 54 20 2a  MIT and OFFSET *
14860 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  /..#ifndef SQLIT
14870 45 5f 4f 4d 49 54 5f 57 49 4e 44 4f 57 46 55 4e  E_OMIT_WINDOWFUN
14880 43 0a 20 20 69 66 28 20 70 2d 3e 70 57 69 6e 20  C.  if( p->pWin 
14890 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
148a0 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
148b0 63 61 6e 6e 6f 74 20 75 73 65 20 77 69 6e 64 6f  cannot use windo
148c0 77 20 66 75 6e 63 74 69 6f 6e 73 20 69 6e 20 72  w functions in r
148d0 65 63 75 72 73 69 76 65 20 71 75 65 72 69 65 73  ecursive queries
148e0 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a  ");.    return;.
148f0 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a    }.#endif..  /*
14900 20 4f 62 74 61 69 6e 20 61 75 74 68 6f 72 69 7a   Obtain authoriz
14910 61 74 69 6f 6e 20 74 6f 20 64 6f 20 61 20 72 65  ation to do a re
14920 63 75 72 73 69 76 65 20 71 75 65 72 79 20 2a 2f  cursive query */
14930 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75  .  if( sqlite3Au
14940 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20  thCheck(pParse, 
14950 53 51 4c 49 54 45 5f 52 45 43 55 52 53 49 56 45  SQLITE_RECURSIVE
14960 2c 20 30 2c 20 30 2c 20 30 29 20 29 20 72 65 74  , 0, 0, 0) ) ret
14970 75 72 6e 3b 0a 0a 20 20 2f 2a 20 50 72 6f 63 65  urn;..  /* Proce
14980 73 73 20 74 68 65 20 4c 49 4d 49 54 20 61 6e 64  ss the LIMIT and
14990 20 4f 46 46 53 45 54 20 63 6c 61 75 73 65 73 2c   OFFSET clauses,
149a0 20 69 66 20 74 68 65 79 20 65 78 69 73 74 20 2a   if they exist *
149b0 2f 0a 20 20 61 64 64 72 42 72 65 61 6b 20 3d 20  /.  addrBreak = 
149c0 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
149d0 61 62 65 6c 28 70 50 61 72 73 65 29 3b 0a 20 20  abel(pParse);.  
149e0 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20  p->nSelectRow = 
149f0 33 32 30 3b 20 20 2f 2a 20 34 20 62 69 6c 6c 69  320;  /* 4 billi
14a00 6f 6e 20 72 6f 77 73 20 2a 2f 0a 20 20 63 6f 6d  on rows */.  com
14a10 70 75 74 65 4c 69 6d 69 74 52 65 67 69 73 74 65  puteLimitRegiste
14a20 72 73 28 70 50 61 72 73 65 2c 20 70 2c 20 61 64  rs(pParse, p, ad
14a30 64 72 42 72 65 61 6b 29 3b 0a 20 20 70 4c 69 6d  drBreak);.  pLim
14a40 69 74 20 3d 20 70 2d 3e 70 4c 69 6d 69 74 3b 0a  it = p->pLimit;.
14a50 20 20 72 65 67 4c 69 6d 69 74 20 3d 20 70 2d 3e    regLimit = p->
14a60 69 4c 69 6d 69 74 3b 0a 20 20 72 65 67 4f 66 66  iLimit;.  regOff
14a70 73 65 74 20 3d 20 70 2d 3e 69 4f 66 66 73 65 74  set = p->iOffset
14a80 3b 0a 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20  ;.  p->pLimit = 
14a90 30 3b 0a 20 20 70 2d 3e 69 4c 69 6d 69 74 20 3d  0;.  p->iLimit =
14aa0 20 70 2d 3e 69 4f 66 66 73 65 74 20 3d 20 30 3b   p->iOffset = 0;
14ab0 0a 20 20 70 4f 72 64 65 72 42 79 20 3d 20 70 2d  .  pOrderBy = p-
14ac0 3e 70 4f 72 64 65 72 42 79 3b 0a 0a 20 20 2f 2a  >pOrderBy;..  /*
14ad0 20 4c 6f 63 61 74 65 20 74 68 65 20 63 75 72 73   Locate the curs
14ae0 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65  or number of the
14af0 20 43 75 72 72 65 6e 74 20 74 61 62 6c 65 20 2a   Current table *
14b00 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 41 4c 57  /.  for(i=0; ALW
14b10 41 59 53 28 69 3c 70 53 72 63 2d 3e 6e 53 72 63  AYS(i<pSrc->nSrc
14b20 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  ); i++){.    if(
14b30 20 70 53 72 63 2d 3e 61 5b 69 5d 2e 66 67 2e 69   pSrc->a[i].fg.i
14b40 73 52 65 63 75 72 73 69 76 65 20 29 7b 0a 20 20  sRecursive ){.  
14b50 20 20 20 20 69 43 75 72 72 65 6e 74 20 3d 20 70      iCurrent = p
14b60 53 72 63 2d 3e 61 5b 69 5d 2e 69 43 75 72 73 6f  Src->a[i].iCurso
14b70 72 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  r;.      break;.
14b80 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
14b90 41 6c 6c 6f 63 61 74 65 20 63 75 72 73 6f 72 73  Allocate cursors
14ba0 20 6e 75 6d 62 65 72 73 20 66 6f 72 20 51 75 65   numbers for Que
14bb0 75 65 20 61 6e 64 20 44 69 73 74 69 6e 63 74 2e  ue and Distinct.
14bc0 20 20 54 68 65 20 63 75 72 73 6f 72 20 6e 75 6d    The cursor num
14bd0 62 65 72 20 66 6f 72 0a 20 20 2a 2a 20 74 68 65  ber for.  ** the
14be0 20 44 69 73 74 69 6e 63 74 20 74 61 62 6c 65 20   Distinct table 
14bf0 6d 75 73 74 20 62 65 20 65 78 61 63 74 6c 79 20  must be exactly 
14c00 6f 6e 65 20 67 72 65 61 74 65 72 20 74 68 61 6e  one greater than
14c10 20 51 75 65 75 65 20 69 6e 20 6f 72 64 65 72 0a   Queue in order.
14c20 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 53 52 54    ** for the SRT
14c30 5f 44 69 73 74 46 69 66 6f 20 61 6e 64 20 53 52  _DistFifo and SR
14c40 54 5f 44 69 73 74 51 75 65 75 65 20 64 65 73 74  T_DistQueue dest
14c50 69 6e 61 74 69 6f 6e 73 20 74 6f 20 77 6f 72 6b  inations to work
14c60 2e 20 2a 2f 0a 20 20 69 51 75 65 75 65 20 3d 20  . */.  iQueue = 
14c70 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a  pParse->nTab++;.
14c80 20 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f    if( p->op==TK_
14c90 55 4e 49 4f 4e 20 29 7b 0a 20 20 20 20 65 44 65  UNION ){.    eDe
14ca0 73 74 20 3d 20 70 4f 72 64 65 72 42 79 20 3f 20  st = pOrderBy ? 
14cb0 53 52 54 5f 44 69 73 74 51 75 65 75 65 20 3a 20  SRT_DistQueue : 
14cc0 53 52 54 5f 44 69 73 74 46 69 66 6f 3b 0a 20 20  SRT_DistFifo;.  
14cd0 20 20 69 44 69 73 74 69 6e 63 74 20 3d 20 70 50    iDistinct = pP
14ce0 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20  arse->nTab++;.  
14cf0 7d 65 6c 73 65 7b 0a 20 20 20 20 65 44 65 73 74  }else{.    eDest
14d00 20 3d 20 70 4f 72 64 65 72 42 79 20 3f 20 53 52   = pOrderBy ? SR
14d10 54 5f 51 75 65 75 65 20 3a 20 53 52 54 5f 46 69  T_Queue : SRT_Fi
14d20 66 6f 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  fo;.  }.  sqlite
14d30 33 53 65 6c 65 63 74 44 65 73 74 49 6e 69 74 28  3SelectDestInit(
14d40 26 64 65 73 74 51 75 65 75 65 2c 20 65 44 65 73  &destQueue, eDes
14d50 74 2c 20 69 51 75 65 75 65 29 3b 0a 0a 20 20 2f  t, iQueue);..  /
14d60 2a 20 41 6c 6c 6f 63 61 74 65 20 63 75 72 73 6f  * Allocate curso
14d70 72 73 20 66 6f 72 20 43 75 72 72 65 6e 74 2c 20  rs for Current, 
14d80 51 75 65 75 65 2c 20 61 6e 64 20 44 69 73 74 69  Queue, and Disti
14d90 6e 63 74 2e 20 2a 2f 0a 20 20 72 65 67 43 75 72  nct. */.  regCur
14da0 72 65 6e 74 20 3d 20 2b 2b 70 50 61 72 73 65 2d  rent = ++pParse-
14db0 3e 6e 4d 65 6d 3b 0a 20 20 73 71 6c 69 74 65 33  >nMem;.  sqlite3
14dc0 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
14dd0 5f 4f 70 65 6e 50 73 65 75 64 6f 2c 20 69 43 75  _OpenPseudo, iCu
14de0 72 72 65 6e 74 2c 20 72 65 67 43 75 72 72 65 6e  rrent, regCurren
14df0 74 2c 20 6e 43 6f 6c 29 3b 0a 20 20 69 66 28 20  t, nCol);.  if( 
14e00 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20  pOrderBy ){.    
14e10 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66  KeyInfo *pKeyInf
14e20 6f 20 3d 20 6d 75 6c 74 69 53 65 6c 65 63 74 4f  o = multiSelectO
14e30 72 64 65 72 42 79 4b 65 79 49 6e 66 6f 28 70 50  rderByKeyInfo(pP
14e40 61 72 73 65 2c 20 70 2c 20 31 29 3b 0a 20 20 20  arse, p, 1);.   
14e50 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
14e60 70 34 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68  p4(v, OP_OpenEph
14e70 65 6d 65 72 61 6c 2c 20 69 51 75 65 75 65 2c 20  emeral, iQueue, 
14e80 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 2b  pOrderBy->nExpr+
14e90 32 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20  2, 0,.          
14ea0 20 20 20 20 20 20 20 20 20 20 20 20 28 63 68 61              (cha
14eb0 72 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50 34 5f  r*)pKeyInfo, P4_
14ec0 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 20 20 64 65  KEYINFO);.    de
14ed0 73 74 51 75 65 75 65 2e 70 4f 72 64 65 72 42 79  stQueue.pOrderBy
14ee0 20 3d 20 70 4f 72 64 65 72 42 79 3b 0a 20 20 7d   = pOrderBy;.  }
14ef0 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65  else{.    sqlite
14f00 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
14f10 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c  P_OpenEphemeral,
14f20 20 69 51 75 65 75 65 2c 20 6e 43 6f 6c 29 3b 0a   iQueue, nCol);.
14f30 20 20 7d 0a 20 20 56 64 62 65 43 6f 6d 6d 65 6e    }.  VdbeCommen
14f40 74 28 28 76 2c 20 22 51 75 65 75 65 20 74 61 62  t((v, "Queue tab
14f50 6c 65 22 29 29 3b 0a 20 20 69 66 28 20 69 44 69  le"));.  if( iDi
14f60 73 74 69 6e 63 74 20 29 7b 0a 20 20 20 20 70 2d  stinct ){.    p-
14f70 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 30 5d  >addrOpenEphm[0]
14f80 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
14f90 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45  dOp2(v, OP_OpenE
14fa0 70 68 65 6d 65 72 61 6c 2c 20 69 44 69 73 74 69  phemeral, iDisti
14fb0 6e 63 74 2c 20 30 29 3b 0a 20 20 20 20 70 2d 3e  nct, 0);.    p->
14fc0 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f 55  selFlags |= SF_U
14fd0 73 65 73 45 70 68 65 6d 65 72 61 6c 3b 0a 20 20  sesEphemeral;.  
14fe0 7d 0a 0a 20 20 2f 2a 20 44 65 74 61 63 68 20 74  }..  /* Detach t
14ff0 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
15000 73 65 20 66 72 6f 6d 20 74 68 65 20 63 6f 6d 70  se from the comp
15010 6f 75 6e 64 20 53 45 4c 45 43 54 20 2a 2f 0a 20  ound SELECT */. 
15020 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 30   p->pOrderBy = 0
15030 3b 0a 0a 20 20 2f 2a 20 53 74 6f 72 65 20 74 68  ;..  /* Store th
15040 65 20 72 65 73 75 6c 74 73 20 6f 66 20 74 68 65  e results of the
15050 20 73 65 74 75 70 2d 71 75 65 72 79 20 69 6e 20   setup-query in 
15060 51 75 65 75 65 2e 20 2a 2f 0a 20 20 70 53 65 74  Queue. */.  pSet
15070 75 70 2d 3e 70 4e 65 78 74 20 3d 20 30 3b 0a 20  up->pNext = 0;. 
15080 20 45 78 70 6c 61 69 6e 51 75 65 72 79 50 6c 61   ExplainQueryPla
15090 6e 28 28 70 50 61 72 73 65 2c 20 31 2c 20 22 53  n((pParse, 1, "S
150a0 45 54 55 50 22 29 29 3b 0a 20 20 72 63 20 3d 20  ETUP"));.  rc = 
150b0 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50  sqlite3Select(pP
150c0 61 72 73 65 2c 20 70 53 65 74 75 70 2c 20 26 64  arse, pSetup, &d
150d0 65 73 74 51 75 65 75 65 29 3b 0a 20 20 70 53 65  estQueue);.  pSe
150e0 74 75 70 2d 3e 70 4e 65 78 74 20 3d 20 70 3b 0a  tup->pNext = p;.
150f0 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20    if( rc ) goto 
15100 65 6e 64 5f 6f 66 5f 72 65 63 75 72 73 69 76 65  end_of_recursive
15110 5f 71 75 65 72 79 3b 0a 0a 20 20 2f 2a 20 46 69  _query;..  /* Fi
15120 6e 64 20 74 68 65 20 6e 65 78 74 20 72 6f 77 20  nd the next row 
15130 69 6e 20 74 68 65 20 51 75 65 75 65 20 61 6e 64  in the Queue and
15140 20 6f 75 74 70 75 74 20 74 68 61 74 20 72 6f 77   output that row
15150 20 2a 2f 0a 20 20 61 64 64 72 54 6f 70 20 3d 20   */.  addrTop = 
15160 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
15170 32 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20  2(v, OP_Rewind, 
15180 69 51 75 65 75 65 2c 20 61 64 64 72 42 72 65 61  iQueue, addrBrea
15190 6b 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  k); VdbeCoverage
151a0 28 76 29 3b 0a 0a 20 20 2f 2a 20 54 72 61 6e 73  (v);..  /* Trans
151b0 66 65 72 20 74 68 65 20 6e 65 78 74 20 72 6f 77  fer the next row
151c0 20 69 6e 20 51 75 65 75 65 20 6f 76 65 72 20 74   in Queue over t
151d0 6f 20 43 75 72 72 65 6e 74 20 2a 2f 0a 20 20 73  o Current */.  s
151e0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
151f0 28 76 2c 20 4f 50 5f 4e 75 6c 6c 52 6f 77 2c 20  (v, OP_NullRow, 
15200 69 43 75 72 72 65 6e 74 29 3b 20 2f 2a 20 54 6f  iCurrent); /* To
15210 20 72 65 73 65 74 20 63 6f 6c 75 6d 6e 20 63 61   reset column ca
15220 63 68 65 20 2a 2f 0a 20 20 69 66 28 20 70 4f 72  che */.  if( pOr
15230 64 65 72 42 79 20 29 7b 0a 20 20 20 20 73 71 6c  derBy ){.    sql
15240 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
15250 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69 51 75  , OP_Column, iQu
15260 65 75 65 2c 20 70 4f 72 64 65 72 42 79 2d 3e 6e  eue, pOrderBy->n
15270 45 78 70 72 2b 31 2c 20 72 65 67 43 75 72 72 65  Expr+1, regCurre
15280 6e 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  nt);.  }else{.  
15290 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
152a0 4f 70 32 28 76 2c 20 4f 50 5f 52 6f 77 44 61 74  Op2(v, OP_RowDat
152b0 61 2c 20 69 51 75 65 75 65 2c 20 72 65 67 43 75  a, iQueue, regCu
152c0 72 72 65 6e 74 29 3b 0a 20 20 7d 0a 20 20 73 71  rrent);.  }.  sq
152d0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
152e0 76 2c 20 4f 50 5f 44 65 6c 65 74 65 2c 20 69 51  v, OP_Delete, iQ
152f0 75 65 75 65 29 3b 0a 0a 20 20 2f 2a 20 4f 75 74  ueue);..  /* Out
15300 70 75 74 20 74 68 65 20 73 69 6e 67 6c 65 20 72  put the single r
15310 6f 77 20 69 6e 20 43 75 72 72 65 6e 74 20 2a 2f  ow in Current */
15320 0a 20 20 61 64 64 72 43 6f 6e 74 20 3d 20 73 71  .  addrCont = sq
15330 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
15340 65 6c 28 70 50 61 72 73 65 29 3b 0a 20 20 63 6f  el(pParse);.  co
15350 64 65 4f 66 66 73 65 74 28 76 2c 20 72 65 67 4f  deOffset(v, regO
15360 66 66 73 65 74 2c 20 61 64 64 72 43 6f 6e 74 29  ffset, addrCont)
15370 3b 0a 20 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c  ;.  selectInnerL
15380 6f 6f 70 28 70 50 61 72 73 65 2c 20 70 2c 20 69  oop(pParse, p, i
15390 43 75 72 72 65 6e 74 2c 0a 20 20 20 20 20 20 30  Current,.      0
153a0 2c 20 30 2c 20 70 44 65 73 74 2c 20 61 64 64 72  , 0, pDest, addr
153b0 43 6f 6e 74 2c 20 61 64 64 72 42 72 65 61 6b 29  Cont, addrBreak)
153c0 3b 0a 20 20 69 66 28 20 72 65 67 4c 69 6d 69 74  ;.  if( regLimit
153d0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
153e0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
153f0 44 65 63 72 4a 75 6d 70 5a 65 72 6f 2c 20 72 65  DecrJumpZero, re
15400 67 4c 69 6d 69 74 2c 20 61 64 64 72 42 72 65 61  gLimit, addrBrea
15410 6b 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 76 65  k);.    VdbeCove
15420 72 61 67 65 28 76 29 3b 0a 20 20 7d 0a 20 20 73  rage(v);.  }.  s
15430 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
15440 65 4c 61 62 65 6c 28 76 2c 20 61 64 64 72 43 6f  eLabel(v, addrCo
15450 6e 74 29 3b 0a 0a 20 20 2f 2a 20 45 78 65 63 75  nt);..  /* Execu
15460 74 65 20 74 68 65 20 72 65 63 75 72 73 69 76 65  te the recursive
15470 20 53 45 4c 45 43 54 20 74 61 6b 69 6e 67 20 74   SELECT taking t
15480 68 65 20 73 69 6e 67 6c 65 20 72 6f 77 20 69 6e  he single row in
15490 20 43 75 72 72 65 6e 74 20 61 73 0a 20 20 2a 2a   Current as.  **
154a0 20 74 68 65 20 76 61 6c 75 65 20 66 6f 72 20 74   the value for t
154b0 68 65 20 72 65 63 75 72 73 69 76 65 2d 74 61 62  he recursive-tab
154c0 6c 65 2e 20 53 74 6f 72 65 20 74 68 65 20 72 65  le. Store the re
154d0 73 75 6c 74 73 20 69 6e 20 74 68 65 20 51 75 65  sults in the Que
154e0 75 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  ue..  */.  if( p
154f0 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f  ->selFlags & SF_
15500 41 67 67 72 65 67 61 74 65 20 29 7b 0a 20 20 20  Aggregate ){.   
15510 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
15520 28 70 50 61 72 73 65 2c 20 22 72 65 63 75 72 73  (pParse, "recurs
15530 69 76 65 20 61 67 67 72 65 67 61 74 65 20 71 75  ive aggregate qu
15540 65 72 69 65 73 20 6e 6f 74 20 73 75 70 70 6f 72  eries not suppor
15550 74 65 64 22 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ted");.  }else{.
15560 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20      p->pPrior = 
15570 30 3b 0a 20 20 20 20 45 78 70 6c 61 69 6e 51 75  0;.    ExplainQu
15580 65 72 79 50 6c 61 6e 28 28 70 50 61 72 73 65 2c  eryPlan((pParse,
15590 20 31 2c 20 22 52 45 43 55 52 53 49 56 45 20 53   1, "RECURSIVE S
155a0 54 45 50 22 29 29 3b 0a 20 20 20 20 73 71 6c 69  TEP"));.    sqli
155b0 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65  te3Select(pParse
155c0 2c 20 70 2c 20 26 64 65 73 74 51 75 65 75 65 29  , p, &destQueue)
155d0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  ;.    assert( p-
155e0 3e 70 50 72 69 6f 72 3d 3d 30 20 29 3b 0a 20 20  >pPrior==0 );.  
155f0 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70 53    p->pPrior = pS
15600 65 74 75 70 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  etup;.  }..  /* 
15610 4b 65 65 70 20 72 75 6e 6e 69 6e 67 20 74 68 65  Keep running the
15620 20 6c 6f 6f 70 20 75 6e 74 69 6c 20 74 68 65 20   loop until the 
15630 51 75 65 75 65 20 69 73 20 65 6d 70 74 79 20 2a  Queue is empty *
15640 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 47  /.  sqlite3VdbeG
15650 6f 74 6f 28 76 2c 20 61 64 64 72 54 6f 70 29 3b  oto(v, addrTop);
15660 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65  .  sqlite3VdbeRe
15670 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61 64  solveLabel(v, ad
15680 64 72 42 72 65 61 6b 29 3b 0a 0a 65 6e 64 5f 6f  drBreak);..end_o
15690 66 5f 72 65 63 75 72 73 69 76 65 5f 71 75 65 72  f_recursive_quer
156a0 79 3a 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72  y:.  sqlite3Expr
156b0 4c 69 73 74 44 65 6c 65 74 65 28 70 50 61 72 73  ListDelete(pPars
156c0 65 2d 3e 64 62 2c 20 70 2d 3e 70 4f 72 64 65 72  e->db, p->pOrder
156d0 42 79 29 3b 0a 20 20 70 2d 3e 70 4f 72 64 65 72  By);.  p->pOrder
156e0 42 79 20 3d 20 70 4f 72 64 65 72 42 79 3b 0a 20  By = pOrderBy;. 
156f0 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 70 4c 69   p->pLimit = pLi
15700 6d 69 74 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d  mit;.  return;.}
15710 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
15720 45 5f 4f 4d 49 54 5f 43 54 45 20 2a 2f 0a 0a 2f  E_OMIT_CTE */../
15730 2a 20 46 6f 72 77 61 72 64 20 72 65 66 65 72 65  * Forward refere
15740 6e 63 65 73 20 2a 2f 0a 73 74 61 74 69 63 20 69  nces */.static i
15750 6e 74 20 6d 75 6c 74 69 53 65 6c 65 63 74 4f 72  nt multiSelectOr
15760 64 65 72 42 79 28 0a 20 20 50 61 72 73 65 20 2a  derBy(.  Parse *
15770 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 2f  pParse,        /
15780 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
15790 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70  t */.  Select *p
157a0 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
157b0 54 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 6f  The right-most o
157c0 66 20 53 45 4c 45 43 54 73 20 74 6f 20 62 65 20  f SELECTs to be 
157d0 63 6f 64 65 64 20 2a 2f 0a 20 20 53 65 6c 65 63  coded */.  Selec
157e0 74 44 65 73 74 20 2a 70 44 65 73 74 20 20 20 20  tDest *pDest    
157f0 20 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f 20 77   /* What to do w
15800 69 74 68 20 71 75 65 72 79 20 72 65 73 75 6c 74  ith query result
15810 73 20 2a 2f 0a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 48  s */.);../*.** H
15820 61 6e 64 6c 65 20 74 68 65 20 73 70 65 63 69 61  andle the specia
15830 6c 20 63 61 73 65 20 6f 66 20 61 20 63 6f 6d 70  l case of a comp
15840 6f 75 6e 64 2d 73 65 6c 65 63 74 20 74 68 61 74  ound-select that
15850 20 6f 72 69 67 69 6e 61 74 65 73 20 66 72 6f 6d   originates from
15860 20 61 0a 2a 2a 20 56 41 4c 55 45 53 20 63 6c 61   a.** VALUES cla
15870 75 73 65 2e 20 20 42 79 20 68 61 6e 64 6c 69 6e  use.  By handlin
15880 67 20 74 68 69 73 20 61 73 20 61 20 73 70 65 63  g this as a spec
15890 69 61 6c 20 63 61 73 65 2c 20 77 65 20 61 76 6f  ial case, we avo
158a0 69 64 20 64 65 65 70 0a 2a 2a 20 72 65 63 75 72  id deep.** recur
158b0 73 69 6f 6e 2c 20 61 6e 64 20 74 68 75 73 20 64  sion, and thus d
158c0 6f 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 65 6e  o not need to en
158d0 66 6f 72 63 65 20 74 68 65 20 53 51 4c 49 54 45  force the SQLITE
158e0 5f 4c 49 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f  _LIMIT_COMPOUND_
158f0 53 45 4c 45 43 54 0a 2a 2a 20 6f 6e 20 61 20 56  SELECT.** on a V
15900 41 4c 55 45 53 20 63 6c 61 75 73 65 2e 0a 2a 2a  ALUES clause..**
15910 0a 2a 2a 20 42 65 63 61 75 73 65 20 74 68 65 20  .** Because the 
15920 53 65 6c 65 63 74 20 6f 62 6a 65 63 74 20 6f 72  Select object or
15930 69 67 69 6e 61 74 65 73 20 66 72 6f 6d 20 61 20  iginates from a 
15940 56 41 4c 55 45 53 20 63 6c 61 75 73 65 3a 0a 2a  VALUES clause:.*
15950 2a 20 20 20 28 31 29 20 54 68 65 72 65 20 69 73  *   (1) There is
15960 20 6e 6f 20 4c 49 4d 49 54 20 6f 72 20 4f 46 46   no LIMIT or OFF
15970 53 45 54 20 6f 72 20 65 6c 73 65 20 74 68 65 72  SET or else ther
15980 65 20 69 73 20 61 20 4c 49 4d 49 54 20 6f 66 20  e is a LIMIT of 
15990 65 78 61 63 74 6c 79 20 31 0a 2a 2a 20 20 20 28  exactly 1.**   (
159a0 32 29 20 41 6c 6c 20 74 65 72 6d 73 20 61 72 65  2) All terms are
159b0 20 55 4e 49 4f 4e 20 41 4c 4c 0a 2a 2a 20 20 20   UNION ALL.**   
159c0 28 33 29 20 54 68 65 72 65 20 69 73 20 6e 6f 20  (3) There is no 
159d0 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 0a  ORDER BY clause.
159e0 2a 2a 0a 2a 2a 20 54 68 65 20 22 4c 49 4d 49 54  **.** The "LIMIT
159f0 20 6f 66 20 65 78 61 63 74 6c 79 20 31 22 20 63   of exactly 1" c
15a00 61 73 65 20 6f 66 20 63 6f 6e 64 69 74 69 6f 6e  ase of condition
15a10 20 28 31 29 20 63 6f 6d 65 73 20 61 62 6f 75 74   (1) comes about
15a20 20 77 68 65 6e 20 61 20 56 41 4c 55 45 53 0a 2a   when a VALUES.*
15a30 2a 20 63 6c 61 75 73 65 20 6f 63 63 75 72 73 20  * clause occurs 
15a40 77 69 74 68 69 6e 20 73 63 61 6c 61 72 20 65 78  within scalar ex
15a50 70 72 65 73 73 69 6f 6e 20 28 65 78 3a 20 22 53  pression (ex: "S
15a60 45 4c 45 43 54 20 28 56 41 4c 55 45 53 28 31 29  ELECT (VALUES(1)
15a70 2c 28 32 29 2c 28 33 29 29 22 29 2e 0a 2a 2a 20  ,(2),(3))")..** 
15a80 54 68 65 20 73 71 6c 69 74 65 33 43 6f 64 65 53  The sqlite3CodeS
15a90 75 62 73 65 6c 65 63 74 20 77 69 6c 6c 20 68 61  ubselect will ha
15aa0 76 65 20 61 64 64 65 64 20 74 68 65 20 4c 49 4d  ve added the LIM
15ab0 49 54 20 31 20 63 6c 61 75 73 65 20 69 6e 20 74  IT 1 clause in t
15ac0 68 74 20 63 61 73 65 2e 0a 2a 2a 20 53 69 6e 63  ht case..** Sinc
15ad0 65 20 74 68 65 20 6c 69 6d 69 74 20 69 73 20 65  e the limit is e
15ae0 78 61 63 74 6c 79 20 31 2c 20 77 65 20 6f 6e 6c  xactly 1, we onl
15af0 79 20 6e 65 65 64 20 74 6f 20 65 76 61 6c 75 74  y need to evalut
15b00 65 73 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74  es the left-most
15b10 20 56 41 4c 55 45 53 2e 0a 2a 2f 0a 73 74 61 74   VALUES..*/.stat
15b20 69 63 20 69 6e 74 20 6d 75 6c 74 69 53 65 6c 65  ic int multiSele
15b30 63 74 56 61 6c 75 65 73 28 0a 20 20 50 61 72 73  ctValues(.  Pars
15b40 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
15b50 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
15b60 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74  text */.  Select
15b70 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
15b80 2f 2a 20 54 68 65 20 72 69 67 68 74 2d 6d 6f 73  /* The right-mos
15b90 74 20 6f 66 20 53 45 4c 45 43 54 73 20 74 6f 20  t of SELECTs to 
15ba0 62 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20 53 65  be coded */.  Se
15bb0 6c 65 63 74 44 65 73 74 20 2a 70 44 65 73 74 20  lectDest *pDest 
15bc0 20 20 20 20 2f 2a 20 57 68 61 74 20 74 6f 20 64      /* What to d
15bd0 6f 20 77 69 74 68 20 71 75 65 72 79 20 72 65 73  o with query res
15be0 75 6c 74 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  ults */.){.  int
15bf0 20 6e 52 6f 77 20 3d 20 31 3b 0a 20 20 69 6e 74   nRow = 1;.  int
15c00 20 72 63 20 3d 20 30 3b 0a 20 20 69 6e 74 20 62   rc = 0;.  int b
15c10 53 68 6f 77 41 6c 6c 20 3d 20 70 2d 3e 70 4c 69  ShowAll = p->pLi
15c20 6d 69 74 3d 3d 30 3b 0a 20 20 61 73 73 65 72 74  mit==0;.  assert
15c30 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20  ( p->selFlags & 
15c40 53 46 5f 4d 75 6c 74 69 56 61 6c 75 65 20 29 3b  SF_MultiValue );
15c50 0a 20 20 64 6f 7b 0a 20 20 20 20 61 73 73 65 72  .  do{.    asser
15c60 74 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26  t( p->selFlags &
15c70 20 53 46 5f 56 61 6c 75 65 73 20 29 3b 0a 20 20   SF_Values );.  
15c80 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6f 70 3d    assert( p->op=
15c90 3d 54 4b 5f 41 4c 4c 20 7c 7c 20 28 70 2d 3e 6f  =TK_ALL || (p->o
15ca0 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 26 26 20  p==TK_SELECT && 
15cb0 70 2d 3e 70 50 72 69 6f 72 3d 3d 30 29 20 29 3b  p->pPrior==0) );
15cc0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
15cd0 70 4e 65 78 74 3d 3d 30 20 7c 7c 20 70 2d 3e 70  pNext==0 || p->p
15ce0 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 70 2d  EList->nExpr==p-
15cf0 3e 70 4e 65 78 74 2d 3e 70 45 4c 69 73 74 2d 3e  >pNext->pEList->
15d00 6e 45 78 70 72 20 29 3b 0a 20 20 20 20 69 66 28  nExpr );.    if(
15d10 20 70 2d 3e 70 50 72 69 6f 72 3d 3d 30 20 29 20   p->pPrior==0 ) 
15d20 62 72 65 61 6b 3b 0a 20 20 20 20 61 73 73 65 72  break;.    asser
15d30 74 28 20 70 2d 3e 70 50 72 69 6f 72 2d 3e 70 4e  t( p->pPrior->pN
15d40 65 78 74 3d 3d 70 20 29 3b 0a 20 20 20 20 70 20  ext==p );.    p 
15d50 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20  = p->pPrior;.   
15d60 20 6e 52 6f 77 20 2b 3d 20 62 53 68 6f 77 41 6c   nRow += bShowAl
15d70 6c 3b 0a 20 20 7d 77 68 69 6c 65 28 31 29 3b 0a  l;.  }while(1);.
15d80 20 20 45 78 70 6c 61 69 6e 51 75 65 72 79 50 6c    ExplainQueryPl
15d90 61 6e 28 28 70 50 61 72 73 65 2c 20 30 2c 20 22  an((pParse, 0, "
15da0 53 43 41 4e 20 25 64 20 43 4f 4e 53 54 41 4e 54  SCAN %d CONSTANT
15db0 20 52 4f 57 25 73 22 2c 20 6e 52 6f 77 2c 0a 20   ROW%s", nRow,. 
15dc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15dd0 20 20 20 6e 52 6f 77 3d 3d 31 20 3f 20 22 22 20     nRow==1 ? "" 
15de0 3a 20 22 53 22 29 29 3b 0a 20 20 77 68 69 6c 65  : "S"));.  while
15df0 28 20 70 20 29 7b 0a 20 20 20 20 73 65 6c 65 63  ( p ){.    selec
15e00 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73  tInnerLoop(pPars
15e10 65 2c 20 70 2c 20 2d 31 2c 20 30 2c 20 30 2c 20  e, p, -1, 0, 0, 
15e20 70 44 65 73 74 2c 20 31 2c 20 31 29 3b 0a 20 20  pDest, 1, 1);.  
15e30 20 20 69 66 28 20 21 62 53 68 6f 77 41 6c 6c 20    if( !bShowAll 
15e40 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 70 2d 3e  ) break;.    p->
15e50 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 6e 52 6f  nSelectRow = nRo
15e60 77 3b 0a 20 20 20 20 70 20 3d 20 70 2d 3e 70 4e  w;.    p = p->pN
15e70 65 78 74 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ext;.  }.  retur
15e80 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  n rc;.}../*.** T
15e90 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
15ea0 61 6c 6c 65 64 20 74 6f 20 70 72 6f 63 65 73 73  alled to process
15eb0 20 61 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72   a compound quer
15ec0 79 20 66 6f 72 6d 20 66 72 6f 6d 0a 2a 2a 20 74  y form from.** t
15ed0 77 6f 20 6f 72 20 6d 6f 72 65 20 73 65 70 61 72  wo or more separ
15ee0 61 74 65 20 71 75 65 72 69 65 73 20 75 73 69 6e  ate queries usin
15ef0 67 20 55 4e 49 4f 4e 2c 20 55 4e 49 4f 4e 20 41  g UNION, UNION A
15f00 4c 4c 2c 20 45 58 43 45 50 54 2c 20 6f 72 0a 2a  LL, EXCEPT, or.*
15f10 2a 20 49 4e 54 45 52 53 45 43 54 0a 2a 2a 0a 2a  * INTERSECT.**.*
15f20 2a 20 22 70 22 20 70 6f 69 6e 74 73 20 74 6f 20  * "p" points to 
15f30 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 6f  the right-most o
15f40 66 20 74 68 65 20 74 77 6f 20 71 75 65 72 69 65  f the two querie
15f50 73 2e 20 20 74 68 65 20 71 75 65 72 79 20 6f 6e  s.  the query on
15f60 20 74 68 65 0a 2a 2a 20 6c 65 66 74 20 69 73 20   the.** left is 
15f70 70 2d 3e 70 50 72 69 6f 72 2e 20 20 54 68 65 20  p->pPrior.  The 
15f80 6c 65 66 74 20 71 75 65 72 79 20 63 6f 75 6c 64  left query could
15f90 20 61 6c 73 6f 20 62 65 20 61 20 63 6f 6d 70 6f   also be a compo
15fa0 75 6e 64 20 71 75 65 72 79 0a 2a 2a 20 69 6e 20  und query.** in 
15fb0 77 68 69 63 68 20 63 61 73 65 20 74 68 69 73 20  which case this 
15fc0 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 62 65 20  routine will be 
15fd0 63 61 6c 6c 65 64 20 72 65 63 75 72 73 69 76 65  called recursive
15fe0 6c 79 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72  ly. .**.** The r
15ff0 65 73 75 6c 74 73 20 6f 66 20 74 68 65 20 74 6f  esults of the to
16000 74 61 6c 20 71 75 65 72 79 20 61 72 65 20 74 6f  tal query are to
16010 20 62 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f   be written into
16020 20 61 20 64 65 73 74 69 6e 61 74 69 6f 6e 0a 2a   a destination.*
16030 2a 20 6f 66 20 74 79 70 65 20 65 44 65 73 74 20  * of type eDest 
16040 77 69 74 68 20 70 61 72 61 6d 65 74 65 72 20 69  with parameter i
16050 50 61 72 6d 2e 0a 2a 2a 0a 2a 2a 20 45 78 61 6d  Parm..**.** Exam
16060 70 6c 65 20 31 3a 20 20 43 6f 6e 73 69 64 65 72  ple 1:  Consider
16070 20 61 20 74 68 72 65 65 2d 77 61 79 20 63 6f 6d   a three-way com
16080 70 6f 75 6e 64 20 53 51 4c 20 73 74 61 74 65 6d  pound SQL statem
16090 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53  ent..**.**     S
160a0 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 74 31 20  ELECT a FROM t1 
160b0 55 4e 49 4f 4e 20 53 45 4c 45 43 54 20 62 20 46  UNION SELECT b F
160c0 52 4f 4d 20 74 32 20 55 4e 49 4f 4e 20 53 45 4c  ROM t2 UNION SEL
160d0 45 43 54 20 63 20 46 52 4f 4d 20 74 33 0a 2a 2a  ECT c FROM t3.**
160e0 0a 2a 2a 20 54 68 69 73 20 73 74 61 74 65 6d 65  .** This stateme
160f0 6e 74 20 69 73 20 70 61 72 73 65 64 20 75 70 20  nt is parsed up 
16100 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a  as follows:.**.*
16110 2a 20 20 20 20 20 53 45 4c 45 43 54 20 63 20 46  *     SELECT c F
16120 52 4f 4d 20 74 33 0a 2a 2a 20 20 20 20 20 20 7c  ROM t3.**      |
16130 0a 2a 2a 20 20 20 20 20 20 60 2d 2d 2d 2d 2d 3e  .**      `----->
16140 20 20 53 45 4c 45 43 54 20 62 20 46 52 4f 4d 20    SELECT b FROM 
16150 74 32 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  t2.**           
16160 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20 20       |.**       
16170 20 20 20 20 20 20 20 20 20 60 2d 2d 2d 2d 2d 2d           `------
16180 3e 20 20 53 45 4c 45 43 54 20 61 20 46 52 4f 4d  >  SELECT a FROM
16190 20 74 31 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 72   t1.**.** The ar
161a0 72 6f 77 73 20 69 6e 20 74 68 65 20 64 69 61 67  rows in the diag
161b0 72 61 6d 20 61 62 6f 76 65 20 72 65 70 72 65 73  ram above repres
161c0 65 6e 74 20 74 68 65 20 53 65 6c 65 63 74 2e 70  ent the Select.p
161d0 50 72 69 6f 72 20 70 6f 69 6e 74 65 72 2e 0a 2a  Prior pointer..*
161e0 2a 20 53 6f 20 69 66 20 74 68 69 73 20 72 6f 75  * So if this rou
161f0 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 77  tine is called w
16200 69 74 68 20 70 20 65 71 75 61 6c 20 74 6f 20 74  ith p equal to t
16210 68 65 20 74 33 20 71 75 65 72 79 2c 20 74 68 65  he t3 query, the
16220 6e 0a 2a 2a 20 70 50 72 69 6f 72 20 77 69 6c 6c  n.** pPrior will
16230 20 62 65 20 74 68 65 20 74 32 20 71 75 65 72 79   be the t2 query
16240 2e 20 20 70 2d 3e 6f 70 20 77 69 6c 6c 20 62 65  .  p->op will be
16250 20 54 4b 5f 55 4e 49 4f 4e 20 69 6e 20 74 68 69   TK_UNION in thi
16260 73 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 4e 6f  s case..**.** No
16270 74 69 63 65 20 74 68 61 74 20 62 65 63 61 75 73  tice that becaus
16280 65 20 6f 66 20 74 68 65 20 77 61 79 20 53 51 4c  e of the way SQL
16290 69 74 65 20 70 61 72 73 65 73 20 63 6f 6d 70 6f  ite parses compo
162a0 75 6e 64 20 53 45 4c 45 43 54 73 2c 20 74 68 65  und SELECTs, the
162b0 0a 2a 2a 20 69 6e 64 69 76 69 64 75 61 6c 20 73  .** individual s
162c0 65 6c 65 63 74 73 20 61 6c 77 61 79 73 20 67 72  elects always gr
162d0 6f 75 70 20 66 72 6f 6d 20 6c 65 66 74 20 74 6f  oup from left to
162e0 20 72 69 67 68 74 2e 0a 2a 2f 0a 73 74 61 74 69   right..*/.stati
162f0 63 20 69 6e 74 20 6d 75 6c 74 69 53 65 6c 65 63  c int multiSelec
16300 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  t(.  Parse *pPar
16310 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 61  se,        /* Pa
16320 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
16330 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20  .  Select *p,   
16340 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
16350 72 69 67 68 74 2d 6d 6f 73 74 20 6f 66 20 53 45  right-most of SE
16360 4c 45 43 54 73 20 74 6f 20 62 65 20 63 6f 64 65  LECTs to be code
16370 64 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73  d */.  SelectDes
16380 74 20 2a 70 44 65 73 74 20 20 20 20 20 2f 2a 20  t *pDest     /* 
16390 57 68 61 74 20 74 6f 20 64 6f 20 77 69 74 68 20  What to do with 
163a0 71 75 65 72 79 20 72 65 73 75 6c 74 73 20 2a 2f  query results */
163b0 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  .){.  int rc = S
163c0 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 2f 2a 20 53  QLITE_OK;   /* S
163d0 75 63 63 65 73 73 20 63 6f 64 65 20 66 72 6f 6d  uccess code from
163e0 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f   a subroutine */
163f0 0a 20 20 53 65 6c 65 63 74 20 2a 70 50 72 69 6f  .  Select *pPrio
16400 72 3b 20 20 20 20 20 20 20 2f 2a 20 41 6e 6f 74  r;       /* Anot
16410 68 65 72 20 53 45 4c 45 43 54 20 69 6d 6d 65 64  her SELECT immed
16420 69 61 74 65 6c 79 20 74 6f 20 6f 75 72 20 6c 65  iately to our le
16430 66 74 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b  ft */.  Vdbe *v;
16440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
16450 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
16460 6f 20 74 68 69 73 20 56 44 42 45 20 2a 2f 0a 20  o this VDBE */. 
16470 20 53 65 6c 65 63 74 44 65 73 74 20 64 65 73 74   SelectDest dest
16480 3b 20 20 20 20 20 20 2f 2a 20 41 6c 74 65 72 6e  ;      /* Altern
16490 61 74 69 76 65 20 64 61 74 61 20 64 65 73 74 69  ative data desti
164a0 6e 61 74 69 6f 6e 20 2a 2f 0a 20 20 53 65 6c 65  nation */.  Sele
164b0 63 74 20 2a 70 44 65 6c 65 74 65 20 3d 20 30 3b  ct *pDelete = 0;
164c0 20 20 2f 2a 20 43 68 61 69 6e 20 6f 66 20 73 69    /* Chain of si
164d0 6d 70 6c 65 20 73 65 6c 65 63 74 73 20 74 6f 20  mple selects to 
164e0 64 65 6c 65 74 65 20 2a 2f 0a 20 20 73 71 6c 69  delete */.  sqli
164f0 74 65 33 20 2a 64 62 3b 20 20 20 20 20 20 20 20  te3 *db;        
16500 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f    /* Database co
16510 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 0a 20 20 2f  nnection */..  /
16520 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 72  * Make sure ther
16530 65 20 69 73 20 6e 6f 20 4f 52 44 45 52 20 42 59  e is no ORDER BY
16540 20 6f 72 20 4c 49 4d 49 54 20 63 6c 61 75 73 65   or LIMIT clause
16550 20 6f 6e 20 70 72 69 6f 72 20 53 45 4c 45 43 54   on prior SELECT
16560 73 2e 20 20 4f 6e 6c 79 0a 20 20 2a 2a 20 74 68  s.  Only.  ** th
16570 65 20 6c 61 73 74 20 28 72 69 67 68 74 2d 6d 6f  e last (right-mo
16580 73 74 29 20 53 45 4c 45 43 54 20 69 6e 20 74 68  st) SELECT in th
16590 65 20 73 65 72 69 65 73 20 6d 61 79 20 68 61 76  e series may hav
165a0 65 20 61 6e 20 4f 52 44 45 52 20 42 59 20 6f 72  e an ORDER BY or
165b0 20 4c 49 4d 49 54 2e 0a 20 20 2a 2f 0a 20 20 61   LIMIT..  */.  a
165c0 73 73 65 72 74 28 20 70 20 26 26 20 70 2d 3e 70  ssert( p && p->p
165d0 50 72 69 6f 72 20 29 3b 20 20 2f 2a 20 43 61 6c  Prior );  /* Cal
165e0 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 67 75  ling function gu
165f0 61 72 61 6e 74 65 65 73 20 74 68 69 73 20 6d 75  arantees this mu
16600 63 68 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  ch */.  assert( 
16610 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53  (p->selFlags & S
16620 46 5f 52 65 63 75 72 73 69 76 65 29 3d 3d 30 20  F_Recursive)==0 
16630 7c 7c 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c  || p->op==TK_ALL
16640 20 7c 7c 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 4e   || p->op==TK_UN
16650 49 4f 4e 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ION );.  assert(
16660 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53   p->selFlags & S
16670 46 5f 43 6f 6d 70 6f 75 6e 64 20 29 3b 0a 20 20  F_Compound );.  
16680 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
16690 0a 20 20 70 50 72 69 6f 72 20 3d 20 70 2d 3e 70  .  pPrior = p->p
166a0 50 72 69 6f 72 3b 0a 20 20 64 65 73 74 20 3d 20  Prior;.  dest = 
166b0 2a 70 44 65 73 74 3b 0a 20 20 69 66 28 20 70 50  *pDest;.  if( pP
166c0 72 69 6f 72 2d 3e 70 4f 72 64 65 72 42 79 20 7c  rior->pOrderBy |
166d0 7c 20 70 50 72 69 6f 72 2d 3e 70 4c 69 6d 69 74  | pPrior->pLimit
166e0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
166f0 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 22  rrorMsg(pParse,"
16700 25 73 20 63 6c 61 75 73 65 20 73 68 6f 75 6c 64  %s clause should
16710 20 63 6f 6d 65 20 61 66 74 65 72 20 25 73 20 6e   come after %s n
16720 6f 74 20 62 65 66 6f 72 65 22 2c 0a 20 20 20 20  ot before",.    
16730 20 20 70 50 72 69 6f 72 2d 3e 70 4f 72 64 65 72    pPrior->pOrder
16740 42 79 21 3d 30 20 3f 20 22 4f 52 44 45 52 20 42  By!=0 ? "ORDER B
16750 59 22 20 3a 20 22 4c 49 4d 49 54 22 2c 20 73 65  Y" : "LIMIT", se
16760 6c 65 63 74 4f 70 4e 61 6d 65 28 70 2d 3e 6f 70  lectOpName(p->op
16770 29 29 3b 0a 20 20 20 20 72 63 20 3d 20 31 3b 0a  ));.    rc = 1;.
16780 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73      goto multi_s
16790 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 0a  elect_end;.  }..
167a0 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74    v = sqlite3Get
167b0 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20  Vdbe(pParse);.  
167c0 61 73 73 65 72 74 28 20 76 21 3d 30 20 29 3b 20  assert( v!=0 ); 
167d0 20 2f 2a 20 54 68 65 20 56 44 42 45 20 61 6c 72   /* The VDBE alr
167e0 65 61 64 79 20 63 72 65 61 74 65 64 20 62 79 20  eady created by 
167f0 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e  calling function
16800 20 2a 2f 0a 0a 20 20 2f 2a 20 43 72 65 61 74 65   */..  /* Create
16810 20 74 68 65 20 64 65 73 74 69 6e 61 74 69 6f 6e   the destination
16820 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
16830 20 69 66 20 6e 65 63 65 73 73 61 72 79 0a 20 20   if necessary.  
16840 2a 2f 0a 20 20 69 66 28 20 64 65 73 74 2e 65 44  */.  if( dest.eD
16850 65 73 74 3d 3d 53 52 54 5f 45 70 68 65 6d 54 61  est==SRT_EphemTa
16860 62 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  b ){.    assert(
16870 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20   p->pEList );.  
16880 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
16890 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70  Op2(v, OP_OpenEp
168a0 68 65 6d 65 72 61 6c 2c 20 64 65 73 74 2e 69 53  hemeral, dest.iS
168b0 44 50 61 72 6d 2c 20 70 2d 3e 70 45 4c 69 73 74  DParm, p->pEList
168c0 2d 3e 6e 45 78 70 72 29 3b 0a 20 20 20 20 64 65  ->nExpr);.    de
168d0 73 74 2e 65 44 65 73 74 20 3d 20 53 52 54 5f 54  st.eDest = SRT_T
168e0 61 62 6c 65 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  able;.  }..  /* 
168f0 53 70 65 63 69 61 6c 20 68 61 6e 64 6c 69 6e 67  Special handling
16900 20 66 6f 72 20 61 20 63 6f 6d 70 6f 75 6e 64 2d   for a compound-
16910 73 65 6c 65 63 74 20 74 68 61 74 20 6f 72 69 67  select that orig
16920 69 6e 61 74 65 73 20 61 73 20 61 20 56 41 4c 55  inates as a VALU
16930 45 53 20 63 6c 61 75 73 65 2e 0a 20 20 2a 2f 0a  ES clause..  */.
16940 20 20 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61 67    if( p->selFlag
16950 73 20 26 20 53 46 5f 4d 75 6c 74 69 56 61 6c 75  s & SF_MultiValu
16960 65 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 6d 75  e ){.    rc = mu
16970 6c 74 69 53 65 6c 65 63 74 56 61 6c 75 65 73 28  ltiSelectValues(
16980 70 50 61 72 73 65 2c 20 70 2c 20 26 64 65 73 74  pParse, p, &dest
16990 29 3b 0a 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74  );.    goto mult
169a0 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  i_select_end;.  
169b0 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72  }..  /* Make sur
169c0 65 20 61 6c 6c 20 53 45 4c 45 43 54 73 20 69 6e  e all SELECTs in
169d0 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 68   the statement h
169e0 61 76 65 20 74 68 65 20 73 61 6d 65 20 6e 75 6d  ave the same num
169f0 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73 0a  ber of elements.
16a00 20 20 2a 2a 20 69 6e 20 74 68 65 69 72 20 72 65    ** in their re
16a10 73 75 6c 74 20 73 65 74 73 2e 0a 20 20 2a 2f 0a  sult sets..  */.
16a20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c    assert( p->pEL
16a30 69 73 74 20 26 26 20 70 50 72 69 6f 72 2d 3e 70  ist && pPrior->p
16a40 45 4c 69 73 74 20 29 3b 0a 20 20 61 73 73 65 72  EList );.  asser
16a50 74 28 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45  t( p->pEList->nE
16a60 78 70 72 3d 3d 70 50 72 69 6f 72 2d 3e 70 45 4c  xpr==pPrior->pEL
16a70 69 73 74 2d 3e 6e 45 78 70 72 20 29 3b 0a 0a 23  ist->nExpr );..#
16a80 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
16a90 49 54 5f 43 54 45 0a 20 20 69 66 28 20 70 2d 3e  IT_CTE.  if( p->
16aa0 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 52 65  selFlags & SF_Re
16ab0 63 75 72 73 69 76 65 20 29 7b 0a 20 20 20 20 67  cursive ){.    g
16ac0 65 6e 65 72 61 74 65 57 69 74 68 52 65 63 75 72  enerateWithRecur
16ad0 73 69 76 65 51 75 65 72 79 28 70 50 61 72 73 65  siveQuery(pParse
16ae0 2c 20 70 2c 20 26 64 65 73 74 29 3b 0a 20 20 7d  , p, &dest);.  }
16af0 65 6c 73 65 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  else.#endif..  /
16b00 2a 20 43 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43  * Compound SELEC
16b10 54 73 20 74 68 61 74 20 68 61 76 65 20 61 6e 20  Ts that have an 
16b20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
16b30 61 72 65 20 68 61 6e 64 6c 65 64 20 73 65 70 61  are handled sepa
16b40 72 61 74 65 6c 79 2e 0a 20 20 2a 2f 0a 20 20 69  rately..  */.  i
16b50 66 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 29  f( p->pOrderBy )
16b60 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 6d 75 6c  {.    return mul
16b70 74 69 53 65 6c 65 63 74 4f 72 64 65 72 42 79 28  tiSelectOrderBy(
16b80 70 50 61 72 73 65 2c 20 70 2c 20 70 44 65 73 74  pParse, p, pDest
16b90 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 0a 23 69 66  );.  }else{..#if
16ba0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
16bb0 5f 45 58 50 4c 41 49 4e 0a 20 20 20 20 69 66 28  _EXPLAIN.    if(
16bc0 20 70 50 72 69 6f 72 2d 3e 70 50 72 69 6f 72 3d   pPrior->pPrior=
16bd0 3d 30 20 29 7b 0a 20 20 20 20 20 20 45 78 70 6c  =0 ){.      Expl
16be0 61 69 6e 51 75 65 72 79 50 6c 61 6e 28 28 70 50  ainQueryPlan((pP
16bf0 61 72 73 65 2c 20 31 2c 20 22 43 4f 4d 50 4f 55  arse, 1, "COMPOU
16c00 4e 44 20 51 55 45 52 59 22 29 29 3b 0a 20 20 20  ND QUERY"));.   
16c10 20 20 20 45 78 70 6c 61 69 6e 51 75 65 72 79 50     ExplainQueryP
16c20 6c 61 6e 28 28 70 50 61 72 73 65 2c 20 31 2c 20  lan((pParse, 1, 
16c30 22 4c 45 46 54 2d 4d 4f 53 54 20 53 55 42 51 55  "LEFT-MOST SUBQU
16c40 45 52 59 22 29 29 3b 0a 20 20 20 20 7d 0a 23 65  ERY"));.    }.#e
16c50 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 47 65 6e  ndif..    /* Gen
16c60 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 74  erate code for t
16c70 68 65 20 6c 65 66 74 20 61 6e 64 20 72 69 67 68  he left and righ
16c80 74 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  t SELECT stateme
16c90 6e 74 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  nts..    */.    
16ca0 73 77 69 74 63 68 28 20 70 2d 3e 6f 70 20 29 7b  switch( p->op ){
16cb0 0a 20 20 20 20 20 20 63 61 73 65 20 54 4b 5f 41  .      case TK_A
16cc0 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 20 20 69 6e  LL: {.        in
16cd0 74 20 61 64 64 72 20 3d 20 30 3b 0a 20 20 20 20  t addr = 0;.    
16ce0 20 20 20 20 69 6e 74 20 6e 4c 69 6d 69 74 3b 0a      int nLimit;.
16cf0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
16d00 21 70 50 72 69 6f 72 2d 3e 70 4c 69 6d 69 74 20  !pPrior->pLimit 
16d10 29 3b 0a 20 20 20 20 20 20 20 20 70 50 72 69 6f  );.        pPrio
16d20 72 2d 3e 69 4c 69 6d 69 74 20 3d 20 70 2d 3e 69  r->iLimit = p->i
16d30 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 20 20 70  Limit;.        p
16d40 50 72 69 6f 72 2d 3e 69 4f 66 66 73 65 74 20 3d  Prior->iOffset =
16d50 20 70 2d 3e 69 4f 66 66 73 65 74 3b 0a 20 20 20   p->iOffset;.   
16d60 20 20 20 20 20 70 50 72 69 6f 72 2d 3e 70 4c 69       pPrior->pLi
16d70 6d 69 74 20 3d 20 70 2d 3e 70 4c 69 6d 69 74 3b  mit = p->pLimit;
16d80 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
16d90 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72  lite3Select(pPar
16da0 73 65 2c 20 70 50 72 69 6f 72 2c 20 26 64 65 73  se, pPrior, &des
16db0 74 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 70  t);.        p->p
16dc0 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20 20  Limit = 0;.     
16dd0 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
16de0 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74         goto mult
16df0 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  i_select_end;.  
16e00 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
16e10 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20  p->pPrior = 0;. 
16e20 20 20 20 20 20 20 20 70 2d 3e 69 4c 69 6d 69 74         p->iLimit
16e30 20 3d 20 70 50 72 69 6f 72 2d 3e 69 4c 69 6d 69   = pPrior->iLimi
16e40 74 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 69 4f  t;.        p->iO
16e50 66 66 73 65 74 20 3d 20 70 50 72 69 6f 72 2d 3e  ffset = pPrior->
16e60 69 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 20  iOffset;.       
16e70 20 69 66 28 20 70 2d 3e 69 4c 69 6d 69 74 20 29   if( p->iLimit )
16e80 7b 0a 20 20 20 20 20 20 20 20 20 20 61 64 64 72  {.          addr
16e90 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
16ea0 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66 4e 6f 74  dOp1(v, OP_IfNot
16eb0 2c 20 70 2d 3e 69 4c 69 6d 69 74 29 3b 20 56 64  , p->iLimit); Vd
16ec0 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
16ed0 20 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 6d           VdbeCom
16ee0 6d 65 6e 74 28 28 76 2c 20 22 4a 75 6d 70 20 61  ment((v, "Jump a
16ef0 68 65 61 64 20 69 66 20 4c 49 4d 49 54 20 72 65  head if LIMIT re
16f00 61 63 68 65 64 22 29 29 3b 0a 20 20 20 20 20 20  ached"));.      
16f10 20 20 20 20 69 66 28 20 70 2d 3e 69 4f 66 66 73      if( p->iOffs
16f20 65 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  et ){.          
16f30 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
16f40 4f 70 33 28 76 2c 20 4f 50 5f 4f 66 66 73 65 74  Op3(v, OP_Offset
16f50 4c 69 6d 69 74 2c 0a 20 20 20 20 20 20 20 20 20  Limit,.         
16f60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16f70 20 20 20 20 20 70 2d 3e 69 4c 69 6d 69 74 2c 20       p->iLimit, 
16f80 70 2d 3e 69 4f 66 66 73 65 74 2b 31 2c 20 70 2d  p->iOffset+1, p-
16f90 3e 69 4f 66 66 73 65 74 29 3b 0a 20 20 20 20 20  >iOffset);.     
16fa0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
16fb0 0a 20 20 20 20 20 20 20 20 45 78 70 6c 61 69 6e  .        Explain
16fc0 51 75 65 72 79 50 6c 61 6e 28 28 70 50 61 72 73  QueryPlan((pPars
16fd0 65 2c 20 31 2c 20 22 55 4e 49 4f 4e 20 41 4c 4c  e, 1, "UNION ALL
16fe0 22 29 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20  "));.        rc 
16ff0 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28  = sqlite3Select(
17000 70 50 61 72 73 65 2c 20 70 2c 20 26 64 65 73 74  pParse, p, &dest
17010 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63  );.        testc
17020 61 73 65 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ase( rc!=SQLITE_
17030 4f 4b 20 29 3b 0a 20 20 20 20 20 20 20 20 70 44  OK );.        pD
17040 65 6c 65 74 65 20 3d 20 70 2d 3e 70 50 72 69 6f  elete = p->pPrio
17050 72 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 70 50  r;.        p->pP
17060 72 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a 20  rior = pPrior;. 
17070 20 20 20 20 20 20 20 70 2d 3e 6e 53 65 6c 65 63         p->nSelec
17080 74 52 6f 77 20 3d 20 73 71 6c 69 74 65 33 4c 6f  tRow = sqlite3Lo
17090 67 45 73 74 41 64 64 28 70 2d 3e 6e 53 65 6c 65  gEstAdd(p->nSele
170a0 63 74 52 6f 77 2c 20 70 50 72 69 6f 72 2d 3e 6e  ctRow, pPrior->n
170b0 53 65 6c 65 63 74 52 6f 77 29 3b 0a 20 20 20 20  SelectRow);.    
170c0 20 20 20 20 69 66 28 20 70 50 72 69 6f 72 2d 3e      if( pPrior->
170d0 70 4c 69 6d 69 74 0a 20 20 20 20 20 20 20 20 20  pLimit.         
170e0 26 26 20 73 71 6c 69 74 65 33 45 78 70 72 49 73  && sqlite3ExprIs
170f0 49 6e 74 65 67 65 72 28 70 50 72 69 6f 72 2d 3e  Integer(pPrior->
17100 70 4c 69 6d 69 74 2d 3e 70 4c 65 66 74 2c 20 26  pLimit->pLeft, &
17110 6e 4c 69 6d 69 74 29 0a 20 20 20 20 20 20 20 20  nLimit).        
17120 20 26 26 20 6e 4c 69 6d 69 74 3e 30 20 26 26 20   && nLimit>0 && 
17130 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3e 20  p->nSelectRow > 
17140 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 28 75  sqlite3LogEst((u
17150 36 34 29 6e 4c 69 6d 69 74 29 20 0a 20 20 20 20  64)nLimit) .    
17160 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20      ){.         
17170 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d   p->nSelectRow =
17180 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 28   sqlite3LogEst((
17190 75 36 34 29 6e 4c 69 6d 69 74 29 3b 0a 20 20 20  u64)nLimit);.   
171a0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
171b0 66 28 20 61 64 64 72 20 29 7b 0a 20 20 20 20 20  f( addr ){.     
171c0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
171d0 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72  JumpHere(v, addr
171e0 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
171f0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
17200 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65 20 54    }.      case T
17210 4b 5f 45 58 43 45 50 54 3a 0a 20 20 20 20 20 20  K_EXCEPT:.      
17220 63 61 73 65 20 54 4b 5f 55 4e 49 4f 4e 3a 20 7b  case TK_UNION: {
17230 0a 20 20 20 20 20 20 20 20 69 6e 74 20 75 6e 69  .        int uni
17240 6f 6e 54 61 62 3b 20 20 20 20 2f 2a 20 43 75 72  onTab;    /* Cur
17250 73 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20 74 68  sor number of th
17260 65 20 74 65 6d 70 20 74 61 62 6c 65 20 68 6f 6c  e temp table hol
17270 64 69 6e 67 20 72 65 73 75 6c 74 20 2a 2f 0a 20  ding result */. 
17280 20 20 20 20 20 20 20 75 38 20 6f 70 20 3d 20 30         u8 op = 0
17290 3b 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f  ;       /* One o
172a0 66 20 74 68 65 20 53 52 54 5f 20 6f 70 65 72 61  f the SRT_ opera
172b0 74 69 6f 6e 73 20 74 6f 20 61 70 70 6c 79 20 74  tions to apply t
172c0 6f 20 73 65 6c 66 20 2a 2f 0a 20 20 20 20 20 20  o self */.      
172d0 20 20 69 6e 74 20 70 72 69 6f 72 4f 70 3b 20 20    int priorOp;  
172e0 20 20 20 2f 2a 20 54 68 65 20 53 52 54 5f 20 6f     /* The SRT_ o
172f0 70 65 72 61 74 69 6f 6e 20 74 6f 20 61 70 70 6c  peration to appl
17300 79 20 74 6f 20 70 72 69 6f 72 20 73 65 6c 65 63  y to prior selec
17310 74 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 45 78  ts */.        Ex
17320 70 72 20 2a 70 4c 69 6d 69 74 3b 20 20 20 20 2f  pr *pLimit;    /
17330 2a 20 53 61 76 65 64 20 76 61 6c 75 65 73 20 6f  * Saved values o
17340 66 20 70 2d 3e 6e 4c 69 6d 69 74 20 20 2a 2f 0a  f p->nLimit  */.
17350 20 20 20 20 20 20 20 20 69 6e 74 20 61 64 64 72          int addr
17360 3b 0a 20 20 20 20 20 20 20 20 53 65 6c 65 63 74  ;.        Select
17370 44 65 73 74 20 75 6e 69 6f 6e 64 65 73 74 3b 0a  Dest uniondest;.
17380 20 20 0a 20 20 20 20 20 20 20 20 74 65 73 74 63    .        testc
17390 61 73 65 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 45  ase( p->op==TK_E
173a0 58 43 45 50 54 20 29 3b 0a 20 20 20 20 20 20 20  XCEPT );.       
173b0 20 74 65 73 74 63 61 73 65 28 20 70 2d 3e 6f 70   testcase( p->op
173c0 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29 3b 0a 20 20  ==TK_UNION );.  
173d0 20 20 20 20 20 20 70 72 69 6f 72 4f 70 20 3d 20        priorOp = 
173e0 53 52 54 5f 55 6e 69 6f 6e 3b 0a 20 20 20 20 20  SRT_Union;.     
173f0 20 20 20 69 66 28 20 64 65 73 74 2e 65 44 65 73     if( dest.eDes
17400 74 3d 3d 70 72 69 6f 72 4f 70 20 29 7b 0a 20 20  t==priorOp ){.  
17410 20 20 20 20 20 20 20 20 2f 2a 20 57 65 20 63 61          /* We ca
17420 6e 20 72 65 75 73 65 20 61 20 74 65 6d 70 6f 72  n reuse a tempor
17430 61 72 79 20 74 61 62 6c 65 20 67 65 6e 65 72 61  ary table genera
17440 74 65 64 20 62 79 20 61 20 53 45 4c 45 43 54 20  ted by a SELECT 
17450 74 6f 20 6f 75 72 0a 20 20 20 20 20 20 20 20 20  to our.         
17460 20 2a 2a 20 72 69 67 68 74 2e 0a 20 20 20 20 20   ** right..     
17470 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
17480 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4c 69    assert( p->pLi
17490 6d 69 74 3d 3d 30 20 29 3b 20 20 20 20 20 20 2f  mit==0 );      /
174a0 2a 20 4e 6f 74 20 61 6c 6c 6f 77 65 64 20 6f 6e  * Not allowed on
174b0 20 6c 65 66 74 77 61 72 64 20 65 6c 65 6d 65 6e   leftward elemen
174c0 74 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  ts */.          
174d0 75 6e 69 6f 6e 54 61 62 20 3d 20 64 65 73 74 2e  unionTab = dest.
174e0 69 53 44 50 61 72 6d 3b 0a 20 20 20 20 20 20 20  iSDParm;.       
174f0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
17500 20 20 2f 2a 20 57 65 20 77 69 6c 6c 20 6e 65 65    /* We will nee
17510 64 20 74 6f 20 63 72 65 61 74 65 20 6f 75 72 20  d to create our 
17520 6f 77 6e 20 74 65 6d 70 6f 72 61 72 79 20 74 61  own temporary ta
17530 62 6c 65 20 74 6f 20 68 6f 6c 64 20 74 68 65 0a  ble to hold the.
17540 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 74            ** int
17550 65 72 6d 65 64 69 61 74 65 20 72 65 73 75 6c 74  ermediate result
17560 73 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a  s..          */.
17570 20 20 20 20 20 20 20 20 20 20 75 6e 69 6f 6e 54            unionT
17580 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61  ab = pParse->nTa
17590 62 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 61  b++;.          a
175a0 73 73 65 72 74 28 20 70 2d 3e 70 4f 72 64 65 72  ssert( p->pOrder
175b0 42 79 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  By==0 );.       
175c0 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65     addr = sqlite
175d0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
175e0 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c  P_OpenEphemeral,
175f0 20 75 6e 69 6f 6e 54 61 62 2c 20 30 29 3b 0a 20   unionTab, 0);. 
17600 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
17610 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d   p->addrOpenEphm
17620 5b 30 5d 20 3d 3d 20 2d 31 20 29 3b 0a 20 20 20  [0] == -1 );.   
17630 20 20 20 20 20 20 20 70 2d 3e 61 64 64 72 4f 70         p->addrOp
17640 65 6e 45 70 68 6d 5b 30 5d 20 3d 20 61 64 64 72  enEphm[0] = addr
17650 3b 0a 20 20 20 20 20 20 20 20 20 20 66 69 6e 64  ;.          find
17660 52 69 67 68 74 6d 6f 73 74 28 70 29 2d 3e 73 65  Rightmost(p)->se
17670 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f 55 73 65  lFlags |= SF_Use
17680 73 45 70 68 65 6d 65 72 61 6c 3b 0a 20 20 20 20  sEphemeral;.    
17690 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
176a0 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20 20 20 20  >pEList );.     
176b0 20 20 20 7d 0a 20 20 0a 20 20 20 20 20 20 20 20     }.  .        
176c0 2f 2a 20 43 6f 64 65 20 74 68 65 20 53 45 4c 45  /* Code the SELE
176d0 43 54 20 73 74 61 74 65 6d 65 6e 74 73 20 74 6f  CT statements to
176e0 20 6f 75 72 20 6c 65 66 74 0a 20 20 20 20 20 20   our left.      
176f0 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73    */.        ass
17700 65 72 74 28 20 21 70 50 72 69 6f 72 2d 3e 70 4f  ert( !pPrior->pO
17710 72 64 65 72 42 79 20 29 3b 0a 20 20 20 20 20 20  rderBy );.      
17720 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44    sqlite3SelectD
17730 65 73 74 49 6e 69 74 28 26 75 6e 69 6f 6e 64 65  estInit(&unionde
17740 73 74 2c 20 70 72 69 6f 72 4f 70 2c 20 75 6e 69  st, priorOp, uni
17750 6f 6e 54 61 62 29 3b 0a 20 20 20 20 20 20 20 20  onTab);.        
17760 72 63 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65  rc = sqlite3Sele
17770 63 74 28 70 50 61 72 73 65 2c 20 70 50 72 69 6f  ct(pParse, pPrio
17780 72 2c 20 26 75 6e 69 6f 6e 64 65 73 74 29 3b 0a  r, &uniondest);.
17790 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29          if( rc )
177a0 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  {.          goto
177b0 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e   multi_select_en
177c0 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 0a  d;.        }.  .
177d0 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 64 65 20          /* Code 
177e0 74 68 65 20 63 75 72 72 65 6e 74 20 53 45 4c 45  the current SELE
177f0 43 54 20 73 74 61 74 65 6d 65 6e 74 0a 20 20 20  CT statement.   
17800 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
17810 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 45 58  if( p->op==TK_EX
17820 43 45 50 54 20 29 7b 0a 20 20 20 20 20 20 20 20  CEPT ){.        
17830 20 20 6f 70 20 3d 20 53 52 54 5f 45 78 63 65 70    op = SRT_Excep
17840 74 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  t;.        }else
17850 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  {.          asse
17860 72 74 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 4e  rt( p->op==TK_UN
17870 49 4f 4e 20 29 3b 0a 20 20 20 20 20 20 20 20 20  ION );.         
17880 20 6f 70 20 3d 20 53 52 54 5f 55 6e 69 6f 6e 3b   op = SRT_Union;
17890 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
178a0 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30     p->pPrior = 0
178b0 3b 0a 20 20 20 20 20 20 20 20 70 4c 69 6d 69 74  ;.        pLimit
178c0 20 3d 20 70 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20   = p->pLimit;.  
178d0 20 20 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20        p->pLimit 
178e0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 75 6e 69  = 0;.        uni
178f0 6f 6e 64 65 73 74 2e 65 44 65 73 74 20 3d 20 6f  ondest.eDest = o
17900 70 3b 0a 20 20 20 20 20 20 20 20 45 78 70 6c 61  p;.        Expla
17910 69 6e 51 75 65 72 79 50 6c 61 6e 28 28 70 50 61  inQueryPlan((pPa
17920 72 73 65 2c 20 31 2c 20 22 25 73 20 55 53 49 4e  rse, 1, "%s USIN
17930 47 20 54 45 4d 50 20 42 2d 54 52 45 45 22 2c 0a  G TEMP B-TREE",.
17940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17950 20 20 20 20 20 20 20 20 20 20 73 65 6c 65 63 74            select
17960 4f 70 4e 61 6d 65 28 70 2d 3e 6f 70 29 29 29 3b  OpName(p->op)));
17970 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
17980 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72  lite3Select(pPar
17990 73 65 2c 20 70 2c 20 26 75 6e 69 6f 6e 64 65 73  se, p, &uniondes
179a0 74 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74  t);.        test
179b0 63 61 73 65 28 20 72 63 21 3d 53 51 4c 49 54 45  case( rc!=SQLITE
179c0 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 20 20 2f  _OK );.        /
179d0 2a 20 51 75 65 72 79 20 66 6c 61 74 74 65 6e 69  * Query flatteni
179e0 6e 67 20 69 6e 20 73 71 6c 69 74 65 33 53 65 6c  ng in sqlite3Sel
179f0 65 63 74 28 29 20 6d 69 67 68 74 20 72 65 66 69  ect() might refi
17a00 6c 6c 20 70 2d 3e 70 4f 72 64 65 72 42 79 2e 0a  ll p->pOrderBy..
17a10 20 20 20 20 20 20 20 20 2a 2a 20 42 65 20 73 75          ** Be su
17a20 72 65 20 74 6f 20 64 65 6c 65 74 65 20 70 2d 3e  re to delete p->
17a30 70 4f 72 64 65 72 42 79 2c 20 74 68 65 72 65 66  pOrderBy, theref
17a40 6f 72 65 2c 20 74 6f 20 61 76 6f 69 64 20 61 20  ore, to avoid a 
17a50 6d 65 6d 6f 72 79 20 6c 65 61 6b 2e 20 2a 2f 0a  memory leak. */.
17a60 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
17a70 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62  xprListDelete(db
17a80 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79 29 3b 0a  , p->pOrderBy);.
17a90 20 20 20 20 20 20 20 20 70 44 65 6c 65 74 65 20          pDelete 
17aa0 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20  = p->pPrior;.   
17ab0 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d       p->pPrior =
17ac0 20 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 20   pPrior;.       
17ad0 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 30   p->pOrderBy = 0
17ae0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 2d  ;.        if( p-
17af0 3e 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29 7b  >op==TK_UNION ){
17b00 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 6e 53  .          p->nS
17b10 65 6c 65 63 74 52 6f 77 20 3d 20 73 71 6c 69 74  electRow = sqlit
17b20 65 33 4c 6f 67 45 73 74 41 64 64 28 70 2d 3e 6e  e3LogEstAdd(p->n
17b30 53 65 6c 65 63 74 52 6f 77 2c 20 70 50 72 69 6f  SelectRow, pPrio
17b40 72 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 29 3b 0a  r->nSelectRow);.
17b50 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
17b60 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
17b70 65 74 65 28 64 62 2c 20 70 2d 3e 70 4c 69 6d 69  ete(db, p->pLimi
17b80 74 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 70  t);.        p->p
17b90 4c 69 6d 69 74 20 3d 20 70 4c 69 6d 69 74 3b 0a  Limit = pLimit;.
17ba0 20 20 20 20 20 20 20 20 70 2d 3e 69 4c 69 6d 69          p->iLimi
17bb0 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70  t = 0;.        p
17bc0 2d 3e 69 4f 66 66 73 65 74 20 3d 20 30 3b 0a 20  ->iOffset = 0;. 
17bd0 20 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e   .        /* Con
17be0 76 65 72 74 20 74 68 65 20 64 61 74 61 20 69 6e  vert the data in
17bf0 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 74   the temporary t
17c00 61 62 6c 65 20 69 6e 74 6f 20 77 68 61 74 65 76  able into whatev
17c10 65 72 20 66 6f 72 6d 0a 20 20 20 20 20 20 20 20  er form.        
17c20 2a 2a 20 69 74 20 69 73 20 74 68 61 74 20 77 65  ** it is that we
17c30 20 63 75 72 72 65 6e 74 6c 79 20 6e 65 65 64 2e   currently need.
17c40 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
17c50 20 20 20 20 61 73 73 65 72 74 28 20 75 6e 69 6f      assert( unio
17c60 6e 54 61 62 3d 3d 64 65 73 74 2e 69 53 44 50 61  nTab==dest.iSDPa
17c70 72 6d 20 7c 7c 20 64 65 73 74 2e 65 44 65 73 74  rm || dest.eDest
17c80 21 3d 70 72 69 6f 72 4f 70 20 29 3b 0a 20 20 20  !=priorOp );.   
17c90 20 20 20 20 20 69 66 28 20 64 65 73 74 2e 65 44       if( dest.eD
17ca0 65 73 74 21 3d 70 72 69 6f 72 4f 70 20 29 7b 0a  est!=priorOp ){.
17cb0 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 69 43            int iC
17cc0 6f 6e 74 2c 20 69 42 72 65 61 6b 2c 20 69 53 74  ont, iBreak, iSt
17cd0 61 72 74 3b 0a 20 20 20 20 20 20 20 20 20 20 61  art;.          a
17ce0 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74  ssert( p->pEList
17cf0 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 42   );.          iB
17d00 72 65 61 6b 20 3d 20 73 71 6c 69 74 65 33 56 64  reak = sqlite3Vd
17d10 62 65 4d 61 6b 65 4c 61 62 65 6c 28 70 50 61 72  beMakeLabel(pPar
17d20 73 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  se);.          i
17d30 43 6f 6e 74 20 3d 20 73 71 6c 69 74 65 33 56 64  Cont = sqlite3Vd
17d40 62 65 4d 61 6b 65 4c 61 62 65 6c 28 70 50 61 72  beMakeLabel(pPar
17d50 73 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 63  se);.          c
17d60 6f 6d 70 75 74 65 4c 69 6d 69 74 52 65 67 69 73  omputeLimitRegis
17d70 74 65 72 73 28 70 50 61 72 73 65 2c 20 70 2c 20  ters(pParse, p, 
17d80 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 20  iBreak);.       
17d90 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
17da0 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 77 69 6e  dOp2(v, OP_Rewin
17db0 64 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 69 42 72  d, unionTab, iBr
17dc0 65 61 6b 29 3b 20 56 64 62 65 43 6f 76 65 72 61  eak); VdbeCovera
17dd0 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20 20  ge(v);.         
17de0 20 69 53 74 61 72 74 20 3d 20 73 71 6c 69 74 65   iStart = sqlite
17df0 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
17e00 28 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73  (v);.          s
17e10 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70  electInnerLoop(p
17e20 50 61 72 73 65 2c 20 70 2c 20 75 6e 69 6f 6e 54  Parse, p, unionT
17e30 61 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ab,.            
17e40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 2c                0,
17e50 20 30 2c 20 26 64 65 73 74 2c 20 69 43 6f 6e 74   0, &dest, iCont
17e60 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20  , iBreak);.     
17e70 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
17e80 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
17e90 69 43 6f 6e 74 29 3b 0a 20 20 20 20 20 20 20 20  iCont);.        
17ea0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
17eb0 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20  Op2(v, OP_Next, 
17ec0 75 6e 69 6f 6e 54 61 62 2c 20 69 53 74 61 72 74  unionTab, iStart
17ed0 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
17ee0 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  v);.          sq
17ef0 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
17f00 4c 61 62 65 6c 28 76 2c 20 69 42 72 65 61 6b 29  Label(v, iBreak)
17f10 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
17f20 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
17f30 20 4f 50 5f 43 6c 6f 73 65 2c 20 75 6e 69 6f 6e   OP_Close, union
17f40 54 61 62 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  Tab, 0);.       
17f50 20 7d 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b   }.        break
17f60 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
17f70 64 65 66 61 75 6c 74 3a 20 61 73 73 65 72 74 28  default: assert(
17f80 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 54 45 52   p->op==TK_INTER
17f90 53 45 43 54 20 29 3b 20 7b 0a 20 20 20 20 20 20  SECT ); {.      
17fa0 20 20 69 6e 74 20 74 61 62 31 2c 20 74 61 62 32    int tab1, tab2
17fb0 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 43  ;.        int iC
17fc0 6f 6e 74 2c 20 69 42 72 65 61 6b 2c 20 69 53 74  ont, iBreak, iSt
17fd0 61 72 74 3b 0a 20 20 20 20 20 20 20 20 45 78 70  art;.        Exp
17fe0 72 20 2a 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20  r *pLimit;.     
17ff0 20 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 20     int addr;.   
18000 20 20 20 20 20 53 65 6c 65 63 74 44 65 73 74 20       SelectDest 
18010 69 6e 74 65 72 73 65 63 74 64 65 73 74 3b 0a 20  intersectdest;. 
18020 20 20 20 20 20 20 20 69 6e 74 20 72 31 3b 0a 20         int r1;. 
18030 20 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 4e 54   .        /* INT
18040 45 52 53 45 43 54 20 69 73 20 64 69 66 66 65 72  ERSECT is differ
18050 65 6e 74 20 66 72 6f 6d 20 74 68 65 20 6f 74 68  ent from the oth
18060 65 72 73 20 73 69 6e 63 65 20 69 74 20 72 65 71  ers since it req
18070 75 69 72 65 73 0a 20 20 20 20 20 20 20 20 2a 2a  uires.        **
18080 20 74 77 6f 20 74 65 6d 70 6f 72 61 72 79 20 74   two temporary t
18090 61 62 6c 65 73 2e 20 20 48 65 6e 63 65 20 69 74  ables.  Hence it
180a0 20 68 61 73 20 69 74 73 20 6f 77 6e 20 63 61 73   has its own cas
180b0 65 2e 20 20 42 65 67 69 6e 0a 20 20 20 20 20 20  e.  Begin.      
180c0 20 20 2a 2a 20 62 79 20 61 6c 6c 6f 63 61 74 69    ** by allocati
180d0 6e 67 20 74 68 65 20 74 61 62 6c 65 73 20 77 65  ng the tables we
180e0 20 77 69 6c 6c 20 6e 65 65 64 2e 0a 20 20 20 20   will need..    
180f0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 74      */.        t
18100 61 62 31 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54  ab1 = pParse->nT
18110 61 62 2b 2b 3b 0a 20 20 20 20 20 20 20 20 74 61  ab++;.        ta
18120 62 32 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61  b2 = pParse->nTa
18130 62 2b 2b 3b 0a 20 20 20 20 20 20 20 20 61 73 73  b++;.        ass
18140 65 72 74 28 20 70 2d 3e 70 4f 72 64 65 72 42 79  ert( p->pOrderBy
18150 3d 3d 30 20 29 3b 0a 20 20 0a 20 20 20 20 20 20  ==0 );.  .      
18160 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33    addr = sqlite3
18170 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
18180 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20  _OpenEphemeral, 
18190 74 61 62 31 2c 20 30 29 3b 0a 20 20 20 20 20 20  tab1, 0);.      
181a0 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 64 64    assert( p->add
181b0 72 4f 70 65 6e 45 70 68 6d 5b 30 5d 20 3d 3d 20  rOpenEphm[0] == 
181c0 2d 31 20 29 3b 0a 20 20 20 20 20 20 20 20 70 2d  -1 );.        p-
181d0 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 30 5d  >addrOpenEphm[0]
181e0 20 3d 20 61 64 64 72 3b 0a 20 20 20 20 20 20 20   = addr;.       
181f0 20 66 69 6e 64 52 69 67 68 74 6d 6f 73 74 28 70   findRightmost(p
18200 29 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53  )->selFlags |= S
18210 46 5f 55 73 65 73 45 70 68 65 6d 65 72 61 6c 3b  F_UsesEphemeral;
18220 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
18230 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20   p->pEList );.  
18240 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 64 65  .        /* Code
18250 20 74 68 65 20 53 45 4c 45 43 54 73 20 74 6f 20   the SELECTs to 
18260 6f 75 72 20 6c 65 66 74 20 69 6e 74 6f 20 74 65  our left into te
18270 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 22 74  mporary table "t
18280 61 62 31 22 2e 0a 20 20 20 20 20 20 20 20 2a 2f  ab1"..        */
18290 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
182a0 53 65 6c 65 63 74 44 65 73 74 49 6e 69 74 28 26  SelectDestInit(&
182b0 69 6e 74 65 72 73 65 63 74 64 65 73 74 2c 20 53  intersectdest, S
182c0 52 54 5f 55 6e 69 6f 6e 2c 20 74 61 62 31 29 3b  RT_Union, tab1);
182d0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
182e0 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72  lite3Select(pPar
182f0 73 65 2c 20 70 50 72 69 6f 72 2c 20 26 69 6e 74  se, pPrior, &int
18300 65 72 73 65 63 74 64 65 73 74 29 3b 0a 20 20 20  ersectdest);.   
18310 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20       if( rc ){. 
18320 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 75           goto mu
18330 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  lti_select_end;.
18340 20 20 20 20 20 20 20 20 7d 0a 20 20 0a 20 20 20          }.  .   
18350 20 20 20 20 20 2f 2a 20 43 6f 64 65 20 74 68 65       /* Code the
18360 20 63 75 72 72 65 6e 74 20 53 45 4c 45 43 54 20   current SELECT 
18370 69 6e 74 6f 20 74 65 6d 70 6f 72 61 72 79 20 74  into temporary t
18380 61 62 6c 65 20 22 74 61 62 32 22 0a 20 20 20 20  able "tab2".    
18390 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 61      */.        a
183a0 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ddr = sqlite3Vdb
183b0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70  eAddOp2(v, OP_Op
183c0 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 74 61 62  enEphemeral, tab
183d0 32 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 61  2, 0);.        a
183e0 73 73 65 72 74 28 20 70 2d 3e 61 64 64 72 4f 70  ssert( p->addrOp
183f0 65 6e 45 70 68 6d 5b 31 5d 20 3d 3d 20 2d 31 20  enEphm[1] == -1 
18400 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 61 64  );.        p->ad
18410 64 72 4f 70 65 6e 45 70 68 6d 5b 31 5d 20 3d 20  drOpenEphm[1] = 
18420 61 64 64 72 3b 0a 20 20 20 20 20 20 20 20 70 2d  addr;.        p-
18430 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20  >pPrior = 0;.   
18440 20 20 20 20 20 70 4c 69 6d 69 74 20 3d 20 70 2d       pLimit = p-
18450 3e 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 20  >pLimit;.       
18460 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a   p->pLimit = 0;.
18470 20 20 20 20 20 20 20 20 69 6e 74 65 72 73 65 63          intersec
18480 74 64 65 73 74 2e 69 53 44 50 61 72 6d 20 3d 20  tdest.iSDParm = 
18490 74 61 62 32 3b 0a 20 20 20 20 20 20 20 20 45 78  tab2;.        Ex
184a0 70 6c 61 69 6e 51 75 65 72 79 50 6c 61 6e 28 28  plainQueryPlan((
184b0 70 50 61 72 73 65 2c 20 31 2c 20 22 25 73 20 55  pParse, 1, "%s U
184c0 53 49 4e 47 20 54 45 4d 50 20 42 2d 54 52 45 45  SING TEMP B-TREE
184d0 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
184e0 20 20 20 20 20 20 20 20 20 20 20 20 20 73 65 6c               sel
184f0 65 63 74 4f 70 4e 61 6d 65 28 70 2d 3e 6f 70 29  ectOpName(p->op)
18500 29 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  ));.        rc =
18510 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70   sqlite3Select(p
18520 50 61 72 73 65 2c 20 70 2c 20 26 69 6e 74 65 72  Parse, p, &inter
18530 73 65 63 74 64 65 73 74 29 3b 0a 20 20 20 20 20  sectdest);.     
18540 20 20 20 74 65 73 74 63 61 73 65 28 20 72 63 21     testcase( rc!
18550 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20  =SQLITE_OK );.  
18560 20 20 20 20 20 20 70 44 65 6c 65 74 65 20 3d 20        pDelete = 
18570 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 20  p->pPrior;.     
18580 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70     p->pPrior = p
18590 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 20 20 69  Prior;.        i
185a0 66 28 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77  f( p->nSelectRow
185b0 3e 70 50 72 69 6f 72 2d 3e 6e 53 65 6c 65 63 74  >pPrior->nSelect
185c0 52 6f 77 20 29 7b 0a 20 20 20 20 20 20 20 20 20  Row ){.         
185d0 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d   p->nSelectRow =
185e0 20 70 50 72 69 6f 72 2d 3e 6e 53 65 6c 65 63 74   pPrior->nSelect
185f0 52 6f 77 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  Row;.        }. 
18600 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
18610 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e  prDelete(db, p->
18620 70 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20 20 20  pLimit);.       
18630 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 70 4c 69   p->pLimit = pLi
18640 6d 69 74 3b 0a 20 20 0a 20 20 20 20 20 20 20 20  mit;.  .        
18650 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  /* Generate code
18660 20 74 6f 20 74 61 6b 65 20 74 68 65 20 69 6e 74   to take the int
18670 65 72 73 65 63 74 69 6f 6e 20 6f 66 20 74 68 65  ersection of the
18680 20 74 77 6f 20 74 65 6d 70 6f 72 61 72 79 0a 20   two temporary. 
18690 20 20 20 20 20 20 20 2a 2a 20 74 61 62 6c 65 73         ** tables
186a0 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
186b0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
186c0 70 45 4c 69 73 74 20 29 3b 0a 20 20 20 20 20 20  pEList );.      
186d0 20 20 69 42 72 65 61 6b 20 3d 20 73 71 6c 69 74    iBreak = sqlit
186e0 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
186f0 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20  pParse);.       
18700 20 69 43 6f 6e 74 20 3d 20 73 71 6c 69 74 65 33   iCont = sqlite3
18710 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 70 50  VdbeMakeLabel(pP
18720 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20 63  arse);.        c
18730 6f 6d 70 75 74 65 4c 69 6d 69 74 52 65 67 69 73  omputeLimitRegis
18740 74 65 72 73 28 70 50 61 72 73 65 2c 20 70 2c 20  ters(pParse, p, 
18750 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 20  iBreak);.       
18760 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
18770 70 32 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c  p2(v, OP_Rewind,
18780 20 74 61 62 31 2c 20 69 42 72 65 61 6b 29 3b 20   tab1, iBreak); 
18790 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
187a0 0a 20 20 20 20 20 20 20 20 72 31 20 3d 20 73 71  .        r1 = sq
187b0 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28  lite3GetTempReg(
187c0 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20  pParse);.       
187d0 20 69 53 74 61 72 74 20 3d 20 73 71 6c 69 74 65   iStart = sqlite
187e0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
187f0 50 5f 52 6f 77 44 61 74 61 2c 20 74 61 62 31 2c  P_RowData, tab1,
18800 20 72 31 29 3b 0a 20 20 20 20 20 20 20 20 73 71   r1);.        sq
18810 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 49  lite3VdbeAddOp4I
18820 6e 74 28 76 2c 20 4f 50 5f 4e 6f 74 46 6f 75 6e  nt(v, OP_NotFoun
18830 64 2c 20 74 61 62 32 2c 20 69 43 6f 6e 74 2c 20  d, tab2, iCont, 
18840 72 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  r1, 0);.        
18850 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
18860 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
18870 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
18880 50 61 72 73 65 2c 20 72 31 29 3b 0a 20 20 20 20  Parse, r1);.    
18890 20 20 20 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c      selectInnerL
188a0 6f 6f 70 28 70 50 61 72 73 65 2c 20 70 2c 20 74  oop(pParse, p, t
188b0 61 62 31 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ab1,.           
188c0 20 20 20 20 20 20 20 20 20 20 20 20 20 30 2c 20               0, 
188d0 30 2c 20 26 64 65 73 74 2c 20 69 43 6f 6e 74 2c  0, &dest, iCont,
188e0 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20   iBreak);.      
188f0 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
18900 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69 43 6f  olveLabel(v, iCo
18910 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  nt);.        sql
18920 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
18930 2c 20 4f 50 5f 4e 65 78 74 2c 20 74 61 62 31 2c  , OP_Next, tab1,
18940 20 69 53 74 61 72 74 29 3b 20 56 64 62 65 43 6f   iStart); VdbeCo
18950 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20  verage(v);.     
18960 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
18970 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69 42  solveLabel(v, iB
18980 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 20 20 73  reak);.        s
18990 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
189a0 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 74 61  (v, OP_Close, ta
189b0 62 32 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  b2, 0);.        
189c0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
189d0 32 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 74  2(v, OP_Close, t
189e0 61 62 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  ab1, 0);.       
189f0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
18a00 20 20 20 20 7d 0a 20 20 0a 20 20 23 69 66 6e 64      }.  .  #ifnd
18a10 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45  ef SQLITE_OMIT_E
18a20 58 50 4c 41 49 4e 0a 20 20 20 20 69 66 28 20 70  XPLAIN.    if( p
18a30 2d 3e 70 4e 65 78 74 3d 3d 30 20 29 7b 0a 20 20  ->pNext==0 ){.  
18a40 20 20 20 20 45 78 70 6c 61 69 6e 51 75 65 72 79      ExplainQuery
18a50 50 6c 61 6e 50 6f 70 28 70 50 61 72 73 65 29 3b  PlanPop(pParse);
18a60 0a 20 20 20 20 7d 0a 20 20 23 65 6e 64 69 66 0a  .    }.  #endif.
18a70 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 43 6f 6d 70    }.  .  /* Comp
18a80 75 74 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65  ute collating se
18a90 71 75 65 6e 63 65 73 20 75 73 65 64 20 62 79 20  quences used by 
18aa0 0a 20 20 2a 2a 20 74 65 6d 70 6f 72 61 72 79 20  .  ** temporary 
18ab0 74 61 62 6c 65 73 20 6e 65 65 64 65 64 20 74 6f  tables needed to
18ac0 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 63   implement the c
18ad0 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 2e 0a  ompound select..
18ae0 20 20 2a 2a 20 41 74 74 61 63 68 20 74 68 65 20    ** Attach the 
18af0 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72  KeyInfo structur
18b00 65 20 74 6f 20 61 6c 6c 20 74 65 6d 70 6f 72 61  e to all tempora
18b10 72 79 20 74 61 62 6c 65 73 2e 0a 20 20 2a 2a 0a  ry tables..  **.
18b20 20 20 2a 2a 20 54 68 69 73 20 73 65 63 74 69 6f    ** This sectio
18b30 6e 20 69 73 20 72 75 6e 20 62 79 20 74 68 65 20  n is run by the 
18b40 72 69 67 68 74 2d 6d 6f 73 74 20 53 45 4c 45 43  right-most SELEC
18b50 54 20 73 74 61 74 65 6d 65 6e 74 20 6f 6e 6c 79  T statement only
18b60 2e 0a 20 20 2a 2a 20 53 45 4c 45 43 54 20 73 74  ..  ** SELECT st
18b70 61 74 65 6d 65 6e 74 73 20 74 6f 20 74 68 65 20  atements to the 
18b80 6c 65 66 74 20 61 6c 77 61 79 73 20 73 6b 69 70  left always skip
18b90 20 74 68 69 73 20 70 61 72 74 2e 20 20 54 68 65   this part.  The
18ba0 20 72 69 67 68 74 2d 6d 6f 73 74 0a 20 20 2a 2a   right-most.  **
18bb0 20 53 45 4c 45 43 54 20 6d 69 67 68 74 20 61 6c   SELECT might al
18bc0 73 6f 20 73 6b 69 70 20 74 68 69 73 20 70 61 72  so skip this par
18bd0 74 20 69 66 20 69 74 20 68 61 73 20 6e 6f 20 4f  t if it has no O
18be0 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 61  RDER BY clause a
18bf0 6e 64 0a 20 20 2a 2a 20 6e 6f 20 74 65 6d 70 20  nd.  ** no temp 
18c00 74 61 62 6c 65 73 20 61 72 65 20 72 65 71 75 69  tables are requi
18c10 72 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  red..  */.  if( 
18c20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46  p->selFlags & SF
18c30 5f 55 73 65 73 45 70 68 65 6d 65 72 61 6c 20 29  _UsesEphemeral )
18c40 7b 0a 20 20 20 20 69 6e 74 20 69 3b 20 20 20 20  {.    int i;    
18c50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18c60 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
18c70 74 65 72 20 2a 2f 0a 20 20 20 20 4b 65 79 49 6e  ter */.    KeyIn
18c80 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b 20 20 20  fo *pKeyInfo;   
18c90 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 6c           /* Coll
18ca0 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 66  ating sequence f
18cb0 6f 72 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  or the result se
18cc0 74 20 2a 2f 0a 20 20 20 20 53 65 6c 65 63 74 20  t */.    Select 
18cd0 2a 70 4c 6f 6f 70 3b 20 20 20 20 20 20 20 20 20  *pLoop;         
18ce0 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f         /* For lo
18cf0 6f 70 69 6e 67 20 74 68 72 6f 75 67 68 20 53 45  oping through SE
18d00 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73 20  LECT statements 
18d10 2a 2f 0a 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a  */.    CollSeq *
18d20 2a 61 70 43 6f 6c 6c 3b 20 20 20 20 20 20 20 20  *apColl;        
18d30 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70       /* For loop
18d40 69 6e 67 20 74 68 72 6f 75 67 68 20 70 4b 65 79  ing through pKey
18d50 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 5d 20 2a 2f  Info->aColl[] */
18d60 0a 20 20 20 20 69 6e 74 20 6e 43 6f 6c 3b 20 20  .    int nCol;  
18d70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18d80 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
18d90 63 6f 6c 75 6d 6e 73 20 69 6e 20 72 65 73 75 6c  columns in resul
18da0 74 20 73 65 74 20 2a 2f 0a 0a 20 20 20 20 61 73  t set */..    as
18db0 73 65 72 74 28 20 70 2d 3e 70 4e 65 78 74 3d 3d  sert( p->pNext==
18dc0 30 20 29 3b 0a 20 20 20 20 6e 43 6f 6c 20 3d 20  0 );.    nCol = 
18dd0 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  p->pEList->nExpr
18de0 3b 0a 20 20 20 20 70 4b 65 79 49 6e 66 6f 20 3d  ;.    pKeyInfo =
18df0 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 41   sqlite3KeyInfoA
18e00 6c 6c 6f 63 28 64 62 2c 20 6e 43 6f 6c 2c 20 31  lloc(db, nCol, 1
18e10 29 3b 0a 20 20 20 20 69 66 28 20 21 70 4b 65 79  );.    if( !pKey
18e20 49 6e 66 6f 20 29 7b 0a 20 20 20 20 20 20 72 63  Info ){.      rc
18e30 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f   = SQLITE_NOMEM_
18e40 42 4b 50 54 3b 0a 20 20 20 20 20 20 67 6f 74 6f  BKPT;.      goto
18e50 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e   multi_select_en
18e60 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72  d;.    }.    for
18e70 28 69 3d 30 2c 20 61 70 43 6f 6c 6c 3d 70 4b 65  (i=0, apColl=pKe
18e80 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 3b 20 69 3c  yInfo->aColl; i<
18e90 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 61 70 43 6f 6c  nCol; i++, apCol
18ea0 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 2a 61 70 43  l++){.      *apC
18eb0 6f 6c 6c 20 3d 20 6d 75 6c 74 69 53 65 6c 65 63  oll = multiSelec
18ec0 74 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  tCollSeq(pParse,
18ed0 20 70 2c 20 69 29 3b 0a 20 20 20 20 20 20 69 66   p, i);.      if
18ee0 28 20 30 3d 3d 2a 61 70 43 6f 6c 6c 20 29 7b 0a  ( 0==*apColl ){.
18ef0 20 20 20 20 20 20 20 20 2a 61 70 43 6f 6c 6c 20          *apColl 
18f00 3d 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b  = db->pDfltColl;
18f10 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
18f20 20 20 20 20 66 6f 72 28 70 4c 6f 6f 70 3d 70 3b      for(pLoop=p;
18f30 20 70 4c 6f 6f 70 3b 20 70 4c 6f 6f 70 3d 70 4c   pLoop; pLoop=pL
18f40 6f 6f 70 2d 3e 70 50 72 69 6f 72 29 7b 0a 20 20  oop->pPrior){.  
18f50 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 32      for(i=0; i<2
18f60 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
18f70 69 6e 74 20 61 64 64 72 20 3d 20 70 4c 6f 6f 70  int addr = pLoop
18f80 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 69  ->addrOpenEphm[i
18f90 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 61  ];.        if( a
18fa0 64 64 72 3c 30 20 29 7b 0a 20 20 20 20 20 20 20  ddr<0 ){.       
18fb0 20 20 20 2f 2a 20 49 66 20 5b 30 5d 20 69 73 20     /* If [0] is 
18fc0 75 6e 75 73 65 64 20 74 68 65 6e 20 5b 31 5d 20  unused then [1] 
18fd0 69 73 20 61 6c 73 6f 20 75 6e 75 73 65 64 2e 20  is also unused. 
18fe0 20 53 6f 20 77 65 20 63 61 6e 0a 20 20 20 20 20   So we can.     
18ff0 20 20 20 20 20 2a 2a 20 61 6c 77 61 79 73 20 73       ** always s
19000 61 66 65 6c 79 20 61 62 6f 72 74 20 61 73 20 73  afely abort as s
19010 6f 6f 6e 20 61 73 20 74 68 65 20 66 69 72 73 74  oon as the first
19020 20 75 6e 75 73 65 64 20 73 6c 6f 74 20 69 73 20   unused slot is 
19030 66 6f 75 6e 64 20 2a 2f 0a 20 20 20 20 20 20 20  found */.       
19040 20 20 20 61 73 73 65 72 74 28 20 70 4c 6f 6f 70     assert( pLoop
19050 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 31  ->addrOpenEphm[1
19060 5d 3c 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20  ]<0 );.         
19070 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
19080 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  }.        sqlite
19090 33 56 64 62 65 43 68 61 6e 67 65 50 32 28 76 2c  3VdbeChangeP2(v,
190a0 20 61 64 64 72 2c 20 6e 43 6f 6c 29 3b 0a 20 20   addr, nCol);.  
190b0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
190c0 65 43 68 61 6e 67 65 50 34 28 76 2c 20 61 64 64  eChangeP4(v, add
190d0 72 2c 20 28 63 68 61 72 2a 29 73 71 6c 69 74 65  r, (char*)sqlite
190e0 33 4b 65 79 49 6e 66 6f 52 65 66 28 70 4b 65 79  3KeyInfoRef(pKey
190f0 49 6e 66 6f 29 2c 0a 20 20 20 20 20 20 20 20 20  Info),.         
19100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19110 20 20 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a     P4_KEYINFO);.
19120 20 20 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 61          pLoop->a
19130 64 64 72 4f 70 65 6e 45 70 68 6d 5b 69 5d 20 3d  ddrOpenEphm[i] =
19140 20 2d 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   -1;.      }.   
19150 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 4b 65   }.    sqlite3Ke
19160 79 49 6e 66 6f 55 6e 72 65 66 28 70 4b 65 79 49  yInfoUnref(pKeyI
19170 6e 66 6f 29 3b 0a 20 20 7d 0a 0a 6d 75 6c 74 69  nfo);.  }..multi
19180 5f 73 65 6c 65 63 74 5f 65 6e 64 3a 0a 20 20 70  _select_end:.  p
19190 44 65 73 74 2d 3e 69 53 64 73 74 20 3d 20 64 65  Dest->iSdst = de
191a0 73 74 2e 69 53 64 73 74 3b 0a 20 20 70 44 65 73  st.iSdst;.  pDes
191b0 74 2d 3e 6e 53 64 73 74 20 3d 20 64 65 73 74 2e  t->nSdst = dest.
191c0 6e 53 64 73 74 3b 0a 20 20 73 71 6c 69 74 65 33  nSdst;.  sqlite3
191d0 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62 2c  SelectDelete(db,
191e0 20 70 44 65 6c 65 74 65 29 3b 0a 20 20 72 65 74   pDelete);.  ret
191f0 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66  urn rc;.}.#endif
19200 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
19210 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 20  COMPOUND_SELECT 
19220 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 45 72 72 6f 72 20  */../*.** Error 
19230 6d 65 73 73 61 67 65 20 66 6f 72 20 77 68 65 6e  message for when
19240 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 74 65 72   two or more ter
19250 6d 73 20 6f 66 20 61 20 63 6f 6d 70 6f 75 6e 64  ms of a compound
19260 20 73 65 6c 65 63 74 20 68 61 76 65 20 64 69 66   select have dif
19270 66 65 72 65 6e 74 0a 2a 2a 20 73 69 7a 65 20 72  ferent.** size r
19280 65 73 75 6c 74 20 73 65 74 73 2e 0a 2a 2f 0a 76  esult sets..*/.v
19290 6f 69 64 20 73 71 6c 69 74 65 33 53 65 6c 65 63  oid sqlite3Selec
192a0 74 57 72 6f 6e 67 4e 75 6d 54 65 72 6d 73 45 72  tWrongNumTermsEr
192b0 72 6f 72 28 50 61 72 73 65 20 2a 70 50 61 72 73  ror(Parse *pPars
192c0 65 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20  e, Select *p){. 
192d0 20 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73   if( p->selFlags
192e0 20 26 20 53 46 5f 56 61 6c 75 65 73 20 29 7b 0a   & SF_Values ){.
192f0 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
19300 4d 73 67 28 70 50 61 72 73 65 2c 20 22 61 6c 6c  Msg(pParse, "all
19310 20 56 41 4c 55 45 53 20 6d 75 73 74 20 68 61 76   VALUES must hav
19320 65 20 74 68 65 20 73 61 6d 65 20 6e 75 6d 62 65  e the same numbe
19330 72 20 6f 66 20 74 65 72 6d 73 22 29 3b 0a 20 20  r of terms");.  
19340 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74  }else{.    sqlit
19350 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
19360 65 2c 20 22 53 45 4c 45 43 54 73 20 74 6f 20 74  e, "SELECTs to t
19370 68 65 20 6c 65 66 74 20 61 6e 64 20 72 69 67 68  he left and righ
19380 74 20 6f 66 20 25 73 22 0a 20 20 20 20 20 20 22  t of %s".      "
19390 20 64 6f 20 6e 6f 74 20 68 61 76 65 20 74 68 65   do not have the
193a0 20 73 61 6d 65 20 6e 75 6d 62 65 72 20 6f 66 20   same number of 
193b0 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 22 2c  result columns",
193c0 20 73 65 6c 65 63 74 4f 70 4e 61 6d 65 28 70 2d   selectOpName(p-
193d0 3e 6f 70 29 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  >op));.  }.}../*
193e0 0a 2a 2a 20 43 6f 64 65 20 61 6e 20 6f 75 74 70  .** Code an outp
193f0 75 74 20 73 75 62 72 6f 75 74 69 6e 65 20 66 6f  ut subroutine fo
19400 72 20 61 20 63 6f 72 6f 75 74 69 6e 65 20 69 6d  r a coroutine im
19410 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20  plementation of 
19420 61 0a 2a 2a 20 53 45 4c 45 43 54 20 73 74 61 74  a.** SELECT stat
19430 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ment..**.** The 
19440 64 61 74 61 20 74 6f 20 62 65 20 6f 75 74 70 75  data to be outpu
19450 74 20 69 73 20 63 6f 6e 74 61 69 6e 65 64 20 69  t is contained i
19460 6e 20 70 49 6e 2d 3e 69 53 64 73 74 2e 20 20 54  n pIn->iSdst.  T
19470 68 65 72 65 20 61 72 65 0a 2a 2a 20 70 49 6e 2d  here are.** pIn-
19480 3e 6e 53 64 73 74 20 63 6f 6c 75 6d 6e 73 20 74  >nSdst columns t
19490 6f 20 62 65 20 6f 75 74 70 75 74 2e 20 20 70 44  o be output.  pD
194a0 65 73 74 20 69 73 20 77 68 65 72 65 20 74 68 65  est is where the
194b0 20 6f 75 74 70 75 74 20 73 68 6f 75 6c 64 0a 2a   output should.*
194c0 2a 20 62 65 20 73 65 6e 74 2e 0a 2a 2a 0a 2a 2a  * be sent..**.**
194d0 20 72 65 67 52 65 74 75 72 6e 20 69 73 20 74 68   regReturn is th
194e0 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20  e number of the 
194f0 72 65 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67  register holding
19500 20 74 68 65 20 73 75 62 72 6f 75 74 69 6e 65 0a   the subroutine.
19510 2a 2a 20 72 65 74 75 72 6e 20 61 64 64 72 65 73  ** return addres
19520 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 72 65 67 50  s..**.** If regP
19530 72 65 76 3e 30 20 74 68 65 6e 20 69 74 20 69 73  rev>0 then it is
19540 20 74 68 65 20 66 69 72 73 74 20 72 65 67 69 73   the first regis
19550 74 65 72 20 69 6e 20 61 20 76 65 63 74 6f 72 20  ter in a vector 
19560 74 68 61 74 0a 2a 2a 20 72 65 63 6f 72 64 73 20  that.** records 
19570 74 68 65 20 70 72 65 76 69 6f 75 73 20 6f 75 74  the previous out
19580 70 75 74 2e 20 20 6d 65 6d 5b 72 65 67 50 72 65  put.  mem[regPre
19590 76 5d 20 69 73 20 61 20 66 6c 61 67 20 74 68 61  v] is a flag tha
195a0 74 20 69 73 20 66 61 6c 73 65 0a 2a 2a 20 69 66  t is false.** if
195b0 20 74 68 65 72 65 20 68 61 73 20 62 65 65 6e 20   there has been 
195c0 6e 6f 20 70 72 65 76 69 6f 75 73 20 6f 75 74 70  no previous outp
195d0 75 74 2e 20 20 49 66 20 72 65 67 50 72 65 76 3e  ut.  If regPrev>
195e0 30 20 74 68 65 6e 20 63 6f 64 65 20 69 73 0a 2a  0 then code is.*
195f0 2a 20 67 65 6e 65 72 61 74 65 64 20 74 6f 20 73  * generated to s
19600 75 70 70 72 65 73 73 20 64 75 70 6c 69 63 61 74  uppress duplicat
19610 65 73 2e 20 20 70 4b 65 79 49 6e 66 6f 20 69 73  es.  pKeyInfo is
19620 20 75 73 65 64 20 66 6f 72 20 63 6f 6d 70 61 72   used for compar
19630 69 6e 67 0a 2a 2a 20 6b 65 79 73 2e 0a 2a 2a 0a  ing.** keys..**.
19640 2a 2a 20 49 66 20 74 68 65 20 4c 49 4d 49 54 20  ** If the LIMIT 
19650 66 6f 75 6e 64 20 69 6e 20 70 2d 3e 69 4c 69 6d  found in p->iLim
19660 69 74 20 69 73 20 72 65 61 63 68 65 64 2c 20 6a  it is reached, j
19670 75 6d 70 20 69 6d 6d 65 64 69 61 74 65 6c 79 20  ump immediately 
19680 74 6f 0a 2a 2a 20 69 42 72 65 61 6b 2e 0a 2a 2f  to.** iBreak..*/
19690 0a 73 74 61 74 69 63 20 69 6e 74 20 67 65 6e 65  .static int gene
196a0 72 61 74 65 4f 75 74 70 75 74 53 75 62 72 6f 75  rateOutputSubrou
196b0 74 69 6e 65 28 0a 20 20 50 61 72 73 65 20 2a 70  tine(.  Parse *p
196c0 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20  Parse,          
196d0 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
196e0 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  xt */.  Select *
196f0 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
19700 2f 2a 20 54 68 65 20 53 45 4c 45 43 54 20 73 74  /* The SELECT st
19710 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 53 65 6c  atement */.  Sel
19720 65 63 74 44 65 73 74 20 2a 70 49 6e 2c 20 20 20  ectDest *pIn,   
19730 20 20 20 20 20 2f 2a 20 43 6f 72 6f 75 74 69 6e       /* Coroutin
19740 65 20 73 75 70 70 6c 79 69 6e 67 20 64 61 74 61  e supplying data
19750 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74   */.  SelectDest
19760 20 2a 70 44 65 73 74 2c 20 20 20 20 20 20 2f 2a   *pDest,      /*
19770 20 57 68 65 72 65 20 74 6f 20 73 65 6e 64 20 74   Where to send t
19780 68 65 20 64 61 74 61 20 2a 2f 0a 20 20 69 6e 74  he data */.  int
19790 20 72 65 67 52 65 74 75 72 6e 2c 20 20 20 20 20   regReturn,     
197a0 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65 74 75       /* The retu
197b0 72 6e 20 61 64 64 72 65 73 73 20 72 65 67 69 73  rn address regis
197c0 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67  ter */.  int reg
197d0 50 72 65 76 2c 20 20 20 20 20 20 20 20 20 20 20  Prev,           
197e0 20 2f 2a 20 50 72 65 76 69 6f 75 73 20 72 65 73   /* Previous res
197f0 75 6c 74 20 72 65 67 69 73 74 65 72 2e 20 20 4e  ult register.  N
19800 6f 20 75 6e 69 71 75 65 6e 65 73 73 20 69 66 20  o uniqueness if 
19810 30 20 2a 2f 0a 20 20 4b 65 79 49 6e 66 6f 20 2a  0 */.  KeyInfo *
19820 70 4b 65 79 49 6e 66 6f 2c 20 20 20 20 20 20 2f  pKeyInfo,      /
19830 2a 20 46 6f 72 20 63 6f 6d 70 61 72 69 6e 67 20  * For comparing 
19840 77 69 74 68 20 70 72 65 76 69 6f 75 73 20 65 6e  with previous en
19850 74 72 79 20 2a 2f 0a 20 20 69 6e 74 20 69 42 72  try */.  int iBr
19860 65 61 6b 20 20 20 20 20 20 20 20 20 20 20 20 20  eak             
19870 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 69 66   /* Jump here if
19880 20 77 65 20 68 69 74 20 74 68 65 20 4c 49 4d 49   we hit the LIMI
19890 54 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a  T */.){.  Vdbe *
198a0 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
198b0 65 3b 0a 20 20 69 6e 74 20 69 43 6f 6e 74 69 6e  e;.  int iContin
198c0 75 65 3b 0a 20 20 69 6e 74 20 61 64 64 72 3b 0a  ue;.  int addr;.
198d0 0a 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65  .  addr = sqlite
198e0 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
198f0 28 76 29 3b 0a 20 20 69 43 6f 6e 74 69 6e 75 65  (v);.  iContinue
19900 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
19910 6b 65 4c 61 62 65 6c 28 70 50 61 72 73 65 29 3b  keLabel(pParse);
19920 0a 0a 20 20 2f 2a 20 53 75 70 70 72 65 73 73 20  ..  /* Suppress 
19930 64 75 70 6c 69 63 61 74 65 73 20 66 6f 72 20 55  duplicates for U
19940 4e 49 4f 4e 2c 20 45 58 43 45 50 54 2c 20 61 6e  NION, EXCEPT, an
19950 64 20 49 4e 54 45 52 53 45 43 54 20 0a 20 20 2a  d INTERSECT .  *
19960 2f 0a 20 20 69 66 28 20 72 65 67 50 72 65 76 20  /.  if( regPrev 
19970 29 7b 0a 20 20 20 20 69 6e 74 20 61 64 64 72 31  ){.    int addr1
19980 2c 20 61 64 64 72 32 3b 0a 20 20 20 20 61 64 64  , addr2;.    add
19990 72 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  r1 = sqlite3Vdbe
199a0 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66 4e  AddOp1(v, OP_IfN
199b0 6f 74 2c 20 72 65 67 50 72 65 76 29 3b 20 56 64  ot, regPrev); Vd
199c0 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
199d0 20 20 20 61 64 64 72 32 20 3d 20 73 71 6c 69 74     addr2 = sqlit
199e0 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
199f0 4f 50 5f 43 6f 6d 70 61 72 65 2c 20 70 49 6e 2d  OP_Compare, pIn-
19a00 3e 69 53 64 73 74 2c 20 72 65 67 50 72 65 76 2b  >iSdst, regPrev+
19a10 31 2c 20 70 49 6e 2d 3e 6e 53 64 73 74 2c 0a 20  1, pIn->nSdst,. 
19a20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19a30 20 20 20 20 20 20 20 20 20 20 20 20 20 28 63 68               (ch
19a40 61 72 2a 29 73 71 6c 69 74 65 33 4b 65 79 49 6e  ar*)sqlite3KeyIn
19a50 66 6f 52 65 66 28 70 4b 65 79 49 6e 66 6f 29 2c  foRef(pKeyInfo),
19a60 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20   P4_KEYINFO);.  
19a70 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
19a80 4f 70 33 28 76 2c 20 4f 50 5f 4a 75 6d 70 2c 20  Op3(v, OP_Jump, 
19a90 61 64 64 72 32 2b 32 2c 20 69 43 6f 6e 74 69 6e  addr2+2, iContin
19aa0 75 65 2c 20 61 64 64 72 32 2b 32 29 3b 20 56 64  ue, addr2+2); Vd
19ab0 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
19ac0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
19ad0 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 31 29  mpHere(v, addr1)
19ae0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
19af0 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f  eAddOp3(v, OP_Co
19b00 70 79 2c 20 70 49 6e 2d 3e 69 53 64 73 74 2c 20  py, pIn->iSdst, 
19b10 72 65 67 50 72 65 76 2b 31 2c 20 70 49 6e 2d 3e  regPrev+1, pIn->
19b20 6e 53 64 73 74 2d 31 29 3b 0a 20 20 20 20 73 71  nSdst-1);.    sq
19b30 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
19b40 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31  v, OP_Integer, 1
19b50 2c 20 72 65 67 50 72 65 76 29 3b 0a 20 20 7d 0a  , regPrev);.  }.
19b60 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 64 62    if( pParse->db
19b70 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
19b80 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20 2f 2a   return 0;..  /*
19b90 20 53 75 70 70 72 65 73 73 20 74 68 65 20 66 69   Suppress the fi
19ba0 72 73 74 20 4f 46 46 53 45 54 20 65 6e 74 72 69  rst OFFSET entri
19bb0 65 73 20 69 66 20 74 68 65 72 65 20 69 73 20 61  es if there is a
19bc0 6e 20 4f 46 46 53 45 54 20 63 6c 61 75 73 65 0a  n OFFSET clause.
19bd0 20 20 2a 2f 0a 20 20 63 6f 64 65 4f 66 66 73 65    */.  codeOffse
19be0 74 28 76 2c 20 70 2d 3e 69 4f 66 66 73 65 74 2c  t(v, p->iOffset,
19bf0 20 69 43 6f 6e 74 69 6e 75 65 29 3b 0a 0a 20 20   iContinue);..  
19c00 61 73 73 65 72 74 28 20 70 44 65 73 74 2d 3e 65  assert( pDest->e
19c10 44 65 73 74 21 3d 53 52 54 5f 45 78 69 73 74 73  Dest!=SRT_Exists
19c20 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 44   );.  assert( pD
19c30 65 73 74 2d 3e 65 44 65 73 74 21 3d 53 52 54 5f  est->eDest!=SRT_
19c40 54 61 62 6c 65 20 29 3b 0a 20 20 73 77 69 74 63  Table );.  switc
19c50 68 28 20 70 44 65 73 74 2d 3e 65 44 65 73 74 20  h( pDest->eDest 
19c60 29 7b 0a 20 20 20 20 2f 2a 20 53 74 6f 72 65 20  ){.    /* Store 
19c70 74 68 65 20 72 65 73 75 6c 74 20 61 73 20 64 61  the result as da
19c80 74 61 20 75 73 69 6e 67 20 61 20 75 6e 69 71 75  ta using a uniqu
19c90 65 20 6b 65 79 2e 0a 20 20 20 20 2a 2f 0a 20 20  e key..    */.  
19ca0 20 20 63 61 73 65 20 53 52 54 5f 45 70 68 65 6d    case SRT_Ephem
19cb0 54 61 62 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74  Tab: {.      int
19cc0 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74   r1 = sqlite3Get
19cd0 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b  TempReg(pParse);
19ce0 0a 20 20 20 20 20 20 69 6e 74 20 72 32 20 3d 20  .      int r2 = 
19cf0 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65  sqlite3GetTempRe
19d00 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  g(pParse);.     
19d10 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
19d20 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63  p3(v, OP_MakeRec
19d30 6f 72 64 2c 20 70 49 6e 2d 3e 69 53 64 73 74 2c  ord, pIn->iSdst,
19d40 20 70 49 6e 2d 3e 6e 53 64 73 74 2c 20 72 31 29   pIn->nSdst, r1)
19d50 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
19d60 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
19d70 4e 65 77 52 6f 77 69 64 2c 20 70 44 65 73 74 2d  NewRowid, pDest-
19d80 3e 69 53 44 50 61 72 6d 2c 20 72 32 29 3b 0a 20  >iSDParm, r2);. 
19d90 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
19da0 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 73  AddOp3(v, OP_Ins
19db0 65 72 74 2c 20 70 44 65 73 74 2d 3e 69 53 44 50  ert, pDest->iSDP
19dc0 61 72 6d 2c 20 72 31 2c 20 72 32 29 3b 0a 20 20  arm, r1, r2);.  
19dd0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
19de0 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41  hangeP5(v, OPFLA
19df0 47 5f 41 50 50 45 4e 44 29 3b 0a 20 20 20 20 20  G_APPEND);.     
19e00 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
19e10 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
19e20 32 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  2);.      sqlite
19e30 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
19e40 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 20 20 20  pParse, r1);.   
19e50 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
19e60 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
19e70 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20  OMIT_SUBQUERY.  
19e80 20 20 2f 2a 20 49 66 20 77 65 20 61 72 65 20 63    /* If we are c
19e90 72 65 61 74 69 6e 67 20 61 20 73 65 74 20 66 6f  reating a set fo
19ea0 72 20 61 6e 20 22 65 78 70 72 20 49 4e 20 28 53  r an "expr IN (S
19eb0 45 4c 45 43 54 20 2e 2e 2e 29 22 2e 0a 20 20 20  ELECT ...)"..   
19ec0 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54   */.    case SRT
19ed0 5f 53 65 74 3a 20 7b 0a 20 20 20 20 20 20 69 6e  _Set: {.      in
19ee0 74 20 72 31 3b 0a 20 20 20 20 20 20 74 65 73 74  t r1;.      test
19ef0 63 61 73 65 28 20 70 49 6e 2d 3e 6e 53 64 73 74  case( pIn->nSdst
19f00 3e 31 20 29 3b 0a 20 20 20 20 20 20 72 31 20 3d  >1 );.      r1 =
19f10 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
19f20 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  eg(pParse);.    
19f30 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
19f40 4f 70 34 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65  Op4(v, OP_MakeRe
19f50 63 6f 72 64 2c 20 70 49 6e 2d 3e 69 53 64 73 74  cord, pIn->iSdst
19f60 2c 20 70 49 6e 2d 3e 6e 53 64 73 74 2c 20 0a 20  , pIn->nSdst, . 
19f70 20 20 20 20 20 20 20 20 20 72 31 2c 20 70 44 65           r1, pDe
19f80 73 74 2d 3e 7a 41 66 66 53 64 73 74 2c 20 70 49  st->zAffSdst, pI
19f90 6e 2d 3e 6e 53 64 73 74 29 3b 0a 20 20 20 20 20  n->nSdst);.     
19fa0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
19fb0 70 34 49 6e 74 28 76 2c 20 4f 50 5f 49 64 78 49  p4Int(v, OP_IdxI
19fc0 6e 73 65 72 74 2c 20 70 44 65 73 74 2d 3e 69 53  nsert, pDest->iS
19fd0 44 50 61 72 6d 2c 20 72 31 2c 0a 20 20 20 20 20  DParm, r1,.     
19fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19ff0 20 20 20 20 20 20 70 49 6e 2d 3e 69 53 64 73 74        pIn->iSdst
1a000 2c 20 70 49 6e 2d 3e 6e 53 64 73 74 29 3b 0a 20  , pIn->nSdst);. 
1a010 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65       sqlite3Rele
1a020 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
1a030 65 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 62 72  e, r1);.      br
1a040 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  eak;.    }..    
1a050 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 20  /* If this is a 
1a060 73 63 61 6c 61 72 20 73 65 6c 65 63 74 20 74 68  scalar select th
1a070 61 74 20 69 73 20 70 61 72 74 20 6f 66 20 61 6e  at is part of an
1a080 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 74 68 65   expression, the
1a090 6e 0a 20 20 20 20 2a 2a 20 73 74 6f 72 65 20 74  n.    ** store t
1a0a0 68 65 20 72 65 73 75 6c 74 73 20 69 6e 20 74 68  he results in th
1a0b0 65 20 61 70 70 72 6f 70 72 69 61 74 65 20 6d 65  e appropriate me
1a0c0 6d 6f 72 79 20 63 65 6c 6c 20 61 6e 64 20 62 72  mory cell and br
1a0d0 65 61 6b 20 6f 75 74 0a 20 20 20 20 2a 2a 20 6f  eak out.    ** o
1a0e0 66 20 74 68 65 20 73 63 61 6e 20 6c 6f 6f 70 2e  f the scan loop.
1a0f0 20 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20    Note that the 
1a100 73 65 6c 65 63 74 20 6d 69 67 68 74 20 72 65 74  select might ret
1a110 75 72 6e 20 6d 75 6c 74 69 70 6c 65 20 63 6f 6c  urn multiple col
1a120 75 6d 6e 73 0a 20 20 20 20 2a 2a 20 69 66 20 69  umns.    ** if i
1a130 74 20 69 73 20 74 68 65 20 52 48 53 20 6f 66 20  t is the RHS of 
1a140 61 20 72 6f 77 2d 76 61 6c 75 65 20 49 4e 20 6f  a row-value IN o
1a150 70 65 72 61 74 6f 72 2e 0a 20 20 20 20 2a 2f 0a  perator..    */.
1a160 20 20 20 20 63 61 73 65 20 53 52 54 5f 4d 65 6d      case SRT_Mem
1a170 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 70 50  : {.      if( pP
1a180 61 72 73 65 2d 3e 6e 45 72 72 3d 3d 30 20 29 7b  arse->nErr==0 ){
1a190 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
1a1a0 65 28 20 70 49 6e 2d 3e 6e 53 64 73 74 3e 31 20  e( pIn->nSdst>1 
1a1b0 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
1a1c0 65 33 45 78 70 72 43 6f 64 65 4d 6f 76 65 28 70  e3ExprCodeMove(p
1a1d0 50 61 72 73 65 2c 20 70 49 6e 2d 3e 69 53 64 73  Parse, pIn->iSds
1a1e0 74 2c 20 70 44 65 73 74 2d 3e 69 53 44 50 61 72  t, pDest->iSDPar
1a1f0 6d 2c 20 70 49 6e 2d 3e 6e 53 64 73 74 29 3b 0a  m, pIn->nSdst);.
1a200 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2f 2a        }.      /*
1a210 20 54 68 65 20 4c 49 4d 49 54 20 63 6c 61 75 73   The LIMIT claus
1a220 65 20 77 69 6c 6c 20 6a 75 6d 70 20 6f 75 74 20  e will jump out 
1a230 6f 66 20 74 68 65 20 6c 6f 6f 70 20 66 6f 72 20  of the loop for 
1a240 75 73 20 2a 2f 0a 20 20 20 20 20 20 62 72 65 61  us */.      brea
1a250 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 20  k;.    }.#endif 
1a260 2f 2a 20 23 69 66 6e 64 65 66 20 53 51 4c 49 54  /* #ifndef SQLIT
1a270 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 20  E_OMIT_SUBQUERY 
1a280 2a 2f 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 72  */..    /* The r
1a290 65 73 75 6c 74 73 20 61 72 65 20 73 74 6f 72 65  esults are store
1a2a0 64 20 69 6e 20 61 20 73 65 71 75 65 6e 63 65 20  d in a sequence 
1a2b0 6f 66 20 72 65 67 69 73 74 65 72 73 0a 20 20 20  of registers.   
1a2c0 20 2a 2a 20 73 74 61 72 74 69 6e 67 20 61 74 20   ** starting at 
1a2d0 70 44 65 73 74 2d 3e 69 53 64 73 74 2e 20 20 54  pDest->iSdst.  T
1a2e0 68 65 6e 20 74 68 65 20 63 6f 2d 72 6f 75 74 69  hen the co-routi
1a2f0 6e 65 20 79 69 65 6c 64 73 2e 0a 20 20 20 20 2a  ne yields..    *
1a300 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 43  /.    case SRT_C
1a310 6f 72 6f 75 74 69 6e 65 3a 20 7b 0a 20 20 20 20  oroutine: {.    
1a320 20 20 69 66 28 20 70 44 65 73 74 2d 3e 69 53 64    if( pDest->iSd
1a330 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  st==0 ){.       
1a340 20 70 44 65 73 74 2d 3e 69 53 64 73 74 20 3d 20   pDest->iSdst = 
1a350 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 61  sqlite3GetTempRa
1a360 6e 67 65 28 70 50 61 72 73 65 2c 20 70 49 6e 2d  nge(pParse, pIn-
1a370 3e 6e 53 64 73 74 29 3b 0a 20 20 20 20 20 20 20  >nSdst);.       
1a380 20 70 44 65 73 74 2d 3e 6e 53 64 73 74 20 3d 20   pDest->nSdst = 
1a390 70 49 6e 2d 3e 6e 53 64 73 74 3b 0a 20 20 20 20  pIn->nSdst;.    
1a3a0 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
1a3b0 33 45 78 70 72 43 6f 64 65 4d 6f 76 65 28 70 50  3ExprCodeMove(pP
1a3c0 61 72 73 65 2c 20 70 49 6e 2d 3e 69 53 64 73 74  arse, pIn->iSdst
1a3d0 2c 20 70 44 65 73 74 2d 3e 69 53 64 73 74 2c 20  , pDest->iSdst, 
1a3e0 70 49 6e 2d 3e 6e 53 64 73 74 29 3b 0a 20 20 20  pIn->nSdst);.   
1a3f0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1a400 64 4f 70 31 28 76 2c 20 4f 50 5f 59 69 65 6c 64  dOp1(v, OP_Yield
1a410 2c 20 70 44 65 73 74 2d 3e 69 53 44 50 61 72 6d  , pDest->iSDParm
1a420 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
1a430 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66      }..    /* If
1a440 20 6e 6f 6e 65 20 6f 66 20 74 68 65 20 61 62 6f   none of the abo
1a450 76 65 2c 20 74 68 65 6e 20 74 68 65 20 72 65 73  ve, then the res
1a460 75 6c 74 20 64 65 73 74 69 6e 61 74 69 6f 6e 20  ult destination 
1a470 6d 75 73 74 20 62 65 0a 20 20 20 20 2a 2a 20 53  must be.    ** S
1a480 52 54 5f 4f 75 74 70 75 74 2e 20 20 54 68 69 73  RT_Output.  This
1a490 20 72 6f 75 74 69 6e 65 20 69 73 20 6e 65 76 65   routine is neve
1a4a0 72 20 63 61 6c 6c 65 64 20 77 69 74 68 20 61 6e  r called with an
1a4b0 79 20 6f 74 68 65 72 0a 20 20 20 20 2a 2a 20 64  y other.    ** d
1a4c0 65 73 74 69 6e 61 74 69 6f 6e 20 6f 74 68 65 72  estination other
1a4d0 20 74 68 61 6e 20 74 68 65 20 6f 6e 65 73 20 68   than the ones h
1a4e0 61 6e 64 6c 65 64 20 61 62 6f 76 65 20 6f 72 20  andled above or 
1a4f0 53 52 54 5f 4f 75 74 70 75 74 2e 0a 20 20 20 20  SRT_Output..    
1a500 2a 2a 0a 20 20 20 20 2a 2a 20 46 6f 72 20 53 52  **.    ** For SR
1a510 54 5f 4f 75 74 70 75 74 2c 20 72 65 73 75 6c 74  T_Output, result
1a520 73 20 61 72 65 20 73 74 6f 72 65 64 20 69 6e 20  s are stored in 
1a530 61 20 73 65 71 75 65 6e 63 65 20 6f 66 20 72 65  a sequence of re
1a540 67 69 73 74 65 72 73 2e 20 20 0a 20 20 20 20 2a  gisters.  .    *
1a550 2a 20 54 68 65 6e 20 74 68 65 20 4f 50 5f 52 65  * Then the OP_Re
1a560 73 75 6c 74 52 6f 77 20 6f 70 63 6f 64 65 20 69  sultRow opcode i
1a570 73 20 75 73 65 64 20 74 6f 20 63 61 75 73 65 20  s used to cause 
1a580 73 71 6c 69 74 65 33 5f 73 74 65 70 28 29 20 74  sqlite3_step() t
1a590 6f 0a 20 20 20 20 2a 2a 20 72 65 74 75 72 6e 20  o.    ** return 
1a5a0 74 68 65 20 6e 65 78 74 20 72 6f 77 20 6f 66 20  the next row of 
1a5b0 72 65 73 75 6c 74 2e 0a 20 20 20 20 2a 2f 0a 20  result..    */. 
1a5c0 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20     default: {.  
1a5d0 20 20 20 20 61 73 73 65 72 74 28 20 70 44 65 73      assert( pDes
1a5e0 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75  t->eDest==SRT_Ou
1a5f0 74 70 75 74 20 29 3b 0a 20 20 20 20 20 20 73 71  tput );.      sq
1a600 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
1a610 76 2c 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77 2c  v, OP_ResultRow,
1a620 20 70 49 6e 2d 3e 69 53 64 73 74 2c 20 70 49 6e   pIn->iSdst, pIn
1a630 2d 3e 6e 53 64 73 74 29 3b 0a 20 20 20 20 20 20  ->nSdst);.      
1a640 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d  break;.    }.  }
1a650 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 74 6f 20 74  ..  /* Jump to t
1a660 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6c 6f  he end of the lo
1a670 6f 70 20 69 66 20 74 68 65 20 4c 49 4d 49 54 20  op if the LIMIT 
1a680 69 73 20 72 65 61 63 68 65 64 2e 0a 20 20 2a 2f  is reached..  */
1a690 0a 20 20 69 66 28 20 70 2d 3e 69 4c 69 6d 69 74  .  if( p->iLimit
1a6a0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
1a6b0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
1a6c0 44 65 63 72 4a 75 6d 70 5a 65 72 6f 2c 20 70 2d  DecrJumpZero, p-
1a6d0 3e 69 4c 69 6d 69 74 2c 20 69 42 72 65 61 6b 29  >iLimit, iBreak)
1a6e0 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
1a6f0 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e  );.  }..  /* Gen
1a700 65 72 61 74 65 20 74 68 65 20 73 75 62 72 6f 75  erate the subrou
1a710 74 69 6e 65 20 72 65 74 75 72 6e 0a 20 20 2a 2f  tine return.  */
1a720 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65  .  sqlite3VdbeRe
1a730 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69 43  solveLabel(v, iC
1a740 6f 6e 74 69 6e 75 65 29 3b 0a 20 20 73 71 6c 69  ontinue);.  sqli
1a750 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
1a760 20 4f 50 5f 52 65 74 75 72 6e 2c 20 72 65 67 52   OP_Return, regR
1a770 65 74 75 72 6e 29 3b 0a 0a 20 20 72 65 74 75 72  eturn);..  retur
1a780 6e 20 61 64 64 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n addr;.}../*.**
1a790 20 41 6c 74 65 72 6e 61 74 69 76 65 20 63 6f 6d   Alternative com
1a7a0 70 6f 75 6e 64 20 73 65 6c 65 63 74 20 63 6f 64  pound select cod
1a7b0 65 20 67 65 6e 65 72 61 74 6f 72 20 66 6f 72 20  e generator for 
1a7c0 63 61 73 65 73 20 77 68 65 6e 20 74 68 65 72 65  cases when there
1a7d0 0a 2a 2a 20 69 73 20 61 6e 20 4f 52 44 45 52 20  .** is an ORDER 
1a7e0 42 59 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a  BY clause..**.**
1a7f0 20 57 65 20 61 73 73 75 6d 65 20 61 20 71 75 65   We assume a que
1a800 72 79 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ry of the follow
1a810 69 6e 67 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20  ing form:.**.** 
1a820 20 20 20 20 20 3c 73 65 6c 65 63 74 41 3e 20 20       <selectA>  
1a830 3c 6f 70 65 72 61 74 6f 72 3e 20 20 3c 73 65 6c  <operator>  <sel
1a840 65 63 74 42 3e 20 20 4f 52 44 45 52 20 42 59 20  ectB>  ORDER BY 
1a850 3c 6f 72 64 65 72 62 79 6c 69 73 74 3e 0a 2a 2a  <orderbylist>.**
1a860 0a 2a 2a 20 3c 6f 70 65 72 61 74 6f 72 3e 20 69  .** <operator> i
1a870 73 20 6f 6e 65 20 6f 66 20 55 4e 49 4f 4e 20 41  s one of UNION A
1a880 4c 4c 2c 20 55 4e 49 4f 4e 2c 20 45 58 43 45 50  LL, UNION, EXCEP
1a890 54 2c 20 6f 72 20 49 4e 54 45 52 53 45 43 54 2e  T, or INTERSECT.
1a8a0 20 20 54 68 65 20 69 64 65 61 0a 2a 2a 20 69 73    The idea.** is
1a8b0 20 74 6f 20 63 6f 64 65 20 62 6f 74 68 20 3c 73   to code both <s
1a8c0 65 6c 65 63 74 41 3e 20 61 6e 64 20 3c 73 65 6c  electA> and <sel
1a8d0 65 63 74 42 3e 20 77 69 74 68 20 74 68 65 20 4f  ectB> with the O
1a8e0 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 61  RDER BY clause a
1a8f0 73 0a 2a 2a 20 63 6f 2d 72 6f 75 74 69 6e 65 73  s.** co-routines
1a900 2e 20 20 54 68 65 6e 20 72 75 6e 20 74 68 65 20  .  Then run the 
1a910 63 6f 2d 72 6f 75 74 69 6e 65 73 20 69 6e 20 70  co-routines in p
1a920 61 72 61 6c 6c 65 6c 20 61 6e 64 20 6d 65 72 67  arallel and merg
1a930 65 20 74 68 65 20 72 65 73 75 6c 74 73 0a 2a 2a  e the results.**
1a940 20 69 6e 74 6f 20 74 68 65 20 6f 75 74 70 75 74   into the output
1a950 2e 20 20 49 6e 20 61 64 64 69 74 69 6f 6e 20 74  .  In addition t
1a960 6f 20 74 68 65 20 74 77 6f 20 63 6f 72 6f 75 74  o the two corout
1a970 69 6e 65 73 20 28 63 61 6c 6c 65 64 20 73 65 6c  ines (called sel
1a980 65 63 74 41 20 61 6e 64 0a 2a 2a 20 73 65 6c 65  ectA and.** sele
1a990 63 74 42 29 20 74 68 65 72 65 20 61 72 65 20 37  ctB) there are 7
1a9a0 20 73 75 62 72 6f 75 74 69 6e 65 73 3a 0a 2a 2a   subroutines:.**
1a9b0 0a 2a 2a 20 20 20 20 6f 75 74 41 3a 20 20 20 20  .**    outA:    
1a9c0 4d 6f 76 65 20 74 68 65 20 6f 75 74 70 75 74 20  Move the output 
1a9d0 6f 66 20 74 68 65 20 73 65 6c 65 63 74 41 20 63  of the selectA c
1a9e0 6f 72 6f 75 74 69 6e 65 20 69 6e 74 6f 20 74 68  oroutine into th
1a9f0 65 20 6f 75 74 70 75 74 0a 2a 2a 20 20 20 20 20  e output.**     
1aa00 20 20 20 20 20 20 20 20 6f 66 20 74 68 65 20 63          of the c
1aa10 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79 2e 0a 2a  ompound query..*
1aa20 2a 0a 2a 2a 20 20 20 20 6f 75 74 42 3a 20 20 20  *.**    outB:   
1aa30 20 4d 6f 76 65 20 74 68 65 20 6f 75 74 70 75 74   Move the output
1aa40 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74 42 20   of the selectB 
1aa50 63 6f 72 6f 75 74 69 6e 65 20 69 6e 74 6f 20 74  coroutine into t
1aa60 68 65 20 6f 75 74 70 75 74 0a 2a 2a 20 20 20 20  he output.**    
1aa70 20 20 20 20 20 20 20 20 20 6f 66 20 74 68 65 20           of the 
1aa80 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79 2e 20  compound query. 
1aa90 20 28 4f 6e 6c 79 20 67 65 6e 65 72 61 74 65 64   (Only generated
1aaa0 20 66 6f 72 20 55 4e 49 4f 4e 20 61 6e 64 0a 2a   for UNION and.*
1aab0 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 55 4e  *             UN
1aac0 49 4f 4e 20 41 4c 4c 2e 20 20 45 58 43 45 50 54  ION ALL.  EXCEPT
1aad0 20 61 6e 64 20 49 4e 53 45 52 54 53 45 43 54 20   and INSERTSECT 
1aae0 6e 65 76 65 72 20 6f 75 74 70 75 74 20 61 20 72  never output a r
1aaf0 6f 77 20 74 68 61 74 0a 2a 2a 20 20 20 20 20 20  ow that.**      
1ab00 20 20 20 20 20 20 20 61 70 70 65 61 72 73 20 6f         appears o
1ab10 6e 6c 79 20 69 6e 20 42 2e 29 0a 2a 2a 0a 2a 2a  nly in B.).**.**
1ab20 20 20 20 20 41 6c 74 42 3a 20 20 20 20 43 61 6c      AltB:    Cal
1ab30 6c 65 64 20 77 68 65 6e 20 74 68 65 72 65 20 69  led when there i
1ab40 73 20 64 61 74 61 20 66 72 6f 6d 20 62 6f 74 68  s data from both
1ab50 20 63 6f 72 6f 75 74 69 6e 65 73 20 61 6e 64 20   coroutines and 
1ab60 41 3c 42 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 41 65  A<B..**.**    Ae
1ab70 71 42 3a 20 20 20 20 43 61 6c 6c 65 64 20 77 68  qB:    Called wh
1ab80 65 6e 20 74 68 65 72 65 20 69 73 20 64 61 74 61  en there is data
1ab90 20 66 72 6f 6d 20 62 6f 74 68 20 63 6f 72 6f 75   from both corou
1aba0 74 69 6e 65 73 20 61 6e 64 20 41 3d 3d 42 2e 0a  tines and A==B..
1abb0 2a 2a 0a 2a 2a 20 20 20 20 41 67 74 42 3a 20 20  **.**    AgtB:  
1abc0 20 20 43 61 6c 6c 65 64 20 77 68 65 6e 20 74 68    Called when th
1abd0 65 72 65 20 69 73 20 64 61 74 61 20 66 72 6f 6d  ere is data from
1abe0 20 62 6f 74 68 20 63 6f 72 6f 75 74 69 6e 65 73   both coroutines
1abf0 20 61 6e 64 20 41 3e 42 2e 0a 2a 2a 0a 2a 2a 20   and A>B..**.** 
1ac00 20 20 20 45 6f 66 41 3a 20 20 20 20 43 61 6c 6c     EofA:    Call
1ac10 65 64 20 77 68 65 6e 20 64 61 74 61 20 69 73 20  ed when data is 
1ac20 65 78 68 61 75 73 74 65 64 20 66 72 6f 6d 20 73  exhausted from s
1ac30 65 6c 65 63 74 41 2e 0a 2a 2a 0a 2a 2a 20 20 20  electA..**.**   
1ac40 20 45 6f 66 42 3a 20 20 20 20 43 61 6c 6c 65 64   EofB:    Called
1ac50 20 77 68 65 6e 20 64 61 74 61 20 69 73 20 65 78   when data is ex
1ac60 68 61 75 73 74 65 64 20 66 72 6f 6d 20 73 65 6c  hausted from sel
1ac70 65 63 74 42 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ectB..**.** The 
1ac80 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f  implementation o
1ac90 66 20 74 68 65 20 6c 61 74 74 65 72 20 66 69 76  f the latter fiv
1aca0 65 20 73 75 62 72 6f 75 74 69 6e 65 73 20 64 65  e subroutines de
1acb0 70 65 6e 64 20 6f 6e 20 77 68 69 63 68 20 0a 2a  pend on which .*
1acc0 2a 20 3c 6f 70 65 72 61 74 6f 72 3e 20 69 73 20  * <operator> is 
1acd0 75 73 65 64 3a 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 20  used:.**.**.**  
1ace0 20 20 20 20 20 20 20 20 20 20 20 55 4e 49 4f 4e             UNION
1acf0 20 41 4c 4c 20 20 20 20 20 20 20 20 20 55 4e 49   ALL         UNI
1ad00 4f 4e 20 20 20 20 20 20 20 20 20 20 20 20 45 58  ON            EX
1ad10 43 45 50 54 20 20 20 20 20 20 20 20 20 20 49 4e  CEPT          IN
1ad20 54 45 52 53 45 43 54 0a 2a 2a 20 20 20 20 20 20  TERSECT.**      
1ad30 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d      ------------
1ad40 2d 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  -  -------------
1ad50 2d 2d 2d 2d 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----  ----------
1ad60 2d 2d 2d 2d 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----  ----------
1ad70 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 41 6c 74  -------.**   Alt
1ad80 42 3a 20 20 20 6f 75 74 41 2c 20 6e 65 78 74 41  B:   outA, nextA
1ad90 20 20 20 20 20 20 6f 75 74 41 2c 20 6e 65 78 74        outA, next
1ada0 41 20 20 20 20 20 20 20 6f 75 74 41 2c 20 6e 65  A       outA, ne
1adb0 78 74 41 20 20 20 20 20 20 20 20 20 6e 65 78 74  xtA         next
1adc0 41 0a 2a 2a 0a 2a 2a 20 20 20 41 65 71 42 3a 20  A.**.**   AeqB: 
1add0 20 20 6f 75 74 41 2c 20 6e 65 78 74 41 20 20 20    outA, nextA   
1ade0 20 20 20 20 20 20 6e 65 78 74 41 20 20 20 20 20        nextA     
1adf0 20 20 20 20 20 20 20 20 6e 65 78 74 41 20 20 20          nextA   
1ae00 20 20 20 20 20 20 6f 75 74 41 2c 20 6e 65 78 74        outA, next
1ae10 41 0a 2a 2a 0a 2a 2a 20 20 20 41 67 74 42 3a 20  A.**.**   AgtB: 
1ae20 20 20 6f 75 74 42 2c 20 6e 65 78 74 42 20 20 20    outB, nextB   
1ae30 20 20 20 6f 75 74 42 2c 20 6e 65 78 74 42 20 20     outB, nextB  
1ae40 20 20 20 20 20 20 20 20 6e 65 78 74 42 20 20 20          nextB   
1ae50 20 20 20 20 20 20 20 20 20 6e 65 78 74 42 0a 2a           nextB.*
1ae60 2a 0a 2a 2a 20 20 20 45 6f 66 41 3a 20 20 20 6f  *.**   EofA:   o
1ae70 75 74 42 2c 20 6e 65 78 74 42 20 20 20 20 20 20  utB, nextB      
1ae80 6f 75 74 42 2c 20 6e 65 78 74 42 20 20 20 20 20  outB, nextB     
1ae90 20 20 20 20 20 68 61 6c 74 20 20 20 20 20 20 20       halt       
1aea0 20 20 20 20 20 20 68 61 6c 74 0a 2a 2a 0a 2a 2a        halt.**.**
1aeb0 20 20 20 45 6f 66 42 3a 20 20 20 6f 75 74 41 2c     EofB:   outA,
1aec0 20 6e 65 78 74 41 20 20 20 20 20 20 6f 75 74 41   nextA      outA
1aed0 2c 20 6e 65 78 74 41 20 20 20 20 20 20 20 6f 75  , nextA       ou
1aee0 74 41 2c 20 6e 65 78 74 41 20 20 20 20 20 20 20  tA, nextA       
1aef0 20 20 68 61 6c 74 0a 2a 2a 0a 2a 2a 20 49 6e 20    halt.**.** In 
1af00 74 68 65 20 41 6c 74 42 2c 20 41 65 71 42 2c 20  the AltB, AeqB, 
1af10 61 6e 64 20 41 67 74 42 20 73 75 62 72 6f 75 74  and AgtB subrout
1af20 69 6e 65 73 2c 20 61 6e 20 45 4f 46 20 6f 6e 20  ines, an EOF on 
1af30 41 20 66 6f 6c 6c 6f 77 69 6e 67 20 6e 65 78 74  A following next
1af40 41 0a 2a 2a 20 63 61 75 73 65 73 20 61 6e 20 69  A.** causes an i
1af50 6d 6d 65 64 69 61 74 65 20 6a 75 6d 70 20 74 6f  mmediate jump to
1af60 20 45 6f 66 41 20 61 6e 64 20 61 6e 20 45 4f 46   EofA and an EOF
1af70 20 6f 6e 20 42 20 66 6f 6c 6c 6f 77 69 6e 67 20   on B following 
1af80 6e 65 78 74 42 20 63 61 75 73 65 73 0a 2a 2a 20  nextB causes.** 
1af90 61 6e 20 69 6d 6d 65 64 69 61 74 65 20 6a 75 6d  an immediate jum
1afa0 70 20 74 6f 20 45 6f 66 42 2e 20 20 57 69 74 68  p to EofB.  With
1afb0 69 6e 20 45 6f 66 41 20 61 6e 64 20 45 6f 66 42  in EofA and EofB
1afc0 2c 20 61 6e 64 20 45 4f 46 20 6f 6e 20 65 6e 74  , and EOF on ent
1afd0 72 79 20 6f 72 0a 2a 2a 20 66 6f 6c 6c 6f 77 69  ry or.** followi
1afe0 6e 67 20 6e 65 78 74 58 20 63 61 75 73 65 73 20  ng nextX causes 
1aff0 61 20 6a 75 6d 70 20 74 6f 20 74 68 65 20 65 6e  a jump to the en
1b000 64 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74 20  d of the select 
1b010 70 72 6f 63 65 73 73 69 6e 67 2e 0a 2a 2a 0a 2a  processing..**.*
1b020 2a 20 44 75 70 6c 69 63 61 74 65 20 72 65 6d 6f  * Duplicate remo
1b030 76 61 6c 20 69 6e 20 74 68 65 20 55 4e 49 4f 4e  val in the UNION
1b040 2c 20 45 58 43 45 50 54 2c 20 61 6e 64 20 49 4e  , EXCEPT, and IN
1b050 54 45 52 53 45 43 54 20 63 61 73 65 73 20 69 73  TERSECT cases is
1b060 20 68 61 6e 64 6c 65 64 0a 2a 2a 20 77 69 74 68   handled.** with
1b070 69 6e 20 74 68 65 20 6f 75 74 70 75 74 20 73 75  in the output su
1b080 62 72 6f 75 74 69 6e 65 2e 20 20 54 68 65 20 72  broutine.  The r
1b090 65 67 50 72 65 76 20 72 65 67 69 73 74 65 72 20  egPrev register 
1b0a0 73 65 74 20 68 6f 6c 64 73 20 74 68 65 20 70 72  set holds the pr
1b0b0 65 76 69 6f 75 73 6c 79 0a 2a 2a 20 6f 75 74 70  eviously.** outp
1b0c0 75 74 20 76 61 6c 75 65 2e 20 20 41 20 63 6f 6d  ut value.  A com
1b0d0 70 61 72 69 73 6f 6e 20 69 73 20 6d 61 64 65 20  parison is made 
1b0e0 61 67 61 69 6e 73 74 20 74 68 69 73 20 76 61 6c  against this val
1b0f0 75 65 20 61 6e 64 20 74 68 65 20 6f 75 74 70 75  ue and the outpu
1b100 74 0a 2a 2a 20 69 73 20 73 6b 69 70 70 65 64 20  t.** is skipped 
1b110 69 66 20 74 68 65 20 6e 65 78 74 20 72 65 73 75  if the next resu
1b120 6c 74 73 20 77 6f 75 6c 64 20 62 65 20 74 68 65  lts would be the
1b130 20 73 61 6d 65 20 61 73 20 74 68 65 20 70 72 65   same as the pre
1b140 76 69 6f 75 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  vious..**.** The
1b150 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
1b160 70 6c 61 6e 20 69 73 20 74 6f 20 69 6d 70 6c 65  plan is to imple
1b170 6d 65 6e 74 20 74 68 65 20 74 77 6f 20 63 6f 72  ment the two cor
1b180 6f 75 74 69 6e 65 73 20 61 6e 64 20 73 65 76 65  outines and seve
1b190 6e 0a 2a 2a 20 73 75 62 72 6f 75 74 69 6e 65 73  n.** subroutines
1b1a0 20 66 69 72 73 74 2c 20 74 68 65 6e 20 70 75 74   first, then put
1b1b0 20 74 68 65 20 63 6f 6e 74 72 6f 6c 20 6c 6f 67   the control log
1b1c0 69 63 20 61 74 20 74 68 65 20 62 6f 74 74 6f 6d  ic at the bottom
1b1d0 2e 20 20 4c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a  .  Like this:.**
1b1e0 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 67 6f 74  .**          got
1b1f0 6f 20 49 6e 69 74 0a 2a 2a 20 20 20 20 20 63 6f  o Init.**     co
1b200 41 3a 20 63 6f 72 6f 75 74 69 6e 65 20 66 6f 72  A: coroutine for
1b210 20 6c 65 66 74 20 71 75 65 72 79 20 28 41 29 0a   left query (A).
1b220 2a 2a 20 20 20 20 20 63 6f 42 3a 20 63 6f 72 6f  **     coB: coro
1b230 75 74 69 6e 65 20 66 6f 72 20 72 69 67 68 74 20  utine for right 
1b240 71 75 65 72 79 20 28 42 29 0a 2a 2a 20 20 20 20  query (B).**    
1b250 6f 75 74 41 3a 20 6f 75 74 70 75 74 20 6f 6e 65  outA: output one
1b260 20 72 6f 77 20 6f 66 20 41 0a 2a 2a 20 20 20 20   row of A.**    
1b270 6f 75 74 42 3a 20 6f 75 74 70 75 74 20 6f 6e 65  outB: output one
1b280 20 72 6f 77 20 6f 66 20 42 20 28 55 4e 49 4f 4e   row of B (UNION
1b290 20 61 6e 64 20 55 4e 49 4f 4e 20 41 4c 4c 20 6f   and UNION ALL o
1b2a0 6e 6c 79 29 0a 2a 2a 20 20 20 20 45 6f 66 41 3a  nly).**    EofA:
1b2b0 20 2e 2e 2e 0a 2a 2a 20 20 20 20 45 6f 66 42 3a   ....**    EofB:
1b2c0 20 2e 2e 2e 0a 2a 2a 20 20 20 20 41 6c 74 42 3a   ....**    AltB:
1b2d0 20 2e 2e 2e 0a 2a 2a 20 20 20 20 41 65 71 42 3a   ....**    AeqB:
1b2e0 20 2e 2e 2e 0a 2a 2a 20 20 20 20 41 67 74 42 3a   ....**    AgtB:
1b2f0 20 2e 2e 2e 0a 2a 2a 20 20 20 20 49 6e 69 74 3a   ....**    Init:
1b300 20 69 6e 69 74 69 61 6c 69 7a 65 20 63 6f 72 6f   initialize coro
1b310 75 74 69 6e 65 20 72 65 67 69 73 74 65 72 73 0a  utine registers.
1b320 2a 2a 20 20 20 20 20 20 20 20 20 20 79 69 65 6c  **          yiel
1b330 64 20 63 6f 41 0a 2a 2a 20 20 20 20 20 20 20 20  d coA.**        
1b340 20 20 69 66 20 65 6f 66 28 41 29 20 67 6f 74 6f    if eof(A) goto
1b350 20 45 6f 66 41 0a 2a 2a 20 20 20 20 20 20 20 20   EofA.**        
1b360 20 20 79 69 65 6c 64 20 63 6f 42 0a 2a 2a 20 20    yield coB.**  
1b370 20 20 20 20 20 20 20 20 69 66 20 65 6f 66 28 42          if eof(B
1b380 29 20 67 6f 74 6f 20 45 6f 66 42 0a 2a 2a 20 20  ) goto EofB.**  
1b390 20 20 43 6d 70 72 3a 20 43 6f 6d 70 61 72 65 20    Cmpr: Compare 
1b3a0 41 2c 20 42 0a 2a 2a 20 20 20 20 20 20 20 20 20  A, B.**         
1b3b0 20 4a 75 6d 70 20 41 6c 74 42 2c 20 41 65 71 42   Jump AltB, AeqB
1b3c0 2c 20 41 67 74 42 0a 2a 2a 20 20 20 20 20 45 6e  , AgtB.**     En
1b3d0 64 3a 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 57 65 20  d: ....**.** We 
1b3e0 63 61 6c 6c 20 41 6c 74 42 2c 20 41 65 71 42 2c  call AltB, AeqB,
1b3f0 20 41 67 74 42 2c 20 45 6f 66 41 2c 20 61 6e 64   AgtB, EofA, and
1b400 20 45 6f 66 42 20 22 73 75 62 72 6f 75 74 69 6e   EofB "subroutin
1b410 65 73 22 20 62 75 74 20 74 68 65 79 20 61 72 65  es" but they are
1b420 20 6e 6f 74 0a 2a 2a 20 61 63 74 75 61 6c 6c 79   not.** actually
1b430 20 63 61 6c 6c 65 64 20 75 73 69 6e 67 20 47 6f   called using Go
1b440 73 75 62 20 61 6e 64 20 74 68 65 79 20 64 6f 20  sub and they do 
1b450 6e 6f 74 20 52 65 74 75 72 6e 2e 20 20 45 6f 66  not Return.  Eof
1b460 41 20 61 6e 64 20 45 6f 66 42 20 6c 6f 6f 70 0a  A and EofB loop.
1b470 2a 2a 20 75 6e 74 69 6c 20 61 6c 6c 20 64 61 74  ** until all dat
1b480 61 20 69 73 20 65 78 68 61 75 73 74 65 64 20 74  a is exhausted t
1b490 68 65 6e 20 6a 75 6d 70 20 74 6f 20 74 68 65 20  hen jump to the 
1b4a0 22 65 6e 64 22 20 6c 61 62 65 2e 20 20 41 6c 74  "end" labe.  Alt
1b4b0 42 2c 20 41 65 71 42 2c 0a 2a 2a 20 61 6e 64 20  B, AeqB,.** and 
1b4c0 41 67 74 42 20 6a 75 6d 70 20 74 6f 20 65 69 74  AgtB jump to eit
1b4d0 68 65 72 20 4c 32 20 6f 72 20 74 6f 20 6f 6e 65  her L2 or to one
1b4e0 20 6f 66 20 45 6f 66 41 20 6f 72 20 45 6f 66 42   of EofA or EofB
1b4f0 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  ..*/.#ifndef SQL
1b500 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e  ITE_OMIT_COMPOUN
1b510 44 5f 53 45 4c 45 43 54 0a 73 74 61 74 69 63 20  D_SELECT.static 
1b520 69 6e 74 20 6d 75 6c 74 69 53 65 6c 65 63 74 4f  int multiSelectO
1b530 72 64 65 72 42 79 28 0a 20 20 50 61 72 73 65 20  rderBy(.  Parse 
1b540 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
1b550 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
1b560 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  xt */.  Select *
1b570 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  p,            /*
1b580 20 54 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20   The right-most 
1b590 6f 66 20 53 45 4c 45 43 54 73 20 74 6f 20 62 65  of SELECTs to be
1b5a0 20 63 6f 64 65 64 20 2a 2f 0a 20 20 53 65 6c 65   coded */.  Sele
1b5b0 63 74 44 65 73 74 20 2a 70 44 65 73 74 20 20 20  ctDest *pDest   
1b5c0 20 20 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f 20    /* What to do 
1b5d0 77 69 74 68 20 71 75 65 72 79 20 72 65 73 75 6c  with query resul
1b5e0 74 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69  ts */.){.  int i
1b5f0 2c 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20  , j;            
1b600 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
1b610 73 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70  s */.  Select *p
1b620 50 72 69 6f 72 3b 20 20 20 20 20 20 20 2f 2a 20  Prior;       /* 
1b630 41 6e 6f 74 68 65 72 20 53 45 4c 45 43 54 20 69  Another SELECT i
1b640 6d 6d 65 64 69 61 74 65 6c 79 20 74 6f 20 6f 75  mmediately to ou
1b650 72 20 6c 65 66 74 20 2a 2f 0a 20 20 56 64 62 65  r left */.  Vdbe
1b660 20 2a 76 3b 20 20 20 20 20 20 20 20 20 20 20 20   *v;            
1b670 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f    /* Generate co
1b680 64 65 20 74 6f 20 74 68 69 73 20 56 44 42 45 20  de to this VDBE 
1b690 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20  */.  SelectDest 
1b6a0 64 65 73 74 41 3b 20 20 20 20 20 2f 2a 20 44 65  destA;     /* De
1b6b0 73 74 69 6e 61 74 69 6f 6e 20 66 6f 72 20 63 6f  stination for co
1b6c0 72 6f 75 74 69 6e 65 20 41 20 2a 2f 0a 20 20 53  routine A */.  S
1b6d0 65 6c 65 63 74 44 65 73 74 20 64 65 73 74 42 3b  electDest destB;
1b6e0 20 20 20 20 20 2f 2a 20 44 65 73 74 69 6e 61 74       /* Destinat
1b6f0 69 6f 6e 20 66 6f 72 20 63 6f 72 6f 75 74 69 6e  ion for coroutin
1b700 65 20 42 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67  e B */.  int reg
1b710 41 64 64 72 41 3b 20 20 20 20 20 20 20 20 20 2f  AddrA;         /
1b720 2a 20 41 64 64 72 65 73 73 20 72 65 67 69 73 74  * Address regist
1b730 65 72 20 66 6f 72 20 73 65 6c 65 63 74 2d 41 20  er for select-A 
1b740 63 6f 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69  coroutine */.  i
1b750 6e 74 20 72 65 67 41 64 64 72 42 3b 20 20 20 20  nt regAddrB;    
1b760 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
1b770 72 65 67 69 73 74 65 72 20 66 6f 72 20 73 65 6c  register for sel
1b780 65 63 74 2d 42 20 63 6f 72 6f 75 74 69 6e 65 20  ect-B coroutine 
1b790 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 53 65 6c  */.  int addrSel
1b7a0 65 63 74 41 3b 20 20 20 20 20 20 2f 2a 20 41 64  ectA;      /* Ad
1b7b0 64 72 65 73 73 20 6f 66 20 74 68 65 20 73 65 6c  dress of the sel
1b7c0 65 63 74 2d 41 20 63 6f 72 6f 75 74 69 6e 65 20  ect-A coroutine 
1b7d0 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 53 65 6c  */.  int addrSel
1b7e0 65 63 74 42 3b 20 20 20 20 20 20 2f 2a 20 41 64  ectB;      /* Ad
1b7f0 64 72 65 73 73 20 6f 66 20 74 68 65 20 73 65 6c  dress of the sel
1b800 65 63 74 2d 42 20 63 6f 72 6f 75 74 69 6e 65 20  ect-B coroutine 
1b810 2a 2f 0a 20 20 69 6e 74 20 72 65 67 4f 75 74 41  */.  int regOutA
1b820 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64  ;          /* Ad
1b830 64 72 65 73 73 20 72 65 67 69 73 74 65 72 20 66  dress register f
1b840 6f 72 20 74 68 65 20 6f 75 74 70 75 74 2d 41 20  or the output-A 
1b850 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20  subroutine */.  
1b860 69 6e 74 20 72 65 67 4f 75 74 42 3b 20 20 20 20  int regOutB;    
1b870 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73        /* Address
1b880 20 72 65 67 69 73 74 65 72 20 66 6f 72 20 74 68   register for th
1b890 65 20 6f 75 74 70 75 74 2d 42 20 73 75 62 72 6f  e output-B subro
1b8a0 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61  utine */.  int a
1b8b0 64 64 72 4f 75 74 41 3b 20 20 20 20 20 20 20 20  ddrOutA;        
1b8c0 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74   /* Address of t
1b8d0 68 65 20 6f 75 74 70 75 74 2d 41 20 73 75 62 72  he output-A subr
1b8e0 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20  outine */.  int 
1b8f0 61 64 64 72 4f 75 74 42 20 3d 20 30 3b 20 20 20  addrOutB = 0;   
1b900 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20    /* Address of 
1b910 74 68 65 20 6f 75 74 70 75 74 2d 42 20 73 75 62  the output-B sub
1b920 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74  routine */.  int
1b930 20 61 64 64 72 45 6f 66 41 3b 20 20 20 20 20 20   addrEofA;      
1b940 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66     /* Address of
1b950 20 74 68 65 20 73 65 6c 65 63 74 2d 41 2d 65 78   the select-A-ex
1b960 68 61 75 73 74 65 64 20 73 75 62 72 6f 75 74 69  hausted subrouti
1b970 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72  ne */.  int addr
1b980 45 6f 66 41 5f 6e 6f 42 3b 20 20 20 20 20 2f 2a  EofA_noB;     /*
1b990 20 41 6c 74 65 72 6e 61 74 65 20 61 64 64 72 45   Alternate addrE
1b9a0 6f 66 41 20 69 66 20 42 20 69 73 20 75 6e 69 6e  ofA if B is unin
1b9b0 69 74 69 61 6c 69 7a 65 64 20 2a 2f 0a 20 20 69  itialized */.  i
1b9c0 6e 74 20 61 64 64 72 45 6f 66 42 3b 20 20 20 20  nt addrEofB;    
1b9d0 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
1b9e0 6f 66 20 74 68 65 20 73 65 6c 65 63 74 2d 42 2d  of the select-B-
1b9f0 65 78 68 61 75 73 74 65 64 20 73 75 62 72 6f 75  exhausted subrou
1ba00 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64  tine */.  int ad
1ba10 64 72 41 6c 74 42 3b 20 20 20 20 20 20 20 20 20  drAltB;         
1ba20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 68  /* Address of th
1ba30 65 20 41 3c 42 20 73 75 62 72 6f 75 74 69 6e 65  e A<B subroutine
1ba40 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 41 65   */.  int addrAe
1ba50 71 42 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41  qB;         /* A
1ba60 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 41 3d  ddress of the A=
1ba70 3d 42 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f  =B subroutine */
1ba80 0a 20 20 69 6e 74 20 61 64 64 72 41 67 74 42 3b  .  int addrAgtB;
1ba90 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72           /* Addr
1baa0 65 73 73 20 6f 66 20 74 68 65 20 41 3e 42 20 73  ess of the A>B s
1bab0 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69  ubroutine */.  i
1bac0 6e 74 20 72 65 67 4c 69 6d 69 74 41 3b 20 20 20  nt regLimitA;   
1bad0 20 20 20 20 20 2f 2a 20 4c 69 6d 69 74 20 72 65       /* Limit re
1bae0 67 69 73 74 65 72 20 66 6f 72 20 73 65 6c 65 63  gister for selec
1baf0 74 2d 41 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67  t-A */.  int reg
1bb00 4c 69 6d 69 74 42 3b 20 20 20 20 20 20 20 20 2f  LimitB;        /
1bb10 2a 20 4c 69 6d 69 74 20 72 65 67 69 73 74 65 72  * Limit register
1bb20 20 66 6f 72 20 73 65 6c 65 63 74 2d 41 20 2a 2f   for select-A */
1bb30 0a 20 20 69 6e 74 20 72 65 67 50 72 65 76 3b 20  .  int regPrev; 
1bb40 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 72 61           /* A ra
1bb50 6e 67 65 20 6f 66 20 72 65 67 69 73 74 65 72 73  nge of registers
1bb60 20 74 6f 20 68 6f 6c 64 20 70 72 65 76 69 6f 75   to hold previou
1bb70 73 20 6f 75 74 70 75 74 20 2a 2f 0a 20 20 69 6e  s output */.  in
1bb80 74 20 73 61 76 65 64 4c 69 6d 69 74 3b 20 20 20  t savedLimit;   
1bb90 20 20 20 20 2f 2a 20 53 61 76 65 64 20 76 61 6c      /* Saved val
1bba0 75 65 20 6f 66 20 70 2d 3e 69 4c 69 6d 69 74 20  ue of p->iLimit 
1bbb0 2a 2f 0a 20 20 69 6e 74 20 73 61 76 65 64 4f 66  */.  int savedOf
1bbc0 66 73 65 74 3b 20 20 20 20 20 20 2f 2a 20 53 61  fset;      /* Sa
1bbd0 76 65 64 20 76 61 6c 75 65 20 6f 66 20 70 2d 3e  ved value of p->
1bbe0 69 4f 66 66 73 65 74 20 2a 2f 0a 20 20 69 6e 74  iOffset */.  int
1bbf0 20 6c 61 62 65 6c 43 6d 70 72 3b 20 20 20 20 20   labelCmpr;     
1bc00 20 20 20 2f 2a 20 4c 61 62 65 6c 20 66 6f 72 20     /* Label for 
1bc10 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
1bc20 20 6d 65 72 67 65 20 61 6c 67 6f 72 69 74 68 6d   merge algorithm
1bc30 20 2a 2f 0a 20 20 69 6e 74 20 6c 61 62 65 6c 45   */.  int labelE
1bc40 6e 64 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4c  nd;         /* L
1bc50 61 62 65 6c 20 66 6f 72 20 74 68 65 20 65 6e 64  abel for the end
1bc60 20 6f 66 20 74 68 65 20 6f 76 65 72 61 6c 6c 20   of the overall 
1bc70 53 45 4c 45 43 54 20 73 74 6d 74 20 2a 2f 0a 20  SELECT stmt */. 
1bc80 20 69 6e 74 20 61 64 64 72 31 3b 20 20 20 20 20   int addr1;     
1bc90 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 69         /* Jump i
1bca0 6e 73 74 72 75 63 74 69 6f 6e 73 20 74 68 61 74  nstructions that
1bcb0 20 67 65 74 20 72 65 74 61 72 67 65 74 74 65 64   get retargetted
1bcc0 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 3b 20 20 20   */.  int op;   
1bcd0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
1bce0 6e 65 20 6f 66 20 54 4b 5f 41 4c 4c 2c 20 54 4b  ne of TK_ALL, TK
1bcf0 5f 55 4e 49 4f 4e 2c 20 54 4b 5f 45 58 43 45 50  _UNION, TK_EXCEP
1bd00 54 2c 20 54 4b 5f 49 4e 54 45 52 53 45 43 54 20  T, TK_INTERSECT 
1bd10 2a 2f 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b  */.  KeyInfo *pK
1bd20 65 79 44 75 70 20 3d 20 30 3b 20 2f 2a 20 43 6f  eyDup = 0; /* Co
1bd30 6d 70 61 72 69 73 6f 6e 20 69 6e 66 6f 72 6d 61  mparison informa
1bd40 74 69 6f 6e 20 66 6f 72 20 64 75 70 6c 69 63 61  tion for duplica
1bd50 74 65 20 72 65 6d 6f 76 61 6c 20 2a 2f 0a 20 20  te removal */.  
1bd60 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 4d 65 72  KeyInfo *pKeyMer
1bd70 67 65 3b 20 20 20 2f 2a 20 43 6f 6d 70 61 72 69  ge;   /* Compari
1bd80 73 6f 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  son information 
1bd90 66 6f 72 20 6d 65 72 67 69 6e 67 20 72 6f 77 73  for merging rows
1bda0 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   */.  sqlite3 *d
1bdb0 62 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44  b;          /* D
1bdc0 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
1bdd0 6f 6e 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  on */.  ExprList
1bde0 20 2a 70 4f 72 64 65 72 42 79 3b 20 20 20 2f 2a   *pOrderBy;   /*
1bdf0 20 54 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   The ORDER BY cl
1be00 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f  ause */.  int nO
1be10 72 64 65 72 42 79 3b 20 20 20 20 20 20 20 20 20  rderBy;         
1be20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74 65 72  /* Number of ter
1be30 6d 73 20 69 6e 20 74 68 65 20 4f 52 44 45 52 20  ms in the ORDER 
1be40 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69  BY clause */.  i
1be50 6e 74 20 2a 61 50 65 72 6d 75 74 65 3b 20 20 20  nt *aPermute;   
1be60 20 20 20 20 20 2f 2a 20 4d 61 70 70 69 6e 67 20       /* Mapping 
1be70 66 72 6f 6d 20 4f 52 44 45 52 20 42 59 20 74 65  from ORDER BY te
1be80 72 6d 73 20 74 6f 20 72 65 73 75 6c 74 20 73 65  rms to result se
1be90 74 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 0a 20 20  t columns */..  
1bea0 61 73 73 65 72 74 28 20 70 2d 3e 70 4f 72 64 65  assert( p->pOrde
1beb0 72 42 79 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  rBy!=0 );.  asse
1bec0 72 74 28 20 70 4b 65 79 44 75 70 3d 3d 30 20 29  rt( pKeyDup==0 )
1bed0 3b 20 2f 2a 20 22 4d 61 6e 61 67 65 64 22 20 63  ; /* "Managed" c
1bee0 6f 64 65 20 6e 65 65 64 73 20 74 68 69 73 2e 20  ode needs this. 
1bef0 20 54 69 63 6b 65 74 20 23 33 33 38 32 2e 20 2a   Ticket #3382. *
1bf00 2f 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d  /.  db = pParse-
1bf10 3e 64 62 3b 0a 20 20 76 20 3d 20 70 50 61 72 73  >db;.  v = pPars
1bf20 65 2d 3e 70 56 64 62 65 3b 0a 20 20 61 73 73 65  e->pVdbe;.  asse
1bf30 72 74 28 20 76 21 3d 30 20 29 3b 20 20 20 20 20  rt( v!=0 );     
1bf40 20 20 2f 2a 20 41 6c 72 65 61 64 79 20 74 68 72    /* Already thr
1bf50 6f 77 6e 20 74 68 65 20 65 72 72 6f 72 20 69 66  own the error if
1bf60 20 56 44 42 45 20 61 6c 6c 6f 63 20 66 61 69 6c   VDBE alloc fail
1bf70 65 64 20 2a 2f 0a 20 20 6c 61 62 65 6c 45 6e 64  ed */.  labelEnd
1bf80 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
1bf90 6b 65 4c 61 62 65 6c 28 70 50 61 72 73 65 29 3b  keLabel(pParse);
1bfa0 0a 20 20 6c 61 62 65 6c 43 6d 70 72 20 3d 20 73  .  labelCmpr = s
1bfb0 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
1bfc0 62 65 6c 28 70 50 61 72 73 65 29 3b 0a 0a 0a 20  bel(pParse);... 
1bfd0 20 2f 2a 20 50 61 74 63 68 20 75 70 20 74 68 65   /* Patch up the
1bfe0 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
1bff0 0a 20 20 2a 2f 0a 20 20 6f 70 20 3d 20 70 2d 3e  .  */.  op = p->
1c000 6f 70 3b 20 20 0a 20 20 70 50 72 69 6f 72 20 3d  op;  .  pPrior =
1c010 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 61 73   p->pPrior;.  as
1c020 73 65 72 74 28 20 70 50 72 69 6f 72 2d 3e 70 4f  sert( pPrior->pO
1c030 72 64 65 72 42 79 3d 3d 30 20 29 3b 0a 20 20 70  rderBy==0 );.  p
1c040 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72  OrderBy = p->pOr
1c050 64 65 72 42 79 3b 0a 20 20 61 73 73 65 72 74 28  derBy;.  assert(
1c060 20 70 4f 72 64 65 72 42 79 20 29 3b 0a 20 20 6e   pOrderBy );.  n
1c070 4f 72 64 65 72 42 79 20 3d 20 70 4f 72 64 65 72  OrderBy = pOrder
1c080 42 79 2d 3e 6e 45 78 70 72 3b 0a 0a 20 20 2f 2a  By->nExpr;..  /*
1c090 20 46 6f 72 20 6f 70 65 72 61 74 6f 72 73 20 6f   For operators o
1c0a0 74 68 65 72 20 74 68 61 6e 20 55 4e 49 4f 4e 20  ther than UNION 
1c0b0 41 4c 4c 20 77 65 20 68 61 76 65 20 74 6f 20 6d  ALL we have to m
1c0c0 61 6b 65 20 73 75 72 65 20 74 68 61 74 0a 20 20  ake sure that.  
1c0d0 2a 2a 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  ** the ORDER BY 
1c0e0 63 6c 61 75 73 65 20 63 6f 76 65 72 73 20 65 76  clause covers ev
1c0f0 65 72 79 20 74 65 72 6d 20 6f 66 20 74 68 65 20  ery term of the 
1c100 72 65 73 75 6c 74 20 73 65 74 2e 20 20 41 64 64  result set.  Add
1c110 0a 20 20 2a 2a 20 74 65 72 6d 73 20 74 6f 20 74  .  ** terms to t
1c120 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
1c130 73 65 20 61 73 20 6e 65 63 65 73 73 61 72 79 2e  se as necessary.
1c140 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6f 70 21 3d  .  */.  if( op!=
1c150 54 4b 5f 41 4c 4c 20 29 7b 0a 20 20 20 20 66 6f  TK_ALL ){.    fo
1c160 72 28 69 3d 31 3b 20 64 62 2d 3e 6d 61 6c 6c 6f  r(i=1; db->mallo
1c170 63 46 61 69 6c 65 64 3d 3d 30 20 26 26 20 69 3c  cFailed==0 && i<
1c180 3d 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70  =p->pEList->nExp
1c190 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73  r; i++){.      s
1c1a0 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69  truct ExprList_i
1c1b0 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 20 20  tem *pItem;.    
1c1c0 20 20 66 6f 72 28 6a 3d 30 2c 20 70 49 74 65 6d    for(j=0, pItem
1c1d0 3d 70 4f 72 64 65 72 42 79 2d 3e 61 3b 20 6a 3c  =pOrderBy->a; j<
1c1e0 6e 4f 72 64 65 72 42 79 3b 20 6a 2b 2b 2c 20 70  nOrderBy; j++, p
1c1f0 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20  Item++){.       
1c200 20 61 73 73 65 72 74 28 20 70 49 74 65 6d 2d 3e   assert( pItem->
1c210 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 3e  u.x.iOrderByCol>
1c220 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  0 );.        if(
1c230 20 70 49 74 65 6d 2d 3e 75 2e 78 2e 69 4f 72 64   pItem->u.x.iOrd
1c240 65 72 42 79 43 6f 6c 3d 3d 69 20 29 20 62 72 65  erByCol==i ) bre
1c250 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
1c260 20 20 69 66 28 20 6a 3d 3d 6e 4f 72 64 65 72 42    if( j==nOrderB
1c270 79 20 29 7b 0a 20 20 20 20 20 20 20 20 45 78 70  y ){.        Exp
1c280 72 20 2a 70 4e 65 77 20 3d 20 73 71 6c 69 74 65  r *pNew = sqlite
1c290 33 45 78 70 72 28 64 62 2c 20 54 4b 5f 49 4e 54  3Expr(db, TK_INT
1c2a0 45 47 45 52 2c 20 30 29 3b 0a 20 20 20 20 20 20  EGER, 0);.      
1c2b0 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 20    if( pNew==0 ) 
1c2c0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
1c2d0 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20  MEM_BKPT;.      
1c2e0 20 20 70 4e 65 77 2d 3e 66 6c 61 67 73 20 7c 3d    pNew->flags |=
1c2f0 20 45 50 5f 49 6e 74 56 61 6c 75 65 3b 0a 20 20   EP_IntValue;.  
1c300 20 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e 69 56        pNew->u.iV
1c310 61 6c 75 65 20 3d 20 69 3b 0a 20 20 20 20 20 20  alue = i;.      
1c320 20 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20    p->pOrderBy = 
1c330 70 4f 72 64 65 72 42 79 20 3d 20 73 71 6c 69 74  pOrderBy = sqlit
1c340 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64  e3ExprListAppend
1c350 28 70 50 61 72 73 65 2c 20 70 4f 72 64 65 72 42  (pParse, pOrderB
1c360 79 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20 20 20  y, pNew);.      
1c370 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 20 29    if( pOrderBy )
1c380 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 6e 4f 72   pOrderBy->a[nOr
1c390 64 65 72 42 79 2b 2b 5d 2e 75 2e 78 2e 69 4f 72  derBy++].u.x.iOr
1c3a0 64 65 72 42 79 43 6f 6c 20 3d 20 28 75 31 36 29  derByCol = (u16)
1c3b0 69 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  i;.      }.    }
1c3c0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75  .  }..  /* Compu
1c3d0 74 65 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f  te the compariso
1c3e0 6e 20 70 65 72 6d 75 74 61 74 69 6f 6e 20 61 6e  n permutation an
1c3f0 64 20 6b 65 79 69 6e 66 6f 20 74 68 61 74 20 69  d keyinfo that i
1c400 73 20 75 73 65 64 20 77 69 74 68 0a 20 20 2a 2a  s used with.  **
1c410 20 74 68 65 20 70 65 72 6d 75 74 61 74 69 6f 6e   the permutation
1c420 20 75 73 65 64 20 74 6f 20 64 65 74 65 72 6d 69   used to determi
1c430 6e 65 20 69 66 20 74 68 65 20 6e 65 78 74 0a 20  ne if the next. 
1c440 20 2a 2a 20 72 6f 77 20 6f 66 20 72 65 73 75 6c   ** row of resul
1c450 74 73 20 63 6f 6d 65 73 20 66 72 6f 6d 20 73 65  ts comes from se
1c460 6c 65 63 74 41 20 6f 72 20 73 65 6c 65 63 74 42  lectA or selectB
1c470 2e 20 20 41 6c 73 6f 20 61 64 64 20 65 78 70 6c  .  Also add expl
1c480 69 63 69 74 0a 20 20 2a 2a 20 63 6f 6c 6c 61 74  icit.  ** collat
1c490 69 6f 6e 73 20 74 6f 20 74 68 65 20 4f 52 44 45  ions to the ORDE
1c4a0 52 20 42 59 20 63 6c 61 75 73 65 20 74 65 72 6d  R BY clause term
1c4b0 73 20 73 6f 20 74 68 61 74 20 77 68 65 6e 20 74  s so that when t
1c4c0 68 65 20 73 75 62 71 75 65 72 69 65 73 0a 20 20  he subqueries.  
1c4d0 2a 2a 20 74 6f 20 74 68 65 20 72 69 67 68 74 20  ** to the right 
1c4e0 61 6e 64 20 74 68 65 20 6c 65 66 74 20 61 72 65  and the left are
1c4f0 20 65 76 61 6c 75 61 74 65 64 2c 20 74 68 65 79   evaluated, they
1c500 20 75 73 65 20 74 68 65 20 63 6f 72 72 65 63 74   use the correct
1c510 0a 20 20 2a 2a 20 63 6f 6c 6c 61 74 69 6f 6e 2e  .  ** collation.
1c520 0a 20 20 2a 2f 0a 20 20 61 50 65 72 6d 75 74 65  .  */.  aPermute
1c530 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
1c540 6f 63 52 61 77 4e 4e 28 64 62 2c 20 73 69 7a 65  ocRawNN(db, size
1c550 6f 66 28 69 6e 74 29 2a 28 6e 4f 72 64 65 72 42  of(int)*(nOrderB
1c560 79 20 2b 20 31 29 29 3b 0a 20 20 69 66 28 20 61  y + 1));.  if( a
1c570 50 65 72 6d 75 74 65 20 29 7b 0a 20 20 20 20 73  Permute ){.    s
1c580 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69  truct ExprList_i
1c590 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 20 20  tem *pItem;.    
1c5a0 61 50 65 72 6d 75 74 65 5b 30 5d 20 3d 20 6e 4f  aPermute[0] = nO
1c5b0 72 64 65 72 42 79 3b 0a 20 20 20 20 66 6f 72 28  rderBy;.    for(
1c5c0 69 3d 31 2c 20 70 49 74 65 6d 3d 70 4f 72 64 65  i=1, pItem=pOrde
1c5d0 72 42 79 2d 3e 61 3b 20 69 3c 3d 6e 4f 72 64 65  rBy->a; i<=nOrde
1c5e0 72 42 79 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b  rBy; i++, pItem+
1c5f0 2b 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  +){.      assert
1c600 28 20 70 49 74 65 6d 2d 3e 75 2e 78 2e 69 4f 72  ( pItem->u.x.iOr
1c610 64 65 72 42 79 43 6f 6c 3e 30 20 29 3b 0a 20 20  derByCol>0 );.  
1c620 20 20 20 20 61 73 73 65 72 74 28 20 70 49 74 65      assert( pIte
1c630 6d 2d 3e 75 2e 78 2e 69 4f 72 64 65 72 42 79 43  m->u.x.iOrderByC
1c640 6f 6c 3c 3d 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e  ol<=p->pEList->n
1c650 45 78 70 72 20 29 3b 0a 20 20 20 20 20 20 61 50  Expr );.      aP
1c660 65 72 6d 75 74 65 5b 69 5d 20 3d 20 70 49 74 65  ermute[i] = pIte
1c670 6d 2d 3e 75 2e 78 2e 69 4f 72 64 65 72 42 79 43  m->u.x.iOrderByC
1c680 6f 6c 20 2d 20 31 3b 0a 20 20 20 20 7d 0a 20 20  ol - 1;.    }.  
1c690 20 20 70 4b 65 79 4d 65 72 67 65 20 3d 20 6d 75    pKeyMerge = mu
1c6a0 6c 74 69 53 65 6c 65 63 74 4f 72 64 65 72 42 79  ltiSelectOrderBy
1c6b0 4b 65 79 49 6e 66 6f 28 70 50 61 72 73 65 2c 20  KeyInfo(pParse, 
1c6c0 70 2c 20 31 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  p, 1);.  }else{.
1c6d0 20 20 20 20 70 4b 65 79 4d 65 72 67 65 20 3d 20      pKeyMerge = 
1c6e0 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 61  0;.  }..  /* Rea
1c6f0 74 74 61 63 68 20 74 68 65 20 4f 52 44 45 52 20  ttach the ORDER 
1c700 42 59 20 63 6c 61 75 73 65 20 74 6f 20 74 68 65  BY clause to the
1c710 20 71 75 65 72 79 2e 0a 20 20 2a 2f 0a 20 20 70   query..  */.  p
1c720 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 70 4f 72  ->pOrderBy = pOr
1c730 64 65 72 42 79 3b 0a 20 20 70 50 72 69 6f 72 2d  derBy;.  pPrior-
1c740 3e 70 4f 72 64 65 72 42 79 20 3d 20 73 71 6c 69  >pOrderBy = sqli
1c750 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 70  te3ExprListDup(p
1c760 50 61 72 73 65 2d 3e 64 62 2c 20 70 4f 72 64 65  Parse->db, pOrde
1c770 72 42 79 2c 20 30 29 3b 0a 0a 20 20 2f 2a 20 41  rBy, 0);..  /* A
1c780 6c 6c 6f 63 61 74 65 20 61 20 72 61 6e 67 65 20  llocate a range 
1c790 6f 66 20 74 65 6d 70 6f 72 61 72 79 20 72 65 67  of temporary reg
1c7a0 69 73 74 65 72 73 20 61 6e 64 20 74 68 65 20 4b  isters and the K
1c7b0 65 79 49 6e 66 6f 20 6e 65 65 64 65 64 0a 20 20  eyInfo needed.  
1c7c0 2a 2a 20 66 6f 72 20 74 68 65 20 6c 6f 67 69 63  ** for the logic
1c7d0 20 74 68 61 74 20 72 65 6d 6f 76 65 73 20 64 75   that removes du
1c7e0 70 6c 69 63 61 74 65 20 72 65 73 75 6c 74 20 72  plicate result r
1c7f0 6f 77 73 20 77 68 65 6e 20 74 68 65 0a 20 20 2a  ows when the.  *
1c800 2a 20 6f 70 65 72 61 74 6f 72 20 69 73 20 55 4e  * operator is UN
1c810 49 4f 4e 2c 20 45 58 43 45 50 54 2c 20 6f 72 20  ION, EXCEPT, or 
1c820 49 4e 54 45 52 53 45 43 54 20 28 62 75 74 20 6e  INTERSECT (but n
1c830 6f 74 20 55 4e 49 4f 4e 20 41 4c 4c 29 2e 0a 20  ot UNION ALL).. 
1c840 20 2a 2f 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b   */.  if( op==TK
1c850 5f 41 4c 4c 20 29 7b 0a 20 20 20 20 72 65 67 50  _ALL ){.    regP
1c860 72 65 76 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65  rev = 0;.  }else
1c870 7b 0a 20 20 20 20 69 6e 74 20 6e 45 78 70 72 20  {.    int nExpr 
1c880 3d 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78  = p->pEList->nEx
1c890 70 72 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  pr;.    assert( 
1c8a0 6e 4f 72 64 65 72 42 79 3e 3d 6e 45 78 70 72 20  nOrderBy>=nExpr 
1c8b0 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  || db->mallocFai
1c8c0 6c 65 64 20 29 3b 0a 20 20 20 20 72 65 67 50 72  led );.    regPr
1c8d0 65 76 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65  ev = pParse->nMe
1c8e0 6d 2b 31 3b 0a 20 20 20 20 70 50 61 72 73 65 2d  m+1;.    pParse-
1c8f0 3e 6e 4d 65 6d 20 2b 3d 20 6e 45 78 70 72 2b 31  >nMem += nExpr+1
1c900 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
1c910 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e  eAddOp2(v, OP_In
1c920 74 65 67 65 72 2c 20 30 2c 20 72 65 67 50 72 65  teger, 0, regPre
1c930 76 29 3b 0a 20 20 20 20 70 4b 65 79 44 75 70 20  v);.    pKeyDup 
1c940 3d 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f  = sqlite3KeyInfo
1c950 41 6c 6c 6f 63 28 64 62 2c 20 6e 45 78 70 72 2c  Alloc(db, nExpr,
1c960 20 31 29 3b 0a 20 20 20 20 69 66 28 20 70 4b 65   1);.    if( pKe
1c970 79 44 75 70 20 29 7b 0a 20 20 20 20 20 20 61 73  yDup ){.      as
1c980 73 65 72 74 28 20 73 71 6c 69 74 65 33 4b 65 79  sert( sqlite3Key
1c990 49 6e 66 6f 49 73 57 72 69 74 65 61 62 6c 65 28  InfoIsWriteable(
1c9a0 70 4b 65 79 44 75 70 29 20 29 3b 0a 20 20 20 20  pKeyDup) );.    
1c9b0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 45 78    for(i=0; i<nEx
1c9c0 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  pr; i++){.      
1c9d0 20 20 70 4b 65 79 44 75 70 2d 3e 61 43 6f 6c 6c    pKeyDup->aColl
1c9e0 5b 69 5d 20 3d 20 6d 75 6c 74 69 53 65 6c 65 63  [i] = multiSelec
1c9f0 74 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  tCollSeq(pParse,
1ca00 20 70 2c 20 69 29 3b 0a 20 20 20 20 20 20 20 20   p, i);.        
1ca10 70 4b 65 79 44 75 70 2d 3e 61 53 6f 72 74 4f 72  pKeyDup->aSortOr
1ca20 64 65 72 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20  der[i] = 0;.    
1ca30 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 0a    }.    }.  }. .
1ca40 20 20 2f 2a 20 53 65 70 61 72 61 74 65 20 74 68    /* Separate th
1ca50 65 20 6c 65 66 74 20 61 6e 64 20 74 68 65 20 72  e left and the r
1ca60 69 67 68 74 20 71 75 65 72 79 20 66 72 6f 6d 20  ight query from 
1ca70 6f 6e 65 20 61 6e 6f 74 68 65 72 0a 20 20 2a 2f  one another.  */
1ca80 0a 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30  .  p->pPrior = 0
1ca90 3b 0a 20 20 70 50 72 69 6f 72 2d 3e 70 4e 65 78  ;.  pPrior->pNex
1caa0 74 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33  t = 0;.  sqlite3
1cab0 52 65 73 6f 6c 76 65 4f 72 64 65 72 47 72 6f 75  ResolveOrderGrou
1cac0 70 42 79 28 70 50 61 72 73 65 2c 20 70 2c 20 70  pBy(pParse, p, p
1cad0 2d 3e 70 4f 72 64 65 72 42 79 2c 20 22 4f 52 44  ->pOrderBy, "ORD
1cae0 45 52 22 29 3b 0a 20 20 69 66 28 20 70 50 72 69  ER");.  if( pPri
1caf0 6f 72 2d 3e 70 50 72 69 6f 72 3d 3d 30 20 29 7b  or->pPrior==0 ){
1cb00 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65 73 6f  .    sqlite3Reso
1cb10 6c 76 65 4f 72 64 65 72 47 72 6f 75 70 42 79 28  lveOrderGroupBy(
1cb20 70 50 61 72 73 65 2c 20 70 50 72 69 6f 72 2c 20  pParse, pPrior, 
1cb30 70 50 72 69 6f 72 2d 3e 70 4f 72 64 65 72 42 79  pPrior->pOrderBy
1cb40 2c 20 22 4f 52 44 45 52 22 29 3b 0a 20 20 7d 0a  , "ORDER");.  }.
1cb50 0a 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68  .  /* Compute th
1cb60 65 20 6c 69 6d 69 74 20 72 65 67 69 73 74 65 72  e limit register
1cb70 73 20 2a 2f 0a 20 20 63 6f 6d 70 75 74 65 4c 69  s */.  computeLi
1cb80 6d 69 74 52 65 67 69 73 74 65 72 73 28 70 50 61  mitRegisters(pPa
1cb90 72 73 65 2c 20 70 2c 20 6c 61 62 65 6c 45 6e 64  rse, p, labelEnd
1cba0 29 3b 0a 20 20 69 66 28 20 70 2d 3e 69 4c 69 6d  );.  if( p->iLim
1cbb0 69 74 20 26 26 20 6f 70 3d 3d 54 4b 5f 41 4c 4c  it && op==TK_ALL
1cbc0 20 29 7b 0a 20 20 20 20 72 65 67 4c 69 6d 69 74   ){.    regLimit
1cbd0 41 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  A = ++pParse->nM
1cbe0 65 6d 3b 0a 20 20 20 20 72 65 67 4c 69 6d 69 74  em;.    regLimit
1cbf0 42 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  B = ++pParse->nM
1cc00 65 6d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  em;.    sqlite3V
1cc10 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
1cc20 43 6f 70 79 2c 20 70 2d 3e 69 4f 66 66 73 65 74  Copy, p->iOffset
1cc30 20 3f 20 70 2d 3e 69 4f 66 66 73 65 74 2b 31 20   ? p->iOffset+1 
1cc40 3a 20 70 2d 3e 69 4c 69 6d 69 74 2c 0a 20 20 20  : p->iLimit,.   
1cc50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cc60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
1cc70 65 67 4c 69 6d 69 74 41 29 3b 0a 20 20 20 20 73  egLimitA);.    s
1cc80 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
1cc90 28 76 2c 20 4f 50 5f 43 6f 70 79 2c 20 72 65 67  (v, OP_Copy, reg
1cca0 4c 69 6d 69 74 41 2c 20 72 65 67 4c 69 6d 69 74  LimitA, regLimit
1ccb0 42 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  B);.  }else{.   
1ccc0 20 72 65 67 4c 69 6d 69 74 41 20 3d 20 72 65 67   regLimitA = reg
1ccd0 4c 69 6d 69 74 42 20 3d 20 30 3b 0a 20 20 7d 0a  LimitB = 0;.  }.
1cce0 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
1ccf0 65 74 65 28 64 62 2c 20 70 2d 3e 70 4c 69 6d 69  ete(db, p->pLimi
1cd00 74 29 3b 0a 20 20 70 2d 3e 70 4c 69 6d 69 74 20  t);.  p->pLimit 
1cd10 3d 20 30 3b 0a 0a 20 20 72 65 67 41 64 64 72 41  = 0;..  regAddrA
1cd20 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
1cd30 6d 3b 0a 20 20 72 65 67 41 64 64 72 42 20 3d 20  m;.  regAddrB = 
1cd40 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
1cd50 20 20 72 65 67 4f 75 74 41 20 3d 20 2b 2b 70 50    regOutA = ++pP
1cd60 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 72 65  arse->nMem;.  re
1cd70 67 4f 75 74 42 20 3d 20 2b 2b 70 50 61 72 73 65  gOutB = ++pParse
1cd80 2d 3e 6e 4d 65 6d 3b 0a 20 20 73 71 6c 69 74 65  ->nMem;.  sqlite
1cd90 33 53 65 6c 65 63 74 44 65 73 74 49 6e 69 74 28  3SelectDestInit(
1cda0 26 64 65 73 74 41 2c 20 53 52 54 5f 43 6f 72 6f  &destA, SRT_Coro
1cdb0 75 74 69 6e 65 2c 20 72 65 67 41 64 64 72 41 29  utine, regAddrA)
1cdc0 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63  ;.  sqlite3Selec
1cdd0 74 44 65 73 74 49 6e 69 74 28 26 64 65 73 74 42  tDestInit(&destB
1cde0 2c 20 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 2c  , SRT_Coroutine,
1cdf0 20 72 65 67 41 64 64 72 42 29 3b 0a 0a 20 20 45   regAddrB);..  E
1ce00 78 70 6c 61 69 6e 51 75 65 72 79 50 6c 61 6e 28  xplainQueryPlan(
1ce10 28 70 50 61 72 73 65 2c 20 31 2c 20 22 4d 45 52  (pParse, 1, "MER
1ce20 47 45 20 28 25 73 29 22 2c 20 73 65 6c 65 63 74  GE (%s)", select
1ce30 4f 70 4e 61 6d 65 28 70 2d 3e 6f 70 29 29 29 3b  OpName(p->op)));
1ce40 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20  ..  /* Generate 
1ce50 61 20 63 6f 72 6f 75 74 69 6e 65 20 74 6f 20 65  a coroutine to e
1ce60 76 61 6c 75 61 74 65 20 74 68 65 20 53 45 4c 45  valuate the SELE
1ce70 43 54 20 73 74 61 74 65 6d 65 6e 74 20 74 6f 20  CT statement to 
1ce80 74 68 65 0a 20 20 2a 2a 20 6c 65 66 74 20 6f 66  the.  ** left of
1ce90 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 6f 70   the compound op
1cea0 65 72 61 74 6f 72 20 2d 20 74 68 65 20 22 41 22  erator - the "A"
1ceb0 20 73 65 6c 65 63 74 2e 0a 20 20 2a 2f 0a 20 20   select..  */.  
1cec0 61 64 64 72 53 65 6c 65 63 74 41 20 3d 20 73 71  addrSelectA = sq
1ced0 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
1cee0 41 64 64 72 28 76 29 20 2b 20 31 3b 0a 20 20 61  Addr(v) + 1;.  a
1cef0 64 64 72 31 20 3d 20 73 71 6c 69 74 65 33 56 64  ddr1 = sqlite3Vd
1cf00 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49  beAddOp3(v, OP_I
1cf10 6e 69 74 43 6f 72 6f 75 74 69 6e 65 2c 20 72 65  nitCoroutine, re
1cf20 67 41 64 64 72 41 2c 20 30 2c 20 61 64 64 72 53  gAddrA, 0, addrS
1cf30 65 6c 65 63 74 41 29 3b 0a 20 20 56 64 62 65 43  electA);.  VdbeC
1cf40 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 6c 65 66 74  omment((v, "left
1cf50 20 53 45 4c 45 43 54 22 29 29 3b 0a 20 20 70 50   SELECT"));.  pP
1cf60 72 69 6f 72 2d 3e 69 4c 69 6d 69 74 20 3d 20 72  rior->iLimit = r
1cf70 65 67 4c 69 6d 69 74 41 3b 0a 20 20 45 78 70 6c  egLimitA;.  Expl
1cf80 61 69 6e 51 75 65 72 79 50 6c 61 6e 28 28 70 50  ainQueryPlan((pP
1cf90 61 72 73 65 2c 20 31 2c 20 22 4c 45 46 54 22 29  arse, 1, "LEFT")
1cfa0 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65  );.  sqlite3Sele
1cfb0 63 74 28 70 50 61 72 73 65 2c 20 70 50 72 69 6f  ct(pParse, pPrio
1cfc0 72 2c 20 26 64 65 73 74 41 29 3b 0a 20 20 73 71  r, &destA);.  sq
1cfd0 6c 69 74 65 33 56 64 62 65 45 6e 64 43 6f 72 6f  lite3VdbeEndCoro
1cfe0 75 74 69 6e 65 28 76 2c 20 72 65 67 41 64 64 72  utine(v, regAddr
1cff0 41 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  A);.  sqlite3Vdb
1d000 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64  eJumpHere(v, add
1d010 72 31 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72  r1);..  /* Gener
1d020 61 74 65 20 61 20 63 6f 72 6f 75 74 69 6e 65 20  ate a coroutine 
1d030 74 6f 20 65 76 61 6c 75 61 74 65 20 74 68 65 20  to evaluate the 
1d040 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
1d050 20 6f 6e 20 0a 20 20 2a 2a 20 74 68 65 20 72 69   on .  ** the ri
1d060 67 68 74 20 2d 20 74 68 65 20 22 42 22 20 73 65  ght - the "B" se
1d070 6c 65 63 74 0a 20 20 2a 2f 0a 20 20 61 64 64 72  lect.  */.  addr
1d080 53 65 6c 65 63 74 42 20 3d 20 73 71 6c 69 74 65  SelectB = sqlite
1d090 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
1d0a0 28 76 29 20 2b 20 31 3b 0a 20 20 61 64 64 72 31  (v) + 1;.  addr1
1d0b0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
1d0c0 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 69 74 43  dOp3(v, OP_InitC
1d0d0 6f 72 6f 75 74 69 6e 65 2c 20 72 65 67 41 64 64  oroutine, regAdd
1d0e0 72 42 2c 20 30 2c 20 61 64 64 72 53 65 6c 65 63  rB, 0, addrSelec
1d0f0 74 42 29 3b 0a 20 20 56 64 62 65 43 6f 6d 6d 65  tB);.  VdbeComme
1d100 6e 74 28 28 76 2c 20 22 72 69 67 68 74 20 53 45  nt((v, "right SE
1d110 4c 45 43 54 22 29 29 3b 0a 20 20 73 61 76 65 64  LECT"));.  saved
1d120 4c 69 6d 69 74 20 3d 20 70 2d 3e 69 4c 69 6d 69  Limit = p->iLimi
1d130 74 3b 0a 20 20 73 61 76 65 64 4f 66 66 73 65 74  t;.  savedOffset
1d140 20 3d 20 70 2d 3e 69 4f 66 66 73 65 74 3b 0a 20   = p->iOffset;. 
1d150 20 70 2d 3e 69 4c 69 6d 69 74 20 3d 20 72 65 67   p->iLimit = reg
1d160 4c 69 6d 69 74 42 3b 0a 20 20 70 2d 3e 69 4f 66  LimitB;.  p->iOf
1d170 66 73 65 74 20 3d 20 30 3b 20 20 0a 20 20 45 78  fset = 0;  .  Ex
1d180 70 6c 61 69 6e 51 75 65 72 79 50 6c 61 6e 28 28  plainQueryPlan((
1d190 70 50 61 72 73 65 2c 20 31 2c 20 22 52 49 47 48  pParse, 1, "RIGH
1d1a0 54 22 29 29 3b 0a 20 20 73 71 6c 69 74 65 33 53  T"));.  sqlite3S
1d1b0 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 2c  elect(pParse, p,
1d1c0 20 26 64 65 73 74 42 29 3b 0a 20 20 70 2d 3e 69   &destB);.  p->i
1d1d0 4c 69 6d 69 74 20 3d 20 73 61 76 65 64 4c 69 6d  Limit = savedLim
1d1e0 69 74 3b 0a 20 20 70 2d 3e 69 4f 66 66 73 65 74  it;.  p->iOffset
1d1f0 20 3d 20 73 61 76 65 64 4f 66 66 73 65 74 3b 0a   = savedOffset;.
1d200 20 20 73 71 6c 69 74 65 33 56 64 62 65 45 6e 64    sqlite3VdbeEnd
1d210 43 6f 72 6f 75 74 69 6e 65 28 76 2c 20 72 65 67  Coroutine(v, reg
1d220 41 64 64 72 42 29 3b 0a 0a 20 20 2f 2a 20 47 65  AddrB);..  /* Ge
1d230 6e 65 72 61 74 65 20 61 20 73 75 62 72 6f 75 74  nerate a subrout
1d240 69 6e 65 20 74 68 61 74 20 6f 75 74 70 75 74 73  ine that outputs
1d250 20 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f 77   the current row
1d260 20 6f 66 20 74 68 65 20 41 0a 20 20 2a 2a 20 73   of the A.  ** s
1d270 65 6c 65 63 74 20 61 73 20 74 68 65 20 6e 65 78  elect as the nex
1d280 74 20 6f 75 74 70 75 74 20 72 6f 77 20 6f 66 20  t output row of 
1d290 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c  the compound sel
1d2a0 65 63 74 2e 0a 20 20 2a 2f 0a 20 20 56 64 62 65  ect..  */.  Vdbe
1d2b0 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  NoopComment((v, 
1d2c0 22 4f 75 74 70 75 74 20 72 6f 75 74 69 6e 65 20  "Output routine 
1d2d0 66 6f 72 20 41 22 29 29 3b 0a 20 20 61 64 64 72  for A"));.  addr
1d2e0 4f 75 74 41 20 3d 20 67 65 6e 65 72 61 74 65 4f  OutA = generateO
1d2f0 75 74 70 75 74 53 75 62 72 6f 75 74 69 6e 65 28  utputSubroutine(
1d300 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20  pParse,.        
1d310 20 20 20 20 20 20 20 20 20 70 2c 20 26 64 65 73           p, &des
1d320 74 41 2c 20 70 44 65 73 74 2c 20 72 65 67 4f 75  tA, pDest, regOu
1d330 74 41 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  tA,.            
1d340 20 20 20 20 20 72 65 67 50 72 65 76 2c 20 70 4b       regPrev, pK
1d350 65 79 44 75 70 2c 20 6c 61 62 65 6c 45 6e 64 29  eyDup, labelEnd)
1d360 3b 0a 20 20 0a 20 20 2f 2a 20 47 65 6e 65 72 61  ;.  .  /* Genera
1d370 74 65 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20  te a subroutine 
1d380 74 68 61 74 20 6f 75 74 70 75 74 73 20 74 68 65  that outputs the
1d390 20 63 75 72 72 65 6e 74 20 72 6f 77 20 6f 66 20   current row of 
1d3a0 74 68 65 20 42 0a 20 20 2a 2a 20 73 65 6c 65 63  the B.  ** selec
1d3b0 74 20 61 73 20 74 68 65 20 6e 65 78 74 20 6f 75  t as the next ou
1d3c0 74 70 75 74 20 72 6f 77 20 6f 66 20 74 68 65 20  tput row of the 
1d3d0 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 2e  compound select.
1d3e0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6f 70 3d 3d  .  */.  if( op==
1d3f0 54 4b 5f 41 4c 4c 20 7c 7c 20 6f 70 3d 3d 54 4b  TK_ALL || op==TK
1d400 5f 55 4e 49 4f 4e 20 29 7b 0a 20 20 20 20 56 64  _UNION ){.    Vd
1d410 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76  beNoopComment((v
1d420 2c 20 22 4f 75 74 70 75 74 20 72 6f 75 74 69 6e  , "Output routin
1d430 65 20 66 6f 72 20 42 22 29 29 3b 0a 20 20 20 20  e for B"));.    
1d440 61 64 64 72 4f 75 74 42 20 3d 20 67 65 6e 65 72  addrOutB = gener
1d450 61 74 65 4f 75 74 70 75 74 53 75 62 72 6f 75 74  ateOutputSubrout
1d460 69 6e 65 28 70 50 61 72 73 65 2c 0a 20 20 20 20  ine(pParse,.    
1d470 20 20 20 20 20 20 20 20 20 20 20 20 20 70 2c 20               p, 
1d480 26 64 65 73 74 42 2c 20 70 44 65 73 74 2c 20 72  &destB, pDest, r
1d490 65 67 4f 75 74 42 2c 0a 20 20 20 20 20 20 20 20  egOutB,.        
1d4a0 20 20 20 20 20 20 20 20 20 72 65 67 50 72 65 76           regPrev
1d4b0 2c 20 70 4b 65 79 44 75 70 2c 20 6c 61 62 65 6c  , pKeyDup, label
1d4c0 45 6e 64 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  End);.  }.  sqli
1d4d0 74 65 33 4b 65 79 49 6e 66 6f 55 6e 72 65 66 28  te3KeyInfoUnref(
1d4e0 70 4b 65 79 44 75 70 29 3b 0a 0a 20 20 2f 2a 20  pKeyDup);..  /* 
1d4f0 47 65 6e 65 72 61 74 65 20 61 20 73 75 62 72 6f  Generate a subro
1d500 75 74 69 6e 65 20 74 6f 20 72 75 6e 20 77 68 65  utine to run whe
1d510 6e 20 74 68 65 20 72 65 73 75 6c 74 73 20 66 72  n the results fr
1d520 6f 6d 20 73 65 6c 65 63 74 20 41 0a 20 20 2a 2a  om select A.  **
1d530 20 61 72 65 20 65 78 68 61 75 73 74 65 64 20 61   are exhausted a
1d540 6e 64 20 6f 6e 6c 79 20 64 61 74 61 20 69 6e 20  nd only data in 
1d550 73 65 6c 65 63 74 20 42 20 72 65 6d 61 69 6e 73  select B remains
1d560 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6f 70 3d  ..  */.  if( op=
1d570 3d 54 4b 5f 45 58 43 45 50 54 20 7c 7c 20 6f 70  =TK_EXCEPT || op
1d580 3d 3d 54 4b 5f 49 4e 54 45 52 53 45 43 54 20 29  ==TK_INTERSECT )
1d590 7b 0a 20 20 20 20 61 64 64 72 45 6f 66 41 5f 6e  {.    addrEofA_n
1d5a0 6f 42 20 3d 20 61 64 64 72 45 6f 66 41 20 3d 20  oB = addrEofA = 
1d5b0 6c 61 62 65 6c 45 6e 64 3b 0a 20 20 7d 65 6c 73  labelEnd;.  }els
1d5c0 65 7b 20 20 0a 20 20 20 20 56 64 62 65 4e 6f 6f  e{  .    VdbeNoo
1d5d0 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 65 6f  pComment((v, "eo
1d5e0 66 2d 41 20 73 75 62 72 6f 75 74 69 6e 65 22 29  f-A subroutine")
1d5f0 29 3b 0a 20 20 20 20 61 64 64 72 45 6f 66 41 20  );.    addrEofA 
1d600 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
1d610 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c  Op2(v, OP_Gosub,
1d620 20 72 65 67 4f 75 74 42 2c 20 61 64 64 72 4f 75   regOutB, addrOu
1d630 74 42 29 3b 0a 20 20 20 20 61 64 64 72 45 6f 66  tB);.    addrEof
1d640 41 5f 6e 6f 42 20 3d 20 73 71 6c 69 74 65 33 56  A_noB = sqlite3V
1d650 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
1d660 59 69 65 6c 64 2c 20 72 65 67 41 64 64 72 42 2c  Yield, regAddrB,
1d670 20 6c 61 62 65 6c 45 6e 64 29 3b 0a 20 20 20 20   labelEnd);.    
1d680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d6a0 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
1d6b0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
1d6c0 65 47 6f 74 6f 28 76 2c 20 61 64 64 72 45 6f 66  eGoto(v, addrEof
1d6d0 41 29 3b 0a 20 20 20 20 70 2d 3e 6e 53 65 6c 65  A);.    p->nSele
1d6e0 63 74 52 6f 77 20 3d 20 73 71 6c 69 74 65 33 4c  ctRow = sqlite3L
1d6f0 6f 67 45 73 74 41 64 64 28 70 2d 3e 6e 53 65 6c  ogEstAdd(p->nSel
1d700 65 63 74 52 6f 77 2c 20 70 50 72 69 6f 72 2d 3e  ectRow, pPrior->
1d710 6e 53 65 6c 65 63 74 52 6f 77 29 3b 0a 20 20 7d  nSelectRow);.  }
1d720 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20  ..  /* Generate 
1d730 61 20 73 75 62 72 6f 75 74 69 6e 65 20 74 6f 20  a subroutine to 
1d740 72 75 6e 20 77 68 65 6e 20 74 68 65 20 72 65 73  run when the res
1d750 75 6c 74 73 20 66 72 6f 6d 20 73 65 6c 65 63 74  ults from select
1d760 20 42 0a 20 20 2a 2a 20 61 72 65 20 65 78 68 61   B.  ** are exha
1d770 75 73 74 65 64 20 61 6e 64 20 6f 6e 6c 79 20 64  usted and only d
1d780 61 74 61 20 69 6e 20 73 65 6c 65 63 74 20 41 20  ata in select A 
1d790 72 65 6d 61 69 6e 73 2e 0a 20 20 2a 2f 0a 20 20  remains..  */.  
1d7a0 69 66 28 20 6f 70 3d 3d 54 4b 5f 49 4e 54 45 52  if( op==TK_INTER
1d7b0 53 45 43 54 20 29 7b 0a 20 20 20 20 61 64 64 72  SECT ){.    addr
1d7c0 45 6f 66 42 20 3d 20 61 64 64 72 45 6f 66 41 3b  EofB = addrEofA;
1d7d0 0a 20 20 20 20 69 66 28 20 70 2d 3e 6e 53 65 6c  .    if( p->nSel
1d7e0 65 63 74 52 6f 77 20 3e 20 70 50 72 69 6f 72 2d  ectRow > pPrior-
1d7f0 3e 6e 53 65 6c 65 63 74 52 6f 77 20 29 20 70 2d  >nSelectRow ) p-
1d800 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 70 50  >nSelectRow = pP
1d810 72 69 6f 72 2d 3e 6e 53 65 6c 65 63 74 52 6f 77  rior->nSelectRow
1d820 3b 0a 20 20 7d 65 6c 73 65 7b 20 20 0a 20 20 20  ;.  }else{  .   
1d830 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74   VdbeNoopComment
1d840 28 28 76 2c 20 22 65 6f 66 2d 42 20 73 75 62 72  ((v, "eof-B subr
1d850 6f 75 74 69 6e 65 22 29 29 3b 0a 20 20 20 20 61  outine"));.    a
1d860 64 64 72 45 6f 66 42 20 3d 20 73 71 6c 69 74 65  ddrEofB = sqlite
1d870 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
1d880 50 5f 47 6f 73 75 62 2c 20 72 65 67 4f 75 74 41  P_Gosub, regOutA
1d890 2c 20 61 64 64 72 4f 75 74 41 29 3b 0a 20 20 20  , addrOutA);.   
1d8a0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1d8b0 70 32 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20  p2(v, OP_Yield, 
1d8c0 72 65 67 41 64 64 72 41 2c 20 6c 61 62 65 6c 45  regAddrA, labelE
1d8d0 6e 64 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  nd); VdbeCoverag
1d8e0 65 28 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  e(v);.    sqlite
1d8f0 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 61 64 64  3VdbeGoto(v, add
1d900 72 45 6f 66 42 29 3b 0a 20 20 7d 0a 0a 20 20 2f  rEofB);.  }..  /
1d910 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
1d920 74 6f 20 68 61 6e 64 6c 65 20 74 68 65 20 63 61  to handle the ca
1d930 73 65 20 6f 66 20 41 3c 42 0a 20 20 2a 2f 0a 20  se of A<B.  */. 
1d940 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74   VdbeNoopComment
1d950 28 28 76 2c 20 22 41 2d 6c 74 2d 42 20 73 75 62  ((v, "A-lt-B sub
1d960 72 6f 75 74 69 6e 65 22 29 29 3b 0a 20 20 61 64  routine"));.  ad
1d970 64 72 41 6c 74 42 20 3d 20 73 71 6c 69 74 65 33  drAltB = sqlite3
1d980 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
1d990 5f 47 6f 73 75 62 2c 20 72 65 67 4f 75 74 41 2c  _Gosub, regOutA,
1d9a0 20 61 64 64 72 4f 75 74 41 29 3b 0a 20 20 73 71   addrOutA);.  sq
1d9b0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
1d9c0 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67  v, OP_Yield, reg
1d9d0 41 64 64 72 41 2c 20 61 64 64 72 45 6f 66 41 29  AddrA, addrEofA)
1d9e0 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
1d9f0 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
1da00 47 6f 74 6f 28 76 2c 20 6c 61 62 65 6c 43 6d 70  Goto(v, labelCmp
1da10 72 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61  r);..  /* Genera
1da20 74 65 20 63 6f 64 65 20 74 6f 20 68 61 6e 64 6c  te code to handl
1da30 65 20 74 68 65 20 63 61 73 65 20 6f 66 20 41 3d  e the case of A=
1da40 3d 42 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6f 70  =B.  */.  if( op
1da50 3d 3d 54 4b 5f 41 4c 4c 20 29 7b 0a 20 20 20 20  ==TK_ALL ){.    
1da60 61 64 64 72 41 65 71 42 20 3d 20 61 64 64 72 41  addrAeqB = addrA
1da70 6c 74 42 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  ltB;.  }else if(
1da80 20 6f 70 3d 3d 54 4b 5f 49 4e 54 45 52 53 45 43   op==TK_INTERSEC
1da90 54 20 29 7b 0a 20 20 20 20 61 64 64 72 41 65 71  T ){.    addrAeq
1daa0 42 20 3d 20 61 64 64 72 41 6c 74 42 3b 0a 20 20  B = addrAltB;.  
1dab0 20 20 61 64 64 72 41 6c 74 42 2b 2b 3b 0a 20 20    addrAltB++;.  
1dac0 7d 65 6c 73 65 7b 0a 20 20 20 20 56 64 62 65 4e  }else{.    VdbeN
1dad0 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  oopComment((v, "
1dae0 41 2d 65 71 2d 42 20 73 75 62 72 6f 75 74 69 6e  A-eq-B subroutin
1daf0 65 22 29 29 3b 0a 20 20 20 20 61 64 64 72 41 65  e"));.    addrAe
1db00 71 42 20 3d 0a 20 20 20 20 73 71 6c 69 74 65 33  qB =.    sqlite3
1db10 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
1db20 5f 59 69 65 6c 64 2c 20 72 65 67 41 64 64 72 41  _Yield, regAddrA
1db30 2c 20 61 64 64 72 45 6f 66 41 29 3b 20 56 64 62  , addrEofA); Vdb
1db40 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
1db50 20 20 73 71 6c 69 74 65 33 56 64 62 65 47 6f 74    sqlite3VdbeGot
1db60 6f 28 76 2c 20 6c 61 62 65 6c 43 6d 70 72 29 3b  o(v, labelCmpr);
1db70 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72  .  }..  /* Gener
1db80 61 74 65 20 63 6f 64 65 20 74 6f 20 68 61 6e 64  ate code to hand
1db90 6c 65 20 74 68 65 20 63 61 73 65 20 6f 66 20 41  le the case of A
1dba0 3e 42 0a 20 20 2a 2f 0a 20 20 56 64 62 65 4e 6f  >B.  */.  VdbeNo
1dbb0 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 41  opComment((v, "A
1dbc0 2d 67 74 2d 42 20 73 75 62 72 6f 75 74 69 6e 65  -gt-B subroutine
1dbd0 22 29 29 3b 0a 20 20 61 64 64 72 41 67 74 42 20  "));.  addrAgtB 
1dbe0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  = sqlite3VdbeCur
1dbf0 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 69  rentAddr(v);.  i
1dc00 66 28 20 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 7c 7c  f( op==TK_ALL ||
1dc10 20 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29 7b   op==TK_UNION ){
1dc20 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
1dc30 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73  AddOp2(v, OP_Gos
1dc40 75 62 2c 20 72 65 67 4f 75 74 42 2c 20 61 64 64  ub, regOutB, add
1dc50 72 4f 75 74 42 29 3b 0a 20 20 7d 0a 20 20 73 71  rOutB);.  }.  sq
1dc60 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
1dc70 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67  v, OP_Yield, reg
1dc80 41 64 64 72 42 2c 20 61 64 64 72 45 6f 66 42 29  AddrB, addrEofB)
1dc90 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
1dca0 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
1dcb0 47 6f 74 6f 28 76 2c 20 6c 61 62 65 6c 43 6d 70  Goto(v, labelCmp
1dcc0 72 29 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 63  r);..  /* This c
1dcd0 6f 64 65 20 72 75 6e 73 20 6f 6e 63 65 20 74 6f  ode runs once to
1dce0 20 69 6e 69 74 69 61 6c 69 7a 65 20 65 76 65 72   initialize ever
1dcf0 79 74 68 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20 73  ything..  */.  s
1dd00 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
1dd10 72 65 28 76 2c 20 61 64 64 72 31 29 3b 0a 20 20  re(v, addr1);.  
1dd20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1dd30 32 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 72  2(v, OP_Yield, r
1dd40 65 67 41 64 64 72 41 2c 20 61 64 64 72 45 6f 66  egAddrA, addrEof
1dd50 41 5f 6e 6f 42 29 3b 20 56 64 62 65 43 6f 76 65  A_noB); VdbeCove
1dd60 72 61 67 65 28 76 29 3b 0a 20 20 73 71 6c 69 74  rage(v);.  sqlit
1dd70 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
1dd80 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67 41 64 64  OP_Yield, regAdd
1dd90 72 42 2c 20 61 64 64 72 45 6f 66 42 29 3b 20 56  rB, addrEofB); V
1dda0 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
1ddb0 0a 20 20 2f 2a 20 49 6d 70 6c 65 6d 65 6e 74 20  .  /* Implement 
1ddc0 74 68 65 20 6d 61 69 6e 20 6d 65 72 67 65 20 6c  the main merge l
1ddd0 6f 6f 70 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  oop.  */.  sqlit
1dde0 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
1ddf0 65 6c 28 76 2c 20 6c 61 62 65 6c 43 6d 70 72 29  el(v, labelCmpr)
1de00 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
1de10 64 64 4f 70 34 28 76 2c 20 4f 50 5f 50 65 72 6d  ddOp4(v, OP_Perm
1de20 75 74 61 74 69 6f 6e 2c 20 30 2c 20 30 2c 20 30  utation, 0, 0, 0
1de30 2c 20 28 63 68 61 72 2a 29 61 50 65 72 6d 75 74  , (char*)aPermut
1de40 65 2c 20 50 34 5f 49 4e 54 41 52 52 41 59 29 3b  e, P4_INTARRAY);
1de50 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
1de60 64 4f 70 34 28 76 2c 20 4f 50 5f 43 6f 6d 70 61  dOp4(v, OP_Compa
1de70 72 65 2c 20 64 65 73 74 41 2e 69 53 64 73 74 2c  re, destA.iSdst,
1de80 20 64 65 73 74 42 2e 69 53 64 73 74 2c 20 6e 4f   destB.iSdst, nO
1de90 72 64 65 72 42 79 2c 0a 20 20 20 20 20 20 20 20  rderBy,.        
1dea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1deb0 20 28 63 68 61 72 2a 29 70 4b 65 79 4d 65 72 67   (char*)pKeyMerg
1dec0 65 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a  e, P4_KEYINFO);.
1ded0 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
1dee0 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f  ngeP5(v, OPFLAG_
1def0 50 45 52 4d 55 54 45 29 3b 0a 20 20 73 71 6c 69  PERMUTE);.  sqli
1df00 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
1df10 20 4f 50 5f 4a 75 6d 70 2c 20 61 64 64 72 41 6c   OP_Jump, addrAl
1df20 74 42 2c 20 61 64 64 72 41 65 71 42 2c 20 61 64  tB, addrAeqB, ad
1df30 64 72 41 67 74 42 29 3b 20 56 64 62 65 43 6f 76  drAgtB); VdbeCov
1df40 65 72 61 67 65 28 76 29 3b 0a 0a 20 20 2f 2a 20  erage(v);..  /* 
1df50 4a 75 6d 70 20 74 6f 20 74 68 65 20 74 68 69 73  Jump to the this
1df60 20 70 6f 69 6e 74 20 69 6e 20 6f 72 64 65 72 20   point in order 
1df70 74 6f 20 74 65 72 6d 69 6e 61 74 65 20 74 68 65  to terminate the
1df80 20 71 75 65 72 79 2e 0a 20 20 2a 2f 0a 20 20 73   query..  */.  s
1df90 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
1dfa0 65 4c 61 62 65 6c 28 76 2c 20 6c 61 62 65 6c 45  eLabel(v, labelE
1dfb0 6e 64 29 3b 0a 0a 20 20 2f 2a 20 52 65 61 73 73  nd);..  /* Reass
1dfc0 65 6d 62 6c 79 20 74 68 65 20 63 6f 6d 70 6f 75  embly the compou
1dfd0 6e 64 20 71 75 65 72 79 20 73 6f 20 74 68 61 74  nd query so that
1dfe0 20 69 74 20 77 69 6c 6c 20 62 65 20 66 72 65 65   it will be free
1dff0 64 20 63 6f 72 72 65 63 74 6c 79 0a 20 20 2a 2a  d correctly.  **
1e000 20 62 79 20 74 68 65 20 63 61 6c 6c 69 6e 67 20   by the calling 
1e010 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 66  function */.  if
1e020 28 20 70 2d 3e 70 50 72 69 6f 72 20 29 7b 0a 20  ( p->pPrior ){. 
1e030 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74     sqlite3Select
1e040 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 50  Delete(db, p->pP
1e050 72 69 6f 72 29 3b 0a 20 20 7d 0a 20 20 70 2d 3e  rior);.  }.  p->
1e060 70 50 72 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b  pPrior = pPrior;
1e070 0a 20 20 70 50 72 69 6f 72 2d 3e 70 4e 65 78 74  .  pPrior->pNext
1e080 20 3d 20 70 3b 0a 0a 20 20 2f 2a 2a 2a 20 54 42   = p;..  /*** TB
1e090 44 3a 20 20 49 6e 73 65 72 74 20 73 75 62 72 6f  D:  Insert subro
1e0a0 75 74 69 6e 65 20 63 61 6c 6c 73 20 74 6f 20 63  utine calls to c
1e0b0 6c 6f 73 65 20 63 75 72 73 6f 72 73 20 6f 6e 20  lose cursors on 
1e0c0 69 6e 63 6f 6d 70 6c 65 74 65 0a 20 20 2a 2a 2a  incomplete.  ***
1e0d0 2a 20 73 75 62 71 75 65 72 69 65 73 20 2a 2a 2a  * subqueries ***
1e0e0 2a 2f 0a 20 20 45 78 70 6c 61 69 6e 51 75 65 72  */.  ExplainQuer
1e0f0 79 50 6c 61 6e 50 6f 70 28 70 50 61 72 73 65 29  yPlanPop(pParse)
1e100 3b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 72 73  ;.  return pPars
1e110 65 2d 3e 6e 45 72 72 21 3d 30 3b 0a 7d 0a 23 65  e->nErr!=0;.}.#e
1e120 6e 64 69 66 0a 0a 23 69 66 20 21 64 65 66 69 6e  ndif..#if !defin
1e130 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ed(SQLITE_OMIT_S
1e140 55 42 51 55 45 52 59 29 20 7c 7c 20 21 64 65 66  UBQUERY) || !def
1e150 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
1e160 5f 56 49 45 57 29 0a 0a 2f 2a 20 41 6e 20 69 6e  _VIEW)../* An in
1e170 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 53 75  stance of the Su
1e180 62 73 74 43 6f 6e 74 65 78 74 20 6f 62 6a 65 63  bstContext objec
1e190 74 20 64 65 73 63 72 69 62 65 73 20 61 6e 20 73  t describes an s
1e1a0 75 62 73 74 69 74 75 74 69 6f 6e 20 65 64 69 74  ubstitution edit
1e1b0 0a 2a 2a 20 74 6f 20 62 65 20 70 65 72 66 6f 72  .** to be perfor
1e1c0 6d 65 64 20 6f 6e 20 61 20 70 61 72 73 65 20 74  med on a parse t
1e1d0 72 65 65 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 72  ree..**.** All r
1e1e0 65 66 65 72 65 6e 63 65 73 20 74 6f 20 63 6f 6c  eferences to col
1e1f0 75 6d 6e 73 20 69 6e 20 74 61 62 6c 65 20 69 54  umns in table iT
1e200 61 62 6c 65 20 61 72 65 20 74 6f 20 62 65 20 72  able are to be r
1e210 65 70 6c 61 63 65 64 20 62 79 20 63 6f 72 72 65  eplaced by corre
1e220 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20 65 78 70 72  sponding.** expr
1e230 65 73 73 69 6f 6e 73 20 69 6e 20 70 45 4c 69 73  essions in pELis
1e240 74 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74  t..*/.typedef st
1e250 72 75 63 74 20 53 75 62 73 74 43 6f 6e 74 65 78  ruct SubstContex
1e260 74 20 7b 0a 20 20 50 61 72 73 65 20 2a 70 50 61  t {.  Parse *pPa
1e270 72 73 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  rse;            
1e280 2f 2a 20 54 68 65 20 70 61 72 73 69 6e 67 20 63  /* The parsing c
1e290 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20  ontext */.  int 
1e2a0 69 54 61 62 6c 65 3b 20 20 20 20 20 20 20 20 20  iTable;         
1e2b0 20 20 20 20 20 20 2f 2a 20 52 65 70 6c 61 63 65        /* Replace
1e2c0 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74   references to t
1e2d0 68 69 73 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69  his table */.  i
1e2e0 6e 74 20 69 4e 65 77 54 61 62 6c 65 3b 20 20 20  nt iNewTable;   
1e2f0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 77 20           /* New 
1e300 74 61 62 6c 65 20 6e 75 6d 62 65 72 20 2a 2f 0a  table number */.
1e310 20 20 69 6e 74 20 69 73 4c 65 66 74 4a 6f 69 6e    int isLeftJoin
1e320 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41  ;           /* A
1e330 64 64 20 54 4b 5f 49 46 5f 4e 55 4c 4c 5f 52 4f  dd TK_IF_NULL_RO
1e340 57 20 6f 70 63 6f 64 65 73 20 6f 6e 20 65 61 63  W opcodes on eac
1e350 68 20 72 65 70 6c 61 63 65 6d 65 6e 74 20 2a 2f  h replacement */
1e360 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c  .  ExprList *pEL
1e370 69 73 74 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  ist;         /* 
1e380 52 65 70 6c 61 63 65 6d 65 6e 74 20 65 78 70 72  Replacement expr
1e390 65 73 73 69 6f 6e 73 20 2a 2f 0a 7d 20 53 75 62  essions */.} Sub
1e3a0 73 74 43 6f 6e 74 65 78 74 3b 0a 0a 2f 2a 20 46  stContext;../* F
1e3b0 6f 72 77 61 72 64 20 44 65 63 6c 61 72 61 74 69  orward Declarati
1e3c0 6f 6e 73 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ons */.static vo
1e3d0 69 64 20 73 75 62 73 74 45 78 70 72 4c 69 73 74  id substExprList
1e3e0 28 53 75 62 73 74 43 6f 6e 74 65 78 74 2a 2c 20  (SubstContext*, 
1e3f0 45 78 70 72 4c 69 73 74 2a 29 3b 0a 73 74 61 74  ExprList*);.stat
1e400 69 63 20 76 6f 69 64 20 73 75 62 73 74 53 65 6c  ic void substSel
1e410 65 63 74 28 53 75 62 73 74 43 6f 6e 74 65 78 74  ect(SubstContext
1e420 2a 2c 20 53 65 6c 65 63 74 2a 2c 20 69 6e 74 29  *, Select*, int)
1e430 3b 0a 0a 2f 2a 0a 2a 2a 20 53 63 61 6e 20 74 68  ;../*.** Scan th
1e440 72 6f 75 67 68 20 74 68 65 20 65 78 70 72 65 73  rough the expres
1e450 73 69 6f 6e 20 70 45 78 70 72 2e 20 20 52 65 70  sion pExpr.  Rep
1e460 6c 61 63 65 20 65 76 65 72 79 20 72 65 66 65 72  lace every refer
1e470 65 6e 63 65 20 74 6f 0a 2a 2a 20 61 20 63 6f 6c  ence to.** a col
1e480 75 6d 6e 20 69 6e 20 74 61 62 6c 65 20 6e 75 6d  umn in table num
1e490 62 65 72 20 69 54 61 62 6c 65 20 77 69 74 68 20  ber iTable with 
1e4a0 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 69 43  a copy of the iC
1e4b0 6f 6c 75 6d 6e 2d 74 68 0a 2a 2a 20 65 6e 74 72  olumn-th.** entr
1e4c0 79 20 69 6e 20 70 45 4c 69 73 74 2e 20 20 28 42  y in pEList.  (B
1e4d0 75 74 20 6c 65 61 76 65 20 72 65 66 65 72 65 6e  ut leave referen
1e4e0 63 65 73 20 74 6f 20 74 68 65 20 52 4f 57 49 44  ces to the ROWID
1e4f0 20 63 6f 6c 75 6d 6e 20 0a 2a 2a 20 75 6e 63 68   column .** unch
1e500 61 6e 67 65 64 2e 29 0a 2a 2a 0a 2a 2a 20 54 68  anged.).**.** Th
1e510 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 70 61  is routine is pa
1e520 72 74 20 6f 66 20 74 68 65 20 66 6c 61 74 74 65  rt of the flatte
1e530 6e 69 6e 67 20 70 72 6f 63 65 64 75 72 65 2e 20  ning procedure. 
1e540 20 41 20 73 75 62 71 75 65 72 79 0a 2a 2a 20 77   A subquery.** w
1e550 68 6f 73 65 20 72 65 73 75 6c 74 20 73 65 74 20  hose result set 
1e560 69 73 20 64 65 66 69 6e 65 64 20 62 79 20 70 45  is defined by pE
1e570 4c 69 73 74 20 61 70 70 65 61 72 73 20 61 73 20  List appears as 
1e580 65 6e 74 72 79 20 69 6e 20 74 68 65 0a 2a 2a 20  entry in the.** 
1e590 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 61  FROM clause of a
1e5a0 20 53 45 4c 45 43 54 20 73 75 63 68 20 74 68 61   SELECT such tha
1e5b0 74 20 74 68 65 20 56 44 42 45 20 63 75 72 73 6f  t the VDBE curso
1e5c0 72 20 61 73 73 69 67 6e 65 64 20 74 6f 20 74 68  r assigned to th
1e5d0 61 74 0a 2a 2a 20 46 4f 52 4d 20 63 6c 61 75 73  at.** FORM claus
1e5e0 65 20 65 6e 74 72 79 20 69 73 20 69 54 61 62 6c  e entry is iTabl
1e5f0 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  e.  This routine
1e600 20 6d 61 6b 65 73 20 74 68 65 20 6e 65 63 65 73   makes the neces
1e610 73 61 72 79 20 0a 2a 2a 20 63 68 61 6e 67 65 73  sary .** changes
1e620 20 74 6f 20 70 45 78 70 72 20 73 6f 20 74 68 61   to pExpr so tha
1e630 74 20 69 74 20 72 65 66 65 72 73 20 64 69 72 65  t it refers dire
1e640 63 74 6c 79 20 74 6f 20 74 68 65 20 73 6f 75 72  ctly to the sour
1e650 63 65 20 74 61 62 6c 65 0a 2a 2a 20 6f 66 20 74  ce table.** of t
1e660 68 65 20 73 75 62 71 75 65 72 79 20 72 61 74 68  he subquery rath
1e670 65 72 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  er the result se
1e680 74 20 6f 66 20 74 68 65 20 73 75 62 71 75 65 72  t of the subquer
1e690 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 45 78 70  y..*/.static Exp
1e6a0 72 20 2a 73 75 62 73 74 45 78 70 72 28 0a 20 20  r *substExpr(.  
1e6b0 53 75 62 73 74 43 6f 6e 74 65 78 74 20 2a 70 53  SubstContext *pS
1e6c0 75 62 73 74 2c 20 20 2f 2a 20 44 65 73 63 72 69  ubst,  /* Descri
1e6d0 70 74 69 6f 6e 20 6f 66 20 74 68 65 20 73 75 62  ption of the sub
1e6e0 73 74 69 74 75 74 69 6f 6e 20 2a 2f 0a 20 20 45  stitution */.  E
1e6f0 78 70 72 20 2a 70 45 78 70 72 20 20 20 20 20 20  xpr *pExpr      
1e700 20 20 20 20 20 20 2f 2a 20 45 78 70 72 20 69 6e        /* Expr in
1e710 20 77 68 69 63 68 20 73 75 62 73 74 69 74 75 74   which substitut
1e720 69 6f 6e 20 6f 63 63 75 72 73 20 2a 2f 0a 29 7b  ion occurs */.){
1e730 0a 20 20 69 66 28 20 70 45 78 70 72 3d 3d 30 20  .  if( pExpr==0 
1e740 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66  ) return 0;.  if
1e750 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  ( ExprHasPropert
1e760 79 28 70 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d  y(pExpr, EP_From
1e770 4a 6f 69 6e 29 0a 20 20 20 26 26 20 70 45 78 70  Join).   && pExp
1e780 72 2d 3e 69 52 69 67 68 74 4a 6f 69 6e 54 61 62  r->iRightJoinTab
1e790 6c 65 3d 3d 70 53 75 62 73 74 2d 3e 69 54 61 62  le==pSubst->iTab
1e7a0 6c 65 0a 20 20 29 7b 0a 20 20 20 20 70 45 78 70  le.  ){.    pExp
1e7b0 72 2d 3e 69 52 69 67 68 74 4a 6f 69 6e 54 61 62  r->iRightJoinTab
1e7c0 6c 65 20 3d 20 70 53 75 62 73 74 2d 3e 69 4e 65  le = pSubst->iNe
1e7d0 77 54 61 62 6c 65 3b 0a 20 20 7d 0a 20 20 69 66  wTable;.  }.  if
1e7e0 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ( pExpr->op==TK_
1e7f0 43 4f 4c 55 4d 4e 20 26 26 20 70 45 78 70 72 2d  COLUMN && pExpr-
1e800 3e 69 54 61 62 6c 65 3d 3d 70 53 75 62 73 74 2d  >iTable==pSubst-
1e810 3e 69 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 69  >iTable ){.    i
1e820 66 28 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d  f( pExpr->iColum
1e830 6e 3c 30 20 29 7b 0a 20 20 20 20 20 20 70 45 78  n<0 ){.      pEx
1e840 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 4e 55 4c 4c  pr->op = TK_NULL
1e850 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
1e860 20 20 20 45 78 70 72 20 2a 70 4e 65 77 3b 0a 20     Expr *pNew;. 
1e870 20 20 20 20 20 45 78 70 72 20 2a 70 43 6f 70 79       Expr *pCopy
1e880 20 3d 20 70 53 75 62 73 74 2d 3e 70 45 4c 69 73   = pSubst->pELis
1e890 74 2d 3e 61 5b 70 45 78 70 72 2d 3e 69 43 6f 6c  t->a[pExpr->iCol
1e8a0 75 6d 6e 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  umn].pExpr;.    
1e8b0 20 20 45 78 70 72 20 69 66 4e 75 6c 6c 52 6f 77    Expr ifNullRow
1e8c0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
1e8d0 70 53 75 62 73 74 2d 3e 70 45 4c 69 73 74 21 3d  pSubst->pEList!=
1e8e0 30 20 26 26 20 70 45 78 70 72 2d 3e 69 43 6f 6c  0 && pExpr->iCol
1e8f0 75 6d 6e 3c 70 53 75 62 73 74 2d 3e 70 45 4c 69  umn<pSubst->pELi
1e900 73 74 2d 3e 6e 45 78 70 72 20 29 3b 0a 20 20 20  st->nExpr );.   
1e910 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72     assert( pExpr
1e920 2d 3e 70 52 69 67 68 74 3d 3d 30 20 29 3b 0a 20  ->pRight==0 );. 
1e930 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
1e940 45 78 70 72 49 73 56 65 63 74 6f 72 28 70 43 6f  ExprIsVector(pCo
1e950 70 79 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73  py) ){.        s
1e960 71 6c 69 74 65 33 56 65 63 74 6f 72 45 72 72 6f  qlite3VectorErro
1e970 72 4d 73 67 28 70 53 75 62 73 74 2d 3e 70 50 61  rMsg(pSubst->pPa
1e980 72 73 65 2c 20 70 43 6f 70 79 29 3b 0a 20 20 20  rse, pCopy);.   
1e990 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1e9a0 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
1e9b0 70 53 75 62 73 74 2d 3e 70 50 61 72 73 65 2d 3e  pSubst->pParse->
1e9c0 64 62 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  db;.        if( 
1e9d0 70 53 75 62 73 74 2d 3e 69 73 4c 65 66 74 4a 6f  pSubst->isLeftJo
1e9e0 69 6e 20 26 26 20 70 43 6f 70 79 2d 3e 6f 70 21  in && pCopy->op!
1e9f0 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20  =TK_COLUMN ){.  
1ea00 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28 26          memset(&
1ea10 69 66 4e 75 6c 6c 52 6f 77 2c 20 30 2c 20 73 69  ifNullRow, 0, si
1ea20 7a 65 6f 66 28 69 66 4e 75 6c 6c 52 6f 77 29 29  zeof(ifNullRow))
1ea30 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 4e 75  ;.          ifNu
1ea40 6c 6c 52 6f 77 2e 6f 70 20 3d 20 54 4b 5f 49 46  llRow.op = TK_IF
1ea50 5f 4e 55 4c 4c 5f 52 4f 57 3b 0a 20 20 20 20 20  _NULL_ROW;.     
1ea60 20 20 20 20 20 69 66 4e 75 6c 6c 52 6f 77 2e 70       ifNullRow.p
1ea70 4c 65 66 74 20 3d 20 70 43 6f 70 79 3b 0a 20 20  Left = pCopy;.  
1ea80 20 20 20 20 20 20 20 20 69 66 4e 75 6c 6c 52 6f          ifNullRo
1ea90 77 2e 69 54 61 62 6c 65 20 3d 20 70 53 75 62 73  w.iTable = pSubs
1eaa0 74 2d 3e 69 4e 65 77 54 61 62 6c 65 3b 0a 20 20  t->iNewTable;.  
1eab0 20 20 20 20 20 20 20 20 70 43 6f 70 79 20 3d 20          pCopy = 
1eac0 26 69 66 4e 75 6c 6c 52 6f 77 3b 0a 20 20 20 20  &ifNullRow;.    
1ead0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 74 65      }.        te
1eae0 73 74 63 61 73 65 28 20 45 78 70 72 48 61 73 50  stcase( ExprHasP
1eaf0 72 6f 70 65 72 74 79 28 70 43 6f 70 79 2c 20 45  roperty(pCopy, E
1eb00 50 5f 53 75 62 71 75 65 72 79 29 20 29 3b 0a 20  P_Subquery) );. 
1eb10 20 20 20 20 20 20 20 70 4e 65 77 20 3d 20 73 71         pNew = sq
1eb20 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c  lite3ExprDup(db,
1eb30 20 70 43 6f 70 79 2c 20 30 29 3b 0a 20 20 20 20   pCopy, 0);.    
1eb40 20 20 20 20 69 66 28 20 70 4e 65 77 20 26 26 20      if( pNew && 
1eb50 70 53 75 62 73 74 2d 3e 69 73 4c 65 66 74 4a 6f  pSubst->isLeftJo
1eb60 69 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  in ){.          
1eb70 45 78 70 72 53 65 74 50 72 6f 70 65 72 74 79 28  ExprSetProperty(
1eb80 70 4e 65 77 2c 20 45 50 5f 43 61 6e 42 65 4e 75  pNew, EP_CanBeNu
1eb90 6c 6c 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ll);.        }. 
1eba0 20 20 20 20 20 20 20 69 66 28 20 70 4e 65 77 20         if( pNew 
1ebb0 26 26 20 45 78 70 72 48 61 73 50 72 6f 70 65 72  && ExprHasProper
1ebc0 74 79 28 70 45 78 70 72 2c 45 50 5f 46 72 6f 6d  ty(pExpr,EP_From
1ebd0 4a 6f 69 6e 29 20 29 7b 0a 20 20 20 20 20 20 20  Join) ){.       
1ebe0 20 20 20 70 4e 65 77 2d 3e 69 52 69 67 68 74 4a     pNew->iRightJ
1ebf0 6f 69 6e 54 61 62 6c 65 20 3d 20 70 45 78 70 72  oinTable = pExpr
1ec00 2d 3e 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c  ->iRightJoinTabl
1ec10 65 3b 0a 20 20 20 20 20 20 20 20 20 20 45 78 70  e;.          Exp
1ec20 72 53 65 74 50 72 6f 70 65 72 74 79 28 70 4e 65  rSetProperty(pNe
1ec30 77 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 3b  w, EP_FromJoin);
1ec40 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1ec50 20 20 20 69 66 28 20 70 4e 65 77 20 26 26 20 45     if( pNew && E
1ec60 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
1ec70 45 78 70 72 2c 45 50 5f 47 65 6e 65 72 69 63 29  Expr,EP_Generic)
1ec80 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 45 78   ){.          Ex
1ec90 70 72 53 65 74 50 72 6f 70 65 72 74 79 28 70 4e  prSetProperty(pN
1eca0 65 77 2c 20 45 50 5f 47 65 6e 65 72 69 63 29 3b  ew, EP_Generic);
1ecb0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1ecc0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65     sqlite3ExprDe
1ecd0 6c 65 74 65 28 64 62 2c 20 70 45 78 70 72 29 3b  lete(db, pExpr);
1ece0 0a 20 20 20 20 20 20 20 20 70 45 78 70 72 20 3d  .        pExpr =
1ecf0 20 70 4e 65 77 3b 0a 20 20 20 20 20 20 7d 0a 20   pNew;.      }. 
1ed00 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
1ed10 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d    if( pExpr->op=
1ed20 3d 54 4b 5f 49 46 5f 4e 55 4c 4c 5f 52 4f 57 20  =TK_IF_NULL_ROW 
1ed30 26 26 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  && pExpr->iTable
1ed40 3d 3d 70 53 75 62 73 74 2d 3e 69 54 61 62 6c 65  ==pSubst->iTable
1ed50 20 29 7b 0a 20 20 20 20 20 20 70 45 78 70 72 2d   ){.      pExpr-
1ed60 3e 69 54 61 62 6c 65 20 3d 20 70 53 75 62 73 74  >iTable = pSubst
1ed70 2d 3e 69 4e 65 77 54 61 62 6c 65 3b 0a 20 20 20  ->iNewTable;.   
1ed80 20 7d 0a 20 20 20 20 70 45 78 70 72 2d 3e 70 4c   }.    pExpr->pL
1ed90 65 66 74 20 3d 20 73 75 62 73 74 45 78 70 72 28  eft = substExpr(
1eda0 70 53 75 62 73 74 2c 20 70 45 78 70 72 2d 3e 70  pSubst, pExpr->p
1edb0 4c 65 66 74 29 3b 0a 20 20 20 20 70 45 78 70 72  Left);.    pExpr
1edc0 2d 3e 70 52 69 67 68 74 20 3d 20 73 75 62 73 74  ->pRight = subst
1edd0 45 78 70 72 28 70 53 75 62 73 74 2c 20 70 45 78  Expr(pSubst, pEx
1ede0 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 20  pr->pRight);.   
1edf0 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70   if( ExprHasProp
1ee00 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78  erty(pExpr, EP_x
1ee10 49 73 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20  IsSelect) ){.   
1ee20 20 20 20 73 75 62 73 74 53 65 6c 65 63 74 28 70     substSelect(p
1ee30 53 75 62 73 74 2c 20 70 45 78 70 72 2d 3e 78 2e  Subst, pExpr->x.
1ee40 70 53 65 6c 65 63 74 2c 20 31 29 3b 0a 20 20 20  pSelect, 1);.   
1ee50 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 75   }else{.      su
1ee60 62 73 74 45 78 70 72 4c 69 73 74 28 70 53 75 62  bstExprList(pSub
1ee70 73 74 2c 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69  st, pExpr->x.pLi
1ee80 73 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  st);.    }.  }. 
1ee90 20 72 65 74 75 72 6e 20 70 45 78 70 72 3b 0a 7d   return pExpr;.}
1eea0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 75 62  .static void sub
1eeb0 73 74 45 78 70 72 4c 69 73 74 28 0a 20 20 53 75  stExprList(.  Su
1eec0 62 73 74 43 6f 6e 74 65 78 74 20 2a 70 53 75 62  bstContext *pSub
1eed0 73 74 2c 20 2f 2a 20 44 65 73 63 72 69 70 74 69  st, /* Descripti
1eee0 6f 6e 20 6f 66 20 74 68 65 20 73 75 62 73 74 69  on of the substi
1eef0 74 75 74 69 6f 6e 20 2a 2f 0a 20 20 45 78 70 72  tution */.  Expr
1ef00 4c 69 73 74 20 2a 70 4c 69 73 74 20 20 20 20 20  List *pList     
1ef10 20 20 2f 2a 20 4c 69 73 74 20 74 6f 20 73 63 61    /* List to sca
1ef20 6e 20 61 6e 64 20 69 6e 20 77 68 69 63 68 20 74  n and in which t
1ef30 6f 20 6d 61 6b 65 20 73 75 62 73 74 69 74 75 74  o make substitut
1ef40 65 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69  es */.){.  int i
1ef50 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30  ;.  if( pList==0
1ef60 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72   ) return;.  for
1ef70 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e  (i=0; i<pList->n
1ef80 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Expr; i++){.    
1ef90 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70  pList->a[i].pExp
1efa0 72 20 3d 20 73 75 62 73 74 45 78 70 72 28 70 53  r = substExpr(pS
1efb0 75 62 73 74 2c 20 70 4c 69 73 74 2d 3e 61 5b 69  ubst, pList->a[i
1efc0 5d 2e 70 45 78 70 72 29 3b 0a 20 20 7d 0a 7d 0a  ].pExpr);.  }.}.
1efd0 73 74 61 74 69 63 20 76 6f 69 64 20 73 75 62 73  static void subs
1efe0 74 53 65 6c 65 63 74 28 0a 20 20 53 75 62 73 74  tSelect(.  Subst
1eff0 43 6f 6e 74 65 78 74 20 2a 70 53 75 62 73 74 2c  Context *pSubst,
1f000 20 2f 2a 20 44 65 73 63 72 69 70 74 69 6f 6e 20   /* Description 
1f010 6f 66 20 74 68 65 20 73 75 62 73 74 69 74 75 74  of the substitut
1f020 69 6f 6e 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20  ion */.  Select 
1f030 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  *p,            /
1f040 2a 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  * SELECT stateme
1f050 6e 74 20 69 6e 20 77 68 69 63 68 20 74 6f 20 6d  nt in which to m
1f060 61 6b 65 20 73 75 62 73 74 69 74 75 74 69 6f 6e  ake substitution
1f070 73 20 2a 2f 0a 20 20 69 6e 74 20 64 6f 50 72 69  s */.  int doPri
1f080 6f 72 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  or           /* 
1f090 44 6f 20 73 75 62 73 74 69 74 75 74 65 73 20 6f  Do substitutes o
1f0a0 6e 20 70 2d 3e 70 50 72 69 6f 72 20 74 6f 6f 20  n p->pPrior too 
1f0b0 2a 2f 0a 29 7b 0a 20 20 53 72 63 4c 69 73 74 20  */.){.  SrcList 
1f0c0 2a 70 53 72 63 3b 0a 20 20 73 74 72 75 63 74 20  *pSrc;.  struct 
1f0d0 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  SrcList_item *pI
1f0e0 74 65 6d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  tem;.  int i;.  
1f0f0 69 66 28 20 21 70 20 29 20 72 65 74 75 72 6e 3b  if( !p ) return;
1f100 0a 20 20 64 6f 7b 0a 20 20 20 20 73 75 62 73 74  .  do{.    subst
1f110 45 78 70 72 4c 69 73 74 28 70 53 75 62 73 74 2c  ExprList(pSubst,
1f120 20 70 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20   p->pEList);.   
1f130 20 73 75 62 73 74 45 78 70 72 4c 69 73 74 28 70   substExprList(p
1f140 53 75 62 73 74 2c 20 70 2d 3e 70 47 72 6f 75 70  Subst, p->pGroup
1f150 42 79 29 3b 0a 20 20 20 20 73 75 62 73 74 45 78  By);.    substEx
1f160 70 72 4c 69 73 74 28 70 53 75 62 73 74 2c 20 70  prList(pSubst, p
1f170 2d 3e 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 20  ->pOrderBy);.   
1f180 20 70 2d 3e 70 48 61 76 69 6e 67 20 3d 20 73 75   p->pHaving = su
1f190 62 73 74 45 78 70 72 28 70 53 75 62 73 74 2c 20  bstExpr(pSubst, 
1f1a0 70 2d 3e 70 48 61 76 69 6e 67 29 3b 0a 20 20 20  p->pHaving);.   
1f1b0 20 70 2d 3e 70 57 68 65 72 65 20 3d 20 73 75 62   p->pWhere = sub
1f1c0 73 74 45 78 70 72 28 70 53 75 62 73 74 2c 20 70  stExpr(pSubst, p
1f1d0 2d 3e 70 57 68 65 72 65 29 3b 0a 20 20 20 20 70  ->pWhere);.    p
1f1e0 53 72 63 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20  Src = p->pSrc;. 
1f1f0 20 20 20 61 73 73 65 72 74 28 20 70 53 72 63 21     assert( pSrc!
1f200 3d 30 20 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d  =0 );.    for(i=
1f210 70 53 72 63 2d 3e 6e 53 72 63 2c 20 70 49 74 65  pSrc->nSrc, pIte
1f220 6d 3d 70 53 72 63 2d 3e 61 3b 20 69 3e 30 3b 20  m=pSrc->a; i>0; 
1f230 69 2d 2d 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20  i--, pItem++){. 
1f240 20 20 20 20 20 73 75 62 73 74 53 65 6c 65 63 74       substSelect
1f250 28 70 53 75 62 73 74 2c 20 70 49 74 65 6d 2d 3e  (pSubst, pItem->
1f260 70 53 65 6c 65 63 74 2c 20 31 29 3b 0a 20 20 20  pSelect, 1);.   
1f270 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 66 67     if( pItem->fg
1f280 2e 69 73 54 61 62 46 75 6e 63 20 29 7b 0a 20 20  .isTabFunc ){.  
1f290 20 20 20 20 20 20 73 75 62 73 74 45 78 70 72 4c        substExprL
1f2a0 69 73 74 28 70 53 75 62 73 74 2c 20 70 49 74 65  ist(pSubst, pIte
1f2b0 6d 2d 3e 75 31 2e 70 46 75 6e 63 41 72 67 29 3b  m->u1.pFuncArg);
1f2c0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
1f2d0 20 7d 77 68 69 6c 65 28 20 64 6f 50 72 69 6f 72   }while( doPrior
1f2e0 20 26 26 20 28 70 20 3d 20 70 2d 3e 70 50 72 69   && (p = p->pPri
1f2f0 6f 72 29 21 3d 30 20 29 3b 0a 7d 0a 23 65 6e 64  or)!=0 );.}.#end
1f300 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53  if /* !defined(S
1f310 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
1f320 45 52 59 29 20 7c 7c 20 21 64 65 66 69 6e 65 64  ERY) || !defined
1f330 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45  (SQLITE_OMIT_VIE
1f340 57 29 20 2a 2f 0a 0a 23 69 66 20 21 64 65 66 69  W) */..#if !defi
1f350 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
1f360 53 55 42 51 55 45 52 59 29 20 7c 7c 20 21 64 65  SUBQUERY) || !de
1f370 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
1f380 54 5f 56 49 45 57 29 0a 2f 2a 0a 2a 2a 20 54 68  T_VIEW)./*.** Th
1f390 69 73 20 72 6f 75 74 69 6e 65 20 61 74 74 65 6d  is routine attem
1f3a0 70 74 73 20 74 6f 20 66 6c 61 74 74 65 6e 20 73  pts to flatten s
1f3b0 75 62 71 75 65 72 69 65 73 20 61 73 20 61 20 70  ubqueries as a p
1f3c0 65 72 66 6f 72 6d 61 6e 63 65 20 6f 70 74 69 6d  erformance optim
1f3d0 69 7a 61 74 69 6f 6e 2e 0a 2a 2a 20 54 68 69 73  ization..** This
1f3e0 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73   routine returns
1f3f0 20 31 20 69 66 20 69 74 20 6d 61 6b 65 73 20 63   1 if it makes c
1f400 68 61 6e 67 65 73 20 61 6e 64 20 30 20 69 66 20  hanges and 0 if 
1f410 6e 6f 20 66 6c 61 74 74 65 6e 69 6e 67 20 6f 63  no flattening oc
1f420 63 75 72 73 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 75  curs..**.** To u
1f430 6e 64 65 72 73 74 61 6e 64 20 74 68 65 20 63 6f  nderstand the co
1f440 6e 63 65 70 74 20 6f 66 20 66 6c 61 74 74 65 6e  ncept of flatten
1f450 69 6e 67 2c 20 63 6f 6e 73 69 64 65 72 20 74 68  ing, consider th
1f460 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 71  e following.** q
1f470 75 65 72 79 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  uery:.**.**     
1f480 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 28 53  SELECT a FROM (S
1f490 45 4c 45 43 54 20 78 2b 79 20 41 53 20 61 20 46  ELECT x+y AS a F
1f4a0 52 4f 4d 20 74 31 20 57 48 45 52 45 20 7a 3c 31  ROM t1 WHERE z<1
1f4b0 30 30 29 20 57 48 45 52 45 20 61 3e 35 0a 2a 2a  00) WHERE a>5.**
1f4c0 0a 2a 2a 20 54 68 65 20 64 65 66 61 75 6c 74 20  .** The default 
1f4d0 77 61 79 20 6f 66 20 69 6d 70 6c 65 6d 65 6e 74  way of implement
1f4e0 69 6e 67 20 74 68 69 73 20 71 75 65 72 79 20 69  ing this query i
1f4f0 73 20 74 6f 20 65 78 65 63 75 74 65 20 74 68 65  s to execute the
1f500 0a 2a 2a 20 73 75 62 71 75 65 72 79 20 66 69 72  .** subquery fir
1f510 73 74 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65  st and store the
1f520 20 72 65 73 75 6c 74 73 20 69 6e 20 61 20 74 65   results in a te
1f530 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 2c 20 74  mporary table, t
1f540 68 65 6e 0a 2a 2a 20 72 75 6e 20 74 68 65 20 6f  hen.** run the o
1f550 75 74 65 72 20 71 75 65 72 79 20 6f 6e 20 74 68  uter query on th
1f560 61 74 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  at temporary tab
1f570 6c 65 2e 20 20 54 68 69 73 20 72 65 71 75 69 72  le.  This requir
1f580 65 73 20 74 77 6f 0a 2a 2a 20 70 61 73 73 65 73  es two.** passes
1f590 20 6f 76 65 72 20 74 68 65 20 64 61 74 61 2e 20   over the data. 
1f5a0 20 46 75 72 74 68 65 72 6d 6f 72 65 2c 20 62 65   Furthermore, be
1f5b0 63 61 75 73 65 20 74 68 65 20 74 65 6d 70 6f 72  cause the tempor
1f5c0 61 72 79 20 74 61 62 6c 65 0a 2a 2a 20 68 61 73  ary table.** has
1f5d0 20 6e 6f 20 69 6e 64 69 63 65 73 2c 20 74 68 65   no indices, the
1f5e0 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 6f 6e   WHERE clause on
1f5f0 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
1f600 20 63 61 6e 6e 6f 74 20 62 65 0a 2a 2a 20 6f 70   cannot be.** op
1f610 74 69 6d 69 7a 65 64 2e 0a 2a 2a 0a 2a 2a 20 54  timized..**.** T
1f620 68 69 73 20 72 6f 75 74 69 6e 65 20 61 74 74 65  his routine atte
1f630 6d 70 74 73 20 74 6f 20 72 65 77 72 69 74 65 20  mpts to rewrite 
1f640 71 75 65 72 69 65 73 20 73 75 63 68 20 61 73 20  queries such as 
1f650 74 68 65 20 61 62 6f 76 65 20 69 6e 74 6f 0a 2a  the above into.*
1f660 2a 20 61 20 73 69 6e 67 6c 65 20 66 6c 61 74 20  * a single flat 
1f670 73 65 6c 65 63 74 2c 20 6c 69 6b 65 20 74 68 69  select, like thi
1f680 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c  s:.**.**     SEL
1f690 45 43 54 20 78 2b 79 20 41 53 20 61 20 46 52 4f  ECT x+y AS a FRO
1f6a0 4d 20 74 31 20 57 48 45 52 45 20 7a 3c 31 30 30  M t1 WHERE z<100
1f6b0 20 41 4e 44 20 61 3e 35 0a 2a 2a 0a 2a 2a 20 54   AND a>5.**.** T
1f6c0 68 65 20 63 6f 64 65 20 67 65 6e 65 72 61 74 65  he code generate
1f6d0 64 20 66 6f 72 20 74 68 69 73 20 73 69 6d 70 6c  d for this simpl
1f6e0 69 66 69 63 61 74 69 6f 6e 20 67 69 76 65 73 20  ification gives 
1f6f0 74 68 65 20 73 61 6d 65 20 72 65 73 75 6c 74 0a  the same result.
1f700 2a 2a 20 62 75 74 20 6f 6e 6c 79 20 68 61 73 20  ** but only has 
1f710 74 6f 20 73 63 61 6e 20 74 68 65 20 64 61 74 61  to scan the data
1f720 20 6f 6e 63 65 2e 20 20 41 6e 64 20 62 65 63 61   once.  And beca
1f730 75 73 65 20 69 6e 64 69 63 65 73 20 6d 69 67 68  use indices migh
1f740 74 20 0a 2a 2a 20 65 78 69 73 74 20 6f 6e 20 74  t .** exist on t
1f750 68 65 20 74 61 62 6c 65 20 74 31 2c 20 61 20 63  he table t1, a c
1f760 6f 6d 70 6c 65 74 65 20 73 63 61 6e 20 6f 66 20  omplete scan of 
1f770 74 68 65 20 64 61 74 61 20 6d 69 67 68 74 20 62  the data might b
1f780 65 0a 2a 2a 20 61 76 6f 69 64 65 64 2e 0a 2a 2a  e.** avoided..**
1f790 0a 2a 2a 20 46 6c 61 74 74 65 6e 69 6e 67 20 69  .** Flattening i
1f7a0 73 20 73 75 62 6a 65 63 74 20 74 6f 20 74 68 65  s subject to the
1f7b0 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 6e 73 74   following const
1f7c0 72 61 69 6e 74 73 3a 0a 2a 2a 0a 2a 2a 20 20 28  raints:.**.**  (
1f7d0 2a 2a 29 20 20 57 65 20 6e 6f 20 6c 6f 6e 67 65  **)  We no longe
1f7e0 72 20 61 74 74 65 6d 70 74 20 74 6f 20 66 6c 61  r attempt to fla
1f7f0 74 74 65 6e 20 61 67 67 72 65 67 61 74 65 20 73  tten aggregate s
1f800 75 62 71 75 65 72 69 65 73 2e 20 57 61 73 3a 0a  ubqueries. Was:.
1f810 2a 2a 20 20 20 20 20 20 20 20 54 68 65 20 73 75  **        The su
1f820 62 71 75 65 72 79 20 61 6e 64 20 74 68 65 20 6f  bquery and the o
1f830 75 74 65 72 20 71 75 65 72 79 20 63 61 6e 6e 6f  uter query canno
1f840 74 20 62 6f 74 68 20 62 65 20 61 67 67 72 65 67  t both be aggreg
1f850 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 28 2a 2a  ates..**.**  (**
1f860 29 20 20 57 65 20 6e 6f 20 6c 6f 6e 67 65 72 20  )  We no longer 
1f870 61 74 74 65 6d 70 74 20 74 6f 20 66 6c 61 74 74  attempt to flatt
1f880 65 6e 20 61 67 67 72 65 67 61 74 65 20 73 75 62  en aggregate sub
1f890 71 75 65 72 69 65 73 2e 20 57 61 73 3a 0a 2a 2a  queries. Was:.**
1f8a0 20 20 20 20 20 20 20 20 28 32 29 20 49 66 20 74          (2) If t
1f8b0 68 65 20 73 75 62 71 75 65 72 79 20 69 73 20 61  he subquery is a
1f8c0 6e 20 61 67 67 72 65 67 61 74 65 20 74 68 65 6e  n aggregate then
1f8d0 0a 2a 2a 20 20 20 20 20 20 20 20 28 32 61 29 20  .**        (2a) 
1f8e0 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  the outer query 
1f8f0 6d 75 73 74 20 6e 6f 74 20 62 65 20 61 20 6a 6f  must not be a jo
1f900 69 6e 20 61 6e 64 0a 2a 2a 20 20 20 20 20 20 20  in and.**       
1f910 20 28 32 62 29 20 74 68 65 20 6f 75 74 65 72 20   (2b) the outer 
1f920 71 75 65 72 79 20 6d 75 73 74 20 6e 6f 74 20 75  query must not u
1f930 73 65 20 73 75 62 71 75 65 72 69 65 73 0a 2a 2a  se subqueries.**
1f940 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 74 68               oth
1f950 65 72 20 74 68 61 6e 20 74 68 65 20 6f 6e 65 20  er than the one 
1f960 46 52 4f 4d 2d 63 6c 61 75 73 65 20 73 75 62 71  FROM-clause subq
1f970 75 65 72 79 20 74 68 61 74 20 69 73 20 61 20 63  uery that is a c
1f980 61 6e 64 69 64 61 74 65 0a 2a 2a 20 20 20 20 20  andidate.**     
1f990 20 20 20 20 20 20 20 20 66 6f 72 20 66 6c 61 74          for flat
1f9a0 74 65 6e 69 6e 67 2e 20 20 28 54 68 69 73 20 69  tening.  (This i
1f9b0 73 20 64 75 65 20 74 6f 20 74 69 63 6b 65 74 20  s due to ticket 
1f9c0 5b 32 66 37 31 37 30 64 37 33 62 66 39 61 62 66  [2f7170d73bf9abf
1f9d0 38 30 5d 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  80].**          
1f9e0 20 20 20 66 72 6f 6d 20 32 30 31 35 2d 30 32 2d     from 2015-02-
1f9f0 30 39 2e 29 0a 2a 2a 0a 2a 2a 20 20 20 28 33 29  09.).**.**   (3)
1fa00 20 20 49 66 20 74 68 65 20 73 75 62 71 75 65 72    If the subquer
1fa10 79 20 69 73 20 74 68 65 20 72 69 67 68 74 20 6f  y is the right o
1fa20 70 65 72 61 6e 64 20 6f 66 20 61 20 4c 45 46 54  perand of a LEFT
1fa30 20 4a 4f 49 4e 20 74 68 65 6e 0a 2a 2a 20 20 20   JOIN then.**   
1fa40 20 20 20 20 20 28 33 61 29 20 74 68 65 20 73 75       (3a) the su
1fa50 62 71 75 65 72 79 20 6d 61 79 20 6e 6f 74 20 62  bquery may not b
1fa60 65 20 61 20 6a 6f 69 6e 20 61 6e 64 0a 2a 2a 20  e a join and.** 
1fa70 20 20 20 20 20 20 20 28 33 62 29 20 74 68 65 20         (3b) the 
1fa80 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74  FROM clause of t
1fa90 68 65 20 73 75 62 71 75 65 72 79 20 6d 61 79 20  he subquery may 
1faa0 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 61 20 76 69  not contain a vi
1fab0 72 74 75 61 6c 0a 2a 2a 20 20 20 20 20 20 20 20  rtual.**        
1fac0 20 20 20 20 20 74 61 62 6c 65 20 61 6e 64 0a 2a       table and.*
1fad0 2a 20 20 20 20 20 20 20 20 28 33 63 29 20 74 68  *        (3c) th
1fae0 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 6d 61  e outer query ma
1faf0 79 20 6e 6f 74 20 62 65 20 61 6e 20 61 67 67 72  y not be an aggr
1fb00 65 67 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 28  egate..**.**   (
1fb10 34 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79  4)  The subquery
1fb20 20 63 61 6e 20 6e 6f 74 20 62 65 20 44 49 53 54   can not be DIST
1fb30 49 4e 43 54 2e 0a 2a 2a 0a 2a 2a 20 20 28 2a 2a  INCT..**.**  (**
1fb40 29 20 20 41 74 20 6f 6e 65 20 70 6f 69 6e 74 20  )  At one point 
1fb50 72 65 73 74 72 69 63 74 69 6f 6e 73 20 28 34 29  restrictions (4)
1fb60 20 61 6e 64 20 28 35 29 20 64 65 66 69 6e 65 64   and (5) defined
1fb70 20 61 20 73 75 62 73 65 74 20 6f 66 20 44 49 53   a subset of DIS
1fb80 54 49 4e 43 54 0a 2a 2a 20 20 20 20 20 20 20 20  TINCT.**        
1fb90 73 75 62 2d 71 75 65 72 69 65 73 20 74 68 61 74  sub-queries that
1fba0 20 77 65 72 65 20 65 78 63 6c 75 64 65 64 20 66   were excluded f
1fbb0 72 6f 6d 20 74 68 69 73 20 6f 70 74 69 6d 69 7a  rom this optimiz
1fbc0 61 74 69 6f 6e 2e 20 52 65 73 74 72 69 63 74 69  ation. Restricti
1fbd0 6f 6e 20 0a 2a 2a 20 20 20 20 20 20 20 20 28 34  on .**        (4
1fbe0 29 20 68 61 73 20 73 69 6e 63 65 20 62 65 65 6e  ) has since been
1fbf0 20 65 78 70 61 6e 64 65 64 20 74 6f 20 65 78 63   expanded to exc
1fc00 6c 75 64 65 20 61 6c 6c 20 44 49 53 54 49 4e 43  lude all DISTINC
1fc10 54 20 73 75 62 71 75 65 72 69 65 73 2e 0a 2a 2a  T subqueries..**
1fc20 0a 2a 2a 20 20 28 2a 2a 29 20 20 57 65 20 6e 6f  .**  (**)  We no
1fc30 20 6c 6f 6e 67 65 72 20 61 74 74 65 6d 70 74 20   longer attempt 
1fc40 74 6f 20 66 6c 61 74 74 65 6e 20 61 67 67 72 65  to flatten aggre
1fc50 67 61 74 65 20 73 75 62 71 75 65 72 69 65 73 2e  gate subqueries.
1fc60 20 20 57 61 73 3a 0a 2a 2a 20 20 20 20 20 20 20    Was:.**       
1fc70 20 49 66 20 74 68 65 20 73 75 62 71 75 65 72 79   If the subquery
1fc80 20 69 73 20 61 67 67 72 65 67 61 74 65 2c 20 74   is aggregate, t
1fc90 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 6d  he outer query m
1fca0 61 79 20 6e 6f 74 20 62 65 20 44 49 53 54 49 4e  ay not be DISTIN
1fcb0 43 54 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 37 29 20  CT..**.**   (7) 
1fcc0 20 54 68 65 20 73 75 62 71 75 65 72 79 20 6d 75   The subquery mu
1fcd0 73 74 20 68 61 76 65 20 61 20 46 52 4f 4d 20 63  st have a FROM c
1fce0 6c 61 75 73 65 2e 20 20 54 4f 44 4f 3a 20 20 46  lause.  TODO:  F
1fcf0 6f 72 20 73 75 62 71 75 65 72 69 65 73 20 77 69  or subqueries wi
1fd00 74 68 6f 75 74 0a 2a 2a 20 20 20 20 20 20 20 20  thout.**        
1fd10 41 20 46 52 4f 4d 20 63 6c 61 75 73 65 2c 20 63  A FROM clause, c
1fd20 6f 6e 73 69 64 65 72 20 61 64 64 69 6e 67 20 61  onsider adding a
1fd30 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 77 69 74   FROM clause wit
1fd40 68 20 74 68 65 20 73 70 65 63 69 61 6c 0a 2a 2a  h the special.**
1fd50 20 20 20 20 20 20 20 20 74 61 62 6c 65 20 73 71          table sq
1fd60 6c 69 74 65 5f 6f 6e 63 65 20 74 68 61 74 20 63  lite_once that c
1fd70 6f 6e 73 69 73 74 73 20 6f 66 20 61 20 73 69 6e  onsists of a sin
1fd80 67 6c 65 20 72 6f 77 20 63 6f 6e 74 61 69 6e 69  gle row containi
1fd90 6e 67 20 61 0a 2a 2a 20 20 20 20 20 20 20 20 73  ng a.**        s
1fda0 69 6e 67 6c 65 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a  ingle NULL..**.*
1fdb0 2a 20 20 20 28 38 29 20 20 49 66 20 74 68 65 20  *   (8)  If the 
1fdc0 73 75 62 71 75 65 72 79 20 75 73 65 73 20 4c 49  subquery uses LI
1fdd0 4d 49 54 20 74 68 65 6e 20 74 68 65 20 6f 75 74  MIT then the out
1fde0 65 72 20 71 75 65 72 79 20 6d 61 79 20 6e 6f 74  er query may not
1fdf0 20 62 65 20 61 20 6a 6f 69 6e 2e 0a 2a 2a 0a 2a   be a join..**.*
1fe00 2a 20 20 20 28 39 29 20 20 49 66 20 74 68 65 20  *   (9)  If the 
1fe10 73 75 62 71 75 65 72 79 20 75 73 65 73 20 4c 49  subquery uses LI
1fe20 4d 49 54 20 74 68 65 6e 20 74 68 65 20 6f 75 74  MIT then the out
1fe30 65 72 20 71 75 65 72 79 20 6d 61 79 20 6e 6f 74  er query may not
1fe40 20 62 65 20 61 67 67 72 65 67 61 74 65 2e 0a 2a   be aggregate..*
1fe50 2a 0a 2a 2a 20 20 28 2a 2a 29 20 20 52 65 73 74  *.**  (**)  Rest
1fe60 72 69 63 74 69 6f 6e 20 28 31 30 29 20 77 61 73  riction (10) was
1fe70 20 72 65 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68   removed from th
1fe80 65 20 63 6f 64 65 20 6f 6e 20 32 30 30 35 2d 30  e code on 2005-0
1fe90 32 2d 30 35 20 62 75 74 20 77 65 0a 2a 2a 20 20  2-05 but we.**  
1fea0 20 20 20 20 20 20 61 63 63 69 64 65 6e 74 6c 79        accidently
1feb0 20 63 61 72 72 69 65 64 20 74 68 65 20 63 6f 6d   carried the com
1fec0 6d 65 6e 74 20 66 6f 72 77 61 72 64 20 75 6e 74  ment forward unt
1fed0 69 6c 20 32 30 31 34 2d 30 39 2d 31 35 2e 20 20  il 2014-09-15.  
1fee0 4f 72 69 67 69 6e 61 6c 0a 2a 2a 20 20 20 20 20  Original.**     
1fef0 20 20 20 63 6f 6e 73 74 72 61 69 6e 74 3a 20 22     constraint: "
1ff00 49 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20  If the subquery 
1ff10 69 73 20 61 67 67 72 65 67 61 74 65 20 74 68 65  is aggregate the
1ff20 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  n the outer quer
1ff30 79 20 0a 2a 2a 20 20 20 20 20 20 20 20 6d 61 79  y .**        may
1ff40 20 6e 6f 74 20 75 73 65 20 4c 49 4d 49 54 2e 22   not use LIMIT."
1ff50 0a 2a 2a 0a 2a 2a 20 20 28 31 31 29 20 20 54 68  .**.**  (11)  Th
1ff60 65 20 73 75 62 71 75 65 72 79 20 61 6e 64 20 74  e subquery and t
1ff70 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 6d  he outer query m
1ff80 61 79 20 6e 6f 74 20 62 6f 74 68 20 68 61 76 65  ay not both have
1ff90 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
1ffa0 73 2e 0a 2a 2a 0a 2a 2a 20 20 28 2a 2a 29 20 20  s..**.**  (**)  
1ffb0 4e 6f 74 20 69 6d 70 6c 65 6d 65 6e 74 65 64 2e  Not implemented.
1ffc0 20 20 53 75 62 73 75 6d 65 64 20 69 6e 74 6f 20    Subsumed into 
1ffd0 72 65 73 74 72 69 63 74 69 6f 6e 20 28 33 29 2e  restriction (3).
1ffe0 20 20 57 61 73 20 70 72 65 76 69 6f 75 73 6c 79    Was previously
1fff0 0a 2a 2a 20 20 20 20 20 20 20 20 61 20 73 65 70  .**        a sep
20000 61 72 61 74 65 20 72 65 73 74 72 69 63 74 69 6f  arate restrictio
20010 6e 20 64 65 72 69 76 69 6e 67 20 66 72 6f 6d 20  n deriving from 
20020 74 69 63 6b 65 74 20 23 33 35 30 2e 0a 2a 2a 0a  ticket #350..**.
20030 2a 2a 20 20 28 31 33 29 20 20 54 68 65 20 73 75  **  (13)  The su
20040 62 71 75 65 72 79 20 61 6e 64 20 6f 75 74 65 72  bquery and outer
20050 20 71 75 65 72 79 20 6d 61 79 20 6e 6f 74 20 62   query may not b
20060 6f 74 68 20 75 73 65 20 4c 49 4d 49 54 2e 0a 2a  oth use LIMIT..*
20070 2a 0a 2a 2a 20 20 28 31 34 29 20 20 54 68 65 20  *.**  (14)  The 
20080 73 75 62 71 75 65 72 79 20 6d 61 79 20 6e 6f 74  subquery may not
20090 20 75 73 65 20 4f 46 46 53 45 54 2e 0a 2a 2a 0a   use OFFSET..**.
200a0 2a 2a 20 20 28 31 35 29 20 20 49 66 20 74 68 65  **  (15)  If the
200b0 20 6f 75 74 65 72 20 71 75 65 72 79 20 69 73 20   outer query is 
200c0 70 61 72 74 20 6f 66 20 61 20 63 6f 6d 70 6f 75  part of a compou
200d0 6e 64 20 73 65 6c 65 63 74 2c 20 74 68 65 6e 20  nd select, then 
200e0 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 73 75  the.**        su
200f0 62 71 75 65 72 79 20 6d 61 79 20 6e 6f 74 20 75  bquery may not u
20100 73 65 20 4c 49 4d 49 54 2e 0a 2a 2a 20 20 20 20  se LIMIT..**    
20110 20 20 20 20 28 53 65 65 20 74 69 63 6b 65 74 20      (See ticket 
20120 23 32 33 33 39 20 61 6e 64 20 74 69 63 6b 65 74  #2339 and ticket
20130 20 5b 30 32 61 38 65 38 31 64 34 34 5d 29 2e 0a   [02a8e81d44])..
20140 2a 2a 0a 2a 2a 20 20 28 31 36 29 20 20 49 66 20  **.**  (16)  If 
20150 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  the outer query 
20160 69 73 20 61 67 67 72 65 67 61 74 65 2c 20 74 68  is aggregate, th
20170 65 6e 20 74 68 65 20 73 75 62 71 75 65 72 79 20  en the subquery 
20180 6d 61 79 20 6e 6f 74 0a 2a 2a 20 20 20 20 20 20  may not.**      
20190 20 20 75 73 65 20 4f 52 44 45 52 20 42 59 2e 20    use ORDER BY. 
201a0 20 28 54 69 63 6b 65 74 20 23 32 39 34 32 29 20   (Ticket #2942) 
201b0 20 54 68 69 73 20 75 73 65 64 20 74 6f 20 6e 6f   This used to no
201c0 74 20 6d 61 74 74 65 72 0a 2a 2a 20 20 20 20 20  t matter.**     
201d0 20 20 20 75 6e 74 69 6c 20 77 65 20 69 6e 74 72     until we intr
201e0 6f 64 75 63 65 64 20 74 68 65 20 67 72 6f 75 70  oduced the group
201f0 5f 63 6f 6e 63 61 74 28 29 20 66 75 6e 63 74 69  _concat() functi
20200 6f 6e 2e 20 20 0a 2a 2a 0a 2a 2a 20 20 28 31 37  on.  .**.**  (17
20210 29 20 20 49 66 20 74 68 65 20 73 75 62 71 75 65  )  If the subque
20220 72 79 20 69 73 20 61 20 63 6f 6d 70 6f 75 6e 64  ry is a compound
20230 20 73 65 6c 65 63 74 2c 20 74 68 65 6e 0a 2a 2a   select, then.**
20240 20 20 20 20 20 20 20 20 28 31 37 61 29 20 61 6c          (17a) al
20250 6c 20 63 6f 6d 70 6f 75 6e 64 20 6f 70 65 72 61  l compound opera
20260 74 6f 72 73 20 6d 75 73 74 20 62 65 20 61 20 55  tors must be a U
20270 4e 49 4f 4e 20 41 4c 4c 2c 20 61 6e 64 0a 2a 2a  NION ALL, and.**
20280 20 20 20 20 20 20 20 20 28 31 37 62 29 20 6e 6f          (17b) no
20290 20 74 65 72 6d 73 20 77 69 74 68 69 6e 20 74 68   terms within th
202a0 65 20 73 75 62 71 75 65 72 79 20 63 6f 6d 70 6f  e subquery compo
202b0 75 6e 64 20 6d 61 79 20 62 65 20 61 67 67 72 65  und may be aggre
202c0 67 61 74 65 0a 2a 2a 20 20 20 20 20 20 20 20 20  gate.**         
202d0 20 20 20 20 20 6f 72 20 44 49 53 54 49 4e 43 54       or DISTINCT
202e0 2c 20 61 6e 64 0a 2a 2a 20 20 20 20 20 20 20 20  , and.**        
202f0 28 31 37 63 29 20 65 76 65 72 79 20 74 65 72 6d  (17c) every term
20300 20 77 69 74 68 69 6e 20 74 68 65 20 73 75 62 71   within the subq
20310 75 65 72 79 20 63 6f 6d 70 6f 75 6e 64 20 6d 75  uery compound mu
20320 73 74 20 68 61 76 65 20 61 20 46 52 4f 4d 20 63  st have a FROM c
20330 6c 61 75 73 65 0a 2a 2a 20 20 20 20 20 20 20 20  lause.**        
20340 28 31 37 64 29 20 74 68 65 20 6f 75 74 65 72 20  (17d) the outer 
20350 71 75 65 72 79 20 6d 61 79 20 6e 6f 74 20 62 65  query may not be
20360 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
20370 20 28 31 37 64 31 29 20 61 67 67 72 65 67 61 74   (17d1) aggregat
20380 65 2c 20 6f 72 0a 2a 2a 20 20 20 20 20 20 20 20  e, or.**        
20390 20 20 20 20 20 20 28 31 37 64 32 29 20 44 49 53        (17d2) DIS
203a0 54 49 4e 43 54 2c 20 6f 72 0a 2a 2a 20 20 20 20  TINCT, or.**    
203b0 20 20 20 20 20 20 20 20 20 20 28 31 37 64 33 29            (17d3)
203c0 20 61 20 6a 6f 69 6e 2e 0a 2a 2a 0a 2a 2a 20 20   a join..**.**  
203d0 20 20 20 20 20 20 54 68 65 20 70 61 72 65 6e 74        The parent
203e0 20 61 6e 64 20 73 75 62 2d 71 75 65 72 79 20 6d   and sub-query m
203f0 61 79 20 63 6f 6e 74 61 69 6e 20 57 48 45 52 45  ay contain WHERE
20400 20 63 6c 61 75 73 65 73 2e 20 53 75 62 6a 65 63   clauses. Subjec
20410 74 20 74 6f 0a 2a 2a 20 20 20 20 20 20 20 20 72  t to.**        r
20420 75 6c 65 73 20 28 31 31 29 2c 20 28 31 33 29 20  ules (11), (13) 
20430 61 6e 64 20 28 31 34 29 2c 20 74 68 65 79 20 6d  and (14), they m
20440 61 79 20 61 6c 73 6f 20 63 6f 6e 74 61 69 6e 20  ay also contain 
20450 4f 52 44 45 52 20 42 59 2c 0a 2a 2a 20 20 20 20  ORDER BY,.**    
20460 20 20 20 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46      LIMIT and OF
20470 46 53 45 54 20 63 6c 61 75 73 65 73 2e 20 20 54  FSET clauses.  T
20480 68 65 20 73 75 62 71 75 65 72 79 20 63 61 6e 6e  he subquery cann
20490 6f 74 20 75 73 65 20 61 6e 79 20 63 6f 6d 70 6f  ot use any compo
204a0 75 6e 64 0a 2a 2a 20 20 20 20 20 20 20 20 6f 70  und.**        op
204b0 65 72 61 74 6f 72 20 6f 74 68 65 72 20 74 68 61  erator other tha
204c0 6e 20 55 4e 49 4f 4e 20 41 4c 4c 20 62 65 63 61  n UNION ALL beca
204d0 75 73 65 20 61 6c 6c 20 74 68 65 20 6f 74 68 65  use all the othe
204e0 72 20 63 6f 6d 70 6f 75 6e 64 0a 2a 2a 20 20 20  r compound.**   
204f0 20 20 20 20 20 6f 70 65 72 61 74 6f 72 73 20 68       operators h
20500 61 76 65 20 61 6e 20 69 6d 70 6c 69 65 64 20 44  ave an implied D
20510 49 53 54 49 4e 43 54 20 77 68 69 63 68 20 69 73  ISTINCT which is
20520 20 64 69 73 61 6c 6c 6f 77 65 64 20 62 79 0a 2a   disallowed by.*
20530 2a 20 20 20 20 20 20 20 20 72 65 73 74 72 69 63  *        restric
20540 74 69 6f 6e 20 28 34 29 2e 0a 2a 2a 0a 2a 2a 20  tion (4)..**.** 
20550 20 20 20 20 20 20 20 41 6c 73 6f 2c 20 65 61 63         Also, eac
20560 68 20 63 6f 6d 70 6f 6e 65 6e 74 20 6f 66 20 74  h component of t
20570 68 65 20 73 75 62 2d 71 75 65 72 79 20 6d 75 73  he sub-query mus
20580 74 20 72 65 74 75 72 6e 20 74 68 65 20 73 61 6d  t return the sam
20590 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 20 20 20 20  e number.**     
205a0 20 20 20 6f 66 20 72 65 73 75 6c 74 20 63 6f 6c     of result col
205b0 75 6d 6e 73 2e 20 54 68 69 73 20 69 73 20 61 63  umns. This is ac
205c0 74 75 61 6c 6c 79 20 61 20 72 65 71 75 69 72 65  tually a require
205d0 6d 65 6e 74 20 66 6f 72 20 61 6e 79 20 63 6f 6d  ment for any com
205e0 70 6f 75 6e 64 0a 2a 2a 20 20 20 20 20 20 20 20  pound.**        
205f0 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
20600 2c 20 62 75 74 20 61 6c 6c 20 74 68 65 20 63 6f  , but all the co
20610 64 65 20 68 65 72 65 20 64 6f 65 73 20 69 73 20  de here does is 
20620 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 6e  make sure that n
20630 6f 0a 2a 2a 20 20 20 20 20 20 20 20 73 75 63 68  o.**        such
20640 20 28 69 6c 6c 65 67 61 6c 29 20 73 75 62 2d 71   (illegal) sub-q
20650 75 65 72 79 20 69 73 20 66 6c 61 74 74 65 6e 65  uery is flattene
20660 64 2e 20 54 68 65 20 63 61 6c 6c 65 72 20 77 69  d. The caller wi
20670 6c 6c 20 64 65 74 65 63 74 20 74 68 65 0a 2a 2a  ll detect the.**
20680 20 20 20 20 20 20 20 20 73 79 6e 74 61 78 20 65          syntax e
20690 72 72 6f 72 20 61 6e 64 20 72 65 74 75 72 6e 20  rror and return 
206a0 61 20 64 65 74 61 69 6c 65 64 20 6d 65 73 73 61  a detailed messa
206b0 67 65 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 38 29 20  ge..**.**  (18) 
206c0 20 49 66 20 74 68 65 20 73 75 62 2d 71 75 65 72   If the sub-quer
206d0 79 20 69 73 20 61 20 63 6f 6d 70 6f 75 6e 64 20  y is a compound 
206e0 73 65 6c 65 63 74 2c 20 74 68 65 6e 20 61 6c 6c  select, then all
206f0 20 74 65 72 6d 73 20 6f 66 20 74 68 65 0a 2a 2a   terms of the.**
20700 20 20 20 20 20 20 20 20 4f 52 44 45 52 20 42 59          ORDER BY
20710 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 70   clause of the p
20720 61 72 65 6e 74 20 6d 75 73 74 20 62 65 20 73 69  arent must be si
20730 6d 70 6c 65 20 72 65 66 65 72 65 6e 63 65 73 20  mple references 
20740 74 6f 20 0a 2a 2a 20 20 20 20 20 20 20 20 63 6f  to .**        co
20750 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20 73 75 62  lumns of the sub
20760 2d 71 75 65 72 79 2e 0a 2a 2a 0a 2a 2a 20 20 28  -query..**.**  (
20770 31 39 29 20 20 49 66 20 74 68 65 20 73 75 62 71  19)  If the subq
20780 75 65 72 79 20 75 73 65 73 20 4c 49 4d 49 54 20  uery uses LIMIT 
20790 74 68 65 6e 20 74 68 65 20 6f 75 74 65 72 20 71  then the outer q
207a0 75 65 72 79 20 6d 61 79 20 6e 6f 74 0a 2a 2a 20  uery may not.** 
207b0 20 20 20 20 20 20 20 68 61 76 65 20 61 20 57 48         have a WH
207c0 45 52 45 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a  ERE clause..**.*
207d0 2a 20 20 28 32 30 29 20 20 49 66 20 74 68 65 20  *  (20)  If the 
207e0 73 75 62 2d 71 75 65 72 79 20 69 73 20 61 20 63  sub-query is a c
207f0 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 2c 20  ompound select, 
20800 74 68 65 6e 20 69 74 20 6d 75 73 74 20 6e 6f 74  then it must not
20810 20 75 73 65 0a 2a 2a 20 20 20 20 20 20 20 20 61   use.**        a
20820 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  n ORDER BY claus
20830 65 2e 20 20 54 69 63 6b 65 74 20 23 33 37 37 33  e.  Ticket #3773
20840 2e 20 20 57 65 20 63 6f 75 6c 64 20 72 65 6c 61  .  We could rela
20850 78 20 74 68 69 73 20 63 6f 6e 73 74 72 61 69 6e  x this constrain
20860 74 0a 2a 2a 20 20 20 20 20 20 20 20 73 6f 6d 65  t.**        some
20870 77 68 61 74 20 62 79 20 73 61 79 69 6e 67 20 74  what by saying t
20880 68 61 74 20 74 68 65 20 74 65 72 6d 73 20 6f 66  hat the terms of
20890 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   the ORDER BY cl
208a0 61 75 73 65 20 6d 75 73 74 0a 2a 2a 20 20 20 20  ause must.**    
208b0 20 20 20 20 61 70 70 65 61 72 20 61 73 20 75 6e      appear as un
208c0 6d 6f 64 69 66 69 65 64 20 72 65 73 75 6c 74 20  modified result 
208d0 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 6f  columns in the o
208e0 75 74 65 72 20 71 75 65 72 79 2e 20 20 42 75 74  uter query.  But
208f0 20 77 65 0a 2a 2a 20 20 20 20 20 20 20 20 68 61   we.**        ha
20900 76 65 20 6f 74 68 65 72 20 6f 70 74 69 6d 69 7a  ve other optimiz
20910 61 74 69 6f 6e 73 20 69 6e 20 6d 69 6e 64 20 74  ations in mind t
20920 6f 20 64 65 61 6c 20 77 69 74 68 20 74 68 61 74  o deal with that
20930 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 20 28 32   case..**.**  (2
20940 31 29 20 20 49 66 20 74 68 65 20 73 75 62 71 75  1)  If the subqu
20950 65 72 79 20 75 73 65 73 20 4c 49 4d 49 54 20 74  ery uses LIMIT t
20960 68 65 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75  hen the outer qu
20970 65 72 79 20 6d 61 79 20 6e 6f 74 20 62 65 0a 2a  ery may not be.*
20980 2a 20 20 20 20 20 20 20 20 44 49 53 54 49 4e 43  *        DISTINC
20990 54 2e 20 20 28 53 65 65 20 74 69 63 6b 65 74 20  T.  (See ticket 
209a0 5b 37 35 32 65 31 36 34 36 66 63 5d 29 2e 0a 2a  [752e1646fc])..*
209b0 2a 0a 2a 2a 20 20 28 32 32 29 20 20 54 68 65 20  *.**  (22)  The 
209c0 73 75 62 71 75 65 72 79 20 6d 61 79 20 6e 6f 74  subquery may not
209d0 20 62 65 20 61 20 72 65 63 75 72 73 69 76 65 20   be a recursive 
209e0 43 54 45 2e 0a 2a 2a 0a 2a 2a 20 20 28 2a 2a 29  CTE..**.**  (**)
209f0 20 20 53 75 62 73 75 6d 65 64 20 69 6e 74 6f 20    Subsumed into 
20a00 72 65 73 74 72 69 63 74 69 6f 6e 20 28 31 37 64  restriction (17d
20a10 33 29 2e 20 20 57 61 73 3a 20 49 66 20 74 68 65  3).  Was: If the
20a20 20 6f 75 74 65 72 20 71 75 65 72 79 20 69 73 0a   outer query is.
20a30 2a 2a 20 20 20 20 20 20 20 20 61 20 72 65 63 75  **        a recu
20a40 72 73 69 76 65 20 43 54 45 2c 20 74 68 65 6e 20  rsive CTE, then 
20a50 74 68 65 20 73 75 62 2d 71 75 65 72 79 20 6d 61  the sub-query ma
20a60 79 20 6e 6f 74 20 62 65 20 61 20 63 6f 6d 70 6f  y not be a compo
20a70 75 6e 64 20 71 75 65 72 79 2e 0a 2a 2a 20 20 20  und query..**   
20a80 20 20 20 20 20 54 68 69 73 20 72 65 73 74 72 69       This restri
20a90 63 74 69 6f 6e 20 69 73 20 62 65 63 61 75 73 65  ction is because
20aa0 20 74 72 61 6e 73 66 6f 72 6d 69 6e 67 20 74 68   transforming th
20ab0 65 0a 2a 2a 20 20 20 20 20 20 20 20 70 61 72 65  e.**        pare
20ac0 6e 74 20 74 6f 20 61 20 63 6f 6d 70 6f 75 6e 64  nt to a compound
20ad0 20 71 75 65 72 79 20 63 6f 6e 66 75 73 65 73 20   query confuses 
20ae0 74 68 65 20 63 6f 64 65 20 74 68 61 74 20 68 61  the code that ha
20af0 6e 64 6c 65 73 0a 2a 2a 20 20 20 20 20 20 20 20  ndles.**        
20b00 72 65 63 75 72 73 69 76 65 20 71 75 65 72 69 65  recursive querie
20b10 73 20 69 6e 20 6d 75 6c 74 69 53 65 6c 65 63 74  s in multiSelect
20b20 28 29 2e 0a 2a 2a 0a 2a 2a 20 20 28 2a 2a 29 20  ()..**.**  (**) 
20b30 20 57 65 20 6e 6f 20 6c 6f 6e 67 65 72 20 61 74   We no longer at
20b40 74 65 6d 70 74 20 74 6f 20 66 6c 61 74 74 65 6e  tempt to flatten
20b50 20 61 67 67 72 65 67 61 74 65 20 73 75 62 71 75   aggregate subqu
20b60 65 72 69 65 73 2e 20 20 57 61 73 3a 0a 2a 2a 20  eries.  Was:.** 
20b70 20 20 20 20 20 20 20 54 68 65 20 73 75 62 71 75         The subqu
20b80 65 72 79 20 6d 61 79 20 6e 6f 74 20 62 65 20 61  ery may not be a
20b90 6e 20 61 67 67 72 65 67 61 74 65 20 74 68 61 74  n aggregate that
20ba0 20 75 73 65 73 20 74 68 65 20 62 75 69 6c 74 2d   uses the built-
20bb0 69 6e 20 6d 69 6e 28 29 20 6f 72 20 0a 2a 2a 20  in min() or .** 
20bc0 20 20 20 20 20 20 20 6f 72 20 6d 61 78 28 29 20         or max() 
20bd0 66 75 6e 63 74 69 6f 6e 73 2e 20 20 28 57 69 74  functions.  (Wit
20be0 68 6f 75 74 20 74 68 69 73 20 72 65 73 74 72 69  hout this restri
20bf0 63 74 69 6f 6e 2c 20 61 20 71 75 65 72 79 20 6c  ction, a query l
20c00 69 6b 65 3a 0a 2a 2a 20 20 20 20 20 20 20 20 22  ike:.**        "
20c10 53 45 4c 45 43 54 20 78 20 46 52 4f 4d 20 28 53  SELECT x FROM (S
20c20 45 4c 45 43 54 20 6d 61 78 28 79 29 2c 20 78 20  ELECT max(y), x 
20c30 46 52 4f 4d 20 74 31 29 22 20 77 6f 75 6c 64 20  FROM t1)" would 
20c40 6e 6f 74 20 6e 65 63 65 73 73 61 72 69 6c 79 0a  not necessarily.
20c50 2a 2a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  **        return
20c60 20 74 68 65 20 76 61 6c 75 65 20 58 20 66 6f 72   the value X for
20c70 20 77 68 69 63 68 20 59 20 77 61 73 20 6d 61 78   which Y was max
20c80 69 6d 61 6c 2e 29 0a 2a 2a 0a 2a 2a 20 20 28 32  imal.).**.**  (2
20c90 35 29 20 20 49 66 20 65 69 74 68 65 72 20 74 68  5)  If either th
20ca0 65 20 73 75 62 71 75 65 72 79 20 6f 72 20 74 68  e subquery or th
20cb0 65 20 70 61 72 65 6e 74 20 71 75 65 72 79 20 63  e parent query c
20cc0 6f 6e 74 61 69 6e 73 20 61 20 77 69 6e 64 6f 77  ontains a window
20cd0 0a 2a 2a 20 20 20 20 20 20 20 20 66 75 6e 63 74  .**        funct
20ce0 69 6f 6e 20 69 6e 20 74 68 65 20 73 65 6c 65 63  ion in the selec
20cf0 74 20 6c 69 73 74 20 6f 72 20 4f 52 44 45 52 20  t list or ORDER 
20d00 42 59 20 63 6c 61 75 73 65 2c 20 66 6c 61 74 74  BY clause, flatt
20d10 65 6e 69 6e 67 0a 2a 2a 20 20 20 20 20 20 20 20  ening.**        
20d20 69 73 20 6e 6f 74 20 61 74 74 65 6d 70 74 65 64  is not attempted
20d30 2e 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68  ..**.**.** In th
20d40 69 73 20 72 6f 75 74 69 6e 65 2c 20 74 68 65 20  is routine, the 
20d50 22 70 22 20 70 61 72 61 6d 65 74 65 72 20 69 73  "p" parameter is
20d60 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
20d70 65 20 6f 75 74 65 72 20 71 75 65 72 79 2e 0a 2a  e outer query..*
20d80 2a 20 54 68 65 20 73 75 62 71 75 65 72 79 20 69  * The subquery i
20d90 73 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 69 46 72  s p->pSrc->a[iFr
20da0 6f 6d 5d 2e 20 20 69 73 41 67 67 20 69 73 20 74  om].  isAgg is t
20db0 72 75 65 20 69 66 20 74 68 65 20 6f 75 74 65 72  rue if the outer
20dc0 20 71 75 65 72 79 0a 2a 2a 20 75 73 65 73 20 61   query.** uses a
20dd0 67 67 72 65 67 61 74 65 73 2e 0a 2a 2a 0a 2a 2a  ggregates..**.**
20de0 20 49 66 20 66 6c 61 74 74 65 6e 69 6e 67 20 69   If flattening i
20df0 73 20 6e 6f 74 20 61 74 74 65 6d 70 74 65 64 2c  s not attempted,
20e00 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
20e10 20 61 20 6e 6f 2d 6f 70 20 61 6e 64 20 72 65 74   a no-op and ret
20e20 75 72 6e 73 20 30 2e 0a 2a 2a 20 49 66 20 66 6c  urns 0..** If fl
20e30 61 74 74 65 6e 69 6e 67 20 69 73 20 61 74 74 65  attening is atte
20e40 6d 70 74 65 64 20 74 68 69 73 20 72 6f 75 74 69  mpted this routi
20e50 6e 65 20 72 65 74 75 72 6e 73 20 31 2e 0a 2a 2a  ne returns 1..**
20e60 0a 2a 2a 20 41 6c 6c 20 6f 66 20 74 68 65 20 65  .** All of the e
20e70 78 70 72 65 73 73 69 6f 6e 20 61 6e 61 6c 79 73  xpression analys
20e80 69 73 20 6d 75 73 74 20 6f 63 63 75 72 20 6f 6e  is must occur on
20e90 20 62 6f 74 68 20 74 68 65 20 6f 75 74 65 72 20   both the outer 
20ea0 71 75 65 72 79 20 61 6e 64 0a 2a 2a 20 74 68 65  query and.** the
20eb0 20 73 75 62 71 75 65 72 79 20 62 65 66 6f 72 65   subquery before
20ec0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 75   this routine ru
20ed0 6e 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ns..*/.static in
20ee0 74 20 66 6c 61 74 74 65 6e 53 75 62 71 75 65 72  t flattenSubquer
20ef0 79 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  y(.  Parse *pPar
20f00 73 65 2c 20 20 20 20 20 20 20 2f 2a 20 50 61 72  se,       /* Par
20f10 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
20f20 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20    Select *p,    
20f30 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61         /* The pa
20f40 72 65 6e 74 20 6f 72 20 6f 75 74 65 72 20 53 45  rent or outer SE
20f50 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 2a  LECT statement *
20f60 2f 0a 20 20 69 6e 74 20 69 46 72 6f 6d 2c 20 20  /.  int iFrom,  
20f70 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
20f80 78 20 69 6e 20 70 2d 3e 70 53 72 63 2d 3e 61 5b  x in p->pSrc->a[
20f90 5d 20 6f 66 20 74 68 65 20 69 6e 6e 65 72 20 73  ] of the inner s
20fa0 75 62 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74  ubquery */.  int
20fb0 20 69 73 41 67 67 20 20 20 20 20 20 20 20 20 20   isAgg          
20fc0 20 20 2f 2a 20 54 72 75 65 20 69 66 20 6f 75 74    /* True if out
20fd0 65 72 20 53 45 4c 45 43 54 20 75 73 65 73 20 61  er SELECT uses a
20fe0 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f  ggregate functio
20ff0 6e 73 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74  ns */.){.  const
21000 20 63 68 61 72 20 2a 7a 53 61 76 65 64 41 75 74   char *zSavedAut
21010 68 43 6f 6e 74 65 78 74 20 3d 20 70 50 61 72 73  hContext = pPars
21020 65 2d 3e 7a 41 75 74 68 43 6f 6e 74 65 78 74 3b  e->zAuthContext;
21030 0a 20 20 53 65 6c 65 63 74 20 2a 70 50 61 72 65  .  Select *pPare
21040 6e 74 3b 20 20 20 20 2f 2a 20 43 75 72 72 65 6e  nt;    /* Curren
21050 74 20 55 4e 49 4f 4e 20 41 4c 4c 20 74 65 72 6d  t UNION ALL term
21060 20 6f 66 20 74 68 65 20 6f 74 68 65 72 20 71 75   of the other qu
21070 65 72 79 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20  ery */.  Select 
21080 2a 70 53 75 62 3b 20 20 20 20 20 20 20 2f 2a 20  *pSub;       /* 
21090 54 68 65 20 69 6e 6e 65 72 20 71 75 65 72 79 20  The inner query 
210a0 6f 72 20 22 73 75 62 71 75 65 72 79 22 20 2a 2f  or "subquery" */
210b0 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 75 62 31  .  Select *pSub1
210c0 3b 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65  ;      /* Pointe
210d0 72 20 74 6f 20 74 68 65 20 72 69 67 68 74 6d 6f  r to the rightmo
210e0 73 74 20 73 65 6c 65 63 74 20 69 6e 20 73 75 62  st select in sub
210f0 2d 71 75 65 72 79 20 2a 2f 0a 20 20 53 72 63 4c  -query */.  SrcL
21100 69 73 74 20 2a 70 53 72 63 3b 20 20 20 20 20 20  ist *pSrc;      
21110 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c 61 75  /* The FROM clau
21120 73 65 20 6f 66 20 74 68 65 20 6f 75 74 65 72 20  se of the outer 
21130 71 75 65 72 79 20 2a 2f 0a 20 20 53 72 63 4c 69  query */.  SrcLi
21140 73 74 20 2a 70 53 75 62 53 72 63 3b 20 20 20 2f  st *pSubSrc;   /
21150 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  * The FROM claus
21160 65 20 6f 66 20 74 68 65 20 73 75 62 71 75 65 72  e of the subquer
21170 79 20 2a 2f 0a 20 20 69 6e 74 20 69 50 61 72 65  y */.  int iPare
21180 6e 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 56 44  nt;        /* VD
21190 42 45 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72  BE cursor number
211a0 20 6f 66 20 74 68 65 20 70 53 75 62 20 72 65 73   of the pSub res
211b0 75 6c 74 20 73 65 74 20 74 65 6d 70 20 74 61 62  ult set temp tab
211c0 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 4e 65 77  le */.  int iNew
211d0 50 61 72 65 6e 74 20 3d 20 2d 31 3b 2f 2a 20 52  Parent = -1;/* R
211e0 65 70 6c 61 63 65 6d 65 6e 74 20 74 61 62 6c 65  eplacement table
211f0 20 66 6f 72 20 69 50 61 72 65 6e 74 20 2a 2f 0a   for iParent */.
21200 20 20 69 6e 74 20 69 73 4c 65 66 74 4a 6f 69 6e    int isLeftJoin
21210 20 3d 20 30 3b 20 2f 2a 20 54 72 75 65 20 69 66   = 0; /* True if
21220 20 70 53 75 62 20 69 73 20 74 68 65 20 72 69 67   pSub is the rig
21230 68 74 20 73 69 64 65 20 6f 66 20 61 20 4c 45 46  ht side of a LEF
21240 54 20 4a 4f 49 4e 20 2a 2f 20 20 20 20 0a 20 20  T JOIN */    .  
21250 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20  int i;          
21260 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
21270 74 65 72 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70  ter */.  Expr *p
21280 57 68 65 72 65 3b 20 20 20 20 20 20 20 20 20 20  Where;          
21290 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
212a0 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f   WHERE clause */
212b0 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73  .  struct SrcLis
212c0 74 5f 69 74 65 6d 20 2a 70 53 75 62 69 74 65 6d  t_item *pSubitem
212d0 3b 20 20 20 2f 2a 20 54 68 65 20 73 75 62 71 75  ;   /* The subqu
212e0 65 72 79 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ery */.  sqlite3
212f0 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
21300 62 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74  b;..  /* Check t
21310 6f 20 73 65 65 20 69 66 20 66 6c 61 74 74 65 6e  o see if flatten
21320 69 6e 67 20 69 73 20 70 65 72 6d 69 74 74 65 64  ing is permitted
21330 2e 20 20 52 65 74 75 72 6e 20 30 20 69 66 20 6e  .  Return 0 if n
21340 6f 74 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  ot..  */.  asser
21350 74 28 20 70 21 3d 30 20 29 3b 0a 20 20 61 73 73  t( p!=0 );.  ass
21360 65 72 74 28 20 70 2d 3e 70 50 72 69 6f 72 3d 3d  ert( p->pPrior==
21370 30 20 29 3b 0a 20 20 69 66 28 20 4f 70 74 69 6d  0 );.  if( Optim
21380 69 7a 61 74 69 6f 6e 44 69 73 61 62 6c 65 64 28  izationDisabled(
21390 64 62 2c 20 53 51 4c 49 54 45 5f 51 75 65 72 79  db, SQLITE_Query
213a0 46 6c 61 74 74 65 6e 65 72 29 20 29 20 72 65 74  Flattener) ) ret
213b0 75 72 6e 20 30 3b 0a 20 20 70 53 72 63 20 3d 20  urn 0;.  pSrc = 
213c0 70 2d 3e 70 53 72 63 3b 0a 20 20 61 73 73 65 72  p->pSrc;.  asser
213d0 74 28 20 70 53 72 63 20 26 26 20 69 46 72 6f 6d  t( pSrc && iFrom
213e0 3e 3d 30 20 26 26 20 69 46 72 6f 6d 3c 70 53 72  >=0 && iFrom<pSr
213f0 63 2d 3e 6e 53 72 63 20 29 3b 0a 20 20 70 53 75  c->nSrc );.  pSu
21400 62 69 74 65 6d 20 3d 20 26 70 53 72 63 2d 3e 61  bitem = &pSrc->a
21410 5b 69 46 72 6f 6d 5d 3b 0a 20 20 69 50 61 72 65  [iFrom];.  iPare
21420 6e 74 20 3d 20 70 53 75 62 69 74 65 6d 2d 3e 69  nt = pSubitem->i
21430 43 75 72 73 6f 72 3b 0a 20 20 70 53 75 62 20 3d  Cursor;.  pSub =
21440 20 70 53 75 62 69 74 65 6d 2d 3e 70 53 65 6c 65   pSubitem->pSele
21450 63 74 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53  ct;.  assert( pS
21460 75 62 21 3d 30 20 29 3b 0a 0a 23 69 66 6e 64 65  ub!=0 );..#ifnde
21470 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 49  f SQLITE_OMIT_WI
21480 4e 44 4f 57 46 55 4e 43 0a 20 20 69 66 28 20 70  NDOWFUNC.  if( p
21490 2d 3e 70 57 69 6e 20 7c 7c 20 70 53 75 62 2d 3e  ->pWin || pSub->
214a0 70 57 69 6e 20 29 20 72 65 74 75 72 6e 20 30 3b  pWin ) return 0;
214b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
214c0 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e    /* Restriction
214d0 20 28 32 35 29 20 2a 2f 0a 23 65 6e 64 69 66 0a   (25) */.#endif.
214e0 0a 20 20 70 53 75 62 53 72 63 20 3d 20 70 53 75  .  pSubSrc = pSu
214f0 62 2d 3e 70 53 72 63 3b 0a 20 20 61 73 73 65 72  b->pSrc;.  asser
21500 74 28 20 70 53 75 62 53 72 63 20 29 3b 0a 20 20  t( pSubSrc );.  
21510 2f 2a 20 50 72 69 6f 72 20 74 6f 20 76 65 72 73  /* Prior to vers
21520 69 6f 6e 20 33 2e 31 2e 32 2c 20 77 68 65 6e 20  ion 3.1.2, when 
21530 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46 53 45 54  LIMIT and OFFSET
21540 20 68 61 64 20 74 6f 20 62 65 20 73 69 6d 70 6c   had to be simpl
21550 65 20 63 6f 6e 73 74 61 6e 74 73 2c 0a 20 20 2a  e constants,.  *
21560 2a 20 6e 6f 74 20 61 72 62 69 74 72 61 72 79 20  * not arbitrary 
21570 65 78 70 72 65 73 73 69 6f 6e 73 2c 20 77 65 20  expressions, we 
21580 61 6c 6c 6f 77 65 64 20 73 6f 6d 65 20 63 6f 6d  allowed some com
21590 62 69 6e 69 6e 67 20 6f 66 20 4c 49 4d 49 54 20  bining of LIMIT 
215a0 61 6e 64 20 4f 46 46 53 45 54 0a 20 20 2a 2a 20  and OFFSET.  ** 
215b0 62 65 63 61 75 73 65 20 74 68 65 79 20 63 6f 75  because they cou
215c0 6c 64 20 62 65 20 63 6f 6d 70 75 74 65 64 20 61  ld be computed a
215d0 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 2e 20  t compile-time. 
215e0 20 42 75 74 20 77 68 65 6e 20 4c 49 4d 49 54 20   But when LIMIT 
215f0 61 6e 64 20 4f 46 46 53 45 54 0a 20 20 2a 2a 20  and OFFSET.  ** 
21600 62 65 63 61 6d 65 20 61 72 62 69 74 72 61 72 79  became arbitrary
21610 20 65 78 70 72 65 73 73 69 6f 6e 73 2c 20 77 65   expressions, we
21620 20 77 65 72 65 20 66 6f 72 63 65 64 20 74 6f 20   were forced to 
21630 61 64 64 20 72 65 73 74 72 69 63 74 69 6f 6e 73  add restrictions
21640 20 28 31 33 29 0a 20 20 2a 2a 20 61 6e 64 20 28   (13).  ** and (
21650 31 34 29 2e 20 2a 2f 0a 20 20 69 66 28 20 70 53  14). */.  if( pS
21660 75 62 2d 3e 70 4c 69 6d 69 74 20 26 26 20 70 2d  ub->pLimit && p-
21670 3e 70 4c 69 6d 69 74 20 29 20 72 65 74 75 72 6e  >pLimit ) return
21680 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
21690 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20   /* Restriction 
216a0 28 31 33 29 20 2a 2f 0a 20 20 69 66 28 20 70 53  (13) */.  if( pS
216b0 75 62 2d 3e 70 4c 69 6d 69 74 20 26 26 20 70 53  ub->pLimit && pS
216c0 75 62 2d 3e 70 4c 69 6d 69 74 2d 3e 70 52 69 67  ub->pLimit->pRig
216d0 68 74 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20  ht ) return 0;  
216e0 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20   /* Restriction 
216f0 28 31 34 29 20 2a 2f 0a 20 20 69 66 28 20 28 70  (14) */.  if( (p
21700 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f  ->selFlags & SF_
21710 43 6f 6d 70 6f 75 6e 64 29 21 3d 30 20 26 26 20  Compound)!=0 && 
21720 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20 29 7b 0a  pSub->pLimit ){.
21730 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20 20      return 0;   
21740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21760 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74           /* Rest
21770 72 69 63 74 69 6f 6e 20 28 31 35 29 20 2a 2f 0a  riction (15) */.
21780 20 20 7d 0a 20 20 69 66 28 20 70 53 75 62 53 72    }.  if( pSubSr
21790 63 2d 3e 6e 53 72 63 3d 3d 30 20 29 20 72 65 74  c->nSrc==0 ) ret
217a0 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20  urn 0;          
217b0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
217c0 52 65 73 74 72 69 63 74 69 6f 6e 20 28 37 29 20  Restriction (7) 
217d0 20 2a 2f 0a 20 20 69 66 28 20 70 53 75 62 2d 3e   */.  if( pSub->
217e0 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 44 69  selFlags & SF_Di
217f0 73 74 69 6e 63 74 20 29 20 72 65 74 75 72 6e 20  stinct ) return 
21800 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  0;           /* 
21810 52 65 73 74 72 69 63 74 69 6f 6e 20 28 34 29 20  Restriction (4) 
21820 20 2a 2f 0a 20 20 69 66 28 20 70 53 75 62 2d 3e   */.  if( pSub->
21830 70 4c 69 6d 69 74 20 26 26 20 28 70 53 72 63 2d  pLimit && (pSrc-
21840 3e 6e 53 72 63 3e 31 20 7c 7c 20 69 73 41 67 67  >nSrc>1 || isAgg
21850 29 20 29 7b 0a 20 20 20 20 20 72 65 74 75 72 6e  ) ){.     return
21860 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 52   0;         /* R
21870 65 73 74 72 69 63 74 69 6f 6e 73 20 28 38 29 28  estrictions (8)(
21880 39 29 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20  9) */.  }.  if( 
21890 70 2d 3e 70 4f 72 64 65 72 42 79 20 26 26 20 70  p->pOrderBy && p
218a0 53 75 62 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b  Sub->pOrderBy ){
218b0 0a 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20  .     return 0; 
218c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
218d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
218e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73            /* Res
218f0 74 72 69 63 74 69 6f 6e 20 28 31 31 29 20 2a 2f  triction (11) */
21900 0a 20 20 7d 0a 20 20 69 66 28 20 69 73 41 67 67  .  }.  if( isAgg
21910 20 26 26 20 70 53 75 62 2d 3e 70 4f 72 64 65 72   && pSub->pOrder
21920 42 79 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20  By ) return 0;  
21930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
21940 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28 31 36   Restriction (16
21950 29 20 2a 2f 0a 20 20 69 66 28 20 70 53 75 62 2d  ) */.  if( pSub-
21960 3e 70 4c 69 6d 69 74 20 26 26 20 70 2d 3e 70 57  >pLimit && p->pW
21970 68 65 72 65 20 29 20 72 65 74 75 72 6e 20 30 3b  here ) return 0;
21980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
21990 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28 31 39   Restriction (19
219a0 29 20 2a 2f 0a 20 20 69 66 28 20 70 53 75 62 2d  ) */.  if( pSub-
219b0 3e 70 4c 69 6d 69 74 20 26 26 20 28 70 2d 3e 73  >pLimit && (p->s
219c0 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 44 69 73  elFlags & SF_Dis
219d0 74 69 6e 63 74 29 21 3d 30 20 29 7b 0a 20 20 20  tinct)!=0 ){.   
219e0 20 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20    return 0;     
219f0 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69      /* Restricti
21a00 6f 6e 20 28 32 31 29 20 2a 2f 0a 20 20 7d 0a 20  on (21) */.  }. 
21a10 20 69 66 28 20 70 53 75 62 2d 3e 73 65 6c 46 6c   if( pSub->selFl
21a20 61 67 73 20 26 20 28 53 46 5f 52 65 63 75 72 73  ags & (SF_Recurs
21a30 69 76 65 29 20 29 7b 0a 20 20 20 20 72 65 74 75  ive) ){.    retu
21a40 72 6e 20 30 3b 20 2f 2a 20 52 65 73 74 72 69 63  rn 0; /* Restric
21a50 74 69 6f 6e 73 20 28 32 32 29 20 2a 2f 0a 20 20  tions (22) */.  
21a60 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 49 66 20  }..  /*.  ** If 
21a70 74 68 65 20 73 75 62 71 75 65 72 79 20 69 73 20  the subquery is 
21a80 74 68 65 20 72 69 67 68 74 20 6f 70 65 72 61 6e  the right operan
21a90 64 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e  d of a LEFT JOIN
21aa0 2c 20 74 68 65 6e 20 74 68 65 0a 20 20 2a 2a 20  , then the.  ** 
21ab0 73 75 62 71 75 65 72 79 20 6d 61 79 20 6e 6f 74  subquery may not
21ac0 20 62 65 20 61 20 6a 6f 69 6e 20 69 74 73 65 6c   be a join itsel
21ad0 66 20 28 33 61 29 2e 20 45 78 61 6d 70 6c 65 20  f (3a). Example 
21ae0 6f 66 20 77 68 79 20 74 68 69 73 20 69 73 20 6e  of why this is n
21af0 6f 74 0a 20 20 2a 2a 20 61 6c 6c 6f 77 65 64 3a  ot.  ** allowed:
21b00 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20  .  **.  **      
21b10 20 20 20 74 31 20 4c 45 46 54 20 4f 55 54 45 52     t1 LEFT OUTER
21b20 20 4a 4f 49 4e 20 28 74 32 20 4a 4f 49 4e 20 74   JOIN (t2 JOIN t
21b30 33 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20  3).  **.  ** If 
21b40 77 65 20 66 6c 61 74 74 65 6e 20 74 68 65 20 61  we flatten the a
21b50 62 6f 76 65 2c 20 77 65 20 77 6f 75 6c 64 20 67  bove, we would g
21b60 65 74 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20  et.  **.  **    
21b70 20 20 20 20 20 28 74 31 20 4c 45 46 54 20 4f 55       (t1 LEFT OU
21b80 54 45 52 20 4a 4f 49 4e 20 74 32 29 20 4a 4f 49  TER JOIN t2) JOI
21b90 4e 20 74 33 0a 20 20 2a 2a 0a 20 20 2a 2a 20 77  N t3.  **.  ** w
21ba0 68 69 63 68 20 69 73 20 6e 6f 74 20 61 74 20 61  hich is not at a
21bb0 6c 6c 20 74 68 65 20 73 61 6d 65 20 74 68 69 6e  ll the same thin
21bc0 67 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20  g..  **.  ** If 
21bd0 74 68 65 20 73 75 62 71 75 65 72 79 20 69 73 20  the subquery is 
21be0 74 68 65 20 72 69 67 68 74 20 6f 70 65 72 61 6e  the right operan
21bf0 64 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e  d of a LEFT JOIN
21c00 2c 20 74 68 65 6e 20 74 68 65 20 6f 75 74 65 72  , then the outer
21c10 0a 20 20 2a 2a 20 71 75 65 72 79 20 63 61 6e 6e  .  ** query cann
21c20 6f 74 20 62 65 20 61 6e 20 61 67 67 72 65 67 61  ot be an aggrega
21c30 74 65 2e 20 28 33 63 29 20 20 54 68 69 73 20 69  te. (3c)  This i
21c40 73 20 61 6e 20 61 72 74 69 66 61 63 74 20 6f 66  s an artifact of
21c50 20 74 68 65 20 77 61 79 0a 20 20 2a 2a 20 61 67   the way.  ** ag
21c60 67 72 65 67 61 74 65 73 20 61 72 65 20 70 72 6f  gregates are pro
21c70 63 65 73 73 65 64 20 2d 20 74 68 65 72 65 20 69  cessed - there i
21c80 73 20 6e 6f 20 6d 65 63 68 61 6e 69 73 6d 20 74  s no mechanism t
21c90 6f 20 64 65 74 65 72 6d 69 6e 65 20 69 66 0a 20  o determine if. 
21ca0 20 2a 2a 20 74 68 65 20 4c 45 46 54 20 4a 4f 49   ** the LEFT JOI
21cb0 4e 20 74 61 62 6c 65 20 73 68 6f 75 6c 64 20 62  N table should b
21cc0 65 20 61 6c 6c 2d 4e 55 4c 4c 2e 0a 20 20 2a 2a  e all-NULL..  **
21cd0 0a 20 20 2a 2a 20 53 65 65 20 61 6c 73 6f 20 74  .  ** See also t
21ce0 69 63 6b 65 74 73 20 23 33 30 36 2c 20 23 33 35  ickets #306, #35
21cf0 30 2c 20 61 6e 64 20 23 33 33 30 30 2e 0a 20 20  0, and #3300..  
21d00 2a 2f 0a 20 20 69 66 28 20 28 70 53 75 62 69 74  */.  if( (pSubit
21d10 65 6d 2d 3e 66 67 2e 6a 6f 69 6e 74 79 70 65 20  em->fg.jointype 
21d20 26 20 4a 54 5f 4f 55 54 45 52 29 21 3d 30 20 29  & JT_OUTER)!=0 )
21d30 7b 0a 20 20 20 20 69 73 4c 65 66 74 4a 6f 69 6e  {.    isLeftJoin
21d40 20 3d 20 31 3b 0a 20 20 20 20 69 66 28 20 70 53   = 1;.    if( pS
21d50 75 62 53 72 63 2d 3e 6e 53 72 63 3e 31 20 7c 7c  ubSrc->nSrc>1 ||
21d60 20 69 73 41 67 67 20 7c 7c 20 49 73 56 69 72 74   isAgg || IsVirt
21d70 75 61 6c 28 70 53 75 62 53 72 63 2d 3e 61 5b 30  ual(pSubSrc->a[0
21d80 5d 2e 70 54 61 62 29 20 29 7b 0a 20 20 20 20 20  ].pTab) ){.     
21d90 20 2f 2a 20 20 28 33 61 29 20 20 20 20 20 20 20   /*  (3a)       
21da0 20 20 20 20 20 20 28 33 63 29 20 20 20 20 20 28        (3c)     (
21db0 33 62 29 20 2a 2f 0a 20 20 20 20 20 20 72 65 74  3b) */.      ret
21dc0 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d  urn 0;.    }.  }
21dd0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
21de0 58 54 52 41 5f 49 46 4e 55 4c 4c 52 4f 57 0a 20  XTRA_IFNULLROW. 
21df0 20 65 6c 73 65 20 69 66 28 20 69 46 72 6f 6d 3e   else if( iFrom>
21e00 30 20 26 26 20 21 69 73 41 67 67 20 29 7b 0a 20  0 && !isAgg ){. 
21e10 20 20 20 2f 2a 20 53 65 74 74 69 6e 67 20 69 73     /* Setting is
21e20 4c 65 66 74 4a 6f 69 6e 20 74 6f 20 2d 31 20 63  LeftJoin to -1 c
21e30 61 75 73 65 73 20 4f 50 5f 49 66 4e 75 6c 6c 52  auses OP_IfNullR
21e40 6f 77 20 6f 70 63 6f 64 65 73 20 74 6f 20 62 65  ow opcodes to be
21e50 20 67 65 6e 65 72 61 74 65 64 20 66 6f 72 0a 20   generated for. 
21e60 20 20 20 2a 2a 20 65 76 65 72 79 20 72 65 66 65     ** every refe
21e70 72 65 6e 63 65 20 74 6f 20 61 6e 79 20 72 65 73  rence to any res
21e80 75 6c 74 20 63 6f 6c 75 6d 6e 20 66 72 6f 6d 20  ult column from 
21e90 73 75 62 71 75 65 72 79 20 69 6e 20 61 20 6a 6f  subquery in a jo
21ea0 69 6e 2c 20 65 76 65 6e 0a 20 20 20 20 2a 2a 20  in, even.    ** 
21eb0 74 68 6f 75 67 68 20 74 68 65 79 20 61 72 65 20  though they are 
21ec0 6e 6f 74 20 6e 65 63 65 73 73 61 72 79 2e 20 20  not necessary.  
21ed0 54 68 69 73 20 77 69 6c 6c 20 73 74 72 65 73 73  This will stress
21ee0 2d 74 65 73 74 20 74 68 65 20 4f 50 5f 49 66 4e  -test the OP_IfN
21ef0 75 6c 6c 52 6f 77 20 0a 20 20 20 20 2a 2a 20 6f  ullRow .    ** o
21f00 70 63 6f 64 65 2e 20 2a 2f 0a 20 20 20 20 69 73  pcode. */.    is
21f10 4c 65 66 74 4a 6f 69 6e 20 3d 20 2d 31 3b 0a 20  LeftJoin = -1;. 
21f20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20   }.#endif..  /* 
21f30 52 65 73 74 72 69 63 74 69 6f 6e 20 28 31 37 29  Restriction (17)
21f40 3a 20 49 66 20 74 68 65 20 73 75 62 2d 71 75 65  : If the sub-que
21f50 72 79 20 69 73 20 61 20 63 6f 6d 70 6f 75 6e 64  ry is a compound
21f60 20 53 45 4c 45 43 54 2c 20 74 68 65 6e 20 69 74   SELECT, then it
21f70 20 6d 75 73 74 0a 20 20 2a 2a 20 75 73 65 20 6f   must.  ** use o
21f80 6e 6c 79 20 74 68 65 20 55 4e 49 4f 4e 20 41 4c  nly the UNION AL
21f90 4c 20 6f 70 65 72 61 74 6f 72 2e 20 41 6e 64 20  L operator. And 
21fa0 6e 6f 6e 65 20 6f 66 20 74 68 65 20 73 69 6d 70  none of the simp
21fb0 6c 65 20 73 65 6c 65 63 74 20 71 75 65 72 69 65  le select querie
21fc0 73 0a 20 20 2a 2a 20 74 68 61 74 20 6d 61 6b 65  s.  ** that make
21fd0 20 75 70 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64   up the compound
21fe0 20 53 45 4c 45 43 54 20 61 72 65 20 61 6c 6c 6f   SELECT are allo
21ff0 77 65 64 20 74 6f 20 62 65 20 61 67 67 72 65 67  wed to be aggreg
22000 61 74 65 20 6f 72 20 64 69 73 74 69 6e 63 74 0a  ate or distinct.
22010 20 20 2a 2a 20 71 75 65 72 69 65 73 2e 0a 20 20    ** queries..  
22020 2a 2f 0a 20 20 69 66 28 20 70 53 75 62 2d 3e 70  */.  if( pSub->p
22030 50 72 69 6f 72 20 29 7b 0a 20 20 20 20 69 66 28  Prior ){.    if(
22040 20 70 53 75 62 2d 3e 70 4f 72 64 65 72 42 79 20   pSub->pOrderBy 
22050 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
22060 30 3b 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69  0;  /* Restricti
22070 6f 6e 20 28 32 30 29 20 2a 2f 0a 20 20 20 20 7d  on (20) */.    }
22080 0a 20 20 20 20 69 66 28 20 69 73 41 67 67 20 7c  .    if( isAgg |
22090 7c 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26  | (p->selFlags &
220a0 20 53 46 5f 44 69 73 74 69 6e 63 74 29 21 3d 30   SF_Distinct)!=0
220b0 20 7c 7c 20 70 53 72 63 2d 3e 6e 53 72 63 21 3d   || pSrc->nSrc!=
220c0 31 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  1 ){.      retur
220d0 6e 20 30 3b 20 2f 2a 20 28 31 37 64 31 29 2c 20  n 0; /* (17d1), 
220e0 28 31 37 64 32 29 2c 20 6f 72 20 28 31 37 64 33  (17d2), or (17d3
220f0 29 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 66  ) */.    }.    f
22100 6f 72 28 70 53 75 62 31 3d 70 53 75 62 3b 20 70  or(pSub1=pSub; p
22110 53 75 62 31 3b 20 70 53 75 62 31 3d 70 53 75 62  Sub1; pSub1=pSub
22120 31 2d 3e 70 50 72 69 6f 72 29 7b 0a 20 20 20 20  1->pPrior){.    
22130 20 20 74 65 73 74 63 61 73 65 28 20 28 70 53 75    testcase( (pSu
22140 62 31 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 28  b1->selFlags & (
22150 53 46 5f 44 69 73 74 69 6e 63 74 7c 53 46 5f 41  SF_Distinct|SF_A
22160 67 67 72 65 67 61 74 65 29 29 3d 3d 53 46 5f 44  ggregate))==SF_D
22170 69 73 74 69 6e 63 74 20 29 3b 0a 20 20 20 20 20  istinct );.     
22180 20 74 65 73 74 63 61 73 65 28 20 28 70 53 75 62   testcase( (pSub
22190 31 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 28 53  1->selFlags & (S
221a0 46 5f 44 69 73 74 69 6e 63 74 7c 53 46 5f 41 67  F_Distinct|SF_Ag
221b0 67 72 65 67 61 74 65 29 29 3d 3d 53 46 5f 41 67  gregate))==SF_Ag
221c0 67 72 65 67 61 74 65 20 29 3b 0a 20 20 20 20 20  gregate );.     
221d0 20 61 73 73 65 72 74 28 20 70 53 75 62 2d 3e 70   assert( pSub->p
221e0 53 72 63 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  Src!=0 );.      
221f0 61 73 73 65 72 74 28 20 70 53 75 62 2d 3e 70 45  assert( pSub->pE
22200 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 70 53 75  List->nExpr==pSu
22210 62 31 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70  b1->pEList->nExp
22220 72 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 28  r );.      if( (
22230 70 53 75 62 31 2d 3e 73 65 6c 46 6c 61 67 73 20  pSub1->selFlags 
22240 26 20 28 53 46 5f 44 69 73 74 69 6e 63 74 7c 53  & (SF_Distinct|S
22250 46 5f 41 67 67 72 65 67 61 74 65 29 29 21 3d 30  F_Aggregate))!=0
22260 20 20 20 20 2f 2a 20 28 31 37 62 29 20 2a 2f 0a      /* (17b) */.
22270 20 20 20 20 20 20 20 7c 7c 20 28 70 53 75 62 31         || (pSub1
22280 2d 3e 70 50 72 69 6f 72 20 26 26 20 70 53 75 62  ->pPrior && pSub
22290 31 2d 3e 6f 70 21 3d 54 4b 5f 41 4c 4c 29 20 20  1->op!=TK_ALL)  
222a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
222b0 2a 20 28 31 37 61 29 20 2a 2f 0a 20 20 20 20 20  * (17a) */.     
222c0 20 20 7c 7c 20 70 53 75 62 31 2d 3e 70 53 72 63    || pSub1->pSrc
222d0 2d 3e 6e 53 72 63 3c 31 20 20 20 20 20 20 20 20  ->nSrc<1        
222e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
222f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 28 31 37            /* (17
22300 63 29 20 2a 2f 0a 20 20 20 20 20 20 29 7b 0a 20  c) */.      ){. 
22310 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b         return 0;
22320 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 74  .      }.      t
22330 65 73 74 63 61 73 65 28 20 70 53 75 62 31 2d 3e  estcase( pSub1->
22340 70 53 72 63 2d 3e 6e 53 72 63 3e 31 20 29 3b 0a  pSrc->nSrc>1 );.
22350 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 65      }..    /* Re
22360 73 74 72 69 63 74 69 6f 6e 20 28 31 38 29 2e 20  striction (18). 
22370 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 4f  */.    if( p->pO
22380 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20  rderBy ){.      
22390 69 6e 74 20 69 69 3b 0a 20 20 20 20 20 20 66 6f  int ii;.      fo
223a0 72 28 69 69 3d 30 3b 20 69 69 3c 70 2d 3e 70 4f  r(ii=0; ii<p->pO
223b0 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 20 69  rderBy->nExpr; i
223c0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66  i++){.        if
223d0 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 61  ( p->pOrderBy->a
223e0 5b 69 69 5d 2e 75 2e 78 2e 69 4f 72 64 65 72 42  [ii].u.x.iOrderB
223f0 79 43 6f 6c 3d 3d 30 20 29 20 72 65 74 75 72 6e  yCol==0 ) return
22400 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
22410 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 45 78 2d 72  }.  }..  /* Ex-r
22420 65 73 74 72 69 63 74 69 6f 6e 20 28 32 33 29 3a  estriction (23):
22430 0a 20 20 2a 2a 20 54 68 65 20 6f 6e 6c 79 20 77  .  ** The only w
22440 61 79 20 74 68 61 74 20 74 68 65 20 72 65 63 75  ay that the recu
22450 72 73 69 76 65 20 70 61 72 74 20 6f 66 20 61 20  rsive part of a 
22460 43 54 45 20 63 61 6e 20 63 6f 6e 74 61 69 6e 20  CTE can contain 
22470 61 20 63 6f 6d 70 6f 75 6e 64 0a 20 20 2a 2a 20  a compound.  ** 
22480 73 75 62 71 75 65 72 79 20 69 73 20 66 6f 72 20  subquery is for 
22490 74 68 65 20 73 75 62 71 75 65 72 79 20 74 6f 20  the subquery to 
224a0 62 65 20 6f 6e 65 20 74 65 72 6d 20 6f 66 20 61  be one term of a
224b0 20 6a 6f 69 6e 2e 20 20 42 75 74 20 69 66 20 74   join.  But if t
224c0 68 65 0a 20 20 2a 2a 20 73 75 62 71 75 65 72 79  he.  ** subquery
224d0 20 69 73 20 61 20 6a 6f 69 6e 2c 20 74 68 65 6e   is a join, then
224e0 20 74 68 65 20 66 6c 61 74 74 65 6e 69 6e 67 20   the flattening 
224f0 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e  has already been
22500 20 73 74 6f 70 70 65 64 20 62 79 0a 20 20 2a 2a   stopped by.  **
22510 20 72 65 73 74 72 69 63 74 69 6f 6e 20 28 31 37   restriction (17
22520 64 33 29 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  d3).  */.  asser
22530 74 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20  t( (p->selFlags 
22540 26 20 53 46 5f 52 65 63 75 72 73 69 76 65 29 3d  & SF_Recursive)=
22550 3d 30 20 7c 7c 20 70 53 75 62 2d 3e 70 50 72 69  =0 || pSub->pPri
22560 6f 72 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 2a 2a  or==0 );..  /***
22570 2a 2a 20 49 66 20 77 65 20 72 65 61 63 68 20 74  ** If we reach t
22580 68 69 73 20 70 6f 69 6e 74 2c 20 66 6c 61 74 74  his point, flatt
22590 65 6e 69 6e 67 20 69 73 20 70 65 72 6d 69 74 74  ening is permitt
225a0 65 64 2e 20 2a 2a 2a 2a 2a 2f 0a 20 20 53 45 4c  ed. *****/.  SEL
225b0 45 43 54 54 52 41 43 45 28 31 2c 70 50 61 72 73  ECTTRACE(1,pPars
225c0 65 2c 70 2c 28 22 66 6c 61 74 74 65 6e 20 25 75  e,p,("flatten %u
225d0 2e 25 70 20 66 72 6f 6d 20 74 65 72 6d 20 25 64  .%p from term %d
225e0 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
225f0 20 20 20 20 20 20 20 20 70 53 75 62 2d 3e 73 65          pSub->se
22600 6c 49 64 2c 20 70 53 75 62 2c 20 69 46 72 6f 6d  lId, pSub, iFrom
22610 29 29 3b 0a 0a 20 20 2f 2a 20 41 75 74 68 6f 72  ));..  /* Author
22620 69 7a 65 20 74 68 65 20 73 75 62 71 75 65 72 79  ize the subquery
22630 20 2a 2f 0a 20 20 70 50 61 72 73 65 2d 3e 7a 41   */.  pParse->zA
22640 75 74 68 43 6f 6e 74 65 78 74 20 3d 20 70 53 75  uthContext = pSu
22650 62 69 74 65 6d 2d 3e 7a 4e 61 6d 65 3b 0a 20 20  bitem->zName;.  
22660 54 45 53 54 4f 4e 4c 59 28 69 20 3d 29 20 73 71  TESTONLY(i =) sq
22670 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70  lite3AuthCheck(p
22680 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 53 45  Parse, SQLITE_SE
22690 4c 45 43 54 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  LECT, 0, 0, 0);.
226a0 20 20 74 65 73 74 63 61 73 65 28 20 69 3d 3d 53    testcase( i==S
226b0 51 4c 49 54 45 5f 44 45 4e 59 20 29 3b 0a 20 20  QLITE_DENY );.  
226c0 70 50 61 72 73 65 2d 3e 7a 41 75 74 68 43 6f 6e  pParse->zAuthCon
226d0 74 65 78 74 20 3d 20 7a 53 61 76 65 64 41 75 74  text = zSavedAut
226e0 68 43 6f 6e 74 65 78 74 3b 0a 0a 20 20 2f 2a 20  hContext;..  /* 
226f0 49 66 20 74 68 65 20 73 75 62 2d 71 75 65 72 79  If the sub-query
22700 20 69 73 20 61 20 63 6f 6d 70 6f 75 6e 64 20 53   is a compound S
22710 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2c  ELECT statement,
22720 20 74 68 65 6e 20 28 62 79 20 72 65 73 74 72 69   then (by restri
22730 63 74 69 6f 6e 73 0a 20 20 2a 2a 20 31 37 20 61  ctions.  ** 17 a
22740 6e 64 20 31 38 20 61 62 6f 76 65 29 20 69 74 20  nd 18 above) it 
22750 6d 75 73 74 20 62 65 20 61 20 55 4e 49 4f 4e 20  must be a UNION 
22760 41 4c 4c 20 61 6e 64 20 74 68 65 20 70 61 72 65  ALL and the pare
22770 6e 74 20 71 75 65 72 79 20 6d 75 73 74 20 0a 20  nt query must . 
22780 20 2a 2a 20 62 65 20 6f 66 20 74 68 65 20 66 6f   ** be of the fo
22790 72 6d 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  rm:.  **.  **   
227a0 20 20 53 45 4c 45 43 54 20 3c 65 78 70 72 2d 6c    SELECT <expr-l
227b0 69 73 74 3e 20 46 52 4f 4d 20 28 3c 73 75 62 2d  ist> FROM (<sub-
227c0 71 75 65 72 79 3e 29 20 3c 77 68 65 72 65 2d 63  query>) <where-c
227d0 6c 61 75 73 65 3e 20 0a 20 20 2a 2a 0a 20 20 2a  lause> .  **.  *
227e0 2a 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20 61 6e  * followed by an
227f0 79 20 4f 52 44 45 52 20 42 59 2c 20 4c 49 4d 49  y ORDER BY, LIMI
22800 54 20 61 6e 64 2f 6f 72 20 4f 46 46 53 45 54 20  T and/or OFFSET 
22810 63 6c 61 75 73 65 73 2e 20 54 68 69 73 20 62 6c  clauses. This bl
22820 6f 63 6b 0a 20 20 2a 2a 20 63 72 65 61 74 65 73  ock.  ** creates
22830 20 4e 2d 31 20 63 6f 70 69 65 73 20 6f 66 20 74   N-1 copies of t
22840 68 65 20 70 61 72 65 6e 74 20 71 75 65 72 79 20  he parent query 
22850 77 69 74 68 6f 75 74 20 61 6e 79 20 4f 52 44 45  without any ORDE
22860 52 20 42 59 2c 20 4c 49 4d 49 54 20 6f 72 20 0a  R BY, LIMIT or .
22870 20 20 2a 2a 20 4f 46 46 53 45 54 20 63 6c 61 75    ** OFFSET clau
22880 73 65 73 20 61 6e 64 20 6a 6f 69 6e 73 20 74 68  ses and joins th
22890 65 6d 20 74 6f 20 74 68 65 20 6c 65 66 74 2d 68  em to the left-h
228a0 61 6e 64 2d 73 69 64 65 20 6f 66 20 74 68 65 20  and-side of the 
228b0 6f 72 69 67 69 6e 61 6c 0a 20 20 2a 2a 20 75 73  original.  ** us
228c0 69 6e 67 20 55 4e 49 4f 4e 20 41 4c 4c 20 6f 70  ing UNION ALL op
228d0 65 72 61 74 6f 72 73 2e 20 49 6e 20 74 68 69 73  erators. In this
228e0 20 63 61 73 65 20 4e 20 69 73 20 74 68 65 20 6e   case N is the n
228f0 75 6d 62 65 72 20 6f 66 20 73 69 6d 70 6c 65 0a  umber of simple.
22900 20 20 2a 2a 20 73 65 6c 65 63 74 20 73 74 61 74    ** select stat
22910 65 6d 65 6e 74 73 20 69 6e 20 74 68 65 20 63 6f  ements in the co
22920 6d 70 6f 75 6e 64 20 73 75 62 2d 71 75 65 72 79  mpound sub-query
22930 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45 78 61 6d  ..  **.  ** Exam
22940 70 6c 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  ple:.  **.  **  
22950 20 20 20 53 45 4c 45 43 54 20 61 2b 31 20 46 52     SELECT a+1 FR
22960 4f 4d 20 28 0a 20 20 2a 2a 20 20 20 20 20 20 20  OM (.  **       
22970 20 53 45 4c 45 43 54 20 78 20 46 52 4f 4d 20 74   SELECT x FROM t
22980 61 62 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 55  ab.  **        U
22990 4e 49 4f 4e 20 41 4c 4c 0a 20 20 2a 2a 20 20 20  NION ALL.  **   
229a0 20 20 20 20 20 53 45 4c 45 43 54 20 79 20 46 52       SELECT y FR
229b0 4f 4d 20 74 61 62 0a 20 20 2a 2a 20 20 20 20 20  OM tab.  **     
229c0 20 20 20 55 4e 49 4f 4e 20 41 4c 4c 0a 20 20 2a     UNION ALL.  *
229d0 2a 20 20 20 20 20 20 20 20 53 45 4c 45 43 54 20  *        SELECT 
229e0 61 62 73 28 7a 2a 32 29 20 46 52 4f 4d 20 74 61  abs(z*2) FROM ta
229f0 62 32 0a 20 20 2a 2a 20 20 20 20 20 29 20 57 48  b2.  **     ) WH
22a00 45 52 45 20 61 21 3d 35 20 4f 52 44 45 52 20 42  ERE a!=5 ORDER B
22a10 59 20 31 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 72  Y 1.  **.  ** Tr
22a20 61 6e 73 66 6f 72 6d 65 64 20 69 6e 74 6f 3a 0a  ansformed into:.
22a30 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 53 45    **.  **     SE
22a40 4c 45 43 54 20 78 2b 31 20 46 52 4f 4d 20 74 61  LECT x+1 FROM ta
22a50 62 20 57 48 45 52 45 20 78 2b 31 21 3d 35 0a 20  b WHERE x+1!=5. 
22a60 20 2a 2a 20 20 20 20 20 55 4e 49 4f 4e 20 41 4c   **     UNION AL
22a70 4c 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c 45 43  L.  **     SELEC
22a80 54 20 79 2b 31 20 46 52 4f 4d 20 74 61 62 20 57  T y+1 FROM tab W
22a90 48 45 52 45 20 79 2b 31 21 3d 35 0a 20 20 2a 2a  HERE y+1!=5.  **
22aa0 20 20 20 20 20 55 4e 49 4f 4e 20 41 4c 4c 0a 20       UNION ALL. 
22ab0 20 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 61   **     SELECT a
22ac0 62 73 28 7a 2a 32 29 2b 31 20 46 52 4f 4d 20 74  bs(z*2)+1 FROM t
22ad0 61 62 32 20 57 48 45 52 45 20 61 62 73 28 7a 2a  ab2 WHERE abs(z*
22ae0 32 29 2b 31 21 3d 35 0a 20 20 2a 2a 20 20 20 20  2)+1!=5.  **    
22af0 20 4f 52 44 45 52 20 42 59 20 31 0a 20 20 2a 2a   ORDER BY 1.  **
22b00 0a 20 20 2a 2a 20 57 65 20 63 61 6c 6c 20 74 68  .  ** We call th
22b10 69 73 20 74 68 65 20 22 63 6f 6d 70 6f 75 6e 64  is the "compound
22b20 2d 73 75 62 71 75 65 72 79 20 66 6c 61 74 74 65  -subquery flatte
22b30 6e 69 6e 67 22 2e 0a 20 20 2a 2f 0a 20 20 66 6f  ning"..  */.  fo
22b40 72 28 70 53 75 62 3d 70 53 75 62 2d 3e 70 50 72  r(pSub=pSub->pPr
22b50 69 6f 72 3b 20 70 53 75 62 3b 20 70 53 75 62 3d  ior; pSub; pSub=
22b60 70 53 75 62 2d 3e 70 50 72 69 6f 72 29 7b 0a 20  pSub->pPrior){. 
22b70 20 20 20 53 65 6c 65 63 74 20 2a 70 4e 65 77 3b     Select *pNew;
22b80 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70  .    ExprList *p
22b90 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72  OrderBy = p->pOr
22ba0 64 65 72 42 79 3b 0a 20 20 20 20 45 78 70 72 20  derBy;.    Expr 
22bb0 2a 70 4c 69 6d 69 74 20 3d 20 70 2d 3e 70 4c 69  *pLimit = p->pLi
22bc0 6d 69 74 3b 0a 20 20 20 20 53 65 6c 65 63 74 20  mit;.    Select 
22bd0 2a 70 50 72 69 6f 72 20 3d 20 70 2d 3e 70 50 72  *pPrior = p->pPr
22be0 69 6f 72 3b 0a 20 20 20 20 70 2d 3e 70 4f 72 64  ior;.    p->pOrd
22bf0 65 72 42 79 20 3d 20 30 3b 0a 20 20 20 20 70 2d  erBy = 0;.    p-
22c00 3e 70 53 72 63 20 3d 20 30 3b 0a 20 20 20 20 70  >pSrc = 0;.    p
22c10 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20  ->pPrior = 0;.  
22c20 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b    p->pLimit = 0;
22c30 0a 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69  .    pNew = sqli
22c40 74 65 33 53 65 6c 65 63 74 44 75 70 28 64 62 2c  te3SelectDup(db,
22c50 20 70 2c 20 30 29 3b 0a 20 20 20 20 70 2d 3e 70   p, 0);.    p->p
22c60 4c 69 6d 69 74 20 3d 20 70 4c 69 6d 69 74 3b 0a  Limit = pLimit;.
22c70 20 20 20 20 70 2d 3e 70 4f 72 64 65 72 42 79 20      p->pOrderBy 
22c80 3d 20 70 4f 72 64 65 72 42 79 3b 0a 20 20 20 20  = pOrderBy;.    
22c90 70 2d 3e 70 53 72 63 20 3d 20 70 53 72 63 3b 0a  p->pSrc = pSrc;.
22ca0 20 20 20 20 70 2d 3e 6f 70 20 3d 20 54 4b 5f 41      p->op = TK_A
22cb0 4c 4c 3b 0a 20 20 20 20 69 66 28 20 70 4e 65 77  LL;.    if( pNew
22cc0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e  ==0 ){.      p->
22cd0 70 50 72 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b  pPrior = pPrior;
22ce0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
22cf0 20 20 70 4e 65 77 2d 3e 70 50 72 69 6f 72 20 3d    pNew->pPrior =
22d00 20 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 69   pPrior;.      i
22d10 66 28 20 70 50 72 69 6f 72 20 29 20 70 50 72 69  f( pPrior ) pPri
22d20 6f 72 2d 3e 70 4e 65 78 74 20 3d 20 70 4e 65 77  or->pNext = pNew
22d30 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 4e  ;.      pNew->pN
22d40 65 78 74 20 3d 20 70 3b 0a 20 20 20 20 20 20 70  ext = p;.      p
22d50 2d 3e 70 50 72 69 6f 72 20 3d 20 70 4e 65 77 3b  ->pPrior = pNew;
22d60 0a 20 20 20 20 20 20 53 45 4c 45 43 54 54 52 41  .      SELECTTRA
22d70 43 45 28 32 2c 70 50 61 72 73 65 2c 70 2c 28 22  CE(2,pParse,p,("
22d80 63 6f 6d 70 6f 75 6e 64 2d 73 75 62 71 75 65 72  compound-subquer
22d90 79 20 66 6c 61 74 74 65 6e 65 72 22 0a 20 20 20  y flattener".   
22da0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22db0 20 20 20 20 20 20 20 20 20 20 20 22 20 63 72 65             " cre
22dc0 61 74 65 73 20 25 75 20 61 73 20 70 65 65 72 5c  ates %u as peer\
22dd0 6e 22 2c 70 4e 65 77 2d 3e 73 65 6c 49 64 29 29  n",pNew->selId))
22de0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
22df0 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
22e00 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d   ) return 1;.  }
22e10 0a 0a 20 20 2f 2a 20 42 65 67 69 6e 20 66 6c 61  ..  /* Begin fla
22e20 74 74 65 6e 69 6e 67 20 74 68 65 20 69 46 72 6f  ttening the iFro
22e30 6d 2d 74 68 20 65 6e 74 72 79 20 6f 66 20 74 68  m-th entry of th
22e40 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 0a 20  e FROM clause . 
22e50 20 2a 2a 20 69 6e 20 74 68 65 20 6f 75 74 65 72   ** in the outer
22e60 20 71 75 65 72 79 2e 0a 20 20 2a 2f 0a 20 20 70   query..  */.  p
22e70 53 75 62 20 3d 20 70 53 75 62 31 20 3d 20 70 53  Sub = pSub1 = pS
22e80 75 62 69 74 65 6d 2d 3e 70 53 65 6c 65 63 74 3b  ubitem->pSelect;
22e90 0a 0a 20 20 2f 2a 20 44 65 6c 65 74 65 20 74 68  ..  /* Delete th
22ea0 65 20 74 72 61 6e 73 69 65 6e 74 20 74 61 62 6c  e transient tabl
22eb0 65 20 73 74 72 75 63 74 75 72 65 20 61 73 73 6f  e structure asso
22ec0 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65 0a  ciated with the.
22ed0 20 20 2a 2a 20 73 75 62 71 75 65 72 79 0a 20 20    ** subquery.  
22ee0 2a 2f 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72  */.  sqlite3DbFr
22ef0 65 65 28 64 62 2c 20 70 53 75 62 69 74 65 6d 2d  ee(db, pSubitem-
22f00 3e 7a 44 61 74 61 62 61 73 65 29 3b 0a 20 20 73  >zDatabase);.  s
22f10 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
22f20 20 70 53 75 62 69 74 65 6d 2d 3e 7a 4e 61 6d 65   pSubitem->zName
22f30 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72  );.  sqlite3DbFr
22f40 65 65 28 64 62 2c 20 70 53 75 62 69 74 65 6d 2d  ee(db, pSubitem-
22f50 3e 7a 41 6c 69 61 73 29 3b 0a 20 20 70 53 75 62  >zAlias);.  pSub
22f60 69 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65 20  item->zDatabase 
22f70 3d 20 30 3b 0a 20 20 70 53 75 62 69 74 65 6d 2d  = 0;.  pSubitem-
22f80 3e 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 70 53  >zName = 0;.  pS
22f90 75 62 69 74 65 6d 2d 3e 7a 41 6c 69 61 73 20 3d  ubitem->zAlias =
22fa0 20 30 3b 0a 20 20 70 53 75 62 69 74 65 6d 2d 3e   0;.  pSubitem->
22fb0 70 53 65 6c 65 63 74 20 3d 20 30 3b 0a 0a 20 20  pSelect = 0;..  
22fc0 2f 2a 20 44 65 66 65 72 20 64 65 6c 65 74 69 6e  /* Defer deletin
22fd0 67 20 74 68 65 20 54 61 62 6c 65 20 6f 62 6a 65  g the Table obje
22fe0 63 74 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  ct associated wi
22ff0 74 68 20 74 68 65 0a 20 20 2a 2a 20 73 75 62 71  th the.  ** subq
23000 75 65 72 79 20 75 6e 74 69 6c 20 63 6f 64 65 20  uery until code 
23010 67 65 6e 65 72 61 74 69 6f 6e 20 69 73 0a 20 20  generation is.  
23020 2a 2a 20 63 6f 6d 70 6c 65 74 65 2c 20 73 69 6e  ** complete, sin
23030 63 65 20 74 68 65 72 65 20 6d 61 79 20 73 74 69  ce there may sti
23040 6c 6c 20 65 78 69 73 74 20 45 78 70 72 2e 70 54  ll exist Expr.pT
23050 61 62 20 65 6e 74 72 69 65 73 20 74 68 61 74 0a  ab entries that.
23060 20 20 2a 2a 20 72 65 66 65 72 20 74 6f 20 74 68    ** refer to th
23070 65 20 73 75 62 71 75 65 72 79 20 65 76 65 6e 20  e subquery even 
23080 61 66 74 65 72 20 66 6c 61 74 74 65 6e 69 6e 67  after flattening
23090 2e 20 20 54 69 63 6b 65 74 20 23 33 33 34 36 2e  .  Ticket #3346.
230a0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 70 53 75 62 69  .  **.  ** pSubi
230b0 74 65 6d 2d 3e 70 54 61 62 20 69 73 20 61 6c 77  tem->pTab is alw
230c0 61 79 73 20 6e 6f 6e 2d 4e 55 4c 4c 20 62 79 20  ays non-NULL by 
230d0 74 65 73 74 20 72 65 73 74 72 69 63 74 69 6f 6e  test restriction
230e0 73 20 61 6e 64 20 74 65 73 74 73 20 61 62 6f 76  s and tests abov
230f0 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 41 4c  e..  */.  if( AL
23100 57 41 59 53 28 70 53 75 62 69 74 65 6d 2d 3e 70  WAYS(pSubitem->p
23110 54 61 62 21 3d 30 29 20 29 7b 0a 20 20 20 20 54  Tab!=0) ){.    T
23120 61 62 6c 65 20 2a 70 54 61 62 54 6f 44 65 6c 20  able *pTabToDel 
23130 3d 20 70 53 75 62 69 74 65 6d 2d 3e 70 54 61 62  = pSubitem->pTab
23140 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62 54 6f  ;.    if( pTabTo
23150 44 65 6c 2d 3e 6e 54 61 62 52 65 66 3d 3d 31 20  Del->nTabRef==1 
23160 29 7b 0a 20 20 20 20 20 20 50 61 72 73 65 20 2a  ){.      Parse *
23170 70 54 6f 70 6c 65 76 65 6c 20 3d 20 73 71 6c 69  pToplevel = sqli
23180 74 65 33 50 61 72 73 65 54 6f 70 6c 65 76 65 6c  te3ParseToplevel
23190 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
231a0 70 54 61 62 54 6f 44 65 6c 2d 3e 70 4e 65 78 74  pTabToDel->pNext
231b0 5a 6f 6d 62 69 65 20 3d 20 70 54 6f 70 6c 65 76  Zombie = pToplev
231c0 65 6c 2d 3e 70 5a 6f 6d 62 69 65 54 61 62 3b 0a  el->pZombieTab;.
231d0 20 20 20 20 20 20 70 54 6f 70 6c 65 76 65 6c 2d        pToplevel-
231e0 3e 70 5a 6f 6d 62 69 65 54 61 62 20 3d 20 70 54  >pZombieTab = pT
231f0 61 62 54 6f 44 65 6c 3b 0a 20 20 20 20 7d 65 6c  abToDel;.    }el
23200 73 65 7b 0a 20 20 20 20 20 20 70 54 61 62 54 6f  se{.      pTabTo
23210 44 65 6c 2d 3e 6e 54 61 62 52 65 66 2d 2d 3b 0a  Del->nTabRef--;.
23220 20 20 20 20 7d 0a 20 20 20 20 70 53 75 62 69 74      }.    pSubit
23230 65 6d 2d 3e 70 54 61 62 20 3d 20 30 3b 0a 20 20  em->pTab = 0;.  
23240 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c  }..  /* The foll
23250 6f 77 69 6e 67 20 6c 6f 6f 70 20 72 75 6e 73 20  owing loop runs 
23260 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20 74 65  once for each te
23270 72 6d 20 69 6e 20 61 20 63 6f 6d 70 6f 75 6e 64  rm in a compound
23280 2d 73 75 62 71 75 65 72 79 0a 20 20 2a 2a 20 66  -subquery.  ** f
23290 6c 61 74 74 65 6e 69 6e 67 20 28 61 73 20 64 65  lattening (as de
232a0 73 63 72 69 62 65 64 20 61 62 6f 76 65 29 2e 20  scribed above). 
232b0 20 49 66 20 77 65 20 61 72 65 20 64 6f 69 6e 67   If we are doing
232c0 20 61 20 64 69 66 66 65 72 65 6e 74 20 6b 69 6e   a different kin
232d0 64 0a 20 20 2a 2a 20 6f 66 20 66 6c 61 74 74 65  d.  ** of flatte
232e0 6e 69 6e 67 20 2d 20 61 20 66 6c 61 74 74 65 6e  ning - a flatten
232f0 69 6e 67 20 6f 74 68 65 72 20 74 68 61 6e 20 61  ing other than a
23300 20 63 6f 6d 70 6f 75 6e 64 2d 73 75 62 71 75 65   compound-subque
23310 72 79 20 66 6c 61 74 74 65 6e 69 6e 67 20 2d 0a  ry flattening -.
23320 20 20 2a 2a 20 74 68 65 6e 20 74 68 69 73 20 6c    ** then this l
23330 6f 6f 70 20 6f 6e 6c 79 20 72 75 6e 73 20 6f 6e  oop only runs on
23340 63 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  ce..  **.  ** Th
23350 69 73 20 6c 6f 6f 70 20 6d 6f 76 65 73 20 61 6c  is loop moves al
23360 6c 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 65 6c  l of the FROM el
23370 65 6d 65 6e 74 73 20 6f 66 20 74 68 65 20 73 75  ements of the su
23380 62 71 75 65 72 79 20 69 6e 74 6f 20 74 68 65 0a  bquery into the.
23390 20 20 2a 2a 20 74 68 65 20 46 52 4f 4d 20 63 6c    ** the FROM cl
233a0 61 75 73 65 20 6f 66 20 74 68 65 20 6f 75 74 65  ause of the oute
233b0 72 20 71 75 65 72 79 2e 20 20 42 65 66 6f 72 65  r query.  Before
233c0 20 64 6f 69 6e 67 20 74 68 69 73 2c 20 72 65 6d   doing this, rem
233d0 65 6d 62 65 72 0a 20 20 2a 2a 20 74 68 65 20 63  ember.  ** the c
233e0 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 66 6f 72  ursor number for
233f0 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 6f 75   the original ou
23400 74 65 72 20 71 75 65 72 79 20 46 52 4f 4d 20 65  ter query FROM e
23410 6c 65 6d 65 6e 74 20 69 6e 0a 20 20 2a 2a 20 69  lement in.  ** i
23420 50 61 72 65 6e 74 2e 20 20 54 68 65 20 69 50 61  Parent.  The iPa
23430 72 65 6e 74 20 63 75 72 73 6f 72 20 77 69 6c 6c  rent cursor will
23440 20 6e 65 76 65 72 20 62 65 20 75 73 65 64 2e 20   never be used. 
23450 20 53 75 62 73 65 71 75 65 6e 74 20 63 6f 64 65   Subsequent code
23460 0a 20 20 2a 2a 20 77 69 6c 6c 20 73 63 61 6e 20  .  ** will scan 
23470 65 78 70 72 65 73 73 69 6f 6e 73 20 6c 6f 6f 6b  expressions look
23480 69 6e 67 20 66 6f 72 20 69 50 61 72 65 6e 74 20  ing for iParent 
23490 72 65 66 65 72 65 6e 63 65 73 20 61 6e 64 20 72  references and r
234a0 65 70 6c 61 63 65 0a 20 20 2a 2a 20 74 68 6f 73  eplace.  ** thos
234b0 65 20 72 65 66 65 72 65 6e 63 65 73 20 77 69 74  e references wit
234c0 68 20 65 78 70 72 65 73 73 69 6f 6e 73 20 74 68  h expressions th
234d0 61 74 20 72 65 73 6f 6c 76 65 20 74 6f 20 74 68  at resolve to th
234e0 65 20 73 75 62 71 75 65 72 79 20 46 52 4f 4d 0a  e subquery FROM.
234f0 20 20 2a 2a 20 65 6c 65 6d 65 6e 74 73 20 77 65    ** elements we
23500 20 61 72 65 20 6e 6f 77 20 63 6f 70 79 69 6e 67   are now copying
23510 20 69 6e 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28   in..  */.  for(
23520 70 50 61 72 65 6e 74 3d 70 3b 20 70 50 61 72 65  pParent=p; pPare
23530 6e 74 3b 20 70 50 61 72 65 6e 74 3d 70 50 61 72  nt; pParent=pPar
23540 65 6e 74 2d 3e 70 50 72 69 6f 72 2c 20 70 53 75  ent->pPrior, pSu
23550 62 3d 70 53 75 62 2d 3e 70 50 72 69 6f 72 29 7b  b=pSub->pPrior){
23560 0a 20 20 20 20 69 6e 74 20 6e 53 75 62 53 72 63  .    int nSubSrc
23570 3b 0a 20 20 20 20 75 38 20 6a 6f 69 6e 74 79 70  ;.    u8 jointyp
23580 65 20 3d 20 30 3b 0a 20 20 20 20 61 73 73 65 72  e = 0;.    asser
23590 74 28 20 70 53 75 62 21 3d 30 20 29 3b 0a 20 20  t( pSub!=0 );.  
235a0 20 20 70 53 75 62 53 72 63 20 3d 20 70 53 75 62    pSubSrc = pSub
235b0 2d 3e 70 53 72 63 3b 20 20 20 20 20 2f 2a 20 46  ->pSrc;     /* F
235c0 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 73 75  ROM clause of su
235d0 62 71 75 65 72 79 20 2a 2f 0a 20 20 20 20 6e 53  bquery */.    nS
235e0 75 62 53 72 63 20 3d 20 70 53 75 62 53 72 63 2d  ubSrc = pSubSrc-
235f0 3e 6e 53 72 63 3b 20 20 2f 2a 20 4e 75 6d 62 65  >nSrc;  /* Numbe
23600 72 20 6f 66 20 74 65 72 6d 73 20 69 6e 20 73 75  r of terms in su
23610 62 71 75 65 72 79 20 46 52 4f 4d 20 63 6c 61 75  bquery FROM clau
23620 73 65 20 2a 2f 0a 20 20 20 20 70 53 72 63 20 3d  se */.    pSrc =
23630 20 70 50 61 72 65 6e 74 2d 3e 70 53 72 63 3b 20   pParent->pSrc; 
23640 20 20 20 20 2f 2a 20 46 52 4f 4d 20 63 6c 61 75      /* FROM clau
23650 73 65 20 6f 66 20 74 68 65 20 6f 75 74 65 72 20  se of the outer 
23660 71 75 65 72 79 20 2a 2f 0a 0a 20 20 20 20 69 66  query */..    if
23670 28 20 70 53 72 63 20 29 7b 0a 20 20 20 20 20 20  ( pSrc ){.      
23680 61 73 73 65 72 74 28 20 70 50 61 72 65 6e 74 3d  assert( pParent=
23690 3d 70 20 29 3b 20 20 2f 2a 20 46 69 72 73 74 20  =p );  /* First 
236a0 74 69 6d 65 20 74 68 72 6f 75 67 68 20 74 68 65  time through the
236b0 20 6c 6f 6f 70 20 2a 2f 0a 20 20 20 20 20 20 6a   loop */.      j
236c0 6f 69 6e 74 79 70 65 20 3d 20 70 53 75 62 69 74  ointype = pSubit
236d0 65 6d 2d 3e 66 67 2e 6a 6f 69 6e 74 79 70 65 3b  em->fg.jointype;
236e0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
236f0 20 20 61 73 73 65 72 74 28 20 70 50 61 72 65 6e    assert( pParen
23700 74 21 3d 70 20 29 3b 20 20 2f 2a 20 32 6e 64 20  t!=p );  /* 2nd 
23710 61 6e 64 20 73 75 62 73 65 71 75 65 6e 74 20 74  and subsequent t
23720 69 6d 65 73 20 74 68 72 6f 75 67 68 20 74 68 65  imes through the
23730 20 6c 6f 6f 70 20 2a 2f 0a 20 20 20 20 20 20 70   loop */.      p
23740 53 72 63 20 3d 20 73 71 6c 69 74 65 33 53 72 63  Src = sqlite3Src
23750 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61 72 73  ListAppend(pPars
23760 65 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20  e, 0, 0, 0);.   
23770 20 20 20 69 66 28 20 70 53 72 63 3d 3d 30 20 29     if( pSrc==0 )
23780 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 70 50   break;.      pP
23790 61 72 65 6e 74 2d 3e 70 53 72 63 20 3d 20 70 53  arent->pSrc = pS
237a0 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  rc;.    }..    /
237b0 2a 20 54 68 65 20 73 75 62 71 75 65 72 79 20 75  * The subquery u
237c0 73 65 73 20 61 20 73 69 6e 67 6c 65 20 73 6c 6f  ses a single slo
237d0 74 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c  t of the FROM cl
237e0 61 75 73 65 20 6f 66 20 74 68 65 20 6f 75 74 65  ause of the oute
237f0 72 0a 20 20 20 20 2a 2a 20 71 75 65 72 79 2e 20  r.    ** query. 
23800 20 49 66 20 74 68 65 20 73 75 62 71 75 65 72 79   If the subquery
23810 20 68 61 73 20 6d 6f 72 65 20 74 68 61 6e 20 6f   has more than o
23820 6e 65 20 65 6c 65 6d 65 6e 74 20 69 6e 20 69 74  ne element in it
23830 73 20 46 52 4f 4d 20 63 6c 61 75 73 65 2c 0a 20  s FROM clause,. 
23840 20 20 20 2a 2a 20 74 68 65 6e 20 65 78 70 61 6e     ** then expan
23850 64 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  d the outer quer
23860 79 20 74 6f 20 6d 61 6b 65 20 73 70 61 63 65 20  y to make space 
23870 66 6f 72 20 69 74 20 74 6f 20 68 6f 6c 64 20 61  for it to hold a
23880 6c 6c 20 65 6c 65 6d 65 6e 74 73 0a 20 20 20 20  ll elements.    
23890 2a 2a 20 6f 66 20 74 68 65 20 73 75 62 71 75 65  ** of the subque
238a0 72 79 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  ry..    **.    *
238b0 2a 20 45 78 61 6d 70 6c 65 3a 0a 20 20 20 20 2a  * Example:.    *
238c0 2a 0a 20 20 20 20 2a 2a 20 20 20 20 53 45 4c 45  *.    **    SELE
238d0 43 54 20 2a 20 46 52 4f 4d 20 74 61 62 41 2c 20  CT * FROM tabA, 
238e0 28 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 73  (SELECT * FROM s
238f0 75 62 31 2c 20 73 75 62 32 29 2c 20 74 61 62 42  ub1, sub2), tabB
23900 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ;.    **.    ** 
23910 54 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  The outer query 
23920 68 61 73 20 33 20 73 6c 6f 74 73 20 69 6e 20 69  has 3 slots in i
23930 74 73 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20  ts FROM clause. 
23940 20 4f 6e 65 20 73 6c 6f 74 20 6f 66 20 74 68 65   One slot of the
23950 0a 20 20 20 20 2a 2a 20 6f 75 74 65 72 20 71 75  .    ** outer qu
23960 65 72 79 20 28 74 68 65 20 6d 69 64 64 6c 65 20  ery (the middle 
23970 73 6c 6f 74 29 20 69 73 20 75 73 65 64 20 62 79  slot) is used by
23980 20 74 68 65 20 73 75 62 71 75 65 72 79 2e 20 20   the subquery.  
23990 54 68 65 20 6e 65 78 74 0a 20 20 20 20 2a 2a 20  The next.    ** 
239a0 62 6c 6f 63 6b 20 6f 66 20 63 6f 64 65 20 77 69  block of code wi
239b0 6c 6c 20 65 78 70 61 6e 64 20 74 68 65 20 6f 75  ll expand the ou
239c0 74 65 72 20 71 75 65 72 79 20 46 52 4f 4d 20 63  ter query FROM c
239d0 6c 61 75 73 65 20 74 6f 20 34 20 73 6c 6f 74 73  lause to 4 slots
239e0 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20 6d 69 64  ..    ** The mid
239f0 64 6c 65 20 73 6c 6f 74 20 69 73 20 65 78 70 61  dle slot is expa
23a00 6e 64 65 64 20 74 6f 20 74 77 6f 20 73 6c 6f 74  nded to two slot
23a10 73 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 6d 61  s in order to ma
23a20 6b 65 20 73 70 61 63 65 0a 20 20 20 20 2a 2a 20  ke space.    ** 
23a30 66 6f 72 20 74 68 65 20 74 77 6f 20 65 6c 65 6d  for the two elem
23a40 65 6e 74 73 20 69 6e 20 74 68 65 20 46 52 4f 4d  ents in the FROM
23a50 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 73   clause of the s
23a60 75 62 71 75 65 72 79 2e 0a 20 20 20 20 2a 2f 0a  ubquery..    */.
23a70 20 20 20 20 69 66 28 20 6e 53 75 62 53 72 63 3e      if( nSubSrc>
23a80 31 20 29 7b 0a 20 20 20 20 20 20 70 53 72 63 20  1 ){.      pSrc 
23a90 3d 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74  = sqlite3SrcList
23aa0 45 6e 6c 61 72 67 65 28 70 50 61 72 73 65 2c 20  Enlarge(pParse, 
23ab0 70 53 72 63 2c 20 6e 53 75 62 53 72 63 2d 31 2c  pSrc, nSubSrc-1,
23ac0 69 46 72 6f 6d 2b 31 29 3b 0a 20 20 20 20 20 20  iFrom+1);.      
23ad0 69 66 28 20 70 53 72 63 3d 3d 30 20 29 20 62 72  if( pSrc==0 ) br
23ae0 65 61 6b 3b 0a 20 20 20 20 20 20 70 50 61 72 65  eak;.      pPare
23af0 6e 74 2d 3e 70 53 72 63 20 3d 20 70 53 72 63 3b  nt->pSrc = pSrc;
23b00 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 54  .    }..    /* T
23b10 72 61 6e 73 66 65 72 20 74 68 65 20 46 52 4f 4d  ransfer the FROM
23b20 20 63 6c 61 75 73 65 20 74 65 72 6d 73 20 66 72   clause terms fr
23b30 6f 6d 20 74 68 65 20 73 75 62 71 75 65 72 79 20  om the subquery 
23b40 69 6e 74 6f 20 74 68 65 0a 20 20 20 20 2a 2a 20  into the.    ** 
23b50 6f 75 74 65 72 20 71 75 65 72 79 2e 0a 20 20 20  outer query..   
23b60 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   */.    for(i=0;
23b70 20 69 3c 6e 53 75 62 53 72 63 3b 20 69 2b 2b 29   i<nSubSrc; i++)
23b80 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 49  {.      sqlite3I
23b90 64 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20  dListDelete(db, 
23ba0 70 53 72 63 2d 3e 61 5b 69 2b 69 46 72 6f 6d 5d  pSrc->a[i+iFrom]
23bb0 2e 70 55 73 69 6e 67 29 3b 0a 20 20 20 20 20 20  .pUsing);.      
23bc0 61 73 73 65 72 74 28 20 70 53 72 63 2d 3e 61 5b  assert( pSrc->a[
23bd0 69 2b 69 46 72 6f 6d 5d 2e 66 67 2e 69 73 54 61  i+iFrom].fg.isTa
23be0 62 46 75 6e 63 3d 3d 30 20 29 3b 0a 20 20 20 20  bFunc==0 );.    
23bf0 20 20 70 53 72 63 2d 3e 61 5b 69 2b 69 46 72 6f    pSrc->a[i+iFro
23c00 6d 5d 20 3d 20 70 53 75 62 53 72 63 2d 3e 61 5b  m] = pSubSrc->a[
23c10 69 5d 3b 0a 20 20 20 20 20 20 69 4e 65 77 50 61  i];.      iNewPa
23c20 72 65 6e 74 20 3d 20 70 53 75 62 53 72 63 2d 3e  rent = pSubSrc->
23c30 61 5b 69 5d 2e 69 43 75 72 73 6f 72 3b 0a 20 20  a[i].iCursor;.  
23c40 20 20 20 20 6d 65 6d 73 65 74 28 26 70 53 75 62      memset(&pSub
23c50 53 72 63 2d 3e 61 5b 69 5d 2c 20 30 2c 20 73 69  Src->a[i], 0, si
23c60 7a 65 6f 66 28 70 53 75 62 53 72 63 2d 3e 61 5b  zeof(pSubSrc->a[
23c70 69 5d 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  i]));.    }.    
23c80 70 53 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d 2e 66  pSrc->a[iFrom].f
23c90 67 2e 6a 6f 69 6e 74 79 70 65 20 3d 20 6a 6f 69  g.jointype = joi
23ca0 6e 74 79 70 65 3b 0a 20 20 0a 20 20 20 20 2f 2a  ntype;.  .    /*
23cb0 20 4e 6f 77 20 62 65 67 69 6e 20 73 75 62 73 74   Now begin subst
23cc0 69 74 75 74 69 6e 67 20 73 75 62 71 75 65 72 79  ituting subquery
23cd0 20 72 65 73 75 6c 74 20 73 65 74 20 65 78 70 72   result set expr
23ce0 65 73 73 69 6f 6e 73 20 66 6f 72 20 0a 20 20 20  essions for .   
23cf0 20 2a 2a 20 72 65 66 65 72 65 6e 63 65 73 20 74   ** references t
23d00 6f 20 74 68 65 20 69 50 61 72 65 6e 74 20 69 6e  o the iParent in
23d10 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
23d20 2e 0a 20 20 20 20 2a 2a 20 0a 20 20 20 20 2a 2a  ..    ** .    **
23d30 20 45 78 61 6d 70 6c 65 3a 0a 20 20 20 20 2a 2a   Example:.    **
23d40 0a 20 20 20 20 2a 2a 20 20 20 53 45 4c 45 43 54  .    **   SELECT
23d50 20 61 2b 35 2c 20 62 2a 31 30 20 46 52 4f 4d 20   a+5, b*10 FROM 
23d60 28 53 45 4c 45 43 54 20 78 2a 33 20 41 53 20 61  (SELECT x*3 AS a
23d70 2c 20 79 2b 31 30 20 41 53 20 62 20 46 52 4f 4d  , y+10 AS b FROM
23d80 20 74 31 29 20 57 48 45 52 45 20 61 3e 62 3b 0a   t1) WHERE a>b;.
23d90 20 20 20 20 2a 2a 20 20 20 5c 20 20 20 20 20 20      **   \      
23da0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
23db0 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 20 73 75  _____________ su
23dc0 62 71 75 65 72 79 20 5f 5f 5f 5f 5f 5f 5f 5f 5f  bquery _________
23dd0 5f 2f 20 20 20 20 20 20 20 20 20 20 2f 0a 20 20  _/          /.  
23de0 20 20 2a 2a 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f    **    \_______
23df0 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 20 6f  ______________ o
23e00 75 74 65 72 20 71 75 65 72 79 20 5f 5f 5f 5f 5f  uter query _____
23e10 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
23e20 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 0a 20 20 20 20 2a  _________/.    *
23e30 2a 0a 20 20 20 20 2a 2a 20 57 65 20 6c 6f 6f 6b  *.    ** We look
23e40 20 61 74 20 65 76 65 72 79 20 65 78 70 72 65 73   at every expres
23e50 73 69 6f 6e 20 69 6e 20 74 68 65 20 6f 75 74 65  sion in the oute
23e60 72 20 71 75 65 72 79 20 61 6e 64 20 65 76 65 72  r query and ever
23e70 79 20 70 6c 61 63 65 20 77 65 20 73 65 65 0a 20  y place we see. 
23e80 20 20 20 2a 2a 20 22 61 22 20 77 65 20 73 75 62     ** "a" we sub
23e90 73 74 69 74 75 74 65 20 22 78 2a 33 22 20 61 6e  stitute "x*3" an
23ea0 64 20 65 76 65 72 79 20 70 6c 61 63 65 20 77 65  d every place we
23eb0 20 73 65 65 20 22 62 22 20 77 65 20 73 75 62 73   see "b" we subs
23ec0 74 69 74 75 74 65 20 22 79 2b 31 30 22 2e 0a 20  titute "y+10".. 
23ed0 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 53     */.    if( pS
23ee0 75 62 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a  ub->pOrderBy ){.
23ef0 20 20 20 20 20 20 2f 2a 20 41 74 20 74 68 69 73        /* At this
23f00 20 70 6f 69 6e 74 2c 20 61 6e 79 20 6e 6f 6e 2d   point, any non-
23f10 7a 65 72 6f 20 69 4f 72 64 65 72 42 79 43 6f 6c  zero iOrderByCol
23f20 20 76 61 6c 75 65 73 20 69 6e 64 69 63 61 74 65   values indicate
23f30 20 74 68 61 74 20 74 68 65 0a 20 20 20 20 20 20   that the.      
23f40 2a 2a 20 4f 52 44 45 52 20 42 59 20 63 6f 6c 75  ** ORDER BY colu
23f50 6d 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  mn expression is
23f60 20 69 64 65 6e 74 69 63 61 6c 20 74 6f 20 74 68   identical to th
23f70 65 20 69 4f 72 64 65 72 42 79 43 6f 6c 27 74 68  e iOrderByCol'th
23f80 0a 20 20 20 20 20 20 2a 2a 20 65 78 70 72 65 73  .      ** expres
23f90 73 69 6f 6e 20 72 65 74 75 72 6e 65 64 20 62 79  sion returned by
23fa0 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
23fb0 74 20 70 53 75 62 2e 20 53 69 6e 63 65 20 74 68  t pSub. Since th
23fc0 65 73 65 20 76 61 6c 75 65 73 0a 20 20 20 20 20  ese values.     
23fd0 20 2a 2a 20 64 6f 20 6e 6f 74 20 6e 65 63 65 73   ** do not neces
23fe0 73 61 72 69 6c 79 20 63 6f 72 72 65 73 70 6f 6e  sarily correspon
23ff0 64 20 74 6f 20 63 6f 6c 75 6d 6e 73 20 69 6e 20  d to columns in 
24000 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
24010 20 70 50 61 72 65 6e 74 2c 0a 20 20 20 20 20 20   pParent,.      
24020 2a 2a 20 7a 65 72 6f 20 74 68 65 6d 20 62 65 66  ** zero them bef
24030 6f 72 65 20 74 72 61 6e 73 66 65 72 69 6e 67 20  ore transfering 
24040 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
24050 75 73 65 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20  use..      **.  
24060 20 20 20 20 2a 2a 20 4e 6f 74 20 64 6f 69 6e 67      ** Not doing
24070 20 74 68 69 73 20 6d 61 79 20 63 61 75 73 65 20   this may cause 
24080 61 6e 20 65 72 72 6f 72 20 69 66 20 61 20 73 75  an error if a su
24090 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 20 74 6f  bsequent call to
240a0 20 74 68 69 73 0a 20 20 20 20 20 20 2a 2a 20 66   this.      ** f
240b0 75 6e 63 74 69 6f 6e 20 61 74 74 65 6d 70 74 73  unction attempts
240c0 20 74 6f 20 66 6c 61 74 74 65 6e 20 61 20 63 6f   to flatten a co
240d0 6d 70 6f 75 6e 64 20 73 75 62 2d 71 75 65 72 79  mpound sub-query
240e0 20 69 6e 74 6f 20 70 50 61 72 65 6e 74 0a 20 20   into pParent.  
240f0 20 20 20 20 2a 2a 20 28 74 68 65 20 6f 6e 6c 79      ** (the only
24100 20 77 61 79 20 74 68 69 73 20 63 61 6e 20 68 61   way this can ha
24110 70 70 65 6e 20 69 73 20 69 66 20 74 68 65 20 63  ppen is if the c
24120 6f 6d 70 6f 75 6e 64 20 73 75 62 2d 71 75 65 72  ompound sub-quer
24130 79 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 63 75  y is.      ** cu
24140 72 72 65 6e 74 6c 79 20 70 61 72 74 20 6f 66 20  rrently part of 
24150 70 53 75 62 2d 3e 70 53 72 63 29 2e 20 53 65 65  pSub->pSrc). See
24160 20 74 69 63 6b 65 74 20 5b 64 31 31 61 36 65 39   ticket [d11a6e9
24170 30 38 66 5d 2e 20 20 2a 2f 0a 20 20 20 20 20 20  08f].  */.      
24180 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72  ExprList *pOrder
24190 42 79 20 3d 20 70 53 75 62 2d 3e 70 4f 72 64 65  By = pSub->pOrde
241a0 72 42 79 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  rBy;.      for(i
241b0 3d 30 3b 20 69 3c 70 4f 72 64 65 72 42 79 2d 3e  =0; i<pOrderBy->
241c0 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
241d0 20 20 20 20 20 70 4f 72 64 65 72 42 79 2d 3e 61       pOrderBy->a
241e0 5b 69 5d 2e 75 2e 78 2e 69 4f 72 64 65 72 42 79  [i].u.x.iOrderBy
241f0 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  Col = 0;.      }
24200 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
24210 50 61 72 65 6e 74 2d 3e 70 4f 72 64 65 72 42 79  Parent->pOrderBy
24220 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 50 61  ==0 );.      pPa
24230 72 65 6e 74 2d 3e 70 4f 72 64 65 72 42 79 20 3d  rent->pOrderBy =
24240 20 70 4f 72 64 65 72 42 79 3b 0a 20 20 20 20 20   pOrderBy;.     
24250 20 70 53 75 62 2d 3e 70 4f 72 64 65 72 42 79 20   pSub->pOrderBy 
24260 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  = 0;.    }.    p
24270 57 68 65 72 65 20 3d 20 70 53 75 62 2d 3e 70 57  Where = pSub->pW
24280 68 65 72 65 3b 0a 20 20 20 20 70 53 75 62 2d 3e  here;.    pSub->
24290 70 57 68 65 72 65 20 3d 20 30 3b 0a 20 20 20 20  pWhere = 0;.    
242a0 69 66 28 20 69 73 4c 65 66 74 4a 6f 69 6e 3e 30  if( isLeftJoin>0
242b0 20 29 7b 0a 20 20 20 20 20 20 73 65 74 4a 6f 69   ){.      setJoi
242c0 6e 45 78 70 72 28 70 57 68 65 72 65 2c 20 69 4e  nExpr(pWhere, iN
242d0 65 77 50 61 72 65 6e 74 29 3b 0a 20 20 20 20 7d  ewParent);.    }
242e0 0a 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70 57  .    pParent->pW
242f0 68 65 72 65 20 3d 20 73 71 6c 69 74 65 33 45 78  here = sqlite3Ex
24300 70 72 41 6e 64 28 70 50 61 72 73 65 2c 20 70 57  prAnd(pParse, pW
24310 68 65 72 65 2c 20 70 50 61 72 65 6e 74 2d 3e 70  here, pParent->p
24320 57 68 65 72 65 29 3b 0a 20 20 20 20 69 66 28 20  Where);.    if( 
24330 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
24340 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 53 75 62  ==0 ){.      Sub
24350 73 74 43 6f 6e 74 65 78 74 20 78 3b 0a 20 20 20  stContext x;.   
24360 20 20 20 78 2e 70 50 61 72 73 65 20 3d 20 70 50     x.pParse = pP
24370 61 72 73 65 3b 0a 20 20 20 20 20 20 78 2e 69 54  arse;.      x.iT
24380 61 62 6c 65 20 3d 20 69 50 61 72 65 6e 74 3b 0a  able = iParent;.
24390 20 20 20 20 20 20 78 2e 69 4e 65 77 54 61 62 6c        x.iNewTabl
243a0 65 20 3d 20 69 4e 65 77 50 61 72 65 6e 74 3b 0a  e = iNewParent;.
243b0 20 20 20 20 20 20 78 2e 69 73 4c 65 66 74 4a 6f        x.isLeftJo
243c0 69 6e 20 3d 20 69 73 4c 65 66 74 4a 6f 69 6e 3b  in = isLeftJoin;
243d0 0a 20 20 20 20 20 20 78 2e 70 45 4c 69 73 74 20  .      x.pEList 
243e0 3d 20 70 53 75 62 2d 3e 70 45 4c 69 73 74 3b 0a  = pSub->pEList;.
243f0 20 20 20 20 20 20 73 75 62 73 74 53 65 6c 65 63        substSelec
24400 74 28 26 78 2c 20 70 50 61 72 65 6e 74 2c 20 30  t(&x, pParent, 0
24410 29 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20  );.    }.  .    
24420 2f 2a 20 54 68 65 20 66 6c 61 74 74 65 6e 65 64  /* The flattened
24430 20 71 75 65 72 79 20 69 73 20 61 20 63 6f 6d 70   query is a comp
24440 6f 75 6e 64 20 69 66 20 65 69 74 68 65 72 20 74  ound if either t
24450 68 65 20 69 6e 6e 65 72 20 6f 72 20 74 68 65 0a  he inner or the.
24460 20 20 20 20 2a 2a 20 6f 75 74 65 72 20 71 75 65      ** outer que
24470 72 79 20 69 73 20 61 20 63 6f 6d 70 6f 75 6e 64  ry is a compound
24480 2e 20 2a 2f 0a 20 20 20 20 70 50 61 72 65 6e 74  . */.    pParent
24490 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20 70 53  ->selFlags |= pS
244a0 75 62 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53  ub->selFlags & S
244b0 46 5f 43 6f 6d 70 6f 75 6e 64 3b 0a 20 20 20 20  F_Compound;.    
244c0 61 73 73 65 72 74 28 20 28 70 53 75 62 2d 3e 73  assert( (pSub->s
244d0 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 44 69 73  elFlags & SF_Dis
244e0 74 69 6e 63 74 29 3d 3d 30 20 29 3b 20 2f 2a 20  tinct)==0 ); /* 
244f0 72 65 73 74 72 69 63 74 69 6f 6e 20 28 31 37 62  restriction (17b
24500 29 20 2a 2f 0a 20 20 0a 20 20 20 20 2f 2a 0a 20  ) */.  .    /*. 
24510 20 20 20 2a 2a 20 53 45 4c 45 43 54 20 2e 2e 2e     ** SELECT ...
24520 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20 2e 2e   FROM (SELECT ..
24530 2e 20 4c 49 4d 49 54 20 61 20 4f 46 46 53 45 54  . LIMIT a OFFSET
24540 20 62 29 20 4c 49 4d 49 54 20 78 20 4f 46 46 53   b) LIMIT x OFFS
24550 45 54 20 79 3b 0a 20 20 20 20 2a 2a 0a 20 20 20  ET y;.    **.   
24560 20 2a 2a 20 4f 6e 65 20 69 73 20 74 65 6d 70 74   ** One is tempt
24570 65 64 20 74 6f 20 74 72 79 20 74 6f 20 61 64 64  ed to try to add
24580 20 61 20 61 6e 64 20 62 20 74 6f 20 63 6f 6d 62   a and b to comb
24590 69 6e 65 20 74 68 65 20 6c 69 6d 69 74 73 2e 20  ine the limits. 
245a0 20 42 75 74 20 74 68 69 73 0a 20 20 20 20 2a 2a   But this.    **
245b0 20 64 6f 65 73 20 6e 6f 74 20 77 6f 72 6b 20 69   does not work i
245c0 66 20 65 69 74 68 65 72 20 6c 69 6d 69 74 20 69  f either limit i
245d0 73 20 6e 65 67 61 74 69 76 65 2e 0a 20 20 20 20  s negative..    
245e0 2a 2f 0a 20 20 20 20 69 66 28 20 70 53 75 62 2d  */.    if( pSub-
245f0 3e 70 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 20  >pLimit ){.     
24600 20 70 50 61 72 65 6e 74 2d 3e 70 4c 69 6d 69 74   pParent->pLimit
24610 20 3d 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74 3b   = pSub->pLimit;
24620 0a 20 20 20 20 20 20 70 53 75 62 2d 3e 70 4c 69  .      pSub->pLi
24630 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  mit = 0;.    }. 
24640 20 7d 0a 0a 20 20 2f 2a 20 46 69 6e 69 61 6c 6c   }..  /* Finiall
24650 79 2c 20 64 65 6c 65 74 65 20 77 68 61 74 20 69  y, delete what i
24660 73 20 6c 65 66 74 20 6f 66 20 74 68 65 20 73 75  s left of the su
24670 62 71 75 65 72 79 20 61 6e 64 20 72 65 74 75 72  bquery and retur
24680 6e 0a 20 20 2a 2a 20 73 75 63 63 65 73 73 2e 0a  n.  ** success..
24690 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 53 65    */.  sqlite3Se
246a0 6c 65 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70  lectDelete(db, p
246b0 53 75 62 31 29 3b 0a 0a 23 69 66 20 53 45 4c 45  Sub1);..#if SELE
246c0 43 54 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a  CTTRACE_ENABLED.
246d0 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 65 6c    if( sqlite3Sel
246e0 65 63 74 54 72 61 63 65 20 26 20 30 78 31 30 30  ectTrace & 0x100
246f0 20 29 7b 0a 20 20 20 20 53 45 4c 45 43 54 54 52   ){.    SELECTTR
24700 41 43 45 28 30 78 31 30 30 2c 70 50 61 72 73 65  ACE(0x100,pParse
24710 2c 70 2c 28 22 41 66 74 65 72 20 66 6c 61 74 74  ,p,("After flatt
24720 65 6e 69 6e 67 3a 5c 6e 22 29 29 3b 0a 20 20 20  ening:\n"));.   
24730 20 73 71 6c 69 74 65 33 54 72 65 65 56 69 65 77   sqlite3TreeView
24740 53 65 6c 65 63 74 28 30 2c 20 70 2c 20 30 29 3b  Select(0, p, 0);
24750 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 72  .  }.#endif..  r
24760 65 74 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69  eturn 1;.}.#endi
24770 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51  f /* !defined(SQ
24780 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
24790 52 59 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28  RY) || !defined(
247a0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57  SQLITE_OMIT_VIEW
247b0 29 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 20 73 74  ) */../*.** A st
247c0 72 75 63 74 75 72 65 20 74 6f 20 6b 65 65 70 20  ructure to keep 
247d0 74 72 61 63 6b 20 6f 66 20 61 6c 6c 20 6f 66 20  track of all of 
247e0 74 68 65 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65  the column value
247f0 73 20 74 68 61 74 20 61 72 65 20 66 69 78 65 64  s that are fixed
24800 20 74 6f 0a 2a 2a 20 61 20 6b 6e 6f 77 6e 20 76   to.** a known v
24810 61 6c 75 65 20 64 75 65 20 74 6f 20 57 48 45 52  alue due to WHER
24820 45 20 63 6c 61 75 73 65 20 63 6f 6e 73 74 72 61  E clause constra
24830 69 6e 74 73 20 6f 66 20 74 68 65 20 66 6f 72 6d  ints of the form
24840 20 43 4f 4c 55 4d 4e 3d 56 41 4c 55 45 2e 0a 2a   COLUMN=VALUE..*
24850 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  /.typedef struct
24860 20 57 68 65 72 65 43 6f 6e 73 74 20 57 68 65 72   WhereConst Wher
24870 65 43 6f 6e 73 74 3b 0a 73 74 72 75 63 74 20 57  eConst;.struct W
24880 68 65 72 65 43 6f 6e 73 74 20 7b 0a 20 20 50 61  hereConst {.  Pa
24890 72 73 65 20 2a 70 50 61 72 73 65 3b 20 20 20 2f  rse *pParse;   /
248a0 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
248b0 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f 6e 73  t */.  int nCons
248c0 74 3b 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65  t;      /* Numbe
248d0 72 20 66 6f 72 20 43 4f 4c 55 4d 4e 3d 43 4f 4e  r for COLUMN=CON
248e0 53 54 41 4e 54 20 74 65 72 6d 73 20 2a 2f 0a 20  STANT terms */. 
248f0 20 69 6e 74 20 6e 43 68 6e 67 3b 20 20 20 20 20   int nChng;     
24900 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74    /* Number of t
24910 69 6d 65 73 20 61 20 63 6f 6e 73 74 61 6e 74 20  imes a constant 
24920 69 73 20 70 72 6f 70 61 67 61 74 65 64 20 2a 2f  is propagated */
24930 0a 20 20 45 78 70 72 20 2a 2a 61 70 45 78 70 72  .  Expr **apExpr
24940 3b 20 20 20 2f 2a 20 5b 69 2a 32 5d 20 69 73 20  ;   /* [i*2] is 
24950 43 4f 4c 55 4d 4e 20 61 6e 64 20 5b 69 2a 32 2b  COLUMN and [i*2+
24960 31 5d 20 69 73 20 56 41 4c 55 45 20 2a 2f 0a 7d  1] is VALUE */.}
24970 3b 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6e  ;../*.** Add a n
24980 65 77 20 65 6e 74 72 79 20 74 6f 20 74 68 65 20  ew entry to the 
24990 70 43 6f 6e 73 74 20 6f 62 6a 65 63 74 2e 20 20  pConst object.  
249a0 45 78 63 65 70 74 2c 20 64 6f 20 6e 6f 74 20 61  Except, do not a
249b0 64 64 20 64 75 70 6c 69 63 61 74 65 0a 2a 2a 20  dd duplicate.** 
249c0 70 43 6f 6c 75 6d 6e 20 65 6e 74 69 72 65 73 2e  pColumn entires.
249d0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
249e0 63 6f 6e 73 74 49 6e 73 65 72 74 28 0a 20 20 57  constInsert(.  W
249f0 68 65 72 65 43 6f 6e 73 74 20 2a 70 43 6f 6e 73  hereConst *pCons
24a00 74 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57  t,      /* The W
24a10 68 65 72 65 43 6f 6e 73 74 20 69 6e 74 6f 20 77  hereConst into w
24a20 68 69 63 68 20 77 65 20 61 72 65 20 69 6e 73 65  hich we are inse
24a30 72 74 69 6e 67 20 2a 2f 0a 20 20 45 78 70 72 20  rting */.  Expr 
24a40 2a 70 43 6f 6c 75 6d 6e 2c 20 20 20 20 20 20 20  *pColumn,       
24a50 20 20 20 20 2f 2a 20 54 68 65 20 43 4f 4c 55 4d      /* The COLUM
24a60 4e 20 70 61 72 74 20 6f 66 20 74 68 65 20 63 6f  N part of the co
24a70 6e 73 74 72 61 69 6e 74 20 2a 2f 0a 20 20 45 78  nstraint */.  Ex
24a80 70 72 20 2a 70 56 61 6c 75 65 20 20 20 20 20 20  pr *pValue      
24a90 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 56 41         /* The VA
24aa0 4c 55 45 20 70 61 72 74 20 6f 66 20 74 68 65 20  LUE part of the 
24ab0 63 6f 6e 73 74 72 61 69 6e 74 20 2a 2f 0a 29 7b  constraint */.){
24ac0 0a 20 20 69 6e 74 20 69 3b 0a 20 20 61 73 73 65  .  int i;.  asse
24ad0 72 74 28 20 70 43 6f 6c 75 6d 6e 2d 3e 6f 70 3d  rt( pColumn->op=
24ae0 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 0a 20  =TK_COLUMN );.. 
24af0 20 2f 2a 20 32 30 31 38 2d 31 30 2d 32 35 20 74   /* 2018-10-25 t
24b00 69 63 6b 65 74 20 5b 63 66 35 65 64 32 30 66 5d  icket [cf5ed20f]
24b10 0a 20 20 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20  .  ** Make sure 
24b20 74 68 65 20 73 61 6d 65 20 70 43 6f 6c 75 6d 6e  the same pColumn
24b30 20 69 73 20 6e 6f 74 20 69 6e 73 65 72 74 65 64   is not inserted
24b40 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 63 65 20   more than once 
24b50 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  */.  for(i=0; i<
24b60 70 43 6f 6e 73 74 2d 3e 6e 43 6f 6e 73 74 3b 20  pConst->nConst; 
24b70 69 2b 2b 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20  i++){.    const 
24b80 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70 43  Expr *pExpr = pC
24b90 6f 6e 73 74 2d 3e 61 70 45 78 70 72 5b 69 2a 32  onst->apExpr[i*2
24ba0 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ];.    assert( p
24bb0 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c  Expr->op==TK_COL
24bc0 55 4d 4e 20 29 3b 0a 20 20 20 20 69 66 28 20 70  UMN );.    if( p
24bd0 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 70 43  Expr->iTable==pC
24be0 6f 6c 75 6d 6e 2d 3e 69 54 61 62 6c 65 0a 20 20  olumn->iTable.  
24bf0 20 20 20 26 26 20 70 45 78 70 72 2d 3e 69 43 6f     && pExpr->iCo
24c00 6c 75 6d 6e 3d 3d 70 43 6f 6c 75 6d 6e 2d 3e 69  lumn==pColumn->i
24c10 43 6f 6c 75 6d 6e 0a 20 20 20 20 29 7b 0a 20 20  Column.    ){.  
24c20 20 20 20 20 72 65 74 75 72 6e 3b 20 20 2f 2a 20      return;  /* 
24c30 41 6c 72 65 61 64 79 20 70 72 65 73 65 6e 74 2e  Already present.
24c40 20 20 52 65 74 75 72 6e 20 77 69 74 68 6f 75 74    Return without
24c50 20 64 6f 69 6e 67 20 61 6e 79 74 68 69 6e 67 2e   doing anything.
24c60 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20   */.    }.  }.. 
24c70 20 70 43 6f 6e 73 74 2d 3e 6e 43 6f 6e 73 74 2b   pConst->nConst+
24c80 2b 3b 0a 20 20 70 43 6f 6e 73 74 2d 3e 61 70 45  +;.  pConst->apE
24c90 78 70 72 20 3d 20 73 71 6c 69 74 65 33 44 62 52  xpr = sqlite3DbR
24ca0 65 61 6c 6c 6f 63 4f 72 46 72 65 65 28 70 43 6f  eallocOrFree(pCo
24cb0 6e 73 74 2d 3e 70 50 61 72 73 65 2d 3e 64 62 2c  nst->pParse->db,
24cc0 20 70 43 6f 6e 73 74 2d 3e 61 70 45 78 70 72 2c   pConst->apExpr,
24cd0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
24ce0 20 20 20 20 20 20 20 20 20 20 70 43 6f 6e 73 74            pConst
24cf0 2d 3e 6e 43 6f 6e 73 74 2a 32 2a 73 69 7a 65 6f  ->nConst*2*sizeo
24d00 66 28 45 78 70 72 2a 29 29 3b 0a 20 20 69 66 28  f(Expr*));.  if(
24d10 20 70 43 6f 6e 73 74 2d 3e 61 70 45 78 70 72 3d   pConst->apExpr=
24d20 3d 30 20 29 7b 0a 20 20 20 20 70 43 6f 6e 73 74  =0 ){.    pConst
24d30 2d 3e 6e 43 6f 6e 73 74 20 3d 20 30 3b 0a 20 20  ->nConst = 0;.  
24d40 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66 28 20 45  }else{.    if( E
24d50 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
24d60 56 61 6c 75 65 2c 20 45 50 5f 46 69 78 65 64 43  Value, EP_FixedC
24d70 6f 6c 29 20 29 20 70 56 61 6c 75 65 20 3d 20 70  ol) ) pValue = p
24d80 56 61 6c 75 65 2d 3e 70 4c 65 66 74 3b 0a 20 20  Value->pLeft;.  
24d90 20 20 70 43 6f 6e 73 74 2d 3e 61 70 45 78 70 72    pConst->apExpr
24da0 5b 70 43 6f 6e 73 74 2d 3e 6e 43 6f 6e 73 74 2a  [pConst->nConst*
24db0 32 2d 32 5d 20 3d 20 70 43 6f 6c 75 6d 6e 3b 0a  2-2] = pColumn;.
24dc0 20 20 20 20 70 43 6f 6e 73 74 2d 3e 61 70 45 78      pConst->apEx
24dd0 70 72 5b 70 43 6f 6e 73 74 2d 3e 6e 43 6f 6e 73  pr[pConst->nCons
24de0 74 2a 32 2d 31 5d 20 3d 20 70 56 61 6c 75 65 3b  t*2-1] = pValue;
24df0 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69  .  }.}../*.** Fi
24e00 6e 64 20 61 6c 6c 20 74 65 72 6d 73 20 6f 66 20  nd all terms of 
24e10 43 4f 4c 55 4d 4e 3d 56 41 4c 55 45 20 6f 72 20  COLUMN=VALUE or 
24e20 56 41 4c 55 45 3d 43 4f 4c 55 4d 4e 20 69 6e 20  VALUE=COLUMN in 
24e30 70 45 78 70 72 20 77 68 65 72 65 20 56 41 4c 55  pExpr where VALU
24e40 45 0a 2a 2a 20 69 73 20 61 20 63 6f 6e 73 74 61  E.** is a consta
24e50 6e 74 20 65 78 70 72 65 73 73 69 6f 6e 20 61 6e  nt expression an
24e60 64 20 77 68 65 72 65 20 74 68 65 20 74 65 72 6d  d where the term
24e70 20 6d 75 73 74 20 62 65 20 74 72 75 65 20 62 65   must be true be
24e80 63 61 75 73 65 20 69 74 0a 2a 2a 20 69 73 20 70  cause it.** is p
24e90 61 72 74 20 6f 66 20 74 68 65 20 41 4e 44 2d 63  art of the AND-c
24ea0 6f 6e 6e 65 63 74 65 64 20 74 65 72 6d 73 20 6f  onnected terms o
24eb0 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
24ec0 2e 20 20 46 6f 72 20 65 61 63 68 20 74 65 72 6d  .  For each term
24ed0 0a 2a 2a 20 66 6f 75 6e 64 2c 20 61 64 64 20 69  .** found, add i
24ee0 74 20 74 6f 20 74 68 65 20 70 43 6f 6e 73 74 20  t to the pConst 
24ef0 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73 74  structure..*/.st
24f00 61 74 69 63 20 76 6f 69 64 20 66 69 6e 64 43 6f  atic void findCo
24f10 6e 73 74 49 6e 57 68 65 72 65 28 57 68 65 72 65  nstInWhere(Where
24f20 43 6f 6e 73 74 20 2a 70 43 6f 6e 73 74 2c 20 45  Const *pConst, E
24f30 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 45  xpr *pExpr){.  E
24f40 78 70 72 20 2a 70 52 69 67 68 74 2c 20 2a 70 4c  xpr *pRight, *pL
24f50 65 66 74 3b 0a 20 20 69 66 28 20 70 45 78 70 72  eft;.  if( pExpr
24f60 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
24f70 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65  if( ExprHasPrope
24f80 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 46 72  rty(pExpr, EP_Fr
24f90 6f 6d 4a 6f 69 6e 29 20 29 20 72 65 74 75 72 6e  omJoin) ) return
24fa0 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f  ;.  if( pExpr->o
24fb0 70 3d 3d 54 4b 5f 41 4e 44 20 29 7b 0a 20 20 20  p==TK_AND ){.   
24fc0 20 66 69 6e 64 43 6f 6e 73 74 49 6e 57 68 65 72   findConstInWher
24fd0 65 28 70 43 6f 6e 73 74 2c 20 70 45 78 70 72 2d  e(pConst, pExpr-
24fe0 3e 70 52 69 67 68 74 29 3b 0a 20 20 20 20 66 69  >pRight);.    fi
24ff0 6e 64 43 6f 6e 73 74 49 6e 57 68 65 72 65 28 70  ndConstInWhere(p
25000 43 6f 6e 73 74 2c 20 70 45 78 70 72 2d 3e 70 4c  Const, pExpr->pL
25010 65 66 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  eft);.    return
25020 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 45 78 70  ;.  }.  if( pExp
25030 72 2d 3e 6f 70 21 3d 54 4b 5f 45 51 20 29 20 72  r->op!=TK_EQ ) r
25040 65 74 75 72 6e 3b 0a 20 20 70 52 69 67 68 74 20  eturn;.  pRight 
25050 3d 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 3b  = pExpr->pRight;
25060 0a 20 20 70 4c 65 66 74 20 3d 20 70 45 78 70 72  .  pLeft = pExpr
25070 2d 3e 70 4c 65 66 74 3b 0a 20 20 61 73 73 65 72  ->pLeft;.  asser
25080 74 28 20 70 52 69 67 68 74 21 3d 30 20 29 3b 0a  t( pRight!=0 );.
25090 20 20 61 73 73 65 72 74 28 20 70 4c 65 66 74 21    assert( pLeft!
250a0 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 52 69 67  =0 );.  if( pRig
250b0 68 74 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d  ht->op==TK_COLUM
250c0 4e 0a 20 20 20 26 26 20 21 45 78 70 72 48 61 73  N.   && !ExprHas
250d0 50 72 6f 70 65 72 74 79 28 70 52 69 67 68 74 2c  Property(pRight,
250e0 20 45 50 5f 46 69 78 65 64 43 6f 6c 29 0a 20 20   EP_FixedCol).  
250f0 20 26 26 20 73 71 6c 69 74 65 33 45 78 70 72 49   && sqlite3ExprI
25100 73 43 6f 6e 73 74 61 6e 74 28 70 4c 65 66 74 29  sConstant(pLeft)
25110 0a 20 20 20 26 26 20 73 71 6c 69 74 65 33 49 73  .   && sqlite3Is
25120 42 69 6e 61 72 79 28 73 71 6c 69 74 65 33 42 69  Binary(sqlite3Bi
25130 6e 61 72 79 43 6f 6d 70 61 72 65 43 6f 6c 6c 53  naryCompareCollS
25140 65 71 28 70 43 6f 6e 73 74 2d 3e 70 50 61 72 73  eq(pConst->pPars
25150 65 2c 70 4c 65 66 74 2c 70 52 69 67 68 74 29 29  e,pLeft,pRight))
25160 0a 20 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 49  .  ){.    constI
25170 6e 73 65 72 74 28 70 43 6f 6e 73 74 2c 20 70 52  nsert(pConst, pR
25180 69 67 68 74 2c 20 70 4c 65 66 74 29 3b 0a 20 20  ight, pLeft);.  
25190 7d 65 6c 73 65 0a 20 20 69 66 28 20 70 4c 65 66  }else.  if( pLef
251a0 74 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e  t->op==TK_COLUMN
251b0 0a 20 20 20 26 26 20 21 45 78 70 72 48 61 73 50  .   && !ExprHasP
251c0 72 6f 70 65 72 74 79 28 70 4c 65 66 74 2c 20 45  roperty(pLeft, E
251d0 50 5f 46 69 78 65 64 43 6f 6c 29 0a 20 20 20 26  P_FixedCol).   &
251e0 26 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 43  & sqlite3ExprIsC
251f0 6f 6e 73 74 61 6e 74 28 70 52 69 67 68 74 29 0a  onstant(pRight).
25200 20 20 20 26 26 20 73 71 6c 69 74 65 33 49 73 42     && sqlite3IsB
25210 69 6e 61 72 79 28 73 71 6c 69 74 65 33 42 69 6e  inary(sqlite3Bin
25220 61 72 79 43 6f 6d 70 61 72 65 43 6f 6c 6c 53 65  aryCompareCollSe
25230 71 28 70 43 6f 6e 73 74 2d 3e 70 50 61 72 73 65  q(pConst->pParse
25240 2c 70 4c 65 66 74 2c 70 52 69 67 68 74 29 29 0a  ,pLeft,pRight)).
25250 20 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 49 6e    ){.    constIn
25260 73 65 72 74 28 70 43 6f 6e 73 74 2c 20 70 4c 65  sert(pConst, pLe
25270 66 74 2c 20 70 52 69 67 68 74 29 3b 0a 20 20 7d  ft, pRight);.  }
25280 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69  .}../*.** This i
25290 73 20 61 20 57 61 6c 6b 65 72 20 65 78 70 72 65  s a Walker expre
252a0 73 73 69 6f 6e 20 63 61 6c 6c 62 61 63 6b 2e 20  ssion callback. 
252b0 20 70 45 78 70 72 20 69 73 20 61 20 63 61 6e 64   pExpr is a cand
252c0 69 64 61 74 65 20 65 78 70 72 65 73 73 69 6f 6e  idate expression
252d0 0a 2a 2a 20 74 6f 20 62 65 20 72 65 70 6c 61 63  .** to be replac
252e0 65 64 20 62 79 20 61 20 76 61 6c 75 65 2e 20 20  ed by a value.  
252f0 49 66 20 70 45 78 70 72 20 69 73 20 65 71 75 69  If pExpr is equi
25300 76 61 6c 65 6e 74 20 74 6f 20 6f 6e 65 20 6f 66  valent to one of
25310 20 74 68 65 0a 2a 2a 20 63 6f 6c 75 6d 6e 73 20   the.** columns 
25320 6e 61 6d 65 64 20 69 6e 20 70 57 61 6c 6b 65 72  named in pWalker
25330 2d 3e 75 2e 70 43 6f 6e 73 74 2c 20 74 68 65 6e  ->u.pConst, then
25340 20 6f 76 65 72 77 72 69 74 65 20 69 74 20 77 69   overwrite it wi
25350 74 68 20 69 74 73 0a 2a 2a 20 63 6f 72 72 65 73  th its.** corres
25360 70 6f 6e 64 69 6e 67 20 76 61 6c 75 65 2e 0a 2a  ponding value..*
25370 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f  /.static int pro
25380 70 61 67 61 74 65 43 6f 6e 73 74 61 6e 74 45 78  pagateConstantEx
25390 70 72 52 65 77 72 69 74 65 28 57 61 6c 6b 65 72  prRewrite(Walker
253a0 20 2a 70 57 61 6c 6b 65 72 2c 20 45 78 70 72 20   *pWalker, Expr 
253b0 2a 70 45 78 70 72 29 7b 0a 20 20 69 6e 74 20 69  *pExpr){.  int i
253c0 3b 0a 20 20 57 68 65 72 65 43 6f 6e 73 74 20 2a  ;.  WhereConst *
253d0 70 43 6f 6e 73 74 3b 0a 20 20 69 66 28 20 70 45  pConst;.  if( pE
253e0 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55  xpr->op!=TK_COLU
253f0 4d 4e 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f  MN ) return WRC_
25400 43 6f 6e 74 69 6e 75 65 3b 0a 20 20 69 66 28 20  Continue;.  if( 
25410 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
25420 70 45 78 70 72 2c 20 45 50 5f 46 69 78 65 64 43  pExpr, EP_FixedC
25430 6f 6c 29 20 29 20 72 65 74 75 72 6e 20 57 52 43  ol) ) return WRC
25440 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20 20 70 43 6f  _Continue;.  pCo
25450 6e 73 74 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 75  nst = pWalker->u
25460 2e 70 43 6f 6e 73 74 3b 0a 20 20 66 6f 72 28 69  .pConst;.  for(i
25470 3d 30 3b 20 69 3c 70 43 6f 6e 73 74 2d 3e 6e 43  =0; i<pConst->nC
25480 6f 6e 73 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  onst; i++){.    
25490 45 78 70 72 20 2a 70 43 6f 6c 75 6d 6e 20 3d 20  Expr *pColumn = 
254a0 70 43 6f 6e 73 74 2d 3e 61 70 45 78 70 72 5b 69  pConst->apExpr[i
254b0 2a 32 5d 3b 0a 20 20 20 20 69 66 28 20 70 43 6f  *2];.    if( pCo
254c0 6c 75 6d 6e 3d 3d 70 45 78 70 72 20 29 20 63 6f  lumn==pExpr ) co
254d0 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20  ntinue;.    if( 
254e0 70 43 6f 6c 75 6d 6e 2d 3e 69 54 61 62 6c 65 21  pColumn->iTable!
254f0 3d 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 29  =pExpr->iTable )
25500 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69   continue;.    i
25510 66 28 20 70 43 6f 6c 75 6d 6e 2d 3e 69 43 6f 6c  f( pColumn->iCol
25520 75 6d 6e 21 3d 70 45 78 70 72 2d 3e 69 43 6f 6c  umn!=pExpr->iCol
25530 75 6d 6e 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  umn ) continue;.
25540 20 20 20 20 2f 2a 20 41 20 6d 61 74 63 68 20 69      /* A match i
25550 73 20 66 6f 75 6e 64 2e 20 20 41 64 64 20 74 68  s found.  Add th
25560 65 20 45 50 5f 46 69 78 65 64 43 6f 6c 20 70 72  e EP_FixedCol pr
25570 6f 70 65 72 74 79 20 2a 2f 0a 20 20 20 20 70 43  operty */.    pC
25580 6f 6e 73 74 2d 3e 6e 43 68 6e 67 2b 2b 3b 0a 20  onst->nChng++;. 
25590 20 20 20 45 78 70 72 43 6c 65 61 72 50 72 6f 70     ExprClearProp
255a0 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 4c  erty(pExpr, EP_L
255b0 65 61 66 29 3b 0a 20 20 20 20 45 78 70 72 53 65  eaf);.    ExprSe
255c0 74 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  tProperty(pExpr,
255d0 20 45 50 5f 46 69 78 65 64 43 6f 6c 29 3b 0a 20   EP_FixedCol);. 
255e0 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72     assert( pExpr
255f0 2d 3e 70 4c 65 66 74 3d 3d 30 20 29 3b 0a 20 20  ->pLeft==0 );.  
25600 20 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 20 3d    pExpr->pLeft =
25610 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28   sqlite3ExprDup(
25620 70 43 6f 6e 73 74 2d 3e 70 50 61 72 73 65 2d 3e  pConst->pParse->
25630 64 62 2c 20 70 43 6f 6e 73 74 2d 3e 61 70 45 78  db, pConst->apEx
25640 70 72 5b 69 2a 32 2b 31 5d 2c 20 30 29 3b 0a 20  pr[i*2+1], 0);. 
25650 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20     break;.  }.  
25660 72 65 74 75 72 6e 20 57 52 43 5f 50 72 75 6e 65  return WRC_Prune
25670 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 57  ;.}../*.** The W
25680 48 45 52 45 2d 63 6c 61 75 73 65 20 63 6f 6e 73  HERE-clause cons
25690 74 61 6e 74 20 70 72 6f 70 61 67 61 74 69 6f 6e  tant propagation
256a0 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 0a 2a   optimization..*
256b0 2a 0a 2a 2a 20 49 66 20 74 68 65 20 57 48 45 52  *.** If the WHER
256c0 45 20 63 6c 61 75 73 65 20 63 6f 6e 74 61 69 6e  E clause contain
256d0 73 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 66  s terms of the f
256e0 6f 72 6d 20 43 4f 4c 55 4d 4e 3d 43 4f 4e 53 54  orm COLUMN=CONST
256f0 41 4e 54 20 6f 72 0a 2a 2a 20 43 4f 4e 53 54 41  ANT or.** CONSTA
25700 4e 54 3d 43 4f 4c 55 4d 4e 20 74 68 61 74 20 6d  NT=COLUMN that m
25710 75 73 74 20 62 65 20 74 72 65 65 20 28 69 6e 20  ust be tree (in 
25720 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 69 66 20  other words, if 
25730 74 68 65 20 74 65 72 6d 73 20 74 6f 70 2d 6c 65  the terms top-le
25740 76 65 6c 0a 2a 2a 20 41 4e 44 2d 63 6f 6e 6e 65  vel.** AND-conne
25750 63 74 65 64 20 74 65 72 6d 73 20 74 68 61 74 20  cted terms that 
25760 61 72 65 20 6e 6f 74 20 70 61 72 74 20 6f 66 20  are not part of 
25770 61 20 4f 4e 20 63 6c 61 75 73 65 20 66 72 6f 6d  a ON clause from
25780 20 61 20 4c 45 46 54 20 4a 4f 49 4e 29 0a 2a 2a   a LEFT JOIN).**
25790 20 74 68 65 6e 20 74 68 72 6f 75 67 68 6f 75 74   then throughout
257a0 20 74 68 65 20 71 75 65 72 79 20 72 65 70 6c 61   the query repla
257b0 63 65 20 61 6c 6c 20 6f 74 68 65 72 20 6f 63 63  ce all other occ
257c0 75 72 72 65 6e 63 65 73 20 6f 66 20 43 4f 4c 55  urrences of COLU
257d0 4d 4e 0a 2a 2a 20 77 69 74 68 20 43 4f 4e 53 54  MN.** with CONST
257e0 41 4e 54 20 77 69 74 68 69 6e 20 74 68 65 20 57  ANT within the W
257f0 48 45 52 45 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a  HERE clause..**.
25800 2a 2a 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20  ** For example, 
25810 74 68 65 20 71 75 65 72 79 3a 0a 2a 2a 0a 2a 2a  the query:.**.**
25820 20 20 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46        SELECT * F
25830 52 4f 4d 20 74 31 2c 20 74 32 2c 20 74 33 20 57  ROM t1, t2, t3 W
25840 48 45 52 45 20 74 31 2e 61 3d 33 39 20 41 4e 44  HERE t1.a=39 AND
25850 20 74 32 2e 62 3d 74 31 2e 61 20 41 4e 44 20 74   t2.b=t1.a AND t
25860 33 2e 63 3d 74 32 2e 62 0a 2a 2a 0a 2a 2a 20 49  3.c=t2.b.**.** I
25870 73 20 74 72 61 6e 73 66 6f 72 6d 65 64 20 69 6e  s transformed in
25880 74 6f 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 53 45  to.**.**      SE
25890 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 2c 20  LECT * FROM t1, 
258a0 74 32 2c 20 74 33 20 57 48 45 52 45 20 74 31 2e  t2, t3 WHERE t1.
258b0 61 3d 33 39 20 41 4e 44 20 74 32 2e 62 3d 33 39  a=39 AND t2.b=39
258c0 20 41 4e 44 20 74 33 2e 63 3d 33 39 0a 2a 2a 0a   AND t3.c=39.**.
258d0 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69  ** Return true i
258e0 66 20 61 6e 79 20 74 72 61 6e 73 66 6f 72 6d 61  f any transforma
258f0 74 69 6f 6e 73 20 77 68 65 72 65 20 6d 61 64 65  tions where made
25900 20 61 6e 64 20 66 61 6c 73 65 20 69 66 20 6e 6f   and false if no
25910 74 2e 0a 2a 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65  t..**.** Impleme
25920 6e 74 61 74 69 6f 6e 20 6e 6f 74 65 3a 20 20 43  ntation note:  C
25930 6f 6e 73 74 61 6e 74 20 70 72 6f 70 61 67 61 74  onstant propagat
25940 69 6f 6e 20 69 73 20 74 72 69 63 6b 79 20 64 75  ion is tricky du
25950 65 20 74 6f 20 61 66 66 69 6e 69 74 79 0a 2a 2a  e to affinity.**
25960 20 61 6e 64 20 63 6f 6c 6c 61 74 69 6e 67 20 73   and collating s
25970 65 71 75 65 6e 63 65 20 69 6e 74 65 72 61 63 74  equence interact
25980 69 6f 6e 73 2e 20 20 43 6f 6e 73 69 64 65 72 20  ions.  Consider 
25990 74 68 69 73 20 65 78 61 6d 70 6c 65 3a 0a 2a 2a  this example:.**
259a0 0a 2a 2a 20 20 20 20 43 52 45 41 54 45 20 54 41  .**    CREATE TA
259b0 42 4c 45 20 74 31 28 61 20 49 4e 54 2c 62 20 54  BLE t1(a INT,b T
259c0 45 58 54 29 3b 0a 2a 2a 20 20 20 20 49 4e 53 45  EXT);.**    INSE
259d0 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45  RT INTO t1 VALUE
259e0 53 28 31 32 33 2c 27 30 31 32 33 27 29 3b 0a 2a  S(123,'0123');.*
259f0 2a 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52  *    SELECT * FR
25a00 4f 4d 20 74 31 20 57 48 45 52 45 20 61 3d 31 32  OM t1 WHERE a=12
25a10 33 20 41 4e 44 20 62 3d 61 3b 0a 2a 2a 20 20 20  3 AND b=a;.**   
25a20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
25a30 31 20 57 48 45 52 45 20 61 3d 31 32 33 20 41 4e  1 WHERE a=123 AN
25a40 44 20 62 3d 31 32 33 3b 0a 2a 2a 0a 2a 2a 20 54  D b=123;.**.** T
25a50 68 65 20 74 77 6f 20 53 45 4c 45 43 54 20 73 74  he two SELECT st
25a60 61 74 65 6d 65 6e 74 73 20 61 62 6f 76 65 20 73  atements above s
25a70 68 6f 75 6c 64 20 72 65 74 75 72 6e 20 64 69 66  hould return dif
25a80 66 65 72 65 6e 74 20 61 6e 73 77 65 72 73 2e 20  ferent answers. 
25a90 20 62 3d 61 0a 2a 2a 20 69 73 20 61 6c 77 61 79   b=a.** is alway
25aa0 20 74 72 75 65 20 62 65 63 61 75 73 65 20 74 68   true because th
25ab0 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 75 73 65  e comparison use
25ac0 73 20 6e 75 6d 65 72 69 63 20 61 66 66 69 6e 69  s numeric affini
25ad0 74 79 2c 20 62 75 74 20 62 3d 31 32 33 0a 2a 2a  ty, but b=123.**
25ae0 20 69 73 20 66 61 6c 73 65 20 62 65 63 61 75 73   is false becaus
25af0 65 20 69 74 20 75 73 65 73 20 74 65 78 74 20 61  e it uses text a
25b00 66 66 69 6e 69 74 79 20 61 6e 64 20 27 30 31 32  ffinity and '012
25b10 33 27 20 69 73 20 6e 6f 74 20 74 68 65 20 73 61  3' is not the sa
25b20 6d 65 20 61 73 20 27 31 32 33 27 2e 0a 2a 2a 20  me as '123'..** 
25b30 54 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20 74  To work around t
25b40 68 69 73 2c 20 74 68 65 20 65 78 70 72 65 73 73  his, the express
25b50 69 6f 6e 20 74 72 65 65 20 69 73 20 6e 6f 74 20  ion tree is not 
25b60 61 63 74 75 61 6c 6c 79 20 63 68 61 6e 67 65 64  actually changed
25b70 20 66 72 6f 6d 0a 2a 2a 20 22 62 3d 61 22 20 74   from.** "b=a" t
25b80 6f 20 22 62 3d 31 32 33 22 20 62 75 74 20 72 61  o "b=123" but ra
25b90 74 68 65 72 20 74 68 65 20 22 61 22 20 69 6e 20  ther the "a" in 
25ba0 22 62 3d 61 22 20 69 73 20 74 61 67 67 65 64 20  "b=a" is tagged 
25bb0 77 69 74 68 20 45 50 5f 46 69 78 65 64 43 6f 6c  with EP_FixedCol
25bc0 0a 2a 2a 20 61 6e 64 20 74 68 65 20 22 31 32 33  .** and the "123
25bd0 22 20 76 61 6c 75 65 20 69 73 20 68 75 6e 67 20  " value is hung 
25be0 6f 66 66 20 6f 66 20 74 68 65 20 70 4c 65 66 74  off of the pLeft
25bf0 20 70 6f 69 6e 74 65 72 2e 20 20 43 6f 64 65 20   pointer.  Code 
25c00 67 65 6e 65 72 61 74 6f 72 0a 2a 2a 20 72 6f 75  generator.** rou
25c10 74 69 6e 65 73 20 6b 6e 6f 77 20 74 6f 20 67 65  tines know to ge
25c20 6e 65 72 61 74 65 20 74 68 65 20 63 6f 6e 73 74  nerate the const
25c30 61 6e 74 20 22 31 32 33 22 20 69 6e 73 74 65 61  ant "123" instea
25c40 64 20 6f 66 20 6c 6f 6f 6b 69 6e 67 20 75 70 20  d of looking up 
25c50 74 68 65 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 76 61  the.** column va
25c60 6c 75 65 2e 20 20 41 6c 73 6f 2c 20 74 6f 20 61  lue.  Also, to a
25c70 76 6f 69 64 20 63 6f 6c 6c 61 74 69 6f 6e 20 70  void collation p
25c80 72 6f 62 6c 65 6d 73 2c 20 74 68 69 73 20 6f 70  roblems, this op
25c90 74 69 6d 69 7a 61 74 69 6f 6e 20 69 73 0a 2a 2a  timization is.**
25ca0 20 6f 6e 6c 79 20 61 74 74 65 6d 70 74 65 64 20   only attempted 
25cb0 69 66 20 74 68 65 20 22 61 3d 31 32 33 22 20 74  if the "a=123" t
25cc0 65 72 6d 20 75 73 65 73 20 74 68 65 20 64 65 66  erm uses the def
25cd0 61 75 6c 74 20 42 49 4e 41 52 59 20 63 6f 6c 6c  ault BINARY coll
25ce0 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ation..*/.static
25cf0 20 69 6e 74 20 70 72 6f 70 61 67 61 74 65 43 6f   int propagateCo
25d00 6e 73 74 61 6e 74 73 28 0a 20 20 50 61 72 73 65  nstants(.  Parse
25d10 20 2a 70 50 61 72 73 65 2c 20 20 20 2f 2a 20 54   *pParse,   /* T
25d20 68 65 20 70 61 72 73 69 6e 67 20 63 6f 6e 74 65  he parsing conte
25d30 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  xt */.  Select *
25d40 70 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  p        /* The 
25d50 71 75 65 72 79 20 69 6e 20 77 68 69 63 68 20 74  query in which t
25d60 6f 20 70 72 6f 70 61 67 61 74 65 20 63 6f 6e 73  o propagate cons
25d70 74 61 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 57 68  tants */.){.  Wh
25d80 65 72 65 43 6f 6e 73 74 20 78 3b 0a 20 20 57 61  ereConst x;.  Wa
25d90 6c 6b 65 72 20 77 3b 0a 20 20 69 6e 74 20 6e 43  lker w;.  int nC
25da0 68 6e 67 20 3d 20 30 3b 0a 20 20 78 2e 70 50 61  hng = 0;.  x.pPa
25db0 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20  rse = pParse;.  
25dc0 64 6f 7b 0a 20 20 20 20 78 2e 6e 43 6f 6e 73 74  do{.    x.nConst
25dd0 20 3d 20 30 3b 0a 20 20 20 20 78 2e 6e 43 68 6e   = 0;.    x.nChn
25de0 67 20 3d 20 30 3b 0a 20 20 20 20 78 2e 61 70 45  g = 0;.    x.apE
25df0 78 70 72 20 3d 20 30 3b 0a 20 20 20 20 66 69 6e  xpr = 0;.    fin
25e00 64 43 6f 6e 73 74 49 6e 57 68 65 72 65 28 26 78  dConstInWhere(&x
25e10 2c 20 70 2d 3e 70 57 68 65 72 65 29 3b 0a 20 20  , p->pWhere);.  
25e20 20 20 69 66 28 20 78 2e 6e 43 6f 6e 73 74 20 29    if( x.nConst )
25e30 7b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 26  {.      memset(&
25e40 77 2c 20 30 2c 20 73 69 7a 65 6f 66 28 77 29 29  w, 0, sizeof(w))
25e50 3b 0a 20 20 20 20 20 20 77 2e 70 50 61 72 73 65  ;.      w.pParse
25e60 20 3d 20 70 50 61 72 73 65 3b 0a 20 20 20 20 20   = pParse;.     
25e70 20 77 2e 78 45 78 70 72 43 61 6c 6c 62 61 63 6b   w.xExprCallback
25e80 20 3d 20 70 72 6f 70 61 67 61 74 65 43 6f 6e 73   = propagateCons
25e90 74 61 6e 74 45 78 70 72 52 65 77 72 69 74 65 3b  tantExprRewrite;
25ea0 0a 20 20 20 20 20 20 77 2e 78 53 65 6c 65 63 74  .      w.xSelect
25eb0 43 61 6c 6c 62 61 63 6b 20 3d 20 73 71 6c 69 74  Callback = sqlit
25ec0 65 33 53 65 6c 65 63 74 57 61 6c 6b 4e 6f 6f 70  e3SelectWalkNoop
25ed0 3b 0a 20 20 20 20 20 20 77 2e 78 53 65 6c 65 63  ;.      w.xSelec
25ee0 74 43 61 6c 6c 62 61 63 6b 32 20 3d 20 30 3b 0a  tCallback2 = 0;.
25ef0 20 20 20 20 20 20 77 2e 77 61 6c 6b 65 72 44 65        w.walkerDe
25f00 70 74 68 20 3d 20 30 3b 0a 20 20 20 20 20 20 77  pth = 0;.      w
25f10 2e 75 2e 70 43 6f 6e 73 74 20 3d 20 26 78 3b 0a  .u.pConst = &x;.
25f20 20 20 20 20 20 20 73 71 6c 69 74 65 33 57 61 6c        sqlite3Wal
25f30 6b 45 78 70 72 28 26 77 2c 20 70 2d 3e 70 57 68  kExpr(&w, p->pWh
25f40 65 72 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ere);.      sqli
25f50 74 65 33 44 62 46 72 65 65 28 78 2e 70 50 61 72  te3DbFree(x.pPar
25f60 73 65 2d 3e 64 62 2c 20 78 2e 61 70 45 78 70 72  se->db, x.apExpr
25f70 29 3b 0a 20 20 20 20 20 20 6e 43 68 6e 67 20 2b  );.      nChng +
25f80 3d 20 78 2e 6e 43 68 6e 67 3b 0a 20 20 20 20 7d  = x.nChng;.    }
25f90 0a 20 20 7d 77 68 69 6c 65 28 20 78 2e 6e 43 68  .  }while( x.nCh
25fa0 6e 67 20 29 3b 20 20 0a 20 20 72 65 74 75 72 6e  ng );  .  return
25fb0 20 6e 43 68 6e 67 3b 0a 7d 0a 0a 23 69 66 20 21   nChng;.}..#if !
25fc0 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
25fd0 4d 49 54 5f 53 55 42 51 55 45 52 59 29 20 7c 7c  MIT_SUBQUERY) ||
25fe0 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
25ff0 5f 4f 4d 49 54 5f 56 49 45 57 29 0a 2f 2a 0a 2a  _OMIT_VIEW)./*.*
26000 2a 20 4d 61 6b 65 20 63 6f 70 69 65 73 20 6f 66  * Make copies of
26010 20 72 65 6c 65 76 61 6e 74 20 57 48 45 52 45 20   relevant WHERE 
26020 63 6c 61 75 73 65 20 74 65 72 6d 73 20 6f 66 20  clause terms of 
26030 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  the outer query 
26040 69 6e 74 6f 0a 2a 2a 20 74 68 65 20 57 48 45 52  into.** the WHER
26050 45 20 63 6c 61 75 73 65 20 6f 66 20 73 75 62 71  E clause of subq
26060 75 65 72 79 2e 20 20 45 78 61 6d 70 6c 65 3a 0a  uery.  Example:.
26070 2a 2a 0a 2a 2a 20 20 20 20 53 45 4c 45 43 54 20  **.**    SELECT 
26080 2a 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20 61  * FROM (SELECT a
26090 20 41 53 20 78 2c 20 63 2d 64 20 41 53 20 79 20   AS x, c-d AS y 
260a0 46 52 4f 4d 20 74 31 29 20 57 48 45 52 45 20 78  FROM t1) WHERE x
260b0 3d 35 20 41 4e 44 20 79 3d 31 30 3b 0a 2a 2a 0a  =5 AND y=10;.**.
260c0 2a 2a 20 54 72 61 6e 73 66 6f 72 6d 65 64 20 69  ** Transformed i
260d0 6e 74 6f 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 53 45  nto:.**.**    SE
260e0 4c 45 43 54 20 2a 20 46 52 4f 4d 20 28 53 45 4c  LECT * FROM (SEL
260f0 45 43 54 20 61 20 41 53 20 78 2c 20 63 2d 64 20  ECT a AS x, c-d 
26100 41 53 20 79 20 46 52 4f 4d 20 74 31 20 57 48 45  AS y FROM t1 WHE
26110 52 45 20 61 3d 35 20 41 4e 44 20 63 2d 64 3d 31  RE a=5 AND c-d=1
26120 30 29 0a 2a 2a 20 20 20 20 20 57 48 45 52 45 20  0).**     WHERE 
26130 78 3d 35 20 41 4e 44 20 79 3d 31 30 3b 0a 2a 2a  x=5 AND y=10;.**
26140 0a 2a 2a 20 54 68 65 20 68 6f 70 65 20 69 73 20  .** The hope is 
26150 74 68 61 74 20 74 68 65 20 74 65 72 6d 73 20 61  that the terms a
26160 64 64 65 64 20 74 6f 20 74 68 65 20 69 6e 6e 65  dded to the inne
26170 72 20 71 75 65 72 79 20 77 69 6c 6c 20 6d 61 6b  r query will mak
26180 65 20 69 74 20 6d 6f 72 65 0a 2a 2a 20 65 66 66  e it more.** eff
26190 69 63 69 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 44 6f  icient..**.** Do
261a0 20 6e 6f 74 20 61 74 74 65 6d 70 74 20 74 68 69   not attempt thi
261b0 73 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69  s optimization i
261c0 66 3a 0a 2a 2a 0a 2a 2a 20 20 20 28 31 29 20 28  f:.**.**   (1) (
261d0 2a 2a 20 54 68 69 73 20 72 65 73 74 72 69 63 74  ** This restrict
261e0 69 6f 6e 20 77 61 73 20 72 65 6d 6f 76 65 64 20  ion was removed 
261f0 6f 6e 20 32 30 31 37 2d 30 39 2d 32 39 2e 20 20  on 2017-09-29.  
26200 57 65 20 75 73 65 64 20 74 6f 0a 2a 2a 20 20 20  We used to.**   
26210 20 20 20 20 20 20 20 20 64 69 73 61 6c 6c 6f 77          disallow
26220 20 74 68 69 73 20 6f 70 74 69 6d 69 7a 61 74 69   this optimizati
26230 6f 6e 20 66 6f 72 20 61 67 67 72 65 67 61 74 65  on for aggregate
26240 20 73 75 62 71 75 65 72 69 65 73 2c 20 62 75 74   subqueries, but
26250 20 6e 6f 77 0a 2a 2a 20 20 20 20 20 20 20 20 20   now.**         
26260 20 20 69 74 20 69 73 20 61 6c 6c 6f 77 65 64 20    it is allowed 
26270 62 79 20 70 75 74 74 69 6e 67 20 74 68 65 20 65  by putting the e
26280 78 74 72 61 20 74 65 72 6d 73 20 6f 6e 20 74 68  xtra terms on th
26290 65 20 48 41 56 49 4e 47 20 63 6c 61 75 73 65 2e  e HAVING clause.
262a0 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 54 68  .**           Th
262b0 65 20 61 64 64 65 64 20 48 41 56 49 4e 47 20 63  e added HAVING c
262c0 6c 61 75 73 65 20 69 73 20 70 6f 69 6e 74 6c 65  lause is pointle
262d0 73 73 20 69 66 20 74 68 65 20 73 75 62 71 75 65  ss if the subque
262e0 72 79 20 6c 61 63 6b 73 0a 2a 2a 20 20 20 20 20  ry lacks.**     
262f0 20 20 20 20 20 20 61 20 47 52 4f 55 50 20 42 59        a GROUP BY
26300 20 63 6c 61 75 73 65 2e 20 20 42 75 74 20 73 75   clause.  But su
26310 63 68 20 61 20 48 41 56 49 4e 47 20 63 6c 61 75  ch a HAVING clau
26320 73 65 20 69 73 20 61 6c 73 6f 20 68 61 72 6d 6c  se is also harml
26330 65 73 73 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ess.**          
26340 20 73 6f 20 74 68 65 72 65 20 64 6f 65 73 20 6e   so there does n
26350 6f 74 20 61 70 70 65 61 72 20 74 6f 20 62 65 20  ot appear to be 
26360 61 6e 79 20 72 65 61 73 6f 6e 20 74 6f 20 61 64  any reason to ad
26370 64 20 65 78 74 72 61 20 6c 6f 67 69 63 0a 2a 2a  d extra logic.**
26380 20 20 20 20 20 20 20 20 20 20 20 74 6f 20 73 75             to su
26390 70 70 72 65 73 73 20 69 74 2e 20 2a 2a 29 0a 2a  ppress it. **).*
263a0 2a 0a 2a 2a 20 20 20 28 32 29 20 54 68 65 20 69  *.**   (2) The i
263b0 6e 6e 65 72 20 71 75 65 72 79 20 69 73 20 74 68  nner query is th
263c0 65 20 72 65 63 75 72 73 69 76 65 20 70 61 72 74  e recursive part
263d0 20 6f 66 20 61 20 63 6f 6d 6d 6f 6e 20 74 61 62   of a common tab
263e0 6c 65 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a  le expression..*
263f0 2a 0a 2a 2a 20 20 20 28 33 29 20 54 68 65 20 69  *.**   (3) The i
26400 6e 6e 65 72 20 71 75 65 72 79 20 68 61 73 20 61  nner query has a
26410 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 20 28 73   LIMIT clause (s
26420 69 6e 63 65 20 74 68 65 20 63 68 61 6e 67 65 73  ince the changes
26430 20 74 6f 20 74 68 65 20 57 48 45 52 45 0a 2a 2a   to the WHERE.**
26440 20 20 20 20 20 20 20 63 6c 61 75 73 65 20 77 6f         clause wo
26450 75 6c 64 20 63 68 61 6e 67 65 20 74 68 65 20 6d  uld change the m
26460 65 61 6e 69 6e 67 20 6f 66 20 74 68 65 20 4c 49  eaning of the LI
26470 4d 49 54 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 34  MIT)..**.**   (4
26480 29 20 54 68 65 20 69 6e 6e 65 72 20 71 75 65 72  ) The inner quer
26490 79 20 69 73 20 74 68 65 20 72 69 67 68 74 20 6f  y is the right o
264a0 70 65 72 61 6e 64 20 6f 66 20 61 20 4c 45 46 54  perand of a LEFT
264b0 20 4a 4f 49 4e 20 61 6e 64 20 74 68 65 0a 2a 2a   JOIN and the.**
264c0 20 20 20 20 20 20 20 65 78 70 72 65 73 73 69 6f         expressio
264d0 6e 20 74 6f 20 62 65 20 70 75 73 68 65 64 20 64  n to be pushed d
264e0 6f 77 6e 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6d  own does not com
264f0 65 20 66 72 6f 6d 20 74 68 65 20 4f 4e 20 63 6c  e from the ON cl
26500 61 75 73 65 0a 2a 2a 20 20 20 20 20 20 20 6f 6e  ause.**       on
26510 20 74 68 61 74 20 4c 45 46 54 20 4a 4f 49 4e 2e   that LEFT JOIN.
26520 0a 2a 2a 0a 2a 2a 20 20 20 28 35 29 20 54 68 65  .**.**   (5) The
26530 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 65 78   WHERE clause ex
26540 70 72 65 73 73 69 6f 6e 20 6f 72 69 67 69 6e 61  pression origina
26550 74 65 73 20 69 6e 20 74 68 65 20 4f 4e 20 6f 72  tes in the ON or
26560 20 55 53 49 4e 47 20 63 6c 61 75 73 65 0a 2a 2a   USING clause.**
26570 20 20 20 20 20 20 20 6f 66 20 61 20 4c 45 46 54         of a LEFT
26580 20 4a 4f 49 4e 20 77 68 65 72 65 20 69 43 75 72   JOIN where iCur
26590 73 6f 72 20 69 73 20 6e 6f 74 20 74 68 65 20 72  sor is not the r
265a0 69 67 68 74 2d 68 61 6e 64 20 74 61 62 6c 65 20  ight-hand table 
265b0 6f 66 20 74 68 61 74 0a 2a 2a 20 20 20 20 20 20  of that.**      
265c0 20 6c 65 66 74 20 6a 6f 69 6e 2e 20 20 41 6e 20   left join.  An 
265d0 65 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20  example:.**.**  
265e0 20 20 20 20 20 20 20 20 20 53 45 4c 45 43 54 20           SELECT 
265f0 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 46  *.**           F
26600 52 4f 4d 20 28 53 45 4c 45 43 54 20 31 20 41 53  ROM (SELECT 1 AS
26610 20 61 31 20 55 4e 49 4f 4e 20 41 4c 4c 20 53 45   a1 UNION ALL SE
26620 4c 45 43 54 20 32 29 20 41 53 20 61 61 0a 2a 2a  LECT 2) AS aa.**
26630 20 20 20 20 20 20 20 20 20 20 20 4a 4f 49 4e 20             JOIN 
26640 28 53 45 4c 45 43 54 20 31 20 41 53 20 62 32 20  (SELECT 1 AS b2 
26650 55 4e 49 4f 4e 20 41 4c 4c 20 53 45 4c 45 43 54  UNION ALL SELECT
26660 20 32 29 20 41 53 20 62 62 20 4f 4e 20 28 61 31   2) AS bb ON (a1
26670 3d 62 32 29 0a 2a 2a 20 20 20 20 20 20 20 20 20  =b2).**         
26680 20 20 4c 45 46 54 20 4a 4f 49 4e 20 28 53 45 4c    LEFT JOIN (SEL
26690 45 43 54 20 38 20 41 53 20 63 33 20 55 4e 49 4f  ECT 8 AS c3 UNIO
266a0 4e 20 41 4c 4c 20 53 45 4c 45 43 54 20 39 29 20  N ALL SELECT 9) 
266b0 41 53 20 63 63 20 4f 4e 20 28 62 32 3d 32 29 3b  AS cc ON (b2=2);
266c0 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 54 68 65  .**.**       The
266d0 20 63 6f 72 72 65 63 74 20 61 6e 73 77 65 72 20   correct answer 
266e0 69 73 20 74 68 72 65 65 20 72 6f 77 73 3a 20 20  is three rows:  
266f0 28 31 2c 31 2c 4e 55 4c 4c 29 2c 28 32 2c 32 2c  (1,1,NULL),(2,2,
26700 38 29 2c 28 32 2c 32 2c 39 29 2e 0a 2a 2a 20 20  8),(2,2,9)..**  
26710 20 20 20 20 20 42 75 74 20 69 66 20 74 68 65 20       But if the 
26720 28 62 32 3d 32 29 20 74 65 72 6d 20 77 65 72 65  (b2=2) term were
26730 20 74 6f 20 62 65 20 70 75 73 68 65 64 20 64 6f   to be pushed do
26740 77 6e 20 69 6e 74 6f 20 74 68 65 20 62 62 20 73  wn into the bb s
26750 75 62 71 75 65 72 79 2c 0a 2a 2a 20 20 20 20 20  ubquery,.**     
26760 20 20 74 68 65 6e 20 74 68 65 20 28 31 2c 31 2c    then the (1,1,
26770 4e 55 4c 4c 29 20 72 6f 77 20 77 6f 75 6c 64 20  NULL) row would 
26780 62 65 20 73 75 70 70 72 65 73 73 65 64 2e 0a 2a  be suppressed..*
26790 2a 0a 2a 2a 20 20 20 28 36 29 20 54 68 65 20 69  *.**   (6) The i
267a0 6e 6e 65 72 20 71 75 65 72 79 20 66 65 61 74 75  nner query featu
267b0 72 65 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20  res one or more 
267c0 77 69 6e 64 6f 77 2d 66 75 6e 63 74 69 6f 6e 73  window-functions
267d0 20 28 73 69 6e 63 65 20 0a 2a 2a 20 20 20 20 20   (since .**     
267e0 20 20 63 68 61 6e 67 65 73 20 74 6f 20 74 68 65    changes to the
267f0 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 6f 66   WHERE clause of
26800 20 74 68 65 20 69 6e 6e 65 72 20 71 75 65 72 79   the inner query
26810 20 63 6f 75 6c 64 20 63 68 61 6e 67 65 20 74 68   could change th
26820 65 20 0a 2a 2a 20 20 20 20 20 20 20 77 69 6e 64  e .**       wind
26830 6f 77 20 6f 76 65 72 20 77 68 69 63 68 20 77 69  ow over which wi
26840 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e 73 20 61  ndow functions a
26850 72 65 20 63 61 6c 63 75 6c 61 74 65 64 29 2e 0a  re calculated)..
26860 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 30 20 69  **.** Return 0 i
26870 66 20 6e 6f 20 63 68 61 6e 67 65 73 20 61 72 65  f no changes are
26880 20 6d 61 64 65 20 61 6e 64 20 6e 6f 6e 2d 7a 65   made and non-ze
26890 72 6f 20 69 66 20 6f 6e 65 20 6f 72 20 6d 6f 72  ro if one or mor
268a0 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 0a 2a  e WHERE clause.*
268b0 2a 20 74 65 72 6d 73 20 61 72 65 20 64 75 70 6c  * terms are dupl
268c0 69 63 61 74 65 64 20 69 6e 74 6f 20 74 68 65 20  icated into the 
268d0 73 75 62 71 75 65 72 79 2e 0a 2a 2f 0a 73 74 61  subquery..*/.sta
268e0 74 69 63 20 69 6e 74 20 70 75 73 68 44 6f 77 6e  tic int pushDown
268f0 57 68 65 72 65 54 65 72 6d 73 28 0a 20 20 50 61  WhereTerms(.  Pa
26900 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
26910 20 20 20 20 2f 2a 20 50 61 72 73 65 20 63 6f 6e      /* Parse con
26920 74 65 78 74 20 28 66 6f 72 20 6d 61 6c 6c 6f 63  text (for malloc
26930 28 29 20 61 6e 64 20 65 72 72 6f 72 20 72 65 70  () and error rep
26940 6f 72 74 69 6e 67 29 20 2a 2f 0a 20 20 53 65 6c  orting) */.  Sel
26950 65 63 74 20 2a 70 53 75 62 71 2c 20 20 20 20 20  ect *pSubq,     
26960 20 20 20 2f 2a 20 54 68 65 20 73 75 62 71 75 65     /* The subque
26970 72 79 20 77 68 6f 73 65 20 57 48 45 52 45 20 63  ry whose WHERE c
26980 6c 61 75 73 65 20 69 73 20 74 6f 20 62 65 20 61  lause is to be a
26990 75 67 6d 65 6e 74 65 64 20 2a 2f 0a 20 20 45 78  ugmented */.  Ex
269a0 70 72 20 2a 70 57 68 65 72 65 2c 20 20 20 20 20  pr *pWhere,     
269b0 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45      /* The WHERE
269c0 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 6f   clause of the o
269d0 75 74 65 72 20 71 75 65 72 79 20 2a 2f 0a 20 20  uter query */.  
269e0 69 6e 74 20 69 43 75 72 73 6f 72 2c 20 20 20 20  int iCursor,    
269f0 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20        /* Cursor 
26a00 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 73 75  number of the su
26a10 62 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20  bquery */.  int 
26a20 69 73 4c 65 66 74 4a 6f 69 6e 20 20 20 20 20 20  isLeftJoin      
26a30 20 20 2f 2a 20 54 72 75 65 20 69 66 20 70 53 75    /* True if pSu
26a40 62 71 20 69 73 20 74 68 65 20 72 69 67 68 74 20  bq is the right 
26a50 74 65 72 6d 20 6f 66 20 61 20 4c 45 46 54 20 4a  term of a LEFT J
26a60 4f 49 4e 20 2a 2f 0a 29 7b 0a 20 20 45 78 70 72  OIN */.){.  Expr
26a70 20 2a 70 4e 65 77 3b 0a 20 20 69 6e 74 20 6e 43   *pNew;.  int nC
26a80 68 6e 67 20 3d 20 30 3b 0a 20 20 69 66 28 20 70  hng = 0;.  if( p
26a90 57 68 65 72 65 3d 3d 30 20 29 20 72 65 74 75 72  Where==0 ) retur
26aa0 6e 20 30 3b 0a 20 20 69 66 28 20 70 53 75 62 71  n 0;.  if( pSubq
26ab0 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f  ->selFlags & SF_
26ac0 52 65 63 75 72 73 69 76 65 20 29 20 72 65 74 75  Recursive ) retu
26ad0 72 6e 20 30 3b 20 20 2f 2a 20 72 65 73 74 72 69  rn 0;  /* restri
26ae0 63 74 69 6f 6e 20 28 32 29 20 2a 2f 0a 0a 23 69  ction (2) */..#i
26af0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
26b00 54 5f 57 49 4e 44 4f 57 46 55 4e 43 0a 20 20 69  T_WINDOWFUNC.  i
26b10 66 28 20 70 53 75 62 71 2d 3e 70 57 69 6e 20 29  f( pSubq->pWin )
26b20 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 2f 2a   return 0;    /*
26b30 20 72 65 73 74 72 69 63 74 69 6f 6e 20 28 36 29   restriction (6)
26b40 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64   */.#endif..#ifd
26b50 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
26b60 20 20 2f 2a 20 4f 6e 6c 79 20 74 68 65 20 66 69    /* Only the fi
26b70 72 73 74 20 74 65 72 6d 20 6f 66 20 61 20 63 6f  rst term of a co
26b80 6d 70 6f 75 6e 64 20 63 61 6e 20 68 61 76 65 20  mpound can have 
26b90 61 20 57 49 54 48 20 63 6c 61 75 73 65 2e 20 20  a WITH clause.  
26ba0 42 75 74 20 6d 61 6b 65 0a 20 20 2a 2a 20 73 75  But make.  ** su
26bb0 72 65 20 6e 6f 20 6f 74 68 65 72 20 74 65 72 6d  re no other term
26bc0 73 20 61 72 65 20 6d 61 72 6b 65 64 20 53 46 5f  s are marked SF_
26bd0 52 65 63 75 72 73 69 76 65 20 69 6e 20 63 61 73  Recursive in cas
26be0 65 20 73 6f 6d 65 74 68 69 6e 67 20 63 68 61 6e  e something chan
26bf0 67 65 73 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20  ges.  ** in the 
26c00 66 75 74 75 72 65 2e 0a 20 20 2a 2f 0a 20 20 7b  future..  */.  {
26c10 0a 20 20 20 20 53 65 6c 65 63 74 20 2a 70 58 3b  .    Select *pX;
26c20 20 20 0a 20 20 20 20 66 6f 72 28 70 58 3d 70 53    .    for(pX=pS
26c30 75 62 71 3b 20 70 58 3b 20 70 58 3d 70 58 2d 3e  ubq; pX; pX=pX->
26c40 70 50 72 69 6f 72 29 7b 0a 20 20 20 20 20 20 61  pPrior){.      a
26c50 73 73 65 72 74 28 20 28 70 58 2d 3e 73 65 6c 46  ssert( (pX->selF
26c60 6c 61 67 73 20 26 20 28 53 46 5f 52 65 63 75 72  lags & (SF_Recur
26c70 73 69 76 65 29 29 3d 3d 30 20 29 3b 0a 20 20 20  sive))==0 );.   
26c80 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20   }.  }.#endif.. 
26c90 20 69 66 28 20 70 53 75 62 71 2d 3e 70 4c 69 6d   if( pSubq->pLim
26ca0 69 74 21 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  it!=0 ){.    ret
26cb0 75 72 6e 20 30 3b 20 2f 2a 20 72 65 73 74 72 69  urn 0; /* restri
26cc0 63 74 69 6f 6e 20 28 33 29 20 2a 2f 0a 20 20 7d  ction (3) */.  }
26cd0 0a 20 20 77 68 69 6c 65 28 20 70 57 68 65 72 65  .  while( pWhere
26ce0 2d 3e 6f 70 3d 3d 54 4b 5f 41 4e 44 20 29 7b 0a  ->op==TK_AND ){.
26cf0 20 20 20 20 6e 43 68 6e 67 20 2b 3d 20 70 75 73      nChng += pus
26d00 68 44 6f 77 6e 57 68 65 72 65 54 65 72 6d 73 28  hDownWhereTerms(
26d10 70 50 61 72 73 65 2c 20 70 53 75 62 71 2c 20 70  pParse, pSubq, p
26d20 57 68 65 72 65 2d 3e 70 52 69 67 68 74 2c 0a 20  Where->pRight,. 
26d30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26d40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
26d50 43 75 72 73 6f 72 2c 20 69 73 4c 65 66 74 4a 6f  Cursor, isLeftJo
26d60 69 6e 29 3b 0a 20 20 20 20 70 57 68 65 72 65 20  in);.    pWhere 
26d70 3d 20 70 57 68 65 72 65 2d 3e 70 4c 65 66 74 3b  = pWhere->pLeft;
26d80 0a 20 20 7d 0a 20 20 69 66 28 20 69 73 4c 65 66  .  }.  if( isLef
26d90 74 4a 6f 69 6e 0a 20 20 20 26 26 20 28 45 78 70  tJoin.   && (Exp
26da0 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 57 68  rHasProperty(pWh
26db0 65 72 65 2c 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29  ere,EP_FromJoin)
26dc0 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 7c 7c 20  ==0.         || 
26dd0 70 57 68 65 72 65 2d 3e 69 52 69 67 68 74 4a 6f  pWhere->iRightJo
26de0 69 6e 54 61 62 6c 65 21 3d 69 43 75 72 73 6f 72  inTable!=iCursor
26df0 29 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ).  ){.    retur
26e00 6e 20 30 3b 20 2f 2a 20 72 65 73 74 72 69 63 74  n 0; /* restrict
26e10 69 6f 6e 20 28 34 29 20 2a 2f 0a 20 20 7d 0a 20  ion (4) */.  }. 
26e20 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70   if( ExprHasProp
26e30 65 72 74 79 28 70 57 68 65 72 65 2c 45 50 5f 46  erty(pWhere,EP_F
26e40 72 6f 6d 4a 6f 69 6e 29 20 26 26 20 70 57 68 65  romJoin) && pWhe
26e50 72 65 2d 3e 69 52 69 67 68 74 4a 6f 69 6e 54 61  re->iRightJoinTa
26e60 62 6c 65 21 3d 69 43 75 72 73 6f 72 20 29 7b 0a  ble!=iCursor ){.
26e70 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 2f 2a      return 0; /*
26e80 20 72 65 73 74 72 69 63 74 69 6f 6e 20 28 35 29   restriction (5)
26e90 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20 73 71   */.  }.  if( sq
26ea0 6c 69 74 65 33 45 78 70 72 49 73 54 61 62 6c 65  lite3ExprIsTable
26eb0 43 6f 6e 73 74 61 6e 74 28 70 57 68 65 72 65 2c  Constant(pWhere,
26ec0 20 69 43 75 72 73 6f 72 29 20 29 7b 0a 20 20 20   iCursor) ){.   
26ed0 20 6e 43 68 6e 67 2b 2b 3b 0a 20 20 20 20 77 68   nChng++;.    wh
26ee0 69 6c 65 28 20 70 53 75 62 71 20 29 7b 0a 20 20  ile( pSubq ){.  
26ef0 20 20 20 20 53 75 62 73 74 43 6f 6e 74 65 78 74      SubstContext
26f00 20 78 3b 0a 20 20 20 20 20 20 70 4e 65 77 20 3d   x;.      pNew =
26f10 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28   sqlite3ExprDup(
26f20 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 57 68 65  pParse->db, pWhe
26f30 72 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 75 6e  re, 0);.      un
26f40 73 65 74 4a 6f 69 6e 45 78 70 72 28 70 4e 65 77  setJoinExpr(pNew
26f50 2c 20 2d 31 29 3b 0a 20 20 20 20 20 20 78 2e 70  , -1);.      x.p
26f60 50 61 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a  Parse = pParse;.
26f70 20 20 20 20 20 20 78 2e 69 54 61 62 6c 65 20 3d        x.iTable =
26f80 20 69 43 75 72 73 6f 72 3b 0a 20 20 20 20 20 20   iCursor;.      
26f90 78 2e 69 4e 65 77 54 61 62 6c 65 20 3d 20 69 43  x.iNewTable = iC
26fa0 75 72 73 6f 72 3b 0a 20 20 20 20 20 20 78 2e 69  ursor;.      x.i
26fb0 73 4c 65 66 74 4a 6f 69 6e 20 3d 20 30 3b 0a 20  sLeftJoin = 0;. 
26fc0 20 20 20 20 20 78 2e 70 45 4c 69 73 74 20 3d 20       x.pEList = 
26fd0 70 53 75 62 71 2d 3e 70 45 4c 69 73 74 3b 0a 20  pSubq->pEList;. 
26fe0 20 20 20 20 20 70 4e 65 77 20 3d 20 73 75 62 73       pNew = subs
26ff0 74 45 78 70 72 28 26 78 2c 20 70 4e 65 77 29 3b  tExpr(&x, pNew);
27000 0a 20 20 20 20 20 20 69 66 28 20 70 53 75 62 71  .      if( pSubq
27010 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f  ->selFlags & SF_
27020 41 67 67 72 65 67 61 74 65 20 29 7b 0a 20 20 20  Aggregate ){.   
27030 20 20 20 20 20 70 53 75 62 71 2d 3e 70 48 61 76       pSubq->pHav
27040 69 6e 67 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ing = sqlite3Exp
27050 72 41 6e 64 28 70 50 61 72 73 65 2c 20 70 53 75  rAnd(pParse, pSu
27060 62 71 2d 3e 70 48 61 76 69 6e 67 2c 20 70 4e 65  bq->pHaving, pNe
27070 77 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  w);.      }else{
27080 0a 20 20 20 20 20 20 20 20 70 53 75 62 71 2d 3e  .        pSubq->
27090 70 57 68 65 72 65 20 3d 20 73 71 6c 69 74 65 33  pWhere = sqlite3
270a0 45 78 70 72 41 6e 64 28 70 50 61 72 73 65 2c 20  ExprAnd(pParse, 
270b0 70 53 75 62 71 2d 3e 70 57 68 65 72 65 2c 20 70  pSubq->pWhere, p
270c0 4e 65 77 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  New);.      }.  
270d0 20 20 20 20 70 53 75 62 71 20 3d 20 70 53 75 62      pSubq = pSub
270e0 71 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 7d  q->pPrior;.    }
270f0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 43  .  }.  return nC
27100 68 6e 67 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  hng;.}.#endif /*
27110 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
27120 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29 20  _OMIT_SUBQUERY) 
27130 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  || !defined(SQLI
27140 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20 2a 2f  TE_OMIT_VIEW) */
27150 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70 46 75 6e  ../*.** The pFun
27160 63 20 69 73 20 74 68 65 20 6f 6e 6c 79 20 61 67  c is the only ag
27170 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e  gregate function
27180 20 69 6e 20 74 68 65 20 71 75 65 72 79 2e 20 20   in the query.  
27190 43 68 65 63 6b 20 74 6f 20 73 65 65 0a 2a 2a 20  Check to see.** 
271a0 69 66 20 74 68 65 20 71 75 65 72 79 20 69 73 20  if the query is 
271b0 61 20 63 61 6e 64 69 64 61 74 65 20 66 6f 72 20  a candidate for 
271c0 74 68 65 20 6d 69 6e 2f 6d 61 78 20 6f 70 74 69  the min/max opti
271d0 6d 69 7a 61 74 69 6f 6e 2e 20 0a 2a 2a 0a 2a 2a  mization. .**.**
271e0 20 49 66 20 74 68 65 20 71 75 65 72 79 20 69 73   If the query is
271f0 20 61 20 63 61 6e 64 69 64 61 74 65 20 66 6f 72   a candidate for
27200 20 74 68 65 20 6d 69 6e 2f 6d 61 78 20 6f 70 74   the min/max opt
27210 69 6d 69 7a 61 74 69 6f 6e 2c 20 74 68 65 6e 20  imization, then 
27220 73 65 74 0a 2a 2a 20 2a 70 70 4d 69 6e 4d 61 78  set.** *ppMinMax
27230 20 74 6f 20 62 65 20 61 6e 20 4f 52 44 45 52 20   to be an ORDER 
27240 42 59 20 63 6c 61 75 73 65 20 74 6f 20 62 65 20  BY clause to be 
27250 75 73 65 64 20 66 6f 72 20 74 68 65 20 6f 70 74  used for the opt
27260 69 6d 69 7a 61 74 69 6f 6e 0a 2a 2a 20 61 6e 64  imization.** and
27270 20 72 65 74 75 72 6e 20 65 69 74 68 65 72 20 57   return either W
27280 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d 49 4e  HERE_ORDERBY_MIN
27290 20 6f 72 20 57 48 45 52 45 5f 4f 52 44 45 52 42   or WHERE_ORDERB
272a0 59 5f 4d 41 58 20 64 65 70 65 6e 64 69 6e 67 20  Y_MAX depending 
272b0 6f 6e 0a 2a 2a 20 77 68 65 74 68 65 72 20 70 46  on.** whether pF
272c0 75 6e 63 20 69 73 20 61 20 6d 69 6e 28 29 20 6f  unc is a min() o
272d0 72 20 6d 61 78 28 29 20 66 75 6e 63 74 69 6f 6e  r max() function
272e0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 71  ..**.** If the q
272f0 75 65 72 79 20 69 73 20 6e 6f 74 20 61 20 63 61  uery is not a ca
27300 6e 64 69 64 61 74 65 20 66 6f 72 20 74 68 65 20  ndidate for the 
27310 6d 69 6e 2f 6d 61 78 20 6f 70 74 69 6d 69 7a 61  min/max optimiza
27320 74 69 6f 6e 2c 20 72 65 74 75 72 6e 0a 2a 2a 20  tion, return.** 
27330 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4e 4f  WHERE_ORDERBY_NO
27340 52 4d 41 4c 20 28 77 68 69 63 68 20 6d 75 73 74  RMAL (which must
27350 20 62 65 20 7a 65 72 6f 29 2e 0a 2a 2a 0a 2a 2a   be zero)..**.**
27360 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 75   This routine mu
27370 73 74 20 62 65 20 63 61 6c 6c 65 64 20 61 66 74  st be called aft
27380 65 72 20 61 67 67 72 65 67 61 74 65 20 66 75 6e  er aggregate fun
27390 63 74 69 6f 6e 73 20 68 61 76 65 20 62 65 65 6e  ctions have been
273a0 0a 2a 2a 20 6c 6f 63 61 74 65 64 20 62 75 74 20  .** located but 
273b0 62 65 66 6f 72 65 20 74 68 65 69 72 20 61 72 67  before their arg
273c0 75 6d 65 6e 74 73 20 68 61 76 65 20 62 65 65 6e  uments have been
273d0 20 73 75 62 6a 65 63 74 65 64 20 74 6f 20 61 67   subjected to ag
273e0 67 72 65 67 61 74 65 0a 2a 2a 20 61 6e 61 6c 79  gregate.** analy
273f0 73 69 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75  sis..*/.static u
27400 38 20 6d 69 6e 4d 61 78 51 75 65 72 79 28 73 71  8 minMaxQuery(sq
27410 6c 69 74 65 33 20 2a 64 62 2c 20 45 78 70 72 20  lite3 *db, Expr 
27420 2a 70 46 75 6e 63 2c 20 45 78 70 72 4c 69 73 74  *pFunc, ExprList
27430 20 2a 2a 70 70 4d 69 6e 4d 61 78 29 7b 0a 20 20   **ppMinMax){.  
27440 69 6e 74 20 65 52 65 74 20 3d 20 57 48 45 52 45  int eRet = WHERE
27450 5f 4f 52 44 45 52 42 59 5f 4e 4f 52 4d 41 4c 3b  _ORDERBY_NORMAL;
27460 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
27470 76 61 6c 75 65 20 2a 2f 0a 20 20 45 78 70 72 4c  value */.  ExprL
27480 69 73 74 20 2a 70 45 4c 69 73 74 20 3d 20 70 46  ist *pEList = pF
27490 75 6e 63 2d 3e 78 2e 70 4c 69 73 74 3b 20 20 20  unc->x.pList;   
274a0 20 2f 2a 20 41 72 67 75 6d 65 6e 74 73 20 74 6f   /* Arguments to
274b0 20 61 67 67 20 66 75 6e 63 74 69 6f 6e 20 2a 2f   agg function */
274c0 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
274d0 46 75 6e 63 3b 20 20 20 20 20 20 20 20 20 20 20  Func;           
274e0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65           /* Name
274f0 20 6f 66 20 61 67 67 72 65 67 61 74 65 20 66 75   of aggregate fu
27500 6e 63 74 69 6f 6e 20 70 46 75 6e 63 20 2a 2f 0a  nction pFunc */.
27510 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64    ExprList *pOrd
27520 65 72 42 79 3b 0a 20 20 75 38 20 73 6f 72 74 4f  erBy;.  u8 sortO
27530 72 64 65 72 3b 0a 0a 20 20 61 73 73 65 72 74 28  rder;..  assert(
27540 20 2a 70 70 4d 69 6e 4d 61 78 3d 3d 30 20 29 3b   *ppMinMax==0 );
27550 0a 20 20 61 73 73 65 72 74 28 20 70 46 75 6e 63  .  assert( pFunc
27560 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 46 55 4e  ->op==TK_AGG_FUN
27570 43 54 49 4f 4e 20 29 3b 0a 20 20 61 73 73 65 72  CTION );.  asser
27580 74 28 20 21 49 73 57 69 6e 64 6f 77 46 75 6e 63  t( !IsWindowFunc
27590 28 70 46 75 6e 63 29 20 29 3b 0a 20 20 69 66 28  (pFunc) );.  if(
275a0 20 70 45 4c 69 73 74 3d 3d 30 20 7c 7c 20 70 45   pEList==0 || pE
275b0 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d 31 20 7c  List->nExpr!=1 |
275c0 7c 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  | ExprHasPropert
275d0 79 28 70 46 75 6e 63 2c 20 45 50 5f 57 69 6e 46  y(pFunc, EP_WinF
275e0 75 6e 63 29 20 29 7b 0a 20 20 20 20 72 65 74 75  unc) ){.    retu
275f0 72 6e 20 65 52 65 74 3b 0a 20 20 7d 0a 20 20 7a  rn eRet;.  }.  z
27600 46 75 6e 63 20 3d 20 70 46 75 6e 63 2d 3e 75 2e  Func = pFunc->u.
27610 7a 54 6f 6b 65 6e 3b 0a 20 20 69 66 28 20 73 71  zToken;.  if( sq
27620 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 46 75  lite3StrICmp(zFu
27630 6e 63 2c 20 22 6d 69 6e 22 29 3d 3d 30 20 29 7b  nc, "min")==0 ){
27640 0a 20 20 20 20 65 52 65 74 20 3d 20 57 48 45 52  .    eRet = WHER
27650 45 5f 4f 52 44 45 52 42 59 5f 4d 49 4e 3b 0a 20  E_ORDERBY_MIN;. 
27660 20 20 20 73 6f 72 74 4f 72 64 65 72 20 3d 20 53     sortOrder = S
27670 51 4c 49 54 45 5f 53 4f 5f 41 53 43 3b 0a 20 20  QLITE_SO_ASC;.  
27680 7d 65 6c 73 65 20 69 66 28 20 73 71 6c 69 74 65  }else if( sqlite
27690 33 53 74 72 49 43 6d 70 28 7a 46 75 6e 63 2c 20  3StrICmp(zFunc, 
276a0 22 6d 61 78 22 29 3d 3d 30 20 29 7b 0a 20 20 20  "max")==0 ){.   
276b0 20 65 52 65 74 20 3d 20 57 48 45 52 45 5f 4f 52   eRet = WHERE_OR
276c0 44 45 52 42 59 5f 4d 41 58 3b 0a 20 20 20 20 73  DERBY_MAX;.    s
276d0 6f 72 74 4f 72 64 65 72 20 3d 20 53 51 4c 49 54  ortOrder = SQLIT
276e0 45 5f 53 4f 5f 44 45 53 43 3b 0a 20 20 7d 65 6c  E_SO_DESC;.  }el
276f0 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 65  se{.    return e
27700 52 65 74 3b 0a 20 20 7d 0a 20 20 2a 70 70 4d 69  Ret;.  }.  *ppMi
27710 6e 4d 61 78 20 3d 20 70 4f 72 64 65 72 42 79 20  nMax = pOrderBy 
27720 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  = sqlite3ExprLis
27730 74 44 75 70 28 64 62 2c 20 70 45 4c 69 73 74 2c  tDup(db, pEList,
27740 20 30 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70   0);.  assert( p
27750 4f 72 64 65 72 42 79 21 3d 30 20 7c 7c 20 64 62  OrderBy!=0 || db
27760 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
27770 3b 0a 20 20 69 66 28 20 70 4f 72 64 65 72 42 79  ;.  if( pOrderBy
27780 20 29 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 30   ) pOrderBy->a[0
27790 5d 2e 73 6f 72 74 4f 72 64 65 72 20 3d 20 73 6f  ].sortOrder = so
277a0 72 74 4f 72 64 65 72 3b 0a 20 20 72 65 74 75 72  rtOrder;.  retur
277b0 6e 20 65 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n eRet;.}../*.**
277c0 20 54 68 65 20 73 65 6c 65 63 74 20 73 74 61 74   The select stat
277d0 65 6d 65 6e 74 20 70 61 73 73 65 64 20 61 73 20  ement passed as 
277e0 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65  the first argume
277f0 6e 74 20 69 73 20 61 6e 20 61 67 67 72 65 67 61  nt is an aggrega
27800 74 65 20 71 75 65 72 79 2e 0a 2a 2a 20 54 68 65  te query..** The
27810 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
27820 20 69 73 20 74 68 65 20 61 73 73 6f 63 69 61 74   is the associat
27830 65 64 20 61 67 67 72 65 67 61 74 65 2d 69 6e 66  ed aggregate-inf
27840 6f 20 6f 62 6a 65 63 74 2e 20 54 68 69 73 20 0a  o object. This .
27850 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 74 65 73 74  ** function test
27860 73 20 69 66 20 74 68 65 20 53 45 4c 45 43 54 20  s if the SELECT 
27870 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a  is of the form:.
27880 2a 2a 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20 63  **.**   SELECT c
27890 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 3c 74 62  ount(*) FROM <tb
278a0 6c 3e 0a 2a 2a 0a 2a 2a 20 77 68 65 72 65 20 74  l>.**.** where t
278b0 61 62 6c 65 20 69 73 20 61 20 64 61 74 61 62 61  able is a databa
278c0 73 65 20 74 61 62 6c 65 2c 20 6e 6f 74 20 61 20  se table, not a 
278d0 73 75 62 2d 73 65 6c 65 63 74 20 6f 72 20 76 69  sub-select or vi
278e0 65 77 2e 20 49 66 20 74 68 65 20 71 75 65 72 79  ew. If the query
278f0 0a 2a 2a 20 64 6f 65 73 20 6d 61 74 63 68 20 74  .** does match t
27900 68 69 73 20 70 61 74 74 65 72 6e 2c 20 74 68 65  his pattern, the
27910 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  n a pointer to t
27920 68 65 20 54 61 62 6c 65 20 6f 62 6a 65 63 74 20  he Table object 
27930 72 65 70 72 65 73 65 6e 74 69 6e 67 0a 2a 2a 20  representing.** 
27940 3c 74 62 6c 3e 20 69 73 20 72 65 74 75 72 6e 65  <tbl> is returne
27950 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 30 20  d. Otherwise, 0 
27960 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a  is returned..*/.
27970 73 74 61 74 69 63 20 54 61 62 6c 65 20 2a 69 73  static Table *is
27980 53 69 6d 70 6c 65 43 6f 75 6e 74 28 53 65 6c 65  SimpleCount(Sele
27990 63 74 20 2a 70 2c 20 41 67 67 49 6e 66 6f 20 2a  ct *p, AggInfo *
279a0 70 41 67 67 49 6e 66 6f 29 7b 0a 20 20 54 61 62  pAggInfo){.  Tab
279b0 6c 65 20 2a 70 54 61 62 3b 0a 20 20 45 78 70 72  le *pTab;.  Expr
279c0 20 2a 70 45 78 70 72 3b 0a 0a 20 20 61 73 73 65   *pExpr;..  asse
279d0 72 74 28 20 21 70 2d 3e 70 47 72 6f 75 70 42 79  rt( !p->pGroupBy
279e0 20 29 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 70 57   );..  if( p->pW
279f0 68 65 72 65 20 7c 7c 20 70 2d 3e 70 45 4c 69 73  here || p->pELis
27a00 74 2d 3e 6e 45 78 70 72 21 3d 31 20 0a 20 20 20  t->nExpr!=1 .   
27a10 7c 7c 20 70 2d 3e 70 53 72 63 2d 3e 6e 53 72 63  || p->pSrc->nSrc
27a20 21 3d 31 20 7c 7c 20 70 2d 3e 70 53 72 63 2d 3e  !=1 || p->pSrc->
27a30 61 5b 30 5d 2e 70 53 65 6c 65 63 74 0a 20 20 29  a[0].pSelect.  )
27a40 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
27a50 20 20 7d 0a 20 20 70 54 61 62 20 3d 20 70 2d 3e    }.  pTab = p->
27a60 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 54 61 62 3b  pSrc->a[0].pTab;
27a70 0a 20 20 70 45 78 70 72 20 3d 20 70 2d 3e 70 45  .  pExpr = p->pE
27a80 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72  List->a[0].pExpr
27a90 3b 0a 20 20 61 73 73 65 72 74 28 20 70 54 61 62  ;.  assert( pTab
27aa0 20 26 26 20 21 70 54 61 62 2d 3e 70 53 65 6c 65   && !pTab->pSele
27ab0 63 74 20 26 26 20 70 45 78 70 72 20 29 3b 0a 0a  ct && pExpr );..
27ac0 20 20 69 66 28 20 49 73 56 69 72 74 75 61 6c 28    if( IsVirtual(
27ad0 70 54 61 62 29 20 29 20 72 65 74 75 72 6e 20 30  pTab) ) return 0
27ae0 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f  ;.  if( pExpr->o
27af0 70 21 3d 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49  p!=TK_AGG_FUNCTI
27b00 4f 4e 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  ON ) return 0;. 
27b10 20 69 66 28 20 4e 45 56 45 52 28 70 41 67 67 49   if( NEVER(pAggI
27b20 6e 66 6f 2d 3e 6e 46 75 6e 63 3d 3d 30 29 20 29  nfo->nFunc==0) )
27b30 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28   return 0;.  if(
27b40 20 28 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e   (pAggInfo->aFun
27b50 63 5b 30 5d 2e 70 46 75 6e 63 2d 3e 66 75 6e 63  c[0].pFunc->func
27b60 46 6c 61 67 73 26 53 51 4c 49 54 45 5f 46 55 4e  Flags&SQLITE_FUN
27b70 43 5f 43 4f 55 4e 54 29 3d 3d 30 20 29 20 72 65  C_COUNT)==0 ) re
27b80 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 45 78  turn 0;.  if( Ex
27b90 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
27ba0 78 70 72 2c 20 45 50 5f 44 69 73 74 69 6e 63 74  xpr, EP_Distinct
27bb0 7c 45 50 5f 57 69 6e 46 75 6e 63 29 20 29 20 72  |EP_WinFunc) ) r
27bc0 65 74 75 72 6e 20 30 3b 0a 0a 20 20 72 65 74 75  eturn 0;..  retu
27bd0 72 6e 20 70 54 61 62 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn pTab;.}../*.*
27be0 2a 20 49 66 20 74 68 65 20 73 6f 75 72 63 65 2d  * If the source-
27bf0 6c 69 73 74 20 69 74 65 6d 20 70 61 73 73 65 64  list item passed
27c00 20 61 73 20 61 6e 20 61 72 67 75 6d 65 6e 74 20   as an argument 
27c10 77 61 73 20 61 75 67 6d 65 6e 74 65 64 20 77 69  was augmented wi
27c20 74 68 20 61 6e 0a 2a 2a 20 49 4e 44 45 58 45 44  th an.** INDEXED
27c30 20 42 59 20 63 6c 61 75 73 65 2c 20 74 68 65 6e   BY clause, then
27c40 20 74 72 79 20 74 6f 20 6c 6f 63 61 74 65 20 74   try to locate t
27c50 68 65 20 73 70 65 63 69 66 69 65 64 20 69 6e 64  he specified ind
27c60 65 78 2e 20 49 66 20 74 68 65 72 65 0a 2a 2a 20  ex. If there.** 
27c70 77 61 73 20 73 75 63 68 20 61 20 63 6c 61 75 73  was such a claus
27c80 65 20 61 6e 64 20 74 68 65 20 6e 61 6d 65 64 20  e and the named 
27c90 69 6e 64 65 78 20 63 61 6e 6e 6f 74 20 62 65 20  index cannot be 
27ca0 66 6f 75 6e 64 2c 20 72 65 74 75 72 6e 20 0a 2a  found, return .*
27cb0 2a 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 20 61  * SQLITE_ERROR a
27cc0 6e 64 20 6c 65 61 76 65 20 61 6e 20 65 72 72 6f  nd leave an erro
27cd0 72 20 69 6e 20 70 50 61 72 73 65 2e 20 4f 74 68  r in pParse. Oth
27ce0 65 72 77 69 73 65 2c 20 70 6f 70 75 6c 61 74 65  erwise, populate
27cf0 20 0a 2a 2a 20 70 46 72 6f 6d 2d 3e 70 49 6e 64   .** pFrom->pInd
27d00 65 78 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51  ex and return SQ
27d10 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 69 6e 74 20  LITE_OK..*/.int 
27d20 73 71 6c 69 74 65 33 49 6e 64 65 78 65 64 42 79  sqlite3IndexedBy
27d30 4c 6f 6f 6b 75 70 28 50 61 72 73 65 20 2a 70 50  Lookup(Parse *pP
27d40 61 72 73 65 2c 20 73 74 72 75 63 74 20 53 72 63  arse, struct Src
27d50 4c 69 73 74 5f 69 74 65 6d 20 2a 70 46 72 6f 6d  List_item *pFrom
27d60 29 7b 0a 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e  ){.  if( pFrom->
27d70 70 54 61 62 20 26 26 20 70 46 72 6f 6d 2d 3e 66  pTab && pFrom->f
27d80 67 2e 69 73 49 6e 64 65 78 65 64 42 79 20 29 7b  g.isIndexedBy ){
27d90 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62  .    Table *pTab
27da0 20 3d 20 70 46 72 6f 6d 2d 3e 70 54 61 62 3b 0a   = pFrom->pTab;.
27db0 20 20 20 20 63 68 61 72 20 2a 7a 49 6e 64 65 78      char *zIndex
27dc0 65 64 42 79 20 3d 20 70 46 72 6f 6d 2d 3e 75 31  edBy = pFrom->u1
27dd0 2e 7a 49 6e 64 65 78 65 64 42 79 3b 0a 20 20 20  .zIndexedBy;.   
27de0 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20   Index *pIdx;.  
27df0 20 20 66 6f 72 28 70 49 64 78 3d 70 54 61 62 2d    for(pIdx=pTab-
27e00 3e 70 49 6e 64 65 78 3b 20 0a 20 20 20 20 20 20  >pIndex; .      
27e10 20 20 70 49 64 78 20 26 26 20 73 71 6c 69 74 65    pIdx && sqlite
27e20 33 53 74 72 49 43 6d 70 28 70 49 64 78 2d 3e 7a  3StrICmp(pIdx->z
27e30 4e 61 6d 65 2c 20 7a 49 6e 64 65 78 65 64 42 79  Name, zIndexedBy
27e40 29 3b 20 0a 20 20 20 20 20 20 20 20 70 49 64 78  ); .        pIdx
27e50 3d 70 49 64 78 2d 3e 70 4e 65 78 74 0a 20 20 20  =pIdx->pNext.   
27e60 20 29 3b 0a 20 20 20 20 69 66 28 20 21 70 49 64   );.    if( !pId
27e70 78 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  x ){.      sqlit
27e80 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
27e90 65 2c 20 22 6e 6f 20 73 75 63 68 20 69 6e 64 65  e, "no such inde
27ea0 78 3a 20 25 73 22 2c 20 7a 49 6e 64 65 78 65 64  x: %s", zIndexed
27eb0 42 79 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 50  By, 0);.      pP
27ec0 61 72 73 65 2d 3e 63 68 65 63 6b 53 63 68 65 6d  arse->checkSchem
27ed0 61 20 3d 20 31 3b 0a 20 20 20 20 20 20 72 65 74  a = 1;.      ret
27ee0 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  urn SQLITE_ERROR
27ef0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 46 72 6f  ;.    }.    pFro
27f00 6d 2d 3e 70 49 42 49 6e 64 65 78 20 3d 20 70 49  m->pIBIndex = pI
27f10 64 78 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  dx;.  }.  return
27f20 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 2f 2a   SQLITE_OK;.}./*
27f30 0a 2a 2a 20 44 65 74 65 63 74 20 63 6f 6d 70 6f  .** Detect compo
27f40 75 6e 64 20 53 45 4c 45 43 54 20 73 74 61 74 65  und SELECT state
27f50 6d 65 6e 74 73 20 74 68 61 74 20 75 73 65 20 61  ments that use a
27f60 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  n ORDER BY claus
27f70 65 20 77 69 74 68 20 0a 2a 2a 20 61 6e 20 61 6c  e with .** an al
27f80 74 65 72 6e 61 74 69 76 65 20 63 6f 6c 6c 61 74  ternative collat
27f90 69 6e 67 20 73 65 71 75 65 6e 63 65 2e 0a 2a 2a  ing sequence..**
27fa0 0a 2a 2a 20 20 20 20 53 45 4c 45 43 54 20 2e 2e  .**    SELECT ..
27fb0 2e 20 46 52 4f 4d 20 74 31 20 45 58 43 45 50 54  . FROM t1 EXCEPT
27fc0 20 53 45 4c 45 43 54 20 2e 2e 2e 20 46 52 4f 4d   SELECT ... FROM
27fd0 20 74 32 20 4f 52 44 45 52 20 42 59 20 2e 2e 20   t2 ORDER BY .. 
27fe0 43 4f 4c 4c 41 54 45 20 2e 2e 2e 0a 2a 2a 0a 2a  COLLATE ....**.*
27ff0 2a 20 54 68 65 73 65 20 61 72 65 20 72 65 77 72  * These are rewr
28000 69 74 74 65 6e 20 61 73 20 61 20 73 75 62 71 75  itten as a subqu
28010 65 72 79 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 53 45  ery:.**.**    SE
28020 4c 45 43 54 20 2a 20 46 52 4f 4d 20 28 53 45 4c  LECT * FROM (SEL
28030 45 43 54 20 2e 2e 2e 20 46 52 4f 4d 20 74 31 20  ECT ... FROM t1 
28040 45 58 43 45 50 54 20 53 45 4c 45 43 54 20 2e 2e  EXCEPT SELECT ..
28050 2e 20 46 52 4f 4d 20 74 32 29 0a 2a 2a 20 20 20  . FROM t2).**   
28060 20 20 4f 52 44 45 52 20 42 59 20 2e 2e 2e 20 43    ORDER BY ... C
28070 4f 4c 4c 41 54 45 20 2e 2e 2e 0a 2a 2a 0a 2a 2a  OLLATE ....**.**
28080 20 54 68 69 73 20 74 72 61 6e 73 66 6f 72 6d 61   This transforma
28090 74 69 6f 6e 20 69 73 20 6e 65 63 65 73 73 61 72  tion is necessar
280a0 79 20 62 65 63 61 75 73 65 20 74 68 65 20 6d 75  y because the mu
280b0 6c 74 69 53 65 6c 65 63 74 4f 72 64 65 72 42 79  ltiSelectOrderBy
280c0 28 29 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 61 62  () routine.** ab
280d0 6f 76 65 20 74 68 61 74 20 67 65 6e 65 72 61 74  ove that generat
280e0 65 73 20 74 68 65 20 63 6f 64 65 20 66 6f 72 20  es the code for 
280f0 61 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43  a compound SELEC
28100 54 20 77 69 74 68 20 61 6e 20 4f 52 44 45 52 20  T with an ORDER 
28110 42 59 20 63 6c 61 75 73 65 0a 2a 2a 20 75 73 65  BY clause.** use
28120 73 20 61 20 6d 65 72 67 65 20 61 6c 67 6f 72 69  s a merge algori
28130 74 68 6d 20 74 68 61 74 20 72 65 71 75 69 72 65  thm that require
28140 73 20 74 68 65 20 73 61 6d 65 20 63 6f 6c 6c 61  s the same colla
28150 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 6f 6e  ting sequence on
28160 20 74 68 65 0a 2a 2a 20 72 65 73 75 6c 74 20 63   the.** result c
28170 6f 6c 75 6d 6e 73 20 61 73 20 6f 6e 20 74 68 65  olumns as on the
28180 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
28190 2e 20 20 53 65 65 20 74 69 63 6b 65 74 0a 2a 2a  .  See ticket.**
281a0 20 68 74 74 70 3a 2f 2f 77 77 77 2e 73 71 6c 69   http://www.sqli
281b0 74 65 2e 6f 72 67 2f 73 72 63 2f 69 6e 66 6f 2f  te.org/src/info/
281c0 36 37 30 39 35 37 34 64 32 61 0a 2a 2a 0a 2a 2a  6709574d2a.**.**
281d0 20 54 68 69 73 20 74 72 61 6e 73 66 6f 72 6d 61   This transforma
281e0 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 20 6e 65 65  tion is only nee
281f0 64 65 64 20 66 6f 72 20 45 58 43 45 50 54 2c 20  ded for EXCEPT, 
28200 49 4e 54 45 52 53 45 43 54 2c 20 61 6e 64 20 55  INTERSECT, and U
28210 4e 49 4f 4e 2e 0a 2a 2a 20 54 68 65 20 55 4e 49  NION..** The UNI
28220 4f 4e 20 41 4c 4c 20 6f 70 65 72 61 74 6f 72 20  ON ALL operator 
28230 77 6f 72 6b 73 20 66 69 6e 65 20 77 69 74 68 20  works fine with 
28240 6d 75 6c 74 69 53 65 6c 65 63 74 4f 72 64 65 72  multiSelectOrder
28250 42 79 28 29 20 65 76 65 6e 20 77 68 65 6e 0a 2a  By() even when.*
28260 2a 20 74 68 65 72 65 20 61 72 65 20 43 4f 4c 4c  * there are COLL
28270 41 54 45 20 74 65 72 6d 73 20 69 6e 20 74 68 65  ATE terms in the
28280 20 4f 52 44 45 52 20 42 59 2e 0a 2a 2f 0a 73 74   ORDER BY..*/.st
28290 61 74 69 63 20 69 6e 74 20 63 6f 6e 76 65 72 74  atic int convert
282a0 43 6f 6d 70 6f 75 6e 64 53 65 6c 65 63 74 54 6f  CompoundSelectTo
282b0 53 75 62 71 75 65 72 79 28 57 61 6c 6b 65 72 20  Subquery(Walker 
282c0 2a 70 57 61 6c 6b 65 72 2c 20 53 65 6c 65 63 74  *pWalker, Select
282d0 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20   *p){.  int i;. 
282e0 20 53 65 6c 65 63 74 20 2a 70 4e 65 77 3b 0a 20   Select *pNew;. 
282f0 20 53 65 6c 65 63 74 20 2a 70 58 3b 0a 20 20 73   Select *pX;.  s
28300 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 73 74  qlite3 *db;.  st
28310 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74  ruct ExprList_it
28320 65 6d 20 2a 61 3b 0a 20 20 53 72 63 4c 69 73 74  em *a;.  SrcList
28330 20 2a 70 4e 65 77 53 72 63 3b 0a 20 20 50 61 72   *pNewSrc;.  Par
28340 73 65 20 2a 70 50 61 72 73 65 3b 0a 20 20 54 6f  se *pParse;.  To
28350 6b 65 6e 20 64 75 6d 6d 79 3b 0a 0a 20 20 69 66  ken dummy;..  if
28360 28 20 70 2d 3e 70 50 72 69 6f 72 3d 3d 30 20 29  ( p->pPrior==0 )
28370 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74   return WRC_Cont
28380 69 6e 75 65 3b 0a 20 20 69 66 28 20 70 2d 3e 70  inue;.  if( p->p
28390 4f 72 64 65 72 42 79 3d 3d 30 20 29 20 72 65 74  OrderBy==0 ) ret
283a0 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65  urn WRC_Continue
283b0 3b 0a 20 20 66 6f 72 28 70 58 3d 70 3b 20 70 58  ;.  for(pX=p; pX
283c0 20 26 26 20 28 70 58 2d 3e 6f 70 3d 3d 54 4b 5f   && (pX->op==TK_
283d0 41 4c 4c 20 7c 7c 20 70 58 2d 3e 6f 70 3d 3d 54  ALL || pX->op==T
283e0 4b 5f 53 45 4c 45 43 54 29 3b 20 70 58 3d 70 58  K_SELECT); pX=pX
283f0 2d 3e 70 50 72 69 6f 72 29 7b 7d 0a 20 20 69 66  ->pPrior){}.  if
28400 28 20 70 58 3d 3d 30 20 29 20 72 65 74 75 72 6e  ( pX==0 ) return
28410 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20   WRC_Continue;. 
28420 20 61 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79   a = p->pOrderBy
28430 2d 3e 61 3b 0a 20 20 66 6f 72 28 69 3d 70 2d 3e  ->a;.  for(i=p->
28440 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 2d  pOrderBy->nExpr-
28450 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20  1; i>=0; i--){. 
28460 20 20 20 69 66 28 20 61 5b 69 5d 2e 70 45 78 70     if( a[i].pExp
28470 72 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 43 6f  r->flags & EP_Co
28480 6c 6c 61 74 65 20 29 20 62 72 65 61 6b 3b 0a 20  llate ) break;. 
28490 20 7d 0a 20 20 69 66 28 20 69 3c 30 20 29 20 72   }.  if( i<0 ) r
284a0 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e  eturn WRC_Contin
284b0 75 65 3b 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20  ue;..  /* If we 
284c0 72 65 61 63 68 20 74 68 69 73 20 70 6f 69 6e 74  reach this point
284d0 2c 20 74 68 61 74 20 6d 65 61 6e 73 20 74 68 65  , that means the
284e0 20 74 72 61 6e 73 66 6f 72 6d 61 74 69 6f 6e 20   transformation 
284f0 69 73 20 72 65 71 75 69 72 65 64 2e 20 2a 2f 0a  is required. */.
28500 0a 20 20 70 50 61 72 73 65 20 3d 20 70 57 61 6c  .  pParse = pWal
28510 6b 65 72 2d 3e 70 50 61 72 73 65 3b 0a 20 20 64  ker->pParse;.  d
28520 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
28530 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33    pNew = sqlite3
28540 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c  DbMallocZero(db,
28550 20 73 69 7a 65 6f 66 28 2a 70 4e 65 77 29 20 29   sizeof(*pNew) )
28560 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20  ;.  if( pNew==0 
28570 29 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f  ) return WRC_Abo
28580 72 74 3b 0a 20 20 6d 65 6d 73 65 74 28 26 64 75  rt;.  memset(&du
28590 6d 6d 79 2c 20 30 2c 20 73 69 7a 65 6f 66 28 64  mmy, 0, sizeof(d
285a0 75 6d 6d 79 29 29 3b 0a 20 20 70 4e 65 77 53 72  ummy));.  pNewSr
285b0 63 20 3d 20 73 71 6c 69 74 65 33 53 72 63 4c 69  c = sqlite3SrcLi
285c0 73 74 41 70 70 65 6e 64 46 72 6f 6d 54 65 72 6d  stAppendFromTerm
285d0 28 70 50 61 72 73 65 2c 30 2c 30 2c 30 2c 26 64  (pParse,0,0,0,&d
285e0 75 6d 6d 79 2c 70 4e 65 77 2c 30 2c 30 29 3b 0a  ummy,pNew,0,0);.
285f0 20 20 69 66 28 20 70 4e 65 77 53 72 63 3d 3d 30    if( pNewSrc==0
28600 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62   ) return WRC_Ab
28610 6f 72 74 3b 0a 20 20 2a 70 4e 65 77 20 3d 20 2a  ort;.  *pNew = *
28620 70 3b 0a 20 20 70 2d 3e 70 53 72 63 20 3d 20 70  p;.  p->pSrc = p
28630 4e 65 77 53 72 63 3b 0a 20 20 70 2d 3e 70 45 4c  NewSrc;.  p->pEL
28640 69 73 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ist = sqlite3Exp
28650 72 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61 72  rListAppend(pPar
28660 73 65 2c 20 30 2c 20 73 71 6c 69 74 65 33 45 78  se, 0, sqlite3Ex
28670 70 72 28 64 62 2c 20 54 4b 5f 41 53 54 45 52 49  pr(db, TK_ASTERI
28680 53 4b 2c 20 30 29 29 3b 0a 20 20 70 2d 3e 6f 70  SK, 0));.  p->op
28690 20 3d 20 54 4b 5f 53 45 4c 45 43 54 3b 0a 20 20   = TK_SELECT;.  
286a0 70 2d 3e 70 57 68 65 72 65 20 3d 20 30 3b 0a 20  p->pWhere = 0;. 
286b0 20 70 4e 65 77 2d 3e 70 47 72 6f 75 70 42 79 20   pNew->pGroupBy 
286c0 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 70 48 61  = 0;.  pNew->pHa
286d0 76 69 6e 67 20 3d 20 30 3b 0a 20 20 70 4e 65 77  ving = 0;.  pNew
286e0 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a  ->pOrderBy = 0;.
286f0 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b    p->pPrior = 0;
28700 0a 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20 30 3b  .  p->pNext = 0;
28710 0a 20 20 70 2d 3e 70 57 69 74 68 20 3d 20 30 3b  .  p->pWith = 0;
28720 0a 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26  .  p->selFlags &
28730 3d 20 7e 53 46 5f 43 6f 6d 70 6f 75 6e 64 3b 0a  = ~SF_Compound;.
28740 20 20 61 73 73 65 72 74 28 20 28 70 2d 3e 73 65    assert( (p->se
28750 6c 46 6c 61 67 73 20 26 20 53 46 5f 43 6f 6e 76  lFlags & SF_Conv
28760 65 72 74 65 64 29 3d 3d 30 20 29 3b 0a 20 20 70  erted)==0 );.  p
28770 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46  ->selFlags |= SF
28780 5f 43 6f 6e 76 65 72 74 65 64 3b 0a 20 20 61 73  _Converted;.  as
28790 73 65 72 74 28 20 70 4e 65 77 2d 3e 70 50 72 69  sert( pNew->pPri
287a0 6f 72 21 3d 30 20 29 3b 0a 20 20 70 4e 65 77 2d  or!=0 );.  pNew-
287b0 3e 70 50 72 69 6f 72 2d 3e 70 4e 65 78 74 20 3d  >pPrior->pNext =
287c0 20 70 4e 65 77 3b 0a 20 20 70 4e 65 77 2d 3e 70   pNew;.  pNew->p
287d0 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 72 65 74  Limit = 0;.  ret
287e0 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65  urn WRC_Continue
287f0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b  ;.}../*.** Check
28800 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 20 46   to see if the F
28810 52 4f 4d 20 63 6c 61 75 73 65 20 74 65 72 6d 20  ROM clause term 
28820 70 46 72 6f 6d 20 68 61 73 20 74 61 62 6c 65 2d  pFrom has table-
28830 76 61 6c 75 65 64 20 66 75 6e 63 74 69 6f 6e 0a  valued function.
28840 2a 2a 20 61 72 67 75 6d 65 6e 74 73 2e 20 20 49  ** arguments.  I
28850 66 20 69 74 20 64 6f 65 73 2c 20 6c 65 61 76 65  f it does, leave
28860 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67   an error messag
28870 65 20 69 6e 20 70 50 61 72 73 65 20 61 6e 64 20  e in pParse and 
28880 72 65 74 75 72 6e 0a 2a 2a 20 6e 6f 6e 2d 7a 65  return.** non-ze
28890 72 6f 2c 20 73 69 6e 63 65 20 70 46 72 6f 6d 20  ro, since pFrom 
288a0 69 73 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 20 74  is not allowed t
288b0 6f 20 62 65 20 61 20 74 61 62 6c 65 2d 76 61 6c  o be a table-val
288c0 75 65 64 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f  ued function..*/
288d0 0a 73 74 61 74 69 63 20 69 6e 74 20 63 61 6e 6e  .static int cann
288e0 6f 74 42 65 46 75 6e 63 74 69 6f 6e 28 50 61 72  otBeFunction(Par
288f0 73 65 20 2a 70 50 61 72 73 65 2c 20 73 74 72 75  se *pParse, stru
28900 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
28910 2a 70 46 72 6f 6d 29 7b 0a 20 20 69 66 28 20 70  *pFrom){.  if( p
28920 46 72 6f 6d 2d 3e 66 67 2e 69 73 54 61 62 46 75  From->fg.isTabFu
28930 6e 63 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  nc ){.    sqlite
28940 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
28950 2c 20 22 27 25 73 27 20 69 73 20 6e 6f 74 20 61  , "'%s' is not a
28960 20 66 75 6e 63 74 69 6f 6e 22 2c 20 70 46 72 6f   function", pFro
28970 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 72  m->zName);.    r
28980 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72  eturn 1;.  }.  r
28990 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 23 69 66 6e  eturn 0;.}..#ifn
289a0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
289b0 43 54 45 0a 2f 2a 0a 2a 2a 20 41 72 67 75 6d 65  CTE./*.** Argume
289c0 6e 74 20 70 57 69 74 68 20 28 77 68 69 63 68 20  nt pWith (which 
289d0 6d 61 79 20 62 65 20 4e 55 4c 4c 29 20 70 6f 69  may be NULL) poi
289e0 6e 74 73 20 74 6f 20 61 20 6c 69 6e 6b 65 64 20  nts to a linked 
289f0 6c 69 73 74 20 6f 66 20 6e 65 73 74 65 64 20 0a  list of nested .
28a00 2a 2a 20 57 49 54 48 20 63 6f 6e 74 65 78 74 73  ** WITH contexts
28a10 2c 20 66 72 6f 6d 20 69 6e 6e 65 72 20 74 6f 20  , from inner to 
28a20 6f 75 74 65 72 6d 6f 73 74 2e 20 49 66 20 74 68  outermost. If th
28a30 65 20 74 61 62 6c 65 20 69 64 65 6e 74 69 66 69  e table identifi
28a40 65 64 20 62 79 20 0a 2a 2a 20 46 52 4f 4d 20 63  ed by .** FROM c
28a50 6c 61 75 73 65 20 65 6c 65 6d 65 6e 74 20 70 49  lause element pI
28a60 74 65 6d 20 69 73 20 72 65 61 6c 6c 79 20 61 20  tem is really a 
28a70 63 6f 6d 6d 6f 6e 2d 74 61 62 6c 65 2d 65 78 70  common-table-exp
28a80 72 65 73 73 69 6f 6e 20 28 43 54 45 29 20 0a 2a  ression (CTE) .*
28a90 2a 20 74 68 65 6e 20 72 65 74 75 72 6e 20 61 20  * then return a 
28aa0 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 43  pointer to the C
28ab0 54 45 20 64 65 66 69 6e 69 74 69 6f 6e 20 66 6f  TE definition fo
28ac0 72 20 74 68 61 74 20 74 61 62 6c 65 2e 20 4f 74  r that table. Ot
28ad0 68 65 72 77 69 73 65 0a 2a 2a 20 72 65 74 75 72  herwise.** retur
28ae0 6e 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 49 66  n NULL..**.** If
28af0 20 61 20 6e 6f 6e 2d 4e 55 4c 4c 20 76 61 6c 75   a non-NULL valu
28b00 65 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20 73  e is returned, s
28b10 65 74 20 2a 70 70 43 6f 6e 74 65 78 74 20 74 6f  et *ppContext to
28b20 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 57 69   point to the Wi
28b30 74 68 0a 2a 2a 20 6f 62 6a 65 63 74 20 74 68 61  th.** object tha
28b40 74 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 43  t the returned C
28b50 54 45 20 62 65 6c 6f 6e 67 73 20 74 6f 2e 0a 2a  TE belongs to..*
28b60 2f 0a 73 74 61 74 69 63 20 73 74 72 75 63 74 20  /.static struct 
28b70 43 74 65 20 2a 73 65 61 72 63 68 57 69 74 68 28  Cte *searchWith(
28b80 0a 20 20 57 69 74 68 20 2a 70 57 69 74 68 2c 20  .  With *pWith, 
28b90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28ba0 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 69 6e     /* Current in
28bb0 6e 65 72 6d 6f 73 74 20 57 49 54 48 20 63 6c 61  nermost WITH cla
28bc0 75 73 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  use */.  struct 
28bd0 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  SrcList_item *pI
28be0 74 65 6d 2c 20 20 20 20 20 2f 2a 20 46 52 4f 4d  tem,     /* FROM
28bf0 20 63 6c 61 75 73 65 20 65 6c 65 6d 65 6e 74 20   clause element 
28c00 74 6f 20 72 65 73 6f 6c 76 65 20 2a 2f 0a 20 20  to resolve */.  
28c10 57 69 74 68 20 2a 2a 70 70 43 6f 6e 74 65 78 74  With **ppContext
28c20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28c30 2f 2a 20 4f 55 54 3a 20 57 49 54 48 20 63 6c 61  /* OUT: WITH cla
28c40 75 73 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65  use return value
28c50 20 62 65 6c 6f 6e 67 73 20 74 6f 20 2a 2f 0a 29   belongs to */.)
28c60 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  {.  const char *
28c70 7a 4e 61 6d 65 3b 0a 20 20 69 66 28 20 70 49 74  zName;.  if( pIt
28c80 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65 3d 3d 30  em->zDatabase==0
28c90 20 26 26 20 28 7a 4e 61 6d 65 20 3d 20 70 49 74   && (zName = pIt
28ca0 65 6d 2d 3e 7a 4e 61 6d 65 29 21 3d 30 20 29 7b  em->zName)!=0 ){
28cb0 0a 20 20 20 20 57 69 74 68 20 2a 70 3b 0a 20 20  .    With *p;.  
28cc0 20 20 66 6f 72 28 70 3d 70 57 69 74 68 3b 20 70    for(p=pWith; p
28cd0 3b 20 70 3d 70 2d 3e 70 4f 75 74 65 72 29 7b 0a  ; p=p->pOuter){.
28ce0 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20        int i;.   
28cf0 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d     for(i=0; i<p-
28d00 3e 6e 43 74 65 3b 20 69 2b 2b 29 7b 0a 20 20 20  >nCte; i++){.   
28d10 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
28d20 53 74 72 49 43 6d 70 28 7a 4e 61 6d 65 2c 20 70  StrICmp(zName, p
28d30 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30  ->a[i].zName)==0
28d40 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2a 70   ){.          *p
28d50 70 43 6f 6e 74 65 78 74 20 3d 20 70 3b 0a 20 20  pContext = p;.  
28d60 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 26          return &
28d70 70 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 20 20 20  p->a[i];.       
28d80 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
28d90 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
28da0 0a 7d 0a 0a 2f 2a 20 54 68 65 20 63 6f 64 65 20  .}../* The code 
28db0 67 65 6e 65 72 61 74 6f 72 20 6d 61 69 6e 74 61  generator mainta
28dc0 69 6e 73 20 61 20 73 74 61 63 6b 20 6f 66 20 61  ins a stack of a
28dd0 63 74 69 76 65 20 57 49 54 48 20 63 6c 61 75 73  ctive WITH claus
28de0 65 73 0a 2a 2a 20 77 69 74 68 20 74 68 65 20 69  es.** with the i
28df0 6e 6e 65 72 2d 6d 6f 73 74 20 57 49 54 48 20 63  nner-most WITH c
28e00 6c 61 75 73 65 20 62 65 69 6e 67 20 61 74 20 74  lause being at t
28e10 68 65 20 74 6f 70 20 6f 66 20 74 68 65 20 73 74  he top of the st
28e20 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ack..**.** This 
28e30 72 6f 75 74 69 6e 65 20 70 75 73 68 65 73 20 74  routine pushes t
28e40 68 65 20 57 49 54 48 20 63 6c 61 75 73 65 20 70  he WITH clause p
28e50 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63  assed as the sec
28e60 6f 6e 64 20 61 72 67 75 6d 65 6e 74 0a 2a 2a 20  ond argument.** 
28e70 6f 6e 74 6f 20 74 68 65 20 74 6f 70 20 6f 66 20  onto the top of 
28e80 74 68 65 20 73 74 61 63 6b 2e 20 49 66 20 61 72  the stack. If ar
28e90 67 75 6d 65 6e 74 20 62 46 72 65 65 20 69 73 20  gument bFree is 
28ea0 74 72 75 65 2c 20 74 68 65 6e 20 74 68 69 73 0a  true, then this.
28eb0 2a 2a 20 57 49 54 48 20 63 6c 61 75 73 65 20 77  ** WITH clause w
28ec0 69 6c 6c 20 6e 65 76 65 72 20 62 65 20 70 6f 70  ill never be pop
28ed0 70 65 64 20 66 72 6f 6d 20 74 68 65 20 73 74 61  ped from the sta
28ee0 63 6b 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  ck. In this case
28ef0 20 69 74 0a 2a 2a 20 73 68 6f 75 6c 64 20 62 65   it.** should be
28f00 20 66 72 65 65 64 20 61 6c 6f 6e 67 20 77 69 74   freed along wit
28f10 68 20 74 68 65 20 50 61 72 73 65 20 6f 62 6a 65  h the Parse obje
28f20 63 74 2e 20 49 6e 20 6f 74 68 65 72 20 63 61 73  ct. In other cas
28f30 65 73 2c 20 77 68 65 6e 0a 2a 2a 20 62 46 72 65  es, when.** bFre
28f40 65 3d 3d 30 2c 20 74 68 65 20 57 69 74 68 20 6f  e==0, the With o
28f50 62 6a 65 63 74 20 77 69 6c 6c 20 62 65 20 66 72  bject will be fr
28f60 65 65 64 20 61 6c 6f 6e 67 20 77 69 74 68 20 74  eed along with t
28f70 68 65 20 53 45 4c 45 43 54 20 0a 2a 2a 20 73 74  he SELECT .** st
28f80 61 74 65 6d 65 6e 74 20 77 69 74 68 20 77 68 69  atement with whi
28f90 63 68 20 69 74 20 69 73 20 61 73 73 6f 63 69 61  ch it is associa
28fa0 74 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ted..*/.void sql
28fb0 69 74 65 33 57 69 74 68 50 75 73 68 28 50 61 72  ite3WithPush(Par
28fc0 73 65 20 2a 70 50 61 72 73 65 2c 20 57 69 74 68  se *pParse, With
28fd0 20 2a 70 57 69 74 68 2c 20 75 38 20 62 46 72 65   *pWith, u8 bFre
28fe0 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20 62 46  e){.  assert( bF
28ff0 72 65 65 3d 3d 30 20 7c 7c 20 28 70 50 61 72 73  ree==0 || (pPars
29000 65 2d 3e 70 57 69 74 68 3d 3d 30 20 26 26 20 70  e->pWith==0 && p
29010 50 61 72 73 65 2d 3e 70 57 69 74 68 54 6f 46 72  Parse->pWithToFr
29020 65 65 3d 3d 30 29 20 29 3b 0a 20 20 69 66 28 20  ee==0) );.  if( 
29030 70 57 69 74 68 20 29 7b 0a 20 20 20 20 61 73 73  pWith ){.    ass
29040 65 72 74 28 20 70 50 61 72 73 65 2d 3e 70 57 69  ert( pParse->pWi
29050 74 68 21 3d 70 57 69 74 68 20 29 3b 0a 20 20 20  th!=pWith );.   
29060 20 70 57 69 74 68 2d 3e 70 4f 75 74 65 72 20 3d   pWith->pOuter =
29070 20 70 50 61 72 73 65 2d 3e 70 57 69 74 68 3b 0a   pParse->pWith;.
29080 20 20 20 20 70 50 61 72 73 65 2d 3e 70 57 69 74      pParse->pWit
29090 68 20 3d 20 70 57 69 74 68 3b 0a 20 20 20 20 69  h = pWith;.    i
290a0 66 28 20 62 46 72 65 65 20 29 20 70 50 61 72 73  f( bFree ) pPars
290b0 65 2d 3e 70 57 69 74 68 54 6f 46 72 65 65 20 3d  e->pWithToFree =
290c0 20 70 57 69 74 68 3b 0a 20 20 7d 0a 7d 0a 0a 2f   pWith;.  }.}../
290d0 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
290e0 6f 6e 20 63 68 65 63 6b 73 20 69 66 20 61 72 67  on checks if arg
290f0 75 6d 65 6e 74 20 70 46 72 6f 6d 20 72 65 66 65  ument pFrom refe
29100 72 73 20 74 6f 20 61 20 43 54 45 20 64 65 63 6c  rs to a CTE decl
29110 61 72 65 64 20 62 79 20 0a 2a 2a 20 61 20 57 49  ared by .** a WI
29120 54 48 20 63 6c 61 75 73 65 20 6f 6e 20 74 68 65  TH clause on the
29130 20 73 74 61 63 6b 20 63 75 72 72 65 6e 74 6c 79   stack currently
29140 20 6d 61 69 6e 74 61 69 6e 65 64 20 62 79 20 74   maintained by t
29150 68 65 20 70 61 72 73 65 72 2e 20 41 6e 64 2c 0a  he parser. And,.
29160 2a 2a 20 69 66 20 63 75 72 72 65 6e 74 6c 79 20  ** if currently 
29170 70 72 6f 63 65 73 73 69 6e 67 20 61 20 43 54 45  processing a CTE
29180 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 69 66 20   expression, if 
29190 69 74 20 69 73 20 61 20 72 65 63 75 72 73 69 76  it is a recursiv
291a0 65 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65 20 74  e.** reference t
291b0 6f 20 74 68 65 20 63 75 72 72 65 6e 74 20 43 54  o the current CT
291c0 45 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 46 72 6f  E..**.** If pFro
291d0 6d 20 66 61 6c 6c 73 20 69 6e 74 6f 20 65 69 74  m falls into eit
291e0 68 65 72 20 6f 66 20 74 68 65 20 74 77 6f 20 63  her of the two c
291f0 61 74 65 67 6f 72 69 65 73 20 61 62 6f 76 65 2c  ategories above,
29200 20 70 46 72 6f 6d 2d 3e 70 54 61 62 0a 2a 2a 20   pFrom->pTab.** 
29210 61 6e 64 20 6f 74 68 65 72 20 66 69 65 6c 64 73  and other fields
29220 20 61 72 65 20 70 6f 70 75 6c 61 74 65 64 20 61   are populated a
29230 63 63 6f 72 64 69 6e 67 6c 79 2e 20 54 68 65 20  ccordingly. The 
29240 63 61 6c 6c 65 72 20 73 68 6f 75 6c 64 20 63 68  caller should ch
29250 65 63 6b 0a 2a 2a 20 28 70 46 72 6f 6d 2d 3e 70  eck.** (pFrom->p
29260 54 61 62 21 3d 30 29 20 74 6f 20 64 65 74 65 72  Tab!=0) to deter
29270 6d 69 6e 65 20 77 68 65 74 68 65 72 20 6f 72 20  mine whether or 
29280 6e 6f 74 20 61 20 73 75 63 63 65 73 73 66 75 6c  not a successful
29290 20 6d 61 74 63 68 0a 2a 2a 20 77 61 73 20 66 6f   match.** was fo
292a0 75 6e 64 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 74 68  und..**.** Wheth
292b0 65 72 20 6f 72 20 6e 6f 74 20 61 20 6d 61 74 63  er or not a matc
292c0 68 20 69 73 20 66 6f 75 6e 64 2c 20 53 51 4c 49  h is found, SQLI
292d0 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
292e0 64 20 69 66 20 6e 6f 20 65 72 72 6f 72 0a 2a 2a  d if no error.**
292f0 20 6f 63 63 75 72 73 2e 20 49 66 20 61 6e 20 65   occurs. If an e
29300 72 72 6f 72 20 64 6f 65 73 20 6f 63 63 75 72 2c  rror does occur,
29310 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67   an error messag
29320 65 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 74  e is stored in t
29330 68 65 0a 2a 2a 20 70 61 72 73 65 72 20 61 6e 64  he.** parser and
29340 20 73 6f 6d 65 20 65 72 72 6f 72 20 63 6f 64 65   some error code
29350 20 6f 74 68 65 72 20 74 68 61 6e 20 53 51 4c 49   other than SQLI
29360 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 0a  TE_OK returned..
29370 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69  */.static int wi
29380 74 68 45 78 70 61 6e 64 28 0a 20 20 57 61 6c 6b  thExpand(.  Walk
29390 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 0a 20 20  er *pWalker, .  
293a0 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
293b0 74 65 6d 20 2a 70 46 72 6f 6d 0a 29 7b 0a 20 20  tem *pFrom.){.  
293c0 50 61 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20  Parse *pParse = 
293d0 70 57 61 6c 6b 65 72 2d 3e 70 50 61 72 73 65 3b  pWalker->pParse;
293e0 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
293f0 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 73   pParse->db;.  s
29400 74 72 75 63 74 20 43 74 65 20 2a 70 43 74 65 3b  truct Cte *pCte;
29410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
29420 2a 20 4d 61 74 63 68 65 64 20 43 54 45 20 28 6f  * Matched CTE (o
29430 72 20 4e 55 4c 4c 20 69 66 20 6e 6f 20 6d 61 74  r NULL if no mat
29440 63 68 29 20 2a 2f 0a 20 20 57 69 74 68 20 2a 70  ch) */.  With *p
29450 57 69 74 68 3b 20 20 20 20 20 20 20 20 20 20 20  With;           
29460 20 20 20 20 20 20 20 20 20 2f 2a 20 57 49 54 48           /* WITH
29470 20 63 6c 61 75 73 65 20 74 68 61 74 20 70 43 74   clause that pCt
29480 65 20 62 65 6c 6f 6e 67 73 20 74 6f 20 2a 2f 0a  e belongs to */.
29490 0a 20 20 61 73 73 65 72 74 28 20 70 46 72 6f 6d  .  assert( pFrom
294a0 2d 3e 70 54 61 62 3d 3d 30 20 29 3b 0a 0a 20 20  ->pTab==0 );..  
294b0 70 43 74 65 20 3d 20 73 65 61 72 63 68 57 69 74  pCte = searchWit
294c0 68 28 70 50 61 72 73 65 2d 3e 70 57 69 74 68 2c  h(pParse->pWith,
294d0 20 70 46 72 6f 6d 2c 20 26 70 57 69 74 68 29 3b   pFrom, &pWith);
294e0 0a 20 20 69 66 28 20 70 43 74 65 20 29 7b 0a 20  .  if( pCte ){. 
294f0 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a     Table *pTab;.
29500 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45      ExprList *pE
29510 4c 69 73 74 3b 0a 20 20 20 20 53 65 6c 65 63 74  List;.    Select
29520 20 2a 70 53 65 6c 3b 0a 20 20 20 20 53 65 6c 65   *pSel;.    Sele
29530 63 74 20 2a 70 4c 65 66 74 3b 20 20 20 20 20 20  ct *pLeft;      
29540 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 66            /* Lef
29550 74 2d 6d 6f 73 74 20 53 45 4c 45 43 54 20 73 74  t-most SELECT st
29560 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 69  atement */.    i
29570 6e 74 20 62 4d 61 79 52 65 63 75 72 73 69 76 65  nt bMayRecursive
29580 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
29590 54 72 75 65 20 69 66 20 63 6f 6d 70 6f 75 6e 64  True if compound
295a0 20 6a 6f 69 6e 65 64 20 62 79 20 55 4e 49 4f 4e   joined by UNION
295b0 20 5b 41 4c 4c 5d 20 2a 2f 0a 20 20 20 20 57 69   [ALL] */.    Wi
295c0 74 68 20 2a 70 53 61 76 65 64 57 69 74 68 3b 20  th *pSavedWith; 
295d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
295e0 6e 69 74 69 61 6c 20 76 61 6c 75 65 20 6f 66 20  nitial value of 
295f0 70 50 61 72 73 65 2d 3e 70 57 69 74 68 20 2a 2f  pParse->pWith */
29600 0a 0a 20 20 20 20 2f 2a 20 49 66 20 70 43 74 65  ..    /* If pCte
29610 2d 3e 7a 43 74 65 45 72 72 20 69 73 20 6e 6f 6e  ->zCteErr is non
29620 2d 4e 55 4c 4c 20 61 74 20 74 68 69 73 20 70 6f  -NULL at this po
29630 69 6e 74 2c 20 74 68 65 6e 20 74 68 69 73 20 69  int, then this i
29640 73 20 61 6e 20 69 6c 6c 65 67 61 6c 0a 20 20 20  s an illegal.   
29650 20 2a 2a 20 72 65 63 75 72 73 69 76 65 20 72 65   ** recursive re
29660 66 65 72 65 6e 63 65 20 74 6f 20 43 54 45 20 70  ference to CTE p
29670 43 74 65 2e 20 4c 65 61 76 65 20 61 6e 20 65 72  Cte. Leave an er
29680 72 6f 72 20 69 6e 20 70 50 61 72 73 65 20 61 6e  ror in pParse an
29690 64 20 72 65 74 75 72 6e 0a 20 20 20 20 2a 2a 20  d return.    ** 
296a0 65 61 72 6c 79 2e 20 49 66 20 70 43 74 65 2d 3e  early. If pCte->
296b0 7a 43 74 65 45 72 72 20 69 73 20 4e 55 4c 4c 2c  zCteErr is NULL,
296c0 20 74 68 65 6e 20 74 68 69 73 20 69 73 20 6e 6f   then this is no
296d0 74 20 61 20 72 65 63 75 72 73 69 76 65 20 72 65  t a recursive re
296e0 66 65 72 65 6e 63 65 2e 0a 20 20 20 20 2a 2a 20  ference..    ** 
296f0 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20 70 72  In this case, pr
29700 6f 63 65 65 64 2e 20 20 2a 2f 0a 20 20 20 20 69  oceed.  */.    i
29710 66 28 20 70 43 74 65 2d 3e 7a 43 74 65 45 72 72  f( pCte->zCteErr
29720 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
29730 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
29740 2c 20 70 43 74 65 2d 3e 7a 43 74 65 45 72 72 2c  , pCte->zCteErr,
29750 20 70 43 74 65 2d 3e 7a 4e 61 6d 65 29 3b 0a 20   pCte->zName);. 
29760 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
29770 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  TE_ERROR;.    }.
29780 20 20 20 20 69 66 28 20 63 61 6e 6e 6f 74 42 65      if( cannotBe
29790 46 75 6e 63 74 69 6f 6e 28 70 50 61 72 73 65 2c  Function(pParse,
297a0 20 70 46 72 6f 6d 29 20 29 20 72 65 74 75 72 6e   pFrom) ) return
297b0 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 0a   SQLITE_ERROR;..
297c0 20 20 20 20 61 73 73 65 72 74 28 20 70 46 72 6f      assert( pFro
297d0 6d 2d 3e 70 54 61 62 3d 3d 30 20 29 3b 0a 20 20  m->pTab==0 );.  
297e0 20 20 70 46 72 6f 6d 2d 3e 70 54 61 62 20 3d 20    pFrom->pTab = 
297f0 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33 44 62  pTab = sqlite3Db
29800 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73  MallocZero(db, s
29810 69 7a 65 6f 66 28 54 61 62 6c 65 29 29 3b 0a 20  izeof(Table));. 
29820 20 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29     if( pTab==0 )
29830 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72   return WRC_Abor
29840 74 3b 0a 20 20 20 20 70 54 61 62 2d 3e 6e 54 61  t;.    pTab->nTa
29850 62 52 65 66 20 3d 20 31 3b 0a 20 20 20 20 70 54  bRef = 1;.    pT
29860 61 62 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69  ab->zName = sqli
29870 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c 20  te3DbStrDup(db, 
29880 70 43 74 65 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  pCte->zName);.  
29890 20 20 70 54 61 62 2d 3e 69 50 4b 65 79 20 3d 20    pTab->iPKey = 
298a0 2d 31 3b 0a 20 20 20 20 70 54 61 62 2d 3e 6e 52  -1;.    pTab->nR
298b0 6f 77 4c 6f 67 45 73 74 20 3d 20 32 30 30 3b 20  owLogEst = 200; 
298c0 61 73 73 65 72 74 28 20 32 30 30 3d 3d 73 71 6c  assert( 200==sql
298d0 69 74 65 33 4c 6f 67 45 73 74 28 31 30 34 38 35  ite3LogEst(10485
298e0 37 36 29 20 29 3b 0a 20 20 20 20 70 54 61 62 2d  76) );.    pTab-
298f0 3e 74 61 62 46 6c 61 67 73 20 7c 3d 20 54 46 5f  >tabFlags |= TF_
29900 45 70 68 65 6d 65 72 61 6c 20 7c 20 54 46 5f 4e  Ephemeral | TF_N
29910 6f 56 69 73 69 62 6c 65 52 6f 77 69 64 3b 0a 20  oVisibleRowid;. 
29920 20 20 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63     pFrom->pSelec
29930 74 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63  t = sqlite3Selec
29940 74 44 75 70 28 64 62 2c 20 70 43 74 65 2d 3e 70  tDup(db, pCte->p
29950 53 65 6c 65 63 74 2c 20 30 29 3b 0a 20 20 20 20  Select, 0);.    
29960 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
29970 69 6c 65 64 20 29 20 72 65 74 75 72 6e 20 53 51  iled ) return SQ
29980 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b  LITE_NOMEM_BKPT;
29990 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 46 72  .    assert( pFr
299a0 6f 6d 2d 3e 70 53 65 6c 65 63 74 20 29 3b 0a 0a  om->pSelect );..
299b0 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20      /* Check if 
299c0 74 68 69 73 20 69 73 20 61 20 72 65 63 75 72 73  this is a recurs
299d0 69 76 65 20 43 54 45 2e 20 2a 2f 0a 20 20 20 20  ive CTE. */.    
299e0 70 53 65 6c 20 3d 20 70 46 72 6f 6d 2d 3e 70 53  pSel = pFrom->pS
299f0 65 6c 65 63 74 3b 0a 20 20 20 20 62 4d 61 79 52  elect;.    bMayR
29a00 65 63 75 72 73 69 76 65 20 3d 20 28 20 70 53 65  ecursive = ( pSe
29a10 6c 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 7c 7c  l->op==TK_ALL ||
29a20 20 70 53 65 6c 2d 3e 6f 70 3d 3d 54 4b 5f 55 4e   pSel->op==TK_UN
29a30 49 4f 4e 20 29 3b 0a 20 20 20 20 69 66 28 20 62  ION );.    if( b
29a40 4d 61 79 52 65 63 75 72 73 69 76 65 20 29 7b 0a  MayRecursive ){.
29a50 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20        int i;.   
29a60 20 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63     SrcList *pSrc
29a70 20 3d 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63   = pFrom->pSelec
29a80 74 2d 3e 70 53 72 63 3b 0a 20 20 20 20 20 20 66  t->pSrc;.      f
29a90 6f 72 28 69 3d 30 3b 20 69 3c 70 53 72 63 2d 3e  or(i=0; i<pSrc->
29aa0 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nSrc; i++){.    
29ab0 20 20 20 20 73 74 72 75 63 74 20 53 72 63 4c 69      struct SrcLi
29ac0 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d  st_item *pItem =
29ad0 20 26 70 53 72 63 2d 3e 61 5b 69 5d 3b 0a 20 20   &pSrc->a[i];.  
29ae0 20 20 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d        if( pItem-
29af0 3e 7a 44 61 74 61 62 61 73 65 3d 3d 30 20 0a 20  >zDatabase==0 . 
29b00 20 20 20 20 20 20 20 20 26 26 20 70 49 74 65 6d          && pItem
29b10 2d 3e 7a 4e 61 6d 65 21 3d 30 20 0a 20 20 20 20  ->zName!=0 .    
29b20 20 20 20 20 20 26 26 20 30 3d 3d 73 71 6c 69 74       && 0==sqlit
29b30 65 33 53 74 72 49 43 6d 70 28 70 49 74 65 6d 2d  e3StrICmp(pItem-
29b40 3e 7a 4e 61 6d 65 2c 20 70 43 74 65 2d 3e 7a 4e  >zName, pCte->zN
29b50 61 6d 65 29 0a 20 20 20 20 20 20 20 20 20 20 29  ame).          )
29b60 7b 0a 20 20 20 20 20 20 20 20 20 20 70 49 74 65  {.          pIte
29b70 6d 2d 3e 70 54 61 62 20 3d 20 70 54 61 62 3b 0a  m->pTab = pTab;.
29b80 20 20 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d            pItem-
29b90 3e 66 67 2e 69 73 52 65 63 75 72 73 69 76 65 20  >fg.isRecursive 
29ba0 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 70  = 1;.          p
29bb0 54 61 62 2d 3e 6e 54 61 62 52 65 66 2b 2b 3b 0a  Tab->nTabRef++;.
29bc0 20 20 20 20 20 20 20 20 20 20 70 53 65 6c 2d 3e            pSel->
29bd0 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f 52  selFlags |= SF_R
29be0 65 63 75 72 73 69 76 65 3b 0a 20 20 20 20 20 20  ecursive;.      
29bf0 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
29c00 7d 0a 0a 20 20 20 20 2f 2a 20 4f 6e 6c 79 20 6f  }..    /* Only o
29c10 6e 65 20 72 65 63 75 72 73 69 76 65 20 72 65 66  ne recursive ref
29c20 65 72 65 6e 63 65 20 69 73 20 70 65 72 6d 69 74  erence is permit
29c30 74 65 64 2e 20 2a 2f 20 0a 20 20 20 20 69 66 28  ted. */ .    if(
29c40 20 70 54 61 62 2d 3e 6e 54 61 62 52 65 66 3e 32   pTab->nTabRef>2
29c50 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
29c60 33 45 72 72 6f 72 4d 73 67 28 0a 20 20 20 20 20  3ErrorMsg(.     
29c70 20 20 20 20 20 70 50 61 72 73 65 2c 20 22 6d 75       pParse, "mu
29c80 6c 74 69 70 6c 65 20 72 65 66 65 72 65 6e 63 65  ltiple reference
29c90 73 20 74 6f 20 72 65 63 75 72 73 69 76 65 20 74  s to recursive t
29ca0 61 62 6c 65 3a 20 25 73 22 2c 20 70 43 74 65 2d  able: %s", pCte-
29cb0 3e 7a 4e 61 6d 65 0a 20 20 20 20 20 20 29 3b 0a  >zName.      );.
29cc0 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
29cd0 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  ITE_ERROR;.    }
29ce0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 54 61  .    assert( pTa
29cf0 62 2d 3e 6e 54 61 62 52 65 66 3d 3d 31 20 7c 7c  b->nTabRef==1 ||
29d00 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 28 28   .            ((
29d10 70 53 65 6c 2d 3e 73 65 6c 46 6c 61 67 73 26 53  pSel->selFlags&S
29d20 46 5f 52 65 63 75 72 73 69 76 65 29 20 26 26 20  F_Recursive) && 
29d30 70 54 61 62 2d 3e 6e 54 61 62 52 65 66 3d 3d 32  pTab->nTabRef==2
29d40 20 29 29 3b 0a 0a 20 20 20 20 70 43 74 65 2d 3e   ));..    pCte->
29d50 7a 43 74 65 45 72 72 20 3d 20 22 63 69 72 63 75  zCteErr = "circu
29d60 6c 61 72 20 72 65 66 65 72 65 6e 63 65 3a 20 25  lar reference: %
29d70 73 22 3b 0a 20 20 20 20 70 53 61 76 65 64 57 69  s";.    pSavedWi
29d80 74 68 20 3d 20 70 50 61 72 73 65 2d 3e 70 57 69  th = pParse->pWi
29d90 74 68 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e  th;.    pParse->
29da0 70 57 69 74 68 20 3d 20 70 57 69 74 68 3b 0a 20  pWith = pWith;. 
29db0 20 20 20 69 66 28 20 62 4d 61 79 52 65 63 75 72     if( bMayRecur
29dc0 73 69 76 65 20 29 7b 0a 20 20 20 20 20 20 53 65  sive ){.      Se
29dd0 6c 65 63 74 20 2a 70 50 72 69 6f 72 20 3d 20 70  lect *pPrior = p
29de0 53 65 6c 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20  Sel->pPrior;.   
29df0 20 20 20 61 73 73 65 72 74 28 20 70 50 72 69 6f     assert( pPrio
29e00 72 2d 3e 70 57 69 74 68 3d 3d 30 20 29 3b 0a 20  r->pWith==0 );. 
29e10 20 20 20 20 20 70 50 72 69 6f 72 2d 3e 70 57 69       pPrior->pWi
29e20 74 68 20 3d 20 70 53 65 6c 2d 3e 70 57 69 74 68  th = pSel->pWith
29e30 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 57  ;.      sqlite3W
29e40 61 6c 6b 53 65 6c 65 63 74 28 70 57 61 6c 6b 65  alkSelect(pWalke
29e50 72 2c 20 70 50 72 69 6f 72 29 3b 0a 20 20 20 20  r, pPrior);.    
29e60 20 20 70 50 72 69 6f 72 2d 3e 70 57 69 74 68 20    pPrior->pWith 
29e70 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  = 0;.    }else{.
29e80 20 20 20 20 20 20 73 71 6c 69 74 65 33 57 61 6c        sqlite3Wal
29e90 6b 53 65 6c 65 63 74 28 70 57 61 6c 6b 65 72 2c  kSelect(pWalker,
29ea0 20 70 53 65 6c 29 3b 0a 20 20 20 20 7d 0a 20 20   pSel);.    }.  
29eb0 20 20 70 50 61 72 73 65 2d 3e 70 57 69 74 68 20    pParse->pWith 
29ec0 3d 20 70 57 69 74 68 3b 0a 0a 20 20 20 20 66 6f  = pWith;..    fo
29ed0 72 28 70 4c 65 66 74 3d 70 53 65 6c 3b 20 70 4c  r(pLeft=pSel; pL
29ee0 65 66 74 2d 3e 70 50 72 69 6f 72 3b 20 70 4c 65  eft->pPrior; pLe
29ef0 66 74 3d 70 4c 65 66 74 2d 3e 70 50 72 69 6f 72  ft=pLeft->pPrior
29f00 29 3b 0a 20 20 20 20 70 45 4c 69 73 74 20 3d 20  );.    pEList = 
29f10 70 4c 65 66 74 2d 3e 70 45 4c 69 73 74 3b 0a 20  pLeft->pEList;. 
29f20 20 20 20 69 66 28 20 70 43 74 65 2d 3e 70 43 6f     if( pCte->pCo
29f30 6c 73 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  ls ){.      if( 
29f40 70 45 4c 69 73 74 20 26 26 20 70 45 4c 69 73 74  pEList && pEList
29f50 2d 3e 6e 45 78 70 72 21 3d 70 43 74 65 2d 3e 70  ->nExpr!=pCte->p
29f60 43 6f 6c 73 2d 3e 6e 45 78 70 72 20 29 7b 0a 20  Cols->nExpr ){. 
29f70 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72         sqlite3Er
29f80 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
29f90 74 61 62 6c 65 20 25 73 20 68 61 73 20 25 64 20  table %s has %d 
29fa0 76 61 6c 75 65 73 20 66 6f 72 20 25 64 20 63 6f  values for %d co
29fb0 6c 75 6d 6e 73 22 2c 0a 20 20 20 20 20 20 20 20  lumns",.        
29fc0 20 20 20 20 70 43 74 65 2d 3e 7a 4e 61 6d 65 2c      pCte->zName,
29fd0 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 20   pEList->nExpr, 
29fe0 70 43 74 65 2d 3e 70 43 6f 6c 73 2d 3e 6e 45 78  pCte->pCols->nEx
29ff0 70 72 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20  pr.        );.  
2a000 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 70 57        pParse->pW
2a010 69 74 68 20 3d 20 70 53 61 76 65 64 57 69 74 68  ith = pSavedWith
2a020 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
2a030 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
2a040 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 45 4c       }.      pEL
2a050 69 73 74 20 3d 20 70 43 74 65 2d 3e 70 43 6f 6c  ist = pCte->pCol
2a060 73 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 73 71  s;.    }..    sq
2a070 6c 69 74 65 33 43 6f 6c 75 6d 6e 73 46 72 6f 6d  lite3ColumnsFrom
2a080 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c  ExprList(pParse,
2a090 20 70 45 4c 69 73 74 2c 20 26 70 54 61 62 2d 3e   pEList, &pTab->
2a0a0 6e 43 6f 6c 2c 20 26 70 54 61 62 2d 3e 61 43 6f  nCol, &pTab->aCo
2a0b0 6c 29 3b 0a 20 20 20 20 69 66 28 20 62 4d 61 79  l);.    if( bMay
2a0c0 52 65 63 75 72 73 69 76 65 20 29 7b 0a 20 20 20  Recursive ){.   
2a0d0 20 20 20 69 66 28 20 70 53 65 6c 2d 3e 73 65 6c     if( pSel->sel
2a0e0 46 6c 61 67 73 20 26 20 53 46 5f 52 65 63 75 72  Flags & SF_Recur
2a0f0 73 69 76 65 20 29 7b 0a 20 20 20 20 20 20 20 20  sive ){.        
2a100 70 43 74 65 2d 3e 7a 43 74 65 45 72 72 20 3d 20  pCte->zCteErr = 
2a110 22 6d 75 6c 74 69 70 6c 65 20 72 65 63 75 72 73  "multiple recurs
2a120 69 76 65 20 72 65 66 65 72 65 6e 63 65 73 3a 20  ive references: 
2a130 25 73 22 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  %s";.      }else
2a140 7b 0a 20 20 20 20 20 20 20 20 70 43 74 65 2d 3e  {.        pCte->
2a150 7a 43 74 65 45 72 72 20 3d 20 22 72 65 63 75 72  zCteErr = "recur
2a160 73 69 76 65 20 72 65 66 65 72 65 6e 63 65 20 69  sive reference i
2a170 6e 20 61 20 73 75 62 71 75 65 72 79 3a 20 25 73  n a subquery: %s
2a180 22 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  ";.      }.     
2a190 20 73 71 6c 69 74 65 33 57 61 6c 6b 53 65 6c 65   sqlite3WalkSele
2a1a0 63 74 28 70 57 61 6c 6b 65 72 2c 20 70 53 65 6c  ct(pWalker, pSel
2a1b0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 43 74  );.    }.    pCt
2a1c0 65 2d 3e 7a 43 74 65 45 72 72 20 3d 20 30 3b 0a  e->zCteErr = 0;.
2a1d0 20 20 20 20 70 50 61 72 73 65 2d 3e 70 57 69 74      pParse->pWit
2a1e0 68 20 3d 20 70 53 61 76 65 64 57 69 74 68 3b 0a  h = pSavedWith;.
2a1f0 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53 51    }..  return SQ
2a200 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69  LITE_OK;.}.#endi
2a210 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  f..#ifndef SQLIT
2a220 45 5f 4f 4d 49 54 5f 43 54 45 0a 2f 2a 0a 2a 2a  E_OMIT_CTE./*.**
2a230 20 49 66 20 74 68 65 20 53 45 4c 45 43 54 20 70   If the SELECT p
2a240 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63  assed as the sec
2a250 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 68 61 73  ond argument has
2a260 20 61 6e 20 61 73 73 6f 63 69 61 74 65 64 20 57   an associated W
2a270 49 54 48 20 0a 2a 2a 20 63 6c 61 75 73 65 2c 20  ITH .** clause, 
2a280 70 6f 70 20 69 74 20 66 72 6f 6d 20 74 68 65 20  pop it from the 
2a290 73 74 61 63 6b 20 73 74 6f 72 65 64 20 61 73 20  stack stored as 
2a2a0 70 61 72 74 20 6f 66 20 74 68 65 20 50 61 72 73  part of the Pars
2a2b0 65 20 6f 62 6a 65 63 74 2e 0a 2a 2a 0a 2a 2a 20  e object..**.** 
2a2c0 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
2a2d0 20 75 73 65 64 20 61 73 20 74 68 65 20 78 53 65   used as the xSe
2a2e0 6c 65 63 74 43 61 6c 6c 62 61 63 6b 32 28 29 20  lectCallback2() 
2a2f0 63 61 6c 6c 62 61 63 6b 20 62 79 0a 2a 2a 20 73  callback by.** s
2a300 71 6c 69 74 65 33 53 65 6c 65 63 74 45 78 70 61  qlite3SelectExpa
2a310 6e 64 28 29 20 77 68 65 6e 20 77 61 6c 6b 69 6e  nd() when walkin
2a320 67 20 61 20 53 45 4c 45 43 54 20 74 72 65 65 20  g a SELECT tree 
2a330 74 6f 20 72 65 73 6f 6c 76 65 20 74 61 62 6c 65  to resolve table
2a340 0a 2a 2a 20 6e 61 6d 65 73 20 61 6e 64 20 6f 74  .** names and ot
2a350 68 65 72 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  her FROM clause 
2a360 65 6c 65 6d 65 6e 74 73 2e 20 0a 2a 2f 0a 73 74  elements. .*/.st
2a370 61 74 69 63 20 76 6f 69 64 20 73 65 6c 65 63 74  atic void select
2a380 50 6f 70 57 69 74 68 28 57 61 6c 6b 65 72 20 2a  PopWith(Walker *
2a390 70 57 61 6c 6b 65 72 2c 20 53 65 6c 65 63 74 20  pWalker, Select 
2a3a0 2a 70 29 7b 0a 20 20 50 61 72 73 65 20 2a 70 50  *p){.  Parse *pP
2a3b0 61 72 73 65 20 3d 20 70 57 61 6c 6b 65 72 2d 3e  arse = pWalker->
2a3c0 70 50 61 72 73 65 3b 0a 20 20 69 66 28 20 4f 4b  pParse;.  if( OK
2a3d0 5f 49 46 5f 41 4c 57 41 59 53 5f 54 52 55 45 28  _IF_ALWAYS_TRUE(
2a3e0 70 50 61 72 73 65 2d 3e 70 57 69 74 68 29 20 26  pParse->pWith) &
2a3f0 26 20 70 2d 3e 70 50 72 69 6f 72 3d 3d 30 20 29  & p->pPrior==0 )
2a400 7b 0a 20 20 20 20 57 69 74 68 20 2a 70 57 69 74  {.    With *pWit
2a410 68 20 3d 20 66 69 6e 64 52 69 67 68 74 6d 6f 73  h = findRightmos
2a420 74 28 70 29 2d 3e 70 57 69 74 68 3b 0a 20 20 20  t(p)->pWith;.   
2a430 20 69 66 28 20 70 57 69 74 68 21 3d 30 20 29 7b   if( pWith!=0 ){
2a440 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
2a450 50 61 72 73 65 2d 3e 70 57 69 74 68 3d 3d 70 57  Parse->pWith==pW
2a460 69 74 68 20 29 3b 0a 20 20 20 20 20 20 70 50 61  ith );.      pPa
2a470 72 73 65 2d 3e 70 57 69 74 68 20 3d 20 70 57 69  rse->pWith = pWi
2a480 74 68 2d 3e 70 4f 75 74 65 72 3b 0a 20 20 20 20  th->pOuter;.    
2a490 7d 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23 64  }.  }.}.#else.#d
2a4a0 65 66 69 6e 65 20 73 65 6c 65 63 74 50 6f 70 57  efine selectPopW
2a4b0 69 74 68 20 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a  ith 0.#endif../*
2a4c0 0a 2a 2a 20 54 68 65 20 53 72 63 4c 69 73 74 5f  .** The SrcList_
2a4d0 69 74 65 6d 20 73 74 72 75 63 74 75 72 65 20 70  item structure p
2a4e0 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63  assed as the sec
2a4f0 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 72 65 70  ond argument rep
2a500 72 65 73 65 6e 74 73 20 61 0a 2a 2a 20 73 75 62  resents a.** sub
2a510 2d 71 75 65 72 79 20 69 6e 20 74 68 65 20 46 52  -query in the FR
2a520 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 61 20 53  OM clause of a S
2a530 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e  ELECT statement.
2a540 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a   This function.*
2a550 2a 20 61 6c 6c 6f 63 61 74 65 73 20 61 6e 64 20  * allocates and 
2a560 70 6f 70 75 6c 61 74 65 73 20 74 68 65 20 53 72  populates the Sr
2a570 63 4c 69 73 74 5f 69 74 65 6d 2e 70 54 61 62 20  cList_item.pTab 
2a580 6f 62 6a 65 63 74 2e 20 49 66 20 73 75 63 63 65  object. If succe
2a590 73 73 66 75 6c 2c 0a 2a 2a 20 53 51 4c 49 54 45  ssful,.** SQLITE
2a5a0 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e  _OK is returned.
2a5b0 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 61   Otherwise, if a
2a5c0 6e 20 4f 4f 4d 20 65 72 72 6f 72 20 69 73 20 65  n OOM error is e
2a5d0 6e 63 6f 75 6e 74 65 72 65 64 2c 0a 2a 2a 20 53  ncountered,.** S
2a5e0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2e 0a 2a 2f 0a  QLITE_NOMEM..*/.
2a5f0 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 61 6e  int sqlite3Expan
2a600 64 53 75 62 71 75 65 72 79 28 50 61 72 73 65 20  dSubquery(Parse 
2a610 2a 70 50 61 72 73 65 2c 20 73 74 72 75 63 74 20  *pParse, struct 
2a620 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 46  SrcList_item *pF
2a630 72 6f 6d 29 7b 0a 20 20 53 65 6c 65 63 74 20 2a  rom){.  Select *
2a640 70 53 65 6c 20 3d 20 70 46 72 6f 6d 2d 3e 70 53  pSel = pFrom->pS
2a650 65 6c 65 63 74 3b 0a 20 20 54 61 62 6c 65 20 2a  elect;.  Table *
2a660 70 54 61 62 3b 0a 0a 20 20 61 73 73 65 72 74 28  pTab;..  assert(
2a670 20 70 53 65 6c 20 29 3b 0a 20 20 70 46 72 6f 6d   pSel );.  pFrom
2a680 2d 3e 70 54 61 62 20 3d 20 70 54 61 62 20 3d 20  ->pTab = pTab = 
2a690 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a  sqlite3DbMallocZ
2a6a0 65 72 6f 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ero(pParse->db, 
2a6b0 73 69 7a 65 6f 66 28 54 61 62 6c 65 29 29 3b 0a  sizeof(Table));.
2a6c0 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29 20    if( pTab==0 ) 
2a6d0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
2a6e0 4d 45 4d 3b 0a 20 20 70 54 61 62 2d 3e 6e 54 61  MEM;.  pTab->nTa
2a6f0 62 52 65 66 20 3d 20 31 3b 0a 20 20 69 66 28 20  bRef = 1;.  if( 
2a700 70 46 72 6f 6d 2d 3e 7a 41 6c 69 61 73 20 29 7b  pFrom->zAlias ){
2a710 0a 20 20 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  .    pTab->zName
2a720 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44   = sqlite3DbStrD
2a730 75 70 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  up(pParse->db, p
2a740 46 72 6f 6d 2d 3e 7a 41 6c 69 61 73 29 3b 0a 20  From->zAlias);. 
2a750 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 54 61 62   }else{.    pTab
2a760 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65  ->zName = sqlite
2a770 33 4d 50 72 69 6e 74 66 28 70 50 61 72 73 65 2d  3MPrintf(pParse-
2a780 3e 64 62 2c 20 22 73 75 62 71 75 65 72 79 5f 25  >db, "subquery_%
2a790 75 22 2c 20 70 53 65 6c 2d 3e 73 65 6c 49 64 29  u", pSel->selId)
2a7a0 3b 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28 20 70  ;.  }.  while( p
2a7b0 53 65 6c 2d 3e 70 50 72 69 6f 72 20 29 7b 20 70  Sel->pPrior ){ p
2a7c0 53 65 6c 20 3d 20 70 53 65 6c 2d 3e 70 50 72 69  Sel = pSel->pPri
2a7d0 6f 72 3b 20 7d 0a 20 20 73 71 6c 69 74 65 33 43  or; }.  sqlite3C
2a7e0 6f 6c 75 6d 6e 73 46 72 6f 6d 45 78 70 72 4c 69  olumnsFromExprLi
2a7f0 73 74 28 70 50 61 72 73 65 2c 20 70 53 65 6c 2d  st(pParse, pSel-
2a800 3e 70 45 4c 69 73 74 2c 26 70 54 61 62 2d 3e 6e  >pEList,&pTab->n
2a810 43 6f 6c 2c 26 70 54 61 62 2d 3e 61 43 6f 6c 29  Col,&pTab->aCol)
2a820 3b 0a 20 20 70 54 61 62 2d 3e 69 50 4b 65 79 20  ;.  pTab->iPKey 
2a830 3d 20 2d 31 3b 0a 20 20 70 54 61 62 2d 3e 6e 52  = -1;.  pTab->nR
2a840 6f 77 4c 6f 67 45 73 74 20 3d 20 32 30 30 3b 20  owLogEst = 200; 
2a850 61 73 73 65 72 74 28 20 32 30 30 3d 3d 73 71 6c  assert( 200==sql
2a860 69 74 65 33 4c 6f 67 45 73 74 28 31 30 34 38 35  ite3LogEst(10485
2a870 37 36 29 20 29 3b 0a 20 20 70 54 61 62 2d 3e 74  76) );.  pTab->t
2a880 61 62 46 6c 61 67 73 20 7c 3d 20 54 46 5f 45 70  abFlags |= TF_Ep
2a890 68 65 6d 65 72 61 6c 3b 0a 0a 20 20 72 65 74 75  hemeral;..  retu
2a8a0 72 6e 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20  rn pParse->nErr 
2a8b0 3f 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 20 3a  ? SQLITE_ERROR :
2a8c0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
2a8d0 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
2a8e0 65 20 69 73 20 61 20 57 61 6c 6b 65 72 20 63 61  e is a Walker ca
2a8f0 6c 6c 62 61 63 6b 20 66 6f 72 20 22 65 78 70 61  llback for "expa
2a900 6e 64 69 6e 67 22 20 61 20 53 45 4c 45 43 54 20  nding" a SELECT 
2a910 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 22 45  statement..** "E
2a920 78 70 61 6e 64 69 6e 67 22 20 6d 65 61 6e 73 20  xpanding" means 
2a930 74 6f 20 64 6f 20 74 68 65 20 66 6f 6c 6c 6f 77  to do the follow
2a940 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 28 31  ing:.**.**    (1
2a950 29 20 20 4d 61 6b 65 20 73 75 72 65 20 56 44 42  )  Make sure VDB
2a960 45 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 73  E cursor numbers
2a970 20 68 61 76 65 20 62 65 65 6e 20 61 73 73 69 67   have been assig
2a980 6e 65 64 20 74 6f 20 65 76 65 72 79 0a 2a 2a 20  ned to every.** 
2a990 20 20 20 20 20 20 20 20 65 6c 65 6d 65 6e 74 20          element 
2a9a0 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  of the FROM clau
2a9b0 73 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 32 29  se..**.**    (2)
2a9c0 20 20 46 69 6c 6c 20 69 6e 20 74 68 65 20 70 54    Fill in the pT
2a9d0 61 62 4c 69 73 74 2d 3e 61 5b 5d 2e 70 54 61 62  abList->a[].pTab
2a9e0 20 66 69 65 6c 64 73 20 69 6e 20 74 68 65 20 53   fields in the S
2a9f0 72 63 4c 69 73 74 20 74 68 61 74 20 0a 2a 2a 20  rcList that .** 
2aa00 20 20 20 20 20 20 20 20 64 65 66 69 6e 65 73 20          defines 
2aa10 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20 20 57 68  FROM clause.  Wh
2aa20 65 6e 20 76 69 65 77 73 20 61 70 70 65 61 72 20  en views appear 
2aa30 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  in the FROM clau
2aa40 73 65 2c 0a 2a 2a 20 20 20 20 20 20 20 20 20 66  se,.**         f
2aa50 69 6c 6c 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b  ill pTabList->a[
2aa60 5d 2e 70 53 65 6c 65 63 74 20 77 69 74 68 20 61  ].pSelect with a
2aa70 20 63 6f 70 79 20 6f 66 20 74 68 65 20 53 45 4c   copy of the SEL
2aa80 45 43 54 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a  ECT statement.**
2aa90 20 20 20 20 20 20 20 20 20 74 68 61 74 20 69 6d           that im
2aaa0 70 6c 65 6d 65 6e 74 73 20 74 68 65 20 76 69 65  plements the vie
2aab0 77 2e 20 20 41 20 63 6f 70 79 20 69 73 20 6d 61  w.  A copy is ma
2aac0 64 65 20 6f 66 20 74 68 65 20 76 69 65 77 27 73  de of the view's
2aad0 20 53 45 4c 45 43 54 0a 2a 2a 20 20 20 20 20 20   SELECT.**      
2aae0 20 20 20 73 74 61 74 65 6d 65 6e 74 20 73 6f 20     statement so 
2aaf0 74 68 61 74 20 77 65 20 63 61 6e 20 66 72 65 65  that we can free
2ab00 6c 79 20 6d 6f 64 69 66 79 20 6f 72 20 64 65 6c  ly modify or del
2ab10 65 74 65 20 74 68 61 74 20 73 74 61 74 65 6d 65  ete that stateme
2ab20 6e 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 77 69  nt.**         wi
2ab30 74 68 6f 75 74 20 77 6f 72 72 79 69 6e 67 20 61  thout worrying a
2ab40 62 6f 75 74 20 6d 65 73 73 69 6e 67 20 75 70 20  bout messing up 
2ab50 74 68 65 20 70 65 72 73 69 73 74 65 6e 74 20 72  the persistent r
2ab60 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 0a 2a 2a  epresentation.**
2ab70 20 20 20 20 20 20 20 20 20 6f 66 20 74 68 65 20           of the 
2ab80 76 69 65 77 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28  view..**.**    (
2ab90 33 29 20 20 41 64 64 20 74 65 72 6d 73 20 74 6f  3)  Add terms to
2aba0 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
2abb0 65 20 74 6f 20 61 63 63 6f 6d 6d 6f 64 61 74 65  e to accommodate
2abc0 20 74 68 65 20 4e 41 54 55 52 41 4c 20 6b 65 79   the NATURAL key
2abd0 77 6f 72 64 0a 2a 2a 20 20 20 20 20 20 20 20 20  word.**         
2abe0 6f 6e 20 6a 6f 69 6e 73 20 61 6e 64 20 74 68 65  on joins and the
2abf0 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20 63 6c   ON and USING cl
2ac00 61 75 73 65 20 6f 66 20 6a 6f 69 6e 73 2e 0a 2a  ause of joins..*
2ac10 2a 0a 2a 2a 20 20 20 20 28 34 29 20 20 53 63 61  *.**    (4)  Sca
2ac20 6e 20 74 68 65 20 6c 69 73 74 20 6f 66 20 63 6f  n the list of co
2ac30 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 72 65 73  lumns in the res
2ac40 75 6c 74 20 73 65 74 20 28 70 45 4c 69 73 74 29  ult set (pEList)
2ac50 20 6c 6f 6f 6b 69 6e 67 0a 2a 2a 20 20 20 20 20   looking.**     
2ac60 20 20 20 20 66 6f 72 20 69 6e 73 74 61 6e 63 65      for instance
2ac70 73 20 6f 66 20 74 68 65 20 22 2a 22 20 6f 70 65  s of the "*" ope
2ac80 72 61 74 6f 72 20 6f 72 20 74 68 65 20 54 41 42  rator or the TAB
2ac90 4c 45 2e 2a 20 6f 70 65 72 61 74 6f 72 2e 0a 2a  LE.* operator..*
2aca0 2a 20 20 20 20 20 20 20 20 20 49 66 20 66 6f 75  *         If fou
2acb0 6e 64 2c 20 65 78 70 61 6e 64 20 65 61 63 68 20  nd, expand each 
2acc0 22 2a 22 20 74 6f 20 62 65 20 65 76 65 72 79 20  "*" to be every 
2acd0 63 6f 6c 75 6d 6e 20 69 6e 20 65 76 65 72 79 20  column in every 
2ace0 74 61 62 6c 65 0a 2a 2a 20 20 20 20 20 20 20 20  table.**        
2acf0 20 61 6e 64 20 54 41 42 4c 45 2e 2a 20 74 6f 20   and TABLE.* to 
2ad00 62 65 20 65 76 65 72 79 20 63 6f 6c 75 6d 6e 20  be every column 
2ad10 69 6e 20 54 41 42 4c 45 2e 0a 2a 2a 0a 2a 2f 0a  in TABLE..**.*/.
2ad20 73 74 61 74 69 63 20 69 6e 74 20 73 65 6c 65 63  static int selec
2ad30 74 45 78 70 61 6e 64 65 72 28 57 61 6c 6b 65 72  tExpander(Walker
2ad40 20 2a 70 57 61 6c 6b 65 72 2c 20 53 65 6c 65 63   *pWalker, Selec
2ad50 74 20 2a 70 29 7b 0a 20 20 50 61 72 73 65 20 2a  t *p){.  Parse *
2ad60 70 50 61 72 73 65 20 3d 20 70 57 61 6c 6b 65 72  pParse = pWalker
2ad70 2d 3e 70 50 61 72 73 65 3b 0a 20 20 69 6e 74 20  ->pParse;.  int 
2ad80 69 2c 20 6a 2c 20 6b 3b 0a 20 20 53 72 63 4c 69  i, j, k;.  SrcLi
2ad90 73 74 20 2a 70 54 61 62 4c 69 73 74 3b 0a 20 20  st *pTabList;.  
2ada0 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74  ExprList *pEList
2adb0 3b 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69  ;.  struct SrcLi
2adc0 73 74 5f 69 74 65 6d 20 2a 70 46 72 6f 6d 3b 0a  st_item *pFrom;.
2add0 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
2ade0 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 45 78  pParse->db;.  Ex
2adf0 70 72 20 2a 70 45 2c 20 2a 70 52 69 67 68 74 2c  pr *pE, *pRight,
2ae00 20 2a 70 45 78 70 72 3b 0a 20 20 75 31 36 20 73   *pExpr;.  u16 s
2ae10 65 6c 46 6c 61 67 73 20 3d 20 70 2d 3e 73 65 6c  elFlags = p->sel
2ae20 46 6c 61 67 73 3b 0a 20 20 75 33 32 20 65 6c 69  Flags;.  u32 eli
2ae30 73 74 46 6c 61 67 73 20 3d 20 30 3b 0a 0a 20 20  stFlags = 0;..  
2ae40 70 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53  p->selFlags |= S
2ae50 46 5f 45 78 70 61 6e 64 65 64 3b 0a 20 20 69 66  F_Expanded;.  if
2ae60 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
2ae70 65 64 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ed  ){.    retur
2ae80 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 7d  n WRC_Abort;.  }
2ae90 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 53  .  assert( p->pS
2aea0 72 63 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 28  rc!=0 );.  if( (
2aeb0 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 45 78  selFlags & SF_Ex
2aec0 70 61 6e 64 65 64 29 21 3d 30 20 29 7b 0a 20 20  panded)!=0 ){.  
2aed0 20 20 72 65 74 75 72 6e 20 57 52 43 5f 50 72 75    return WRC_Pru
2aee0 6e 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 57  ne;.  }.  if( pW
2aef0 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 20 29 7b 0a  alker->eCode ){.
2af00 20 20 20 20 2f 2a 20 52 65 6e 75 6d 62 65 72 20      /* Renumber 
2af10 73 65 6c 49 64 20 62 65 63 61 75 73 65 20 69 74  selId because it
2af20 20 68 61 73 20 62 65 65 6e 20 63 6f 70 69 65 64   has been copied
2af30 20 66 72 6f 6d 20 61 20 76 69 65 77 20 2a 2f 0a   from a view */.
2af40 20 20 20 20 70 2d 3e 73 65 6c 49 64 20 3d 20 2b      p->selId = +
2af50 2b 70 50 61 72 73 65 2d 3e 6e 53 65 6c 65 63 74  +pParse->nSelect
2af60 3b 0a 20 20 7d 0a 20 20 70 54 61 62 4c 69 73 74  ;.  }.  pTabList
2af70 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 70 45   = p->pSrc;.  pE
2af80 4c 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74  List = p->pEList
2af90 3b 0a 20 20 73 71 6c 69 74 65 33 57 69 74 68 50  ;.  sqlite3WithP
2afa0 75 73 68 28 70 50 61 72 73 65 2c 20 70 2d 3e 70  ush(pParse, p->p
2afb0 57 69 74 68 2c 20 30 29 3b 0a 0a 20 20 2f 2a 20  With, 0);..  /* 
2afc0 4d 61 6b 65 20 73 75 72 65 20 63 75 72 73 6f 72  Make sure cursor
2afd0 20 6e 75 6d 62 65 72 73 20 68 61 76 65 20 62 65   numbers have be
2afe0 65 6e 20 61 73 73 69 67 6e 65 64 20 74 6f 20 61  en assigned to a
2aff0 6c 6c 20 65 6e 74 72 69 65 73 20 69 6e 0a 20 20  ll entries in.  
2b000 2a 2a 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  ** the FROM clau
2b010 73 65 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54  se of the SELECT
2b020 20 73 74 61 74 65 6d 65 6e 74 2e 0a 20 20 2a 2f   statement..  */
2b030 0a 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73  .  sqlite3SrcLis
2b040 74 41 73 73 69 67 6e 43 75 72 73 6f 72 73 28 70  tAssignCursors(p
2b050 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74 29  Parse, pTabList)
2b060 3b 0a 0a 20 20 2f 2a 20 4c 6f 6f 6b 20 75 70 20  ;..  /* Look up 
2b070 65 76 65 72 79 20 74 61 62 6c 65 20 6e 61 6d 65  every table name
2b080 64 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c  d in the FROM cl
2b090 61 75 73 65 20 6f 66 20 74 68 65 20 73 65 6c 65  ause of the sele
2b0a0 63 74 2e 20 20 49 66 0a 20 20 2a 2a 20 61 6e 20  ct.  If.  ** an 
2b0b0 65 6e 74 72 79 20 6f 66 20 74 68 65 20 46 52 4f  entry of the FRO
2b0c0 4d 20 63 6c 61 75 73 65 20 69 73 20 61 20 73 75  M clause is a su
2b0d0 62 71 75 65 72 79 20 69 6e 73 74 65 61 64 20 6f  bquery instead o
2b0e0 66 20 61 20 74 61 62 6c 65 20 6f 72 20 76 69 65  f a table or vie
2b0f0 77 2c 0a 20 20 2a 2a 20 74 68 65 6e 20 63 72 65  w,.  ** then cre
2b100 61 74 65 20 61 20 74 72 61 6e 73 69 65 6e 74 20  ate a transient 
2b110 74 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 20  table structure 
2b120 74 6f 20 64 65 73 63 72 69 62 65 20 74 68 65 20  to describe the 
2b130 73 75 62 71 75 65 72 79 2e 0a 20 20 2a 2f 0a 20  subquery..  */. 
2b140 20 66 6f 72 28 69 3d 30 2c 20 70 46 72 6f 6d 3d   for(i=0, pFrom=
2b150 70 54 61 62 4c 69 73 74 2d 3e 61 3b 20 69 3c 70  pTabList->a; i<p
2b160 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69  TabList->nSrc; i
2b170 2b 2b 2c 20 70 46 72 6f 6d 2b 2b 29 7b 0a 20 20  ++, pFrom++){.  
2b180 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20    Table *pTab;. 
2b190 20 20 20 61 73 73 65 72 74 28 20 70 46 72 6f 6d     assert( pFrom
2b1a0 2d 3e 66 67 2e 69 73 52 65 63 75 72 73 69 76 65  ->fg.isRecursive
2b1b0 3d 3d 30 20 7c 7c 20 70 46 72 6f 6d 2d 3e 70 54  ==0 || pFrom->pT
2b1c0 61 62 21 3d 30 20 29 3b 0a 20 20 20 20 69 66 28  ab!=0 );.    if(
2b1d0 20 70 46 72 6f 6d 2d 3e 66 67 2e 69 73 52 65 63   pFrom->fg.isRec
2b1e0 75 72 73 69 76 65 20 29 20 63 6f 6e 74 69 6e 75  ursive ) continu
2b1f0 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  e;.    assert( p
2b200 46 72 6f 6d 2d 3e 70 54 61 62 3d 3d 30 20 29 3b  From->pTab==0 );
2b210 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
2b220 4f 4d 49 54 5f 43 54 45 0a 20 20 20 20 69 66 28  OMIT_CTE.    if(
2b230 20 77 69 74 68 45 78 70 61 6e 64 28 70 57 61 6c   withExpand(pWal
2b240 6b 65 72 2c 20 70 46 72 6f 6d 29 20 29 20 72 65  ker, pFrom) ) re
2b250 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a  turn WRC_Abort;.
2b260 20 20 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e 70      if( pFrom->p
2b270 54 61 62 20 29 20 7b 7d 20 65 6c 73 65 0a 23 65  Tab ) {} else.#e
2b280 6e 64 69 66 0a 20 20 20 20 69 66 28 20 70 46 72  ndif.    if( pFr
2b290 6f 6d 2d 3e 7a 4e 61 6d 65 3d 3d 30 20 29 7b 0a  om->zName==0 ){.
2b2a0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
2b2b0 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20 20  MIT_SUBQUERY.   
2b2c0 20 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 20     Select *pSel 
2b2d0 3d 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74  = pFrom->pSelect
2b2e0 3b 0a 20 20 20 20 20 20 2f 2a 20 41 20 73 75 62  ;.      /* A sub
2b2f0 2d 71 75 65 72 79 20 69 6e 20 74 68 65 20 46 52  -query in the FR
2b300 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 61 20 53  OM clause of a S
2b310 45 4c 45 43 54 20 2a 2f 0a 20 20 20 20 20 20 61  ELECT */.      a
2b320 73 73 65 72 74 28 20 70 53 65 6c 21 3d 30 20 29  ssert( pSel!=0 )
2b330 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
2b340 70 46 72 6f 6d 2d 3e 70 54 61 62 3d 3d 30 20 29  pFrom->pTab==0 )
2b350 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  ;.      if( sqli
2b360 74 65 33 57 61 6c 6b 53 65 6c 65 63 74 28 70 57  te3WalkSelect(pW
2b370 61 6c 6b 65 72 2c 20 70 53 65 6c 29 20 29 20 72  alker, pSel) ) r
2b380 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b  eturn WRC_Abort;
2b390 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
2b3a0 65 33 45 78 70 61 6e 64 53 75 62 71 75 65 72 79  e3ExpandSubquery
2b3b0 28 70 50 61 72 73 65 2c 20 70 46 72 6f 6d 29 20  (pParse, pFrom) 
2b3c0 29 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f  ) return WRC_Abo
2b3d0 72 74 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d  rt;.#endif.    }
2b3e0 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 41  else{.      /* A
2b3f0 6e 20 6f 72 64 69 6e 61 72 79 20 74 61 62 6c 65  n ordinary table
2b400 20 6f 72 20 76 69 65 77 20 6e 61 6d 65 20 69 6e   or view name in
2b410 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
2b420 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74   */.      assert
2b430 28 20 70 46 72 6f 6d 2d 3e 70 54 61 62 3d 3d 30  ( pFrom->pTab==0
2b440 20 29 3b 0a 20 20 20 20 20 20 70 46 72 6f 6d 2d   );.      pFrom-
2b450 3e 70 54 61 62 20 3d 20 70 54 61 62 20 3d 20 73  >pTab = pTab = s
2b460 71 6c 69 74 65 33 4c 6f 63 61 74 65 54 61 62 6c  qlite3LocateTabl
2b470 65 49 74 65 6d 28 70 50 61 72 73 65 2c 20 30 2c  eItem(pParse, 0,
2b480 20 70 46 72 6f 6d 29 3b 0a 20 20 20 20 20 20 69   pFrom);.      i
2b490 66 28 20 70 54 61 62 3d 3d 30 20 29 20 72 65 74  f( pTab==0 ) ret
2b4a0 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20  urn WRC_Abort;. 
2b4b0 20 20 20 20 20 69 66 28 20 70 54 61 62 2d 3e 6e       if( pTab->n
2b4c0 54 61 62 52 65 66 3e 3d 30 78 66 66 66 66 20 29  TabRef>=0xffff )
2b4d0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
2b4e0 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
2b4f0 2c 20 22 74 6f 6f 20 6d 61 6e 79 20 72 65 66 65  , "too many refe
2b500 72 65 6e 63 65 73 20 74 6f 20 5c 22 25 73 5c 22  rences to \"%s\"
2b510 3a 20 6d 61 78 20 36 35 35 33 35 22 2c 0a 20 20  : max 65535",.  
2b520 20 20 20 20 20 20 20 20 20 70 54 61 62 2d 3e 7a           pTab->z
2b530 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 70  Name);.        p
2b540 46 72 6f 6d 2d 3e 70 54 61 62 20 3d 20 30 3b 0a  From->pTab = 0;.
2b550 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 57          return W
2b560 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 20 20  RC_Abort;.      
2b570 7d 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 6e 54  }.      pTab->nT
2b580 61 62 52 65 66 2b 2b 3b 0a 20 20 20 20 20 20 69  abRef++;.      i
2b590 66 28 20 21 49 73 56 69 72 74 75 61 6c 28 70 54  f( !IsVirtual(pT
2b5a0 61 62 29 20 26 26 20 63 61 6e 6e 6f 74 42 65 46  ab) && cannotBeF
2b5b0 75 6e 63 74 69 6f 6e 28 70 50 61 72 73 65 2c 20  unction(pParse, 
2b5c0 70 46 72 6f 6d 29 20 29 7b 0a 20 20 20 20 20 20  pFrom) ){.      
2b5d0 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f    return WRC_Abo
2b5e0 72 74 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66 20  rt;.      }.#if 
2b5f0 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
2b600 4f 4d 49 54 5f 56 49 45 57 29 20 7c 7c 20 21 64  OMIT_VIEW) || !d
2b610 65 66 69 6e 65 64 20 28 53 51 4c 49 54 45 5f 4f  efined (SQLITE_O
2b620 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
2b630 29 0a 20 20 20 20 20 20 69 66 28 20 49 73 56 69  ).      if( IsVi
2b640 72 74 75 61 6c 28 70 54 61 62 29 20 7c 7c 20 70  rtual(pTab) || p
2b650 54 61 62 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a  Tab->pSelect ){.
2b660 20 20 20 20 20 20 20 20 69 31 36 20 6e 43 6f 6c          i16 nCol
2b670 3b 0a 20 20 20 20 20 20 20 20 75 38 20 65 43 6f  ;.        u8 eCo
2b680 64 65 4f 72 69 67 20 3d 20 70 57 61 6c 6b 65 72  deOrig = pWalker
2b690 2d 3e 65 43 6f 64 65 3b 0a 20 20 20 20 20 20 20  ->eCode;.       
2b6a0 20 69 66 28 20 73 71 6c 69 74 65 33 56 69 65 77   if( sqlite3View
2b6b0 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70  GetColumnNames(p
2b6c0 50 61 72 73 65 2c 20 70 54 61 62 29 20 29 20 72  Parse, pTab) ) r
2b6d0 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b  eturn WRC_Abort;
2b6e0 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
2b6f0 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 3d   pFrom->pSelect=
2b700 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66  =0 );.        if
2b710 28 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 20  ( pTab->pSelect 
2b720 26 26 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20  && (db->flags & 
2b730 53 51 4c 49 54 45 5f 45 6e 61 62 6c 65 56 69 65  SQLITE_EnableVie
2b740 77 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  w)==0 ){.       
2b750 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
2b760 73 67 28 70 50 61 72 73 65 2c 20 22 61 63 63 65  sg(pParse, "acce
2b770 73 73 20 74 6f 20 76 69 65 77 20 5c 22 25 73 5c  ss to view \"%s\
2b780 22 20 70 72 6f 68 69 62 69 74 65 64 22 2c 0a 20  " prohibited",. 
2b790 20 20 20 20 20 20 20 20 20 20 20 20 20 70 54 61               pTa
2b7a0 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  b->zName);.     
2b7b0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 46 72     }.        pFr
2b7c0 6f 6d 2d 3e 70 53 65 6c 65 63 74 20 3d 20 73 71  om->pSelect = sq
2b7d0 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 64  lite3SelectDup(d
2b7e0 62 2c 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74  b, pTab->pSelect
2b7f0 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 6e 43  , 0);.        nC
2b800 6f 6c 20 3d 20 70 54 61 62 2d 3e 6e 43 6f 6c 3b  ol = pTab->nCol;
2b810 0a 20 20 20 20 20 20 20 20 70 54 61 62 2d 3e 6e  .        pTab->n
2b820 43 6f 6c 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20  Col = -1;.      
2b830 20 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65    pWalker->eCode
2b840 20 3d 20 31 3b 20 20 2f 2a 20 54 75 72 6e 20 6f   = 1;  /* Turn o
2b850 6e 20 53 65 6c 65 63 74 2e 73 65 6c 49 64 20 72  n Select.selId r
2b860 65 6e 75 6d 62 65 72 69 6e 67 20 2a 2f 0a 20 20  enumbering */.  
2b870 20 20 20 20 20 20 73 71 6c 69 74 65 33 57 61 6c        sqlite3Wal
2b880 6b 53 65 6c 65 63 74 28 70 57 61 6c 6b 65 72 2c  kSelect(pWalker,
2b890 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 29   pFrom->pSelect)
2b8a0 3b 0a 20 20 20 20 20 20 20 20 70 57 61 6c 6b 65  ;.        pWalke
2b8b0 72 2d 3e 65 43 6f 64 65 20 3d 20 65 43 6f 64 65  r->eCode = eCode
2b8c0 4f 72 69 67 3b 0a 20 20 20 20 20 20 20 20 70 54  Orig;.        pT
2b8d0 61 62 2d 3e 6e 43 6f 6c 20 3d 20 6e 43 6f 6c 3b  ab->nCol = nCol;
2b8e0 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  .      }.#endif.
2b8f0 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4c 6f      }..    /* Lo
2b900 63 61 74 65 20 74 68 65 20 69 6e 64 65 78 20 6e  cate the index n
2b910 61 6d 65 64 20 62 79 20 74 68 65 20 49 4e 44 45  amed by the INDE
2b920 58 45 44 20 42 59 20 63 6c 61 75 73 65 2c 20 69  XED BY clause, i
2b930 66 20 61 6e 79 2e 20 2a 2f 0a 20 20 20 20 69 66  f any. */.    if
2b940 28 20 73 71 6c 69 74 65 33 49 6e 64 65 78 65 64  ( sqlite3Indexed
2b950 42 79 4c 6f 6f 6b 75 70 28 70 50 61 72 73 65 2c  ByLookup(pParse,
2b960 20 70 46 72 6f 6d 29 20 29 7b 0a 20 20 20 20 20   pFrom) ){.     
2b970 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72   return WRC_Abor
2b980 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  t;.    }.  }..  
2b990 2f 2a 20 50 72 6f 63 65 73 73 20 4e 41 54 55 52  /* Process NATUR
2b9a0 41 4c 20 6b 65 79 77 6f 72 64 73 2c 20 61 6e 64  AL keywords, and
2b9b0 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20 63 6c   ON and USING cl
2b9c0 61 75 73 65 73 20 6f 66 20 6a 6f 69 6e 73 2e 0a  auses of joins..
2b9d0 20 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 6d    */.  if( db->m
2b9e0 61 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20 73  allocFailed || s
2b9f0 71 6c 69 74 65 50 72 6f 63 65 73 73 4a 6f 69 6e  qliteProcessJoin
2ba00 28 70 50 61 72 73 65 2c 20 70 29 20 29 7b 0a 20  (pParse, p) ){. 
2ba10 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62     return WRC_Ab
2ba20 6f 72 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46  ort;.  }..  /* F
2ba30 6f 72 20 65 76 65 72 79 20 22 2a 22 20 74 68 61  or every "*" tha
2ba40 74 20 6f 63 63 75 72 73 20 69 6e 20 74 68 65 20  t occurs in the 
2ba50 63 6f 6c 75 6d 6e 20 6c 69 73 74 2c 20 69 6e 73  column list, ins
2ba60 65 72 74 20 74 68 65 20 6e 61 6d 65 73 20 6f 66  ert the names of
2ba70 0a 20 20 2a 2a 20 61 6c 6c 20 63 6f 6c 75 6d 6e  .  ** all column
2ba80 73 20 69 6e 20 61 6c 6c 20 74 61 62 6c 65 73 2e  s in all tables.
2ba90 20 20 41 6e 64 20 66 6f 72 20 65 76 65 72 79 20    And for every 
2baa0 54 41 42 4c 45 2e 2a 20 69 6e 73 65 72 74 20 74  TABLE.* insert t
2bab0 68 65 20 6e 61 6d 65 73 0a 20 20 2a 2a 20 6f 66  he names.  ** of
2bac0 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 69 6e 20   all columns in 
2bad0 54 41 42 4c 45 2e 20 20 54 68 65 20 70 61 72 73  TABLE.  The pars
2bae0 65 72 20 69 6e 73 65 72 74 65 64 20 61 20 73 70  er inserted a sp
2baf0 65 63 69 61 6c 20 65 78 70 72 65 73 73 69 6f 6e  ecial expression
2bb00 0a 20 20 2a 2a 20 77 69 74 68 20 74 68 65 20 54  .  ** with the T
2bb10 4b 5f 41 53 54 45 52 49 53 4b 20 6f 70 65 72 61  K_ASTERISK opera
2bb20 74 6f 72 20 66 6f 72 20 65 61 63 68 20 22 2a 22  tor for each "*"
2bb30 20 74 68 61 74 20 69 74 20 66 6f 75 6e 64 20 69   that it found i
2bb40 6e 20 74 68 65 20 63 6f 6c 75 6d 6e 0a 20 20 2a  n the column.  *
2bb50 2a 20 6c 69 73 74 2e 20 20 54 68 65 20 66 6f 6c  * list.  The fol
2bb60 6c 6f 77 69 6e 67 20 63 6f 64 65 20 6a 75 73 74  lowing code just
2bb70 20 68 61 73 20 74 6f 20 6c 6f 63 61 74 65 20 74   has to locate t
2bb80 68 65 20 54 4b 5f 41 53 54 45 52 49 53 4b 0a 20  he TK_ASTERISK. 
2bb90 20 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 73 20   ** expressions 
2bba0 61 6e 64 20 65 78 70 61 6e 64 20 65 61 63 68 20  and expand each 
2bbb0 6f 6e 65 20 74 6f 20 74 68 65 20 6c 69 73 74 20  one to the list 
2bbc0 6f 66 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 69  of all columns i
2bbd0 6e 0a 20 20 2a 2a 20 61 6c 6c 20 74 61 62 6c 65  n.  ** all table
2bbe0 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65  s..  **.  ** The
2bbf0 20 66 69 72 73 74 20 6c 6f 6f 70 20 6a 75 73 74   first loop just
2bc00 20 63 68 65 63 6b 73 20 74 6f 20 73 65 65 20 69   checks to see i
2bc10 66 20 74 68 65 72 65 20 61 72 65 20 61 6e 79 20  f there are any 
2bc20 22 2a 22 20 6f 70 65 72 61 74 6f 72 73 0a 20 20  "*" operators.  
2bc30 2a 2a 20 74 68 61 74 20 6e 65 65 64 20 65 78 70  ** that need exp
2bc40 61 6e 64 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20 66  anding..  */.  f
2bc50 6f 72 28 6b 3d 30 3b 20 6b 3c 70 45 4c 69 73 74  or(k=0; k<pEList
2bc60 2d 3e 6e 45 78 70 72 3b 20 6b 2b 2b 29 7b 0a 20  ->nExpr; k++){. 
2bc70 20 20 20 70 45 20 3d 20 70 45 4c 69 73 74 2d 3e     pE = pEList->
2bc80 61 5b 6b 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  a[k].pExpr;.    
2bc90 69 66 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 41  if( pE->op==TK_A
2bca0 53 54 45 52 49 53 4b 20 29 20 62 72 65 61 6b 3b  STERISK ) break;
2bcb0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 45 2d  .    assert( pE-
2bcc0 3e 6f 70 21 3d 54 4b 5f 44 4f 54 20 7c 7c 20 70  >op!=TK_DOT || p
2bcd0 45 2d 3e 70 52 69 67 68 74 21 3d 30 20 29 3b 0a  E->pRight!=0 );.
2bce0 20 20 20 20 61 73 73 65 72 74 28 20 70 45 2d 3e      assert( pE->
2bcf0 6f 70 21 3d 54 4b 5f 44 4f 54 20 7c 7c 20 28 70  op!=TK_DOT || (p
2bd00 45 2d 3e 70 4c 65 66 74 21 3d 30 20 26 26 20 70  E->pLeft!=0 && p
2bd10 45 2d 3e 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b  E->pLeft->op==TK
2bd20 5f 49 44 29 20 29 3b 0a 20 20 20 20 69 66 28 20  _ID) );.    if( 
2bd30 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f 54 20 26  pE->op==TK_DOT &
2bd40 26 20 70 45 2d 3e 70 52 69 67 68 74 2d 3e 6f 70  & pE->pRight->op
2bd50 3d 3d 54 4b 5f 41 53 54 45 52 49 53 4b 20 29 20  ==TK_ASTERISK ) 
2bd60 62 72 65 61 6b 3b 0a 20 20 20 20 65 6c 69 73 74  break;.    elist
2bd70 46 6c 61 67 73 20 7c 3d 20 70 45 2d 3e 66 6c 61  Flags |= pE->fla
2bd80 67 73 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6b 3c  gs;.  }.  if( k<
2bd90 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 7b  pEList->nExpr ){
2bda0 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 49  .    /*.    ** I
2bdb0 66 20 77 65 20 67 65 74 20 68 65 72 65 20 69 74  f we get here it
2bdc0 20 6d 65 61 6e 73 20 74 68 65 20 72 65 73 75 6c   means the resul
2bdd0 74 20 73 65 74 20 63 6f 6e 74 61 69 6e 73 20 6f  t set contains o
2bde0 6e 65 20 6f 72 20 6d 6f 72 65 20 22 2a 22 0a 20  ne or more "*". 
2bdf0 20 20 20 2a 2a 20 6f 70 65 72 61 74 6f 72 73 20     ** operators 
2be00 74 68 61 74 20 6e 65 65 64 20 74 6f 20 62 65 20  that need to be 
2be10 65 78 70 61 6e 64 65 64 2e 20 20 4c 6f 6f 70 20  expanded.  Loop 
2be20 74 68 72 6f 75 67 68 20 65 61 63 68 20 65 78 70  through each exp
2be30 72 65 73 73 69 6f 6e 0a 20 20 20 20 2a 2a 20 69  ression.    ** i
2be40 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  n the result set
2be50 20 61 6e 64 20 65 78 70 61 6e 64 20 74 68 65 6d   and expand them
2be60 20 6f 6e 65 20 62 79 20 6f 6e 65 2e 0a 20 20 20   one by one..   
2be70 20 2a 2f 0a 20 20 20 20 73 74 72 75 63 74 20 45   */.    struct E
2be80 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 61 20  xprList_item *a 
2be90 3d 20 70 45 4c 69 73 74 2d 3e 61 3b 0a 20 20 20  = pEList->a;.   
2bea0 20 45 78 70 72 4c 69 73 74 20 2a 70 4e 65 77 20   ExprList *pNew 
2beb0 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 66 6c 61  = 0;.    int fla
2bec0 67 73 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d  gs = pParse->db-
2bed0 3e 66 6c 61 67 73 3b 0a 20 20 20 20 69 6e 74 20  >flags;.    int 
2bee0 6c 6f 6e 67 4e 61 6d 65 73 20 3d 20 28 66 6c 61  longNames = (fla
2bef0 67 73 20 26 20 53 51 4c 49 54 45 5f 46 75 6c 6c  gs & SQLITE_Full
2bf00 43 6f 6c 4e 61 6d 65 73 29 21 3d 30 0a 20 20 20  ColNames)!=0.   
2bf10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bf20 20 20 20 26 26 20 28 66 6c 61 67 73 20 26 20 53     && (flags & S
2bf30 51 4c 49 54 45 5f 53 68 6f 72 74 43 6f 6c 4e 61  QLITE_ShortColNa
2bf40 6d 65 73 29 3d 3d 30 3b 0a 0a 20 20 20 20 66 6f  mes)==0;..    fo
2bf50 72 28 6b 3d 30 3b 20 6b 3c 70 45 4c 69 73 74 2d  r(k=0; k<pEList-
2bf60 3e 6e 45 78 70 72 3b 20 6b 2b 2b 29 7b 0a 20 20  >nExpr; k++){.  
2bf70 20 20 20 20 70 45 20 3d 20 61 5b 6b 5d 2e 70 45      pE = a[k].pE
2bf80 78 70 72 3b 0a 20 20 20 20 20 20 65 6c 69 73 74  xpr;.      elist
2bf90 46 6c 61 67 73 20 7c 3d 20 70 45 2d 3e 66 6c 61  Flags |= pE->fla
2bfa0 67 73 3b 0a 20 20 20 20 20 20 70 52 69 67 68 74  gs;.      pRight
2bfb0 20 3d 20 70 45 2d 3e 70 52 69 67 68 74 3b 0a 20   = pE->pRight;. 
2bfc0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45 2d       assert( pE-
2bfd0 3e 6f 70 21 3d 54 4b 5f 44 4f 54 20 7c 7c 20 70  >op!=TK_DOT || p
2bfe0 52 69 67 68 74 21 3d 30 20 29 3b 0a 20 20 20 20  Right!=0 );.    
2bff0 20 20 69 66 28 20 70 45 2d 3e 6f 70 21 3d 54 4b    if( pE->op!=TK
2c000 5f 41 53 54 45 52 49 53 4b 0a 20 20 20 20 20 20  _ASTERISK.      
2c010 20 26 26 20 28 70 45 2d 3e 6f 70 21 3d 54 4b 5f   && (pE->op!=TK_
2c020 44 4f 54 20 7c 7c 20 70 52 69 67 68 74 2d 3e 6f  DOT || pRight->o
2c030 70 21 3d 54 4b 5f 41 53 54 45 52 49 53 4b 29 0a  p!=TK_ASTERISK).
2c040 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
2c050 20 2f 2a 20 54 68 69 73 20 70 61 72 74 69 63 75   /* This particu
2c060 6c 61 72 20 65 78 70 72 65 73 73 69 6f 6e 20 64  lar expression d
2c070 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20  oes not need to 
2c080 62 65 20 65 78 70 61 6e 64 65 64 2e 0a 20 20 20  be expanded..   
2c090 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
2c0a0 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 45 78  pNew = sqlite3Ex
2c0b0 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61  prListAppend(pPa
2c0c0 72 73 65 2c 20 70 4e 65 77 2c 20 61 5b 6b 5d 2e  rse, pNew, a[k].
2c0d0 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20  pExpr);.        
2c0e0 69 66 28 20 70 4e 65 77 20 29 7b 0a 20 20 20 20  if( pNew ){.    
2c0f0 20 20 20 20 20 20 70 4e 65 77 2d 3e 61 5b 70 4e        pNew->a[pN
2c100 65 77 2d 3e 6e 45 78 70 72 2d 31 5d 2e 7a 4e 61  ew->nExpr-1].zNa
2c110 6d 65 20 3d 20 61 5b 6b 5d 2e 7a 4e 61 6d 65 3b  me = a[k].zName;
2c120 0a 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d  .          pNew-
2c130 3e 61 5b 70 4e 65 77 2d 3e 6e 45 78 70 72 2d 31  >a[pNew->nExpr-1
2c140 5d 2e 7a 53 70 61 6e 20 3d 20 61 5b 6b 5d 2e 7a  ].zSpan = a[k].z
2c150 53 70 61 6e 3b 0a 20 20 20 20 20 20 20 20 20 20  Span;.          
2c160 61 5b 6b 5d 2e 7a 4e 61 6d 65 20 3d 20 30 3b 0a  a[k].zName = 0;.
2c170 20 20 20 20 20 20 20 20 20 20 61 5b 6b 5d 2e 7a            a[k].z
2c180 53 70 61 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20  Span = 0;.      
2c190 20 20 7d 0a 20 20 20 20 20 20 20 20 61 5b 6b 5d    }.        a[k]
2c1a0 2e 70 45 78 70 72 20 3d 20 30 3b 0a 20 20 20 20  .pExpr = 0;.    
2c1b0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
2c1c0 20 2f 2a 20 54 68 69 73 20 65 78 70 72 65 73 73   /* This express
2c1d0 69 6f 6e 20 69 73 20 61 20 22 2a 22 20 6f 72 20  ion is a "*" or 
2c1e0 61 20 22 54 41 42 4c 45 2e 2a 22 20 61 6e 64 20  a "TABLE.*" and 
2c1f0 6e 65 65 64 73 20 74 6f 20 62 65 0a 20 20 20 20  needs to be.    
2c200 20 20 20 20 2a 2a 20 65 78 70 61 6e 64 65 64 2e      ** expanded.
2c210 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20   */.        int 
2c220 74 61 62 6c 65 53 65 65 6e 20 3d 20 30 3b 20 20  tableSeen = 0;  
2c230 20 20 20 20 2f 2a 20 53 65 74 20 74 6f 20 31 20      /* Set to 1 
2c240 77 68 65 6e 20 54 41 42 4c 45 20 6d 61 74 63 68  when TABLE match
2c250 65 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 63 68  es */.        ch
2c260 61 72 20 2a 7a 54 4e 61 6d 65 20 3d 20 30 3b 20  ar *zTName = 0; 
2c270 20 20 20 20 20 20 2f 2a 20 74 65 78 74 20 6f 66        /* text of
2c280 20 6e 61 6d 65 20 6f 66 20 54 41 42 4c 45 20 2a   name of TABLE *
2c290 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 45  /.        if( pE
2c2a0 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f 54 20 29 7b 0a  ->op==TK_DOT ){.
2c2b0 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
2c2c0 28 20 70 45 2d 3e 70 4c 65 66 74 21 3d 30 20 29  ( pE->pLeft!=0 )
2c2d0 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  ;.          asse
2c2e0 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  rt( !ExprHasProp
2c2f0 65 72 74 79 28 70 45 2d 3e 70 4c 65 66 74 2c 20  erty(pE->pLeft, 
2c300 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a  EP_IntValue) );.
2c310 20 20 20 20 20 20 20 20 20 20 7a 54 4e 61 6d 65            zTName
2c320 20 3d 20 70 45 2d 3e 70 4c 65 66 74 2d 3e 75 2e   = pE->pLeft->u.
2c330 7a 54 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 20 20  zToken;.        
2c340 7d 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d  }.        for(i=
2c350 30 2c 20 70 46 72 6f 6d 3d 70 54 61 62 4c 69 73  0, pFrom=pTabLis
2c360 74 2d 3e 61 3b 20 69 3c 70 54 61 62 4c 69 73 74  t->a; i<pTabList
2c370 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 46 72  ->nSrc; i++, pFr
2c380 6f 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20  om++){.         
2c390 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70   Table *pTab = p
2c3a0 46 72 6f 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20  From->pTab;.    
2c3b0 20 20 20 20 20 20 53 65 6c 65 63 74 20 2a 70 53        Select *pS
2c3c0 75 62 20 3d 20 70 46 72 6f 6d 2d 3e 70 53 65 6c  ub = pFrom->pSel
2c3d0 65 63 74 3b 0a 20 20 20 20 20 20 20 20 20 20 63  ect;.          c
2c3e0 68 61 72 20 2a 7a 54 61 62 4e 61 6d 65 20 3d 20  har *zTabName = 
2c3f0 70 46 72 6f 6d 2d 3e 7a 41 6c 69 61 73 3b 0a 20  pFrom->zAlias;. 
2c400 20 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63           const c
2c410 68 61 72 20 2a 7a 53 63 68 65 6d 61 4e 61 6d 65  har *zSchemaName
2c420 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
2c430 69 6e 74 20 69 44 62 3b 0a 20 20 20 20 20 20 20  int iDb;.       
2c440 20 20 20 69 66 28 20 7a 54 61 62 4e 61 6d 65 3d     if( zTabName=
2c450 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
2c460 20 20 7a 54 61 62 4e 61 6d 65 20 3d 20 70 54 61    zTabName = pTa
2c470 62 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20  b->zName;.      
2c480 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
2c490 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
2c4a0 69 6c 65 64 20 29 20 62 72 65 61 6b 3b 0a 20 20  iled ) break;.  
2c4b0 20 20 20 20 20 20 20 20 69 66 28 20 70 53 75 62          if( pSub
2c4c0 3d 3d 30 20 7c 7c 20 28 70 53 75 62 2d 3e 73 65  ==0 || (pSub->se
2c4d0 6c 46 6c 61 67 73 20 26 20 53 46 5f 4e 65 73 74  lFlags & SF_Nest
2c4e0 65 64 46 72 6f 6d 29 3d 3d 30 20 29 7b 0a 20 20  edFrom)==0 ){.  
2c4f0 20 20 20 20 20 20 20 20 20 20 70 53 75 62 20 3d            pSub =
2c500 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   0;.            
2c510 69 66 28 20 7a 54 4e 61 6d 65 20 26 26 20 73 71  if( zTName && sq
2c520 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 54 4e  lite3StrICmp(zTN
2c530 61 6d 65 2c 20 7a 54 61 62 4e 61 6d 65 29 21 3d  ame, zTabName)!=
2c540 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
2c550 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
2c560 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
2c570 20 20 20 20 20 20 20 69 44 62 20 3d 20 73 71 6c         iDb = sql
2c580 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65  ite3SchemaToInde
2c590 78 28 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68  x(db, pTab->pSch
2c5a0 65 6d 61 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ema);.          
2c5b0 20 20 7a 53 63 68 65 6d 61 4e 61 6d 65 20 3d 20    zSchemaName = 
2c5c0 69 44 62 3e 3d 30 20 3f 20 64 62 2d 3e 61 44 62  iDb>=0 ? db->aDb
2c5d0 5b 69 44 62 5d 2e 7a 44 62 53 4e 61 6d 65 20 3a  [iDb].zDbSName :
2c5e0 20 22 2a 22 3b 0a 20 20 20 20 20 20 20 20 20 20   "*";.          
2c5f0 7d 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28  }.          for(
2c600 6a 3d 30 3b 20 6a 3c 70 54 61 62 2d 3e 6e 43 6f  j=0; j<pTab->nCo
2c610 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20  l; j++){.       
2c620 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65       char *zName
2c630 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d   = pTab->aCol[j]
2c640 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20  .zName;.        
2c650 20 20 20 20 63 68 61 72 20 2a 7a 43 6f 6c 6e 61      char *zColna
2c660 6d 65 3b 20 20 2f 2a 20 54 68 65 20 63 6f 6d 70  me;  /* The comp
2c670 75 74 65 64 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65  uted column name
2c680 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
2c690 63 68 61 72 20 2a 7a 54 6f 46 72 65 65 3b 20 20  char *zToFree;  
2c6a0 20 2f 2a 20 4d 61 6c 6c 6f 63 65 64 20 73 74 72   /* Malloced str
2c6b0 69 6e 67 20 74 68 61 74 20 6e 65 65 64 73 20 74  ing that needs t
2c6c0 6f 20 62 65 20 66 72 65 65 64 20 2a 2f 0a 20 20  o be freed */.  
2c6d0 20 20 20 20 20 20 20 20 20 20 54 6f 6b 65 6e 20            Token 
2c6e0 73 43 6f 6c 6e 61 6d 65 3b 20 20 2f 2a 20 43 6f  sColname;  /* Co
2c6f0 6d 70 75 74 65 64 20 63 6f 6c 75 6d 6e 20 6e 61  mputed column na
2c700 6d 65 20 61 73 20 61 20 74 6f 6b 65 6e 20 2a 2f  me as a token */
2c710 0a 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 73  ..            as
2c720 73 65 72 74 28 20 7a 4e 61 6d 65 20 29 3b 0a 20  sert( zName );. 
2c730 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 7a             if( z
2c740 54 4e 61 6d 65 20 26 26 20 70 53 75 62 0a 20 20  TName && pSub.  
2c750 20 20 20 20 20 20 20 20 20 20 20 26 26 20 73 71             && sq
2c760 6c 69 74 65 33 4d 61 74 63 68 53 70 61 6e 4e 61  lite3MatchSpanNa
2c770 6d 65 28 70 53 75 62 2d 3e 70 45 4c 69 73 74 2d  me(pSub->pEList-
2c780 3e 61 5b 6a 5d 2e 7a 53 70 61 6e 2c 20 30 2c 20  >a[j].zSpan, 0, 
2c790 7a 54 4e 61 6d 65 2c 20 30 29 3d 3d 30 0a 20 20  zTName, 0)==0.  
2c7a0 20 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20            ){.   
2c7b0 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69             conti
2c7c0 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20  nue;.           
2c7d0 20 7d 0a 0a 20 20 20 20 20 20 20 20 20 20 20 20   }..            
2c7e0 2f 2a 20 49 66 20 61 20 63 6f 6c 75 6d 6e 20 69  /* If a column i
2c7f0 73 20 6d 61 72 6b 65 64 20 61 73 20 27 68 69 64  s marked as 'hid
2c800 64 65 6e 27 2c 20 6f 6d 69 74 20 69 74 20 66 72  den', omit it fr
2c810 6f 6d 20 74 68 65 20 65 78 70 61 6e 64 65 64 0a  om the expanded.
2c820 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 72              ** r
2c830 65 73 75 6c 74 2d 73 65 74 20 6c 69 73 74 20 75  esult-set list u
2c840 6e 6c 65 73 73 20 74 68 65 20 53 45 4c 45 43 54  nless the SELECT
2c850 20 68 61 73 20 74 68 65 20 53 46 5f 49 6e 63 6c   has the SF_Incl
2c860 75 64 65 48 69 64 64 65 6e 0a 20 20 20 20 20 20  udeHidden.      
2c870 20 20 20 20 20 20 2a 2a 20 62 69 74 20 73 65 74        ** bit set
2c880 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f  ..            */
2c890 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
2c8a0 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20   (p->selFlags & 
2c8b0 53 46 5f 49 6e 63 6c 75 64 65 48 69 64 64 65 6e  SF_IncludeHidden
2c8c0 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20  )==0.           
2c8d0 20 20 26 26 20 49 73 48 69 64 64 65 6e 43 6f 6c    && IsHiddenCol
2c8e0 75 6d 6e 28 26 70 54 61 62 2d 3e 61 43 6f 6c 5b  umn(&pTab->aCol[
2c8f0 6a 5d 29 20 0a 20 20 20 20 20 20 20 20 20 20 20  j]) .           
2c900 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
2c910 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
2c920 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2c930 20 20 20 20 20 20 74 61 62 6c 65 53 65 65 6e 20        tableSeen 
2c940 3d 20 31 3b 0a 0a 20 20 20 20 20 20 20 20 20 20  = 1;..          
2c950 20 20 69 66 28 20 69 3e 30 20 26 26 20 7a 54 4e    if( i>0 && zTN
2c960 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ame==0 ){.      
2c970 20 20 20 20 20 20 20 20 69 66 28 20 28 70 46 72          if( (pFr
2c980 6f 6d 2d 3e 66 67 2e 6a 6f 69 6e 74 79 70 65 20  om->fg.jointype 
2c990 26 20 4a 54 5f 4e 41 54 55 52 41 4c 29 21 3d 30  & JT_NATURAL)!=0
2c9a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2c9b0 20 26 26 20 74 61 62 6c 65 41 6e 64 43 6f 6c 75   && tableAndColu
2c9c0 6d 6e 49 6e 64 65 78 28 70 54 61 62 4c 69 73 74  mnIndex(pTabList
2c9d0 2c 20 69 2c 20 7a 4e 61 6d 65 2c 20 30 2c 20 30  , i, zName, 0, 0
2c9e0 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ).              
2c9f0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
2ca00 20 20 20 2f 2a 20 49 6e 20 61 20 4e 41 54 55 52     /* In a NATUR
2ca10 41 4c 20 6a 6f 69 6e 2c 20 6f 6d 69 74 20 74 68  AL join, omit th
2ca20 65 20 6a 6f 69 6e 20 63 6f 6c 75 6d 6e 73 20 66  e join columns f
2ca30 72 6f 6d 20 74 68 65 20 0a 20 20 20 20 20 20 20  rom the .       
2ca40 20 20 20 20 20 20 20 20 20 2a 2a 20 74 61 62 6c           ** tabl
2ca50 65 20 74 6f 20 74 68 65 20 72 69 67 68 74 20 6f  e to the right o
2ca60 66 20 74 68 65 20 6a 6f 69 6e 20 2a 2f 0a 20 20  f the join */.  
2ca70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f                co
2ca80 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
2ca90 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2caa0 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
2cab0 33 49 64 4c 69 73 74 49 6e 64 65 78 28 70 46 72  3IdListIndex(pFr
2cac0 6f 6d 2d 3e 70 55 73 69 6e 67 2c 20 7a 4e 61 6d  om->pUsing, zNam
2cad0 65 29 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  e)>=0 ){.       
2cae0 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 20 61           /* In a
2caf0 20 6a 6f 69 6e 20 77 69 74 68 20 61 20 55 53 49   join with a USI
2cb00 4e 47 20 63 6c 61 75 73 65 2c 20 6f 6d 69 74 20  NG clause, omit 
2cb10 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 0a 20  columns in the. 
2cb20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a                 *
2cb30 2a 20 75 73 69 6e 67 20 63 6c 61 75 73 65 20 66  * using clause f
2cb40 72 6f 6d 20 74 68 65 20 74 61 62 6c 65 20 6f 6e  rom the table on
2cb50 20 74 68 65 20 72 69 67 68 74 2e 20 2a 2f 0a 20   the right. */. 
2cb60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63                 c
2cb70 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
2cb80 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2cb90 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
2cba0 20 20 20 70 52 69 67 68 74 20 3d 20 73 71 6c 69     pRight = sqli
2cbb0 74 65 33 45 78 70 72 28 64 62 2c 20 54 4b 5f 49  te3Expr(db, TK_I
2cbc0 44 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  D, zName);.     
2cbd0 20 20 20 20 20 20 20 7a 43 6f 6c 6e 61 6d 65 20         zColname 
2cbe0 3d 20 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20  = zName;.       
2cbf0 20 20 20 20 20 7a 54 6f 46 72 65 65 20 3d 20 30       zToFree = 0
2cc00 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
2cc10 28 20 6c 6f 6e 67 4e 61 6d 65 73 20 7c 7c 20 70  ( longNames || p
2cc20 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3e 31 20  TabList->nSrc>1 
2cc30 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
2cc40 20 45 78 70 72 20 2a 70 4c 65 66 74 3b 0a 20 20   Expr *pLeft;.  
2cc50 20 20 20 20 20 20 20 20 20 20 20 20 70 4c 65 66              pLef
2cc60 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28  t = sqlite3Expr(
2cc70 64 62 2c 20 54 4b 5f 49 44 2c 20 7a 54 61 62 4e  db, TK_ID, zTabN
2cc80 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ame);.          
2cc90 20 20 20 20 70 45 78 70 72 20 3d 20 73 71 6c 69      pExpr = sqli
2cca0 74 65 33 50 45 78 70 72 28 70 50 61 72 73 65 2c  te3PExpr(pParse,
2ccb0 20 54 4b 5f 44 4f 54 2c 20 70 4c 65 66 74 2c 20   TK_DOT, pLeft, 
2ccc0 70 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20 20  pRight);.       
2ccd0 20 20 20 20 20 20 20 69 66 28 20 7a 53 63 68 65         if( zSche
2cce0 6d 61 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20  maName ){.      
2ccf0 20 20 20 20 20 20 20 20 20 20 70 4c 65 66 74 20            pLeft 
2cd00 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28 64 62  = sqlite3Expr(db
2cd10 2c 20 54 4b 5f 49 44 2c 20 7a 53 63 68 65 6d 61  , TK_ID, zSchema
2cd20 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Name);.         
2cd30 20 20 20 20 20 20 20 70 45 78 70 72 20 3d 20 73         pExpr = s
2cd40 71 6c 69 74 65 33 50 45 78 70 72 28 70 50 61 72  qlite3PExpr(pPar
2cd50 73 65 2c 20 54 4b 5f 44 4f 54 2c 20 70 4c 65 66  se, TK_DOT, pLef
2cd60 74 2c 20 70 45 78 70 72 29 3b 0a 20 20 20 20 20  t, pExpr);.     
2cd70 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
2cd80 20 20 20 20 20 20 20 20 20 69 66 28 20 6c 6f 6e           if( lon
2cd90 67 4e 61 6d 65 73 20 29 7b 0a 20 20 20 20 20 20  gNames ){.      
2cda0 20 20 20 20 20 20 20 20 20 20 7a 43 6f 6c 6e 61            zColna
2cdb0 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69  me = sqlite3MPri
2cdc0 6e 74 66 28 64 62 2c 20 22 25 73 2e 25 73 22 2c  ntf(db, "%s.%s",
2cdd0 20 7a 54 61 62 4e 61 6d 65 2c 20 7a 4e 61 6d 65   zTabName, zName
2cde0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
2cdf0 20 20 20 7a 54 6f 46 72 65 65 20 3d 20 7a 43 6f     zToFree = zCo
2ce00 6c 6e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 20  lname;.         
2ce10 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
2ce20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2ce30 20 20 20 20 20 20 20 20 70 45 78 70 72 20 3d 20          pExpr = 
2ce40 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20 20 20  pRight;.        
2ce50 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
2ce60 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33    pNew = sqlite3
2ce70 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70  ExprListAppend(p
2ce80 50 61 72 73 65 2c 20 70 4e 65 77 2c 20 70 45 78  Parse, pNew, pEx
2ce90 70 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  pr);.           
2cea0 20 73 71 6c 69 74 65 33 54 6f 6b 65 6e 49 6e 69   sqlite3TokenIni
2ceb0 74 28 26 73 43 6f 6c 6e 61 6d 65 2c 20 7a 43 6f  t(&sColname, zCo
2cec0 6c 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  lname);.        
2ced0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c      sqlite3ExprL
2cee0 69 73 74 53 65 74 4e 61 6d 65 28 70 50 61 72 73  istSetName(pPars
2cef0 65 2c 20 70 4e 65 77 2c 20 26 73 43 6f 6c 6e 61  e, pNew, &sColna
2cf00 6d 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  me, 0);.        
2cf10 20 20 20 20 69 66 28 20 70 4e 65 77 20 26 26 20      if( pNew && 
2cf20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53  (p->selFlags & S
2cf30 46 5f 4e 65 73 74 65 64 46 72 6f 6d 29 21 3d 30  F_NestedFrom)!=0
2cf40 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
2cf50 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
2cf60 74 5f 69 74 65 6d 20 2a 70 58 20 3d 20 26 70 4e  t_item *pX = &pN
2cf70 65 77 2d 3e 61 5b 70 4e 65 77 2d 3e 6e 45 78 70  ew->a[pNew->nExp
2cf80 72 2d 31 5d 3b 0a 20 20 20 20 20 20 20 20 20 20  r-1];.          
2cf90 20 20 20 20 69 66 28 20 70 53 75 62 20 29 7b 0a      if( pSub ){.
2cfa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cfb0 70 58 2d 3e 7a 53 70 61 6e 20 3d 20 73 71 6c 69  pX->zSpan = sqli
2cfc0 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c 20  te3DbStrDup(db, 
2cfd0 70 53 75 62 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b  pSub->pEList->a[
2cfe0 6a 5d 2e 7a 53 70 61 6e 29 3b 0a 20 20 20 20 20  j].zSpan);.     
2cff0 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63             testc
2d000 61 73 65 28 20 70 58 2d 3e 7a 53 70 61 6e 3d 3d  ase( pX->zSpan==
2d010 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  0 );.           
2d020 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2d030 20 20 20 20 20 20 20 20 20 20 70 58 2d 3e 7a 53            pX->zS
2d040 70 61 6e 20 3d 20 73 71 6c 69 74 65 33 4d 50 72  pan = sqlite3MPr
2d050 69 6e 74 66 28 64 62 2c 20 22 25 73 2e 25 73 2e  intf(db, "%s.%s.
2d060 25 73 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  %s",.           
2d070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d090 7a 53 63 68 65 6d 61 4e 61 6d 65 2c 20 7a 54 61  zSchemaName, zTa
2d0a0 62 4e 61 6d 65 2c 20 7a 43 6f 6c 6e 61 6d 65 29  bName, zColname)
2d0b0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
2d0c0 20 20 74 65 73 74 63 61 73 65 28 20 70 58 2d 3e    testcase( pX->
2d0d0 7a 53 70 61 6e 3d 3d 30 20 29 3b 0a 20 20 20 20  zSpan==0 );.    
2d0e0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2d0f0 20 20 20 20 20 20 20 20 20 20 70 58 2d 3e 62 53            pX->bS
2d100 70 61 6e 49 73 54 61 62 20 3d 20 31 3b 0a 20 20  panIsTab = 1;.  
2d110 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2d120 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44          sqlite3D
2d130 62 46 72 65 65 28 64 62 2c 20 7a 54 6f 46 72 65  bFree(db, zToFre
2d140 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  e);.          }.
2d150 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2d160 20 20 69 66 28 20 21 74 61 62 6c 65 53 65 65 6e    if( !tableSeen
2d170 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66   ){.          if
2d180 28 20 7a 54 4e 61 6d 65 20 29 7b 0a 20 20 20 20  ( zTName ){.    
2d190 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
2d1a0 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
2d1b0 22 6e 6f 20 73 75 63 68 20 74 61 62 6c 65 3a 20  "no such table: 
2d1c0 25 73 22 2c 20 7a 54 4e 61 6d 65 29 3b 0a 20 20  %s", zTName);.  
2d1d0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
2d1e0 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
2d1f0 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
2d200 65 2c 20 22 6e 6f 20 74 61 62 6c 65 73 20 73 70  e, "no tables sp
2d210 65 63 69 66 69 65 64 22 29 3b 0a 20 20 20 20 20  ecified");.     
2d220 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
2d230 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
2d240 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69     sqlite3ExprLi
2d250 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 45 4c  stDelete(db, pEL
2d260 69 73 74 29 3b 0a 20 20 20 20 70 2d 3e 70 45 4c  ist);.    p->pEL
2d270 69 73 74 20 3d 20 70 4e 65 77 3b 0a 20 20 7d 0a  ist = pNew;.  }.
2d280 20 20 69 66 28 20 70 2d 3e 70 45 4c 69 73 74 20    if( p->pEList 
2d290 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 45  ){.    if( p->pE
2d2a0 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 64 62 2d 3e  List->nExpr>db->
2d2b0 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49  aLimit[SQLITE_LI
2d2c0 4d 49 54 5f 43 4f 4c 55 4d 4e 5d 20 29 7b 0a 20  MIT_COLUMN] ){. 
2d2d0 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
2d2e0 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74 6f  rMsg(pParse, "to
2d2f0 6f 20 6d 61 6e 79 20 63 6f 6c 75 6d 6e 73 20 69  o many columns i
2d300 6e 20 72 65 73 75 6c 74 20 73 65 74 22 29 3b 0a  n result set");.
2d310 20 20 20 20 20 20 72 65 74 75 72 6e 20 57 52 43        return WRC
2d320 5f 41 62 6f 72 74 3b 0a 20 20 20 20 7d 0a 20 20  _Abort;.    }.  
2d330 20 20 69 66 28 20 28 65 6c 69 73 74 46 6c 61 67    if( (elistFlag
2d340 73 20 26 20 28 45 50 5f 48 61 73 46 75 6e 63 7c  s & (EP_HasFunc|
2d350 45 50 5f 53 75 62 71 75 65 72 79 29 29 21 3d 30  EP_Subquery))!=0
2d360 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 73 65 6c   ){.      p->sel
2d370 46 6c 61 67 73 20 7c 3d 20 53 46 5f 43 6f 6d 70  Flags |= SF_Comp
2d380 6c 65 78 52 65 73 75 6c 74 3b 0a 20 20 20 20 7d  lexResult;.    }
2d390 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 57 52  .  }.  return WR
2d3a0 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 2f  C_Continue;.}../
2d3b0 2a 0a 2a 2a 20 4e 6f 2d 6f 70 20 72 6f 75 74 69  *.** No-op routi
2d3c0 6e 65 20 66 6f 72 20 74 68 65 20 70 61 72 73 65  ne for the parse
2d3d0 2d 74 72 65 65 20 77 61 6c 6b 65 72 2e 0a 2a 2a  -tree walker..**
2d3e0 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20 72 6f  .** When this ro
2d3f0 75 74 69 6e 65 20 69 73 20 74 68 65 20 57 61 6c  utine is the Wal
2d400 6b 65 72 2e 78 45 78 70 72 43 61 6c 6c 62 61 63  ker.xExprCallbac
2d410 6b 20 74 68 65 6e 20 65 78 70 72 65 73 73 69 6f  k then expressio
2d420 6e 20 74 72 65 65 73 0a 2a 2a 20 61 72 65 20 77  n trees.** are w
2d430 61 6c 6b 65 64 20 77 69 74 68 6f 75 74 20 61 6e  alked without an
2d440 79 20 61 63 74 69 6f 6e 73 20 62 65 69 6e 67 20  y actions being 
2d450 74 61 6b 65 6e 20 61 74 20 65 61 63 68 20 6e 6f  taken at each no
2d460 64 65 2e 20 20 50 72 65 73 75 6d 61 62 6c 79 2c  de.  Presumably,
2d470 0a 2a 2a 20 77 68 65 6e 20 74 68 69 73 20 72 6f  .** when this ro
2d480 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 66 6f  utine is used fo
2d490 72 20 57 61 6c 6b 65 72 2e 78 45 78 70 72 43 61  r Walker.xExprCa
2d4a0 6c 6c 62 61 63 6b 20 74 68 65 6e 20 0a 2a 2a 20  llback then .** 
2d4b0 57 61 6c 6b 65 72 2e 78 53 65 6c 65 63 74 43 61  Walker.xSelectCa
2d4c0 6c 6c 62 61 63 6b 20 69 73 20 73 65 74 20 74 6f  llback is set to
2d4d0 20 64 6f 20 73 6f 6d 65 74 68 69 6e 67 20 75 73   do something us
2d4e0 65 66 75 6c 20 66 6f 72 20 65 76 65 72 79 20 0a  eful for every .
2d4f0 2a 2a 20 73 75 62 71 75 65 72 79 20 69 6e 20 74  ** subquery in t
2d500 68 65 20 70 61 72 73 65 72 20 74 72 65 65 2e 0a  he parser tree..
2d510 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78  */.int sqlite3Ex
2d520 70 72 57 61 6c 6b 4e 6f 6f 70 28 57 61 6c 6b 65  prWalkNoop(Walke
2d530 72 20 2a 4e 6f 74 55 73 65 64 2c 20 45 78 70 72  r *NotUsed, Expr
2d540 20 2a 4e 6f 74 55 73 65 64 32 29 7b 0a 20 20 55   *NotUsed2){.  U
2d550 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 32  NUSED_PARAMETER2
2d560 28 4e 6f 74 55 73 65 64 2c 20 4e 6f 74 55 73 65  (NotUsed, NotUse
2d570 64 32 29 3b 0a 20 20 72 65 74 75 72 6e 20 57 52  d2);.  return WR
2d580 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 2f  C_Continue;.}../
2d590 2a 0a 2a 2a 20 4e 6f 2d 6f 70 20 72 6f 75 74 69  *.** No-op routi
2d5a0 6e 65 20 66 6f 72 20 74 68 65 20 70 61 72 73 65  ne for the parse
2d5b0 2d 74 72 65 65 20 77 61 6c 6b 65 72 20 66 6f 72  -tree walker for
2d5c0 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
2d5d0 74 73 2e 0a 2a 2a 20 73 75 62 71 75 65 72 79 20  ts..** subquery 
2d5e0 69 6e 20 74 68 65 20 70 61 72 73 65 72 20 74 72  in the parser tr
2d5f0 65 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ee..*/.int sqlit
2d600 65 33 53 65 6c 65 63 74 57 61 6c 6b 4e 6f 6f 70  e3SelectWalkNoop
2d610 28 57 61 6c 6b 65 72 20 2a 4e 6f 74 55 73 65 64  (Walker *NotUsed
2d620 2c 20 53 65 6c 65 63 74 20 2a 4e 6f 74 55 73 65  , Select *NotUse
2d630 64 32 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41  d2){.  UNUSED_PA
2d640 52 41 4d 45 54 45 52 32 28 4e 6f 74 55 73 65 64  RAMETER2(NotUsed
2d650 2c 20 4e 6f 74 55 73 65 64 32 29 3b 0a 20 20 72  , NotUsed2);.  r
2d660 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e  eturn WRC_Contin
2d670 75 65 3b 0a 7d 0a 0a 23 69 66 20 53 51 4c 49 54  ue;.}..#if SQLIT
2d680 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 41 6c  E_DEBUG./*.** Al
2d690 77 61 79 73 20 61 73 73 65 72 74 2e 20 20 54 68  ways assert.  Th
2d6a0 69 73 20 78 53 65 6c 65 63 74 43 61 6c 6c 62 61  is xSelectCallba
2d6b0 63 6b 32 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  ck2 implementati
2d6c0 6f 6e 20 70 72 6f 76 65 73 20 74 68 61 74 20 74  on proves that t
2d6d0 68 65 0a 2a 2a 20 78 53 65 6c 65 63 74 43 61 6c  he.** xSelectCal
2d6e0 6c 62 61 63 6b 32 20 69 73 20 6e 65 76 65 72 20  lback2 is never 
2d6f0 69 6e 76 6f 6b 65 64 2e 0a 2a 2f 0a 76 6f 69 64  invoked..*/.void
2d700 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 57 61   sqlite3SelectWa
2d710 6c 6b 41 73 73 65 72 74 32 28 57 61 6c 6b 65 72  lkAssert2(Walker
2d720 20 2a 4e 6f 74 55 73 65 64 2c 20 53 65 6c 65 63   *NotUsed, Selec
2d730 74 20 2a 4e 6f 74 55 73 65 64 32 29 7b 0a 20 20  t *NotUsed2){.  
2d740 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
2d750 32 28 4e 6f 74 55 73 65 64 2c 20 4e 6f 74 55 73  2(NotUsed, NotUs
2d760 65 64 32 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ed2);.  assert( 
2d770 30 20 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 2f 2a  0 );.}.#endif./*
2d780 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
2d790 20 22 65 78 70 61 6e 64 73 22 20 61 20 53 45 4c   "expands" a SEL
2d7a0 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 61 6e  ECT statement an
2d7b0 64 20 61 6c 6c 20 6f 66 20 69 74 73 20 73 75 62  d all of its sub
2d7c0 71 75 65 72 69 65 73 2e 0a 2a 2a 20 46 6f 72 20  queries..** For 
2d7d0 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72  additional infor
2d7e0 6d 61 74 69 6f 6e 20 6f 6e 20 77 68 61 74 20 69  mation on what i
2d7f0 74 20 6d 65 61 6e 73 20 74 6f 20 22 65 78 70 61  t means to "expa
2d800 6e 64 22 20 61 20 53 45 4c 45 43 54 0a 2a 2a 20  nd" a SELECT.** 
2d810 73 74 61 74 65 6d 65 6e 74 2c 20 73 65 65 20 74  statement, see t
2d820 68 65 20 63 6f 6d 6d 65 6e 74 20 6f 6e 20 74 68  he comment on th
2d830 65 20 73 65 6c 65 63 74 45 78 70 61 6e 64 20 77  e selectExpand w
2d840 6f 72 6b 65 72 20 63 61 6c 6c 62 61 63 6b 20 61  orker callback a
2d850 62 6f 76 65 2e 0a 2a 2a 0a 2a 2a 20 45 78 70 61  bove..**.** Expa
2d860 6e 64 69 6e 67 20 61 20 53 45 4c 45 43 54 20 73  nding a SELECT s
2d870 74 61 74 65 6d 65 6e 74 20 69 73 20 74 68 65 20  tatement is the 
2d880 66 69 72 73 74 20 73 74 65 70 20 69 6e 20 70 72  first step in pr
2d890 6f 63 65 73 73 69 6e 67 20 61 0a 2a 2a 20 53 45  ocessing a.** SE
2d8a0 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 20  LECT statement. 
2d8b0 20 54 68 65 20 53 45 4c 45 43 54 20 73 74 61 74   The SELECT stat
2d8c0 65 6d 65 6e 74 20 6d 75 73 74 20 62 65 20 65 78  ement must be ex
2d8d0 70 61 6e 64 65 64 20 62 65 66 6f 72 65 0a 2a 2a  panded before.**
2d8e0 20 6e 61 6d 65 20 72 65 73 6f 6c 75 74 69 6f 6e   name resolution
2d8f0 20 69 73 20 70 65 72 66 6f 72 6d 65 64 2e 0a 2a   is performed..*
2d900 2a 0a 2a 2a 20 49 66 20 61 6e 79 74 68 69 6e 67  *.** If anything
2d910 20 67 6f 65 73 20 77 72 6f 6e 67 2c 20 61 6e 20   goes wrong, an 
2d920 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 73  error message is
2d930 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 70 50   written into pP
2d940 61 72 73 65 2e 0a 2a 2a 20 54 68 65 20 63 61 6c  arse..** The cal
2d950 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 63 61  ling function ca
2d960 6e 20 64 65 74 65 63 74 20 74 68 65 20 70 72 6f  n detect the pro
2d970 62 6c 65 6d 20 62 79 20 6c 6f 6f 6b 69 6e 67 20  blem by looking 
2d980 61 74 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 0a  at pParse->nErr.
2d990 2a 2a 20 61 6e 64 2f 6f 72 20 70 50 61 72 73 65  ** and/or pParse
2d9a0 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
2d9b0 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ed..*/.static vo
2d9c0 69 64 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  id sqlite3Select
2d9d0 45 78 70 61 6e 64 28 50 61 72 73 65 20 2a 70 50  Expand(Parse *pP
2d9e0 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 53  arse, Select *pS
2d9f0 65 6c 65 63 74 29 7b 0a 20 20 57 61 6c 6b 65 72  elect){.  Walker
2da00 20 77 3b 0a 20 20 77 2e 78 45 78 70 72 43 61 6c   w;.  w.xExprCal
2da10 6c 62 61 63 6b 20 3d 20 73 71 6c 69 74 65 33 45  lback = sqlite3E
2da20 78 70 72 57 61 6c 6b 4e 6f 6f 70 3b 0a 20 20 77  xprWalkNoop;.  w
2da30 2e 70 50 61 72 73 65 20 3d 20 70 50 61 72 73 65  .pParse = pParse
2da40 3b 0a 20 20 69 66 28 20 4f 4b 5f 49 46 5f 41 4c  ;.  if( OK_IF_AL
2da50 57 41 59 53 5f 54 52 55 45 28 70 50 61 72 73 65  WAYS_TRUE(pParse
2da60 2d 3e 68 61 73 43 6f 6d 70 6f 75 6e 64 29 20 29  ->hasCompound) )
2da70 7b 0a 20 20 20 20 77 2e 78 53 65 6c 65 63 74 43  {.    w.xSelectC
2da80 61 6c 6c 62 61 63 6b 20 3d 20 63 6f 6e 76 65 72  allback = conver
2da90 74 43 6f 6d 70 6f 75 6e 64 53 65 6c 65 63 74 54  tCompoundSelectT
2daa0 6f 53 75 62 71 75 65 72 79 3b 0a 20 20 20 20 77  oSubquery;.    w
2dab0 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b  .xSelectCallback
2dac0 32 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74  2 = 0;.    sqlit
2dad0 65 33 57 61 6c 6b 53 65 6c 65 63 74 28 26 77 2c  e3WalkSelect(&w,
2dae0 20 70 53 65 6c 65 63 74 29 3b 0a 20 20 7d 0a 20   pSelect);.  }. 
2daf0 20 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61   w.xSelectCallba
2db00 63 6b 20 3d 20 73 65 6c 65 63 74 45 78 70 61 6e  ck = selectExpan
2db10 64 65 72 3b 0a 20 20 77 2e 78 53 65 6c 65 63 74  der;.  w.xSelect
2db20 43 61 6c 6c 62 61 63 6b 32 20 3d 20 73 65 6c 65  Callback2 = sele
2db30 63 74 50 6f 70 57 69 74 68 3b 0a 20 20 77 2e 65  ctPopWith;.  w.e
2db40 43 6f 64 65 20 3d 20 30 3b 0a 20 20 73 71 6c 69  Code = 0;.  sqli
2db50 74 65 33 57 61 6c 6b 53 65 6c 65 63 74 28 26 77  te3WalkSelect(&w
2db60 2c 20 70 53 65 6c 65 63 74 29 3b 0a 7d 0a 0a 0a  , pSelect);.}...
2db70 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
2db80 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 2f 2a 0a  MIT_SUBQUERY./*.
2db90 2a 2a 20 54 68 69 73 20 69 73 20 61 20 57 61 6c  ** This is a Wal
2dba0 6b 65 72 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62  ker.xSelectCallb
2dbb0 61 63 6b 20 63 61 6c 6c 62 61 63 6b 20 66 6f 72  ack callback for
2dbc0 20 74 68 65 20 73 71 6c 69 74 65 33 53 65 6c 65   the sqlite3Sele
2dbd0 63 74 54 79 70 65 49 6e 66 6f 28 29 0a 2a 2a 20  ctTypeInfo().** 
2dbe0 69 6e 74 65 72 66 61 63 65 2e 0a 2a 2a 0a 2a 2a  interface..**.**
2dbf0 20 46 6f 72 20 65 61 63 68 20 46 52 4f 4d 2d 63   For each FROM-c
2dc00 6c 61 75 73 65 20 73 75 62 71 75 65 72 79 2c 20  lause subquery, 
2dc10 61 64 64 20 43 6f 6c 75 6d 6e 2e 7a 54 79 70 65  add Column.zType
2dc20 20 61 6e 64 20 43 6f 6c 75 6d 6e 2e 7a 43 6f 6c   and Column.zCol
2dc30 6c 0a 2a 2a 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  l.** information
2dc40 20 74 6f 20 74 68 65 20 54 61 62 6c 65 20 73 74   to the Table st
2dc50 72 75 63 74 75 72 65 20 74 68 61 74 20 72 65 70  ructure that rep
2dc60 72 65 73 65 6e 74 73 20 74 68 65 20 72 65 73 75  resents the resu
2dc70 6c 74 20 73 65 74 0a 2a 2a 20 6f 66 20 74 68 61  lt set.** of tha
2dc80 74 20 73 75 62 71 75 65 72 79 2e 0a 2a 2a 0a 2a  t subquery..**.*
2dc90 2a 20 54 68 65 20 54 61 62 6c 65 20 73 74 72 75  * The Table stru
2dca0 63 74 75 72 65 20 74 68 61 74 20 72 65 70 72 65  cture that repre
2dcb0 73 65 6e 74 73 20 74 68 65 20 72 65 73 75 6c 74  sents the result
2dcc0 20 73 65 74 20 77 61 73 20 63 6f 6e 73 74 72 75   set was constru
2dcd0 63 74 65 64 0a 2a 2a 20 62 79 20 73 65 6c 65 63  cted.** by selec
2dce0 74 45 78 70 61 6e 64 65 72 28 29 20 62 75 74 20  tExpander() but 
2dcf0 74 68 65 20 74 79 70 65 20 61 6e 64 20 63 6f 6c  the type and col
2dd00 6c 61 74 69 6f 6e 20 69 6e 66 6f 72 6d 61 74 69  lation informati
2dd10 6f 6e 20 77 61 73 20 6f 6d 69 74 74 65 64 0a 2a  on was omitted.*
2dd20 2a 20 61 74 20 74 68 61 74 20 70 6f 69 6e 74 20  * at that point 
2dd30 62 65 63 61 75 73 65 20 69 64 65 6e 74 69 66 69  because identifi
2dd40 65 72 73 20 68 61 64 20 6e 6f 74 20 79 65 74 20  ers had not yet 
2dd50 62 65 65 6e 20 72 65 73 6f 6c 76 65 64 2e 20 20  been resolved.  
2dd60 54 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20  This.** routine 
2dd70 69 73 20 63 61 6c 6c 65 64 20 61 66 74 65 72 20  is called after 
2dd80 69 64 65 6e 74 69 66 69 65 72 20 72 65 73 6f 6c  identifier resol
2dd90 75 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ution..*/.static
2dda0 20 76 6f 69 64 20 73 65 6c 65 63 74 41 64 64 53   void selectAddS
2ddb0 75 62 71 75 65 72 79 54 79 70 65 49 6e 66 6f 28  ubqueryTypeInfo(
2ddc0 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c  Walker *pWalker,
2ddd0 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 50   Select *p){.  P
2dde0 61 72 73 65 20 2a 70 50 61 72 73 65 3b 0a 20 20  arse *pParse;.  
2ddf0 69 6e 74 20 69 3b 0a 20 20 53 72 63 4c 69 73 74  int i;.  SrcList
2de00 20 2a 70 54 61 62 4c 69 73 74 3b 0a 20 20 73 74   *pTabList;.  st
2de10 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
2de20 6d 20 2a 70 46 72 6f 6d 3b 0a 0a 20 20 61 73 73  m *pFrom;..  ass
2de30 65 72 74 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73  ert( p->selFlags
2de40 20 26 20 53 46 5f 52 65 73 6f 6c 76 65 64 20 29   & SF_Resolved )
2de50 3b 0a 20 20 69 66 28 20 70 2d 3e 73 65 6c 46 6c  ;.  if( p->selFl
2de60 61 67 73 20 26 20 53 46 5f 48 61 73 54 79 70 65  ags & SF_HasType
2de70 49 6e 66 6f 20 29 20 72 65 74 75 72 6e 3b 0a 20  Info ) return;. 
2de80 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20   p->selFlags |= 
2de90 53 46 5f 48 61 73 54 79 70 65 49 6e 66 6f 3b 0a  SF_HasTypeInfo;.
2dea0 20 20 70 50 61 72 73 65 20 3d 20 70 57 61 6c 6b    pParse = pWalk
2deb0 65 72 2d 3e 70 50 61 72 73 65 3b 0a 20 20 70 54  er->pParse;.  pT
2dec0 61 62 4c 69 73 74 20 3d 20 70 2d 3e 70 53 72 63  abList = p->pSrc
2ded0 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 46 72  ;.  for(i=0, pFr
2dee0 6f 6d 3d 70 54 61 62 4c 69 73 74 2d 3e 61 3b 20  om=pTabList->a; 
2def0 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63  i<pTabList->nSrc
2df00 3b 20 69 2b 2b 2c 20 70 46 72 6f 6d 2b 2b 29 7b  ; i++, pFrom++){
2df10 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62  .    Table *pTab
2df20 20 3d 20 70 46 72 6f 6d 2d 3e 70 54 61 62 3b 0a   = pFrom->pTab;.
2df30 20 20 20 20 61 73 73 65 72 74 28 20 70 54 61 62      assert( pTab
2df40 21 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 28  !=0 );.    if( (
2df50 70 54 61 62 2d 3e 74 61 62 46 6c 61 67 73 20 26  pTab->tabFlags &
2df60 20 54 46 5f 45 70 68 65 6d 65 72 61 6c 29 21 3d   TF_Ephemeral)!=
2df70 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 20  0 ){.      /* A 
2df80 73 75 62 2d 71 75 65 72 79 20 69 6e 20 74 68 65  sub-query in the
2df90 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20   FROM clause of 
2dfa0 61 20 53 45 4c 45 43 54 20 2a 2f 0a 20 20 20 20  a SELECT */.    
2dfb0 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 20 3d    Select *pSel =
2dfc0 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 3b   pFrom->pSelect;
2dfd0 0a 20 20 20 20 20 20 69 66 28 20 70 53 65 6c 20  .      if( pSel 
2dfe0 29 7b 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65  ){.        while
2dff0 28 20 70 53 65 6c 2d 3e 70 50 72 69 6f 72 20 29  ( pSel->pPrior )
2e000 20 70 53 65 6c 20 3d 20 70 53 65 6c 2d 3e 70 50   pSel = pSel->pP
2e010 72 69 6f 72 3b 0a 20 20 20 20 20 20 20 20 73 71  rior;.        sq
2e020 6c 69 74 65 33 53 65 6c 65 63 74 41 64 64 43 6f  lite3SelectAddCo
2e030 6c 75 6d 6e 54 79 70 65 41 6e 64 43 6f 6c 6c 61  lumnTypeAndColla
2e040 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 70 54 61  tion(pParse, pTa
2e050 62 2c 20 70 53 65 6c 2c 0a 20 20 20 20 20 20 20  b, pSel,.       
2e060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e080 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 41          SQLITE_A
2e090 46 46 5f 4e 4f 4e 45 29 3b 0a 20 20 20 20 20 20  FF_NONE);.      
2e0a0 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65  }.    }.  }.}.#e
2e0b0 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  ndif.../*.** Thi
2e0c0 73 20 72 6f 75 74 69 6e 65 20 61 64 64 73 20 64  s routine adds d
2e0d0 61 74 61 74 79 70 65 20 61 6e 64 20 63 6f 6c 6c  atatype and coll
2e0e0 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 69  ating sequence i
2e0f0 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 6f 0a 2a 2a  nformation to.**
2e100 20 74 68 65 20 54 61 62 6c 65 20 73 74 72 75 63   the Table struc
2e110 74 75 72 65 73 20 6f 66 20 61 6c 6c 20 46 52 4f  tures of all FRO
2e120 4d 2d 63 6c 61 75 73 65 20 73 75 62 71 75 65 72  M-clause subquer
2e130 69 65 73 20 69 6e 20 61 0a 2a 2a 20 53 45 4c 45  ies in a.** SELE
2e140 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a  CT statement..**
2e150 0a 2a 2a 20 55 73 65 20 74 68 69 73 20 72 6f 75  .** Use this rou
2e160 74 69 6e 65 20 61 66 74 65 72 20 6e 61 6d 65 20  tine after name 
2e170 72 65 73 6f 6c 75 74 69 6f 6e 2e 0a 2a 2f 0a 73  resolution..*/.s
2e180 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69 74  tatic void sqlit
2e190 65 33 53 65 6c 65 63 74 41 64 64 54 79 70 65 49  e3SelectAddTypeI
2e1a0 6e 66 6f 28 50 61 72 73 65 20 2a 70 50 61 72 73  nfo(Parse *pPars
2e1b0 65 2c 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65  e, Select *pSele
2e1c0 63 74 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c  ct){.#ifndef SQL
2e1d0 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
2e1e0 59 0a 20 20 57 61 6c 6b 65 72 20 77 3b 0a 20 20  Y.  Walker w;.  
2e1f0 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63  w.xSelectCallbac
2e200 6b 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63  k = sqlite3Selec
2e210 74 57 61 6c 6b 4e 6f 6f 70 3b 0a 20 20 77 2e 78  tWalkNoop;.  w.x
2e220 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 32 20  SelectCallback2 
2e230 3d 20 73 65 6c 65 63 74 41 64 64 53 75 62 71 75  = selectAddSubqu
2e240 65 72 79 54 79 70 65 49 6e 66 6f 3b 0a 20 20 77  eryTypeInfo;.  w
2e250 2e 78 45 78 70 72 43 61 6c 6c 62 61 63 6b 20 3d  .xExprCallback =
2e260 20 73 71 6c 69 74 65 33 45 78 70 72 57 61 6c 6b   sqlite3ExprWalk
2e270 4e 6f 6f 70 3b 0a 20 20 77 2e 70 50 61 72 73 65  Noop;.  w.pParse
2e280 20 3d 20 70 50 61 72 73 65 3b 0a 20 20 73 71 6c   = pParse;.  sql
2e290 69 74 65 33 57 61 6c 6b 53 65 6c 65 63 74 28 26  ite3WalkSelect(&
2e2a0 77 2c 20 70 53 65 6c 65 63 74 29 3b 0a 23 65 6e  w, pSelect);.#en
2e2b0 64 69 66 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68  dif.}.../*.** Th
2e2c0 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74 73 20  is routine sets 
2e2d0 75 70 20 61 20 53 45 4c 45 43 54 20 73 74 61 74  up a SELECT stat
2e2e0 65 6d 65 6e 74 20 66 6f 72 20 70 72 6f 63 65 73  ement for proces
2e2f0 73 69 6e 67 2e 20 20 54 68 65 0a 2a 2a 20 66 6f  sing.  The.** fo
2e300 6c 6c 6f 77 69 6e 67 20 69 73 20 61 63 63 6f 6d  llowing is accom
2e310 70 6c 69 73 68 65 64 3a 0a 2a 2a 0a 2a 2a 20 20  plished:.**.**  
2e320 20 20 20 2a 20 20 56 44 42 45 20 43 75 72 73 6f     *  VDBE Curso
2e330 72 20 6e 75 6d 62 65 72 73 20 61 72 65 20 61 73  r numbers are as
2e340 73 69 67 6e 65 64 20 74 6f 20 61 6c 6c 20 46 52  signed to all FR
2e350 4f 4d 2d 63 6c 61 75 73 65 20 74 65 72 6d 73 2e  OM-clause terms.
2e360 0a 2a 2a 20 20 20 20 20 2a 20 20 45 70 68 65 6d  .**     *  Ephem
2e370 65 72 61 6c 20 54 61 62 6c 65 20 6f 62 6a 65 63  eral Table objec
2e380 74 73 20 61 72 65 20 63 72 65 61 74 65 64 20 66  ts are created f
2e390 6f 72 20 61 6c 6c 20 46 52 4f 4d 2d 63 6c 61 75  or all FROM-clau
2e3a0 73 65 20 73 75 62 71 75 65 72 69 65 73 2e 0a 2a  se subqueries..*
2e3b0 2a 20 20 20 20 20 2a 20 20 4f 4e 20 61 6e 64 20  *     *  ON and 
2e3c0 55 53 49 4e 47 20 63 6c 61 75 73 65 73 20 61 72  USING clauses ar
2e3d0 65 20 73 68 69 66 74 65 64 20 69 6e 74 6f 20 57  e shifted into W
2e3e0 48 45 52 45 20 73 74 61 74 65 6d 65 6e 74 73 0a  HERE statements.
2e3f0 2a 2a 20 20 20 20 20 2a 20 20 57 69 6c 64 63 61  **     *  Wildca
2e400 72 64 73 20 22 2a 22 20 61 6e 64 20 22 54 41 42  rds "*" and "TAB
2e410 4c 45 2e 2a 22 20 69 6e 20 72 65 73 75 6c 74 20  LE.*" in result 
2e420 73 65 74 73 20 61 72 65 20 65 78 70 61 6e 64 65  sets are expande
2e430 64 2e 0a 2a 2a 20 20 20 20 20 2a 20 20 49 64 65  d..**     *  Ide
2e440 6e 74 69 66 69 65 72 73 20 69 6e 20 65 78 70 72  ntifiers in expr
2e450 65 73 73 69 6f 6e 20 61 72 65 20 6d 61 74 63 68  ession are match
2e460 65 64 20 74 6f 20 74 61 62 6c 65 73 2e 0a 2a 2a  ed to tables..**
2e470 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
2e480 20 61 63 74 73 20 72 65 63 75 72 73 69 76 65 6c   acts recursivel
2e490 79 20 6f 6e 20 61 6c 6c 20 73 75 62 71 75 65 72  y on all subquer
2e4a0 69 65 73 20 77 69 74 68 69 6e 20 74 68 65 20 53  ies within the S
2e4b0 45 4c 45 43 54 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ELECT..*/.void s
2e4c0 71 6c 69 74 65 33 53 65 6c 65 63 74 50 72 65 70  qlite3SelectPrep
2e4d0 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
2e4e0 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  e,         /* Th
2e4f0 65 20 70 61 72 73 65 72 20 63 6f 6e 74 65 78 74  e parser context
2e500 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c   */.  Select *p,
2e510 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2e520 54 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65  The SELECT state
2e530 6d 65 6e 74 20 62 65 69 6e 67 20 63 6f 64 65 64  ment being coded
2e540 2e 20 2a 2f 0a 20 20 4e 61 6d 65 43 6f 6e 74 65  . */.  NameConte
2e550 78 74 20 2a 70 4f 75 74 65 72 4e 43 20 20 2f 2a  xt *pOuterNC  /*
2e560 20 4e 61 6d 65 20 63 6f 6e 74 65 78 74 20 66 6f   Name context fo
2e570 72 20 63 6f 6e 74 61 69 6e 65 72 20 2a 2f 0a 29  r container */.)
2e580 7b 0a 20 20 61 73 73 65 72 74 28 20 70 21 3d 30  {.  assert( p!=0
2e590 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e   || pParse->db->
2e5a0 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a  mallocFailed );.
2e5b0 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 64 62    if( pParse->db
2e5c0 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
2e5d0 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 70   return;.  if( p
2e5e0 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f  ->selFlags & SF_
2e5f0 48 61 73 54 79 70 65 49 6e 66 6f 20 29 20 72 65  HasTypeInfo ) re
2e600 74 75 72 6e 3b 0a 20 20 73 71 6c 69 74 65 33 53  turn;.  sqlite3S
2e610 65 6c 65 63 74 45 78 70 61 6e 64 28 70 50 61 72  electExpand(pPar
2e620 73 65 2c 20 70 29 3b 0a 20 20 69 66 28 20 70 50  se, p);.  if( pP
2e630 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 70 50  arse->nErr || pP
2e640 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  arse->db->malloc
2e650 46 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b  Failed ) return;
2e660 0a 20 20 73 71 6c 69 74 65 33 52 65 73 6f 6c 76  .  sqlite3Resolv
2e670 65 53 65 6c 65 63 74 4e 61 6d 65 73 28 70 50 61  eSelectNames(pPa
2e680 72 73 65 2c 20 70 2c 20 70 4f 75 74 65 72 4e 43  rse, p, pOuterNC
2e690 29 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  );.  if( pParse-
2e6a0 3e 6e 45 72 72 20 7c 7c 20 70 50 61 72 73 65 2d  >nErr || pParse-
2e6b0 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
2e6c0 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 73 71  d ) return;.  sq
2e6d0 6c 69 74 65 33 53 65 6c 65 63 74 41 64 64 54 79  lite3SelectAddTy
2e6e0 70 65 49 6e 66 6f 28 70 50 61 72 73 65 2c 20 70  peInfo(pParse, p
2e6f0 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 73 65  );.}../*.** Rese
2e700 74 20 74 68 65 20 61 67 67 72 65 67 61 74 65 20  t the aggregate 
2e710 61 63 63 75 6d 75 6c 61 74 6f 72 2e 0a 2a 2a 0a  accumulator..**.
2e720 2a 2a 20 54 68 65 20 61 67 67 72 65 67 61 74 65  ** The aggregate
2e730 20 61 63 63 75 6d 75 6c 61 74 6f 72 20 69 73 20   accumulator is 
2e740 61 20 73 65 74 20 6f 66 20 6d 65 6d 6f 72 79 20  a set of memory 
2e750 63 65 6c 6c 73 20 74 68 61 74 20 68 6f 6c 64 0a  cells that hold.
2e760 2a 2a 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20  ** intermediate 
2e770 72 65 73 75 6c 74 73 20 77 68 69 6c 65 20 63 61  results while ca
2e780 6c 63 75 6c 61 74 69 6e 67 20 61 6e 20 61 67 67  lculating an agg
2e790 72 65 67 61 74 65 2e 20 20 54 68 69 73 0a 2a 2a  regate.  This.**
2e7a0 20 72 6f 75 74 69 6e 65 20 67 65 6e 65 72 61 74   routine generat
2e7b0 65 73 20 63 6f 64 65 20 74 68 61 74 20 73 74 6f  es code that sto
2e7c0 72 65 73 20 4e 55 4c 4c 73 20 69 6e 20 61 6c 6c  res NULLs in all
2e7d0 20 6f 66 20 74 68 6f 73 65 20 6d 65 6d 6f 72 79   of those memory
2e7e0 0a 2a 2a 20 63 65 6c 6c 73 2e 0a 2a 2f 0a 73 74  .** cells..*/.st
2e7f0 61 74 69 63 20 76 6f 69 64 20 72 65 73 65 74 41  atic void resetA
2e800 63 63 75 6d 75 6c 61 74 6f 72 28 50 61 72 73 65  ccumulator(Parse
2e810 20 2a 70 50 61 72 73 65 2c 20 41 67 67 49 6e 66   *pParse, AggInf
2e820 6f 20 2a 70 41 67 67 49 6e 66 6f 29 7b 0a 20 20  o *pAggInfo){.  
2e830 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65  Vdbe *v = pParse
2e840 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69  ->pVdbe;.  int i
2e850 3b 0a 20 20 73 74 72 75 63 74 20 41 67 67 49 6e  ;.  struct AggIn
2e860 66 6f 5f 66 75 6e 63 20 2a 70 46 75 6e 63 3b 0a  fo_func *pFunc;.
2e870 20 20 69 6e 74 20 6e 52 65 67 20 3d 20 70 41 67    int nReg = pAg
2e880 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 20 2b 20 70  gInfo->nFunc + p
2e890 41 67 67 49 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e  AggInfo->nColumn
2e8a0 3b 0a 20 20 69 66 28 20 6e 52 65 67 3d 3d 30 20  ;.  if( nReg==0 
2e8b0 29 20 72 65 74 75 72 6e 3b 0a 23 69 66 64 65 66  ) return;.#ifdef
2e8c0 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
2e8d0 2f 2a 20 56 65 72 69 66 79 20 74 68 61 74 20 61  /* Verify that a
2e8e0 6c 6c 20 41 67 67 49 6e 66 6f 20 72 65 67 69 73  ll AggInfo regis
2e8f0 74 65 72 73 20 61 72 65 20 77 69 74 68 69 6e 20  ters are within 
2e900 74 68 65 20 72 61 6e 67 65 20 73 70 65 63 69 66  the range specif
2e910 69 65 64 20 62 79 0a 20 20 2a 2a 20 41 67 67 49  ied by.  ** AggI
2e920 6e 66 6f 2e 6d 6e 52 65 67 2e 2e 41 67 67 49 6e  nfo.mnReg..AggIn
2e930 66 6f 2e 6d 78 52 65 67 20 2a 2f 0a 20 20 61 73  fo.mxReg */.  as
2e940 73 65 72 74 28 20 6e 52 65 67 3d 3d 70 41 67 67  sert( nReg==pAgg
2e950 49 6e 66 6f 2d 3e 6d 78 52 65 67 2d 70 41 67 67  Info->mxReg-pAgg
2e960 49 6e 66 6f 2d 3e 6d 6e 52 65 67 2b 31 20 29 3b  Info->mnReg+1 );
2e970 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 41  .  for(i=0; i<pA
2e980 67 67 49 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e 3b  ggInfo->nColumn;
2e990 20 69 2b 2b 29 7b 0a 20 20 20 20 61 73 73 65 72   i++){.    asser
2e9a0 74 28 20 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f  t( pAggInfo->aCo
2e9b0 6c 5b 69 5d 2e 69 4d 65 6d 3e 3d 70 41 67 67 49  l[i].iMem>=pAggI
2e9c0 6e 66 6f 2d 3e 6d 6e 52 65 67 0a 20 20 20 20 20  nfo->mnReg.     
2e9d0 20 20 20 20 26 26 20 70 41 67 67 49 6e 66 6f 2d      && pAggInfo-
2e9e0 3e 61 43 6f 6c 5b 69 5d 2e 69 4d 65 6d 3c 3d 70  >aCol[i].iMem<=p
2e9f0 41 67 67 49 6e 66 6f 2d 3e 6d 78 52 65 67 20 29  AggInfo->mxReg )
2ea00 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b  ;.  }.  for(i=0;
2ea10 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75   i<pAggInfo->nFu
2ea20 6e 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 61 73  nc; i++){.    as
2ea30 73 65 72 74 28 20 70 41 67 67 49 6e 66 6f 2d 3e  sert( pAggInfo->
2ea40 61 46 75 6e 63 5b 69 5d 2e 69 4d 65 6d 3e 3d 70  aFunc[i].iMem>=p
2ea50 41 67 67 49 6e 66 6f 2d 3e 6d 6e 52 65 67 0a 20  AggInfo->mnReg. 
2ea60 20 20 20 20 20 20 20 20 26 26 20 70 41 67 67 49          && pAggI
2ea70 6e 66 6f 2d 3e 61 46 75 6e 63 5b 69 5d 2e 69 4d  nfo->aFunc[i].iM
2ea80 65 6d 3c 3d 70 41 67 67 49 6e 66 6f 2d 3e 6d 78  em<=pAggInfo->mx
2ea90 52 65 67 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  Reg );.  }.#endi
2eaa0 66 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  f.  sqlite3VdbeA
2eab0 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4e 75 6c 6c  ddOp3(v, OP_Null
2eac0 2c 20 30 2c 20 70 41 67 67 49 6e 66 6f 2d 3e 6d  , 0, pAggInfo->m
2ead0 6e 52 65 67 2c 20 70 41 67 67 49 6e 66 6f 2d 3e  nReg, pAggInfo->
2eae0 6d 78 52 65 67 29 3b 0a 20 20 66 6f 72 28 70 46  mxReg);.  for(pF
2eaf0 75 6e 63 3d 70 41 67 67 49 6e 66 6f 2d 3e 61 46  unc=pAggInfo->aF
2eb00 75 6e 63 2c 20 69 3d 30 3b 20 69 3c 70 41 67 67  unc, i=0; i<pAgg
2eb10 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3b 20 69 2b 2b  Info->nFunc; i++
2eb20 2c 20 70 46 75 6e 63 2b 2b 29 7b 0a 20 20 20 20  , pFunc++){.    
2eb30 69 66 28 20 70 46 75 6e 63 2d 3e 69 44 69 73 74  if( pFunc->iDist
2eb40 69 6e 63 74 3e 3d 30 20 29 7b 0a 20 20 20 20 20  inct>=0 ){.     
2eb50 20 45 78 70 72 20 2a 70 45 20 3d 20 70 46 75 6e   Expr *pE = pFun
2eb60 63 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20  c->pExpr;.      
2eb70 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73  assert( !ExprHas
2eb80 50 72 6f 70 65 72 74 79 28 70 45 2c 20 45 50 5f  Property(pE, EP_
2eb90 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20  xIsSelect) );.  
2eba0 20 20 20 20 69 66 28 20 70 45 2d 3e 78 2e 70 4c      if( pE->x.pL
2ebb0 69 73 74 3d 3d 30 20 7c 7c 20 70 45 2d 3e 78 2e  ist==0 || pE->x.
2ebc0 70 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d 31 20  pList->nExpr!=1 
2ebd0 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
2ebe0 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
2ebf0 65 2c 20 22 44 49 53 54 49 4e 43 54 20 61 67 67  e, "DISTINCT agg
2ec00 72 65 67 61 74 65 73 20 6d 75 73 74 20 68 61 76  regates must hav
2ec10 65 20 65 78 61 63 74 6c 79 20 6f 6e 65 20 22 0a  e exactly one ".
2ec20 20 20 20 20 20 20 20 20 20 20 20 22 61 72 67 75             "argu
2ec30 6d 65 6e 74 22 29 3b 0a 20 20 20 20 20 20 20 20  ment");.        
2ec40 70 46 75 6e 63 2d 3e 69 44 69 73 74 69 6e 63 74  pFunc->iDistinct
2ec50 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 7d 65 6c   = -1;.      }el
2ec60 73 65 7b 0a 20 20 20 20 20 20 20 20 4b 65 79 49  se{.        KeyI
2ec70 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 20 3d 20  nfo *pKeyInfo = 
2ec80 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 46 72  sqlite3KeyInfoFr
2ec90 6f 6d 45 78 70 72 4c 69 73 74 28 70 50 61 72 73  omExprList(pPars
2eca0 65 2c 20 70 45 2d 3e 78 2e 70 4c 69 73 74 2c 30  e, pE->x.pList,0
2ecb0 2c 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  ,0);.        sql
2ecc0 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
2ecd0 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72  , OP_OpenEphemer
2ece0 61 6c 2c 20 70 46 75 6e 63 2d 3e 69 44 69 73 74  al, pFunc->iDist
2ecf0 69 6e 63 74 2c 20 30 2c 20 30 2c 0a 20 20 20 20  inct, 0, 0,.    
2ed00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ed10 20 20 20 20 20 20 28 63 68 61 72 2a 29 70 4b 65        (char*)pKe
2ed20 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46  yInfo, P4_KEYINF
2ed30 4f 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  O);.      }.    
2ed40 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  }.  }.}../*.** I
2ed50 6e 76 6f 6b 65 20 74 68 65 20 4f 50 5f 41 67 67  nvoke the OP_Agg
2ed60 46 69 6e 61 6c 69 7a 65 20 6f 70 63 6f 64 65 20  Finalize opcode 
2ed70 66 6f 72 20 65 76 65 72 79 20 61 67 67 72 65 67  for every aggreg
2ed80 61 74 65 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20  ate function.** 
2ed90 69 6e 20 74 68 65 20 41 67 67 49 6e 66 6f 20 73  in the AggInfo s
2eda0 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 61  tructure..*/.sta
2edb0 74 69 63 20 76 6f 69 64 20 66 69 6e 61 6c 69 7a  tic void finaliz
2edc0 65 41 67 67 46 75 6e 63 74 69 6f 6e 73 28 50 61  eAggFunctions(Pa
2edd0 72 73 65 20 2a 70 50 61 72 73 65 2c 20 41 67 67  rse *pParse, Agg
2ede0 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f 29 7b  Info *pAggInfo){
2edf0 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61  .  Vdbe *v = pPa
2ee00 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e  rse->pVdbe;.  in
2ee10 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20 41 67  t i;.  struct Ag
2ee20 67 49 6e 66 6f 5f 66 75 6e 63 20 2a 70 46 3b 0a  gInfo_func *pF;.
2ee30 20 20 66 6f 72 28 69 3d 30 2c 20 70 46 3d 70 41    for(i=0, pF=pA
2ee40 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 3b 20 69  ggInfo->aFunc; i
2ee50 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63  <pAggInfo->nFunc
2ee60 3b 20 69 2b 2b 2c 20 70 46 2b 2b 29 7b 0a 20 20  ; i++, pF++){.  
2ee70 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73    ExprList *pLis
2ee80 74 20 3d 20 70 46 2d 3e 70 45 78 70 72 2d 3e 78  t = pF->pExpr->x
2ee90 2e 70 4c 69 73 74 3b 0a 20 20 20 20 61 73 73 65  .pList;.    asse
2eea0 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  rt( !ExprHasProp
2eeb0 65 72 74 79 28 70 46 2d 3e 70 45 78 70 72 2c 20  erty(pF->pExpr, 
2eec0 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b  EP_xIsSelect) );
2eed0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
2eee0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41 67 67  AddOp2(v, OP_Agg
2eef0 46 69 6e 61 6c 2c 20 70 46 2d 3e 69 4d 65 6d 2c  Final, pF->iMem,
2ef00 20 70 4c 69 73 74 20 3f 20 70 4c 69 73 74 2d 3e   pList ? pList->
2ef10 6e 45 78 70 72 20 3a 20 30 29 3b 0a 20 20 20 20  nExpr : 0);.    
2ef20 73 71 6c 69 74 65 33 56 64 62 65 41 70 70 65 6e  sqlite3VdbeAppen
2ef30 64 50 34 28 76 2c 20 70 46 2d 3e 70 46 75 6e 63  dP4(v, pF->pFunc
2ef40 2c 20 50 34 5f 46 55 4e 43 44 45 46 29 3b 0a 20  , P4_FUNCDEF);. 
2ef50 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 55 70 64   }.}.../*.** Upd
2ef60 61 74 65 20 74 68 65 20 61 63 63 75 6d 75 6c 61  ate the accumula
2ef70 74 6f 72 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73  tor memory cells
2ef80 20 66 6f 72 20 61 6e 20 61 67 67 72 65 67 61 74   for an aggregat
2ef90 65 20 62 61 73 65 64 20 6f 6e 0a 2a 2a 20 74 68  e based on.** th
2efa0 65 20 63 75 72 72 65 6e 74 20 63 75 72 73 6f 72  e current cursor
2efb0 20 70 6f 73 69 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a   position..**.**
2efc0 20 49 66 20 72 65 67 41 63 63 20 69 73 20 6e 6f   If regAcc is no
2efd0 6e 2d 7a 65 72 6f 20 61 6e 64 20 74 68 65 72 65  n-zero and there
2efe0 20 61 72 65 20 6e 6f 20 6d 69 6e 28 29 20 6f 72   are no min() or
2eff0 20 6d 61 78 28 29 20 61 67 67 72 65 67 61 74 65   max() aggregate
2f000 73 0a 2a 2a 20 69 6e 20 70 41 67 67 49 6e 66 6f  s.** in pAggInfo
2f010 2c 20 74 68 65 6e 20 6f 6e 6c 79 20 70 6f 70 75  , then only popu
2f020 6c 61 74 65 20 74 68 65 20 70 41 67 67 49 6e 66  late the pAggInf
2f030 6f 2d 3e 6e 41 63 63 75 6d 75 6c 61 74 6f 72 20  o->nAccumulator 
2f040 61 63 63 75 6d 75 6c 61 74 6f 72 0a 2a 2a 20 72  accumulator.** r
2f050 65 67 69 73 74 65 72 73 20 69 66 20 72 65 67 69  egisters if regi
2f060 73 74 65 72 20 72 65 67 41 63 63 20 63 6f 6e 74  ster regAcc cont
2f070 61 69 6e 73 20 30 2e 20 54 68 65 20 63 61 6c 6c  ains 0. The call
2f080 65 72 20 77 69 6c 6c 20 74 61 6b 65 20 63 61 72  er will take car
2f090 65 0a 2a 2a 20 6f 66 20 73 65 74 74 69 6e 67 20  e.** of setting 
2f0a0 61 6e 64 20 63 6c 65 61 72 69 6e 67 20 72 65 67  and clearing reg
2f0b0 41 63 63 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  Acc..*/.static v
2f0c0 6f 69 64 20 75 70 64 61 74 65 41 63 63 75 6d 75  oid updateAccumu
2f0d0 6c 61 74 6f 72 28 50 61 72 73 65 20 2a 70 50 61  lator(Parse *pPa
2f0e0 72 73 65 2c 20 69 6e 74 20 72 65 67 41 63 63 2c  rse, int regAcc,
2f0f0 20 41 67 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e   AggInfo *pAggIn
2f100 66 6f 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d  fo){.  Vdbe *v =
2f110 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a   pParse->pVdbe;.
2f120 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 72    int i;.  int r
2f130 65 67 48 69 74 20 3d 20 30 3b 0a 20 20 69 6e 74  egHit = 0;.  int
2f140 20 61 64 64 72 48 69 74 54 65 73 74 20 3d 20 30   addrHitTest = 0
2f150 3b 0a 20 20 73 74 72 75 63 74 20 41 67 67 49 6e  ;.  struct AggIn
2f160 66 6f 5f 66 75 6e 63 20 2a 70 46 3b 0a 20 20 73  fo_func *pF;.  s
2f170 74 72 75 63 74 20 41 67 67 49 6e 66 6f 5f 63 6f  truct AggInfo_co
2f180 6c 20 2a 70 43 3b 0a 0a 20 20 70 41 67 67 49 6e  l *pC;..  pAggIn
2f190 66 6f 2d 3e 64 69 72 65 63 74 4d 6f 64 65 20 3d  fo->directMode =
2f1a0 20 31 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70   1;.  for(i=0, p
2f1b0 46 3d 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e  F=pAggInfo->aFun
2f1c0 63 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e  c; i<pAggInfo->n
2f1d0 46 75 6e 63 3b 20 69 2b 2b 2c 20 70 46 2b 2b 29  Func; i++, pF++)
2f1e0 7b 0a 20 20 20 20 69 6e 74 20 6e 41 72 67 3b 0a  {.    int nArg;.
2f1f0 20 20 20 20 69 6e 74 20 61 64 64 72 4e 65 78 74      int addrNext
2f200 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 72 65   = 0;.    int re
2f210 67 41 67 67 3b 0a 20 20 20 20 45 78 70 72 4c 69  gAgg;.    ExprLi
2f220 73 74 20 2a 70 4c 69 73 74 20 3d 20 70 46 2d 3e  st *pList = pF->
2f230 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a  pExpr->x.pList;.
2f240 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70      assert( !Exp
2f250 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 46 2d  rHasProperty(pF-
2f260 3e 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65  >pExpr, EP_xIsSe
2f270 6c 65 63 74 29 20 29 3b 0a 20 20 20 20 61 73 73  lect) );.    ass
2f280 65 72 74 28 20 21 49 73 57 69 6e 64 6f 77 46 75  ert( !IsWindowFu
2f290 6e 63 28 70 46 2d 3e 70 45 78 70 72 29 20 29 3b  nc(pF->pExpr) );
2f2a0 0a 20 20 20 20 69 66 28 20 45 78 70 72 48 61 73  .    if( ExprHas
2f2b0 50 72 6f 70 65 72 74 79 28 70 46 2d 3e 70 45 78  Property(pF->pEx
2f2c0 70 72 2c 20 45 50 5f 57 69 6e 46 75 6e 63 29 20  pr, EP_WinFunc) 
2f2d0 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70  ){.      Expr *p
2f2e0 46 69 6c 74 65 72 20 3d 20 70 46 2d 3e 70 45 78  Filter = pF->pEx
2f2f0 70 72 2d 3e 79 2e 70 57 69 6e 2d 3e 70 46 69 6c  pr->y.pWin->pFil
2f300 74 65 72 3b 0a 20 20 20 20 20 20 61 64 64 72 4e  ter;.      addrN
2f310 65 78 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ext = sqlite3Vdb
2f320 65 4d 61 6b 65 4c 61 62 65 6c 28 70 50 61 72 73  eMakeLabel(pPars
2f330 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  e);.      sqlite
2f340 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61  3ExprIfFalse(pPa
2f350 72 73 65 2c 20 70 46 69 6c 74 65 72 2c 20 61 64  rse, pFilter, ad
2f360 64 72 4e 65 78 74 2c 20 53 51 4c 49 54 45 5f 4a  drNext, SQLITE_J
2f370 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20  UMPIFNULL);.    
2f380 7d 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74 20  }.    if( pList 
2f390 29 7b 0a 20 20 20 20 20 20 6e 41 72 67 20 3d 20  ){.      nArg = 
2f3a0 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20  pList->nExpr;.  
2f3b0 20 20 20 20 72 65 67 41 67 67 20 3d 20 73 71 6c      regAgg = sql
2f3c0 69 74 65 33 47 65 74 54 65 6d 70 52 61 6e 67 65  ite3GetTempRange
2f3d0 28 70 50 61 72 73 65 2c 20 6e 41 72 67 29 3b 0a  (pParse, nArg);.
2f3e0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
2f3f0 72 43 6f 64 65 45 78 70 72 4c 69 73 74 28 70 50  rCodeExprList(pP
2f400 61 72 73 65 2c 20 70 4c 69 73 74 2c 20 72 65 67  arse, pList, reg
2f410 41 67 67 2c 20 30 2c 20 53 51 4c 49 54 45 5f 45  Agg, 0, SQLITE_E
2f420 43 45 4c 5f 44 55 50 29 3b 0a 20 20 20 20 7d 65  CEL_DUP);.    }e
2f430 6c 73 65 7b 0a 20 20 20 20 20 20 6e 41 72 67 20  lse{.      nArg 
2f440 3d 20 30 3b 0a 20 20 20 20 20 20 72 65 67 41 67  = 0;.      regAg
2f450 67 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20  g = 0;.    }.   
2f460 20 69 66 28 20 70 46 2d 3e 69 44 69 73 74 69 6e   if( pF->iDistin
2f470 63 74 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  ct>=0 ){.      i
2f480 66 28 20 61 64 64 72 4e 65 78 74 3d 3d 30 20 29  f( addrNext==0 )
2f490 7b 20 0a 20 20 20 20 20 20 20 20 61 64 64 72 4e  { .        addrN
2f4a0 65 78 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ext = sqlite3Vdb
2f4b0 65 4d 61 6b 65 4c 61 62 65 6c 28 70 50 61 72 73  eMakeLabel(pPars
2f4c0 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  e);.      }.    
2f4d0 20 20 74 65 73 74 63 61 73 65 28 20 6e 41 72 67    testcase( nArg
2f4e0 3d 3d 30 20 29 3b 20 20 2f 2a 20 45 72 72 6f 72  ==0 );  /* Error
2f4f0 20 63 6f 6e 64 69 74 69 6f 6e 20 2a 2f 0a 20 20   condition */.  
2f500 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6e 41      testcase( nA
2f510 72 67 3e 31 20 29 3b 20 20 20 2f 2a 20 41 6c 73  rg>1 );   /* Als
2f520 6f 20 61 6e 20 65 72 72 6f 72 20 2a 2f 0a 20 20  o an error */.  
2f530 20 20 20 20 63 6f 64 65 44 69 73 74 69 6e 63 74      codeDistinct
2f540 28 70 50 61 72 73 65 2c 20 70 46 2d 3e 69 44 69  (pParse, pF->iDi
2f550 73 74 69 6e 63 74 2c 20 61 64 64 72 4e 65 78 74  stinct, addrNext
2f560 2c 20 31 2c 20 72 65 67 41 67 67 29 3b 0a 20 20  , 1, regAgg);.  
2f570 20 20 7d 0a 20 20 20 20 69 66 28 20 70 46 2d 3e    }.    if( pF->
2f580 70 46 75 6e 63 2d 3e 66 75 6e 63 46 6c 61 67 73  pFunc->funcFlags
2f590 20 26 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4e   & SQLITE_FUNC_N
2f5a0 45 45 44 43 4f 4c 4c 20 29 7b 0a 20 20 20 20 20  EEDCOLL ){.     
2f5b0 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20   CollSeq *pColl 
2f5c0 3d 20 30 3b 0a 20 20 20 20 20 20 73 74 72 75 63  = 0;.      struc
2f5d0 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20  t ExprList_item 
2f5e0 2a 70 49 74 65 6d 3b 0a 20 20 20 20 20 20 69 6e  *pItem;.      in
2f5f0 74 20 6a 3b 0a 20 20 20 20 20 20 61 73 73 65 72  t j;.      asser
2f600 74 28 20 70 4c 69 73 74 21 3d 30 20 29 3b 20 20  t( pList!=0 );  
2f610 2f 2a 20 70 4c 69 73 74 21 3d 30 20 69 66 20 70  /* pList!=0 if p
2f620 46 2d 3e 70 46 75 6e 63 20 68 61 73 20 4e 45 45  F->pFunc has NEE
2f630 44 43 4f 4c 4c 20 2a 2f 0a 20 20 20 20 20 20 66  DCOLL */.      f
2f640 6f 72 28 6a 3d 30 2c 20 70 49 74 65 6d 3d 70 4c  or(j=0, pItem=pL
2f650 69 73 74 2d 3e 61 3b 20 21 70 43 6f 6c 6c 20 26  ist->a; !pColl &
2f660 26 20 6a 3c 6e 41 72 67 3b 20 6a 2b 2b 2c 20 70  & j<nArg; j++, p
2f670 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20  Item++){.       
2f680 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33   pColl = sqlite3
2f690 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72  ExprCollSeq(pPar
2f6a0 73 65 2c 20 70 49 74 65 6d 2d 3e 70 45 78 70 72  se, pItem->pExpr
2f6b0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
2f6c0 20 69 66 28 20 21 70 43 6f 6c 6c 20 29 7b 0a 20   if( !pColl ){. 
2f6d0 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 70         pColl = p
2f6e0 50 61 72 73 65 2d 3e 64 62 2d 3e 70 44 66 6c 74  Parse->db->pDflt
2f6f0 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Coll;.      }.  
2f700 20 20 20 20 69 66 28 20 72 65 67 48 69 74 3d 3d      if( regHit==
2f710 30 20 26 26 20 70 41 67 67 49 6e 66 6f 2d 3e 6e  0 && pAggInfo->n
2f720 41 63 63 75 6d 75 6c 61 74 6f 72 20 29 20 72 65  Accumulator ) re
2f730 67 48 69 74 20 3d 20 2b 2b 70 50 61 72 73 65 2d  gHit = ++pParse-
2f740 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 73 71 6c  >nMem;.      sql
2f750 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
2f760 2c 20 4f 50 5f 43 6f 6c 6c 53 65 71 2c 20 72 65  , OP_CollSeq, re
2f770 67 48 69 74 2c 20 30 2c 20 30 2c 20 28 63 68 61  gHit, 0, 0, (cha
2f780 72 20 2a 29 70 43 6f 6c 6c 2c 20 50 34 5f 43 4f  r *)pColl, P4_CO
2f790 4c 4c 53 45 51 29 3b 0a 20 20 20 20 7d 0a 20 20  LLSEQ);.    }.  
2f7a0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
2f7b0 4f 70 33 28 76 2c 20 4f 50 5f 41 67 67 53 74 65  Op3(v, OP_AggSte
2f7c0 70 2c 20 30 2c 20 72 65 67 41 67 67 2c 20 70 46  p, 0, regAgg, pF
2f7d0 2d 3e 69 4d 65 6d 29 3b 0a 20 20 20 20 73 71 6c  ->iMem);.    sql
2f7e0 69 74 65 33 56 64 62 65 41 70 70 65 6e 64 50 34  ite3VdbeAppendP4
2f7f0 28 76 2c 20 70 46 2d 3e 70 46 75 6e 63 2c 20 50  (v, pF->pFunc, P
2f800 34 5f 46 55 4e 43 44 45 46 29 3b 0a 20 20 20 20  4_FUNCDEF);.    
2f810 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
2f820 65 50 35 28 76 2c 20 28 75 38 29 6e 41 72 67 29  eP5(v, (u8)nArg)
2f830 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c  ;.    sqlite3Rel
2f840 65 61 73 65 54 65 6d 70 52 61 6e 67 65 28 70 50  easeTempRange(pP
2f850 61 72 73 65 2c 20 72 65 67 41 67 67 2c 20 6e 41  arse, regAgg, nA
2f860 72 67 29 3b 0a 20 20 20 20 69 66 28 20 61 64 64  rg);.    if( add
2f870 72 4e 65 78 74 20 29 7b 0a 20 20 20 20 20 20 73  rNext ){.      s
2f880 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
2f890 65 4c 61 62 65 6c 28 76 2c 20 61 64 64 72 4e 65  eLabel(v, addrNe
2f8a0 78 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  xt);.    }.  }. 
2f8b0 20 69 66 28 20 72 65 67 48 69 74 3d 3d 30 20 26   if( regHit==0 &
2f8c0 26 20 70 41 67 67 49 6e 66 6f 2d 3e 6e 41 63 63  & pAggInfo->nAcc
2f8d0 75 6d 75 6c 61 74 6f 72 20 29 7b 0a 20 20 20 20  umulator ){.    
2f8e0 72 65 67 48 69 74 20 3d 20 72 65 67 41 63 63 3b  regHit = regAcc;
2f8f0 0a 20 20 7d 0a 20 20 69 66 28 20 72 65 67 48 69  .  }.  if( regHi
2f900 74 20 29 7b 0a 20 20 20 20 61 64 64 72 48 69 74  t ){.    addrHit
2f910 54 65 73 74 20 3d 20 73 71 6c 69 74 65 33 56 64  Test = sqlite3Vd
2f920 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49  beAddOp1(v, OP_I
2f930 66 2c 20 72 65 67 48 69 74 29 3b 20 56 64 62 65  f, regHit); Vdbe
2f940 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 7d  Coverage(v);.  }
2f950 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 43 3d 70  .  for(i=0, pC=p
2f960 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 3b 20 69  AggInfo->aCol; i
2f970 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 41 63 63 75  <pAggInfo->nAccu
2f980 6d 75 6c 61 74 6f 72 3b 20 69 2b 2b 2c 20 70 43  mulator; i++, pC
2f990 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ++){.    sqlite3
2f9a0 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
2f9b0 20 70 43 2d 3e 70 45 78 70 72 2c 20 70 43 2d 3e   pC->pExpr, pC->
2f9c0 69 4d 65 6d 29 3b 0a 20 20 7d 0a 20 20 70 41 67  iMem);.  }.  pAg
2f9d0 67 49 6e 66 6f 2d 3e 64 69 72 65 63 74 4d 6f 64  gInfo->directMod
2f9e0 65 20 3d 20 30 3b 0a 20 20 69 66 28 20 61 64 64  e = 0;.  if( add
2f9f0 72 48 69 74 54 65 73 74 20 29 7b 0a 20 20 20 20  rHitTest ){.    
2fa00 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
2fa10 65 72 65 28 76 2c 20 61 64 64 72 48 69 74 54 65  ere(v, addrHitTe
2fa20 73 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  st);.  }.}../*.*
2fa30 2a 20 41 64 64 20 61 20 73 69 6e 67 6c 65 20 4f  * Add a single O
2fa40 50 5f 45 78 70 6c 61 69 6e 20 69 6e 73 74 72 75  P_Explain instru
2fa50 63 74 69 6f 6e 20 74 6f 20 74 68 65 20 56 44 42  ction to the VDB
2fa60 45 20 74 6f 20 65 78 70 6c 61 69 6e 20 61 20 73  E to explain a s
2fa70 69 6d 70 6c 65 0a 2a 2a 20 63 6f 75 6e 74 28 2a  imple.** count(*
2fa80 29 20 71 75 65 72 79 20 28 22 53 45 4c 45 43 54  ) query ("SELECT
2fa90 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 70   count(*) FROM p
2faa0 54 61 62 22 29 2e 0a 2a 2f 0a 23 69 66 6e 64 65  Tab")..*/.#ifnde
2fab0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58  f SQLITE_OMIT_EX
2fac0 50 4c 41 49 4e 0a 73 74 61 74 69 63 20 76 6f 69  PLAIN.static voi
2fad0 64 20 65 78 70 6c 61 69 6e 53 69 6d 70 6c 65 43  d explainSimpleC
2fae0 6f 75 6e 74 28 0a 20 20 50 61 72 73 65 20 2a 70  ount(.  Parse *p
2faf0 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20  Parse,          
2fb00 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65          /* Parse
2fb10 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54 61   context */.  Ta
2fb20 62 6c 65 20 2a 70 54 61 62 2c 20 20 20 20 20 20  ble *pTab,      
2fb30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2fb40 20 54 61 62 6c 65 20 62 65 69 6e 67 20 71 75 65   Table being que
2fb50 72 69 65 64 20 2a 2f 0a 20 20 49 6e 64 65 78 20  ried */.  Index 
2fb60 2a 70 49 64 78 20 20 20 20 20 20 20 20 20 20 20  *pIdx           
2fb70 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
2fb80 65 78 20 75 73 65 64 20 74 6f 20 6f 70 74 69 6d  ex used to optim
2fb90 69 7a 65 20 73 63 61 6e 2c 20 6f 72 20 4e 55 4c  ize scan, or NUL
2fba0 4c 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 70 50  L */.){.  if( pP
2fbb0 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32  arse->explain==2
2fbc0 20 29 7b 0a 20 20 20 20 69 6e 74 20 62 43 6f 76   ){.    int bCov
2fbd0 65 72 20 3d 20 28 70 49 64 78 21 3d 30 20 26 26  er = (pIdx!=0 &&
2fbe0 20 28 48 61 73 52 6f 77 69 64 28 70 54 61 62 29   (HasRowid(pTab)
2fbf0 20 7c 7c 20 21 49 73 50 72 69 6d 61 72 79 4b 65   || !IsPrimaryKe
2fc00 79 49 6e 64 65 78 28 70 49 64 78 29 29 29 3b 0a  yIndex(pIdx)));.
2fc10 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 45      sqlite3VdbeE
2fc20 78 70 6c 61 69 6e 28 70 50 61 72 73 65 2c 20 30  xplain(pParse, 0
2fc30 2c 20 22 53 43 41 4e 20 54 41 42 4c 45 20 25 73  , "SCAN TABLE %s
2fc40 25 73 25 73 22 2c 0a 20 20 20 20 20 20 20 20 70  %s%s",.        p
2fc50 54 61 62 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20  Tab->zName,.    
2fc60 20 20 20 20 62 43 6f 76 65 72 20 3f 20 22 20 55      bCover ? " U
2fc70 53 49 4e 47 20 43 4f 56 45 52 49 4e 47 20 49 4e  SING COVERING IN
2fc80 44 45 58 20 22 20 3a 20 22 22 2c 0a 20 20 20 20  DEX " : "",.    
2fc90 20 20 20 20 62 43 6f 76 65 72 20 3f 20 70 49 64      bCover ? pId
2fca0 78 2d 3e 7a 4e 61 6d 65 20 3a 20 22 22 0a 20 20  x->zName : "".  
2fcb0 20 20 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65    );.  }.}.#else
2fcc0 0a 23 20 64 65 66 69 6e 65 20 65 78 70 6c 61 69  .# define explai
2fcd0 6e 53 69 6d 70 6c 65 43 6f 75 6e 74 28 61 2c 62  nSimpleCount(a,b
2fce0 2c 63 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ,c).#endif../*.*
2fcf0 2a 20 73 71 6c 69 74 65 33 57 61 6c 6b 45 78 70  * sqlite3WalkExp
2fd00 72 28 29 20 63 61 6c 6c 62 61 63 6b 20 75 73 65  r() callback use
2fd10 64 20 62 79 20 68 61 76 69 6e 67 54 6f 57 68 65  d by havingToWhe
2fd20 72 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  re()..**.** If t
2fd30 68 65 20 6e 6f 64 65 20 70 61 73 73 65 64 20 74  he node passed t
2fd40 6f 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 20 69  o the callback i
2fd50 73 20 61 20 54 4b 5f 41 4e 44 20 6e 6f 64 65 2c  s a TK_AND node,
2fd60 20 72 65 74 75 72 6e 20 0a 2a 2a 20 57 52 43 5f   return .** WRC_
2fd70 43 6f 6e 74 69 6e 75 65 20 74 6f 20 74 65 6c 6c  Continue to tell
2fd80 20 73 71 6c 69 74 65 33 57 61 6c 6b 45 78 70 72   sqlite3WalkExpr
2fd90 28 29 20 74 6f 20 69 74 65 72 61 74 65 20 74 68  () to iterate th
2fda0 72 6f 75 67 68 20 63 68 69 6c 64 20 6e 6f 64 65  rough child node
2fdb0 73 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69  s..**.** Otherwi
2fdc0 73 65 2c 20 72 65 74 75 72 6e 20 57 52 43 5f 50  se, return WRC_P
2fdd0 72 75 6e 65 2e 20 49 6e 20 74 68 69 73 20 63 61  rune. In this ca
2fde0 73 65 2c 20 61 6c 73 6f 20 63 68 65 63 6b 20 69  se, also check i
2fdf0 66 20 74 68 65 20 0a 2a 2a 20 73 75 62 2d 65 78  f the .** sub-ex
2fe00 70 72 65 73 73 69 6f 6e 20 6d 61 74 63 68 65 73  pression matches
2fe10 20 74 68 65 20 63 72 69 74 65 72 69 61 20 66 6f   the criteria fo
2fe20 72 20 62 65 69 6e 67 20 6d 6f 76 65 64 20 74 6f  r being moved to
2fe30 20 74 68 65 20 57 48 45 52 45 0a 2a 2a 20 63 6c   the WHERE.** cl
2fe40 61 75 73 65 2e 20 49 66 20 73 6f 2c 20 61 64 64  ause. If so, add
2fe50 20 69 74 20 74 6f 20 74 68 65 20 57 48 45 52 45   it to the WHERE
2fe60 20 63 6c 61 75 73 65 20 61 6e 64 20 72 65 70 6c   clause and repl
2fe70 61 63 65 20 74 68 65 20 73 75 62 2d 65 78 70 72  ace the sub-expr
2fe80 65 73 73 69 6f 6e 0a 2a 2a 20 77 69 74 68 69 6e  ession.** within
2fe90 20 74 68 65 20 48 41 56 49 4e 47 20 65 78 70 72   the HAVING expr
2fea0 65 73 73 69 6f 6e 20 77 69 74 68 20 61 20 63 6f  ession with a co
2feb0 6e 73 74 61 6e 74 20 22 31 22 2e 0a 2a 2f 0a 73  nstant "1"..*/.s
2fec0 74 61 74 69 63 20 69 6e 74 20 68 61 76 69 6e 67  tatic int having
2fed0 54 6f 57 68 65 72 65 45 78 70 72 43 62 28 57 61  ToWhereExprCb(Wa
2fee0 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 45  lker *pWalker, E
2fef0 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 69  xpr *pExpr){.  i
2ff00 66 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b  f( pExpr->op!=TK
2ff10 5f 41 4e 44 20 29 7b 0a 20 20 20 20 53 65 6c 65  _AND ){.    Sele
2ff20 63 74 20 2a 70 53 20 3d 20 70 57 61 6c 6b 65 72  ct *pS = pWalker
2ff30 2d 3e 75 2e 70 53 65 6c 65 63 74 3b 0a 20 20 20  ->u.pSelect;.   
2ff40 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72   if( sqlite3Expr
2ff50 49 73 43 6f 6e 73 74 61 6e 74 4f 72 47 72 6f 75  IsConstantOrGrou
2ff60 70 42 79 28 70 57 61 6c 6b 65 72 2d 3e 70 50 61  pBy(pWalker->pPa
2ff70 72 73 65 2c 20 70 45 78 70 72 2c 20 70 53 2d 3e  rse, pExpr, pS->
2ff80 70 47 72 6f 75 70 42 79 29 20 29 7b 0a 20 20 20  pGroupBy) ){.   
2ff90 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d     sqlite3 *db =
2ffa0 20 70 57 61 6c 6b 65 72 2d 3e 70 50 61 72 73 65   pWalker->pParse
2ffb0 2d 3e 64 62 3b 0a 20 20 20 20 20 20 45 78 70 72  ->db;.      Expr
2ffc0 20 2a 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33   *pNew = sqlite3
2ffd0 45 78 70 72 41 6c 6c 6f 63 28 64 62 2c 20 54 4b  ExprAlloc(db, TK
2ffe0 5f 49 4e 54 45 47 45 52 2c 20 26 73 71 6c 69 74  _INTEGER, &sqlit
2fff0 65 33 49 6e 74 54 6f 6b 65 6e 73 5b 31 5d 2c 20  e3IntTokens[1], 
30000 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4e  0);.      if( pN
30010 65 77 20 29 7b 0a 20 20 20 20 20 20 20 20 45 78  ew ){.        Ex
30020 70 72 20 2a 70 57 68 65 72 65 20 3d 20 70 53 2d  pr *pWhere = pS-
30030 3e 70 57 68 65 72 65 3b 0a 20 20 20 20 20 20 20  >pWhere;.       
30040 20 53 57 41 50 28 45 78 70 72 2c 20 2a 70 4e 65   SWAP(Expr, *pNe
30050 77 2c 20 2a 70 45 78 70 72 29 3b 0a 20 20 20 20  w, *pExpr);.    
30060 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74      pNew = sqlit
30070 65 33 45 78 70 72 41 6e 64 28 70 57 61 6c 6b 65  e3ExprAnd(pWalke
30080 72 2d 3e 70 50 61 72 73 65 2c 20 70 57 68 65 72  r->pParse, pWher
30090 65 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20 20 20  e, pNew);.      
300a0 20 20 70 53 2d 3e 70 57 68 65 72 65 20 3d 20 70    pS->pWhere = p
300b0 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 70 57 61  New;.        pWa
300c0 6c 6b 65 72 2d 3e 65 43 6f 64 65 20 3d 20 31 3b  lker->eCode = 1;
300d0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
300e0 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 50 72     return WRC_Pr
300f0 75 6e 65 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  une;.  }.  retur
30100 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a  n WRC_Continue;.
30110 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 61 6e 73 66 65  }../*.** Transfe
30120 72 20 65 6c 69 67 69 62 6c 65 20 74 65 72 6d 73  r eligible terms
30130 20 66 72 6f 6d 20 74 68 65 20 48 41 56 49 4e 47   from the HAVING
30140 20 63 6c 61 75 73 65 20 6f 66 20 61 20 71 75 65   clause of a que
30150 72 79 2c 20 77 68 69 63 68 20 69 73 0a 2a 2a 20  ry, which is.** 
30160 70 72 6f 63 65 73 73 65 64 20 61 66 74 65 72 20  processed after 
30170 67 72 6f 75 70 69 6e 67 2c 20 74 6f 20 74 68 65  grouping, to the
30180 20 57 48 45 52 45 20 63 6c 61 75 73 65 2c 20 77   WHERE clause, w
30190 68 69 63 68 20 69 73 20 70 72 6f 63 65 73 73 65  hich is processe
301a0 64 20 62 65 66 6f 72 65 0a 2a 2a 20 67 72 6f 75  d before.** grou
301b0 70 69 6e 67 2e 20 46 6f 72 20 65 78 61 6d 70 6c  ping. For exampl
301c0 65 2c 20 74 68 65 20 71 75 65 72 79 3a 0a 2a 2a  e, the query:.**
301d0 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20 2a 20 46  .**   SELECT * F
301e0 52 4f 4d 20 3c 74 61 62 6c 65 73 3e 20 57 48 45  ROM <tables> WHE
301f0 52 45 20 61 3d 3f 20 47 52 4f 55 50 20 42 59 20  RE a=? GROUP BY 
30200 62 20 48 41 56 49 4e 47 20 62 3d 3f 20 41 4e 44  b HAVING b=? AND
30210 20 63 3d 3f 0a 2a 2a 0a 2a 2a 20 63 61 6e 20 62   c=?.**.** can b
30220 65 20 72 65 77 72 69 74 74 65 6e 20 61 73 3a 0a  e rewritten as:.
30230 2a 2a 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20 2a  **.**   SELECT *
30240 20 46 52 4f 4d 20 3c 74 61 62 6c 65 73 3e 20 57   FROM <tables> W
30250 48 45 52 45 20 61 3d 3f 20 41 4e 44 20 62 3d 3f  HERE a=? AND b=?
30260 20 47 52 4f 55 50 20 42 59 20 62 20 48 41 56 49   GROUP BY b HAVI
30270 4e 47 20 63 3d 3f 0a 2a 2a 0a 2a 2a 20 41 20 74  NG c=?.**.** A t
30280 65 72 6d 20 6f 66 20 74 68 65 20 48 41 56 49 4e  erm of the HAVIN
30290 47 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  G expression is 
302a0 65 6c 69 67 69 62 6c 65 20 66 6f 72 20 74 72 61  eligible for tra
302b0 6e 73 66 65 72 20 69 66 20 69 74 20 63 6f 6e 73  nsfer if it cons
302c0 69 73 74 73 0a 2a 2a 20 65 6e 74 69 72 65 6c 79  ists.** entirely
302d0 20 6f 66 20 63 6f 6e 73 74 61 6e 74 73 20 61 6e   of constants an
302e0 64 20 65 78 70 72 65 73 73 69 6f 6e 73 20 74 68  d expressions th
302f0 61 74 20 61 72 65 20 61 6c 73 6f 20 47 52 4f 55  at are also GROU
30300 50 20 42 59 20 74 65 72 6d 73 20 74 68 61 74 0a  P BY terms that.
30310 2a 2a 20 75 73 65 20 74 68 65 20 22 42 49 4e 41  ** use the "BINA
30320 52 59 22 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65  RY" collation se
30330 71 75 65 6e 63 65 2e 0a 2a 2f 0a 73 74 61 74 69  quence..*/.stati
30340 63 20 76 6f 69 64 20 68 61 76 69 6e 67 54 6f 57  c void havingToW
30350 68 65 72 65 28 50 61 72 73 65 20 2a 70 50 61 72  here(Parse *pPar
30360 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a  se, Select *p){.
30370 20 20 57 61 6c 6b 65 72 20 73 57 61 6c 6b 65 72    Walker sWalker
30380 3b 0a 20 20 6d 65 6d 73 65 74 28 26 73 57 61 6c  ;.  memset(&sWal
30390 6b 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73  ker, 0, sizeof(s
303a0 57 61 6c 6b 65 72 29 29 3b 0a 20 20 73 57 61 6c  Walker));.  sWal
303b0 6b 65 72 2e 70 50 61 72 73 65 20 3d 20 70 50 61  ker.pParse = pPa
303c0 72 73 65 3b 0a 20 20 73 57 61 6c 6b 65 72 2e 78  rse;.  sWalker.x
303d0 45 78 70 72 43 61 6c 6c 62 61 63 6b 20 3d 20 68  ExprCallback = h
303e0 61 76 69 6e 67 54 6f 57 68 65 72 65 45 78 70 72  avingToWhereExpr
303f0 43 62 3b 0a 20 20 73 57 61 6c 6b 65 72 2e 75 2e  Cb;.  sWalker.u.
30400 70 53 65 6c 65 63 74 20 3d 20 70 3b 0a 20 20 73  pSelect = p;.  s
30410 71 6c 69 74 65 33 57 61 6c 6b 45 78 70 72 28 26  qlite3WalkExpr(&
30420 73 57 61 6c 6b 65 72 2c 20 70 2d 3e 70 48 61 76  sWalker, p->pHav
30430 69 6e 67 29 3b 0a 23 69 66 20 53 45 4c 45 43 54  ing);.#if SELECT
30440 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20  TRACE_ENABLED.  
30450 69 66 28 20 73 57 61 6c 6b 65 72 2e 65 43 6f 64  if( sWalker.eCod
30460 65 20 26 26 20 28 73 71 6c 69 74 65 33 53 65 6c  e && (sqlite3Sel
30470 65 63 74 54 72 61 63 65 20 26 20 30 78 31 30 30  ectTrace & 0x100
30480 29 21 3d 30 20 29 7b 0a 20 20 20 20 53 45 4c 45  )!=0 ){.    SELE
30490 43 54 54 52 41 43 45 28 30 78 31 30 30 2c 70 50  CTTRACE(0x100,pP
304a0 61 72 73 65 2c 70 2c 28 22 4d 6f 76 65 20 48 41  arse,p,("Move HA
304b0 56 49 4e 47 20 74 65 72 6d 73 20 69 6e 74 6f 20  VING terms into 
304c0 57 48 45 52 45 3a 5c 6e 22 29 29 3b 0a 20 20 20  WHERE:\n"));.   
304d0 20 73 71 6c 69 74 65 33 54 72 65 65 56 69 65 77   sqlite3TreeView
304e0 53 65 6c 65 63 74 28 30 2c 20 70 2c 20 30 29 3b  Select(0, p, 0);
304f0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f  .  }.#endif.}../
30500 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 6f 20 73 65  *.** Check to se
30510 65 20 69 66 20 74 68 65 20 70 54 68 69 73 20 65  e if the pThis e
30520 6e 74 72 79 20 6f 66 20 70 54 61 62 4c 69 73 74  ntry of pTabList
30530 20 69 73 20 61 20 73 65 6c 66 2d 6a 6f 69 6e 20   is a self-join 
30540 6f 66 20 61 20 70 72 69 6f 72 20 76 69 65 77 2e  of a prior view.
30550 0a 2a 2a 20 49 66 20 69 74 20 69 73 2c 20 74 68  .** If it is, th
30560 65 6e 20 72 65 74 75 72 6e 20 74 68 65 20 53 72  en return the Sr
30570 63 4c 69 73 74 5f 69 74 65 6d 20 66 6f 72 20 74  cList_item for t
30580 68 65 20 70 72 69 6f 72 20 76 69 65 77 2e 20 20  he prior view.  
30590 49 66 20 69 74 20 69 73 20 6e 6f 74 2c 0a 2a 2a  If it is not,.**
305a0 20 74 68 65 6e 20 72 65 74 75 72 6e 20 30 2e 0a   then return 0..
305b0 2a 2f 0a 73 74 61 74 69 63 20 73 74 72 75 63 74  */.static struct
305c0 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 69   SrcList_item *i
305d0 73 53 65 6c 66 4a 6f 69 6e 56 69 65 77 28 0a 20  sSelfJoinView(. 
305e0 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69   SrcList *pTabLi
305f0 73 74 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  st,           /*
30600 20 53 65 61 72 63 68 20 66 6f 72 20 73 65 6c 66   Search for self
30610 2d 6a 6f 69 6e 73 20 69 6e 20 74 68 69 73 20 46  -joins in this F
30620 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20  ROM clause */.  
30630 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
30640 74 65 6d 20 2a 70 54 68 69 73 20 20 20 2f 2a 20  tem *pThis   /* 
30650 53 65 61 72 63 68 20 66 6f 72 20 70 72 69 6f 72  Search for prior
30660 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68   reference to th
30670 69 73 20 73 75 62 71 75 65 72 79 20 2a 2f 0a 29  is subquery */.)
30680 7b 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69  {.  struct SrcLi
30690 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a  st_item *pItem;.
306a0 20 20 66 6f 72 28 70 49 74 65 6d 20 3d 20 70 54    for(pItem = pT
306b0 61 62 4c 69 73 74 2d 3e 61 3b 20 70 49 74 65 6d  abList->a; pItem
306c0 3c 70 54 68 69 73 3b 20 70 49 74 65 6d 2b 2b 29  <pThis; pItem++)
306d0 7b 0a 20 20 20 20 53 65 6c 65 63 74 20 2a 70 53  {.    Select *pS
306e0 31 3b 0a 20 20 20 20 69 66 28 20 70 49 74 65 6d  1;.    if( pItem
306f0 2d 3e 70 53 65 6c 65 63 74 3d 3d 30 20 29 20 63  ->pSelect==0 ) c
30700 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28  ontinue;.    if(
30710 20 70 49 74 65 6d 2d 3e 66 67 2e 76 69 61 43 6f   pItem->fg.viaCo
30720 72 6f 75 74 69 6e 65 20 29 20 63 6f 6e 74 69 6e  routine ) contin
30730 75 65 3b 0a 20 20 20 20 69 66 28 20 70 49 74 65  ue;.    if( pIte
30740 6d 2d 3e 7a 4e 61 6d 65 3d 3d 30 20 29 20 63 6f  m->zName==0 ) co
30750 6e 74 69 6e 75 65 3b 0a 20 20 20 20 61 73 73 65  ntinue;.    asse
30760 72 74 28 20 70 49 74 65 6d 2d 3e 70 54 61 62 21  rt( pItem->pTab!
30770 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =0 );.    assert
30780 28 20 70 54 68 69 73 2d 3e 70 54 61 62 21 3d 30  ( pThis->pTab!=0
30790 20 29 3b 0a 20 20 20 20 69 66 28 20 70 49 74 65   );.    if( pIte
307a0 6d 2d 3e 70 54 61 62 2d 3e 70 53 63 68 65 6d 61  m->pTab->pSchema
307b0 21 3d 70 54 68 69 73 2d 3e 70 54 61 62 2d 3e 70  !=pThis->pTab->p
307c0 53 63 68 65 6d 61 20 29 20 63 6f 6e 74 69 6e 75  Schema ) continu
307d0 65 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  e;.    if( sqlit
307e0 65 33 5f 73 74 72 69 63 6d 70 28 70 49 74 65 6d  e3_stricmp(pItem
307f0 2d 3e 7a 4e 61 6d 65 2c 20 70 54 68 69 73 2d 3e  ->zName, pThis->
30800 7a 4e 61 6d 65 29 21 3d 30 20 29 20 63 6f 6e 74  zName)!=0 ) cont
30810 69 6e 75 65 3b 0a 20 20 20 20 70 53 31 20 3d 20  inue;.    pS1 = 
30820 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a  pItem->pSelect;.
30830 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 70      if( pItem->p
30840 54 61 62 2d 3e 70 53 63 68 65 6d 61 3d 3d 30 20  Tab->pSchema==0 
30850 26 26 20 70 54 68 69 73 2d 3e 70 53 65 6c 65 63  && pThis->pSelec
30860 74 2d 3e 73 65 6c 49 64 21 3d 70 53 31 2d 3e 73  t->selId!=pS1->s
30870 65 6c 49 64 20 29 7b 0a 20 20 20 20 20 20 2f 2a  elId ){.      /*
30880 20 54 68 65 20 71 75 65 72 79 20 66 6c 61 74 74   The query flatt
30890 65 6e 65 72 20 6c 65 66 74 20 74 77 6f 20 64 69  ener left two di
308a0 66 66 65 72 65 6e 74 20 43 54 45 20 74 61 62 6c  fferent CTE tabl
308b0 65 73 20 77 69 74 68 20 69 64 65 6e 74 69 63 61  es with identica
308c0 6c 0a 20 20 20 20 20 20 2a 2a 20 6e 61 6d 65 73  l.      ** names
308d0 20 69 6e 20 74 68 65 20 73 61 6d 65 20 46 52 4f   in the same FRO
308e0 4d 20 63 6c 61 75 73 65 2e 20 2a 2f 0a 20 20 20  M clause. */.   
308f0 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
30900 20 7d 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74   }.    if( sqlit
30910 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28 30 2c  e3ExprCompare(0,
30920 20 70 54 68 69 73 2d 3e 70 53 65 6c 65 63 74 2d   pThis->pSelect-
30930 3e 70 57 68 65 72 65 2c 20 70 53 31 2d 3e 70 57  >pWhere, pS1->pW
30940 68 65 72 65 2c 20 2d 31 29 0a 20 20 20 20 20 7c  here, -1).     |
30950 7c 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d  | sqlite3ExprCom
30960 70 61 72 65 28 30 2c 20 70 54 68 69 73 2d 3e 70  pare(0, pThis->p
30970 53 65 6c 65 63 74 2d 3e 70 48 61 76 69 6e 67 2c  Select->pHaving,
30980 20 70 53 31 2d 3e 70 48 61 76 69 6e 67 2c 20 2d   pS1->pHaving, -
30990 31 29 20 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  1) .    ){.     
309a0 20 2f 2a 20 54 68 65 20 76 69 65 77 20 77 61 73   /* The view was
309b0 20 6d 6f 64 69 66 69 65 64 20 62 79 20 73 6f 6d   modified by som
309c0 65 20 6f 74 68 65 72 20 6f 70 74 69 6d 69 7a 61  e other optimiza
309d0 74 69 6f 6e 20 73 75 63 68 20 61 73 0a 20 20 20  tion such as.   
309e0 20 20 20 2a 2a 20 70 75 73 68 44 6f 77 6e 57 68     ** pushDownWh
309f0 65 72 65 54 65 72 6d 73 28 29 20 2a 2f 0a 20 20  ereTerms() */.  
30a00 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
30a10 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 70    }.    return p
30a20 49 74 65 6d 3b 0a 20 20 7d 0a 20 20 72 65 74 75  Item;.  }.  retu
30a30 72 6e 20 30 3b 0a 7d 0a 0a 23 69 66 64 65 66 20  rn 0;.}..#ifdef 
30a40 53 51 4c 49 54 45 5f 43 4f 55 4e 54 4f 46 56 49  SQLITE_COUNTOFVI
30a50 45 57 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 0a  EW_OPTIMIZATION.
30a60 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74 6f  /*.** Attempt to
30a70 20 74 72 61 6e 73 66 6f 72 6d 20 61 20 71 75 65   transform a que
30a80 72 79 20 6f 66 20 74 68 65 20 66 6f 72 6d 0a 2a  ry of the form.*
30a90 2a 0a 2a 2a 20 20 20 20 53 45 4c 45 43 54 20 63  *.**    SELECT c
30aa0 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 28 53 45  ount(*) FROM (SE
30ab0 4c 45 43 54 20 78 20 46 52 4f 4d 20 74 31 20 55  LECT x FROM t1 U
30ac0 4e 49 4f 4e 20 41 4c 4c 20 53 45 4c 45 43 54 20  NION ALL SELECT 
30ad0 79 20 46 52 4f 4d 20 74 32 29 0a 2a 2a 0a 2a 2a  y FROM t2).**.**
30ae0 20 49 6e 74 6f 20 74 68 69 73 3a 0a 2a 2a 0a 2a   Into this:.**.*
30af0 2a 20 20 20 20 53 45 4c 45 43 54 20 28 53 45 4c  *    SELECT (SEL
30b00 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f  ECT count(*) FRO
30b10 4d 20 74 31 29 2b 28 53 45 4c 45 43 54 20 63 6f  M t1)+(SELECT co
30b20 75 6e 74 28 2a 29 20 46 52 4f 4d 20 74 32 29 0a  unt(*) FROM t2).
30b30 2a 2a 0a 2a 2a 20 54 68 65 20 74 72 61 6e 73 66  **.** The transf
30b40 6f 72 6d 61 74 69 6f 6e 20 6f 6e 6c 79 20 77 6f  ormation only wo
30b50 72 6b 73 20 69 66 20 61 6c 6c 20 6f 66 20 74 68  rks if all of th
30b60 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65 20  e following are 
30b70 74 72 75 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20  true:.**.**   * 
30b80 20 54 68 65 20 73 75 62 71 75 65 72 79 20 69 73   The subquery is
30b90 20 61 20 55 4e 49 4f 4e 20 41 4c 4c 20 6f 66 20   a UNION ALL of 
30ba0 74 77 6f 20 6f 72 20 6d 6f 72 65 20 74 65 72 6d  two or more term
30bb0 73 0a 2a 2a 20 20 20 2a 20 20 54 68 65 20 73 75  s.**   *  The su
30bc0 62 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20  bquery does not 
30bd0 68 61 76 65 20 61 20 4c 49 4d 49 54 20 63 6c 61  have a LIMIT cla
30be0 75 73 65 0a 2a 2a 20 20 20 2a 20 20 54 68 65 72  use.**   *  Ther
30bf0 65 20 69 73 20 6e 6f 20 57 48 45 52 45 20 6f 72  e is no WHERE or
30c00 20 47 52 4f 55 50 20 42 59 20 6f 72 20 48 41 56   GROUP BY or HAV
30c10 49 4e 47 20 63 6c 61 75 73 65 73 20 6f 6e 20 74  ING clauses on t
30c20 68 65 20 73 75 62 71 75 65 72 69 65 73 0a 2a 2a  he subqueries.**
30c30 20 20 20 2a 20 20 54 68 65 20 6f 75 74 65 72 20     *  The outer 
30c40 71 75 65 72 79 20 69 73 20 61 20 73 69 6d 70 6c  query is a simpl
30c50 65 20 63 6f 75 6e 74 28 2a 29 20 77 69 74 68 20  e count(*) with 
30c60 6e 6f 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  no WHERE clause 
30c70 6f 72 20 6f 74 68 65 72 0a 2a 2a 20 20 20 20 20  or other.**     
30c80 20 65 78 74 72 61 6e 65 6f 75 73 20 73 79 6e 74   extraneous synt
30c90 61 78 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  ax..**.** Return
30ca0 20 54 52 55 45 20 69 66 20 74 68 65 20 6f 70 74   TRUE if the opt
30cb0 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20 75 6e 64  imization is und
30cc0 65 72 74 61 6b 65 6e 2e 0a 2a 2f 0a 73 74 61 74  ertaken..*/.stat
30cd0 69 63 20 69 6e 74 20 63 6f 75 6e 74 4f 66 56 69  ic int countOfVi
30ce0 65 77 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 28 50  ewOptimization(P
30cf0 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 65  arse *pParse, Se
30d00 6c 65 63 74 20 2a 70 29 7b 0a 20 20 53 65 6c 65  lect *p){.  Sele
30d10 63 74 20 2a 70 53 75 62 2c 20 2a 70 50 72 69 6f  ct *pSub, *pPrio
30d20 72 3b 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72  r;.  Expr *pExpr
30d30 3b 0a 20 20 45 78 70 72 20 2a 70 43 6f 75 6e 74  ;.  Expr *pCount
30d40 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  ;.  sqlite3 *db;
30d50 0a 20 20 69 66 28 20 28 70 2d 3e 73 65 6c 46 6c  .  if( (p->selFl
30d60 61 67 73 20 26 20 53 46 5f 41 67 67 72 65 67 61  ags & SF_Aggrega
30d70 74 65 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  te)==0 ) return 
30d80 30 3b 20 20 20 2f 2a 20 54 68 69 73 20 69 73 20  0;   /* This is 
30d90 61 6e 20 61 67 67 72 65 67 61 74 65 20 2a 2f 0a  an aggregate */.
30da0 20 20 69 66 28 20 70 2d 3e 70 45 4c 69 73 74 2d    if( p->pEList-
30db0 3e 6e 45 78 70 72 21 3d 31 20 29 20 72 65 74 75  >nExpr!=1 ) retu
30dc0 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20  rn 0;           
30dd0 20 20 20 20 2f 2a 20 53 69 6e 67 6c 65 20 72 65      /* Single re
30de0 73 75 6c 74 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20  sult column */. 
30df0 20 69 66 28 20 70 2d 3e 70 57 68 65 72 65 20 29   if( p->pWhere )
30e00 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28   return 0;.  if(
30e10 20 70 2d 3e 70 47 72 6f 75 70 42 79 20 29 20 72   p->pGroupBy ) r
30e20 65 74 75 72 6e 20 30 3b 0a 20 20 70 45 78 70 72  eturn 0;.  pExpr
30e30 20 3d 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b   = p->pEList->a[
30e40 30 5d 2e 70 45 78 70 72 3b 0a 20 20 69 66 28 20  0].pExpr;.  if( 
30e50 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 41 47  pExpr->op!=TK_AG
30e60 47 5f 46 55 4e 43 54 49 4f 4e 20 29 20 72 65 74  G_FUNCTION ) ret
30e70 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 2f 2a  urn 0;        /*
30e80 20 52 65 73 75 6c 74 20 69 73 20 61 6e 20 61 67   Result is an ag
30e90 67 72 65 67 61 74 65 20 2a 2f 0a 20 20 69 66 28  gregate */.  if(
30ea0 20 73 71 6c 69 74 65 33 5f 73 74 72 69 63 6d 70   sqlite3_stricmp
30eb0 28 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e  (pExpr->u.zToken
30ec0 2c 22 63 6f 75 6e 74 22 29 20 29 20 72 65 74 75  ,"count") ) retu
30ed0 72 6e 20 30 3b 20 20 2f 2a 20 49 73 20 63 6f 75  rn 0;  /* Is cou
30ee0 6e 74 28 29 20 2a 2f 0a 20 20 69 66 28 20 70 45  nt() */.  if( pE
30ef0 78 70 72 2d 3e 78 2e 70 4c 69 73 74 21 3d 30 20  xpr->x.pList!=0 
30f00 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20  ) return 0;     
30f10 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
30f20 75 73 74 20 62 65 20 63 6f 75 6e 74 28 2a 29 20  ust be count(*) 
30f30 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 53 72 63  */.  if( p->pSrc
30f40 2d 3e 6e 53 72 63 21 3d 31 20 29 20 72 65 74 75  ->nSrc!=1 ) retu
30f50 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20  rn 0;           
30f60 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 74 61         /* One ta
30f70 62 6c 65 20 69 6e 20 46 52 4f 4d 20 20 2a 2f 0a  ble in FROM  */.
30f80 20 20 70 53 75 62 20 3d 20 70 2d 3e 70 53 72 63    pSub = p->pSrc
30f90 2d 3e 61 5b 30 5d 2e 70 53 65 6c 65 63 74 3b 0a  ->a[0].pSelect;.
30fa0 20 20 69 66 28 20 70 53 75 62 3d 3d 30 20 29 20    if( pSub==0 ) 
30fb0 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20  return 0;       
30fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30fd0 20 20 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20      /* The FROM 
30fe0 69 73 20 61 20 73 75 62 71 75 65 72 79 20 2a 2f  is a subquery */
30ff0 0a 20 20 69 66 28 20 70 53 75 62 2d 3e 70 50 72  .  if( pSub->pPr
31000 69 6f 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ior==0 ) return 
31010 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
31020 20 20 20 20 20 2f 2a 20 4d 75 73 74 20 62 65 20       /* Must be 
31030 61 20 63 6f 6d 70 6f 75 6e 64 20 72 79 20 2a 2f  a compound ry */
31040 0a 20 20 64 6f 7b 0a 20 20 20 20 69 66 28 20 70  .  do{.    if( p
31050 53 75 62 2d 3e 6f 70 21 3d 54 4b 5f 41 4c 4c 20  Sub->op!=TK_ALL 
31060 26 26 20 70 53 75 62 2d 3e 70 50 72 69 6f 72 20  && pSub->pPrior 
31070 29 20 72 65 74 75 72 6e 20 30 3b 20 20 2f 2a 20  ) return 0;  /* 
31080 4d 75 73 74 20 62 65 20 55 4e 49 4f 4e 20 41 4c  Must be UNION AL
31090 4c 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 53 75  L */.    if( pSu
310a0 62 2d 3e 70 57 68 65 72 65 20 29 20 72 65 74 75  b->pWhere ) retu
310b0 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20  rn 0;           
310c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f             /* No
310d0 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f   WHERE clause */
310e0 0a 20 20 20 20 69 66 28 20 70 53 75 62 2d 3e 70  .    if( pSub->p
310f0 4c 69 6d 69 74 20 29 20 72 65 74 75 72 6e 20 30  Limit ) return 0
31100 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
31110 20 20 20 20 20 20 20 2f 2a 20 4e 6f 20 4c 49 4d         /* No LIM
31120 49 54 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20  IT clause */.   
31130 20 69 66 28 20 70 53 75 62 2d 3e 73 65 6c 46 6c   if( pSub->selFl
31140 61 67 73 20 26 20 53 46 5f 41 67 67 72 65 67 61  ags & SF_Aggrega
31150 74 65 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20  te ) return 0;  
31160 20 20 20 2f 2a 20 4e 6f 74 20 61 6e 20 61 67 67     /* Not an agg
31170 72 65 67 61 74 65 20 2a 2f 0a 20 20 20 20 70 53  regate */.    pS
31180 75 62 20 3d 20 70 53 75 62 2d 3e 70 50 72 69 6f  ub = pSub->pPrio
31190 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r;              
311a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
311b0 2f 2a 20 52 65 70 65 61 74 20 6f 76 65 72 20 63  /* Repeat over c
311c0 6f 6d 70 6f 75 6e 64 20 2a 2f 0a 20 20 7d 77 68  ompound */.  }wh
311d0 69 6c 65 28 20 70 53 75 62 20 29 3b 0a 0a 20 20  ile( pSub );..  
311e0 2f 2a 20 49 66 20 77 65 20 72 65 61 63 68 20 74  /* If we reach t
311f0 68 69 73 20 70 6f 69 6e 74 20 74 68 65 6e 20 69  his point then i
31200 74 20 69 73 20 4f 4b 20 74 6f 20 70 65 72 66 6f  t is OK to perfo
31210 72 6d 20 74 68 65 20 74 72 61 6e 73 66 6f 72 6d  rm the transform
31220 61 74 69 6f 6e 20 2a 2f 0a 0a 20 20 64 62 20 3d  ation */..  db =
31230 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 70   pParse->db;.  p
31240 43 6f 75 6e 74 20 3d 20 70 45 78 70 72 3b 0a 20  Count = pExpr;. 
31250 20 70 45 78 70 72 20 3d 20 30 3b 0a 20 20 70 53   pExpr = 0;.  pS
31260 75 62 20 3d 20 70 2d 3e 70 53 72 63 2d 3e 61 5b  ub = p->pSrc->a[
31270 30 5d 2e 70 53 65 6c 65 63 74 3b 0a 20 20 70 2d  0].pSelect;.  p-
31280 3e 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 53 65 6c  >pSrc->a[0].pSel
31290 65 63 74 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74  ect = 0;.  sqlit
312a0 65 33 53 72 63 4c 69 73 74 44 65 6c 65 74 65 28  e3SrcListDelete(
312b0 64 62 2c 20 70 2d 3e 70 53 72 63 29 3b 0a 20 20  db, p->pSrc);.  
312c0 70 2d 3e 70 53 72 63 20 3d 20 73 71 6c 69 74 65  p->pSrc = sqlite
312d0 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 70 50  3DbMallocZero(pP
312e0 61 72 73 65 2d 3e 64 62 2c 20 73 69 7a 65 6f 66  arse->db, sizeof
312f0 28 2a 70 2d 3e 70 53 72 63 29 29 3b 0a 20 20 77  (*p->pSrc));.  w
31300 68 69 6c 65 28 20 70 53 75 62 20 29 7b 0a 20 20  hile( pSub ){.  
31310 20 20 45 78 70 72 20 2a 70 54 65 72 6d 3b 0a 20    Expr *pTerm;. 
31320 20 20 20 70 50 72 69 6f 72 20 3d 20 70 53 75 62     pPrior = pSub
31330 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 70 53  ->pPrior;.    pS
31340 75 62 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a  ub->pPrior = 0;.
31350 20 20 20 20 70 53 75 62 2d 3e 70 4e 65 78 74 20      pSub->pNext 
31360 3d 20 30 3b 0a 20 20 20 20 70 53 75 62 2d 3e 73  = 0;.    pSub->s
31370 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f 41 67  elFlags |= SF_Ag
31380 67 72 65 67 61 74 65 3b 0a 20 20 20 20 70 53 75  gregate;.    pSu
31390 62 2d 3e 73 65 6c 46 6c 61 67 73 20 26 3d 20 7e  b->selFlags &= ~
313a0 53 46 5f 43 6f 6d 70 6f 75 6e 64 3b 0a 20 20 20  SF_Compound;.   
313b0 20 70 53 75 62 2d 3e 6e 53 65 6c 65 63 74 52 6f   pSub->nSelectRo
313c0 77 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74  w = 0;.    sqlit
313d0 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65  e3ExprListDelete
313e0 28 64 62 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73  (db, pSub->pELis
313f0 74 29 3b 0a 20 20 20 20 70 54 65 72 6d 20 3d 20  t);.    pTerm = 
31400 70 50 72 69 6f 72 20 3f 20 73 71 6c 69 74 65 33  pPrior ? sqlite3
31410 45 78 70 72 44 75 70 28 64 62 2c 20 70 43 6f 75  ExprDup(db, pCou
31420 6e 74 2c 20 30 29 20 3a 20 70 43 6f 75 6e 74 3b  nt, 0) : pCount;
31430 0a 20 20 20 20 70 53 75 62 2d 3e 70 45 4c 69 73  .    pSub->pELis
31440 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c  t = sqlite3ExprL
31450 69 73 74 41 70 70 65 6e 64 28 70 50 61 72 73 65  istAppend(pParse
31460 2c 20 30 2c 20 70 54 65 72 6d 29 3b 0a 20 20 20  , 0, pTerm);.   
31470 20 70 54 65 72 6d 20 3d 20 73 71 6c 69 74 65 33   pTerm = sqlite3
31480 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b  PExpr(pParse, TK
31490 5f 53 45 4c 45 43 54 2c 20 30 2c 20 30 29 3b 0a  _SELECT, 0, 0);.
314a0 20 20 20 20 73 71 6c 69 74 65 33 50 45 78 70 72      sqlite3PExpr
314b0 41 64 64 53 65 6c 65 63 74 28 70 50 61 72 73 65  AddSelect(pParse
314c0 2c 20 70 54 65 72 6d 2c 20 70 53 75 62 29 3b 0a  , pTerm, pSub);.
314d0 20 20 20 20 69 66 28 20 70 45 78 70 72 3d 3d 30      if( pExpr==0
314e0 20 29 7b 0a 20 20 20 20 20 20 70 45 78 70 72 20   ){.      pExpr 
314f0 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20 7d 65 6c  = pTerm;.    }el
31500 73 65 7b 0a 20 20 20 20 20 20 70 45 78 70 72 20  se{.      pExpr 
31510 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70  = sqlite3PExpr(p
31520 50 61 72 73 65 2c 20 54 4b 5f 50 4c 55 53 2c 20  Parse, TK_PLUS, 
31530 70 54 65 72 6d 2c 20 70 45 78 70 72 29 3b 0a 20  pTerm, pExpr);. 
31540 20 20 20 7d 0a 20 20 20 20 70 53 75 62 20 3d 20     }.    pSub = 
31550 70 50 72 69 6f 72 3b 0a 20 20 7d 0a 20 20 70 2d  pPrior;.  }.  p-
31560 3e 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45  >pEList->a[0].pE
31570 78 70 72 20 3d 20 70 45 78 70 72 3b 0a 20 20 70  xpr = pExpr;.  p
31580 2d 3e 73 65 6c 46 6c 61 67 73 20 26 3d 20 7e 53  ->selFlags &= ~S
31590 46 5f 41 67 67 72 65 67 61 74 65 3b 0a 0a 23 69  F_Aggregate;..#i
315a0 66 20 53 45 4c 45 43 54 54 52 41 43 45 5f 45 4e  f SELECTTRACE_EN
315b0 41 42 4c 45 44 0a 20 20 69 66 28 20 73 71 6c 69  ABLED.  if( sqli
315c0 74 65 33 53 65 6c 65 63 74 54 72 61 63 65 20 26  te3SelectTrace &
315d0 20 30 78 34 30 30 20 29 7b 0a 20 20 20 20 53 45   0x400 ){.    SE
315e0 4c 45 43 54 54 52 41 43 45 28 30 78 34 30 30 2c  LECTTRACE(0x400,
315f0 70 50 61 72 73 65 2c 70 2c 28 22 41 66 74 65 72  pParse,p,("After
31600 20 63 6f 75 6e 74 2d 6f 66 2d 76 69 65 77 20 6f   count-of-view o
31610 70 74 69 6d 69 7a 61 74 69 6f 6e 3a 5c 6e 22 29  ptimization:\n")
31620 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 54 72  );.    sqlite3Tr
31630 65 65 56 69 65 77 53 65 6c 65 63 74 28 30 2c 20  eeViewSelect(0, 
31640 70 2c 20 30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  p, 0);.  }.#endi
31650 66 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a  f.  return 1;.}.
31660 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
31670 5f 43 4f 55 4e 54 4f 46 56 49 45 57 5f 4f 50 54  _COUNTOFVIEW_OPT
31680 49 4d 49 5a 41 54 49 4f 4e 20 2a 2f 0a 0a 2f 2a  IMIZATION */../*
31690 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  .** Generate cod
316a0 65 20 66 6f 72 20 74 68 65 20 53 45 4c 45 43 54  e for the SELECT
316b0 20 73 74 61 74 65 6d 65 6e 74 20 67 69 76 65 6e   statement given
316c0 20 69 6e 20 74 68 65 20 70 20 61 72 67 75 6d 65   in the p argume
316d0 6e 74 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20  nt.  .**.** The 
316e0 72 65 73 75 6c 74 73 20 61 72 65 20 72 65 74 75  results are retu
316f0 72 6e 65 64 20 61 63 63 6f 72 64 69 6e 67 20 74  rned according t
31700 6f 20 74 68 65 20 53 65 6c 65 63 74 44 65 73 74  o the SelectDest
31710 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a 20 53   structure..** S
31720 65 65 20 63 6f 6d 6d 65 6e 74 73 20 69 6e 20 73  ee comments in s
31730 71 6c 69 74 65 49 6e 74 2e 68 20 66 6f 72 20 66  qliteInt.h for f
31740 75 72 74 68 65 72 20 69 6e 66 6f 72 6d 61 74 69  urther informati
31750 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  on..**.** This r
31760 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 74  outine returns t
31770 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 72 72  he number of err
31780 6f 72 73 2e 20 20 49 66 20 61 6e 79 20 65 72 72  ors.  If any err
31790 6f 72 73 20 61 72 65 0a 2a 2a 20 65 6e 63 6f 75  ors are.** encou
317a0 6e 74 65 72 65 64 2c 20 74 68 65 6e 20 61 6e 20  ntered, then an 
317b0 61 70 70 72 6f 70 72 69 61 74 65 20 65 72 72 6f  appropriate erro
317c0 72 20 6d 65 73 73 61 67 65 20 69 73 20 6c 65 66  r message is lef
317d0 74 20 69 6e 0a 2a 2a 20 70 50 61 72 73 65 2d 3e  t in.** pParse->
317e0 7a 45 72 72 4d 73 67 2e 0a 2a 2a 0a 2a 2a 20 54  zErrMsg..**.** T
317f0 68 69 73 20 72 6f 75 74 69 6e 65 20 64 6f 65 73  his routine does
31800 20 4e 4f 54 20 66 72 65 65 20 74 68 65 20 53 65   NOT free the Se
31810 6c 65 63 74 20 73 74 72 75 63 74 75 72 65 20 70  lect structure p
31820 61 73 73 65 64 20 69 6e 2e 20 20 54 68 65 0a 2a  assed in.  The.*
31830 2a 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69  * calling functi
31840 6f 6e 20 6e 65 65 64 73 20 74 6f 20 64 6f 20 74  on needs to do t
31850 68 61 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  hat..*/.int sqli
31860 74 65 33 53 65 6c 65 63 74 28 0a 20 20 50 61 72  te3Select(.  Par
31870 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
31880 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 65      /* The parse
31890 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53  r context */.  S
318a0 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20  elect *p,       
318b0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 53 45 4c        /* The SEL
318c0 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 62 65  ECT statement be
318d0 69 6e 67 20 63 6f 64 65 64 2e 20 2a 2f 0a 20 20  ing coded. */.  
318e0 53 65 6c 65 63 74 44 65 73 74 20 2a 70 44 65 73  SelectDest *pDes
318f0 74 20 20 20 20 20 20 2f 2a 20 57 68 61 74 20 74  t      /* What t
31900 6f 20 64 6f 20 77 69 74 68 20 74 68 65 20 71 75  o do with the qu
31910 65 72 79 20 72 65 73 75 6c 74 73 20 2a 2f 0a 29  ery results */.)
31920 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 20 20 20  {.  int i, j;   
31930 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
31940 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20  op counters */. 
31950 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e   WhereInfo *pWIn
31960 66 6f 3b 20 20 20 20 20 2f 2a 20 52 65 74 75 72  fo;     /* Retur
31970 6e 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 57 68  n from sqlite3Wh
31980 65 72 65 42 65 67 69 6e 28 29 20 2a 2f 0a 20 20  ereBegin() */.  
31990 56 64 62 65 20 2a 76 3b 20 20 20 20 20 20 20 20  Vdbe *v;        
319a0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 76 69         /* The vi
319b0 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 20 75 6e  rtual machine un
319c0 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e  der construction
319d0 20 2a 2f 0a 20 20 69 6e 74 20 69 73 41 67 67 3b   */.  int isAgg;
319e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
319f0 54 72 75 65 20 66 6f 72 20 73 65 6c 65 63 74 20  True for select 
31a00 6c 69 73 74 73 20 6c 69 6b 65 20 22 63 6f 75 6e  lists like "coun
31a10 74 28 2a 29 22 20 2a 2f 0a 20 20 45 78 70 72 4c  t(*)" */.  ExprL
31a20 69 73 74 20 2a 70 45 4c 69 73 74 20 3d 20 30 3b  ist *pEList = 0;
31a30 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 63 6f 6c    /* List of col
31a40 75 6d 6e 73 20 74 6f 20 65 78 74 72 61 63 74 2e  umns to extract.
31a50 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70   */.  SrcList *p
31a60 54 61 62 4c 69 73 74 3b 20 20 20 20 20 2f 2a 20  TabList;     /* 
31a70 4c 69 73 74 20 6f 66 20 74 61 62 6c 65 73 20 74  List of tables t
31a80 6f 20 73 65 6c 65 63 74 20 66 72 6f 6d 20 2a 2f  o select from */
31a90 0a 20 20 45 78 70 72 20 2a 70 57 68 65 72 65 3b  .  Expr *pWhere;
31aa0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
31ab0 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e 20 20   WHERE clause.  
31ac0 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20  May be NULL */. 
31ad0 20 45 78 70 72 4c 69 73 74 20 2a 70 47 72 6f 75   ExprList *pGrou
31ae0 70 42 79 3b 20 20 20 20 2f 2a 20 54 68 65 20 47  pBy;    /* The G
31af0 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 2e 20  ROUP BY clause. 
31b00 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a   May be NULL */.
31b10 20 20 45 78 70 72 20 2a 70 48 61 76 69 6e 67 3b    Expr *pHaving;
31b20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
31b30 48 41 56 49 4e 47 20 63 6c 61 75 73 65 2e 20 20  HAVING clause.  
31b40 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20  May be NULL */. 
31b50 20 69 6e 74 20 72 63 20 3d 20 31 3b 20 20 20 20   int rc = 1;    
31b60 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65          /* Value
31b70 20 74 6f 20 72 65 74 75 72 6e 20 66 72 6f 6d 20   to return from 
31b80 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 2a 2f  this function */
31b90 0a 20 20 44 69 73 74 69 6e 63 74 43 74 78 20 73  .  DistinctCtx s
31ba0 44 69 73 74 69 6e 63 74 3b 20 2f 2a 20 49 6e 66  Distinct; /* Inf
31bb0 6f 20 6f 6e 20 68 6f 77 20 74 6f 20 63 6f 64 65  o on how to code
31bc0 20 74 68 65 20 44 49 53 54 49 4e 43 54 20 6b 65   the DISTINCT ke
31bd0 79 77 6f 72 64 20 2a 2f 0a 20 20 53 6f 72 74 43  yword */.  SortC
31be0 74 78 20 73 53 6f 72 74 3b 20 20 20 20 20 20 20  tx sSort;       
31bf0 20 20 2f 2a 20 49 6e 66 6f 20 6f 6e 20 68 6f 77    /* Info on how
31c00 20 74 6f 20 63 6f 64 65 20 74 68 65 20 4f 52 44   to code the ORD
31c10 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a  ER BY clause */.
31c20 20 20 41 67 67 49 6e 66 6f 20 73 41 67 67 49 6e    AggInfo sAggIn
31c30 66 6f 3b 20 20 20 20 20 20 2f 2a 20 49 6e 66 6f  fo;      /* Info
31c40 72 6d 61 74 69 6f 6e 20 75 73 65 64 20 62 79 20  rmation used by 
31c50 61 67 67 72 65 67 61 74 65 20 71 75 65 72 69 65  aggregate querie
31c60 73 20 2a 2f 0a 20 20 69 6e 74 20 69 45 6e 64 3b  s */.  int iEnd;
31c70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
31c80 20 41 64 64 72 65 73 73 20 6f 66 20 74 68 65 20   Address of the 
31c90 65 6e 64 20 6f 66 20 74 68 65 20 71 75 65 72 79  end of the query
31ca0 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   */.  sqlite3 *d
31cb0 62 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  b;           /* 
31cc0 54 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e  The database con
31cd0 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 45 78 70  nection */.  Exp
31ce0 72 4c 69 73 74 20 2a 70 4d 69 6e 4d 61 78 4f 72  rList *pMinMaxOr
31cf0 64 65 72 42 79 20 3d 20 30 3b 20 20 2f 2a 20 41  derBy = 0;  /* A
31d00 64 64 65 64 20 4f 52 44 45 52 20 42 59 20 66 6f  dded ORDER BY fo
31d10 72 20 6d 69 6e 2f 6d 61 78 20 71 75 65 72 69 65  r min/max querie
31d20 73 20 2a 2f 0a 20 20 75 38 20 6d 69 6e 4d 61 78  s */.  u8 minMax
31d30 46 6c 61 67 3b 20 20 20 20 20 20 20 20 20 20 20  Flag;           
31d40 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 20 66 6f        /* Flag fo
31d50 72 20 6d 69 6e 2f 6d 61 78 20 71 75 65 72 69 65  r min/max querie
31d60 73 20 2a 2f 0a 0a 20 20 64 62 20 3d 20 70 50 61  s */..  db = pPa
31d70 72 73 65 2d 3e 64 62 3b 0a 20 20 76 20 3d 20 73  rse->db;.  v = s
31d80 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50  qlite3GetVdbe(pP
31d90 61 72 73 65 29 3b 0a 20 20 69 66 28 20 70 3d 3d  arse);.  if( p==
31da0 30 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  0 || db->mallocF
31db0 61 69 6c 65 64 20 7c 7c 20 70 50 61 72 73 65 2d  ailed || pParse-
31dc0 3e 6e 45 72 72 20 29 7b 0a 20 20 20 20 72 65 74  >nErr ){.    ret
31dd0 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28  urn 1;.  }.  if(
31de0 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63   sqlite3AuthChec
31df0 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45  k(pParse, SQLITE
31e00 5f 53 45 4c 45 43 54 2c 20 30 2c 20 30 2c 20 30  _SELECT, 0, 0, 0
31e10 29 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  ) ) return 1;.  
31e20 6d 65 6d 73 65 74 28 26 73 41 67 67 49 6e 66 6f  memset(&sAggInfo
31e30 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 41 67 67  , 0, sizeof(sAgg
31e40 49 6e 66 6f 29 29 3b 0a 23 69 66 20 53 45 4c 45  Info));.#if SELE
31e50 43 54 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a  CTTRACE_ENABLED.
31e60 20 20 53 45 4c 45 43 54 54 52 41 43 45 28 31 2c    SELECTTRACE(1,
31e70 70 50 61 72 73 65 2c 70 2c 20 28 22 62 65 67 69  pParse,p, ("begi
31e80 6e 20 70 72 6f 63 65 73 73 69 6e 67 3a 5c 6e 22  n processing:\n"
31e90 2c 20 70 50 61 72 73 65 2d 3e 61 64 64 72 45 78  , pParse->addrEx
31ea0 70 6c 61 69 6e 29 29 3b 0a 20 20 69 66 28 20 73  plain));.  if( s
31eb0 71 6c 69 74 65 33 53 65 6c 65 63 74 54 72 61 63  qlite3SelectTrac
31ec0 65 20 26 20 30 78 31 30 30 20 29 7b 0a 20 20 20  e & 0x100 ){.   
31ed0 20 73 71 6c 69 74 65 33 54 72 65 65 56 69 65 77   sqlite3TreeView
31ee0 53 65 6c 65 63 74 28 30 2c 20 70 2c 20 30 29 3b  Select(0, p, 0);
31ef0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 61  .  }.#endif..  a
31f00 73 73 65 72 74 28 20 70 2d 3e 70 4f 72 64 65 72  ssert( p->pOrder
31f10 42 79 3d 3d 30 20 7c 7c 20 70 44 65 73 74 2d 3e  By==0 || pDest->
31f20 65 44 65 73 74 21 3d 53 52 54 5f 44 69 73 74 46  eDest!=SRT_DistF
31f30 69 66 6f 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ifo );.  assert(
31f40 20 70 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20   p->pOrderBy==0 
31f50 7c 7c 20 70 44 65 73 74 2d 3e 65 44 65 73 74 21  || pDest->eDest!
31f60 3d 53 52 54 5f 46 69 66 6f 20 29 3b 0a 20 20 61  =SRT_Fifo );.  a
31f70 73 73 65 72 74 28 20 70 2d 3e 70 4f 72 64 65 72  ssert( p->pOrder
31f80 42 79 3d 3d 30 20 7c 7c 20 70 44 65 73 74 2d 3e  By==0 || pDest->
31f90 65 44 65 73 74 21 3d 53 52 54 5f 44 69 73 74 51  eDest!=SRT_DistQ
31fa0 75 65 75 65 20 29 3b 0a 20 20 61 73 73 65 72 74  ueue );.  assert
31fb0 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30  ( p->pOrderBy==0
31fc0 20 7c 7c 20 70 44 65 73 74 2d 3e 65 44 65 73 74   || pDest->eDest
31fd0 21 3d 53 52 54 5f 51 75 65 75 65 20 29 3b 0a 20  !=SRT_Queue );. 
31fe0 20 69 66 28 20 49 67 6e 6f 72 61 62 6c 65 4f 72   if( IgnorableOr
31ff0 64 65 72 62 79 28 70 44 65 73 74 29 20 29 7b 0a  derby(pDest) ){.
32000 20 20 20 20 61 73 73 65 72 74 28 70 44 65 73 74      assert(pDest
32010 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 45 78 69  ->eDest==SRT_Exi
32020 73 74 73 20 7c 7c 20 70 44 65 73 74 2d 3e 65 44  sts || pDest->eD
32030 65 73 74 3d 3d 53 52 54 5f 55 6e 69 6f 6e 20 7c  est==SRT_Union |
32040 7c 20 0a 20 20 20 20 20 20 20 20 20 20 20 70 44  | .           pD
32050 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f  est->eDest==SRT_
32060 45 78 63 65 70 74 20 7c 7c 20 70 44 65 73 74 2d  Except || pDest-
32070 3e 65 44 65 73 74 3d 3d 53 52 54 5f 44 69 73 63  >eDest==SRT_Disc
32080 61 72 64 20 7c 7c 0a 20 20 20 20 20 20 20 20 20  ard ||.         
32090 20 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d    pDest->eDest==
320a0 53 52 54 5f 51 75 65 75 65 20 20 7c 7c 20 70 44  SRT_Queue  || pD
320b0 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f  est->eDest==SRT_
320c0 44 69 73 74 46 69 66 6f 20 7c 7c 0a 20 20 20 20  DistFifo ||.    
320d0 20 20 20 20 20 20 20 70 44 65 73 74 2d 3e 65 44         pDest->eD
320e0 65 73 74 3d 3d 53 52 54 5f 44 69 73 74 51 75 65  est==SRT_DistQue
320f0 75 65 20 7c 7c 20 70 44 65 73 74 2d 3e 65 44 65  ue || pDest->eDe
32100 73 74 3d 3d 53 52 54 5f 46 69 66 6f 29 3b 0a 20  st==SRT_Fifo);. 
32110 20 20 20 2f 2a 20 49 66 20 4f 52 44 45 52 20 42     /* If ORDER B
32120 59 20 6d 61 6b 65 73 20 6e 6f 20 64 69 66 66 65  Y makes no diffe
32130 72 65 6e 63 65 20 69 6e 20 74 68 65 20 6f 75 74  rence in the out
32140 70 75 74 20 74 68 65 6e 20 6e 65 69 74 68 65 72  put then neither
32150 20 64 6f 65 73 0a 20 20 20 20 2a 2a 20 44 49 53   does.    ** DIS
32160 54 49 4e 43 54 20 73 6f 20 69 74 20 63 61 6e 20  TINCT so it can 
32170 62 65 20 72 65 6d 6f 76 65 64 20 74 6f 6f 2e 20  be removed too. 
32180 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  */.    sqlite3Ex
32190 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c  prListDelete(db,
321a0 20 70 2d 3e 70 4f 72 64 65 72 42 79 29 3b 0a 20   p->pOrderBy);. 
321b0 20 20 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d     p->pOrderBy =
321c0 20 30 3b 0a 20 20 20 20 70 2d 3e 73 65 6c 46 6c   0;.    p->selFl
321d0 61 67 73 20 26 3d 20 7e 53 46 5f 44 69 73 74 69  ags &= ~SF_Disti
321e0 6e 63 74 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  nct;.  }.  sqlit
321f0 65 33 53 65 6c 65 63 74 50 72 65 70 28 70 50 61  e3SelectPrep(pPa
32200 72 73 65 2c 20 70 2c 20 30 29 3b 0a 20 20 69 66  rse, p, 0);.  if
32210 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c  ( pParse->nErr |
32220 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  | db->mallocFail
32230 65 64 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 73  ed ){.    goto s
32240 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 20  elect_end;.  }. 
32250 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69   assert( p->pELi
32260 73 74 21 3d 30 20 29 3b 0a 23 69 66 20 53 45 4c  st!=0 );.#if SEL
32270 45 43 54 54 52 41 43 45 5f 45 4e 41 42 4c 45 44  ECTTRACE_ENABLED
32280 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 65  .  if( sqlite3Se
32290 6c 65 63 74 54 72 61 63 65 20 26 20 30 78 31 30  lectTrace & 0x10
322a0 34 20 29 7b 0a 20 20 20 20 53 45 4c 45 43 54 54  4 ){.    SELECTT
322b0 52 41 43 45 28 30 78 31 30 34 2c 70 50 61 72 73  RACE(0x104,pPars
322c0 65 2c 70 2c 20 28 22 61 66 74 65 72 20 6e 61 6d  e,p, ("after nam
322d0 65 20 72 65 73 6f 6c 75 74 69 6f 6e 3a 5c 6e 22  e resolution:\n"
322e0 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 54  ));.    sqlite3T
322f0 72 65 65 56 69 65 77 53 65 6c 65 63 74 28 30 2c  reeViewSelect(0,
32300 20 70 2c 20 30 29 3b 0a 20 20 7d 0a 23 65 6e 64   p, 0);.  }.#end
32310 69 66 0a 0a 20 20 69 66 28 20 70 44 65 73 74 2d  if..  if( pDest-
32320 3e 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70  >eDest==SRT_Outp
32330 75 74 20 29 7b 0a 20 20 20 20 67 65 6e 65 72 61  ut ){.    genera
32340 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50  teColumnNames(pP
32350 61 72 73 65 2c 20 70 29 3b 0a 20 20 7d 0a 0a 23  arse, p);.  }..#
32360 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
32370 49 54 5f 57 49 4e 44 4f 57 46 55 4e 43 0a 20 20  IT_WINDOWFUNC.  
32380 69 66 28 20 73 71 6c 69 74 65 33 57 69 6e 64 6f  if( sqlite3Windo
32390 77 52 65 77 72 69 74 65 28 70 50 61 72 73 65 2c  wRewrite(pParse,
323a0 20 70 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20   p) ){.    goto 
323b0 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a  select_end;.  }.
323c0 23 69 66 20 53 45 4c 45 43 54 54 52 41 43 45 5f  #if SELECTTRACE_
323d0 45 4e 41 42 4c 45 44 0a 20 20 69 66 28 20 73 71  ENABLED.  if( sq
323e0 6c 69 74 65 33 53 65 6c 65 63 74 54 72 61 63 65  lite3SelectTrace
323f0 20 26 20 30 78 31 30 38 20 29 7b 0a 20 20 20 20   & 0x108 ){.    
32400 53 45 4c 45 43 54 54 52 41 43 45 28 30 78 31 30  SELECTTRACE(0x10
32410 34 2c 70 50 61 72 73 65 2c 70 2c 20 28 22 61 66  4,pParse,p, ("af
32420 74 65 72 20 77 69 6e 64 6f 77 20 72 65 77 72 69  ter window rewri
32430 74 65 3a 5c 6e 22 29 29 3b 0a 20 20 20 20 73 71  te:\n"));.    sq
32440 6c 69 74 65 33 54 72 65 65 56 69 65 77 53 65 6c  lite3TreeViewSel
32450 65 63 74 28 30 2c 20 70 2c 20 30 29 3b 0a 20 20  ect(0, p, 0);.  
32460 7d 0a 23 65 6e 64 69 66 0a 23 65 6e 64 69 66 20  }.#endif.#endif 
32470 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57  /* SQLITE_OMIT_W
32480 49 4e 44 4f 57 46 55 4e 43 20 2a 2f 0a 20 20 70  INDOWFUNC */.  p
32490 54 61 62 4c 69 73 74 20 3d 20 70 2d 3e 70 53 72  TabList = p->pSr
324a0 63 3b 0a 20 20 69 73 41 67 67 20 3d 20 28 70 2d  c;.  isAgg = (p-
324b0 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 41  >selFlags & SF_A
324c0 67 67 72 65 67 61 74 65 29 21 3d 30 3b 0a 20 20  ggregate)!=0;.  
324d0 6d 65 6d 73 65 74 28 26 73 53 6f 72 74 2c 20 30  memset(&sSort, 0
324e0 2c 20 73 69 7a 65 6f 66 28 73 53 6f 72 74 29 29  , sizeof(sSort))
324f0 3b 0a 20 20 73 53 6f 72 74 2e 70 4f 72 64 65 72  ;.  sSort.pOrder
32500 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79  By = p->pOrderBy
32510 3b 0a 0a 20 20 2f 2a 20 54 72 79 20 74 6f 20 76  ;..  /* Try to v
32520 61 72 69 6f 75 73 20 6f 70 74 69 6d 69 7a 61 74  arious optimizat
32530 69 6f 6e 73 20 28 66 6c 61 74 74 65 6e 69 6e 67  ions (flattening
32540 20 73 75 62 71 75 65 72 69 65 73 2c 20 61 6e 64   subqueries, and
32550 20 73 74 72 65 6e 67 74 68 0a 20 20 2a 2a 20 72   strength.  ** r
32560 65 64 75 63 74 69 6f 6e 20 6f 66 20 6a 6f 69 6e  eduction of join
32570 20 6f 70 65 72 61 74 6f 72 73 29 20 69 6e 20 74   operators) in t
32580 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 75  he FROM clause u
32590 70 20 69 6e 74 6f 20 74 68 65 20 6d 61 69 6e 20  p into the main 
325a0 71 75 65 72 79 0a 20 20 2a 2f 0a 23 69 66 20 21  query.  */.#if !
325b0 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
325c0 4d 49 54 5f 53 55 42 51 55 45 52 59 29 20 7c 7c  MIT_SUBQUERY) ||
325d0 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
325e0 5f 4f 4d 49 54 5f 56 49 45 57 29 0a 20 20 66 6f  _OMIT_VIEW).  fo
325f0 72 28 69 3d 30 3b 20 21 70 2d 3e 70 50 72 69 6f  r(i=0; !p->pPrio
32600 72 20 26 26 20 69 3c 70 54 61 62 4c 69 73 74 2d  r && i<pTabList-
32610 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20  >nSrc; i++){.   
32620 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
32630 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70  item *pItem = &p
32640 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 3b 0a 20  TabList->a[i];. 
32650 20 20 20 53 65 6c 65 63 74 20 2a 70 53 75 62 20     Select *pSub 
32660 3d 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74  = pItem->pSelect
32670 3b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61  ;.    Table *pTa
32680 62 20 3d 20 70 49 74 65 6d 2d 3e 70 54 61 62 3b  b = pItem->pTab;
32690 0a 0a 20 20 20 20 2f 2a 20 43 6f 6e 76 65 72 74  ..    /* Convert
326a0 20 4c 45 46 54 20 4a 4f 49 4e 20 69 6e 74 6f 20   LEFT JOIN into 
326b0 4a 4f 49 4e 20 69 66 20 74 68 65 72 65 20 61 72  JOIN if there ar
326c0 65 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 72  e terms of the r
326d0 69 67 68 74 20 74 61 62 6c 65 0a 20 20 20 20 2a  ight table.    *
326e0 2a 20 6f 66 20 74 68 65 20 4c 45 46 54 20 4a 4f  * of the LEFT JO
326f0 49 4e 20 75 73 65 64 20 69 6e 20 74 68 65 20 57  IN used in the W
32700 48 45 52 45 20 63 6c 61 75 73 65 2e 0a 20 20 20  HERE clause..   
32710 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 70 49 74   */.    if( (pIt
32720 65 6d 2d 3e 66 67 2e 6a 6f 69 6e 74 79 70 65 20  em->fg.jointype 
32730 26 20 4a 54 5f 4c 45 46 54 29 21 3d 30 0a 20 20  & JT_LEFT)!=0.  
32740 20 20 20 26 26 20 73 71 6c 69 74 65 33 45 78 70     && sqlite3Exp
32750 72 49 6d 70 6c 69 65 73 4e 6f 6e 4e 75 6c 6c 52  rImpliesNonNullR
32760 6f 77 28 70 2d 3e 70 57 68 65 72 65 2c 20 70 49  ow(p->pWhere, pI
32770 74 65 6d 2d 3e 69 43 75 72 73 6f 72 29 0a 20 20  tem->iCursor).  
32780 20 20 20 26 26 20 4f 70 74 69 6d 69 7a 61 74 69     && Optimizati
32790 6f 6e 45 6e 61 62 6c 65 64 28 64 62 2c 20 53 51  onEnabled(db, SQ
327a0 4c 49 54 45 5f 53 69 6d 70 6c 69 66 79 4a 6f 69  LITE_SimplifyJoi
327b0 6e 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  n).    ){.      
327c0 53 45 4c 45 43 54 54 52 41 43 45 28 30 78 31 30  SELECTTRACE(0x10
327d0 30 2c 70 50 61 72 73 65 2c 70 2c 0a 20 20 20 20  0,pParse,p,.    
327e0 20 20 20 20 20 20 20 20 20 20 20 20 28 22 4c 45              ("LE
327f0 46 54 2d 4a 4f 49 4e 20 73 69 6d 70 6c 69 66 69  FT-JOIN simplifi
32800 65 73 20 74 6f 20 4a 4f 49 4e 20 6f 6e 20 74 65  es to JOIN on te
32810 72 6d 20 25 64 5c 6e 22 2c 69 29 29 3b 0a 20 20  rm %d\n",i));.  
32820 20 20 20 20 70 49 74 65 6d 2d 3e 66 67 2e 6a 6f      pItem->fg.jo
32830 69 6e 74 79 70 65 20 26 3d 20 7e 28 4a 54 5f 4c  intype &= ~(JT_L
32840 45 46 54 7c 4a 54 5f 4f 55 54 45 52 29 3b 0a 20  EFT|JT_OUTER);. 
32850 20 20 20 20 20 75 6e 73 65 74 4a 6f 69 6e 45 78       unsetJoinEx
32860 70 72 28 70 2d 3e 70 57 68 65 72 65 2c 20 70 49  pr(p->pWhere, pI
32870 74 65 6d 2d 3e 69 43 75 72 73 6f 72 29 3b 0a 20  tem->iCursor);. 
32880 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4e 6f 20     }..    /* No 
32890 66 75 74 68 65 72 20 61 63 74 69 6f 6e 20 69 66  futher action if
328a0 20 74 68 69 73 20 74 65 72 6d 20 6f 66 20 74 68   this term of th
328b0 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 69 73  e FROM clause is
328c0 20 6e 6f 20 61 20 73 75 62 71 75 65 72 79 20 2a   no a subquery *
328d0 2f 0a 20 20 20 20 69 66 28 20 70 53 75 62 3d 3d  /.    if( pSub==
328e0 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 0a 20  0 ) continue;.. 
328f0 20 20 20 2f 2a 20 43 61 74 63 68 20 6d 69 73 6d     /* Catch mism
32900 61 74 63 68 20 69 6e 20 74 68 65 20 64 65 63 6c  atch in the decl
32910 61 72 65 64 20 63 6f 6c 75 6d 6e 73 20 6f 66 20  ared columns of 
32920 61 20 76 69 65 77 20 61 6e 64 20 74 68 65 20 6e  a view and the n
32930 75 6d 62 65 72 20 6f 66 0a 20 20 20 20 2a 2a 20  umber of.    ** 
32940 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 53  columns in the S
32950 45 4c 45 43 54 20 6f 6e 20 74 68 65 20 52 48 53  ELECT on the RHS
32960 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 54 61 62   */.    if( pTab
32970 2d 3e 6e 43 6f 6c 21 3d 70 53 75 62 2d 3e 70 45  ->nCol!=pSub->pE
32980 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20  List->nExpr ){. 
32990 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
329a0 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 65 78  rMsg(pParse, "ex
329b0 70 65 63 74 65 64 20 25 64 20 63 6f 6c 75 6d 6e  pected %d column
329c0 73 20 66 6f 72 20 27 25 73 27 20 62 75 74 20 67  s for '%s' but g
329d0 6f 74 20 25 64 22 2c 0a 20 20 20 20 20 20 20 20  ot %d",.        
329e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 54                pT
329f0 61 62 2d 3e 6e 43 6f 6c 2c 20 70 54 61 62 2d 3e  ab->nCol, pTab->
32a00 7a 4e 61 6d 65 2c 20 70 53 75 62 2d 3e 70 45 4c  zName, pSub->pEL
32a10 69 73 74 2d 3e 6e 45 78 70 72 29 3b 0a 20 20 20  ist->nExpr);.   
32a20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65     goto select_e
32a30 6e 64 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  nd;.    }..    /
32a40 2a 20 44 6f 20 6e 6f 74 20 74 72 79 20 74 6f 20  * Do not try to 
32a50 66 6c 61 74 74 65 6e 20 61 6e 20 61 67 67 72 65  flatten an aggre
32a60 67 61 74 65 20 73 75 62 71 75 65 72 79 2e 0a 20  gate subquery.. 
32a70 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 46 6c 61     **.    ** Fla
32a80 74 74 65 6e 69 6e 67 20 61 6e 20 61 67 67 72 65  ttening an aggre
32a90 67 61 74 65 20 73 75 62 71 75 65 72 79 20 69 73  gate subquery is
32aa0 20 6f 6e 6c 79 20 70 6f 73 73 69 62 6c 65 20 69   only possible i
32ab0 66 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  f the outer quer
32ac0 79 0a 20 20 20 20 2a 2a 20 69 73 20 6e 6f 74 20  y.    ** is not 
32ad0 61 20 6a 6f 69 6e 2e 20 20 42 75 74 20 69 66 20  a join.  But if 
32ae0 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  the outer query 
32af0 69 73 20 6e 6f 74 20 61 20 6a 6f 69 6e 2c 20 74  is not a join, t
32b00 68 65 6e 20 74 68 65 20 73 75 62 71 75 65 72 79  hen the subquery
32b10 0a 20 20 20 20 2a 2a 20 77 69 6c 6c 20 62 65 20  .    ** will be 
32b20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 61 73 20 61  implemented as a
32b30 20 63 6f 2d 72 6f 75 74 69 6e 65 20 61 6e 64 20   co-routine and 
32b40 74 68 65 72 65 20 69 73 20 6e 6f 20 61 64 76 61  there is no adva
32b50 6e 74 61 67 65 20 74 6f 0a 20 20 20 20 2a 2a 20  ntage to.    ** 
32b60 66 6c 61 74 74 65 6e 69 6e 67 20 69 6e 20 74 68  flattening in th
32b70 61 74 20 63 61 73 65 2e 0a 20 20 20 20 2a 2f 0a  at case..    */.
32b80 20 20 20 20 69 66 28 20 28 70 53 75 62 2d 3e 73      if( (pSub->s
32b90 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 41 67 67  elFlags & SF_Agg
32ba0 72 65 67 61 74 65 29 21 3d 30 20 29 20 63 6f 6e  regate)!=0 ) con
32bb0 74 69 6e 75 65 3b 0a 20 20 20 20 61 73 73 65 72  tinue;.    asser
32bc0 74 28 20 70 53 75 62 2d 3e 70 47 72 6f 75 70 42  t( pSub->pGroupB
32bd0 79 3d 3d 30 20 29 3b 0a 0a 20 20 20 20 2f 2a 20  y==0 );..    /* 
32be0 49 66 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  If the outer que
32bf0 72 79 20 63 6f 6e 74 61 69 6e 73 20 61 20 22 63  ry contains a "c
32c00 6f 6d 70 6c 65 78 22 20 72 65 73 75 6c 74 20 73  omplex" result s
32c10 65 74 20 28 74 68 61 74 20 69 73 2c 0a 20 20 20  et (that is,.   
32c20 20 2a 2a 20 69 66 20 74 68 65 20 72 65 73 75 6c   ** if the resul
32c30 74 20 73 65 74 20 6f 66 20 74 68 65 20 6f 75 74  t set of the out
32c40 65 72 20 71 75 65 72 79 20 75 73 65 73 20 66 75  er query uses fu
32c50 6e 63 74 69 6f 6e 73 20 6f 72 20 73 75 62 71 75  nctions or subqu
32c60 65 72 69 65 73 29 0a 20 20 20 20 2a 2a 20 61 6e  eries).    ** an
32c70 64 20 69 66 20 74 68 65 20 73 75 62 71 75 65 72  d if the subquer
32c80 79 20 63 6f 6e 74 61 69 6e 73 20 61 6e 20 4f 52  y contains an OR
32c90 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 61 6e  DER BY clause an
32ca0 64 20 69 66 0a 20 20 20 20 2a 2a 20 69 74 20 77  d if.    ** it w
32cb0 69 6c 6c 20 62 65 20 69 6d 70 6c 65 6d 65 6e 74  ill be implement
32cc0 65 64 20 61 73 20 61 20 63 6f 2d 72 6f 75 74 69  ed as a co-routi
32cd0 6e 65 2c 20 74 68 65 6e 20 64 6f 20 6e 6f 74 20  ne, then do not 
32ce0 66 6c 61 74 74 65 6e 2e 20 20 54 68 69 73 0a 20  flatten.  This. 
32cf0 20 20 20 2a 2a 20 72 65 73 74 72 69 63 74 69 6f     ** restrictio
32d00 6e 20 61 6c 6c 6f 77 73 20 53 51 4c 20 63 6f 6e  n allows SQL con
32d10 73 74 72 75 63 74 73 20 6c 69 6b 65 20 74 68 69  structs like thi
32d20 73 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  s:.    **.    **
32d30 20 20 53 45 4c 45 43 54 20 65 78 70 65 6e 73 69    SELECT expensi
32d40 76 65 5f 66 75 6e 63 74 69 6f 6e 28 78 29 0a 20  ve_function(x). 
32d50 20 20 20 2a 2a 20 20 20 20 46 52 4f 4d 20 28 53     **    FROM (S
32d60 45 4c 45 43 54 20 78 20 46 52 4f 4d 20 74 61 62  ELECT x FROM tab
32d70 20 4f 52 44 45 52 20 42 59 20 79 20 4c 49 4d 49   ORDER BY y LIMI
32d80 54 20 31 30 29 3b 0a 20 20 20 20 2a 2a 0a 20 20  T 10);.    **.  
32d90 20 20 2a 2a 20 54 68 65 20 65 78 70 65 6e 73 69    ** The expensi
32da0 76 65 5f 66 75 6e 63 74 69 6f 6e 28 29 20 69 73  ve_function() is
32db0 20 6f 6e 6c 79 20 63 6f 6d 70 75 74 65 64 20 6f   only computed o
32dc0 6e 20 74 68 65 20 31 30 20 72 6f 77 73 20 74 68  n the 10 rows th
32dd0 61 74 0a 20 20 20 20 2a 2a 20 61 72 65 20 6f 75  at.    ** are ou
32de0 74 70 75 74 2c 20 72 61 74 68 65 72 20 74 68 61  tput, rather tha
32df0 6e 20 65 76 65 72 79 20 72 6f 77 20 6f 66 20 74  n every row of t
32e00 68 65 20 74 61 62 6c 65 2e 0a 20 20 20 20 2a 2a  he table..    **
32e10 0a 20 20 20 20 2a 2a 20 54 68 65 20 72 65 71 75  .    ** The requ
32e20 69 72 65 6d 65 6e 74 20 74 68 61 74 20 74 68 65  irement that the
32e30 20 6f 75 74 65 72 20 71 75 65 72 79 20 68 61 76   outer query hav
32e40 65 20 61 20 63 6f 6d 70 6c 65 78 20 72 65 73 75  e a complex resu
32e50 6c 74 20 73 65 74 0a 20 20 20 20 2a 2a 20 6d 65  lt set.    ** me
32e60 61 6e 73 20 74 68 61 74 20 66 6c 61 74 74 65 6e  ans that flatten
32e70 69 6e 67 20 64 6f 65 73 20 6f 63 63 75 72 20 6f  ing does occur o
32e80 6e 20 73 69 6d 70 6c 65 72 20 53 51 4c 20 63 6f  n simpler SQL co
32e90 6e 73 74 72 61 69 6e 74 73 20 77 69 74 68 6f 75  nstraints withou
32ea0 74 0a 20 20 20 20 2a 2a 20 74 68 65 20 65 78 70  t.    ** the exp
32eb0 65 6e 73 69 76 65 5f 66 75 6e 63 74 69 6f 6e 28  ensive_function(
32ec0 29 20 6c 69 6b 65 3a 0a 20 20 20 20 2a 2a 0a 20  ) like:.    **. 
32ed0 20 20 20 2a 2a 20 20 53 45 4c 45 43 54 20 78 20     **  SELECT x 
32ee0 46 52 4f 4d 20 28 53 45 4c 45 43 54 20 78 20 46  FROM (SELECT x F
32ef0 52 4f 4d 20 74 61 62 20 4f 52 44 45 52 20 42 59  ROM tab ORDER BY
32f00 20 79 20 4c 49 4d 49 54 20 31 30 29 3b 0a 20 20   y LIMIT 10);.  
32f10 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 53 75    */.    if( pSu
32f20 62 2d 3e 70 4f 72 64 65 72 42 79 21 3d 30 0a 20  b->pOrderBy!=0. 
32f30 20 20 20 20 26 26 20 69 3d 3d 30 0a 20 20 20 20      && i==0.    
32f40 20 26 26 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73   && (p->selFlags
32f50 20 26 20 53 46 5f 43 6f 6d 70 6c 65 78 52 65 73   & SF_ComplexRes
32f60 75 6c 74 29 21 3d 30 0a 20 20 20 20 20 26 26 20  ult)!=0.     && 
32f70 28 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3d  (pTabList->nSrc=
32f80 3d 31 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 28  =1.         || (
32f90 70 54 61 62 4c 69 73 74 2d 3e 61 5b 31 5d 2e 66  pTabList->a[1].f
32fa0 67 2e 6a 6f 69 6e 74 79 70 65 26 28 4a 54 5f 4c  g.jointype&(JT_L
32fb0 45 46 54 7c 4a 54 5f 43 52 4f 53 53 29 29 21 3d  EFT|JT_CROSS))!=
32fc0 30 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  0).    ){.      
32fd0 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a  continue;.    }.
32fe0 0a 20 20 20 20 69 66 28 20 66 6c 61 74 74 65 6e  .    if( flatten
32ff0 53 75 62 71 75 65 72 79 28 70 50 61 72 73 65 2c  Subquery(pParse,
33000 20 70 2c 20 69 2c 20 69 73 41 67 67 29 20 29 7b   p, i, isAgg) ){
33010 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 72 73  .      if( pPars
33020 65 2d 3e 6e 45 72 72 20 29 20 67 6f 74 6f 20 73  e->nErr ) goto s
33030 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20  elect_end;.     
33040 20 2f 2a 20 54 68 69 73 20 73 75 62 71 75 65 72   /* This subquer
33050 79 20 63 61 6e 20 62 65 20 61 62 73 6f 72 62 65  y can be absorbe
33060 64 20 69 6e 74 6f 20 69 74 73 20 70 61 72 65 6e  d into its paren
33070 74 2e 20 2a 2f 0a 20 20 20 20 20 20 69 20 3d 20  t. */.      i = 
33080 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 54  -1;.    }.    pT
33090 61 62 4c 69 73 74 20 3d 20 70 2d 3e 70 53 72 63  abList = p->pSrc
330a0 3b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61  ;.    if( db->ma
330b0 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 67 6f 74  llocFailed ) got
330c0 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  o select_end;.  
330d0 20 20 69 66 28 20 21 49 67 6e 6f 72 61 62 6c 65    if( !Ignorable
330e0 4f 72 64 65 72 62 79 28 70 44 65 73 74 29 20 29  Orderby(pDest) )
330f0 7b 0a 20 20 20 20 20 20 73 53 6f 72 74 2e 70 4f  {.      sSort.pO
33100 72 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64  rderBy = p->pOrd
33110 65 72 42 79 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  erBy;.    }.  }.
33120 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20  #endif..#ifndef 
33130 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50  SQLITE_OMIT_COMP
33140 4f 55 4e 44 5f 53 45 4c 45 43 54 0a 20 20 2f 2a  OUND_SELECT.  /*
33150 20 48 61 6e 64 6c 65 20 63 6f 6d 70 6f 75 6e 64   Handle compound
33160 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
33170 74 73 20 75 73 69 6e 67 20 74 68 65 20 73 65 70  ts using the sep
33180 61 72 61 74 65 20 6d 75 6c 74 69 53 65 6c 65 63  arate multiSelec
33190 74 28 29 0a 20 20 2a 2a 20 70 72 6f 63 65 64 75  t().  ** procedu
331a0 72 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  re..  */.  if( p
331b0 2d 3e 70 50 72 69 6f 72 20 29 7b 0a 20 20 20 20  ->pPrior ){.    
331c0 72 63 20 3d 20 6d 75 6c 74 69 53 65 6c 65 63 74  rc = multiSelect
331d0 28 70 50 61 72 73 65 2c 20 70 2c 20 70 44 65 73  (pParse, p, pDes
331e0 74 29 3b 0a 23 69 66 20 53 45 4c 45 43 54 54 52  t);.#if SELECTTR
331f0 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20 20 20  ACE_ENABLED.    
33200 53 45 4c 45 43 54 54 52 41 43 45 28 30 78 31 2c  SELECTTRACE(0x1,
33210 70 50 61 72 73 65 2c 70 2c 28 22 65 6e 64 20 63  pParse,p,("end c
33220 6f 6d 70 6f 75 6e 64 2d 73 65 6c 65 63 74 20 70  ompound-select p
33230 72 6f 63 65 73 73 69 6e 67 5c 6e 22 29 29 3b 0a  rocessing\n"));.
33240 20 20 20 20 69 66 28 20 28 73 71 6c 69 74 65 33      if( (sqlite3
33250 53 65 6c 65 63 74 54 72 61 63 65 20 26 20 30 78  SelectTrace & 0x
33260 32 30 30 30 29 21 3d 30 20 26 26 20 45 78 70 6c  2000)!=0 && Expl
33270 61 69 6e 51 75 65 72 79 50 6c 61 6e 50 61 72 65  ainQueryPlanPare
33280 6e 74 28 70 50 61 72 73 65 29 3d 3d 30 20 29 7b  nt(pParse)==0 ){
33290 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 54 72  .      sqlite3Tr
332a0 65 65 56 69 65 77 53 65 6c 65 63 74 28 30 2c 20  eeViewSelect(0, 
332b0 70 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 23 65 6e  p, 0);.    }.#en
332c0 64 69 66 0a 20 20 20 20 69 66 28 20 70 2d 3e 70  dif.    if( p->p
332d0 4e 65 78 74 3d 3d 30 20 29 20 45 78 70 6c 61 69  Next==0 ) Explai
332e0 6e 51 75 65 72 79 50 6c 61 6e 50 6f 70 28 70 50  nQueryPlanPop(pP
332f0 61 72 73 65 29 3b 0a 20 20 20 20 72 65 74 75 72  arse);.    retur
33300 6e 20 72 63 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  n rc;.  }.#endif
33310 0a 0a 20 20 2f 2a 20 44 6f 20 74 68 65 20 57 48  ..  /* Do the WH
33320 45 52 45 2d 63 6c 61 75 73 65 20 63 6f 6e 73 74  ERE-clause const
33330 61 6e 74 20 70 72 6f 70 61 67 61 74 69 6f 6e 20  ant propagation 
33340 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69 66 20  optimization if 
33350 74 68 69 73 20 69 73 0a 20 20 2a 2a 20 61 20 6a  this is.  ** a j
33360 6f 69 6e 2e 20 20 4e 6f 20 6e 65 65 64 20 74 6f  oin.  No need to
33370 20 73 70 65 65 64 20 74 69 6d 65 20 6f 6e 20 74   speed time on t
33380 68 69 73 20 6f 70 65 72 61 74 69 6f 6e 20 66 6f  his operation fo
33390 72 20 6e 6f 6e 2d 6a 6f 69 6e 20 71 75 65 72 69  r non-join queri
333a0 65 73 0a 20 20 2a 2a 20 61 73 20 74 68 65 20 65  es.  ** as the e
333b0 71 75 69 76 61 6c 65 6e 74 20 6f 70 74 69 6d 69  quivalent optimi
333c0 7a 61 74 69 6f 6e 20 77 69 6c 6c 20 62 65 20 68  zation will be h
333d0 61 6e 64 6c 65 64 20 62 79 20 71 75 65 72 79 20  andled by query 
333e0 70 6c 61 6e 6e 65 72 20 69 6e 0a 20 20 2a 2a 20  planner in.  ** 
333f0 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69  sqlite3WhereBegi
33400 6e 28 29 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  n()..  */.  if( 
33410 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3e 31  pTabList->nSrc>1
33420 0a 20 20 20 26 26 20 4f 70 74 69 6d 69 7a 61 74  .   && Optimizat
33430 69 6f 6e 45 6e 61 62 6c 65 64 28 64 62 2c 20 53  ionEnabled(db, S
33440 51 4c 49 54 45 5f 50 72 6f 70 61 67 61 74 65 43  QLITE_PropagateC
33450 6f 6e 73 74 29 0a 20 20 20 26 26 20 70 72 6f 70  onst).   && prop
33460 61 67 61 74 65 43 6f 6e 73 74 61 6e 74 73 28 70  agateConstants(p
33470 50 61 72 73 65 2c 20 70 29 0a 20 20 29 7b 0a 23  Parse, p).  ){.#
33480 69 66 20 53 45 4c 45 43 54 54 52 41 43 45 5f 45  if SELECTTRACE_E
33490 4e 41 42 4c 45 44 0a 20 20 20 20 69 66 28 20 73  NABLED.    if( s
334a0 71 6c 69 74 65 33 53 65 6c 65 63 74 54 72 61 63  qlite3SelectTrac
334b0 65 20 26 20 30 78 31 30 30 20 29 7b 0a 20 20 20  e & 0x100 ){.   
334c0 20 20 20 53 45 4c 45 43 54 54 52 41 43 45 28 30     SELECTTRACE(0
334d0 78 31 30 30 2c 70 50 61 72 73 65 2c 70 2c 28 22  x100,pParse,p,("
334e0 41 66 74 65 72 20 63 6f 6e 73 74 61 6e 74 20 70  After constant p
334f0 72 6f 70 61 67 61 74 69 6f 6e 3a 5c 6e 22 29 29  ropagation:\n"))
33500 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 54  ;.      sqlite3T
33510 72 65 65 56 69 65 77 53 65 6c 65 63 74 28 30 2c  reeViewSelect(0,
33520 20 70 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 23 65   p, 0);.    }.#e
33530 6e 64 69 66 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ndif.  }else{.  
33540 20 20 53 45 4c 45 43 54 54 52 41 43 45 28 30 78    SELECTTRACE(0x
33550 31 30 30 2c 70 50 61 72 73 65 2c 70 2c 28 22 43  100,pParse,p,("C
33560 6f 6e 73 74 61 6e 74 20 70 72 6f 70 61 67 61 74  onstant propagat
33570 69 6f 6e 20 6e 6f 74 20 68 65 6c 70 66 75 6c 5c  ion not helpful\
33580 6e 22 29 29 3b 0a 20 20 7d 0a 0a 23 69 66 64 65  n"));.  }..#ifde
33590 66 20 53 51 4c 49 54 45 5f 43 4f 55 4e 54 4f 46  f SQLITE_COUNTOF
335a0 56 49 45 57 5f 4f 50 54 49 4d 49 5a 41 54 49 4f  VIEW_OPTIMIZATIO
335b0 4e 0a 20 20 69 66 28 20 4f 70 74 69 6d 69 7a 61  N.  if( Optimiza
335c0 74 69 6f 6e 45 6e 61 62 6c 65 64 28 64 62 2c 20  tionEnabled(db, 
335d0 53 51 4c 49 54 45 5f 51 75 65 72 79 46 6c 61 74  SQLITE_QueryFlat
335e0 74 65 6e 65 72 7c 53 51 4c 49 54 45 5f 43 6f 75  tener|SQLITE_Cou
335f0 6e 74 4f 66 56 69 65 77 29 0a 20 20 20 26 26 20  ntOfView).   && 
33600 63 6f 75 6e 74 4f 66 56 69 65 77 4f 70 74 69 6d  countOfViewOptim
33610 69 7a 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20  ization(pParse, 
33620 70 29 0a 20 20 29 7b 0a 20 20 20 20 69 66 28 20  p).  ){.    if( 
33630 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
33640 20 29 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65   ) goto select_e
33650 6e 64 3b 0a 20 20 20 20 70 45 4c 69 73 74 20 3d  nd;.    pEList =
33660 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 20 20   p->pEList;.    
33670 70 54 61 62 4c 69 73 74 20 3d 20 70 2d 3e 70 53  pTabList = p->pS
33680 72 63 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  rc;.  }.#endif..
33690 20 20 2f 2a 20 46 6f 72 20 65 61 63 68 20 74 65    /* For each te
336a0 72 6d 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63  rm in the FROM c
336b0 6c 61 75 73 65 2c 20 64 6f 20 74 77 6f 20 74 68  lause, do two th
336c0 69 6e 67 73 3a 0a 20 20 2a 2a 20 28 31 29 20 41  ings:.  ** (1) A
336d0 75 74 68 6f 72 69 7a 65 64 20 75 6e 72 65 66 65  uthorized unrefe
336e0 72 65 6e 63 65 64 20 74 61 62 6c 65 73 0a 20 20  renced tables.  
336f0 2a 2a 20 28 32 29 20 47 65 6e 65 72 61 74 65 20  ** (2) Generate 
33700 63 6f 64 65 20 66 6f 72 20 61 6c 6c 20 73 75 62  code for all sub
33710 2d 71 75 65 72 69 65 73 0a 20 20 2a 2f 0a 20 20  -queries.  */.  
33720 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54 61 62 4c  for(i=0; i<pTabL
33730 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b  ist->nSrc; i++){
33740 0a 20 20 20 20 73 74 72 75 63 74 20 53 72 63 4c  .    struct SrcL
33750 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20  ist_item *pItem 
33760 3d 20 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69  = &pTabList->a[i
33770 5d 3b 0a 20 20 20 20 53 65 6c 65 63 74 44 65 73  ];.    SelectDes
33780 74 20 64 65 73 74 3b 0a 20 20 20 20 53 65 6c 65  t dest;.    Sele
33790 63 74 20 2a 70 53 75 62 3b 0a 23 69 66 20 21 64  ct *pSub;.#if !d
337a0 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
337b0 49 54 5f 53 55 42 51 55 45 52 59 29 20 7c 7c 20  IT_SUBQUERY) || 
337c0 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
337d0 4f 4d 49 54 5f 56 49 45 57 29 0a 20 20 20 20 63  OMIT_VIEW).    c
337e0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 61 76 65  onst char *zSave
337f0 64 41 75 74 68 43 6f 6e 74 65 78 74 3b 0a 23 65  dAuthContext;.#e
33800 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 49 73 73  ndif..    /* Iss
33810 75 65 20 53 51 4c 49 54 45 5f 52 45 41 44 20 61  ue SQLITE_READ a
33820 75 74 68 6f 72 69 7a 61 74 69 6f 6e 73 20 77 69  uthorizations wi
33830 74 68 20 61 20 66 61 6b 65 20 63 6f 6c 75 6d 6e  th a fake column
33840 20 6e 61 6d 65 20 66 6f 72 20 61 6e 79 0a 20 20   name for any.  
33850 20 20 2a 2a 20 74 61 62 6c 65 73 20 74 68 61 74    ** tables that
33860 20 61 72 65 20 72 65 66 65 72 65 6e 63 65 64 20   are referenced 
33870 62 75 74 20 66 72 6f 6d 20 77 68 69 63 68 20 6e  but from which n
33880 6f 20 76 61 6c 75 65 73 20 61 72 65 20 65 78 74  o values are ext
33890 72 61 63 74 65 64 2e 0a 20 20 20 20 2a 2a 20 45  racted..    ** E
338a0 78 61 6d 70 6c 65 73 20 6f 66 20 77 68 65 72 65  xamples of where
338b0 20 74 68 65 73 65 20 6b 69 6e 64 73 20 6f 66 20   these kinds of 
338c0 6e 75 6c 6c 20 53 51 4c 49 54 45 5f 52 45 41 44  null SQLITE_READ
338d0 20 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e 73 0a   authorizations.
338e0 20 20 20 20 2a 2a 20 77 6f 75 6c 64 20 6f 63 63      ** would occ
338f0 75 72 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  ur:.    **.    *
33900 2a 20 20 20 20 20 53 45 4c 45 43 54 20 63 6f 75  *     SELECT cou
33910 6e 74 28 2a 29 20 46 52 4f 4d 20 74 31 3b 20 20  nt(*) FROM t1;  
33920 20 2d 2d 20 53 51 4c 49 54 45 5f 52 45 41 44 20   -- SQLITE_READ 
33930 74 31 2e 22 22 0a 20 20 20 20 2a 2a 20 20 20 20  t1."".    **    
33940 20 53 45 4c 45 43 54 20 74 31 2e 2a 20 46 52 4f   SELECT t1.* FRO
33950 4d 20 74 31 2c 20 74 32 3b 20 20 20 2d 2d 20 53  M t1, t2;   -- S
33960 51 4c 49 54 45 5f 52 45 41 44 20 74 32 2e 22 22  QLITE_READ t2.""
33970 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54  .    **.    ** T
33980 68 65 20 66 61 6b 65 20 63 6f 6c 75 6d 6e 20 6e  he fake column n
33990 61 6d 65 20 69 73 20 61 6e 20 65 6d 70 74 79 20  ame is an empty 
339a0 73 74 72 69 6e 67 2e 20 20 49 74 20 69 73 20 70  string.  It is p
339b0 6f 73 73 69 62 6c 65 20 66 6f 72 20 61 20 74 61  ossible for a ta
339c0 62 6c 65 20 74 6f 0a 20 20 20 20 2a 2a 20 68 61  ble to.    ** ha
339d0 76 65 20 61 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65  ve a column name
339e0 64 20 62 79 20 74 68 65 20 65 6d 70 74 79 20 73  d by the empty s
339f0 74 72 69 6e 67 2c 20 69 6e 20 77 68 69 63 68 20  tring, in which 
33a00 63 61 73 65 20 74 68 65 72 65 20 69 73 20 6e 6f  case there is no
33a10 20 77 61 79 20 74 6f 0a 20 20 20 20 2a 2a 20 64   way to.    ** d
33a20 69 73 74 69 6e 67 75 69 73 68 20 62 65 74 77 65  istinguish betwe
33a30 65 6e 20 61 6e 20 75 6e 72 65 66 65 72 65 6e 63  en an unreferenc
33a40 65 64 20 74 61 62 6c 65 20 61 6e 64 20 61 6e 20  ed table and an 
33a50 61 63 74 75 61 6c 20 72 65 66 65 72 65 6e 63 65  actual reference
33a60 20 74 6f 20 74 68 65 0a 20 20 20 20 2a 2a 20 22   to the.    ** "
33a70 22 20 63 6f 6c 75 6d 6e 2e 20 54 68 65 20 6f 72  " column. The or
33a80 69 67 69 6e 61 6c 20 64 65 73 69 67 6e 20 77 61  iginal design wa
33a90 73 20 66 6f 72 20 74 68 65 20 66 61 6b 65 20 63  s for the fake c
33aa0 6f 6c 75 6d 6e 20 6e 61 6d 65 20 74 6f 20 62 65  olumn name to be
33ab0 20 61 20 4e 55 4c 4c 2c 0a 20 20 20 20 2a 2a 20   a NULL,.    ** 
33ac0 77 68 69 63 68 20 77 6f 75 6c 64 20 62 65 20 75  which would be u
33ad0 6e 61 6d 62 69 67 75 6f 75 73 2e 20 20 42 75 74  nambiguous.  But
33ae0 20 6c 65 67 61 63 79 20 61 75 74 68 6f 72 69 7a   legacy authoriz
33af0 61 74 69 6f 6e 20 63 61 6c 6c 62 61 63 6b 73 20  ation callbacks 
33b00 6d 69 67 68 74 0a 20 20 20 20 2a 2a 20 61 73 73  might.    ** ass
33b10 75 6d 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e  ume the column n
33b20 61 6d 65 20 69 73 20 6e 6f 6e 2d 4e 55 4c 4c 20  ame is non-NULL 
33b30 61 6e 64 20 73 65 67 66 61 75 6c 74 2e 20 20 54  and segfault.  T
33b40 68 65 20 75 73 65 20 6f 66 20 61 6e 20 65 6d 70  he use of an emp
33b50 74 79 0a 20 20 20 20 2a 2a 20 73 74 72 69 6e 67  ty.    ** string
33b60 20 66 6f 72 20 74 68 65 20 66 61 6b 65 20 63 6f   for the fake co
33b70 6c 75 6d 6e 20 6e 61 6d 65 20 73 65 65 6d 73 20  lumn name seems 
33b80 73 61 66 65 72 2e 0a 20 20 20 20 2a 2f 0a 20 20  safer..    */.  
33b90 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 63 6f 6c    if( pItem->col
33ba0 55 73 65 64 3d 3d 30 20 26 26 20 70 49 74 65 6d  Used==0 && pItem
33bb0 2d 3e 7a 4e 61 6d 65 21 3d 30 20 29 7b 0a 20 20  ->zName!=0 ){.  
33bc0 20 20 20 20 73 71 6c 69 74 65 33 41 75 74 68 43      sqlite3AuthC
33bd0 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c  heck(pParse, SQL
33be0 49 54 45 5f 52 45 41 44 2c 20 70 49 74 65 6d 2d  ITE_READ, pItem-
33bf0 3e 7a 4e 61 6d 65 2c 20 22 22 2c 20 70 49 74 65  >zName, "", pIte
33c00 6d 2d 3e 7a 44 61 74 61 62 61 73 65 29 3b 0a 20  m->zDatabase);. 
33c10 20 20 20 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e     }..#if !defin
33c20 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ed(SQLITE_OMIT_S
33c30 55 42 51 55 45 52 59 29 20 7c 7c 20 21 64 65 66  UBQUERY) || !def
33c40 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
33c50 5f 56 49 45 57 29 0a 20 20 20 20 2f 2a 20 47 65  _VIEW).    /* Ge
33c60 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20  nerate code for 
33c70 61 6c 6c 20 73 75 62 2d 71 75 65 72 69 65 73 20  all sub-queries 
33c80 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  in the FROM clau
33c90 73 65 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 53  se.    */.    pS
33ca0 75 62 20 3d 20 70 49 74 65 6d 2d 3e 70 53 65 6c  ub = pItem->pSel
33cb0 65 63 74 3b 0a 20 20 20 20 69 66 28 20 70 53 75  ect;.    if( pSu
33cc0 62 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b  b==0 ) continue;
33cd0 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 64  ..    /* The cod
33ce0 65 20 66 6f 72 20 61 20 73 75 62 71 75 65 72 79  e for a subquery
33cf0 20 73 68 6f 75 6c 64 20 6f 6e 6c 79 20 62 65 20   should only be 
33d00 67 65 6e 65 72 61 74 65 64 20 6f 6e 63 65 2c 20  generated once, 
33d10 74 68 6f 75 67 68 20 69 74 20 69 73 0a 20 20 20  though it is.   
33d20 20 2a 2a 20 74 65 63 68 6e 69 63 61 6c 6c 79 20   ** technically 
33d30 68 61 72 6d 6c 65 73 73 20 66 6f 72 20 69 74 20  harmless for it 
33d40 74 6f 20 62 65 20 67 65 6e 65 72 61 74 65 64 20  to be generated 
33d50 6d 75 6c 74 69 70 6c 65 20 74 69 6d 65 73 2e 20  multiple times. 
33d60 54 68 65 0a 20 20 20 20 2a 2a 20 66 6f 6c 6c 6f  The.    ** follo
33d70 77 69 6e 67 20 61 73 73 65 72 74 28 29 20 77 69  wing assert() wi
33d80 6c 6c 20 64 65 74 65 63 74 20 69 66 20 73 6f 6d  ll detect if som
33d90 65 74 68 69 6e 67 20 63 68 61 6e 67 65 73 20 74  ething changes t
33da0 6f 20 63 61 75 73 65 0a 20 20 20 20 2a 2a 20 74  o cause.    ** t
33db0 68 65 20 73 61 6d 65 20 73 75 62 71 75 65 72 79  he same subquery
33dc0 20 74 6f 20 62 65 20 63 6f 64 65 64 20 6d 75 6c   to be coded mul
33dd0 74 69 70 6c 65 20 74 69 6d 65 73 2c 20 61 73 20  tiple times, as 
33de0 61 20 73 69 67 6e 61 6c 20 74 6f 20 74 68 65 0a  a signal to the.
33df0 20 20 20 20 2a 2a 20 64 65 76 65 6c 6f 70 65 72      ** developer
33e00 73 20 74 6f 20 74 72 79 20 74 6f 20 6f 70 74 69  s to try to opti
33e10 6d 69 7a 65 20 74 68 65 20 73 69 74 75 61 74 69  mize the situati
33e20 6f 6e 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  on..    **.    *
33e30 2a 20 55 70 64 61 74 65 20 32 30 31 39 2d 30 37  * Update 2019-07
33e40 2d 32 34 3a 0a 20 20 20 20 2a 2a 20 53 65 65 20  -24:.    ** See 
33e50 74 69 63 6b 65 74 20 68 74 74 70 73 3a 2f 2f 73  ticket https://s
33e60 71 6c 69 74 65 2e 6f 72 67 2f 73 72 63 2f 74 6b  qlite.org/src/tk
33e70 74 76 69 65 77 2f 63 35 32 62 30 39 63 37 66 33  tview/c52b09c7f3
33e80 38 39 30 33 62 31 33 31 31 63 65 63 34 30 2e 0a  8903b1311cec40..
33e90 20 20 20 20 2a 2a 20 54 68 65 20 64 62 73 71 6c      ** The dbsql
33ea0 66 75 7a 7a 20 66 75 7a 7a 65 72 20 66 6f 75 6e  fuzz fuzzer foun
33eb0 64 20 61 20 63 61 73 65 20 77 68 65 72 65 20 74  d a case where t
33ec0 68 65 20 73 61 6d 65 20 73 75 62 71 75 65 72 79  he same subquery
33ed0 20 67 65 74 73 0a 20 20 20 20 2a 2a 20 63 6f 64   gets.    ** cod
33ee0 65 64 20 74 77 69 63 65 2e 20 20 53 6f 20 74 68  ed twice.  So th
33ef0 69 73 20 61 73 73 65 72 74 28 29 20 6e 6f 77 20  is assert() now 
33f00 62 65 63 6f 6d 65 73 20 61 20 74 65 73 74 63 61  becomes a testca
33f10 73 65 28 29 2e 20 20 49 74 20 73 68 6f 75 6c 64  se().  It should
33f20 0a 20 20 20 20 2a 2a 20 62 65 20 76 65 72 79 20  .    ** be very 
33f30 72 61 72 65 2c 20 74 68 6f 75 67 68 2e 0a 20 20  rare, though..  
33f40 20 20 2a 2f 0a 20 20 20 20 74 65 73 74 63 61 73    */.    testcas
33f50 65 28 20 70 49 74 65 6d 2d 3e 61 64 64 72 46 69  e( pItem->addrFi
33f60 6c 6c 53 75 62 21 3d 30 20 29 3b 0a 0a 20 20 20  llSub!=0 );..   
33f70 20 2f 2a 20 49 6e 63 72 65 6d 65 6e 74 20 50 61   /* Increment Pa
33f80 72 73 65 2e 6e 48 65 69 67 68 74 20 62 79 20 74  rse.nHeight by t
33f90 68 65 20 68 65 69 67 68 74 20 6f 66 20 74 68 65  he height of the
33fa0 20 6c 61 72 67 65 73 74 20 65 78 70 72 65 73 73   largest express
33fb0 69 6f 6e 0a 20 20 20 20 2a 2a 20 74 72 65 65 20  ion.    ** tree 
33fc0 72 65 66 65 72 72 65 64 20 74 6f 20 62 79 20 74  referred to by t
33fd0 68 69 73 2c 20 74 68 65 20 70 61 72 65 6e 74 20  his, the parent 
33fe0 73 65 6c 65 63 74 2e 20 54 68 65 20 63 68 69 6c  select. The chil
33ff0 64 20 73 65 6c 65 63 74 0a 20 20 20 20 2a 2a 20  d select.    ** 
34000 6d 61 79 20 63 6f 6e 74 61 69 6e 20 65 78 70 72  may contain expr
34010 65 73 73 69 6f 6e 20 74 72 65 65 73 20 6f 66 20  ession trees of 
34020 61 74 20 6d 6f 73 74 0a 20 20 20 20 2a 2a 20 28  at most.    ** (
34030 53 51 4c 49 54 45 5f 4d 41 58 5f 45 58 50 52 5f  SQLITE_MAX_EXPR_
34040 44 45 50 54 48 2d 50 61 72 73 65 2e 6e 48 65 69  DEPTH-Parse.nHei
34050 67 68 74 29 20 68 65 69 67 68 74 2e 20 54 68 69  ght) height. Thi
34060 73 20 69 73 20 61 20 62 69 74 0a 20 20 20 20 2a  s is a bit.    *
34070 2a 20 6d 6f 72 65 20 63 6f 6e 73 65 72 76 61 74  * more conservat
34080 69 76 65 20 74 68 61 6e 20 6e 65 63 65 73 73 61  ive than necessa
34090 72 79 2c 20 62 75 74 20 6d 75 63 68 20 65 61 73  ry, but much eas
340a0 69 65 72 20 74 68 61 6e 20 65 6e 66 6f 72 63 69  ier than enforci
340b0 6e 67 0a 20 20 20 20 2a 2a 20 61 6e 20 65 78 61  ng.    ** an exa
340c0 63 74 20 6c 69 6d 69 74 2e 0a 20 20 20 20 2a 2f  ct limit..    */
340d0 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 48 65  .    pParse->nHe
340e0 69 67 68 74 20 2b 3d 20 73 71 6c 69 74 65 33 53  ight += sqlite3S
340f0 65 6c 65 63 74 45 78 70 72 48 65 69 67 68 74 28  electExprHeight(
34100 70 29 3b 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b 65  p);..    /* Make
34110 20 63 6f 70 69 65 73 20 6f 66 20 63 6f 6e 73 74   copies of const
34120 61 6e 74 20 57 48 45 52 45 2d 63 6c 61 75 73 65  ant WHERE-clause
34130 20 74 65 72 6d 73 20 69 6e 20 74 68 65 20 6f 75   terms in the ou
34140 74 65 72 20 71 75 65 72 79 20 64 6f 77 6e 0a 20  ter query down. 
34150 20 20 20 2a 2a 20 69 6e 73 69 64 65 20 74 68 65     ** inside the
34160 20 73 75 62 71 75 65 72 79 2e 20 20 54 68 69 73   subquery.  This
34170 20 63 61 6e 20 68 65 6c 70 20 74 68 65 20 73 75   can help the su
34180 62 71 75 65 72 79 20 74 6f 20 72 75 6e 20 6d 6f  bquery to run mo
34190 72 65 20 65 66 66 69 63 69 65 6e 74 6c 79 2e 0a  re efficiently..
341a0 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 4f      */.    if( O
341b0 70 74 69 6d 69 7a 61 74 69 6f 6e 45 6e 61 62 6c  ptimizationEnabl
341c0 65 64 28 64 62 2c 20 53 51 4c 49 54 45 5f 50 75  ed(db, SQLITE_Pu
341d0 73 68 44 6f 77 6e 29 0a 20 20 20 20 20 26 26 20  shDown).     && 
341e0 70 75 73 68 44 6f 77 6e 57 68 65 72 65 54 65 72  pushDownWhereTer
341f0 6d 73 28 70 50 61 72 73 65 2c 20 70 53 75 62 2c  ms(pParse, pSub,
34200 20 70 2d 3e 70 57 68 65 72 65 2c 20 70 49 74 65   p->pWhere, pIte
34210 6d 2d 3e 69 43 75 72 73 6f 72 2c 0a 20 20 20 20  m->iCursor,.    
34220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34230 20 20 20 20 20 20 20 28 70 49 74 65 6d 2d 3e 66         (pItem->f
34240 67 2e 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f  g.jointype & JT_
34250 4f 55 54 45 52 29 21 3d 30 29 0a 20 20 20 20 29  OUTER)!=0).    )
34260 7b 0a 23 69 66 20 53 45 4c 45 43 54 54 52 41 43  {.#if SELECTTRAC
34270 45 5f 45 4e 41 42 4c 45 44 0a 20 20 20 20 20 20  E_ENABLED.      
34280 69 66 28 20 73 71 6c 69 74 65 33 53 65 6c 65 63  if( sqlite3Selec
34290 74 54 72 61 63 65 20 26 20 30 78 31 30 30 20 29  tTrace & 0x100 )
342a0 7b 0a 20 20 20 20 20 20 20 20 53 45 4c 45 43 54  {.        SELECT
342b0 54 52 41 43 45 28 30 78 31 30 30 2c 70 50 61 72  TRACE(0x100,pPar
342c0 73 65 2c 70 2c 0a 20 20 20 20 20 20 20 20 20 20  se,p,.          
342d0 20 20 28 22 41 66 74 65 72 20 57 48 45 52 45 2d    ("After WHERE-
342e0 63 6c 61 75 73 65 20 70 75 73 68 2d 64 6f 77 6e  clause push-down
342f0 20 69 6e 74 6f 20 73 75 62 71 75 65 72 79 20 25   into subquery %
34300 64 3a 5c 6e 22 2c 20 70 53 75 62 2d 3e 73 65 6c  d:\n", pSub->sel
34310 49 64 29 29 3b 0a 20 20 20 20 20 20 20 20 73 71  Id));.        sq
34320 6c 69 74 65 33 54 72 65 65 56 69 65 77 53 65 6c  lite3TreeViewSel
34330 65 63 74 28 30 2c 20 70 2c 20 30 29 3b 0a 20 20  ect(0, p, 0);.  
34340 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
34350 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 53 45   }else{.      SE
34360 4c 45 43 54 54 52 41 43 45 28 30 78 31 30 30 2c  LECTTRACE(0x100,
34370 70 50 61 72 73 65 2c 70 2c 28 22 50 75 73 68 2d  pParse,p,("Push-
34380 64 6f 77 6e 20 6e 6f 74 20 70 6f 73 73 69 62 6c  down not possibl
34390 65 5c 6e 22 29 29 3b 0a 20 20 20 20 7d 0a 0a 20  e\n"));.    }.. 
343a0 20 20 20 7a 53 61 76 65 64 41 75 74 68 43 6f 6e     zSavedAuthCon
343b0 74 65 78 74 20 3d 20 70 50 61 72 73 65 2d 3e 7a  text = pParse->z
343c0 41 75 74 68 43 6f 6e 74 65 78 74 3b 0a 20 20 20  AuthContext;.   
343d0 20 70 50 61 72 73 65 2d 3e 7a 41 75 74 68 43 6f   pParse->zAuthCo
343e0 6e 74 65 78 74 20 3d 20 70 49 74 65 6d 2d 3e 7a  ntext = pItem->z
343f0 4e 61 6d 65 3b 0a 0a 20 20 20 20 2f 2a 20 47 65  Name;..    /* Ge
34400 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 69  nerate code to i
34410 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 73 75 62  mplement the sub
34420 71 75 65 72 79 0a 20 20 20 20 2a 2a 0a 20 20 20  query.    **.   
34430 20 2a 2a 20 54 68 65 20 73 75 62 71 75 65 72 79   ** The subquery
34440 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20   is implemented 
34450 61 73 20 61 20 63 6f 2d 72 6f 75 74 69 6e 65 20  as a co-routine 
34460 69 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20  if the subquery 
34470 69 73 0a 20 20 20 20 2a 2a 20 67 75 61 72 61 6e  is.    ** guaran
34480 74 65 65 64 20 74 6f 20 62 65 20 74 68 65 20 6f  teed to be the o
34490 75 74 65 72 20 6c 6f 6f 70 20 28 73 6f 20 74 68  uter loop (so th
344a0 61 74 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 6e  at it does not n
344b0 65 65 64 20 74 6f 20 62 65 0a 20 20 20 20 2a 2a  eed to be.    **
344c0 20 63 6f 6d 70 75 74 65 64 20 6d 6f 72 65 20 74   computed more t
344d0 68 61 6e 20 6f 6e 63 65 29 0a 20 20 20 20 2a 2a  han once).    **
344e0 0a 20 20 20 20 2a 2a 20 54 4f 44 4f 3a 20 41 72  .    ** TODO: Ar
344f0 65 20 74 68 65 72 65 20 6f 74 68 65 72 20 72 65  e there other re
34500 61 73 6f 6e 73 20 62 65 73 69 64 65 20 28 31 29  asons beside (1)
34510 20 74 6f 20 75 73 65 20 61 20 63 6f 2d 72 6f 75   to use a co-rou
34520 74 69 6e 65 0a 20 20 20 20 2a 2a 20 69 6d 70 6c  tine.    ** impl
34530 65 6d 65 6e 74 61 74 69 6f 6e 3f 0a 20 20 20 20  ementation?.    
34540 2a 2f 0a 20 20 20 20 69 66 28 20 69 3d 3d 30 0a  */.    if( i==0.
34550 20 20 20 20 20 26 26 20 28 70 54 61 62 4c 69 73       && (pTabLis
34560 74 2d 3e 6e 53 72 63 3d 3d 31 0a 20 20 20 20 20  t->nSrc==1.     
34570 20 20 20 20 20 20 20 7c 7c 20 28 70 54 61 62 4c         || (pTabL
34580 69 73 74 2d 3e 61 5b 31 5d 2e 66 67 2e 6a 6f 69  ist->a[1].fg.joi
34590 6e 74 79 70 65 26 28 4a 54 5f 4c 45 46 54 7c 4a  ntype&(JT_LEFT|J
345a0 54 5f 43 52 4f 53 53 29 29 21 3d 30 29 20 20 2f  T_CROSS))!=0)  /
345b0 2a 20 28 31 29 20 2a 2f 0a 20 20 20 20 29 7b 0a  * (1) */.    ){.
345c0 20 20 20 20 20 20 2f 2a 20 49 6d 70 6c 65 6d 65        /* Impleme
345d0 6e 74 20 61 20 63 6f 2d 72 6f 75 74 69 6e 65 20  nt a co-routine 
345e0 74 68 61 74 20 77 69 6c 6c 20 72 65 74 75 72 6e  that will return
345f0 20 61 20 73 69 6e 67 6c 65 20 72 6f 77 20 6f 66   a single row of
34600 20 74 68 65 20 72 65 73 75 6c 74 0a 20 20 20 20   the result.    
34610 20 20 2a 2a 20 73 65 74 20 6f 6e 20 65 61 63 68    ** set on each
34620 20 69 6e 76 6f 63 61 74 69 6f 6e 2e 0a 20 20 20   invocation..   
34630 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20     */.      int 
34640 61 64 64 72 54 6f 70 20 3d 20 73 71 6c 69 74 65  addrTop = sqlite
34650 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
34660 28 76 29 2b 31 3b 0a 20 20 20 20 20 0a 20 20 20  (v)+1;.     .   
34670 20 20 20 70 49 74 65 6d 2d 3e 72 65 67 52 65 74     pItem->regRet
34680 75 72 6e 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  urn = ++pParse->
34690 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 73 71 6c 69  nMem;.      sqli
346a0 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
346b0 20 4f 50 5f 49 6e 69 74 43 6f 72 6f 75 74 69 6e   OP_InitCoroutin
346c0 65 2c 20 70 49 74 65 6d 2d 3e 72 65 67 52 65 74  e, pItem->regRet
346d0 75 72 6e 2c 20 30 2c 20 61 64 64 72 54 6f 70 29  urn, 0, addrTop)
346e0 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d  ;.      VdbeComm
346f0 65 6e 74 28 28 76 2c 20 22 25 73 22 2c 20 70 49  ent((v, "%s", pI
34700 74 65 6d 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65  tem->pTab->zName
34710 29 29 3b 0a 20 20 20 20 20 20 70 49 74 65 6d 2d  ));.      pItem-
34720 3e 61 64 64 72 46 69 6c 6c 53 75 62 20 3d 20 61  >addrFillSub = a
34730 64 64 72 54 6f 70 3b 0a 20 20 20 20 20 20 73 71  ddrTop;.      sq
34740 6c 69 74 65 33 53 65 6c 65 63 74 44 65 73 74 49  lite3SelectDestI
34750 6e 69 74 28 26 64 65 73 74 2c 20 53 52 54 5f 43  nit(&dest, SRT_C
34760 6f 72 6f 75 74 69 6e 65 2c 20 70 49 74 65 6d 2d  oroutine, pItem-
34770 3e 72 65 67 52 65 74 75 72 6e 29 3b 0a 20 20 20  >regReturn);.   
34780 20 20 20 45 78 70 6c 61 69 6e 51 75 65 72 79 50     ExplainQueryP
34790 6c 61 6e 28 28 70 50 61 72 73 65 2c 20 31 2c 20  lan((pParse, 1, 
347a0 22 43 4f 2d 52 4f 55 54 49 4e 45 20 25 75 22 2c  "CO-ROUTINE %u",
347b0 20 70 53 75 62 2d 3e 73 65 6c 49 64 29 29 3b 0a   pSub->selId));.
347c0 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c        sqlite3Sel
347d0 65 63 74 28 70 50 61 72 73 65 2c 20 70 53 75 62  ect(pParse, pSub
347e0 2c 20 26 64 65 73 74 29 3b 0a 20 20 20 20 20 20  , &dest);.      
347f0 70 49 74 65 6d 2d 3e 70 54 61 62 2d 3e 6e 52 6f  pItem->pTab->nRo
34800 77 4c 6f 67 45 73 74 20 3d 20 70 53 75 62 2d 3e  wLogEst = pSub->
34810 6e 53 65 6c 65 63 74 52 6f 77 3b 0a 20 20 20 20  nSelectRow;.    
34820 20 20 70 49 74 65 6d 2d 3e 66 67 2e 76 69 61 43    pItem->fg.viaC
34830 6f 72 6f 75 74 69 6e 65 20 3d 20 31 3b 0a 20 20  oroutine = 1;.  
34840 20 20 20 20 70 49 74 65 6d 2d 3e 72 65 67 52 65      pItem->regRe
34850 73 75 6c 74 20 3d 20 64 65 73 74 2e 69 53 64 73  sult = dest.iSds
34860 74 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  t;.      sqlite3
34870 56 64 62 65 45 6e 64 43 6f 72 6f 75 74 69 6e 65  VdbeEndCoroutine
34880 28 76 2c 20 70 49 74 65 6d 2d 3e 72 65 67 52 65  (v, pItem->regRe
34890 74 75 72 6e 29 3b 0a 20 20 20 20 20 20 73 71 6c  turn);.      sql
348a0 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
348b0 28 76 2c 20 61 64 64 72 54 6f 70 2d 31 29 3b 0a  (v, addrTop-1);.
348c0 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6c 65        sqlite3Cle
348d0 61 72 54 65 6d 70 52 65 67 43 61 63 68 65 28 70  arTempRegCache(p
348e0 50 61 72 73 65 29 3b 0a 20 20 20 20 7d 65 6c 73  Parse);.    }els
348f0 65 7b 0a 20 20 20 20 20 20 2f 2a 20 47 65 6e 65  e{.      /* Gene
34900 72 61 74 65 20 61 20 73 75 62 72 6f 75 74 69 6e  rate a subroutin
34910 65 20 74 68 61 74 20 77 69 6c 6c 20 66 69 6c 6c  e that will fill
34920 20 61 6e 20 65 70 68 65 6d 65 72 61 6c 20 74 61   an ephemeral ta
34930 62 6c 65 20 77 69 74 68 0a 20 20 20 20 20 20 2a  ble with.      *
34940 2a 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66  * the content of
34950 20 74 68 69 73 20 73 75 62 71 75 65 72 79 2e 20   this subquery. 
34960 20 70 49 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c   pItem->addrFill
34970 53 75 62 20 77 69 6c 6c 20 70 6f 69 6e 74 0a 20  Sub will point. 
34980 20 20 20 20 20 2a 2a 20 74 6f 20 74 68 65 20 61       ** to the a
34990 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 67 65  ddress of the ge
349a0 6e 65 72 61 74 65 64 20 73 75 62 72 6f 75 74 69  nerated subrouti
349b0 6e 65 2e 20 20 70 49 74 65 6d 2d 3e 72 65 67 52  ne.  pItem->regR
349c0 65 74 75 72 6e 0a 20 20 20 20 20 20 2a 2a 20 69  eturn.      ** i
349d0 73 20 61 20 72 65 67 69 73 74 65 72 20 61 6c 6c  s a register all
349e0 6f 63 61 74 65 64 20 74 6f 20 68 6f 6c 64 20 74  ocated to hold t
349f0 68 65 20 73 75 62 72 6f 75 74 69 6e 65 20 72 65  he subroutine re
34a00 74 75 72 6e 20 61 64 64 72 65 73 73 0a 20 20 20  turn address.   
34a10 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20     */.      int 
34a20 74 6f 70 41 64 64 72 3b 0a 20 20 20 20 20 20 69  topAddr;.      i
34a30 6e 74 20 6f 6e 63 65 41 64 64 72 20 3d 20 30 3b  nt onceAddr = 0;
34a40 0a 20 20 20 20 20 20 69 6e 74 20 72 65 74 41 64  .      int retAd
34a50 64 72 3b 0a 20 20 20 20 20 20 73 74 72 75 63 74  dr;.      struct
34a60 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
34a70 50 72 69 6f 72 3b 0a 0a 20 20 20 20 20 20 74 65  Prior;..      te
34a80 73 74 63 61 73 65 28 20 70 49 74 65 6d 2d 3e 61  stcase( pItem->a
34a90 64 64 72 46 69 6c 6c 53 75 62 3d 3d 30 20 29 3b  ddrFillSub==0 );
34aa0 20 2f 2a 20 54 69 63 6b 65 74 20 63 35 32 62 30   /* Ticket c52b0
34ab0 39 63 37 66 33 38 39 30 33 62 31 33 31 31 20 2a  9c7f38903b1311 *
34ac0 2f 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 72  /.      pItem->r
34ad0 65 67 52 65 74 75 72 6e 20 3d 20 2b 2b 70 50 61  egReturn = ++pPa
34ae0 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20  rse->nMem;.     
34af0 20 74 6f 70 41 64 64 72 20 3d 20 73 71 6c 69 74   topAddr = sqlit
34b00 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
34b10 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 70  OP_Integer, 0, p
34b20 49 74 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e 29  Item->regReturn)
34b30 3b 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 61  ;.      pItem->a
34b40 64 64 72 46 69 6c 6c 53 75 62 20 3d 20 74 6f 70  ddrFillSub = top
34b50 41 64 64 72 2b 31 3b 0a 20 20 20 20 20 20 69 66  Addr+1;.      if
34b60 28 20 70 49 74 65 6d 2d 3e 66 67 2e 69 73 43 6f  ( pItem->fg.isCo
34b70 72 72 65 6c 61 74 65 64 3d 3d 30 20 29 7b 0a 20  rrelated==0 ){. 
34b80 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65         /* If the
34b90 20 73 75 62 71 75 65 72 79 20 69 73 20 6e 6f 74   subquery is not
34ba0 20 63 6f 72 72 65 6c 61 74 65 64 20 61 6e 64 20   correlated and 
34bb0 69 66 20 77 65 20 61 72 65 20 6e 6f 74 20 69 6e  if we are not in
34bc0 73 69 64 65 20 6f 66 0a 20 20 20 20 20 20 20 20  side of.        
34bd0 2a 2a 20 61 20 74 72 69 67 67 65 72 2c 20 74 68  ** a trigger, th
34be0 65 6e 20 77 65 20 6f 6e 6c 79 20 6e 65 65 64 20  en we only need 
34bf0 74 6f 20 63 6f 6d 70 75 74 65 20 74 68 65 20 76  to compute the v
34c00 61 6c 75 65 20 6f 66 20 74 68 65 20 73 75 62 71  alue of the subq
34c10 75 65 72 79 0a 20 20 20 20 20 20 20 20 2a 2a 20  uery.        ** 
34c20 6f 6e 63 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20  once. */.       
34c30 20 6f 6e 63 65 41 64 64 72 20 3d 20 73 71 6c 69   onceAddr = sqli
34c40 74 65 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c  te3VdbeAddOp0(v,
34c50 20 4f 50 5f 4f 6e 63 65 29 3b 20 56 64 62 65 43   OP_Once); VdbeC
34c60 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
34c70 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
34c80 28 76 2c 20 22 6d 61 74 65 72 69 61 6c 69 7a 65  (v, "materialize
34c90 20 5c 22 25 73 5c 22 22 2c 20 70 49 74 65 6d 2d   \"%s\"", pItem-
34ca0 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 29 3b 0a  >pTab->zName));.
34cb0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
34cc0 20 20 20 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d       VdbeNoopCom
34cd0 6d 65 6e 74 28 28 76 2c 20 22 6d 61 74 65 72 69  ment((v, "materi
34ce0 61 6c 69 7a 65 20 5c 22 25 73 5c 22 22 2c 20 70  alize \"%s\"", p
34cf0 49 74 65 6d 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d  Item->pTab->zNam
34d00 65 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  e));.      }.   
34d10 20 20 20 70 50 72 69 6f 72 20 3d 20 69 73 53 65     pPrior = isSe
34d20 6c 66 4a 6f 69 6e 56 69 65 77 28 70 54 61 62 4c  lfJoinView(pTabL
34d30 69 73 74 2c 20 70 49 74 65 6d 29 3b 0a 20 20 20  ist, pItem);.   
34d40 20 20 20 69 66 28 20 70 50 72 69 6f 72 20 29 7b     if( pPrior ){
34d50 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
34d60 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
34d70 5f 4f 70 65 6e 44 75 70 2c 20 70 49 74 65 6d 2d  _OpenDup, pItem-
34d80 3e 69 43 75 72 73 6f 72 2c 20 70 50 72 69 6f 72  >iCursor, pPrior
34d90 2d 3e 69 43 75 72 73 6f 72 29 3b 0a 20 20 20 20  ->iCursor);.    
34da0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 72 69      assert( pPri
34db0 6f 72 2d 3e 70 53 65 6c 65 63 74 21 3d 30 20 29  or->pSelect!=0 )
34dc0 3b 0a 20 20 20 20 20 20 20 20 70 53 75 62 2d 3e  ;.        pSub->
34dd0 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 70 50 72  nSelectRow = pPr
34de0 69 6f 72 2d 3e 70 53 65 6c 65 63 74 2d 3e 6e 53  ior->pSelect->nS
34df0 65 6c 65 63 74 52 6f 77 3b 0a 20 20 20 20 20 20  electRow;.      
34e00 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
34e10 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 73 74  qlite3SelectDest
34e20 49 6e 69 74 28 26 64 65 73 74 2c 20 53 52 54 5f  Init(&dest, SRT_
34e30 45 70 68 65 6d 54 61 62 2c 20 70 49 74 65 6d 2d  EphemTab, pItem-
34e40 3e 69 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 20  >iCursor);.     
34e50 20 20 20 45 78 70 6c 61 69 6e 51 75 65 72 79 50     ExplainQueryP
34e60 6c 61 6e 28 28 70 50 61 72 73 65 2c 20 31 2c 20  lan((pParse, 1, 
34e70 22 4d 41 54 45 52 49 41 4c 49 5a 45 20 25 75 22  "MATERIALIZE %u"
34e80 2c 20 70 53 75 62 2d 3e 73 65 6c 49 64 29 29 3b  , pSub->selId));
34e90 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
34ea0 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70  Select(pParse, p
34eb0 53 75 62 2c 20 26 64 65 73 74 29 3b 0a 20 20 20  Sub, &dest);.   
34ec0 20 20 20 7d 0a 20 20 20 20 20 20 70 49 74 65 6d     }.      pItem
34ed0 2d 3e 70 54 61 62 2d 3e 6e 52 6f 77 4c 6f 67 45  ->pTab->nRowLogE
34ee0 73 74 20 3d 20 70 53 75 62 2d 3e 6e 53 65 6c 65  st = pSub->nSele
34ef0 63 74 52 6f 77 3b 0a 20 20 20 20 20 20 69 66 28  ctRow;.      if(
34f00 20 6f 6e 63 65 41 64 64 72 20 29 20 73 71 6c 69   onceAddr ) sqli
34f10 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
34f20 76 2c 20 6f 6e 63 65 41 64 64 72 29 3b 0a 20 20  v, onceAddr);.  
34f30 20 20 20 20 72 65 74 41 64 64 72 20 3d 20 73 71      retAddr = sq
34f40 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
34f50 76 2c 20 4f 50 5f 52 65 74 75 72 6e 2c 20 70 49  v, OP_Return, pI
34f60 74 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e 29 3b  tem->regReturn);
34f70 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65  .      VdbeComme
34f80 6e 74 28 28 76 2c 20 22 65 6e 64 20 25 73 22 2c  nt((v, "end %s",
34f90 20 70 49 74 65 6d 2d 3e 70 54 61 62 2d 3e 7a 4e   pItem->pTab->zN
34fa0 61 6d 65 29 29 3b 0a 20 20 20 20 20 20 73 71 6c  ame));.      sql
34fb0 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 31  ite3VdbeChangeP1
34fc0 28 76 2c 20 74 6f 70 41 64 64 72 2c 20 72 65 74  (v, topAddr, ret
34fd0 41 64 64 72 29 3b 0a 20 20 20 20 20 20 73 71 6c  Addr);.      sql
34fe0 69 74 65 33 43 6c 65 61 72 54 65 6d 70 52 65 67  ite3ClearTempReg
34ff0 43 61 63 68 65 28 70 50 61 72 73 65 29 3b 0a 20  Cache(pParse);. 
35000 20 20 20 7d 0a 20 20 20 20 69 66 28 20 64 62 2d     }.    if( db-
35010 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20  >mallocFailed ) 
35020 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b  goto select_end;
35030 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 48 65  .    pParse->nHe
35040 69 67 68 74 20 2d 3d 20 73 71 6c 69 74 65 33 53  ight -= sqlite3S
35050 65 6c 65 63 74 45 78 70 72 48 65 69 67 68 74 28  electExprHeight(
35060 70 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e  p);.    pParse->
35070 7a 41 75 74 68 43 6f 6e 74 65 78 74 20 3d 20 7a  zAuthContext = z
35080 53 61 76 65 64 41 75 74 68 43 6f 6e 74 65 78 74  SavedAuthContext
35090 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 20 20  ;.#endif.  }..  
350a0 2f 2a 20 56 61 72 69 6f 75 73 20 65 6c 65 6d 65  /* Various eleme
350b0 6e 74 73 20 6f 66 20 74 68 65 20 53 45 4c 45 43  nts of the SELEC
350c0 54 20 63 6f 70 69 65 64 20 69 6e 74 6f 20 6c 6f  T copied into lo
350d0 63 61 6c 20 76 61 72 69 61 62 6c 65 73 20 66 6f  cal variables fo
350e0 72 0a 20 20 2a 2a 20 63 6f 6e 76 65 6e 69 65 6e  r.  ** convenien
350f0 63 65 20 2a 2f 0a 20 20 70 45 4c 69 73 74 20 3d  ce */.  pEList =
35100 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 70 57   p->pEList;.  pW
35110 68 65 72 65 20 3d 20 70 2d 3e 70 57 68 65 72 65  here = p->pWhere
35120 3b 0a 20 20 70 47 72 6f 75 70 42 79 20 3d 20 70  ;.  pGroupBy = p
35130 2d 3e 70 47 72 6f 75 70 42 79 3b 0a 20 20 70 48  ->pGroupBy;.  pH
35140 61 76 69 6e 67 20 3d 20 70 2d 3e 70 48 61 76 69  aving = p->pHavi
35150 6e 67 3b 0a 20 20 73 44 69 73 74 69 6e 63 74 2e  ng;.  sDistinct.
35160 69 73 54 6e 63 74 20 3d 20 28 70 2d 3e 73 65 6c  isTnct = (p->sel
35170 46 6c 61 67 73 20 26 20 53 46 5f 44 69 73 74 69  Flags & SF_Disti
35180 6e 63 74 29 21 3d 30 3b 0a 0a 23 69 66 20 53 45  nct)!=0;..#if SE
35190 4c 45 43 54 54 52 41 43 45 5f 45 4e 41 42 4c 45  LECTTRACE_ENABLE
351a0 44 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 53  D.  if( sqlite3S
351b0 65 6c 65 63 74 54 72 61 63 65 20 26 20 30 78 34  electTrace & 0x4
351c0 30 30 20 29 7b 0a 20 20 20 20 53 45 4c 45 43 54  00 ){.    SELECT
351d0 54 52 41 43 45 28 30 78 34 30 30 2c 70 50 61 72  TRACE(0x400,pPar
351e0 73 65 2c 70 2c 28 22 41 66 74 65 72 20 61 6c 6c  se,p,("After all
351f0 20 46 52 4f 4d 2d 63 6c 61 75 73 65 20 61 6e 61   FROM-clause ana
35200 6c 79 73 69 73 3a 5c 6e 22 29 29 3b 0a 20 20 20  lysis:\n"));.   
35210 20 73 71 6c 69 74 65 33 54 72 65 65 56 69 65 77   sqlite3TreeView
35220 53 65 6c 65 63 74 28 30 2c 20 70 2c 20 30 29 3b  Select(0, p, 0);
35230 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  .  }.#endif..  /
35240 2a 20 49 66 20 74 68 65 20 71 75 65 72 79 20 69  * If the query i
35250 73 20 44 49 53 54 49 4e 43 54 20 77 69 74 68 20  s DISTINCT with 
35260 61 6e 20 4f 52 44 45 52 20 42 59 20 62 75 74 20  an ORDER BY but 
35270 69 73 20 6e 6f 74 20 61 6e 20 61 67 67 72 65 67  is not an aggreg
35280 61 74 65 2c 20 61 6e 64 20 0a 20 20 2a 2a 20 69  ate, and .  ** i
35290 66 20 74 68 65 20 73 65 6c 65 63 74 2d 6c 69 73  f the select-lis
352a0 74 20 69 73 20 74 68 65 20 73 61 6d 65 20 61 73  t is the same as
352b0 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 6c 69   the ORDER BY li
352c0 73 74 2c 20 74 68 65 6e 20 74 68 69 73 20 71 75  st, then this qu
352d0 65 72 79 0a 20 20 2a 2a 20 63 61 6e 20 62 65 20  ery.  ** can be 
352e0 72 65 77 72 69 74 74 65 6e 20 61 73 20 61 20 47  rewritten as a G
352f0 52 4f 55 50 20 42 59 2e 20 49 6e 20 6f 74 68 65  ROUP BY. In othe
35300 72 20 77 6f 72 64 73 2c 20 74 68 69 73 3a 0a 20  r words, this:. 
35310 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c   **.  **     SEL
35320 45 43 54 20 44 49 53 54 49 4e 43 54 20 78 79 7a  ECT DISTINCT xyz
35330 20 46 52 4f 4d 20 2e 2e 2e 20 4f 52 44 45 52 20   FROM ... ORDER 
35340 42 59 20 78 79 7a 0a 20 20 2a 2a 0a 20 20 2a 2a  BY xyz.  **.  **
35350 20 69 73 20 74 72 61 6e 73 66 6f 72 6d 65 64 20   is transformed 
35360 74 6f 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  to:.  **.  **   
35370 20 20 53 45 4c 45 43 54 20 78 79 7a 20 46 52 4f    SELECT xyz FRO
35380 4d 20 2e 2e 2e 20 47 52 4f 55 50 20 42 59 20 78  M ... GROUP BY x
35390 79 7a 20 4f 52 44 45 52 20 42 59 20 78 79 7a 0a  yz ORDER BY xyz.
353a0 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 73 65    **.  ** The se
353b0 63 6f 6e 64 20 66 6f 72 6d 20 69 73 20 70 72 65  cond form is pre
353c0 66 65 72 72 65 64 20 61 73 20 61 20 73 69 6e 67  ferred as a sing
353d0 6c 65 20 69 6e 64 65 78 20 28 6f 72 20 74 65 6d  le index (or tem
353e0 70 2d 74 61 62 6c 65 29 20 6d 61 79 20 62 65 20  p-table) may be 
353f0 0a 20 20 2a 2a 20 75 73 65 64 20 66 6f 72 20 62  .  ** used for b
35400 6f 74 68 20 74 68 65 20 4f 52 44 45 52 20 42 59  oth the ORDER BY
35410 20 61 6e 64 20 44 49 53 54 49 4e 43 54 20 70 72   and DISTINCT pr
35420 6f 63 65 73 73 69 6e 67 2e 20 41 73 20 6f 72 69  ocessing. As ori
35430 67 69 6e 61 6c 6c 79 20 0a 20 20 2a 2a 20 77 72  ginally .  ** wr
35440 69 74 74 65 6e 20 74 68 65 20 71 75 65 72 79 20  itten the query 
35450 6d 75 73 74 20 75 73 65 20 61 20 74 65 6d 70 2d  must use a temp-
35460 74 61 62 6c 65 20 66 6f 72 20 61 74 20 6c 65 61  table for at lea
35470 73 74 20 6f 6e 65 20 6f 66 20 74 68 65 20 4f 52  st one of the OR
35480 44 45 52 20 0a 20 20 2a 2a 20 42 59 20 61 6e 64  DER .  ** BY and
35490 20 44 49 53 54 49 4e 43 54 2c 20 61 6e 64 20 61   DISTINCT, and a
354a0 6e 20 69 6e 64 65 78 20 6f 72 20 73 65 70 61 72  n index or separ
354b0 61 74 65 20 74 65 6d 70 2d 74 61 62 6c 65 20 66  ate temp-table f
354c0 6f 72 20 74 68 65 20 6f 74 68 65 72 2e 0a 20 20  or the other..  
354d0 2a 2f 0a 20 20 69 66 28 20 28 70 2d 3e 73 65 6c  */.  if( (p->sel
354e0 46 6c 61 67 73 20 26 20 28 53 46 5f 44 69 73 74  Flags & (SF_Dist
354f0 69 6e 63 74 7c 53 46 5f 41 67 67 72 65 67 61 74  inct|SF_Aggregat
35500 65 29 29 3d 3d 53 46 5f 44 69 73 74 69 6e 63 74  e))==SF_Distinct
35510 20 0a 20 20 20 26 26 20 73 71 6c 69 74 65 33 45   .   && sqlite3E
35520 78 70 72 4c 69 73 74 43 6f 6d 70 61 72 65 28 73  xprListCompare(s
35530 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 2c 20 70  Sort.pOrderBy, p
35540 45 4c 69 73 74 2c 20 2d 31 29 3d 3d 30 0a 20 20  EList, -1)==0.  
35550 29 7b 0a 20 20 20 20 70 2d 3e 73 65 6c 46 6c 61  ){.    p->selFla
35560 67 73 20 26 3d 20 7e 53 46 5f 44 69 73 74 69 6e  gs &= ~SF_Distin
35570 63 74 3b 0a 20 20 20 20 70 47 72 6f 75 70 42 79  ct;.    pGroupBy
35580 20 3d 20 70 2d 3e 70 47 72 6f 75 70 42 79 20 3d   = p->pGroupBy =
35590 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
355a0 44 75 70 28 64 62 2c 20 70 45 4c 69 73 74 2c 20  Dup(db, pEList, 
355b0 30 29 3b 0a 20 20 20 20 2f 2a 20 4e 6f 74 69 63  0);.    /* Notic
355c0 65 20 74 68 61 74 20 65 76 65 6e 20 74 68 6f 75  e that even thou
355d0 67 68 74 20 53 46 5f 44 69 73 74 69 6e 63 74 20  ght SF_Distinct 
355e0 68 61 73 20 62 65 65 6e 20 63 6c 65 61 72 65 64  has been cleared
355f0 20 66 72 6f 6d 20 70 2d 3e 73 65 6c 46 6c 61 67   from p->selFlag
35600 73 2c 0a 20 20 20 20 2a 2a 20 74 68 65 20 73 44  s,.    ** the sD
35610 69 73 74 69 6e 63 74 2e 69 73 54 6e 63 74 20 69  istinct.isTnct i
35620 73 20 73 74 69 6c 6c 20 73 65 74 2e 20 20 48 65  s still set.  He
35630 6e 63 65 2c 20 69 73 54 6e 63 74 20 72 65 70 72  nce, isTnct repr
35640 65 73 65 6e 74 73 20 74 68 65 0a 20 20 20 20 2a  esents the.    *
35650 2a 20 6f 72 69 67 69 6e 61 6c 20 73 65 74 74 69  * original setti
35660 6e 67 20 6f 66 20 74 68 65 20 53 46 5f 44 69 73  ng of the SF_Dis
35670 74 69 6e 63 74 20 66 6c 61 67 2c 20 6e 6f 74 20  tinct flag, not 
35680 74 68 65 20 63 75 72 72 65 6e 74 20 73 65 74 74  the current sett
35690 69 6e 67 20 2a 2f 0a 20 20 20 20 61 73 73 65 72  ing */.    asser
356a0 74 28 20 73 44 69 73 74 69 6e 63 74 2e 69 73 54  t( sDistinct.isT
356b0 6e 63 74 20 29 3b 0a 0a 23 69 66 20 53 45 4c 45  nct );..#if SELE
356c0 43 54 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a  CTTRACE_ENABLED.
356d0 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53      if( sqlite3S
356e0 65 6c 65 63 74 54 72 61 63 65 20 26 20 30 78 34  electTrace & 0x4
356f0 30 30 20 29 7b 0a 20 20 20 20 20 20 53 45 4c 45  00 ){.      SELE
35700 43 54 54 52 41 43 45 28 30 78 34 30 30 2c 70 50  CTTRACE(0x400,pP
35710 61 72 73 65 2c 70 2c 28 22 54 72 61 6e 73 66 6f  arse,p,("Transfo
35720 72 6d 20 44 49 53 54 49 4e 43 54 20 69 6e 74 6f  rm DISTINCT into
35730 20 47 52 4f 55 50 20 42 59 3a 5c 6e 22 29 29 3b   GROUP BY:\n"));
35740 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 54 72  .      sqlite3Tr
35750 65 65 56 69 65 77 53 65 6c 65 63 74 28 30 2c 20  eeViewSelect(0, 
35760 70 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 23 65 6e  p, 0);.    }.#en
35770 64 69 66 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66  dif.  }..  /* If
35780 20 74 68 65 72 65 20 69 73 20 61 6e 20 4f 52 44   there is an ORD
35790 45 52 20 42 59 20 63 6c 61 75 73 65 2c 20 74 68  ER BY clause, th
357a0 65 6e 20 63 72 65 61 74 65 20 61 6e 20 65 70 68  en create an eph
357b0 65 6d 65 72 61 6c 20 69 6e 64 65 78 20 74 6f 0a  emeral index to.
357c0 20 20 2a 2a 20 64 6f 20 74 68 65 20 73 6f 72 74    ** do the sort
357d0 69 6e 67 2e 20 20 42 75 74 20 74 68 69 73 20 73  ing.  But this s
357e0 6f 72 74 69 6e 67 20 65 70 68 65 6d 65 72 61 6c  orting ephemeral
357f0 20 69 6e 64 65 78 20 6d 69 67 68 74 20 65 6e 64   index might end
35800 20 75 70 0a 20 20 2a 2a 20 62 65 69 6e 67 20 75   up.  ** being u
35810 6e 75 73 65 64 20 69 66 20 74 68 65 20 64 61 74  nused if the dat
35820 61 20 63 61 6e 20 62 65 20 65 78 74 72 61 63 74  a can be extract
35830 65 64 20 69 6e 20 70 72 65 2d 73 6f 72 74 65 64  ed in pre-sorted
35840 20 6f 72 64 65 72 2e 0a 20 20 2a 2a 20 49 66 20   order..  ** If 
35850 74 68 61 74 20 69 73 20 74 68 65 20 63 61 73 65  that is the case
35860 2c 20 74 68 65 6e 20 74 68 65 20 4f 50 5f 4f 70  , then the OP_Op
35870 65 6e 45 70 68 65 6d 65 72 61 6c 20 69 6e 73 74  enEphemeral inst
35880 72 75 63 74 69 6f 6e 20 77 69 6c 6c 20 62 65 0a  ruction will be.
35890 20 20 2a 2a 20 63 68 61 6e 67 65 64 20 74 6f 20    ** changed to 
358a0 61 6e 20 4f 50 5f 4e 6f 6f 70 20 6f 6e 63 65 20  an OP_Noop once 
358b0 77 65 20 66 69 67 75 72 65 20 6f 75 74 20 74 68  we figure out th
358c0 61 74 20 74 68 65 20 73 6f 72 74 69 6e 67 20 69  at the sorting i
358d0 6e 64 65 78 20 69 73 0a 20 20 2a 2a 20 6e 6f 74  ndex is.  ** not
358e0 20 6e 65 65 64 65 64 2e 20 20 54 68 65 20 73 53   needed.  The sS
358f0 6f 72 74 2e 61 64 64 72 53 6f 72 74 49 6e 64 65  ort.addrSortInde
35900 78 20 76 61 72 69 61 62 6c 65 20 69 73 20 75 73  x variable is us
35910 65 64 20 74 6f 20 66 61 63 69 6c 69 74 61 74 65  ed to facilitate
35920 0a 20 20 2a 2a 20 74 68 61 74 20 63 68 61 6e 67  .  ** that chang
35930 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 73 53  e..  */.  if( sS
35940 6f 72 74 2e 70 4f 72 64 65 72 42 79 20 29 7b 0a  ort.pOrderBy ){.
35950 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65      KeyInfo *pKe
35960 79 49 6e 66 6f 3b 0a 20 20 20 20 70 4b 65 79 49  yInfo;.    pKeyI
35970 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 4b 65 79  nfo = sqlite3Key
35980 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74  InfoFromExprList
35990 28 0a 20 20 20 20 20 20 20 20 70 50 61 72 73 65  (.        pParse
359a0 2c 20 73 53 6f 72 74 2e 70 4f 72 64 65 72 42 79  , sSort.pOrderBy
359b0 2c 20 30 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78  , 0, pEList->nEx
359c0 70 72 29 3b 0a 20 20 20 20 73 53 6f 72 74 2e 69  pr);.    sSort.i
359d0 45 43 75 72 73 6f 72 20 3d 20 70 50 61 72 73 65  ECursor = pParse
359e0 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 73 53  ->nTab++;.    sS
359f0 6f 72 74 2e 61 64 64 72 53 6f 72 74 49 6e 64 65  ort.addrSortInde
35a00 78 20 3d 0a 20 20 20 20 20 20 73 71 6c 69 74 65  x =.      sqlite
35a10 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
35a20 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c  P_OpenEphemeral,
35a30 0a 20 20 20 20 20 20 20 20 20 20 73 53 6f 72 74  .          sSort
35a40 2e 69 45 43 75 72 73 6f 72 2c 20 73 53 6f 72 74  .iECursor, sSort
35a50 2e 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72  .pOrderBy->nExpr
35a60 2b 31 2b 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  +1+pEList->nExpr
35a70 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 28  , 0,.          (
35a80 63 68 61 72 2a 29 70 4b 65 79 49 6e 66 6f 2c 20  char*)pKeyInfo, 
35a90 50 34 5f 4b 45 59 49 4e 46 4f 0a 20 20 20 20 20  P4_KEYINFO.     
35aa0 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   );.  }else{.   
35ab0 20 73 53 6f 72 74 2e 61 64 64 72 53 6f 72 74 49   sSort.addrSortI
35ac0 6e 64 65 78 20 3d 20 2d 31 3b 0a 20 20 7d 0a 0a  ndex = -1;.  }..
35ad0 20 20 2f 2a 20 49 66 20 74 68 65 20 6f 75 74 70    /* If the outp
35ae0 75 74 20 69 73 20 64 65 73 74 69 6e 65 64 20 66  ut is destined f
35af0 6f 72 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74  or a temporary t
35b00 61 62 6c 65 2c 20 6f 70 65 6e 20 74 68 61 74 20  able, open that 
35b10 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66  table..  */.  if
35b20 28 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d  ( pDest->eDest==
35b30 53 52 54 5f 45 70 68 65 6d 54 61 62 20 29 7b 0a  SRT_EphemTab ){.
35b40 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
35b50 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e  ddOp2(v, OP_Open
35b60 45 70 68 65 6d 65 72 61 6c 2c 20 70 44 65 73 74  Ephemeral, pDest
35b70 2d 3e 69 53 44 50 61 72 6d 2c 20 70 45 4c 69 73  ->iSDParm, pELis
35b80 74 2d 3e 6e 45 78 70 72 29 3b 0a 20 20 7d 0a 0a  t->nExpr);.  }..
35b90 20 20 2f 2a 20 53 65 74 20 74 68 65 20 6c 69 6d    /* Set the lim
35ba0 69 74 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 45 6e  iter..  */.  iEn
35bb0 64 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  d = sqlite3VdbeM
35bc0 61 6b 65 4c 61 62 65 6c 28 70 50 61 72 73 65 29  akeLabel(pParse)
35bd0 3b 0a 20 20 69 66 28 20 28 70 2d 3e 73 65 6c 46  ;.  if( (p->selF
35be0 6c 61 67 73 20 26 20 53 46 5f 46 69 78 65 64 4c  lags & SF_FixedL
35bf0 69 6d 69 74 29 3d 3d 30 20 29 7b 0a 20 20 20 20  imit)==0 ){.    
35c00 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20  p->nSelectRow = 
35c10 33 32 30 3b 20 20 2f 2a 20 34 20 62 69 6c 6c 69  320;  /* 4 billi
35c20 6f 6e 20 72 6f 77 73 20 2a 2f 0a 20 20 7d 0a 20  on rows */.  }. 
35c30 20 63 6f 6d 70 75 74 65 4c 69 6d 69 74 52 65 67   computeLimitReg
35c40 69 73 74 65 72 73 28 70 50 61 72 73 65 2c 20 70  isters(pParse, p
35c50 2c 20 69 45 6e 64 29 3b 0a 20 20 69 66 28 20 70  , iEnd);.  if( p
35c60 2d 3e 69 4c 69 6d 69 74 3d 3d 30 20 26 26 20 73  ->iLimit==0 && s
35c70 53 6f 72 74 2e 61 64 64 72 53 6f 72 74 49 6e 64  Sort.addrSortInd
35c80 65 78 3e 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  ex>=0 ){.    sql
35c90 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 4f 70  ite3VdbeChangeOp
35ca0 63 6f 64 65 28 76 2c 20 73 53 6f 72 74 2e 61 64  code(v, sSort.ad
35cb0 64 72 53 6f 72 74 49 6e 64 65 78 2c 20 4f 50 5f  drSortIndex, OP_
35cc0 53 6f 72 74 65 72 4f 70 65 6e 29 3b 0a 20 20 20  SorterOpen);.   
35cd0 20 73 53 6f 72 74 2e 73 6f 72 74 46 6c 61 67 73   sSort.sortFlags
35ce0 20 7c 3d 20 53 4f 52 54 46 4c 41 47 5f 55 73 65   |= SORTFLAG_Use
35cf0 53 6f 72 74 65 72 3b 0a 20 20 7d 0a 0a 20 20 2f  Sorter;.  }..  /
35d00 2a 20 4f 70 65 6e 20 61 6e 20 65 70 68 65 6d 65  * Open an epheme
35d10 72 61 6c 20 69 6e 64 65 78 20 74 6f 20 75 73 65  ral index to use
35d20 20 66 6f 72 20 74 68 65 20 64 69 73 74 69 6e 63   for the distinc
35d30 74 20 73 65 74 2e 0a 20 20 2a 2f 0a 20 20 69 66  t set..  */.  if
35d40 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20  ( p->selFlags & 
35d50 53 46 5f 44 69 73 74 69 6e 63 74 20 29 7b 0a 20  SF_Distinct ){. 
35d60 20 20 20 73 44 69 73 74 69 6e 63 74 2e 74 61 62     sDistinct.tab
35d70 54 6e 63 74 20 3d 20 70 50 61 72 73 65 2d 3e 6e  Tnct = pParse->n
35d80 54 61 62 2b 2b 3b 0a 20 20 20 20 73 44 69 73 74  Tab++;.    sDist
35d90 69 6e 63 74 2e 61 64 64 72 54 6e 63 74 20 3d 20  inct.addrTnct = 
35da0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
35db0 34 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65  4(v, OP_OpenEphe
35dc0 6d 65 72 61 6c 2c 0a 20 20 20 20 20 20 20 20 20  meral,.         
35dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 44                sD
35de0 69 73 74 69 6e 63 74 2e 74 61 62 54 6e 63 74 2c  istinct.tabTnct,
35df0 20 30 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20   0, 0,.         
35e00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 63                (c
35e10 68 61 72 2a 29 73 71 6c 69 74 65 33 4b 65 79 49  har*)sqlite3KeyI
35e20 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74 28  nfoFromExprList(
35e30 70 50 61 72 73 65 2c 20 70 2d 3e 70 45 4c 69 73  pParse, p->pELis
35e40 74 2c 30 2c 30 29 2c 0a 20 20 20 20 20 20 20 20  t,0,0),.        
35e50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 50                 P
35e60 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 20 20  4_KEYINFO);.    
35e70 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
35e80 65 50 35 28 76 2c 20 42 54 52 45 45 5f 55 4e 4f  eP5(v, BTREE_UNO
35e90 52 44 45 52 45 44 29 3b 0a 20 20 20 20 73 44 69  RDERED);.    sDi
35ea0 73 74 69 6e 63 74 2e 65 54 6e 63 74 54 79 70 65  stinct.eTnctType
35eb0 20 3d 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43   = WHERE_DISTINC
35ec0 54 5f 55 4e 4f 52 44 45 52 45 44 3b 0a 20 20 7d  T_UNORDERED;.  }
35ed0 65 6c 73 65 7b 0a 20 20 20 20 73 44 69 73 74 69  else{.    sDisti
35ee0 6e 63 74 2e 65 54 6e 63 74 54 79 70 65 20 3d 20  nct.eTnctType = 
35ef0 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 4e  WHERE_DISTINCT_N
35f00 4f 4f 50 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  OOP;.  }..  if( 
35f10 21 69 73 41 67 67 20 26 26 20 70 47 72 6f 75 70  !isAgg && pGroup
35f20 42 79 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20  By==0 ){.    /* 
35f30 4e 6f 20 61 67 67 72 65 67 61 74 65 20 66 75 6e  No aggregate fun
35f40 63 74 69 6f 6e 73 20 61 6e 64 20 6e 6f 20 47 52  ctions and no GR
35f50 4f 55 50 20 42 59 20 63 6c 61 75 73 65 20 2a 2f  OUP BY clause */
35f60 0a 20 20 20 20 75 31 36 20 77 63 74 72 6c 46 6c  .    u16 wctrlFl
35f70 61 67 73 20 3d 20 28 73 44 69 73 74 69 6e 63 74  ags = (sDistinct
35f80 2e 69 73 54 6e 63 74 20 3f 20 57 48 45 52 45 5f  .isTnct ? WHERE_
35f90 57 41 4e 54 5f 44 49 53 54 49 4e 43 54 20 3a 20  WANT_DISTINCT : 
35fa0 30 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  0).             
35fb0 20 20 20 20 20 20 7c 20 28 70 2d 3e 73 65 6c 46        | (p->selF
35fc0 6c 61 67 73 20 26 20 53 46 5f 46 69 78 65 64 4c  lags & SF_FixedL
35fd0 69 6d 69 74 29 3b 0a 23 69 66 6e 64 65 66 20 53  imit);.#ifndef S
35fe0 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 49 4e 44 4f  QLITE_OMIT_WINDO
35ff0 57 46 55 4e 43 0a 20 20 20 20 57 69 6e 64 6f 77  WFUNC.    Window
36000 20 2a 70 57 69 6e 20 3d 20 70 2d 3e 70 57 69 6e   *pWin = p->pWin
36010 3b 20 20 20 20 20 20 2f 2a 20 4d 61 73 74 65 72  ;      /* Master
36020 20 77 69 6e 64 6f 77 20 6f 62 6a 65 63 74 20 28   window object (
36030 6f 72 20 4e 55 4c 4c 29 20 2a 2f 0a 20 20 20 20  or NULL) */.    
36040 69 66 28 20 70 57 69 6e 20 29 7b 0a 20 20 20 20  if( pWin ){.    
36050 20 20 73 71 6c 69 74 65 33 57 69 6e 64 6f 77 43    sqlite3WindowC
36060 6f 64 65 49 6e 69 74 28 70 50 61 72 73 65 2c 20  odeInit(pParse, 
36070 70 57 69 6e 29 3b 0a 20 20 20 20 7d 0a 23 65 6e  pWin);.    }.#en
36080 64 69 66 0a 20 20 20 20 61 73 73 65 72 74 28 20  dif.    assert( 
36090 57 48 45 52 45 5f 55 53 45 5f 4c 49 4d 49 54 3d  WHERE_USE_LIMIT=
360a0 3d 53 46 5f 46 69 78 65 64 4c 69 6d 69 74 20 29  =SF_FixedLimit )
360b0 3b 0a 0a 0a 20 20 20 20 2f 2a 20 42 65 67 69 6e  ;...    /* Begin
360c0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 63   the database sc
360d0 61 6e 2e 20 2a 2f 0a 20 20 20 20 53 45 4c 45 43  an. */.    SELEC
360e0 54 54 52 41 43 45 28 31 2c 70 50 61 72 73 65 2c  TTRACE(1,pParse,
360f0 70 2c 28 22 57 68 65 72 65 42 65 67 69 6e 5c 6e  p,("WhereBegin\n
36100 22 29 29 3b 0a 20 20 20 20 70 57 49 6e 66 6f 20  "));.    pWInfo 
36110 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65  = sqlite3WhereBe
36120 67 69 6e 28 70 50 61 72 73 65 2c 20 70 54 61 62  gin(pParse, pTab
36130 4c 69 73 74 2c 20 70 57 68 65 72 65 2c 20 73 53  List, pWhere, sS
36140 6f 72 74 2e 70 4f 72 64 65 72 42 79 2c 0a 20 20  ort.pOrderBy,.  
36150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36160 20 20 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e               p->
36170 70 45 4c 69 73 74 2c 20 77 63 74 72 6c 46 6c 61  pEList, wctrlFla
36180 67 73 2c 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f  gs, p->nSelectRo
36190 77 29 3b 0a 20 20 20 20 69 66 28 20 70 57 49 6e  w);.    if( pWIn
361a0 66 6f 3d 3d 30 20 29 20 67 6f 74 6f 20 73 65 6c  fo==0 ) goto sel
361b0 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 69 66 28  ect_end;.    if(
361c0 20 73 71 6c 69 74 65 33 57 68 65 72 65 4f 75 74   sqlite3WhereOut
361d0 70 75 74 52 6f 77 43 6f 75 6e 74 28 70 57 49 6e  putRowCount(pWIn
361e0 66 6f 29 20 3c 20 70 2d 3e 6e 53 65 6c 65 63 74  fo) < p->nSelect
361f0 52 6f 77 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e  Row ){.      p->
36200 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 73 71 6c  nSelectRow = sql
36210 69 74 65 33 57 68 65 72 65 4f 75 74 70 75 74 52  ite3WhereOutputR
36220 6f 77 43 6f 75 6e 74 28 70 57 49 6e 66 6f 29 3b  owCount(pWInfo);
36230 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73  .    }.    if( s
36240 44 69 73 74 69 6e 63 74 2e 69 73 54 6e 63 74 20  Distinct.isTnct 
36250 26 26 20 73 71 6c 69 74 65 33 57 68 65 72 65 49  && sqlite3WhereI
36260 73 44 69 73 74 69 6e 63 74 28 70 57 49 6e 66 6f  sDistinct(pWInfo
36270 29 20 29 7b 0a 20 20 20 20 20 20 73 44 69 73 74  ) ){.      sDist
36280 69 6e 63 74 2e 65 54 6e 63 74 54 79 70 65 20 3d  inct.eTnctType =
36290 20 73 71 6c 69 74 65 33 57 68 65 72 65 49 73 44   sqlite3WhereIsD
362a0 69 73 74 69 6e 63 74 28 70 57 49 6e 66 6f 29 3b  istinct(pWInfo);
362b0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73  .    }.    if( s
362c0 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 20 29 7b  Sort.pOrderBy ){
362d0 0a 20 20 20 20 20 20 73 53 6f 72 74 2e 6e 4f 42  .      sSort.nOB
362e0 53 61 74 20 3d 20 73 71 6c 69 74 65 33 57 68 65  Sat = sqlite3Whe
362f0 72 65 49 73 4f 72 64 65 72 65 64 28 70 57 49 6e  reIsOrdered(pWIn
36300 66 6f 29 3b 0a 20 20 20 20 20 20 73 53 6f 72 74  fo);.      sSort
36310 2e 6c 61 62 65 6c 4f 42 4c 6f 70 74 20 3d 20 73  .labelOBLopt = s
36320 71 6c 69 74 65 33 57 68 65 72 65 4f 72 64 65 72  qlite3WhereOrder
36330 42 79 4c 69 6d 69 74 4f 70 74 4c 61 62 65 6c 28  ByLimitOptLabel(
36340 70 57 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 69  pWInfo);.      i
36350 66 28 20 73 53 6f 72 74 2e 6e 4f 42 53 61 74 3d  f( sSort.nOBSat=
36360 3d 73 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 2d  =sSort.pOrderBy-
36370 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20  >nExpr ){.      
36380 20 20 73 53 6f 72 74 2e 70 4f 72 64 65 72 42 79    sSort.pOrderBy
36390 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 0;.      }.  
363a0 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 73    }..    /* If s
363b0 6f 72 74 69 6e 67 20 69 6e 64 65 78 20 74 68 61  orting index tha
363c0 74 20 77 61 73 20 63 72 65 61 74 65 64 20 62 79  t was created by
363d0 20 61 20 70 72 69 6f 72 20 4f 50 5f 4f 70 65 6e   a prior OP_Open
363e0 45 70 68 65 6d 65 72 61 6c 20 0a 20 20 20 20 2a  Ephemeral .    *
363f0 2a 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 65 6e  * instruction en
36400 64 65 64 20 75 70 20 6e 6f 74 20 62 65 69 6e 67  ded up not being
36410 20 6e 65 65 64 65 64 2c 20 74 68 65 6e 20 63 68   needed, then ch
36420 61 6e 67 65 20 74 68 65 20 4f 50 5f 4f 70 65 6e  ange the OP_Open
36430 45 70 68 65 6d 65 72 61 6c 0a 20 20 20 20 2a 2a  Ephemeral.    **
36440 20 69 6e 74 6f 20 61 6e 20 4f 50 5f 4e 6f 6f 70   into an OP_Noop
36450 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
36460 20 73 53 6f 72 74 2e 61 64 64 72 53 6f 72 74 49   sSort.addrSortI
36470 6e 64 65 78 3e 3d 30 20 26 26 20 73 53 6f 72 74  ndex>=0 && sSort
36480 2e 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 7b 0a  .pOrderBy==0 ){.
36490 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
364a0 65 43 68 61 6e 67 65 54 6f 4e 6f 6f 70 28 76 2c  eChangeToNoop(v,
364b0 20 73 53 6f 72 74 2e 61 64 64 72 53 6f 72 74 49   sSort.addrSortI
364c0 6e 64 65 78 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  ndex);.    }..  
364d0 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c    assert( p->pEL
364e0 69 73 74 3d 3d 70 45 4c 69 73 74 20 29 3b 0a 23  ist==pEList );.#
364f0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
36500 49 54 5f 57 49 4e 44 4f 57 46 55 4e 43 0a 20 20  IT_WINDOWFUNC.  
36510 20 20 69 66 28 20 70 57 69 6e 20 29 7b 0a 20 20    if( pWin ){.  
36520 20 20 20 20 69 6e 74 20 61 64 64 72 47 6f 73 75      int addrGosu
36530 62 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  b = sqlite3VdbeM
36540 61 6b 65 4c 61 62 65 6c 28 70 50 61 72 73 65 29  akeLabel(pParse)
36550 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6e  ;.      int iCon
36560 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  t = sqlite3VdbeM
36570 61 6b 65 4c 61 62 65 6c 28 70 50 61 72 73 65 29  akeLabel(pParse)
36580 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 42 72 65  ;.      int iBre
36590 61 6b 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  ak = sqlite3Vdbe
365a0 4d 61 6b 65 4c 61 62 65 6c 28 70 50 61 72 73 65  MakeLabel(pParse
365b0 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 72 65 67  );.      int reg
365c0 47 6f 73 75 62 20 3d 20 2b 2b 70 50 61 72 73 65  Gosub = ++pParse
365d0 2d 3e 6e 4d 65 6d 3b 0a 0a 20 20 20 20 20 20 73  ->nMem;..      s
365e0 71 6c 69 74 65 33 57 69 6e 64 6f 77 43 6f 64 65  qlite3WindowCode
365f0 53 74 65 70 28 70 50 61 72 73 65 2c 20 70 2c 20  Step(pParse, p, 
36600 70 57 49 6e 66 6f 2c 20 72 65 67 47 6f 73 75 62  pWInfo, regGosub
36610 2c 20 61 64 64 72 47 6f 73 75 62 29 3b 0a 0a 20  , addrGosub);.. 
36620 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
36630 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74  AddOp2(v, OP_Got
36640 6f 2c 20 30 2c 20 69 42 72 65 61 6b 29 3b 0a 20  o, 0, iBreak);. 
36650 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
36660 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
36670 61 64 64 72 47 6f 73 75 62 29 3b 0a 20 20 20 20  addrGosub);.    
36680 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e    VdbeNoopCommen
36690 74 28 28 76 2c 20 22 69 6e 6e 65 72 2d 6c 6f 6f  t((v, "inner-loo
366a0 70 20 73 75 62 72 6f 75 74 69 6e 65 22 29 29 3b  p subroutine"));
366b0 0a 20 20 20 20 20 20 73 53 6f 72 74 2e 6c 61 62  .      sSort.lab
366c0 65 6c 4f 42 4c 6f 70 74 20 3d 20 30 3b 0a 20 20  elOBLopt = 0;.  
366d0 20 20 20 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c      selectInnerL
366e0 6f 6f 70 28 70 50 61 72 73 65 2c 20 70 2c 20 2d  oop(pParse, p, -
366f0 31 2c 20 26 73 53 6f 72 74 2c 20 26 73 44 69 73  1, &sSort, &sDis
36700 74 69 6e 63 74 2c 20 70 44 65 73 74 2c 20 69 43  tinct, pDest, iC
36710 6f 6e 74 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20  ont, iBreak);.  
36720 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52      sqlite3VdbeR
36730 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69  esolveLabel(v, i
36740 43 6f 6e 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  Cont);.      sql
36750 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
36760 2c 20 4f 50 5f 52 65 74 75 72 6e 2c 20 72 65 67  , OP_Return, reg
36770 47 6f 73 75 62 29 3b 0a 20 20 20 20 20 20 56 64  Gosub);.      Vd
36780 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 65  beComment((v, "e
36790 6e 64 20 69 6e 6e 65 72 2d 6c 6f 6f 70 20 73 75  nd inner-loop su
367a0 62 72 6f 75 74 69 6e 65 22 29 29 3b 0a 20 20 20  broutine"));.   
367b0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
367c0 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69 42  solveLabel(v, iB
367d0 72 65 61 6b 29 3b 0a 20 20 20 20 7d 65 6c 73 65  reak);.    }else
367e0 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
367f0 45 5f 4f 4d 49 54 5f 57 49 4e 44 4f 57 46 55 4e  E_OMIT_WINDOWFUN
36800 43 20 2a 2f 0a 20 20 20 20 7b 0a 20 20 20 20 20  C */.    {.     
36810 20 2f 2a 20 55 73 65 20 74 68 65 20 73 74 61 6e   /* Use the stan
36820 64 61 72 64 20 69 6e 6e 65 72 20 6c 6f 6f 70 2e  dard inner loop.
36830 20 2a 2f 0a 20 20 20 20 20 20 73 65 6c 65 63 74   */.      select
36840 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73 65  InnerLoop(pParse
36850 2c 20 70 2c 20 2d 31 2c 20 26 73 53 6f 72 74 2c  , p, -1, &sSort,
36860 20 26 73 44 69 73 74 69 6e 63 74 2c 20 70 44 65   &sDistinct, pDe
36870 73 74 2c 0a 20 20 20 20 20 20 20 20 20 20 73 71  st,.          sq
36880 6c 69 74 65 33 57 68 65 72 65 43 6f 6e 74 69 6e  lite3WhereContin
36890 75 65 4c 61 62 65 6c 28 70 57 49 6e 66 6f 29 2c  ueLabel(pWInfo),
368a0 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
368b0 65 33 57 68 65 72 65 42 72 65 61 6b 4c 61 62 65  e3WhereBreakLabe
368c0 6c 28 70 57 49 6e 66 6f 29 29 3b 0a 0a 20 20 20  l(pWInfo));..   
368d0 20 20 20 2f 2a 20 45 6e 64 20 74 68 65 20 64 61     /* End the da
368e0 74 61 62 61 73 65 20 73 63 61 6e 20 6c 6f 6f 70  tabase scan loop
368f0 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
36900 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64   sqlite3WhereEnd
36910 28 70 57 49 6e 66 6f 29 3b 0a 20 20 20 20 7d 0a  (pWInfo);.    }.
36920 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
36930 54 68 69 73 20 63 61 73 65 20 77 68 65 6e 20 74  This case when t
36940 68 65 72 65 20 65 78 69 73 74 20 61 67 67 72 65  here exist aggre
36950 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 20 6f  gate functions o
36960 72 20 61 20 47 52 4f 55 50 20 42 59 20 63 6c 61  r a GROUP BY cla
36970 75 73 65 0a 20 20 20 20 2a 2a 20 6f 72 20 62 6f  use.    ** or bo
36980 74 68 20 2a 2f 0a 20 20 20 20 4e 61 6d 65 43 6f  th */.    NameCo
36990 6e 74 65 78 74 20 73 4e 43 3b 20 20 20 20 2f 2a  ntext sNC;    /*
369a0 20 4e 61 6d 65 20 63 6f 6e 74 65 78 74 20 66 6f   Name context fo
369b0 72 20 70 72 6f 63 65 73 73 69 6e 67 20 61 67 67  r processing agg
369c0 72 65 67 61 74 65 20 69 6e 66 6f 72 6d 61 74 69  regate informati
369d0 6f 6e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 41  on */.    int iA
369e0 4d 65 6d 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  Mem;          /*
369f0 20 46 69 72 73 74 20 4d 65 6d 20 61 64 64 72 65   First Mem addre
36a00 73 73 20 66 6f 72 20 73 74 6f 72 69 6e 67 20 63  ss for storing c
36a10 75 72 72 65 6e 74 20 47 52 4f 55 50 20 42 59 20  urrent GROUP BY 
36a20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 42 4d 65 6d  */.    int iBMem
36a30 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69  ;          /* Fi
36a40 72 73 74 20 4d 65 6d 20 61 64 64 72 65 73 73 20  rst Mem address 
36a50 66 6f 72 20 70 72 65 76 69 6f 75 73 20 47 52 4f  for previous GRO
36a60 55 50 20 42 59 20 2a 2f 0a 20 20 20 20 69 6e 74  UP BY */.    int
36a70 20 69 55 73 65 46 6c 61 67 3b 20 20 20 20 20 20   iUseFlag;      
36a80 20 2f 2a 20 4d 65 6d 20 61 64 64 72 65 73 73 20   /* Mem address 
36a90 68 6f 6c 64 69 6e 67 20 66 6c 61 67 20 69 6e 64  holding flag ind
36aa0 69 63 61 74 69 6e 67 20 74 68 61 74 20 61 74 20  icating that at 
36ab0 6c 65 61 73 74 0a 20 20 20 20 20 20 20 20 20 20  least.          
36ac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a                **
36ad0 20 6f 6e 65 20 72 6f 77 20 6f 66 20 74 68 65 20   one row of the 
36ae0 69 6e 70 75 74 20 74 6f 20 74 68 65 20 61 67 67  input to the agg
36af0 72 65 67 61 74 6f 72 20 68 61 73 20 62 65 65 6e  regator has been
36b00 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
36b10 20 20 20 20 20 20 20 20 20 2a 2a 20 70 72 6f 63           ** proc
36b20 65 73 73 65 64 20 2a 2f 0a 20 20 20 20 69 6e 74  essed */.    int
36b30 20 69 41 62 6f 72 74 46 6c 61 67 3b 20 20 20 20   iAbortFlag;    
36b40 20 2f 2a 20 4d 65 6d 20 61 64 64 72 65 73 73 20   /* Mem address 
36b50 77 68 69 63 68 20 63 61 75 73 65 73 20 71 75 65  which causes que
36b60 72 79 20 61 62 6f 72 74 20 69 66 20 70 6f 73 69  ry abort if posi
36b70 74 69 76 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20  tive */.    int 
36b80 67 72 6f 75 70 42 79 53 6f 72 74 3b 20 20 20 20  groupBySort;    
36b90 2f 2a 20 52 6f 77 73 20 63 6f 6d 65 20 66 72 6f  /* Rows come fro
36ba0 6d 20 73 6f 75 72 63 65 20 69 6e 20 47 52 4f 55  m source in GROU
36bb0 50 20 42 59 20 6f 72 64 65 72 20 2a 2f 0a 20 20  P BY order */.  
36bc0 20 20 69 6e 74 20 61 64 64 72 45 6e 64 3b 20 20    int addrEnd;  
36bd0 20 20 20 20 20 20 2f 2a 20 45 6e 64 20 6f 66 20        /* End of 
36be0 70 72 6f 63 65 73 73 69 6e 67 20 66 6f 72 20 74  processing for t
36bf0 68 69 73 20 53 45 4c 45 43 54 20 2a 2f 0a 20 20  his SELECT */.  
36c00 20 20 69 6e 74 20 73 6f 72 74 50 54 61 62 20 3d    int sortPTab =
36c10 20 30 3b 20 20 20 2f 2a 20 50 73 65 75 64 6f 74   0;   /* Pseudot
36c20 61 62 6c 65 20 75 73 65 64 20 74 6f 20 64 65 63  able used to dec
36c30 6f 64 65 20 73 6f 72 74 69 6e 67 20 72 65 73 75  ode sorting resu
36c40 6c 74 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20 73  lts */.    int s
36c50 6f 72 74 4f 75 74 20 3d 20 30 3b 20 20 20 20 2f  ortOut = 0;    /
36c60 2a 20 4f 75 74 70 75 74 20 72 65 67 69 73 74 65  * Output registe
36c70 72 20 66 72 6f 6d 20 74 68 65 20 73 6f 72 74 65  r from the sorte
36c80 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6f 72 64  r */.    int ord
36c90 65 72 42 79 47 72 70 20 3d 20 30 3b 20 2f 2a 20  erByGrp = 0; /* 
36ca0 54 72 75 65 20 69 66 20 74 68 65 20 47 52 4f 55  True if the GROU
36cb0 50 20 42 59 20 61 6e 64 20 4f 52 44 45 52 20 42  P BY and ORDER B
36cc0 59 20 61 72 65 20 74 68 65 20 73 61 6d 65 20 2a  Y are the same *
36cd0 2f 0a 0a 20 20 20 20 2f 2a 20 52 65 6d 6f 76 65  /..    /* Remove
36ce0 20 61 6e 79 20 61 6e 64 20 61 6c 6c 20 61 6c 69   any and all ali
36cf0 61 73 65 73 20 62 65 74 77 65 65 6e 20 74 68 65  ases between the
36d00 20 72 65 73 75 6c 74 20 73 65 74 20 61 6e 64 20   result set and 
36d10 74 68 65 0a 20 20 20 20 2a 2a 20 47 52 4f 55 50  the.    ** GROUP
36d20 20 42 59 20 63 6c 61 75 73 65 2e 0a 20 20 20 20   BY clause..    
36d30 2a 2f 0a 20 20 20 20 69 66 28 20 70 47 72 6f 75  */.    if( pGrou
36d40 70 42 79 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  pBy ){.      int
36d50 20 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   k;             
36d60 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
36d70 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  op counter */.  
36d80 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c      struct ExprL
36d90 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b  ist_item *pItem;
36da0 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67    /* For looping
36db0 20 6f 76 65 72 20 65 78 70 72 65 73 73 69 6f 6e   over expression
36dc0 20 69 6e 20 61 20 6c 69 73 74 20 2a 2f 0a 0a 20   in a list */.. 
36dd0 20 20 20 20 20 66 6f 72 28 6b 3d 70 2d 3e 70 45       for(k=p->pE
36de0 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 20 70 49 74  List->nExpr, pIt
36df0 65 6d 3d 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 3b  em=p->pEList->a;
36e00 20 6b 3e 30 3b 20 6b 2d 2d 2c 20 70 49 74 65 6d   k>0; k--, pItem
36e10 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 70 49 74  ++){.        pIt
36e20 65 6d 2d 3e 75 2e 78 2e 69 41 6c 69 61 73 20 3d  em->u.x.iAlias =
36e30 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
36e40 20 20 66 6f 72 28 6b 3d 70 47 72 6f 75 70 42 79    for(k=pGroupBy
36e50 2d 3e 6e 45 78 70 72 2c 20 70 49 74 65 6d 3d 70  ->nExpr, pItem=p
36e60 47 72 6f 75 70 42 79 2d 3e 61 3b 20 6b 3e 30 3b  GroupBy->a; k>0;
36e70 20 6b 2d 2d 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a   k--, pItem++){.
36e80 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 75          pItem->u
36e90 2e 78 2e 69 41 6c 69 61 73 20 3d 20 30 3b 0a 20  .x.iAlias = 0;. 
36ea0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73       }.      ass
36eb0 65 72 74 28 20 36 36 3d 3d 73 71 6c 69 74 65 33  ert( 66==sqlite3
36ec0 4c 6f 67 45 73 74 28 31 30 30 29 20 29 3b 0a 20  LogEst(100) );. 
36ed0 20 20 20 20 20 69 66 28 20 70 2d 3e 6e 53 65 6c       if( p->nSel
36ee0 65 63 74 52 6f 77 3e 36 36 20 29 20 70 2d 3e 6e  ectRow>66 ) p->n
36ef0 53 65 6c 65 63 74 52 6f 77 20 3d 20 36 36 3b 0a  SelectRow = 66;.
36f00 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
36f10 20 61 73 73 65 72 74 28 20 30 3d 3d 73 71 6c 69   assert( 0==sqli
36f20 74 65 33 4c 6f 67 45 73 74 28 31 29 20 29 3b 0a  te3LogEst(1) );.
36f30 20 20 20 20 20 20 70 2d 3e 6e 53 65 6c 65 63 74        p->nSelect
36f40 52 6f 77 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a  Row = 0;.    }..
36f50 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20      /* If there 
36f60 69 73 20 62 6f 74 68 20 61 20 47 52 4f 55 50 20  is both a GROUP 
36f70 42 59 20 61 6e 64 20 61 6e 20 4f 52 44 45 52 20  BY and an ORDER 
36f80 42 59 20 63 6c 61 75 73 65 20 61 6e 64 20 74 68  BY clause and th
36f90 65 79 20 61 72 65 0a 20 20 20 20 2a 2a 20 69 64  ey are.    ** id
36fa0 65 6e 74 69 63 61 6c 2c 20 74 68 65 6e 20 69 74  entical, then it
36fb0 20 6d 61 79 20 62 65 20 70 6f 73 73 69 62 6c 65   may be possible
36fc0 20 74 6f 20 64 69 73 61 62 6c 65 20 74 68 65 20   to disable the 
36fd0 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
36fe0 0a 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20 67  .    ** on the g
36ff0 72 6f 75 6e 64 73 20 74 68 61 74 20 74 68 65 20  rounds that the 
37000 47 52 4f 55 50 20 42 59 20 77 69 6c 6c 20 63 61  GROUP BY will ca
37010 75 73 65 20 65 6c 65 6d 65 6e 74 73 20 74 6f 20  use elements to 
37020 63 6f 6d 65 20 6f 75 74 20 0a 20 20 20 20 2a 2a  come out .    **
37030 20 69 6e 20 74 68 65 20 63 6f 72 72 65 63 74 20   in the correct 
37040 6f 72 64 65 72 2e 20 49 74 20 61 6c 73 6f 20 6d  order. It also m
37050 61 79 20 6e 6f 74 20 2d 20 74 68 65 20 47 52 4f  ay not - the GRO
37060 55 50 20 42 59 20 6d 69 67 68 74 20 75 73 65 20  UP BY might use 
37070 61 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73  a.    ** databas
37080 65 20 69 6e 64 65 78 20 74 68 61 74 20 63 61 75  e index that cau
37090 73 65 73 20 72 6f 77 73 20 74 6f 20 62 65 20 67  ses rows to be g
370a0 72 6f 75 70 65 64 20 74 6f 67 65 74 68 65 72 20  rouped together 
370b0 61 73 20 72 65 71 75 69 72 65 64 0a 20 20 20 20  as required.    
370c0 2a 2a 20 62 75 74 20 6e 6f 74 20 61 63 74 75 61  ** but not actua
370d0 6c 6c 79 20 73 6f 72 74 65 64 2e 20 45 69 74 68  lly sorted. Eith
370e0 65 72 20 77 61 79 2c 20 72 65 63 6f 72 64 20 74  er way, record t
370f0 68 65 20 66 61 63 74 20 74 68 61 74 20 74 68 65  he fact that the
37100 0a 20 20 20 20 2a 2a 20 4f 52 44 45 52 20 42 59  .    ** ORDER BY
37110 20 61 6e 64 20 47 52 4f 55 50 20 42 59 20 63 6c   and GROUP BY cl
37120 61 75 73 65 73 20 61 72 65 20 74 68 65 20 73 61  auses are the sa
37130 6d 65 20 62 79 20 73 65 74 74 69 6e 67 20 74 68  me by setting th
37140 65 20 6f 72 64 65 72 42 79 47 72 70 0a 20 20 20  e orderByGrp.   
37150 20 2a 2a 20 76 61 72 69 61 62 6c 65 2e 20 20 2a   ** variable.  *
37160 2f 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  /.    if( sqlite
37170 33 45 78 70 72 4c 69 73 74 43 6f 6d 70 61 72 65  3ExprListCompare
37180 28 70 47 72 6f 75 70 42 79 2c 20 73 53 6f 72 74  (pGroupBy, sSort
37190 2e 70 4f 72 64 65 72 42 79 2c 20 2d 31 29 3d 3d  .pOrderBy, -1)==
371a0 30 20 29 7b 0a 20 20 20 20 20 20 6f 72 64 65 72  0 ){.      order
371b0 42 79 47 72 70 20 3d 20 31 3b 0a 20 20 20 20 7d  ByGrp = 1;.    }
371c0 0a 20 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65  . .    /* Create
371d0 20 61 20 6c 61 62 65 6c 20 74 6f 20 6a 75 6d 70   a label to jump
371e0 20 74 6f 20 77 68 65 6e 20 77 65 20 77 61 6e 74   to when we want
371f0 20 74 6f 20 61 62 6f 72 74 20 74 68 65 20 71 75   to abort the qu
37200 65 72 79 20 2a 2f 0a 20 20 20 20 61 64 64 72 45  ery */.    addrE
37210 6e 64 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  nd = sqlite3Vdbe
37220 4d 61 6b 65 4c 61 62 65 6c 28 70 50 61 72 73 65  MakeLabel(pParse
37230 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 6f 6e 76 65  );..    /* Conve
37240 72 74 20 54 4b 5f 43 4f 4c 55 4d 4e 20 6e 6f 64  rt TK_COLUMN nod
37250 65 73 20 69 6e 74 6f 20 54 4b 5f 41 47 47 5f 43  es into TK_AGG_C
37260 4f 4c 55 4d 4e 20 61 6e 64 20 6d 61 6b 65 20 65  OLUMN and make e
37270 6e 74 72 69 65 73 20 69 6e 0a 20 20 20 20 2a 2a  ntries in.    **
37280 20 73 41 67 67 49 6e 66 6f 20 66 6f 72 20 61 6c   sAggInfo for al
37290 6c 20 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f  l TK_AGG_FUNCTIO
372a0 4e 20 6e 6f 64 65 73 20 69 6e 20 65 78 70 72 65  N nodes in expre
372b0 73 73 69 6f 6e 73 20 6f 66 20 74 68 65 0a 20 20  ssions of the.  
372c0 20 20 2a 2a 20 53 45 4c 45 43 54 20 73 74 61 74    ** SELECT stat
372d0 65 6d 65 6e 74 2e 0a 20 20 20 20 2a 2f 0a 20 20  ement..    */.  
372e0 20 20 6d 65 6d 73 65 74 28 26 73 4e 43 2c 20 30    memset(&sNC, 0
372f0 2c 20 73 69 7a 65 6f 66 28 73 4e 43 29 29 3b 0a  , sizeof(sNC));.
37300 20 20 20 20 73 4e 43 2e 70 50 61 72 73 65 20 3d      sNC.pParse =
37310 20 70 50 61 72 73 65 3b 0a 20 20 20 20 73 4e 43   pParse;.    sNC
37320 2e 70 53 72 63 4c 69 73 74 20 3d 20 70 54 61 62  .pSrcList = pTab
37330 4c 69 73 74 3b 0a 20 20 20 20 73 4e 43 2e 75 4e  List;.    sNC.uN
37340 43 2e 70 41 67 67 49 6e 66 6f 20 3d 20 26 73 41  C.pAggInfo = &sA
37350 67 67 49 6e 66 6f 3b 0a 20 20 20 20 56 56 41 5f  ggInfo;.    VVA_
37360 4f 4e 4c 59 28 20 73 4e 43 2e 6e 63 46 6c 61 67  ONLY( sNC.ncFlag
37370 73 20 3d 20 4e 43 5f 55 41 67 67 49 6e 66 6f 3b  s = NC_UAggInfo;
37380 20 29 0a 20 20 20 20 73 41 67 67 49 6e 66 6f 2e   ).    sAggInfo.
37390 6d 6e 52 65 67 20 3d 20 70 50 61 72 73 65 2d 3e  mnReg = pParse->
373a0 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20 73 41 67 67  nMem+1;.    sAgg
373b0 49 6e 66 6f 2e 6e 53 6f 72 74 69 6e 67 43 6f 6c  Info.nSortingCol
373c0 75 6d 6e 20 3d 20 70 47 72 6f 75 70 42 79 20 3f  umn = pGroupBy ?
373d0 20 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72   pGroupBy->nExpr
373e0 20 3a 20 30 3b 0a 20 20 20 20 73 41 67 67 49 6e   : 0;.    sAggIn
373f0 66 6f 2e 70 47 72 6f 75 70 42 79 20 3d 20 70 47  fo.pGroupBy = pG
37400 72 6f 75 70 42 79 3b 0a 20 20 20 20 73 71 6c 69  roupBy;.    sqli
37410 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67  te3ExprAnalyzeAg
37420 67 4c 69 73 74 28 26 73 4e 43 2c 20 70 45 4c 69  gList(&sNC, pELi
37430 73 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  st);.    sqlite3
37440 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 4c 69  ExprAnalyzeAggLi
37450 73 74 28 26 73 4e 43 2c 20 73 53 6f 72 74 2e 70  st(&sNC, sSort.p
37460 4f 72 64 65 72 42 79 29 3b 0a 20 20 20 20 69 66  OrderBy);.    if
37470 28 20 70 48 61 76 69 6e 67 20 29 7b 0a 20 20 20  ( pHaving ){.   
37480 20 20 20 69 66 28 20 70 47 72 6f 75 70 42 79 20     if( pGroupBy 
37490 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ){.        asser
374a0 74 28 20 70 57 68 65 72 65 3d 3d 70 2d 3e 70 57  t( pWhere==p->pW
374b0 68 65 72 65 20 29 3b 0a 20 20 20 20 20 20 20 20  here );.        
374c0 61 73 73 65 72 74 28 20 70 48 61 76 69 6e 67 3d  assert( pHaving=
374d0 3d 70 2d 3e 70 48 61 76 69 6e 67 20 29 3b 0a 20  =p->pHaving );. 
374e0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
374f0 47 72 6f 75 70 42 79 3d 3d 70 2d 3e 70 47 72 6f  GroupBy==p->pGro
37500 75 70 42 79 20 29 3b 0a 20 20 20 20 20 20 20 20  upBy );.        
37510 68 61 76 69 6e 67 54 6f 57 68 65 72 65 28 70 50  havingToWhere(pP
37520 61 72 73 65 2c 20 70 29 3b 0a 20 20 20 20 20 20  arse, p);.      
37530 20 20 70 57 68 65 72 65 20 3d 20 70 2d 3e 70 57    pWhere = p->pW
37540 68 65 72 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20  here;.      }.  
37550 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 41      sqlite3ExprA
37560 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73  nalyzeAggregates
37570 28 26 73 4e 43 2c 20 70 48 61 76 69 6e 67 29 3b  (&sNC, pHaving);
37580 0a 20 20 20 20 7d 0a 20 20 20 20 73 41 67 67 49  .    }.    sAggI
37590 6e 66 6f 2e 6e 41 63 63 75 6d 75 6c 61 74 6f 72  nfo.nAccumulator
375a0 20 3d 20 73 41 67 67 49 6e 66 6f 2e 6e 43 6f 6c   = sAggInfo.nCol
375b0 75 6d 6e 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e  umn;.    if( p->
375c0 70 47 72 6f 75 70 42 79 3d 3d 30 20 26 26 20 70  pGroupBy==0 && p
375d0 2d 3e 70 48 61 76 69 6e 67 3d 3d 30 20 26 26 20  ->pHaving==0 && 
375e0 73 41 67 67 49 6e 66 6f 2e 6e 46 75 6e 63 3d 3d  sAggInfo.nFunc==
375f0 31 20 29 7b 0a 20 20 20 20 20 20 6d 69 6e 4d 61  1 ){.      minMa
37600 78 46 6c 61 67 20 3d 20 6d 69 6e 4d 61 78 51 75  xFlag = minMaxQu
37610 65 72 79 28 64 62 2c 20 73 41 67 67 49 6e 66 6f  ery(db, sAggInfo
37620 2e 61 46 75 6e 63 5b 30 5d 2e 70 45 78 70 72 2c  .aFunc[0].pExpr,
37630 20 26 70 4d 69 6e 4d 61 78 4f 72 64 65 72 42 79   &pMinMaxOrderBy
37640 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
37650 20 20 20 20 6d 69 6e 4d 61 78 46 6c 61 67 20 3d      minMaxFlag =
37660 20 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4e   WHERE_ORDERBY_N
37670 4f 52 4d 41 4c 3b 0a 20 20 20 20 7d 0a 20 20 20  ORMAL;.    }.   
37680 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 41 67 67   for(i=0; i<sAgg
37690 49 6e 66 6f 2e 6e 46 75 6e 63 3b 20 69 2b 2b 29  Info.nFunc; i++)
376a0 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 45  {.      Expr *pE
376b0 78 70 72 20 3d 20 73 41 67 67 49 6e 66 6f 2e 61  xpr = sAggInfo.a
376c0 46 75 6e 63 5b 69 5d 2e 70 45 78 70 72 3b 0a 20  Func[i].pExpr;. 
376d0 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78       assert( !Ex
376e0 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
376f0 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63  xpr, EP_xIsSelec
37700 74 29 20 29 3b 0a 20 20 20 20 20 20 73 4e 43 2e  t) );.      sNC.
37710 6e 63 46 6c 61 67 73 20 7c 3d 20 4e 43 5f 49 6e  ncFlags |= NC_In
37720 41 67 67 46 75 6e 63 3b 0a 20 20 20 20 20 20 73  AggFunc;.      s
37730 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a  qlite3ExprAnalyz
37740 65 41 67 67 4c 69 73 74 28 26 73 4e 43 2c 20 70  eAggList(&sNC, p
37750 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 29 3b 0a  Expr->x.pList);.
37760 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
37770 4d 49 54 5f 57 49 4e 44 4f 57 46 55 4e 43 0a 20  MIT_WINDOWFUNC. 
37780 20 20 20 20 20 61 73 73 65 72 74 28 20 21 49 73       assert( !Is
37790 57 69 6e 64 6f 77 46 75 6e 63 28 70 45 78 70 72  WindowFunc(pExpr
377a0 29 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 45  ) );.      if( E
377b0 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
377c0 45 78 70 72 2c 20 45 50 5f 57 69 6e 46 75 6e 63  Expr, EP_WinFunc
377d0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  ) ){.        sql
377e0 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41  ite3ExprAnalyzeA
377f0 67 67 72 65 67 61 74 65 73 28 26 73 4e 43 2c 20  ggregates(&sNC, 
37800 70 45 78 70 72 2d 3e 79 2e 70 57 69 6e 2d 3e 70  pExpr->y.pWin->p
37810 46 69 6c 74 65 72 29 3b 0a 20 20 20 20 20 20 7d  Filter);.      }
37820 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 73 4e  .#endif.      sN
37830 43 2e 6e 63 46 6c 61 67 73 20 26 3d 20 7e 4e 43  C.ncFlags &= ~NC
37840 5f 49 6e 41 67 67 46 75 6e 63 3b 0a 20 20 20 20  _InAggFunc;.    
37850 7d 0a 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 6d  }.    sAggInfo.m
37860 78 52 65 67 20 3d 20 70 50 61 72 73 65 2d 3e 6e  xReg = pParse->n
37870 4d 65 6d 3b 0a 20 20 20 20 69 66 28 20 64 62 2d  Mem;.    if( db-
37880 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20  >mallocFailed ) 
37890 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b  goto select_end;
378a0 0a 23 69 66 20 53 45 4c 45 43 54 54 52 41 43 45  .#if SELECTTRACE
378b0 5f 45 4e 41 42 4c 45 44 0a 20 20 20 20 69 66 28  _ENABLED.    if(
378c0 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 54 72   sqlite3SelectTr
378d0 61 63 65 20 26 20 30 78 34 30 30 20 29 7b 0a 20  ace & 0x400 ){. 
378e0 20 20 20 20 20 69 6e 74 20 69 69 3b 0a 20 20 20       int ii;.   
378f0 20 20 20 53 45 4c 45 43 54 54 52 41 43 45 28 30     SELECTTRACE(0
37900 78 34 30 30 2c 70 50 61 72 73 65 2c 70 2c 28 22  x400,pParse,p,("
37910 41 66 74 65 72 20 61 67 67 72 65 67 61 74 65 20  After aggregate 
37920 61 6e 61 6c 79 73 69 73 3a 5c 6e 22 29 29 3b 0a  analysis:\n"));.
37930 20 20 20 20 20 20 73 71 6c 69 74 65 33 54 72 65        sqlite3Tre
37940 65 56 69 65 77 53 65 6c 65 63 74 28 30 2c 20 70  eViewSelect(0, p
37950 2c 20 30 29 3b 0a 20 20 20 20 20 20 66 6f 72 28  , 0);.      for(
37960 69 69 3d 30 3b 20 69 69 3c 73 41 67 67 49 6e 66  ii=0; ii<sAggInf
37970 6f 2e 6e 43 6f 6c 75 6d 6e 3b 20 69 69 2b 2b 29  o.nColumn; ii++)
37980 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
37990 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 61 67  3DebugPrintf("ag
379a0 67 2d 63 6f 6c 75 6d 6e 5b 25 64 5d 20 69 4d 65  g-column[%d] iMe
379b0 6d 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20  m=%d\n",.       
379c0 20 20 20 20 20 69 69 2c 20 73 41 67 67 49 6e 66       ii, sAggInf
379d0 6f 2e 61 43 6f 6c 5b 69 69 5d 2e 69 4d 65 6d 29  o.aCol[ii].iMem)
379e0 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
379f0 33 54 72 65 65 56 69 65 77 45 78 70 72 28 30 2c  3TreeViewExpr(0,
37a00 20 73 41 67 67 49 6e 66 6f 2e 61 43 6f 6c 5b 69   sAggInfo.aCol[i
37a10 69 5d 2e 70 45 78 70 72 2c 20 30 29 3b 0a 20 20  i].pExpr, 0);.  
37a20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 6f 72 28      }.      for(
37a30 69 69 3d 30 3b 20 69 69 3c 73 41 67 67 49 6e 66  ii=0; ii<sAggInf
37a40 6f 2e 6e 46 75 6e 63 3b 20 69 69 2b 2b 29 7b 0a  o.nFunc; ii++){.
37a50 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44          sqlite3D
37a60 65 62 75 67 50 72 69 6e 74 66 28 22 61 67 67 2d  ebugPrintf("agg-
37a70 66 75 6e 63 5b 25 64 5d 3a 20 69 4d 65 6d 3d 25  func[%d]: iMem=%
37a80 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  d\n",.          
37a90 20 20 69 69 2c 20 73 41 67 67 49 6e 66 6f 2e 61    ii, sAggInfo.a
37aa0 46 75 6e 63 5b 69 69 5d 2e 69 4d 65 6d 29 3b 0a  Func[ii].iMem);.
37ab0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 54          sqlite3T
37ac0 72 65 65 56 69 65 77 45 78 70 72 28 30 2c 20 73  reeViewExpr(0, s
37ad0 41 67 67 49 6e 66 6f 2e 61 46 75 6e 63 5b 69 69  AggInfo.aFunc[ii
37ae0 5d 2e 70 45 78 70 72 2c 20 30 29 3b 0a 20 20 20  ].pExpr, 0);.   
37af0 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69     }.    }.#endi
37b00 66 0a 0a 0a 20 20 20 20 2f 2a 20 50 72 6f 63 65  f...    /* Proce
37b10 73 73 69 6e 67 20 66 6f 72 20 61 67 67 72 65 67  ssing for aggreg
37b20 61 74 65 73 20 77 69 74 68 20 47 52 4f 55 50 20  ates with GROUP 
37b30 42 59 20 69 73 20 76 65 72 79 20 64 69 66 66 65  BY is very diffe
37b40 72 65 6e 74 20 61 6e 64 0a 20 20 20 20 2a 2a 20  rent and.    ** 
37b50 6d 75 63 68 20 6d 6f 72 65 20 63 6f 6d 70 6c 65  much more comple
37b60 78 20 74 68 61 6e 20 61 67 67 72 65 67 61 74 65  x than aggregate
37b70 73 20 77 69 74 68 6f 75 74 20 61 20 47 52 4f 55  s without a GROU
37b80 50 20 42 59 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  P BY..    */.   
37b90 20 69 66 28 20 70 47 72 6f 75 70 42 79 20 29 7b   if( pGroupBy ){
37ba0 0a 20 20 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a  .      KeyInfo *
37bb0 70 4b 65 79 49 6e 66 6f 3b 20 20 2f 2a 20 4b 65  pKeyInfo;  /* Ke
37bc0 79 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  ying information
37bd0 20 66 6f 72 20 74 68 65 20 67 72 6f 75 70 20 62   for the group b
37be0 79 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20  y clause */.    
37bf0 20 20 69 6e 74 20 61 64 64 72 31 3b 20 20 20 20    int addr1;    
37c00 20 20 20 20 20 20 2f 2a 20 41 2d 76 73 2d 42 20        /* A-vs-B 
37c10 63 6f 6d 70 61 72 69 73 69 6f 6e 20 6a 75 6d 70  comparision jump
37c20 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61 64   */.      int ad
37c30 64 72 4f 75 74 70 75 74 52 6f 77 3b 20 20 2f 2a  drOutputRow;  /*
37c40 20 53 74 61 72 74 20 6f 66 20 73 75 62 72 6f 75   Start of subrou
37c50 74 69 6e 65 20 74 68 61 74 20 6f 75 74 70 75 74  tine that output
37c60 73 20 61 20 72 65 73 75 6c 74 20 72 6f 77 20 2a  s a result row *
37c70 2f 0a 20 20 20 20 20 20 69 6e 74 20 72 65 67 4f  /.      int regO
37c80 75 74 70 75 74 52 6f 77 3b 20 20 20 2f 2a 20 52  utputRow;   /* R
37c90 65 74 75 72 6e 20 61 64 64 72 65 73 73 20 72 65  eturn address re
37ca0 67 69 73 74 65 72 20 66 6f 72 20 6f 75 74 70 75  gister for outpu
37cb0 74 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a  t subroutine */.
37cc0 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 53 65        int addrSe
37cd0 74 41 62 6f 72 74 3b 20 20 20 2f 2a 20 53 65 74  tAbort;   /* Set
37ce0 20 74 68 65 20 61 62 6f 72 74 20 66 6c 61 67 20   the abort flag 
37cf0 61 6e 64 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20  and return */.  
37d00 20 20 20 20 69 6e 74 20 61 64 64 72 54 6f 70 4f      int addrTopO
37d10 66 4c 6f 6f 70 3b 20 20 2f 2a 20 54 6f 70 20 6f  fLoop;  /* Top o
37d20 66 20 74 68 65 20 69 6e 70 75 74 20 6c 6f 6f 70  f the input loop
37d30 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61 64   */.      int ad
37d40 64 72 53 6f 72 74 69 6e 67 49 64 78 3b 20 2f 2a  drSortingIdx; /*
37d50 20 54 68 65 20 4f 50 5f 4f 70 65 6e 45 70 68 65   The OP_OpenEphe
37d60 6d 65 72 61 6c 20 66 6f 72 20 74 68 65 20 73 6f  meral for the so
37d70 72 74 69 6e 67 20 69 6e 64 65 78 20 2a 2f 0a 20  rting index */. 
37d80 20 20 20 20 20 69 6e 74 20 61 64 64 72 52 65 73       int addrRes
37d90 65 74 3b 20 20 20 20 20 20 2f 2a 20 53 75 62 72  et;      /* Subr
37da0 6f 75 74 69 6e 65 20 66 6f 72 20 72 65 73 65 74  outine for reset
37db0 74 69 6e 67 20 74 68 65 20 61 63 63 75 6d 75 6c  ting the accumul
37dc0 61 74 6f 72 20 2a 2f 0a 20 20 20 20 20 20 69 6e  ator */.      in
37dd0 74 20 72 65 67 52 65 73 65 74 3b 20 20 20 20 20  t regReset;     
37de0 20 20 2f 2a 20 52 65 74 75 72 6e 20 61 64 64 72    /* Return addr
37df0 65 73 73 20 72 65 67 69 73 74 65 72 20 66 6f 72  ess register for
37e00 20 72 65 73 65 74 20 73 75 62 72 6f 75 74 69 6e   reset subroutin
37e10 65 20 2a 2f 0a 0a 20 20 20 20 20 20 2f 2a 20 49  e */..      /* I
37e20 66 20 74 68 65 72 65 20 69 73 20 61 20 47 52 4f  f there is a GRO
37e30 55 50 20 42 59 20 63 6c 61 75 73 65 20 77 65 20  UP BY clause we 
37e40 6d 69 67 68 74 20 6e 65 65 64 20 61 20 73 6f 72  might need a sor
37e50 74 69 6e 67 20 69 6e 64 65 78 20 74 6f 0a 20 20  ting index to.  
37e60 20 20 20 20 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74      ** implement
37e70 20 69 74 2e 20 20 41 6c 6c 6f 63 61 74 65 20 74   it.  Allocate t
37e80 68 61 74 20 73 6f 72 74 69 6e 67 20 69 6e 64 65  hat sorting inde
37e90 78 20 6e 6f 77 2e 20 20 49 66 20 69 74 20 74 75  x now.  If it tu
37ea0 72 6e 73 20 6f 75 74 0a 20 20 20 20 20 20 2a 2a  rns out.      **
37eb0 20 74 68 61 74 20 77 65 20 64 6f 20 6e 6f 74 20   that we do not 
37ec0 6e 65 65 64 20 69 74 20 61 66 74 65 72 20 61 6c  need it after al
37ed0 6c 2c 20 74 68 65 20 4f 50 5f 53 6f 72 74 65 72  l, the OP_Sorter
37ee0 4f 70 65 6e 20 69 6e 73 74 72 75 63 74 69 6f 6e  Open instruction
37ef0 0a 20 20 20 20 20 20 2a 2a 20 77 69 6c 6c 20 62  .      ** will b
37f00 65 20 63 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f  e converted into
37f10 20 61 20 4e 6f 6f 70 2e 20 20 0a 20 20 20 20 20   a Noop.  .     
37f20 20 2a 2f 0a 20 20 20 20 20 20 73 41 67 67 49 6e   */.      sAggIn
37f30 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78 20 3d 20  fo.sortingIdx = 
37f40 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a  pParse->nTab++;.
37f50 20 20 20 20 20 20 70 4b 65 79 49 6e 66 6f 20 3d        pKeyInfo =
37f60 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 46   sqlite3KeyInfoF
37f70 72 6f 6d 45 78 70 72 4c 69 73 74 28 70 50 61 72  romExprList(pPar
37f80 73 65 2c 70 47 72 6f 75 70 42 79 2c 30 2c 73 41  se,pGroupBy,0,sA
37f90 67 67 49 6e 66 6f 2e 6e 43 6f 6c 75 6d 6e 29 3b  ggInfo.nColumn);
37fa0 0a 20 20 20 20 20 20 61 64 64 72 53 6f 72 74 69  .      addrSorti
37fb0 6e 67 49 64 78 20 3d 20 73 71 6c 69 74 65 33 56  ngIdx = sqlite3V
37fc0 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
37fd0 53 6f 72 74 65 72 4f 70 65 6e 2c 20 0a 20 20 20  SorterOpen, .   
37fe0 20 20 20 20 20 20 20 73 41 67 67 49 6e 66 6f 2e         sAggInfo.
37ff0 73 6f 72 74 69 6e 67 49 64 78 2c 20 73 41 67 67  sortingIdx, sAgg
38000 49 6e 66 6f 2e 6e 53 6f 72 74 69 6e 67 43 6f 6c  Info.nSortingCol
38010 75 6d 6e 2c 20 0a 20 20 20 20 20 20 20 20 20 20  umn, .          
38020 30 2c 20 28 63 68 61 72 2a 29 70 4b 65 79 49 6e  0, (char*)pKeyIn
38030 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b  fo, P4_KEYINFO);
38040 0a 0a 20 20 20 20 20 20 2f 2a 20 49 6e 69 74 69  ..      /* Initi
38050 61 6c 69 7a 65 20 6d 65 6d 6f 72 79 20 6c 6f 63  alize memory loc
38060 61 74 69 6f 6e 73 20 75 73 65 64 20 62 79 20 47  ations used by G
38070 52 4f 55 50 20 42 59 20 61 67 67 72 65 67 61 74  ROUP BY aggregat
38080 65 20 70 72 6f 63 65 73 73 69 6e 67 0a 20 20 20  e processing.   
38090 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 55 73 65     */.      iUse
380a0 46 6c 61 67 20 3d 20 2b 2b 70 50 61 72 73 65 2d  Flag = ++pParse-
380b0 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 69 41 62  >nMem;.      iAb
380c0 6f 72 74 46 6c 61 67 20 3d 20 2b 2b 70 50 61 72  ortFlag = ++pPar
380d0 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20  se->nMem;.      
380e0 72 65 67 4f 75 74 70 75 74 52 6f 77 20 3d 20 2b  regOutputRow = +
380f0 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
38100 20 20 20 20 20 61 64 64 72 4f 75 74 70 75 74 52       addrOutputR
38110 6f 77 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  ow = sqlite3Vdbe
38120 4d 61 6b 65 4c 61 62 65 6c 28 70 50 61 72 73 65  MakeLabel(pParse
38130 29 3b 0a 20 20 20 20 20 20 72 65 67 52 65 73 65  );.      regRese
38140 74 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  t = ++pParse->nM
38150 65 6d 3b 0a 20 20 20 20 20 20 61 64 64 72 52 65  em;.      addrRe
38160 73 65 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62  set = sqlite3Vdb
38170 65 4d 61 6b 65 4c 61 62 65 6c 28 70 50 61 72 73  eMakeLabel(pPars
38180 65 29 3b 0a 20 20 20 20 20 20 69 41 4d 65 6d 20  e);.      iAMem 
38190 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b  = pParse->nMem +
381a0 20 31 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65   1;.      pParse
381b0 2d 3e 6e 4d 65 6d 20 2b 3d 20 70 47 72 6f 75 70  ->nMem += pGroup
381c0 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20  By->nExpr;.     
381d0 20 69 42 4d 65 6d 20 3d 20 70 50 61 72 73 65 2d   iBMem = pParse-
381e0 3e 6e 4d 65 6d 20 2b 20 31 3b 0a 20 20 20 20 20  >nMem + 1;.     
381f0 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d   pParse->nMem +=
38200 20 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72   pGroupBy->nExpr
38210 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
38220 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
38230 49 6e 74 65 67 65 72 2c 20 30 2c 20 69 41 62 6f  Integer, 0, iAbo
38240 72 74 46 6c 61 67 29 3b 0a 20 20 20 20 20 20 56  rtFlag);.      V
38250 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
38260 63 6c 65 61 72 20 61 62 6f 72 74 20 66 6c 61 67  clear abort flag
38270 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  "));.      sqlit
38280 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
38290 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 69 41 4d 65  OP_Null, 0, iAMe
382a0 6d 2c 20 69 41 4d 65 6d 2b 70 47 72 6f 75 70 42  m, iAMem+pGroupB
382b0 79 2d 3e 6e 45 78 70 72 2d 31 29 3b 0a 0a 20 20  y->nExpr-1);..  
382c0 20 20 20 20 2f 2a 20 42 65 67 69 6e 20 61 20 6c      /* Begin a l
382d0 6f 6f 70 20 74 68 61 74 20 77 69 6c 6c 20 65 78  oop that will ex
382e0 74 72 61 63 74 20 61 6c 6c 20 73 6f 75 72 63 65  tract all source
382f0 20 72 6f 77 73 20 69 6e 20 47 52 4f 55 50 20 42   rows in GROUP B
38300 59 20 6f 72 64 65 72 2e 0a 20 20 20 20 20 20 2a  Y order..      *
38310 2a 20 54 68 69 73 20 6d 69 67 68 74 20 69 6e 76  * This might inv
38320 6f 6c 76 65 20 74 77 6f 20 73 65 70 61 72 61 74  olve two separat
38330 65 20 6c 6f 6f 70 73 20 77 69 74 68 20 61 6e 20  e loops with an 
38340 4f 50 5f 53 6f 72 74 20 69 6e 20 62 65 74 77 65  OP_Sort in be