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

Artifact 5b0ef2a8b392fad19d1c8ceb803ab82a2e5ddf34d7f138cabb0a00d0a4c9d646:


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 61 73 73  List!=0 );.  ass
e6d0: 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d  ert( pExpr->op!=
e6e0: 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 29 3b  TK_AGG_COLUMN );
e6f0: 20 20 2f 2a 20 54 68 69 73 20 72 6f 75 74 69 6e    /* This routin
e700: 65 20 72 75 6e 65 73 20 62 65 66 6f 72 65 20 61  e runes before a
e710: 67 67 72 65 67 61 74 65 73 0a 20 20 20 20 20 20  ggregates.      
e720: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e730: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e740: 20 2a 2a 20 61 72 65 20 70 72 6f 63 65 73 73 65   ** are processe
e750: 64 20 2a 2f 0a 20 20 73 77 69 74 63 68 28 20 70  d */.  switch( p
e760: 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20  Expr->op ){.    
e770: 63 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 20  case TK_COLUMN: 
e780: 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 65  {.      /* The e
e790: 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61 20 63  xpression is a c
e7a0: 6f 6c 75 6d 6e 2e 20 4c 6f 63 61 74 65 20 74 68  olumn. Locate th
e7b0: 65 20 74 61 62 6c 65 20 74 68 65 20 63 6f 6c 75  e table the colu
e7c0: 6d 6e 20 69 73 20 62 65 69 6e 67 0a 20 20 20 20  mn is being.    
e7d0: 20 20 2a 2a 20 65 78 74 72 61 63 74 65 64 20 66    ** extracted f
e7e0: 72 6f 6d 20 69 6e 20 4e 61 6d 65 43 6f 6e 74 65  rom in NameConte
e7f0: 78 74 2e 70 53 72 63 4c 69 73 74 2e 20 54 68 69  xt.pSrcList. Thi
e800: 73 20 74 61 62 6c 65 20 6d 61 79 20 62 65 20 72  s table may be r
e810: 65 61 6c 0a 20 20 20 20 20 20 2a 2a 20 64 61 74  eal.      ** dat
e820: 61 62 61 73 65 20 74 61 62 6c 65 20 6f 72 20 61  abase table or a
e830: 20 73 75 62 71 75 65 72 79 2e 0a 20 20 20 20 20   subquery..     
e840: 20 2a 2f 0a 20 20 20 20 20 20 54 61 62 6c 65 20   */.      Table 
e850: 2a 70 54 61 62 20 3d 20 30 3b 20 20 20 20 20 20  *pTab = 0;      
e860: 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 73        /* Table s
e870: 74 72 75 63 74 75 72 65 20 63 6f 6c 75 6d 6e 20  tructure column 
e880: 69 73 20 65 78 74 72 61 63 74 65 64 20 66 72 6f  is extracted fro
e890: 6d 20 2a 2f 0a 20 20 20 20 20 20 53 65 6c 65 63  m */.      Selec
e8a0: 74 20 2a 70 53 20 3d 20 30 3b 20 20 20 20 20 20  t *pS = 0;      
e8b0: 20 20 20 20 20 20 20 2f 2a 20 53 65 6c 65 63 74         /* Select
e8c0: 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69 73 20 65   the column is e
e8d0: 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20 2a 2f  xtracted from */
e8e0: 0a 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6c 20  .      int iCol 
e8f0: 3d 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  = pExpr->iColumn
e900: 3b 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 63  ;  /* Index of c
e910: 6f 6c 75 6d 6e 20 69 6e 20 70 54 61 62 20 2a 2f  olumn in pTab */
e920: 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 4e  .      while( pN
e930: 43 20 26 26 20 21 70 54 61 62 20 29 7b 0a 20 20  C && !pTab ){.  
e940: 20 20 20 20 20 20 53 72 63 4c 69 73 74 20 2a 70        SrcList *p
e950: 54 61 62 4c 69 73 74 20 3d 20 70 4e 43 2d 3e 70  TabList = pNC->p
e960: 53 72 63 4c 69 73 74 3b 0a 20 20 20 20 20 20 20  SrcList;.       
e970: 20 66 6f 72 28 6a 3d 30 3b 6a 3c 70 54 61 62 4c   for(j=0;j<pTabL
e980: 69 73 74 2d 3e 6e 53 72 63 20 26 26 20 70 54 61  ist->nSrc && pTa
e990: 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 69 43 75 72  bList->a[j].iCur
e9a0: 73 6f 72 21 3d 70 45 78 70 72 2d 3e 69 54 61 62  sor!=pExpr->iTab
e9b0: 6c 65 3b 6a 2b 2b 29 3b 0a 20 20 20 20 20 20 20  le;j++);.       
e9c0: 20 69 66 28 20 6a 3c 70 54 61 62 4c 69 73 74 2d   if( j<pTabList-
e9d0: 3e 6e 53 72 63 20 29 7b 0a 20 20 20 20 20 20 20  >nSrc ){.       
e9e0: 20 20 20 70 54 61 62 20 3d 20 70 54 61 62 4c 69     pTab = pTabLi
e9f0: 73 74 2d 3e 61 5b 6a 5d 2e 70 54 61 62 3b 0a 20  st->a[j].pTab;. 
ea00: 20 20 20 20 20 20 20 20 20 70 53 20 3d 20 70 54           pS = pT
ea10: 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 70 53 65  abList->a[j].pSe
ea20: 6c 65 63 74 3b 0a 20 20 20 20 20 20 20 20 7d 65  lect;.        }e
ea30: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 70  lse{.          p
ea40: 4e 43 20 3d 20 70 4e 43 2d 3e 70 4e 65 78 74 3b  NC = pNC->pNext;
ea50: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
ea60: 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 70 54   }..      if( pT
ea70: 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ab==0 ){.       
ea80: 20 2f 2a 20 41 74 20 6f 6e 65 20 74 69 6d 65 2c   /* At one time,
ea90: 20 63 6f 64 65 20 73 75 63 68 20 61 73 20 22 53   code such as "S
eaa0: 45 4c 45 43 54 20 6e 65 77 2e 78 22 20 77 69 74  ELECT new.x" wit
eab0: 68 69 6e 20 61 20 74 72 69 67 67 65 72 20 77 6f  hin a trigger wo
eac0: 75 6c 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 63  uld.        ** c
ead0: 61 75 73 65 20 74 68 69 73 20 63 6f 6e 64 69 74  ause this condit
eae0: 69 6f 6e 20 74 6f 20 72 75 6e 2e 20 20 53 69 6e  ion to run.  Sin
eaf0: 63 65 20 74 68 65 6e 2c 20 77 65 20 68 61 76 65  ce then, we have
eb00: 20 72 65 73 74 72 75 63 74 75 72 65 64 20 68 6f   restructured ho
eb10: 77 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 72 69  w.        ** tri
eb20: 67 67 65 72 20 63 6f 64 65 20 69 73 20 67 65 6e  gger code is gen
eb30: 65 72 61 74 65 64 20 61 6e 64 20 73 6f 20 74 68  erated and so th
eb40: 69 73 20 63 6f 6e 64 69 74 69 6f 6e 20 69 73 20  is condition is 
eb50: 6e 6f 20 6c 6f 6e 67 65 72 20 0a 20 20 20 20 20  no longer .     
eb60: 20 20 20 2a 2a 20 70 6f 73 73 69 62 6c 65 2e 20     ** possible. 
eb70: 48 6f 77 65 76 65 72 2c 20 69 74 20 63 61 6e 20  However, it can 
eb80: 73 74 69 6c 6c 20 62 65 20 74 72 75 65 20 66 6f  still be true fo
eb90: 72 20 73 74 61 74 65 6d 65 6e 74 73 20 6c 69 6b  r statements lik
eba0: 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65  e.        ** the
ebb0: 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 20 20 20 20   following:.    
ebc0: 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a      **.        *
ebd0: 2a 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45  *   CREATE TABLE
ebe0: 20 74 31 28 63 6f 6c 20 49 4e 54 45 47 45 52 29   t1(col INTEGER)
ebf0: 3b 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 53  ;.        **   S
ec00: 45 4c 45 43 54 20 28 53 45 4c 45 43 54 20 74 31  ELECT (SELECT t1
ec10: 2e 63 6f 6c 29 20 46 52 4f 4d 20 46 52 4f 4d 20  .col) FROM FROM 
ec20: 74 31 3b 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20  t1;.        **. 
ec30: 20 20 20 20 20 20 20 2a 2a 20 77 68 65 6e 20 63         ** when c
ec40: 6f 6c 75 6d 6e 54 79 70 65 28 29 20 69 73 20 63  olumnType() is c
ec50: 61 6c 6c 65 64 20 6f 6e 20 74 68 65 20 65 78 70  alled on the exp
ec60: 72 65 73 73 69 6f 6e 20 22 74 31 2e 63 6f 6c 22  ression "t1.col"
ec70: 20 69 6e 20 74 68 65 20 0a 20 20 20 20 20 20 20   in the .       
ec80: 20 2a 2a 20 73 75 62 2d 73 65 6c 65 63 74 2e 20   ** sub-select. 
ec90: 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20 73 65  In this case, se
eca0: 74 20 74 68 65 20 63 6f 6c 75 6d 6e 20 74 79 70  t the column typ
ecb0: 65 20 74 6f 20 4e 55 4c 4c 2c 20 65 76 65 6e 0a  e to NULL, even.
ecc0: 20 20 20 20 20 20 20 20 2a 2a 20 74 68 6f 75 67          ** thoug
ecd0: 68 20 69 74 20 73 68 6f 75 6c 64 20 72 65 61 6c  h it should real
ece0: 6c 79 20 62 65 20 22 49 4e 54 45 47 45 52 22 2e  ly be "INTEGER".
ecf0: 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  .        **.    
ed00: 20 20 20 20 2a 2a 20 54 68 69 73 20 69 73 20 6e      ** This is n
ed10: 6f 74 20 61 20 70 72 6f 62 6c 65 6d 2c 20 61 73  ot a problem, as
ed20: 20 74 68 65 20 63 6f 6c 75 6d 6e 20 74 79 70 65   the column type
ed30: 20 6f 66 20 22 74 31 2e 63 6f 6c 22 20 69 73 20   of "t1.col" is 
ed40: 6e 65 76 65 72 0a 20 20 20 20 20 20 20 20 2a 2a  never.        **
ed50: 20 75 73 65 64 2e 20 57 68 65 6e 20 63 6f 6c 75   used. When colu
ed60: 6d 6e 54 79 70 65 28 29 20 69 73 20 63 61 6c 6c  mnType() is call
ed70: 65 64 20 6f 6e 20 74 68 65 20 65 78 70 72 65 73  ed on the expres
ed80: 73 69 6f 6e 20 0a 20 20 20 20 20 20 20 20 2a 2a  sion .        **
ed90: 20 22 28 53 45 4c 45 43 54 20 74 31 2e 63 6f 6c   "(SELECT t1.col
eda0: 29 22 2c 20 74 68 65 20 63 6f 72 72 65 63 74 20  )", the correct 
edb0: 74 79 70 65 20 69 73 20 72 65 74 75 72 6e 65 64  type is returned
edc0: 20 28 73 65 65 20 74 68 65 20 54 4b 5f 53 45 4c   (see the TK_SEL
edd0: 45 43 54 0a 20 20 20 20 20 20 20 20 2a 2a 20 62  ECT.        ** b
ede0: 72 61 6e 63 68 20 62 65 6c 6f 77 2e 20 20 2a 2f  ranch below.  */
edf0: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
ee00: 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 61        }..      a
ee10: 73 73 65 72 74 28 20 70 54 61 62 20 26 26 20 70  ssert( pTab && p
ee20: 45 78 70 72 2d 3e 79 2e 70 54 61 62 3d 3d 70 54  Expr->y.pTab==pT
ee30: 61 62 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ab );.      if( 
ee40: 70 53 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  pS ){.        /*
ee50: 20 54 68 65 20 22 74 61 62 6c 65 22 20 69 73 20   The "table" is 
ee60: 61 63 74 75 61 6c 6c 79 20 61 20 73 75 62 2d 73  actually a sub-s
ee70: 65 6c 65 63 74 20 6f 72 20 61 20 76 69 65 77 20  elect or a view 
ee80: 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  in the FROM clau
ee90: 73 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 66  se.        ** of
eea0: 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74   the SELECT stat
eeb0: 65 6d 65 6e 74 2e 20 52 65 74 75 72 6e 20 74 68  ement. Return th
eec0: 65 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 74 79  e declaration ty
eed0: 70 65 20 61 6e 64 20 6f 72 69 67 69 6e 0a 20 20  pe and origin.  
eee0: 20 20 20 20 20 20 2a 2a 20 64 61 74 61 20 66 6f        ** data fo
eef0: 72 20 74 68 65 20 72 65 73 75 6c 74 2d 73 65 74  r the result-set
ef00: 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 73   column of the s
ef10: 75 62 2d 73 65 6c 65 63 74 2e 0a 20 20 20 20 20  ub-select..     
ef20: 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66     */.        if
ef30: 28 20 69 43 6f 6c 3e 3d 30 20 26 26 20 69 43 6f  ( iCol>=0 && iCo
ef40: 6c 3c 70 53 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45  l<pS->pEList->nE
ef50: 78 70 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20  xpr ){.         
ef60: 20 2f 2a 20 49 66 20 69 43 6f 6c 20 69 73 20 6c   /* If iCol is l
ef70: 65 73 73 20 74 68 61 6e 20 7a 65 72 6f 2c 20 74  ess than zero, t
ef80: 68 65 6e 20 74 68 65 20 65 78 70 72 65 73 73 69  hen the expressi
ef90: 6f 6e 20 72 65 71 75 65 73 74 73 20 74 68 65 0a  on requests the.
efa0: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 72 6f 77            ** row
efb0: 69 64 20 6f 66 20 74 68 65 20 73 75 62 2d 73 65  id of the sub-se
efc0: 6c 65 63 74 20 6f 72 20 76 69 65 77 2e 20 54 68  lect or view. Th
efd0: 69 73 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  is expression is
efe0: 20 6c 65 67 61 6c 20 28 73 65 65 20 0a 20 20 20   legal (see .   
eff0: 20 20 20 20 20 20 20 2a 2a 20 74 65 73 74 20 63         ** test c
f000: 61 73 65 20 6d 69 73 63 32 2e 32 2e 32 29 20 2d  ase misc2.2.2) -
f010: 20 69 74 20 61 6c 77 61 79 73 20 65 76 61 6c 75   it always evalu
f020: 61 74 65 73 20 74 6f 20 4e 55 4c 4c 2e 0a 20 20  ates to NULL..  
f030: 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
f040: 20 20 20 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74       NameContext
f050: 20 73 4e 43 3b 0a 20 20 20 20 20 20 20 20 20 20   sNC;.          
f060: 45 78 70 72 20 2a 70 20 3d 20 70 53 2d 3e 70 45  Expr *p = pS->pE
f070: 4c 69 73 74 2d 3e 61 5b 69 43 6f 6c 5d 2e 70 45  List->a[iCol].pE
f080: 78 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20 73  xpr;.          s
f090: 4e 43 2e 70 53 72 63 4c 69 73 74 20 3d 20 70 53  NC.pSrcList = pS
f0a0: 2d 3e 70 53 72 63 3b 0a 20 20 20 20 20 20 20 20  ->pSrc;.        
f0b0: 20 20 73 4e 43 2e 70 4e 65 78 74 20 3d 20 70 4e    sNC.pNext = pN
f0c0: 43 3b 0a 20 20 20 20 20 20 20 20 20 20 73 4e 43  C;.          sNC
f0d0: 2e 70 50 61 72 73 65 20 3d 20 70 4e 43 2d 3e 70  .pParse = pNC->p
f0e0: 50 61 72 73 65 3b 0a 20 20 20 20 20 20 20 20 20  Parse;.         
f0f0: 20 7a 54 79 70 65 20 3d 20 63 6f 6c 75 6d 6e 54   zType = columnT
f100: 79 70 65 28 26 73 4e 43 2c 20 70 2c 26 7a 4f 72  ype(&sNC, p,&zOr
f110: 69 67 44 62 2c 26 7a 4f 72 69 67 54 61 62 2c 26  igDb,&zOrigTab,&
f120: 7a 4f 72 69 67 43 6f 6c 29 3b 20 0a 20 20 20 20  zOrigCol); .    
f130: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73      }.      }els
f140: 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 20  e{.        /* A 
f150: 72 65 61 6c 20 74 61 62 6c 65 20 6f 72 20 61 20  real table or a 
f160: 43 54 45 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20  CTE table */.   
f170: 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70 53       assert( !pS
f180: 20 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54   );.#ifdef SQLIT
f190: 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f  E_ENABLE_COLUMN_
f1a0: 4d 45 54 41 44 41 54 41 0a 20 20 20 20 20 20 20  METADATA.       
f1b0: 20 69 66 28 20 69 43 6f 6c 3c 30 20 29 20 69 43   if( iCol<0 ) iC
f1c0: 6f 6c 20 3d 20 70 54 61 62 2d 3e 69 50 4b 65 79  ol = pTab->iPKey
f1d0: 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
f1e0: 28 20 69 43 6f 6c 3d 3d 58 4e 5f 52 4f 57 49 44  ( iCol==XN_ROWID
f1f0: 20 7c 7c 20 28 69 43 6f 6c 3e 3d 30 20 26 26 20   || (iCol>=0 && 
f200: 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 29  iCol<pTab->nCol)
f210: 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
f220: 69 43 6f 6c 3c 30 20 29 7b 0a 20 20 20 20 20 20  iCol<0 ){.      
f230: 20 20 20 20 7a 54 79 70 65 20 3d 20 22 49 4e 54      zType = "INT
f240: 45 47 45 52 22 3b 0a 20 20 20 20 20 20 20 20 20  EGER";.         
f250: 20 7a 4f 72 69 67 43 6f 6c 20 3d 20 22 72 6f 77   zOrigCol = "row
f260: 69 64 22 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  id";.        }el
f270: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 4f  se{.          zO
f280: 72 69 67 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 61  rigCol = pTab->a
f290: 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 3b  Col[iCol].zName;
f2a0: 0a 20 20 20 20 20 20 20 20 20 20 7a 54 79 70 65  .          zType
f2b0: 20 3d 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e   = sqlite3Column
f2c0: 54 79 70 65 28 26 70 54 61 62 2d 3e 61 43 6f 6c  Type(&pTab->aCol
f2d0: 5b 69 43 6f 6c 5d 2c 30 29 3b 0a 20 20 20 20 20  [iCol],0);.     
f2e0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7a 4f 72     }.        zOr
f2f0: 69 67 54 61 62 20 3d 20 70 54 61 62 2d 3e 7a 4e  igTab = pTab->zN
f300: 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ame;.        if(
f310: 20 70 4e 43 2d 3e 70 50 61 72 73 65 20 26 26 20   pNC->pParse && 
f320: 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 20 29 7b  pTab->pSchema ){
f330: 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 69  .          int i
f340: 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65  Db = sqlite3Sche
f350: 6d 61 54 6f 49 6e 64 65 78 28 70 4e 43 2d 3e 70  maToIndex(pNC->p
f360: 50 61 72 73 65 2d 3e 64 62 2c 20 70 54 61 62 2d  Parse->db, pTab-
f370: 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 20  >pSchema);.     
f380: 20 20 20 20 20 7a 4f 72 69 67 44 62 20 3d 20 70       zOrigDb = p
f390: 4e 43 2d 3e 70 50 61 72 73 65 2d 3e 64 62 2d 3e  NC->pParse->db->
f3a0: 61 44 62 5b 69 44 62 5d 2e 7a 44 62 53 4e 61 6d  aDb[iDb].zDbSNam
f3b0: 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 23 65 6c  e;.        }.#el
f3c0: 73 65 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  se.        asser
f3d0: 74 28 20 69 43 6f 6c 3d 3d 58 4e 5f 52 4f 57 49  t( iCol==XN_ROWI
f3e0: 44 20 7c 7c 20 28 69 43 6f 6c 3e 3d 30 20 26 26  D || (iCol>=0 &&
f3f0: 20 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c   iCol<pTab->nCol
f400: 29 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ) );.        if(
f410: 20 69 43 6f 6c 3c 30 20 29 7b 0a 20 20 20 20 20   iCol<0 ){.     
f420: 20 20 20 20 20 7a 54 79 70 65 20 3d 20 22 49 4e       zType = "IN
f430: 54 45 47 45 52 22 3b 0a 20 20 20 20 20 20 20 20  TEGER";.        
f440: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
f450: 20 7a 54 79 70 65 20 3d 20 73 71 6c 69 74 65 33   zType = sqlite3
f460: 43 6f 6c 75 6d 6e 54 79 70 65 28 26 70 54 61 62  ColumnType(&pTab
f470: 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2c 30 29 3b  ->aCol[iCol],0);
f480: 0a 20 20 20 20 20 20 20 20 7d 0a 23 65 6e 64 69  .        }.#endi
f490: 66 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  f.      }.      
f4a0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66  break;.    }.#if
f4b0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
f4c0: 5f 53 55 42 51 55 45 52 59 0a 20 20 20 20 63 61  _SUBQUERY.    ca
f4d0: 73 65 20 54 4b 5f 53 45 4c 45 43 54 3a 20 7b 0a  se TK_SELECT: {.
f4e0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70        /* The exp
f4f0: 72 65 73 73 69 6f 6e 20 69 73 20 61 20 73 75 62  ression is a sub
f500: 2d 73 65 6c 65 63 74 2e 20 52 65 74 75 72 6e 20  -select. Return 
f510: 74 68 65 20 64 65 63 6c 61 72 61 74 69 6f 6e 20  the declaration 
f520: 74 79 70 65 20 61 6e 64 0a 20 20 20 20 20 20 2a  type and.      *
f530: 2a 20 6f 72 69 67 69 6e 20 69 6e 66 6f 20 66 6f  * origin info fo
f540: 72 20 74 68 65 20 73 69 6e 67 6c 65 20 63 6f 6c  r the single col
f550: 75 6d 6e 20 69 6e 20 74 68 65 20 72 65 73 75 6c  umn in the resul
f560: 74 20 73 65 74 20 6f 66 20 74 68 65 20 53 45 4c  t set of the SEL
f570: 45 43 54 0a 20 20 20 20 20 20 2a 2a 20 73 74 61  ECT.      ** sta
f580: 74 65 6d 65 6e 74 2e 0a 20 20 20 20 20 20 2a 2f  tement..      */
f590: 0a 20 20 20 20 20 20 4e 61 6d 65 43 6f 6e 74 65  .      NameConte
f5a0: 78 74 20 73 4e 43 3b 0a 20 20 20 20 20 20 53 65  xt sNC;.      Se
f5b0: 6c 65 63 74 20 2a 70 53 20 3d 20 70 45 78 70 72  lect *pS = pExpr
f5c0: 2d 3e 78 2e 70 53 65 6c 65 63 74 3b 0a 20 20 20  ->x.pSelect;.   
f5d0: 20 20 20 45 78 70 72 20 2a 70 20 3d 20 70 53 2d     Expr *p = pS-
f5e0: 3e 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45  >pEList->a[0].pE
f5f0: 78 70 72 3b 0a 20 20 20 20 20 20 61 73 73 65 72  xpr;.      asser
f600: 74 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72  t( ExprHasProper
f610: 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73  ty(pExpr, EP_xIs
f620: 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 20 20 20  Select) );.     
f630: 20 73 4e 43 2e 70 53 72 63 4c 69 73 74 20 3d 20   sNC.pSrcList = 
f640: 70 53 2d 3e 70 53 72 63 3b 0a 20 20 20 20 20 20  pS->pSrc;.      
f650: 73 4e 43 2e 70 4e 65 78 74 20 3d 20 70 4e 43 3b  sNC.pNext = pNC;
f660: 0a 20 20 20 20 20 20 73 4e 43 2e 70 50 61 72 73  .      sNC.pPars
f670: 65 20 3d 20 70 4e 43 2d 3e 70 50 61 72 73 65 3b  e = pNC->pParse;
f680: 0a 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20 63  .      zType = c
f690: 6f 6c 75 6d 6e 54 79 70 65 28 26 73 4e 43 2c 20  olumnType(&sNC, 
f6a0: 70 2c 20 26 7a 4f 72 69 67 44 62 2c 20 26 7a 4f  p, &zOrigDb, &zO
f6b0: 72 69 67 54 61 62 2c 20 26 7a 4f 72 69 67 43 6f  rigTab, &zOrigCo
f6c0: 6c 29 3b 20 0a 20 20 20 20 20 20 62 72 65 61 6b  l); .      break
f6d0: 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
f6e0: 20 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54   }..#ifdef SQLIT
f6f0: 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f  E_ENABLE_COLUMN_
f700: 4d 45 54 41 44 41 54 41 20 20 0a 20 20 69 66 28  METADATA  .  if(
f710: 20 70 7a 4f 72 69 67 44 62 20 29 7b 0a 20 20 20   pzOrigDb ){.   
f720: 20 61 73 73 65 72 74 28 20 70 7a 4f 72 69 67 54   assert( pzOrigT
f730: 61 62 20 26 26 20 70 7a 4f 72 69 67 43 6f 6c 20  ab && pzOrigCol 
f740: 29 3b 0a 20 20 20 20 2a 70 7a 4f 72 69 67 44 62  );.    *pzOrigDb
f750: 20 3d 20 7a 4f 72 69 67 44 62 3b 0a 20 20 20 20   = zOrigDb;.    
f760: 2a 70 7a 4f 72 69 67 54 61 62 20 3d 20 7a 4f 72  *pzOrigTab = zOr
f770: 69 67 54 61 62 3b 0a 20 20 20 20 2a 70 7a 4f 72  igTab;.    *pzOr
f780: 69 67 43 6f 6c 20 3d 20 7a 4f 72 69 67 43 6f 6c  igCol = zOrigCol
f790: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72  ;.  }.#endif.  r
f7a0: 65 74 75 72 6e 20 7a 54 79 70 65 3b 0a 7d 0a 0a  eturn zType;.}..
f7b0: 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  /*.** Generate c
f7c0: 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20 74 65  ode that will te
f7d0: 6c 6c 20 74 68 65 20 56 44 42 45 20 74 68 65 20  ll the VDBE the 
f7e0: 64 65 63 6c 61 72 61 74 69 6f 6e 20 74 79 70 65  declaration type
f7f0: 73 20 6f 66 20 63 6f 6c 75 6d 6e 73 0a 2a 2a 20  s of columns.** 
f800: 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  in the result se
f810: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  t..*/.static voi
f820: 64 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e  d generateColumn
f830: 54 79 70 65 73 28 0a 20 20 50 61 72 73 65 20 2a  Types(.  Parse *
f840: 70 50 61 72 73 65 2c 20 20 20 20 20 20 2f 2a 20  pParse,      /* 
f850: 50 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a  Parser context *
f860: 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61  /.  SrcList *pTa
f870: 62 4c 69 73 74 2c 20 20 2f 2a 20 4c 69 73 74 20  bList,  /* List 
f880: 6f 66 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20 45  of tables */.  E
f890: 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 20  xprList *pEList 
f8a0: 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e     /* Expression
f8b0: 73 20 64 65 66 69 6e 69 6e 67 20 74 68 65 20 72  s defining the r
f8c0: 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 29 7b 0a  esult set */.){.
f8d0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
f8e0: 4d 49 54 5f 44 45 43 4c 54 59 50 45 0a 20 20 56  MIT_DECLTYPE.  V
f8f0: 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
f900: 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b  >pVdbe;.  int i;
f910: 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 73  .  NameContext s
f920: 4e 43 3b 0a 20 20 73 4e 43 2e 70 53 72 63 4c 69  NC;.  sNC.pSrcLi
f930: 73 74 20 3d 20 70 54 61 62 4c 69 73 74 3b 0a 20  st = pTabList;. 
f940: 20 73 4e 43 2e 70 50 61 72 73 65 20 3d 20 70 50   sNC.pParse = pP
f950: 61 72 73 65 3b 0a 20 20 73 4e 43 2e 70 4e 65 78  arse;.  sNC.pNex
f960: 74 20 3d 20 30 3b 0a 20 20 66 6f 72 28 69 3d 30  t = 0;.  for(i=0
f970: 3b 20 69 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70  ; i<pEList->nExp
f980: 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70  r; i++){.    Exp
f990: 72 20 2a 70 20 3d 20 70 45 4c 69 73 74 2d 3e 61  r *p = pEList->a
f9a0: 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 63  [i].pExpr;.    c
f9b0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 79 70 65  onst char *zType
f9c0: 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
f9d0: 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45  ENABLE_COLUMN_ME
f9e0: 54 41 44 41 54 41 0a 20 20 20 20 63 6f 6e 73 74  TADATA.    const
f9f0: 20 63 68 61 72 20 2a 7a 4f 72 69 67 44 62 20 3d   char *zOrigDb =
fa00: 20 30 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68   0;.    const ch
fa10: 61 72 20 2a 7a 4f 72 69 67 54 61 62 20 3d 20 30  ar *zOrigTab = 0
fa20: 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  ;.    const char
fa30: 20 2a 7a 4f 72 69 67 43 6f 6c 20 3d 20 30 3b 0a   *zOrigCol = 0;.
fa40: 20 20 20 20 7a 54 79 70 65 20 3d 20 63 6f 6c 75      zType = colu
fa50: 6d 6e 54 79 70 65 28 26 73 4e 43 2c 20 70 2c 20  mnType(&sNC, p, 
fa60: 26 7a 4f 72 69 67 44 62 2c 20 26 7a 4f 72 69 67  &zOrigDb, &zOrig
fa70: 54 61 62 2c 20 26 7a 4f 72 69 67 43 6f 6c 29 3b  Tab, &zOrigCol);
fa80: 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 76 64 62  ..    /* The vdb
fa90: 65 20 6d 75 73 74 20 6d 61 6b 65 20 69 74 73 20  e must make its 
faa0: 6f 77 6e 20 63 6f 70 79 20 6f 66 20 74 68 65 20  own copy of the 
fab0: 63 6f 6c 75 6d 6e 2d 74 79 70 65 20 61 6e 64 20  column-type and 
fac0: 6f 74 68 65 72 20 0a 20 20 20 20 2a 2a 20 63 6f  other .    ** co
fad0: 6c 75 6d 6e 20 73 70 65 63 69 66 69 63 20 73 74  lumn specific st
fae0: 72 69 6e 67 73 2c 20 69 6e 20 63 61 73 65 20 74  rings, in case t
faf0: 68 65 20 73 63 68 65 6d 61 20 69 73 20 72 65 73  he schema is res
fb00: 65 74 20 62 65 66 6f 72 65 20 74 68 69 73 0a 20  et before this. 
fb10: 20 20 20 2a 2a 20 76 69 72 74 75 61 6c 20 6d 61     ** virtual ma
fb20: 63 68 69 6e 65 20 69 73 20 64 65 6c 65 74 65 64  chine is deleted
fb30: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c  ..    */.    sql
fb40: 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61  ite3VdbeSetColNa
fb50: 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45  me(v, i, COLNAME
fb60: 5f 44 41 54 41 42 41 53 45 2c 20 7a 4f 72 69 67  _DATABASE, zOrig
fb70: 44 62 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53  Db, SQLITE_TRANS
fb80: 49 45 4e 54 29 3b 0a 20 20 20 20 73 71 6c 69 74  IENT);.    sqlit
fb90: 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65  e3VdbeSetColName
fba0: 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 54  (v, i, COLNAME_T
fbb0: 41 42 4c 45 2c 20 7a 4f 72 69 67 54 61 62 2c 20  ABLE, zOrigTab, 
fbc0: 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54  SQLITE_TRANSIENT
fbd0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
fbe0: 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20  beSetColName(v, 
fbf0: 69 2c 20 43 4f 4c 4e 41 4d 45 5f 43 4f 4c 55 4d  i, COLNAME_COLUM
fc00: 4e 2c 20 7a 4f 72 69 67 43 6f 6c 2c 20 53 51 4c  N, zOrigCol, SQL
fc10: 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a  ITE_TRANSIENT);.
fc20: 23 65 6c 73 65 0a 20 20 20 20 7a 54 79 70 65 20  #else.    zType 
fc30: 3d 20 63 6f 6c 75 6d 6e 54 79 70 65 28 26 73 4e  = columnType(&sN
fc40: 43 2c 20 70 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  C, p, 0, 0, 0);.
fc50: 23 65 6e 64 69 66 0a 20 20 20 20 73 71 6c 69 74  #endif.    sqlit
fc60: 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65  e3VdbeSetColName
fc70: 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 44  (v, i, COLNAME_D
fc80: 45 43 4c 54 59 50 45 2c 20 7a 54 79 70 65 2c 20  ECLTYPE, zType, 
fc90: 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54  SQLITE_TRANSIENT
fca0: 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a  );.  }.#endif /*
fcb0: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
fcc0: 5f 4f 4d 49 54 5f 44 45 43 4c 54 59 50 45 29 20  _OMIT_DECLTYPE) 
fcd0: 2a 2f 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d  */.}.../*.** Com
fce0: 70 75 74 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20  pute the column 
fcf0: 6e 61 6d 65 73 20 66 6f 72 20 61 20 53 45 4c 45  names for a SELE
fd00: 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a  CT statement..**
fd10: 0a 2a 2a 20 54 68 65 20 6f 6e 6c 79 20 67 75 61  .** The only gua
fd20: 72 61 6e 74 65 65 20 74 68 61 74 20 53 51 4c 69  rantee that SQLi
fd30: 74 65 20 6d 61 6b 65 73 20 61 62 6f 75 74 20 63  te makes about c
fd40: 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 69 73 20 74  olumn names is t
fd50: 68 61 74 20 69 66 20 74 68 65 0a 2a 2a 20 63 6f  hat if the.** co
fd60: 6c 75 6d 6e 20 68 61 73 20 61 6e 20 41 53 20 63  lumn has an AS c
fd70: 6c 61 75 73 65 20 61 73 73 69 67 6e 69 6e 67 20  lause assigning 
fd80: 69 74 20 61 20 6e 61 6d 65 2c 20 74 68 61 74 20  it a name, that 
fd90: 77 69 6c 6c 20 62 65 20 74 68 65 20 6e 61 6d 65  will be the name
fda0: 20 75 73 65 64 2e 0a 2a 2a 20 54 68 61 74 20 69   used..** That i
fdb0: 73 20 74 68 65 20 6f 6e 6c 79 20 64 6f 63 75 6d  s the only docum
fdc0: 65 6e 74 65 64 20 67 75 61 72 61 6e 74 65 65 2e  ented guarantee.
fdd0: 20 20 48 6f 77 65 76 65 72 2c 20 63 6f 75 6e 74    However, count
fde0: 6c 65 73 73 20 61 70 70 6c 69 63 61 74 69 6f 6e  less application
fdf0: 73 0a 2a 2a 20 64 65 76 65 6c 6f 70 65 64 20 6f  s.** developed o
fe00: 76 65 72 20 74 68 65 20 79 65 61 72 73 20 68 61  ver the years ha
fe10: 76 65 20 6d 61 64 65 20 62 61 73 65 6c 65 73 73  ve made baseless
fe20: 20 61 73 73 75 6d 70 74 69 6f 6e 73 20 61 62 6f   assumptions abo
fe30: 75 74 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 0a  ut column names.
fe40: 2a 2a 20 61 6e 64 20 77 69 6c 6c 20 62 72 65 61  ** and will brea
fe50: 6b 20 69 66 20 74 68 6f 73 65 20 61 73 73 75 6d  k if those assum
fe60: 70 74 69 6f 6e 73 20 63 68 61 6e 67 65 73 2e 20  ptions changes. 
fe70: 20 48 65 6e 63 65 2c 20 75 73 65 20 65 78 74 72   Hence, use extr
fe80: 65 6d 65 20 63 61 75 74 69 6f 6e 0a 2a 2a 20 77  eme caution.** w
fe90: 68 65 6e 20 6d 6f 64 69 66 79 69 6e 67 20 74 68  hen modifying th
fea0: 69 73 20 72 6f 75 74 69 6e 65 20 74 6f 20 61 76  is routine to av
feb0: 6f 69 64 20 62 72 65 61 6b 69 6e 67 20 6c 65 67  oid breaking leg
fec0: 61 63 79 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 41  acy..**.** See A
fed0: 6c 73 6f 3a 20 73 71 6c 69 74 65 33 43 6f 6c 75  lso: sqlite3Colu
fee0: 6d 6e 73 46 72 6f 6d 45 78 70 72 4c 69 73 74 28  mnsFromExprList(
fef0: 29 0a 2a 2a 0a 2a 2a 20 54 68 65 20 50 52 41 47  ).**.** The PRAG
ff00: 4d 41 20 73 68 6f 72 74 5f 63 6f 6c 75 6d 6e 5f  MA short_column_
ff10: 6e 61 6d 65 73 20 61 6e 64 20 50 52 41 47 4d 41  names and PRAGMA
ff20: 20 66 75 6c 6c 5f 63 6f 6c 75 6d 6e 5f 6e 61 6d   full_column_nam
ff30: 65 73 20 73 65 74 74 69 6e 67 73 20 61 72 65 0a  es settings are.
ff40: 2a 2a 20 64 65 70 72 65 63 61 74 65 64 2e 20 20  ** deprecated.  
ff50: 54 68 65 20 64 65 66 61 75 6c 74 20 73 65 74 74  The default sett
ff60: 69 6e 67 20 69 73 20 73 68 6f 72 74 3d 4f 4e 2c  ing is short=ON,
ff70: 20 66 75 6c 6c 3d 4f 46 46 2e 20 20 39 39 2e 39   full=OFF.  99.9
ff80: 25 20 6f 66 20 61 6c 6c 0a 2a 2a 20 61 70 70 6c  % of all.** appl
ff90: 69 63 61 74 69 6f 6e 73 20 73 68 6f 75 6c 64 20  ications should 
ffa0: 6f 70 65 72 61 74 65 20 74 68 69 73 20 77 61 79  operate this way
ffb0: 2e 20 20 4e 65 76 65 72 74 68 65 6c 65 73 73 2c  .  Nevertheless,
ffc0: 20 77 65 20 6e 65 65 64 20 74 6f 20 73 75 70 70   we need to supp
ffd0: 6f 72 74 20 74 68 65 0a 2a 2a 20 6f 74 68 65 72  ort the.** other
ffe0: 20 6d 6f 64 65 73 20 66 6f 72 20 6c 65 67 61 63   modes for legac
fff0: 79 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 73 68 6f 72  y:.**.**    shor
10000 74 3d 4f 46 46 2c 20 66 75 6c 6c 3d 4f 46 46 3a  t=OFF, full=OFF:
10010 20 20 20 20 20 20 43 6f 6c 75 6d 6e 20 6e 61 6d        Column nam
10020 65 20 69 73 20 74 68 65 20 74 65 78 74 20 6f 66  e is the text of
10030 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
10040 68 61 73 20 69 74 0a 2a 2a 20 20 20 20 20 20 20  has it.**       
10050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10060 20 20 20 20 20 20 20 6f 72 69 67 69 6e 61 6c 6c         originall
10070 79 20 61 70 70 65 61 72 73 20 69 6e 20 74 68 65  y appears in the
10080 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
10090 74 2e 20 20 49 6e 0a 2a 2a 20 20 20 20 20 20 20  t.  In.**       
100a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
100b0 20 20 20 20 20 20 20 6f 74 68 65 72 20 77 6f 72         other wor
100c0 64 73 2c 20 74 68 65 20 7a 53 70 61 6e 20 6f 66  ds, the zSpan of
100d0 20 74 68 65 20 72 65 73 75 6c 74 20 65 78 70 72   the result expr
100e0 65 73 73 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20  ession..**.**   
100f0 20 73 68 6f 72 74 3d 4f 4e 2c 20 66 75 6c 6c 3d   short=ON, full=
10100 4f 46 46 3a 20 20 20 20 20 20 20 28 54 68 69 73  OFF:       (This
10110 20 69 73 20 74 68 65 20 64 65 66 61 75 6c 74 20   is the default 
10120 73 65 74 74 69 6e 67 29 2e 20 20 49 66 20 74 68  setting).  If th
10130 65 20 72 65 73 75 6c 74 0a 2a 2a 20 20 20 20 20  e result.**     
10140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10150 20 20 20 20 20 20 20 20 20 72 65 66 65 72 73 20           refers 
10160 64 69 72 65 63 74 6c 79 20 74 6f 20 61 20 74 61  directly to a ta
10170 62 6c 65 20 63 6f 6c 75 6d 6e 2c 20 74 68 65 6e  ble column, then
10180 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 20   the.**         
10190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
101a0 20 20 20 20 20 72 65 73 75 6c 74 20 63 6f 6c 75       result colu
101b0 6d 6e 20 6e 61 6d 65 20 69 73 20 6a 75 73 74 20  mn name is just 
101c0 74 68 65 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e  the table column
101d0 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
101e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
101f0 20 6e 61 6d 65 3a 20 43 4f 4c 55 4d 4e 2e 20 20   name: COLUMN.  
10200 4f 74 68 65 72 77 69 73 65 20 75 73 65 20 7a 53  Otherwise use zS
10210 70 61 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 66 75  pan..**.**    fu
10220 6c 6c 3d 4f 4e 2c 20 73 68 6f 72 74 3d 41 4e 59  ll=ON, short=ANY
10230 3a 20 20 20 20 20 20 20 49 66 20 74 68 65 20 72  :       If the r
10240 65 73 75 6c 74 20 72 65 66 65 72 73 20 64 69 72  esult refers dir
10250 65 63 74 6c 79 20 74 6f 20 61 20 74 61 62 6c 65  ectly to a table
10260 20 63 6f 6c 75 6d 6e 2c 0a 2a 2a 20 20 20 20 20   column,.**     
10270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10280 20 20 20 20 20 20 20 20 20 74 68 65 6e 20 74 68           then th
10290 65 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 20  e result column 
102a0 6e 61 6d 65 20 77 69 74 68 20 74 68 65 20 74 61  name with the ta
102b0 62 6c 65 20 6e 61 6d 65 0a 2a 2a 20 20 20 20 20  ble name.**     
102c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
102d0 20 20 20 20 20 20 20 20 20 70 72 65 66 69 78 2c           prefix,
102e0 20 65 78 3a 20 54 41 42 4c 45 2e 43 4f 4c 55 4d   ex: TABLE.COLUM
102f0 4e 2e 20 20 4f 74 68 65 72 77 69 73 65 20 75 73  N.  Otherwise us
10300 65 20 7a 53 70 61 6e 2e 0a 2a 2f 0a 73 74 61 74  e zSpan..*/.stat
10310 69 63 20 76 6f 69 64 20 67 65 6e 65 72 61 74 65  ic void generate
10320 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 0a 20 20 50  ColumnNames(.  P
10330 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
10340 20 20 20 2f 2a 20 50 61 72 73 65 72 20 63 6f 6e     /* Parser con
10350 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74  text */.  Select
10360 20 2a 70 53 65 6c 65 63 74 20 20 20 20 20 2f 2a   *pSelect     /*
10370 20 47 65 6e 65 72 61 74 65 20 63 6f 6c 75 6d 6e   Generate column
10380 20 6e 61 6d 65 73 20 66 6f 72 20 74 68 69 73 20   names for this 
10390 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
103a0 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76   */.){.  Vdbe *v
103b0 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
103c0 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 54 61 62  ;.  int i;.  Tab
103d0 6c 65 20 2a 70 54 61 62 3b 0a 20 20 53 72 63 4c  le *pTab;.  SrcL
103e0 69 73 74 20 2a 70 54 61 62 4c 69 73 74 3b 0a 20  ist *pTabList;. 
103f0 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73   ExprList *pELis
10400 74 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  t;.  sqlite3 *db
10410 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
10420 20 69 6e 74 20 66 75 6c 6c 4e 61 6d 65 3b 20 20   int fullName;  
10430 20 20 2f 2a 20 54 41 42 4c 45 2e 43 4f 4c 55 4d    /* TABLE.COLUM
10440 4e 20 69 66 20 6e 6f 20 41 53 20 63 6c 61 75 73  N if no AS claus
10450 65 20 61 6e 64 20 69 73 20 61 20 64 69 72 65 63  e and is a direc
10460 74 20 74 61 62 6c 65 20 72 65 66 20 2a 2f 0a 20  t table ref */. 
10470 20 69 6e 74 20 73 72 63 4e 61 6d 65 3b 20 20 20   int srcName;   
10480 20 20 2f 2a 20 43 4f 4c 55 4d 4e 20 6f 72 20 54    /* COLUMN or T
10490 41 42 4c 45 2e 43 4f 4c 55 4d 4e 20 69 66 20 6e  ABLE.COLUMN if n
104a0 6f 20 41 53 20 63 6c 61 75 73 65 20 61 6e 64 20  o AS clause and 
104b0 69 73 20 64 69 72 65 63 74 20 2a 2f 0a 0a 23 69  is direct */..#i
104c0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
104d0 54 5f 45 58 50 4c 41 49 4e 0a 20 20 2f 2a 20 49  T_EXPLAIN.  /* I
104e0 66 20 74 68 69 73 20 69 73 20 61 6e 20 45 58 50  f this is an EXP
104f0 4c 41 49 4e 2c 20 73 6b 69 70 20 74 68 69 73 20  LAIN, skip this 
10500 73 74 65 70 20 2a 2f 0a 20 20 69 66 28 20 70 50  step */.  if( pP
10510 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 20 29 7b  arse->explain ){
10520 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
10530 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 70  .#endif..  if( p
10540 50 61 72 73 65 2d 3e 63 6f 6c 4e 61 6d 65 73 53  Parse->colNamesS
10550 65 74 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 2f  et ) return;.  /
10560 2a 20 43 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 61  * Column names a
10570 72 65 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79  re determined by
10580 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20 74   the left-most t
10590 65 72 6d 20 6f 66 20 61 20 63 6f 6d 70 6f 75 6e  erm of a compoun
105a0 64 20 73 65 6c 65 63 74 20 2a 2f 0a 20 20 77 68  d select */.  wh
105b0 69 6c 65 28 20 70 53 65 6c 65 63 74 2d 3e 70 50  ile( pSelect->pP
105c0 72 69 6f 72 20 29 20 70 53 65 6c 65 63 74 20 3d  rior ) pSelect =
105d0 20 70 53 65 6c 65 63 74 2d 3e 70 50 72 69 6f 72   pSelect->pPrior
105e0 3b 0a 20 20 53 45 4c 45 43 54 54 52 41 43 45 28  ;.  SELECTTRACE(
105f0 31 2c 70 50 61 72 73 65 2c 70 53 65 6c 65 63 74  1,pParse,pSelect
10600 2c 28 22 67 65 6e 65 72 61 74 69 6e 67 20 63 6f  ,("generating co
10610 6c 75 6d 6e 20 6e 61 6d 65 73 5c 6e 22 29 29 3b  lumn names\n"));
10620 0a 20 20 70 54 61 62 4c 69 73 74 20 3d 20 70 53  .  pTabList = pS
10630 65 6c 65 63 74 2d 3e 70 53 72 63 3b 0a 20 20 70  elect->pSrc;.  p
10640 45 4c 69 73 74 20 3d 20 70 53 65 6c 65 63 74 2d  EList = pSelect-
10650 3e 70 45 4c 69 73 74 3b 0a 20 20 61 73 73 65 72  >pEList;.  asser
10660 74 28 20 76 21 3d 30 20 29 3b 0a 20 20 61 73 73  t( v!=0 );.  ass
10670 65 72 74 28 20 70 54 61 62 4c 69 73 74 21 3d 30  ert( pTabList!=0
10680 20 29 3b 0a 20 20 70 50 61 72 73 65 2d 3e 63 6f   );.  pParse->co
10690 6c 4e 61 6d 65 73 53 65 74 20 3d 20 31 3b 0a 20  lNamesSet = 1;. 
106a0 20 66 75 6c 6c 4e 61 6d 65 20 3d 20 28 64 62 2d   fullName = (db-
106b0 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  >flags & SQLITE_
106c0 46 75 6c 6c 43 6f 6c 4e 61 6d 65 73 29 21 3d 30  FullColNames)!=0
106d0 3b 0a 20 20 73 72 63 4e 61 6d 65 20 3d 20 28 64  ;.  srcName = (d
106e0 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54  b->flags & SQLIT
106f0 45 5f 53 68 6f 72 74 43 6f 6c 4e 61 6d 65 73 29  E_ShortColNames)
10700 21 3d 30 20 7c 7c 20 66 75 6c 6c 4e 61 6d 65 3b  !=0 || fullName;
10710 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  .  sqlite3VdbeSe
10720 74 4e 75 6d 43 6f 6c 73 28 76 2c 20 70 45 4c 69  tNumCols(v, pELi
10730 73 74 2d 3e 6e 45 78 70 72 29 3b 0a 20 20 66 6f  st->nExpr);.  fo
10740 72 28 69 3d 30 3b 20 69 3c 70 45 4c 69 73 74 2d  r(i=0; i<pEList-
10750 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20  >nExpr; i++){.  
10760 20 20 45 78 70 72 20 2a 70 20 3d 20 70 45 4c 69    Expr *p = pELi
10770 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a  st->a[i].pExpr;.
10780 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 21 3d  .    assert( p!=
10790 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
107a0 20 70 2d 3e 6f 70 21 3d 54 4b 5f 41 47 47 5f 43   p->op!=TK_AGG_C
107b0 4f 4c 55 4d 4e 20 29 3b 20 20 2f 2a 20 41 67 67  OLUMN );  /* Agg
107c0 20 70 72 6f 63 65 73 73 69 6e 67 20 68 61 73 20   processing has 
107d0 6e 6f 74 20 72 75 6e 20 79 65 74 20 2a 2f 0a 20  not run yet */. 
107e0 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6f 70     assert( p->op
107f0 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 70  !=TK_COLUMN || p
10800 2d 3e 79 2e 70 54 61 62 21 3d 30 20 29 3b 20 2f  ->y.pTab!=0 ); /
10810 2a 20 43 6f 76 65 72 69 6e 67 20 69 64 78 20 6e  * Covering idx n
10820 6f 74 20 79 65 74 20 63 6f 64 65 64 20 2a 2f 0a  ot yet coded */.
10830 20 20 20 20 69 66 28 20 70 45 4c 69 73 74 2d 3e      if( pEList->
10840 61 5b 69 5d 2e 7a 4e 61 6d 65 20 29 7b 0a 20 20  a[i].zName ){.  
10850 20 20 20 20 2f 2a 20 41 6e 20 41 53 20 63 6c 61      /* An AS cla
10860 75 73 65 20 61 6c 77 61 79 73 20 74 61 6b 65 73  use always takes
10870 20 66 69 72 73 74 20 70 72 69 6f 72 69 74 79 20   first priority 
10880 2a 2f 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a  */.      char *z
10890 4e 61 6d 65 20 3d 20 70 45 4c 69 73 74 2d 3e 61  Name = pEList->a
108a0 5b 69 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20  [i].zName;.     
108b0 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43   sqlite3VdbeSetC
108c0 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c  olName(v, i, COL
108d0 4e 41 4d 45 5f 4e 41 4d 45 2c 20 7a 4e 61 6d 65  NAME_NAME, zName
108e0 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45  , SQLITE_TRANSIE
108f0 4e 54 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  NT);.    }else i
10900 66 28 20 73 72 63 4e 61 6d 65 20 26 26 20 70 2d  f( srcName && p-
10910 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29  >op==TK_COLUMN )
10920 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 43  {.      char *zC
10930 6f 6c 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 43  ol;.      int iC
10940 6f 6c 20 3d 20 70 2d 3e 69 43 6f 6c 75 6d 6e 3b  ol = p->iColumn;
10950 0a 20 20 20 20 20 20 70 54 61 62 20 3d 20 70 2d  .      pTab = p-
10960 3e 79 2e 70 54 61 62 3b 0a 20 20 20 20 20 20 61  >y.pTab;.      a
10970 73 73 65 72 74 28 20 70 54 61 62 21 3d 30 20 29  ssert( pTab!=0 )
10980 3b 0a 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c  ;.      if( iCol
10990 3c 30 20 29 20 69 43 6f 6c 20 3d 20 70 54 61 62  <0 ) iCol = pTab
109a0 2d 3e 69 50 4b 65 79 3b 0a 20 20 20 20 20 20 61  ->iPKey;.      a
109b0 73 73 65 72 74 28 20 69 43 6f 6c 3d 3d 2d 31 20  ssert( iCol==-1 
109c0 7c 7c 20 28 69 43 6f 6c 3e 3d 30 20 26 26 20 69  || (iCol>=0 && i
109d0 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 29 20  Col<pTab->nCol) 
109e0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69 43 6f  );.      if( iCo
109f0 6c 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 7a  l<0 ){.        z
10a00 43 6f 6c 20 3d 20 22 72 6f 77 69 64 22 3b 0a 20  Col = "rowid";. 
10a10 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
10a20 20 20 20 20 7a 43 6f 6c 20 3d 20 70 54 61 62 2d      zCol = pTab-
10a30 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d  >aCol[iCol].zNam
10a40 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  e;.      }.     
10a50 20 69 66 28 20 66 75 6c 6c 4e 61 6d 65 20 29 7b   if( fullName ){
10a60 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a  .        char *z
10a70 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  Name = 0;.      
10a80 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65    zName = sqlite
10a90 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 25 73  3MPrintf(db, "%s
10aa0 2e 25 73 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d  .%s", pTab->zNam
10ab0 65 2c 20 7a 43 6f 6c 29 3b 0a 20 20 20 20 20 20  e, zCol);.      
10ac0 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74    sqlite3VdbeSet
10ad0 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f  ColName(v, i, CO
10ae0 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20 7a 4e 61 6d  LNAME_NAME, zNam
10af0 65 2c 20 53 51 4c 49 54 45 5f 44 59 4e 41 4d 49  e, SQLITE_DYNAMI
10b00 43 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  C);.      }else{
10b10 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
10b20 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76  VdbeSetColName(v
10b30 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d  , i, COLNAME_NAM
10b40 45 2c 20 7a 43 6f 6c 2c 20 53 51 4c 49 54 45 5f  E, zCol, SQLITE_
10b50 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20  TRANSIENT);.    
10b60 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20    }.    }else{. 
10b70 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
10b80 2a 7a 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69  *z = pEList->a[i
10b90 5d 2e 7a 53 70 61 6e 3b 0a 20 20 20 20 20 20 7a  ].zSpan;.      z
10ba0 20 3d 20 7a 3d 3d 30 20 3f 20 73 71 6c 69 74 65   = z==0 ? sqlite
10bb0 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 63 6f  3MPrintf(db, "co
10bc0 6c 75 6d 6e 25 64 22 2c 20 69 2b 31 29 20 3a 20  lumn%d", i+1) : 
10bd0 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28  sqlite3DbStrDup(
10be0 64 62 2c 20 7a 29 3b 0a 20 20 20 20 20 20 73 71  db, z);.      sq
10bf0 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e  lite3VdbeSetColN
10c00 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d  ame(v, i, COLNAM
10c10 45 5f 4e 41 4d 45 2c 20 7a 2c 20 53 51 4c 49 54  E_NAME, z, SQLIT
10c20 45 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20  E_DYNAMIC);.    
10c30 7d 0a 20 20 7d 0a 20 20 67 65 6e 65 72 61 74 65  }.  }.  generate
10c40 43 6f 6c 75 6d 6e 54 79 70 65 73 28 70 50 61 72  ColumnTypes(pPar
10c50 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 45  se, pTabList, pE
10c60 4c 69 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  List);.}../*.** 
10c70 47 69 76 65 6e 20 61 6e 20 65 78 70 72 65 73 73  Given an express
10c80 69 6f 6e 20 6c 69 73 74 20 28 77 68 69 63 68 20  ion list (which 
10c90 69 73 20 72 65 61 6c 6c 79 20 74 68 65 20 6c 69  is really the li
10ca0 73 74 20 6f 66 20 65 78 70 72 65 73 73 69 6f 6e  st of expression
10cb0 73 0a 2a 2a 20 74 68 61 74 20 66 6f 72 6d 20 74  s.** that form t
10cc0 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66  he result set of
10cd0 20 61 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d   a SELECT statem
10ce0 65 6e 74 29 20 63 6f 6d 70 75 74 65 20 61 70 70  ent) compute app
10cf0 72 6f 70 72 69 61 74 65 0a 2a 2a 20 63 6f 6c 75  ropriate.** colu
10d00 6d 6e 20 6e 61 6d 65 73 20 66 6f 72 20 61 20 74  mn names for a t
10d10 61 62 6c 65 20 74 68 61 74 20 77 6f 75 6c 64 20  able that would 
10d20 68 6f 6c 64 20 74 68 65 20 65 78 70 72 65 73 73  hold the express
10d30 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20  ion list..**.** 
10d40 41 6c 6c 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73  All column names
10d50 20 77 69 6c 6c 20 62 65 20 75 6e 69 71 75 65 2e   will be unique.
10d60 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20 74 68 65 20  .**.** Only the 
10d70 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 61 72 65  column names are
10d80 20 63 6f 6d 70 75 74 65 64 2e 20 20 43 6f 6c 75   computed.  Colu
10d90 6d 6e 2e 7a 54 79 70 65 2c 20 43 6f 6c 75 6d 6e  mn.zType, Column
10da0 2e 7a 43 6f 6c 6c 2c 0a 2a 2a 20 61 6e 64 20 6f  .zColl,.** and o
10db0 74 68 65 72 20 66 69 65 6c 64 73 20 6f 66 20 43  ther fields of C
10dc0 6f 6c 75 6d 6e 20 61 72 65 20 7a 65 72 6f 65 64  olumn are zeroed
10dd0 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53  ..**.** Return S
10de0 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63  QLITE_OK on succ
10df0 65 73 73 2e 20 20 49 66 20 61 20 6d 65 6d 6f 72  ess.  If a memor
10e00 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 65 72 72  y allocation err
10e10 6f 72 20 6f 63 63 75 72 73 2c 0a 2a 2a 20 73 74  or occurs,.** st
10e20 6f 72 65 20 4e 55 4c 4c 20 69 6e 20 2a 70 61 43  ore NULL in *paC
10e30 6f 6c 20 61 6e 64 20 30 20 69 6e 20 2a 70 6e 43  ol and 0 in *pnC
10e40 6f 6c 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51  ol and return SQ
10e50 4c 49 54 45 5f 4e 4f 4d 45 4d 2e 0a 2a 2a 0a 2a  LITE_NOMEM..**.*
10e60 2a 20 54 68 65 20 6f 6e 6c 79 20 67 75 61 72 61  * The only guara
10e70 6e 74 65 65 20 74 68 61 74 20 53 51 4c 69 74 65  ntee that SQLite
10e80 20 6d 61 6b 65 73 20 61 62 6f 75 74 20 63 6f 6c   makes about col
10e90 75 6d 6e 20 6e 61 6d 65 73 20 69 73 20 74 68 61  umn names is tha
10ea0 74 20 69 66 20 74 68 65 0a 2a 2a 20 63 6f 6c 75  t if the.** colu
10eb0 6d 6e 20 68 61 73 20 61 6e 20 41 53 20 63 6c 61  mn has an AS cla
10ec0 75 73 65 20 61 73 73 69 67 6e 69 6e 67 20 69 74  use assigning it
10ed0 20 61 20 6e 61 6d 65 2c 20 74 68 61 74 20 77 69   a name, that wi
10ee0 6c 6c 20 62 65 20 74 68 65 20 6e 61 6d 65 20 75  ll be the name u
10ef0 73 65 64 2e 0a 2a 2a 20 54 68 61 74 20 69 73 20  sed..** That is 
10f00 74 68 65 20 6f 6e 6c 79 20 64 6f 63 75 6d 65 6e  the only documen
10f10 74 65 64 20 67 75 61 72 61 6e 74 65 65 2e 20 20  ted guarantee.  
10f20 48 6f 77 65 76 65 72 2c 20 63 6f 75 6e 74 6c 65  However, countle
10f30 73 73 20 61 70 70 6c 69 63 61 74 69 6f 6e 73 0a  ss applications.
10f40 2a 2a 20 64 65 76 65 6c 6f 70 65 64 20 6f 76 65  ** developed ove
10f50 72 20 74 68 65 20 79 65 61 72 73 20 68 61 76 65  r the years have
10f60 20 6d 61 64 65 20 62 61 73 65 6c 65 73 73 20 61   made baseless a
10f70 73 73 75 6d 70 74 69 6f 6e 73 20 61 62 6f 75 74  ssumptions about
10f80 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 0a 2a 2a   column names.**
10f90 20 61 6e 64 20 77 69 6c 6c 20 62 72 65 61 6b 20   and will break 
10fa0 69 66 20 74 68 6f 73 65 20 61 73 73 75 6d 70 74  if those assumpt
10fb0 69 6f 6e 73 20 63 68 61 6e 67 65 73 2e 20 20 48  ions changes.  H
10fc0 65 6e 63 65 2c 20 75 73 65 20 65 78 74 72 65 6d  ence, use extrem
10fd0 65 20 63 61 75 74 69 6f 6e 0a 2a 2a 20 77 68 65  e caution.** whe
10fe0 6e 20 6d 6f 64 69 66 79 69 6e 67 20 74 68 69 73  n modifying this
10ff0 20 72 6f 75 74 69 6e 65 20 74 6f 20 61 76 6f 69   routine to avoi
11000 64 20 62 72 65 61 6b 69 6e 67 20 6c 65 67 61 63  d breaking legac
11010 79 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 41 6c 73  y..**.** See Als
11020 6f 3a 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d  o: generateColum
11030 6e 4e 61 6d 65 73 28 29 0a 2a 2f 0a 69 6e 74 20  nNames().*/.int 
11040 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 73 46 72  sqlite3ColumnsFr
11050 6f 6d 45 78 70 72 4c 69 73 74 28 0a 20 20 50 61  omExprList(.  Pa
11060 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
11070 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
11080 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78   context */.  Ex
11090 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 2c 20  prList *pEList, 
110a0 20 20 20 20 20 20 2f 2a 20 45 78 70 72 20 6c 69        /* Expr li
110b0 73 74 20 66 72 6f 6d 20 77 68 69 63 68 20 74 6f  st from which to
110c0 20 64 65 72 69 76 65 20 63 6f 6c 75 6d 6e 20 6e   derive column n
110d0 61 6d 65 73 20 2a 2f 0a 20 20 69 31 36 20 2a 70  ames */.  i16 *p
110e0 6e 43 6f 6c 2c 20 20 20 20 20 20 20 20 20 20 20  nCol,           
110f0 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 6e    /* Write the n
11100 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73  umber of columns
11110 20 68 65 72 65 20 2a 2f 0a 20 20 43 6f 6c 75 6d   here */.  Colum
11120 6e 20 2a 2a 70 61 43 6f 6c 20 20 20 20 20 20 20  n **paCol       
11130 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20     /* Write the 
11140 6e 65 77 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 20  new column list 
11150 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c  here */.){.  sql
11160 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
11170 65 2d 3e 64 62 3b 20 20 20 2f 2a 20 44 61 74 61  e->db;   /* Data
11180 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
11190 2a 2f 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 20 20  */.  int i, j;  
111a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
111b0 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
111c0 73 20 2a 2f 0a 20 20 75 33 32 20 63 6e 74 3b 20  s */.  u32 cnt; 
111d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
111e0 20 20 20 2f 2a 20 49 6e 64 65 78 20 61 64 64 65     /* Index adde
111f0 64 20 74 6f 20 6d 61 6b 65 20 74 68 65 20 6e 61  d to make the na
11200 6d 65 20 75 6e 69 71 75 65 20 2a 2f 0a 20 20 43  me unique */.  C
11210 6f 6c 75 6d 6e 20 2a 61 43 6f 6c 2c 20 2a 70 43  olumn *aCol, *pC
11220 6f 6c 3b 20 20 20 20 20 20 20 20 2f 2a 20 46 6f  ol;        /* Fo
11230 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 72  r looping over r
11240 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 2a 2f  esult columns */
11250 0a 20 20 69 6e 74 20 6e 43 6f 6c 3b 20 20 20 20  .  int nCol;    
11260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
11270 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75  * Number of colu
11280 6d 6e 73 20 69 6e 20 74 68 65 20 72 65 73 75 6c  mns in the resul
11290 74 20 73 65 74 20 2a 2f 0a 20 20 63 68 61 72 20  t set */.  char 
112a0 2a 7a 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20  *zName;         
112b0 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e         /* Column
112c0 20 6e 61 6d 65 20 2a 2f 0a 20 20 69 6e 74 20 6e   name */.  int n
112d0 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20  Name;           
112e0 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
112f0 66 20 6e 61 6d 65 20 69 6e 20 7a 4e 61 6d 65 5b  f name in zName[
11300 5d 20 2a 2f 0a 20 20 48 61 73 68 20 68 74 3b 20  ] */.  Hash ht; 
11310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11320 20 20 20 2f 2a 20 48 61 73 68 20 74 61 62 6c 65     /* Hash table
11330 20 6f 66 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73   of column names
11340 20 2a 2f 0a 0a 20 20 73 71 6c 69 74 65 33 48 61   */..  sqlite3Ha
11350 73 68 49 6e 69 74 28 26 68 74 29 3b 0a 20 20 69  shInit(&ht);.  i
11360 66 28 20 70 45 4c 69 73 74 20 29 7b 0a 20 20 20  f( pEList ){.   
11370 20 6e 43 6f 6c 20 3d 20 70 45 4c 69 73 74 2d 3e   nCol = pEList->
11380 6e 45 78 70 72 3b 0a 20 20 20 20 61 43 6f 6c 20  nExpr;.    aCol 
11390 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
113a0 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66  cZero(db, sizeof
113b0 28 61 43 6f 6c 5b 30 5d 29 2a 6e 43 6f 6c 29 3b  (aCol[0])*nCol);
113c0 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 61  .    testcase( a
113d0 43 6f 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66  Col==0 );.    if
113e0 28 20 6e 43 6f 6c 3e 33 32 37 36 37 20 29 20 6e  ( nCol>32767 ) n
113f0 43 6f 6c 20 3d 20 33 32 37 36 37 3b 0a 20 20 7d  Col = 32767;.  }
11400 65 6c 73 65 7b 0a 20 20 20 20 6e 43 6f 6c 20 3d  else{.    nCol =
11410 20 30 3b 0a 20 20 20 20 61 43 6f 6c 20 3d 20 30   0;.    aCol = 0
11420 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
11430 6e 43 6f 6c 3d 3d 28 69 31 36 29 6e 43 6f 6c 20  nCol==(i16)nCol 
11440 29 3b 0a 20 20 2a 70 6e 43 6f 6c 20 3d 20 6e 43  );.  *pnCol = nC
11450 6f 6c 3b 0a 20 20 2a 70 61 43 6f 6c 20 3d 20 61  ol;.  *paCol = a
11460 43 6f 6c 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 2c  Col;..  for(i=0,
11470 20 70 43 6f 6c 3d 61 43 6f 6c 3b 20 69 3c 6e 43   pCol=aCol; i<nC
11480 6f 6c 20 26 26 20 21 64 62 2d 3e 6d 61 6c 6c 6f  ol && !db->mallo
11490 63 46 61 69 6c 65 64 3b 20 69 2b 2b 2c 20 70 43  cFailed; i++, pC
114a0 6f 6c 2b 2b 29 7b 0a 20 20 20 20 2f 2a 20 47 65  ol++){.    /* Ge
114b0 74 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65  t an appropriate
114c0 20 6e 61 6d 65 20 66 6f 72 20 74 68 65 20 63 6f   name for the co
114d0 6c 75 6d 6e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  lumn.    */.    
114e0 69 66 28 20 28 7a 4e 61 6d 65 20 3d 20 70 45 4c  if( (zName = pEL
114f0 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29  ist->a[i].zName)
11500 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  !=0 ){.      /* 
11510 49 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 6f  If the column co
11520 6e 74 61 69 6e 73 20 61 6e 20 22 41 53 20 3c 6e  ntains an "AS <n
11530 61 6d 65 3e 22 20 70 68 72 61 73 65 2c 20 75 73  ame>" phrase, us
11540 65 20 3c 6e 61 6d 65 3e 20 61 73 20 74 68 65 20  e <name> as the 
11550 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 7d 65 6c 73  name */.    }els
11560 65 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70  e{.      Expr *p
11570 43 6f 6c 45 78 70 72 20 3d 20 73 71 6c 69 74 65  ColExpr = sqlite
11580 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65  3ExprSkipCollate
11590 28 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45  (pEList->a[i].pE
115a0 78 70 72 29 3b 0a 20 20 20 20 20 20 77 68 69 6c  xpr);.      whil
115b0 65 28 20 70 43 6f 6c 45 78 70 72 2d 3e 6f 70 3d  e( pColExpr->op=
115c0 3d 54 4b 5f 44 4f 54 20 29 7b 0a 20 20 20 20 20  =TK_DOT ){.     
115d0 20 20 20 70 43 6f 6c 45 78 70 72 20 3d 20 70 43     pColExpr = pC
115e0 6f 6c 45 78 70 72 2d 3e 70 52 69 67 68 74 3b 0a  olExpr->pRight;.
115f0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
11600 70 43 6f 6c 45 78 70 72 21 3d 30 20 29 3b 0a 20  pColExpr!=0 );. 
11610 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73       }.      ass
11620 65 72 74 28 20 70 43 6f 6c 45 78 70 72 2d 3e 6f  ert( pColExpr->o
11630 70 21 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e  p!=TK_AGG_COLUMN
11640 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 43   );.      if( pC
11650 6f 6c 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43  olExpr->op==TK_C
11660 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 20 20 20  OLUMN ){.       
11670 20 2f 2a 20 46 6f 72 20 63 6f 6c 75 6d 6e 73 20   /* For columns 
11680 75 73 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e  use the column n
11690 61 6d 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20  ame name */.    
116a0 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70      int iCol = p
116b0 43 6f 6c 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  ColExpr->iColumn
116c0 3b 0a 20 20 20 20 20 20 20 20 54 61 62 6c 65 20  ;.        Table 
116d0 2a 70 54 61 62 20 3d 20 70 43 6f 6c 45 78 70 72  *pTab = pColExpr
116e0 2d 3e 79 2e 70 54 61 62 3b 0a 20 20 20 20 20 20  ->y.pTab;.      
116f0 20 20 61 73 73 65 72 74 28 20 70 54 61 62 21 3d    assert( pTab!=
11700 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  0 );.        if(
11710 20 69 43 6f 6c 3c 30 20 29 20 69 43 6f 6c 20 3d   iCol<0 ) iCol =
11720 20 70 54 61 62 2d 3e 69 50 4b 65 79 3b 0a 20 20   pTab->iPKey;.  
11730 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 69 43        zName = iC
11740 6f 6c 3e 3d 30 20 3f 20 70 54 61 62 2d 3e 61 43  ol>=0 ? pTab->aC
11750 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 20 3a  ol[iCol].zName :
11760 20 22 72 6f 77 69 64 22 3b 0a 20 20 20 20 20 20   "rowid";.      
11770 7d 65 6c 73 65 20 69 66 28 20 70 43 6f 6c 45 78  }else if( pColEx
11780 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 44 20 29 7b  pr->op==TK_ID ){
11790 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
117a0 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
117b0 79 28 70 43 6f 6c 45 78 70 72 2c 20 45 50 5f 49  y(pColExpr, EP_I
117c0 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20 20 20 20  ntValue) );.    
117d0 20 20 20 20 7a 4e 61 6d 65 20 3d 20 70 43 6f 6c      zName = pCol
117e0 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a  Expr->u.zToken;.
117f0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
11800 20 20 20 20 20 2f 2a 20 55 73 65 20 74 68 65 20       /* Use the 
11810 6f 72 69 67 69 6e 61 6c 20 74 65 78 74 20 6f 66  original text of
11820 20 74 68 65 20 63 6f 6c 75 6d 6e 20 65 78 70 72   the column expr
11830 65 73 73 69 6f 6e 20 61 73 20 69 74 73 20 6e 61  ession as its na
11840 6d 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 7a 4e  me */.        zN
11850 61 6d 65 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b  ame = pEList->a[
11860 69 5d 2e 7a 53 70 61 6e 3b 0a 20 20 20 20 20 20  i].zSpan;.      
11870 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
11880 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 7a  zName ){.      z
11890 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62  Name = sqlite3Db
118a0 53 74 72 44 75 70 28 64 62 2c 20 7a 4e 61 6d 65  StrDup(db, zName
118b0 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
118c0 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69      zName = sqli
118d0 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 22 63  te3MPrintf(db,"c
118e0 6f 6c 75 6d 6e 25 64 22 2c 69 2b 31 29 3b 0a 20  olumn%d",i+1);. 
118f0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b     }..    /* Mak
11900 65 20 73 75 72 65 20 74 68 65 20 63 6f 6c 75 6d  e sure the colum
11910 6e 20 6e 61 6d 65 20 69 73 20 75 6e 69 71 75 65  n name is unique
11920 2e 20 20 49 66 20 74 68 65 20 6e 61 6d 65 20 69  .  If the name i
11930 73 20 6e 6f 74 20 75 6e 69 71 75 65 2c 0a 20 20  s not unique,.  
11940 20 20 2a 2a 20 61 70 70 65 6e 64 20 61 6e 20 69    ** append an i
11950 6e 74 65 67 65 72 20 74 6f 20 74 68 65 20 6e 61  nteger to the na
11960 6d 65 20 73 6f 20 74 68 61 74 20 69 74 20 62 65  me so that it be
11970 63 6f 6d 65 73 20 75 6e 69 71 75 65 2e 0a 20 20  comes unique..  
11980 20 20 2a 2f 0a 20 20 20 20 63 6e 74 20 3d 20 30    */.    cnt = 0
11990 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 7a 4e 61  ;.    while( zNa
119a0 6d 65 20 26 26 20 73 71 6c 69 74 65 33 48 61 73  me && sqlite3Has
119b0 68 46 69 6e 64 28 26 68 74 2c 20 7a 4e 61 6d 65  hFind(&ht, zName
119c0 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 6e 4e  )!=0 ){.      nN
119d0 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 53 74 72  ame = sqlite3Str
119e0 6c 65 6e 33 30 28 7a 4e 61 6d 65 29 3b 0a 20 20  len30(zName);.  
119f0 20 20 20 20 69 66 28 20 6e 4e 61 6d 65 3e 30 20      if( nName>0 
11a00 29 7b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 6a  ){.        for(j
11a10 3d 6e 4e 61 6d 65 2d 31 3b 20 6a 3e 30 20 26 26  =nName-1; j>0 &&
11a20 20 73 71 6c 69 74 65 33 49 73 64 69 67 69 74 28   sqlite3Isdigit(
11a30 7a 4e 61 6d 65 5b 6a 5d 29 3b 20 6a 2d 2d 29 7b  zName[j]); j--){
11a40 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a 4e  }.        if( zN
11a50 61 6d 65 5b 6a 5d 3d 3d 27 3a 27 20 29 20 6e 4e  ame[j]==':' ) nN
11a60 61 6d 65 20 3d 20 6a 3b 0a 20 20 20 20 20 20 7d  ame = j;.      }
11a70 0a 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73  .      zName = s
11a80 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62  qlite3MPrintf(db
11a90 2c 20 22 25 2e 2a 7a 3a 25 75 22 2c 20 6e 4e 61  , "%.*z:%u", nNa
11aa0 6d 65 2c 20 7a 4e 61 6d 65 2c 20 2b 2b 63 6e 74  me, zName, ++cnt
11ab0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 63 6e 74  );.      if( cnt
11ac0 3e 33 20 29 20 73 71 6c 69 74 65 33 5f 72 61 6e  >3 ) sqlite3_ran
11ad0 64 6f 6d 6e 65 73 73 28 73 69 7a 65 6f 66 28 63  domness(sizeof(c
11ae0 6e 74 29 2c 20 26 63 6e 74 29 3b 0a 20 20 20 20  nt), &cnt);.    
11af0 7d 0a 20 20 20 20 70 43 6f 6c 2d 3e 7a 4e 61 6d  }.    pCol->zNam
11b00 65 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20 20 20 73  e = zName;.    s
11b10 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 50 72 6f 70  qlite3ColumnProp
11b20 65 72 74 69 65 73 46 72 6f 6d 4e 61 6d 65 28 30  ertiesFromName(0
11b30 2c 20 70 43 6f 6c 29 3b 0a 20 20 20 20 69 66 28  , pCol);.    if(
11b40 20 7a 4e 61 6d 65 20 26 26 20 73 71 6c 69 74 65   zName && sqlite
11b50 33 48 61 73 68 49 6e 73 65 72 74 28 26 68 74 2c  3HashInsert(&ht,
11b60 20 7a 4e 61 6d 65 2c 20 70 43 6f 6c 29 3d 3d 70   zName, pCol)==p
11b70 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  Col ){.      sql
11b80 69 74 65 33 4f 6f 6d 46 61 75 6c 74 28 64 62 29  ite3OomFault(db)
11b90 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71  ;.    }.  }.  sq
11ba0 6c 69 74 65 33 48 61 73 68 43 6c 65 61 72 28 26  lite3HashClear(&
11bb0 68 74 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d  ht);.  if( db->m
11bc0 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20  allocFailed ){. 
11bd0 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 69 3b     for(j=0; j<i;
11be0 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c   j++){.      sql
11bf0 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 61  ite3DbFree(db, a
11c00 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 29 3b 0a 20  Col[j].zName);. 
11c10 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
11c20 44 62 46 72 65 65 28 64 62 2c 20 61 43 6f 6c 29  DbFree(db, aCol)
11c30 3b 0a 20 20 20 20 2a 70 61 43 6f 6c 20 3d 20 30  ;.    *paCol = 0
11c40 3b 0a 20 20 20 20 2a 70 6e 43 6f 6c 20 3d 20 30  ;.    *pnCol = 0
11c50 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
11c60 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a  ITE_NOMEM_BKPT;.
11c70 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
11c80 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
11c90 20 41 64 64 20 74 79 70 65 20 61 6e 64 20 63 6f   Add type and co
11ca0 6c 6c 61 74 69 6f 6e 20 69 6e 66 6f 72 6d 61 74  llation informat
11cb0 69 6f 6e 20 74 6f 20 61 20 63 6f 6c 75 6d 6e 20  ion to a column 
11cc0 6c 69 73 74 20 62 61 73 65 64 20 6f 6e 0a 2a 2a  list based on.**
11cd0 20 61 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d   a SELECT statem
11ce0 65 6e 74 2e 0a 2a 2a 20 0a 2a 2a 20 54 68 65 20  ent..** .** The 
11cf0 63 6f 6c 75 6d 6e 20 6c 69 73 74 20 70 72 65 73  column list pres
11d00 75 6d 61 62 6c 79 20 63 61 6d 65 20 66 72 6f 6d  umably came from
11d10 20 73 65 6c 65 63 74 43 6f 6c 75 6d 6e 4e 61 6d   selectColumnNam
11d20 65 73 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 29  esFromExprList()
11d30 2e 0a 2a 2a 20 54 68 65 20 63 6f 6c 75 6d 6e 20  ..** The column 
11d40 6c 69 73 74 20 68 61 73 20 6f 6e 6c 79 20 6e 61  list has only na
11d50 6d 65 73 2c 20 6e 6f 74 20 74 79 70 65 73 20 6f  mes, not types o
11d60 72 20 63 6f 6c 6c 61 74 69 6f 6e 73 2e 20 20 54  r collations.  T
11d70 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 67  his.** routine g
11d80 6f 65 73 20 74 68 72 6f 75 67 68 20 61 6e 64 20  oes through and 
11d90 61 64 64 73 20 74 68 65 20 74 79 70 65 73 20 61  adds the types a
11da0 6e 64 20 63 6f 6c 6c 61 74 69 6f 6e 73 2e 0a 2a  nd collations..*
11db0 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
11dc0 65 20 72 65 71 75 69 72 65 73 20 74 68 61 74 20  e requires that 
11dd0 61 6c 6c 20 69 64 65 6e 74 69 66 69 65 72 73 20  all identifiers 
11de0 69 6e 20 74 68 65 20 53 45 4c 45 43 54 0a 2a 2a  in the SELECT.**
11df0 20 73 74 61 74 65 6d 65 6e 74 20 62 65 20 72 65   statement be re
11e00 73 6f 6c 76 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20  solved..*/.void 
11e10 73 71 6c 69 74 65 33 53 65 6c 65 63 74 41 64 64  sqlite3SelectAdd
11e20 43 6f 6c 75 6d 6e 54 79 70 65 41 6e 64 43 6f 6c  ColumnTypeAndCol
11e30 6c 61 74 69 6f 6e 28 0a 20 20 50 61 72 73 65 20  lation(.  Parse 
11e40 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
11e50 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
11e60 78 74 73 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a  xts */.  Table *
11e70 70 54 61 62 2c 20 20 20 20 20 20 20 20 20 20 2f  pTab,          /
11e80 2a 20 41 64 64 20 63 6f 6c 75 6d 6e 20 74 79 70  * Add column typ
11e90 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 6f  e information to
11ea0 20 74 68 69 73 20 74 61 62 6c 65 20 2a 2f 0a 20   this table */. 
11eb0 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74   Select *pSelect
11ec0 2c 20 20 20 20 20 20 2f 2a 20 53 45 4c 45 43 54  ,      /* SELECT
11ed0 20 75 73 65 64 20 74 6f 20 64 65 74 65 72 6d 69   used to determi
11ee0 6e 65 20 74 79 70 65 73 20 61 6e 64 20 63 6f 6c  ne types and col
11ef0 6c 61 74 69 6f 6e 73 20 2a 2f 0a 20 20 63 68 61  lations */.  cha
11f00 72 20 61 66 66 20 20 20 20 20 20 20 20 20 20 20  r aff           
11f10 20 20 20 2f 2a 20 44 65 66 61 75 6c 74 20 61 66     /* Default af
11f20 66 69 6e 69 74 79 20 66 6f 72 20 63 6f 6c 75 6d  finity for colum
11f30 6e 73 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74  ns */.){.  sqlit
11f40 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
11f50 3e 64 62 3b 0a 20 20 4e 61 6d 65 43 6f 6e 74 65  >db;.  NameConte
11f60 78 74 20 73 4e 43 3b 0a 20 20 43 6f 6c 75 6d 6e  xt sNC;.  Column
11f70 20 2a 70 43 6f 6c 3b 0a 20 20 43 6f 6c 6c 53 65   *pCol;.  CollSe
11f80 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20 69 6e 74 20  q *pColl;.  int 
11f90 69 3b 0a 20 20 45 78 70 72 20 2a 70 3b 0a 20 20  i;.  Expr *p;.  
11fa0 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f  struct ExprList_
11fb0 69 74 65 6d 20 2a 61 3b 0a 0a 20 20 61 73 73 65  item *a;..  asse
11fc0 72 74 28 20 70 53 65 6c 65 63 74 21 3d 30 20 29  rt( pSelect!=0 )
11fd0 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70 53 65  ;.  assert( (pSe
11fe0 6c 65 63 74 2d 3e 73 65 6c 46 6c 61 67 73 20 26  lect->selFlags &
11ff0 20 53 46 5f 52 65 73 6f 6c 76 65 64 29 21 3d 30   SF_Resolved)!=0
12000 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 54   );.  assert( pT
12010 61 62 2d 3e 6e 43 6f 6c 3d 3d 70 53 65 6c 65 63  ab->nCol==pSelec
12020 74 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  t->pEList->nExpr
12030 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61   || db->mallocFa
12040 69 6c 65 64 20 29 3b 0a 20 20 69 66 28 20 64 62  iled );.  if( db
12050 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
12060 20 72 65 74 75 72 6e 3b 0a 20 20 6d 65 6d 73 65   return;.  memse
12070 74 28 26 73 4e 43 2c 20 30 2c 20 73 69 7a 65 6f  t(&sNC, 0, sizeo
12080 66 28 73 4e 43 29 29 3b 0a 20 20 73 4e 43 2e 70  f(sNC));.  sNC.p
12090 53 72 63 4c 69 73 74 20 3d 20 70 53 65 6c 65 63  SrcList = pSelec
120a0 74 2d 3e 70 53 72 63 3b 0a 20 20 61 20 3d 20 70  t->pSrc;.  a = p
120b0 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2d 3e  Select->pEList->
120c0 61 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 43  a;.  for(i=0, pC
120d0 6f 6c 3d 70 54 61 62 2d 3e 61 43 6f 6c 3b 20 69  ol=pTab->aCol; i
120e0 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b  <pTab->nCol; i++
120f0 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 63  , pCol++){.    c
12100 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 79 70 65  onst char *zType
12110 3b 0a 20 20 20 20 69 6e 74 20 6e 2c 20 6d 3b 0a  ;.    int n, m;.
12120 20 20 20 20 70 20 3d 20 61 5b 69 5d 2e 70 45 78      p = a[i].pEx
12130 70 72 3b 0a 20 20 20 20 7a 54 79 70 65 20 3d 20  pr;.    zType = 
12140 63 6f 6c 75 6d 6e 54 79 70 65 28 26 73 4e 43 2c  columnType(&sNC,
12150 20 70 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20   p, 0, 0, 0);.  
12160 20 20 2f 2a 20 70 43 6f 6c 2d 3e 73 7a 45 73 74    /* pCol->szEst
12170 20 3d 20 2e 2e 2e 20 2f 2f 20 43 6f 6c 75 6d 6e   = ... // Column
12180 20 73 69 7a 65 20 65 73 74 20 66 6f 72 20 53 45   size est for SE
12190 4c 45 43 54 20 74 61 62 6c 65 73 20 6e 65 76 65  LECT tables neve
121a0 72 20 75 73 65 64 20 2a 2f 0a 20 20 20 20 70 43  r used */.    pC
121b0 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 20 3d 20 73  ol->affinity = s
121c0 71 6c 69 74 65 33 45 78 70 72 41 66 66 69 6e 69  qlite3ExprAffini
121d0 74 79 28 70 29 3b 0a 20 20 20 20 69 66 28 20 7a  ty(p);.    if( z
121e0 54 79 70 65 20 29 7b 0a 20 20 20 20 20 20 6d 20  Type ){.      m 
121f0 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
12200 30 28 7a 54 79 70 65 29 3b 0a 20 20 20 20 20 20  0(zType);.      
12210 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65  n = sqlite3Strle
12220 6e 33 30 28 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 29  n30(pCol->zName)
12230 3b 0a 20 20 20 20 20 20 70 43 6f 6c 2d 3e 7a 4e  ;.      pCol->zN
12240 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62 52  ame = sqlite3DbR
12250 65 61 6c 6c 6f 63 4f 72 46 72 65 65 28 64 62 2c  eallocOrFree(db,
12260 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 2c 20 6e 2b   pCol->zName, n+
12270 6d 2b 32 29 3b 0a 20 20 20 20 20 20 69 66 28 20  m+2);.      if( 
12280 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 20 29 7b 0a 20  pCol->zName ){. 
12290 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70         memcpy(&p
122a0 43 6f 6c 2d 3e 7a 4e 61 6d 65 5b 6e 2b 31 5d 2c  Col->zName[n+1],
122b0 20 7a 54 79 70 65 2c 20 6d 2b 31 29 3b 0a 20 20   zType, m+1);.  
122c0 20 20 20 20 20 20 70 43 6f 6c 2d 3e 63 6f 6c 46        pCol->colF
122d0 6c 61 67 73 20 7c 3d 20 43 4f 4c 46 4c 41 47 5f  lags |= COLFLAG_
122e0 48 41 53 54 59 50 45 3b 0a 20 20 20 20 20 20 7d  HASTYPE;.      }
122f0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
12300 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 30  Col->affinity==0
12310 20 29 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74   ) pCol->affinit
12320 79 20 3d 20 61 66 66 3b 0a 20 20 20 20 70 43 6f  y = aff;.    pCo
12330 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ll = sqlite3Expr
12340 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
12350 70 29 3b 0a 20 20 20 20 69 66 28 20 70 43 6f 6c  p);.    if( pCol
12360 6c 20 26 26 20 70 43 6f 6c 2d 3e 7a 43 6f 6c 6c  l && pCol->zColl
12370 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 43 6f  ==0 ){.      pCo
12380 6c 2d 3e 7a 43 6f 6c 6c 20 3d 20 73 71 6c 69 74  l->zColl = sqlit
12390 65 33 44 62 53 74 72 44 75 70 28 64 62 2c 20 70  e3DbStrDup(db, p
123a0 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  Coll->zName);.  
123b0 20 20 7d 0a 20 20 7d 0a 20 20 70 54 61 62 2d 3e    }.  }.  pTab->
123c0 73 7a 54 61 62 52 6f 77 20 3d 20 31 3b 20 2f 2a  szTabRow = 1; /*
123d0 20 41 6e 79 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61   Any non-zero va
123e0 6c 75 65 20 77 6f 72 6b 73 20 2a 2f 0a 7d 0a 0a  lue works */.}..
123f0 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 20 53 45  /*.** Given a SE
12400 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2c 20  LECT statement, 
12410 67 65 6e 65 72 61 74 65 20 61 20 54 61 62 6c 65  generate a Table
12420 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20   structure that 
12430 64 65 73 63 72 69 62 65 73 0a 2a 2a 20 74 68 65  describes.** the
12440 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20 74   result set of t
12450 68 61 74 20 53 45 4c 45 43 54 2e 0a 2a 2f 0a 54  hat SELECT..*/.T
12460 61 62 6c 65 20 2a 73 71 6c 69 74 65 33 52 65 73  able *sqlite3Res
12470 75 6c 74 53 65 74 4f 66 53 65 6c 65 63 74 28 50  ultSetOfSelect(P
12480 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 65  arse *pParse, Se
12490 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 2c 20 63  lect *pSelect, c
124a0 68 61 72 20 61 66 66 29 7b 0a 20 20 54 61 62 6c  har aff){.  Tabl
124b0 65 20 2a 70 54 61 62 3b 0a 20 20 73 71 6c 69 74  e *pTab;.  sqlit
124c0 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
124d0 3e 64 62 3b 0a 20 20 75 36 34 20 73 61 76 65 64  >db;.  u64 saved
124e0 46 6c 61 67 73 3b 0a 0a 20 20 73 61 76 65 64 46  Flags;..  savedF
124f0 6c 61 67 73 20 3d 20 64 62 2d 3e 66 6c 61 67 73  lags = db->flags
12500 3b 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d  ;.  db->flags &=
12510 20 7e 28 75 36 34 29 53 51 4c 49 54 45 5f 46 75   ~(u64)SQLITE_Fu
12520 6c 6c 43 6f 6c 4e 61 6d 65 73 3b 0a 20 20 64 62  llColNames;.  db
12530 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54  ->flags |= SQLIT
12540 45 5f 53 68 6f 72 74 43 6f 6c 4e 61 6d 65 73 3b  E_ShortColNames;
12550 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  .  sqlite3Select
12560 50 72 65 70 28 70 50 61 72 73 65 2c 20 70 53 65  Prep(pParse, pSe
12570 6c 65 63 74 2c 20 30 29 3b 0a 20 20 64 62 2d 3e  lect, 0);.  db->
12580 66 6c 61 67 73 20 3d 20 73 61 76 65 64 46 6c 61  flags = savedFla
12590 67 73 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65  gs;.  if( pParse
125a0 2d 3e 6e 45 72 72 20 29 20 72 65 74 75 72 6e 20  ->nErr ) return 
125b0 30 3b 0a 20 20 77 68 69 6c 65 28 20 70 53 65 6c  0;.  while( pSel
125c0 65 63 74 2d 3e 70 50 72 69 6f 72 20 29 20 70 53  ect->pPrior ) pS
125d0 65 6c 65 63 74 20 3d 20 70 53 65 6c 65 63 74 2d  elect = pSelect-
125e0 3e 70 50 72 69 6f 72 3b 0a 20 20 70 54 61 62 20  >pPrior;.  pTab 
125f0 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
12600 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66  cZero(db, sizeof
12610 28 54 61 62 6c 65 29 20 29 3b 0a 20 20 69 66 28  (Table) );.  if(
12620 20 70 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20   pTab==0 ){.    
12630 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
12640 70 54 61 62 2d 3e 6e 54 61 62 52 65 66 20 3d 20  pTab->nTabRef = 
12650 31 3b 0a 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  1;.  pTab->zName
12660 20 3d 20 30 3b 0a 20 20 70 54 61 62 2d 3e 6e 52   = 0;.  pTab->nR
12670 6f 77 4c 6f 67 45 73 74 20 3d 20 32 30 30 3b 20  owLogEst = 200; 
12680 61 73 73 65 72 74 28 20 32 30 30 3d 3d 73 71 6c  assert( 200==sql
12690 69 74 65 33 4c 6f 67 45 73 74 28 31 30 34 38 35  ite3LogEst(10485
126a0 37 36 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  76) );.  sqlite3
126b0 43 6f 6c 75 6d 6e 73 46 72 6f 6d 45 78 70 72 4c  ColumnsFromExprL
126c0 69 73 74 28 70 50 61 72 73 65 2c 20 70 53 65 6c  ist(pParse, pSel
126d0 65 63 74 2d 3e 70 45 4c 69 73 74 2c 20 26 70 54  ect->pEList, &pT
126e0 61 62 2d 3e 6e 43 6f 6c 2c 20 26 70 54 61 62 2d  ab->nCol, &pTab-
126f0 3e 61 43 6f 6c 29 3b 0a 20 20 73 71 6c 69 74 65  >aCol);.  sqlite
12700 33 53 65 6c 65 63 74 41 64 64 43 6f 6c 75 6d 6e  3SelectAddColumn
12710 54 79 70 65 41 6e 64 43 6f 6c 6c 61 74 69 6f 6e  TypeAndCollation
12720 28 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20 70  (pParse, pTab, p
12730 53 65 6c 65 63 74 2c 20 61 66 66 29 3b 0a 20 20  Select, aff);.  
12740 70 54 61 62 2d 3e 69 50 4b 65 79 20 3d 20 2d 31  pTab->iPKey = -1
12750 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c  ;.  if( db->mall
12760 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20  ocFailed ){.    
12770 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54 61 62  sqlite3DeleteTab
12780 6c 65 28 64 62 2c 20 70 54 61 62 29 3b 0a 20 20  le(db, pTab);.  
12790 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
127a0 20 20 72 65 74 75 72 6e 20 70 54 61 62 3b 0a 7d    return pTab;.}
127b0 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61 20 56 44  ../*.** Get a VD
127c0 42 45 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e  BE for the given
127d0 20 70 61 72 73 65 72 20 63 6f 6e 74 65 78 74 2e   parser context.
127e0 20 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 6f    Create a new o
127f0 6e 65 20 69 66 20 6e 65 63 65 73 73 61 72 79 2e  ne if necessary.
12800 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20  .** If an error 
12810 6f 63 63 75 72 73 2c 20 72 65 74 75 72 6e 20 4e  occurs, return N
12820 55 4c 4c 20 61 6e 64 20 6c 65 61 76 65 20 61 20  ULL and leave a 
12830 6d 65 73 73 61 67 65 20 69 6e 20 70 50 61 72 73  message in pPars
12840 65 2e 0a 2a 2f 0a 56 64 62 65 20 2a 73 71 6c 69  e..*/.Vdbe *sqli
12850 74 65 33 47 65 74 56 64 62 65 28 50 61 72 73 65  te3GetVdbe(Parse
12860 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 69 66 28   *pParse){.  if(
12870 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 20 29   pParse->pVdbe )
12880 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 50 61  {.    return pPa
12890 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 7d 0a  rse->pVdbe;.  }.
128a0 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 70 54    if( pParse->pT
128b0 6f 70 6c 65 76 65 6c 3d 3d 30 0a 20 20 20 26 26  oplevel==0.   &&
128c0 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 45 6e 61   OptimizationEna
128d0 62 6c 65 64 28 70 50 61 72 73 65 2d 3e 64 62 2c  bled(pParse->db,
128e0 53 51 4c 49 54 45 5f 46 61 63 74 6f 72 4f 75 74  SQLITE_FactorOut
128f0 43 6f 6e 73 74 29 0a 20 20 29 7b 0a 20 20 20 20  Const).  ){.    
12900 70 50 61 72 73 65 2d 3e 6f 6b 43 6f 6e 73 74 46  pParse->okConstF
12910 61 63 74 6f 72 20 3d 20 31 3b 0a 20 20 7d 0a 20  actor = 1;.  }. 
12920 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 56   return sqlite3V
12930 64 62 65 43 72 65 61 74 65 28 70 50 61 72 73 65  dbeCreate(pParse
12940 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d  );.}.../*.** Com
12950 70 75 74 65 20 74 68 65 20 69 4c 69 6d 69 74 20  pute the iLimit 
12960 61 6e 64 20 69 4f 66 66 73 65 74 20 66 69 65 6c  and iOffset fiel
12970 64 73 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54  ds of the SELECT
12980 20 62 61 73 65 64 20 6f 6e 20 74 68 65 0a 2a 2a   based on the.**
12990 20 70 4c 69 6d 69 74 20 65 78 70 72 65 73 73 69   pLimit expressi
129a0 6f 6e 73 2e 20 20 70 4c 69 6d 69 74 2d 3e 70 4c  ons.  pLimit->pL
129b0 65 66 74 20 61 6e 64 20 70 4c 69 6d 69 74 2d 3e  eft and pLimit->
129c0 70 52 69 67 68 74 20 68 6f 6c 64 20 74 68 65 20  pRight hold the 
129d0 65 78 70 72 65 73 73 69 6f 6e 73 0a 2a 2a 20 74  expressions.** t
129e0 68 61 74 20 61 70 70 65 61 72 20 69 6e 20 74 68  hat appear in th
129f0 65 20 6f 72 69 67 69 6e 61 6c 20 53 51 4c 20 73  e original SQL s
12a00 74 61 74 65 6d 65 6e 74 20 61 66 74 65 72 20 74  tatement after t
12a10 68 65 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46  he LIMIT and OFF
12a20 53 45 54 0a 2a 2a 20 6b 65 79 77 6f 72 64 73 2e  SET.** keywords.
12a30 20 20 4f 72 20 4e 55 4c 4c 20 69 66 20 74 68 6f    Or NULL if tho
12a40 73 65 20 6b 65 79 77 6f 72 64 73 20 61 72 65 20  se keywords are 
12a50 6f 6d 69 74 74 65 64 2e 20 69 4c 69 6d 69 74 20  omitted. iLimit 
12a60 61 6e 64 20 69 4f 66 66 73 65 74 20 0a 2a 2a 20  and iOffset .** 
12a70 61 72 65 20 74 68 65 20 69 6e 74 65 67 65 72 20  are the integer 
12a80 6d 65 6d 6f 72 79 20 72 65 67 69 73 74 65 72 20  memory register 
12a90 6e 75 6d 62 65 72 73 20 66 6f 72 20 63 6f 75 6e  numbers for coun
12aa0 74 65 72 73 20 75 73 65 64 20 74 6f 20 63 6f 6d  ters used to com
12ab0 70 75 74 65 20 0a 2a 2a 20 74 68 65 20 6c 69 6d  pute .** the lim
12ac0 69 74 20 61 6e 64 20 6f 66 66 73 65 74 2e 20 20  it and offset.  
12ad0 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6c  If there is no l
12ae0 69 6d 69 74 20 61 6e 64 2f 6f 72 20 6f 66 66 73  imit and/or offs
12af0 65 74 2c 20 74 68 65 6e 20 0a 2a 2a 20 69 4c 69  et, then .** iLi
12b00 6d 69 74 20 61 6e 64 20 69 4f 66 66 73 65 74 20  mit and iOffset 
12b10 61 72 65 20 6e 65 67 61 74 69 76 65 2e 0a 2a 2a  are negative..**
12b20 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
12b30 20 63 68 61 6e 67 65 73 20 74 68 65 20 76 61 6c   changes the val
12b40 75 65 73 20 6f 66 20 69 4c 69 6d 69 74 20 61 6e  ues of iLimit an
12b50 64 20 69 4f 66 66 73 65 74 20 6f 6e 6c 79 20 69  d iOffset only i
12b60 66 0a 2a 2a 20 61 20 6c 69 6d 69 74 20 6f 72 20  f.** a limit or 
12b70 6f 66 66 73 65 74 20 69 73 20 64 65 66 69 6e 65  offset is define
12b80 64 20 62 79 20 70 4c 69 6d 69 74 2d 3e 70 4c 65  d by pLimit->pLe
12b90 66 74 20 61 6e 64 20 70 4c 69 6d 69 74 2d 3e 70  ft and pLimit->p
12ba0 52 69 67 68 74 2e 20 20 69 4c 69 6d 69 74 0a 2a  Right.  iLimit.*
12bb0 2a 20 61 6e 64 20 69 4f 66 66 73 65 74 20 73 68  * and iOffset sh
12bc0 6f 75 6c 64 20 68 61 76 65 20 62 65 65 6e 20 70  ould have been p
12bd0 72 65 73 65 74 20 74 6f 20 61 70 70 72 6f 70 72  reset to appropr
12be0 69 61 74 65 20 64 65 66 61 75 6c 74 20 76 61 6c  iate default val
12bf0 75 65 73 20 28 7a 65 72 6f 29 0a 2a 2a 20 70 72  ues (zero).** pr
12c00 69 6f 72 20 74 6f 20 63 61 6c 6c 69 6e 67 20 74  ior to calling t
12c10 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a 0a  his routine..**.
12c20 2a 2a 20 54 68 65 20 69 4f 66 66 73 65 74 20 72  ** The iOffset r
12c30 65 67 69 73 74 65 72 20 28 69 66 20 69 74 20 65  egister (if it e
12c40 78 69 73 74 73 29 20 69 73 20 69 6e 69 74 69 61  xists) is initia
12c50 6c 69 7a 65 64 20 74 6f 20 74 68 65 20 76 61 6c  lized to the val
12c60 75 65 0a 2a 2a 20 6f 66 20 74 68 65 20 4f 46 46  ue.** of the OFF
12c70 53 45 54 2e 20 20 54 68 65 20 69 4c 69 6d 69 74  SET.  The iLimit
12c80 20 72 65 67 69 73 74 65 72 20 69 73 20 69 6e 69   register is ini
12c90 74 69 61 6c 69 7a 65 64 20 74 6f 20 4c 49 4d 49  tialized to LIMI
12ca0 54 2e 20 20 52 65 67 69 73 74 65 72 0a 2a 2a 20  T.  Register.** 
12cb0 69 4f 66 66 73 65 74 2b 31 20 69 73 20 69 6e 69  iOffset+1 is ini
12cc0 74 69 61 6c 69 7a 65 64 20 74 6f 20 4c 49 4d 49  tialized to LIMI
12cd0 54 2b 4f 46 46 53 45 54 2e 0a 2a 2a 0a 2a 2a 20  T+OFFSET..**.** 
12ce0 4f 6e 6c 79 20 69 66 20 70 4c 69 6d 69 74 2d 3e  Only if pLimit->
12cf0 70 4c 65 66 74 21 3d 30 20 64 6f 20 74 68 65 20  pLeft!=0 do the 
12d00 6c 69 6d 69 74 20 72 65 67 69 73 74 65 72 73 20  limit registers 
12d10 67 65 74 0a 2a 2a 20 72 65 64 65 66 69 6e 65 64  get.** redefined
12d20 2e 20 20 54 68 65 20 55 4e 49 4f 4e 20 41 4c 4c  .  The UNION ALL
12d30 20 6f 70 65 72 61 74 6f 72 20 75 73 65 73 20 74   operator uses t
12d40 68 69 73 20 70 72 6f 70 65 72 74 79 20 74 6f 20  his property to 
12d50 66 6f 72 63 65 0a 2a 2a 20 74 68 65 20 72 65 75  force.** the reu
12d60 73 65 20 6f 66 20 74 68 65 20 73 61 6d 65 20 6c  se of the same l
12d70 69 6d 69 74 20 61 6e 64 20 6f 66 66 73 65 74 20  imit and offset 
12d80 72 65 67 69 73 74 65 72 73 20 61 63 72 6f 73 73  registers across
12d90 20 6d 75 6c 74 69 70 6c 65 0a 2a 2a 20 53 45 4c   multiple.** SEL
12da0 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a  ECT statements..
12db0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63  */.static void c
12dc0 6f 6d 70 75 74 65 4c 69 6d 69 74 52 65 67 69 73  omputeLimitRegis
12dd0 74 65 72 73 28 50 61 72 73 65 20 2a 70 50 61 72  ters(Parse *pPar
12de0 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 2c 20 69  se, Select *p, i
12df0 6e 74 20 69 42 72 65 61 6b 29 7b 0a 20 20 56 64  nt iBreak){.  Vd
12e00 62 65 20 2a 76 20 3d 20 30 3b 0a 20 20 69 6e 74  be *v = 0;.  int
12e10 20 69 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 69   iLimit = 0;.  i
12e20 6e 74 20 69 4f 66 66 73 65 74 3b 0a 20 20 69 6e  nt iOffset;.  in
12e30 74 20 6e 3b 0a 20 20 45 78 70 72 20 2a 70 4c 69  t n;.  Expr *pLi
12e40 6d 69 74 20 3d 20 70 2d 3e 70 4c 69 6d 69 74 3b  mit = p->pLimit;
12e50 0a 0a 20 20 69 66 28 20 70 2d 3e 69 4c 69 6d 69  ..  if( p->iLimi
12e60 74 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 2f  t ) return;..  /
12e70 2a 20 0a 20 20 2a 2a 20 22 4c 49 4d 49 54 20 2d  * .  ** "LIMIT -
12e80 31 22 20 61 6c 77 61 79 73 20 73 68 6f 77 73 20  1" always shows 
12e90 61 6c 6c 20 72 6f 77 73 2e 20 20 54 68 65 72 65  all rows.  There
12ea0 20 69 73 20 73 6f 6d 65 0a 20 20 2a 2a 20 63 6f   is some.  ** co
12eb0 6e 74 72 6f 76 65 72 73 79 20 61 62 6f 75 74 20  ntroversy about 
12ec0 77 68 61 74 20 74 68 65 20 63 6f 72 72 65 63 74  what the correct
12ed0 20 62 65 68 61 76 69 6f 72 20 73 68 6f 75 6c 64   behavior should
12ee0 20 62 65 2e 0a 20 20 2a 2a 20 54 68 65 20 63 75   be..  ** The cu
12ef0 72 72 65 6e 74 20 69 6d 70 6c 65 6d 65 6e 74 61  rrent implementa
12f00 74 69 6f 6e 20 69 6e 74 65 72 70 72 65 74 73 20  tion interprets 
12f10 22 4c 49 4d 49 54 20 30 22 20 74 6f 20 6d 65 61  "LIMIT 0" to mea
12f20 6e 0a 20 20 2a 2a 20 6e 6f 20 72 6f 77 73 2e 0a  n.  ** no rows..
12f30 20 20 2a 2f 0a 20 20 69 66 28 20 70 4c 69 6d 69    */.  if( pLimi
12f40 74 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  t ){.    assert(
12f50 20 70 4c 69 6d 69 74 2d 3e 6f 70 3d 3d 54 4b 5f   pLimit->op==TK_
12f60 4c 49 4d 49 54 20 29 3b 0a 20 20 20 20 61 73 73  LIMIT );.    ass
12f70 65 72 74 28 20 70 4c 69 6d 69 74 2d 3e 70 4c 65  ert( pLimit->pLe
12f80 66 74 21 3d 30 20 29 3b 0a 20 20 20 20 70 2d 3e  ft!=0 );.    p->
12f90 69 4c 69 6d 69 74 20 3d 20 69 4c 69 6d 69 74 20  iLimit = iLimit 
12fa0 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
12fb0 3b 0a 20 20 20 20 76 20 3d 20 73 71 6c 69 74 65  ;.    v = sqlite
12fc0 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  3GetVdbe(pParse)
12fd0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 76 21  ;.    assert( v!
12fe0 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 73 71  =0 );.    if( sq
12ff0 6c 69 74 65 33 45 78 70 72 49 73 49 6e 74 65 67  lite3ExprIsInteg
13000 65 72 28 70 4c 69 6d 69 74 2d 3e 70 4c 65 66 74  er(pLimit->pLeft
13010 2c 20 26 6e 29 20 29 7b 0a 20 20 20 20 20 20 73  , &n) ){.      s
13020 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
13030 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
13040 6e 2c 20 69 4c 69 6d 69 74 29 3b 0a 20 20 20 20  n, iLimit);.    
13050 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
13060 2c 20 22 4c 49 4d 49 54 20 63 6f 75 6e 74 65 72  , "LIMIT counter
13070 22 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6e  "));.      if( n
13080 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ==0 ){.        s
13090 71 6c 69 74 65 33 56 64 62 65 47 6f 74 6f 28 76  qlite3VdbeGoto(v
130a0 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20  , iBreak);.     
130b0 20 7d 65 6c 73 65 20 69 66 28 20 6e 3e 3d 30 20   }else if( n>=0 
130c0 26 26 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77  && p->nSelectRow
130d0 3e 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 28  >sqlite3LogEst((
130e0 75 36 34 29 6e 29 20 29 7b 0a 20 20 20 20 20 20  u64)n) ){.      
130f0 20 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20    p->nSelectRow 
13100 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28  = sqlite3LogEst(
13110 28 75 36 34 29 6e 29 3b 0a 20 20 20 20 20 20 20  (u64)n);.       
13120 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20   p->selFlags |= 
13130 53 46 5f 46 69 78 65 64 4c 69 6d 69 74 3b 0a 20  SF_FixedLimit;. 
13140 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
13150 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
13160 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
13170 70 4c 69 6d 69 74 2d 3e 70 4c 65 66 74 2c 20 69  pLimit->pLeft, i
13180 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20 20 73 71  Limit);.      sq
13190 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
131a0 76 2c 20 4f 50 5f 4d 75 73 74 42 65 49 6e 74 2c  v, OP_MustBeInt,
131b0 20 69 4c 69 6d 69 74 29 3b 20 56 64 62 65 43 6f   iLimit); VdbeCo
131c0 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20  verage(v);.     
131d0 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
131e0 20 22 4c 49 4d 49 54 20 63 6f 75 6e 74 65 72 22   "LIMIT counter"
131f0 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ));.      sqlite
13200 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
13210 50 5f 49 66 4e 6f 74 2c 20 69 4c 69 6d 69 74 2c  P_IfNot, iLimit,
13220 20 69 42 72 65 61 6b 29 3b 20 56 64 62 65 43 6f   iBreak); VdbeCo
13230 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 7d  verage(v);.    }
13240 0a 20 20 20 20 69 66 28 20 70 4c 69 6d 69 74 2d  .    if( pLimit-
13250 3e 70 52 69 67 68 74 20 29 7b 0a 20 20 20 20 20  >pRight ){.     
13260 20 70 2d 3e 69 4f 66 66 73 65 74 20 3d 20 69 4f   p->iOffset = iO
13270 66 66 73 65 74 20 3d 20 2b 2b 70 50 61 72 73 65  ffset = ++pParse
13280 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 70 50  ->nMem;.      pP
13290 61 72 73 65 2d 3e 6e 4d 65 6d 2b 2b 3b 20 20 20  arse->nMem++;   
132a0 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 20 65  /* Allocate an e
132b0 78 74 72 61 20 72 65 67 69 73 74 65 72 20 66 6f  xtra register fo
132c0 72 20 6c 69 6d 69 74 2b 6f 66 66 73 65 74 20 2a  r limit+offset *
132d0 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  /.      sqlite3E
132e0 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
132f0 70 4c 69 6d 69 74 2d 3e 70 52 69 67 68 74 2c 20  pLimit->pRight, 
13300 69 4f 66 66 73 65 74 29 3b 0a 20 20 20 20 20 20  iOffset);.      
13310 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
13320 31 28 76 2c 20 4f 50 5f 4d 75 73 74 42 65 49 6e  1(v, OP_MustBeIn
13330 74 2c 20 69 4f 66 66 73 65 74 29 3b 20 56 64 62  t, iOffset); Vdb
13340 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
13350 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
13360 28 76 2c 20 22 4f 46 46 53 45 54 20 63 6f 75 6e  (v, "OFFSET coun
13370 74 65 72 22 29 29 3b 0a 20 20 20 20 20 20 73 71  ter"));.      sq
13380 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
13390 76 2c 20 4f 50 5f 4f 66 66 73 65 74 4c 69 6d 69  v, OP_OffsetLimi
133a0 74 2c 20 69 4c 69 6d 69 74 2c 20 69 4f 66 66 73  t, iLimit, iOffs
133b0 65 74 2b 31 2c 20 69 4f 66 66 73 65 74 29 3b 0a  et+1, iOffset);.
133c0 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e        VdbeCommen
133d0 74 28 28 76 2c 20 22 4c 49 4d 49 54 2b 4f 46 46  t((v, "LIMIT+OFF
133e0 53 45 54 22 29 29 3b 0a 20 20 20 20 7d 0a 20 20  SET"));.    }.  
133f0 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  }.}..#ifndef SQL
13400 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e  ITE_OMIT_COMPOUN
13410 44 5f 53 45 4c 45 43 54 0a 2f 2a 0a 2a 2a 20 52  D_SELECT./*.** R
13420 65 74 75 72 6e 20 74 68 65 20 61 70 70 72 6f 70  eturn the approp
13430 72 69 61 74 65 20 63 6f 6c 6c 61 74 69 6e 67 20  riate collating 
13440 73 65 71 75 65 6e 63 65 20 66 6f 72 20 74 68 65  sequence for the
13450 20 69 43 6f 6c 2d 74 68 20 63 6f 6c 75 6d 6e 20   iCol-th column 
13460 6f 66 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c 74  of.** the result
13470 20 73 65 74 20 66 6f 72 20 74 68 65 20 63 6f 6d   set for the com
13480 70 6f 75 6e 64 2d 73 65 6c 65 63 74 20 73 74 61  pound-select sta
13490 74 65 6d 65 6e 74 20 22 70 22 2e 20 20 52 65 74  tement "p".  Ret
134a0 75 72 6e 20 4e 55 4c 4c 20 69 66 0a 2a 2a 20 74  urn NULL if.** t
134b0 68 65 20 63 6f 6c 75 6d 6e 20 68 61 73 20 6e 6f  he column has no
134c0 20 64 65 66 61 75 6c 74 20 63 6f 6c 6c 61 74 69   default collati
134d0 6e 67 20 73 65 71 75 65 6e 63 65 2e 0a 2a 2a 0a  ng sequence..**.
134e0 2a 2a 20 54 68 65 20 63 6f 6c 6c 61 74 69 6e 67  ** The collating
134f0 20 73 65 71 75 65 6e 63 65 20 66 6f 72 20 74 68   sequence for th
13500 65 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63  e compound selec
13510 74 20 69 73 20 74 61 6b 65 6e 20 66 72 6f 6d 20  t is taken from 
13520 74 68 65 0a 2a 2a 20 6c 65 66 74 2d 6d 6f 73 74  the.** left-most
13530 20 74 65 72 6d 20 6f 66 20 74 68 65 20 73 65 6c   term of the sel
13540 65 63 74 20 74 68 61 74 20 68 61 73 20 61 20 63  ect that has a c
13550 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
13560 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 43 6f 6c  e..*/.static Col
13570 6c 53 65 71 20 2a 6d 75 6c 74 69 53 65 6c 65 63  lSeq *multiSelec
13580 74 43 6f 6c 6c 53 65 71 28 50 61 72 73 65 20 2a  tCollSeq(Parse *
13590 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a  pParse, Select *
135a0 70 2c 20 69 6e 74 20 69 43 6f 6c 29 7b 0a 20 20  p, int iCol){.  
135b0 43 6f 6c 6c 53 65 71 20 2a 70 52 65 74 3b 0a 20  CollSeq *pRet;. 
135c0 20 69 66 28 20 70 2d 3e 70 50 72 69 6f 72 20 29   if( p->pPrior )
135d0 7b 0a 20 20 20 20 70 52 65 74 20 3d 20 6d 75 6c  {.    pRet = mul
135e0 74 69 53 65 6c 65 63 74 43 6f 6c 6c 53 65 71 28  tiSelectCollSeq(
135f0 70 50 61 72 73 65 2c 20 70 2d 3e 70 50 72 69 6f  pParse, p->pPrio
13600 72 2c 20 69 43 6f 6c 29 3b 0a 20 20 7d 65 6c 73  r, iCol);.  }els
13610 65 7b 0a 20 20 20 20 70 52 65 74 20 3d 20 30 3b  e{.    pRet = 0;
13620 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 69  .  }.  assert( i
13630 43 6f 6c 3e 3d 30 20 29 3b 0a 20 20 2f 2a 20 69  Col>=0 );.  /* i
13640 43 6f 6c 20 6d 75 73 74 20 62 65 20 6c 65 73 73  Col must be less
13650 20 74 68 61 6e 20 70 2d 3e 70 45 4c 69 73 74 2d   than p->pEList-
13660 3e 6e 45 78 70 72 2e 20 20 4f 74 68 65 72 77 69  >nExpr.  Otherwi
13670 73 65 20 61 6e 20 65 72 72 6f 72 20 77 6f 75 6c  se an error woul
13680 64 0a 20 20 2a 2a 20 68 61 76 65 20 62 65 65 6e  d.  ** have been
13690 20 74 68 72 6f 77 6e 20 64 75 72 69 6e 67 20 6e   thrown during n
136a0 61 6d 65 20 72 65 73 6f 6c 75 74 69 6f 6e 20 61  ame resolution a
136b0 6e 64 20 77 65 20 77 6f 75 6c 64 20 6e 6f 74 20  nd we would not 
136c0 68 61 76 65 20 67 6f 74 74 65 6e 0a 20 20 2a 2a  have gotten.  **
136d0 20 74 68 69 73 20 66 61 72 20 2a 2f 0a 20 20 69   this far */.  i
136e0 66 28 20 70 52 65 74 3d 3d 30 20 26 26 20 41 4c  f( pRet==0 && AL
136f0 57 41 59 53 28 69 43 6f 6c 3c 70 2d 3e 70 45 4c  WAYS(iCol<p->pEL
13700 69 73 74 2d 3e 6e 45 78 70 72 29 20 29 7b 0a 20  ist->nExpr) ){. 
13710 20 20 20 70 52 65 74 20 3d 20 73 71 6c 69 74 65     pRet = sqlite
13720 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61  3ExprCollSeq(pPa
13730 72 73 65 2c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e  rse, p->pEList->
13740 61 5b 69 43 6f 6c 5d 2e 70 45 78 70 72 29 3b 0a  a[iCol].pExpr);.
13750 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 52 65    }.  return pRe
13760 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  t;.}../*.** The 
13770 73 65 6c 65 63 74 20 73 74 61 74 65 6d 65 6e 74  select statement
13780 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73   passed as the s
13790 65 63 6f 6e 64 20 70 61 72 61 6d 65 74 65 72 20  econd parameter 
137a0 69 73 20 61 20 63 6f 6d 70 6f 75 6e 64 20 53 45  is a compound SE
137b0 4c 45 43 54 0a 2a 2a 20 77 69 74 68 20 61 6e 20  LECT.** with an 
137c0 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 2e  ORDER BY clause.
137d0 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61   This function a
137e0 6c 6c 6f 63 61 74 65 73 20 61 6e 64 20 72 65 74  llocates and ret
137f0 75 72 6e 73 20 61 20 4b 65 79 49 6e 66 6f 0a 2a  urns a KeyInfo.*
13800 2a 20 73 74 72 75 63 74 75 72 65 20 73 75 69 74  * structure suit
13810 61 62 6c 65 20 66 6f 72 20 69 6d 70 6c 65 6d 65  able for impleme
13820 6e 74 69 6e 67 20 74 68 65 20 4f 52 44 45 52 20  nting the ORDER 
13830 42 59 2e 0a 2a 2a 0a 2a 2a 20 53 70 61 63 65 20  BY..**.** Space 
13840 74 6f 20 68 6f 6c 64 20 74 68 65 20 4b 65 79 49  to hold the KeyI
13850 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 69 73  nfo structure is
13860 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 6d   obtained from m
13870 61 6c 6c 6f 63 2e 20 54 68 65 20 63 61 6c 6c 69  alloc. The calli
13880 6e 67 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 69  ng.** function i
13890 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f  s responsible fo
138a0 72 20 65 6e 73 75 72 69 6e 67 20 74 68 61 74 20  r ensuring that 
138b0 74 68 69 73 20 73 74 72 75 63 74 75 72 65 20 69  this structure i
138c0 73 20 65 76 65 6e 74 75 61 6c 6c 79 0a 2a 2a 20  s eventually.** 
138d0 66 72 65 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  freed..*/.static
138e0 20 4b 65 79 49 6e 66 6f 20 2a 6d 75 6c 74 69 53   KeyInfo *multiS
138f0 65 6c 65 63 74 4f 72 64 65 72 42 79 4b 65 79 49  electOrderByKeyI
13900 6e 66 6f 28 50 61 72 73 65 20 2a 70 50 61 72 73  nfo(Parse *pPars
13910 65 2c 20 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e  e, Select *p, in
13920 74 20 6e 45 78 74 72 61 29 7b 0a 20 20 45 78 70  t nExtra){.  Exp
13930 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 20  rList *pOrderBy 
13940 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20  = p->pOrderBy;. 
13950 20 69 6e 74 20 6e 4f 72 64 65 72 42 79 20 3d 20   int nOrderBy = 
13960 70 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78  p->pOrderBy->nEx
13970 70 72 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  pr;.  sqlite3 *d
13980 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
13990 20 20 4b 65 79 49 6e 66 6f 20 2a 70 52 65 74 20    KeyInfo *pRet 
139a0 3d 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f  = sqlite3KeyInfo
139b0 41 6c 6c 6f 63 28 64 62 2c 20 6e 4f 72 64 65 72  Alloc(db, nOrder
139c0 42 79 2b 6e 45 78 74 72 61 2c 20 31 29 3b 0a 20  By+nExtra, 1);. 
139d0 20 69 66 28 20 70 52 65 74 20 29 7b 0a 20 20 20   if( pRet ){.   
139e0 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28   int i;.    for(
139f0 69 3d 30 3b 20 69 3c 6e 4f 72 64 65 72 42 79 3b  i=0; i<nOrderBy;
13a00 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 74 72   i++){.      str
13a10 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
13a20 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70 4f 72 64  m *pItem = &pOrd
13a30 65 72 42 79 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20  erBy->a[i];.    
13a40 20 20 45 78 70 72 20 2a 70 54 65 72 6d 20 3d 20    Expr *pTerm = 
13a50 70 49 74 65 6d 2d 3e 70 45 78 70 72 3b 0a 20 20  pItem->pExpr;.  
13a60 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f      CollSeq *pCo
13a70 6c 6c 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 70  ll;..      if( p
13a80 54 65 72 6d 2d 3e 66 6c 61 67 73 20 26 20 45 50  Term->flags & EP
13a90 5f 43 6f 6c 6c 61 74 65 20 29 7b 0a 20 20 20 20  _Collate ){.    
13aa0 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69      pColl = sqli
13ab0 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70  te3ExprCollSeq(p
13ac0 50 61 72 73 65 2c 20 70 54 65 72 6d 29 3b 0a 20  Parse, pTerm);. 
13ad0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
13ae0 20 20 20 20 70 43 6f 6c 6c 20 3d 20 6d 75 6c 74      pColl = mult
13af0 69 53 65 6c 65 63 74 43 6f 6c 6c 53 65 71 28 70  iSelectCollSeq(p
13b00 50 61 72 73 65 2c 20 70 2c 20 70 49 74 65 6d 2d  Parse, p, pItem-
13b10 3e 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c  >u.x.iOrderByCol
13b20 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  -1);.        if(
13b30 20 70 43 6f 6c 6c 3d 3d 30 20 29 20 70 43 6f 6c   pColl==0 ) pCol
13b40 6c 20 3d 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c  l = db->pDfltCol
13b50 6c 3b 0a 20 20 20 20 20 20 20 20 70 4f 72 64 65  l;.        pOrde
13b60 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 20  rBy->a[i].pExpr 
13b70 3d 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  =.          sqli
13b80 74 65 33 45 78 70 72 41 64 64 43 6f 6c 6c 61 74  te3ExprAddCollat
13b90 65 53 74 72 69 6e 67 28 70 50 61 72 73 65 2c 20  eString(pParse, 
13ba0 70 54 65 72 6d 2c 20 70 43 6f 6c 6c 2d 3e 7a 4e  pTerm, pColl->zN
13bb0 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ame);.      }.  
13bc0 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
13bd0 74 65 33 4b 65 79 49 6e 66 6f 49 73 57 72 69 74  te3KeyInfoIsWrit
13be0 65 61 62 6c 65 28 70 52 65 74 29 20 29 3b 0a 20  eable(pRet) );. 
13bf0 20 20 20 20 20 70 52 65 74 2d 3e 61 43 6f 6c 6c       pRet->aColl
13c00 5b 69 5d 20 3d 20 70 43 6f 6c 6c 3b 0a 20 20 20  [i] = pColl;.   
13c10 20 20 20 70 52 65 74 2d 3e 61 53 6f 72 74 4f 72     pRet->aSortOr
13c20 64 65 72 5b 69 5d 20 3d 20 70 4f 72 64 65 72 42  der[i] = pOrderB
13c30 79 2d 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72 64 65  y->a[i].sortOrde
13c40 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  r;.    }.  }..  
13c50 72 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 0a  return pRet;.}..
13c60 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
13c70 4d 49 54 5f 43 54 45 0a 2f 2a 0a 2a 2a 20 54 68  MIT_CTE./*.** Th
13c80 69 73 20 72 6f 75 74 69 6e 65 20 67 65 6e 65 72  is routine gener
13c90 61 74 65 73 20 56 44 42 45 20 63 6f 64 65 20 74  ates VDBE code t
13ca0 6f 20 63 6f 6d 70 75 74 65 20 74 68 65 20 63 6f  o compute the co
13cb0 6e 74 65 6e 74 20 6f 66 20 61 20 57 49 54 48 20  ntent of a WITH 
13cc0 52 45 43 55 52 53 49 56 45 0a 2a 2a 20 71 75 65  RECURSIVE.** que
13cd0 72 79 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a  ry of the form:.
13ce0 2a 2a 0a 2a 2a 20 20 20 3c 72 65 63 75 72 73 69  **.**   <recursi
13cf0 76 65 2d 74 61 62 6c 65 3e 20 41 53 20 28 3c 73  ve-table> AS (<s
13d00 65 74 75 70 2d 71 75 65 72 79 3e 20 55 4e 49 4f  etup-query> UNIO
13d10 4e 20 5b 41 4c 4c 5d 20 3c 72 65 63 75 72 73 69  N [ALL] <recursi
13d20 76 65 2d 71 75 65 72 79 3e 29 0a 2a 2a 20 20 20  ve-query>).**   
13d30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13d40 20 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f        \_________
13d50 5f 5f 2f 20 20 20 20 20 20 20 20 20 20 20 20 20  __/             
13d60 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  \_______________
13d70 2f 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  /.**            
13d80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
13d90 2d 3e 70 50 72 69 6f 72 20 20 20 20 20 20 20 20  ->pPrior        
13da0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 0a                p.
13db0 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 69  **.**.** There i
13dc0 73 20 65 78 61 63 74 6c 79 20 6f 6e 65 20 72 65  s exactly one re
13dd0 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20 72  ference to the r
13de0 65 63 75 72 73 69 76 65 2d 74 61 62 6c 65 20 69  ecursive-table i
13df0 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  n the FROM claus
13e00 65 0a 2a 2a 20 6f 66 20 72 65 63 75 72 73 69 76  e.** of recursiv
13e10 65 2d 71 75 65 72 79 2c 20 6d 61 72 6b 65 64 20  e-query, marked 
13e20 77 69 74 68 20 74 68 65 20 53 72 63 4c 69 73 74  with the SrcList
13e30 2d 3e 61 5b 5d 2e 66 67 2e 69 73 52 65 63 75 72  ->a[].fg.isRecur
13e40 73 69 76 65 20 66 6c 61 67 2e 0a 2a 2a 0a 2a 2a  sive flag..**.**
13e50 20 54 68 65 20 73 65 74 75 70 2d 71 75 65 72 79   The setup-query
13e60 20 72 75 6e 73 20 6f 6e 63 65 20 74 6f 20 67 65   runs once to ge
13e70 6e 65 72 61 74 65 20 61 6e 20 69 6e 69 74 69 61  nerate an initia
13e80 6c 20 73 65 74 20 6f 66 20 72 6f 77 73 20 74 68  l set of rows th
13e90 61 74 20 67 6f 0a 2a 2a 20 69 6e 74 6f 20 61 20  at go.** into a 
13ea0 51 75 65 75 65 20 74 61 62 6c 65 2e 20 20 52 6f  Queue table.  Ro
13eb0 77 73 20 61 72 65 20 65 78 74 72 61 63 74 65 64  ws are extracted
13ec0 20 66 72 6f 6d 20 74 68 65 20 51 75 65 75 65 20   from the Queue 
13ed0 74 61 62 6c 65 20 6f 6e 65 20 62 79 0a 2a 2a 20  table one by.** 
13ee0 6f 6e 65 2e 20 20 45 61 63 68 20 72 6f 77 20 65  one.  Each row e
13ef0 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20 51 75  xtracted from Qu
13f00 65 75 65 20 69 73 20 6f 75 74 70 75 74 20 74 6f  eue is output to
13f10 20 70 44 65 73 74 2e 20 20 54 68 65 6e 20 74 68   pDest.  Then th
13f20 65 20 73 69 6e 67 6c 65 0a 2a 2a 20 65 78 74 72  e single.** extr
13f30 61 63 74 65 64 20 72 6f 77 20 28 6e 6f 77 20 69  acted row (now i
13f40 6e 20 74 68 65 20 69 43 75 72 72 65 6e 74 20 74  n the iCurrent t
13f50 61 62 6c 65 29 20 62 65 63 6f 6d 65 73 20 74 68  able) becomes th
13f60 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65  e content of the
13f70 0a 2a 2a 20 72 65 63 75 72 73 69 76 65 2d 74 61  .** recursive-ta
13f80 62 6c 65 20 66 6f 72 20 61 20 72 65 63 75 72 73  ble for a recurs
13f90 69 76 65 2d 71 75 65 72 79 20 72 75 6e 2e 20 20  ive-query run.  
13fa0 54 68 65 20 6f 75 74 70 75 74 20 6f 66 20 74 68  The output of th
13fb0 65 20 72 65 63 75 72 73 69 76 65 2d 71 75 65 72  e recursive-quer
13fc0 79 0a 2a 2a 20 69 73 20 61 64 64 65 64 20 62 61  y.** is added ba
13fd0 63 6b 20 69 6e 74 6f 20 74 68 65 20 51 75 65 75  ck into the Queu
13fe0 65 20 74 61 62 6c 65 2e 20 20 54 68 65 6e 20 61  e table.  Then a
13ff0 6e 6f 74 68 65 72 20 72 6f 77 20 69 73 20 65 78  nother row is ex
14000 74 72 61 63 74 65 64 20 66 72 6f 6d 20 51 75 65  tracted from Que
14010 75 65 0a 2a 2a 20 61 6e 64 20 74 68 65 20 69 74  ue.** and the it
14020 65 72 61 74 69 6f 6e 20 63 6f 6e 74 69 6e 75 65  eration continue
14030 73 20 75 6e 74 69 6c 20 74 68 65 20 51 75 65 75  s until the Queu
14040 65 20 74 61 62 6c 65 20 69 73 20 65 6d 70 74 79  e table is empty
14050 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63  ..**.** If the c
14060 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79 20 6f 70  ompound query op
14070 65 72 61 74 6f 72 20 69 73 20 55 4e 49 4f 4e 20  erator is UNION 
14080 74 68 65 6e 20 6e 6f 20 64 75 70 6c 69 63 61 74  then no duplicat
14090 65 20 72 6f 77 73 20 61 72 65 20 65 76 65 72 0a  e rows are ever.
140a0 2a 2a 20 69 6e 73 65 72 74 65 64 20 69 6e 74 6f  ** inserted into
140b0 20 74 68 65 20 51 75 65 75 65 20 74 61 62 6c 65   the Queue table
140c0 2e 20 20 54 68 65 20 69 44 69 73 74 69 6e 63 74  .  The iDistinct
140d0 20 74 61 62 6c 65 20 6b 65 65 70 73 20 61 20 63   table keeps a c
140e0 6f 70 79 20 6f 66 20 61 6c 6c 20 72 6f 77 73 0a  opy of all rows.
140f0 2a 2a 20 74 68 61 74 20 68 61 76 65 20 65 76 65  ** that have eve
14100 72 20 62 65 65 6e 20 69 6e 73 65 72 74 65 64 20  r been inserted 
14110 69 6e 74 6f 20 51 75 65 75 65 20 61 6e 64 20 63  into Queue and c
14120 61 75 73 65 73 20 64 75 70 6c 69 63 61 74 65 73  auses duplicates
14130 20 74 6f 20 62 65 0a 2a 2a 20 64 69 73 63 61 72   to be.** discar
14140 64 65 64 2e 20 20 49 66 20 74 68 65 20 6f 70 65  ded.  If the ope
14150 72 61 74 6f 72 20 69 73 20 55 4e 49 4f 4e 20 41  rator is UNION A
14160 4c 4c 2c 20 74 68 65 6e 20 64 75 70 6c 69 63 61  LL, then duplica
14170 74 65 73 20 61 72 65 20 61 6c 6c 6f 77 65 64 2e  tes are allowed.
14180 0a 2a 2a 20 0a 2a 2a 20 49 66 20 74 68 65 20 71  .** .** If the q
14190 75 65 72 79 20 68 61 73 20 61 6e 20 4f 52 44 45  uery has an ORDE
141a0 52 20 42 59 2c 20 74 68 65 6e 20 65 6e 74 72 69  R BY, then entri
141b0 65 73 20 69 6e 20 74 68 65 20 51 75 65 75 65 20  es in the Queue 
141c0 74 61 62 6c 65 20 61 72 65 20 6b 65 70 74 20 69  table are kept i
141d0 6e 0a 2a 2a 20 4f 52 44 45 52 20 42 59 20 6f 72  n.** ORDER BY or
141e0 64 65 72 20 61 6e 64 20 74 68 65 20 66 69 72 73  der and the firs
141f0 74 20 65 6e 74 72 79 20 69 73 20 65 78 74 72 61  t entry is extra
14200 63 74 65 64 20 66 6f 72 20 65 61 63 68 20 63 79  cted for each cy
14210 63 6c 65 2e 20 20 57 69 74 68 6f 75 74 0a 2a 2a  cle.  Without.**
14220 20 61 6e 20 4f 52 44 45 52 20 42 59 2c 20 74 68   an ORDER BY, th
14230 65 20 51 75 65 75 65 20 74 61 62 6c 65 20 69 73  e Queue table is
14240 20 6a 75 73 74 20 61 20 46 49 46 4f 2e 0a 2a 2a   just a FIFO..**
14250 0a 2a 2a 20 49 66 20 61 20 4c 49 4d 49 54 20 63  .** If a LIMIT c
14260 6c 61 75 73 65 20 69 73 20 70 72 6f 76 69 64 65  lause is provide
14270 64 2c 20 74 68 65 6e 20 74 68 65 20 69 74 65 72  d, then the iter
14280 61 74 69 6f 6e 20 73 74 6f 70 73 20 61 66 74 65  ation stops afte
14290 72 20 4c 49 4d 49 54 20 72 6f 77 73 0a 2a 2a 20  r LIMIT rows.** 
142a0 68 61 76 65 20 62 65 65 6e 20 6f 75 74 70 75 74  have been output
142b0 20 74 6f 20 70 44 65 73 74 2e 20 20 41 20 4c 49   to pDest.  A LI
142c0 4d 49 54 20 6f 66 20 7a 65 72 6f 20 6d 65 61 6e  MIT of zero mean
142d0 73 20 74 6f 20 6f 75 74 70 75 74 20 6e 6f 20 72  s to output no r
142e0 6f 77 73 20 61 6e 64 20 61 0a 2a 2a 20 6e 65 67  ows and a.** neg
142f0 61 74 69 76 65 20 4c 49 4d 49 54 20 6d 65 61 6e  ative LIMIT mean
14300 73 20 74 6f 20 6f 75 74 70 75 74 20 61 6c 6c 20  s to output all 
14310 72 6f 77 73 2e 20 20 49 66 20 74 68 65 72 65 20  rows.  If there 
14320 69 73 20 61 6c 73 6f 20 61 6e 20 4f 46 46 53 45  is also an OFFSE
14330 54 20 63 6c 61 75 73 65 0a 2a 2a 20 77 69 74 68  T clause.** with
14340 20 61 20 70 6f 73 69 74 69 76 65 20 76 61 6c 75   a positive valu
14350 65 2c 20 74 68 65 6e 20 74 68 65 20 66 69 72 73  e, then the firs
14360 74 20 4f 46 46 53 45 54 20 6f 75 74 70 75 74 73  t OFFSET outputs
14370 20 61 72 65 20 64 69 73 63 61 72 64 65 64 20 72   are discarded r
14380 61 74 68 65 72 0a 2a 2a 20 74 68 61 6e 20 62 65  ather.** than be
14390 69 6e 67 20 73 65 6e 74 20 74 6f 20 70 44 65 73  ing sent to pDes
143a0 74 2e 20 20 54 68 65 20 4c 49 4d 49 54 20 63 6f  t.  The LIMIT co
143b0 75 6e 74 20 64 6f 65 73 20 6e 6f 74 20 62 65 67  unt does not beg
143c0 69 6e 20 75 6e 74 69 6c 20 61 66 74 65 72 20 4f  in until after O
143d0 46 46 53 45 54 0a 2a 2a 20 72 6f 77 73 20 68 61  FFSET.** rows ha
143e0 76 65 20 62 65 65 6e 20 73 6b 69 70 70 65 64 2e  ve been skipped.
143f0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
14400 67 65 6e 65 72 61 74 65 57 69 74 68 52 65 63 75  generateWithRecu
14410 72 73 69 76 65 51 75 65 72 79 28 0a 20 20 50 61  rsiveQuery(.  Pa
14420 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
14430 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63      /* Parsing c
14440 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65  ontext */.  Sele
14450 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  ct *p,          
14460 20 20 2f 2a 20 54 68 65 20 72 65 63 75 72 73 69    /* The recursi
14470 76 65 20 53 45 4c 45 43 54 20 74 6f 20 62 65 20  ve SELECT to be 
14480 63 6f 64 65 64 20 2a 2f 0a 20 20 53 65 6c 65 63  coded */.  Selec
14490 74 44 65 73 74 20 2a 70 44 65 73 74 20 20 20 20  tDest *pDest    
144a0 20 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f 20 77   /* What to do w
144b0 69 74 68 20 71 75 65 72 79 20 72 65 73 75 6c 74  ith query result
144c0 73 20 2a 2f 0a 29 7b 0a 20 20 53 72 63 4c 69 73  s */.){.  SrcLis
144d0 74 20 2a 70 53 72 63 20 3d 20 70 2d 3e 70 53 72  t *pSrc = p->pSr
144e0 63 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20 46  c;      /* The F
144f0 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68  ROM clause of th
14500 65 20 72 65 63 75 72 73 69 76 65 20 71 75 65 72  e recursive quer
14510 79 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c 20  y */.  int nCol 
14520 3d 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78  = p->pEList->nEx
14530 70 72 3b 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f  pr;  /* Number o
14540 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65  f columns in the
14550 20 72 65 63 75 72 73 69 76 65 20 74 61 62 6c 65   recursive table
14560 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 20 3d 20   */.  Vdbe *v = 
14570 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 20 20  pParse->pVdbe;  
14580 20 20 20 20 2f 2a 20 54 68 65 20 70 72 65 70 61      /* The prepa
14590 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20 75 6e  red statement un
145a0 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e  der construction
145b0 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53   */.  Select *pS
145c0 65 74 75 70 20 3d 20 70 2d 3e 70 50 72 69 6f 72  etup = p->pPrior
145d0 3b 20 20 20 2f 2a 20 54 68 65 20 73 65 74 75 70  ;   /* The setup
145e0 20 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20   query */.  int 
145f0 61 64 64 72 54 6f 70 3b 20 20 20 20 20 20 20 20  addrTop;        
14600 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 70            /* Top
14610 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 2a 2f 0a   of the loop */.
14620 20 20 69 6e 74 20 61 64 64 72 43 6f 6e 74 2c 20    int addrCont, 
14630 61 64 64 72 42 72 65 61 6b 3b 20 20 20 20 20 20  addrBreak;      
14640 2f 2a 20 43 4f 4e 54 49 4e 55 45 20 61 6e 64 20  /* CONTINUE and 
14650 42 52 45 41 4b 20 61 64 64 72 65 73 73 65 73 20  BREAK addresses 
14660 2a 2f 0a 20 20 69 6e 74 20 69 43 75 72 72 65 6e  */.  int iCurren
14670 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  t = 0;          
14680 20 20 20 2f 2a 20 54 68 65 20 43 75 72 72 65 6e     /* The Curren
14690 74 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74  t table */.  int
146a0 20 72 65 67 43 75 72 72 65 6e 74 3b 20 20 20 20   regCurrent;    
146b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
146c0 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 43  gister holding C
146d0 75 72 72 65 6e 74 20 74 61 62 6c 65 20 2a 2f 0a  urrent table */.
146e0 20 20 69 6e 74 20 69 51 75 65 75 65 3b 20 20 20    int iQueue;   
146f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14700 2f 2a 20 54 68 65 20 51 75 65 75 65 20 74 61 62  /* The Queue tab
14710 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 44 69 73  le */.  int iDis
14720 74 69 6e 63 74 20 3d 20 30 3b 20 20 20 20 20 20  tinct = 0;      
14730 20 20 20 20 20 20 2f 2a 20 54 6f 20 65 6e 73 75        /* To ensu
14740 72 65 20 75 6e 69 71 75 65 20 72 65 73 75 6c 74  re unique result
14750 73 20 69 66 20 55 4e 49 4f 4e 20 2a 2f 0a 20 20  s if UNION */.  
14760 69 6e 74 20 65 44 65 73 74 20 3d 20 53 52 54 5f  int eDest = SRT_
14770 46 69 66 6f 3b 20 20 20 20 20 20 20 20 20 2f 2a  Fifo;         /*
14780 20 48 6f 77 20 74 6f 20 77 72 69 74 65 20 74 6f   How to write to
14790 20 51 75 65 75 65 20 2a 2f 0a 20 20 53 65 6c 65   Queue */.  Sele
147a0 63 74 44 65 73 74 20 64 65 73 74 51 75 65 75 65  ctDest destQueue
147b0 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 6c  ;         /* Sel
147c0 65 63 74 44 65 73 74 20 74 61 72 67 65 74 74 69  ectDest targetti
147d0 6e 67 20 74 68 65 20 51 75 65 75 65 20 74 61 62  ng the Queue tab
147e0 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20  le */.  int i;  
147f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14800 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
14810 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72  unter */.  int r
14820 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
14830 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75           /* Resu
14840 6c 74 20 63 6f 64 65 20 2a 2f 0a 20 20 45 78 70  lt code */.  Exp
14850 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 3b  rList *pOrderBy;
14860 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
14870 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
14880 65 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 4c 69  e */.  Expr *pLi
14890 6d 69 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  mit;            
148a0 20 20 20 20 20 2f 2a 20 53 61 76 65 64 20 4c 49       /* Saved LI
148b0 4d 49 54 20 61 6e 64 20 4f 46 46 53 45 54 20 2a  MIT and OFFSET *
148c0 2f 0a 20 20 69 6e 74 20 72 65 67 4c 69 6d 69 74  /.  int regLimit
148d0 2c 20 72 65 67 4f 66 66 73 65 74 3b 20 20 20 20  , regOffset;    
148e0 20 20 2f 2a 20 52 65 67 69 73 74 65 72 73 20 75    /* Registers u
148f0 73 65 64 20 62 79 20 4c 49 4d 49 54 20 61 6e 64  sed by LIMIT and
14900 20 4f 46 46 53 45 54 20 2a 2f 0a 0a 23 69 66 6e   OFFSET */..#ifn
14910 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
14920 57 49 4e 44 4f 57 46 55 4e 43 0a 20 20 69 66 28  WINDOWFUNC.  if(
14930 20 70 2d 3e 70 57 69 6e 20 29 7b 0a 20 20 20 20   p->pWin ){.    
14940 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
14950 70 50 61 72 73 65 2c 20 22 63 61 6e 6e 6f 74 20  pParse, "cannot 
14960 75 73 65 20 77 69 6e 64 6f 77 20 66 75 6e 63 74  use window funct
14970 69 6f 6e 73 20 69 6e 20 72 65 63 75 72 73 69 76  ions in recursiv
14980 65 20 71 75 65 72 69 65 73 22 29 3b 0a 20 20 20  e queries");.   
14990 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 23 65 6e   return;.  }.#en
149a0 64 69 66 0a 0a 20 20 2f 2a 20 4f 62 74 61 69 6e  dif..  /* Obtain
149b0 20 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e 20 74   authorization t
149c0 6f 20 64 6f 20 61 20 72 65 63 75 72 73 69 76 65  o do a recursive
149d0 20 71 75 65 72 79 20 2a 2f 0a 20 20 69 66 28 20   query */.  if( 
149e0 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b  sqlite3AuthCheck
149f0 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f  (pParse, SQLITE_
14a00 52 45 43 55 52 53 49 56 45 2c 20 30 2c 20 30 2c  RECURSIVE, 0, 0,
14a10 20 30 29 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20   0) ) return;.. 
14a20 20 2f 2a 20 50 72 6f 63 65 73 73 20 74 68 65 20   /* Process the 
14a30 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46 53 45 54  LIMIT and OFFSET
14a40 20 63 6c 61 75 73 65 73 2c 20 69 66 20 74 68 65   clauses, if the
14a50 79 20 65 78 69 73 74 20 2a 2f 0a 20 20 61 64 64  y exist */.  add
14a60 72 42 72 65 61 6b 20 3d 20 73 71 6c 69 74 65 33  rBreak = sqlite3
14a70 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 70 50  VdbeMakeLabel(pP
14a80 61 72 73 65 29 3b 0a 20 20 70 2d 3e 6e 53 65 6c  arse);.  p->nSel
14a90 65 63 74 52 6f 77 20 3d 20 33 32 30 3b 20 20 2f  ectRow = 320;  /
14aa0 2a 20 34 20 62 69 6c 6c 69 6f 6e 20 72 6f 77 73  * 4 billion rows
14ab0 20 2a 2f 0a 20 20 63 6f 6d 70 75 74 65 4c 69 6d   */.  computeLim
14ac0 69 74 52 65 67 69 73 74 65 72 73 28 70 50 61 72  itRegisters(pPar
14ad0 73 65 2c 20 70 2c 20 61 64 64 72 42 72 65 61 6b  se, p, addrBreak
14ae0 29 3b 0a 20 20 70 4c 69 6d 69 74 20 3d 20 70 2d  );.  pLimit = p-
14af0 3e 70 4c 69 6d 69 74 3b 0a 20 20 72 65 67 4c 69  >pLimit;.  regLi
14b00 6d 69 74 20 3d 20 70 2d 3e 69 4c 69 6d 69 74 3b  mit = p->iLimit;
14b10 0a 20 20 72 65 67 4f 66 66 73 65 74 20 3d 20 70  .  regOffset = p
14b20 2d 3e 69 4f 66 66 73 65 74 3b 0a 20 20 70 2d 3e  ->iOffset;.  p->
14b30 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 70 2d  pLimit = 0;.  p-
14b40 3e 69 4c 69 6d 69 74 20 3d 20 70 2d 3e 69 4f 66  >iLimit = p->iOf
14b50 66 73 65 74 20 3d 20 30 3b 0a 20 20 70 4f 72 64  fset = 0;.  pOrd
14b60 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72  erBy = p->pOrder
14b70 42 79 3b 0a 0a 20 20 2f 2a 20 4c 6f 63 61 74 65  By;..  /* Locate
14b80 20 74 68 65 20 63 75 72 73 6f 72 20 6e 75 6d 62   the cursor numb
14b90 65 72 20 6f 66 20 74 68 65 20 43 75 72 72 65 6e  er of the Curren
14ba0 74 20 74 61 62 6c 65 20 2a 2f 0a 20 20 66 6f 72  t table */.  for
14bb0 28 69 3d 30 3b 20 41 4c 57 41 59 53 28 69 3c 70  (i=0; ALWAYS(i<p
14bc0 53 72 63 2d 3e 6e 53 72 63 29 3b 20 69 2b 2b 29  Src->nSrc); i++)
14bd0 7b 0a 20 20 20 20 69 66 28 20 70 53 72 63 2d 3e  {.    if( pSrc->
14be0 61 5b 69 5d 2e 66 67 2e 69 73 52 65 63 75 72 73  a[i].fg.isRecurs
14bf0 69 76 65 20 29 7b 0a 20 20 20 20 20 20 69 43 75  ive ){.      iCu
14c00 72 72 65 6e 74 20 3d 20 70 53 72 63 2d 3e 61 5b  rrent = pSrc->a[
14c10 69 5d 2e 69 43 75 72 73 6f 72 3b 0a 20 20 20 20  i].iCursor;.    
14c20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
14c30 20 7d 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74   }..  /* Allocat
14c40 65 20 63 75 72 73 6f 72 73 20 6e 75 6d 62 65 72  e cursors number
14c50 73 20 66 6f 72 20 51 75 65 75 65 20 61 6e 64 20  s for Queue and 
14c60 44 69 73 74 69 6e 63 74 2e 20 20 54 68 65 20 63  Distinct.  The c
14c70 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 66 6f 72  ursor number for
14c80 0a 20 20 2a 2a 20 74 68 65 20 44 69 73 74 69 6e  .  ** the Distin
14c90 63 74 20 74 61 62 6c 65 20 6d 75 73 74 20 62 65  ct table must be
14ca0 20 65 78 61 63 74 6c 79 20 6f 6e 65 20 67 72 65   exactly one gre
14cb0 61 74 65 72 20 74 68 61 6e 20 51 75 65 75 65 20  ater than Queue 
14cc0 69 6e 20 6f 72 64 65 72 0a 20 20 2a 2a 20 66 6f  in order.  ** fo
14cd0 72 20 74 68 65 20 53 52 54 5f 44 69 73 74 46 69  r the SRT_DistFi
14ce0 66 6f 20 61 6e 64 20 53 52 54 5f 44 69 73 74 51  fo and SRT_DistQ
14cf0 75 65 75 65 20 64 65 73 74 69 6e 61 74 69 6f 6e  ueue destination
14d00 73 20 74 6f 20 77 6f 72 6b 2e 20 2a 2f 0a 20 20  s to work. */.  
14d10 69 51 75 65 75 65 20 3d 20 70 50 61 72 73 65 2d  iQueue = pParse-
14d20 3e 6e 54 61 62 2b 2b 3b 0a 20 20 69 66 28 20 70  >nTab++;.  if( p
14d30 2d 3e 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29  ->op==TK_UNION )
14d40 7b 0a 20 20 20 20 65 44 65 73 74 20 3d 20 70 4f  {.    eDest = pO
14d50 72 64 65 72 42 79 20 3f 20 53 52 54 5f 44 69 73  rderBy ? SRT_Dis
14d60 74 51 75 65 75 65 20 3a 20 53 52 54 5f 44 69 73  tQueue : SRT_Dis
14d70 74 46 69 66 6f 3b 0a 20 20 20 20 69 44 69 73 74  tFifo;.    iDist
14d80 69 6e 63 74 20 3d 20 70 50 61 72 73 65 2d 3e 6e  inct = pParse->n
14d90 54 61 62 2b 2b 3b 0a 20 20 7d 65 6c 73 65 7b 0a  Tab++;.  }else{.
14da0 20 20 20 20 65 44 65 73 74 20 3d 20 70 4f 72 64      eDest = pOrd
14db0 65 72 42 79 20 3f 20 53 52 54 5f 51 75 65 75 65  erBy ? SRT_Queue
14dc0 20 3a 20 53 52 54 5f 46 69 66 6f 3b 0a 20 20 7d   : SRT_Fifo;.  }
14dd0 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  .  sqlite3Select
14de0 44 65 73 74 49 6e 69 74 28 26 64 65 73 74 51 75  DestInit(&destQu
14df0 65 75 65 2c 20 65 44 65 73 74 2c 20 69 51 75 65  eue, eDest, iQue
14e00 75 65 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63  ue);..  /* Alloc
14e10 61 74 65 20 63 75 72 73 6f 72 73 20 66 6f 72 20  ate cursors for 
14e20 43 75 72 72 65 6e 74 2c 20 51 75 65 75 65 2c 20  Current, Queue, 
14e30 61 6e 64 20 44 69 73 74 69 6e 63 74 2e 20 2a 2f  and Distinct. */
14e40 0a 20 20 72 65 67 43 75 72 72 65 6e 74 20 3d 20  .  regCurrent = 
14e50 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
14e60 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
14e70 4f 70 33 28 76 2c 20 4f 50 5f 4f 70 65 6e 50 73  Op3(v, OP_OpenPs
14e80 65 75 64 6f 2c 20 69 43 75 72 72 65 6e 74 2c 20  eudo, iCurrent, 
14e90 72 65 67 43 75 72 72 65 6e 74 2c 20 6e 43 6f 6c  regCurrent, nCol
14ea0 29 3b 0a 20 20 69 66 28 20 70 4f 72 64 65 72 42  );.  if( pOrderB
14eb0 79 20 29 7b 0a 20 20 20 20 4b 65 79 49 6e 66 6f  y ){.    KeyInfo
14ec0 20 2a 70 4b 65 79 49 6e 66 6f 20 3d 20 6d 75 6c   *pKeyInfo = mul
14ed0 74 69 53 65 6c 65 63 74 4f 72 64 65 72 42 79 4b  tiSelectOrderByK
14ee0 65 79 49 6e 66 6f 28 70 50 61 72 73 65 2c 20 70  eyInfo(pParse, p
14ef0 2c 20 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 1);.    sqlite
14f00 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(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 70 4f 72 64 65 72 42   iQueue, pOrderB
14f30 79 2d 3e 6e 45 78 70 72 2b 32 2c 20 30 2c 0a 20  y->nExpr+2, 0,. 
14f40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14f50 20 20 20 20 20 28 63 68 61 72 2a 29 70 4b 65 79       (char*)pKey
14f60 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f  Info, P4_KEYINFO
14f70 29 3b 0a 20 20 20 20 64 65 73 74 51 75 65 75 65  );.    destQueue
14f80 2e 70 4f 72 64 65 72 42 79 20 3d 20 70 4f 72 64  .pOrderBy = pOrd
14f90 65 72 42 79 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  erBy;.  }else{. 
14fa0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
14fb0 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45  dOp2(v, OP_OpenE
14fc0 70 68 65 6d 65 72 61 6c 2c 20 69 51 75 65 75 65  phemeral, iQueue
14fd0 2c 20 6e 43 6f 6c 29 3b 0a 20 20 7d 0a 20 20 56  , nCol);.  }.  V
14fe0 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
14ff0 51 75 65 75 65 20 74 61 62 6c 65 22 29 29 3b 0a  Queue table"));.
15000 20 20 69 66 28 20 69 44 69 73 74 69 6e 63 74 20    if( iDistinct 
15010 29 7b 0a 20 20 20 20 70 2d 3e 61 64 64 72 4f 70  ){.    p->addrOp
15020 65 6e 45 70 68 6d 5b 30 5d 20 3d 20 73 71 6c 69  enEphm[0] = sqli
15030 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
15040 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61   OP_OpenEphemera
15050 6c 2c 20 69 44 69 73 74 69 6e 63 74 2c 20 30 29  l, iDistinct, 0)
15060 3b 0a 20 20 20 20 70 2d 3e 73 65 6c 46 6c 61 67  ;.    p->selFlag
15070 73 20 7c 3d 20 53 46 5f 55 73 65 73 45 70 68 65  s |= SF_UsesEphe
15080 6d 65 72 61 6c 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  meral;.  }..  /*
15090 20 44 65 74 61 63 68 20 74 68 65 20 4f 52 44 45   Detach the ORDE
150a0 52 20 42 59 20 63 6c 61 75 73 65 20 66 72 6f 6d  R BY clause from
150b0 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 53 45   the compound SE
150c0 4c 45 43 54 20 2a 2f 0a 20 20 70 2d 3e 70 4f 72  LECT */.  p->pOr
150d0 64 65 72 42 79 20 3d 20 30 3b 0a 0a 20 20 2f 2a  derBy = 0;..  /*
150e0 20 53 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c   Store the resul
150f0 74 73 20 6f 66 20 74 68 65 20 73 65 74 75 70 2d  ts of the setup-
15100 71 75 65 72 79 20 69 6e 20 51 75 65 75 65 2e 20  query in Queue. 
15110 2a 2f 0a 20 20 70 53 65 74 75 70 2d 3e 70 4e 65  */.  pSetup->pNe
15120 78 74 20 3d 20 30 3b 0a 20 20 45 78 70 6c 61 69  xt = 0;.  Explai
15130 6e 51 75 65 72 79 50 6c 61 6e 28 28 70 50 61 72  nQueryPlan((pPar
15140 73 65 2c 20 31 2c 20 22 53 45 54 55 50 22 29 29  se, 1, "SETUP"))
15150 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
15160 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70  Select(pParse, p
15170 53 65 74 75 70 2c 20 26 64 65 73 74 51 75 65 75  Setup, &destQueu
15180 65 29 3b 0a 20 20 70 53 65 74 75 70 2d 3e 70 4e  e);.  pSetup->pN
15190 65 78 74 20 3d 20 70 3b 0a 20 20 69 66 28 20 72  ext = p;.  if( r
151a0 63 20 29 20 67 6f 74 6f 20 65 6e 64 5f 6f 66 5f  c ) goto end_of_
151b0 72 65 63 75 72 73 69 76 65 5f 71 75 65 72 79 3b  recursive_query;
151c0 0a 0a 20 20 2f 2a 20 46 69 6e 64 20 74 68 65 20  ..  /* Find the 
151d0 6e 65 78 74 20 72 6f 77 20 69 6e 20 74 68 65 20  next row in the 
151e0 51 75 65 75 65 20 61 6e 64 20 6f 75 74 70 75 74  Queue and output
151f0 20 74 68 61 74 20 72 6f 77 20 2a 2f 0a 20 20 61   that row */.  a
15200 64 64 72 54 6f 70 20 3d 20 73 71 6c 69 74 65 33  ddrTop = sqlite3
15210 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
15220 5f 52 65 77 69 6e 64 2c 20 69 51 75 65 75 65 2c  _Rewind, iQueue,
15230 20 61 64 64 72 42 72 65 61 6b 29 3b 20 56 64 62   addrBreak); Vdb
15240 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 0a 20  eCoverage(v);.. 
15250 20 2f 2a 20 54 72 61 6e 73 66 65 72 20 74 68 65   /* Transfer the
15260 20 6e 65 78 74 20 72 6f 77 20 69 6e 20 51 75 65   next row in Que
15270 75 65 20 6f 76 65 72 20 74 6f 20 43 75 72 72 65  ue over to Curre
15280 6e 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56  nt */.  sqlite3V
15290 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
152a0 4e 75 6c 6c 52 6f 77 2c 20 69 43 75 72 72 65 6e  NullRow, iCurren
152b0 74 29 3b 20 2f 2a 20 54 6f 20 72 65 73 65 74 20  t); /* To reset 
152c0 63 6f 6c 75 6d 6e 20 63 61 63 68 65 20 2a 2f 0a  column cache */.
152d0 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 20 29    if( pOrderBy )
152e0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
152f0 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f  eAddOp3(v, OP_Co
15300 6c 75 6d 6e 2c 20 69 51 75 65 75 65 2c 20 70 4f  lumn, iQueue, pO
15310 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 2b 31 2c  rderBy->nExpr+1,
15320 20 72 65 67 43 75 72 72 65 6e 74 29 3b 0a 20 20   regCurrent);.  
15330 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74  }else{.    sqlit
15340 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
15350 4f 50 5f 52 6f 77 44 61 74 61 2c 20 69 51 75 65  OP_RowData, iQue
15360 75 65 2c 20 72 65 67 43 75 72 72 65 6e 74 29 3b  ue, regCurrent);
15370 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64  .  }.  sqlite3Vd
15380 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 44  beAddOp1(v, OP_D
15390 65 6c 65 74 65 2c 20 69 51 75 65 75 65 29 3b 0a  elete, iQueue);.
153a0 0a 20 20 2f 2a 20 4f 75 74 70 75 74 20 74 68 65  .  /* Output the
153b0 20 73 69 6e 67 6c 65 20 72 6f 77 20 69 6e 20 43   single row in C
153c0 75 72 72 65 6e 74 20 2a 2f 0a 20 20 61 64 64 72  urrent */.  addr
153d0 43 6f 6e 74 20 3d 20 73 71 6c 69 74 65 33 56 64  Cont = sqlite3Vd
153e0 62 65 4d 61 6b 65 4c 61 62 65 6c 28 70 50 61 72  beMakeLabel(pPar
153f0 73 65 29 3b 0a 20 20 63 6f 64 65 4f 66 66 73 65  se);.  codeOffse
15400 74 28 76 2c 20 72 65 67 4f 66 66 73 65 74 2c 20  t(v, regOffset, 
15410 61 64 64 72 43 6f 6e 74 29 3b 0a 20 20 73 65 6c  addrCont);.  sel
15420 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61  ectInnerLoop(pPa
15430 72 73 65 2c 20 70 2c 20 69 43 75 72 72 65 6e 74  rse, p, iCurrent
15440 2c 0a 20 20 20 20 20 20 30 2c 20 30 2c 20 70 44  ,.      0, 0, pD
15450 65 73 74 2c 20 61 64 64 72 43 6f 6e 74 2c 20 61  est, addrCont, a
15460 64 64 72 42 72 65 61 6b 29 3b 0a 20 20 69 66 28  ddrBreak);.  if(
15470 20 72 65 67 4c 69 6d 69 74 20 29 7b 0a 20 20 20   regLimit ){.   
15480 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
15490 70 32 28 76 2c 20 4f 50 5f 44 65 63 72 4a 75 6d  p2(v, OP_DecrJum
154a0 70 5a 65 72 6f 2c 20 72 65 67 4c 69 6d 69 74 2c  pZero, regLimit,
154b0 20 61 64 64 72 42 72 65 61 6b 29 3b 0a 20 20 20   addrBreak);.   
154c0 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
154d0 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56  ;.  }.  sqlite3V
154e0 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
154f0 76 2c 20 61 64 64 72 43 6f 6e 74 29 3b 0a 0a 20  v, addrCont);.. 
15500 20 2f 2a 20 45 78 65 63 75 74 65 20 74 68 65 20   /* Execute the 
15510 72 65 63 75 72 73 69 76 65 20 53 45 4c 45 43 54  recursive SELECT
15520 20 74 61 6b 69 6e 67 20 74 68 65 20 73 69 6e 67   taking the sing
15530 6c 65 20 72 6f 77 20 69 6e 20 43 75 72 72 65 6e  le row in Curren
15540 74 20 61 73 0a 20 20 2a 2a 20 74 68 65 20 76 61  t as.  ** the va
15550 6c 75 65 20 66 6f 72 20 74 68 65 20 72 65 63 75  lue for the recu
15560 72 73 69 76 65 2d 74 61 62 6c 65 2e 20 53 74 6f  rsive-table. Sto
15570 72 65 20 74 68 65 20 72 65 73 75 6c 74 73 20 69  re the results i
15580 6e 20 74 68 65 20 51 75 65 75 65 2e 0a 20 20 2a  n the Queue..  *
15590 2f 0a 20 20 69 66 28 20 70 2d 3e 73 65 6c 46 6c  /.  if( p->selFl
155a0 61 67 73 20 26 20 53 46 5f 41 67 67 72 65 67 61  ags & SF_Aggrega
155b0 74 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  te ){.    sqlite
155c0 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
155d0 2c 20 22 72 65 63 75 72 73 69 76 65 20 61 67 67  , "recursive agg
155e0 72 65 67 61 74 65 20 71 75 65 72 69 65 73 20 6e  regate queries n
155f0 6f 74 20 73 75 70 70 6f 72 74 65 64 22 29 3b 0a  ot supported");.
15600 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 2d 3e    }else{.    p->
15610 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20  pPrior = 0;.    
15620 45 78 70 6c 61 69 6e 51 75 65 72 79 50 6c 61 6e  ExplainQueryPlan
15630 28 28 70 50 61 72 73 65 2c 20 31 2c 20 22 52 45  ((pParse, 1, "RE
15640 43 55 52 53 49 56 45 20 53 54 45 50 22 29 29 3b  CURSIVE STEP"));
15650 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65  .    sqlite3Sele
15660 63 74 28 70 50 61 72 73 65 2c 20 70 2c 20 26 64  ct(pParse, p, &d
15670 65 73 74 51 75 65 75 65 29 3b 0a 20 20 20 20 61  estQueue);.    a
15680 73 73 65 72 74 28 20 70 2d 3e 70 50 72 69 6f 72  ssert( p->pPrior
15690 3d 3d 30 20 29 3b 0a 20 20 20 20 70 2d 3e 70 50  ==0 );.    p->pP
156a0 72 69 6f 72 20 3d 20 70 53 65 74 75 70 3b 0a 20  rior = pSetup;. 
156b0 20 7d 0a 0a 20 20 2f 2a 20 4b 65 65 70 20 72 75   }..  /* Keep ru
156c0 6e 6e 69 6e 67 20 74 68 65 20 6c 6f 6f 70 20 75  nning the loop u
156d0 6e 74 69 6c 20 74 68 65 20 51 75 65 75 65 20 69  ntil the Queue i
156e0 73 20 65 6d 70 74 79 20 2a 2f 0a 20 20 73 71 6c  s empty */.  sql
156f0 69 74 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20  ite3VdbeGoto(v, 
15700 61 64 64 72 54 6f 70 29 3b 0a 20 20 73 71 6c 69  addrTop);.  sqli
15710 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
15720 62 65 6c 28 76 2c 20 61 64 64 72 42 72 65 61 6b  bel(v, addrBreak
15730 29 3b 0a 0a 65 6e 64 5f 6f 66 5f 72 65 63 75 72  );..end_of_recur
15740 73 69 76 65 5f 71 75 65 72 79 3a 0a 20 20 73 71  sive_query:.  sq
15750 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c  lite3ExprListDel
15760 65 74 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ete(pParse->db, 
15770 70 2d 3e 70 4f 72 64 65 72 42 79 29 3b 0a 20 20  p->pOrderBy);.  
15780 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 70 4f  p->pOrderBy = pO
15790 72 64 65 72 42 79 3b 0a 20 20 70 2d 3e 70 4c 69  rderBy;.  p->pLi
157a0 6d 69 74 20 3d 20 70 4c 69 6d 69 74 3b 0a 20 20  mit = pLimit;.  
157b0 72 65 74 75 72 6e 3b 0a 7d 0a 23 65 6e 64 69 66  return;.}.#endif
157c0 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
157d0 43 54 45 20 2a 2f 0a 0a 2f 2a 20 46 6f 72 77 61  CTE */../* Forwa
157e0 72 64 20 72 65 66 65 72 65 6e 63 65 73 20 2a 2f  rd references */
157f0 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 75 6c 74  .static int mult
15800 69 53 65 6c 65 63 74 4f 72 64 65 72 42 79 28 0a  iSelectOrderBy(.
15810 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
15820 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69          /* Parsi
15830 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
15840 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20  Select *p,      
15850 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 69 67        /* The rig
15860 68 74 2d 6d 6f 73 74 20 6f 66 20 53 45 4c 45 43  ht-most of SELEC
15870 54 73 20 74 6f 20 62 65 20 63 6f 64 65 64 20 2a  Ts to be coded *
15880 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 2a  /.  SelectDest *
15890 70 44 65 73 74 20 20 20 20 20 2f 2a 20 57 68 61  pDest     /* Wha
158a0 74 20 74 6f 20 64 6f 20 77 69 74 68 20 71 75 65  t to do with que
158b0 72 79 20 72 65 73 75 6c 74 73 20 2a 2f 0a 29 3b  ry results */.);
158c0 0a 0a 2f 2a 0a 2a 2a 20 48 61 6e 64 6c 65 20 74  ../*.** Handle t
158d0 68 65 20 73 70 65 63 69 61 6c 20 63 61 73 65 20  he special case 
158e0 6f 66 20 61 20 63 6f 6d 70 6f 75 6e 64 2d 73 65  of a compound-se
158f0 6c 65 63 74 20 74 68 61 74 20 6f 72 69 67 69 6e  lect that origin
15900 61 74 65 73 20 66 72 6f 6d 20 61 0a 2a 2a 20 56  ates from a.** V
15910 41 4c 55 45 53 20 63 6c 61 75 73 65 2e 20 20 42  ALUES clause.  B
15920 79 20 68 61 6e 64 6c 69 6e 67 20 74 68 69 73 20  y handling this 
15930 61 73 20 61 20 73 70 65 63 69 61 6c 20 63 61 73  as a special cas
15940 65 2c 20 77 65 20 61 76 6f 69 64 20 64 65 65 70  e, we avoid deep
15950 0a 2a 2a 20 72 65 63 75 72 73 69 6f 6e 2c 20 61  .** recursion, a
15960 6e 64 20 74 68 75 73 20 64 6f 20 6e 6f 74 20 6e  nd thus do not n
15970 65 65 64 20 74 6f 20 65 6e 66 6f 72 63 65 20 74  eed to enforce t
15980 68 65 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f  he SQLITE_LIMIT_
15990 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 0a  COMPOUND_SELECT.
159a0 2a 2a 20 6f 6e 20 61 20 56 41 4c 55 45 53 20 63  ** on a VALUES c
159b0 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 42 65 63  lause..**.** Bec
159c0 61 75 73 65 20 74 68 65 20 53 65 6c 65 63 74 20  ause the Select 
159d0 6f 62 6a 65 63 74 20 6f 72 69 67 69 6e 61 74 65  object originate
159e0 73 20 66 72 6f 6d 20 61 20 56 41 4c 55 45 53 20  s from a VALUES 
159f0 63 6c 61 75 73 65 3a 0a 2a 2a 20 20 20 28 31 29  clause:.**   (1)
15a00 20 54 68 65 72 65 20 69 73 20 6e 6f 20 4c 49 4d   There is no LIM
15a10 49 54 20 6f 72 20 4f 46 46 53 45 54 20 6f 72 20  IT or OFFSET or 
15a20 65 6c 73 65 20 74 68 65 72 65 20 69 73 20 61 20  else there is a 
15a30 4c 49 4d 49 54 20 6f 66 20 65 78 61 63 74 6c 79  LIMIT of exactly
15a40 20 31 0a 2a 2a 20 20 20 28 32 29 20 41 6c 6c 20   1.**   (2) All 
15a50 74 65 72 6d 73 20 61 72 65 20 55 4e 49 4f 4e 20  terms are UNION 
15a60 41 4c 4c 0a 2a 2a 20 20 20 28 33 29 20 54 68 65  ALL.**   (3) The
15a70 72 65 20 69 73 20 6e 6f 20 4f 52 44 45 52 20 42  re is no ORDER B
15a80 59 20 63 6c 61 75 73 65 0a 2a 2a 0a 2a 2a 20 54  Y clause.**.** T
15a90 68 65 20 22 4c 49 4d 49 54 20 6f 66 20 65 78 61  he "LIMIT of exa
15aa0 63 74 6c 79 20 31 22 20 63 61 73 65 20 6f 66 20  ctly 1" case of 
15ab0 63 6f 6e 64 69 74 69 6f 6e 20 28 31 29 20 63 6f  condition (1) co
15ac0 6d 65 73 20 61 62 6f 75 74 20 77 68 65 6e 20 61  mes about when a
15ad0 20 56 41 4c 55 45 53 0a 2a 2a 20 63 6c 61 75 73   VALUES.** claus
15ae0 65 20 6f 63 63 75 72 73 20 77 69 74 68 69 6e 20  e occurs within 
15af0 73 63 61 6c 61 72 20 65 78 70 72 65 73 73 69 6f  scalar expressio
15b00 6e 20 28 65 78 3a 20 22 53 45 4c 45 43 54 20 28  n (ex: "SELECT (
15b10 56 41 4c 55 45 53 28 31 29 2c 28 32 29 2c 28 33  VALUES(1),(2),(3
15b20 29 29 22 29 2e 0a 2a 2a 20 54 68 65 20 73 71 6c  ))")..** The sql
15b30 69 74 65 33 43 6f 64 65 53 75 62 73 65 6c 65 63  ite3CodeSubselec
15b40 74 20 77 69 6c 6c 20 68 61 76 65 20 61 64 64 65  t will have adde
15b50 64 20 74 68 65 20 4c 49 4d 49 54 20 31 20 63 6c  d the LIMIT 1 cl
15b60 61 75 73 65 20 69 6e 20 74 68 74 20 63 61 73 65  ause in tht case
15b70 2e 0a 2a 2a 20 53 69 6e 63 65 20 74 68 65 20 6c  ..** Since the l
15b80 69 6d 69 74 20 69 73 20 65 78 61 63 74 6c 79 20  imit is exactly 
15b90 31 2c 20 77 65 20 6f 6e 6c 79 20 6e 65 65 64 20  1, we only need 
15ba0 74 6f 20 65 76 61 6c 75 74 65 73 20 74 68 65 20  to evalutes the 
15bb0 6c 65 66 74 2d 6d 6f 73 74 20 56 41 4c 55 45 53  left-most VALUES
15bc0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
15bd0 6d 75 6c 74 69 53 65 6c 65 63 74 56 61 6c 75 65  multiSelectValue
15be0 73 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  s(.  Parse *pPar
15bf0 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 61  se,        /* Pa
15c00 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
15c10 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20  .  Select *p,   
15c20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
15c30 72 69 67 68 74 2d 6d 6f 73 74 20 6f 66 20 53 45  right-most of SE
15c40 4c 45 43 54 73 20 74 6f 20 62 65 20 63 6f 64 65  LECTs to be code
15c50 64 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73  d */.  SelectDes
15c60 74 20 2a 70 44 65 73 74 20 20 20 20 20 2f 2a 20  t *pDest     /* 
15c70 57 68 61 74 20 74 6f 20 64 6f 20 77 69 74 68 20  What to do with 
15c80 71 75 65 72 79 20 72 65 73 75 6c 74 73 20 2a 2f  query results */
15c90 0a 29 7b 0a 20 20 69 6e 74 20 6e 52 6f 77 20 3d  .){.  int nRow =
15ca0 20 31 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 30   1;.  int rc = 0
15cb0 3b 0a 20 20 69 6e 74 20 62 53 68 6f 77 41 6c 6c  ;.  int bShowAll
15cc0 20 3d 20 70 2d 3e 70 4c 69 6d 69 74 3d 3d 30 3b   = p->pLimit==0;
15cd0 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 73 65  .  assert( p->se
15ce0 6c 46 6c 61 67 73 20 26 20 53 46 5f 4d 75 6c 74  lFlags & SF_Mult
15cf0 69 56 61 6c 75 65 20 29 3b 0a 20 20 64 6f 7b 0a  iValue );.  do{.
15d00 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 73      assert( p->s
15d10 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 56 61 6c  elFlags & SF_Val
15d20 75 65 73 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ues );.    asser
15d30 74 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c  t( p->op==TK_ALL
15d40 20 7c 7c 20 28 70 2d 3e 6f 70 3d 3d 54 4b 5f 53   || (p->op==TK_S
15d50 45 4c 45 43 54 20 26 26 20 70 2d 3e 70 50 72 69  ELECT && p->pPri
15d60 6f 72 3d 3d 30 29 20 29 3b 0a 20 20 20 20 61 73  or==0) );.    as
15d70 73 65 72 74 28 20 70 2d 3e 70 4e 65 78 74 3d 3d  sert( p->pNext==
15d80 30 20 7c 7c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e  0 || p->pEList->
15d90 6e 45 78 70 72 3d 3d 70 2d 3e 70 4e 65 78 74 2d  nExpr==p->pNext-
15da0 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29  >pEList->nExpr )
15db0 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 50 72  ;.    if( p->pPr
15dc0 69 6f 72 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a  ior==0 ) break;.
15dd0 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70      assert( p->p
15de0 50 72 69 6f 72 2d 3e 70 4e 65 78 74 3d 3d 70 20  Prior->pNext==p 
15df0 29 3b 0a 20 20 20 20 70 20 3d 20 70 2d 3e 70 50  );.    p = p->pP
15e00 72 69 6f 72 3b 0a 20 20 20 20 6e 52 6f 77 20 2b  rior;.    nRow +
15e10 3d 20 62 53 68 6f 77 41 6c 6c 3b 0a 20 20 7d 77  = bShowAll;.  }w
15e20 68 69 6c 65 28 31 29 3b 0a 20 20 45 78 70 6c 61  hile(1);.  Expla
15e30 69 6e 51 75 65 72 79 50 6c 61 6e 28 28 70 50 61  inQueryPlan((pPa
15e40 72 73 65 2c 20 30 2c 20 22 53 43 41 4e 20 25 64  rse, 0, "SCAN %d
15e50 20 43 4f 4e 53 54 41 4e 54 20 52 4f 57 25 73 22   CONSTANT ROW%s"
15e60 2c 20 6e 52 6f 77 2c 0a 20 20 20 20 20 20 20 20  , nRow,.        
15e70 20 20 20 20 20 20 20 20 20 20 20 20 6e 52 6f 77              nRow
15e80 3d 3d 31 20 3f 20 22 22 20 3a 20 22 53 22 29 29  ==1 ? "" : "S"))
15e90 3b 0a 20 20 77 68 69 6c 65 28 20 70 20 29 7b 0a  ;.  while( p ){.
15ea0 20 20 20 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c      selectInnerL
15eb0 6f 6f 70 28 70 50 61 72 73 65 2c 20 70 2c 20 2d  oop(pParse, p, -
15ec0 31 2c 20 30 2c 20 30 2c 20 70 44 65 73 74 2c 20  1, 0, 0, pDest, 
15ed0 31 2c 20 31 29 3b 0a 20 20 20 20 69 66 28 20 21  1, 1);.    if( !
15ee0 62 53 68 6f 77 41 6c 6c 20 29 20 62 72 65 61 6b  bShowAll ) break
15ef0 3b 0a 20 20 20 20 70 2d 3e 6e 53 65 6c 65 63 74  ;.    p->nSelect
15f00 52 6f 77 20 3d 20 6e 52 6f 77 3b 0a 20 20 20 20  Row = nRow;.    
15f10 70 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20  p = p->pNext;.  
15f20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
15f30 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
15f40 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74  tine is called t
15f50 6f 20 70 72 6f 63 65 73 73 20 61 20 63 6f 6d 70  o process a comp
15f60 6f 75 6e 64 20 71 75 65 72 79 20 66 6f 72 6d 20  ound query form 
15f70 66 72 6f 6d 0a 2a 2a 20 74 77 6f 20 6f 72 20 6d  from.** two or m
15f80 6f 72 65 20 73 65 70 61 72 61 74 65 20 71 75 65  ore separate que
15f90 72 69 65 73 20 75 73 69 6e 67 20 55 4e 49 4f 4e  ries using UNION
15fa0 2c 20 55 4e 49 4f 4e 20 41 4c 4c 2c 20 45 58 43  , UNION ALL, EXC
15fb0 45 50 54 2c 20 6f 72 0a 2a 2a 20 49 4e 54 45 52  EPT, or.** INTER
15fc0 53 45 43 54 0a 2a 2a 0a 2a 2a 20 22 70 22 20 70  SECT.**.** "p" p
15fd0 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 72 69 67  oints to the rig
15fe0 68 74 2d 6d 6f 73 74 20 6f 66 20 74 68 65 20 74  ht-most of the t
15ff0 77 6f 20 71 75 65 72 69 65 73 2e 20 20 74 68 65  wo queries.  the
16000 20 71 75 65 72 79 20 6f 6e 20 74 68 65 0a 2a 2a   query on the.**
16010 20 6c 65 66 74 20 69 73 20 70 2d 3e 70 50 72 69   left is p->pPri
16020 6f 72 2e 20 20 54 68 65 20 6c 65 66 74 20 71 75  or.  The left qu
16030 65 72 79 20 63 6f 75 6c 64 20 61 6c 73 6f 20 62  ery could also b
16040 65 20 61 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65  e a compound que
16050 72 79 0a 2a 2a 20 69 6e 20 77 68 69 63 68 20 63  ry.** in which c
16060 61 73 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ase this routine
16070 20 77 69 6c 6c 20 62 65 20 63 61 6c 6c 65 64 20   will be called 
16080 72 65 63 75 72 73 69 76 65 6c 79 2e 20 0a 2a 2a  recursively. .**
16090 0a 2a 2a 20 54 68 65 20 72 65 73 75 6c 74 73 20  .** The results 
160a0 6f 66 20 74 68 65 20 74 6f 74 61 6c 20 71 75 65  of the total que
160b0 72 79 20 61 72 65 20 74 6f 20 62 65 20 77 72 69  ry are to be wri
160c0 74 74 65 6e 20 69 6e 74 6f 20 61 20 64 65 73 74  tten into a dest
160d0 69 6e 61 74 69 6f 6e 0a 2a 2a 20 6f 66 20 74 79  ination.** of ty
160e0 70 65 20 65 44 65 73 74 20 77 69 74 68 20 70 61  pe eDest with pa
160f0 72 61 6d 65 74 65 72 20 69 50 61 72 6d 2e 0a 2a  rameter iParm..*
16100 2a 0a 2a 2a 20 45 78 61 6d 70 6c 65 20 31 3a 20  *.** Example 1: 
16110 20 43 6f 6e 73 69 64 65 72 20 61 20 74 68 72 65   Consider a thre
16120 65 2d 77 61 79 20 63 6f 6d 70 6f 75 6e 64 20 53  e-way compound S
16130 51 4c 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a  QL statement..**
16140 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 61  .**     SELECT a
16150 20 46 52 4f 4d 20 74 31 20 55 4e 49 4f 4e 20 53   FROM t1 UNION S
16160 45 4c 45 43 54 20 62 20 46 52 4f 4d 20 74 32 20  ELECT b FROM t2 
16170 55 4e 49 4f 4e 20 53 45 4c 45 43 54 20 63 20 46  UNION SELECT c F
16180 52 4f 4d 20 74 33 0a 2a 2a 0a 2a 2a 20 54 68 69  ROM t3.**.** Thi
16190 73 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 70  s statement is p
161a0 61 72 73 65 64 20 75 70 20 61 73 20 66 6f 6c 6c  arsed up as foll
161b0 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53  ows:.**.**     S
161c0 45 4c 45 43 54 20 63 20 46 52 4f 4d 20 74 33 0a  ELECT c FROM t3.
161d0 2a 2a 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20  **      |.**    
161e0 20 20 60 2d 2d 2d 2d 2d 3e 20 20 53 45 4c 45 43    `----->  SELEC
161f0 54 20 62 20 46 52 4f 4d 20 74 32 0a 2a 2a 20 20  T b FROM t2.**  
16200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 0a                |.
16210 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
16220 20 20 60 2d 2d 2d 2d 2d 2d 3e 20 20 53 45 4c 45    `------>  SELE
16230 43 54 20 61 20 46 52 4f 4d 20 74 31 0a 2a 2a 0a  CT a FROM t1.**.
16240 2a 2a 20 54 68 65 20 61 72 72 6f 77 73 20 69 6e  ** The arrows in
16250 20 74 68 65 20 64 69 61 67 72 61 6d 20 61 62 6f   the diagram abo
16260 76 65 20 72 65 70 72 65 73 65 6e 74 20 74 68 65  ve represent the
16270 20 53 65 6c 65 63 74 2e 70 50 72 69 6f 72 20 70   Select.pPrior p
16280 6f 69 6e 74 65 72 2e 0a 2a 2a 20 53 6f 20 69 66  ointer..** So if
16290 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
162a0 20 63 61 6c 6c 65 64 20 77 69 74 68 20 70 20 65   called with p e
162b0 71 75 61 6c 20 74 6f 20 74 68 65 20 74 33 20 71  qual to the t3 q
162c0 75 65 72 79 2c 20 74 68 65 6e 0a 2a 2a 20 70 50  uery, then.** pP
162d0 72 69 6f 72 20 77 69 6c 6c 20 62 65 20 74 68 65  rior will be the
162e0 20 74 32 20 71 75 65 72 79 2e 20 20 70 2d 3e 6f   t2 query.  p->o
162f0 70 20 77 69 6c 6c 20 62 65 20 54 4b 5f 55 4e 49  p will be TK_UNI
16300 4f 4e 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e  ON in this case.
16310 0a 2a 2a 0a 2a 2a 20 4e 6f 74 69 63 65 20 74 68  .**.** Notice th
16320 61 74 20 62 65 63 61 75 73 65 20 6f 66 20 74 68  at because of th
16330 65 20 77 61 79 20 53 51 4c 69 74 65 20 70 61 72  e way SQLite par
16340 73 65 73 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c  ses compound SEL
16350 45 43 54 73 2c 20 74 68 65 0a 2a 2a 20 69 6e 64  ECTs, the.** ind
16360 69 76 69 64 75 61 6c 20 73 65 6c 65 63 74 73 20  ividual selects 
16370 61 6c 77 61 79 73 20 67 72 6f 75 70 20 66 72 6f  always group fro
16380 6d 20 6c 65 66 74 20 74 6f 20 72 69 67 68 74 2e  m left to right.
16390 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d  .*/.static int m
163a0 75 6c 74 69 53 65 6c 65 63 74 28 0a 20 20 50 61  ultiSelect(.  Pa
163b0 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
163c0 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63      /* Parsing c
163d0 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65  ontext */.  Sele
163e0 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  ct *p,          
163f0 20 20 2f 2a 20 54 68 65 20 72 69 67 68 74 2d 6d    /* The right-m
16400 6f 73 74 20 6f 66 20 53 45 4c 45 43 54 73 20 74  ost of SELECTs t
16410 6f 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20  o be coded */.  
16420 53 65 6c 65 63 74 44 65 73 74 20 2a 70 44 65 73  SelectDest *pDes
16430 74 20 20 20 20 20 2f 2a 20 57 68 61 74 20 74 6f  t     /* What to
16440 20 64 6f 20 77 69 74 68 20 71 75 65 72 79 20 72   do with query r
16450 65 73 75 6c 74 73 20 2a 2f 0a 29 7b 0a 20 20 69  esults */.){.  i
16460 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
16470 4b 3b 20 20 20 2f 2a 20 53 75 63 63 65 73 73 20  K;   /* Success 
16480 63 6f 64 65 20 66 72 6f 6d 20 61 20 73 75 62 72  code from a subr
16490 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 53 65 6c 65  outine */.  Sele
164a0 63 74 20 2a 70 50 72 69 6f 72 3b 20 20 20 20 20  ct *pPrior;     
164b0 20 20 2f 2a 20 41 6e 6f 74 68 65 72 20 53 45 4c    /* Another SEL
164c0 45 43 54 20 69 6d 6d 65 64 69 61 74 65 6c 79 20  ECT immediately 
164d0 74 6f 20 6f 75 72 20 6c 65 66 74 20 2a 2f 0a 20  to our left */. 
164e0 20 56 64 62 65 20 2a 76 3b 20 20 20 20 20 20 20   Vdbe *v;       
164f0 20 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61         /* Genera
16500 74 65 20 63 6f 64 65 20 74 6f 20 74 68 69 73 20  te code to this 
16510 56 44 42 45 20 2a 2f 0a 20 20 53 65 6c 65 63 74  VDBE */.  Select
16520 44 65 73 74 20 64 65 73 74 3b 20 20 20 20 20 20  Dest dest;      
16530 2f 2a 20 41 6c 74 65 72 6e 61 74 69 76 65 20 64  /* Alternative d
16540 61 74 61 20 64 65 73 74 69 6e 61 74 69 6f 6e 20  ata destination 
16550 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 44 65  */.  Select *pDe
16560 6c 65 74 65 20 3d 20 30 3b 20 20 2f 2a 20 43 68  lete = 0;  /* Ch
16570 61 69 6e 20 6f 66 20 73 69 6d 70 6c 65 20 73 65  ain of simple se
16580 6c 65 63 74 73 20 74 6f 20 64 65 6c 65 74 65 20  lects to delete 
16590 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  */.  sqlite3 *db
165a0 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61  ;          /* Da
165b0 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
165c0 6e 20 2a 2f 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20  n */..  /* Make 
165d0 73 75 72 65 20 74 68 65 72 65 20 69 73 20 6e 6f  sure there is no
165e0 20 4f 52 44 45 52 20 42 59 20 6f 72 20 4c 49 4d   ORDER BY or LIM
165f0 49 54 20 63 6c 61 75 73 65 20 6f 6e 20 70 72 69  IT clause on pri
16600 6f 72 20 53 45 4c 45 43 54 73 2e 20 20 4f 6e 6c  or SELECTs.  Onl
16610 79 0a 20 20 2a 2a 20 74 68 65 20 6c 61 73 74 20  y.  ** the last 
16620 28 72 69 67 68 74 2d 6d 6f 73 74 29 20 53 45 4c  (right-most) SEL
16630 45 43 54 20 69 6e 20 74 68 65 20 73 65 72 69 65  ECT in the serie
16640 73 20 6d 61 79 20 68 61 76 65 20 61 6e 20 4f 52  s may have an OR
16650 44 45 52 20 42 59 20 6f 72 20 4c 49 4d 49 54 2e  DER BY or LIMIT.
16660 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
16670 70 20 26 26 20 70 2d 3e 70 50 72 69 6f 72 20 29  p && p->pPrior )
16680 3b 20 20 2f 2a 20 43 61 6c 6c 69 6e 67 20 66 75  ;  /* Calling fu
16690 6e 63 74 69 6f 6e 20 67 75 61 72 61 6e 74 65 65  nction guarantee
166a0 73 20 74 68 69 73 20 6d 75 63 68 20 2a 2f 0a 20  s this much */. 
166b0 20 61 73 73 65 72 74 28 20 28 70 2d 3e 73 65 6c   assert( (p->sel
166c0 46 6c 61 67 73 20 26 20 53 46 5f 52 65 63 75 72  Flags & SF_Recur
166d0 73 69 76 65 29 3d 3d 30 20 7c 7c 20 70 2d 3e 6f  sive)==0 || p->o
166e0 70 3d 3d 54 4b 5f 41 4c 4c 20 7c 7c 20 70 2d 3e  p==TK_ALL || p->
166f0 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29 3b 0a  op==TK_UNION );.
16700 20 20 61 73 73 65 72 74 28 20 70 2d 3e 73 65 6c    assert( p->sel
16710 46 6c 61 67 73 20 26 20 53 46 5f 43 6f 6d 70 6f  Flags & SF_Compo
16720 75 6e 64 20 29 3b 0a 20 20 64 62 20 3d 20 70 50  und );.  db = pP
16730 61 72 73 65 2d 3e 64 62 3b 0a 20 20 70 50 72 69  arse->db;.  pPri
16740 6f 72 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 0a  or = p->pPrior;.
16750 20 20 64 65 73 74 20 3d 20 2a 70 44 65 73 74 3b    dest = *pDest;
16760 0a 20 20 69 66 28 20 70 50 72 69 6f 72 2d 3e 70  .  if( pPrior->p
16770 4f 72 64 65 72 42 79 20 7c 7c 20 70 50 72 69 6f  OrderBy || pPrio
16780 72 2d 3e 70 4c 69 6d 69 74 20 29 7b 0a 20 20 20  r->pLimit ){.   
16790 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
167a0 28 70 50 61 72 73 65 2c 22 25 73 20 63 6c 61 75  (pParse,"%s clau
167b0 73 65 20 73 68 6f 75 6c 64 20 63 6f 6d 65 20 61  se should come a
167c0 66 74 65 72 20 25 73 20 6e 6f 74 20 62 65 66 6f  fter %s not befo
167d0 72 65 22 2c 0a 20 20 20 20 20 20 70 50 72 69 6f  re",.      pPrio
167e0 72 2d 3e 70 4f 72 64 65 72 42 79 21 3d 30 20 3f  r->pOrderBy!=0 ?
167f0 20 22 4f 52 44 45 52 20 42 59 22 20 3a 20 22 4c   "ORDER BY" : "L
16800 49 4d 49 54 22 2c 20 73 65 6c 65 63 74 4f 70 4e  IMIT", selectOpN
16810 61 6d 65 28 70 2d 3e 6f 70 29 29 3b 0a 20 20 20  ame(p->op));.   
16820 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 67 6f 74   rc = 1;.    got
16830 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65  o multi_select_e
16840 6e 64 3b 0a 20 20 7d 0a 0a 20 20 76 20 3d 20 73  nd;.  }..  v = s
16850 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50  qlite3GetVdbe(pP
16860 61 72 73 65 29 3b 0a 20 20 61 73 73 65 72 74 28  arse);.  assert(
16870 20 76 21 3d 30 20 29 3b 20 20 2f 2a 20 54 68 65   v!=0 );  /* The
16880 20 56 44 42 45 20 61 6c 72 65 61 64 79 20 63 72   VDBE already cr
16890 65 61 74 65 64 20 62 79 20 63 61 6c 6c 69 6e 67  eated by calling
168a0 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 0a 20 20   function */..  
168b0 2f 2a 20 43 72 65 61 74 65 20 74 68 65 20 64 65  /* Create the de
168c0 73 74 69 6e 61 74 69 6f 6e 20 74 65 6d 70 6f 72  stination tempor
168d0 61 72 79 20 74 61 62 6c 65 20 69 66 20 6e 65 63  ary table if nec
168e0 65 73 73 61 72 79 0a 20 20 2a 2f 0a 20 20 69 66  essary.  */.  if
168f0 28 20 64 65 73 74 2e 65 44 65 73 74 3d 3d 53 52  ( dest.eDest==SR
16900 54 5f 45 70 68 65 6d 54 61 62 20 29 7b 0a 20 20  T_EphemTab ){.  
16910 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c    assert( p->pEL
16920 69 73 74 20 29 3b 0a 20 20 20 20 73 71 6c 69 74  ist );.    sqlit
16930 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
16940 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c  OP_OpenEphemeral
16950 2c 20 64 65 73 74 2e 69 53 44 50 61 72 6d 2c 20  , dest.iSDParm, 
16960 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  p->pEList->nExpr
16970 29 3b 0a 20 20 20 20 64 65 73 74 2e 65 44 65 73  );.    dest.eDes
16980 74 20 3d 20 53 52 54 5f 54 61 62 6c 65 3b 0a 20  t = SRT_Table;. 
16990 20 7d 0a 0a 20 20 2f 2a 20 53 70 65 63 69 61 6c   }..  /* Special
169a0 20 68 61 6e 64 6c 69 6e 67 20 66 6f 72 20 61 20   handling for a 
169b0 63 6f 6d 70 6f 75 6e 64 2d 73 65 6c 65 63 74 20  compound-select 
169c0 74 68 61 74 20 6f 72 69 67 69 6e 61 74 65 73 20  that originates 
169d0 61 73 20 61 20 56 41 4c 55 45 53 20 63 6c 61 75  as a VALUES clau
169e0 73 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  se..  */.  if( p
169f0 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f  ->selFlags & SF_
16a00 4d 75 6c 74 69 56 61 6c 75 65 20 29 7b 0a 20 20  MultiValue ){.  
16a10 20 20 72 63 20 3d 20 6d 75 6c 74 69 53 65 6c 65    rc = multiSele
16a20 63 74 56 61 6c 75 65 73 28 70 50 61 72 73 65 2c  ctValues(pParse,
16a30 20 70 2c 20 26 64 65 73 74 29 3b 0a 20 20 20 20   p, &dest);.    
16a40 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63  goto multi_selec
16a50 74 5f 65 6e 64 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  t_end;.  }..  /*
16a60 20 4d 61 6b 65 20 73 75 72 65 20 61 6c 6c 20 53   Make sure all S
16a70 45 4c 45 43 54 73 20 69 6e 20 74 68 65 20 73 74  ELECTs in the st
16a80 61 74 65 6d 65 6e 74 20 68 61 76 65 20 74 68 65  atement have the
16a90 20 73 61 6d 65 20 6e 75 6d 62 65 72 20 6f 66 20   same number of 
16aa0 65 6c 65 6d 65 6e 74 73 0a 20 20 2a 2a 20 69 6e  elements.  ** in
16ab0 20 74 68 65 69 72 20 72 65 73 75 6c 74 20 73 65   their result se
16ac0 74 73 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  ts..  */.  asser
16ad0 74 28 20 70 2d 3e 70 45 4c 69 73 74 20 26 26 20  t( p->pEList && 
16ae0 70 50 72 69 6f 72 2d 3e 70 45 4c 69 73 74 20 29  pPrior->pEList )
16af0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70  ;.  assert( p->p
16b00 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 70 50  EList->nExpr==pP
16b10 72 69 6f 72 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45  rior->pEList->nE
16b20 78 70 72 20 29 3b 0a 0a 23 69 66 6e 64 65 66 20  xpr );..#ifndef 
16b30 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 54 45 0a  SQLITE_OMIT_CTE.
16b40 20 20 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61 67    if( p->selFlag
16b50 73 20 26 20 53 46 5f 52 65 63 75 72 73 69 76 65  s & SF_Recursive
16b60 20 29 7b 0a 20 20 20 20 67 65 6e 65 72 61 74 65   ){.    generate
16b70 57 69 74 68 52 65 63 75 72 73 69 76 65 51 75 65  WithRecursiveQue
16b80 72 79 28 70 50 61 72 73 65 2c 20 70 2c 20 26 64  ry(pParse, p, &d
16b90 65 73 74 29 3b 0a 20 20 7d 65 6c 73 65 0a 23 65  est);.  }else.#e
16ba0 6e 64 69 66 0a 0a 20 20 2f 2a 20 43 6f 6d 70 6f  ndif..  /* Compo
16bb0 75 6e 64 20 53 45 4c 45 43 54 73 20 74 68 61 74  und SELECTs that
16bc0 20 68 61 76 65 20 61 6e 20 4f 52 44 45 52 20 42   have an ORDER B
16bd0 59 20 63 6c 61 75 73 65 20 61 72 65 20 68 61 6e  Y clause are han
16be0 64 6c 65 64 20 73 65 70 61 72 61 74 65 6c 79 2e  dled separately.
16bf0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70  .  */.  if( p->p
16c00 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 72  OrderBy ){.    r
16c10 65 74 75 72 6e 20 6d 75 6c 74 69 53 65 6c 65 63  eturn multiSelec
16c20 74 4f 72 64 65 72 42 79 28 70 50 61 72 73 65 2c  tOrderBy(pParse,
16c30 20 70 2c 20 70 44 65 73 74 29 3b 0a 20 20 7d 65   p, pDest);.  }e
16c40 6c 73 65 7b 0a 0a 23 69 66 6e 64 65 66 20 53 51  lse{..#ifndef SQ
16c50 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49  LITE_OMIT_EXPLAI
16c60 4e 0a 20 20 20 20 69 66 28 20 70 50 72 69 6f 72  N.    if( pPrior
16c70 2d 3e 70 50 72 69 6f 72 3d 3d 30 20 29 7b 0a 20  ->pPrior==0 ){. 
16c80 20 20 20 20 20 45 78 70 6c 61 69 6e 51 75 65 72       ExplainQuer
16c90 79 50 6c 61 6e 28 28 70 50 61 72 73 65 2c 20 31  yPlan((pParse, 1
16ca0 2c 20 22 43 4f 4d 50 4f 55 4e 44 20 51 55 45 52  , "COMPOUND QUER
16cb0 59 22 29 29 3b 0a 20 20 20 20 20 20 45 78 70 6c  Y"));.      Expl
16cc0 61 69 6e 51 75 65 72 79 50 6c 61 6e 28 28 70 50  ainQueryPlan((pP
16cd0 61 72 73 65 2c 20 31 2c 20 22 4c 45 46 54 2d 4d  arse, 1, "LEFT-M
16ce0 4f 53 54 20 53 55 42 51 55 45 52 59 22 29 29 3b  OST SUBQUERY"));
16cf0 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  .    }.#endif.. 
16d00 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63     /* Generate c
16d10 6f 64 65 20 66 6f 72 20 74 68 65 20 6c 65 66 74  ode for the left
16d20 20 61 6e 64 20 72 69 67 68 74 20 53 45 4c 45 43   and right SELEC
16d30 54 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 20 20  T statements..  
16d40 20 20 2a 2f 0a 20 20 20 20 73 77 69 74 63 68 28    */.    switch(
16d50 20 70 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 20 20   p->op ){.      
16d60 63 61 73 65 20 54 4b 5f 41 4c 4c 3a 20 7b 0a 20  case TK_ALL: {. 
16d70 20 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 20         int addr 
16d80 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 69 6e 74  = 0;.        int
16d90 20 6e 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 20   nLimit;.       
16da0 20 61 73 73 65 72 74 28 20 21 70 50 72 69 6f 72   assert( !pPrior
16db0 2d 3e 70 4c 69 6d 69 74 20 29 3b 0a 20 20 20 20  ->pLimit );.    
16dc0 20 20 20 20 70 50 72 69 6f 72 2d 3e 69 4c 69 6d      pPrior->iLim
16dd0 69 74 20 3d 20 70 2d 3e 69 4c 69 6d 69 74 3b 0a  it = p->iLimit;.
16de0 20 20 20 20 20 20 20 20 70 50 72 69 6f 72 2d 3e          pPrior->
16df0 69 4f 66 66 73 65 74 20 3d 20 70 2d 3e 69 4f 66  iOffset = p->iOf
16e00 66 73 65 74 3b 0a 20 20 20 20 20 20 20 20 70 50  fset;.        pP
16e10 72 69 6f 72 2d 3e 70 4c 69 6d 69 74 20 3d 20 70  rior->pLimit = p
16e20 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20  ->pLimit;.      
16e30 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53 65    rc = sqlite3Se
16e40 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 50 72  lect(pParse, pPr
16e50 69 6f 72 2c 20 26 64 65 73 74 29 3b 0a 20 20 20  ior, &dest);.   
16e60 20 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d       p->pLimit =
16e70 20 30 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   0;.        if( 
16e80 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  rc ){.          
16e90 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63  goto multi_selec
16ea0 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 20 20 7d  t_end;.        }
16eb0 0a 20 20 20 20 20 20 20 20 70 2d 3e 70 50 72 69  .        p->pPri
16ec0 6f 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  or = 0;.        
16ed0 70 2d 3e 69 4c 69 6d 69 74 20 3d 20 70 50 72 69  p->iLimit = pPri
16ee0 6f 72 2d 3e 69 4c 69 6d 69 74 3b 0a 20 20 20 20  or->iLimit;.    
16ef0 20 20 20 20 70 2d 3e 69 4f 66 66 73 65 74 20 3d      p->iOffset =
16f00 20 70 50 72 69 6f 72 2d 3e 69 4f 66 66 73 65 74   pPrior->iOffset
16f10 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 2d  ;.        if( p-
16f20 3e 69 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 20  >iLimit ){.     
16f30 20 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69       addr = sqli
16f40 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
16f50 20 4f 50 5f 49 66 4e 6f 74 2c 20 70 2d 3e 69 4c   OP_IfNot, p->iL
16f60 69 6d 69 74 29 3b 20 56 64 62 65 43 6f 76 65 72  imit); VdbeCover
16f70 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20  age(v);.        
16f80 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
16f90 2c 20 22 4a 75 6d 70 20 61 68 65 61 64 20 69 66  , "Jump ahead if
16fa0 20 4c 49 4d 49 54 20 72 65 61 63 68 65 64 22 29   LIMIT reached")
16fb0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
16fc0 20 70 2d 3e 69 4f 66 66 73 65 74 20 29 7b 0a 20   p->iOffset ){. 
16fd0 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
16fe0 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
16ff0 4f 50 5f 4f 66 66 73 65 74 4c 69 6d 69 74 2c 0a  OP_OffsetLimit,.
17000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 2d                p-
17020 3e 69 4c 69 6d 69 74 2c 20 70 2d 3e 69 4f 66 66  >iLimit, p->iOff
17030 73 65 74 2b 31 2c 20 70 2d 3e 69 4f 66 66 73 65  set+1, p->iOffse
17040 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  t);.          }.
17050 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
17060 20 20 45 78 70 6c 61 69 6e 51 75 65 72 79 50 6c    ExplainQueryPl
17070 61 6e 28 28 70 50 61 72 73 65 2c 20 31 2c 20 22  an((pParse, 1, "
17080 55 4e 49 4f 4e 20 41 4c 4c 22 29 29 3b 0a 20 20  UNION ALL"));.  
17090 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
170a0 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c  e3Select(pParse,
170b0 20 70 2c 20 26 64 65 73 74 29 3b 0a 20 20 20 20   p, &dest);.    
170c0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 63      testcase( rc
170d0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  !=SQLITE_OK );. 
170e0 20 20 20 20 20 20 20 70 44 65 6c 65 74 65 20 3d         pDelete =
170f0 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20   p->pPrior;.    
17100 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20      p->pPrior = 
17110 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 20 20  pPrior;.        
17120 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20  p->nSelectRow = 
17130 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 41 64 64  sqlite3LogEstAdd
17140 28 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 2c 20  (p->nSelectRow, 
17150 70 50 72 69 6f 72 2d 3e 6e 53 65 6c 65 63 74 52  pPrior->nSelectR
17160 6f 77 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ow);.        if(
17170 20 70 50 72 69 6f 72 2d 3e 70 4c 69 6d 69 74 0a   pPrior->pLimit.
17180 20 20 20 20 20 20 20 20 20 26 26 20 73 71 6c 69           && sqli
17190 74 65 33 45 78 70 72 49 73 49 6e 74 65 67 65 72  te3ExprIsInteger
171a0 28 70 50 72 69 6f 72 2d 3e 70 4c 69 6d 69 74 2d  (pPrior->pLimit-
171b0 3e 70 4c 65 66 74 2c 20 26 6e 4c 69 6d 69 74 29  >pLeft, &nLimit)
171c0 0a 20 20 20 20 20 20 20 20 20 26 26 20 6e 4c 69  .         && nLi
171d0 6d 69 74 3e 30 20 26 26 20 70 2d 3e 6e 53 65 6c  mit>0 && p->nSel
171e0 65 63 74 52 6f 77 20 3e 20 73 71 6c 69 74 65 33  ectRow > sqlite3
171f0 4c 6f 67 45 73 74 28 28 75 36 34 29 6e 4c 69 6d  LogEst((u64)nLim
17200 69 74 29 20 0a 20 20 20 20 20 20 20 20 29 7b 0a  it) .        ){.
17210 20 20 20 20 20 20 20 20 20 20 70 2d 3e 6e 53 65            p->nSe
17220 6c 65 63 74 52 6f 77 20 3d 20 73 71 6c 69 74 65  lectRow = sqlite
17230 33 4c 6f 67 45 73 74 28 28 75 36 34 29 6e 4c 69  3LogEst((u64)nLi
17240 6d 69 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  mit);.        }.
17250 20 20 20 20 20 20 20 20 69 66 28 20 61 64 64 72          if( addr
17260 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
17270 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
17280 65 28 76 2c 20 61 64 64 72 29 3b 0a 20 20 20 20  e(v, addr);.    
17290 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 62 72      }.        br
172a0 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
172b0 20 20 20 63 61 73 65 20 54 4b 5f 45 58 43 45 50     case TK_EXCEP
172c0 54 3a 0a 20 20 20 20 20 20 63 61 73 65 20 54 4b  T:.      case TK
172d0 5f 55 4e 49 4f 4e 3a 20 7b 0a 20 20 20 20 20 20  _UNION: {.      
172e0 20 20 69 6e 74 20 75 6e 69 6f 6e 54 61 62 3b 20    int unionTab; 
172f0 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6e 75 6d     /* Cursor num
17300 62 65 72 20 6f 66 20 74 68 65 20 74 65 6d 70 20  ber of the temp 
17310 74 61 62 6c 65 20 68 6f 6c 64 69 6e 67 20 72 65  table holding re
17320 73 75 6c 74 20 2a 2f 0a 20 20 20 20 20 20 20 20  sult */.        
17330 75 38 20 6f 70 20 3d 20 30 3b 20 20 20 20 20 20  u8 op = 0;      
17340 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20 53   /* One of the S
17350 52 54 5f 20 6f 70 65 72 61 74 69 6f 6e 73 20 74  RT_ operations t
17360 6f 20 61 70 70 6c 79 20 74 6f 20 73 65 6c 66 20  o apply to self 
17370 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 70  */.        int p
17380 72 69 6f 72 4f 70 3b 20 20 20 20 20 2f 2a 20 54  riorOp;     /* T
17390 68 65 20 53 52 54 5f 20 6f 70 65 72 61 74 69 6f  he SRT_ operatio
173a0 6e 20 74 6f 20 61 70 70 6c 79 20 74 6f 20 70 72  n to apply to pr
173b0 69 6f 72 20 73 65 6c 65 63 74 73 20 2a 2f 0a 20  ior selects */. 
173c0 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 4c 69         Expr *pLi
173d0 6d 69 74 3b 20 20 20 20 2f 2a 20 53 61 76 65 64  mit;    /* Saved
173e0 20 76 61 6c 75 65 73 20 6f 66 20 70 2d 3e 6e 4c   values of p->nL
173f0 69 6d 69 74 20 20 2a 2f 0a 20 20 20 20 20 20 20  imit  */.       
17400 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 20 20 20   int addr;.     
17410 20 20 20 53 65 6c 65 63 74 44 65 73 74 20 75 6e     SelectDest un
17420 69 6f 6e 64 65 73 74 3b 0a 20 20 0a 20 20 20 20  iondest;.  .    
17430 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 2d      testcase( p-
17440 3e 6f 70 3d 3d 54 4b 5f 45 58 43 45 50 54 20 29  >op==TK_EXCEPT )
17450 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  ;.        testca
17460 73 65 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 4e  se( p->op==TK_UN
17470 49 4f 4e 20 29 3b 0a 20 20 20 20 20 20 20 20 70  ION );.        p
17480 72 69 6f 72 4f 70 20 3d 20 53 52 54 5f 55 6e 69  riorOp = SRT_Uni
17490 6f 6e 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  on;.        if( 
174a0 64 65 73 74 2e 65 44 65 73 74 3d 3d 70 72 69 6f  dest.eDest==prio
174b0 72 4f 70 20 29 7b 0a 20 20 20 20 20 20 20 20 20  rOp ){.         
174c0 20 2f 2a 20 57 65 20 63 61 6e 20 72 65 75 73 65   /* We can reuse
174d0 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62   a temporary tab
174e0 6c 65 20 67 65 6e 65 72 61 74 65 64 20 62 79 20  le generated by 
174f0 61 20 53 45 4c 45 43 54 20 74 6f 20 6f 75 72 0a  a SELECT to our.
17500 20 20 20 20 20 20 20 20 20 20 2a 2a 20 72 69 67            ** rig
17510 68 74 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f  ht..          */
17520 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
17530 74 28 20 70 2d 3e 70 4c 69 6d 69 74 3d 3d 30 20  t( p->pLimit==0 
17540 29 3b 20 20 20 20 20 20 2f 2a 20 4e 6f 74 20 61  );      /* Not a
17550 6c 6c 6f 77 65 64 20 6f 6e 20 6c 65 66 74 77 61  llowed on leftwa
17560 72 64 20 65 6c 65 6d 65 6e 74 73 20 2a 2f 0a 20  rd elements */. 
17570 20 20 20 20 20 20 20 20 20 75 6e 69 6f 6e 54 61           unionTa
17580 62 20 3d 20 64 65 73 74 2e 69 53 44 50 61 72 6d  b = dest.iSDParm
17590 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
175a0 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 65  .          /* We
175b0 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f 20 63 72   will need to cr
175c0 65 61 74 65 20 6f 75 72 20 6f 77 6e 20 74 65 6d  eate our own tem
175d0 70 6f 72 61 72 79 20 74 61 62 6c 65 20 74 6f 20  porary table to 
175e0 68 6f 6c 64 20 74 68 65 0a 20 20 20 20 20 20 20  hold the.       
175f0 20 20 20 2a 2a 20 69 6e 74 65 72 6d 65 64 69 61     ** intermedia
17600 74 65 20 72 65 73 75 6c 74 73 2e 0a 20 20 20 20  te results..    
17610 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
17620 20 20 20 75 6e 69 6f 6e 54 61 62 20 3d 20 70 50     unionTab = pP
17630 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20  arse->nTab++;.  
17640 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
17650 70 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 29  p->pOrderBy==0 )
17660 3b 0a 20 20 20 20 20 20 20 20 20 20 61 64 64 72  ;.          addr
17670 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
17680 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45  dOp2(v, OP_OpenE
17690 70 68 65 6d 65 72 61 6c 2c 20 75 6e 69 6f 6e 54  phemeral, unionT
176a0 61 62 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  ab, 0);.        
176b0 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 64 64    assert( p->add
176c0 72 4f 70 65 6e 45 70 68 6d 5b 30 5d 20 3d 3d 20  rOpenEphm[0] == 
176d0 2d 31 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  -1 );.          
176e0 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b  p->addrOpenEphm[
176f0 30 5d 20 3d 20 61 64 64 72 3b 0a 20 20 20 20 20  0] = addr;.     
17700 20 20 20 20 20 66 69 6e 64 52 69 67 68 74 6d 6f       findRightmo
17710 73 74 28 70 29 2d 3e 73 65 6c 46 6c 61 67 73 20  st(p)->selFlags 
17720 7c 3d 20 53 46 5f 55 73 65 73 45 70 68 65 6d 65  |= SF_UsesEpheme
17730 72 61 6c 3b 0a 20 20 20 20 20 20 20 20 20 20 61  ral;.          a
17740 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74  ssert( p->pEList
17750 20 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   );.        }.  
17760 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 64 65  .        /* Code
17770 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74   the SELECT stat
17780 65 6d 65 6e 74 73 20 74 6f 20 6f 75 72 20 6c 65  ements to our le
17790 66 74 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  ft.        */.  
177a0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70        assert( !p
177b0 50 72 69 6f 72 2d 3e 70 4f 72 64 65 72 42 79 20  Prior->pOrderBy 
177c0 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
177d0 65 33 53 65 6c 65 63 74 44 65 73 74 49 6e 69 74  e3SelectDestInit
177e0 28 26 75 6e 69 6f 6e 64 65 73 74 2c 20 70 72 69  (&uniondest, pri
177f0 6f 72 4f 70 2c 20 75 6e 69 6f 6e 54 61 62 29 3b  orOp, unionTab);
17800 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
17810 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72  lite3Select(pPar
17820 73 65 2c 20 70 50 72 69 6f 72 2c 20 26 75 6e 69  se, pPrior, &uni
17830 6f 6e 64 65 73 74 29 3b 0a 20 20 20 20 20 20 20  ondest);.       
17840 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
17850 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f       goto multi_
17860 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20  select_end;.    
17870 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 20 20 20      }.  .       
17880 20 2f 2a 20 43 6f 64 65 20 74 68 65 20 63 75 72   /* Code the cur
17890 72 65 6e 74 20 53 45 4c 45 43 54 20 73 74 61 74  rent SELECT stat
178a0 65 6d 65 6e 74 0a 20 20 20 20 20 20 20 20 2a 2f  ement.        */
178b0 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e  .        if( p->
178c0 6f 70 3d 3d 54 4b 5f 45 58 43 45 50 54 20 29 7b  op==TK_EXCEPT ){
178d0 0a 20 20 20 20 20 20 20 20 20 20 6f 70 20 3d 20  .          op = 
178e0 53 52 54 5f 45 78 63 65 70 74 3b 0a 20 20 20 20  SRT_Except;.    
178f0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
17900 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
17910 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29 3b 0a  op==TK_UNION );.
17920 20 20 20 20 20 20 20 20 20 20 6f 70 20 3d 20 53            op = S
17930 52 54 5f 55 6e 69 6f 6e 3b 0a 20 20 20 20 20 20  RT_Union;.      
17940 20 20 7d 0a 20 20 20 20 20 20 20 20 70 2d 3e 70    }.        p->p
17950 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20 20  Prior = 0;.     
17960 20 20 20 70 4c 69 6d 69 74 20 3d 20 70 2d 3e 70     pLimit = p->p
17970 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 20 20 70  Limit;.        p
17980 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20  ->pLimit = 0;.  
17990 20 20 20 20 20 20 75 6e 69 6f 6e 64 65 73 74 2e        uniondest.
179a0 65 44 65 73 74 20 3d 20 6f 70 3b 0a 20 20 20 20  eDest = op;.    
179b0 20 20 20 20 45 78 70 6c 61 69 6e 51 75 65 72 79      ExplainQuery
179c0 50 6c 61 6e 28 28 70 50 61 72 73 65 2c 20 31 2c  Plan((pParse, 1,
179d0 20 22 25 73 20 55 53 49 4e 47 20 54 45 4d 50 20   "%s USING TEMP 
179e0 42 2d 54 52 45 45 22 2c 0a 20 20 20 20 20 20 20  B-TREE",.       
179f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17a00 20 20 20 73 65 6c 65 63 74 4f 70 4e 61 6d 65 28     selectOpName(
17a10 70 2d 3e 6f 70 29 29 29 3b 0a 20 20 20 20 20 20  p->op)));.      
17a20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53 65    rc = sqlite3Se
17a30 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 2c 20  lect(pParse, p, 
17a40 26 75 6e 69 6f 6e 64 65 73 74 29 3b 0a 20 20 20  &uniondest);.   
17a50 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72       testcase( r
17a60 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  c!=SQLITE_OK );.
17a70 20 20 20 20 20 20 20 20 2f 2a 20 51 75 65 72 79          /* Query
17a80 20 66 6c 61 74 74 65 6e 69 6e 67 20 69 6e 20 73   flattening in s
17a90 71 6c 69 74 65 33 53 65 6c 65 63 74 28 29 20 6d  qlite3Select() m
17aa0 69 67 68 74 20 72 65 66 69 6c 6c 20 70 2d 3e 70  ight refill p->p
17ab0 4f 72 64 65 72 42 79 2e 0a 20 20 20 20 20 20 20  OrderBy..       
17ac0 20 2a 2a 20 42 65 20 73 75 72 65 20 74 6f 20 64   ** Be sure to d
17ad0 65 6c 65 74 65 20 70 2d 3e 70 4f 72 64 65 72 42  elete p->pOrderB
17ae0 79 2c 20 74 68 65 72 65 66 6f 72 65 2c 20 74 6f  y, therefore, to
17af0 20 61 76 6f 69 64 20 61 20 6d 65 6d 6f 72 79 20   avoid a memory 
17b00 6c 65 61 6b 2e 20 2a 2f 0a 20 20 20 20 20 20 20  leak. */.       
17b10 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
17b20 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 4f  Delete(db, p->pO
17b30 72 64 65 72 42 79 29 3b 0a 20 20 20 20 20 20 20  rderBy);.       
17b40 20 70 44 65 6c 65 74 65 20 3d 20 70 2d 3e 70 50   pDelete = p->pP
17b50 72 69 6f 72 3b 0a 20 20 20 20 20 20 20 20 70 2d  rior;.        p-
17b60 3e 70 50 72 69 6f 72 20 3d 20 70 50 72 69 6f 72  >pPrior = pPrior
17b70 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 70 4f 72  ;.        p->pOr
17b80 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 20 20 20  derBy = 0;.     
17b90 20 20 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b     if( p->op==TK
17ba0 5f 55 4e 49 4f 4e 20 29 7b 0a 20 20 20 20 20 20  _UNION ){.      
17bb0 20 20 20 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f      p->nSelectRo
17bc0 77 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73  w = sqlite3LogEs
17bd0 74 41 64 64 28 70 2d 3e 6e 53 65 6c 65 63 74 52  tAdd(p->nSelectR
17be0 6f 77 2c 20 70 50 72 69 6f 72 2d 3e 6e 53 65 6c  ow, pPrior->nSel
17bf0 65 63 74 52 6f 77 29 3b 0a 20 20 20 20 20 20 20  ectRow);.       
17c00 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74   }.        sqlit
17c10 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c  e3ExprDelete(db,
17c20 20 70 2d 3e 70 4c 69 6d 69 74 29 3b 0a 20 20 20   p->pLimit);.   
17c30 20 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d       p->pLimit =
17c40 20 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 20   pLimit;.       
17c50 20 70 2d 3e 69 4c 69 6d 69 74 20 3d 20 30 3b 0a   p->iLimit = 0;.
17c60 20 20 20 20 20 20 20 20 70 2d 3e 69 4f 66 66 73          p->iOffs
17c70 65 74 20 3d 20 30 3b 0a 20 20 0a 20 20 20 20 20  et = 0;.  .     
17c80 20 20 20 2f 2a 20 43 6f 6e 76 65 72 74 20 74 68     /* Convert th
17c90 65 20 64 61 74 61 20 69 6e 20 74 68 65 20 74 65  e data in the te
17ca0 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 69 6e  mporary table in
17cb0 74 6f 20 77 68 61 74 65 76 65 72 20 66 6f 72 6d  to whatever form
17cc0 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 74 20 69  .        ** it i
17cd0 73 20 74 68 61 74 20 77 65 20 63 75 72 72 65 6e  s that we curren
17ce0 74 6c 79 20 6e 65 65 64 2e 0a 20 20 20 20 20 20  tly need..      
17cf0 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73    */.        ass
17d00 65 72 74 28 20 75 6e 69 6f 6e 54 61 62 3d 3d 64  ert( unionTab==d
17d10 65 73 74 2e 69 53 44 50 61 72 6d 20 7c 7c 20 64  est.iSDParm || d
17d20 65 73 74 2e 65 44 65 73 74 21 3d 70 72 69 6f 72  est.eDest!=prior
17d30 4f 70 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66  Op );.        if
17d40 28 20 64 65 73 74 2e 65 44 65 73 74 21 3d 70 72  ( dest.eDest!=pr
17d50 69 6f 72 4f 70 20 29 7b 0a 20 20 20 20 20 20 20  iorOp ){.       
17d60 20 20 20 69 6e 74 20 69 43 6f 6e 74 2c 20 69 42     int iCont, iB
17d70 72 65 61 6b 2c 20 69 53 74 61 72 74 3b 0a 20 20  reak, iStart;.  
17d80 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
17d90 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20 20  p->pEList );.   
17da0 20 20 20 20 20 20 20 69 42 72 65 61 6b 20 3d 20         iBreak = 
17db0 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
17dc0 61 62 65 6c 28 70 50 61 72 73 65 29 3b 0a 20 20  abel(pParse);.  
17dd0 20 20 20 20 20 20 20 20 69 43 6f 6e 74 20 3d 20          iCont = 
17de0 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
17df0 61 62 65 6c 28 70 50 61 72 73 65 29 3b 0a 20 20  abel(pParse);.  
17e00 20 20 20 20 20 20 20 20 63 6f 6d 70 75 74 65 4c          computeL
17e10 69 6d 69 74 52 65 67 69 73 74 65 72 73 28 70 50  imitRegisters(pP
17e20 61 72 73 65 2c 20 70 2c 20 69 42 72 65 61 6b 29  arse, p, iBreak)
17e30 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
17e40 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
17e50 20 4f 50 5f 52 65 77 69 6e 64 2c 20 75 6e 69 6f   OP_Rewind, unio
17e60 6e 54 61 62 2c 20 69 42 72 65 61 6b 29 3b 20 56  nTab, iBreak); V
17e70 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
17e80 20 20 20 20 20 20 20 20 20 20 69 53 74 61 72 74            iStart
17e90 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75   = sqlite3VdbeCu
17ea0 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20  rrentAddr(v);.  
17eb0 20 20 20 20 20 20 20 20 73 65 6c 65 63 74 49 6e          selectIn
17ec0 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20  nerLoop(pParse, 
17ed0 70 2c 20 75 6e 69 6f 6e 54 61 62 2c 0a 20 20 20  p, unionTab,.   
17ee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17ef0 20 20 20 20 20 20 20 30 2c 20 30 2c 20 26 64 65         0, 0, &de
17f00 73 74 2c 20 69 43 6f 6e 74 2c 20 69 42 72 65 61  st, iCont, iBrea
17f10 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  k);.          sq
17f20 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
17f30 4c 61 62 65 6c 28 76 2c 20 69 43 6f 6e 74 29 3b  Label(v, iCont);
17f40 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
17f50 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
17f60 4f 50 5f 4e 65 78 74 2c 20 75 6e 69 6f 6e 54 61  OP_Next, unionTa
17f70 62 2c 20 69 53 74 61 72 74 29 3b 20 56 64 62 65  b, iStart); Vdbe
17f80 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
17f90 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
17fa0 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
17fb0 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20  , iBreak);.     
17fc0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
17fd0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6c 6f  AddOp2(v, OP_Clo
17fe0 73 65 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 30 29  se, unionTab, 0)
17ff0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
18000 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
18010 20 7d 0a 20 20 20 20 20 20 64 65 66 61 75 6c 74   }.      default
18020 3a 20 61 73 73 65 72 74 28 20 70 2d 3e 6f 70 3d  : assert( p->op=
18030 3d 54 4b 5f 49 4e 54 45 52 53 45 43 54 20 29 3b  =TK_INTERSECT );
18040 20 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 74   {.        int t
18050 61 62 31 2c 20 74 61 62 32 3b 0a 20 20 20 20 20  ab1, tab2;.     
18060 20 20 20 69 6e 74 20 69 43 6f 6e 74 2c 20 69 42     int iCont, iB
18070 72 65 61 6b 2c 20 69 53 74 61 72 74 3b 0a 20 20  reak, iStart;.  
18080 20 20 20 20 20 20 45 78 70 72 20 2a 70 4c 69 6d        Expr *pLim
18090 69 74 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  it;.        int 
180a0 61 64 64 72 3b 0a 20 20 20 20 20 20 20 20 53 65  addr;.        Se
180b0 6c 65 63 74 44 65 73 74 20 69 6e 74 65 72 73 65  lectDest interse
180c0 63 74 64 65 73 74 3b 0a 20 20 20 20 20 20 20 20  ctdest;.        
180d0 69 6e 74 20 72 31 3b 0a 20 20 0a 20 20 20 20 20  int r1;.  .     
180e0 20 20 20 2f 2a 20 49 4e 54 45 52 53 45 43 54 20     /* INTERSECT 
180f0 69 73 20 64 69 66 66 65 72 65 6e 74 20 66 72 6f  is different fro
18100 6d 20 74 68 65 20 6f 74 68 65 72 73 20 73 69 6e  m the others sin
18110 63 65 20 69 74 20 72 65 71 75 69 72 65 73 0a 20  ce it requires. 
18120 20 20 20 20 20 20 20 2a 2a 20 74 77 6f 20 74 65         ** two te
18130 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 73 2e 20  mporary tables. 
18140 20 48 65 6e 63 65 20 69 74 20 68 61 73 20 69 74   Hence it has it
18150 73 20 6f 77 6e 20 63 61 73 65 2e 20 20 42 65 67  s own case.  Beg
18160 69 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 62 79  in.        ** by
18170 20 61 6c 6c 6f 63 61 74 69 6e 67 20 74 68 65 20   allocating the 
18180 74 61 62 6c 65 73 20 77 65 20 77 69 6c 6c 20 6e  tables we will n
18190 65 65 64 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  eed..        */.
181a0 20 20 20 20 20 20 20 20 74 61 62 31 20 3d 20 70          tab1 = p
181b0 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20  Parse->nTab++;. 
181c0 20 20 20 20 20 20 20 74 61 62 32 20 3d 20 70 50         tab2 = pP
181d0 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20  arse->nTab++;.  
181e0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
181f0 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 3b 0a  >pOrderBy==0 );.
18200 20 20 0a 20 20 20 20 20 20 20 20 61 64 64 72 20    .        addr 
18210 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
18220 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70  Op2(v, OP_OpenEp
18230 68 65 6d 65 72 61 6c 2c 20 74 61 62 31 2c 20 30  hemeral, tab1, 0
18240 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
18250 74 28 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70  t( p->addrOpenEp
18260 68 6d 5b 30 5d 20 3d 3d 20 2d 31 20 29 3b 0a 20  hm[0] == -1 );. 
18270 20 20 20 20 20 20 20 70 2d 3e 61 64 64 72 4f 70         p->addrOp
18280 65 6e 45 70 68 6d 5b 30 5d 20 3d 20 61 64 64 72  enEphm[0] = addr
18290 3b 0a 20 20 20 20 20 20 20 20 66 69 6e 64 52 69  ;.        findRi
182a0 67 68 74 6d 6f 73 74 28 70 29 2d 3e 73 65 6c 46  ghtmost(p)->selF
182b0 6c 61 67 73 20 7c 3d 20 53 46 5f 55 73 65 73 45  lags |= SF_UsesE
182c0 70 68 65 6d 65 72 61 6c 3b 0a 20 20 20 20 20 20  phemeral;.      
182d0 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c    assert( p->pEL
182e0 69 73 74 20 29 3b 0a 20 20 0a 20 20 20 20 20 20  ist );.  .      
182f0 20 20 2f 2a 20 43 6f 64 65 20 74 68 65 20 53 45    /* Code the SE
18300 4c 45 43 54 73 20 74 6f 20 6f 75 72 20 6c 65 66  LECTs to our lef
18310 74 20 69 6e 74 6f 20 74 65 6d 70 6f 72 61 72 79  t into temporary
18320 20 74 61 62 6c 65 20 22 74 61 62 31 22 2e 0a 20   table "tab1".. 
18330 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
18340 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44    sqlite3SelectD
18350 65 73 74 49 6e 69 74 28 26 69 6e 74 65 72 73 65  estInit(&interse
18360 63 74 64 65 73 74 2c 20 53 52 54 5f 55 6e 69 6f  ctdest, SRT_Unio
18370 6e 2c 20 74 61 62 31 29 3b 0a 20 20 20 20 20 20  n, tab1);.      
18380 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53 65    rc = sqlite3Se
18390 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 50 72  lect(pParse, pPr
183a0 69 6f 72 2c 20 26 69 6e 74 65 72 73 65 63 74 64  ior, &intersectd
183b0 65 73 74 29 3b 0a 20 20 20 20 20 20 20 20 69 66  est);.        if
183c0 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20  ( rc ){.        
183d0 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c    goto multi_sel
183e0 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 20  ect_end;.       
183f0 20 7d 0a 20 20 0a 20 20 20 20 20 20 20 20 2f 2a   }.  .        /*
18400 20 43 6f 64 65 20 74 68 65 20 63 75 72 72 65 6e   Code the curren
18410 74 20 53 45 4c 45 43 54 20 69 6e 74 6f 20 74 65  t SELECT into te
18420 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 22 74  mporary table "t
18430 61 62 32 22 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ab2".        */.
18440 20 20 20 20 20 20 20 20 61 64 64 72 20 3d 20 73          addr = s
18450 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
18460 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d  (v, OP_OpenEphem
18470 65 72 61 6c 2c 20 74 61 62 32 2c 20 30 29 3b 0a  eral, tab2, 0);.
18480 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
18490 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b  p->addrOpenEphm[
184a0 31 5d 20 3d 3d 20 2d 31 20 29 3b 0a 20 20 20 20  1] == -1 );.    
184b0 20 20 20 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45      p->addrOpenE
184c0 70 68 6d 5b 31 5d 20 3d 20 61 64 64 72 3b 0a 20  phm[1] = addr;. 
184d0 20 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72         p->pPrior
184e0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70 4c   = 0;.        pL
184f0 69 6d 69 74 20 3d 20 70 2d 3e 70 4c 69 6d 69 74  imit = p->pLimit
18500 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 70 4c 69  ;.        p->pLi
18510 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  mit = 0;.       
18520 20 69 6e 74 65 72 73 65 63 74 64 65 73 74 2e 69   intersectdest.i
18530 53 44 50 61 72 6d 20 3d 20 74 61 62 32 3b 0a 20  SDParm = tab2;. 
18540 20 20 20 20 20 20 20 45 78 70 6c 61 69 6e 51 75         ExplainQu
18550 65 72 79 50 6c 61 6e 28 28 70 50 61 72 73 65 2c  eryPlan((pParse,
18560 20 31 2c 20 22 25 73 20 55 53 49 4e 47 20 54 45   1, "%s USING TE
18570 4d 50 20 42 2d 54 52 45 45 22 2c 0a 20 20 20 20  MP B-TREE",.    
18580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18590 20 20 20 20 20 20 73 65 6c 65 63 74 4f 70 4e 61        selectOpNa
185a0 6d 65 28 70 2d 3e 6f 70 29 29 29 3b 0a 20 20 20  me(p->op)));.   
185b0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
185c0 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20  3Select(pParse, 
185d0 70 2c 20 26 69 6e 74 65 72 73 65 63 74 64 65 73  p, &intersectdes
185e0 74 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74  t);.        test
185f0 63 61 73 65 28 20 72 63 21 3d 53 51 4c 49 54 45  case( rc!=SQLITE
18600 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 20 20 70  _OK );.        p
18610 44 65 6c 65 74 65 20 3d 20 70 2d 3e 70 50 72 69  Delete = p->pPri
18620 6f 72 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 70  or;.        p->p
18630 50 72 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a  Prior = pPrior;.
18640 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 6e          if( p->n
18650 53 65 6c 65 63 74 52 6f 77 3e 70 50 72 69 6f 72  SelectRow>pPrior
18660 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 29 7b 0a  ->nSelectRow ){.
18670 20 20 20 20 20 20 20 20 20 20 70 2d 3e 6e 53 65            p->nSe
18680 6c 65 63 74 52 6f 77 20 3d 20 70 50 72 69 6f 72  lectRow = pPrior
18690 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 3b 0a 20 20  ->nSelectRow;.  
186a0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
186b0 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
186c0 65 28 64 62 2c 20 70 2d 3e 70 4c 69 6d 69 74 29  e(db, p->pLimit)
186d0 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 70 4c 69  ;.        p->pLi
186e0 6d 69 74 20 3d 20 70 4c 69 6d 69 74 3b 0a 20 20  mit = pLimit;.  
186f0 0a 20 20 20 20 20 20 20 20 2f 2a 20 47 65 6e 65  .        /* Gene
18700 72 61 74 65 20 63 6f 64 65 20 74 6f 20 74 61 6b  rate code to tak
18710 65 20 74 68 65 20 69 6e 74 65 72 73 65 63 74 69  e the intersecti
18720 6f 6e 20 6f 66 20 74 68 65 20 74 77 6f 20 74 65  on of the two te
18730 6d 70 6f 72 61 72 79 0a 20 20 20 20 20 20 20 20  mporary.        
18740 2a 2a 20 74 61 62 6c 65 73 2e 0a 20 20 20 20 20  ** tables..     
18750 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73     */.        as
18760 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 20  sert( p->pEList 
18770 29 3b 0a 20 20 20 20 20 20 20 20 69 42 72 65 61  );.        iBrea
18780 6b 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  k = sqlite3VdbeM
18790 61 6b 65 4c 61 62 65 6c 28 70 50 61 72 73 65 29  akeLabel(pParse)
187a0 3b 0a 20 20 20 20 20 20 20 20 69 43 6f 6e 74 20  ;.        iCont 
187b0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
187c0 65 4c 61 62 65 6c 28 70 50 61 72 73 65 29 3b 0a  eLabel(pParse);.
187d0 20 20 20 20 20 20 20 20 63 6f 6d 70 75 74 65 4c          computeL
187e0 69 6d 69 74 52 65 67 69 73 74 65 72 73 28 70 50  imitRegisters(pP
187f0 61 72 73 65 2c 20 70 2c 20 69 42 72 65 61 6b 29  arse, p, iBreak)
18800 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
18810 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
18820 50 5f 52 65 77 69 6e 64 2c 20 74 61 62 31 2c 20  P_Rewind, tab1, 
18830 69 42 72 65 61 6b 29 3b 20 56 64 62 65 43 6f 76  iBreak); VdbeCov
18840 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20  erage(v);.      
18850 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65    r1 = sqlite3Ge
18860 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29  tTempReg(pParse)
18870 3b 0a 20 20 20 20 20 20 20 20 69 53 74 61 72 74  ;.        iStart
18880 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
18890 64 4f 70 32 28 76 2c 20 4f 50 5f 52 6f 77 44 61  dOp2(v, OP_RowDa
188a0 74 61 2c 20 74 61 62 31 2c 20 72 31 29 3b 0a 20  ta, tab1, r1);. 
188b0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
188c0 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f  beAddOp4Int(v, O
188d0 50 5f 4e 6f 74 46 6f 75 6e 64 2c 20 74 61 62 32  P_NotFound, tab2
188e0 2c 20 69 43 6f 6e 74 2c 20 72 31 2c 20 30 29 3b  , iCont, r1, 0);
188f0 0a 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 76  .        VdbeCov
18900 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20  erage(v);.      
18910 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
18920 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
18930 72 31 29 3b 0a 20 20 20 20 20 20 20 20 73 65 6c  r1);.        sel
18940 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61  ectInnerLoop(pPa
18950 72 73 65 2c 20 70 2c 20 74 61 62 31 2c 0a 20 20  rse, p, tab1,.  
18960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18970 20 20 20 20 20 20 30 2c 20 30 2c 20 26 64 65 73        0, 0, &des
18980 74 2c 20 69 43 6f 6e 74 2c 20 69 42 72 65 61 6b  t, iCont, iBreak
18990 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
189a0 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
189b0 65 6c 28 76 2c 20 69 43 6f 6e 74 29 3b 0a 20 20  el(v, iCont);.  
189c0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
189d0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65  eAddOp2(v, OP_Ne
189e0 78 74 2c 20 74 61 62 31 2c 20 69 53 74 61 72 74  xt, tab1, iStart
189f0 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
18a00 76 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  v);.        sqli
18a10 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
18a20 62 65 6c 28 76 2c 20 69 42 72 65 61 6b 29 3b 0a  bel(v, iBreak);.
18a30 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
18a40 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
18a50 43 6c 6f 73 65 2c 20 74 61 62 32 2c 20 30 29 3b  Close, tab2, 0);
18a60 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
18a70 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
18a80 5f 43 6c 6f 73 65 2c 20 74 61 62 31 2c 20 30 29  _Close, tab1, 0)
18a90 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
18aa0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
18ab0 20 0a 20 20 23 69 66 6e 64 65 66 20 53 51 4c 49   .  #ifndef SQLI
18ac0 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a  TE_OMIT_EXPLAIN.
18ad0 20 20 20 20 69 66 28 20 70 2d 3e 70 4e 65 78 74      if( p->pNext
18ae0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 45 78 70  ==0 ){.      Exp
18af0 6c 61 69 6e 51 75 65 72 79 50 6c 61 6e 50 6f 70  lainQueryPlanPop
18b00 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 7d 0a  (pParse);.    }.
18b10 20 20 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 0a    #endif.  }.  .
18b20 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 63 6f 6c    /* Compute col
18b30 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 73  lating sequences
18b40 20 75 73 65 64 20 62 79 20 0a 20 20 2a 2a 20 74   used by .  ** t
18b50 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 73 20  emporary tables 
18b60 6e 65 65 64 65 64 20 74 6f 20 69 6d 70 6c 65 6d  needed to implem
18b70 65 6e 74 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64  ent the compound
18b80 20 73 65 6c 65 63 74 2e 0a 20 20 2a 2a 20 41 74   select..  ** At
18b90 74 61 63 68 20 74 68 65 20 4b 65 79 49 6e 66 6f  tach the KeyInfo
18ba0 20 73 74 72 75 63 74 75 72 65 20 74 6f 20 61 6c   structure to al
18bb0 6c 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  l temporary tabl
18bc0 65 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  es..  **.  ** Th
18bd0 69 73 20 73 65 63 74 69 6f 6e 20 69 73 20 72 75  is section is ru
18be0 6e 20 62 79 20 74 68 65 20 72 69 67 68 74 2d 6d  n by the right-m
18bf0 6f 73 74 20 53 45 4c 45 43 54 20 73 74 61 74 65  ost SELECT state
18c00 6d 65 6e 74 20 6f 6e 6c 79 2e 0a 20 20 2a 2a 20  ment only..  ** 
18c10 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
18c20 73 20 74 6f 20 74 68 65 20 6c 65 66 74 20 61 6c  s to the left al
18c30 77 61 79 73 20 73 6b 69 70 20 74 68 69 73 20 70  ways skip this p
18c40 61 72 74 2e 20 20 54 68 65 20 72 69 67 68 74 2d  art.  The right-
18c50 6d 6f 73 74 0a 20 20 2a 2a 20 53 45 4c 45 43 54  most.  ** SELECT
18c60 20 6d 69 67 68 74 20 61 6c 73 6f 20 73 6b 69 70   might also skip
18c70 20 74 68 69 73 20 70 61 72 74 20 69 66 20 69 74   this part if it
18c80 20 68 61 73 20 6e 6f 20 4f 52 44 45 52 20 42 59   has no ORDER BY
18c90 20 63 6c 61 75 73 65 20 61 6e 64 0a 20 20 2a 2a   clause and.  **
18ca0 20 6e 6f 20 74 65 6d 70 20 74 61 62 6c 65 73 20   no temp tables 
18cb0 61 72 65 20 72 65 71 75 69 72 65 64 2e 0a 20 20  are required..  
18cc0 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 73 65 6c 46  */.  if( p->selF
18cd0 6c 61 67 73 20 26 20 53 46 5f 55 73 65 73 45 70  lags & SF_UsesEp
18ce0 68 65 6d 65 72 61 6c 20 29 7b 0a 20 20 20 20 69  hemeral ){.    i
18cf0 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20  nt i;           
18d00 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
18d10 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  Loop counter */.
18d20 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65      KeyInfo *pKe
18d30 79 49 6e 66 6f 3b 20 20 20 20 20 20 20 20 20 20  yInfo;          
18d40 20 20 2f 2a 20 43 6f 6c 6c 61 74 69 6e 67 20 73    /* Collating s
18d50 65 71 75 65 6e 63 65 20 66 6f 72 20 74 68 65 20  equence for the 
18d60 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 20 20  result set */.  
18d70 20 20 53 65 6c 65 63 74 20 2a 70 4c 6f 6f 70 3b    Select *pLoop;
18d80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18d90 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 74  /* For looping t
18da0 68 72 6f 75 67 68 20 53 45 4c 45 43 54 20 73 74  hrough SELECT st
18db0 61 74 65 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20  atements */.    
18dc0 43 6f 6c 6c 53 65 71 20 2a 2a 61 70 43 6f 6c 6c  CollSeq **apColl
18dd0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
18de0 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 74 68 72   For looping thr
18df0 6f 75 67 68 20 70 4b 65 79 49 6e 66 6f 2d 3e 61  ough pKeyInfo->a
18e00 43 6f 6c 6c 5b 5d 20 2a 2f 0a 20 20 20 20 69 6e  Coll[] */.    in
18e10 74 20 6e 43 6f 6c 3b 20 20 20 20 20 20 20 20 20  t nCol;         
18e20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
18e30 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73  umber of columns
18e40 20 69 6e 20 72 65 73 75 6c 74 20 73 65 74 20 2a   in result set *
18e50 2f 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  /..    assert( p
18e60 2d 3e 70 4e 65 78 74 3d 3d 30 20 29 3b 0a 20 20  ->pNext==0 );.  
18e70 20 20 6e 43 6f 6c 20 3d 20 70 2d 3e 70 45 4c 69    nCol = p->pELi
18e80 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 70  st->nExpr;.    p
18e90 4b 65 79 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65  KeyInfo = sqlite
18ea0 33 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63 28 64 62  3KeyInfoAlloc(db
18eb0 2c 20 6e 43 6f 6c 2c 20 31 29 3b 0a 20 20 20 20  , nCol, 1);.    
18ec0 69 66 28 20 21 70 4b 65 79 49 6e 66 6f 20 29 7b  if( !pKeyInfo ){
18ed0 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
18ee0 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20  TE_NOMEM_BKPT;. 
18ef0 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f       goto multi_
18f00 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20  select_end;.    
18f10 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30 2c 20 61  }.    for(i=0, a
18f20 70 43 6f 6c 6c 3d 70 4b 65 79 49 6e 66 6f 2d 3e  pColl=pKeyInfo->
18f30 61 43 6f 6c 6c 3b 20 69 3c 6e 43 6f 6c 3b 20 69  aColl; i<nCol; i
18f40 2b 2b 2c 20 61 70 43 6f 6c 6c 2b 2b 29 7b 0a 20  ++, apColl++){. 
18f50 20 20 20 20 20 2a 61 70 43 6f 6c 6c 20 3d 20 6d       *apColl = m
18f60 75 6c 74 69 53 65 6c 65 63 74 43 6f 6c 6c 53 65  ultiSelectCollSe
18f70 71 28 70 50 61 72 73 65 2c 20 70 2c 20 69 29 3b  q(pParse, p, i);
18f80 0a 20 20 20 20 20 20 69 66 28 20 30 3d 3d 2a 61  .      if( 0==*a
18f90 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20  pColl ){.       
18fa0 20 2a 61 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70   *apColl = db->p
18fb0 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20 20  DfltColl;.      
18fc0 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 66 6f 72  }.    }..    for
18fd0 28 70 4c 6f 6f 70 3d 70 3b 20 70 4c 6f 6f 70 3b  (pLoop=p; pLoop;
18fe0 20 70 4c 6f 6f 70 3d 70 4c 6f 6f 70 2d 3e 70 50   pLoop=pLoop->pP
18ff0 72 69 6f 72 29 7b 0a 20 20 20 20 20 20 66 6f 72  rior){.      for
19000 28 69 3d 30 3b 20 69 3c 32 3b 20 69 2b 2b 29 7b  (i=0; i<2; i++){
19010 0a 20 20 20 20 20 20 20 20 69 6e 74 20 61 64 64  .        int add
19020 72 20 3d 20 70 4c 6f 6f 70 2d 3e 61 64 64 72 4f  r = pLoop->addrO
19030 70 65 6e 45 70 68 6d 5b 69 5d 3b 0a 20 20 20 20  penEphm[i];.    
19040 20 20 20 20 69 66 28 20 61 64 64 72 3c 30 20 29      if( addr<0 )
19050 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49  {.          /* I
19060 66 20 5b 30 5d 20 69 73 20 75 6e 75 73 65 64 20  f [0] is unused 
19070 74 68 65 6e 20 5b 31 5d 20 69 73 20 61 6c 73 6f  then [1] is also
19080 20 75 6e 75 73 65 64 2e 20 20 53 6f 20 77 65 20   unused.  So we 
19090 63 61 6e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  can.          **
190a0 20 61 6c 77 61 79 73 20 73 61 66 65 6c 79 20 61   always safely a
190b0 62 6f 72 74 20 61 73 20 73 6f 6f 6e 20 61 73 20  bort as soon as 
190c0 74 68 65 20 66 69 72 73 74 20 75 6e 75 73 65 64  the first unused
190d0 20 73 6c 6f 74 20 69 73 20 66 6f 75 6e 64 20 2a   slot is found *
190e0 2f 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  /.          asse
190f0 72 74 28 20 70 4c 6f 6f 70 2d 3e 61 64 64 72 4f  rt( pLoop->addrO
19100 70 65 6e 45 70 68 6d 5b 31 5d 3c 30 20 29 3b 0a  penEphm[1]<0 );.
19110 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
19120 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
19130 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
19140 61 6e 67 65 50 32 28 76 2c 20 61 64 64 72 2c 20  angeP2(v, addr, 
19150 6e 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20 73  nCol);.        s
19160 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
19170 50 34 28 76 2c 20 61 64 64 72 2c 20 28 63 68 61  P4(v, addr, (cha
19180 72 2a 29 73 71 6c 69 74 65 33 4b 65 79 49 6e 66  r*)sqlite3KeyInf
19190 6f 52 65 66 28 70 4b 65 79 49 6e 66 6f 29 2c 0a  oRef(pKeyInfo),.
191a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
191b0 20 20 20 20 20 20 20 20 20 20 20 20 50 34 5f 4b              P4_K
191c0 45 59 49 4e 46 4f 29 3b 0a 20 20 20 20 20 20 20  EYINFO);.       
191d0 20 70 4c 6f 6f 70 2d 3e 61 64 64 72 4f 70 65 6e   pLoop->addrOpen
191e0 45 70 68 6d 5b 69 5d 20 3d 20 2d 31 3b 0a 20 20  Ephm[i] = -1;.  
191f0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
19200 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 55 6e  sqlite3KeyInfoUn
19210 72 65 66 28 70 4b 65 79 49 6e 66 6f 29 3b 0a 20  ref(pKeyInfo);. 
19220 20 7d 0a 0a 6d 75 6c 74 69 5f 73 65 6c 65 63 74   }..multi_select
19230 5f 65 6e 64 3a 0a 20 20 70 44 65 73 74 2d 3e 69  _end:.  pDest->i
19240 53 64 73 74 20 3d 20 64 65 73 74 2e 69 53 64 73  Sdst = dest.iSds
19250 74 3b 0a 20 20 70 44 65 73 74 2d 3e 6e 53 64 73  t;.  pDest->nSds
19260 74 20 3d 20 64 65 73 74 2e 6e 53 64 73 74 3b 0a  t = dest.nSdst;.
19270 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44    sqlite3SelectD
19280 65 6c 65 74 65 28 64 62 2c 20 70 44 65 6c 65 74  elete(db, pDelet
19290 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  e);.  return rc;
192a0 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
192b0 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e  ITE_OMIT_COMPOUN
192c0 44 5f 53 45 4c 45 43 54 20 2a 2f 0a 0a 2f 2a 0a  D_SELECT */../*.
192d0 2a 2a 20 45 72 72 6f 72 20 6d 65 73 73 61 67 65  ** Error message
192e0 20 66 6f 72 20 77 68 65 6e 20 74 77 6f 20 6f 72   for when two or
192f0 20 6d 6f 72 65 20 74 65 72 6d 73 20 6f 66 20 61   more terms of a
19300 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74   compound select
19310 20 68 61 76 65 20 64 69 66 66 65 72 65 6e 74 0a   have different.
19320 2a 2a 20 73 69 7a 65 20 72 65 73 75 6c 74 20 73  ** size result s
19330 65 74 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ets..*/.void sql
19340 69 74 65 33 53 65 6c 65 63 74 57 72 6f 6e 67 4e  ite3SelectWrongN
19350 75 6d 54 65 72 6d 73 45 72 72 6f 72 28 50 61 72  umTermsError(Par
19360 73 65 20 2a 70 50 61 72 73 65 2c 20 53 65 6c 65  se *pParse, Sele
19370 63 74 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d  ct *p){.  if( p-
19380 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 56  >selFlags & SF_V
19390 61 6c 75 65 73 20 29 7b 0a 20 20 20 20 73 71 6c  alues ){.    sql
193a0 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
193b0 72 73 65 2c 20 22 61 6c 6c 20 56 41 4c 55 45 53  rse, "all VALUES
193c0 20 6d 75 73 74 20 68 61 76 65 20 74 68 65 20 73   must have the s
193d0 61 6d 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 65  ame number of te
193e0 72 6d 73 22 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  rms");.  }else{.
193f0 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
19400 4d 73 67 28 70 50 61 72 73 65 2c 20 22 53 45 4c  Msg(pParse, "SEL
19410 45 43 54 73 20 74 6f 20 74 68 65 20 6c 65 66 74  ECTs to the left
19420 20 61 6e 64 20 72 69 67 68 74 20 6f 66 20 25 73   and right of %s
19430 22 0a 20 20 20 20 20 20 22 20 64 6f 20 6e 6f 74  ".      " do not
19440 20 68 61 76 65 20 74 68 65 20 73 61 6d 65 20 6e   have the same n
19450 75 6d 62 65 72 20 6f 66 20 72 65 73 75 6c 74 20  umber of result 
19460 63 6f 6c 75 6d 6e 73 22 2c 20 73 65 6c 65 63 74  columns", select
19470 4f 70 4e 61 6d 65 28 70 2d 3e 6f 70 29 29 3b 0a  OpName(p->op));.
19480 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 64    }.}../*.** Cod
19490 65 20 61 6e 20 6f 75 74 70 75 74 20 73 75 62 72  e an output subr
194a0 6f 75 74 69 6e 65 20 66 6f 72 20 61 20 63 6f 72  outine for a cor
194b0 6f 75 74 69 6e 65 20 69 6d 70 6c 65 6d 65 6e 74  outine implement
194c0 61 74 69 6f 6e 20 6f 66 20 61 0a 2a 2a 20 53 45  ation of a.** SE
194d0 4c 45 43 54 20 73 74 61 74 6d 65 6e 74 2e 0a 2a  LECT statment..*
194e0 2a 0a 2a 2a 20 54 68 65 20 64 61 74 61 20 74 6f  *.** The data to
194f0 20 62 65 20 6f 75 74 70 75 74 20 69 73 20 63 6f   be output is co
19500 6e 74 61 69 6e 65 64 20 69 6e 20 70 49 6e 2d 3e  ntained in pIn->
19510 69 53 64 73 74 2e 20 20 54 68 65 72 65 20 61 72  iSdst.  There ar
19520 65 0a 2a 2a 20 70 49 6e 2d 3e 6e 53 64 73 74 20  e.** pIn->nSdst 
19530 63 6f 6c 75 6d 6e 73 20 74 6f 20 62 65 20 6f 75  columns to be ou
19540 74 70 75 74 2e 20 20 70 44 65 73 74 20 69 73 20  tput.  pDest is 
19550 77 68 65 72 65 20 74 68 65 20 6f 75 74 70 75 74  where the output
19560 20 73 68 6f 75 6c 64 0a 2a 2a 20 62 65 20 73 65   should.** be se
19570 6e 74 2e 0a 2a 2a 0a 2a 2a 20 72 65 67 52 65 74  nt..**.** regRet
19580 75 72 6e 20 69 73 20 74 68 65 20 6e 75 6d 62 65  urn is the numbe
19590 72 20 6f 66 20 74 68 65 20 72 65 67 69 73 74 65  r of the registe
195a0 72 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 73 75  r holding the su
195b0 62 72 6f 75 74 69 6e 65 0a 2a 2a 20 72 65 74 75  broutine.** retu
195c0 72 6e 20 61 64 64 72 65 73 73 2e 0a 2a 2a 0a 2a  rn address..**.*
195d0 2a 20 49 66 20 72 65 67 50 72 65 76 3e 30 20 74  * If regPrev>0 t
195e0 68 65 6e 20 69 74 20 69 73 20 74 68 65 20 66 69  hen it is the fi
195f0 72 73 74 20 72 65 67 69 73 74 65 72 20 69 6e 20  rst register in 
19600 61 20 76 65 63 74 6f 72 20 74 68 61 74 0a 2a 2a  a vector that.**
19610 20 72 65 63 6f 72 64 73 20 74 68 65 20 70 72 65   records the pre
19620 76 69 6f 75 73 20 6f 75 74 70 75 74 2e 20 20 6d  vious output.  m
19630 65 6d 5b 72 65 67 50 72 65 76 5d 20 69 73 20 61  em[regPrev] is a
19640 20 66 6c 61 67 20 74 68 61 74 20 69 73 20 66 61   flag that is fa
19650 6c 73 65 0a 2a 2a 20 69 66 20 74 68 65 72 65 20  lse.** if there 
19660 68 61 73 20 62 65 65 6e 20 6e 6f 20 70 72 65 76  has been no prev
19670 69 6f 75 73 20 6f 75 74 70 75 74 2e 20 20 49 66  ious output.  If
19680 20 72 65 67 50 72 65 76 3e 30 20 74 68 65 6e 20   regPrev>0 then 
19690 63 6f 64 65 20 69 73 0a 2a 2a 20 67 65 6e 65 72  code is.** gener
196a0 61 74 65 64 20 74 6f 20 73 75 70 70 72 65 73 73  ated to suppress
196b0 20 64 75 70 6c 69 63 61 74 65 73 2e 20 20 70 4b   duplicates.  pK
196c0 65 79 49 6e 66 6f 20 69 73 20 75 73 65 64 20 66  eyInfo is used f
196d0 6f 72 20 63 6f 6d 70 61 72 69 6e 67 0a 2a 2a 20  or comparing.** 
196e0 6b 65 79 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  keys..**.** If t
196f0 68 65 20 4c 49 4d 49 54 20 66 6f 75 6e 64 20 69  he LIMIT found i
19700 6e 20 70 2d 3e 69 4c 69 6d 69 74 20 69 73 20 72  n p->iLimit is r
19710 65 61 63 68 65 64 2c 20 6a 75 6d 70 20 69 6d 6d  eached, jump imm
19720 65 64 69 61 74 65 6c 79 20 74 6f 0a 2a 2a 20 69  ediately to.** i
19730 42 72 65 61 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63  Break..*/.static
19740 20 69 6e 74 20 67 65 6e 65 72 61 74 65 4f 75 74   int generateOut
19750 70 75 74 53 75 62 72 6f 75 74 69 6e 65 28 0a 20  putSubroutine(. 
19760 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
19770 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73           /* Pars
19780 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
19790 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20   Select *p,     
197a0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
197b0 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
197c0 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74   */.  SelectDest
197d0 20 2a 70 49 6e 2c 20 20 20 20 20 20 20 20 2f 2a   *pIn,        /*
197e0 20 43 6f 72 6f 75 74 69 6e 65 20 73 75 70 70 6c   Coroutine suppl
197f0 79 69 6e 67 20 64 61 74 61 20 2a 2f 0a 20 20 53  ying data */.  S
19800 65 6c 65 63 74 44 65 73 74 20 2a 70 44 65 73 74  electDest *pDest
19810 2c 20 20 20 20 20 20 2f 2a 20 57 68 65 72 65 20  ,      /* Where 
19820 74 6f 20 73 65 6e 64 20 74 68 65 20 64 61 74 61  to send the data
19830 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 52 65 74   */.  int regRet
19840 75 72 6e 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  urn,          /*
19850 20 54 68 65 20 72 65 74 75 72 6e 20 61 64 64 72   The return addr
19860 65 73 73 20 72 65 67 69 73 74 65 72 20 2a 2f 0a  ess register */.
19870 20 20 69 6e 74 20 72 65 67 50 72 65 76 2c 20 20    int regPrev,  
19880 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72 65            /* Pre
19890 76 69 6f 75 73 20 72 65 73 75 6c 74 20 72 65 67  vious result reg
198a0 69 73 74 65 72 2e 20 20 4e 6f 20 75 6e 69 71 75  ister.  No uniqu
198b0 65 6e 65 73 73 20 69 66 20 30 20 2a 2f 0a 20 20  eness if 0 */.  
198c0 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66  KeyInfo *pKeyInf
198d0 6f 2c 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 63  o,      /* For c
198e0 6f 6d 70 61 72 69 6e 67 20 77 69 74 68 20 70 72  omparing with pr
198f0 65 76 69 6f 75 73 20 65 6e 74 72 79 20 2a 2f 0a  evious entry */.
19900 20 20 69 6e 74 20 69 42 72 65 61 6b 20 20 20 20    int iBreak    
19910 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d            /* Jum
19920 70 20 68 65 72 65 20 69 66 20 77 65 20 68 69 74  p here if we hit
19930 20 74 68 65 20 4c 49 4d 49 54 20 2a 2f 0a 29 7b   the LIMIT */.){
19940 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61  .  Vdbe *v = pPa
19950 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e  rse->pVdbe;.  in
19960 74 20 69 43 6f 6e 74 69 6e 75 65 3b 0a 20 20 69  t iContinue;.  i
19970 6e 74 20 61 64 64 72 3b 0a 0a 20 20 61 64 64 72  nt addr;..  addr
19980 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75   = sqlite3VdbeCu
19990 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20  rrentAddr(v);.  
199a0 69 43 6f 6e 74 69 6e 75 65 20 3d 20 73 71 6c 69  iContinue = sqli
199b0 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
199c0 28 70 50 61 72 73 65 29 3b 0a 0a 20 20 2f 2a 20  (pParse);..  /* 
199d0 53 75 70 70 72 65 73 73 20 64 75 70 6c 69 63 61  Suppress duplica
199e0 74 65 73 20 66 6f 72 20 55 4e 49 4f 4e 2c 20 45  tes for UNION, E
199f0 58 43 45 50 54 2c 20 61 6e 64 20 49 4e 54 45 52  XCEPT, and INTER
19a00 53 45 43 54 20 0a 20 20 2a 2f 0a 20 20 69 66 28  SECT .  */.  if(
19a10 20 72 65 67 50 72 65 76 20 29 7b 0a 20 20 20 20   regPrev ){.    
19a20 69 6e 74 20 61 64 64 72 31 2c 20 61 64 64 72 32  int addr1, addr2
19a30 3b 0a 20 20 20 20 61 64 64 72 31 20 3d 20 73 71  ;.    addr1 = sq
19a40 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
19a50 76 2c 20 4f 50 5f 49 66 4e 6f 74 2c 20 72 65 67  v, OP_IfNot, reg
19a60 50 72 65 76 29 3b 20 56 64 62 65 43 6f 76 65 72  Prev); VdbeCover
19a70 61 67 65 28 76 29 3b 0a 20 20 20 20 61 64 64 72  age(v);.    addr
19a80 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  2 = sqlite3VdbeA
19a90 64 64 4f 70 34 28 76 2c 20 4f 50 5f 43 6f 6d 70  ddOp4(v, OP_Comp
19aa0 61 72 65 2c 20 70 49 6e 2d 3e 69 53 64 73 74 2c  are, pIn->iSdst,
19ab0 20 72 65 67 50 72 65 76 2b 31 2c 20 70 49 6e 2d   regPrev+1, pIn-
19ac0 3e 6e 53 64 73 74 2c 0a 20 20 20 20 20 20 20 20  >nSdst,.        
19ad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19ae0 20 20 20 20 20 20 28 63 68 61 72 2a 29 73 71 6c        (char*)sql
19af0 69 74 65 33 4b 65 79 49 6e 66 6f 52 65 66 28 70  ite3KeyInfoRef(p
19b00 4b 65 79 49 6e 66 6f 29 2c 20 50 34 5f 4b 45 59  KeyInfo), P4_KEY
19b10 49 4e 46 4f 29 3b 0a 20 20 20 20 73 71 6c 69 74  INFO);.    sqlit
19b20 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
19b30 4f 50 5f 4a 75 6d 70 2c 20 61 64 64 72 32 2b 32  OP_Jump, addr2+2
19b40 2c 20 69 43 6f 6e 74 69 6e 75 65 2c 20 61 64 64  , iContinue, add
19b50 72 32 2b 32 29 3b 20 56 64 62 65 43 6f 76 65 72  r2+2); VdbeCover
19b60 61 67 65 28 76 29 3b 0a 20 20 20 20 73 71 6c 69  age(v);.    sqli
19b70 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
19b80 76 2c 20 61 64 64 72 31 29 3b 0a 20 20 20 20 73  v, addr1);.    s
19b90 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
19ba0 28 76 2c 20 4f 50 5f 43 6f 70 79 2c 20 70 49 6e  (v, OP_Copy, pIn
19bb0 2d 3e 69 53 64 73 74 2c 20 72 65 67 50 72 65 76  ->iSdst, regPrev
19bc0 2b 31 2c 20 70 49 6e 2d 3e 6e 53 64 73 74 2d 31  +1, pIn->nSdst-1
19bd0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
19be0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
19bf0 6e 74 65 67 65 72 2c 20 31 2c 20 72 65 67 50 72  nteger, 1, regPr
19c00 65 76 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  ev);.  }.  if( p
19c10 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  Parse->db->mallo
19c20 63 46 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e  cFailed ) return
19c30 20 30 3b 0a 0a 20 20 2f 2a 20 53 75 70 70 72 65   0;..  /* Suppre
19c40 73 73 20 74 68 65 20 66 69 72 73 74 20 4f 46 46  ss the first OFF
19c50 53 45 54 20 65 6e 74 72 69 65 73 20 69 66 20 74  SET entries if t
19c60 68 65 72 65 20 69 73 20 61 6e 20 4f 46 46 53 45  here is an OFFSE
19c70 54 20 63 6c 61 75 73 65 0a 20 20 2a 2f 0a 20 20  T clause.  */.  
19c80 63 6f 64 65 4f 66 66 73 65 74 28 76 2c 20 70 2d  codeOffset(v, p-
19c90 3e 69 4f 66 66 73 65 74 2c 20 69 43 6f 6e 74 69  >iOffset, iConti
19ca0 6e 75 65 29 3b 0a 0a 20 20 61 73 73 65 72 74 28  nue);..  assert(
19cb0 20 70 44 65 73 74 2d 3e 65 44 65 73 74 21 3d 53   pDest->eDest!=S
19cc0 52 54 5f 45 78 69 73 74 73 20 29 3b 0a 20 20 61  RT_Exists );.  a
19cd0 73 73 65 72 74 28 20 70 44 65 73 74 2d 3e 65 44  ssert( pDest->eD
19ce0 65 73 74 21 3d 53 52 54 5f 54 61 62 6c 65 20 29  est!=SRT_Table )
19cf0 3b 0a 20 20 73 77 69 74 63 68 28 20 70 44 65 73  ;.  switch( pDes
19d00 74 2d 3e 65 44 65 73 74 20 29 7b 0a 20 20 20 20  t->eDest ){.    
19d10 2f 2a 20 53 74 6f 72 65 20 74 68 65 20 72 65 73  /* Store the res
19d20 75 6c 74 20 61 73 20 64 61 74 61 20 75 73 69 6e  ult as data usin
19d30 67 20 61 20 75 6e 69 71 75 65 20 6b 65 79 2e 0a  g a unique key..
19d40 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20      */.    case 
19d50 53 52 54 5f 45 70 68 65 6d 54 61 62 3a 20 7b 0a  SRT_EphemTab: {.
19d60 20 20 20 20 20 20 69 6e 74 20 72 31 20 3d 20 73        int r1 = s
19d70 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67  qlite3GetTempReg
19d80 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
19d90 69 6e 74 20 72 32 20 3d 20 73 71 6c 69 74 65 33  int r2 = sqlite3
19da0 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73  GetTempReg(pPars
19db0 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  e);.      sqlite
19dc0 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
19dd0 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 70 49  P_MakeRecord, pI
19de0 6e 2d 3e 69 53 64 73 74 2c 20 70 49 6e 2d 3e 6e  n->iSdst, pIn->n
19df0 53 64 73 74 2c 20 72 31 29 3b 0a 20 20 20 20 20  Sdst, r1);.     
19e00 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
19e10 70 32 28 76 2c 20 4f 50 5f 4e 65 77 52 6f 77 69  p2(v, OP_NewRowi
19e20 64 2c 20 70 44 65 73 74 2d 3e 69 53 44 50 61 72  d, pDest->iSDPar
19e30 6d 2c 20 72 32 29 3b 0a 20 20 20 20 20 20 73 71  m, r2);.      sq
19e40 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
19e50 76 2c 20 4f 50 5f 49 6e 73 65 72 74 2c 20 70 44  v, OP_Insert, pD
19e60 65 73 74 2d 3e 69 53 44 50 61 72 6d 2c 20 72 31  est->iSDParm, r1
19e70 2c 20 72 32 29 3b 0a 20 20 20 20 20 20 73 71 6c  , r2);.      sql
19e80 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35  ite3VdbeChangeP5
19e90 28 76 2c 20 4f 50 46 4c 41 47 5f 41 50 50 45 4e  (v, OPFLAG_APPEN
19ea0 44 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  D);.      sqlite
19eb0 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
19ec0 70 50 61 72 73 65 2c 20 72 32 29 3b 0a 20 20 20  pParse, r2);.   
19ed0 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
19ee0 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
19ef0 20 72 31 29 3b 0a 20 20 20 20 20 20 62 72 65 61   r1);.      brea
19f00 6b 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 6e 64 65  k;.    }..#ifnde
19f10 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  f SQLITE_OMIT_SU
19f20 42 51 55 45 52 59 0a 20 20 20 20 2f 2a 20 49 66  BQUERY.    /* If
19f30 20 77 65 20 61 72 65 20 63 72 65 61 74 69 6e 67   we are creating
19f40 20 61 20 73 65 74 20 66 6f 72 20 61 6e 20 22 65   a set for an "e
19f50 78 70 72 20 49 4e 20 28 53 45 4c 45 43 54 20 2e  xpr IN (SELECT .
19f60 2e 2e 29 22 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ..)"..    */.   
19f70 20 63 61 73 65 20 53 52 54 5f 53 65 74 3a 20 7b   case SRT_Set: {
19f80 0a 20 20 20 20 20 20 69 6e 74 20 72 31 3b 0a 20  .      int r1;. 
19f90 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
19fa0 49 6e 2d 3e 6e 53 64 73 74 3e 31 20 29 3b 0a 20  In->nSdst>1 );. 
19fb0 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65       r1 = sqlite
19fc0 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72  3GetTempReg(pPar
19fd0 73 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  se);.      sqlit
19fe0 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
19ff0 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 70  OP_MakeRecord, p
1a000 49 6e 2d 3e 69 53 64 73 74 2c 20 70 49 6e 2d 3e  In->iSdst, pIn->
1a010 6e 53 64 73 74 2c 20 0a 20 20 20 20 20 20 20 20  nSdst, .        
1a020 20 20 72 31 2c 20 70 44 65 73 74 2d 3e 7a 41 66    r1, pDest->zAf
1a030 66 53 64 73 74 2c 20 70 49 6e 2d 3e 6e 53 64 73  fSdst, pIn->nSds
1a040 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
1a050 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76  3VdbeAddOp4Int(v
1a060 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20  , OP_IdxInsert, 
1a070 70 44 65 73 74 2d 3e 69 53 44 50 61 72 6d 2c 20  pDest->iSDParm, 
1a080 72 31 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  r1,.            
1a090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
1a0a0 49 6e 2d 3e 69 53 64 73 74 2c 20 70 49 6e 2d 3e  In->iSdst, pIn->
1a0b0 6e 53 64 73 74 29 3b 0a 20 20 20 20 20 20 73 71  nSdst);.      sq
1a0c0 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
1a0d0 52 65 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b  Reg(pParse, r1);
1a0e0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
1a0f0 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74    }..    /* If t
1a100 68 69 73 20 69 73 20 61 20 73 63 61 6c 61 72 20  his is a scalar 
1a110 73 65 6c 65 63 74 20 74 68 61 74 20 69 73 20 70  select that is p
1a120 61 72 74 20 6f 66 20 61 6e 20 65 78 70 72 65 73  art of an expres
1a130 73 69 6f 6e 2c 20 74 68 65 6e 0a 20 20 20 20 2a  sion, then.    *
1a140 2a 20 73 74 6f 72 65 20 74 68 65 20 72 65 73 75  * store the resu
1a150 6c 74 73 20 69 6e 20 74 68 65 20 61 70 70 72 6f  lts in the appro
1a160 70 72 69 61 74 65 20 6d 65 6d 6f 72 79 20 63 65  priate memory ce
1a170 6c 6c 20 61 6e 64 20 62 72 65 61 6b 20 6f 75 74  ll and break out
1a180 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 73  .    ** of the s
1a190 63 61 6e 20 6c 6f 6f 70 2e 0a 20 20 20 20 2a 2f  can loop..    */
1a1a0 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 4d 65  .    case SRT_Me
1a1b0 6d 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72  m: {.      asser
1a1c0 74 28 20 70 49 6e 2d 3e 6e 53 64 73 74 3d 3d 31  t( pIn->nSdst==1
1a1d0 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72 72   || pParse->nErr
1a1e0 3e 30 20 29 3b 20 20 74 65 73 74 63 61 73 65 28  >0 );  testcase(
1a1f0 20 70 49 6e 2d 3e 6e 53 64 73 74 21 3d 31 20 29   pIn->nSdst!=1 )
1a200 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
1a210 78 70 72 43 6f 64 65 4d 6f 76 65 28 70 50 61 72  xprCodeMove(pPar
1a220 73 65 2c 20 70 49 6e 2d 3e 69 53 64 73 74 2c 20  se, pIn->iSdst, 
1a230 70 44 65 73 74 2d 3e 69 53 44 50 61 72 6d 2c 20  pDest->iSDParm, 
1a240 31 29 3b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65  1);.      /* The
1a250 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 20 77 69   LIMIT clause wi
1a260 6c 6c 20 6a 75 6d 70 20 6f 75 74 20 6f 66 20 74  ll jump out of t
1a270 68 65 20 6c 6f 6f 70 20 66 6f 72 20 75 73 20 2a  he loop for us *
1a280 2f 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  /.      break;. 
1a290 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 23     }.#endif /* #
1a2a0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1a2b0 49 54 5f 53 55 42 51 55 45 52 59 20 2a 2f 0a 0a  IT_SUBQUERY */..
1a2c0 20 20 20 20 2f 2a 20 54 68 65 20 72 65 73 75 6c      /* The resul
1a2d0 74 73 20 61 72 65 20 73 74 6f 72 65 64 20 69 6e  ts are stored in
1a2e0 20 61 20 73 65 71 75 65 6e 63 65 20 6f 66 20 72   a sequence of r
1a2f0 65 67 69 73 74 65 72 73 0a 20 20 20 20 2a 2a 20  egisters.    ** 
1a300 73 74 61 72 74 69 6e 67 20 61 74 20 70 44 65 73  starting at pDes
1a310 74 2d 3e 69 53 64 73 74 2e 20 20 54 68 65 6e 20  t->iSdst.  Then 
1a320 74 68 65 20 63 6f 2d 72 6f 75 74 69 6e 65 20 79  the co-routine y
1a330 69 65 6c 64 73 2e 0a 20 20 20 20 2a 2f 0a 20 20  ields..    */.  
1a340 20 20 63 61 73 65 20 53 52 54 5f 43 6f 72 6f 75    case SRT_Corou
1a350 74 69 6e 65 3a 20 7b 0a 20 20 20 20 20 20 69 66  tine: {.      if
1a360 28 20 70 44 65 73 74 2d 3e 69 53 64 73 74 3d 3d  ( pDest->iSdst==
1a370 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44 65  0 ){.        pDe
1a380 73 74 2d 3e 69 53 64 73 74 20 3d 20 73 71 6c 69  st->iSdst = sqli
1a390 74 65 33 47 65 74 54 65 6d 70 52 61 6e 67 65 28  te3GetTempRange(
1a3a0 70 50 61 72 73 65 2c 20 70 49 6e 2d 3e 6e 53 64  pParse, pIn->nSd
1a3b0 73 74 29 3b 0a 20 20 20 20 20 20 20 20 70 44 65  st);.        pDe
1a3c0 73 74 2d 3e 6e 53 64 73 74 20 3d 20 70 49 6e 2d  st->nSdst = pIn-
1a3d0 3e 6e 53 64 73 74 3b 0a 20 20 20 20 20 20 7d 0a  >nSdst;.      }.
1a3e0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
1a3f0 72 43 6f 64 65 4d 6f 76 65 28 70 50 61 72 73 65  rCodeMove(pParse
1a400 2c 20 70 49 6e 2d 3e 69 53 64 73 74 2c 20 70 44  , pIn->iSdst, pD
1a410 65 73 74 2d 3e 69 53 64 73 74 2c 20 70 49 6e 2d  est->iSdst, pIn-
1a420 3e 6e 53 64 73 74 29 3b 0a 20 20 20 20 20 20 73  >nSdst);.      s
1a430 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
1a440 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 70 44  (v, OP_Yield, pD
1a450 65 73 74 2d 3e 69 53 44 50 61 72 6d 29 3b 0a 20  est->iSDParm);. 
1a460 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1a470 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 6e 6f 6e  }..    /* If non
1a480 65 20 6f 66 20 74 68 65 20 61 62 6f 76 65 2c 20  e of the above, 
1a490 74 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74 20  then the result 
1a4a0 64 65 73 74 69 6e 61 74 69 6f 6e 20 6d 75 73 74  destination must
1a4b0 20 62 65 0a 20 20 20 20 2a 2a 20 53 52 54 5f 4f   be.    ** SRT_O
1a4c0 75 74 70 75 74 2e 20 20 54 68 69 73 20 72 6f 75  utput.  This rou
1a4d0 74 69 6e 65 20 69 73 20 6e 65 76 65 72 20 63 61  tine is never ca
1a4e0 6c 6c 65 64 20 77 69 74 68 20 61 6e 79 20 6f 74  lled with any ot
1a4f0 68 65 72 0a 20 20 20 20 2a 2a 20 64 65 73 74 69  her.    ** desti
1a500 6e 61 74 69 6f 6e 20 6f 74 68 65 72 20 74 68 61  nation other tha
1a510 6e 20 74 68 65 20 6f 6e 65 73 20 68 61 6e 64 6c  n the ones handl
1a520 65 64 20 61 62 6f 76 65 20 6f 72 20 53 52 54 5f  ed above or SRT_
1a530 4f 75 74 70 75 74 2e 0a 20 20 20 20 2a 2a 0a 20  Output..    **. 
1a540 20 20 20 2a 2a 20 46 6f 72 20 53 52 54 5f 4f 75     ** For SRT_Ou
1a550 74 70 75 74 2c 20 72 65 73 75 6c 74 73 20 61 72  tput, results ar
1a560 65 20 73 74 6f 72 65 64 20 69 6e 20 61 20 73 65  e stored in a se
1a570 71 75 65 6e 63 65 20 6f 66 20 72 65 67 69 73 74  quence of regist
1a580 65 72 73 2e 20 20 0a 20 20 20 20 2a 2a 20 54 68  ers.  .    ** Th
1a590 65 6e 20 74 68 65 20 4f 50 5f 52 65 73 75 6c 74  en the OP_Result
1a5a0 52 6f 77 20 6f 70 63 6f 64 65 20 69 73 20 75 73  Row opcode is us
1a5b0 65 64 20 74 6f 20 63 61 75 73 65 20 73 71 6c 69  ed to cause sqli
1a5c0 74 65 33 5f 73 74 65 70 28 29 20 74 6f 0a 20 20  te3_step() to.  
1a5d0 20 20 2a 2a 20 72 65 74 75 72 6e 20 74 68 65 20    ** return the 
1a5e0 6e 65 78 74 20 72 6f 77 20 6f 66 20 72 65 73 75  next row of resu
1a5f0 6c 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64  lt..    */.    d
1a600 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20  efault: {.      
1a610 61 73 73 65 72 74 28 20 70 44 65 73 74 2d 3e 65  assert( pDest->e
1a620 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74  Dest==SRT_Output
1a630 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
1a640 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
1a650 50 5f 52 65 73 75 6c 74 52 6f 77 2c 20 70 49 6e  P_ResultRow, pIn
1a660 2d 3e 69 53 64 73 74 2c 20 70 49 6e 2d 3e 6e 53  ->iSdst, pIn->nS
1a670 64 73 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61  dst);.      brea
1a680 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  k;.    }.  }..  
1a690 2f 2a 20 4a 75 6d 70 20 74 6f 20 74 68 65 20 65  /* Jump to the e
1a6a0 6e 64 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 69  nd of the loop i
1a6b0 66 20 74 68 65 20 4c 49 4d 49 54 20 69 73 20 72  f the LIMIT is r
1a6c0 65 61 63 68 65 64 2e 0a 20 20 2a 2f 0a 20 20 69  eached..  */.  i
1a6d0 66 28 20 70 2d 3e 69 4c 69 6d 69 74 20 29 7b 0a  f( p->iLimit ){.
1a6e0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1a6f0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 44 65 63 72  ddOp2(v, OP_Decr
1a700 4a 75 6d 70 5a 65 72 6f 2c 20 70 2d 3e 69 4c 69  JumpZero, p->iLi
1a710 6d 69 74 2c 20 69 42 72 65 61 6b 29 3b 20 56 64  mit, iBreak); Vd
1a720 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
1a730 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74   }..  /* Generat
1a740 65 20 74 68 65 20 73 75 62 72 6f 75 74 69 6e 65  e the subroutine
1a750 20 72 65 74 75 72 6e 0a 20 20 2a 2f 0a 20 20 73   return.  */.  s
1a760 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
1a770 65 4c 61 62 65 6c 28 76 2c 20 69 43 6f 6e 74 69  eLabel(v, iConti
1a780 6e 75 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  nue);.  sqlite3V
1a790 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
1a7a0 52 65 74 75 72 6e 2c 20 72 65 67 52 65 74 75 72  Return, regRetur
1a7b0 6e 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 61 64  n);..  return ad
1a7c0 64 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 74  dr;.}../*.** Alt
1a7d0 65 72 6e 61 74 69 76 65 20 63 6f 6d 70 6f 75 6e  ernative compoun
1a7e0 64 20 73 65 6c 65 63 74 20 63 6f 64 65 20 67 65  d select code ge
1a7f0 6e 65 72 61 74 6f 72 20 66 6f 72 20 63 61 73 65  nerator for case
1a800 73 20 77 68 65 6e 20 74 68 65 72 65 0a 2a 2a 20  s when there.** 
1a810 69 73 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63  is an ORDER BY c
1a820 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 57 65 20  lause..**.** We 
1a830 61 73 73 75 6d 65 20 61 20 71 75 65 72 79 20 6f  assume a query o
1a840 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
1a850 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  form:.**.**     
1a860 20 3c 73 65 6c 65 63 74 41 3e 20 20 3c 6f 70 65   <selectA>  <ope
1a870 72 61 74 6f 72 3e 20 20 3c 73 65 6c 65 63 74 42  rator>  <selectB
1a880 3e 20 20 4f 52 44 45 52 20 42 59 20 3c 6f 72 64  >  ORDER BY <ord
1a890 65 72 62 79 6c 69 73 74 3e 0a 2a 2a 0a 2a 2a 20  erbylist>.**.** 
1a8a0 3c 6f 70 65 72 61 74 6f 72 3e 20 69 73 20 6f 6e  <operator> is on
1a8b0 65 20 6f 66 20 55 4e 49 4f 4e 20 41 4c 4c 2c 20  e of UNION ALL, 
1a8c0 55 4e 49 4f 4e 2c 20 45 58 43 45 50 54 2c 20 6f  UNION, EXCEPT, o
1a8d0 72 20 49 4e 54 45 52 53 45 43 54 2e 20 20 54 68  r INTERSECT.  Th
1a8e0 65 20 69 64 65 61 0a 2a 2a 20 69 73 20 74 6f 20  e idea.** is to 
1a8f0 63 6f 64 65 20 62 6f 74 68 20 3c 73 65 6c 65 63  code both <selec
1a900 74 41 3e 20 61 6e 64 20 3c 73 65 6c 65 63 74 42  tA> and <selectB
1a910 3e 20 77 69 74 68 20 74 68 65 20 4f 52 44 45 52  > with the ORDER
1a920 20 42 59 20 63 6c 61 75 73 65 20 61 73 0a 2a 2a   BY clause as.**
1a930 20 63 6f 2d 72 6f 75 74 69 6e 65 73 2e 20 20 54   co-routines.  T
1a940 68 65 6e 20 72 75 6e 20 74 68 65 20 63 6f 2d 72  hen run the co-r
1a950 6f 75 74 69 6e 65 73 20 69 6e 20 70 61 72 61 6c  outines in paral
1a960 6c 65 6c 20 61 6e 64 20 6d 65 72 67 65 20 74 68  lel and merge th
1a970 65 20 72 65 73 75 6c 74 73 0a 2a 2a 20 69 6e 74  e results.** int
1a980 6f 20 74 68 65 20 6f 75 74 70 75 74 2e 20 20 49  o the output.  I
1a990 6e 20 61 64 64 69 74 69 6f 6e 20 74 6f 20 74 68  n addition to th
1a9a0 65 20 74 77 6f 20 63 6f 72 6f 75 74 69 6e 65 73  e two coroutines
1a9b0 20 28 63 61 6c 6c 65 64 20 73 65 6c 65 63 74 41   (called selectA
1a9c0 20 61 6e 64 0a 2a 2a 20 73 65 6c 65 63 74 42 29   and.** selectB)
1a9d0 20 74 68 65 72 65 20 61 72 65 20 37 20 73 75 62   there are 7 sub
1a9e0 72 6f 75 74 69 6e 65 73 3a 0a 2a 2a 0a 2a 2a 20  routines:.**.** 
1a9f0 20 20 20 6f 75 74 41 3a 20 20 20 20 4d 6f 76 65     outA:    Move
1aa00 20 74 68 65 20 6f 75 74 70 75 74 20 6f 66 20 74   the output of t
1aa10 68 65 20 73 65 6c 65 63 74 41 20 63 6f 72 6f 75  he selectA corou
1aa20 74 69 6e 65 20 69 6e 74 6f 20 74 68 65 20 6f 75  tine into the ou
1aa30 74 70 75 74 0a 2a 2a 20 20 20 20 20 20 20 20 20  tput.**         
1aa40 20 20 20 20 6f 66 20 74 68 65 20 63 6f 6d 70 6f      of the compo
1aa50 75 6e 64 20 71 75 65 72 79 2e 0a 2a 2a 0a 2a 2a  und query..**.**
1aa60 20 20 20 20 6f 75 74 42 3a 20 20 20 20 4d 6f 76      outB:    Mov
1aa70 65 20 74 68 65 20 6f 75 74 70 75 74 20 6f 66 20  e the output of 
1aa80 74 68 65 20 73 65 6c 65 63 74 42 20 63 6f 72 6f  the selectB coro
1aa90 75 74 69 6e 65 20 69 6e 74 6f 20 74 68 65 20 6f  utine into the o
1aaa0 75 74 70 75 74 0a 2a 2a 20 20 20 20 20 20 20 20  utput.**        
1aab0 20 20 20 20 20 6f 66 20 74 68 65 20 63 6f 6d 70       of the comp
1aac0 6f 75 6e 64 20 71 75 65 72 79 2e 20 20 28 4f 6e  ound query.  (On
1aad0 6c 79 20 67 65 6e 65 72 61 74 65 64 20 66 6f 72  ly generated for
1aae0 20 55 4e 49 4f 4e 20 61 6e 64 0a 2a 2a 20 20 20   UNION and.**   
1aaf0 20 20 20 20 20 20 20 20 20 20 55 4e 49 4f 4e 20            UNION 
1ab00 41 4c 4c 2e 20 20 45 58 43 45 50 54 20 61 6e 64  ALL.  EXCEPT and
1ab10 20 49 4e 53 45 52 54 53 45 43 54 20 6e 65 76 65   INSERTSECT neve
1ab20 72 20 6f 75 74 70 75 74 20 61 20 72 6f 77 20 74  r output a row t
1ab30 68 61 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  hat.**          
1ab40 20 20 20 61 70 70 65 61 72 73 20 6f 6e 6c 79 20     appears only 
1ab50 69 6e 20 42 2e 29 0a 2a 2a 0a 2a 2a 20 20 20 20  in B.).**.**    
1ab60 41 6c 74 42 3a 20 20 20 20 43 61 6c 6c 65 64 20  AltB:    Called 
1ab70 77 68 65 6e 20 74 68 65 72 65 20 69 73 20 64 61  when there is da
1ab80 74 61 20 66 72 6f 6d 20 62 6f 74 68 20 63 6f 72  ta from both cor
1ab90 6f 75 74 69 6e 65 73 20 61 6e 64 20 41 3c 42 2e  outines and A<B.
1aba0 0a 2a 2a 0a 2a 2a 20 20 20 20 41 65 71 42 3a 20  .**.**    AeqB: 
1abb0 20 20 20 43 61 6c 6c 65 64 20 77 68 65 6e 20 74     Called when t
1abc0 68 65 72 65 20 69 73 20 64 61 74 61 20 66 72 6f  here is data fro
1abd0 6d 20 62 6f 74 68 20 63 6f 72 6f 75 74 69 6e 65  m both coroutine
1abe0 73 20 61 6e 64 20 41 3d 3d 42 2e 0a 2a 2a 0a 2a  s and A==B..**.*
1abf0 2a 20 20 20 20 41 67 74 42 3a 20 20 20 20 43 61  *    AgtB:    Ca
1ac00 6c 6c 65 64 20 77 68 65 6e 20 74 68 65 72 65 20  lled when there 
1ac10 69 73 20 64 61 74 61 20 66 72 6f 6d 20 62 6f 74  is data from bot
1ac20 68 20 63 6f 72 6f 75 74 69 6e 65 73 20 61 6e 64  h coroutines and
1ac30 20 41 3e 42 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 45   A>B..**.**    E
1ac40 6f 66 41 3a 20 20 20 20 43 61 6c 6c 65 64 20 77  ofA:    Called w
1ac50 68 65 6e 20 64 61 74 61 20 69 73 20 65 78 68 61  hen data is exha
1ac60 75 73 74 65 64 20 66 72 6f 6d 20 73 65 6c 65 63  usted from selec
1ac70 74 41 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 45 6f 66  tA..**.**    Eof
1ac80 42 3a 20 20 20 20 43 61 6c 6c 65 64 20 77 68 65  B:    Called whe
1ac90 6e 20 64 61 74 61 20 69 73 20 65 78 68 61 75 73  n data is exhaus
1aca0 74 65 64 20 66 72 6f 6d 20 73 65 6c 65 63 74 42  ted from selectB
1acb0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 6d 70 6c  ..**.** The impl
1acc0 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68  ementation of th
1acd0 65 20 6c 61 74 74 65 72 20 66 69 76 65 20 73 75  e latter five su
1ace0 62 72 6f 75 74 69 6e 65 73 20 64 65 70 65 6e 64  broutines depend
1acf0 20 6f 6e 20 77 68 69 63 68 20 0a 2a 2a 20 3c 6f   on which .** <o
1ad00 70 65 72 61 74 6f 72 3e 20 69 73 20 75 73 65 64  perator> is used
1ad10 3a 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  :.**.**.**      
1ad20 20 20 20 20 20 20 20 55 4e 49 4f 4e 20 41 4c 4c         UNION ALL
1ad30 20 20 20 20 20 20 20 20 20 55 4e 49 4f 4e 20 20           UNION  
1ad40 20 20 20 20 20 20 20 20 20 20 45 58 43 45 50 54            EXCEPT
1ad50 20 20 20 20 20 20 20 20 20 20 49 4e 54 45 52 53            INTERS
1ad60 45 43 54 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ECT.**          
1ad70 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 2d  -------------  -
1ad80 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1ad90 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d    --------------
1ada0 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d    --------------
1adb0 2d 2d 2d 0a 2a 2a 20 20 20 41 6c 74 42 3a 20 20  ---.**   AltB:  
1adc0 20 6f 75 74 41 2c 20 6e 65 78 74 41 20 20 20 20   outA, nextA    
1add0 20 20 6f 75 74 41 2c 20 6e 65 78 74 41 20 20 20    outA, nextA   
1ade0 20 20 20 20 6f 75 74 41 2c 20 6e 65 78 74 41 20      outA, nextA 
1adf0 20 20 20 20 20 20 20 20 6e 65 78 74 41 0a 2a 2a          nextA.**
1ae00 0a 2a 2a 20 20 20 41 65 71 42 3a 20 20 20 6f 75  .**   AeqB:   ou
1ae10 74 41 2c 20 6e 65 78 74 41 20 20 20 20 20 20 20  tA, nextA       
1ae20 20 20 6e 65 78 74 41 20 20 20 20 20 20 20 20 20    nextA         
1ae30 20 20 20 20 6e 65 78 74 41 20 20 20 20 20 20 20      nextA       
1ae40 20 20 6f 75 74 41 2c 20 6e 65 78 74 41 0a 2a 2a    outA, nextA.**
1ae50 0a 2a 2a 20 20 20 41 67 74 42 3a 20 20 20 6f 75  .**   AgtB:   ou
1ae60 74 42 2c 20 6e 65 78 74 42 20 20 20 20 20 20 6f  tB, nextB      o
1ae70 75 74 42 2c 20 6e 65 78 74 42 20 20 20 20 20 20  utB, nextB      
1ae80 20 20 20 20 6e 65 78 74 42 20 20 20 20 20 20 20      nextB       
1ae90 20 20 20 20 20 6e 65 78 74 42 0a 2a 2a 0a 2a 2a       nextB.**.**
1aea0 20 20 20 45 6f 66 41 3a 20 20 20 6f 75 74 42 2c     EofA:   outB,
1aeb0 20 6e 65 78 74 42 20 20 20 20 20 20 6f 75 74 42   nextB      outB
1aec0 2c 20 6e 65 78 74 42 20 20 20 20 20 20 20 20 20  , nextB         
1aed0 20 68 61 6c 74 20 20 20 20 20 20 20 20 20 20 20   halt           
1aee0 20 20 68 61 6c 74 0a 2a 2a 0a 2a 2a 20 20 20 45    halt.**.**   E
1aef0 6f 66 42 3a 20 20 20 6f 75 74 41 2c 20 6e 65 78  ofB:   outA, nex
1af00 74 41 20 20 20 20 20 20 6f 75 74 41 2c 20 6e 65  tA      outA, ne
1af10 78 74 41 20 20 20 20 20 20 20 6f 75 74 41 2c 20  xtA       outA, 
1af20 6e 65 78 74 41 20 20 20 20 20 20 20 20 20 68 61  nextA         ha
1af30 6c 74 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 65 20  lt.**.** In the 
1af40 41 6c 74 42 2c 20 41 65 71 42 2c 20 61 6e 64 20  AltB, AeqB, and 
1af50 41 67 74 42 20 73 75 62 72 6f 75 74 69 6e 65 73  AgtB subroutines
1af60 2c 20 61 6e 20 45 4f 46 20 6f 6e 20 41 20 66 6f  , an EOF on A fo
1af70 6c 6c 6f 77 69 6e 67 20 6e 65 78 74 41 0a 2a 2a  llowing nextA.**
1af80 20 63 61 75 73 65 73 20 61 6e 20 69 6d 6d 65 64   causes an immed
1af90 69 61 74 65 20 6a 75 6d 70 20 74 6f 20 45 6f 66  iate jump to Eof
1afa0 41 20 61 6e 64 20 61 6e 20 45 4f 46 20 6f 6e 20  A and an EOF on 
1afb0 42 20 66 6f 6c 6c 6f 77 69 6e 67 20 6e 65 78 74  B following next
1afc0 42 20 63 61 75 73 65 73 0a 2a 2a 20 61 6e 20 69  B causes.** an i
1afd0 6d 6d 65 64 69 61 74 65 20 6a 75 6d 70 20 74 6f  mmediate jump to
1afe0 20 45 6f 66 42 2e 20 20 57 69 74 68 69 6e 20 45   EofB.  Within E
1aff0 6f 66 41 20 61 6e 64 20 45 6f 66 42 2c 20 61 6e  ofA and EofB, an
1b000 64 20 45 4f 46 20 6f 6e 20 65 6e 74 72 79 20 6f  d EOF on entry o
1b010 72 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 6e  r.** following n
1b020 65 78 74 58 20 63 61 75 73 65 73 20 61 20 6a 75  extX causes a ju
1b030 6d 70 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66  mp to the end of
1b040 20 74 68 65 20 73 65 6c 65 63 74 20 70 72 6f 63   the select proc
1b050 65 73 73 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 44 75  essing..**.** Du
1b060 70 6c 69 63 61 74 65 20 72 65 6d 6f 76 61 6c 20  plicate removal 
1b070 69 6e 20 74 68 65 20 55 4e 49 4f 4e 2c 20 45 58  in the UNION, EX
1b080 43 45 50 54 2c 20 61 6e 64 20 49 4e 54 45 52 53  CEPT, and INTERS
1b090 45 43 54 20 63 61 73 65 73 20 69 73 20 68 61 6e  ECT cases is han
1b0a0 64 6c 65 64 0a 2a 2a 20 77 69 74 68 69 6e 20 74  dled.** within t
1b0b0 68 65 20 6f 75 74 70 75 74 20 73 75 62 72 6f 75  he output subrou
1b0c0 74 69 6e 65 2e 20 20 54 68 65 20 72 65 67 50 72  tine.  The regPr
1b0d0 65 76 20 72 65 67 69 73 74 65 72 20 73 65 74 20  ev register set 
1b0e0 68 6f 6c 64 73 20 74 68 65 20 70 72 65 76 69 6f  holds the previo
1b0f0 75 73 6c 79 0a 2a 2a 20 6f 75 74 70 75 74 20 76  usly.** output v
1b100 61 6c 75 65 2e 20 20 41 20 63 6f 6d 70 61 72 69  alue.  A compari
1b110 73 6f 6e 20 69 73 20 6d 61 64 65 20 61 67 61 69  son is made agai
1b120 6e 73 74 20 74 68 69 73 20 76 61 6c 75 65 20 61  nst this value a
1b130 6e 64 20 74 68 65 20 6f 75 74 70 75 74 0a 2a 2a  nd the output.**
1b140 20 69 73 20 73 6b 69 70 70 65 64 20 69 66 20 74   is skipped if t
1b150 68 65 20 6e 65 78 74 20 72 65 73 75 6c 74 73 20  he next results 
1b160 77 6f 75 6c 64 20 62 65 20 74 68 65 20 73 61 6d  would be the sam
1b170 65 20 61 73 20 74 68 65 20 70 72 65 76 69 6f 75  e as the previou
1b180 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 6d 70  s..**.** The imp
1b190 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 70 6c 61 6e  lementation plan
1b1a0 20 69 73 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74   is to implement
1b1b0 20 74 68 65 20 74 77 6f 20 63 6f 72 6f 75 74 69   the two corouti
1b1c0 6e 65 73 20 61 6e 64 20 73 65 76 65 6e 0a 2a 2a  nes and seven.**
1b1d0 20 73 75 62 72 6f 75 74 69 6e 65 73 20 66 69 72   subroutines fir
1b1e0 73 74 2c 20 74 68 65 6e 20 70 75 74 20 74 68 65  st, then put the
1b1f0 20 63 6f 6e 74 72 6f 6c 20 6c 6f 67 69 63 20 61   control logic a
1b200 74 20 74 68 65 20 62 6f 74 74 6f 6d 2e 20 20 4c  t the bottom.  L
1b210 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20  ike this:.**.** 
1b220 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 49 6e           goto In
1b230 69 74 0a 2a 2a 20 20 20 20 20 63 6f 41 3a 20 63  it.**     coA: c
1b240 6f 72 6f 75 74 69 6e 65 20 66 6f 72 20 6c 65 66  oroutine for lef
1b250 74 20 71 75 65 72 79 20 28 41 29 0a 2a 2a 20 20  t query (A).**  
1b260 20 20 20 63 6f 42 3a 20 63 6f 72 6f 75 74 69 6e     coB: coroutin
1b270 65 20 66 6f 72 20 72 69 67 68 74 20 71 75 65 72  e for right quer
1b280 79 20 28 42 29 0a 2a 2a 20 20 20 20 6f 75 74 41  y (B).**    outA
1b290 3a 20 6f 75 74 70 75 74 20 6f 6e 65 20 72 6f 77  : output one row
1b2a0 20 6f 66 20 41 0a 2a 2a 20 20 20 20 6f 75 74 42   of A.**    outB
1b2b0 3a 20 6f 75 74 70 75 74 20 6f 6e 65 20 72 6f 77  : output one row
1b2c0 20 6f 66 20 42 20 28 55 4e 49 4f 4e 20 61 6e 64   of B (UNION and
1b2d0 20 55 4e 49 4f 4e 20 41 4c 4c 20 6f 6e 6c 79 29   UNION ALL only)
1b2e0 0a 2a 2a 20 20 20 20 45 6f 66 41 3a 20 2e 2e 2e  .**    EofA: ...
1b2f0 0a 2a 2a 20 20 20 20 45 6f 66 42 3a 20 2e 2e 2e  .**    EofB: ...
1b300 0a 2a 2a 20 20 20 20 41 6c 74 42 3a 20 2e 2e 2e  .**    AltB: ...
1b310 0a 2a 2a 20 20 20 20 41 65 71 42 3a 20 2e 2e 2e  .**    AeqB: ...
1b320 0a 2a 2a 20 20 20 20 41 67 74 42 3a 20 2e 2e 2e  .**    AgtB: ...
1b330 0a 2a 2a 20 20 20 20 49 6e 69 74 3a 20 69 6e 69  .**    Init: ini
1b340 74 69 61 6c 69 7a 65 20 63 6f 72 6f 75 74 69 6e  tialize coroutin
1b350 65 20 72 65 67 69 73 74 65 72 73 0a 2a 2a 20 20  e registers.**  
1b360 20 20 20 20 20 20 20 20 79 69 65 6c 64 20 63 6f          yield co
1b370 41 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 69 66  A.**          if
1b380 20 65 6f 66 28 41 29 20 67 6f 74 6f 20 45 6f 66   eof(A) goto Eof
1b390 41 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 79 69  A.**          yi
1b3a0 65 6c 64 20 63 6f 42 0a 2a 2a 20 20 20 20 20 20  eld coB.**      
1b3b0 20 20 20 20 69 66 20 65 6f 66 28 42 29 20 67 6f      if eof(B) go
1b3c0 74 6f 20 45 6f 66 42 0a 2a 2a 20 20 20 20 43 6d  to EofB.**    Cm
1b3d0 70 72 3a 20 43 6f 6d 70 61 72 65 20 41 2c 20 42  pr: Compare A, B
1b3e0 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 4a 75 6d  .**          Jum
1b3f0 70 20 41 6c 74 42 2c 20 41 65 71 42 2c 20 41 67  p AltB, AeqB, Ag
1b400 74 42 0a 2a 2a 20 20 20 20 20 45 6e 64 3a 20 2e  tB.**     End: .
1b410 2e 2e 0a 2a 2a 0a 2a 2a 20 57 65 20 63 61 6c 6c  ...**.** We call
1b420 20 41 6c 74 42 2c 20 41 65 71 42 2c 20 41 67 74   AltB, AeqB, Agt
1b430 42 2c 20 45 6f 66 41 2c 20 61 6e 64 20 45 6f 66  B, EofA, and Eof
1b440 42 20 22 73 75 62 72 6f 75 74 69 6e 65 73 22 20  B "subroutines" 
1b450 62 75 74 20 74 68 65 79 20 61 72 65 20 6e 6f 74  but they are not
1b460 0a 2a 2a 20 61 63 74 75 61 6c 6c 79 20 63 61 6c  .** actually cal
1b470 6c 65 64 20 75 73 69 6e 67 20 47 6f 73 75 62 20  led using Gosub 
1b480 61 6e 64 20 74 68 65 79 20 64 6f 20 6e 6f 74 20  and they do not 
1b490 52 65 74 75 72 6e 2e 20 20 45 6f 66 41 20 61 6e  Return.  EofA an
1b4a0 64 20 45 6f 66 42 20 6c 6f 6f 70 0a 2a 2a 20 75  d EofB loop.** u
1b4b0 6e 74 69 6c 20 61 6c 6c 20 64 61 74 61 20 69 73  ntil all data is
1b4c0 20 65 78 68 61 75 73 74 65 64 20 74 68 65 6e 20   exhausted then 
1b4d0 6a 75 6d 70 20 74 6f 20 74 68 65 20 22 65 6e 64  jump to the "end
1b4e0 22 20 6c 61 62 65 2e 20 20 41 6c 74 42 2c 20 41  " labe.  AltB, A
1b4f0 65 71 42 2c 0a 2a 2a 20 61 6e 64 20 41 67 74 42  eqB,.** and AgtB
1b500 20 6a 75 6d 70 20 74 6f 20 65 69 74 68 65 72 20   jump to either 
1b510 4c 32 20 6f 72 20 74 6f 20 6f 6e 65 20 6f 66 20  L2 or to one of 
1b520 45 6f 66 41 20 6f 72 20 45 6f 66 42 2e 0a 2a 2f  EofA or EofB..*/
1b530 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1b540 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45  OMIT_COMPOUND_SE
1b550 4c 45 43 54 0a 73 74 61 74 69 63 20 69 6e 74 20  LECT.static int 
1b560 6d 75 6c 74 69 53 65 6c 65 63 74 4f 72 64 65 72  multiSelectOrder
1b570 42 79 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  By(.  Parse *pPa
1b580 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50  rse,        /* P
1b590 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
1b5a0 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20  /.  Select *p,  
1b5b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
1b5c0 20 72 69 67 68 74 2d 6d 6f 73 74 20 6f 66 20 53   right-most of S
1b5d0 45 4c 45 43 54 73 20 74 6f 20 62 65 20 63 6f 64  ELECTs to be cod
1b5e0 65 64 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65  ed */.  SelectDe
1b5f0 73 74 20 2a 70 44 65 73 74 20 20 20 20 20 2f 2a  st *pDest     /*
1b600 20 57 68 61 74 20 74 6f 20 64 6f 20 77 69 74 68   What to do with
1b610 20 71 75 65 72 79 20 72 65 73 75 6c 74 73 20 2a   query results *
1b620 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b  /.){.  int i, j;
1b630 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1b640 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f  Loop counters */
1b650 0a 20 20 53 65 6c 65 63 74 20 2a 70 50 72 69 6f  .  Select *pPrio
1b660 72 3b 20 20 20 20 20 20 20 2f 2a 20 41 6e 6f 74  r;       /* Anot
1b670 68 65 72 20 53 45 4c 45 43 54 20 69 6d 6d 65 64  her SELECT immed
1b680 69 61 74 65 6c 79 20 74 6f 20 6f 75 72 20 6c 65  iately to our le
1b690 66 74 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b  ft */.  Vdbe *v;
1b6a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1b6b0 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
1b6c0 6f 20 74 68 69 73 20 56 44 42 45 20 2a 2f 0a 20  o this VDBE */. 
1b6d0 20 53 65 6c 65 63 74 44 65 73 74 20 64 65 73 74   SelectDest dest
1b6e0 41 3b 20 20 20 20 20 2f 2a 20 44 65 73 74 69 6e  A;     /* Destin
1b6f0 61 74 69 6f 6e 20 66 6f 72 20 63 6f 72 6f 75 74  ation for corout
1b700 69 6e 65 20 41 20 2a 2f 0a 20 20 53 65 6c 65 63  ine A */.  Selec
1b710 74 44 65 73 74 20 64 65 73 74 42 3b 20 20 20 20  tDest destB;    
1b720 20 2f 2a 20 44 65 73 74 69 6e 61 74 69 6f 6e 20   /* Destination 
1b730 66 6f 72 20 63 6f 72 6f 75 74 69 6e 65 20 42 20  for coroutine B 
1b740 2a 2f 0a 20 20 69 6e 74 20 72 65 67 41 64 64 72  */.  int regAddr
1b750 41 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64  A;         /* Ad
1b760 64 72 65 73 73 20 72 65 67 69 73 74 65 72 20 66  dress register f
1b770 6f 72 20 73 65 6c 65 63 74 2d 41 20 63 6f 72 6f  or select-A coro
1b780 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 72  utine */.  int r
1b790 65 67 41 64 64 72 42 3b 20 20 20 20 20 20 20 20  egAddrB;        
1b7a0 20 2f 2a 20 41 64 64 72 65 73 73 20 72 65 67 69   /* Address regi
1b7b0 73 74 65 72 20 66 6f 72 20 73 65 6c 65 63 74 2d  ster for select-
1b7c0 42 20 63 6f 72 6f 75 74 69 6e 65 20 2a 2f 0a 20  B coroutine */. 
1b7d0 20 69 6e 74 20 61 64 64 72 53 65 6c 65 63 74 41   int addrSelectA
1b7e0 3b 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73  ;      /* Addres
1b7f0 73 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74 2d  s of the select-
1b800 41 20 63 6f 72 6f 75 74 69 6e 65 20 2a 2f 0a 20  A coroutine */. 
1b810 20 69 6e 74 20 61 64 64 72 53 65 6c 65 63 74 42   int addrSelectB
1b820 3b 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73  ;      /* Addres
1b830 73 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74 2d  s of the select-
1b840 42 20 63 6f 72 6f 75 74 69 6e 65 20 2a 2f 0a 20  B coroutine */. 
1b850 20 69 6e 74 20 72 65 67 4f 75 74 41 3b 20 20 20   int regOutA;   
1b860 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73         /* Addres
1b870 73 20 72 65 67 69 73 74 65 72 20 66 6f 72 20 74  s register for t
1b880 68 65 20 6f 75 74 70 75 74 2d 41 20 73 75 62 72  he output-A subr
1b890 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20  outine */.  int 
1b8a0 72 65 67 4f 75 74 42 3b 20 20 20 20 20 20 20 20  regOutB;        
1b8b0 20 20 2f 2a 20 41 64 64 72 65 73 73 20 72 65 67    /* Address reg
1b8c0 69 73 74 65 72 20 66 6f 72 20 74 68 65 20 6f 75  ister for the ou
1b8d0 74 70 75 74 2d 42 20 73 75 62 72 6f 75 74 69 6e  tput-B subroutin
1b8e0 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 4f  e */.  int addrO
1b8f0 75 74 41 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  utA;         /* 
1b900 41 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 6f  Address of the o
1b910 75 74 70 75 74 2d 41 20 73 75 62 72 6f 75 74 69  utput-A subrouti
1b920 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72  ne */.  int addr
1b930 4f 75 74 42 20 3d 20 30 3b 20 20 20 20 20 2f 2a  OutB = 0;     /*
1b940 20 41 64 64 72 65 73 73 20 6f 66 20 74 68 65 20   Address of the 
1b950 6f 75 74 70 75 74 2d 42 20 73 75 62 72 6f 75 74  output-B subrout
1b960 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64  ine */.  int add
1b970 72 45 6f 66 41 3b 20 20 20 20 20 20 20 20 20 2f  rEofA;         /
1b980 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 68 65  * Address of the
1b990 20 73 65 6c 65 63 74 2d 41 2d 65 78 68 61 75 73   select-A-exhaus
1b9a0 74 65 64 20 73 75 62 72 6f 75 74 69 6e 65 20 2a  ted subroutine *
1b9b0 2f 0a 20 20 69 6e 74 20 61 64 64 72 45 6f 66 41  /.  int addrEofA
1b9c0 5f 6e 6f 42 3b 20 20 20 20 20 2f 2a 20 41 6c 74  _noB;     /* Alt
1b9d0 65 72 6e 61 74 65 20 61 64 64 72 45 6f 66 41 20  ernate addrEofA 
1b9e0 69 66 20 42 20 69 73 20 75 6e 69 6e 69 74 69 61  if B is uninitia
1b9f0 6c 69 7a 65 64 20 2a 2f 0a 20 20 69 6e 74 20 61  lized */.  int a
1ba00 64 64 72 45 6f 66 42 3b 20 20 20 20 20 20 20 20  ddrEofB;        
1ba10 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74   /* Address of t
1ba20 68 65 20 73 65 6c 65 63 74 2d 42 2d 65 78 68 61  he select-B-exha
1ba30 75 73 74 65 64 20 73 75 62 72 6f 75 74 69 6e 65  usted subroutine
1ba40 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 41 6c   */.  int addrAl
1ba50 74 42 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41  tB;         /* A
1ba60 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 41 3c  ddress of the A<
1ba70 42 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a  B subroutine */.
1ba80 20 20 69 6e 74 20 61 64 64 72 41 65 71 42 3b 20    int addrAeqB; 
1ba90 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65          /* Addre
1baa0 73 73 20 6f 66 20 74 68 65 20 41 3d 3d 42 20 73  ss 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 61 64 64 72 41 67 74 42 3b 20 20 20 20  nt addrAgtB;    
1bad0 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
1bae0 6f 66 20 74 68 65 20 41 3e 42 20 73 75 62 72 6f  of the A>B subro
1baf0 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 72  utine */.  int r
1bb00 65 67 4c 69 6d 69 74 41 3b 20 20 20 20 20 20 20  egLimitA;       
1bb10 20 2f 2a 20 4c 69 6d 69 74 20 72 65 67 69 73 74   /* Limit regist
1bb20 65 72 20 66 6f 72 20 73 65 6c 65 63 74 2d 41 20  er for select-A 
1bb30 2a 2f 0a 20 20 69 6e 74 20 72 65 67 4c 69 6d 69  */.  int regLimi
1bb40 74 42 3b 20 20 20 20 20 20 20 20 2f 2a 20 4c 69  tB;        /* Li
1bb50 6d 69 74 20 72 65 67 69 73 74 65 72 20 66 6f 72  mit register for
1bb60 20 73 65 6c 65 63 74 2d 41 20 2a 2f 0a 20 20 69   select-A */.  i
1bb70 6e 74 20 72 65 67 50 72 65 76 3b 20 20 20 20 20  nt regPrev;     
1bb80 20 20 20 20 20 2f 2a 20 41 20 72 61 6e 67 65 20       /* A range 
1bb90 6f 66 20 72 65 67 69 73 74 65 72 73 20 74 6f 20  of registers to 
1bba0 68 6f 6c 64 20 70 72 65 76 69 6f 75 73 20 6f 75  hold previous ou
1bbb0 74 70 75 74 20 2a 2f 0a 20 20 69 6e 74 20 73 61  tput */.  int sa
1bbc0 76 65 64 4c 69 6d 69 74 3b 20 20 20 20 20 20 20  vedLimit;       
1bbd0 2f 2a 20 53 61 76 65 64 20 76 61 6c 75 65 20 6f  /* Saved value o
1bbe0 66 20 70 2d 3e 69 4c 69 6d 69 74 20 2a 2f 0a 20  f p->iLimit */. 
1bbf0 20 69 6e 74 20 73 61 76 65 64 4f 66 66 73 65 74   int savedOffset
1bc00 3b 20 20 20 20 20 20 2f 2a 20 53 61 76 65 64 20  ;      /* Saved 
1bc10 76 61 6c 75 65 20 6f 66 20 70 2d 3e 69 4f 66 66  value of p->iOff
1bc20 73 65 74 20 2a 2f 0a 20 20 69 6e 74 20 6c 61 62  set */.  int lab
1bc30 65 6c 43 6d 70 72 3b 20 20 20 20 20 20 20 20 2f  elCmpr;        /
1bc40 2a 20 4c 61 62 65 6c 20 66 6f 72 20 74 68 65 20  * Label for the 
1bc50 73 74 61 72 74 20 6f 66 20 74 68 65 20 6d 65 72  start of the mer
1bc60 67 65 20 61 6c 67 6f 72 69 74 68 6d 20 2a 2f 0a  ge algorithm */.
1bc70 20 20 69 6e 74 20 6c 61 62 65 6c 45 6e 64 3b 20    int labelEnd; 
1bc80 20 20 20 20 20 20 20 20 2f 2a 20 4c 61 62 65 6c          /* Label
1bc90 20 66 6f 72 20 74 68 65 20 65 6e 64 20 6f 66 20   for the end of 
1bca0 74 68 65 20 6f 76 65 72 61 6c 6c 20 53 45 4c 45  the overall SELE
1bcb0 43 54 20 73 74 6d 74 20 2a 2f 0a 20 20 69 6e 74  CT stmt */.  int
1bcc0 20 61 64 64 72 31 3b 20 20 20 20 20 20 20 20 20   addr1;         
1bcd0 20 20 20 2f 2a 20 4a 75 6d 70 20 69 6e 73 74 72     /* Jump instr
1bce0 75 63 74 69 6f 6e 73 20 74 68 61 74 20 67 65 74  uctions that get
1bcf0 20 72 65 74 61 72 67 65 74 74 65 64 20 2a 2f 0a   retargetted */.
1bd00 20 20 69 6e 74 20 6f 70 3b 20 20 20 20 20 20 20    int op;       
1bd10 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f          /* One o
1bd20 66 20 54 4b 5f 41 4c 4c 2c 20 54 4b 5f 55 4e 49  f TK_ALL, TK_UNI
1bd30 4f 4e 2c 20 54 4b 5f 45 58 43 45 50 54 2c 20 54  ON, TK_EXCEPT, T
1bd40 4b 5f 49 4e 54 45 52 53 45 43 54 20 2a 2f 0a 20  K_INTERSECT */. 
1bd50 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 44 75   KeyInfo *pKeyDu
1bd60 70 20 3d 20 30 3b 20 2f 2a 20 43 6f 6d 70 61 72  p = 0; /* Compar
1bd70 69 73 6f 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  ison information
1bd80 20 66 6f 72 20 64 75 70 6c 69 63 61 74 65 20 72   for duplicate r
1bd90 65 6d 6f 76 61 6c 20 2a 2f 0a 20 20 4b 65 79 49  emoval */.  KeyI
1bda0 6e 66 6f 20 2a 70 4b 65 79 4d 65 72 67 65 3b 20  nfo *pKeyMerge; 
1bdb0 20 20 2f 2a 20 43 6f 6d 70 61 72 69 73 6f 6e 20    /* Comparison 
1bdc0 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20  information for 
1bdd0 6d 65 72 67 69 6e 67 20 72 6f 77 73 20 2a 2f 0a  merging rows */.
1bde0 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 20 20    sqlite3 *db;  
1bdf0 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62          /* Datab
1be00 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a  ase connection *
1be10 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f  /.  ExprList *pO
1be20 72 64 65 72 42 79 3b 20 20 20 2f 2a 20 54 68 65  rderBy;   /* The
1be30 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
1be40 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f 72 64 65 72   */.  int nOrder
1be50 42 79 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  By;         /* N
1be60 75 6d 62 65 72 20 6f 66 20 74 65 72 6d 73 20 69  umber of terms i
1be70 6e 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63  n the ORDER BY c
1be80 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 2a  lause */.  int *
1be90 61 50 65 72 6d 75 74 65 3b 20 20 20 20 20 20 20  aPermute;       
1bea0 20 2f 2a 20 4d 61 70 70 69 6e 67 20 66 72 6f 6d   /* Mapping from
1beb0 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d 73 20   ORDER BY terms 
1bec0 74 6f 20 72 65 73 75 6c 74 20 73 65 74 20 63 6f  to result set co
1bed0 6c 75 6d 6e 73 20 2a 2f 0a 0a 20 20 61 73 73 65  lumns */..  asse
1bee0 72 74 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 21  rt( p->pOrderBy!
1bef0 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
1bf00 70 4b 65 79 44 75 70 3d 3d 30 20 29 3b 20 2f 2a  pKeyDup==0 ); /*
1bf10 20 22 4d 61 6e 61 67 65 64 22 20 63 6f 64 65 20   "Managed" code 
1bf20 6e 65 65 64 73 20 74 68 69 73 2e 20 20 54 69 63  needs this.  Tic
1bf30 6b 65 74 20 23 33 33 38 32 2e 20 2a 2f 0a 20 20  ket #3382. */.  
1bf40 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
1bf50 0a 20 20 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  .  v = pParse->p
1bf60 56 64 62 65 3b 0a 20 20 61 73 73 65 72 74 28 20  Vdbe;.  assert( 
1bf70 76 21 3d 30 20 29 3b 20 20 20 20 20 20 20 2f 2a  v!=0 );       /*
1bf80 20 41 6c 72 65 61 64 79 20 74 68 72 6f 77 6e 20   Already thrown 
1bf90 74 68 65 20 65 72 72 6f 72 20 69 66 20 56 44 42  the error if VDB
1bfa0 45 20 61 6c 6c 6f 63 20 66 61 69 6c 65 64 20 2a  E alloc failed *
1bfb0 2f 0a 20 20 6c 61 62 65 6c 45 6e 64 20 3d 20 73  /.  labelEnd = s
1bfc0 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
1bfd0 62 65 6c 28 70 50 61 72 73 65 29 3b 0a 20 20 6c  bel(pParse);.  l
1bfe0 61 62 65 6c 43 6d 70 72 20 3d 20 73 71 6c 69 74  abelCmpr = sqlit
1bff0 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
1c000 70 50 61 72 73 65 29 3b 0a 0a 0a 20 20 2f 2a 20  pParse);...  /* 
1c010 50 61 74 63 68 20 75 70 20 74 68 65 20 4f 52 44  Patch up the ORD
1c020 45 52 20 42 59 20 63 6c 61 75 73 65 0a 20 20 2a  ER BY clause.  *
1c030 2f 0a 20 20 6f 70 20 3d 20 70 2d 3e 6f 70 3b 20  /.  op = p->op; 
1c040 20 0a 20 20 70 50 72 69 6f 72 20 3d 20 70 2d 3e   .  pPrior = p->
1c050 70 50 72 69 6f 72 3b 0a 20 20 61 73 73 65 72 74  pPrior;.  assert
1c060 28 20 70 50 72 69 6f 72 2d 3e 70 4f 72 64 65 72  ( pPrior->pOrder
1c070 42 79 3d 3d 30 20 29 3b 0a 20 20 70 4f 72 64 65  By==0 );.  pOrde
1c080 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42  rBy = p->pOrderB
1c090 79 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f 72  y;.  assert( pOr
1c0a0 64 65 72 42 79 20 29 3b 0a 20 20 6e 4f 72 64 65  derBy );.  nOrde
1c0b0 72 42 79 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e  rBy = pOrderBy->
1c0c0 6e 45 78 70 72 3b 0a 0a 20 20 2f 2a 20 46 6f 72  nExpr;..  /* For
1c0d0 20 6f 70 65 72 61 74 6f 72 73 20 6f 74 68 65 72   operators other
1c0e0 20 74 68 61 6e 20 55 4e 49 4f 4e 20 41 4c 4c 20   than UNION ALL 
1c0f0 77 65 20 68 61 76 65 20 74 6f 20 6d 61 6b 65 20  we have to make 
1c100 73 75 72 65 20 74 68 61 74 0a 20 20 2a 2a 20 74  sure that.  ** t
1c110 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
1c120 73 65 20 63 6f 76 65 72 73 20 65 76 65 72 79 20  se covers every 
1c130 74 65 72 6d 20 6f 66 20 74 68 65 20 72 65 73 75  term of the resu
1c140 6c 74 20 73 65 74 2e 20 20 41 64 64 0a 20 20 2a  lt set.  Add.  *
1c150 2a 20 74 65 72 6d 73 20 74 6f 20 74 68 65 20 4f  * terms to the O
1c160 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 61  RDER BY clause a
1c170 73 20 6e 65 63 65 73 73 61 72 79 2e 0a 20 20 2a  s necessary..  *
1c180 2f 0a 20 20 69 66 28 20 6f 70 21 3d 54 4b 5f 41  /.  if( op!=TK_A
1c190 4c 4c 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d  LL ){.    for(i=
1c1a0 31 3b 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  1; db->mallocFai
1c1b0 6c 65 64 3d 3d 30 20 26 26 20 69 3c 3d 70 2d 3e  led==0 && i<=p->
1c1c0 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69  pEList->nExpr; i
1c1d0 2b 2b 29 7b 0a 20 20 20 20 20 20 73 74 72 75 63  ++){.      struc
1c1e0 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20  t ExprList_item 
1c1f0 2a 70 49 74 65 6d 3b 0a 20 20 20 20 20 20 66 6f  *pItem;.      fo
1c200 72 28 6a 3d 30 2c 20 70 49 74 65 6d 3d 70 4f 72  r(j=0, pItem=pOr
1c210 64 65 72 42 79 2d 3e 61 3b 20 6a 3c 6e 4f 72 64  derBy->a; j<nOrd
1c220 65 72 42 79 3b 20 6a 2b 2b 2c 20 70 49 74 65 6d  erBy; j++, pItem
1c230 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  ++){.        ass
1c240 65 72 74 28 20 70 49 74 65 6d 2d 3e 75 2e 78 2e  ert( pItem->u.x.
1c250 69 4f 72 64 65 72 42 79 43 6f 6c 3e 30 20 29 3b  iOrderByCol>0 );
1c260 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 49 74  .        if( pIt
1c270 65 6d 2d 3e 75 2e 78 2e 69 4f 72 64 65 72 42 79  em->u.x.iOrderBy
1c280 43 6f 6c 3d 3d 69 20 29 20 62 72 65 61 6b 3b 0a  Col==i ) break;.
1c290 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
1c2a0 28 20 6a 3d 3d 6e 4f 72 64 65 72 42 79 20 29 7b  ( j==nOrderBy ){
1c2b0 0a 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70  .        Expr *p
1c2c0 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 45 78 70  New = sqlite3Exp
1c2d0 72 28 64 62 2c 20 54 4b 5f 49 4e 54 45 47 45 52  r(db, TK_INTEGER
1c2e0 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66  , 0);.        if
1c2f0 28 20 70 4e 65 77 3d 3d 30 20 29 20 72 65 74 75  ( pNew==0 ) retu
1c300 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f  rn SQLITE_NOMEM_
1c310 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 70 4e  BKPT;.        pN
1c320 65 77 2d 3e 66 6c 61 67 73 20 7c 3d 20 45 50 5f  ew->flags |= EP_
1c330 49 6e 74 56 61 6c 75 65 3b 0a 20 20 20 20 20 20  IntValue;.      
1c340 20 20 70 4e 65 77 2d 3e 75 2e 69 56 61 6c 75 65    pNew->u.iValue
1c350 20 3d 20 69 3b 0a 20 20 20 20 20 20 20 20 70 2d   = i;.        p-
1c360 3e 70 4f 72 64 65 72 42 79 20 3d 20 70 4f 72 64  >pOrderBy = pOrd
1c370 65 72 42 79 20 3d 20 73 71 6c 69 74 65 33 45 78  erBy = sqlite3Ex
1c380 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61  prListAppend(pPa
1c390 72 73 65 2c 20 70 4f 72 64 65 72 42 79 2c 20 70  rse, pOrderBy, p
1c3a0 4e 65 77 29 3b 0a 20 20 20 20 20 20 20 20 69 66  New);.        if
1c3b0 28 20 70 4f 72 64 65 72 42 79 20 29 20 70 4f 72  ( pOrderBy ) pOr
1c3c0 64 65 72 42 79 2d 3e 61 5b 6e 4f 72 64 65 72 42  derBy->a[nOrderB
1c3d0 79 2b 2b 5d 2e 75 2e 78 2e 69 4f 72 64 65 72 42  y++].u.x.iOrderB
1c3e0 79 43 6f 6c 20 3d 20 28 75 31 36 29 69 3b 0a 20  yCol = (u16)i;. 
1c3f0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
1c400 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 74  ..  /* Compute t
1c410 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 70 65  he comparison pe
1c420 72 6d 75 74 61 74 69 6f 6e 20 61 6e 64 20 6b 65  rmutation and ke
1c430 79 69 6e 66 6f 20 74 68 61 74 20 69 73 20 75 73  yinfo that is us
1c440 65 64 20 77 69 74 68 0a 20 20 2a 2a 20 74 68 65  ed with.  ** the
1c450 20 70 65 72 6d 75 74 61 74 69 6f 6e 20 75 73 65   permutation use
1c460 64 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 69  d to determine i
1c470 66 20 74 68 65 20 6e 65 78 74 0a 20 20 2a 2a 20  f the next.  ** 
1c480 72 6f 77 20 6f 66 20 72 65 73 75 6c 74 73 20 63  row of results c
1c490 6f 6d 65 73 20 66 72 6f 6d 20 73 65 6c 65 63 74  omes from select
1c4a0 41 20 6f 72 20 73 65 6c 65 63 74 42 2e 20 20 41  A or selectB.  A
1c4b0 6c 73 6f 20 61 64 64 20 65 78 70 6c 69 63 69 74  lso add explicit
1c4c0 0a 20 20 2a 2a 20 63 6f 6c 6c 61 74 69 6f 6e 73  .  ** collations
1c4d0 20 74 6f 20 74 68 65 20 4f 52 44 45 52 20 42 59   to the ORDER BY
1c4e0 20 63 6c 61 75 73 65 20 74 65 72 6d 73 20 73 6f   clause terms so
1c4f0 20 74 68 61 74 20 77 68 65 6e 20 74 68 65 20 73   that when the s
1c500 75 62 71 75 65 72 69 65 73 0a 20 20 2a 2a 20 74  ubqueries.  ** t
1c510 6f 20 74 68 65 20 72 69 67 68 74 20 61 6e 64 20  o the right and 
1c520 74 68 65 20 6c 65 66 74 20 61 72 65 20 65 76 61  the left are eva
1c530 6c 75 61 74 65 64 2c 20 74 68 65 79 20 75 73 65  luated, they use
1c540 20 74 68 65 20 63 6f 72 72 65 63 74 0a 20 20 2a   the correct.  *
1c550 2a 20 63 6f 6c 6c 61 74 69 6f 6e 2e 0a 20 20 2a  * collation..  *
1c560 2f 0a 20 20 61 50 65 72 6d 75 74 65 20 3d 20 73  /.  aPermute = s
1c570 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61  qlite3DbMallocRa
1c580 77 4e 4e 28 64 62 2c 20 73 69 7a 65 6f 66 28 69  wNN(db, sizeof(i
1c590 6e 74 29 2a 28 6e 4f 72 64 65 72 42 79 20 2b 20  nt)*(nOrderBy + 
1c5a0 31 29 29 3b 0a 20 20 69 66 28 20 61 50 65 72 6d  1));.  if( aPerm
1c5b0 75 74 65 20 29 7b 0a 20 20 20 20 73 74 72 75 63  ute ){.    struc
1c5c0 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20  t ExprList_item 
1c5d0 2a 70 49 74 65 6d 3b 0a 20 20 20 20 61 50 65 72  *pItem;.    aPer
1c5e0 6d 75 74 65 5b 30 5d 20 3d 20 6e 4f 72 64 65 72  mute[0] = nOrder
1c5f0 42 79 3b 0a 20 20 20 20 66 6f 72 28 69 3d 31 2c  By;.    for(i=1,
1c600 20 70 49 74 65 6d 3d 70 4f 72 64 65 72 42 79 2d   pItem=pOrderBy-
1c610 3e 61 3b 20 69 3c 3d 6e 4f 72 64 65 72 42 79 3b  >a; i<=nOrderBy;
1c620 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a   i++, pItem++){.
1c630 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49        assert( pI
1c640 74 65 6d 2d 3e 75 2e 78 2e 69 4f 72 64 65 72 42  tem->u.x.iOrderB
1c650 79 43 6f 6c 3e 30 20 29 3b 0a 20 20 20 20 20 20  yCol>0 );.      
1c660 61 73 73 65 72 74 28 20 70 49 74 65 6d 2d 3e 75  assert( pItem->u
1c670 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 3c 3d  .x.iOrderByCol<=
1c680 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  p->pEList->nExpr
1c690 20 29 3b 0a 20 20 20 20 20 20 61 50 65 72 6d 75   );.      aPermu
1c6a0 74 65 5b 69 5d 20 3d 20 70 49 74 65 6d 2d 3e 75  te[i] = pItem->u
1c6b0 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 20 2d  .x.iOrderByCol -
1c6c0 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4b   1;.    }.    pK
1c6d0 65 79 4d 65 72 67 65 20 3d 20 6d 75 6c 74 69 53  eyMerge = multiS
1c6e0 65 6c 65 63 74 4f 72 64 65 72 42 79 4b 65 79 49  electOrderByKeyI
1c6f0 6e 66 6f 28 70 50 61 72 73 65 2c 20 70 2c 20 31  nfo(pParse, p, 1
1c700 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
1c710 70 4b 65 79 4d 65 72 67 65 20 3d 20 30 3b 0a 20  pKeyMerge = 0;. 
1c720 20 7d 0a 0a 20 20 2f 2a 20 52 65 61 74 74 61 63   }..  /* Reattac
1c730 68 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63  h the ORDER BY c
1c740 6c 61 75 73 65 20 74 6f 20 74 68 65 20 71 75 65  lause to the que
1c750 72 79 2e 0a 20 20 2a 2f 0a 20 20 70 2d 3e 70 4f  ry..  */.  p->pO
1c760 72 64 65 72 42 79 20 3d 20 70 4f 72 64 65 72 42  rderBy = pOrderB
1c770 79 3b 0a 20 20 70 50 72 69 6f 72 2d 3e 70 4f 72  y;.  pPrior->pOr
1c780 64 65 72 42 79 20 3d 20 73 71 6c 69 74 65 33 45  derBy = sqlite3E
1c790 78 70 72 4c 69 73 74 44 75 70 28 70 50 61 72 73  xprListDup(pPars
1c7a0 65 2d 3e 64 62 2c 20 70 4f 72 64 65 72 42 79 2c  e->db, pOrderBy,
1c7b0 20 30 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63   0);..  /* Alloc
1c7c0 61 74 65 20 61 20 72 61 6e 67 65 20 6f 66 20 74  ate a range of t
1c7d0 65 6d 70 6f 72 61 72 79 20 72 65 67 69 73 74 65  emporary registe
1c7e0 72 73 20 61 6e 64 20 74 68 65 20 4b 65 79 49 6e  rs and the KeyIn
1c7f0 66 6f 20 6e 65 65 64 65 64 0a 20 20 2a 2a 20 66  fo needed.  ** f
1c800 6f 72 20 74 68 65 20 6c 6f 67 69 63 20 74 68 61  or the logic tha
1c810 74 20 72 65 6d 6f 76 65 73 20 64 75 70 6c 69 63  t removes duplic
1c820 61 74 65 20 72 65 73 75 6c 74 20 72 6f 77 73 20  ate result rows 
1c830 77 68 65 6e 20 74 68 65 0a 20 20 2a 2a 20 6f 70  when the.  ** op
1c840 65 72 61 74 6f 72 20 69 73 20 55 4e 49 4f 4e 2c  erator is UNION,
1c850 20 45 58 43 45 50 54 2c 20 6f 72 20 49 4e 54 45   EXCEPT, or INTE
1c860 52 53 45 43 54 20 28 62 75 74 20 6e 6f 74 20 55  RSECT (but not U
1c870 4e 49 4f 4e 20 41 4c 4c 29 2e 0a 20 20 2a 2f 0a  NION ALL)..  */.
1c880 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 41 4c 4c    if( op==TK_ALL
1c890 20 29 7b 0a 20 20 20 20 72 65 67 50 72 65 76 20   ){.    regPrev 
1c8a0 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = 0;.  }else{.  
1c8b0 20 20 69 6e 74 20 6e 45 78 70 72 20 3d 20 70 2d    int nExpr = p-
1c8c0 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a  >pEList->nExpr;.
1c8d0 20 20 20 20 61 73 73 65 72 74 28 20 6e 4f 72 64      assert( nOrd
1c8e0 65 72 42 79 3e 3d 6e 45 78 70 72 20 7c 7c 20 64  erBy>=nExpr || d
1c8f0 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
1c900 29 3b 0a 20 20 20 20 72 65 67 50 72 65 76 20 3d  );.    regPrev =
1c910 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b   pParse->nMem+1;
1c920 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65  .    pParse->nMe
1c930 6d 20 2b 3d 20 6e 45 78 70 72 2b 31 3b 0a 20 20  m += nExpr+1;.  
1c940 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1c950 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  Op2(v, OP_Intege
1c960 72 2c 20 30 2c 20 72 65 67 50 72 65 76 29 3b 0a  r, 0, regPrev);.
1c970 20 20 20 20 70 4b 65 79 44 75 70 20 3d 20 73 71      pKeyDup = sq
1c980 6c 69 74 65 33 4b 65 79 49 6e 66 6f 41 6c 6c 6f  lite3KeyInfoAllo
1c990 63 28 64 62 2c 20 6e 45 78 70 72 2c 20 31 29 3b  c(db, nExpr, 1);
1c9a0 0a 20 20 20 20 69 66 28 20 70 4b 65 79 44 75 70  .    if( pKeyDup
1c9b0 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
1c9c0 28 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f  ( sqlite3KeyInfo
1c9d0 49 73 57 72 69 74 65 61 62 6c 65 28 70 4b 65 79  IsWriteable(pKey
1c9e0 44 75 70 29 20 29 3b 0a 20 20 20 20 20 20 66 6f  Dup) );.      fo
1c9f0 72 28 69 3d 30 3b 20 69 3c 6e 45 78 70 72 3b 20  r(i=0; i<nExpr; 
1ca00 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 70 4b  i++){.        pK
1ca10 65 79 44 75 70 2d 3e 61 43 6f 6c 6c 5b 69 5d 20  eyDup->aColl[i] 
1ca20 3d 20 6d 75 6c 74 69 53 65 6c 65 63 74 43 6f 6c  = multiSelectCol
1ca30 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 2c 20  lSeq(pParse, p, 
1ca40 69 29 3b 0a 20 20 20 20 20 20 20 20 70 4b 65 79  i);.        pKey
1ca50 44 75 70 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b  Dup->aSortOrder[
1ca60 69 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a  i] = 0;.      }.
1ca70 20 20 20 20 7d 0a 20 20 7d 0a 20 0a 20 20 2f 2a      }.  }. .  /*
1ca80 20 53 65 70 61 72 61 74 65 20 74 68 65 20 6c 65   Separate the le
1ca90 66 74 20 61 6e 64 20 74 68 65 20 72 69 67 68 74  ft and the right
1caa0 20 71 75 65 72 79 20 66 72 6f 6d 20 6f 6e 65 20   query from one 
1cab0 61 6e 6f 74 68 65 72 0a 20 20 2a 2f 0a 20 20 70  another.  */.  p
1cac0 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20  ->pPrior = 0;.  
1cad0 70 50 72 69 6f 72 2d 3e 70 4e 65 78 74 20 3d 20  pPrior->pNext = 
1cae0 30 3b 0a 20 20 73 71 6c 69 74 65 33 52 65 73 6f  0;.  sqlite3Reso
1caf0 6c 76 65 4f 72 64 65 72 47 72 6f 75 70 42 79 28  lveOrderGroupBy(
1cb00 70 50 61 72 73 65 2c 20 70 2c 20 70 2d 3e 70 4f  pParse, p, p->pO
1cb10 72 64 65 72 42 79 2c 20 22 4f 52 44 45 52 22 29  rderBy, "ORDER")
1cb20 3b 0a 20 20 69 66 28 20 70 50 72 69 6f 72 2d 3e  ;.  if( pPrior->
1cb30 70 50 72 69 6f 72 3d 3d 30 20 29 7b 0a 20 20 20  pPrior==0 ){.   
1cb40 20 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 4f   sqlite3ResolveO
1cb50 72 64 65 72 47 72 6f 75 70 42 79 28 70 50 61 72  rderGroupBy(pPar
1cb60 73 65 2c 20 70 50 72 69 6f 72 2c 20 70 50 72 69  se, pPrior, pPri
1cb70 6f 72 2d 3e 70 4f 72 64 65 72 42 79 2c 20 22 4f  or->pOrderBy, "O
1cb80 52 44 45 52 22 29 3b 0a 20 20 7d 0a 0a 20 20 2f  RDER");.  }..  /
1cb90 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20 6c 69  * Compute the li
1cba0 6d 69 74 20 72 65 67 69 73 74 65 72 73 20 2a 2f  mit registers */
1cbb0 0a 20 20 63 6f 6d 70 75 74 65 4c 69 6d 69 74 52  .  computeLimitR
1cbc0 65 67 69 73 74 65 72 73 28 70 50 61 72 73 65 2c  egisters(pParse,
1cbd0 20 70 2c 20 6c 61 62 65 6c 45 6e 64 29 3b 0a 20   p, labelEnd);. 
1cbe0 20 69 66 28 20 70 2d 3e 69 4c 69 6d 69 74 20 26   if( p->iLimit &
1cbf0 26 20 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 29 7b 0a  & op==TK_ALL ){.
1cc00 20 20 20 20 72 65 67 4c 69 6d 69 74 41 20 3d 20      regLimitA = 
1cc10 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
1cc20 20 20 20 20 72 65 67 4c 69 6d 69 74 42 20 3d 20      regLimitB = 
1cc30 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
1cc40 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1cc50 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6f 70 79  ddOp2(v, OP_Copy
1cc60 2c 20 70 2d 3e 69 4f 66 66 73 65 74 20 3f 20 70  , p->iOffset ? p
1cc70 2d 3e 69 4f 66 66 73 65 74 2b 31 20 3a 20 70 2d  ->iOffset+1 : p-
1cc80 3e 69 4c 69 6d 69 74 2c 0a 20 20 20 20 20 20 20  >iLimit,.       
1cc90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cca0 20 20 20 20 20 20 20 20 20 20 20 72 65 67 4c 69             regLi
1ccb0 6d 69 74 41 29 3b 0a 20 20 20 20 73 71 6c 69 74  mitA);.    sqlit
1ccc0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
1ccd0 4f 50 5f 43 6f 70 79 2c 20 72 65 67 4c 69 6d 69  OP_Copy, regLimi
1cce0 74 41 2c 20 72 65 67 4c 69 6d 69 74 42 29 3b 0a  tA, regLimitB);.
1ccf0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 67    }else{.    reg
1cd00 4c 69 6d 69 74 41 20 3d 20 72 65 67 4c 69 6d 69  LimitA = regLimi
1cd10 74 42 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 73 71  tB = 0;.  }.  sq
1cd20 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
1cd30 64 62 2c 20 70 2d 3e 70 4c 69 6d 69 74 29 3b 0a  db, p->pLimit);.
1cd40 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b    p->pLimit = 0;
1cd50 0a 0a 20 20 72 65 67 41 64 64 72 41 20 3d 20 2b  ..  regAddrA = +
1cd60 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
1cd70 20 72 65 67 41 64 64 72 42 20 3d 20 2b 2b 70 50   regAddrB = ++pP
1cd80 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 72 65  arse->nMem;.  re
1cd90 67 4f 75 74 41 20 3d 20 2b 2b 70 50 61 72 73 65  gOutA = ++pParse
1cda0 2d 3e 6e 4d 65 6d 3b 0a 20 20 72 65 67 4f 75 74  ->nMem;.  regOut
1cdb0 42 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  B = ++pParse->nM
1cdc0 65 6d 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c  em;.  sqlite3Sel
1cdd0 65 63 74 44 65 73 74 49 6e 69 74 28 26 64 65 73  ectDestInit(&des
1cde0 74 41 2c 20 53 52 54 5f 43 6f 72 6f 75 74 69 6e  tA, SRT_Coroutin
1cdf0 65 2c 20 72 65 67 41 64 64 72 41 29 3b 0a 20 20  e, regAddrA);.  
1ce00 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 73  sqlite3SelectDes
1ce10 74 49 6e 69 74 28 26 64 65 73 74 42 2c 20 53 52  tInit(&destB, SR
1ce20 54 5f 43 6f 72 6f 75 74 69 6e 65 2c 20 72 65 67  T_Coroutine, reg
1ce30 41 64 64 72 42 29 3b 0a 0a 20 20 45 78 70 6c 61  AddrB);..  Expla
1ce40 69 6e 51 75 65 72 79 50 6c 61 6e 28 28 70 50 61  inQueryPlan((pPa
1ce50 72 73 65 2c 20 31 2c 20 22 4d 45 52 47 45 20 28  rse, 1, "MERGE (
1ce60 25 73 29 22 2c 20 73 65 6c 65 63 74 4f 70 4e 61  %s)", selectOpNa
1ce70 6d 65 28 70 2d 3e 6f 70 29 29 29 3b 0a 0a 20 20  me(p->op)));..  
1ce80 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20 63 6f  /* Generate a co
1ce90 72 6f 75 74 69 6e 65 20 74 6f 20 65 76 61 6c 75  routine to evalu
1cea0 61 74 65 20 74 68 65 20 53 45 4c 45 43 54 20 73  ate the SELECT s
1ceb0 74 61 74 65 6d 65 6e 74 20 74 6f 20 74 68 65 0a  tatement to the.
1cec0 20 20 2a 2a 20 6c 65 66 74 20 6f 66 20 74 68 65    ** left of the
1ced0 20 63 6f 6d 70 6f 75 6e 64 20 6f 70 65 72 61 74   compound operat
1cee0 6f 72 20 2d 20 74 68 65 20 22 41 22 20 73 65 6c  or - the "A" sel
1cef0 65 63 74 2e 0a 20 20 2a 2f 0a 20 20 61 64 64 72  ect..  */.  addr
1cf00 53 65 6c 65 63 74 41 20 3d 20 73 71 6c 69 74 65  SelectA = sqlite
1cf10 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
1cf20 28 76 29 20 2b 20 31 3b 0a 20 20 61 64 64 72 31  (v) + 1;.  addr1
1cf30 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
1cf40 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 69 74 43  dOp3(v, OP_InitC
1cf50 6f 72 6f 75 74 69 6e 65 2c 20 72 65 67 41 64 64  oroutine, regAdd
1cf60 72 41 2c 20 30 2c 20 61 64 64 72 53 65 6c 65 63  rA, 0, addrSelec
1cf70 74 41 29 3b 0a 20 20 56 64 62 65 43 6f 6d 6d 65  tA);.  VdbeComme
1cf80 6e 74 28 28 76 2c 20 22 6c 65 66 74 20 53 45 4c  nt((v, "left SEL
1cf90 45 43 54 22 29 29 3b 0a 20 20 70 50 72 69 6f 72  ECT"));.  pPrior
1cfa0 2d 3e 69 4c 69 6d 69 74 20 3d 20 72 65 67 4c 69  ->iLimit = regLi
1cfb0 6d 69 74 41 3b 0a 20 20 45 78 70 6c 61 69 6e 51  mitA;.  ExplainQ
1cfc0 75 65 72 79 50 6c 61 6e 28 28 70 50 61 72 73 65  ueryPlan((pParse
1cfd0 2c 20 31 2c 20 22 4c 45 46 54 22 29 29 3b 0a 20  , 1, "LEFT"));. 
1cfe0 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70   sqlite3Select(p
1cff0 50 61 72 73 65 2c 20 70 50 72 69 6f 72 2c 20 26  Parse, pPrior, &
1d000 64 65 73 74 41 29 3b 0a 20 20 73 71 6c 69 74 65  destA);.  sqlite
1d010 33 56 64 62 65 45 6e 64 43 6f 72 6f 75 74 69 6e  3VdbeEndCoroutin
1d020 65 28 76 2c 20 72 65 67 41 64 64 72 41 29 3b 0a  e(v, regAddrA);.
1d030 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
1d040 70 48 65 72 65 28 76 2c 20 61 64 64 72 31 29 3b  pHere(v, addr1);
1d050 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20  ..  /* Generate 
1d060 61 20 63 6f 72 6f 75 74 69 6e 65 20 74 6f 20 65  a coroutine to e
1d070 76 61 6c 75 61 74 65 20 74 68 65 20 53 45 4c 45  valuate the SELE
1d080 43 54 20 73 74 61 74 65 6d 65 6e 74 20 6f 6e 20  CT statement on 
1d090 0a 20 20 2a 2a 20 74 68 65 20 72 69 67 68 74 20  .  ** the right 
1d0a0 2d 20 74 68 65 20 22 42 22 20 73 65 6c 65 63 74  - the "B" select
1d0b0 0a 20 20 2a 2f 0a 20 20 61 64 64 72 53 65 6c 65  .  */.  addrSele
1d0c0 63 74 42 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ctB = sqlite3Vdb
1d0d0 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 20  eCurrentAddr(v) 
1d0e0 2b 20 31 3b 0a 20 20 61 64 64 72 31 20 3d 20 73  + 1;.  addr1 = s
1d0f0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
1d100 28 76 2c 20 4f 50 5f 49 6e 69 74 43 6f 72 6f 75  (v, OP_InitCorou
1d110 74 69 6e 65 2c 20 72 65 67 41 64 64 72 42 2c 20  tine, regAddrB, 
1d120 30 2c 20 61 64 64 72 53 65 6c 65 63 74 42 29 3b  0, addrSelectB);
1d130 0a 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28  .  VdbeComment((
1d140 76 2c 20 22 72 69 67 68 74 20 53 45 4c 45 43 54  v, "right SELECT
1d150 22 29 29 3b 0a 20 20 73 61 76 65 64 4c 69 6d 69  "));.  savedLimi
1d160 74 20 3d 20 70 2d 3e 69 4c 69 6d 69 74 3b 0a 20  t = p->iLimit;. 
1d170 20 73 61 76 65 64 4f 66 66 73 65 74 20 3d 20 70   savedOffset = p
1d180 2d 3e 69 4f 66 66 73 65 74 3b 0a 20 20 70 2d 3e  ->iOffset;.  p->
1d190 69 4c 69 6d 69 74 20 3d 20 72 65 67 4c 69 6d 69  iLimit = regLimi
1d1a0 74 42 3b 0a 20 20 70 2d 3e 69 4f 66 66 73 65 74  tB;.  p->iOffset
1d1b0 20 3d 20 30 3b 20 20 0a 20 20 45 78 70 6c 61 69   = 0;  .  Explai
1d1c0 6e 51 75 65 72 79 50 6c 61 6e 28 28 70 50 61 72  nQueryPlan((pPar
1d1d0 73 65 2c 20 31 2c 20 22 52 49 47 48 54 22 29 29  se, 1, "RIGHT"))
1d1e0 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63  ;.  sqlite3Selec
1d1f0 74 28 70 50 61 72 73 65 2c 20 70 2c 20 26 64 65  t(pParse, p, &de
1d200 73 74 42 29 3b 0a 20 20 70 2d 3e 69 4c 69 6d 69  stB);.  p->iLimi
1d210 74 20 3d 20 73 61 76 65 64 4c 69 6d 69 74 3b 0a  t = savedLimit;.
1d220 20 20 70 2d 3e 69 4f 66 66 73 65 74 20 3d 20 73    p->iOffset = s
1d230 61 76 65 64 4f 66 66 73 65 74 3b 0a 20 20 73 71  avedOffset;.  sq
1d240 6c 69 74 65 33 56 64 62 65 45 6e 64 43 6f 72 6f  lite3VdbeEndCoro
1d250 75 74 69 6e 65 28 76 2c 20 72 65 67 41 64 64 72  utine(v, regAddr
1d260 42 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61  B);..  /* Genera
1d270 74 65 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20  te a subroutine 
1d280 74 68 61 74 20 6f 75 74 70 75 74 73 20 74 68 65  that outputs the
1d290 20 63 75 72 72 65 6e 74 20 72 6f 77 20 6f 66 20   current row of 
1d2a0 74 68 65 20 41 0a 20 20 2a 2a 20 73 65 6c 65 63  the A.  ** selec
1d2b0 74 20 61 73 20 74 68 65 20 6e 65 78 74 20 6f 75  t as the next ou
1d2c0 74 70 75 74 20 72 6f 77 20 6f 66 20 74 68 65 20  tput row of the 
1d2d0 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 2e  compound select.
1d2e0 0a 20 20 2a 2f 0a 20 20 56 64 62 65 4e 6f 6f 70  .  */.  VdbeNoop
1d2f0 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4f 75 74  Comment((v, "Out
1d300 70 75 74 20 72 6f 75 74 69 6e 65 20 66 6f 72 20  put routine for 
1d310 41 22 29 29 3b 0a 20 20 61 64 64 72 4f 75 74 41  A"));.  addrOutA
1d320 20 3d 20 67 65 6e 65 72 61 74 65 4f 75 74 70 75   = generateOutpu
1d330 74 53 75 62 72 6f 75 74 69 6e 65 28 70 50 61 72  tSubroutine(pPar
1d340 73 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  se,.            
1d350 20 20 20 20 20 70 2c 20 26 64 65 73 74 41 2c 20       p, &destA, 
1d360 70 44 65 73 74 2c 20 72 65 67 4f 75 74 41 2c 0a  pDest, regOutA,.
1d370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d380 20 72 65 67 50 72 65 76 2c 20 70 4b 65 79 44 75   regPrev, pKeyDu
1d390 70 2c 20 6c 61 62 65 6c 45 6e 64 29 3b 0a 20 20  p, labelEnd);.  
1d3a0 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61  .  /* Generate a
1d3b0 20 73 75 62 72 6f 75 74 69 6e 65 20 74 68 61 74   subroutine that
1d3c0 20 6f 75 74 70 75 74 73 20 74 68 65 20 63 75 72   outputs the cur
1d3d0 72 65 6e 74 20 72 6f 77 20 6f 66 20 74 68 65 20  rent row of the 
1d3e0 42 0a 20 20 2a 2a 20 73 65 6c 65 63 74 20 61 73  B.  ** select as
1d3f0 20 74 68 65 20 6e 65 78 74 20 6f 75 74 70 75 74   the next output
1d400 20 72 6f 77 20 6f 66 20 74 68 65 20 63 6f 6d 70   row of the comp
1d410 6f 75 6e 64 20 73 65 6c 65 63 74 2e 0a 20 20 2a  ound select..  *
1d420 2f 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 41  /.  if( op==TK_A
1d430 4c 4c 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 55 4e 49  LL || op==TK_UNI
1d440 4f 4e 20 29 7b 0a 20 20 20 20 56 64 62 65 4e 6f  ON ){.    VdbeNo
1d450 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4f  opComment((v, "O
1d460 75 74 70 75 74 20 72 6f 75 74 69 6e 65 20 66 6f  utput routine fo
1d470 72 20 42 22 29 29 3b 0a 20 20 20 20 61 64 64 72  r B"));.    addr
1d480 4f 75 74 42 20 3d 20 67 65 6e 65 72 61 74 65 4f  OutB = generateO
1d490 75 74 70 75 74 53 75 62 72 6f 75 74 69 6e 65 28  utputSubroutine(
1d4a0 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20  pParse,.        
1d4b0 20 20 20 20 20 20 20 20 20 70 2c 20 26 64 65 73           p, &des
1d4c0 74 42 2c 20 70 44 65 73 74 2c 20 72 65 67 4f 75  tB, pDest, regOu
1d4d0 74 42 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  tB,.            
1d4e0 20 20 20 20 20 72 65 67 50 72 65 76 2c 20 70 4b       regPrev, pK
1d4f0 65 79 44 75 70 2c 20 6c 61 62 65 6c 45 6e 64 29  eyDup, labelEnd)
1d500 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 4b  ;.  }.  sqlite3K
1d510 65 79 49 6e 66 6f 55 6e 72 65 66 28 70 4b 65 79  eyInfoUnref(pKey
1d520 44 75 70 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65  Dup);..  /* Gene
1d530 72 61 74 65 20 61 20 73 75 62 72 6f 75 74 69 6e  rate a subroutin
1d540 65 20 74 6f 20 72 75 6e 20 77 68 65 6e 20 74 68  e to run when th
1d550 65 20 72 65 73 75 6c 74 73 20 66 72 6f 6d 20 73  e results from s
1d560 65 6c 65 63 74 20 41 0a 20 20 2a 2a 20 61 72 65  elect A.  ** are
1d570 20 65 78 68 61 75 73 74 65 64 20 61 6e 64 20 6f   exhausted and o
1d580 6e 6c 79 20 64 61 74 61 20 69 6e 20 73 65 6c 65  nly data in sele
1d590 63 74 20 42 20 72 65 6d 61 69 6e 73 2e 0a 20 20  ct B remains..  
1d5a0 2a 2f 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f  */.  if( op==TK_
1d5b0 45 58 43 45 50 54 20 7c 7c 20 6f 70 3d 3d 54 4b  EXCEPT || op==TK
1d5c0 5f 49 4e 54 45 52 53 45 43 54 20 29 7b 0a 20 20  _INTERSECT ){.  
1d5d0 20 20 61 64 64 72 45 6f 66 41 5f 6e 6f 42 20 3d    addrEofA_noB =
1d5e0 20 61 64 64 72 45 6f 66 41 20 3d 20 6c 61 62 65   addrEofA = labe
1d5f0 6c 45 6e 64 3b 0a 20 20 7d 65 6c 73 65 7b 20 20  lEnd;.  }else{  
1d600 0a 20 20 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d  .    VdbeNoopCom
1d610 6d 65 6e 74 28 28 76 2c 20 22 65 6f 66 2d 41 20  ment((v, "eof-A 
1d620 73 75 62 72 6f 75 74 69 6e 65 22 29 29 3b 0a 20  subroutine"));. 
1d630 20 20 20 61 64 64 72 45 6f 66 41 20 3d 20 73 71     addrEofA = sq
1d640 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
1d650 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67  v, OP_Gosub, reg
1d660 4f 75 74 42 2c 20 61 64 64 72 4f 75 74 42 29 3b  OutB, addrOutB);
1d670 0a 20 20 20 20 61 64 64 72 45 6f 66 41 5f 6e 6f  .    addrEofA_no
1d680 42 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  B = sqlite3VdbeA
1d690 64 64 4f 70 32 28 76 2c 20 4f 50 5f 59 69 65 6c  ddOp2(v, OP_Yiel
1d6a0 64 2c 20 72 65 67 41 64 64 72 42 2c 20 6c 61 62  d, regAddrB, lab
1d6b0 65 6c 45 6e 64 29 3b 0a 20 20 20 20 20 20 20 20  elEnd);.        
1d6c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d6d0 20 20 20 20 20 20 20 20 20 20 20 20 20 56 64 62               Vdb
1d6e0 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
1d6f0 20 20 73 71 6c 69 74 65 33 56 64 62 65 47 6f 74    sqlite3VdbeGot
1d700 6f 28 76 2c 20 61 64 64 72 45 6f 66 41 29 3b 0a  o(v, addrEofA);.
1d710 20 20 20 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f      p->nSelectRo
1d720 77 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73  w = sqlite3LogEs
1d730 74 41 64 64 28 70 2d 3e 6e 53 65 6c 65 63 74 52  tAdd(p->nSelectR
1d740 6f 77 2c 20 70 50 72 69 6f 72 2d 3e 6e 53 65 6c  ow, pPrior->nSel
1d750 65 63 74 52 6f 77 29 3b 0a 20 20 7d 0a 0a 20 20  ectRow);.  }..  
1d760 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20 73 75  /* Generate a su
1d770 62 72 6f 75 74 69 6e 65 20 74 6f 20 72 75 6e 20  broutine to run 
1d780 77 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74 73  when the results
1d790 20 66 72 6f 6d 20 73 65 6c 65 63 74 20 42 0a 20   from select B. 
1d7a0 20 2a 2a 20 61 72 65 20 65 78 68 61 75 73 74 65   ** are exhauste
1d7b0 64 20 61 6e 64 20 6f 6e 6c 79 20 64 61 74 61 20  d and only data 
1d7c0 69 6e 20 73 65 6c 65 63 74 20 41 20 72 65 6d 61  in select A rema
1d7d0 69 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ins..  */.  if( 
1d7e0 6f 70 3d 3d 54 4b 5f 49 4e 54 45 52 53 45 43 54  op==TK_INTERSECT
1d7f0 20 29 7b 0a 20 20 20 20 61 64 64 72 45 6f 66 42   ){.    addrEofB
1d800 20 3d 20 61 64 64 72 45 6f 66 41 3b 0a 20 20 20   = addrEofA;.   
1d810 20 69 66 28 20 70 2d 3e 6e 53 65 6c 65 63 74 52   if( p->nSelectR
1d820 6f 77 20 3e 20 70 50 72 69 6f 72 2d 3e 6e 53 65  ow > pPrior->nSe
1d830 6c 65 63 74 52 6f 77 20 29 20 70 2d 3e 6e 53 65  lectRow ) p->nSe
1d840 6c 65 63 74 52 6f 77 20 3d 20 70 50 72 69 6f 72  lectRow = pPrior
1d850 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 3b 0a 20 20  ->nSelectRow;.  
1d860 7d 65 6c 73 65 7b 20 20 0a 20 20 20 20 56 64 62  }else{  .    Vdb
1d870 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c  eNoopComment((v,
1d880 20 22 65 6f 66 2d 42 20 73 75 62 72 6f 75 74 69   "eof-B subrouti
1d890 6e 65 22 29 29 3b 0a 20 20 20 20 61 64 64 72 45  ne"));.    addrE
1d8a0 6f 66 42 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ofB = sqlite3Vdb
1d8b0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f  eAddOp2(v, OP_Go
1d8c0 73 75 62 2c 20 72 65 67 4f 75 74 41 2c 20 61 64  sub, regOutA, ad
1d8d0 64 72 4f 75 74 41 29 3b 0a 20 20 20 20 73 71 6c  drOutA);.    sql
1d8e0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
1d8f0 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67 41  , OP_Yield, regA
1d900 64 64 72 41 2c 20 6c 61 62 65 6c 45 6e 64 29 3b  ddrA, labelEnd);
1d910 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
1d920 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
1d930 65 47 6f 74 6f 28 76 2c 20 61 64 64 72 45 6f 66  eGoto(v, addrEof
1d940 42 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65  B);.  }..  /* Ge
1d950 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 68  nerate code to h
1d960 61 6e 64 6c 65 20 74 68 65 20 63 61 73 65 20 6f  andle the case o
1d970 66 20 41 3c 42 0a 20 20 2a 2f 0a 20 20 56 64 62  f A<B.  */.  Vdb
1d980 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c  eNoopComment((v,
1d990 20 22 41 2d 6c 74 2d 42 20 73 75 62 72 6f 75 74   "A-lt-B subrout
1d9a0 69 6e 65 22 29 29 3b 0a 20 20 61 64 64 72 41 6c  ine"));.  addrAl
1d9b0 74 42 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  tB = sqlite3Vdbe
1d9c0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73  AddOp2(v, OP_Gos
1d9d0 75 62 2c 20 72 65 67 4f 75 74 41 2c 20 61 64 64  ub, regOutA, add
1d9e0 72 4f 75 74 41 29 3b 0a 20 20 73 71 6c 69 74 65  rOutA);.  sqlite
1d9f0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
1da00 50 5f 59 69 65 6c 64 2c 20 72 65 67 41 64 64 72  P_Yield, regAddr
1da10 41 2c 20 61 64 64 72 45 6f 66 41 29 3b 20 56 64  A, addrEofA); Vd
1da20 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
1da30 20 73 71 6c 69 74 65 33 56 64 62 65 47 6f 74 6f   sqlite3VdbeGoto
1da40 28 76 2c 20 6c 61 62 65 6c 43 6d 70 72 29 3b 0a  (v, labelCmpr);.
1da50 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63  .  /* Generate c
1da60 6f 64 65 20 74 6f 20 68 61 6e 64 6c 65 20 74 68  ode to handle th
1da70 65 20 63 61 73 65 20 6f 66 20 41 3d 3d 42 0a 20  e case of A==B. 
1da80 20 2a 2f 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b   */.  if( op==TK
1da90 5f 41 4c 4c 20 29 7b 0a 20 20 20 20 61 64 64 72  _ALL ){.    addr
1daa0 41 65 71 42 20 3d 20 61 64 64 72 41 6c 74 42 3b  AeqB = addrAltB;
1dab0 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 70 3d  .  }else if( op=
1dac0 3d 54 4b 5f 49 4e 54 45 52 53 45 43 54 20 29 7b  =TK_INTERSECT ){
1dad0 0a 20 20 20 20 61 64 64 72 41 65 71 42 20 3d 20  .    addrAeqB = 
1dae0 61 64 64 72 41 6c 74 42 3b 0a 20 20 20 20 61 64  addrAltB;.    ad
1daf0 64 72 41 6c 74 42 2b 2b 3b 0a 20 20 7d 65 6c 73  drAltB++;.  }els
1db00 65 7b 0a 20 20 20 20 56 64 62 65 4e 6f 6f 70 43  e{.    VdbeNoopC
1db10 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 41 2d 65 71  omment((v, "A-eq
1db20 2d 42 20 73 75 62 72 6f 75 74 69 6e 65 22 29 29  -B subroutine"))
1db30 3b 0a 20 20 20 20 61 64 64 72 41 65 71 42 20 3d  ;.    addrAeqB =
1db40 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
1db50 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 59 69 65  AddOp2(v, OP_Yie
1db60 6c 64 2c 20 72 65 67 41 64 64 72 41 2c 20 61 64  ld, regAddrA, ad
1db70 64 72 45 6f 66 41 29 3b 20 56 64 62 65 43 6f 76  drEofA); VdbeCov
1db80 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 73 71  erage(v);.    sq
1db90 6c 69 74 65 33 56 64 62 65 47 6f 74 6f 28 76 2c  lite3VdbeGoto(v,
1dba0 20 6c 61 62 65 6c 43 6d 70 72 29 3b 0a 20 20 7d   labelCmpr);.  }
1dbb0 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20  ..  /* Generate 
1dbc0 63 6f 64 65 20 74 6f 20 68 61 6e 64 6c 65 20 74  code to handle t
1dbd0 68 65 20 63 61 73 65 20 6f 66 20 41 3e 42 0a 20  he case of A>B. 
1dbe0 20 2a 2f 0a 20 20 56 64 62 65 4e 6f 6f 70 43 6f   */.  VdbeNoopCo
1dbf0 6d 6d 65 6e 74 28 28 76 2c 20 22 41 2d 67 74 2d  mment((v, "A-gt-
1dc00 42 20 73 75 62 72 6f 75 74 69 6e 65 22 29 29 3b  B subroutine"));
1dc10 0a 20 20 61 64 64 72 41 67 74 42 20 3d 20 73 71  .  addrAgtB = sq
1dc20 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
1dc30 41 64 64 72 28 76 29 3b 0a 20 20 69 66 28 20 6f  Addr(v);.  if( o
1dc40 70 3d 3d 54 4b 5f 41 4c 4c 20 7c 7c 20 6f 70 3d  p==TK_ALL || op=
1dc50 3d 54 4b 5f 55 4e 49 4f 4e 20 29 7b 0a 20 20 20  =TK_UNION ){.   
1dc60 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1dc70 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20  p2(v, OP_Gosub, 
1dc80 72 65 67 4f 75 74 42 2c 20 61 64 64 72 4f 75 74  regOutB, addrOut
1dc90 42 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  B);.  }.  sqlite
1dca0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
1dcb0 50 5f 59 69 65 6c 64 2c 20 72 65 67 41 64 64 72  P_Yield, regAddr
1dcc0 42 2c 20 61 64 64 72 45 6f 66 42 29 3b 20 56 64  B, addrEofB); Vd
1dcd0 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
1dce0 20 73 71 6c 69 74 65 33 56 64 62 65 47 6f 74 6f   sqlite3VdbeGoto
1dcf0 28 76 2c 20 6c 61 62 65 6c 43 6d 70 72 29 3b 0a  (v, labelCmpr);.
1dd00 0a 20 20 2f 2a 20 54 68 69 73 20 63 6f 64 65 20  .  /* This code 
1dd10 72 75 6e 73 20 6f 6e 63 65 20 74 6f 20 69 6e 69  runs once to ini
1dd20 74 69 61 6c 69 7a 65 20 65 76 65 72 79 74 68 69  tialize everythi
1dd30 6e 67 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  ng..  */.  sqlit
1dd40 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
1dd50 2c 20 61 64 64 72 31 29 3b 0a 20 20 73 71 6c 69  , addr1);.  sqli
1dd60 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
1dd70 20 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67 41 64   OP_Yield, regAd
1dd80 64 72 41 2c 20 61 64 64 72 45 6f 66 41 5f 6e 6f  drA, addrEofA_no
1dd90 42 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  B); VdbeCoverage
1dda0 28 76 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  (v);.  sqlite3Vd
1ddb0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 59  beAddOp2(v, OP_Y
1ddc0 69 65 6c 64 2c 20 72 65 67 41 64 64 72 42 2c 20  ield, regAddrB, 
1ddd0 61 64 64 72 45 6f 66 42 29 3b 20 56 64 62 65 43  addrEofB); VdbeC
1dde0 6f 76 65 72 61 67 65 28 76 29 3b 0a 0a 20 20 2f  overage(v);..  /
1ddf0 2a 20 49 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20  * Implement the 
1de00 6d 61 69 6e 20 6d 65 72 67 65 20 6c 6f 6f 70 0a  main merge loop.
1de10 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64    */.  sqlite3Vd
1de20 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
1de30 2c 20 6c 61 62 65 6c 43 6d 70 72 29 3b 0a 20 20  , labelCmpr);.  
1de40 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1de50 34 28 76 2c 20 4f 50 5f 50 65 72 6d 75 74 61 74  4(v, OP_Permutat
1de60 69 6f 6e 2c 20 30 2c 20 30 2c 20 30 2c 20 28 63  ion, 0, 0, 0, (c
1de70 68 61 72 2a 29 61 50 65 72 6d 75 74 65 2c 20 50  har*)aPermute, P
1de80 34 5f 49 4e 54 41 52 52 41 59 29 3b 0a 20 20 73  4_INTARRAY);.  s
1de90 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
1dea0 28 76 2c 20 4f 50 5f 43 6f 6d 70 61 72 65 2c 20  (v, OP_Compare, 
1deb0 64 65 73 74 41 2e 69 53 64 73 74 2c 20 64 65 73  destA.iSdst, des
1dec0 74 42 2e 69 53 64 73 74 2c 20 6e 4f 72 64 65 72  tB.iSdst, nOrder
1ded0 42 79 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  By,.            
1dee0 20 20 20 20 20 20 20 20 20 20 20 20 20 28 63 68               (ch
1def0 61 72 2a 29 70 4b 65 79 4d 65 72 67 65 2c 20 50  ar*)pKeyMerge, P
1df00 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 73 71  4_KEYINFO);.  sq
1df10 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
1df20 35 28 76 2c 20 4f 50 46 4c 41 47 5f 50 45 52 4d  5(v, OPFLAG_PERM
1df30 55 54 45 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  UTE);.  sqlite3V
1df40 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
1df50 4a 75 6d 70 2c 20 61 64 64 72 41 6c 74 42 2c 20  Jump, addrAltB, 
1df60 61 64 64 72 41 65 71 42 2c 20 61 64 64 72 41 67  addrAeqB, addrAg
1df70 74 42 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  tB); VdbeCoverag
1df80 65 28 76 29 3b 0a 0a 20 20 2f 2a 20 4a 75 6d 70  e(v);..  /* Jump
1df90 20 74 6f 20 74 68 65 20 74 68 69 73 20 70 6f 69   to the this poi
1dfa0 6e 74 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 74  nt in order to t
1dfb0 65 72 6d 69 6e 61 74 65 20 74 68 65 20 71 75 65  erminate the que
1dfc0 72 79 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  ry..  */.  sqlit
1dfd0 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
1dfe0 65 6c 28 76 2c 20 6c 61 62 65 6c 45 6e 64 29 3b  el(v, labelEnd);
1dff0 0a 0a 20 20 2f 2a 20 52 65 61 73 73 65 6d 62 6c  ..  /* Reassembl
1e000 79 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 71  y the compound q
1e010 75 65 72 79 20 73 6f 20 74 68 61 74 20 69 74 20  uery so that it 
1e020 77 69 6c 6c 20 62 65 20 66 72 65 65 64 20 63 6f  will be freed co
1e030 72 72 65 63 74 6c 79 0a 20 20 2a 2a 20 62 79 20  rrectly.  ** by 
1e040 74 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63  the calling func
1e050 74 69 6f 6e 20 2a 2f 0a 20 20 69 66 28 20 70 2d  tion */.  if( p-
1e060 3e 70 50 72 69 6f 72 20 29 7b 0a 20 20 20 20 73  >pPrior ){.    s
1e070 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65  qlite3SelectDele
1e080 74 65 28 64 62 2c 20 70 2d 3e 70 50 72 69 6f 72  te(db, p->pPrior
1e090 29 3b 0a 20 20 7d 0a 20 20 70 2d 3e 70 50 72 69  );.  }.  p->pPri
1e0a0 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20 70  or = pPrior;.  p
1e0b0 50 72 69 6f 72 2d 3e 70 4e 65 78 74 20 3d 20 70  Prior->pNext = p
1e0c0 3b 0a 0a 20 20 2f 2a 2a 2a 20 54 42 44 3a 20 20  ;..  /*** TBD:  
1e0d0 49 6e 73 65 72 74 20 73 75 62 72 6f 75 74 69 6e  Insert subroutin
1e0e0 65 20 63 61 6c 6c 73 20 74 6f 20 63 6c 6f 73 65  e calls to close
1e0f0 20 63 75 72 73 6f 72 73 20 6f 6e 20 69 6e 63 6f   cursors on inco
1e100 6d 70 6c 65 74 65 0a 20 20 2a 2a 2a 2a 20 73 75  mplete.  **** su
1e110 62 71 75 65 72 69 65 73 20 2a 2a 2a 2a 2f 0a 20  bqueries ****/. 
1e120 20 45 78 70 6c 61 69 6e 51 75 65 72 79 50 6c 61   ExplainQueryPla
1e130 6e 50 6f 70 28 70 50 61 72 73 65 29 3b 0a 20 20  nPop(pParse);.  
1e140 72 65 74 75 72 6e 20 70 50 61 72 73 65 2d 3e 6e  return pParse->n
1e150 45 72 72 21 3d 30 3b 0a 7d 0a 23 65 6e 64 69 66  Err!=0;.}.#endif
1e160 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  ..#if !defined(S
1e170 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
1e180 45 52 59 29 20 7c 7c 20 21 64 65 66 69 6e 65 64  ERY) || !defined
1e190 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45  (SQLITE_OMIT_VIE
1e1a0 57 29 0a 0a 2f 2a 20 41 6e 20 69 6e 73 74 61 6e  W)../* An instan
1e1b0 63 65 20 6f 66 20 74 68 65 20 53 75 62 73 74 43  ce of the SubstC
1e1c0 6f 6e 74 65 78 74 20 6f 62 6a 65 63 74 20 64 65  ontext object de
1e1d0 73 63 72 69 62 65 73 20 61 6e 20 73 75 62 73 74  scribes an subst
1e1e0 69 74 75 74 69 6f 6e 20 65 64 69 74 0a 2a 2a 20  itution edit.** 
1e1f0 74 6f 20 62 65 20 70 65 72 66 6f 72 6d 65 64 20  to be performed 
1e200 6f 6e 20 61 20 70 61 72 73 65 20 74 72 65 65 2e  on a parse tree.
1e210 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 72 65 66 65 72  .**.** All refer
1e220 65 6e 63 65 73 20 74 6f 20 63 6f 6c 75 6d 6e 73  ences to columns
1e230 20 69 6e 20 74 61 62 6c 65 20 69 54 61 62 6c 65   in table iTable
1e240 20 61 72 65 20 74 6f 20 62 65 20 72 65 70 6c 61   are to be repla
1e250 63 65 64 20 62 79 20 63 6f 72 72 65 73 70 6f 6e  ced by correspon
1e260 64 69 6e 67 0a 2a 2a 20 65 78 70 72 65 73 73 69  ding.** expressi
1e270 6f 6e 73 20 69 6e 20 70 45 4c 69 73 74 2e 0a 2a  ons in pEList..*
1e280 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  /.typedef struct
1e290 20 53 75 62 73 74 43 6f 6e 74 65 78 74 20 7b 0a   SubstContext {.
1e2a0 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 3b    Parse *pParse;
1e2b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1e2c0 68 65 20 70 61 72 73 69 6e 67 20 63 6f 6e 74 65  he parsing conte
1e2d0 78 74 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62  xt */.  int iTab
1e2e0 6c 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  le;             
1e2f0 20 20 2f 2a 20 52 65 70 6c 61 63 65 20 72 65 66    /* Replace ref
1e300 65 72 65 6e 63 65 73 20 74 6f 20 74 68 69 73 20  erences to this 
1e310 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69  table */.  int i
1e320 4e 65 77 54 61 62 6c 65 3b 20 20 20 20 20 20 20  NewTable;       
1e330 20 20 20 20 20 2f 2a 20 4e 65 77 20 74 61 62 6c       /* New tabl
1e340 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 69 6e  e number */.  in
1e350 74 20 69 73 4c 65 66 74 4a 6f 69 6e 3b 20 20 20  t isLeftJoin;   
1e360 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20 54          /* Add T
1e370 4b 5f 49 46 5f 4e 55 4c 4c 5f 52 4f 57 20 6f 70  K_IF_NULL_ROW op
1e380 63 6f 64 65 73 20 6f 6e 20 65 61 63 68 20 72 65  codes on each re
1e390 70 6c 61 63 65 6d 65 6e 74 20 2a 2f 0a 20 20 45  placement */.  E
1e3a0 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b  xprList *pEList;
1e3b0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 70 6c           /* Repl
1e3c0 61 63 65 6d 65 6e 74 20 65 78 70 72 65 73 73 69  acement expressi
1e3d0 6f 6e 73 20 2a 2f 0a 7d 20 53 75 62 73 74 43 6f  ons */.} SubstCo
1e3e0 6e 74 65 78 74 3b 0a 0a 2f 2a 20 46 6f 72 77 61  ntext;../* Forwa
1e3f0 72 64 20 44 65 63 6c 61 72 61 74 69 6f 6e 73 20  rd Declarations 
1e400 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  */.static void s
1e410 75 62 73 74 45 78 70 72 4c 69 73 74 28 53 75 62  ubstExprList(Sub
1e420 73 74 43 6f 6e 74 65 78 74 2a 2c 20 45 78 70 72  stContext*, Expr
1e430 4c 69 73 74 2a 29 3b 0a 73 74 61 74 69 63 20 76  List*);.static v
1e440 6f 69 64 20 73 75 62 73 74 53 65 6c 65 63 74 28  oid substSelect(
1e450 53 75 62 73 74 43 6f 6e 74 65 78 74 2a 2c 20 53  SubstContext*, S
1e460 65 6c 65 63 74 2a 2c 20 69 6e 74 29 3b 0a 0a 2f  elect*, int);../
1e470 2a 0a 2a 2a 20 53 63 61 6e 20 74 68 72 6f 75 67  *.** Scan throug
1e480 68 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  h the expression
1e490 20 70 45 78 70 72 2e 20 20 52 65 70 6c 61 63 65   pExpr.  Replace
1e4a0 20 65 76 65 72 79 20 72 65 66 65 72 65 6e 63 65   every reference
1e4b0 20 74 6f 0a 2a 2a 20 61 20 63 6f 6c 75 6d 6e 20   to.** a column 
1e4c0 69 6e 20 74 61 62 6c 65 20 6e 75 6d 62 65 72 20  in table number 
1e4d0 69 54 61 62 6c 65 20 77 69 74 68 20 61 20 63 6f  iTable with a co
1e4e0 70 79 20 6f 66 20 74 68 65 20 69 43 6f 6c 75 6d  py of the iColum
1e4f0 6e 2d 74 68 0a 2a 2a 20 65 6e 74 72 79 20 69 6e  n-th.** entry in
1e500 20 70 45 4c 69 73 74 2e 20 20 28 42 75 74 20 6c   pEList.  (But l
1e510 65 61 76 65 20 72 65 66 65 72 65 6e 63 65 73 20  eave references 
1e520 74 6f 20 74 68 65 20 52 4f 57 49 44 20 63 6f 6c  to the ROWID col
1e530 75 6d 6e 20 0a 2a 2a 20 75 6e 63 68 61 6e 67 65  umn .** unchange
1e540 64 2e 29 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  d.).**.** This r
1e550 6f 75 74 69 6e 65 20 69 73 20 70 61 72 74 20 6f  outine is part o
1e560 66 20 74 68 65 20 66 6c 61 74 74 65 6e 69 6e 67  f the flattening
1e570 20 70 72 6f 63 65 64 75 72 65 2e 20 20 41 20 73   procedure.  A s
1e580 75 62 71 75 65 72 79 0a 2a 2a 20 77 68 6f 73 65  ubquery.** whose
1e590 20 72 65 73 75 6c 74 20 73 65 74 20 69 73 20 64   result set is d
1e5a0 65 66 69 6e 65 64 20 62 79 20 70 45 4c 69 73 74  efined by pEList
1e5b0 20 61 70 70 65 61 72 73 20 61 73 20 65 6e 74 72   appears as entr
1e5c0 79 20 69 6e 20 74 68 65 0a 2a 2a 20 46 52 4f 4d  y in the.** FROM
1e5d0 20 63 6c 61 75 73 65 20 6f 66 20 61 20 53 45 4c   clause of a SEL
1e5e0 45 43 54 20 73 75 63 68 20 74 68 61 74 20 74 68  ECT such that th
1e5f0 65 20 56 44 42 45 20 63 75 72 73 6f 72 20 61 73  e VDBE cursor as
1e600 73 69 67 6e 65 64 20 74 6f 20 74 68 61 74 0a 2a  signed to that.*
1e610 2a 20 46 4f 52 4d 20 63 6c 61 75 73 65 20 65 6e  * FORM clause en
1e620 74 72 79 20 69 73 20 69 54 61 62 6c 65 2e 20 20  try is iTable.  
1e630 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 61 6b  This routine mak
1e640 65 73 20 74 68 65 20 6e 65 63 65 73 73 61 72 79  es the necessary
1e650 20 0a 2a 2a 20 63 68 61 6e 67 65 73 20 74 6f 20   .** changes to 
1e660 70 45 78 70 72 20 73 6f 20 74 68 61 74 20 69 74  pExpr so that it
1e670 20 72 65 66 65 72 73 20 64 69 72 65 63 74 6c 79   refers directly
1e680 20 74 6f 20 74 68 65 20 73 6f 75 72 63 65 20 74   to the source t
1e690 61 62 6c 65 0a 2a 2a 20 6f 66 20 74 68 65 20 73  able.** of the s
1e6a0 75 62 71 75 65 72 79 20 72 61 74 68 65 72 20 74  ubquery rather t
1e6b0 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66  he result set of
1e6c0 20 74 68 65 20 73 75 62 71 75 65 72 79 2e 0a 2a   the subquery..*
1e6d0 2f 0a 73 74 61 74 69 63 20 45 78 70 72 20 2a 73  /.static Expr *s
1e6e0 75 62 73 74 45 78 70 72 28 0a 20 20 53 75 62 73  ubstExpr(.  Subs
1e6f0 74 43 6f 6e 74 65 78 74 20 2a 70 53 75 62 73 74  tContext *pSubst
1e700 2c 20 20 2f 2a 20 44 65 73 63 72 69 70 74 69 6f  ,  /* Descriptio
1e710 6e 20 6f 66 20 74 68 65 20 73 75 62 73 74 69 74  n of the substit
1e720 75 74 69 6f 6e 20 2a 2f 0a 20 20 45 78 70 72 20  ution */.  Expr 
1e730 2a 70 45 78 70 72 20 20 20 20 20 20 20 20 20 20  *pExpr          
1e740 20 20 2f 2a 20 45 78 70 72 20 69 6e 20 77 68 69    /* Expr in whi
1e750 63 68 20 73 75 62 73 74 69 74 75 74 69 6f 6e 20  ch substitution 
1e760 6f 63 63 75 72 73 20 2a 2f 0a 29 7b 0a 20 20 69  occurs */.){.  i
1e770 66 28 20 70 45 78 70 72 3d 3d 30 20 29 20 72 65  f( pExpr==0 ) re
1e780 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 45 78  turn 0;.  if( Ex
1e790 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
1e7a0 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e  xpr, EP_FromJoin
1e7b0 29 0a 20 20 20 26 26 20 70 45 78 70 72 2d 3e 69  ).   && pExpr->i
1e7c0 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 3d 3d  RightJoinTable==
1e7d0 70 53 75 62 73 74 2d 3e 69 54 61 62 6c 65 0a 20  pSubst->iTable. 
1e7e0 20 29 7b 0a 20 20 20 20 70 45 78 70 72 2d 3e 69   ){.    pExpr->i
1e7f0 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 20 3d  RightJoinTable =
1e800 20 70 53 75 62 73 74 2d 3e 69 4e 65 77 54 61 62   pSubst->iNewTab
1e810 6c 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 45  le;.  }.  if( pE
1e820 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55  xpr->op==TK_COLU
1e830 4d 4e 20 26 26 20 70 45 78 70 72 2d 3e 69 54 61  MN && pExpr->iTa
1e840 62 6c 65 3d 3d 70 53 75 62 73 74 2d 3e 69 54 61  ble==pSubst->iTa
1e850 62 6c 65 20 29 7b 0a 20 20 20 20 69 66 28 20 70  ble ){.    if( p
1e860 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 20  Expr->iColumn<0 
1e870 29 7b 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e  ){.      pExpr->
1e880 6f 70 20 3d 20 54 4b 5f 4e 55 4c 4c 3b 0a 20 20  op = TK_NULL;.  
1e890 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 45    }else{.      E
1e8a0 78 70 72 20 2a 70 4e 65 77 3b 0a 20 20 20 20 20  xpr *pNew;.     
1e8b0 20 45 78 70 72 20 2a 70 43 6f 70 79 20 3d 20 70   Expr *pCopy = p
1e8c0 53 75 62 73 74 2d 3e 70 45 4c 69 73 74 2d 3e 61  Subst->pEList->a
1e8d0 5b 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 5d  [pExpr->iColumn]
1e8e0 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 45 78  .pExpr;.      Ex
1e8f0 70 72 20 69 66 4e 75 6c 6c 52 6f 77 3b 0a 20 20  pr ifNullRow;.  
1e900 20 20 20 20 61 73 73 65 72 74 28 20 70 53 75 62      assert( pSub
1e910 73 74 2d 3e 70 45 4c 69 73 74 21 3d 30 20 26 26  st->pEList!=0 &&
1e920 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c   pExpr->iColumn<
1e930 70 53 75 62 73 74 2d 3e 70 45 4c 69 73 74 2d 3e  pSubst->pEList->
1e940 6e 45 78 70 72 20 29 3b 0a 20 20 20 20 20 20 61  nExpr );.      a
1e950 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 70 52  ssert( pExpr->pR
1e960 69 67 68 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20  ight==0 );.     
1e970 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72   if( sqlite3Expr
1e980 49 73 56 65 63 74 6f 72 28 70 43 6f 70 79 29 20  IsVector(pCopy) 
1e990 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
1e9a0 65 33 56 65 63 74 6f 72 45 72 72 6f 72 4d 73 67  e3VectorErrorMsg
1e9b0 28 70 53 75 62 73 74 2d 3e 70 50 61 72 73 65 2c  (pSubst->pParse,
1e9c0 20 70 43 6f 70 79 29 3b 0a 20 20 20 20 20 20 7d   pCopy);.      }
1e9d0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
1e9e0 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 53 75 62  lite3 *db = pSub
1e9f0 73 74 2d 3e 70 50 61 72 73 65 2d 3e 64 62 3b 0a  st->pParse->db;.
1ea00 20 20 20 20 20 20 20 20 69 66 28 20 70 53 75 62          if( pSub
1ea10 73 74 2d 3e 69 73 4c 65 66 74 4a 6f 69 6e 20 26  st->isLeftJoin &
1ea20 26 20 70 43 6f 70 79 2d 3e 6f 70 21 3d 54 4b 5f  & pCopy->op!=TK_
1ea30 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 20 20  COLUMN ){.      
1ea40 20 20 20 20 6d 65 6d 73 65 74 28 26 69 66 4e 75      memset(&ifNu
1ea50 6c 6c 52 6f 77 2c 20 30 2c 20 73 69 7a 65 6f 66  llRow, 0, sizeof
1ea60 28 69 66 4e 75 6c 6c 52 6f 77 29 29 3b 0a 20 20  (ifNullRow));.  
1ea70 20 20 20 20 20 20 20 20 69 66 4e 75 6c 6c 52 6f          ifNullRo
1ea80 77 2e 6f 70 20 3d 20 54 4b 5f 49 46 5f 4e 55 4c  w.op = TK_IF_NUL
1ea90 4c 5f 52 4f 57 3b 0a 20 20 20 20 20 20 20 20 20  L_ROW;.         
1eaa0 20 69 66 4e 75 6c 6c 52 6f 77 2e 70 4c 65 66 74   ifNullRow.pLeft
1eab0 20 3d 20 70 43 6f 70 79 3b 0a 20 20 20 20 20 20   = pCopy;.      
1eac0 20 20 20 20 69 66 4e 75 6c 6c 52 6f 77 2e 69 54      ifNullRow.iT
1ead0 61 62 6c 65 20 3d 20 70 53 75 62 73 74 2d 3e 69  able = pSubst->i
1eae0 4e 65 77 54 61 62 6c 65 3b 0a 20 20 20 20 20 20  NewTable;.      
1eaf0 20 20 20 20 70 43 6f 70 79 20 3d 20 26 69 66 4e      pCopy = &ifN
1eb00 75 6c 6c 52 6f 77 3b 0a 20 20 20 20 20 20 20 20  ullRow;.        
1eb10 7d 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  }.        testca
1eb20 73 65 28 20 45 78 70 72 48 61 73 50 72 6f 70 65  se( ExprHasPrope
1eb30 72 74 79 28 70 43 6f 70 79 2c 20 45 50 5f 53 75  rty(pCopy, EP_Su
1eb40 62 71 75 65 72 79 29 20 29 3b 0a 20 20 20 20 20  bquery) );.     
1eb50 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65     pNew = sqlite
1eb60 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 43 6f  3ExprDup(db, pCo
1eb70 70 79 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  py, 0);.        
1eb80 69 66 28 20 70 4e 65 77 20 26 26 20 70 53 75 62  if( pNew && pSub
1eb90 73 74 2d 3e 69 73 4c 65 66 74 4a 6f 69 6e 20 29  st->isLeftJoin )
1eba0 7b 0a 20 20 20 20 20 20 20 20 20 20 45 78 70 72  {.          Expr
1ebb0 53 65 74 50 72 6f 70 65 72 74 79 28 70 4e 65 77  SetProperty(pNew
1ebc0 2c 20 45 50 5f 43 61 6e 42 65 4e 75 6c 6c 29 3b  , EP_CanBeNull);
1ebd0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1ebe0 20 20 20 69 66 28 20 70 4e 65 77 20 26 26 20 45     if( pNew && E
1ebf0 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
1ec00 45 78 70 72 2c 45 50 5f 46 72 6f 6d 4a 6f 69 6e  Expr,EP_FromJoin
1ec10 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  ) ){.          p
1ec20 4e 65 77 2d 3e 69 52 69 67 68 74 4a 6f 69 6e 54  New->iRightJoinT
1ec30 61 62 6c 65 20 3d 20 70 45 78 70 72 2d 3e 69 52  able = pExpr->iR
1ec40 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 3b 0a 20  ightJoinTable;. 
1ec50 20 20 20 20 20 20 20 20 20 45 78 70 72 53 65 74           ExprSet
1ec60 50 72 6f 70 65 72 74 79 28 70 4e 65 77 2c 20 45  Property(pNew, E
1ec70 50 5f 46 72 6f 6d 4a 6f 69 6e 29 3b 0a 20 20 20  P_FromJoin);.   
1ec80 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73       }.        s
1ec90 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
1eca0 28 64 62 2c 20 70 45 78 70 72 29 3b 0a 20 20 20  (db, pExpr);.   
1ecb0 20 20 20 20 20 70 45 78 70 72 20 3d 20 70 4e 65       pExpr = pNe
1ecc0 77 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  w;.      }.    }
1ecd0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66  .  }else{.    if
1ece0 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ( pExpr->op==TK_
1ecf0 49 46 5f 4e 55 4c 4c 5f 52 4f 57 20 26 26 20 70  IF_NULL_ROW && p
1ed00 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 70 53  Expr->iTable==pS
1ed10 75 62 73 74 2d 3e 69 54 61 62 6c 65 20 29 7b 0a  ubst->iTable ){.
1ed20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 54 61        pExpr->iTa
1ed30 62 6c 65 20 3d 20 70 53 75 62 73 74 2d 3e 69 4e  ble = pSubst->iN
1ed40 65 77 54 61 62 6c 65 3b 0a 20 20 20 20 7d 0a 20  ewTable;.    }. 
1ed50 20 20 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 20     pExpr->pLeft 
1ed60 3d 20 73 75 62 73 74 45 78 70 72 28 70 53 75 62  = substExpr(pSub
1ed70 73 74 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  st, pExpr->pLeft
1ed80 29 3b 0a 20 20 20 20 70 45 78 70 72 2d 3e 70 52  );.    pExpr->pR
1ed90 69 67 68 74 20 3d 20 73 75 62 73 74 45 78 70 72  ight = substExpr
1eda0 28 70 53 75 62 73 74 2c 20 70 45 78 70 72 2d 3e  (pSubst, pExpr->
1edb0 70 52 69 67 68 74 29 3b 0a 20 20 20 20 69 66 28  pRight);.    if(
1edc0 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79   ExprHasProperty
1edd0 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65  (pExpr, EP_xIsSe
1ede0 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 20 20 73  lect) ){.      s
1edf0 75 62 73 74 53 65 6c 65 63 74 28 70 53 75 62 73  ubstSelect(pSubs
1ee00 74 2c 20 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c  t, pExpr->x.pSel
1ee10 65 63 74 2c 20 31 29 3b 0a 20 20 20 20 7d 65 6c  ect, 1);.    }el
1ee20 73 65 7b 0a 20 20 20 20 20 20 73 75 62 73 74 45  se{.      substE
1ee30 78 70 72 4c 69 73 74 28 70 53 75 62 73 74 2c 20  xprList(pSubst, 
1ee40 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 29 3b  pExpr->x.pList);
1ee50 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
1ee60 75 72 6e 20 70 45 78 70 72 3b 0a 7d 0a 73 74 61  urn pExpr;.}.sta
1ee70 74 69 63 20 76 6f 69 64 20 73 75 62 73 74 45 78  tic void substEx
1ee80 70 72 4c 69 73 74 28 0a 20 20 53 75 62 73 74 43  prList(.  SubstC
1ee90 6f 6e 74 65 78 74 20 2a 70 53 75 62 73 74 2c 20  ontext *pSubst, 
1eea0 2f 2a 20 44 65 73 63 72 69 70 74 69 6f 6e 20 6f  /* Description o
1eeb0 66 20 74 68 65 20 73 75 62 73 74 69 74 75 74 69  f the substituti
1eec0 6f 6e 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  on */.  ExprList
1eed0 20 2a 70 4c 69 73 74 20 20 20 20 20 20 20 2f 2a   *pList       /*
1eee0 20 4c 69 73 74 20 74 6f 20 73 63 61 6e 20 61 6e   List to scan an
1eef0 64 20 69 6e 20 77 68 69 63 68 20 74 6f 20 6d 61  d in which to ma
1ef00 6b 65 20 73 75 62 73 74 69 74 75 74 65 73 20 2a  ke substitutes *
1ef10 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  /.){.  int i;.  
1ef20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72  if( pList==0 ) r
1ef30 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30  eturn;.  for(i=0
1ef40 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72  ; i<pList->nExpr
1ef50 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 70 4c 69 73  ; i++){.    pLis
1ef60 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 20 3d 20  t->a[i].pExpr = 
1ef70 73 75 62 73 74 45 78 70 72 28 70 53 75 62 73 74  substExpr(pSubst
1ef80 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45  , pList->a[i].pE
1ef90 78 70 72 29 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74  xpr);.  }.}.stat
1efa0 69 63 20 76 6f 69 64 20 73 75 62 73 74 53 65 6c  ic void substSel
1efb0 65 63 74 28 0a 20 20 53 75 62 73 74 43 6f 6e 74  ect(.  SubstCont
1efc0 65 78 74 20 2a 70 53 75 62 73 74 2c 20 2f 2a 20  ext *pSubst, /* 
1efd0 44 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 74  Description of t
1efe0 68 65 20 73 75 62 73 74 69 74 75 74 69 6f 6e 20  he substitution 
1eff0 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20  */.  Select *p, 
1f000 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 45             /* SE
1f010 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 69  LECT statement i
1f020 6e 20 77 68 69 63 68 20 74 6f 20 6d 61 6b 65 20  n which to make 
1f030 73 75 62 73 74 69 74 75 74 69 6f 6e 73 20 2a 2f  substitutions */
1f040 0a 20 20 69 6e 74 20 64 6f 50 72 69 6f 72 20 20  .  int doPrior  
1f050 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 73           /* Do s
1f060 75 62 73 74 69 74 75 74 65 73 20 6f 6e 20 70 2d  ubstitutes on p-
1f070 3e 70 50 72 69 6f 72 20 74 6f 6f 20 2a 2f 0a 29  >pPrior too */.)
1f080 7b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72  {.  SrcList *pSr
1f090 63 3b 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c  c;.  struct SrcL
1f0a0 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b  ist_item *pItem;
1f0b0 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20  .  int i;.  if( 
1f0c0 21 70 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 64  !p ) return;.  d
1f0d0 6f 7b 0a 20 20 20 20 73 75 62 73 74 45 78 70 72  o{.    substExpr
1f0e0 4c 69 73 74 28 70 53 75 62 73 74 2c 20 70 2d 3e  List(pSubst, p->
1f0f0 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 73 75 62  pEList);.    sub
1f100 73 74 45 78 70 72 4c 69 73 74 28 70 53 75 62 73  stExprList(pSubs
1f110 74 2c 20 70 2d 3e 70 47 72 6f 75 70 42 79 29 3b  t, p->pGroupBy);
1f120 0a 20 20 20 20 73 75 62 73 74 45 78 70 72 4c 69  .    substExprLi
1f130 73 74 28 70 53 75 62 73 74 2c 20 70 2d 3e 70 4f  st(pSubst, p->pO
1f140 72 64 65 72 42 79 29 3b 0a 20 20 20 20 70 2d 3e  rderBy);.    p->
1f150 70 48 61 76 69 6e 67 20 3d 20 73 75 62 73 74 45  pHaving = substE
1f160 78 70 72 28 70 53 75 62 73 74 2c 20 70 2d 3e 70  xpr(pSubst, p->p
1f170 48 61 76 69 6e 67 29 3b 0a 20 20 20 20 70 2d 3e  Having);.    p->
1f180 70 57 68 65 72 65 20 3d 20 73 75 62 73 74 45 78  pWhere = substEx
1f190 70 72 28 70 53 75 62 73 74 2c 20 70 2d 3e 70 57  pr(pSubst, p->pW
1f1a0 68 65 72 65 29 3b 0a 20 20 20 20 70 53 72 63 20  here);.    pSrc 
1f1b0 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 20 20 61  = p->pSrc;.    a
1f1c0 73 73 65 72 74 28 20 70 53 72 63 21 3d 30 20 29  ssert( pSrc!=0 )
1f1d0 3b 0a 20 20 20 20 66 6f 72 28 69 3d 70 53 72 63  ;.    for(i=pSrc
1f1e0 2d 3e 6e 53 72 63 2c 20 70 49 74 65 6d 3d 70 53  ->nSrc, pItem=pS
1f1f0 72 63 2d 3e 61 3b 20 69 3e 30 3b 20 69 2d 2d 2c  rc->a; i>0; i--,
1f200 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20   pItem++){.     
1f210 20 73 75 62 73 74 53 65 6c 65 63 74 28 70 53 75   substSelect(pSu
1f220 62 73 74 2c 20 70 49 74 65 6d 2d 3e 70 53 65 6c  bst, pItem->pSel
1f230 65 63 74 2c 20 31 29 3b 0a 20 20 20 20 20 20 69  ect, 1);.      i
1f240 66 28 20 70 49 74 65 6d 2d 3e 66 67 2e 69 73 54  f( pItem->fg.isT
1f250 61 62 46 75 6e 63 20 29 7b 0a 20 20 20 20 20 20  abFunc ){.      
1f260 20 20 73 75 62 73 74 45 78 70 72 4c 69 73 74 28    substExprList(
1f270 70 53 75 62 73 74 2c 20 70 49 74 65 6d 2d 3e 75  pSubst, pItem->u
1f280 31 2e 70 46 75 6e 63 41 72 67 29 3b 0a 20 20 20  1.pFuncArg);.   
1f290 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 77 68     }.    }.  }wh
1f2a0 69 6c 65 28 20 64 6f 50 72 69 6f 72 20 26 26 20  ile( doPrior && 
1f2b0 28 70 20 3d 20 70 2d 3e 70 50 72 69 6f 72 29 21  (p = p->pPrior)!
1f2c0 3d 30 20 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  =0 );.}.#endif /
1f2d0 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  * !defined(SQLIT
1f2e0 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29  E_OMIT_SUBQUERY)
1f2f0 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c   || !defined(SQL
1f300 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20 2a  ITE_OMIT_VIEW) *
1f310 2f 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  /..#if !defined(
1f320 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
1f330 55 45 52 59 29 20 7c 7c 20 21 64 65 66 69 6e 65  UERY) || !define
1f340 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  d(SQLITE_OMIT_VI
1f350 45 57 29 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  EW)./*.** This r
1f360 6f 75 74 69 6e 65 20 61 74 74 65 6d 70 74 73 20  outine attempts 
1f370 74 6f 20 66 6c 61 74 74 65 6e 20 73 75 62 71 75  to flatten subqu
1f380 65 72 69 65 73 20 61 73 20 61 20 70 65 72 66 6f  eries as a perfo
1f390 72 6d 61 6e 63 65 20 6f 70 74 69 6d 69 7a 61 74  rmance optimizat
1f3a0 69 6f 6e 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ion..** This rou
1f3b0 74 69 6e 65 20 72 65 74 75 72 6e 73 20 31 20 69  tine returns 1 i
1f3c0 66 20 69 74 20 6d 61 6b 65 73 20 63 68 61 6e 67  f it makes chang
1f3d0 65 73 20 61 6e 64 20 30 20 69 66 20 6e 6f 20 66  es and 0 if no f
1f3e0 6c 61 74 74 65 6e 69 6e 67 20 6f 63 63 75 72 73  lattening occurs
1f3f0 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 75 6e 64 65 72  ..**.** To under
1f400 73 74 61 6e 64 20 74 68 65 20 63 6f 6e 63 65 70  stand the concep
1f410 74 20 6f 66 20 66 6c 61 74 74 65 6e 69 6e 67 2c  t of flattening,
1f420 20 63 6f 6e 73 69 64 65 72 20 74 68 65 20 66 6f   consider the fo
1f430 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 71 75 65 72 79  llowing.** query
1f440 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45  :.**.**     SELE
1f450 43 54 20 61 20 46 52 4f 4d 20 28 53 45 4c 45 43  CT a FROM (SELEC
1f460 54 20 78 2b 79 20 41 53 20 61 20 46 52 4f 4d 20  T x+y AS a FROM 
1f470 74 31 20 57 48 45 52 45 20 7a 3c 31 30 30 29 20  t1 WHERE z<100) 
1f480 57 48 45 52 45 20 61 3e 35 0a 2a 2a 0a 2a 2a 20  WHERE a>5.**.** 
1f490 54 68 65 20 64 65 66 61 75 6c 74 20 77 61 79 20  The default way 
1f4a0 6f 66 20 69 6d 70 6c 65 6d 65 6e 74 69 6e 67 20  of implementing 
1f4b0 74 68 69 73 20 71 75 65 72 79 20 69 73 20 74 6f  this query is to
1f4c0 20 65 78 65 63 75 74 65 20 74 68 65 0a 2a 2a 20   execute the.** 
1f4d0 73 75 62 71 75 65 72 79 20 66 69 72 73 74 20 61  subquery first a
1f4e0 6e 64 20 73 74 6f 72 65 20 74 68 65 20 72 65 73  nd store the res
1f4f0 75 6c 74 73 20 69 6e 20 61 20 74 65 6d 70 6f 72  ults in a tempor
1f500 61 72 79 20 74 61 62 6c 65 2c 20 74 68 65 6e 0a  ary table, then.
1f510 2a 2a 20 72 75 6e 20 74 68 65 20 6f 75 74 65 72  ** run the outer
1f520 20 71 75 65 72 79 20 6f 6e 20 74 68 61 74 20 74   query on that t
1f530 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 2e 20  emporary table. 
1f540 20 54 68 69 73 20 72 65 71 75 69 72 65 73 20 74   This requires t
1f550 77 6f 0a 2a 2a 20 70 61 73 73 65 73 20 6f 76 65  wo.** passes ove
1f560 72 20 74 68 65 20 64 61 74 61 2e 20 20 46 75 72  r the data.  Fur
1f570 74 68 65 72 6d 6f 72 65 2c 20 62 65 63 61 75 73  thermore, becaus
1f580 65 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20  e the temporary 
1f590 74 61 62 6c 65 0a 2a 2a 20 68 61 73 20 6e 6f 20  table.** has no 
1f5a0 69 6e 64 69 63 65 73 2c 20 74 68 65 20 57 48 45  indices, the WHE
1f5b0 52 45 20 63 6c 61 75 73 65 20 6f 6e 20 74 68 65  RE clause on the
1f5c0 20 6f 75 74 65 72 20 71 75 65 72 79 20 63 61 6e   outer query can
1f5d0 6e 6f 74 20 62 65 0a 2a 2a 20 6f 70 74 69 6d 69  not be.** optimi
1f5e0 7a 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  zed..**.** This 
1f5f0 72 6f 75 74 69 6e 65 20 61 74 74 65 6d 70 74 73  routine attempts
1f600 20 74 6f 20 72 65 77 72 69 74 65 20 71 75 65 72   to rewrite quer
1f610 69 65 73 20 73 75 63 68 20 61 73 20 74 68 65 20  ies such as the 
1f620 61 62 6f 76 65 20 69 6e 74 6f 0a 2a 2a 20 61 20  above into.** a 
1f630 73 69 6e 67 6c 65 20 66 6c 61 74 20 73 65 6c 65  single flat sele
1f640 63 74 2c 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a  ct, like this:.*
1f650 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20  *.**     SELECT 
1f660 78 2b 79 20 41 53 20 61 20 46 52 4f 4d 20 74 31  x+y AS a FROM t1
1f670 20 57 48 45 52 45 20 7a 3c 31 30 30 20 41 4e 44   WHERE z<100 AND
1f680 20 61 3e 35 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63   a>5.**.** The c
1f690 6f 64 65 20 67 65 6e 65 72 61 74 65 64 20 66 6f  ode generated fo
1f6a0 72 20 74 68 69 73 20 73 69 6d 70 6c 69 66 69 63  r this simplific
1f6b0 61 74 69 6f 6e 20 67 69 76 65 73 20 74 68 65 20  ation gives the 
1f6c0 73 61 6d 65 20 72 65 73 75 6c 74 0a 2a 2a 20 62  same result.** b
1f6d0 75 74 20 6f 6e 6c 79 20 68 61 73 20 74 6f 20 73  ut only has to s
1f6e0 63 61 6e 20 74 68 65 20 64 61 74 61 20 6f 6e 63  can the data onc
1f6f0 65 2e 20 20 41 6e 64 20 62 65 63 61 75 73 65 20  e.  And because 
1f700 69 6e 64 69 63 65 73 20 6d 69 67 68 74 20 0a 2a  indices might .*
1f710 2a 20 65 78 69 73 74 20 6f 6e 20 74 68 65 20 74  * exist on the t
1f720 61 62 6c 65 20 74 31 2c 20 61 20 63 6f 6d 70 6c  able t1, a compl
1f730 65 74 65 20 73 63 61 6e 20 6f 66 20 74 68 65 20  ete scan of the 
1f740 64 61 74 61 20 6d 69 67 68 74 20 62 65 0a 2a 2a  data might be.**
1f750 20 61 76 6f 69 64 65 64 2e 0a 2a 2a 0a 2a 2a 20   avoided..**.** 
1f760 46 6c 61 74 74 65 6e 69 6e 67 20 69 73 20 73 75  Flattening is su
1f770 62 6a 65 63 74 20 74 6f 20 74 68 65 20 66 6f 6c  bject to the fol
1f780 6c 6f 77 69 6e 67 20 63 6f 6e 73 74 72 61 69 6e  lowing constrain
1f790 74 73 3a 0a 2a 2a 0a 2a 2a 20 20 28 2a 2a 29 20  ts:.**.**  (**) 
1f7a0 20 57 65 20 6e 6f 20 6c 6f 6e 67 65 72 20 61 74   We no longer at
1f7b0 74 65 6d 70 74 20 74 6f 20 66 6c 61 74 74 65 6e  tempt to flatten
1f7c0 20 61 67 67 72 65 67 61 74 65 20 73 75 62 71 75   aggregate subqu
1f7d0 65 72 69 65 73 2e 20 57 61 73 3a 0a 2a 2a 20 20  eries. Was:.**  
1f7e0 20 20 20 20 20 20 54 68 65 20 73 75 62 71 75 65        The subque
1f7f0 72 79 20 61 6e 64 20 74 68 65 20 6f 75 74 65 72  ry and the outer
1f800 20 71 75 65 72 79 20 63 61 6e 6e 6f 74 20 62 6f   query cannot bo
1f810 74 68 20 62 65 20 61 67 67 72 65 67 61 74 65 73  th be aggregates
1f820 2e 0a 2a 2a 0a 2a 2a 20 20 28 2a 2a 29 20 20 57  ..**.**  (**)  W
1f830 65 20 6e 6f 20 6c 6f 6e 67 65 72 20 61 74 74 65  e no longer atte
1f840 6d 70 74 20 74 6f 20 66 6c 61 74 74 65 6e 20 61  mpt to flatten a
1f850 67 67 72 65 67 61 74 65 20 73 75 62 71 75 65 72  ggregate subquer
1f860 69 65 73 2e 20 57 61 73 3a 0a 2a 2a 20 20 20 20  ies. Was:.**    
1f870 20 20 20 20 28 32 29 20 49 66 20 74 68 65 20 73      (2) If the s
1f880 75 62 71 75 65 72 79 20 69 73 20 61 6e 20 61 67  ubquery is an ag
1f890 67 72 65 67 61 74 65 20 74 68 65 6e 0a 2a 2a 20  gregate then.** 
1f8a0 20 20 20 20 20 20 20 28 32 61 29 20 74 68 65 20         (2a) the 
1f8b0 6f 75 74 65 72 20 71 75 65 72 79 20 6d 75 73 74  outer query must
1f8c0 20 6e 6f 74 20 62 65 20 61 20 6a 6f 69 6e 20 61   not be a join a
1f8d0 6e 64 0a 2a 2a 20 20 20 20 20 20 20 20 28 32 62  nd.**        (2b
1f8e0 29 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  ) the outer quer
1f8f0 79 20 6d 75 73 74 20 6e 6f 74 20 75 73 65 20 73  y must not use s
1f900 75 62 71 75 65 72 69 65 73 0a 2a 2a 20 20 20 20  ubqueries.**    
1f910 20 20 20 20 20 20 20 20 20 6f 74 68 65 72 20 74           other t
1f920 68 61 6e 20 74 68 65 20 6f 6e 65 20 46 52 4f 4d  han the one FROM
1f930 2d 63 6c 61 75 73 65 20 73 75 62 71 75 65 72 79  -clause subquery
1f940 20 74 68 61 74 20 69 73 20 61 20 63 61 6e 64 69   that is a candi
1f950 64 61 74 65 0a 2a 2a 20 20 20 20 20 20 20 20 20  date.**         
1f960 20 20 20 20 66 6f 72 20 66 6c 61 74 74 65 6e 69      for flatteni
1f970 6e 67 2e 20 20 28 54 68 69 73 20 69 73 20 64 75  ng.  (This is du
1f980 65 20 74 6f 20 74 69 63 6b 65 74 20 5b 32 66 37  e to ticket [2f7
1f990 31 37 30 64 37 33 62 66 39 61 62 66 38 30 5d 0a  170d73bf9abf80].
1f9a0 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 66  **             f
1f9b0 72 6f 6d 20 32 30 31 35 2d 30 32 2d 30 39 2e 29  rom 2015-02-09.)
1f9c0 0a 2a 2a 0a 2a 2a 20 20 20 28 33 29 20 20 49 66  .**.**   (3)  If
1f9d0 20 74 68 65 20 73 75 62 71 75 65 72 79 20 69 73   the subquery is
1f9e0 20 74 68 65 20 72 69 67 68 74 20 6f 70 65 72 61   the right opera
1f9f0 6e 64 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49  nd of a LEFT JOI
1fa00 4e 20 74 68 65 6e 0a 2a 2a 20 20 20 20 20 20 20  N then.**       
1fa10 20 28 33 61 29 20 74 68 65 20 73 75 62 71 75 65   (3a) the subque
1fa20 72 79 20 6d 61 79 20 6e 6f 74 20 62 65 20 61 20  ry may not be a 
1fa30 6a 6f 69 6e 20 61 6e 64 0a 2a 2a 20 20 20 20 20  join and.**     
1fa40 20 20 20 28 33 62 29 20 74 68 65 20 46 52 4f 4d     (3b) the FROM
1fa50 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 73   clause of the s
1fa60 75 62 71 75 65 72 79 20 6d 61 79 20 6e 6f 74 20  ubquery may not 
1fa70 63 6f 6e 74 61 69 6e 20 61 20 76 69 72 74 75 61  contain a virtua
1fa80 6c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  l.**            
1fa90 20 74 61 62 6c 65 20 61 6e 64 0a 2a 2a 20 20 20   table and.**   
1faa0 20 20 20 20 20 28 33 63 29 20 74 68 65 20 6f 75       (3c) the ou
1fab0 74 65 72 20 71 75 65 72 79 20 6d 61 79 20 6e 6f  ter query may no
1fac0 74 20 62 65 20 61 6e 20 61 67 67 72 65 67 61 74  t be an aggregat
1fad0 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 34 29 20 20  e..**.**   (4)  
1fae0 54 68 65 20 73 75 62 71 75 65 72 79 20 63 61 6e  The subquery can
1faf0 20 6e 6f 74 20 62 65 20 44 49 53 54 49 4e 43 54   not be DISTINCT
1fb00 2e 0a 2a 2a 0a 2a 2a 20 20 28 2a 2a 29 20 20 41  ..**.**  (**)  A
1fb10 74 20 6f 6e 65 20 70 6f 69 6e 74 20 72 65 73 74  t one point rest
1fb20 72 69 63 74 69 6f 6e 73 20 28 34 29 20 61 6e 64  rictions (4) and
1fb30 20 28 35 29 20 64 65 66 69 6e 65 64 20 61 20 73   (5) defined a s
1fb40 75 62 73 65 74 20 6f 66 20 44 49 53 54 49 4e 43  ubset of DISTINC
1fb50 54 0a 2a 2a 20 20 20 20 20 20 20 20 73 75 62 2d  T.**        sub-
1fb60 71 75 65 72 69 65 73 20 74 68 61 74 20 77 65 72  queries that wer
1fb70 65 20 65 78 63 6c 75 64 65 64 20 66 72 6f 6d 20  e excluded from 
1fb80 74 68 69 73 20 6f 70 74 69 6d 69 7a 61 74 69 6f  this optimizatio
1fb90 6e 2e 20 52 65 73 74 72 69 63 74 69 6f 6e 20 0a  n. Restriction .
1fba0 2a 2a 20 20 20 20 20 20 20 20 28 34 29 20 68 61  **        (4) ha
1fbb0 73 20 73 69 6e 63 65 20 62 65 65 6e 20 65 78 70  s since been exp
1fbc0 61 6e 64 65 64 20 74 6f 20 65 78 63 6c 75 64 65  anded to exclude
1fbd0 20 61 6c 6c 20 44 49 53 54 49 4e 43 54 20 73 75   all DISTINCT su
1fbe0 62 71 75 65 72 69 65 73 2e 0a 2a 2a 0a 2a 2a 20  bqueries..**.** 
1fbf0 20 28 2a 2a 29 20 20 57 65 20 6e 6f 20 6c 6f 6e   (**)  We no lon
1fc00 67 65 72 20 61 74 74 65 6d 70 74 20 74 6f 20 66  ger attempt to f
1fc10 6c 61 74 74 65 6e 20 61 67 67 72 65 67 61 74 65  latten aggregate
1fc20 20 73 75 62 71 75 65 72 69 65 73 2e 20 20 57 61   subqueries.  Wa
1fc30 73 3a 0a 2a 2a 20 20 20 20 20 20 20 20 49 66 20  s:.**        If 
1fc40 74 68 65 20 73 75 62 71 75 65 72 79 20 69 73 20  the subquery is 
1fc50 61 67 67 72 65 67 61 74 65 2c 20 74 68 65 20 6f  aggregate, the o
1fc60 75 74 65 72 20 71 75 65 72 79 20 6d 61 79 20 6e  uter query may n
1fc70 6f 74 20 62 65 20 44 49 53 54 49 4e 43 54 2e 0a  ot be DISTINCT..
1fc80 2a 2a 0a 2a 2a 20 20 20 28 37 29 20 20 54 68 65  **.**   (7)  The
1fc90 20 73 75 62 71 75 65 72 79 20 6d 75 73 74 20 68   subquery must h
1fca0 61 76 65 20 61 20 46 52 4f 4d 20 63 6c 61 75 73  ave a FROM claus
1fcb0 65 2e 20 20 54 4f 44 4f 3a 20 20 46 6f 72 20 73  e.  TODO:  For s
1fcc0 75 62 71 75 65 72 69 65 73 20 77 69 74 68 6f 75  ubqueries withou
1fcd0 74 0a 2a 2a 20 20 20 20 20 20 20 20 41 20 46 52  t.**        A FR
1fce0 4f 4d 20 63 6c 61 75 73 65 2c 20 63 6f 6e 73 69  OM clause, consi
1fcf0 64 65 72 20 61 64 64 69 6e 67 20 61 20 46 52 4f  der adding a FRO
1fd00 4d 20 63 6c 61 75 73 65 20 77 69 74 68 20 74 68  M clause with th
1fd10 65 20 73 70 65 63 69 61 6c 0a 2a 2a 20 20 20 20  e special.**    
1fd20 20 20 20 20 74 61 62 6c 65 20 73 71 6c 69 74 65      table sqlite
1fd30 5f 6f 6e 63 65 20 74 68 61 74 20 63 6f 6e 73 69  _once that consi
1fd40 73 74 73 20 6f 66 20 61 20 73 69 6e 67 6c 65 20  sts of a single 
1fd50 72 6f 77 20 63 6f 6e 74 61 69 6e 69 6e 67 20 61  row containing a
1fd60 0a 2a 2a 20 20 20 20 20 20 20 20 73 69 6e 67 6c  .**        singl
1fd70 65 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 20 20  e NULL..**.**   
1fd80 28 38 29 20 20 49 66 20 74 68 65 20 73 75 62 71  (8)  If the subq
1fd90 75 65 72 79 20 75 73 65 73 20 4c 49 4d 49 54 20  uery uses LIMIT 
1fda0 74 68 65 6e 20 74 68 65 20 6f 75 74 65 72 20 71  then the outer q
1fdb0 75 65 72 79 20 6d 61 79 20 6e 6f 74 20 62 65 20  uery may not be 
1fdc0 61 20 6a 6f 69 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20  a join..**.**   
1fdd0 28 39 29 20 20 49 66 20 74 68 65 20 73 75 62 71  (9)  If the subq
1fde0 75 65 72 79 20 75 73 65 73 20 4c 49 4d 49 54 20  uery uses LIMIT 
1fdf0 74 68 65 6e 20 74 68 65 20 6f 75 74 65 72 20 71  then the outer q
1fe00 75 65 72 79 20 6d 61 79 20 6e 6f 74 20 62 65 20  uery may not be 
1fe10 61 67 67 72 65 67 61 74 65 2e 0a 2a 2a 0a 2a 2a  aggregate..**.**
1fe20 20 20 28 2a 2a 29 20 20 52 65 73 74 72 69 63 74    (**)  Restrict
1fe30 69 6f 6e 20 28 31 30 29 20 77 61 73 20 72 65 6d  ion (10) was rem
1fe40 6f 76 65 64 20 66 72 6f 6d 20 74 68 65 20 63 6f  oved from the co
1fe50 64 65 20 6f 6e 20 32 30 30 35 2d 30 32 2d 30 35  de on 2005-02-05
1fe60 20 62 75 74 20 77 65 0a 2a 2a 20 20 20 20 20 20   but we.**      
1fe70 20 20 61 63 63 69 64 65 6e 74 6c 79 20 63 61 72    accidently car
1fe80 72 69 65 64 20 74 68 65 20 63 6f 6d 6d 65 6e 74  ried the comment
1fe90 20 66 6f 72 77 61 72 64 20 75 6e 74 69 6c 20 32   forward until 2
1fea0 30 31 34 2d 30 39 2d 31 35 2e 20 20 4f 72 69 67  014-09-15.  Orig
1feb0 69 6e 61 6c 0a 2a 2a 20 20 20 20 20 20 20 20 63  inal.**        c
1fec0 6f 6e 73 74 72 61 69 6e 74 3a 20 22 49 66 20 74  onstraint: "If t
1fed0 68 65 20 73 75 62 71 75 65 72 79 20 69 73 20 61  he subquery is a
1fee0 67 67 72 65 67 61 74 65 20 74 68 65 6e 20 74 68  ggregate then th
1fef0 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 0a 2a  e outer query .*
1ff00 2a 20 20 20 20 20 20 20 20 6d 61 79 20 6e 6f 74  *        may not
1ff10 20 75 73 65 20 4c 49 4d 49 54 2e 22 0a 2a 2a 0a   use LIMIT.".**.
1ff20 2a 2a 20 20 28 31 31 29 20 20 54 68 65 20 73 75  **  (11)  The su
1ff30 62 71 75 65 72 79 20 61 6e 64 20 74 68 65 20 6f  bquery and the o
1ff40 75 74 65 72 20 71 75 65 72 79 20 6d 61 79 20 6e  uter query may n
1ff50 6f 74 20 62 6f 74 68 20 68 61 76 65 20 4f 52 44  ot both have ORD
1ff60 45 52 20 42 59 20 63 6c 61 75 73 65 73 2e 0a 2a  ER BY clauses..*
1ff70 2a 0a 2a 2a 20 20 28 2a 2a 29 20 20 4e 6f 74 20  *.**  (**)  Not 
1ff80 69 6d 70 6c 65 6d 65 6e 74 65 64 2e 20 20 53 75  implemented.  Su
1ff90 62 73 75 6d 65 64 20 69 6e 74 6f 20 72 65 73 74  bsumed into rest
1ffa0 72 69 63 74 69 6f 6e 20 28 33 29 2e 20 20 57 61  riction (3).  Wa
1ffb0 73 20 70 72 65 76 69 6f 75 73 6c 79 0a 2a 2a 20  s previously.** 
1ffc0 20 20 20 20 20 20 20 61 20 73 65 70 61 72 61 74         a separat
1ffd0 65 20 72 65 73 74 72 69 63 74 69 6f 6e 20 64 65  e restriction de
1ffe0 72 69 76 69 6e 67 20 66 72 6f 6d 20 74 69 63 6b  riving from tick
1fff0 65 74 20 23 33 35 30 2e 0a 2a 2a 0a 2a 2a 20 20  et #350..**.**  
20000 28 31 33 29 20 20 54 68 65 20 73 75 62 71 75 65  (13)  The subque
20010 72 79 20 61 6e 64 20 6f 75 74 65 72 20 71 75 65  ry and outer que
20020 72 79 20 6d 61 79 20 6e 6f 74 20 62 6f 74 68 20  ry may not both 
20030 75 73 65 20 4c 49 4d 49 54 2e 0a 2a 2a 0a 2a 2a  use LIMIT..**.**
20040 20 20 28 31 34 29 20 20 54 68 65 20 73 75 62 71    (14)  The subq
20050 75 65 72 79 20 6d 61 79 20 6e 6f 74 20 75 73 65  uery may not use
20060 20 4f 46 46 53 45 54 2e 0a 2a 2a 0a 2a 2a 20 20   OFFSET..**.**  
20070 28 31 35 29 20 20 49 66 20 74 68 65 20 6f 75 74  (15)  If the out
20080 65 72 20 71 75 65 72 79 20 69 73 20 70 61 72 74  er query is part
20090 20 6f 66 20 61 20 63 6f 6d 70 6f 75 6e 64 20 73   of a compound s
200a0 65 6c 65 63 74 2c 20 74 68 65 6e 20 74 68 65 0a  elect, then the.
200b0 2a 2a 20 20 20 20 20 20 20 20 73 75 62 71 75 65  **        subque
200c0 72 79 20 6d 61 79 20 6e 6f 74 20 75 73 65 20 4c  ry may not use L
200d0 49 4d 49 54 2e 0a 2a 2a 20 20 20 20 20 20 20 20  IMIT..**        
200e0 28 53 65 65 20 74 69 63 6b 65 74 20 23 32 33 33  (See ticket #233
200f0 39 20 61 6e 64 20 74 69 63 6b 65 74 20 5b 30 32  9 and ticket [02
20100 61 38 65 38 31 64 34 34 5d 29 2e 0a 2a 2a 0a 2a  a8e81d44])..**.*
20110 2a 20 20 28 31 36 29 20 20 49 66 20 74 68 65 20  *  (16)  If the 
20120 6f 75 74 65 72 20 71 75 65 72 79 20 69 73 20 61  outer query is a
20130 67 67 72 65 67 61 74 65 2c 20 74 68 65 6e 20 74  ggregate, then t
20140 68 65 20 73 75 62 71 75 65 72 79 20 6d 61 79 20  he subquery may 
20150 6e 6f 74 0a 2a 2a 20 20 20 20 20 20 20 20 75 73  not.**        us
20160 65 20 4f 52 44 45 52 20 42 59 2e 20 20 28 54 69  e ORDER BY.  (Ti
20170 63 6b 65 74 20 23 32 39 34 32 29 20 20 54 68 69  cket #2942)  Thi
20180 73 20 75 73 65 64 20 74 6f 20 6e 6f 74 20 6d 61  s used to not ma
20190 74 74 65 72 0a 2a 2a 20 20 20 20 20 20 20 20 75  tter.**        u
201a0 6e 74 69 6c 20 77 65 20 69 6e 74 72 6f 64 75 63  ntil we introduc
201b0 65 64 20 74 68 65 20 67 72 6f 75 70 5f 63 6f 6e  ed the group_con
201c0 63 61 74 28 29 20 66 75 6e 63 74 69 6f 6e 2e 20  cat() function. 
201d0 20 0a 2a 2a 0a 2a 2a 20 20 28 31 37 29 20 20 49   .**.**  (17)  I
201e0 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20 69  f the subquery i
201f0 73 20 61 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c  s a compound sel
20200 65 63 74 2c 20 74 68 65 6e 0a 2a 2a 20 20 20 20  ect, then.**    
20210 20 20 20 20 28 31 37 61 29 20 61 6c 6c 20 63 6f      (17a) all co
20220 6d 70 6f 75 6e 64 20 6f 70 65 72 61 74 6f 72 73  mpound operators
20230 20 6d 75 73 74 20 62 65 20 61 20 55 4e 49 4f 4e   must be a UNION
20240 20 41 4c 4c 2c 20 61 6e 64 0a 2a 2a 20 20 20 20   ALL, and.**    
20250 20 20 20 20 28 31 37 62 29 20 6e 6f 20 74 65 72      (17b) no ter
20260 6d 73 20 77 69 74 68 69 6e 20 74 68 65 20 73 75  ms within the su
20270 62 71 75 65 72 79 20 63 6f 6d 70 6f 75 6e 64 20  bquery compound 
20280 6d 61 79 20 62 65 20 61 67 67 72 65 67 61 74 65  may be aggregate
20290 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
202a0 20 6f 72 20 44 49 53 54 49 4e 43 54 2c 20 61 6e   or DISTINCT, an
202b0 64 0a 2a 2a 20 20 20 20 20 20 20 20 28 31 37 63  d.**        (17c
202c0 29 20 65 76 65 72 79 20 74 65 72 6d 20 77 69 74  ) every term wit
202d0 68 69 6e 20 74 68 65 20 73 75 62 71 75 65 72 79  hin the subquery
202e0 20 63 6f 6d 70 6f 75 6e 64 20 6d 75 73 74 20 68   compound must h
202f0 61 76 65 20 61 20 46 52 4f 4d 20 63 6c 61 75 73  ave a FROM claus
20300 65 0a 2a 2a 20 20 20 20 20 20 20 20 28 31 37 64  e.**        (17d
20310 29 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  ) the outer quer
20320 79 20 6d 61 79 20 6e 6f 74 20 62 65 0a 2a 2a 20  y may not be.** 
20330 20 20 20 20 20 20 20 20 20 20 20 20 20 28 31 37               (17
20340 64 31 29 20 61 67 67 72 65 67 61 74 65 2c 20 6f  d1) aggregate, o
20350 72 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  r.**            
20360 20 20 28 31 37 64 32 29 20 44 49 53 54 49 4e 43    (17d2) DISTINC
20370 54 2c 20 6f 72 0a 2a 2a 20 20 20 20 20 20 20 20  T, or.**        
20380 20 20 20 20 20 20 28 31 37 64 33 29 20 61 20 6a        (17d3) a j
20390 6f 69 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  oin..**.**      
203a0 20 20 54 68 65 20 70 61 72 65 6e 74 20 61 6e 64    The parent and
203b0 20 73 75 62 2d 71 75 65 72 79 20 6d 61 79 20 63   sub-query may c
203c0 6f 6e 74 61 69 6e 20 57 48 45 52 45 20 63 6c 61  ontain WHERE cla
203d0 75 73 65 73 2e 20 53 75 62 6a 65 63 74 20 74 6f  uses. Subject to
203e0 0a 2a 2a 20 20 20 20 20 20 20 20 72 75 6c 65 73  .**        rules
203f0 20 28 31 31 29 2c 20 28 31 33 29 20 61 6e 64 20   (11), (13) and 
20400 28 31 34 29 2c 20 74 68 65 79 20 6d 61 79 20 61  (14), they may a
20410 6c 73 6f 20 63 6f 6e 74 61 69 6e 20 4f 52 44 45  lso contain ORDE
20420 52 20 42 59 2c 0a 2a 2a 20 20 20 20 20 20 20 20  R BY,.**        
20430 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46 53 45 54  LIMIT and OFFSET
20440 20 63 6c 61 75 73 65 73 2e 20 20 54 68 65 20 73   clauses.  The s
20450 75 62 71 75 65 72 79 20 63 61 6e 6e 6f 74 20 75  ubquery cannot u
20460 73 65 20 61 6e 79 20 63 6f 6d 70 6f 75 6e 64 0a  se any compound.
20470 2a 2a 20 20 20 20 20 20 20 20 6f 70 65 72 61 74  **        operat
20480 6f 72 20 6f 74 68 65 72 20 74 68 61 6e 20 55 4e  or other than UN
20490 49 4f 4e 20 41 4c 4c 20 62 65 63 61 75 73 65 20  ION ALL because 
204a0 61 6c 6c 20 74 68 65 20 6f 74 68 65 72 20 63 6f  all the other co
204b0 6d 70 6f 75 6e 64 0a 2a 2a 20 20 20 20 20 20 20  mpound.**       
204c0 20 6f 70 65 72 61 74 6f 72 73 20 68 61 76 65 20   operators have 
204d0 61 6e 20 69 6d 70 6c 69 65 64 20 44 49 53 54 49  an implied DISTI
204e0 4e 43 54 20 77 68 69 63 68 20 69 73 20 64 69 73  NCT which is dis
204f0 61 6c 6c 6f 77 65 64 20 62 79 0a 2a 2a 20 20 20  allowed by.**   
20500 20 20 20 20 20 72 65 73 74 72 69 63 74 69 6f 6e       restriction
20510 20 28 34 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20   (4)..**.**     
20520 20 20 20 41 6c 73 6f 2c 20 65 61 63 68 20 63 6f     Also, each co
20530 6d 70 6f 6e 65 6e 74 20 6f 66 20 74 68 65 20 73  mponent of the s
20540 75 62 2d 71 75 65 72 79 20 6d 75 73 74 20 72 65  ub-query must re
20550 74 75 72 6e 20 74 68 65 20 73 61 6d 65 20 6e 75  turn the same nu
20560 6d 62 65 72 0a 2a 2a 20 20 20 20 20 20 20 20 6f  mber.**        o
20570 66 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73  f result columns
20580 2e 20 54 68 69 73 20 69 73 20 61 63 74 75 61 6c  . This is actual
20590 6c 79 20 61 20 72 65 71 75 69 72 65 6d 65 6e 74  ly a requirement
205a0 20 66 6f 72 20 61 6e 79 20 63 6f 6d 70 6f 75 6e   for any compoun
205b0 64 0a 2a 2a 20 20 20 20 20 20 20 20 53 45 4c 45  d.**        SELE
205c0 43 54 20 73 74 61 74 65 6d 65 6e 74 2c 20 62 75  CT statement, bu
205d0 74 20 61 6c 6c 20 74 68 65 20 63 6f 64 65 20 68  t all the code h
205e0 65 72 65 20 64 6f 65 73 20 69 73 20 6d 61 6b 65  ere does is make
205f0 20 73 75 72 65 20 74 68 61 74 20 6e 6f 0a 2a 2a   sure that no.**
20600 20 20 20 20 20 20 20 20 73 75 63 68 20 28 69 6c          such (il
20610 6c 65 67 61 6c 29 20 73 75 62 2d 71 75 65 72 79  legal) sub-query
20620 20 69 73 20 66 6c 61 74 74 65 6e 65 64 2e 20 54   is flattened. T
20630 68 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 64  he caller will d
20640 65 74 65 63 74 20 74 68 65 0a 2a 2a 20 20 20 20  etect the.**    
20650 20 20 20 20 73 79 6e 74 61 78 20 65 72 72 6f 72      syntax error
20660 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20 64 65   and return a de
20670 74 61 69 6c 65 64 20 6d 65 73 73 61 67 65 2e 0a  tailed message..
20680 2a 2a 0a 2a 2a 20 20 28 31 38 29 20 20 49 66 20  **.**  (18)  If 
20690 74 68 65 20 73 75 62 2d 71 75 65 72 79 20 69 73  the sub-query is
206a0 20 61 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65   a compound sele
206b0 63 74 2c 20 74 68 65 6e 20 61 6c 6c 20 74 65 72  ct, then all ter
206c0 6d 73 20 6f 66 20 74 68 65 0a 2a 2a 20 20 20 20  ms of the.**    
206d0 20 20 20 20 4f 52 44 45 52 20 42 59 20 63 6c 61      ORDER BY cla
206e0 75 73 65 20 6f 66 20 74 68 65 20 70 61 72 65 6e  use of the paren
206f0 74 20 6d 75 73 74 20 62 65 20 73 69 6d 70 6c 65  t must be simple
20700 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 0a   references to .
20710 2a 2a 20 20 20 20 20 20 20 20 63 6f 6c 75 6d 6e  **        column
20720 73 20 6f 66 20 74 68 65 20 73 75 62 2d 71 75 65  s of the sub-que
20730 72 79 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 39 29 20  ry..**.**  (19) 
20740 20 49 66 20 74 68 65 20 73 75 62 71 75 65 72 79   If the subquery
20750 20 75 73 65 73 20 4c 49 4d 49 54 20 74 68 65 6e   uses LIMIT then
20760 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
20770 20 6d 61 79 20 6e 6f 74 0a 2a 2a 20 20 20 20 20   may not.**     
20780 20 20 20 68 61 76 65 20 61 20 57 48 45 52 45 20     have a WHERE 
20790 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 20 28  clause..**.**  (
207a0 32 30 29 20 20 49 66 20 74 68 65 20 73 75 62 2d  20)  If the sub-
207b0 71 75 65 72 79 20 69 73 20 61 20 63 6f 6d 70 6f  query is a compo
207c0 75 6e 64 20 73 65 6c 65 63 74 2c 20 74 68 65 6e  und select, then
207d0 20 69 74 20 6d 75 73 74 20 6e 6f 74 20 75 73 65   it must not use
207e0 0a 2a 2a 20 20 20 20 20 20 20 20 61 6e 20 4f 52  .**        an OR
207f0 44 45 52 20 42 59 20 63 6c 61 75 73 65 2e 20 20  DER BY clause.  
20800 54 69 63 6b 65 74 20 23 33 37 37 33 2e 20 20 57  Ticket #3773.  W
20810 65 20 63 6f 75 6c 64 20 72 65 6c 61 78 20 74 68  e could relax th
20820 69 73 20 63 6f 6e 73 74 72 61 69 6e 74 0a 2a 2a  is constraint.**
20830 20 20 20 20 20 20 20 20 73 6f 6d 65 77 68 61 74          somewhat
20840 20 62 79 20 73 61 79 69 6e 67 20 74 68 61 74 20   by saying that 
20850 74 68 65 20 74 65 72 6d 73 20 6f 66 20 74 68 65  the terms of the
20860 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
20870 20 6d 75 73 74 0a 2a 2a 20 20 20 20 20 20 20 20   must.**        
20880 61 70 70 65 61 72 20 61 73 20 75 6e 6d 6f 64 69  appear as unmodi
20890 66 69 65 64 20 72 65 73 75 6c 74 20 63 6f 6c 75  fied result colu
208a0 6d 6e 73 20 69 6e 20 74 68 65 20 6f 75 74 65 72  mns in the outer
208b0 20 71 75 65 72 79 2e 20 20 42 75 74 20 77 65 0a   query.  But we.
208c0 2a 2a 20 20 20 20 20 20 20 20 68 61 76 65 20 6f  **        have o
208d0 74 68 65 72 20 6f 70 74 69 6d 69 7a 61 74 69 6f  ther optimizatio
208e0 6e 73 20 69 6e 20 6d 69 6e 64 20 74 6f 20 64 65  ns in mind to de
208f0 61 6c 20 77 69 74 68 20 74 68 61 74 20 63 61 73  al with that cas
20900 65 2e 0a 2a 2a 0a 2a 2a 20 20 28 32 31 29 20 20  e..**.**  (21)  
20910 49 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20  If the subquery 
20920 75 73 65 73 20 4c 49 4d 49 54 20 74 68 65 6e 20  uses LIMIT then 
20930 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  the outer query 
20940 6d 61 79 20 6e 6f 74 20 62 65 0a 2a 2a 20 20 20  may not be.**   
20950 20 20 20 20 20 44 49 53 54 49 4e 43 54 2e 20 20       DISTINCT.  
20960 28 53 65 65 20 74 69 63 6b 65 74 20 5b 37 35 32  (See ticket [752
20970 65 31 36 34 36 66 63 5d 29 2e 0a 2a 2a 0a 2a 2a  e1646fc])..**.**
20980 20 20 28 32 32 29 20 20 54 68 65 20 73 75 62 71    (22)  The subq
20990 75 65 72 79 20 6d 61 79 20 6e 6f 74 20 62 65 20  uery may not be 
209a0 61 20 72 65 63 75 72 73 69 76 65 20 43 54 45 2e  a recursive CTE.
209b0 0a 2a 2a 0a 2a 2a 20 20 28 2a 2a 29 20 20 53 75  .**.**  (**)  Su
209c0 62 73 75 6d 65 64 20 69 6e 74 6f 20 72 65 73 74  bsumed into rest
209d0 72 69 63 74 69 6f 6e 20 28 31 37 64 33 29 2e 20  riction (17d3). 
209e0 20 57 61 73 3a 20 49 66 20 74 68 65 20 6f 75 74   Was: If the out
209f0 65 72 20 71 75 65 72 79 20 69 73 0a 2a 2a 20 20  er query is.**  
20a00 20 20 20 20 20 20 61 20 72 65 63 75 72 73 69 76        a recursiv
20a10 65 20 43 54 45 2c 20 74 68 65 6e 20 74 68 65 20  e CTE, then the 
20a20 73 75 62 2d 71 75 65 72 79 20 6d 61 79 20 6e 6f  sub-query may no
20a30 74 20 62 65 20 61 20 63 6f 6d 70 6f 75 6e 64 20  t be a compound 
20a40 71 75 65 72 79 2e 0a 2a 2a 20 20 20 20 20 20 20  query..**       
20a50 20 54 68 69 73 20 72 65 73 74 72 69 63 74 69 6f   This restrictio
20a60 6e 20 69 73 20 62 65 63 61 75 73 65 20 74 72 61  n is because tra
20a70 6e 73 66 6f 72 6d 69 6e 67 20 74 68 65 0a 2a 2a  nsforming the.**
20a80 20 20 20 20 20 20 20 20 70 61 72 65 6e 74 20 74          parent t
20a90 6f 20 61 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65  o a compound que
20aa0 72 79 20 63 6f 6e 66 75 73 65 73 20 74 68 65 20  ry confuses the 
20ab0 63 6f 64 65 20 74 68 61 74 20 68 61 6e 64 6c 65  code that handle
20ac0 73 0a 2a 2a 20 20 20 20 20 20 20 20 72 65 63 75  s.**        recu
20ad0 72 73 69 76 65 20 71 75 65 72 69 65 73 20 69 6e  rsive queries in
20ae0 20 6d 75 6c 74 69 53 65 6c 65 63 74 28 29 2e 0a   multiSelect()..
20af0 2a 2a 0a 2a 2a 20 20 28 2a 2a 29 20 20 57 65 20  **.**  (**)  We 
20b00 6e 6f 20 6c 6f 6e 67 65 72 20 61 74 74 65 6d 70  no longer attemp
20b10 74 20 74 6f 20 66 6c 61 74 74 65 6e 20 61 67 67  t to flatten agg
20b20 72 65 67 61 74 65 20 73 75 62 71 75 65 72 69 65  regate subquerie
20b30 73 2e 20 20 57 61 73 3a 0a 2a 2a 20 20 20 20 20  s.  Was:.**     
20b40 20 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20     The subquery 
20b50 6d 61 79 20 6e 6f 74 20 62 65 20 61 6e 20 61 67  may not be an ag
20b60 67 72 65 67 61 74 65 20 74 68 61 74 20 75 73 65  gregate that use
20b70 73 20 74 68 65 20 62 75 69 6c 74 2d 69 6e 20 6d  s the built-in m
20b80 69 6e 28 29 20 6f 72 20 0a 2a 2a 20 20 20 20 20  in() or .**     
20b90 20 20 20 6f 72 20 6d 61 78 28 29 20 66 75 6e 63     or max() func
20ba0 74 69 6f 6e 73 2e 20 20 28 57 69 74 68 6f 75 74  tions.  (Without
20bb0 20 74 68 69 73 20 72 65 73 74 72 69 63 74 69 6f   this restrictio
20bc0 6e 2c 20 61 20 71 75 65 72 79 20 6c 69 6b 65 3a  n, a query like:
20bd0 0a 2a 2a 20 20 20 20 20 20 20 20 22 53 45 4c 45  .**        "SELE
20be0 43 54 20 78 20 46 52 4f 4d 20 28 53 45 4c 45 43  CT x FROM (SELEC
20bf0 54 20 6d 61 78 28 79 29 2c 20 78 20 46 52 4f 4d  T max(y), x FROM
20c00 20 74 31 29 22 20 77 6f 75 6c 64 20 6e 6f 74 20   t1)" would not 
20c10 6e 65 63 65 73 73 61 72 69 6c 79 0a 2a 2a 20 20  necessarily.**  
20c20 20 20 20 20 20 20 72 65 74 75 72 6e 20 74 68 65        return the
20c30 20 76 61 6c 75 65 20 58 20 66 6f 72 20 77 68 69   value X for whi
20c40 63 68 20 59 20 77 61 73 20 6d 61 78 69 6d 61 6c  ch Y was maximal
20c50 2e 29 0a 2a 2a 0a 2a 2a 20 20 28 32 35 29 20 20  .).**.**  (25)  
20c60 49 66 20 65 69 74 68 65 72 20 74 68 65 20 73 75  If either the su
20c70 62 71 75 65 72 79 20 6f 72 20 74 68 65 20 70 61  bquery or the pa
20c80 72 65 6e 74 20 71 75 65 72 79 20 63 6f 6e 74 61  rent query conta
20c90 69 6e 73 20 61 20 77 69 6e 64 6f 77 0a 2a 2a 20  ins a window.** 
20ca0 20 20 20 20 20 20 20 66 75 6e 63 74 69 6f 6e 20         function 
20cb0 69 6e 20 74 68 65 20 73 65 6c 65 63 74 20 6c 69  in the select li
20cc0 73 74 20 6f 72 20 4f 52 44 45 52 20 42 59 20 63  st or ORDER BY c
20cd0 6c 61 75 73 65 2c 20 66 6c 61 74 74 65 6e 69 6e  lause, flattenin
20ce0 67 0a 2a 2a 20 20 20 20 20 20 20 20 69 73 20 6e  g.**        is n
20cf0 6f 74 20 61 74 74 65 6d 70 74 65 64 2e 0a 2a 2a  ot attempted..**
20d00 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 69 73 20 72  .**.** In this r
20d10 6f 75 74 69 6e 65 2c 20 74 68 65 20 22 70 22 20  outine, the "p" 
20d20 70 61 72 61 6d 65 74 65 72 20 69 73 20 61 20 70  parameter is a p
20d30 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 6f 75  ointer to the ou
20d40 74 65 72 20 71 75 65 72 79 2e 0a 2a 2a 20 54 68  ter query..** Th
20d50 65 20 73 75 62 71 75 65 72 79 20 69 73 20 70 2d  e subquery is p-
20d60 3e 70 53 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d 2e  >pSrc->a[iFrom].
20d70 20 20 69 73 41 67 67 20 69 73 20 74 72 75 65 20    isAgg is true 
20d80 69 66 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  if the outer que
20d90 72 79 0a 2a 2a 20 75 73 65 73 20 61 67 67 72 65  ry.** uses aggre
20da0 67 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  gates..**.** If 
20db0 66 6c 61 74 74 65 6e 69 6e 67 20 69 73 20 6e 6f  flattening is no
20dc0 74 20 61 74 74 65 6d 70 74 65 64 2c 20 74 68 69  t attempted, thi
20dd0 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e  s routine is a n
20de0 6f 2d 6f 70 20 61 6e 64 20 72 65 74 75 72 6e 73  o-op and returns
20df0 20 30 2e 0a 2a 2a 20 49 66 20 66 6c 61 74 74 65   0..** If flatte
20e00 6e 69 6e 67 20 69 73 20 61 74 74 65 6d 70 74 65  ning is attempte
20e10 64 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72  d this routine r
20e20 65 74 75 72 6e 73 20 31 2e 0a 2a 2a 0a 2a 2a 20  eturns 1..**.** 
20e30 41 6c 6c 20 6f 66 20 74 68 65 20 65 78 70 72 65  All of the expre
20e40 73 73 69 6f 6e 20 61 6e 61 6c 79 73 69 73 20 6d  ssion analysis m
20e50 75 73 74 20 6f 63 63 75 72 20 6f 6e 20 62 6f 74  ust occur on bot
20e60 68 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  h the outer quer
20e70 79 20 61 6e 64 0a 2a 2a 20 74 68 65 20 73 75 62  y and.** the sub
20e80 71 75 65 72 79 20 62 65 66 6f 72 65 20 74 68 69  query before thi
20e90 73 20 72 6f 75 74 69 6e 65 20 72 75 6e 73 2e 0a  s routine runs..
20ea0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 6c  */.static int fl
20eb0 61 74 74 65 6e 53 75 62 71 75 65 72 79 28 0a 20  attenSubquery(. 
20ec0 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
20ed0 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
20ee0 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65   context */.  Se
20ef0 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20  lect *p,        
20f00 20 20 20 2f 2a 20 54 68 65 20 70 61 72 65 6e 74     /* The parent
20f10 20 6f 72 20 6f 75 74 65 72 20 53 45 4c 45 43 54   or outer SELECT
20f20 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20   statement */.  
20f30 69 6e 74 20 69 46 72 6f 6d 2c 20 20 20 20 20 20  int iFrom,      
20f40 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e       /* Index in
20f50 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 5d 20 6f 66   p->pSrc->a[] of
20f60 20 74 68 65 20 69 6e 6e 65 72 20 73 75 62 71 75   the inner subqu
20f70 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20 69 73 41  ery */.  int isA
20f80 67 67 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  gg            /*
20f90 20 54 72 75 65 20 69 66 20 6f 75 74 65 72 20 53   True if outer S
20fa0 45 4c 45 43 54 20 75 73 65 73 20 61 67 67 72 65  ELECT uses aggre
20fb0 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 20 2a  gate functions *
20fc0 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61  /.){.  const cha
20fd0 72 20 2a 7a 53 61 76 65 64 41 75 74 68 43 6f 6e  r *zSavedAuthCon
20fe0 74 65 78 74 20 3d 20 70 50 61 72 73 65 2d 3e 7a  text = pParse->z
20ff0 41 75 74 68 43 6f 6e 74 65 78 74 3b 0a 20 20 53  AuthContext;.  S
21000 65 6c 65 63 74 20 2a 70 50 61 72 65 6e 74 3b 20  elect *pParent; 
21010 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 55 4e     /* Current UN
21020 49 4f 4e 20 41 4c 4c 20 74 65 72 6d 20 6f 66 20  ION ALL term of 
21030 74 68 65 20 6f 74 68 65 72 20 71 75 65 72 79 20  the other query 
21040 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 75  */.  Select *pSu
21050 62 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  b;       /* The 
21060 69 6e 6e 65 72 20 71 75 65 72 79 20 6f 72 20 22  inner query or "
21070 73 75 62 71 75 65 72 79 22 20 2a 2f 0a 20 20 53  subquery" */.  S
21080 65 6c 65 63 74 20 2a 70 53 75 62 31 3b 20 20 20  elect *pSub1;   
21090 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f     /* Pointer to
210a0 20 74 68 65 20 72 69 67 68 74 6d 6f 73 74 20 73   the rightmost s
210b0 65 6c 65 63 74 20 69 6e 20 73 75 62 2d 71 75 65  elect in sub-que
210c0 72 79 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20  ry */.  SrcList 
210d0 2a 70 53 72 63 3b 20 20 20 20 20 20 2f 2a 20 54  *pSrc;      /* T
210e0 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f  he FROM clause o
210f0 66 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  f the outer quer
21100 79 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a  y */.  SrcList *
21110 70 53 75 62 53 72 63 3b 20 20 20 2f 2a 20 54 68  pSubSrc;   /* Th
21120 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66  e FROM clause of
21130 20 74 68 65 20 73 75 62 71 75 65 72 79 20 2a 2f   the subquery */
21140 0a 20 20 69 6e 74 20 69 50 61 72 65 6e 74 3b 20  .  int iParent; 
21150 20 20 20 20 20 20 20 2f 2a 20 56 44 42 45 20 63         /* VDBE c
21160 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20  ursor number of 
21170 74 68 65 20 70 53 75 62 20 72 65 73 75 6c 74 20  the pSub result 
21180 73 65 74 20 74 65 6d 70 20 74 61 62 6c 65 20 2a  set temp table *
21190 2f 0a 20 20 69 6e 74 20 69 4e 65 77 50 61 72 65  /.  int iNewPare
211a0 6e 74 20 3d 20 2d 31 3b 2f 2a 20 52 65 70 6c 61  nt = -1;/* Repla
211b0 63 65 6d 65 6e 74 20 74 61 62 6c 65 20 66 6f 72  cement table for
211c0 20 69 50 61 72 65 6e 74 20 2a 2f 0a 20 20 69 6e   iParent */.  in
211d0 74 20 69 73 4c 65 66 74 4a 6f 69 6e 20 3d 20 30  t isLeftJoin = 0
211e0 3b 20 2f 2a 20 54 72 75 65 20 69 66 20 70 53 75  ; /* True if pSu
211f0 62 20 69 73 20 74 68 65 20 72 69 67 68 74 20 73  b is the right s
21200 69 64 65 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f  ide of a LEFT JO
21210 49 4e 20 2a 2f 20 20 20 20 0a 20 20 69 6e 74 20  IN */    .  int 
21220 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
21230 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  /* Loop counter 
21240 2a 2f 0a 20 20 45 78 70 72 20 2a 70 57 68 65 72  */.  Expr *pWher
21250 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
21260 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45        /* The WHE
21270 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 73  RE clause */.  s
21280 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
21290 65 6d 20 2a 70 53 75 62 69 74 65 6d 3b 20 20 20  em *pSubitem;   
212a0 2f 2a 20 54 68 65 20 73 75 62 71 75 65 72 79 20  /* The subquery 
212b0 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  */.  sqlite3 *db
212c0 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a   = pParse->db;..
212d0 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65    /* Check to se
212e0 65 20 69 66 20 66 6c 61 74 74 65 6e 69 6e 67 20  e if flattening 
212f0 69 73 20 70 65 72 6d 69 74 74 65 64 2e 20 20 52  is permitted.  R
21300 65 74 75 72 6e 20 30 20 69 66 20 6e 6f 74 2e 0a  eturn 0 if not..
21310 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70    */.  assert( p
21320 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
21330 20 70 2d 3e 70 50 72 69 6f 72 3d 3d 30 20 29 3b   p->pPrior==0 );
21340 0a 20 20 69 66 28 20 4f 70 74 69 6d 69 7a 61 74  .  if( Optimizat
21350 69 6f 6e 44 69 73 61 62 6c 65 64 28 64 62 2c 20  ionDisabled(db, 
21360 53 51 4c 49 54 45 5f 51 75 65 72 79 46 6c 61 74  SQLITE_QueryFlat
21370 74 65 6e 65 72 29 20 29 20 72 65 74 75 72 6e 20  tener) ) return 
21380 30 3b 0a 20 20 70 53 72 63 20 3d 20 70 2d 3e 70  0;.  pSrc = p->p
21390 53 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 70  Src;.  assert( p
213a0 53 72 63 20 26 26 20 69 46 72 6f 6d 3e 3d 30 20  Src && iFrom>=0 
213b0 26 26 20 69 46 72 6f 6d 3c 70 53 72 63 2d 3e 6e  && iFrom<pSrc->n
213c0 53 72 63 20 29 3b 0a 20 20 70 53 75 62 69 74 65  Src );.  pSubite
213d0 6d 20 3d 20 26 70 53 72 63 2d 3e 61 5b 69 46 72  m = &pSrc->a[iFr
213e0 6f 6d 5d 3b 0a 20 20 69 50 61 72 65 6e 74 20 3d  om];.  iParent =
213f0 20 70 53 75 62 69 74 65 6d 2d 3e 69 43 75 72 73   pSubitem->iCurs
21400 6f 72 3b 0a 20 20 70 53 75 62 20 3d 20 70 53 75  or;.  pSub = pSu
21410 62 69 74 65 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a  bitem->pSelect;.
21420 20 20 61 73 73 65 72 74 28 20 70 53 75 62 21 3d    assert( pSub!=
21430 30 20 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51  0 );..#ifndef SQ
21440 4c 49 54 45 5f 4f 4d 49 54 5f 57 49 4e 44 4f 57  LITE_OMIT_WINDOW
21450 46 55 4e 43 0a 20 20 69 66 28 20 70 2d 3e 70 57  FUNC.  if( p->pW
21460 69 6e 20 7c 7c 20 70 53 75 62 2d 3e 70 57 69 6e  in || pSub->pWin
21470 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20   ) return 0;    
21480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
21490 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28 32 35   Restriction (25
214a0 29 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 20 20 70  ) */.#endif..  p
214b0 53 75 62 53 72 63 20 3d 20 70 53 75 62 2d 3e 70  SubSrc = pSub->p
214c0 53 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 70  Src;.  assert( p
214d0 53 75 62 53 72 63 20 29 3b 0a 20 20 2f 2a 20 50  SubSrc );.  /* P
214e0 72 69 6f 72 20 74 6f 20 76 65 72 73 69 6f 6e 20  rior to version 
214f0 33 2e 31 2e 32 2c 20 77 68 65 6e 20 4c 49 4d 49  3.1.2, when LIMI
21500 54 20 61 6e 64 20 4f 46 46 53 45 54 20 68 61 64  T and OFFSET had
21510 20 74 6f 20 62 65 20 73 69 6d 70 6c 65 20 63 6f   to be simple co
21520 6e 73 74 61 6e 74 73 2c 0a 20 20 2a 2a 20 6e 6f  nstants,.  ** no
21530 74 20 61 72 62 69 74 72 61 72 79 20 65 78 70 72  t arbitrary expr
21540 65 73 73 69 6f 6e 73 2c 20 77 65 20 61 6c 6c 6f  essions, we allo
21550 77 65 64 20 73 6f 6d 65 20 63 6f 6d 62 69 6e 69  wed some combini
21560 6e 67 20 6f 66 20 4c 49 4d 49 54 20 61 6e 64 20  ng of LIMIT and 
21570 4f 46 46 53 45 54 0a 20 20 2a 2a 20 62 65 63 61  OFFSET.  ** beca
21580 75 73 65 20 74 68 65 79 20 63 6f 75 6c 64 20 62  use they could b
21590 65 20 63 6f 6d 70 75 74 65 64 20 61 74 20 63 6f  e computed at co
215a0 6d 70 69 6c 65 2d 74 69 6d 65 2e 20 20 42 75 74  mpile-time.  But
215b0 20 77 68 65 6e 20 4c 49 4d 49 54 20 61 6e 64 20   when LIMIT and 
215c0 4f 46 46 53 45 54 0a 20 20 2a 2a 20 62 65 63 61  OFFSET.  ** beca
215d0 6d 65 20 61 72 62 69 74 72 61 72 79 20 65 78 70  me arbitrary exp
215e0 72 65 73 73 69 6f 6e 73 2c 20 77 65 20 77 65 72  ressions, we wer
215f0 65 20 66 6f 72 63 65 64 20 74 6f 20 61 64 64 20  e forced to add 
21600 72 65 73 74 72 69 63 74 69 6f 6e 73 20 28 31 33  restrictions (13
21610 29 0a 20 20 2a 2a 20 61 6e 64 20 28 31 34 29 2e  ).  ** and (14).
21620 20 2a 2f 0a 20 20 69 66 28 20 70 53 75 62 2d 3e   */.  if( pSub->
21630 70 4c 69 6d 69 74 20 26 26 20 70 2d 3e 70 4c 69  pLimit && p->pLi
21640 6d 69 74 20 29 20 72 65 74 75 72 6e 20 30 3b 20  mit ) return 0; 
21650 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
21660 52 65 73 74 72 69 63 74 69 6f 6e 20 28 31 33 29  Restriction (13)
21670 20 2a 2f 0a 20 20 69 66 28 20 70 53 75 62 2d 3e   */.  if( pSub->
21680 70 4c 69 6d 69 74 20 26 26 20 70 53 75 62 2d 3e  pLimit && pSub->
21690 70 4c 69 6d 69 74 2d 3e 70 52 69 67 68 74 20 29  pLimit->pRight )
216a0 20 72 65 74 75 72 6e 20 30 3b 20 20 20 2f 2a 20   return 0;   /* 
216b0 52 65 73 74 72 69 63 74 69 6f 6e 20 28 31 34 29  Restriction (14)
216c0 20 2a 2f 0a 20 20 69 66 28 20 28 70 2d 3e 73 65   */.  if( (p->se
216d0 6c 46 6c 61 67 73 20 26 20 53 46 5f 43 6f 6d 70  lFlags & SF_Comp
216e0 6f 75 6e 64 29 21 3d 30 20 26 26 20 70 53 75 62  ound)!=0 && pSub
216f0 2d 3e 70 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20  ->pLimit ){.    
21700 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20  return 0;       
21710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21730 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74       /* Restrict
21740 69 6f 6e 20 28 31 35 29 20 2a 2f 0a 20 20 7d 0a  ion (15) */.  }.
21750 20 20 69 66 28 20 70 53 75 62 53 72 63 2d 3e 6e    if( pSubSrc->n
21760 53 72 63 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  Src==0 ) return 
21770 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
21780 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74           /* Rest
21790 72 69 63 74 69 6f 6e 20 28 37 29 20 20 2a 2f 0a  riction (7)  */.
217a0 20 20 69 66 28 20 70 53 75 62 2d 3e 73 65 6c 46    if( pSub->selF
217b0 6c 61 67 73 20 26 20 53 46 5f 44 69 73 74 69 6e  lags & SF_Distin
217c0 63 74 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20  ct ) return 0;  
217d0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74           /* Rest
217e0 72 69 63 74 69 6f 6e 20 28 34 29 20 20 2a 2f 0a  riction (4)  */.
217f0 20 20 69 66 28 20 70 53 75 62 2d 3e 70 4c 69 6d    if( pSub->pLim
21800 69 74 20 26 26 20 28 70 53 72 63 2d 3e 6e 53 72  it && (pSrc->nSr
21810 63 3e 31 20 7c 7c 20 69 73 41 67 67 29 20 29 7b  c>1 || isAgg) ){
21820 0a 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20  .     return 0; 
21830 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72          /* Restr
21840 69 63 74 69 6f 6e 73 20 28 38 29 28 39 29 20 2a  ictions (8)(9) *
21850 2f 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70  /.  }.  if( p->p
21860 4f 72 64 65 72 42 79 20 26 26 20 70 53 75 62 2d  OrderBy && pSub-
21870 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20  >pOrderBy ){.   
21880 20 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20    return 0;     
21890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
218a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
218b0 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63        /* Restric
218c0 74 69 6f 6e 20 28 31 31 29 20 2a 2f 0a 20 20 7d  tion (11) */.  }
218d0 0a 20 20 69 66 28 20 69 73 41 67 67 20 26 26 20  .  if( isAgg && 
218e0 70 53 75 62 2d 3e 70 4f 72 64 65 72 42 79 20 29  pSub->pOrderBy )
218f0 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20   return 0;      
21900 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73            /* Res
21910 74 72 69 63 74 69 6f 6e 20 28 31 36 29 20 2a 2f  triction (16) */
21920 0a 20 20 69 66 28 20 70 53 75 62 2d 3e 70 4c 69  .  if( pSub->pLi
21930 6d 69 74 20 26 26 20 70 2d 3e 70 57 68 65 72 65  mit && p->pWhere
21940 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20   ) return 0;    
21950 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73            /* Res
21960 74 72 69 63 74 69 6f 6e 20 28 31 39 29 20 2a 2f  triction (19) */
21970 0a 20 20 69 66 28 20 70 53 75 62 2d 3e 70 4c 69  .  if( pSub->pLi
21980 6d 69 74 20 26 26 20 28 70 2d 3e 73 65 6c 46 6c  mit && (p->selFl
21990 61 67 73 20 26 20 53 46 5f 44 69 73 74 69 6e 63  ags & SF_Distinc
219a0 74 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 72 65  t)!=0 ){.     re
219b0 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20  turn 0;         
219c0 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28  /* Restriction (
219d0 32 31 29 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28  21) */.  }.  if(
219e0 20 70 53 75 62 2d 3e 73 65 6c 46 6c 61 67 73 20   pSub->selFlags 
219f0 26 20 28 53 46 5f 52 65 63 75 72 73 69 76 65 29  & (SF_Recursive)
21a00 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
21a10 3b 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e  ; /* Restriction
21a20 73 20 28 32 32 29 20 2a 2f 0a 20 20 7d 0a 0a 20  s (22) */.  }.. 
21a30 20 2f 2a 0a 20 20 2a 2a 20 49 66 20 74 68 65 20   /*.  ** If the 
21a40 73 75 62 71 75 65 72 79 20 69 73 20 74 68 65 20  subquery is the 
21a50 72 69 67 68 74 20 6f 70 65 72 61 6e 64 20 6f 66  right operand of
21a60 20 61 20 4c 45 46 54 20 4a 4f 49 4e 2c 20 74 68   a LEFT JOIN, th
21a70 65 6e 20 74 68 65 0a 20 20 2a 2a 20 73 75 62 71  en the.  ** subq
21a80 75 65 72 79 20 6d 61 79 20 6e 6f 74 20 62 65 20  uery may not be 
21a90 61 20 6a 6f 69 6e 20 69 74 73 65 6c 66 20 28 33  a join itself (3
21aa0 61 29 2e 20 45 78 61 6d 70 6c 65 20 6f 66 20 77  a). Example of w
21ab0 68 79 20 74 68 69 73 20 69 73 20 6e 6f 74 0a 20  hy this is not. 
21ac0 20 2a 2a 20 61 6c 6c 6f 77 65 64 3a 0a 20 20 2a   ** allowed:.  *
21ad0 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20 74  *.  **         t
21ae0 31 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49  1 LEFT OUTER JOI
21af0 4e 20 28 74 32 20 4a 4f 49 4e 20 74 33 29 0a 20  N (t2 JOIN t3). 
21b00 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 77 65 20 66   **.  ** If we f
21b10 6c 61 74 74 65 6e 20 74 68 65 20 61 62 6f 76 65  latten the above
21b20 2c 20 77 65 20 77 6f 75 6c 64 20 67 65 74 0a 20  , we would get. 
21b30 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20 20   **.  **        
21b40 20 28 74 31 20 4c 45 46 54 20 4f 55 54 45 52 20   (t1 LEFT OUTER 
21b50 4a 4f 49 4e 20 74 32 29 20 4a 4f 49 4e 20 74 33  JOIN t2) JOIN t3
21b60 0a 20 20 2a 2a 0a 20 20 2a 2a 20 77 68 69 63 68  .  **.  ** which
21b70 20 69 73 20 6e 6f 74 20 61 74 20 61 6c 6c 20 74   is not at all t
21b80 68 65 20 73 61 6d 65 20 74 68 69 6e 67 2e 0a 20  he same thing.. 
21b90 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 74 68 65 20   **.  ** If the 
21ba0 73 75 62 71 75 65 72 79 20 69 73 20 74 68 65 20  subquery is the 
21bb0 72 69 67 68 74 20 6f 70 65 72 61 6e 64 20 6f 66  right operand of
21bc0 20 61 20 4c 45 46 54 20 4a 4f 49 4e 2c 20 74 68   a LEFT JOIN, th
21bd0 65 6e 20 74 68 65 20 6f 75 74 65 72 0a 20 20 2a  en the outer.  *
21be0 2a 20 71 75 65 72 79 20 63 61 6e 6e 6f 74 20 62  * query cannot b
21bf0 65 20 61 6e 20 61 67 67 72 65 67 61 74 65 2e 20  e an aggregate. 
21c00 28 33 63 29 20 20 54 68 69 73 20 69 73 20 61 6e  (3c)  This is an
21c10 20 61 72 74 69 66 61 63 74 20 6f 66 20 74 68 65   artifact of the
21c20 20 77 61 79 0a 20 20 2a 2a 20 61 67 67 72 65 67   way.  ** aggreg
21c30 61 74 65 73 20 61 72 65 20 70 72 6f 63 65 73 73  ates are process
21c40 65 64 20 2d 20 74 68 65 72 65 20 69 73 20 6e 6f  ed - there is no
21c50 20 6d 65 63 68 61 6e 69 73 6d 20 74 6f 20 64 65   mechanism to de
21c60 74 65 72 6d 69 6e 65 20 69 66 0a 20 20 2a 2a 20  termine if.  ** 
21c70 74 68 65 20 4c 45 46 54 20 4a 4f 49 4e 20 74 61  the LEFT JOIN ta
21c80 62 6c 65 20 73 68 6f 75 6c 64 20 62 65 20 61 6c  ble should be al
21c90 6c 2d 4e 55 4c 4c 2e 0a 20 20 2a 2a 0a 20 20 2a  l-NULL..  **.  *
21ca0 2a 20 53 65 65 20 61 6c 73 6f 20 74 69 63 6b 65  * See also ticke
21cb0 74 73 20 23 33 30 36 2c 20 23 33 35 30 2c 20 61  ts #306, #350, a
21cc0 6e 64 20 23 33 33 30 30 2e 0a 20 20 2a 2f 0a 20  nd #3300..  */. 
21cd0 20 69 66 28 20 28 70 53 75 62 69 74 65 6d 2d 3e   if( (pSubitem->
21ce0 66 67 2e 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54  fg.jointype & JT
21cf0 5f 4f 55 54 45 52 29 21 3d 30 20 29 7b 0a 20 20  _OUTER)!=0 ){.  
21d00 20 20 69 73 4c 65 66 74 4a 6f 69 6e 20 3d 20 31    isLeftJoin = 1
21d10 3b 0a 20 20 20 20 69 66 28 20 70 53 75 62 53 72  ;.    if( pSubSr
21d20 63 2d 3e 6e 53 72 63 3e 31 20 7c 7c 20 69 73 41  c->nSrc>1 || isA
21d30 67 67 20 7c 7c 20 49 73 56 69 72 74 75 61 6c 28  gg || IsVirtual(
21d40 70 53 75 62 53 72 63 2d 3e 61 5b 30 5d 2e 70 54  pSubSrc->a[0].pT
21d50 61 62 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  ab) ){.      /* 
21d60 20 28 33 61 29 20 20 20 20 20 20 20 20 20 20 20   (3a)           
21d70 20 20 28 33 63 29 20 20 20 20 20 28 33 62 29 20    (3c)     (3b) 
21d80 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  */.      return 
21d90 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 69 66  0;.    }.  }.#if
21da0 64 65 66 20 53 51 4c 49 54 45 5f 45 58 54 52 41  def SQLITE_EXTRA
21db0 5f 49 46 4e 55 4c 4c 52 4f 57 0a 20 20 65 6c 73  _IFNULLROW.  els
21dc0 65 20 69 66 28 20 69 46 72 6f 6d 3e 30 20 26 26  e if( iFrom>0 &&
21dd0 20 21 69 73 41 67 67 20 29 7b 0a 20 20 20 20 2f   !isAgg ){.    /
21de0 2a 20 53 65 74 74 69 6e 67 20 69 73 4c 65 66 74  * Setting isLeft
21df0 4a 6f 69 6e 20 74 6f 20 2d 31 20 63 61 75 73 65  Join to -1 cause
21e00 73 20 4f 50 5f 49 66 4e 75 6c 6c 52 6f 77 20 6f  s OP_IfNullRow o
21e10 70 63 6f 64 65 73 20 74 6f 20 62 65 20 67 65 6e  pcodes to be gen
21e20 65 72 61 74 65 64 20 66 6f 72 0a 20 20 20 20 2a  erated for.    *
21e30 2a 20 65 76 65 72 79 20 72 65 66 65 72 65 6e 63  * every referenc
21e40 65 20 74 6f 20 61 6e 79 20 72 65 73 75 6c 74 20  e to any result 
21e50 63 6f 6c 75 6d 6e 20 66 72 6f 6d 20 73 75 62 71  column from subq
21e60 75 65 72 79 20 69 6e 20 61 20 6a 6f 69 6e 2c 20  uery in a join, 
21e70 65 76 65 6e 0a 20 20 20 20 2a 2a 20 74 68 6f 75  even.    ** thou
21e80 67 68 20 74 68 65 79 20 61 72 65 20 6e 6f 74 20  gh they are not 
21e90 6e 65 63 65 73 73 61 72 79 2e 20 20 54 68 69 73  necessary.  This
21ea0 20 77 69 6c 6c 20 73 74 72 65 73 73 2d 74 65 73   will stress-tes
21eb0 74 20 74 68 65 20 4f 50 5f 49 66 4e 75 6c 6c 52  t the OP_IfNullR
21ec0 6f 77 20 0a 20 20 20 20 2a 2a 20 6f 70 63 6f 64  ow .    ** opcod
21ed0 65 2e 20 2a 2f 0a 20 20 20 20 69 73 4c 65 66 74  e. */.    isLeft
21ee0 4a 6f 69 6e 20 3d 20 2d 31 3b 0a 20 20 7d 0a 23  Join = -1;.  }.#
21ef0 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 52 65 73 74  endif..  /* Rest
21f00 72 69 63 74 69 6f 6e 20 28 31 37 29 3a 20 49 66  riction (17): If
21f10 20 74 68 65 20 73 75 62 2d 71 75 65 72 79 20 69   the sub-query i
21f20 73 20 61 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c  s a compound SEL
21f30 45 43 54 2c 20 74 68 65 6e 20 69 74 20 6d 75 73  ECT, then it mus
21f40 74 0a 20 20 2a 2a 20 75 73 65 20 6f 6e 6c 79 20  t.  ** use only 
21f50 74 68 65 20 55 4e 49 4f 4e 20 41 4c 4c 20 6f 70  the UNION ALL op
21f60 65 72 61 74 6f 72 2e 20 41 6e 64 20 6e 6f 6e 65  erator. And none
21f70 20 6f 66 20 74 68 65 20 73 69 6d 70 6c 65 20 73   of the simple s
21f80 65 6c 65 63 74 20 71 75 65 72 69 65 73 0a 20 20  elect queries.  
21f90 2a 2a 20 74 68 61 74 20 6d 61 6b 65 20 75 70 20  ** that make up 
21fa0 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c  the compound SEL
21fb0 45 43 54 20 61 72 65 20 61 6c 6c 6f 77 65 64 20  ECT are allowed 
21fc0 74 6f 20 62 65 20 61 67 67 72 65 67 61 74 65 20  to be aggregate 
21fd0 6f 72 20 64 69 73 74 69 6e 63 74 0a 20 20 2a 2a  or distinct.  **
21fe0 20 71 75 65 72 69 65 73 2e 0a 20 20 2a 2f 0a 20   queries..  */. 
21ff0 20 69 66 28 20 70 53 75 62 2d 3e 70 50 72 69 6f   if( pSub->pPrio
22000 72 20 29 7b 0a 20 20 20 20 69 66 28 20 70 53 75  r ){.    if( pSu
22010 62 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20  b->pOrderBy ){. 
22020 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20       return 0;  
22030 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28  /* Restriction (
22040 32 30 29 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20  20) */.    }.   
22050 20 69 66 28 20 69 73 41 67 67 20 7c 7c 20 28 70   if( isAgg || (p
22060 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f  ->selFlags & SF_
22070 44 69 73 74 69 6e 63 74 29 21 3d 30 20 7c 7c 20  Distinct)!=0 || 
22080 70 53 72 63 2d 3e 6e 53 72 63 21 3d 31 20 29 7b  pSrc->nSrc!=1 ){
22090 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b  .      return 0;
220a0 20 2f 2a 20 28 31 37 64 31 29 2c 20 28 31 37 64   /* (17d1), (17d
220b0 32 29 2c 20 6f 72 20 28 31 37 64 33 29 20 2a 2f  2), or (17d3) */
220c0 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 70  .    }.    for(p
220d0 53 75 62 31 3d 70 53 75 62 3b 20 70 53 75 62 31  Sub1=pSub; pSub1
220e0 3b 20 70 53 75 62 31 3d 70 53 75 62 31 2d 3e 70  ; pSub1=pSub1->p
220f0 50 72 69 6f 72 29 7b 0a 20 20 20 20 20 20 74 65  Prior){.      te
22100 73 74 63 61 73 65 28 20 28 70 53 75 62 31 2d 3e  stcase( (pSub1->
22110 73 65 6c 46 6c 61 67 73 20 26 20 28 53 46 5f 44  selFlags & (SF_D
22120 69 73 74 69 6e 63 74 7c 53 46 5f 41 67 67 72 65  istinct|SF_Aggre
22130 67 61 74 65 29 29 3d 3d 53 46 5f 44 69 73 74 69  gate))==SF_Disti
22140 6e 63 74 20 29 3b 0a 20 20 20 20 20 20 74 65 73  nct );.      tes
22150 74 63 61 73 65 28 20 28 70 53 75 62 31 2d 3e 73  tcase( (pSub1->s
22160 65 6c 46 6c 61 67 73 20 26 20 28 53 46 5f 44 69  elFlags & (SF_Di
22170 73 74 69 6e 63 74 7c 53 46 5f 41 67 67 72 65 67  stinct|SF_Aggreg
22180 61 74 65 29 29 3d 3d 53 46 5f 41 67 67 72 65 67  ate))==SF_Aggreg
22190 61 74 65 20 29 3b 0a 20 20 20 20 20 20 61 73 73  ate );.      ass
221a0 65 72 74 28 20 70 53 75 62 2d 3e 70 53 72 63 21  ert( pSub->pSrc!
221b0 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  =0 );.      asse
221c0 72 74 28 20 70 53 75 62 2d 3e 70 45 4c 69 73 74  rt( pSub->pEList
221d0 2d 3e 6e 45 78 70 72 3d 3d 70 53 75 62 31 2d 3e  ->nExpr==pSub1->
221e0 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 3b  pEList->nExpr );
221f0 0a 20 20 20 20 20 20 69 66 28 20 28 70 53 75 62  .      if( (pSub
22200 31 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 28 53  1->selFlags & (S
22210 46 5f 44 69 73 74 69 6e 63 74 7c 53 46 5f 41 67  F_Distinct|SF_Ag
22220 67 72 65 67 61 74 65 29 29 21 3d 30 20 20 20 20  gregate))!=0    
22230 2f 2a 20 28 31 37 62 29 20 2a 2f 0a 20 20 20 20  /* (17b) */.    
22240 20 20 20 7c 7c 20 28 70 53 75 62 31 2d 3e 70 50     || (pSub1->pP
22250 72 69 6f 72 20 26 26 20 70 53 75 62 31 2d 3e 6f  rior && pSub1->o
22260 70 21 3d 54 4b 5f 41 4c 4c 29 20 20 20 20 20 20  p!=TK_ALL)      
22270 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 28 31             /* (1
22280 37 61 29 20 2a 2f 0a 20 20 20 20 20 20 20 7c 7c  7a) */.       ||
22290 20 70 53 75 62 31 2d 3e 70 53 72 63 2d 3e 6e 53   pSub1->pSrc->nS
222a0 72 63 3c 31 20 20 20 20 20 20 20 20 20 20 20 20  rc<1            
222b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
222c0 20 20 20 20 20 20 2f 2a 20 28 31 37 63 29 20 2a        /* (17c) *
222d0 2f 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20  /.      ){.     
222e0 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20     return 0;.   
222f0 20 20 20 7d 0a 20 20 20 20 20 20 74 65 73 74 63     }.      testc
22300 61 73 65 28 20 70 53 75 62 31 2d 3e 70 53 72 63  ase( pSub1->pSrc
22310 2d 3e 6e 53 72 63 3e 31 20 29 3b 0a 20 20 20 20  ->nSrc>1 );.    
22320 7d 0a 0a 20 20 20 20 2f 2a 20 52 65 73 74 72 69  }..    /* Restri
22330 63 74 69 6f 6e 20 28 31 38 29 2e 20 2a 2f 0a 20  ction (18). */. 
22340 20 20 20 69 66 28 20 70 2d 3e 70 4f 72 64 65 72     if( p->pOrder
22350 42 79 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  By ){.      int 
22360 69 69 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 69  ii;.      for(ii
22370 3d 30 3b 20 69 69 3c 70 2d 3e 70 4f 72 64 65 72  =0; ii<p->pOrder
22380 42 79 2d 3e 6e 45 78 70 72 3b 20 69 69 2b 2b 29  By->nExpr; ii++)
22390 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 2d  {.        if( p-
223a0 3e 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 69 5d  >pOrderBy->a[ii]
223b0 2e 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c  .u.x.iOrderByCol
223c0 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
223d0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
223e0 7d 0a 0a 20 20 2f 2a 20 45 78 2d 72 65 73 74 72  }..  /* Ex-restr
223f0 69 63 74 69 6f 6e 20 28 32 33 29 3a 0a 20 20 2a  iction (23):.  *
22400 2a 20 54 68 65 20 6f 6e 6c 79 20 77 61 79 20 74  * The only way t
22410 68 61 74 20 74 68 65 20 72 65 63 75 72 73 69 76  hat the recursiv
22420 65 20 70 61 72 74 20 6f 66 20 61 20 43 54 45 20  e part of a CTE 
22430 63 61 6e 20 63 6f 6e 74 61 69 6e 20 61 20 63 6f  can contain a co
22440 6d 70 6f 75 6e 64 0a 20 20 2a 2a 20 73 75 62 71  mpound.  ** subq
22450 75 65 72 79 20 69 73 20 66 6f 72 20 74 68 65 20  uery is for the 
22460 73 75 62 71 75 65 72 79 20 74 6f 20 62 65 20 6f  subquery to be o
22470 6e 65 20 74 65 72 6d 20 6f 66 20 61 20 6a 6f 69  ne term of a joi
22480 6e 2e 20 20 42 75 74 20 69 66 20 74 68 65 0a 20  n.  But if the. 
22490 20 2a 2a 20 73 75 62 71 75 65 72 79 20 69 73 20   ** subquery is 
224a0 61 20 6a 6f 69 6e 2c 20 74 68 65 6e 20 74 68 65  a join, then the
224b0 20 66 6c 61 74 74 65 6e 69 6e 67 20 68 61 73 20   flattening has 
224c0 61 6c 72 65 61 64 79 20 62 65 65 6e 20 73 74 6f  already been sto
224d0 70 70 65 64 20 62 79 0a 20 20 2a 2a 20 72 65 73  pped by.  ** res
224e0 74 72 69 63 74 69 6f 6e 20 28 31 37 64 33 29 0a  triction (17d3).
224f0 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28    */.  assert( (
22500 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46  p->selFlags & SF
22510 5f 52 65 63 75 72 73 69 76 65 29 3d 3d 30 20 7c  _Recursive)==0 |
22520 7c 20 70 53 75 62 2d 3e 70 50 72 69 6f 72 3d 3d  | pSub->pPrior==
22530 30 20 29 3b 0a 0a 20 20 2f 2a 2a 2a 2a 2a 20 49  0 );..  /***** I
22540 66 20 77 65 20 72 65 61 63 68 20 74 68 69 73 20  f we reach this 
22550 70 6f 69 6e 74 2c 20 66 6c 61 74 74 65 6e 69 6e  point, flattenin
22560 67 20 69 73 20 70 65 72 6d 69 74 74 65 64 2e 20  g is permitted. 
22570 2a 2a 2a 2a 2a 2f 0a 20 20 53 45 4c 45 43 54 54  *****/.  SELECTT
22580 52 41 43 45 28 31 2c 70 50 61 72 73 65 2c 70 2c  RACE(1,pParse,p,
22590 28 22 66 6c 61 74 74 65 6e 20 25 75 2e 25 70 20  ("flatten %u.%p 
225a0 66 72 6f 6d 20 74 65 72 6d 20 25 64 5c 6e 22 2c  from term %d\n",
225b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
225c0 20 20 20 20 70 53 75 62 2d 3e 73 65 6c 49 64 2c      pSub->selId,
225d0 20 70 53 75 62 2c 20 69 46 72 6f 6d 29 29 3b 0a   pSub, iFrom));.
225e0 0a 20 20 2f 2a 20 41 75 74 68 6f 72 69 7a 65 20  .  /* Authorize 
225f0 74 68 65 20 73 75 62 71 75 65 72 79 20 2a 2f 0a  the subquery */.
22600 20 20 70 50 61 72 73 65 2d 3e 7a 41 75 74 68 43    pParse->zAuthC
22610 6f 6e 74 65 78 74 20 3d 20 70 53 75 62 69 74 65  ontext = pSubite
22620 6d 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 54 45 53 54  m->zName;.  TEST
22630 4f 4e 4c 59 28 69 20 3d 29 20 73 71 6c 69 74 65  ONLY(i =) sqlite
22640 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73  3AuthCheck(pPars
22650 65 2c 20 53 51 4c 49 54 45 5f 53 45 4c 45 43 54  e, SQLITE_SELECT
22660 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 74 65  , 0, 0, 0);.  te
22670 73 74 63 61 73 65 28 20 69 3d 3d 53 51 4c 49 54  stcase( i==SQLIT
22680 45 5f 44 45 4e 59 20 29 3b 0a 20 20 70 50 61 72  E_DENY );.  pPar
22690 73 65 2d 3e 7a 41 75 74 68 43 6f 6e 74 65 78 74  se->zAuthContext
226a0 20 3d 20 7a 53 61 76 65 64 41 75 74 68 43 6f 6e   = zSavedAuthCon
226b0 74 65 78 74 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  text;..  /* If t
226c0 68 65 20 73 75 62 2d 71 75 65 72 79 20 69 73 20  he sub-query is 
226d0 61 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43  a compound SELEC
226e0 54 20 73 74 61 74 65 6d 65 6e 74 2c 20 74 68 65  T statement, the
226f0 6e 20 28 62 79 20 72 65 73 74 72 69 63 74 69 6f  n (by restrictio
22700 6e 73 0a 20 20 2a 2a 20 31 37 20 61 6e 64 20 31  ns.  ** 17 and 1
22710 38 20 61 62 6f 76 65 29 20 69 74 20 6d 75 73 74  8 above) it must
22720 20 62 65 20 61 20 55 4e 49 4f 4e 20 41 4c 4c 20   be a UNION ALL 
22730 61 6e 64 20 74 68 65 20 70 61 72 65 6e 74 20 71  and the parent q
22740 75 65 72 79 20 6d 75 73 74 20 0a 20 20 2a 2a 20  uery must .  ** 
22750 62 65 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a  be of the form:.
22760 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 53 45    **.  **     SE
22770 4c 45 43 54 20 3c 65 78 70 72 2d 6c 69 73 74 3e  LECT <expr-list>
22780 20 46 52 4f 4d 20 28 3c 73 75 62 2d 71 75 65 72   FROM (<sub-quer
22790 79 3e 29 20 3c 77 68 65 72 65 2d 63 6c 61 75 73  y>) <where-claus
227a0 65 3e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 66 6f  e> .  **.  ** fo
227b0 6c 6c 6f 77 65 64 20 62 79 20 61 6e 79 20 4f 52  llowed by any OR
227c0 44 45 52 20 42 59 2c 20 4c 49 4d 49 54 20 61 6e  DER BY, LIMIT an
227d0 64 2f 6f 72 20 4f 46 46 53 45 54 20 63 6c 61 75  d/or OFFSET clau
227e0 73 65 73 2e 20 54 68 69 73 20 62 6c 6f 63 6b 0a  ses. This block.
227f0 20 20 2a 2a 20 63 72 65 61 74 65 73 20 4e 2d 31    ** creates N-1
22800 20 63 6f 70 69 65 73 20 6f 66 20 74 68 65 20 70   copies of the p
22810 61 72 65 6e 74 20 71 75 65 72 79 20 77 69 74 68  arent query with
22820 6f 75 74 20 61 6e 79 20 4f 52 44 45 52 20 42 59  out any ORDER BY
22830 2c 20 4c 49 4d 49 54 20 6f 72 20 0a 20 20 2a 2a  , LIMIT or .  **
22840 20 4f 46 46 53 45 54 20 63 6c 61 75 73 65 73 20   OFFSET clauses 
22850 61 6e 64 20 6a 6f 69 6e 73 20 74 68 65 6d 20 74  and joins them t
22860 6f 20 74 68 65 20 6c 65 66 74 2d 68 61 6e 64 2d  o the left-hand-
22870 73 69 64 65 20 6f 66 20 74 68 65 20 6f 72 69 67  side of the orig
22880 69 6e 61 6c 0a 20 20 2a 2a 20 75 73 69 6e 67 20  inal.  ** using 
22890 55 4e 49 4f 4e 20 41 4c 4c 20 6f 70 65 72 61 74  UNION ALL operat
228a0 6f 72 73 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ors. In this cas
228b0 65 20 4e 20 69 73 20 74 68 65 20 6e 75 6d 62 65  e N is the numbe
228c0 72 20 6f 66 20 73 69 6d 70 6c 65 0a 20 20 2a 2a  r of simple.  **
228d0 20 73 65 6c 65 63 74 20 73 74 61 74 65 6d 65 6e   select statemen
228e0 74 73 20 69 6e 20 74 68 65 20 63 6f 6d 70 6f 75  ts in the compou
228f0 6e 64 20 73 75 62 2d 71 75 65 72 79 2e 0a 20 20  nd sub-query..  
22900 2a 2a 0a 20 20 2a 2a 20 45 78 61 6d 70 6c 65 3a  **.  ** Example:
22910 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 53  .  **.  **     S
22920 45 4c 45 43 54 20 61 2b 31 20 46 52 4f 4d 20 28  ELECT a+1 FROM (
22930 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 53 45 4c  .  **        SEL
22940 45 43 54 20 78 20 46 52 4f 4d 20 74 61 62 0a 20  ECT x FROM tab. 
22950 20 2a 2a 20 20 20 20 20 20 20 20 55 4e 49 4f 4e   **        UNION
22960 20 41 4c 4c 0a 20 20 2a 2a 20 20 20 20 20 20 20   ALL.  **       
22970 20 53 45 4c 45 43 54 20 79 20 46 52 4f 4d 20 74   SELECT y 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 61 62 73 28       SELECT abs(
229b0 7a 2a 32 29 20 46 52 4f 4d 20 74 61 62 32 0a 20  z*2) FROM tab2. 
229c0 20 2a 2a 20 20 20 20 20 29 20 57 48 45 52 45 20   **     ) WHERE 
229d0 61 21 3d 35 20 4f 52 44 45 52 20 42 59 20 31 0a  a!=5 ORDER BY 1.
229e0 20 20 2a 2a 0a 20 20 2a 2a 20 54 72 61 6e 73 66    **.  ** Transf
229f0 6f 72 6d 65 64 20 69 6e 74 6f 3a 0a 20 20 2a 2a  ormed into:.  **
22a00 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c 45 43 54  .  **     SELECT
22a10 20 78 2b 31 20 46 52 4f 4d 20 74 61 62 20 57 48   x+1 FROM tab WH
22a20 45 52 45 20 78 2b 31 21 3d 35 0a 20 20 2a 2a 20  ERE x+1!=5.  ** 
22a30 20 20 20 20 55 4e 49 4f 4e 20 41 4c 4c 0a 20 20      UNION ALL.  
22a40 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 79 2b  **     SELECT y+
22a50 31 20 46 52 4f 4d 20 74 61 62 20 57 48 45 52 45  1 FROM tab WHERE
22a60 20 79 2b 31 21 3d 35 0a 20 20 2a 2a 20 20 20 20   y+1!=5.  **    
22a70 20 55 4e 49 4f 4e 20 41 4c 4c 0a 20 20 2a 2a 20   UNION ALL.  ** 
22a80 20 20 20 20 53 45 4c 45 43 54 20 61 62 73 28 7a      SELECT abs(z
22a90 2a 32 29 2b 31 20 46 52 4f 4d 20 74 61 62 32 20  *2)+1 FROM tab2 
22aa0 57 48 45 52 45 20 61 62 73 28 7a 2a 32 29 2b 31  WHERE abs(z*2)+1
22ab0 21 3d 35 0a 20 20 2a 2a 20 20 20 20 20 4f 52 44  !=5.  **     ORD
22ac0 45 52 20 42 59 20 31 0a 20 20 2a 2a 0a 20 20 2a  ER BY 1.  **.  *
22ad0 2a 20 57 65 20 63 61 6c 6c 20 74 68 69 73 20 74  * We call this t
22ae0 68 65 20 22 63 6f 6d 70 6f 75 6e 64 2d 73 75 62  he "compound-sub
22af0 71 75 65 72 79 20 66 6c 61 74 74 65 6e 69 6e 67  query flattening
22b00 22 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 70 53  "..  */.  for(pS
22b10 75 62 3d 70 53 75 62 2d 3e 70 50 72 69 6f 72 3b  ub=pSub->pPrior;
22b20 20 70 53 75 62 3b 20 70 53 75 62 3d 70 53 75 62   pSub; pSub=pSub
22b30 2d 3e 70 50 72 69 6f 72 29 7b 0a 20 20 20 20 53  ->pPrior){.    S
22b40 65 6c 65 63 74 20 2a 70 4e 65 77 3b 0a 20 20 20  elect *pNew;.   
22b50 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65   ExprList *pOrde
22b60 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42  rBy = p->pOrderB
22b70 79 3b 0a 20 20 20 20 45 78 70 72 20 2a 70 4c 69  y;.    Expr *pLi
22b80 6d 69 74 20 3d 20 70 2d 3e 70 4c 69 6d 69 74 3b  mit = p->pLimit;
22b90 0a 20 20 20 20 53 65 6c 65 63 74 20 2a 70 50 72  .    Select *pPr
22ba0 69 6f 72 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b  ior = p->pPrior;
22bb0 0a 20 20 20 20 70 2d 3e 70 4f 72 64 65 72 42 79  .    p->pOrderBy
22bc0 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 70 53 72   = 0;.    p->pSr
22bd0 63 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 70 50  c = 0;.    p->pP
22be0 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20 70 2d  rior = 0;.    p-
22bf0 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20  >pLimit = 0;.   
22c00 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 53   pNew = sqlite3S
22c10 65 6c 65 63 74 44 75 70 28 64 62 2c 20 70 2c 20  electDup(db, p, 
22c20 30 29 3b 0a 20 20 20 20 70 2d 3e 70 4c 69 6d 69  0);.    p->pLimi
22c30 74 20 3d 20 70 4c 69 6d 69 74 3b 0a 20 20 20 20  t = pLimit;.    
22c40 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 70 4f  p->pOrderBy = pO
22c50 72 64 65 72 42 79 3b 0a 20 20 20 20 70 2d 3e 70  rderBy;.    p->p
22c60 53 72 63 20 3d 20 70 53 72 63 3b 0a 20 20 20 20  Src = pSrc;.    
22c70 70 2d 3e 6f 70 20 3d 20 54 4b 5f 41 4c 4c 3b 0a  p->op = TK_ALL;.
22c80 20 20 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20      if( pNew==0 
22c90 29 7b 0a 20 20 20 20 20 20 70 2d 3e 70 50 72 69  ){.      p->pPri
22ca0 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20  or = pPrior;.   
22cb0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 4e   }else{.      pN
22cc0 65 77 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50 72  ew->pPrior = pPr
22cd0 69 6f 72 3b 0a 20 20 20 20 20 20 69 66 28 20 70  ior;.      if( p
22ce0 50 72 69 6f 72 20 29 20 70 50 72 69 6f 72 2d 3e  Prior ) pPrior->
22cf0 70 4e 65 78 74 20 3d 20 70 4e 65 77 3b 0a 20 20  pNext = pNew;.  
22d00 20 20 20 20 70 4e 65 77 2d 3e 70 4e 65 78 74 20      pNew->pNext 
22d10 3d 20 70 3b 0a 20 20 20 20 20 20 70 2d 3e 70 50  = p;.      p->pP
22d20 72 69 6f 72 20 3d 20 70 4e 65 77 3b 0a 20 20 20  rior = pNew;.   
22d30 20 20 20 53 45 4c 45 43 54 54 52 41 43 45 28 32     SELECTTRACE(2
22d40 2c 70 50 61 72 73 65 2c 70 2c 28 22 63 6f 6d 70  ,pParse,p,("comp
22d50 6f 75 6e 64 2d 73 75 62 71 75 65 72 79 20 66 6c  ound-subquery fl
22d60 61 74 74 65 6e 65 72 22 0a 20 20 20 20 20 20 20  attener".       
22d70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22d80 20 20 20 20 20 20 20 22 20 63 72 65 61 74 65 73         " creates
22d90 20 25 75 20 61 73 20 70 65 65 72 5c 6e 22 2c 70   %u as peer\n",p
22da0 4e 65 77 2d 3e 73 65 6c 49 64 29 29 3b 0a 20 20  New->selId));.  
22db0 20 20 7d 0a 20 20 20 20 69 66 28 20 64 62 2d 3e    }.    if( db->
22dc0 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72  mallocFailed ) r
22dd0 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 0a 20 20  eturn 1;.  }..  
22de0 2f 2a 20 42 65 67 69 6e 20 66 6c 61 74 74 65 6e  /* Begin flatten
22df0 69 6e 67 20 74 68 65 20 69 46 72 6f 6d 2d 74 68  ing the iFrom-th
22e00 20 65 6e 74 72 79 20 6f 66 20 74 68 65 20 46 52   entry of the FR
22e10 4f 4d 20 63 6c 61 75 73 65 20 0a 20 20 2a 2a 20  OM clause .  ** 
22e20 69 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  in the outer que
22e30 72 79 2e 0a 20 20 2a 2f 0a 20 20 70 53 75 62 20  ry..  */.  pSub 
22e40 3d 20 70 53 75 62 31 20 3d 20 70 53 75 62 69 74  = pSub1 = pSubit
22e50 65 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a 0a 20 20  em->pSelect;..  
22e60 2f 2a 20 44 65 6c 65 74 65 20 74 68 65 20 74 72  /* Delete the tr
22e70 61 6e 73 69 65 6e 74 20 74 61 62 6c 65 20 73 74  ansient table st
22e80 72 75 63 74 75 72 65 20 61 73 73 6f 63 69 61 74  ructure associat
22e90 65 64 20 77 69 74 68 20 74 68 65 0a 20 20 2a 2a  ed with the.  **
22ea0 20 73 75 62 71 75 65 72 79 0a 20 20 2a 2f 0a 20   subquery.  */. 
22eb0 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
22ec0 62 2c 20 70 53 75 62 69 74 65 6d 2d 3e 7a 44 61  b, pSubitem->zDa
22ed0 74 61 62 61 73 65 29 3b 0a 20 20 73 71 6c 69 74  tabase);.  sqlit
22ee0 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 53 75  e3DbFree(db, pSu
22ef0 62 69 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20  bitem->zName);. 
22f00 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
22f10 62 2c 20 70 53 75 62 69 74 65 6d 2d 3e 7a 41 6c  b, pSubitem->zAl
22f20 69 61 73 29 3b 0a 20 20 70 53 75 62 69 74 65 6d  ias);.  pSubitem
22f30 2d 3e 7a 44 61 74 61 62 61 73 65 20 3d 20 30 3b  ->zDatabase = 0;
22f40 0a 20 20 70 53 75 62 69 74 65 6d 2d 3e 7a 4e 61  .  pSubitem->zNa
22f50 6d 65 20 3d 20 30 3b 0a 20 20 70 53 75 62 69 74  me = 0;.  pSubit
22f60 65 6d 2d 3e 7a 41 6c 69 61 73 20 3d 20 30 3b 0a  em->zAlias = 0;.
22f70 20 20 70 53 75 62 69 74 65 6d 2d 3e 70 53 65 6c    pSubitem->pSel
22f80 65 63 74 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 44  ect = 0;..  /* D
22f90 65 66 65 72 20 64 65 6c 65 74 69 6e 67 20 74 68  efer deleting th
22fa0 65 20 54 61 62 6c 65 20 6f 62 6a 65 63 74 20 61  e Table object a
22fb0 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74  ssociated with t
22fc0 68 65 0a 20 20 2a 2a 20 73 75 62 71 75 65 72 79  he.  ** subquery
22fd0 20 75 6e 74 69 6c 20 63 6f 64 65 20 67 65 6e 65   until code gene
22fe0 72 61 74 69 6f 6e 20 69 73 0a 20 20 2a 2a 20 63  ration is.  ** c
22ff0 6f 6d 70 6c 65 74 65 2c 20 73 69 6e 63 65 20 74  omplete, since t
23000 68 65 72 65 20 6d 61 79 20 73 74 69 6c 6c 20 65  here may still e
23010 78 69 73 74 20 45 78 70 72 2e 70 54 61 62 20 65  xist Expr.pTab e
23020 6e 74 72 69 65 73 20 74 68 61 74 0a 20 20 2a 2a  ntries that.  **
23030 20 72 65 66 65 72 20 74 6f 20 74 68 65 20 73 75   refer to the su
23040 62 71 75 65 72 79 20 65 76 65 6e 20 61 66 74 65  bquery even afte
23050 72 20 66 6c 61 74 74 65 6e 69 6e 67 2e 20 20 54  r flattening.  T
23060 69 63 6b 65 74 20 23 33 33 34 36 2e 0a 20 20 2a  icket #3346..  *
23070 2a 0a 20 20 2a 2a 20 70 53 75 62 69 74 65 6d 2d  *.  ** pSubitem-
23080 3e 70 54 61 62 20 69 73 20 61 6c 77 61 79 73 20  >pTab is always 
23090 6e 6f 6e 2d 4e 55 4c 4c 20 62 79 20 74 65 73 74  non-NULL by test
230a0 20 72 65 73 74 72 69 63 74 69 6f 6e 73 20 61 6e   restrictions an
230b0 64 20 74 65 73 74 73 20 61 62 6f 76 65 2e 0a 20  d tests above.. 
230c0 20 2a 2f 0a 20 20 69 66 28 20 41 4c 57 41 59 53   */.  if( ALWAYS
230d0 28 70 53 75 62 69 74 65 6d 2d 3e 70 54 61 62 21  (pSubitem->pTab!
230e0 3d 30 29 20 29 7b 0a 20 20 20 20 54 61 62 6c 65  =0) ){.    Table
230f0 20 2a 70 54 61 62 54 6f 44 65 6c 20 3d 20 70 53   *pTabToDel = pS
23100 75 62 69 74 65 6d 2d 3e 70 54 61 62 3b 0a 20 20  ubitem->pTab;.  
23110 20 20 69 66 28 20 70 54 61 62 54 6f 44 65 6c 2d    if( pTabToDel-
23120 3e 6e 54 61 62 52 65 66 3d 3d 31 20 29 7b 0a 20  >nTabRef==1 ){. 
23130 20 20 20 20 20 50 61 72 73 65 20 2a 70 54 6f 70       Parse *pTop
23140 6c 65 76 65 6c 20 3d 20 73 71 6c 69 74 65 33 50  level = sqlite3P
23150 61 72 73 65 54 6f 70 6c 65 76 65 6c 28 70 50 61  arseToplevel(pPa
23160 72 73 65 29 3b 0a 20 20 20 20 20 20 70 54 61 62  rse);.      pTab
23170 54 6f 44 65 6c 2d 3e 70 4e 65 78 74 5a 6f 6d 62  ToDel->pNextZomb
23180 69 65 20 3d 20 70 54 6f 70 6c 65 76 65 6c 2d 3e  ie = pToplevel->
23190 70 5a 6f 6d 62 69 65 54 61 62 3b 0a 20 20 20 20  pZombieTab;.    
231a0 20 20 70 54 6f 70 6c 65 76 65 6c 2d 3e 70 5a 6f    pToplevel->pZo
231b0 6d 62 69 65 54 61 62 20 3d 20 70 54 61 62 54 6f  mbieTab = pTabTo
231c0 44 65 6c 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  Del;.    }else{.
231d0 20 20 20 20 20 20 70 54 61 62 54 6f 44 65 6c 2d        pTabToDel-
231e0 3e 6e 54 61 62 52 65 66 2d 2d 3b 0a 20 20 20 20  >nTabRef--;.    
231f0 7d 0a 20 20 20 20 70 53 75 62 69 74 65 6d 2d 3e  }.    pSubitem->
23200 70 54 61 62 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20  pTab = 0;.  }.. 
23210 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e   /* The followin
23220 67 20 6c 6f 6f 70 20 72 75 6e 73 20 6f 6e 63 65  g loop runs once
23230 20 66 6f 72 20 65 61 63 68 20 74 65 72 6d 20 69   for each term i
23240 6e 20 61 20 63 6f 6d 70 6f 75 6e 64 2d 73 75 62  n a compound-sub
23250 71 75 65 72 79 0a 20 20 2a 2a 20 66 6c 61 74 74  query.  ** flatt
23260 65 6e 69 6e 67 20 28 61 73 20 64 65 73 63 72 69  ening (as descri
23270 62 65 64 20 61 62 6f 76 65 29 2e 20 20 49 66 20  bed above).  If 
23280 77 65 20 61 72 65 20 64 6f 69 6e 67 20 61 20 64  we are doing a d
23290 69 66 66 65 72 65 6e 74 20 6b 69 6e 64 0a 20 20  ifferent kind.  
232a0 2a 2a 20 6f 66 20 66 6c 61 74 74 65 6e 69 6e 67  ** of flattening
232b0 20 2d 20 61 20 66 6c 61 74 74 65 6e 69 6e 67 20   - a flattening 
232c0 6f 74 68 65 72 20 74 68 61 6e 20 61 20 63 6f 6d  other than a com
232d0 70 6f 75 6e 64 2d 73 75 62 71 75 65 72 79 20 66  pound-subquery f
232e0 6c 61 74 74 65 6e 69 6e 67 20 2d 0a 20 20 2a 2a  lattening -.  **
232f0 20 74 68 65 6e 20 74 68 69 73 20 6c 6f 6f 70 20   then this loop 
23300 6f 6e 6c 79 20 72 75 6e 73 20 6f 6e 63 65 2e 0a  only runs once..
23310 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20 6c    **.  ** This l
23320 6f 6f 70 20 6d 6f 76 65 73 20 61 6c 6c 20 6f 66  oop moves all of
23330 20 74 68 65 20 46 52 4f 4d 20 65 6c 65 6d 65 6e   the FROM elemen
23340 74 73 20 6f 66 20 74 68 65 20 73 75 62 71 75 65  ts of the subque
23350 72 79 20 69 6e 74 6f 20 74 68 65 0a 20 20 2a 2a  ry into the.  **
23360 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
23370 20 6f 66 20 74 68 65 20 6f 75 74 65 72 20 71 75   of the outer qu
23380 65 72 79 2e 20 20 42 65 66 6f 72 65 20 64 6f 69  ery.  Before doi
23390 6e 67 20 74 68 69 73 2c 20 72 65 6d 65 6d 62 65  ng this, remembe
233a0 72 0a 20 20 2a 2a 20 74 68 65 20 63 75 72 73 6f  r.  ** the curso
233b0 72 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65  r number for the
233c0 20 6f 72 69 67 69 6e 61 6c 20 6f 75 74 65 72 20   original outer 
233d0 71 75 65 72 79 20 46 52 4f 4d 20 65 6c 65 6d 65  query FROM eleme
233e0 6e 74 20 69 6e 0a 20 20 2a 2a 20 69 50 61 72 65  nt in.  ** iPare
233f0 6e 74 2e 20 20 54 68 65 20 69 50 61 72 65 6e 74  nt.  The iParent
23400 20 63 75 72 73 6f 72 20 77 69 6c 6c 20 6e 65 76   cursor will nev
23410 65 72 20 62 65 20 75 73 65 64 2e 20 20 53 75 62  er be used.  Sub
23420 73 65 71 75 65 6e 74 20 63 6f 64 65 0a 20 20 2a  sequent code.  *
23430 2a 20 77 69 6c 6c 20 73 63 61 6e 20 65 78 70 72  * will scan expr
23440 65 73 73 69 6f 6e 73 20 6c 6f 6f 6b 69 6e 67 20  essions looking 
23450 66 6f 72 20 69 50 61 72 65 6e 74 20 72 65 66 65  for iParent refe
23460 72 65 6e 63 65 73 20 61 6e 64 20 72 65 70 6c 61  rences and repla
23470 63 65 0a 20 20 2a 2a 20 74 68 6f 73 65 20 72 65  ce.  ** those re
23480 66 65 72 65 6e 63 65 73 20 77 69 74 68 20 65 78  ferences with ex
23490 70 72 65 73 73 69 6f 6e 73 20 74 68 61 74 20 72  pressions that r
234a0 65 73 6f 6c 76 65 20 74 6f 20 74 68 65 20 73 75  esolve to the su
234b0 62 71 75 65 72 79 20 46 52 4f 4d 0a 20 20 2a 2a  bquery FROM.  **
234c0 20 65 6c 65 6d 65 6e 74 73 20 77 65 20 61 72 65   elements we are
234d0 20 6e 6f 77 20 63 6f 70 79 69 6e 67 20 69 6e 2e   now copying in.
234e0 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 70 50 61 72  .  */.  for(pPar
234f0 65 6e 74 3d 70 3b 20 70 50 61 72 65 6e 74 3b 20  ent=p; pParent; 
23500 70 50 61 72 65 6e 74 3d 70 50 61 72 65 6e 74 2d  pParent=pParent-
23510 3e 70 50 72 69 6f 72 2c 20 70 53 75 62 3d 70 53  >pPrior, pSub=pS
23520 75 62 2d 3e 70 50 72 69 6f 72 29 7b 0a 20 20 20  ub->pPrior){.   
23530 20 69 6e 74 20 6e 53 75 62 53 72 63 3b 0a 20 20   int nSubSrc;.  
23540 20 20 75 38 20 6a 6f 69 6e 74 79 70 65 20 3d 20    u8 jointype = 
23550 30 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  0;.    assert( p
23560 53 75 62 21 3d 30 20 29 3b 0a 20 20 20 20 70 53  Sub!=0 );.    pS
23570 75 62 53 72 63 20 3d 20 70 53 75 62 2d 3e 70 53  ubSrc = pSub->pS
23580 72 63 3b 20 20 20 20 20 2f 2a 20 46 52 4f 4d 20  rc;     /* FROM 
23590 63 6c 61 75 73 65 20 6f 66 20 73 75 62 71 75 65  clause of subque
235a0 72 79 20 2a 2f 0a 20 20 20 20 6e 53 75 62 53 72  ry */.    nSubSr
235b0 63 20 3d 20 70 53 75 62 53 72 63 2d 3e 6e 53 72  c = pSubSrc->nSr
235c0 63 3b 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66  c;  /* Number of
235d0 20 74 65 72 6d 73 20 69 6e 20 73 75 62 71 75 65   terms in subque
235e0 72 79 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a  ry FROM clause *
235f0 2f 0a 20 20 20 20 70 53 72 63 20 3d 20 70 50 61  /.    pSrc = pPa
23600 72 65 6e 74 2d 3e 70 53 72 63 3b 20 20 20 20 20  rent->pSrc;     
23610 2f 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f  /* FROM clause o
23620 66 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  f the outer quer
23630 79 20 2a 2f 0a 0a 20 20 20 20 69 66 28 20 70 53  y */..    if( pS
23640 72 63 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  rc ){.      asse
23650 72 74 28 20 70 50 61 72 65 6e 74 3d 3d 70 20 29  rt( pParent==p )
23660 3b 20 20 2f 2a 20 46 69 72 73 74 20 74 69 6d 65  ;  /* First time
23670 20 74 68 72 6f 75 67 68 20 74 68 65 20 6c 6f 6f   through the loo
23680 70 20 2a 2f 0a 20 20 20 20 20 20 6a 6f 69 6e 74  p */.      joint
23690 79 70 65 20 3d 20 70 53 75 62 69 74 65 6d 2d 3e  ype = pSubitem->
236a0 66 67 2e 6a 6f 69 6e 74 79 70 65 3b 0a 20 20 20  fg.jointype;.   
236b0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73   }else{.      as
236c0 73 65 72 74 28 20 70 50 61 72 65 6e 74 21 3d 70  sert( pParent!=p
236d0 20 29 3b 20 20 2f 2a 20 32 6e 64 20 61 6e 64 20   );  /* 2nd and 
236e0 73 75 62 73 65 71 75 65 6e 74 20 74 69 6d 65 73  subsequent times
236f0 20 74 68 72 6f 75 67 68 20 74 68 65 20 6c 6f 6f   through the loo
23700 70 20 2a 2f 0a 20 20 20 20 20 20 70 53 72 63 20  p */.      pSrc 
23710 3d 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74  = sqlite3SrcList
23720 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20 30  Append(pParse, 0
23730 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 69  , 0, 0);.      i
23740 66 28 20 70 53 72 63 3d 3d 30 20 29 20 62 72 65  f( pSrc==0 ) bre
23750 61 6b 3b 0a 20 20 20 20 20 20 70 50 61 72 65 6e  ak;.      pParen
23760 74 2d 3e 70 53 72 63 20 3d 20 70 53 72 63 3b 0a  t->pSrc = pSrc;.
23770 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 54 68      }..    /* Th
23780 65 20 73 75 62 71 75 65 72 79 20 75 73 65 73 20  e subquery uses 
23790 61 20 73 69 6e 67 6c 65 20 73 6c 6f 74 20 6f 66  a single slot of
237a0 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
237b0 20 6f 66 20 74 68 65 20 6f 75 74 65 72 0a 20 20   of the outer.  
237c0 20 20 2a 2a 20 71 75 65 72 79 2e 20 20 49 66 20    ** query.  If 
237d0 74 68 65 20 73 75 62 71 75 65 72 79 20 68 61 73  the subquery has
237e0 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 65   more than one e
237f0 6c 65 6d 65 6e 74 20 69 6e 20 69 74 73 20 46 52  lement in its FR
23800 4f 4d 20 63 6c 61 75 73 65 2c 0a 20 20 20 20 2a  OM clause,.    *
23810 2a 20 74 68 65 6e 20 65 78 70 61 6e 64 20 74 68  * then expand th
23820 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 74 6f  e outer query to
23830 20 6d 61 6b 65 20 73 70 61 63 65 20 66 6f 72 20   make space for 
23840 69 74 20 74 6f 20 68 6f 6c 64 20 61 6c 6c 20 65  it to hold all e
23850 6c 65 6d 65 6e 74 73 0a 20 20 20 20 2a 2a 20 6f  lements.    ** o
23860 66 20 74 68 65 20 73 75 62 71 75 65 72 79 2e 0a  f the subquery..
23870 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 45 78      **.    ** Ex
23880 61 6d 70 6c 65 3a 0a 20 20 20 20 2a 2a 0a 20 20  ample:.    **.  
23890 20 20 2a 2a 20 20 20 20 53 45 4c 45 43 54 20 2a    **    SELECT *
238a0 20 46 52 4f 4d 20 74 61 62 41 2c 20 28 53 45 4c   FROM tabA, (SEL
238b0 45 43 54 20 2a 20 46 52 4f 4d 20 73 75 62 31 2c  ECT * FROM sub1,
238c0 20 73 75 62 32 29 2c 20 74 61 62 42 3b 0a 20 20   sub2), tabB;.  
238d0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20    **.    ** The 
238e0 6f 75 74 65 72 20 71 75 65 72 79 20 68 61 73 20  outer query has 
238f0 33 20 73 6c 6f 74 73 20 69 6e 20 69 74 73 20 46  3 slots in its F
23900 52 4f 4d 20 63 6c 61 75 73 65 2e 20 20 4f 6e 65  ROM clause.  One
23910 20 73 6c 6f 74 20 6f 66 20 74 68 65 0a 20 20 20   slot of the.   
23920 20 2a 2a 20 6f 75 74 65 72 20 71 75 65 72 79 20   ** outer query 
23930 28 74 68 65 20 6d 69 64 64 6c 65 20 73 6c 6f 74  (the middle slot
23940 29 20 69 73 20 75 73 65 64 20 62 79 20 74 68 65  ) is used by the
23950 20 73 75 62 71 75 65 72 79 2e 20 20 54 68 65 20   subquery.  The 
23960 6e 65 78 74 0a 20 20 20 20 2a 2a 20 62 6c 6f 63  next.    ** bloc
23970 6b 20 6f 66 20 63 6f 64 65 20 77 69 6c 6c 20 65  k of code will e
23980 78 70 61 6e 64 20 74 68 65 20 6f 75 74 65 72 20  xpand the outer 
23990 71 75 65 72 79 20 46 52 4f 4d 20 63 6c 61 75 73  query FROM claus
239a0 65 20 74 6f 20 34 20 73 6c 6f 74 73 2e 0a 20 20  e to 4 slots..  
239b0 20 20 2a 2a 20 54 68 65 20 6d 69 64 64 6c 65 20    ** The middle 
239c0 73 6c 6f 74 20 69 73 20 65 78 70 61 6e 64 65 64  slot is expanded
239d0 20 74 6f 20 74 77 6f 20 73 6c 6f 74 73 20 69 6e   to two slots in
239e0 20 6f 72 64 65 72 20 74 6f 20 6d 61 6b 65 20 73   order to make s
239f0 70 61 63 65 0a 20 20 20 20 2a 2a 20 66 6f 72 20  pace.    ** for 
23a00 74 68 65 20 74 77 6f 20 65 6c 65 6d 65 6e 74 73  the two elements
23a10 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   in the FROM cla
23a20 75 73 65 20 6f 66 20 74 68 65 20 73 75 62 71 75  use of the subqu
23a30 65 72 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ery..    */.    
23a40 69 66 28 20 6e 53 75 62 53 72 63 3e 31 20 29 7b  if( nSubSrc>1 ){
23a50 0a 20 20 20 20 20 20 70 53 72 63 20 3d 20 73 71  .      pSrc = sq
23a60 6c 69 74 65 33 53 72 63 4c 69 73 74 45 6e 6c 61  lite3SrcListEnla
23a70 72 67 65 28 70 50 61 72 73 65 2c 20 70 53 72 63  rge(pParse, pSrc
23a80 2c 20 6e 53 75 62 53 72 63 2d 31 2c 69 46 72 6f  , nSubSrc-1,iFro
23a90 6d 2b 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20  m+1);.      if( 
23aa0 70 53 72 63 3d 3d 30 20 29 20 62 72 65 61 6b 3b  pSrc==0 ) break;
23ab0 0a 20 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e  .      pParent->
23ac0 70 53 72 63 20 3d 20 70 53 72 63 3b 0a 20 20 20  pSrc = pSrc;.   
23ad0 20 7d 0a 0a 20 20 20 20 2f 2a 20 54 72 61 6e 73   }..    /* Trans
23ae0 66 65 72 20 74 68 65 20 46 52 4f 4d 20 63 6c 61  fer the FROM cla
23af0 75 73 65 20 74 65 72 6d 73 20 66 72 6f 6d 20 74  use terms from t
23b00 68 65 20 73 75 62 71 75 65 72 79 20 69 6e 74 6f  he subquery into
23b10 20 74 68 65 0a 20 20 20 20 2a 2a 20 6f 75 74 65   the.    ** oute
23b20 72 20 71 75 65 72 79 2e 0a 20 20 20 20 2a 2f 0a  r query..    */.
23b30 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
23b40 53 75 62 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20  SubSrc; i++){.  
23b50 20 20 20 20 73 71 6c 69 74 65 33 49 64 4c 69 73      sqlite3IdLis
23b60 74 44 65 6c 65 74 65 28 64 62 2c 20 70 53 72 63  tDelete(db, pSrc
23b70 2d 3e 61 5b 69 2b 69 46 72 6f 6d 5d 2e 70 55 73  ->a[i+iFrom].pUs
23b80 69 6e 67 29 3b 0a 20 20 20 20 20 20 61 73 73 65  ing);.      asse
23b90 72 74 28 20 70 53 72 63 2d 3e 61 5b 69 2b 69 46  rt( pSrc->a[i+iF
23ba0 72 6f 6d 5d 2e 66 67 2e 69 73 54 61 62 46 75 6e  rom].fg.isTabFun
23bb0 63 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 53  c==0 );.      pS
23bc0 72 63 2d 3e 61 5b 69 2b 69 46 72 6f 6d 5d 20 3d  rc->a[i+iFrom] =
23bd0 20 70 53 75 62 53 72 63 2d 3e 61 5b 69 5d 3b 0a   pSubSrc->a[i];.
23be0 20 20 20 20 20 20 69 4e 65 77 50 61 72 65 6e 74        iNewParent
23bf0 20 3d 20 70 53 75 62 53 72 63 2d 3e 61 5b 69 5d   = pSubSrc->a[i]
23c00 2e 69 43 75 72 73 6f 72 3b 0a 20 20 20 20 20 20  .iCursor;.      
23c10 6d 65 6d 73 65 74 28 26 70 53 75 62 53 72 63 2d  memset(&pSubSrc-
23c20 3e 61 5b 69 5d 2c 20 30 2c 20 73 69 7a 65 6f 66  >a[i], 0, sizeof
23c30 28 70 53 75 62 53 72 63 2d 3e 61 5b 69 5d 29 29  (pSubSrc->a[i]))
23c40 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 53 72 63  ;.    }.    pSrc
23c50 2d 3e 61 5b 69 46 72 6f 6d 5d 2e 66 67 2e 6a 6f  ->a[iFrom].fg.jo
23c60 69 6e 74 79 70 65 20 3d 20 6a 6f 69 6e 74 79 70  intype = jointyp
23c70 65 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 4e 6f 77  e;.  .    /* Now
23c80 20 62 65 67 69 6e 20 73 75 62 73 74 69 74 75 74   begin substitut
23c90 69 6e 67 20 73 75 62 71 75 65 72 79 20 72 65 73  ing subquery res
23ca0 75 6c 74 20 73 65 74 20 65 78 70 72 65 73 73 69  ult set expressi
23cb0 6f 6e 73 20 66 6f 72 20 0a 20 20 20 20 2a 2a 20  ons for .    ** 
23cc0 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68  references to th
23cd0 65 20 69 50 61 72 65 6e 74 20 69 6e 20 74 68 65  e iParent in the
23ce0 20 6f 75 74 65 72 20 71 75 65 72 79 2e 0a 20 20   outer query..  
23cf0 20 20 2a 2a 20 0a 20 20 20 20 2a 2a 20 45 78 61    ** .    ** Exa
23d00 6d 70 6c 65 3a 0a 20 20 20 20 2a 2a 0a 20 20 20  mple:.    **.   
23d10 20 2a 2a 20 20 20 53 45 4c 45 43 54 20 61 2b 35   **   SELECT a+5
23d20 2c 20 62 2a 31 30 20 46 52 4f 4d 20 28 53 45 4c  , b*10 FROM (SEL
23d30 45 43 54 20 78 2a 33 20 41 53 20 61 2c 20 79 2b  ECT x*3 AS a, y+
23d40 31 30 20 41 53 20 62 20 46 52 4f 4d 20 74 31 29  10 AS b FROM t1)
23d50 20 57 48 45 52 45 20 61 3e 62 3b 0a 20 20 20 20   WHERE a>b;.    
23d60 2a 2a 20 20 20 5c 20 20 20 20 20 20 20 20 20 20  **   \          
23d70 20 20 20 20 20 20 20 20 20 20 20 5c 5f 5f 5f 5f             \____
23d80 5f 5f 5f 5f 5f 5f 5f 5f 5f 20 73 75 62 71 75 65  _________ subque
23d90 72 79 20 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 20 20  ry __________/  
23da0 20 20 20 20 20 20 20 20 2f 0a 20 20 20 20 2a 2a          /.    **
23db0 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f      \___________
23dc0 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 20 6f 75 74 65 72  __________ outer
23dd0 20 71 75 65 72 79 20 5f 5f 5f 5f 5f 5f 5f 5f 5f   query _________
23de0 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
23df0 5f 5f 5f 5f 5f 2f 0a 20 20 20 20 2a 2a 0a 20 20  _____/.    **.  
23e00 20 20 2a 2a 20 57 65 20 6c 6f 6f 6b 20 61 74 20    ** We look at 
23e10 65 76 65 72 79 20 65 78 70 72 65 73 73 69 6f 6e  every expression
23e20 20 69 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75   in the outer qu
23e30 65 72 79 20 61 6e 64 20 65 76 65 72 79 20 70 6c  ery and every pl
23e40 61 63 65 20 77 65 20 73 65 65 0a 20 20 20 20 2a  ace we see.    *
23e50 2a 20 22 61 22 20 77 65 20 73 75 62 73 74 69 74  * "a" we substit
23e60 75 74 65 20 22 78 2a 33 22 20 61 6e 64 20 65 76  ute "x*3" and ev
23e70 65 72 79 20 70 6c 61 63 65 20 77 65 20 73 65 65  ery place we see
23e80 20 22 62 22 20 77 65 20 73 75 62 73 74 69 74 75   "b" we substitu
23e90 74 65 20 22 79 2b 31 30 22 2e 0a 20 20 20 20 2a  te "y+10"..    *
23ea0 2f 0a 20 20 20 20 69 66 28 20 70 53 75 62 2d 3e  /.    if( pSub->
23eb0 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20  pOrderBy ){.    
23ec0 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69    /* At this poi
23ed0 6e 74 2c 20 61 6e 79 20 6e 6f 6e 2d 7a 65 72 6f  nt, any non-zero
23ee0 20 69 4f 72 64 65 72 42 79 43 6f 6c 20 76 61 6c   iOrderByCol val
23ef0 75 65 73 20 69 6e 64 69 63 61 74 65 20 74 68 61  ues indicate tha
23f00 74 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 4f  t the.      ** O
23f10 52 44 45 52 20 42 59 20 63 6f 6c 75 6d 6e 20 65  RDER BY column e
23f20 78 70 72 65 73 73 69 6f 6e 20 69 73 20 69 64 65  xpression is ide
23f30 6e 74 69 63 61 6c 20 74 6f 20 74 68 65 20 69 4f  ntical to the iO
23f40 72 64 65 72 42 79 43 6f 6c 27 74 68 0a 20 20 20  rderByCol'th.   
23f50 20 20 20 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e     ** expression
23f60 20 72 65 74 75 72 6e 65 64 20 62 79 20 53 45 4c   returned by SEL
23f70 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 70 53  ECT statement pS
23f80 75 62 2e 20 53 69 6e 63 65 20 74 68 65 73 65 20  ub. Since these 
23f90 76 61 6c 75 65 73 0a 20 20 20 20 20 20 2a 2a 20  values.      ** 
23fa0 64 6f 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 69  do not necessari
23fb0 6c 79 20 63 6f 72 72 65 73 70 6f 6e 64 20 74 6f  ly correspond to
23fc0 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 53 45 4c 45   columns in SELE
23fd0 43 54 20 73 74 61 74 65 6d 65 6e 74 20 70 50 61  CT statement pPa
23fe0 72 65 6e 74 2c 0a 20 20 20 20 20 20 2a 2a 20 7a  rent,.      ** z
23ff0 65 72 6f 20 74 68 65 6d 20 62 65 66 6f 72 65 20  ero them before 
24000 74 72 61 6e 73 66 65 72 69 6e 67 20 74 68 65 20  transfering the 
24010 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 2e  ORDER BY clause.
24020 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
24030 2a 2a 20 4e 6f 74 20 64 6f 69 6e 67 20 74 68 69  ** Not doing thi
24040 73 20 6d 61 79 20 63 61 75 73 65 20 61 6e 20 65  s may cause an e
24050 72 72 6f 72 20 69 66 20 61 20 73 75 62 73 65 71  rror if a subseq
24060 75 65 6e 74 20 63 61 6c 6c 20 74 6f 20 74 68 69  uent call to thi
24070 73 0a 20 20 20 20 20 20 2a 2a 20 66 75 6e 63 74  s.      ** funct
24080 69 6f 6e 20 61 74 74 65 6d 70 74 73 20 74 6f 20  ion attempts to 
24090 66 6c 61 74 74 65 6e 20 61 20 63 6f 6d 70 6f 75  flatten a compou
240a0 6e 64 20 73 75 62 2d 71 75 65 72 79 20 69 6e 74  nd sub-query int
240b0 6f 20 70 50 61 72 65 6e 74 0a 20 20 20 20 20 20  o pParent.      
240c0 2a 2a 20 28 74 68 65 20 6f 6e 6c 79 20 77 61 79  ** (the only way
240d0 20 74 68 69 73 20 63 61 6e 20 68 61 70 70 65 6e   this can happen
240e0 20 69 73 20 69 66 20 74 68 65 20 63 6f 6d 70 6f   is if the compo
240f0 75 6e 64 20 73 75 62 2d 71 75 65 72 79 20 69 73  und sub-query is
24100 0a 20 20 20 20 20 20 2a 2a 20 63 75 72 72 65 6e  .      ** curren
24110 74 6c 79 20 70 61 72 74 20 6f 66 20 70 53 75 62  tly part of pSub
24120 2d 3e 70 53 72 63 29 2e 20 53 65 65 20 74 69 63  ->pSrc). See tic
24130 6b 65 74 20 5b 64 31 31 61 36 65 39 30 38 66 5d  ket [d11a6e908f]
24140 2e 20 20 2a 2f 0a 20 20 20 20 20 20 45 78 70 72  .  */.      Expr
24150 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 20 3d  List *pOrderBy =
24160 20 70 53 75 62 2d 3e 70 4f 72 64 65 72 42 79 3b   pSub->pOrderBy;
24170 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
24180 69 3c 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70  i<pOrderBy->nExp
24190 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  r; i++){.       
241a0 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e   pOrderBy->a[i].
241b0 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 20  u.x.iOrderByCol 
241c0 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 0;.      }.   
241d0 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72 65     assert( pPare
241e0 6e 74 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20  nt->pOrderBy==0 
241f0 29 3b 0a 20 20 20 20 20 20 70 50 61 72 65 6e 74  );.      pParent
24200 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 70 4f 72  ->pOrderBy = pOr
24210 64 65 72 42 79 3b 0a 20 20 20 20 20 20 70 53 75  derBy;.      pSu
24220 62 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b  b->pOrderBy = 0;
24230 0a 20 20 20 20 7d 0a 20 20 20 20 70 57 68 65 72  .    }.    pWher
24240 65 20 3d 20 70 53 75 62 2d 3e 70 57 68 65 72 65  e = pSub->pWhere
24250 3b 0a 20 20 20 20 70 53 75 62 2d 3e 70 57 68 65  ;.    pSub->pWhe
24260 72 65 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20  re = 0;.    if( 
24270 69 73 4c 65 66 74 4a 6f 69 6e 3e 30 20 29 7b 0a  isLeftJoin>0 ){.
24280 20 20 20 20 20 20 73 65 74 4a 6f 69 6e 45 78 70        setJoinExp
24290 72 28 70 57 68 65 72 65 2c 20 69 4e 65 77 50 61  r(pWhere, iNewPa
242a0 72 65 6e 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20  rent);.    }.   
242b0 20 70 50 61 72 65 6e 74 2d 3e 70 57 68 65 72 65   pParent->pWhere
242c0 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e   = sqlite3ExprAn
242d0 64 28 70 50 61 72 73 65 2c 20 70 57 68 65 72 65  d(pParse, pWhere
242e0 2c 20 70 50 61 72 65 6e 74 2d 3e 70 57 68 65 72  , pParent->pWher
242f0 65 29 3b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e  e);.    if( db->
24300 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 3d 3d 30 20  mallocFailed==0 
24310 29 7b 0a 20 20 20 20 20 20 53 75 62 73 74 43 6f  ){.      SubstCo
24320 6e 74 65 78 74 20 78 3b 0a 20 20 20 20 20 20 78  ntext x;.      x
24330 2e 70 50 61 72 73 65 20 3d 20 70 50 61 72 73 65  .pParse = pParse
24340 3b 0a 20 20 20 20 20 20 78 2e 69 54 61 62 6c 65  ;.      x.iTable
24350 20 3d 20 69 50 61 72 65 6e 74 3b 0a 20 20 20 20   = iParent;.    
24360 20 20 78 2e 69 4e 65 77 54 61 62 6c 65 20 3d 20    x.iNewTable = 
24370 69 4e 65 77 50 61 72 65 6e 74 3b 0a 20 20 20 20  iNewParent;.    
24380 20 20 78 2e 69 73 4c 65 66 74 4a 6f 69 6e 20 3d    x.isLeftJoin =
24390 20 69 73 4c 65 66 74 4a 6f 69 6e 3b 0a 20 20 20   isLeftJoin;.   
243a0 20 20 20 78 2e 70 45 4c 69 73 74 20 3d 20 70 53     x.pEList = pS
243b0 75 62 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 20 20  ub->pEList;.    
243c0 20 20 73 75 62 73 74 53 65 6c 65 63 74 28 26 78    substSelect(&x
243d0 2c 20 70 50 61 72 65 6e 74 2c 20 30 29 3b 0a 20  , pParent, 0);. 
243e0 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 54     }.  .    /* T
243f0 68 65 20 66 6c 61 74 74 65 6e 65 64 20 71 75 65  he flattened que
24400 72 79 20 69 73 20 61 20 63 6f 6d 70 6f 75 6e 64  ry is a compound
24410 20 69 66 20 65 69 74 68 65 72 20 74 68 65 20 69   if either the i
24420 6e 6e 65 72 20 6f 72 20 74 68 65 0a 20 20 20 20  nner or the.    
24430 2a 2a 20 6f 75 74 65 72 20 71 75 65 72 79 20 69  ** outer query i
24440 73 20 61 20 63 6f 6d 70 6f 75 6e 64 2e 20 2a 2f  s a compound. */
24450 0a 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 73 65  .    pParent->se
24460 6c 46 6c 61 67 73 20 7c 3d 20 70 53 75 62 2d 3e  lFlags |= pSub->
24470 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 43 6f  selFlags & SF_Co
24480 6d 70 6f 75 6e 64 3b 0a 20 20 20 20 61 73 73 65  mpound;.    asse
24490 72 74 28 20 28 70 53 75 62 2d 3e 73 65 6c 46 6c  rt( (pSub->selFl
244a0 61 67 73 20 26 20 53 46 5f 44 69 73 74 69 6e 63  ags & SF_Distinc
244b0 74 29 3d 3d 30 20 29 3b 20 2f 2a 20 72 65 73 74  t)==0 ); /* rest
244c0 72 69 63 74 69 6f 6e 20 28 31 37 62 29 20 2a 2f  riction (17b) */
244d0 0a 20 20 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a  .  .    /*.    *
244e0 2a 20 53 45 4c 45 43 54 20 2e 2e 2e 20 46 52 4f  * SELECT ... FRO
244f0 4d 20 28 53 45 4c 45 43 54 20 2e 2e 2e 20 4c 49  M (SELECT ... LI
24500 4d 49 54 20 61 20 4f 46 46 53 45 54 20 62 29 20  MIT a OFFSET b) 
24510 4c 49 4d 49 54 20 78 20 4f 46 46 53 45 54 20 79  LIMIT x OFFSET y
24520 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ;.    **.    ** 
24530 4f 6e 65 20 69 73 20 74 65 6d 70 74 65 64 20 74  One is tempted t
24540 6f 20 74 72 79 20 74 6f 20 61 64 64 20 61 20 61  o try to add a a
24550 6e 64 20 62 20 74 6f 20 63 6f 6d 62 69 6e 65 20  nd b to combine 
24560 74 68 65 20 6c 69 6d 69 74 73 2e 20 20 42 75 74  the limits.  But
24570 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 64 6f 65   this.    ** doe
24580 73 20 6e 6f 74 20 77 6f 72 6b 20 69 66 20 65 69  s not work if ei
24590 74 68 65 72 20 6c 69 6d 69 74 20 69 73 20 6e 65  ther limit is ne
245a0 67 61 74 69 76 65 2e 0a 20 20 20 20 2a 2f 0a 20  gative..    */. 
245b0 20 20 20 69 66 28 20 70 53 75 62 2d 3e 70 4c 69     if( pSub->pLi
245c0 6d 69 74 20 29 7b 0a 20 20 20 20 20 20 70 50 61  mit ){.      pPa
245d0 72 65 6e 74 2d 3e 70 4c 69 6d 69 74 20 3d 20 70  rent->pLimit = p
245e0 53 75 62 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20 20  Sub->pLimit;.   
245f0 20 20 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20     pSub->pLimit 
24600 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  = 0;.    }.  }..
24610 20 20 2f 2a 20 46 69 6e 69 61 6c 6c 79 2c 20 64    /* Finially, d
24620 65 6c 65 74 65 20 77 68 61 74 20 69 73 20 6c 65  elete what is le
24630 66 74 20 6f 66 20 74 68 65 20 73 75 62 71 75 65  ft of the subque
24640 72 79 20 61 6e 64 20 72 65 74 75 72 6e 0a 20 20  ry and return.  
24650 2a 2a 20 73 75 63 63 65 73 73 2e 0a 20 20 2a 2f  ** success..  */
24660 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  .  sqlite3Select
24670 44 65 6c 65 74 65 28 64 62 2c 20 70 53 75 62 31  Delete(db, pSub1
24680 29 3b 0a 0a 23 69 66 20 53 45 4c 45 43 54 54 52  );..#if SELECTTR
24690 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20 69 66  ACE_ENABLED.  if
246a0 28 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 54  ( sqlite3SelectT
246b0 72 61 63 65 20 26 20 30 78 31 30 30 20 29 7b 0a  race & 0x100 ){.
246c0 20 20 20 20 53 45 4c 45 43 54 54 52 41 43 45 28      SELECTTRACE(
246d0 30 78 31 30 30 2c 70 50 61 72 73 65 2c 70 2c 28  0x100,pParse,p,(
246e0 22 41 66 74 65 72 20 66 6c 61 74 74 65 6e 69 6e  "After flattenin
246f0 67 3a 5c 6e 22 29 29 3b 0a 20 20 20 20 73 71 6c  g:\n"));.    sql
24700 69 74 65 33 54 72 65 65 56 69 65 77 53 65 6c 65  ite3TreeViewSele
24710 63 74 28 30 2c 20 70 2c 20 30 29 3b 0a 20 20 7d  ct(0, p, 0);.  }
24720 0a 23 65 6e 64 69 66 0a 0a 20 20 72 65 74 75 72  .#endif..  retur
24730 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  n 1;.}.#endif /*
24740 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
24750 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29 20  _OMIT_SUBQUERY) 
24760 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  || !defined(SQLI
24770 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20 2a 2f  TE_OMIT_VIEW) */
24780 0a 0a 2f 2a 0a 2a 2a 20 41 20 73 74 72 75 63 74  ../*.** A struct
24790 75 72 65 20 74 6f 20 6b 65 65 70 20 74 72 61 63  ure to keep trac
247a0 6b 20 6f 66 20 61 6c 6c 20 6f 66 20 74 68 65 20  k of all of the 
247b0 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 73 20 74 68  column values th
247c0 61 74 20 61 72 65 20 66 69 78 65 64 20 74 6f 0a  at are fixed to.
247d0 2a 2a 20 61 20 6b 6e 6f 77 6e 20 76 61 6c 75 65  ** a known value
247e0 20 64 75 65 20 74 6f 20 57 48 45 52 45 20 63 6c   due to WHERE cl
247f0 61 75 73 65 20 63 6f 6e 73 74 72 61 69 6e 74 73  ause constraints
24800 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 43 4f 4c   of the form COL
24810 55 4d 4e 3d 56 41 4c 55 45 2e 0a 2a 2f 0a 74 79  UMN=VALUE..*/.ty
24820 70 65 64 65 66 20 73 74 72 75 63 74 20 57 68 65  pedef struct Whe
24830 72 65 43 6f 6e 73 74 20 57 68 65 72 65 43 6f 6e  reConst WhereCon
24840 73 74 3b 0a 73 74 72 75 63 74 20 57 68 65 72 65  st;.struct Where
24850 43 6f 6e 73 74 20 7b 0a 20 20 50 61 72 73 65 20  Const {.  Parse 
24860 2a 70 50 61 72 73 65 3b 20 20 20 2f 2a 20 50 61  *pParse;   /* Pa
24870 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
24880 0a 20 20 69 6e 74 20 6e 43 6f 6e 73 74 3b 20 20  .  int nConst;  
24890 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 66 6f      /* Number fo
248a0 72 20 43 4f 4c 55 4d 4e 3d 43 4f 4e 53 54 41 4e  r COLUMN=CONSTAN
248b0 54 20 74 65 72 6d 73 20 2a 2f 0a 20 20 69 6e 74  T terms */.  int
248c0 20 6e 43 68 6e 67 3b 20 20 20 20 20 20 20 2f 2a   nChng;       /*
248d0 20 4e 75 6d 62 65 72 20 6f 66 20 74 69 6d 65 73   Number of times
248e0 20 61 20 63 6f 6e 73 74 61 6e 74 20 69 73 20 70   a constant is p
248f0 72 6f 70 61 67 61 74 65 64 20 2a 2f 0a 20 20 45  ropagated */.  E
24900 78 70 72 20 2a 2a 61 70 45 78 70 72 3b 20 20 20  xpr **apExpr;   
24910 2f 2a 20 5b 69 2a 32 5d 20 69 73 20 43 4f 4c 55  /* [i*2] is COLU
24920 4d 4e 20 61 6e 64 20 5b 69 2a 32 2b 31 5d 20 69  MN and [i*2+1] i
24930 73 20 56 41 4c 55 45 20 2a 2f 0a 7d 3b 0a 0a 2f  s VALUE */.};../
24940 2a 0a 2a 2a 20 41 64 64 20 61 20 6e 65 77 20 65  *.** Add a new e
24950 6e 74 72 79 20 74 6f 20 74 68 65 20 70 43 6f 6e  ntry to the pCon
24960 73 74 20 6f 62 6a 65 63 74 2e 20 20 45 78 63 65  st object.  Exce
24970 70 74 2c 20 64 6f 20 6e 6f 74 20 61 64 64 20 64  pt, do not add d
24980 75 70 6c 69 63 61 74 65 0a 2a 2a 20 70 43 6f 6c  uplicate.** pCol
24990 75 6d 6e 20 65 6e 74 69 72 65 73 2e 0a 2a 2f 0a  umn entires..*/.
249a0 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f 6e 73  static void cons
249b0 74 49 6e 73 65 72 74 28 0a 20 20 57 68 65 72 65  tInsert(.  Where
249c0 43 6f 6e 73 74 20 2a 70 43 6f 6e 73 74 2c 20 20  Const *pConst,  
249d0 20 20 20 20 2f 2a 20 54 68 65 20 57 68 65 72 65      /* The Where
249e0 43 6f 6e 73 74 20 69 6e 74 6f 20 77 68 69 63 68  Const into which
249f0 20 77 65 20 61 72 65 20 69 6e 73 65 72 74 69 6e   we are insertin
24a00 67 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 43 6f  g */.  Expr *pCo
24a10 6c 75 6d 6e 2c 20 20 20 20 20 20 20 20 20 20 20  lumn,           
24a20 2f 2a 20 54 68 65 20 43 4f 4c 55 4d 4e 20 70 61  /* The COLUMN pa
24a30 72 74 20 6f 66 20 74 68 65 20 63 6f 6e 73 74 72  rt of the constr
24a40 61 69 6e 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a  aint */.  Expr *
24a50 70 56 61 6c 75 65 20 20 20 20 20 20 20 20 20 20  pValue          
24a60 20 20 20 2f 2a 20 54 68 65 20 56 41 4c 55 45 20     /* The VALUE 
24a70 70 61 72 74 20 6f 66 20 74 68 65 20 63 6f 6e 73  part of the cons
24a80 74 72 61 69 6e 74 20 2a 2f 0a 29 7b 0a 20 20 69  traint */.){.  i
24a90 6e 74 20 69 3b 0a 20 20 61 73 73 65 72 74 28 20  nt i;.  assert( 
24aa0 70 43 6f 6c 75 6d 6e 2d 3e 6f 70 3d 3d 54 4b 5f  pColumn->op==TK_
24ab0 43 4f 4c 55 4d 4e 20 29 3b 0a 0a 20 20 2f 2a 20  COLUMN );..  /* 
24ac0 32 30 31 38 2d 31 30 2d 32 35 20 74 69 63 6b 65  2018-10-25 ticke
24ad0 74 20 5b 63 66 35 65 64 32 30 66 5d 0a 20 20 2a  t [cf5ed20f].  *
24ae0 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20  * Make sure the 
24af0 73 61 6d 65 20 70 43 6f 6c 75 6d 6e 20 69 73 20  same pColumn is 
24b00 6e 6f 74 20 69 6e 73 65 72 74 65 64 20 6d 6f 72  not inserted mor
24b10 65 20 74 68 61 6e 20 6f 6e 63 65 20 2a 2f 0a 20  e than once */. 
24b20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 43 6f 6e   for(i=0; i<pCon
24b30 73 74 2d 3e 6e 43 6f 6e 73 74 3b 20 69 2b 2b 29  st->nConst; i++)
24b40 7b 0a 20 20 20 20 63 6f 6e 73 74 20 45 78 70 72  {.    const Expr
24b50 20 2a 70 45 78 70 72 20 3d 20 70 43 6f 6e 73 74   *pExpr = pConst
24b60 2d 3e 61 70 45 78 70 72 5b 69 2a 32 5d 3b 0a 20  ->apExpr[i*2];. 
24b70 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72     assert( pExpr
24b80 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20  ->op==TK_COLUMN 
24b90 29 3b 0a 20 20 20 20 69 66 28 20 70 45 78 70 72  );.    if( pExpr
24ba0 2d 3e 69 54 61 62 6c 65 3d 3d 70 43 6f 6c 75 6d  ->iTable==pColum
24bb0 6e 2d 3e 69 54 61 62 6c 65 0a 20 20 20 20 20 26  n->iTable.     &
24bc0 26 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  & pExpr->iColumn
24bd0 3d 3d 70 43 6f 6c 75 6d 6e 2d 3e 69 43 6f 6c 75  ==pColumn->iColu
24be0 6d 6e 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  mn.    ){.      
24bf0 72 65 74 75 72 6e 3b 20 20 2f 2a 20 41 6c 72 65  return;  /* Alre
24c00 61 64 79 20 70 72 65 73 65 6e 74 2e 20 20 52 65  ady present.  Re
24c10 74 75 72 6e 20 77 69 74 68 6f 75 74 20 64 6f 69  turn without doi
24c20 6e 67 20 61 6e 79 74 68 69 6e 67 2e 20 2a 2f 0a  ng anything. */.
24c30 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 43 6f      }.  }..  pCo
24c40 6e 73 74 2d 3e 6e 43 6f 6e 73 74 2b 2b 3b 0a 20  nst->nConst++;. 
24c50 20 70 43 6f 6e 73 74 2d 3e 61 70 45 78 70 72 20   pConst->apExpr 
24c60 3d 20 73 71 6c 69 74 65 33 44 62 52 65 61 6c 6c  = sqlite3DbReall
24c70 6f 63 4f 72 46 72 65 65 28 70 43 6f 6e 73 74 2d  ocOrFree(pConst-
24c80 3e 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 43 6f  >pParse->db, pCo
24c90 6e 73 74 2d 3e 61 70 45 78 70 72 2c 0a 20 20 20  nst->apExpr,.   
24ca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24cb0 20 20 20 20 20 20 70 43 6f 6e 73 74 2d 3e 6e 43        pConst->nC
24cc0 6f 6e 73 74 2a 32 2a 73 69 7a 65 6f 66 28 45 78  onst*2*sizeof(Ex
24cd0 70 72 2a 29 29 3b 0a 20 20 69 66 28 20 70 43 6f  pr*));.  if( pCo
24ce0 6e 73 74 2d 3e 61 70 45 78 70 72 3d 3d 30 20 29  nst->apExpr==0 )
24cf0 7b 0a 20 20 20 20 70 43 6f 6e 73 74 2d 3e 6e 43  {.    pConst->nC
24d00 6f 6e 73 74 20 3d 20 30 3b 0a 20 20 7d 65 6c 73  onst = 0;.  }els
24d10 65 7b 0a 20 20 20 20 69 66 28 20 45 78 70 72 48  e{.    if( ExprH
24d20 61 73 50 72 6f 70 65 72 74 79 28 70 56 61 6c 75  asProperty(pValu
24d30 65 2c 20 45 50 5f 46 69 78 65 64 43 6f 6c 29 20  e, EP_FixedCol) 
24d40 29 20 70 56 61 6c 75 65 20 3d 20 70 56 61 6c 75  ) pValue = pValu
24d50 65 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20 70 43  e->pLeft;.    pC
24d60 6f 6e 73 74 2d 3e 61 70 45 78 70 72 5b 70 43 6f  onst->apExpr[pCo
24d70 6e 73 74 2d 3e 6e 43 6f 6e 73 74 2a 32 2d 32 5d  nst->nConst*2-2]
24d80 20 3d 20 70 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20   = pColumn;.    
24d90 70 43 6f 6e 73 74 2d 3e 61 70 45 78 70 72 5b 70  pConst->apExpr[p
24da0 43 6f 6e 73 74 2d 3e 6e 43 6f 6e 73 74 2a 32 2d  Const->nConst*2-
24db0 31 5d 20 3d 20 70 56 61 6c 75 65 3b 0a 20 20 7d  1] = pValue;.  }
24dc0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20 61  .}../*.** Find a
24dd0 6c 6c 20 74 65 72 6d 73 20 6f 66 20 43 4f 4c 55  ll terms of COLU
24de0 4d 4e 3d 56 41 4c 55 45 20 6f 72 20 56 41 4c 55  MN=VALUE or VALU
24df0 45 3d 43 4f 4c 55 4d 4e 20 69 6e 20 70 45 78 70  E=COLUMN in pExp
24e00 72 20 77 68 65 72 65 20 56 41 4c 55 45 0a 2a 2a  r where VALUE.**
24e10 20 69 73 20 61 20 63 6f 6e 73 74 61 6e 74 20 65   is a constant e
24e20 78 70 72 65 73 73 69 6f 6e 20 61 6e 64 20 77 68  xpression and wh
24e30 65 72 65 20 74 68 65 20 74 65 72 6d 20 6d 75 73  ere the term mus
24e40 74 20 62 65 20 74 72 75 65 20 62 65 63 61 75 73  t be true becaus
24e50 65 20 69 74 0a 2a 2a 20 69 73 20 70 61 72 74 20  e it.** is part 
24e60 6f 66 20 74 68 65 20 41 4e 44 2d 63 6f 6e 6e 65  of the AND-conne
24e70 63 74 65 64 20 74 65 72 6d 73 20 6f 66 20 74 68  cted terms of th
24e80 65 20 65 78 70 72 65 73 73 69 6f 6e 2e 20 20 46  e expression.  F
24e90 6f 72 20 65 61 63 68 20 74 65 72 6d 0a 2a 2a 20  or each term.** 
24ea0 66 6f 75 6e 64 2c 20 61 64 64 20 69 74 20 74 6f  found, add it to
24eb0 20 74 68 65 20 70 43 6f 6e 73 74 20 73 74 72 75   the pConst stru
24ec0 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  cture..*/.static
24ed0 20 76 6f 69 64 20 66 69 6e 64 43 6f 6e 73 74 49   void findConstI
24ee0 6e 57 68 65 72 65 28 57 68 65 72 65 43 6f 6e 73  nWhere(WhereCons
24ef0 74 20 2a 70 43 6f 6e 73 74 2c 20 45 78 70 72 20  t *pConst, Expr 
24f00 2a 70 45 78 70 72 29 7b 0a 20 20 45 78 70 72 20  *pExpr){.  Expr 
24f10 2a 70 52 69 67 68 74 2c 20 2a 70 4c 65 66 74 3b  *pRight, *pLeft;
24f20 0a 20 20 69 66 28 20 70 45 78 70 72 3d 3d 30 20  .  if( pExpr==0 
24f30 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20  ) return;.  if( 
24f40 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
24f50 70 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f  pExpr, EP_FromJo
24f60 69 6e 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  in) ) return;.  
24f70 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  if( pExpr->op==T
24f80 4b 5f 41 4e 44 20 29 7b 0a 20 20 20 20 66 69 6e  K_AND ){.    fin
24f90 64 43 6f 6e 73 74 49 6e 57 68 65 72 65 28 70 43  dConstInWhere(pC
24fa0 6f 6e 73 74 2c 20 70 45 78 70 72 2d 3e 70 52 69  onst, pExpr->pRi
24fb0 67 68 74 29 3b 0a 20 20 20 20 66 69 6e 64 43 6f  ght);.    findCo
24fc0 6e 73 74 49 6e 57 68 65 72 65 28 70 43 6f 6e 73  nstInWhere(pCons
24fd0 74 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29  t, pExpr->pLeft)
24fe0 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  ;.    return;.  
24ff0 7d 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f  }.  if( pExpr->o
25000 70 21 3d 54 4b 5f 45 51 20 29 20 72 65 74 75 72  p!=TK_EQ ) retur
25010 6e 3b 0a 20 20 70 52 69 67 68 74 20 3d 20 70 45  n;.  pRight = pE
25020 78 70 72 2d 3e 70 52 69 67 68 74 3b 0a 20 20 70  xpr->pRight;.  p
25030 4c 65 66 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c  Left = pExpr->pL
25040 65 66 74 3b 0a 20 20 61 73 73 65 72 74 28 20 70  eft;.  assert( p
25050 52 69 67 68 74 21 3d 30 20 29 3b 0a 20 20 61 73  Right!=0 );.  as
25060 73 65 72 74 28 20 70 4c 65 66 74 21 3d 30 20 29  sert( pLeft!=0 )
25070 3b 0a 20 20 69 66 28 20 70 52 69 67 68 74 2d 3e  ;.  if( pRight->
25080 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 0a 20 20  op==TK_COLUMN.  
25090 20 26 26 20 21 45 78 70 72 48 61 73 50 72 6f 70   && !ExprHasProp
250a0 65 72 74 79 28 70 52 69 67 68 74 2c 20 45 50 5f  erty(pRight, EP_
250b0 46 69 78 65 64 43 6f 6c 29 0a 20 20 20 26 26 20  FixedCol).   && 
250c0 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e  sqlite3ExprIsCon
250d0 73 74 61 6e 74 28 70 4c 65 66 74 29 0a 20 20 20  stant(pLeft).   
250e0 26 26 20 73 71 6c 69 74 65 33 49 73 42 69 6e 61  && sqlite3IsBina
250f0 72 79 28 73 71 6c 69 74 65 33 42 69 6e 61 72 79  ry(sqlite3Binary
25100 43 6f 6d 70 61 72 65 43 6f 6c 6c 53 65 71 28 70  CompareCollSeq(p
25110 43 6f 6e 73 74 2d 3e 70 50 61 72 73 65 2c 70 4c  Const->pParse,pL
25120 65 66 74 2c 70 52 69 67 68 74 29 29 0a 20 20 29  eft,pRight)).  )
25130 7b 0a 20 20 20 20 63 6f 6e 73 74 49 6e 73 65 72  {.    constInser
25140 74 28 70 43 6f 6e 73 74 2c 20 70 52 69 67 68 74  t(pConst, pRight
25150 2c 20 70 4c 65 66 74 29 3b 0a 20 20 7d 65 6c 73  , pLeft);.  }els
25160 65 0a 20 20 69 66 28 20 70 4c 65 66 74 2d 3e 6f  e.  if( pLeft->o
25170 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 0a 20 20 20  p==TK_COLUMN.   
25180 26 26 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  && !ExprHasPrope
25190 72 74 79 28 70 4c 65 66 74 2c 20 45 50 5f 46 69  rty(pLeft, EP_Fi
251a0 78 65 64 43 6f 6c 29 0a 20 20 20 26 26 20 73 71  xedCol).   && sq
251b0 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74  lite3ExprIsConst
251c0 61 6e 74 28 70 52 69 67 68 74 29 0a 20 20 20 26  ant(pRight).   &
251d0 26 20 73 71 6c 69 74 65 33 49 73 42 69 6e 61 72  & sqlite3IsBinar
251e0 79 28 73 71 6c 69 74 65 33 42 69 6e 61 72 79 43  y(sqlite3BinaryC
251f0 6f 6d 70 61 72 65 43 6f 6c 6c 53 65 71 28 70 43  ompareCollSeq(pC
25200 6f 6e 73 74 2d 3e 70 50 61 72 73 65 2c 70 4c 65  onst->pParse,pLe
25210 66 74 2c 70 52 69 67 68 74 29 29 0a 20 20 29 7b  ft,pRight)).  ){
25220 0a 20 20 20 20 63 6f 6e 73 74 49 6e 73 65 72 74  .    constInsert
25230 28 70 43 6f 6e 73 74 2c 20 70 4c 65 66 74 2c 20  (pConst, pLeft, 
25240 70 52 69 67 68 74 29 3b 0a 20 20 7d 0a 7d 0a 0a  pRight);.  }.}..
25250 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 20  /*.** This is a 
25260 57 61 6c 6b 65 72 20 65 78 70 72 65 73 73 69 6f  Walker expressio
25270 6e 20 63 61 6c 6c 62 61 63 6b 2e 20 20 70 45 78  n callback.  pEx
25280 70 72 20 69 73 20 61 20 63 61 6e 64 69 64 61 74  pr is a candidat
25290 65 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20  e expression.** 
252a0 74 6f 20 62 65 20 72 65 70 6c 61 63 65 64 20 62  to be replaced b
252b0 79 20 61 20 76 61 6c 75 65 2e 20 20 49 66 20 70  y a value.  If p
252c0 45 78 70 72 20 69 73 20 65 71 75 69 76 61 6c 65  Expr is equivale
252d0 6e 74 20 74 6f 20 6f 6e 65 20 6f 66 20 74 68 65  nt to one of the
252e0 0a 2a 2a 20 63 6f 6c 75 6d 6e 73 20 6e 61 6d 65  .** columns name
252f0 64 20 69 6e 20 70 57 61 6c 6b 65 72 2d 3e 75 2e  d in pWalker->u.
25300 70 43 6f 6e 73 74 2c 20 74 68 65 6e 20 6f 76 65  pConst, then ove
25310 72 77 72 69 74 65 20 69 74 20 77 69 74 68 20 69  rwrite it with i
25320 74 73 0a 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64  ts.** correspond
25330 69 6e 67 20 76 61 6c 75 65 2e 0a 2a 2f 0a 73 74  ing value..*/.st
25340 61 74 69 63 20 69 6e 74 20 70 72 6f 70 61 67 61  atic int propaga
25350 74 65 43 6f 6e 73 74 61 6e 74 45 78 70 72 52 65  teConstantExprRe
25360 77 72 69 74 65 28 57 61 6c 6b 65 72 20 2a 70 57  write(Walker *pW
25370 61 6c 6b 65 72 2c 20 45 78 70 72 20 2a 70 45 78  alker, Expr *pEx
25380 70 72 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  pr){.  int i;.  
25390 57 68 65 72 65 43 6f 6e 73 74 20 2a 70 43 6f 6e  WhereConst *pCon
253a0 73 74 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d  st;.  if( pExpr-
253b0 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29  >op!=TK_COLUMN )
253c0 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74   return WRC_Cont
253d0 69 6e 75 65 3b 0a 20 20 69 66 28 20 45 78 70 72  inue;.  if( Expr
253e0 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
253f0 72 2c 20 45 50 5f 46 69 78 65 64 43 6f 6c 29 20  r, EP_FixedCol) 
25400 29 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e  ) return WRC_Con
25410 74 69 6e 75 65 3b 0a 20 20 70 43 6f 6e 73 74 20  tinue;.  pConst 
25420 3d 20 70 57 61 6c 6b 65 72 2d 3e 75 2e 70 43 6f  = pWalker->u.pCo
25430 6e 73 74 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  nst;.  for(i=0; 
25440 69 3c 70 43 6f 6e 73 74 2d 3e 6e 43 6f 6e 73 74  i<pConst->nConst
25450 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72  ; i++){.    Expr
25460 20 2a 70 43 6f 6c 75 6d 6e 20 3d 20 70 43 6f 6e   *pColumn = pCon
25470 73 74 2d 3e 61 70 45 78 70 72 5b 69 2a 32 5d 3b  st->apExpr[i*2];
25480 0a 20 20 20 20 69 66 28 20 70 43 6f 6c 75 6d 6e  .    if( pColumn
25490 3d 3d 70 45 78 70 72 20 29 20 63 6f 6e 74 69 6e  ==pExpr ) contin
254a0 75 65 3b 0a 20 20 20 20 69 66 28 20 70 43 6f 6c  ue;.    if( pCol
254b0 75 6d 6e 2d 3e 69 54 61 62 6c 65 21 3d 70 45 78  umn->iTable!=pEx
254c0 70 72 2d 3e 69 54 61 62 6c 65 20 29 20 63 6f 6e  pr->iTable ) con
254d0 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 70  tinue;.    if( p
254e0 43 6f 6c 75 6d 6e 2d 3e 69 43 6f 6c 75 6d 6e 21  Column->iColumn!
254f0 3d 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20  =pExpr->iColumn 
25500 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
25510 2f 2a 20 41 20 6d 61 74 63 68 20 69 73 20 66 6f  /* A match is fo
25520 75 6e 64 2e 20 20 41 64 64 20 74 68 65 20 45 50  und.  Add the EP
25530 5f 46 69 78 65 64 43 6f 6c 20 70 72 6f 70 65 72  _FixedCol proper
25540 74 79 20 2a 2f 0a 20 20 20 20 70 43 6f 6e 73 74  ty */.    pConst
25550 2d 3e 6e 43 68 6e 67 2b 2b 3b 0a 20 20 20 20 45  ->nChng++;.    E
25560 78 70 72 43 6c 65 61 72 50 72 6f 70 65 72 74 79  xprClearProperty
25570 28 70 45 78 70 72 2c 20 45 50 5f 4c 65 61 66 29  (pExpr, EP_Leaf)
25580 3b 0a 20 20 20 20 45 78 70 72 53 65 74 50 72 6f  ;.    ExprSetPro
25590 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
255a0 46 69 78 65 64 43 6f 6c 29 3b 0a 20 20 20 20 61  FixedCol);.    a
255b0 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 70 4c  ssert( pExpr->pL
255c0 65 66 74 3d 3d 30 20 29 3b 0a 20 20 20 20 70 45  eft==0 );.    pE
255d0 78 70 72 2d 3e 70 4c 65 66 74 20 3d 20 73 71 6c  xpr->pLeft = sql
255e0 69 74 65 33 45 78 70 72 44 75 70 28 70 43 6f 6e  ite3ExprDup(pCon
255f0 73 74 2d 3e 70 50 61 72 73 65 2d 3e 64 62 2c 20  st->pParse->db, 
25600 70 43 6f 6e 73 74 2d 3e 61 70 45 78 70 72 5b 69  pConst->apExpr[i
25610 2a 32 2b 31 5d 2c 20 30 29 3b 0a 20 20 20 20 62  *2+1], 0);.    b
25620 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 65 74 75  reak;.  }.  retu
25630 72 6e 20 57 52 43 5f 50 72 75 6e 65 3b 0a 7d 0a  rn WRC_Prune;.}.
25640 0a 2f 2a 0a 2a 2a 20 54 68 65 20 57 48 45 52 45  ./*.** The WHERE
25650 2d 63 6c 61 75 73 65 20 63 6f 6e 73 74 61 6e 74  -clause constant
25660 20 70 72 6f 70 61 67 61 74 69 6f 6e 20 6f 70 74   propagation opt
25670 69 6d 69 7a 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a  imization..**.**
25680 20 49 66 20 74 68 65 20 57 48 45 52 45 20 63 6c   If the WHERE cl
25690 61 75 73 65 20 63 6f 6e 74 61 69 6e 73 20 74 65  ause contains te
256a0 72 6d 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20  rms of the form 
256b0 43 4f 4c 55 4d 4e 3d 43 4f 4e 53 54 41 4e 54 20  COLUMN=CONSTANT 
256c0 6f 72 0a 2a 2a 20 43 4f 4e 53 54 41 4e 54 3d 43  or.** CONSTANT=C
256d0 4f 4c 55 4d 4e 20 74 68 61 74 20 6d 75 73 74 20  OLUMN that must 
256e0 62 65 20 74 72 65 65 20 28 69 6e 20 6f 74 68 65  be tree (in othe
256f0 72 20 77 6f 72 64 73 2c 20 69 66 20 74 68 65 20  r words, if the 
25700 74 65 72 6d 73 20 74 6f 70 2d 6c 65 76 65 6c 0a  terms top-level.
25710 2a 2a 20 41 4e 44 2d 63 6f 6e 6e 65 63 74 65 64  ** AND-connected
25720 20 74 65 72 6d 73 20 74 68 61 74 20 61 72 65 20   terms that are 
25730 6e 6f 74 20 70 61 72 74 20 6f 66 20 61 20 4f 4e  not part of a ON
25740 20 63 6c 61 75 73 65 20 66 72 6f 6d 20 61 20 4c   clause from a L
25750 45 46 54 20 4a 4f 49 4e 29 0a 2a 2a 20 74 68 65  EFT JOIN).** the
25760 6e 20 74 68 72 6f 75 67 68 6f 75 74 20 74 68 65  n throughout the
25770 20 71 75 65 72 79 20 72 65 70 6c 61 63 65 20 61   query replace a
25780 6c 6c 20 6f 74 68 65 72 20 6f 63 63 75 72 72 65  ll other occurre
25790 6e 63 65 73 20 6f 66 20 43 4f 4c 55 4d 4e 0a 2a  nces of COLUMN.*
257a0 2a 20 77 69 74 68 20 43 4f 4e 53 54 41 4e 54 20  * with CONSTANT 
257b0 77 69 74 68 69 6e 20 74 68 65 20 57 48 45 52 45  within the WHERE
257c0 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 46   clause..**.** F
257d0 6f 72 20 65 78 61 6d 70 6c 65 2c 20 74 68 65 20  or example, the 
257e0 71 75 65 72 79 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  query:.**.**    
257f0 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
25800 74 31 2c 20 74 32 2c 20 74 33 20 57 48 45 52 45  t1, t2, t3 WHERE
25810 20 74 31 2e 61 3d 33 39 20 41 4e 44 20 74 32 2e   t1.a=39 AND t2.
25820 62 3d 74 31 2e 61 20 41 4e 44 20 74 33 2e 63 3d  b=t1.a AND t3.c=
25830 74 32 2e 62 0a 2a 2a 0a 2a 2a 20 49 73 20 74 72  t2.b.**.** Is tr
25840 61 6e 73 66 6f 72 6d 65 64 20 69 6e 74 6f 0a 2a  ansformed into.*
25850 2a 0a 2a 2a 20 20 20 20 20 20 53 45 4c 45 43 54  *.**      SELECT
25860 20 2a 20 46 52 4f 4d 20 74 31 2c 20 74 32 2c 20   * FROM t1, t2, 
25870 74 33 20 57 48 45 52 45 20 74 31 2e 61 3d 33 39  t3 WHERE t1.a=39
25880 20 41 4e 44 20 74 32 2e 62 3d 33 39 20 41 4e 44   AND t2.b=39 AND
25890 20 74 33 2e 63 3d 33 39 0a 2a 2a 0a 2a 2a 20 52   t3.c=39.**.** R
258a0 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 61 6e  eturn true if an
258b0 79 20 74 72 61 6e 73 66 6f 72 6d 61 74 69 6f 6e  y transformation
258c0 73 20 77 68 65 72 65 20 6d 61 64 65 20 61 6e 64  s where made and
258d0 20 66 61 6c 73 65 20 69 66 20 6e 6f 74 2e 0a 2a   false if not..*
258e0 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74  *.** Implementat
258f0 69 6f 6e 20 6e 6f 74 65 3a 20 20 43 6f 6e 73 74  ion note:  Const
25900 61 6e 74 20 70 72 6f 70 61 67 61 74 69 6f 6e 20  ant propagation 
25910 69 73 20 74 72 69 63 6b 79 20 64 75 65 20 74 6f  is tricky due to
25920 20 61 66 66 69 6e 69 74 79 0a 2a 2a 20 61 6e 64   affinity.** and
25930 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
25940 6e 63 65 20 69 6e 74 65 72 61 63 74 69 6f 6e 73  nce interactions
25950 2e 20 20 43 6f 6e 73 69 64 65 72 20 74 68 69 73  .  Consider this
25960 20 65 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20   example:.**.** 
25970 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
25980 74 31 28 61 20 49 4e 54 2c 62 20 54 45 58 54 29  t1(a INT,b TEXT)
25990 3b 0a 2a 2a 20 20 20 20 49 4e 53 45 52 54 20 49  ;.**    INSERT I
259a0 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 31 32  NTO t1 VALUES(12
259b0 33 2c 27 30 31 32 33 27 29 3b 0a 2a 2a 20 20 20  3,'0123');.**   
259c0 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
259d0 31 20 57 48 45 52 45 20 61 3d 31 32 33 20 41 4e  1 WHERE a=123 AN
259e0 44 20 62 3d 61 3b 0a 2a 2a 20 20 20 20 53 45 4c  D b=a;.**    SEL
259f0 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 57 48  ECT * FROM t1 WH
25a00 45 52 45 20 61 3d 31 32 33 20 41 4e 44 20 62 3d  ERE a=123 AND b=
25a10 31 32 33 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74  123;.**.** The t
25a20 77 6f 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  wo SELECT statem
25a30 65 6e 74 73 20 61 62 6f 76 65 20 73 68 6f 75 6c  ents above shoul
25a40 64 20 72 65 74 75 72 6e 20 64 69 66 66 65 72 65  d return differe
25a50 6e 74 20 61 6e 73 77 65 72 73 2e 20 20 62 3d 61  nt answers.  b=a
25a60 0a 2a 2a 20 69 73 20 61 6c 77 61 79 20 74 72 75  .** is alway tru
25a70 65 20 62 65 63 61 75 73 65 20 74 68 65 20 63 6f  e because the co
25a80 6d 70 61 72 69 73 6f 6e 20 75 73 65 73 20 6e 75  mparison uses nu
25a90 6d 65 72 69 63 20 61 66 66 69 6e 69 74 79 2c 20  meric affinity, 
25aa0 62 75 74 20 62 3d 31 32 33 0a 2a 2a 20 69 73 20  but b=123.** is 
25ab0 66 61 6c 73 65 20 62 65 63 61 75 73 65 20 69 74  false because it
25ac0 20 75 73 65 73 20 74 65 78 74 20 61 66 66 69 6e   uses text affin
25ad0 69 74 79 20 61 6e 64 20 27 30 31 32 33 27 20 69  ity and '0123' i
25ae0 73 20 6e 6f 74 20 74 68 65 20 73 61 6d 65 20 61  s not the same a
25af0 73 20 27 31 32 33 27 2e 0a 2a 2a 20 54 6f 20 77  s '123'..** To w
25b00 6f 72 6b 20 61 72 6f 75 6e 64 20 74 68 69 73 2c  ork around this,
25b10 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
25b20 74 72 65 65 20 69 73 20 6e 6f 74 20 61 63 74 75  tree is not actu
25b30 61 6c 6c 79 20 63 68 61 6e 67 65 64 20 66 72 6f  ally changed fro
25b40 6d 0a 2a 2a 20 22 62 3d 61 22 20 74 6f 20 22 62  m.** "b=a" to "b
25b50 3d 31 32 33 22 20 62 75 74 20 72 61 74 68 65 72  =123" but rather
25b60 20 74 68 65 20 22 61 22 20 69 6e 20 22 62 3d 61   the "a" in "b=a
25b70 22 20 69 73 20 74 61 67 67 65 64 20 77 69 74 68  " is tagged with
25b80 20 45 50 5f 46 69 78 65 64 43 6f 6c 0a 2a 2a 20   EP_FixedCol.** 
25b90 61 6e 64 20 74 68 65 20 22 31 32 33 22 20 76 61  and the "123" va
25ba0 6c 75 65 20 69 73 20 68 75 6e 67 20 6f 66 66 20  lue is hung off 
25bb0 6f 66 20 74 68 65 20 70 4c 65 66 74 20 70 6f 69  of the pLeft poi
25bc0 6e 74 65 72 2e 20 20 43 6f 64 65 20 67 65 6e 65  nter.  Code gene
25bd0 72 61 74 6f 72 0a 2a 2a 20 72 6f 75 74 69 6e 65  rator.** routine
25be0 73 20 6b 6e 6f 77 20 74 6f 20 67 65 6e 65 72 61  s know to genera
25bf0 74 65 20 74 68 65 20 63 6f 6e 73 74 61 6e 74 20  te the constant 
25c00 22 31 32 33 22 20 69 6e 73 74 65 61 64 20 6f 66  "123" instead of
25c10 20 6c 6f 6f 6b 69 6e 67 20 75 70 20 74 68 65 0a   looking up the.
25c20 2a 2a 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 2e  ** column value.
25c30 20 20 41 6c 73 6f 2c 20 74 6f 20 61 76 6f 69 64    Also, to avoid
25c40 20 63 6f 6c 6c 61 74 69 6f 6e 20 70 72 6f 62 6c   collation probl
25c50 65 6d 73 2c 20 74 68 69 73 20 6f 70 74 69 6d 69  ems, this optimi
25c60 7a 61 74 69 6f 6e 20 69 73 0a 2a 2a 20 6f 6e 6c  zation is.** onl
25c70 79 20 61 74 74 65 6d 70 74 65 64 20 69 66 20 74  y attempted if t
25c80 68 65 20 22 61 3d 31 32 33 22 20 74 65 72 6d 20  he "a=123" term 
25c90 75 73 65 73 20 74 68 65 20 64 65 66 61 75 6c 74  uses the default
25ca0 20 42 49 4e 41 52 59 20 63 6f 6c 6c 61 74 69 6f   BINARY collatio
25cb0 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  n..*/.static int
25cc0 20 70 72 6f 70 61 67 61 74 65 43 6f 6e 73 74 61   propagateConsta
25cd0 6e 74 73 28 0a 20 20 50 61 72 73 65 20 2a 70 50  nts(.  Parse *pP
25ce0 61 72 73 65 2c 20 20 20 2f 2a 20 54 68 65 20 70  arse,   /* The p
25cf0 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
25d00 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 20 20 20  /.  Select *p   
25d10 20 20 20 20 20 2f 2a 20 54 68 65 20 71 75 65 72       /* The quer
25d20 79 20 69 6e 20 77 68 69 63 68 20 74 6f 20 70 72  y in which to pr
25d30 6f 70 61 67 61 74 65 20 63 6f 6e 73 74 61 6e 74  opagate constant
25d40 73 20 2a 2f 0a 29 7b 0a 20 20 57 68 65 72 65 43  s */.){.  WhereC
25d50 6f 6e 73 74 20 78 3b 0a 20 20 57 61 6c 6b 65 72  onst x;.  Walker
25d60 20 77 3b 0a 20 20 69 6e 74 20 6e 43 68 6e 67 20   w;.  int nChng 
25d70 3d 20 30 3b 0a 20 20 78 2e 70 50 61 72 73 65 20  = 0;.  x.pParse 
25d80 3d 20 70 50 61 72 73 65 3b 0a 20 20 64 6f 7b 0a  = pParse;.  do{.
25d90 20 20 20 20 78 2e 6e 43 6f 6e 73 74 20 3d 20 30      x.nConst = 0
25da0 3b 0a 20 20 20 20 78 2e 6e 43 68 6e 67 20 3d 20  ;.    x.nChng = 
25db0 30 3b 0a 20 20 20 20 78 2e 61 70 45 78 70 72 20  0;.    x.apExpr 
25dc0 3d 20 30 3b 0a 20 20 20 20 66 69 6e 64 43 6f 6e  = 0;.    findCon
25dd0 73 74 49 6e 57 68 65 72 65 28 26 78 2c 20 70 2d  stInWhere(&x, p-
25de0 3e 70 57 68 65 72 65 29 3b 0a 20 20 20 20 69 66  >pWhere);.    if
25df0 28 20 78 2e 6e 43 6f 6e 73 74 20 29 7b 0a 20 20  ( x.nConst ){.  
25e00 20 20 20 20 6d 65 6d 73 65 74 28 26 77 2c 20 30      memset(&w, 0
25e10 2c 20 73 69 7a 65 6f 66 28 77 29 29 3b 0a 20 20  , sizeof(w));.  
25e20 20 20 20 20 77 2e 70 50 61 72 73 65 20 3d 20 70      w.pParse = p
25e30 50 61 72 73 65 3b 0a 20 20 20 20 20 20 77 2e 78  Parse;.      w.x
25e40 45 78 70 72 43 61 6c 6c 62 61 63 6b 20 3d 20 70  ExprCallback = p
25e50 72 6f 70 61 67 61 74 65 43 6f 6e 73 74 61 6e 74  ropagateConstant
25e60 45 78 70 72 52 65 77 72 69 74 65 3b 0a 20 20 20  ExprRewrite;.   
25e70 20 20 20 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c     w.xSelectCall
25e80 62 61 63 6b 20 3d 20 73 71 6c 69 74 65 33 53 65  back = sqlite3Se
25e90 6c 65 63 74 57 61 6c 6b 4e 6f 6f 70 3b 0a 20 20  lectWalkNoop;.  
25ea0 20 20 20 20 77 2e 78 53 65 6c 65 63 74 43 61 6c      w.xSelectCal
25eb0 6c 62 61 63 6b 32 20 3d 20 30 3b 0a 20 20 20 20  lback2 = 0;.    
25ec0 20 20 77 2e 77 61 6c 6b 65 72 44 65 70 74 68 20    w.walkerDepth 
25ed0 3d 20 30 3b 0a 20 20 20 20 20 20 77 2e 75 2e 70  = 0;.      w.u.p
25ee0 43 6f 6e 73 74 20 3d 20 26 78 3b 0a 20 20 20 20  Const = &x;.    
25ef0 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 45 78 70    sqlite3WalkExp
25f00 72 28 26 77 2c 20 70 2d 3e 70 57 68 65 72 65 29  r(&w, p->pWhere)
25f10 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  ;.      sqlite3D
25f20 62 46 72 65 65 28 78 2e 70 50 61 72 73 65 2d 3e  bFree(x.pParse->
25f30 64 62 2c 20 78 2e 61 70 45 78 70 72 29 3b 0a 20  db, x.apExpr);. 
25f40 20 20 20 20 20 6e 43 68 6e 67 20 2b 3d 20 78 2e       nChng += x.
25f50 6e 43 68 6e 67 3b 0a 20 20 20 20 7d 0a 20 20 7d  nChng;.    }.  }
25f60 77 68 69 6c 65 28 20 78 2e 6e 43 68 6e 67 20 29  while( x.nChng )
25f70 3b 20 20 0a 20 20 72 65 74 75 72 6e 20 6e 43 68  ;  .  return nCh
25f80 6e 67 3b 0a 7d 0a 0a 23 69 66 20 21 64 65 66 69  ng;.}..#if !defi
25f90 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
25fa0 53 55 42 51 55 45 52 59 29 20 7c 7c 20 21 64 65  SUBQUERY) || !de
25fb0 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
25fc0 54 5f 56 49 45 57 29 0a 2f 2a 0a 2a 2a 20 4d 61  T_VIEW)./*.** Ma
25fd0 6b 65 20 63 6f 70 69 65 73 20 6f 66 20 72 65 6c  ke copies of rel
25fe0 65 76 61 6e 74 20 57 48 45 52 45 20 63 6c 61 75  evant WHERE clau
25ff0 73 65 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20  se terms of the 
26000 6f 75 74 65 72 20 71 75 65 72 79 20 69 6e 74 6f  outer query into
26010 0a 2a 2a 20 74 68 65 20 57 48 45 52 45 20 63 6c  .** the WHERE cl
26020 61 75 73 65 20 6f 66 20 73 75 62 71 75 65 72 79  ause of subquery
26030 2e 20 20 45 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a  .  Example:.**.*
26040 2a 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52  *    SELECT * FR
26050 4f 4d 20 28 53 45 4c 45 43 54 20 61 20 41 53 20  OM (SELECT a AS 
26060 78 2c 20 63 2d 64 20 41 53 20 79 20 46 52 4f 4d  x, c-d AS y FROM
26070 20 74 31 29 20 57 48 45 52 45 20 78 3d 35 20 41   t1) WHERE x=5 A
26080 4e 44 20 79 3d 31 30 3b 0a 2a 2a 0a 2a 2a 20 54  ND y=10;.**.** T
26090 72 61 6e 73 66 6f 72 6d 65 64 20 69 6e 74 6f 3a  ransformed into:
260a0 0a 2a 2a 0a 2a 2a 20 20 20 20 53 45 4c 45 43 54  .**.**    SELECT
260b0 20 2a 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20   * FROM (SELECT 
260c0 61 20 41 53 20 78 2c 20 63 2d 64 20 41 53 20 79  a AS x, c-d AS y
260d0 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 61   FROM t1 WHERE a
260e0 3d 35 20 41 4e 44 20 63 2d 64 3d 31 30 29 0a 2a  =5 AND c-d=10).*
260f0 2a 20 20 20 20 20 57 48 45 52 45 20 78 3d 35 20  *     WHERE x=5 
26100 41 4e 44 20 79 3d 31 30 3b 0a 2a 2a 0a 2a 2a 20  AND y=10;.**.** 
26110 54 68 65 20 68 6f 70 65 20 69 73 20 74 68 61 74  The hope is that
26120 20 74 68 65 20 74 65 72 6d 73 20 61 64 64 65 64   the terms added
26130 20 74 6f 20 74 68 65 20 69 6e 6e 65 72 20 71 75   to the inner qu
26140 65 72 79 20 77 69 6c 6c 20 6d 61 6b 65 20 69 74  ery will make it
26150 20 6d 6f 72 65 0a 2a 2a 20 65 66 66 69 63 69 65   more.** efficie
26160 6e 74 2e 0a 2a 2a 0a 2a 2a 20 44 6f 20 6e 6f 74  nt..**.** Do not
26170 20 61 74 74 65 6d 70 74 20 74 68 69 73 20 6f 70   attempt this op
26180 74 69 6d 69 7a 61 74 69 6f 6e 20 69 66 3a 0a 2a  timization if:.*
26190 2a 0a 2a 2a 20 20 20 28 31 29 20 28 2a 2a 20 54  *.**   (1) (** T
261a0 68 69 73 20 72 65 73 74 72 69 63 74 69 6f 6e 20  his restriction 
261b0 77 61 73 20 72 65 6d 6f 76 65 64 20 6f 6e 20 32  was removed on 2
261c0 30 31 37 2d 30 39 2d 32 39 2e 20 20 57 65 20 75  017-09-29.  We u
261d0 73 65 64 20 74 6f 0a 2a 2a 20 20 20 20 20 20 20  sed to.**       
261e0 20 20 20 20 64 69 73 61 6c 6c 6f 77 20 74 68 69      disallow thi
261f0 73 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 66  s optimization f
26200 6f 72 20 61 67 67 72 65 67 61 74 65 20 73 75 62  or aggregate sub
26210 71 75 65 72 69 65 73 2c 20 62 75 74 20 6e 6f 77  queries, but now
26220 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 69 74  .**           it
26230 20 69 73 20 61 6c 6c 6f 77 65 64 20 62 79 20 70   is allowed by p
26240 75 74 74 69 6e 67 20 74 68 65 20 65 78 74 72 61  utting the extra
26250 20 74 65 72 6d 73 20 6f 6e 20 74 68 65 20 48 41   terms on the HA
26260 56 49 4e 47 20 63 6c 61 75 73 65 2e 0a 2a 2a 20  VING clause..** 
26270 20 20 20 20 20 20 20 20 20 20 54 68 65 20 61 64            The ad
26280 64 65 64 20 48 41 56 49 4e 47 20 63 6c 61 75 73  ded HAVING claus
26290 65 20 69 73 20 70 6f 69 6e 74 6c 65 73 73 20 69  e is pointless i
262a0 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20 6c  f the subquery l
262b0 61 63 6b 73 0a 2a 2a 20 20 20 20 20 20 20 20 20  acks.**         
262c0 20 20 61 20 47 52 4f 55 50 20 42 59 20 63 6c 61    a GROUP BY cla
262d0 75 73 65 2e 20 20 42 75 74 20 73 75 63 68 20 61  use.  But such a
262e0 20 48 41 56 49 4e 47 20 63 6c 61 75 73 65 20 69   HAVING clause i
262f0 73 20 61 6c 73 6f 20 68 61 72 6d 6c 65 73 73 0a  s also harmless.
26300 2a 2a 20 20 20 20 20 20 20 20 20 20 20 73 6f 20  **           so 
26310 74 68 65 72 65 20 64 6f 65 73 20 6e 6f 74 20 61  there does not a
26320 70 70 65 61 72 20 74 6f 20 62 65 20 61 6e 79 20  ppear to be any 
26330 72 65 61 73 6f 6e 20 74 6f 20 61 64 64 20 65 78  reason to add ex
26340 74 72 61 20 6c 6f 67 69 63 0a 2a 2a 20 20 20 20  tra logic.**    
26350 20 20 20 20 20 20 20 74 6f 20 73 75 70 70 72 65         to suppre
26360 73 73 20 69 74 2e 20 2a 2a 29 0a 2a 2a 0a 2a 2a  ss it. **).**.**
26370 20 20 20 28 32 29 20 54 68 65 20 69 6e 6e 65 72     (2) The inner
26380 20 71 75 65 72 79 20 69 73 20 74 68 65 20 72 65   query is the re
26390 63 75 72 73 69 76 65 20 70 61 72 74 20 6f 66 20  cursive part of 
263a0 61 20 63 6f 6d 6d 6f 6e 20 74 61 62 6c 65 20 65  a common table e
263b0 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 0a 2a 2a  xpression..**.**
263c0 20 20 20 28 33 29 20 54 68 65 20 69 6e 6e 65 72     (3) The inner
263d0 20 71 75 65 72 79 20 68 61 73 20 61 20 4c 49 4d   query has a LIM
263e0 49 54 20 63 6c 61 75 73 65 20 28 73 69 6e 63 65  IT clause (since
263f0 20 74 68 65 20 63 68 61 6e 67 65 73 20 74 6f 20   the changes to 
26400 74 68 65 20 57 48 45 52 45 0a 2a 2a 20 20 20 20  the WHERE.**    
26410 20 20 20 63 6c 61 75 73 65 20 77 6f 75 6c 64 20     clause would 
26420 63 68 61 6e 67 65 20 74 68 65 20 6d 65 61 6e 69  change the meani
26430 6e 67 20 6f 66 20 74 68 65 20 4c 49 4d 49 54 29  ng of the LIMIT)
26440 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 34 29 20 54 68  ..**.**   (4) Th
26450 65 20 69 6e 6e 65 72 20 71 75 65 72 79 20 69 73  e inner query is
26460 20 74 68 65 20 72 69 67 68 74 20 6f 70 65 72 61   the right opera
26470 6e 64 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49  nd of a LEFT JOI
26480 4e 20 61 6e 64 20 74 68 65 0a 2a 2a 20 20 20 20  N and the.**    
26490 20 20 20 65 78 70 72 65 73 73 69 6f 6e 20 74 6f     expression to
264a0 20 62 65 20 70 75 73 68 65 64 20 64 6f 77 6e 20   be pushed down 
264b0 64 6f 65 73 20 6e 6f 74 20 63 6f 6d 65 20 66 72  does not come fr
264c0 6f 6d 20 74 68 65 20 4f 4e 20 63 6c 61 75 73 65  om the ON clause
264d0 0a 2a 2a 20 20 20 20 20 20 20 6f 6e 20 74 68 61  .**       on tha
264e0 74 20 4c 45 46 54 20 4a 4f 49 4e 2e 0a 2a 2a 0a  t LEFT JOIN..**.
264f0 2a 2a 20 20 20 28 35 29 20 54 68 65 20 57 48 45  **   (5) The WHE
26500 52 45 20 63 6c 61 75 73 65 20 65 78 70 72 65 73  RE clause expres
26510 73 69 6f 6e 20 6f 72 69 67 69 6e 61 74 65 73 20  sion originates 
26520 69 6e 20 74 68 65 20 4f 4e 20 6f 72 20 55 53 49  in the ON or USI
26530 4e 47 20 63 6c 61 75 73 65 0a 2a 2a 20 20 20 20  NG clause.**    
26540 20 20 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49     of a LEFT JOI
26550 4e 20 77 68 65 72 65 20 69 43 75 72 73 6f 72 20  N where iCursor 
26560 69 73 20 6e 6f 74 20 74 68 65 20 72 69 67 68 74  is not the right
26570 2d 68 61 6e 64 20 74 61 62 6c 65 20 6f 66 20 74  -hand table of t
26580 68 61 74 0a 2a 2a 20 20 20 20 20 20 20 6c 65 66  hat.**       lef
26590 74 20 6a 6f 69 6e 2e 20 20 41 6e 20 65 78 61 6d  t join.  An exam
265a0 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  ple:.**.**      
265b0 20 20 20 20 20 53 45 4c 45 43 54 20 2a 0a 2a 2a       SELECT *.**
265c0 20 20 20 20 20 20 20 20 20 20 20 46 52 4f 4d 20             FROM 
265d0 28 53 45 4c 45 43 54 20 31 20 41 53 20 61 31 20  (SELECT 1 AS a1 
265e0 55 4e 49 4f 4e 20 41 4c 4c 20 53 45 4c 45 43 54  UNION ALL SELECT
265f0 20 32 29 20 41 53 20 61 61 0a 2a 2a 20 20 20 20   2) AS aa.**    
26600 20 20 20 20 20 20 20 4a 4f 49 4e 20 28 53 45 4c         JOIN (SEL
26610 45 43 54 20 31 20 41 53 20 62 32 20 55 4e 49 4f  ECT 1 AS b2 UNIO
26620 4e 20 41 4c 4c 20 53 45 4c 45 43 54 20 32 29 20  N ALL SELECT 2) 
26630 41 53 20 62 62 20 4f 4e 20 28 61 31 3d 62 32 29  AS bb ON (a1=b2)
26640 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 4c 45  .**           LE
26650 46 54 20 4a 4f 49 4e 20 28 53 45 4c 45 43 54 20  FT JOIN (SELECT 
26660 38 20 41 53 20 63 33 20 55 4e 49 4f 4e 20 41 4c  8 AS c3 UNION AL
26670 4c 20 53 45 4c 45 43 54 20 39 29 20 41 53 20 63  L SELECT 9) AS c
26680 63 20 4f 4e 20 28 62 32 3d 32 29 3b 0a 2a 2a 0a  c ON (b2=2);.**.
26690 2a 2a 20 20 20 20 20 20 20 54 68 65 20 63 6f 72  **       The cor
266a0 72 65 63 74 20 61 6e 73 77 65 72 20 69 73 20 74  rect answer is t
266b0 68 72 65 65 20 72 6f 77 73 3a 20 20 28 31 2c 31  hree rows:  (1,1
266c0 2c 4e 55 4c 4c 29 2c 28 32 2c 32 2c 38 29 2c 28  ,NULL),(2,2,8),(
266d0 32 2c 32 2c 39 29 2e 0a 2a 2a 20 20 20 20 20 20  2,2,9)..**      
266e0 20 42 75 74 20 69 66 20 74 68 65 20 28 62 32 3d   But if the (b2=
266f0 32 29 20 74 65 72 6d 20 77 65 72 65 20 74 6f 20  2) term were to 
26700 62 65 20 70 75 73 68 65 64 20 64 6f 77 6e 20 69  be pushed down i
26710 6e 74 6f 20 74 68 65 20 62 62 20 73 75 62 71 75  nto the bb subqu
26720 65 72 79 2c 0a 2a 2a 20 20 20 20 20 20 20 74 68  ery,.**       th
26730 65 6e 20 74 68 65 20 28 31 2c 31 2c 4e 55 4c 4c  en the (1,1,NULL
26740 29 20 72 6f 77 20 77 6f 75 6c 64 20 62 65 20 73  ) row would be s
26750 75 70 70 72 65 73 73 65 64 2e 0a 2a 2a 0a 2a 2a  uppressed..**.**
26760 20 20 20 28 36 29 20 54 68 65 20 69 6e 6e 65 72     (6) The inner
26770 20 71 75 65 72 79 20 66 65 61 74 75 72 65 73 20   query features 
26780 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 77 69 6e 64  one or more wind
26790 6f 77 2d 66 75 6e 63 74 69 6f 6e 73 20 28 73 69  ow-functions (si
267a0 6e 63 65 20 0a 2a 2a 20 20 20 20 20 20 20 63 68  nce .**       ch
267b0 61 6e 67 65 73 20 74 6f 20 74 68 65 20 57 48 45  anges to the WHE
267c0 52 45 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65  RE clause of the
267d0 20 69 6e 6e 65 72 20 71 75 65 72 79 20 63 6f 75   inner query cou
267e0 6c 64 20 63 68 61 6e 67 65 20 74 68 65 20 0a 2a  ld change the .*
267f0 2a 20 20 20 20 20 20 20 77 69 6e 64 6f 77 20 6f  *       window o
26800 76 65 72 20 77 68 69 63 68 20 77 69 6e 64 6f 77  ver which window
26810 20 66 75 6e 63 74 69 6f 6e 73 20 61 72 65 20 63   functions are c
26820 61 6c 63 75 6c 61 74 65 64 29 2e 0a 2a 2a 0a 2a  alculated)..**.*
26830 2a 20 52 65 74 75 72 6e 20 30 20 69 66 20 6e 6f  * Return 0 if no
26840 20 63 68 61 6e 67 65 73 20 61 72 65 20 6d 61 64   changes are mad
26850 65 20 61 6e 64 20 6e 6f 6e 2d 7a 65 72 6f 20 69  e and non-zero i
26860 66 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 57 48  f one or more WH
26870 45 52 45 20 63 6c 61 75 73 65 0a 2a 2a 20 74 65  ERE clause.** te
26880 72 6d 73 20 61 72 65 20 64 75 70 6c 69 63 61 74  rms are duplicat
26890 65 64 20 69 6e 74 6f 20 74 68 65 20 73 75 62 71  ed into the subq
268a0 75 65 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  uery..*/.static 
268b0 69 6e 74 20 70 75 73 68 44 6f 77 6e 57 68 65 72  int pushDownWher
268c0 65 54 65 72 6d 73 28 0a 20 20 50 61 72 73 65 20  eTerms(.  Parse 
268d0 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
268e0 2f 2a 20 50 61 72 73 65 20 63 6f 6e 74 65 78 74  /* Parse context
268f0 20 28 66 6f 72 20 6d 61 6c 6c 6f 63 28 29 20 61   (for malloc() a
26900 6e 64 20 65 72 72 6f 72 20 72 65 70 6f 72 74 69  nd error reporti
26910 6e 67 29 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20  ng) */.  Select 
26920 2a 70 53 75 62 71 2c 20 20 20 20 20 20 20 20 2f  *pSubq,        /
26930 2a 20 54 68 65 20 73 75 62 71 75 65 72 79 20 77  * The subquery w
26940 68 6f 73 65 20 57 48 45 52 45 20 63 6c 61 75 73  hose WHERE claus
26950 65 20 69 73 20 74 6f 20 62 65 20 61 75 67 6d 65  e is to be augme
26960 6e 74 65 64 20 2a 2f 0a 20 20 45 78 70 72 20 2a  nted */.  Expr *
26970 70 57 68 65 72 65 2c 20 20 20 20 20 20 20 20 20  pWhere,         
26980 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c 61  /* The WHERE cla
26990 75 73 65 20 6f 66 20 74 68 65 20 6f 75 74 65 72  use of the outer
269a0 20 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20   query */.  int 
269b0 69 43 75 72 73 6f 72 2c 20 20 20 20 20 20 20 20  iCursor,        
269c0 20 20 2f 2a 20 43 75 72 73 6f 72 20 6e 75 6d 62    /* Cursor numb
269d0 65 72 20 6f 66 20 74 68 65 20 73 75 62 71 75 65  er of the subque
269e0 72 79 20 2a 2f 0a 20 20 69 6e 74 20 69 73 4c 65  ry */.  int isLe
269f0 66 74 4a 6f 69 6e 20 20 20 20 20 20 20 20 2f 2a  ftJoin        /*
26a00 20 54 72 75 65 20 69 66 20 70 53 75 62 71 20 69   True if pSubq i
26a10 73 20 74 68 65 20 72 69 67 68 74 20 74 65 72 6d  s the right term
26a20 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e 20   of a LEFT JOIN 
26a30 2a 2f 0a 29 7b 0a 20 20 45 78 70 72 20 2a 70 4e  */.){.  Expr *pN
26a40 65 77 3b 0a 20 20 69 6e 74 20 6e 43 68 6e 67 20  ew;.  int nChng 
26a50 3d 20 30 3b 0a 20 20 69 66 28 20 70 57 68 65 72  = 0;.  if( pWher
26a60 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  e==0 ) return 0;
26a70 0a 20 20 69 66 28 20 70 53 75 62 71 2d 3e 73 65  .  if( pSubq->se
26a80 6c 46 6c 61 67 73 20 26 20 53 46 5f 52 65 63 75  lFlags & SF_Recu
26a90 72 73 69 76 65 20 29 20 72 65 74 75 72 6e 20 30  rsive ) return 0
26aa0 3b 20 20 2f 2a 20 72 65 73 74 72 69 63 74 69 6f  ;  /* restrictio
26ab0 6e 20 28 32 29 20 2a 2f 0a 0a 23 69 66 6e 64 65  n (2) */..#ifnde
26ac0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 49  f SQLITE_OMIT_WI
26ad0 4e 44 4f 57 46 55 4e 43 0a 20 20 69 66 28 20 70  NDOWFUNC.  if( p
26ae0 53 75 62 71 2d 3e 70 57 69 6e 20 29 20 72 65 74  Subq->pWin ) ret
26af0 75 72 6e 20 30 3b 20 20 20 20 2f 2a 20 72 65 73  urn 0;    /* res
26b00 74 72 69 63 74 69 6f 6e 20 28 36 29 20 2a 2f 0a  triction (6) */.
26b10 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53  #endif..#ifdef S
26b20 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 2f 2a  QLITE_DEBUG.  /*
26b30 20 4f 6e 6c 79 20 74 68 65 20 66 69 72 73 74 20   Only the first 
26b40 74 65 72 6d 20 6f 66 20 61 20 63 6f 6d 70 6f 75  term of a compou
26b50 6e 64 20 63 61 6e 20 68 61 76 65 20 61 20 57 49  nd can have a WI
26b60 54 48 20 63 6c 61 75 73 65 2e 20 20 42 75 74 20  TH clause.  But 
26b70 6d 61 6b 65 0a 20 20 2a 2a 20 73 75 72 65 20 6e  make.  ** sure n
26b80 6f 20 6f 74 68 65 72 20 74 65 72 6d 73 20 61 72  o other terms ar
26b90 65 20 6d 61 72 6b 65 64 20 53 46 5f 52 65 63 75  e marked SF_Recu
26ba0 72 73 69 76 65 20 69 6e 20 63 61 73 65 20 73 6f  rsive in case so
26bb0 6d 65 74 68 69 6e 67 20 63 68 61 6e 67 65 73 0a  mething changes.
26bc0 20 20 2a 2a 20 69 6e 20 74 68 65 20 66 75 74 75    ** in the futu
26bd0 72 65 2e 0a 20 20 2a 2f 0a 20 20 7b 0a 20 20 20  re..  */.  {.   
26be0 20 53 65 6c 65 63 74 20 2a 70 58 3b 20 20 0a 20   Select *pX;  . 
26bf0 20 20 20 66 6f 72 28 70 58 3d 70 53 75 62 71 3b     for(pX=pSubq;
26c00 20 70 58 3b 20 70 58 3d 70 58 2d 3e 70 50 72 69   pX; pX=pX->pPri
26c10 6f 72 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  or){.      asser
26c20 74 28 20 28 70 58 2d 3e 73 65 6c 46 6c 61 67 73  t( (pX->selFlags
26c30 20 26 20 28 53 46 5f 52 65 63 75 72 73 69 76 65   & (SF_Recursive
26c40 29 29 3d 3d 30 20 29 3b 0a 20 20 20 20 7d 0a 20  ))==0 );.    }. 
26c50 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28   }.#endif..  if(
26c60 20 70 53 75 62 71 2d 3e 70 4c 69 6d 69 74 21 3d   pSubq->pLimit!=
26c70 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
26c80 30 3b 20 2f 2a 20 72 65 73 74 72 69 63 74 69 6f  0; /* restrictio
26c90 6e 20 28 33 29 20 2a 2f 0a 20 20 7d 0a 20 20 77  n (3) */.  }.  w
26ca0 68 69 6c 65 28 20 70 57 68 65 72 65 2d 3e 6f 70  hile( pWhere->op
26cb0 3d 3d 54 4b 5f 41 4e 44 20 29 7b 0a 20 20 20 20  ==TK_AND ){.    
26cc0 6e 43 68 6e 67 20 2b 3d 20 70 75 73 68 44 6f 77  nChng += pushDow
26cd0 6e 57 68 65 72 65 54 65 72 6d 73 28 70 50 61 72  nWhereTerms(pPar
26ce0 73 65 2c 20 70 53 75 62 71 2c 20 70 57 68 65 72  se, pSubq, pWher
26cf0 65 2d 3e 70 52 69 67 68 74 2c 0a 20 20 20 20 20  e->pRight,.     
26d00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26d10 20 20 20 20 20 20 20 20 20 20 20 69 43 75 72 73             iCurs
26d20 6f 72 2c 20 69 73 4c 65 66 74 4a 6f 69 6e 29 3b  or, isLeftJoin);
26d30 0a 20 20 20 20 70 57 68 65 72 65 20 3d 20 70 57  .    pWhere = pW
26d40 68 65 72 65 2d 3e 70 4c 65 66 74 3b 0a 20 20 7d  here->pLeft;.  }
26d50 0a 20 20 69 66 28 20 69 73 4c 65 66 74 4a 6f 69  .  if( isLeftJoi
26d60 6e 0a 20 20 20 26 26 20 28 45 78 70 72 48 61 73  n.   && (ExprHas
26d70 50 72 6f 70 65 72 74 79 28 70 57 68 65 72 65 2c  Property(pWhere,
26d80 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 3d 3d 30 0a  EP_FromJoin)==0.
26d90 20 20 20 20 20 20 20 20 20 7c 7c 20 70 57 68 65           || pWhe
26da0 72 65 2d 3e 69 52 69 67 68 74 4a 6f 69 6e 54 61  re->iRightJoinTa
26db0 62 6c 65 21 3d 69 43 75 72 73 6f 72 29 0a 20 20  ble!=iCursor).  
26dc0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
26dd0 20 2f 2a 20 72 65 73 74 72 69 63 74 69 6f 6e 20   /* restriction 
26de0 28 34 29 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28  (4) */.  }.  if(
26df0 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79   ExprHasProperty
26e00 28 70 57 68 65 72 65 2c 45 50 5f 46 72 6f 6d 4a  (pWhere,EP_FromJ
26e10 6f 69 6e 29 20 26 26 20 70 57 68 65 72 65 2d 3e  oin) && pWhere->
26e20 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 21  iRightJoinTable!
26e30 3d 69 43 75 72 73 6f 72 20 29 7b 0a 20 20 20 20  =iCursor ){.    
26e40 72 65 74 75 72 6e 20 30 3b 20 2f 2a 20 72 65 73  return 0; /* res
26e50 74 72 69 63 74 69 6f 6e 20 28 35 29 20 2a 2f 0a  triction (5) */.
26e60 20 20 7d 0a 20 20 69 66 28 20 73 71 6c 69 74 65    }.  if( sqlite
26e70 33 45 78 70 72 49 73 54 61 62 6c 65 43 6f 6e 73  3ExprIsTableCons
26e80 74 61 6e 74 28 70 57 68 65 72 65 2c 20 69 43 75  tant(pWhere, iCu
26e90 72 73 6f 72 29 20 29 7b 0a 20 20 20 20 6e 43 68  rsor) ){.    nCh
26ea0 6e 67 2b 2b 3b 0a 20 20 20 20 77 68 69 6c 65 28  ng++;.    while(
26eb0 20 70 53 75 62 71 20 29 7b 0a 20 20 20 20 20 20   pSubq ){.      
26ec0 53 75 62 73 74 43 6f 6e 74 65 78 74 20 78 3b 0a  SubstContext x;.
26ed0 20 20 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c        pNew = sql
26ee0 69 74 65 33 45 78 70 72 44 75 70 28 70 50 61 72  ite3ExprDup(pPar
26ef0 73 65 2d 3e 64 62 2c 20 70 57 68 65 72 65 2c 20  se->db, pWhere, 
26f00 30 29 3b 0a 20 20 20 20 20 20 75 6e 73 65 74 4a  0);.      unsetJ
26f10 6f 69 6e 45 78 70 72 28 70 4e 65 77 2c 20 2d 31  oinExpr(pNew, -1
26f20 29 3b 0a 20 20 20 20 20 20 78 2e 70 50 61 72 73  );.      x.pPars
26f30 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20 20 20  e = pParse;.    
26f40 20 20 78 2e 69 54 61 62 6c 65 20 3d 20 69 43 75    x.iTable = iCu
26f50 72 73 6f 72 3b 0a 20 20 20 20 20 20 78 2e 69 4e  rsor;.      x.iN
26f60 65 77 54 61 62 6c 65 20 3d 20 69 43 75 72 73 6f  ewTable = iCurso
26f70 72 3b 0a 20 20 20 20 20 20 78 2e 69 73 4c 65 66  r;.      x.isLef
26f80 74 4a 6f 69 6e 20 3d 20 30 3b 0a 20 20 20 20 20  tJoin = 0;.     
26f90 20 78 2e 70 45 4c 69 73 74 20 3d 20 70 53 75 62   x.pEList = pSub
26fa0 71 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 20 20 20  q->pEList;.     
26fb0 20 70 4e 65 77 20 3d 20 73 75 62 73 74 45 78 70   pNew = substExp
26fc0 72 28 26 78 2c 20 70 4e 65 77 29 3b 0a 20 20 20  r(&x, pNew);.   
26fd0 20 20 20 69 66 28 20 70 53 75 62 71 2d 3e 73 65     if( pSubq->se
26fe0 6c 46 6c 61 67 73 20 26 20 53 46 5f 41 67 67 72  lFlags & SF_Aggr
26ff0 65 67 61 74 65 20 29 7b 0a 20 20 20 20 20 20 20  egate ){.       
27000 20 70 53 75 62 71 2d 3e 70 48 61 76 69 6e 67 20   pSubq->pHaving 
27010 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 64  = sqlite3ExprAnd
27020 28 70 50 61 72 73 65 2c 20 70 53 75 62 71 2d 3e  (pParse, pSubq->
27030 70 48 61 76 69 6e 67 2c 20 70 4e 65 77 29 3b 0a  pHaving, pNew);.
27040 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
27050 20 20 20 20 20 70 53 75 62 71 2d 3e 70 57 68 65       pSubq->pWhe
27060 72 65 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  re = sqlite3Expr
27070 41 6e 64 28 70 50 61 72 73 65 2c 20 70 53 75 62  And(pParse, pSub
27080 71 2d 3e 70 57 68 65 72 65 2c 20 70 4e 65 77 29  q->pWhere, pNew)
27090 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
270a0 70 53 75 62 71 20 3d 20 70 53 75 62 71 2d 3e 70  pSubq = pSubq->p
270b0 50 72 69 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 7d  Prior;.    }.  }
270c0 0a 20 20 72 65 74 75 72 6e 20 6e 43 68 6e 67 3b  .  return nChng;
270d0 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65  .}.#endif /* !de
270e0 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
270f0 54 5f 53 55 42 51 55 45 52 59 29 20 7c 7c 20 21  T_SUBQUERY) || !
27100 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
27110 4d 49 54 5f 56 49 45 57 29 20 2a 2f 0a 0a 2f 2a  MIT_VIEW) */../*
27120 0a 2a 2a 20 54 68 65 20 70 46 75 6e 63 20 69 73  .** The pFunc is
27130 20 74 68 65 20 6f 6e 6c 79 20 61 67 67 72 65 67   the only aggreg
27140 61 74 65 20 66 75 6e 63 74 69 6f 6e 20 69 6e 20  ate function in 
27150 74 68 65 20 71 75 65 72 79 2e 20 20 43 68 65 63  the query.  Chec
27160 6b 20 74 6f 20 73 65 65 0a 2a 2a 20 69 66 20 74  k to see.** if t
27170 68 65 20 71 75 65 72 79 20 69 73 20 61 20 63 61  he query is a ca
27180 6e 64 69 64 61 74 65 20 66 6f 72 20 74 68 65 20  ndidate for the 
27190 6d 69 6e 2f 6d 61 78 20 6f 70 74 69 6d 69 7a 61  min/max optimiza
271a0 74 69 6f 6e 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20  tion. .**.** If 
271b0 74 68 65 20 71 75 65 72 79 20 69 73 20 61 20 63  the query is a c
271c0 61 6e 64 69 64 61 74 65 20 66 6f 72 20 74 68 65  andidate for the
271d0 20 6d 69 6e 2f 6d 61 78 20 6f 70 74 69 6d 69 7a   min/max optimiz
271e0 61 74 69 6f 6e 2c 20 74 68 65 6e 20 73 65 74 0a  ation, then set.
271f0 2a 2a 20 2a 70 70 4d 69 6e 4d 61 78 20 74 6f 20  ** *ppMinMax to 
27200 62 65 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63  be an ORDER BY c
27210 6c 61 75 73 65 20 74 6f 20 62 65 20 75 73 65 64  lause to be used
27220 20 66 6f 72 20 74 68 65 20 6f 70 74 69 6d 69 7a   for the optimiz
27230 61 74 69 6f 6e 0a 2a 2a 20 61 6e 64 20 72 65 74  ation.** and ret
27240 75 72 6e 20 65 69 74 68 65 72 20 57 48 45 52 45  urn either WHERE
27250 5f 4f 52 44 45 52 42 59 5f 4d 49 4e 20 6f 72 20  _ORDERBY_MIN or 
27260 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d 41  WHERE_ORDERBY_MA
27270 58 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 0a 2a  X depending on.*
27280 2a 20 77 68 65 74 68 65 72 20 70 46 75 6e 63 20  * whether pFunc 
27290 69 73 20 61 20 6d 69 6e 28 29 20 6f 72 20 6d 61  is a min() or ma
272a0 78 28 29 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a  x() function..**
272b0 0a 2a 2a 20 49 66 20 74 68 65 20 71 75 65 72 79  .** If the query
272c0 20 69 73 20 6e 6f 74 20 61 20 63 61 6e 64 69 64   is not a candid
272d0 61 74 65 20 66 6f 72 20 74 68 65 20 6d 69 6e 2f  ate for the min/
272e0 6d 61 78 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  max optimization
272f0 2c 20 72 65 74 75 72 6e 0a 2a 2a 20 57 48 45 52  , return.** WHER
27300 45 5f 4f 52 44 45 52 42 59 5f 4e 4f 52 4d 41 4c  E_ORDERBY_NORMAL
27310 20 28 77 68 69 63 68 20 6d 75 73 74 20 62 65 20   (which must be 
27320 7a 65 72 6f 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  zero)..**.** Thi
27330 73 20 72 6f 75 74 69 6e 65 20 6d 75 73 74 20 62  s routine must b
27340 65 20 63 61 6c 6c 65 64 20 61 66 74 65 72 20 61  e called after a
27350 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f  ggregate functio
27360 6e 73 20 68 61 76 65 20 62 65 65 6e 0a 2a 2a 20  ns have been.** 
27370 6c 6f 63 61 74 65 64 20 62 75 74 20 62 65 66 6f  located but befo
27380 72 65 20 74 68 65 69 72 20 61 72 67 75 6d 65 6e  re their argumen
27390 74 73 20 68 61 76 65 20 62 65 65 6e 20 73 75 62  ts have been sub
273a0 6a 65 63 74 65 64 20 74 6f 20 61 67 67 72 65 67  jected to aggreg
273b0 61 74 65 0a 2a 2a 20 61 6e 61 6c 79 73 69 73 2e  ate.** analysis.
273c0 0a 2a 2f 0a 73 74 61 74 69 63 20 75 38 20 6d 69  .*/.static u8 mi
273d0 6e 4d 61 78 51 75 65 72 79 28 73 71 6c 69 74 65  nMaxQuery(sqlite
273e0 33 20 2a 64 62 2c 20 45 78 70 72 20 2a 70 46 75  3 *db, Expr *pFu
273f0 6e 63 2c 20 45 78 70 72 4c 69 73 74 20 2a 2a 70  nc, ExprList **p
27400 70 4d 69 6e 4d 61 78 29 7b 0a 20 20 69 6e 74 20  pMinMax){.  int 
27410 65 52 65 74 20 3d 20 57 48 45 52 45 5f 4f 52 44  eRet = WHERE_ORD
27420 45 52 42 59 5f 4e 4f 52 4d 41 4c 3b 20 20 20 20  ERBY_NORMAL;    
27430 20 20 2f 2a 20 52 65 74 75 72 6e 20 76 61 6c 75    /* Return valu
27440 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  e */.  ExprList 
27450 2a 70 45 4c 69 73 74 20 3d 20 70 46 75 6e 63 2d  *pEList = pFunc-
27460 3e 78 2e 70 4c 69 73 74 3b 20 20 20 20 2f 2a 20  >x.pList;    /* 
27470 41 72 67 75 6d 65 6e 74 73 20 74 6f 20 61 67 67  Arguments to agg
27480 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 63   function */.  c
27490 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 75 6e 63  onst char *zFunc
274a0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
274b0 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
274c0 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69  aggregate functi
274d0 6f 6e 20 70 46 75 6e 63 20 2a 2f 0a 20 20 45 78  on pFunc */.  Ex
274e0 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79  prList *pOrderBy
274f0 3b 0a 20 20 75 38 20 73 6f 72 74 4f 72 64 65 72  ;.  u8 sortOrder
27500 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 2a 70 70  ;..  assert( *pp
27510 4d 69 6e 4d 61 78 3d 3d 30 20 29 3b 0a 20 20 61  MinMax==0 );.  a
27520 73 73 65 72 74 28 20 70 46 75 6e 63 2d 3e 6f 70  ssert( pFunc->op
27530 3d 3d 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f  ==TK_AGG_FUNCTIO
27540 4e 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21  N );.  assert( !
27550 49 73 57 69 6e 64 6f 77 46 75 6e 63 28 70 46 75  IsWindowFunc(pFu
27560 6e 63 29 20 29 3b 0a 20 20 69 66 28 20 70 45 4c  nc) );.  if( pEL
27570 69 73 74 3d 3d 30 20 7c 7c 20 70 45 4c 69 73 74  ist==0 || pEList
27580 2d 3e 6e 45 78 70 72 21 3d 31 20 7c 7c 20 45 78  ->nExpr!=1 || Ex
27590 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 46  prHasProperty(pF
275a0 75 6e 63 2c 20 45 50 5f 57 69 6e 46 75 6e 63 29  unc, EP_WinFunc)
275b0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 65   ){.    return e
275c0 52 65 74 3b 0a 20 20 7d 0a 20 20 7a 46 75 6e 63  Ret;.  }.  zFunc
275d0 20 3d 20 70 46 75 6e 63 2d 3e 75 2e 7a 54 6f 6b   = pFunc->u.zTok
275e0 65 6e 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65  en;.  if( sqlite
275f0 33 53 74 72 49 43 6d 70 28 7a 46 75 6e 63 2c 20  3StrICmp(zFunc, 
27600 22 6d 69 6e 22 29 3d 3d 30 20 29 7b 0a 20 20 20  "min")==0 ){.   
27610 20 65 52 65 74 20 3d 20 57 48 45 52 45 5f 4f 52   eRet = WHERE_OR
27620 44 45 52 42 59 5f 4d 49 4e 3b 0a 20 20 20 20 73  DERBY_MIN;.    s
27630 6f 72 74 4f 72 64 65 72 20 3d 20 53 51 4c 49 54  ortOrder = SQLIT
27640 45 5f 53 4f 5f 41 53 43 3b 0a 20 20 7d 65 6c 73  E_SO_ASC;.  }els
27650 65 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72  e if( sqlite3Str
27660 49 43 6d 70 28 7a 46 75 6e 63 2c 20 22 6d 61 78  ICmp(zFunc, "max
27670 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 65 52 65  ")==0 ){.    eRe
27680 74 20 3d 20 57 48 45 52 45 5f 4f 52 44 45 52 42  t = WHERE_ORDERB
27690 59 5f 4d 41 58 3b 0a 20 20 20 20 73 6f 72 74 4f  Y_MAX;.    sortO
276a0 72 64 65 72 20 3d 20 53 51 4c 49 54 45 5f 53 4f  rder = SQLITE_SO
276b0 5f 44 45 53 43 3b 0a 20 20 7d 65 6c 73 65 7b 0a  _DESC;.  }else{.
276c0 20 20 20 20 72 65 74 75 72 6e 20 65 52 65 74 3b      return eRet;
276d0 0a 20 20 7d 0a 20 20 2a 70 70 4d 69 6e 4d 61 78  .  }.  *ppMinMax
276e0 20 3d 20 70 4f 72 64 65 72 42 79 20 3d 20 73 71   = pOrderBy = sq
276f0 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70  lite3ExprListDup
27700 28 64 62 2c 20 70 45 4c 69 73 74 2c 20 30 29 3b  (db, pEList, 0);
27710 0a 20 20 61 73 73 65 72 74 28 20 70 4f 72 64 65  .  assert( pOrde
27720 72 42 79 21 3d 30 20 7c 7c 20 64 62 2d 3e 6d 61  rBy!=0 || db->ma
27730 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20  llocFailed );.  
27740 69 66 28 20 70 4f 72 64 65 72 42 79 20 29 20 70  if( pOrderBy ) p
27750 4f 72 64 65 72 42 79 2d 3e 61 5b 30 5d 2e 73 6f  OrderBy->a[0].so
27760 72 74 4f 72 64 65 72 20 3d 20 73 6f 72 74 4f 72  rtOrder = sortOr
27770 64 65 72 3b 0a 20 20 72 65 74 75 72 6e 20 65 52  der;.  return eR
27780 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  et;.}../*.** The
27790 20 73 65 6c 65 63 74 20 73 74 61 74 65 6d 65 6e   select statemen
277a0 74 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  t passed as the 
277b0 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 69  first argument i
277c0 73 20 61 6e 20 61 67 67 72 65 67 61 74 65 20 71  s an aggregate q
277d0 75 65 72 79 2e 0a 2a 2a 20 54 68 65 20 73 65 63  uery..** The sec
277e0 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20  ond argument is 
277f0 74 68 65 20 61 73 73 6f 63 69 61 74 65 64 20 61  the associated a
27800 67 67 72 65 67 61 74 65 2d 69 6e 66 6f 20 6f 62  ggregate-info ob
27810 6a 65 63 74 2e 20 54 68 69 73 20 0a 2a 2a 20 66  ject. This .** f
27820 75 6e 63 74 69 6f 6e 20 74 65 73 74 73 20 69 66  unction tests if
27830 20 74 68 65 20 53 45 4c 45 43 54 20 69 73 20 6f   the SELECT is o
27840 66 20 74 68 65 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a  f the form:.**.*
27850 2a 20 20 20 53 45 4c 45 43 54 20 63 6f 75 6e 74  *   SELECT count
27860 28 2a 29 20 46 52 4f 4d 20 3c 74 62 6c 3e 0a 2a  (*) FROM <tbl>.*
27870 2a 0a 2a 2a 20 77 68 65 72 65 20 74 61 62 6c 65  *.** where table
27880 20 69 73 20 61 20 64 61 74 61 62 61 73 65 20 74   is a database t
27890 61 62 6c 65 2c 20 6e 6f 74 20 61 20 73 75 62 2d  able, not a sub-
278a0 73 65 6c 65 63 74 20 6f 72 20 76 69 65 77 2e 20  select or view. 
278b0 49 66 20 74 68 65 20 71 75 65 72 79 0a 2a 2a 20  If the query.** 
278c0 64 6f 65 73 20 6d 61 74 63 68 20 74 68 69 73 20  does match this 
278d0 70 61 74 74 65 72 6e 2c 20 74 68 65 6e 20 61 20  pattern, then a 
278e0 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 54  pointer to the T
278f0 61 62 6c 65 20 6f 62 6a 65 63 74 20 72 65 70 72  able object repr
27900 65 73 65 6e 74 69 6e 67 0a 2a 2a 20 3c 74 62 6c  esenting.** <tbl
27910 3e 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f  > is returned. O
27920 74 68 65 72 77 69 73 65 2c 20 30 20 69 73 20 72  therwise, 0 is r
27930 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74  eturned..*/.stat
27940 69 63 20 54 61 62 6c 65 20 2a 69 73 53 69 6d 70  ic Table *isSimp
27950 6c 65 43 6f 75 6e 74 28 53 65 6c 65 63 74 20 2a  leCount(Select *
27960 70 2c 20 41 67 67 49 6e 66 6f 20 2a 70 41 67 67  p, AggInfo *pAgg
27970 49 6e 66 6f 29 7b 0a 20 20 54 61 62 6c 65 20 2a  Info){.  Table *
27980 70 54 61 62 3b 0a 20 20 45 78 70 72 20 2a 70 45  pTab;.  Expr *pE
27990 78 70 72 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  xpr;..  assert( 
279a0 21 70 2d 3e 70 47 72 6f 75 70 42 79 20 29 3b 0a  !p->pGroupBy );.
279b0 0a 20 20 69 66 28 20 70 2d 3e 70 57 68 65 72 65  .  if( p->pWhere
279c0 20 7c 7c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e   || p->pEList->n
279d0 45 78 70 72 21 3d 31 20 0a 20 20 20 7c 7c 20 70  Expr!=1 .   || p
279e0 2d 3e 70 53 72 63 2d 3e 6e 53 72 63 21 3d 31 20  ->pSrc->nSrc!=1 
279f0 7c 7c 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 30 5d  || p->pSrc->a[0]
27a00 2e 70 53 65 6c 65 63 74 0a 20 20 29 7b 0a 20 20  .pSelect.  ){.  
27a10 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
27a20 20 20 70 54 61 62 20 3d 20 70 2d 3e 70 53 72 63    pTab = p->pSrc
27a30 2d 3e 61 5b 30 5d 2e 70 54 61 62 3b 0a 20 20 70  ->a[0].pTab;.  p
27a40 45 78 70 72 20 3d 20 70 2d 3e 70 45 4c 69 73 74  Expr = p->pEList
27a50 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20  ->a[0].pExpr;.  
27a60 61 73 73 65 72 74 28 20 70 54 61 62 20 26 26 20  assert( pTab && 
27a70 21 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 20 26  !pTab->pSelect &
27a80 26 20 70 45 78 70 72 20 29 3b 0a 0a 20 20 69 66  & pExpr );..  if
27a90 28 20 49 73 56 69 72 74 75 61 6c 28 70 54 61 62  ( IsVirtual(pTab
27aa0 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  ) ) return 0;.  
27ab0 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54  if( pExpr->op!=T
27ac0 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 20 29  K_AGG_FUNCTION )
27ad0 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28   return 0;.  if(
27ae0 20 4e 45 56 45 52 28 70 41 67 67 49 6e 66 6f 2d   NEVER(pAggInfo-
27af0 3e 6e 46 75 6e 63 3d 3d 30 29 20 29 20 72 65 74  >nFunc==0) ) ret
27b00 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 28 70 41  urn 0;.  if( (pA
27b10 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 30 5d  ggInfo->aFunc[0]
27b20 2e 70 46 75 6e 63 2d 3e 66 75 6e 63 46 6c 61 67  .pFunc->funcFlag
27b30 73 26 53 51 4c 49 54 45 5f 46 55 4e 43 5f 43 4f  s&SQLITE_FUNC_CO
27b40 55 4e 54 29 3d 3d 30 20 29 20 72 65 74 75 72 6e  UNT)==0 ) return
27b50 20 30 3b 0a 20 20 69 66 28 20 45 78 70 72 48 61   0;.  if( ExprHa
27b60 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
27b70 20 45 50 5f 44 69 73 74 69 6e 63 74 7c 45 50 5f   EP_Distinct|EP_
27b80 57 69 6e 46 75 6e 63 29 20 29 20 72 65 74 75 72  WinFunc) ) retur
27b90 6e 20 30 3b 0a 0a 20 20 72 65 74 75 72 6e 20 70  n 0;..  return p
27ba0 54 61 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66  Tab;.}../*.** If
27bb0 20 74 68 65 20 73 6f 75 72 63 65 2d 6c 69 73 74   the source-list
27bc0 20 69 74 65 6d 20 70 61 73 73 65 64 20 61 73 20   item passed as 
27bd0 61 6e 20 61 72 67 75 6d 65 6e 74 20 77 61 73 20  an argument was 
27be0 61 75 67 6d 65 6e 74 65 64 20 77 69 74 68 20 61  augmented with a
27bf0 6e 0a 2a 2a 20 49 4e 44 45 58 45 44 20 42 59 20  n.** INDEXED BY 
27c00 63 6c 61 75 73 65 2c 20 74 68 65 6e 20 74 72 79  clause, then try
27c10 20 74 6f 20 6c 6f 63 61 74 65 20 74 68 65 20 73   to locate the s
27c20 70 65 63 69 66 69 65 64 20 69 6e 64 65 78 2e 20  pecified index. 
27c30 49 66 20 74 68 65 72 65 0a 2a 2a 20 77 61 73 20  If there.** was 
27c40 73 75 63 68 20 61 20 63 6c 61 75 73 65 20 61 6e  such a clause an
27c50 64 20 74 68 65 20 6e 61 6d 65 64 20 69 6e 64 65  d the named inde
27c60 78 20 63 61 6e 6e 6f 74 20 62 65 20 66 6f 75 6e  x cannot be foun
27c70 64 2c 20 72 65 74 75 72 6e 20 0a 2a 2a 20 53 51  d, return .** SQ
27c80 4c 49 54 45 5f 45 52 52 4f 52 20 61 6e 64 20 6c  LITE_ERROR and l
27c90 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20 69 6e  eave an error in
27ca0 20 70 50 61 72 73 65 2e 20 4f 74 68 65 72 77 69   pParse. Otherwi
27cb0 73 65 2c 20 70 6f 70 75 6c 61 74 65 20 0a 2a 2a  se, populate .**
27cc0 20 70 46 72 6f 6d 2d 3e 70 49 6e 64 65 78 20 61   pFrom->pIndex a
27cd0 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  nd return SQLITE
27ce0 5f 4f 4b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  _OK..*/.int sqli
27cf0 74 65 33 49 6e 64 65 78 65 64 42 79 4c 6f 6f 6b  te3IndexedByLook
27d00 75 70 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  up(Parse *pParse
27d10 2c 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74  , struct SrcList
27d20 5f 69 74 65 6d 20 2a 70 46 72 6f 6d 29 7b 0a 20  _item *pFrom){. 
27d30 20 69 66 28 20 70 46 72 6f 6d 2d 3e 70 54 61 62   if( pFrom->pTab
27d40 20 26 26 20 70 46 72 6f 6d 2d 3e 66 67 2e 69 73   && pFrom->fg.is
27d50 49 6e 64 65 78 65 64 42 79 20 29 7b 0a 20 20 20  IndexedBy ){.   
27d60 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70   Table *pTab = p
27d70 46 72 6f 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20  From->pTab;.    
27d80 63 68 61 72 20 2a 7a 49 6e 64 65 78 65 64 42 79  char *zIndexedBy
27d90 20 3d 20 70 46 72 6f 6d 2d 3e 75 31 2e 7a 49 6e   = pFrom->u1.zIn
27da0 64 65 78 65 64 42 79 3b 0a 20 20 20 20 49 6e 64  dexedBy;.    Ind
27db0 65 78 20 2a 70 49 64 78 3b 0a 20 20 20 20 66 6f  ex *pIdx;.    fo
27dc0 72 28 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e  r(pIdx=pTab->pIn
27dd0 64 65 78 3b 20 0a 20 20 20 20 20 20 20 20 70 49  dex; .        pI
27de0 64 78 20 26 26 20 73 71 6c 69 74 65 33 53 74 72  dx && sqlite3Str
27df0 49 43 6d 70 28 70 49 64 78 2d 3e 7a 4e 61 6d 65  ICmp(pIdx->zName
27e00 2c 20 7a 49 6e 64 65 78 65 64 42 79 29 3b 20 0a  , zIndexedBy); .
27e10 20 20 20 20 20 20 20 20 70 49 64 78 3d 70 49 64          pIdx=pId
27e20 78 2d 3e 70 4e 65 78 74 0a 20 20 20 20 29 3b 0a  x->pNext.    );.
27e30 20 20 20 20 69 66 28 20 21 70 49 64 78 20 29 7b      if( !pIdx ){
27e40 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72  .      sqlite3Er
27e50 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
27e60 6e 6f 20 73 75 63 68 20 69 6e 64 65 78 3a 20 25  no such index: %
27e70 73 22 2c 20 7a 49 6e 64 65 78 65 64 42 79 2c 20  s", zIndexedBy, 
27e80 30 29 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65  0);.      pParse
27e90 2d 3e 63 68 65 63 6b 53 63 68 65 6d 61 20 3d 20  ->checkSchema = 
27ea0 31 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  1;.      return 
27eb0 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
27ec0 20 20 7d 0a 20 20 20 20 70 46 72 6f 6d 2d 3e 70    }.    pFrom->p
27ed0 49 42 49 6e 64 65 78 20 3d 20 70 49 64 78 3b 0a  IBIndex = pIdx;.
27ee0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
27ef0 49 54 45 5f 4f 4b 3b 0a 7d 0a 2f 2a 0a 2a 2a 20  ITE_OK;.}./*.** 
27f00 44 65 74 65 63 74 20 63 6f 6d 70 6f 75 6e 64 20  Detect compound 
27f10 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
27f20 73 20 74 68 61 74 20 75 73 65 20 61 6e 20 4f 52  s that use an OR
27f30 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 77 69  DER BY clause wi
27f40 74 68 20 0a 2a 2a 20 61 6e 20 61 6c 74 65 72 6e  th .** an altern
27f50 61 74 69 76 65 20 63 6f 6c 6c 61 74 69 6e 67 20  ative collating 
27f60 73 65 71 75 65 6e 63 65 2e 0a 2a 2a 0a 2a 2a 20  sequence..**.** 
27f70 20 20 20 53 45 4c 45 43 54 20 2e 2e 2e 20 46 52     SELECT ... FR
27f80 4f 4d 20 74 31 20 45 58 43 45 50 54 20 53 45 4c  OM t1 EXCEPT SEL
27f90 45 43 54 20 2e 2e 2e 20 46 52 4f 4d 20 74 32 20  ECT ... FROM t2 
27fa0 4f 52 44 45 52 20 42 59 20 2e 2e 20 43 4f 4c 4c  ORDER BY .. COLL
27fb0 41 54 45 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 54 68  ATE ....**.** Th
27fc0 65 73 65 20 61 72 65 20 72 65 77 72 69 74 74 65  ese are rewritte
27fd0 6e 20 61 73 20 61 20 73 75 62 71 75 65 72 79 3a  n as a subquery:
27fe0 0a 2a 2a 0a 2a 2a 20 20 20 20 53 45 4c 45 43 54  .**.**    SELECT
27ff0 20 2a 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20   * FROM (SELECT 
28000 2e 2e 2e 20 46 52 4f 4d 20 74 31 20 45 58 43 45  ... FROM t1 EXCE
28010 50 54 20 53 45 4c 45 43 54 20 2e 2e 2e 20 46 52  PT SELECT ... FR
28020 4f 4d 20 74 32 29 0a 2a 2a 20 20 20 20 20 4f 52  OM t2).**     OR
28030 44 45 52 20 42 59 20 2e 2e 2e 20 43 4f 4c 4c 41  DER BY ... COLLA
28040 54 45 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  TE ....**.** Thi
28050 73 20 74 72 61 6e 73 66 6f 72 6d 61 74 69 6f 6e  s transformation
28060 20 69 73 20 6e 65 63 65 73 73 61 72 79 20 62 65   is necessary be
28070 63 61 75 73 65 20 74 68 65 20 6d 75 6c 74 69 53  cause the multiS
28080 65 6c 65 63 74 4f 72 64 65 72 42 79 28 29 20 72  electOrderBy() r
28090 6f 75 74 69 6e 65 0a 2a 2a 20 61 62 6f 76 65 20  outine.** above 
280a0 74 68 61 74 20 67 65 6e 65 72 61 74 65 73 20 74  that generates t
280b0 68 65 20 63 6f 64 65 20 66 6f 72 20 61 20 63 6f  he code for a co
280c0 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 20 77 69  mpound SELECT wi
280d0 74 68 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63  th an ORDER BY c
280e0 6c 61 75 73 65 0a 2a 2a 20 75 73 65 73 20 61 20  lause.** uses a 
280f0 6d 65 72 67 65 20 61 6c 67 6f 72 69 74 68 6d 20  merge algorithm 
28100 74 68 61 74 20 72 65 71 75 69 72 65 73 20 74 68  that requires th
28110 65 20 73 61 6d 65 20 63 6f 6c 6c 61 74 69 6e 67  e same collating
28120 20 73 65 71 75 65 6e 63 65 20 6f 6e 20 74 68 65   sequence on the
28130 0a 2a 2a 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d  .** result colum
28140 6e 73 20 61 73 20 6f 6e 20 74 68 65 20 4f 52 44  ns as on the ORD
28150 45 52 20 42 59 20 63 6c 61 75 73 65 2e 20 20 53  ER BY clause.  S
28160 65 65 20 74 69 63 6b 65 74 0a 2a 2a 20 68 74 74  ee ticket.** htt
28170 70 3a 2f 2f 77 77 77 2e 73 71 6c 69 74 65 2e 6f  p://www.sqlite.o
28180 72 67 2f 73 72 63 2f 69 6e 66 6f 2f 36 37 30 39  rg/src/info/6709
28190 35 37 34 64 32 61 0a 2a 2a 0a 2a 2a 20 54 68 69  574d2a.**.** Thi
281a0 73 20 74 72 61 6e 73 66 6f 72 6d 61 74 69 6f 6e  s transformation
281b0 20 69 73 20 6f 6e 6c 79 20 6e 65 65 64 65 64 20   is only needed 
281c0 66 6f 72 20 45 58 43 45 50 54 2c 20 49 4e 54 45  for EXCEPT, INTE
281d0 52 53 45 43 54 2c 20 61 6e 64 20 55 4e 49 4f 4e  RSECT, and UNION
281e0 2e 0a 2a 2a 20 54 68 65 20 55 4e 49 4f 4e 20 41  ..** The UNION A
281f0 4c 4c 20 6f 70 65 72 61 74 6f 72 20 77 6f 72 6b  LL operator work
28200 73 20 66 69 6e 65 20 77 69 74 68 20 6d 75 6c 74  s fine with mult
28210 69 53 65 6c 65 63 74 4f 72 64 65 72 42 79 28 29  iSelectOrderBy()
28220 20 65 76 65 6e 20 77 68 65 6e 0a 2a 2a 20 74 68   even when.** th
28230 65 72 65 20 61 72 65 20 43 4f 4c 4c 41 54 45 20  ere are COLLATE 
28240 74 65 72 6d 73 20 69 6e 20 74 68 65 20 4f 52 44  terms in the ORD
28250 45 52 20 42 59 2e 0a 2a 2f 0a 73 74 61 74 69 63  ER BY..*/.static
28260 20 69 6e 74 20 63 6f 6e 76 65 72 74 43 6f 6d 70   int convertComp
28270 6f 75 6e 64 53 65 6c 65 63 74 54 6f 53 75 62 71  oundSelectToSubq
28280 75 65 72 79 28 57 61 6c 6b 65 72 20 2a 70 57 61  uery(Walker *pWa
28290 6c 6b 65 72 2c 20 53 65 6c 65 63 74 20 2a 70 29  lker, Select *p)
282a0 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 53 65 6c  {.  int i;.  Sel
282b0 65 63 74 20 2a 70 4e 65 77 3b 0a 20 20 53 65 6c  ect *pNew;.  Sel
282c0 65 63 74 20 2a 70 58 3b 0a 20 20 73 71 6c 69 74  ect *pX;.  sqlit
282d0 65 33 20 2a 64 62 3b 0a 20 20 73 74 72 75 63 74  e3 *db;.  struct
282e0 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a   ExprList_item *
282f0 61 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 4e  a;.  SrcList *pN
28300 65 77 53 72 63 3b 0a 20 20 50 61 72 73 65 20 2a  ewSrc;.  Parse *
28310 70 50 61 72 73 65 3b 0a 20 20 54 6f 6b 65 6e 20  pParse;.  Token 
28320 64 75 6d 6d 79 3b 0a 0a 20 20 69 66 28 20 70 2d  dummy;..  if( p-
28330 3e 70 50 72 69 6f 72 3d 3d 30 20 29 20 72 65 74  >pPrior==0 ) ret
28340 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65  urn WRC_Continue
28350 3b 0a 20 20 69 66 28 20 70 2d 3e 70 4f 72 64 65  ;.  if( p->pOrde
28360 72 42 79 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  rBy==0 ) return 
28370 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20 20  WRC_Continue;.  
28380 66 6f 72 28 70 58 3d 70 3b 20 70 58 20 26 26 20  for(pX=p; pX && 
28390 28 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c 20  (pX->op==TK_ALL 
283a0 7c 7c 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 53 45  || pX->op==TK_SE
283b0 4c 45 43 54 29 3b 20 70 58 3d 70 58 2d 3e 70 50  LECT); pX=pX->pP
283c0 72 69 6f 72 29 7b 7d 0a 20 20 69 66 28 20 70 58  rior){}.  if( pX
283d0 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 57 52 43  ==0 ) return WRC
283e0 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20 20 61 20 3d  _Continue;.  a =
283f0 20 70 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 61 3b   p->pOrderBy->a;
28400 0a 20 20 66 6f 72 28 69 3d 70 2d 3e 70 4f 72 64  .  for(i=p->pOrd
28410 65 72 42 79 2d 3e 6e 45 78 70 72 2d 31 3b 20 69  erBy->nExpr-1; i
28420 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 69  >=0; i--){.    i
28430 66 28 20 61 5b 69 5d 2e 70 45 78 70 72 2d 3e 66  f( a[i].pExpr->f
28440 6c 61 67 73 20 26 20 45 50 5f 43 6f 6c 6c 61 74  lags & EP_Collat
28450 65 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20  e ) break;.  }. 
28460 20 69 66 28 20 69 3c 30 20 29 20 72 65 74 75 72   if( i<0 ) retur
28470 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a  n WRC_Continue;.
28480 0a 20 20 2f 2a 20 49 66 20 77 65 20 72 65 61 63  .  /* If we reac
28490 68 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 74 68  h this point, th
284a0 61 74 20 6d 65 61 6e 73 20 74 68 65 20 74 72 61  at means the tra
284b0 6e 73 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 72  nsformation is r
284c0 65 71 75 69 72 65 64 2e 20 2a 2f 0a 0a 20 20 70  equired. */..  p
284d0 50 61 72 73 65 20 3d 20 70 57 61 6c 6b 65 72 2d  Parse = pWalker-
284e0 3e 70 50 61 72 73 65 3b 0a 20 20 64 62 20 3d 20  >pParse;.  db = 
284f0 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 70 4e  pParse->db;.  pN
28500 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  ew = sqlite3DbMa
28510 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a  llocZero(db, siz
28520 65 6f 66 28 2a 70 4e 65 77 29 20 29 3b 0a 20 20  eof(*pNew) );.  
28530 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 20 72 65  if( pNew==0 ) re
28540 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a  turn WRC_Abort;.
28550 20 20 6d 65 6d 73 65 74 28 26 64 75 6d 6d 79 2c    memset(&dummy,
28560 20 30 2c 20 73 69 7a 65 6f 66 28 64 75 6d 6d 79   0, sizeof(dummy
28570 29 29 3b 0a 20 20 70 4e 65 77 53 72 63 20 3d 20  ));.  pNewSrc = 
28580 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41 70  sqlite3SrcListAp
28590 70 65 6e 64 46 72 6f 6d 54 65 72 6d 28 70 50 61  pendFromTerm(pPa
285a0 72 73 65 2c 30 2c 30 2c 30 2c 26 64 75 6d 6d 79  rse,0,0,0,&dummy
285b0 2c 70 4e 65 77 2c 30 2c 30 29 3b 0a 20 20 69 66  ,pNew,0,0);.  if
285c0 28 20 70 4e 65 77 53 72 63 3d 3d 30 20 29 20 72  ( pNewSrc==0 ) r
285d0 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b  eturn WRC_Abort;
285e0 0a 20 20 2a 70 4e 65 77 20 3d 20 2a 70 3b 0a 20  .  *pNew = *p;. 
285f0 20 70 2d 3e 70 53 72 63 20 3d 20 70 4e 65 77 53   p->pSrc = pNewS
28600 72 63 3b 0a 20 20 70 2d 3e 70 45 4c 69 73 74 20  rc;.  p->pEList 
28610 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  = sqlite3ExprLis
28620 74 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20  tAppend(pParse, 
28630 30 2c 20 73 71 6c 69 74 65 33 45 78 70 72 28 64  0, sqlite3Expr(d
28640 62 2c 20 54 4b 5f 41 53 54 45 52 49 53 4b 2c 20  b, TK_ASTERISK, 
28650 30 29 29 3b 0a 20 20 70 2d 3e 6f 70 20 3d 20 54  0));.  p->op = T
28660 4b 5f 53 45 4c 45 43 54 3b 0a 20 20 70 2d 3e 70  K_SELECT;.  p->p
28670 57 68 65 72 65 20 3d 20 30 3b 0a 20 20 70 4e 65  Where = 0;.  pNe
28680 77 2d 3e 70 47 72 6f 75 70 42 79 20 3d 20 30 3b  w->pGroupBy = 0;
28690 0a 20 20 70 4e 65 77 2d 3e 70 48 61 76 69 6e 67  .  pNew->pHaving
286a0 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 70 4f   = 0;.  pNew->pO
286b0 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 70 2d  rderBy = 0;.  p-
286c0 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 70  >pPrior = 0;.  p
286d0 2d 3e 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 70  ->pNext = 0;.  p
286e0 2d 3e 70 57 69 74 68 20 3d 20 30 3b 0a 20 20 70  ->pWith = 0;.  p
286f0 2d 3e 73 65 6c 46 6c 61 67 73 20 26 3d 20 7e 53  ->selFlags &= ~S
28700 46 5f 43 6f 6d 70 6f 75 6e 64 3b 0a 20 20 61 73  F_Compound;.  as
28710 73 65 72 74 28 20 28 70 2d 3e 73 65 6c 46 6c 61  sert( (p->selFla
28720 67 73 20 26 20 53 46 5f 43 6f 6e 76 65 72 74 65  gs & SF_Converte
28730 64 29 3d 3d 30 20 29 3b 0a 20 20 70 2d 3e 73 65  d)==0 );.  p->se
28740 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f 43 6f 6e  lFlags |= SF_Con
28750 76 65 72 74 65 64 3b 0a 20 20 61 73 73 65 72 74  verted;.  assert
28760 28 20 70 4e 65 77 2d 3e 70 50 72 69 6f 72 21 3d  ( pNew->pPrior!=
28770 30 20 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 50 72  0 );.  pNew->pPr
28780 69 6f 72 2d 3e 70 4e 65 78 74 20 3d 20 70 4e 65  ior->pNext = pNe
28790 77 3b 0a 20 20 70 4e 65 77 2d 3e 70 4c 69 6d 69  w;.  pNew->pLimi
287a0 74 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20  t = 0;.  return 
287b0 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a  WRC_Continue;.}.
287c0 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 6f 20  ./*.** Check to 
287d0 73 65 65 20 69 66 20 74 68 65 20 46 52 4f 4d 20  see if the FROM 
287e0 63 6c 61 75 73 65 20 74 65 72 6d 20 70 46 72 6f  clause term pFro
287f0 6d 20 68 61 73 20 74 61 62 6c 65 2d 76 61 6c 75  m has table-valu
28800 65 64 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 61  ed function.** a
28810 72 67 75 6d 65 6e 74 73 2e 20 20 49 66 20 69 74  rguments.  If it
28820 20 64 6f 65 73 2c 20 6c 65 61 76 65 20 61 6e 20   does, leave an 
28830 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 6e  error message in
28840 20 70 50 61 72 73 65 20 61 6e 64 20 72 65 74 75   pParse and retu
28850 72 6e 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 2c 20  rn.** non-zero, 
28860 73 69 6e 63 65 20 70 46 72 6f 6d 20 69 73 20 6e  since pFrom is n
28870 6f 74 20 61 6c 6c 6f 77 65 64 20 74 6f 20 62 65  ot allowed to be
28880 20 61 20 74 61 62 6c 65 2d 76 61 6c 75 65 64 20   a table-valued 
28890 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  function..*/.sta
288a0 74 69 63 20 69 6e 74 20 63 61 6e 6e 6f 74 42 65  tic int cannotBe
288b0 46 75 6e 63 74 69 6f 6e 28 50 61 72 73 65 20 2a  Function(Parse *
288c0 70 50 61 72 73 65 2c 20 73 74 72 75 63 74 20 53  pParse, struct S
288d0 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 46 72  rcList_item *pFr
288e0 6f 6d 29 7b 0a 20 20 69 66 28 20 70 46 72 6f 6d  om){.  if( pFrom
288f0 2d 3e 66 67 2e 69 73 54 61 62 46 75 6e 63 20 29  ->fg.isTabFunc )
28900 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
28910 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 27  orMsg(pParse, "'
28920 25 73 27 20 69 73 20 6e 6f 74 20 61 20 66 75 6e  %s' is not a fun
28930 63 74 69 6f 6e 22 2c 20 70 46 72 6f 6d 2d 3e 7a  ction", pFrom->z
28940 4e 61 6d 65 29 3b 0a 20 20 20 20 72 65 74 75 72  Name);.    retur
28950 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  n 1;.  }.  retur
28960 6e 20 30 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20  n 0;.}..#ifndef 
28970 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 54 45 0a  SQLITE_OMIT_CTE.
28980 2f 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20 70  /*.** Argument p
28990 57 69 74 68 20 28 77 68 69 63 68 20 6d 61 79 20  With (which may 
289a0 62 65 20 4e 55 4c 4c 29 20 70 6f 69 6e 74 73 20  be NULL) points 
289b0 74 6f 20 61 20 6c 69 6e 6b 65 64 20 6c 69 73 74  to a linked list
289c0 20 6f 66 20 6e 65 73 74 65 64 20 0a 2a 2a 20 57   of nested .** W
289d0 49 54 48 20 63 6f 6e 74 65 78 74 73 2c 20 66 72  ITH contexts, fr
289e0 6f 6d 20 69 6e 6e 65 72 20 74 6f 20 6f 75 74 65  om inner to oute
289f0 72 6d 6f 73 74 2e 20 49 66 20 74 68 65 20 74 61  rmost. If the ta
28a00 62 6c 65 20 69 64 65 6e 74 69 66 69 65 64 20 62  ble identified b
28a10 79 20 0a 2a 2a 20 46 52 4f 4d 20 63 6c 61 75 73  y .** FROM claus
28a20 65 20 65 6c 65 6d 65 6e 74 20 70 49 74 65 6d 20  e element pItem 
28a30 69 73 20 72 65 61 6c 6c 79 20 61 20 63 6f 6d 6d  is really a comm
28a40 6f 6e 2d 74 61 62 6c 65 2d 65 78 70 72 65 73 73  on-table-express
28a50 69 6f 6e 20 28 43 54 45 29 20 0a 2a 2a 20 74 68  ion (CTE) .** th
28a60 65 6e 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e  en return a poin
28a70 74 65 72 20 74 6f 20 74 68 65 20 43 54 45 20 64  ter to the CTE d
28a80 65 66 69 6e 69 74 69 6f 6e 20 66 6f 72 20 74 68  efinition for th
28a90 61 74 20 74 61 62 6c 65 2e 20 4f 74 68 65 72 77  at table. Otherw
28aa0 69 73 65 0a 2a 2a 20 72 65 74 75 72 6e 20 4e 55  ise.** return NU
28ab0 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 6e  LL..**.** If a n
28ac0 6f 6e 2d 4e 55 4c 4c 20 76 61 6c 75 65 20 69 73  on-NULL value is
28ad0 20 72 65 74 75 72 6e 65 64 2c 20 73 65 74 20 2a   returned, set *
28ae0 70 70 43 6f 6e 74 65 78 74 20 74 6f 20 70 6f 69  ppContext to poi
28af0 6e 74 20 74 6f 20 74 68 65 20 57 69 74 68 0a 2a  nt to the With.*
28b00 2a 20 6f 62 6a 65 63 74 20 74 68 61 74 20 74 68  * object that th
28b10 65 20 72 65 74 75 72 6e 65 64 20 43 54 45 20 62  e returned CTE b
28b20 65 6c 6f 6e 67 73 20 74 6f 2e 0a 2a 2f 0a 73 74  elongs to..*/.st
28b30 61 74 69 63 20 73 74 72 75 63 74 20 43 74 65 20  atic struct Cte 
28b40 2a 73 65 61 72 63 68 57 69 74 68 28 0a 20 20 57  *searchWith(.  W
28b50 69 74 68 20 2a 70 57 69 74 68 2c 20 20 20 20 20  ith *pWith,     
28b60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
28b70 2a 20 43 75 72 72 65 6e 74 20 69 6e 6e 65 72 6d  * Current innerm
28b80 6f 73 74 20 57 49 54 48 20 63 6c 61 75 73 65 20  ost WITH clause 
28b90 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c  */.  struct SrcL
28ba0 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 2c  ist_item *pItem,
28bb0 20 20 20 20 20 2f 2a 20 46 52 4f 4d 20 63 6c 61       /* FROM cla
28bc0 75 73 65 20 65 6c 65 6d 65 6e 74 20 74 6f 20 72  use element to r
28bd0 65 73 6f 6c 76 65 20 2a 2f 0a 20 20 57 69 74 68  esolve */.  With
28be0 20 2a 2a 70 70 43 6f 6e 74 65 78 74 20 20 20 20   **ppContext    
28bf0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
28c00 55 54 3a 20 57 49 54 48 20 63 6c 61 75 73 65 20  UT: WITH clause 
28c10 72 65 74 75 72 6e 20 76 61 6c 75 65 20 62 65 6c  return value bel
28c20 6f 6e 67 73 20 74 6f 20 2a 2f 0a 29 7b 0a 20 20  ongs to */.){.  
28c30 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d  const char *zNam
28c40 65 3b 0a 20 20 69 66 28 20 70 49 74 65 6d 2d 3e  e;.  if( pItem->
28c50 7a 44 61 74 61 62 61 73 65 3d 3d 30 20 26 26 20  zDatabase==0 && 
28c60 28 7a 4e 61 6d 65 20 3d 20 70 49 74 65 6d 2d 3e  (zName = pItem->
28c70 7a 4e 61 6d 65 29 21 3d 30 20 29 7b 0a 20 20 20  zName)!=0 ){.   
28c80 20 57 69 74 68 20 2a 70 3b 0a 20 20 20 20 66 6f   With *p;.    fo
28c90 72 28 70 3d 70 57 69 74 68 3b 20 70 3b 20 70 3d  r(p=pWith; p; p=
28ca0 70 2d 3e 70 4f 75 74 65 72 29 7b 0a 20 20 20 20  p->pOuter){.    
28cb0 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 66    int i;.      f
28cc0 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 74  or(i=0; i<p->nCt
28cd0 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  e; i++){.       
28ce0 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49   if( sqlite3StrI
28cf0 43 6d 70 28 7a 4e 61 6d 65 2c 20 70 2d 3e 61 5b  Cmp(zName, p->a[
28d00 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a  i].zName)==0 ){.
28d10 20 20 20 20 20 20 20 20 20 20 2a 70 70 43 6f 6e            *ppCon
28d20 74 65 78 74 20 3d 20 70 3b 0a 20 20 20 20 20 20  text = p;.      
28d30 20 20 20 20 72 65 74 75 72 6e 20 26 70 2d 3e 61      return &p->a
28d40 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  [i];.        }. 
28d50 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
28d60 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
28d70 2f 2a 20 54 68 65 20 63 6f 64 65 20 67 65 6e 65  /* The code gene
28d80 72 61 74 6f 72 20 6d 61 69 6e 74 61 69 6e 73 20  rator maintains 
28d90 61 20 73 74 61 63 6b 20 6f 66 20 61 63 74 69 76  a stack of activ
28da0 65 20 57 49 54 48 20 63 6c 61 75 73 65 73 0a 2a  e WITH clauses.*
28db0 2a 20 77 69 74 68 20 74 68 65 20 69 6e 6e 65 72  * with the inner
28dc0 2d 6d 6f 73 74 20 57 49 54 48 20 63 6c 61 75 73  -most WITH claus
28dd0 65 20 62 65 69 6e 67 20 61 74 20 74 68 65 20 74  e being at the t
28de0 6f 70 20 6f 66 20 74 68 65 20 73 74 61 63 6b 2e  op of the stack.
28df0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
28e00 69 6e 65 20 70 75 73 68 65 73 20 74 68 65 20 57  ine pushes the W
28e10 49 54 48 20 63 6c 61 75 73 65 20 70 61 73 73 65  ITH clause passe
28e20 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20  d as the second 
28e30 61 72 67 75 6d 65 6e 74 0a 2a 2a 20 6f 6e 74 6f  argument.** onto
28e40 20 74 68 65 20 74 6f 70 20 6f 66 20 74 68 65 20   the top of the 
28e50 73 74 61 63 6b 2e 20 49 66 20 61 72 67 75 6d 65  stack. If argume
28e60 6e 74 20 62 46 72 65 65 20 69 73 20 74 72 75 65  nt bFree is true
28e70 2c 20 74 68 65 6e 20 74 68 69 73 0a 2a 2a 20 57  , then this.** W
28e80 49 54 48 20 63 6c 61 75 73 65 20 77 69 6c 6c 20  ITH clause will 
28e90 6e 65 76 65 72 20 62 65 20 70 6f 70 70 65 64 20  never be popped 
28ea0 66 72 6f 6d 20 74 68 65 20 73 74 61 63 6b 2e 20  from the stack. 
28eb0 49 6e 20 74 68 69 73 20 63 61 73 65 20 69 74 0a  In this case it.
28ec0 2a 2a 20 73 68 6f 75 6c 64 20 62 65 20 66 72 65  ** should be fre
28ed0 65 64 20 61 6c 6f 6e 67 20 77 69 74 68 20 74 68  ed along with th
28ee0 65 20 50 61 72 73 65 20 6f 62 6a 65 63 74 2e 20  e Parse object. 
28ef0 49 6e 20 6f 74 68 65 72 20 63 61 73 65 73 2c 20  In other cases, 
28f00 77 68 65 6e 0a 2a 2a 20 62 46 72 65 65 3d 3d 30  when.** bFree==0
28f10 2c 20 74 68 65 20 57 69 74 68 20 6f 62 6a 65 63  , the With objec
28f20 74 20 77 69 6c 6c 20 62 65 20 66 72 65 65 64 20  t will be freed 
28f30 61 6c 6f 6e 67 20 77 69 74 68 20 74 68 65 20 53  along with the S
28f40 45 4c 45 43 54 20 0a 2a 2a 20 73 74 61 74 65 6d  ELECT .** statem
28f50 65 6e 74 20 77 69 74 68 20 77 68 69 63 68 20 69  ent with which i
28f60 74 20 69 73 20 61 73 73 6f 63 69 61 74 65 64 2e  t is associated.
28f70 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
28f80 57 69 74 68 50 75 73 68 28 50 61 72 73 65 20 2a  WithPush(Parse *
28f90 70 50 61 72 73 65 2c 20 57 69 74 68 20 2a 70 57  pParse, With *pW
28fa0 69 74 68 2c 20 75 38 20 62 46 72 65 65 29 7b 0a  ith, u8 bFree){.
28fb0 20 20 61 73 73 65 72 74 28 20 62 46 72 65 65 3d    assert( bFree=
28fc0 3d 30 20 7c 7c 20 28 70 50 61 72 73 65 2d 3e 70  =0 || (pParse->p
28fd0 57 69 74 68 3d 3d 30 20 26 26 20 70 50 61 72 73  With==0 && pPars
28fe0 65 2d 3e 70 57 69 74 68 54 6f 46 72 65 65 3d 3d  e->pWithToFree==
28ff0 30 29 20 29 3b 0a 20 20 69 66 28 20 70 57 69 74  0) );.  if( pWit
29000 68 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  h ){.    assert(
29010 20 70 50 61 72 73 65 2d 3e 70 57 69 74 68 21 3d   pParse->pWith!=
29020 70 57 69 74 68 20 29 3b 0a 20 20 20 20 70 57 69  pWith );.    pWi
29030 74 68 2d 3e 70 4f 75 74 65 72 20 3d 20 70 50 61  th->pOuter = pPa
29040 72 73 65 2d 3e 70 57 69 74 68 3b 0a 20 20 20 20  rse->pWith;.    
29050 70 50 61 72 73 65 2d 3e 70 57 69 74 68 20 3d 20  pParse->pWith = 
29060 70 57 69 74 68 3b 0a 20 20 20 20 69 66 28 20 62  pWith;.    if( b
29070 46 72 65 65 20 29 20 70 50 61 72 73 65 2d 3e 70  Free ) pParse->p
29080 57 69 74 68 54 6f 46 72 65 65 20 3d 20 70 57 69  WithToFree = pWi
29090 74 68 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  th;.  }.}../*.**
290a0 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63   This function c
290b0 68 65 63 6b 73 20 69 66 20 61 72 67 75 6d 65 6e  hecks if argumen
290c0 74 20 70 46 72 6f 6d 20 72 65 66 65 72 73 20 74  t pFrom refers t
290d0 6f 20 61 20 43 54 45 20 64 65 63 6c 61 72 65 64  o a CTE declared
290e0 20 62 79 20 0a 2a 2a 20 61 20 57 49 54 48 20 63   by .** a WITH c
290f0 6c 61 75 73 65 20 6f 6e 20 74 68 65 20 73 74 61  lause on the sta
29100 63 6b 20 63 75 72 72 65 6e 74 6c 79 20 6d 61 69  ck currently mai
29110 6e 74 61 69 6e 65 64 20 62 79 20 74 68 65 20 70  ntained by the p
29120 61 72 73 65 72 2e 20 41 6e 64 2c 0a 2a 2a 20 69  arser. And,.** i
29130 66 20 63 75 72 72 65 6e 74 6c 79 20 70 72 6f 63  f currently proc
29140 65 73 73 69 6e 67 20 61 20 43 54 45 20 65 78 70  essing a CTE exp
29150 72 65 73 73 69 6f 6e 2c 20 69 66 20 69 74 20 69  ression, if it i
29160 73 20 61 20 72 65 63 75 72 73 69 76 65 0a 2a 2a  s a recursive.**
29170 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68   reference to th
29180 65 20 63 75 72 72 65 6e 74 20 43 54 45 2e 0a 2a  e current CTE..*
29190 2a 0a 2a 2a 20 49 66 20 70 46 72 6f 6d 20 66 61  *.** If pFrom fa
291a0 6c 6c 73 20 69 6e 74 6f 20 65 69 74 68 65 72 20  lls into either 
291b0 6f 66 20 74 68 65 20 74 77 6f 20 63 61 74 65 67  of the two categ
291c0 6f 72 69 65 73 20 61 62 6f 76 65 2c 20 70 46 72  ories above, pFr
291d0 6f 6d 2d 3e 70 54 61 62 0a 2a 2a 20 61 6e 64 20  om->pTab.** and 
291e0 6f 74 68 65 72 20 66 69 65 6c 64 73 20 61 72 65  other fields are
291f0 20 70 6f 70 75 6c 61 74 65 64 20 61 63 63 6f 72   populated accor
29200 64 69 6e 67 6c 79 2e 20 54 68 65 20 63 61 6c 6c  dingly. The call
29210 65 72 20 73 68 6f 75 6c 64 20 63 68 65 63 6b 0a  er should check.
29220 2a 2a 20 28 70 46 72 6f 6d 2d 3e 70 54 61 62 21  ** (pFrom->pTab!
29230 3d 30 29 20 74 6f 20 64 65 74 65 72 6d 69 6e 65  =0) to determine
29240 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20   whether or not 
29250 61 20 73 75 63 63 65 73 73 66 75 6c 20 6d 61 74  a successful mat
29260 63 68 0a 2a 2a 20 77 61 73 20 66 6f 75 6e 64 2e  ch.** was found.
29270 0a 2a 2a 0a 2a 2a 20 57 68 65 74 68 65 72 20 6f  .**.** Whether o
29280 72 20 6e 6f 74 20 61 20 6d 61 74 63 68 20 69 73  r not a match is
29290 20 66 6f 75 6e 64 2c 20 53 51 4c 49 54 45 5f 4f   found, SQLITE_O
292a0 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66  K is returned if
292b0 20 6e 6f 20 65 72 72 6f 72 0a 2a 2a 20 6f 63 63   no error.** occ
292c0 75 72 73 2e 20 49 66 20 61 6e 20 65 72 72 6f 72  urs. If an error
292d0 20 64 6f 65 73 20 6f 63 63 75 72 2c 20 61 6e 20   does occur, an 
292e0 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 73  error message is
292f0 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 0a 2a   stored in the.*
29300 2a 20 70 61 72 73 65 72 20 61 6e 64 20 73 6f 6d  * parser and som
29310 65 20 65 72 72 6f 72 20 63 6f 64 65 20 6f 74 68  e error code oth
29320 65 72 20 74 68 61 6e 20 53 51 4c 49 54 45 5f 4f  er than SQLITE_O
29330 4b 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73  K returned..*/.s
29340 74 61 74 69 63 20 69 6e 74 20 77 69 74 68 45 78  tatic int withEx
29350 70 61 6e 64 28 0a 20 20 57 61 6c 6b 65 72 20 2a  pand(.  Walker *
29360 70 57 61 6c 6b 65 72 2c 20 0a 20 20 73 74 72 75  pWalker, .  stru
29370 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
29380 2a 70 46 72 6f 6d 0a 29 7b 0a 20 20 50 61 72 73  *pFrom.){.  Pars
29390 65 20 2a 70 50 61 72 73 65 20 3d 20 70 57 61 6c  e *pParse = pWal
293a0 6b 65 72 2d 3e 70 50 61 72 73 65 3b 0a 20 20 73  ker->pParse;.  s
293b0 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
293c0 72 73 65 2d 3e 64 62 3b 0a 20 20 73 74 72 75 63  rse->db;.  struc
293d0 74 20 43 74 65 20 2a 70 43 74 65 3b 20 20 20 20  t Cte *pCte;    
293e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61             /* Ma
293f0 74 63 68 65 64 20 43 54 45 20 28 6f 72 20 4e 55  tched CTE (or NU
29400 4c 4c 20 69 66 20 6e 6f 20 6d 61 74 63 68 29 20  LL if no match) 
29410 2a 2f 0a 20 20 57 69 74 68 20 2a 70 57 69 74 68  */.  With *pWith
29420 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
29430 20 20 20 20 20 2f 2a 20 57 49 54 48 20 63 6c 61       /* WITH cla
29440 75 73 65 20 74 68 61 74 20 70 43 74 65 20 62 65  use that pCte be
29450 6c 6f 6e 67 73 20 74 6f 20 2a 2f 0a 0a 20 20 61  longs to */..  a
29460 73 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e 70 54  ssert( pFrom->pT
29470 61 62 3d 3d 30 20 29 3b 0a 0a 20 20 70 43 74 65  ab==0 );..  pCte
29480 20 3d 20 73 65 61 72 63 68 57 69 74 68 28 70 50   = searchWith(pP
29490 61 72 73 65 2d 3e 70 57 69 74 68 2c 20 70 46 72  arse->pWith, pFr
294a0 6f 6d 2c 20 26 70 57 69 74 68 29 3b 0a 20 20 69  om, &pWith);.  i
294b0 66 28 20 70 43 74 65 20 29 7b 0a 20 20 20 20 54  f( pCte ){.    T
294c0 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 20 20  able *pTab;.    
294d0 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74  ExprList *pEList
294e0 3b 0a 20 20 20 20 53 65 6c 65 63 74 20 2a 70 53  ;.    Select *pS
294f0 65 6c 3b 0a 20 20 20 20 53 65 6c 65 63 74 20 2a  el;.    Select *
29500 70 4c 65 66 74 3b 20 20 20 20 20 20 20 20 20 20  pLeft;          
29510 20 20 20 20 20 20 2f 2a 20 4c 65 66 74 2d 6d 6f        /* Left-mo
29520 73 74 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  st SELECT statem
29530 65 6e 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20 62  ent */.    int b
29540 4d 61 79 52 65 63 75 72 73 69 76 65 3b 20 20 20  MayRecursive;   
29550 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
29560 20 69 66 20 63 6f 6d 70 6f 75 6e 64 20 6a 6f 69   if compound joi
29570 6e 65 64 20 62 79 20 55 4e 49 4f 4e 20 5b 41 4c  ned by UNION [AL
29580 4c 5d 20 2a 2f 0a 20 20 20 20 57 69 74 68 20 2a  L] */.    With *
29590 70 53 61 76 65 64 57 69 74 68 3b 20 20 20 20 20  pSavedWith;     
295a0 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 69 74 69          /* Initi
295b0 61 6c 20 76 61 6c 75 65 20 6f 66 20 70 50 61 72  al value of pPar
295c0 73 65 2d 3e 70 57 69 74 68 20 2a 2f 0a 0a 20 20  se->pWith */..  
295d0 20 20 2f 2a 20 49 66 20 70 43 74 65 2d 3e 7a 43    /* If pCte->zC
295e0 74 65 45 72 72 20 69 73 20 6e 6f 6e 2d 4e 55 4c  teErr is non-NUL
295f0 4c 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74 2c  L at this point,
29600 20 74 68 65 6e 20 74 68 69 73 20 69 73 20 61 6e   then this is an
29610 20 69 6c 6c 65 67 61 6c 0a 20 20 20 20 2a 2a 20   illegal.    ** 
29620 72 65 63 75 72 73 69 76 65 20 72 65 66 65 72 65  recursive refere
29630 6e 63 65 20 74 6f 20 43 54 45 20 70 43 74 65 2e  nce to CTE pCte.
29640 20 4c 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20   Leave an error 
29650 69 6e 20 70 50 61 72 73 65 20 61 6e 64 20 72 65  in pParse and re
29660 74 75 72 6e 0a 20 20 20 20 2a 2a 20 65 61 72 6c  turn.    ** earl
29670 79 2e 20 49 66 20 70 43 74 65 2d 3e 7a 43 74 65  y. If pCte->zCte
29680 45 72 72 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65  Err is NULL, the
29690 6e 20 74 68 69 73 20 69 73 20 6e 6f 74 20 61 20  n this is not a 
296a0 72 65 63 75 72 73 69 76 65 20 72 65 66 65 72 65  recursive refere
296b0 6e 63 65 2e 0a 20 20 20 20 2a 2a 20 49 6e 20 74  nce..    ** In t
296c0 68 69 73 20 63 61 73 65 2c 20 70 72 6f 63 65 65  his case, procee
296d0 64 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70  d.  */.    if( p
296e0 43 74 65 2d 3e 7a 43 74 65 45 72 72 20 29 7b 0a  Cte->zCteErr ){.
296f0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
29700 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 70 43  orMsg(pParse, pC
29710 74 65 2d 3e 7a 43 74 65 45 72 72 2c 20 70 43 74  te->zCteErr, pCt
29720 65 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  e->zName);.     
29730 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
29740 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20  RROR;.    }.    
29750 69 66 28 20 63 61 6e 6e 6f 74 42 65 46 75 6e 63  if( cannotBeFunc
29760 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 70 46 72  tion(pParse, pFr
29770 6f 6d 29 20 29 20 72 65 74 75 72 6e 20 53 51 4c  om) ) return SQL
29780 49 54 45 5f 45 52 52 4f 52 3b 0a 0a 20 20 20 20  ITE_ERROR;..    
29790 61 73 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e 70  assert( pFrom->p
297a0 54 61 62 3d 3d 30 20 29 3b 0a 20 20 20 20 70 46  Tab==0 );.    pF
297b0 72 6f 6d 2d 3e 70 54 61 62 20 3d 20 70 54 61 62  rom->pTab = pTab
297c0 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
297d0 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f  ocZero(db, sizeo
297e0 66 28 54 61 62 6c 65 29 29 3b 0a 20 20 20 20 69  f(Table));.    i
297f0 66 28 20 70 54 61 62 3d 3d 30 20 29 20 72 65 74  f( pTab==0 ) ret
29800 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20  urn WRC_Abort;. 
29810 20 20 20 70 54 61 62 2d 3e 6e 54 61 62 52 65 66     pTab->nTabRef
29820 20 3d 20 31 3b 0a 20 20 20 20 70 54 61 62 2d 3e   = 1;.    pTab->
29830 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44  zName = sqlite3D
29840 62 53 74 72 44 75 70 28 64 62 2c 20 70 43 74 65  bStrDup(db, pCte
29850 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 70 54  ->zName);.    pT
29860 61 62 2d 3e 69 50 4b 65 79 20 3d 20 2d 31 3b 0a  ab->iPKey = -1;.
29870 20 20 20 20 70 54 61 62 2d 3e 6e 52 6f 77 4c 6f      pTab->nRowLo
29880 67 45 73 74 20 3d 20 32 30 30 3b 20 61 73 73 65  gEst = 200; asse
29890 72 74 28 20 32 30 30 3d 3d 73 71 6c 69 74 65 33  rt( 200==sqlite3
298a0 4c 6f 67 45 73 74 28 31 30 34 38 35 37 36 29 20  LogEst(1048576) 
298b0 29 3b 0a 20 20 20 20 70 54 61 62 2d 3e 74 61 62  );.    pTab->tab
298c0 46 6c 61 67 73 20 7c 3d 20 54 46 5f 45 70 68 65  Flags |= TF_Ephe
298d0 6d 65 72 61 6c 20 7c 20 54 46 5f 4e 6f 56 69 73  meral | TF_NoVis
298e0 69 62 6c 65 52 6f 77 69 64 3b 0a 20 20 20 20 70  ibleRowid;.    p
298f0 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 20 3d 20  From->pSelect = 
29900 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70  sqlite3SelectDup
29910 28 64 62 2c 20 70 43 74 65 2d 3e 70 53 65 6c 65  (db, pCte->pSele
29920 63 74 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  ct, 0);.    if( 
29930 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
29940 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
29950 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20  _NOMEM_BKPT;.   
29960 20 61 73 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e   assert( pFrom->
29970 70 53 65 6c 65 63 74 20 29 3b 0a 0a 20 20 20 20  pSelect );..    
29980 2f 2a 20 43 68 65 63 6b 20 69 66 20 74 68 69 73  /* Check if this
29990 20 69 73 20 61 20 72 65 63 75 72 73 69 76 65 20   is a recursive 
299a0 43 54 45 2e 20 2a 2f 0a 20 20 20 20 70 53 65 6c  CTE. */.    pSel
299b0 20 3d 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63   = pFrom->pSelec
299c0 74 3b 0a 20 20 20 20 62 4d 61 79 52 65 63 75 72  t;.    bMayRecur
299d0 73 69 76 65 20 3d 20 28 20 70 53 65 6c 2d 3e 6f  sive = ( pSel->o
299e0 70 3d 3d 54 4b 5f 41 4c 4c 20 7c 7c 20 70 53 65  p==TK_ALL || pSe
299f0 6c 2d 3e 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20  l->op==TK_UNION 
29a00 29 3b 0a 20 20 20 20 69 66 28 20 62 4d 61 79 52  );.    if( bMayR
29a10 65 63 75 72 73 69 76 65 20 29 7b 0a 20 20 20 20  ecursive ){.    
29a20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 53    int i;.      S
29a30 72 63 4c 69 73 74 20 2a 70 53 72 63 20 3d 20 70  rcList *pSrc = p
29a40 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 2d 3e 70  From->pSelect->p
29a50 53 72 63 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  Src;.      for(i
29a60 3d 30 3b 20 69 3c 70 53 72 63 2d 3e 6e 53 72 63  =0; i<pSrc->nSrc
29a70 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
29a80 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
29a90 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70 53  tem *pItem = &pS
29aa0 72 63 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 20 20  rc->a[i];.      
29ab0 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 7a 44 61    if( pItem->zDa
29ac0 74 61 62 61 73 65 3d 3d 30 20 0a 20 20 20 20 20  tabase==0 .     
29ad0 20 20 20 20 26 26 20 70 49 74 65 6d 2d 3e 7a 4e      && pItem->zN
29ae0 61 6d 65 21 3d 30 20 0a 20 20 20 20 20 20 20 20  ame!=0 .        
29af0 20 26 26 20 30 3d 3d 73 71 6c 69 74 65 33 53 74   && 0==sqlite3St
29b00 72 49 43 6d 70 28 70 49 74 65 6d 2d 3e 7a 4e 61  rICmp(pItem->zNa
29b10 6d 65 2c 20 70 43 74 65 2d 3e 7a 4e 61 6d 65 29  me, pCte->zName)
29b20 0a 20 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20  .          ){.  
29b30 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 70          pItem->p
29b40 54 61 62 20 3d 20 70 54 61 62 3b 0a 20 20 20 20  Tab = pTab;.    
29b50 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 66 67 2e        pItem->fg.
29b60 69 73 52 65 63 75 72 73 69 76 65 20 3d 20 31 3b  isRecursive = 1;
29b70 0a 20 20 20 20 20 20 20 20 20 20 70 54 61 62 2d  .          pTab-
29b80 3e 6e 54 61 62 52 65 66 2b 2b 3b 0a 20 20 20 20  >nTabRef++;.    
29b90 20 20 20 20 20 20 70 53 65 6c 2d 3e 73 65 6c 46        pSel->selF
29ba0 6c 61 67 73 20 7c 3d 20 53 46 5f 52 65 63 75 72  lags |= SF_Recur
29bb0 73 69 76 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a  sive;.        }.
29bc0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
29bd0 20 20 20 2f 2a 20 4f 6e 6c 79 20 6f 6e 65 20 72     /* Only one r
29be0 65 63 75 72 73 69 76 65 20 72 65 66 65 72 65 6e  ecursive referen
29bf0 63 65 20 69 73 20 70 65 72 6d 69 74 74 65 64 2e  ce is permitted.
29c00 20 2a 2f 20 0a 20 20 20 20 69 66 28 20 70 54 61   */ .    if( pTa
29c10 62 2d 3e 6e 54 61 62 52 65 66 3e 32 20 29 7b 0a  b->nTabRef>2 ){.
29c20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
29c30 6f 72 4d 73 67 28 0a 20 20 20 20 20 20 20 20 20  orMsg(.         
29c40 20 70 50 61 72 73 65 2c 20 22 6d 75 6c 74 69 70   pParse, "multip
29c50 6c 65 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f  le references to
29c60 20 72 65 63 75 72 73 69 76 65 20 74 61 62 6c 65   recursive table
29c70 3a 20 25 73 22 2c 20 70 43 74 65 2d 3e 7a 4e 61  : %s", pCte->zNa
29c80 6d 65 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20  me.      );.    
29c90 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
29ca0 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20  ERROR;.    }.   
29cb0 20 61 73 73 65 72 74 28 20 70 54 61 62 2d 3e 6e   assert( pTab->n
29cc0 54 61 62 52 65 66 3d 3d 31 20 7c 7c 20 0a 20 20  TabRef==1 || .  
29cd0 20 20 20 20 20 20 20 20 20 20 28 28 70 53 65 6c            ((pSel
29ce0 2d 3e 73 65 6c 46 6c 61 67 73 26 53 46 5f 52 65  ->selFlags&SF_Re
29cf0 63 75 72 73 69 76 65 29 20 26 26 20 70 54 61 62  cursive) && pTab
29d00 2d 3e 6e 54 61 62 52 65 66 3d 3d 32 20 29 29 3b  ->nTabRef==2 ));
29d10 0a 0a 20 20 20 20 70 43 74 65 2d 3e 7a 43 74 65  ..    pCte->zCte
29d20 45 72 72 20 3d 20 22 63 69 72 63 75 6c 61 72 20  Err = "circular 
29d30 72 65 66 65 72 65 6e 63 65 3a 20 25 73 22 3b 0a  reference: %s";.
29d40 20 20 20 20 70 53 61 76 65 64 57 69 74 68 20 3d      pSavedWith =
29d50 20 70 50 61 72 73 65 2d 3e 70 57 69 74 68 3b 0a   pParse->pWith;.
29d60 20 20 20 20 70 50 61 72 73 65 2d 3e 70 57 69 74      pParse->pWit
29d70 68 20 3d 20 70 57 69 74 68 3b 0a 20 20 20 20 69  h = pWith;.    i
29d80 66 28 20 62 4d 61 79 52 65 63 75 72 73 69 76 65  f( bMayRecursive
29d90 20 29 7b 0a 20 20 20 20 20 20 53 65 6c 65 63 74   ){.      Select
29da0 20 2a 70 50 72 69 6f 72 20 3d 20 70 53 65 6c 2d   *pPrior = pSel-
29db0 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 61  >pPrior;.      a
29dc0 73 73 65 72 74 28 20 70 50 72 69 6f 72 2d 3e 70  ssert( pPrior->p
29dd0 57 69 74 68 3d 3d 30 20 29 3b 0a 20 20 20 20 20  With==0 );.     
29de0 20 70 50 72 69 6f 72 2d 3e 70 57 69 74 68 20 3d   pPrior->pWith =
29df0 20 70 53 65 6c 2d 3e 70 57 69 74 68 3b 0a 20 20   pSel->pWith;.  
29e00 20 20 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 53      sqlite3WalkS
29e10 65 6c 65 63 74 28 70 57 61 6c 6b 65 72 2c 20 70  elect(pWalker, p
29e20 50 72 69 6f 72 29 3b 0a 20 20 20 20 20 20 70 50  Prior);.      pP
29e30 72 69 6f 72 2d 3e 70 57 69 74 68 20 3d 20 30 3b  rior->pWith = 0;
29e40 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
29e50 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 53 65 6c    sqlite3WalkSel
29e60 65 63 74 28 70 57 61 6c 6b 65 72 2c 20 70 53 65  ect(pWalker, pSe
29e70 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50  l);.    }.    pP
29e80 61 72 73 65 2d 3e 70 57 69 74 68 20 3d 20 70 57  arse->pWith = pW
29e90 69 74 68 3b 0a 0a 20 20 20 20 66 6f 72 28 70 4c  ith;..    for(pL
29ea0 65 66 74 3d 70 53 65 6c 3b 20 70 4c 65 66 74 2d  eft=pSel; pLeft-
29eb0 3e 70 50 72 69 6f 72 3b 20 70 4c 65 66 74 3d 70  >pPrior; pLeft=p
29ec0 4c 65 66 74 2d 3e 70 50 72 69 6f 72 29 3b 0a 20  Left->pPrior);. 
29ed0 20 20 20 70 45 4c 69 73 74 20 3d 20 70 4c 65 66     pEList = pLef
29ee0 74 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 20 20 69  t->pEList;.    i
29ef0 66 28 20 70 43 74 65 2d 3e 70 43 6f 6c 73 20 29  f( pCte->pCols )
29f00 7b 0a 20 20 20 20 20 20 69 66 28 20 70 45 4c 69  {.      if( pELi
29f10 73 74 20 26 26 20 70 45 4c 69 73 74 2d 3e 6e 45  st && pEList->nE
29f20 78 70 72 21 3d 70 43 74 65 2d 3e 70 43 6f 6c 73  xpr!=pCte->pCols
29f30 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 20  ->nExpr ){.     
29f40 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
29f50 73 67 28 70 50 61 72 73 65 2c 20 22 74 61 62 6c  sg(pParse, "tabl
29f60 65 20 25 73 20 68 61 73 20 25 64 20 76 61 6c 75  e %s has %d valu
29f70 65 73 20 66 6f 72 20 25 64 20 63 6f 6c 75 6d 6e  es for %d column
29f80 73 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  s",.            
29f90 70 43 74 65 2d 3e 7a 4e 61 6d 65 2c 20 70 45 4c  pCte->zName, pEL
29fa0 69 73 74 2d 3e 6e 45 78 70 72 2c 20 70 43 74 65  ist->nExpr, pCte
29fb0 2d 3e 70 43 6f 6c 73 2d 3e 6e 45 78 70 72 0a 20  ->pCols->nExpr. 
29fc0 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20         );.      
29fd0 20 20 70 50 61 72 73 65 2d 3e 70 57 69 74 68 20    pParse->pWith 
29fe0 3d 20 70 53 61 76 65 64 57 69 74 68 3b 0a 20 20  = pSavedWith;.  
29ff0 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
2a000 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20  ITE_ERROR;.     
2a010 20 7d 0a 20 20 20 20 20 20 70 45 4c 69 73 74 20   }.      pEList 
2a020 3d 20 70 43 74 65 2d 3e 70 43 6f 6c 73 3b 0a 20  = pCte->pCols;. 
2a030 20 20 20 7d 0a 0a 20 20 20 20 73 71 6c 69 74 65     }..    sqlite
2a040 33 43 6f 6c 75 6d 6e 73 46 72 6f 6d 45 78 70 72  3ColumnsFromExpr
2a050 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 45 4c  List(pParse, pEL
2a060 69 73 74 2c 20 26 70 54 61 62 2d 3e 6e 43 6f 6c  ist, &pTab->nCol
2a070 2c 20 26 70 54 61 62 2d 3e 61 43 6f 6c 29 3b 0a  , &pTab->aCol);.
2a080 20 20 20 20 69 66 28 20 62 4d 61 79 52 65 63 75      if( bMayRecu
2a090 72 73 69 76 65 20 29 7b 0a 20 20 20 20 20 20 69  rsive ){.      i
2a0a0 66 28 20 70 53 65 6c 2d 3e 73 65 6c 46 6c 61 67  f( pSel->selFlag
2a0b0 73 20 26 20 53 46 5f 52 65 63 75 72 73 69 76 65  s & SF_Recursive
2a0c0 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43 74 65   ){.        pCte
2a0d0 2d 3e 7a 43 74 65 45 72 72 20 3d 20 22 6d 75 6c  ->zCteErr = "mul
2a0e0 74 69 70 6c 65 20 72 65 63 75 72 73 69 76 65 20  tiple recursive 
2a0f0 72 65 66 65 72 65 6e 63 65 73 3a 20 25 73 22 3b  references: %s";
2a100 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
2a110 20 20 20 20 20 20 70 43 74 65 2d 3e 7a 43 74 65        pCte->zCte
2a120 45 72 72 20 3d 20 22 72 65 63 75 72 73 69 76 65  Err = "recursive
2a130 20 72 65 66 65 72 65 6e 63 65 20 69 6e 20 61 20   reference in a 
2a140 73 75 62 71 75 65 72 79 3a 20 25 73 22 3b 0a 20  subquery: %s";. 
2a150 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
2a160 69 74 65 33 57 61 6c 6b 53 65 6c 65 63 74 28 70  ite3WalkSelect(p
2a170 57 61 6c 6b 65 72 2c 20 70 53 65 6c 29 3b 0a 20  Walker, pSel);. 
2a180 20 20 20 7d 0a 20 20 20 20 70 43 74 65 2d 3e 7a     }.    pCte->z
2a190 43 74 65 45 72 72 20 3d 20 30 3b 0a 20 20 20 20  CteErr = 0;.    
2a1a0 70 50 61 72 73 65 2d 3e 70 57 69 74 68 20 3d 20  pParse->pWith = 
2a1b0 70 53 61 76 65 64 57 69 74 68 3b 0a 20 20 7d 0a  pSavedWith;.  }.
2a1c0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
2a1d0 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23  _OK;.}.#endif..#
2a1e0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
2a1f0 49 54 5f 43 54 45 0a 2f 2a 0a 2a 2a 20 49 66 20  IT_CTE./*.** If 
2a200 74 68 65 20 53 45 4c 45 43 54 20 70 61 73 73 65  the SELECT passe
2a210 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20  d as the second 
2a220 61 72 67 75 6d 65 6e 74 20 68 61 73 20 61 6e 20  argument has an 
2a230 61 73 73 6f 63 69 61 74 65 64 20 57 49 54 48 20  associated WITH 
2a240 0a 2a 2a 20 63 6c 61 75 73 65 2c 20 70 6f 70 20  .** clause, pop 
2a250 69 74 20 66 72 6f 6d 20 74 68 65 20 73 74 61 63  it from the stac
2a260 6b 20 73 74 6f 72 65 64 20 61 73 20 70 61 72 74  k stored as part
2a270 20 6f 66 20 74 68 65 20 50 61 72 73 65 20 6f 62   of the Parse ob
2a280 6a 65 63 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ject..**.** This
2a290 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65   function is use
2a2a0 64 20 61 73 20 74 68 65 20 78 53 65 6c 65 63 74  d as the xSelect
2a2b0 43 61 6c 6c 62 61 63 6b 32 28 29 20 63 61 6c 6c  Callback2() call
2a2c0 62 61 63 6b 20 62 79 0a 2a 2a 20 73 71 6c 69 74  back by.** sqlit
2a2d0 65 33 53 65 6c 65 63 74 45 78 70 61 6e 64 28 29  e3SelectExpand()
2a2e0 20 77 68 65 6e 20 77 61 6c 6b 69 6e 67 20 61 20   when walking a 
2a2f0 53 45 4c 45 43 54 20 74 72 65 65 20 74 6f 20 72  SELECT tree to r
2a300 65 73 6f 6c 76 65 20 74 61 62 6c 65 0a 2a 2a 20  esolve table.** 
2a310 6e 61 6d 65 73 20 61 6e 64 20 6f 74 68 65 72 20  names and other 
2a320 46 52 4f 4d 20 63 6c 61 75 73 65 20 65 6c 65 6d  FROM clause elem
2a330 65 6e 74 73 2e 20 0a 2a 2f 0a 73 74 61 74 69 63  ents. .*/.static
2a340 20 76 6f 69 64 20 73 65 6c 65 63 74 50 6f 70 57   void selectPopW
2a350 69 74 68 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c  ith(Walker *pWal
2a360 6b 65 72 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b  ker, Select *p){
2a370 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
2a380 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 70 50 61 72   = pWalker->pPar
2a390 73 65 3b 0a 20 20 69 66 28 20 4f 4b 5f 49 46 5f  se;.  if( OK_IF_
2a3a0 41 4c 57 41 59 53 5f 54 52 55 45 28 70 50 61 72  ALWAYS_TRUE(pPar
2a3b0 73 65 2d 3e 70 57 69 74 68 29 20 26 26 20 70 2d  se->pWith) && p-
2a3c0 3e 70 50 72 69 6f 72 3d 3d 30 20 29 7b 0a 20 20  >pPrior==0 ){.  
2a3d0 20 20 57 69 74 68 20 2a 70 57 69 74 68 20 3d 20    With *pWith = 
2a3e0 66 69 6e 64 52 69 67 68 74 6d 6f 73 74 28 70 29  findRightmost(p)
2a3f0 2d 3e 70 57 69 74 68 3b 0a 20 20 20 20 69 66 28  ->pWith;.    if(
2a400 20 70 57 69 74 68 21 3d 30 20 29 7b 0a 20 20 20   pWith!=0 ){.   
2a410 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73     assert( pPars
2a420 65 2d 3e 70 57 69 74 68 3d 3d 70 57 69 74 68 20  e->pWith==pWith 
2a430 29 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d  );.      pParse-
2a440 3e 70 57 69 74 68 20 3d 20 70 57 69 74 68 2d 3e  >pWith = pWith->
2a450 70 4f 75 74 65 72 3b 0a 20 20 20 20 7d 0a 20 20  pOuter;.    }.  
2a460 7d 0a 7d 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e  }.}.#else.#defin
2a470 65 20 73 65 6c 65 63 74 50 6f 70 57 69 74 68 20  e selectPopWith 
2a480 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  0.#endif../*.** 
2a490 54 68 65 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  The SrcList_item
2a4a0 20 73 74 72 75 63 74 75 72 65 20 70 61 73 73 65   structure passe
2a4b0 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20  d as the second 
2a4c0 61 72 67 75 6d 65 6e 74 20 72 65 70 72 65 73 65  argument represe
2a4d0 6e 74 73 20 61 0a 2a 2a 20 73 75 62 2d 71 75 65  nts a.** sub-que
2a4e0 72 79 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63  ry in the FROM c
2a4f0 6c 61 75 73 65 20 6f 66 20 61 20 53 45 4c 45 43  lause of a SELEC
2a500 54 20 73 74 61 74 65 6d 65 6e 74 2e 20 54 68 69  T statement. Thi
2a510 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 61 6c  s function.** al
2a520 6c 6f 63 61 74 65 73 20 61 6e 64 20 70 6f 70 75  locates and popu
2a530 6c 61 74 65 73 20 74 68 65 20 53 72 63 4c 69 73  lates the SrcLis
2a540 74 5f 69 74 65 6d 2e 70 54 61 62 20 6f 62 6a 65  t_item.pTab obje
2a550 63 74 2e 20 49 66 20 73 75 63 63 65 73 73 66 75  ct. If successfu
2a560 6c 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20  l,.** SQLITE_OK 
2a570 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68  is returned. Oth
2a580 65 72 77 69 73 65 2c 20 69 66 20 61 6e 20 4f 4f  erwise, if an OO
2a590 4d 20 65 72 72 6f 72 20 69 73 20 65 6e 63 6f 75  M error is encou
2a5a0 6e 74 65 72 65 64 2c 0a 2a 2a 20 53 51 4c 49 54  ntered,.** SQLIT
2a5b0 45 5f 4e 4f 4d 45 4d 2e 0a 2a 2f 0a 69 6e 74 20  E_NOMEM..*/.int 
2a5c0 73 71 6c 69 74 65 33 45 78 70 61 6e 64 53 75 62  sqlite3ExpandSub
2a5d0 71 75 65 72 79 28 50 61 72 73 65 20 2a 70 50 61  query(Parse *pPa
2a5e0 72 73 65 2c 20 73 74 72 75 63 74 20 53 72 63 4c  rse, struct SrcL
2a5f0 69 73 74 5f 69 74 65 6d 20 2a 70 46 72 6f 6d 29  ist_item *pFrom)
2a600 7b 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c  {.  Select *pSel
2a610 20 3d 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63   = pFrom->pSelec
2a620 74 3b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62  t;.  Table *pTab
2a630 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 53 65  ;..  assert( pSe
2a640 6c 20 29 3b 0a 20 20 70 46 72 6f 6d 2d 3e 70 54  l );.  pFrom->pT
2a650 61 62 20 3d 20 70 54 61 62 20 3d 20 73 71 6c 69  ab = pTab = sqli
2a660 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28  te3DbMallocZero(
2a670 70 50 61 72 73 65 2d 3e 64 62 2c 20 73 69 7a 65  pParse->db, size
2a680 6f 66 28 54 61 62 6c 65 29 29 3b 0a 20 20 69 66  of(Table));.  if
2a690 28 20 70 54 61 62 3d 3d 30 20 29 20 72 65 74 75  ( pTab==0 ) retu
2a6a0 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
2a6b0 0a 20 20 70 54 61 62 2d 3e 6e 54 61 62 52 65 66  .  pTab->nTabRef
2a6c0 20 3d 20 31 3b 0a 20 20 69 66 28 20 70 46 72 6f   = 1;.  if( pFro
2a6d0 6d 2d 3e 7a 41 6c 69 61 73 20 29 7b 0a 20 20 20  m->zAlias ){.   
2a6e0 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 20 3d 20 73   pTab->zName = s
2a6f0 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 70  qlite3DbStrDup(p
2a700 50 61 72 73 65 2d 3e 64 62 2c 20 70 46 72 6f 6d  Parse->db, pFrom
2a710 2d 3e 7a 41 6c 69 61 73 29 3b 0a 20 20 7d 65 6c  ->zAlias);.  }el
2a720 73 65 7b 0a 20 20 20 20 70 54 61 62 2d 3e 7a 4e  se{.    pTab->zN
2a730 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 50 72  ame = sqlite3MPr
2a740 69 6e 74 66 28 70 50 61 72 73 65 2d 3e 64 62 2c  intf(pParse->db,
2a750 20 22 73 75 62 71 75 65 72 79 5f 25 75 22 2c 20   "subquery_%u", 
2a760 70 53 65 6c 2d 3e 73 65 6c 49 64 29 3b 0a 20 20  pSel->selId);.  
2a770 7d 0a 20 20 77 68 69 6c 65 28 20 70 53 65 6c 2d  }.  while( pSel-
2a780 3e 70 50 72 69 6f 72 20 29 7b 20 70 53 65 6c 20  >pPrior ){ pSel 
2a790 3d 20 70 53 65 6c 2d 3e 70 50 72 69 6f 72 3b 20  = pSel->pPrior; 
2a7a0 7d 0a 20 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d  }.  sqlite3Colum
2a7b0 6e 73 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 70  nsFromExprList(p
2a7c0 50 61 72 73 65 2c 20 70 53 65 6c 2d 3e 70 45 4c  Parse, pSel->pEL
2a7d0 69 73 74 2c 26 70 54 61 62 2d 3e 6e 43 6f 6c 2c  ist,&pTab->nCol,
2a7e0 26 70 54 61 62 2d 3e 61 43 6f 6c 29 3b 0a 20 20  &pTab->aCol);.  
2a7f0 70 54 61 62 2d 3e 69 50 4b 65 79 20 3d 20 2d 31  pTab->iPKey = -1
2a800 3b 0a 20 20 70 54 61 62 2d 3e 6e 52 6f 77 4c 6f  ;.  pTab->nRowLo
2a810 67 45 73 74 20 3d 20 32 30 30 3b 20 61 73 73 65  gEst = 200; asse
2a820 72 74 28 20 32 30 30 3d 3d 73 71 6c 69 74 65 33  rt( 200==sqlite3
2a830 4c 6f 67 45 73 74 28 31 30 34 38 35 37 36 29 20  LogEst(1048576) 
2a840 29 3b 0a 20 20 70 54 61 62 2d 3e 74 61 62 46 6c  );.  pTab->tabFl
2a850 61 67 73 20 7c 3d 20 54 46 5f 45 70 68 65 6d 65  ags |= TF_Epheme
2a860 72 61 6c 3b 0a 0a 20 20 72 65 74 75 72 6e 20 70  ral;..  return p
2a870 50 61 72 73 65 2d 3e 6e 45 72 72 20 3f 20 53 51  Parse->nErr ? SQ
2a880 4c 49 54 45 5f 45 52 52 4f 52 20 3a 20 53 51 4c  LITE_ERROR : SQL
2a890 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
2a8a0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
2a8b0 20 61 20 57 61 6c 6b 65 72 20 63 61 6c 6c 62 61   a Walker callba
2a8c0 63 6b 20 66 6f 72 20 22 65 78 70 61 6e 64 69 6e  ck for "expandin
2a8d0 67 22 20 61 20 53 45 4c 45 43 54 20 73 74 61 74  g" a SELECT stat
2a8e0 65 6d 65 6e 74 2e 0a 2a 2a 20 22 45 78 70 61 6e  ement..** "Expan
2a8f0 64 69 6e 67 22 20 6d 65 61 6e 73 20 74 6f 20 64  ding" means to d
2a900 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a  o the following:
2a910 0a 2a 2a 0a 2a 2a 20 20 20 20 28 31 29 20 20 4d  .**.**    (1)  M
2a920 61 6b 65 20 73 75 72 65 20 56 44 42 45 20 63 75  ake sure VDBE cu
2a930 72 73 6f 72 20 6e 75 6d 62 65 72 73 20 68 61 76  rsor numbers hav
2a940 65 20 62 65 65 6e 20 61 73 73 69 67 6e 65 64 20  e been assigned 
2a950 74 6f 20 65 76 65 72 79 0a 2a 2a 20 20 20 20 20  to every.**     
2a960 20 20 20 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74      element of t
2a970 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 0a  he FROM clause..
2a980 2a 2a 0a 2a 2a 20 20 20 20 28 32 29 20 20 46 69  **.**    (2)  Fi
2a990 6c 6c 20 69 6e 20 74 68 65 20 70 54 61 62 4c 69  ll in the pTabLi
2a9a0 73 74 2d 3e 61 5b 5d 2e 70 54 61 62 20 66 69 65  st->a[].pTab fie
2a9b0 6c 64 73 20 69 6e 20 74 68 65 20 53 72 63 4c 69  lds in the SrcLi
2a9c0 73 74 20 74 68 61 74 20 0a 2a 2a 20 20 20 20 20  st that .**     
2a9d0 20 20 20 20 64 65 66 69 6e 65 73 20 46 52 4f 4d      defines FROM
2a9e0 20 63 6c 61 75 73 65 2e 20 20 57 68 65 6e 20 76   clause.  When v
2a9f0 69 65 77 73 20 61 70 70 65 61 72 20 69 6e 20 74  iews appear in t
2aa00 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 2c 0a  he FROM clause,.
2aa10 2a 2a 20 20 20 20 20 20 20 20 20 66 69 6c 6c 20  **         fill 
2aa20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 5d 2e 70 53  pTabList->a[].pS
2aa30 65 6c 65 63 74 20 77 69 74 68 20 61 20 63 6f 70  elect with a cop
2aa40 79 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20  y of the SELECT 
2aa50 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 20 20 20  statement.**    
2aa60 20 20 20 20 20 74 68 61 74 20 69 6d 70 6c 65 6d       that implem
2aa70 65 6e 74 73 20 74 68 65 20 76 69 65 77 2e 20 20  ents the view.  
2aa80 41 20 63 6f 70 79 20 69 73 20 6d 61 64 65 20 6f  A copy is made o
2aa90 66 20 74 68 65 20 76 69 65 77 27 73 20 53 45 4c  f the view's SEL
2aaa0 45 43 54 0a 2a 2a 20 20 20 20 20 20 20 20 20 73  ECT.**         s
2aab0 74 61 74 65 6d 65 6e 74 20 73 6f 20 74 68 61 74  tatement so that
2aac0 20 77 65 20 63 61 6e 20 66 72 65 65 6c 79 20 6d   we can freely m
2aad0 6f 64 69 66 79 20 6f 72 20 64 65 6c 65 74 65 20  odify or delete 
2aae0 74 68 61 74 20 73 74 61 74 65 6d 65 6e 74 0a 2a  that statement.*
2aaf0 2a 20 20 20 20 20 20 20 20 20 77 69 74 68 6f 75  *         withou
2ab00 74 20 77 6f 72 72 79 69 6e 67 20 61 62 6f 75 74  t worrying about
2ab10 20 6d 65 73 73 69 6e 67 20 75 70 20 74 68 65 20   messing up the 
2ab20 70 65 72 73 69 73 74 65 6e 74 20 72 65 70 72 65  persistent repre
2ab30 73 65 6e 74 61 74 69 6f 6e 0a 2a 2a 20 20 20 20  sentation.**    
2ab40 20 20 20 20 20 6f 66 20 74 68 65 20 76 69 65 77       of the view
2ab50 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 33 29 20 20  ..**.**    (3)  
2ab60 41 64 64 20 74 65 72 6d 73 20 74 6f 20 74 68 65  Add terms to the
2ab70 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 6f   WHERE clause to
2ab80 20 61 63 63 6f 6d 6d 6f 64 61 74 65 20 74 68 65   accommodate the
2ab90 20 4e 41 54 55 52 41 4c 20 6b 65 79 77 6f 72 64   NATURAL keyword
2aba0 0a 2a 2a 20 20 20 20 20 20 20 20 20 6f 6e 20 6a  .**         on j
2abb0 6f 69 6e 73 20 61 6e 64 20 74 68 65 20 4f 4e 20  oins and the ON 
2abc0 61 6e 64 20 55 53 49 4e 47 20 63 6c 61 75 73 65  and USING clause
2abd0 20 6f 66 20 6a 6f 69 6e 73 2e 0a 2a 2a 0a 2a 2a   of joins..**.**
2abe0 20 20 20 20 28 34 29 20 20 53 63 61 6e 20 74 68      (4)  Scan th
2abf0 65 20 6c 69 73 74 20 6f 66 20 63 6f 6c 75 6d 6e  e list of column
2ac00 73 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20  s in the result 
2ac10 73 65 74 20 28 70 45 4c 69 73 74 29 20 6c 6f 6f  set (pEList) loo
2ac20 6b 69 6e 67 0a 2a 2a 20 20 20 20 20 20 20 20 20  king.**         
2ac30 66 6f 72 20 69 6e 73 74 61 6e 63 65 73 20 6f 66  for instances of
2ac40 20 74 68 65 20 22 2a 22 20 6f 70 65 72 61 74 6f   the "*" operato
2ac50 72 20 6f 72 20 74 68 65 20 54 41 42 4c 45 2e 2a  r or the TABLE.*
2ac60 20 6f 70 65 72 61 74 6f 72 2e 0a 2a 2a 20 20 20   operator..**   
2ac70 20 20 20 20 20 20 49 66 20 66 6f 75 6e 64 2c 20        If found, 
2ac80 65 78 70 61 6e 64 20 65 61 63 68 20 22 2a 22 20  expand each "*" 
2ac90 74 6f 20 62 65 20 65 76 65 72 79 20 63 6f 6c 75  to be every colu
2aca0 6d 6e 20 69 6e 20 65 76 65 72 79 20 74 61 62 6c  mn in every tabl
2acb0 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 61 6e 64  e.**         and
2acc0 20 54 41 42 4c 45 2e 2a 20 74 6f 20 62 65 20 65   TABLE.* to be e
2acd0 76 65 72 79 20 63 6f 6c 75 6d 6e 20 69 6e 20 54  very column in T
2ace0 41 42 4c 45 2e 0a 2a 2a 0a 2a 2f 0a 73 74 61 74  ABLE..**.*/.stat
2acf0 69 63 20 69 6e 74 20 73 65 6c 65 63 74 45 78 70  ic int selectExp
2ad00 61 6e 64 65 72 28 57 61 6c 6b 65 72 20 2a 70 57  ander(Walker *pW
2ad10 61 6c 6b 65 72 2c 20 53 65 6c 65 63 74 20 2a 70  alker, Select *p
2ad20 29 7b 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  ){.  Parse *pPar
2ad30 73 65 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 70 50  se = pWalker->pP
2ad40 61 72 73 65 3b 0a 20 20 69 6e 74 20 69 2c 20 6a  arse;.  int i, j
2ad50 2c 20 6b 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a  , k;.  SrcList *
2ad60 70 54 61 62 4c 69 73 74 3b 0a 20 20 45 78 70 72  pTabList;.  Expr
2ad70 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 0a 20 20  List *pEList;.  
2ad80 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
2ad90 74 65 6d 20 2a 70 46 72 6f 6d 3b 0a 20 20 73 71  tem *pFrom;.  sq
2ada0 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
2adb0 73 65 2d 3e 64 62 3b 0a 20 20 45 78 70 72 20 2a  se->db;.  Expr *
2adc0 70 45 2c 20 2a 70 52 69 67 68 74 2c 20 2a 70 45  pE, *pRight, *pE
2add0 78 70 72 3b 0a 20 20 75 31 36 20 73 65 6c 46 6c  xpr;.  u16 selFl
2ade0 61 67 73 20 3d 20 70 2d 3e 73 65 6c 46 6c 61 67  ags = p->selFlag
2adf0 73 3b 0a 20 20 75 33 32 20 65 6c 69 73 74 46 6c  s;.  u32 elistFl
2ae00 61 67 73 20 3d 20 30 3b 0a 0a 20 20 70 2d 3e 73  ags = 0;..  p->s
2ae10 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f 45 78  elFlags |= SF_Ex
2ae20 70 61 6e 64 65 64 3b 0a 20 20 69 66 28 20 64 62  panded;.  if( db
2ae30 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 20  ->mallocFailed  
2ae40 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 57 52  ){.    return WR
2ae50 43 5f 41 62 6f 72 74 3b 0a 20 20 7d 0a 20 20 61  C_Abort;.  }.  a
2ae60 73 73 65 72 74 28 20 70 2d 3e 70 53 72 63 21 3d  ssert( p->pSrc!=
2ae70 30 20 29 3b 0a 20 20 69 66 28 20 28 73 65 6c 46  0 );.  if( (selF
2ae80 6c 61 67 73 20 26 20 53 46 5f 45 78 70 61 6e 64  lags & SF_Expand
2ae90 65 64 29 21 3d 30 20 29 7b 0a 20 20 20 20 72 65  ed)!=0 ){.    re
2aea0 74 75 72 6e 20 57 52 43 5f 50 72 75 6e 65 3b 0a  turn WRC_Prune;.
2aeb0 20 20 7d 0a 20 20 69 66 28 20 70 57 61 6c 6b 65    }.  if( pWalke
2aec0 72 2d 3e 65 43 6f 64 65 20 29 7b 0a 20 20 20 20  r->eCode ){.    
2aed0 2f 2a 20 52 65 6e 75 6d 62 65 72 20 73 65 6c 49  /* Renumber selI
2aee0 64 20 62 65 63 61 75 73 65 20 69 74 20 68 61 73  d because it has
2aef0 20 62 65 65 6e 20 63 6f 70 69 65 64 20 66 72 6f   been copied fro
2af00 6d 20 61 20 76 69 65 77 20 2a 2f 0a 20 20 20 20  m a view */.    
2af10 70 2d 3e 73 65 6c 49 64 20 3d 20 2b 2b 70 50 61  p->selId = ++pPa
2af20 72 73 65 2d 3e 6e 53 65 6c 65 63 74 3b 0a 20 20  rse->nSelect;.  
2af30 7d 0a 20 20 70 54 61 62 4c 69 73 74 20 3d 20 70  }.  pTabList = p
2af40 2d 3e 70 53 72 63 3b 0a 20 20 70 45 4c 69 73 74  ->pSrc;.  pEList
2af50 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 20 20   = p->pEList;.  
2af60 73 71 6c 69 74 65 33 57 69 74 68 50 75 73 68 28  sqlite3WithPush(
2af70 70 50 61 72 73 65 2c 20 70 2d 3e 70 57 69 74 68  pParse, p->pWith
2af80 2c 20 30 29 3b 0a 0a 20 20 2f 2a 20 4d 61 6b 65  , 0);..  /* Make
2af90 20 73 75 72 65 20 63 75 72 73 6f 72 20 6e 75 6d   sure cursor num
2afa0 62 65 72 73 20 68 61 76 65 20 62 65 65 6e 20 61  bers have been a
2afb0 73 73 69 67 6e 65 64 20 74 6f 20 61 6c 6c 20 65  ssigned to all e
2afc0 6e 74 72 69 65 73 20 69 6e 0a 20 20 2a 2a 20 74  ntries in.  ** t
2afd0 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f  he FROM clause o
2afe0 66 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61  f the SELECT sta
2aff0 74 65 6d 65 6e 74 2e 0a 20 20 2a 2f 0a 20 20 73  tement..  */.  s
2b000 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41 73 73  qlite3SrcListAss
2b010 69 67 6e 43 75 72 73 6f 72 73 28 70 50 61 72 73  ignCursors(pPars
2b020 65 2c 20 70 54 61 62 4c 69 73 74 29 3b 0a 0a 20  e, pTabList);.. 
2b030 20 2f 2a 20 4c 6f 6f 6b 20 75 70 20 65 76 65 72   /* Look up ever
2b040 79 20 74 61 62 6c 65 20 6e 61 6d 65 64 20 69 6e  y table named in
2b050 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
2b060 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74 2e 20   of the select. 
2b070 20 49 66 0a 20 20 2a 2a 20 61 6e 20 65 6e 74 72   If.  ** an entr
2b080 79 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c  y of the FROM cl
2b090 61 75 73 65 20 69 73 20 61 20 73 75 62 71 75 65  ause is a subque
2b0a0 72 79 20 69 6e 73 74 65 61 64 20 6f 66 20 61 20  ry instead of a 
2b0b0 74 61 62 6c 65 20 6f 72 20 76 69 65 77 2c 0a 20  table or view,. 
2b0c0 20 2a 2a 20 74 68 65 6e 20 63 72 65 61 74 65 20   ** then create 
2b0d0 61 20 74 72 61 6e 73 69 65 6e 74 20 74 61 62 6c  a transient tabl
2b0e0 65 20 73 74 72 75 63 74 75 72 65 20 74 6f 20 64  e structure to d
2b0f0 65 73 63 72 69 62 65 20 74 68 65 20 73 75 62 71  escribe the subq
2b100 75 65 72 79 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72  uery..  */.  for
2b110 28 69 3d 30 2c 20 70 46 72 6f 6d 3d 70 54 61 62  (i=0, pFrom=pTab
2b120 4c 69 73 74 2d 3e 61 3b 20 69 3c 70 54 61 62 4c  List->a; i<pTabL
2b130 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20  ist->nSrc; i++, 
2b140 70 46 72 6f 6d 2b 2b 29 7b 0a 20 20 20 20 54 61  pFrom++){.    Ta
2b150 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 20 20 61  ble *pTab;.    a
2b160 73 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e 66 67  ssert( pFrom->fg
2b170 2e 69 73 52 65 63 75 72 73 69 76 65 3d 3d 30 20  .isRecursive==0 
2b180 7c 7c 20 70 46 72 6f 6d 2d 3e 70 54 61 62 21 3d  || pFrom->pTab!=
2b190 30 20 29 3b 0a 20 20 20 20 69 66 28 20 70 46 72  0 );.    if( pFr
2b1a0 6f 6d 2d 3e 66 67 2e 69 73 52 65 63 75 72 73 69  om->fg.isRecursi
2b1b0 76 65 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  ve ) continue;. 
2b1c0 20 20 20 61 73 73 65 72 74 28 20 70 46 72 6f 6d     assert( pFrom
2b1d0 2d 3e 70 54 61 62 3d 3d 30 20 29 3b 0a 23 69 66  ->pTab==0 );.#if
2b1e0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
2b1f0 5f 43 54 45 0a 20 20 20 20 69 66 28 20 77 69 74  _CTE.    if( wit
2b200 68 45 78 70 61 6e 64 28 70 57 61 6c 6b 65 72 2c  hExpand(pWalker,
2b210 20 70 46 72 6f 6d 29 20 29 20 72 65 74 75 72 6e   pFrom) ) return
2b220 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20   WRC_Abort;.    
2b230 69 66 28 20 70 46 72 6f 6d 2d 3e 70 54 61 62 20  if( pFrom->pTab 
2b240 29 20 7b 7d 20 65 6c 73 65 0a 23 65 6e 64 69 66  ) {} else.#endif
2b250 0a 20 20 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e  .    if( pFrom->
2b260 7a 4e 61 6d 65 3d 3d 30 20 29 7b 0a 23 69 66 6e  zName==0 ){.#ifn
2b270 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
2b280 53 55 42 51 55 45 52 59 0a 20 20 20 20 20 20 53  SUBQUERY.      S
2b290 65 6c 65 63 74 20 2a 70 53 65 6c 20 3d 20 70 46  elect *pSel = pF
2b2a0 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a 20 20  rom->pSelect;.  
2b2b0 20 20 20 20 2f 2a 20 41 20 73 75 62 2d 71 75 65      /* A sub-que
2b2c0 72 79 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63  ry in the FROM c
2b2d0 6c 61 75 73 65 20 6f 66 20 61 20 53 45 4c 45 43  lause of a SELEC
2b2e0 54 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72  T */.      asser
2b2f0 74 28 20 70 53 65 6c 21 3d 30 20 29 3b 0a 20 20  t( pSel!=0 );.  
2b300 20 20 20 20 61 73 73 65 72 74 28 20 70 46 72 6f      assert( pFro
2b310 6d 2d 3e 70 54 61 62 3d 3d 30 20 29 3b 0a 20 20  m->pTab==0 );.  
2b320 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 57      if( sqlite3W
2b330 61 6c 6b 53 65 6c 65 63 74 28 70 57 61 6c 6b 65  alkSelect(pWalke
2b340 72 2c 20 70 53 65 6c 29 20 29 20 72 65 74 75 72  r, pSel) ) retur
2b350 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20  n WRC_Abort;.   
2b360 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78     if( sqlite3Ex
2b370 70 61 6e 64 53 75 62 71 75 65 72 79 28 70 50 61  pandSubquery(pPa
2b380 72 73 65 2c 20 70 46 72 6f 6d 29 20 29 20 72 65  rse, pFrom) ) re
2b390 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a  turn WRC_Abort;.
2b3a0 23 65 6e 64 69 66 0a 20 20 20 20 7d 65 6c 73 65  #endif.    }else
2b3b0 7b 0a 20 20 20 20 20 20 2f 2a 20 41 6e 20 6f 72  {.      /* An or
2b3c0 64 69 6e 61 72 79 20 74 61 62 6c 65 20 6f 72 20  dinary table or 
2b3d0 76 69 65 77 20 6e 61 6d 65 20 69 6e 20 74 68 65  view name in the
2b3e0 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a   FROM clause */.
2b3f0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 46        assert( pF
2b400 72 6f 6d 2d 3e 70 54 61 62 3d 3d 30 20 29 3b 0a  rom->pTab==0 );.
2b410 20 20 20 20 20 20 70 46 72 6f 6d 2d 3e 70 54 61        pFrom->pTa
2b420 62 20 3d 20 70 54 61 62 20 3d 20 73 71 6c 69 74  b = pTab = sqlit
2b430 65 33 4c 6f 63 61 74 65 54 61 62 6c 65 49 74 65  e3LocateTableIte
2b440 6d 28 70 50 61 72 73 65 2c 20 30 2c 20 70 46 72  m(pParse, 0, pFr
2b450 6f 6d 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  om);.      if( p
2b460 54 61 62 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  Tab==0 ) return 
2b470 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 20  WRC_Abort;.     
2b480 20 69 66 28 20 70 54 61 62 2d 3e 6e 54 61 62 52   if( pTab->nTabR
2b490 65 66 3e 3d 30 78 66 66 66 66 20 29 7b 0a 20 20  ef>=0xffff ){.  
2b4a0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
2b4b0 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74  orMsg(pParse, "t
2b4c0 6f 6f 20 6d 61 6e 79 20 72 65 66 65 72 65 6e 63  oo many referenc
2b4d0 65 73 20 74 6f 20 5c 22 25 73 5c 22 3a 20 6d 61  es to \"%s\": ma
2b4e0 78 20 36 35 35 33 35 22 2c 0a 20 20 20 20 20 20  x 65535",.      
2b4f0 20 20 20 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65       pTab->zName
2b500 29 3b 0a 20 20 20 20 20 20 20 20 70 46 72 6f 6d  );.        pFrom
2b510 2d 3e 70 54 61 62 20 3d 20 30 3b 0a 20 20 20 20  ->pTab = 0;.    
2b520 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41      return WRC_A
2b530 62 6f 72 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20  bort;.      }.  
2b540 20 20 20 20 70 54 61 62 2d 3e 6e 54 61 62 52 65      pTab->nTabRe
2b550 66 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 21  f++;.      if( !
2b560 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 29 20  IsVirtual(pTab) 
2b570 26 26 20 63 61 6e 6e 6f 74 42 65 46 75 6e 63 74  && cannotBeFunct
2b580 69 6f 6e 28 70 50 61 72 73 65 2c 20 70 46 72 6f  ion(pParse, pFro
2b590 6d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  m) ){.        re
2b5a0 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a  turn WRC_Abort;.
2b5b0 20 20 20 20 20 20 7d 0a 23 69 66 20 21 64 65 66        }.#if !def
2b5c0 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
2b5d0 5f 56 49 45 57 29 20 7c 7c 20 21 64 65 66 69 6e  _VIEW) || !defin
2b5e0 65 64 20 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ed (SQLITE_OMIT_
2b5f0 56 49 52 54 55 41 4c 54 41 42 4c 45 29 0a 20 20  VIRTUALTABLE).  
2b600 20 20 20 20 69 66 28 20 49 73 56 69 72 74 75 61      if( IsVirtua
2b610 6c 28 70 54 61 62 29 20 7c 7c 20 70 54 61 62 2d  l(pTab) || pTab-
2b620 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20  >pSelect ){.    
2b630 20 20 20 20 69 31 36 20 6e 43 6f 6c 3b 0a 20 20      i16 nCol;.  
2b640 20 20 20 20 20 20 75 38 20 65 43 6f 64 65 4f 72        u8 eCodeOr
2b650 69 67 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 65 43  ig = pWalker->eC
2b660 6f 64 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ode;.        if(
2b670 20 73 71 6c 69 74 65 33 56 69 65 77 47 65 74 43   sqlite3ViewGetC
2b680 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73  olumnNames(pPars
2b690 65 2c 20 70 54 61 62 29 20 29 20 72 65 74 75 72  e, pTab) ) retur
2b6a0 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20  n WRC_Abort;.   
2b6b0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 46 72       assert( pFr
2b6c0 6f 6d 2d 3e 70 53 65 6c 65 63 74 3d 3d 30 20 29  om->pSelect==0 )
2b6d0 3b 0a 20 20 20 20 20 20 20 20 70 46 72 6f 6d 2d  ;.        pFrom-
2b6e0 3e 70 53 65 6c 65 63 74 20 3d 20 73 71 6c 69 74  >pSelect = sqlit
2b6f0 65 33 53 65 6c 65 63 74 44 75 70 28 64 62 2c 20  e3SelectDup(db, 
2b700 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 2c 20 30  pTab->pSelect, 0
2b710 29 3b 0a 20 20 20 20 20 20 20 20 6e 43 6f 6c 20  );.        nCol 
2b720 3d 20 70 54 61 62 2d 3e 6e 43 6f 6c 3b 0a 20 20  = pTab->nCol;.  
2b730 20 20 20 20 20 20 70 54 61 62 2d 3e 6e 43 6f 6c        pTab->nCol
2b740 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 70   = -1;.        p
2b750 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 20 3d 20  Walker->eCode = 
2b760 31 3b 20 20 2f 2a 20 54 75 72 6e 20 6f 6e 20 53  1;  /* Turn on S
2b770 65 6c 65 63 74 2e 73 65 6c 49 64 20 72 65 6e 75  elect.selId renu
2b780 6d 62 65 72 69 6e 67 20 2a 2f 0a 20 20 20 20 20  mbering */.     
2b790 20 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 53 65     sqlite3WalkSe
2b7a0 6c 65 63 74 28 70 57 61 6c 6b 65 72 2c 20 70 46  lect(pWalker, pF
2b7b0 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20  rom->pSelect);. 
2b7c0 20 20 20 20 20 20 20 70 57 61 6c 6b 65 72 2d 3e         pWalker->
2b7d0 65 43 6f 64 65 20 3d 20 65 43 6f 64 65 4f 72 69  eCode = eCodeOri
2b7e0 67 3b 0a 20 20 20 20 20 20 20 20 70 54 61 62 2d  g;.        pTab-
2b7f0 3e 6e 43 6f 6c 20 3d 20 6e 43 6f 6c 3b 0a 20 20  >nCol = nCol;.  
2b800 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
2b810 20 7d 0a 0a 20 20 20 20 2f 2a 20 4c 6f 63 61 74   }..    /* Locat
2b820 65 20 74 68 65 20 69 6e 64 65 78 20 6e 61 6d 65  e the index name
2b830 64 20 62 79 20 74 68 65 20 49 4e 44 45 58 45 44  d by the INDEXED
2b840 20 42 59 20 63 6c 61 75 73 65 2c 20 69 66 20 61   BY clause, if a
2b850 6e 79 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 73  ny. */.    if( s
2b860 71 6c 69 74 65 33 49 6e 64 65 78 65 64 42 79 4c  qlite3IndexedByL
2b870 6f 6f 6b 75 70 28 70 50 61 72 73 65 2c 20 70 46  ookup(pParse, pF
2b880 72 6f 6d 29 20 29 7b 0a 20 20 20 20 20 20 72 65  rom) ){.      re
2b890 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a  turn WRC_Abort;.
2b8a0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
2b8b0 50 72 6f 63 65 73 73 20 4e 41 54 55 52 41 4c 20  Process NATURAL 
2b8c0 6b 65 79 77 6f 72 64 73 2c 20 61 6e 64 20 4f 4e  keywords, and ON
2b8d0 20 61 6e 64 20 55 53 49 4e 47 20 63 6c 61 75 73   and USING claus
2b8e0 65 73 20 6f 66 20 6a 6f 69 6e 73 2e 0a 20 20 2a  es of joins..  *
2b8f0 2f 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c  /.  if( db->mall
2b900 6f 63 46 61 69 6c 65 64 20 7c 7c 20 73 71 6c 69  ocFailed || sqli
2b910 74 65 50 72 6f 63 65 73 73 4a 6f 69 6e 28 70 50  teProcessJoin(pP
2b920 61 72 73 65 2c 20 70 29 20 29 7b 0a 20 20 20 20  arse, p) ){.    
2b930 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74  return WRC_Abort
2b940 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 6f 72 20  ;.  }..  /* For 
2b950 65 76 65 72 79 20 22 2a 22 20 74 68 61 74 20 6f  every "*" that o
2b960 63 63 75 72 73 20 69 6e 20 74 68 65 20 63 6f 6c  ccurs in the col
2b970 75 6d 6e 20 6c 69 73 74 2c 20 69 6e 73 65 72 74  umn list, insert
2b980 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 0a 20 20   the names of.  
2b990 2a 2a 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 69  ** all columns i
2b9a0 6e 20 61 6c 6c 20 74 61 62 6c 65 73 2e 20 20 41  n all tables.  A
2b9b0 6e 64 20 66 6f 72 20 65 76 65 72 79 20 54 41 42  nd for every TAB
2b9c0 4c 45 2e 2a 20 69 6e 73 65 72 74 20 74 68 65 20  LE.* insert the 
2b9d0 6e 61 6d 65 73 0a 20 20 2a 2a 20 6f 66 20 61 6c  names.  ** of al
2b9e0 6c 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 54 41 42  l columns in TAB
2b9f0 4c 45 2e 20 20 54 68 65 20 70 61 72 73 65 72 20  LE.  The parser 
2ba00 69 6e 73 65 72 74 65 64 20 61 20 73 70 65 63 69  inserted a speci
2ba10 61 6c 20 65 78 70 72 65 73 73 69 6f 6e 0a 20 20  al expression.  
2ba20 2a 2a 20 77 69 74 68 20 74 68 65 20 54 4b 5f 41  ** with the TK_A
2ba30 53 54 45 52 49 53 4b 20 6f 70 65 72 61 74 6f 72  STERISK operator
2ba40 20 66 6f 72 20 65 61 63 68 20 22 2a 22 20 74 68   for each "*" th
2ba50 61 74 20 69 74 20 66 6f 75 6e 64 20 69 6e 20 74  at it found in t
2ba60 68 65 20 63 6f 6c 75 6d 6e 0a 20 20 2a 2a 20 6c  he column.  ** l
2ba70 69 73 74 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77  ist.  The follow
2ba80 69 6e 67 20 63 6f 64 65 20 6a 75 73 74 20 68 61  ing code just ha
2ba90 73 20 74 6f 20 6c 6f 63 61 74 65 20 74 68 65 20  s to locate the 
2baa0 54 4b 5f 41 53 54 45 52 49 53 4b 0a 20 20 2a 2a  TK_ASTERISK.  **
2bab0 20 65 78 70 72 65 73 73 69 6f 6e 73 20 61 6e 64   expressions and
2bac0 20 65 78 70 61 6e 64 20 65 61 63 68 20 6f 6e 65   expand each one
2bad0 20 74 6f 20 74 68 65 20 6c 69 73 74 20 6f 66 20   to the list of 
2bae0 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 69 6e 0a 20  all columns in. 
2baf0 20 2a 2a 20 61 6c 6c 20 74 61 62 6c 65 73 2e 0a   ** all tables..
2bb00 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 66 69    **.  ** The fi
2bb10 72 73 74 20 6c 6f 6f 70 20 6a 75 73 74 20 63 68  rst loop just ch
2bb20 65 63 6b 73 20 74 6f 20 73 65 65 20 69 66 20 74  ecks to see if t
2bb30 68 65 72 65 20 61 72 65 20 61 6e 79 20 22 2a 22  here are any "*"
2bb40 20 6f 70 65 72 61 74 6f 72 73 0a 20 20 2a 2a 20   operators.  ** 
2bb50 74 68 61 74 20 6e 65 65 64 20 65 78 70 61 6e 64  that need expand
2bb60 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28  ing..  */.  for(
2bb70 6b 3d 30 3b 20 6b 3c 70 45 4c 69 73 74 2d 3e 6e  k=0; k<pEList->n
2bb80 45 78 70 72 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20  Expr; k++){.    
2bb90 70 45 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 6b  pE = pEList->a[k
2bba0 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 69 66 28  ].pExpr;.    if(
2bbb0 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 41 53 54 45   pE->op==TK_ASTE
2bbc0 52 49 53 4b 20 29 20 62 72 65 61 6b 3b 0a 20 20  RISK ) break;.  
2bbd0 20 20 61 73 73 65 72 74 28 20 70 45 2d 3e 6f 70    assert( pE->op
2bbe0 21 3d 54 4b 5f 44 4f 54 20 7c 7c 20 70 45 2d 3e  !=TK_DOT || pE->
2bbf0 70 52 69 67 68 74 21 3d 30 20 29 3b 0a 20 20 20  pRight!=0 );.   
2bc00 20 61 73 73 65 72 74 28 20 70 45 2d 3e 6f 70 21   assert( pE->op!
2bc10 3d 54 4b 5f 44 4f 54 20 7c 7c 20 28 70 45 2d 3e  =TK_DOT || (pE->
2bc20 70 4c 65 66 74 21 3d 30 20 26 26 20 70 45 2d 3e  pLeft!=0 && pE->
2bc30 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 49 44  pLeft->op==TK_ID
2bc40 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70 45 2d  ) );.    if( pE-
2bc50 3e 6f 70 3d 3d 54 4b 5f 44 4f 54 20 26 26 20 70  >op==TK_DOT && p
2bc60 45 2d 3e 70 52 69 67 68 74 2d 3e 6f 70 3d 3d 54  E->pRight->op==T
2bc70 4b 5f 41 53 54 45 52 49 53 4b 20 29 20 62 72 65  K_ASTERISK ) bre
2bc80 61 6b 3b 0a 20 20 20 20 65 6c 69 73 74 46 6c 61  ak;.    elistFla
2bc90 67 73 20 7c 3d 20 70 45 2d 3e 66 6c 61 67 73 3b  gs |= pE->flags;
2bca0 0a 20 20 7d 0a 20 20 69 66 28 20 6b 3c 70 45 4c  .  }.  if( k<pEL
2bcb0 69 73 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20  ist->nExpr ){.  
2bcc0 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 49 66 20 77    /*.    ** If w
2bcd0 65 20 67 65 74 20 68 65 72 65 20 69 74 20 6d 65  e get here it me
2bce0 61 6e 73 20 74 68 65 20 72 65 73 75 6c 74 20 73  ans the result s
2bcf0 65 74 20 63 6f 6e 74 61 69 6e 73 20 6f 6e 65 20  et contains one 
2bd00 6f 72 20 6d 6f 72 65 20 22 2a 22 0a 20 20 20 20  or more "*".    
2bd10 2a 2a 20 6f 70 65 72 61 74 6f 72 73 20 74 68 61  ** operators tha
2bd20 74 20 6e 65 65 64 20 74 6f 20 62 65 20 65 78 70  t need to be exp
2bd30 61 6e 64 65 64 2e 20 20 4c 6f 6f 70 20 74 68 72  anded.  Loop thr
2bd40 6f 75 67 68 20 65 61 63 68 20 65 78 70 72 65 73  ough each expres
2bd50 73 69 6f 6e 0a 20 20 20 20 2a 2a 20 69 6e 20 74  sion.    ** in t
2bd60 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 61 6e  he result set an
2bd70 64 20 65 78 70 61 6e 64 20 74 68 65 6d 20 6f 6e  d expand them on
2bd80 65 20 62 79 20 6f 6e 65 2e 0a 20 20 20 20 2a 2f  e by one..    */
2bd90 0a 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72  .    struct Expr
2bda0 4c 69 73 74 5f 69 74 65 6d 20 2a 61 20 3d 20 70  List_item *a = p
2bdb0 45 4c 69 73 74 2d 3e 61 3b 0a 20 20 20 20 45 78  EList->a;.    Ex
2bdc0 70 72 4c 69 73 74 20 2a 70 4e 65 77 20 3d 20 30  prList *pNew = 0
2bdd0 3b 0a 20 20 20 20 69 6e 74 20 66 6c 61 67 73 20  ;.    int flags 
2bde0 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 66 6c  = pParse->db->fl
2bdf0 61 67 73 3b 0a 20 20 20 20 69 6e 74 20 6c 6f 6e  ags;.    int lon
2be00 67 4e 61 6d 65 73 20 3d 20 28 66 6c 61 67 73 20  gNames = (flags 
2be10 26 20 53 51 4c 49 54 45 5f 46 75 6c 6c 43 6f 6c  & SQLITE_FullCol
2be20 4e 61 6d 65 73 29 21 3d 30 0a 20 20 20 20 20 20  Names)!=0.      
2be30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2be40 26 26 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49  && (flags & SQLI
2be50 54 45 5f 53 68 6f 72 74 43 6f 6c 4e 61 6d 65 73  TE_ShortColNames
2be60 29 3d 3d 30 3b 0a 0a 20 20 20 20 66 6f 72 28 6b  )==0;..    for(k
2be70 3d 30 3b 20 6b 3c 70 45 4c 69 73 74 2d 3e 6e 45  =0; k<pEList->nE
2be80 78 70 72 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 20  xpr; k++){.     
2be90 20 70 45 20 3d 20 61 5b 6b 5d 2e 70 45 78 70 72   pE = a[k].pExpr
2bea0 3b 0a 20 20 20 20 20 20 65 6c 69 73 74 46 6c 61  ;.      elistFla
2beb0 67 73 20 7c 3d 20 70 45 2d 3e 66 6c 61 67 73 3b  gs |= pE->flags;
2bec0 0a 20 20 20 20 20 20 70 52 69 67 68 74 20 3d 20  .      pRight = 
2bed0 70 45 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20 20  pE->pRight;.    
2bee0 20 20 61 73 73 65 72 74 28 20 70 45 2d 3e 6f 70    assert( pE->op
2bef0 21 3d 54 4b 5f 44 4f 54 20 7c 7c 20 70 52 69 67  !=TK_DOT || pRig
2bf00 68 74 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 69  ht!=0 );.      i
2bf10 66 28 20 70 45 2d 3e 6f 70 21 3d 54 4b 5f 41 53  f( pE->op!=TK_AS
2bf20 54 45 52 49 53 4b 0a 20 20 20 20 20 20 20 26 26  TERISK.       &&
2bf30 20 28 70 45 2d 3e 6f 70 21 3d 54 4b 5f 44 4f 54   (pE->op!=TK_DOT
2bf40 20 7c 7c 20 70 52 69 67 68 74 2d 3e 6f 70 21 3d   || pRight->op!=
2bf50 54 4b 5f 41 53 54 45 52 49 53 4b 29 0a 20 20 20  TK_ASTERISK).   
2bf60 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a     ){.        /*
2bf70 20 54 68 69 73 20 70 61 72 74 69 63 75 6c 61 72   This particular
2bf80 20 65 78 70 72 65 73 73 69 6f 6e 20 64 6f 65 73   expression does
2bf90 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 20   not need to be 
2bfa0 65 78 70 61 6e 64 65 64 2e 0a 20 20 20 20 20 20  expanded..      
2bfb0 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 4e 65    */.        pNe
2bfc0 77 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c  w = sqlite3ExprL
2bfd0 69 73 74 41 70 70 65 6e 64 28 70 50 61 72 73 65  istAppend(pParse
2bfe0 2c 20 70 4e 65 77 2c 20 61 5b 6b 5d 2e 70 45 78  , pNew, a[k].pEx
2bff0 70 72 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  pr);.        if(
2c000 20 70 4e 65 77 20 29 7b 0a 20 20 20 20 20 20 20   pNew ){.       
2c010 20 20 20 70 4e 65 77 2d 3e 61 5b 70 4e 65 77 2d     pNew->a[pNew-
2c020 3e 6e 45 78 70 72 2d 31 5d 2e 7a 4e 61 6d 65 20  >nExpr-1].zName 
2c030 3d 20 61 5b 6b 5d 2e 7a 4e 61 6d 65 3b 0a 20 20  = a[k].zName;.  
2c040 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 61 5b          pNew->a[
2c050 70 4e 65 77 2d 3e 6e 45 78 70 72 2d 31 5d 2e 7a  pNew->nExpr-1].z
2c060 53 70 61 6e 20 3d 20 61 5b 6b 5d 2e 7a 53 70 61  Span = a[k].zSpa
2c070 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 61 5b 6b  n;.          a[k
2c080 5d 2e 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 20  ].zName = 0;.   
2c090 20 20 20 20 20 20 20 61 5b 6b 5d 2e 7a 53 70 61         a[k].zSpa
2c0a0 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d  n = 0;.        }
2c0b0 0a 20 20 20 20 20 20 20 20 61 5b 6b 5d 2e 70 45  .        a[k].pE
2c0c0 78 70 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  xpr = 0;.      }
2c0d0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a  else{.        /*
2c0e0 20 54 68 69 73 20 65 78 70 72 65 73 73 69 6f 6e   This expression
2c0f0 20 69 73 20 61 20 22 2a 22 20 6f 72 20 61 20 22   is a "*" or a "
2c100 54 41 42 4c 45 2e 2a 22 20 61 6e 64 20 6e 65 65  TABLE.*" and nee
2c110 64 73 20 74 6f 20 62 65 0a 20 20 20 20 20 20 20  ds to be.       
2c120 20 2a 2a 20 65 78 70 61 6e 64 65 64 2e 20 2a 2f   ** expanded. */
2c130 0a 20 20 20 20 20 20 20 20 69 6e 74 20 74 61 62  .        int tab
2c140 6c 65 53 65 65 6e 20 3d 20 30 3b 20 20 20 20 20  leSeen = 0;     
2c150 20 2f 2a 20 53 65 74 20 74 6f 20 31 20 77 68 65   /* Set to 1 whe
2c160 6e 20 54 41 42 4c 45 20 6d 61 74 63 68 65 73 20  n TABLE matches 
2c170 2a 2f 0a 20 20 20 20 20 20 20 20 63 68 61 72 20  */.        char 
2c180 2a 7a 54 4e 61 6d 65 20 3d 20 30 3b 20 20 20 20  *zTName = 0;    
2c190 20 20 20 2f 2a 20 74 65 78 74 20 6f 66 20 6e 61     /* text of na
2c1a0 6d 65 20 6f 66 20 54 41 42 4c 45 20 2a 2f 0a 20  me of TABLE */. 
2c1b0 20 20 20 20 20 20 20 69 66 28 20 70 45 2d 3e 6f         if( pE->o
2c1c0 70 3d 3d 54 4b 5f 44 4f 54 20 29 7b 0a 20 20 20  p==TK_DOT ){.   
2c1d0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
2c1e0 45 2d 3e 70 4c 65 66 74 21 3d 30 20 29 3b 0a 20  E->pLeft!=0 );. 
2c1f0 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
2c200 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
2c210 79 28 70 45 2d 3e 70 4c 65 66 74 2c 20 45 50 5f  y(pE->pLeft, EP_
2c220 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20 20 20  IntValue) );.   
2c230 20 20 20 20 20 20 20 7a 54 4e 61 6d 65 20 3d 20         zTName = 
2c240 70 45 2d 3e 70 4c 65 66 74 2d 3e 75 2e 7a 54 6f  pE->pLeft->u.zTo
2c250 6b 65 6e 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ken;.        }. 
2c260 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 2c 20         for(i=0, 
2c270 70 46 72 6f 6d 3d 70 54 61 62 4c 69 73 74 2d 3e  pFrom=pTabList->
2c280 61 3b 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e  a; i<pTabList->n
2c290 53 72 63 3b 20 69 2b 2b 2c 20 70 46 72 6f 6d 2b  Src; i++, pFrom+
2c2a0 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 54 61  +){.          Ta
2c2b0 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 46 72 6f  ble *pTab = pFro
2c2c0 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20 20 20 20  m->pTab;.       
2c2d0 20 20 20 53 65 6c 65 63 74 20 2a 70 53 75 62 20     Select *pSub 
2c2e0 3d 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74  = pFrom->pSelect
2c2f0 3b 0a 20 20 20 20 20 20 20 20 20 20 63 68 61 72  ;.          char
2c300 20 2a 7a 54 61 62 4e 61 6d 65 20 3d 20 70 46 72   *zTabName = pFr
2c310 6f 6d 2d 3e 7a 41 6c 69 61 73 3b 0a 20 20 20 20  om->zAlias;.    
2c320 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
2c330 20 2a 7a 53 63 68 65 6d 61 4e 61 6d 65 20 3d 20   *zSchemaName = 
2c340 30 3b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74  0;.          int
2c350 20 69 44 62 3b 0a 20 20 20 20 20 20 20 20 20 20   iDb;.          
2c360 69 66 28 20 7a 54 61 62 4e 61 6d 65 3d 3d 30 20  if( zTabName==0 
2c370 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a  ){.            z
2c380 54 61 62 4e 61 6d 65 20 3d 20 70 54 61 62 2d 3e  TabName = pTab->
2c390 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 20  zName;.         
2c3a0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66 28   }.          if(
2c3b0 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
2c3c0 64 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  d ) break;.     
2c3d0 20 20 20 20 20 69 66 28 20 70 53 75 62 3d 3d 30       if( pSub==0
2c3e0 20 7c 7c 20 28 70 53 75 62 2d 3e 73 65 6c 46 6c   || (pSub->selFl
2c3f0 61 67 73 20 26 20 53 46 5f 4e 65 73 74 65 64 46  ags & SF_NestedF
2c400 72 6f 6d 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  rom)==0 ){.     
2c410 20 20 20 20 20 20 20 70 53 75 62 20 3d 20 30 3b         pSub = 0;
2c420 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
2c430 20 7a 54 4e 61 6d 65 20 26 26 20 73 71 6c 69 74   zTName && sqlit
2c440 65 33 53 74 72 49 43 6d 70 28 7a 54 4e 61 6d 65  e3StrICmp(zTName
2c450 2c 20 7a 54 61 62 4e 61 6d 65 29 21 3d 30 20 29  , zTabName)!=0 )
2c460 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
2c470 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
2c480 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2c490 20 20 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65      iDb = sqlite
2c4a0 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 64  3SchemaToIndex(d
2c4b0 62 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61  b, pTab->pSchema
2c4c0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a  );.            z
2c4d0 53 63 68 65 6d 61 4e 61 6d 65 20 3d 20 69 44 62  SchemaName = iDb
2c4e0 3e 3d 30 20 3f 20 64 62 2d 3e 61 44 62 5b 69 44  >=0 ? db->aDb[iD
2c4f0 62 5d 2e 7a 44 62 53 4e 61 6d 65 20 3a 20 22 2a  b].zDbSName : "*
2c500 22 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  ";.          }. 
2c510 20 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30           for(j=0
2c520 3b 20 6a 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20  ; j<pTab->nCol; 
2c530 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  j++){.          
2c540 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20    char *zName = 
2c550 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e  pTab->aCol[j].zN
2c560 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ame;.           
2c570 20 63 68 61 72 20 2a 7a 43 6f 6c 6e 61 6d 65 3b   char *zColname;
2c580 20 20 2f 2a 20 54 68 65 20 63 6f 6d 70 75 74 65    /* The compute
2c590 64 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 2a 2f  d column name */
2c5a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 68 61  .            cha
2c5b0 72 20 2a 7a 54 6f 46 72 65 65 3b 20 20 20 2f 2a  r *zToFree;   /*
2c5c0 20 4d 61 6c 6c 6f 63 65 64 20 73 74 72 69 6e 67   Malloced string
2c5d0 20 74 68 61 74 20 6e 65 65 64 73 20 74 6f 20 62   that needs to b
2c5e0 65 20 66 72 65 65 64 20 2a 2f 0a 20 20 20 20 20  e freed */.     
2c5f0 20 20 20 20 20 20 20 54 6f 6b 65 6e 20 73 43 6f         Token sCo
2c600 6c 6e 61 6d 65 3b 20 20 2f 2a 20 43 6f 6d 70 75  lname;  /* Compu
2c610 74 65 64 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20  ted column name 
2c620 61 73 20 61 20 74 6f 6b 65 6e 20 2a 2f 0a 0a 20  as a token */.. 
2c630 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72             asser
2c640 74 28 20 7a 4e 61 6d 65 20 29 3b 0a 20 20 20 20  t( zName );.    
2c650 20 20 20 20 20 20 20 20 69 66 28 20 7a 54 4e 61          if( zTNa
2c660 6d 65 20 26 26 20 70 53 75 62 0a 20 20 20 20 20  me && pSub.     
2c670 20 20 20 20 20 20 20 20 26 26 20 73 71 6c 69 74          && sqlit
2c680 65 33 4d 61 74 63 68 53 70 61 6e 4e 61 6d 65 28  e3MatchSpanName(
2c690 70 53 75 62 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b  pSub->pEList->a[
2c6a0 6a 5d 2e 7a 53 70 61 6e 2c 20 30 2c 20 7a 54 4e  j].zSpan, 0, zTN
2c6b0 61 6d 65 2c 20 30 29 3d 3d 30 0a 20 20 20 20 20  ame, 0)==0.     
2c6c0 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20         ){.      
2c6d0 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65          continue
2c6e0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
2c6f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  .            /* 
2c700 49 66 20 61 20 63 6f 6c 75 6d 6e 20 69 73 20 6d  If a column is m
2c710 61 72 6b 65 64 20 61 73 20 27 68 69 64 64 65 6e  arked as 'hidden
2c720 27 2c 20 6f 6d 69 74 20 69 74 20 66 72 6f 6d 20  ', omit it from 
2c730 74 68 65 20 65 78 70 61 6e 64 65 64 0a 20 20 20  the expanded.   
2c740 20 20 20 20 20 20 20 20 20 2a 2a 20 72 65 73 75           ** resu
2c750 6c 74 2d 73 65 74 20 6c 69 73 74 20 75 6e 6c 65  lt-set list unle
2c760 73 73 20 74 68 65 20 53 45 4c 45 43 54 20 68 61  ss the SELECT ha
2c770 73 20 74 68 65 20 53 46 5f 49 6e 63 6c 75 64 65  s the SF_Include
2c780 48 69 64 64 65 6e 0a 20 20 20 20 20 20 20 20 20  Hidden.         
2c790 20 20 20 2a 2a 20 62 69 74 20 73 65 74 2e 0a 20     ** bit set.. 
2c7a0 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20             */.  
2c7b0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 28 70            if( (p
2c7c0 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f  ->selFlags & SF_
2c7d0 49 6e 63 6c 75 64 65 48 69 64 64 65 6e 29 3d 3d  IncludeHidden)==
2c7e0 30 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 26  0.             &
2c7f0 26 20 49 73 48 69 64 64 65 6e 43 6f 6c 75 6d 6e  & IsHiddenColumn
2c800 28 26 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 29  (&pTab->aCol[j])
2c810 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 29 7b   .            ){
2c820 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63  .              c
2c830 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
2c840 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
2c850 20 20 20 74 61 62 6c 65 53 65 65 6e 20 3d 20 31     tableSeen = 1
2c860 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ;..            i
2c870 66 28 20 69 3e 30 20 26 26 20 7a 54 4e 61 6d 65  f( i>0 && zTName
2c880 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
2c890 20 20 20 20 20 69 66 28 20 28 70 46 72 6f 6d 2d       if( (pFrom-
2c8a0 3e 66 67 2e 6a 6f 69 6e 74 79 70 65 20 26 20 4a  >fg.jointype & J
2c8b0 54 5f 4e 41 54 55 52 41 4c 29 21 3d 30 0a 20 20  T_NATURAL)!=0.  
2c8c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26                &&
2c8d0 20 74 61 62 6c 65 41 6e 64 43 6f 6c 75 6d 6e 49   tableAndColumnI
2c8e0 6e 64 65 78 28 70 54 61 62 4c 69 73 74 2c 20 69  ndex(pTabList, i
2c8f0 2c 20 7a 4e 61 6d 65 2c 20 30 2c 20 30 29 0a 20  , zName, 0, 0). 
2c900 20 20 20 20 20 20 20 20 20 20 20 20 20 29 7b 0a               ){.
2c910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c920 2f 2a 20 49 6e 20 61 20 4e 41 54 55 52 41 4c 20  /* In a NATURAL 
2c930 6a 6f 69 6e 2c 20 6f 6d 69 74 20 74 68 65 20 6a  join, omit the j
2c940 6f 69 6e 20 63 6f 6c 75 6d 6e 73 20 66 72 6f 6d  oin columns from
2c950 20 74 68 65 20 0a 20 20 20 20 20 20 20 20 20 20   the .          
2c960 20 20 20 20 20 20 2a 2a 20 74 61 62 6c 65 20 74        ** table t
2c970 6f 20 74 68 65 20 72 69 67 68 74 20 6f 66 20 74  o the right of t
2c980 68 65 20 6a 6f 69 6e 20 2a 2f 0a 20 20 20 20 20  he join */.     
2c990 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69             conti
2c9a0 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20  nue;.           
2c9b0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
2c9c0 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 49 64     if( sqlite3Id
2c9d0 4c 69 73 74 49 6e 64 65 78 28 70 46 72 6f 6d 2d  ListIndex(pFrom-
2c9e0 3e 70 55 73 69 6e 67 2c 20 7a 4e 61 6d 65 29 3e  >pUsing, zName)>
2c9f0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
2ca00 20 20 20 20 20 20 2f 2a 20 49 6e 20 61 20 6a 6f        /* In a jo
2ca10 69 6e 20 77 69 74 68 20 61 20 55 53 49 4e 47 20  in with a USING 
2ca20 63 6c 61 75 73 65 2c 20 6f 6d 69 74 20 63 6f 6c  clause, omit col
2ca30 75 6d 6e 73 20 69 6e 20 74 68 65 0a 20 20 20 20  umns in the.    
2ca40 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 75              ** u
2ca50 73 69 6e 67 20 63 6c 61 75 73 65 20 66 72 6f 6d  sing clause from
2ca60 20 74 68 65 20 74 61 62 6c 65 20 6f 6e 20 74 68   the table on th
2ca70 65 20 72 69 67 68 74 2e 20 2a 2f 0a 20 20 20 20  e right. */.    
2ca80 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74              cont
2ca90 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20  inue;.          
2caa0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
2cab0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
2cac0 70 52 69 67 68 74 20 3d 20 73 71 6c 69 74 65 33  pRight = sqlite3
2cad0 45 78 70 72 28 64 62 2c 20 54 4b 5f 49 44 2c 20  Expr(db, TK_ID, 
2cae0 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  zName);.        
2caf0 20 20 20 20 7a 43 6f 6c 6e 61 6d 65 20 3d 20 7a      zColname = z
2cb00 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 20 20  Name;.          
2cb10 20 20 7a 54 6f 46 72 65 65 20 3d 20 30 3b 0a 20    zToFree = 0;. 
2cb20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6c             if( l
2cb30 6f 6e 67 4e 61 6d 65 73 20 7c 7c 20 70 54 61 62  ongNames || pTab
2cb40 4c 69 73 74 2d 3e 6e 53 72 63 3e 31 20 29 7b 0a  List->nSrc>1 ){.
2cb50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 45 78                Ex
2cb60 70 72 20 2a 70 4c 65 66 74 3b 0a 20 20 20 20 20  pr *pLeft;.     
2cb70 20 20 20 20 20 20 20 20 20 70 4c 65 66 74 20 3d           pLeft =
2cb80 20 73 71 6c 69 74 65 33 45 78 70 72 28 64 62 2c   sqlite3Expr(db,
2cb90 20 54 4b 5f 49 44 2c 20 7a 54 61 62 4e 61 6d 65   TK_ID, zTabName
2cba0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
2cbb0 20 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33   pExpr = sqlite3
2cbc0 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b  PExpr(pParse, TK
2cbd0 5f 44 4f 54 2c 20 70 4c 65 66 74 2c 20 70 52 69  _DOT, pLeft, pRi
2cbe0 67 68 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ght);.          
2cbf0 20 20 20 20 69 66 28 20 7a 53 63 68 65 6d 61 4e      if( zSchemaN
2cc00 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ame ){.         
2cc10 20 20 20 20 20 20 20 70 4c 65 66 74 20 3d 20 73         pLeft = s
2cc20 71 6c 69 74 65 33 45 78 70 72 28 64 62 2c 20 54  qlite3Expr(db, T
2cc30 4b 5f 49 44 2c 20 7a 53 63 68 65 6d 61 4e 61 6d  K_ID, zSchemaNam
2cc40 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  e);.            
2cc50 20 20 20 20 70 45 78 70 72 20 3d 20 73 71 6c 69      pExpr = sqli
2cc60 74 65 33 50 45 78 70 72 28 70 50 61 72 73 65 2c  te3PExpr(pParse,
2cc70 20 54 4b 5f 44 4f 54 2c 20 70 4c 65 66 74 2c 20   TK_DOT, pLeft, 
2cc80 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20  pExpr);.        
2cc90 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2cca0 20 20 20 20 20 20 69 66 28 20 6c 6f 6e 67 4e 61        if( longNa
2ccb0 6d 65 73 20 29 7b 0a 20 20 20 20 20 20 20 20 20  mes ){.         
2ccc0 20 20 20 20 20 20 20 7a 43 6f 6c 6e 61 6d 65 20         zColname 
2ccd0 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66  = sqlite3MPrintf
2cce0 28 64 62 2c 20 22 25 73 2e 25 73 22 2c 20 7a 54  (db, "%s.%s", zT
2ccf0 61 62 4e 61 6d 65 2c 20 7a 4e 61 6d 65 29 3b 0a  abName, zName);.
2cd00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cd10 7a 54 6f 46 72 65 65 20 3d 20 7a 43 6f 6c 6e 61  zToFree = zColna
2cd20 6d 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  me;.            
2cd30 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
2cd40 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
2cd50 20 20 20 20 20 70 45 78 70 72 20 3d 20 70 52 69       pExpr = pRi
2cd60 67 68 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ght;.           
2cd70 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 70   }.            p
2cd80 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 45 78 70  New = sqlite3Exp
2cd90 72 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61 72  rListAppend(pPar
2cda0 73 65 2c 20 70 4e 65 77 2c 20 70 45 78 70 72 29  se, pNew, pExpr)
2cdb0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  ;.            sq
2cdc0 6c 69 74 65 33 54 6f 6b 65 6e 49 6e 69 74 28 26  lite3TokenInit(&
2cdd0 73 43 6f 6c 6e 61 6d 65 2c 20 7a 43 6f 6c 6e 61  sColname, zColna
2cde0 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  me);.           
2cdf0 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
2ce00 53 65 74 4e 61 6d 65 28 70 50 61 72 73 65 2c 20  SetName(pParse, 
2ce10 70 4e 65 77 2c 20 26 73 43 6f 6c 6e 61 6d 65 2c  pNew, &sColname,
2ce20 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20   0);.           
2ce30 20 69 66 28 20 70 4e 65 77 20 26 26 20 28 70 2d   if( pNew && (p-
2ce40 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 4e  >selFlags & SF_N
2ce50 65 73 74 65 64 46 72 6f 6d 29 21 3d 30 20 29 7b  estedFrom)!=0 ){
2ce60 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73  .              s
2ce70 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69  truct ExprList_i
2ce80 74 65 6d 20 2a 70 58 20 3d 20 26 70 4e 65 77 2d  tem *pX = &pNew-
2ce90 3e 61 5b 70 4e 65 77 2d 3e 6e 45 78 70 72 2d 31  >a[pNew->nExpr-1
2cea0 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ];.             
2ceb0 20 69 66 28 20 70 53 75 62 20 29 7b 0a 20 20 20   if( pSub ){.   
2cec0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 58 2d               pX-
2ced0 3e 7a 53 70 61 6e 20 3d 20 73 71 6c 69 74 65 33  >zSpan = sqlite3
2cee0 44 62 53 74 72 44 75 70 28 64 62 2c 20 70 53 75  DbStrDup(db, pSu
2cef0 62 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 6a 5d 2e  b->pEList->a[j].
2cf00 7a 53 70 61 6e 29 3b 0a 20 20 20 20 20 20 20 20  zSpan);.        
2cf10 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
2cf20 28 20 70 58 2d 3e 7a 53 70 61 6e 3d 3d 30 20 29  ( pX->zSpan==0 )
2cf30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
2cf40 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
2cf50 20 20 20 20 20 20 20 70 58 2d 3e 7a 53 70 61 6e         pX->zSpan
2cf60 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74   = sqlite3MPrint
2cf70 66 28 64 62 2c 20 22 25 73 2e 25 73 2e 25 73 22  f(db, "%s.%s.%s"
2cf80 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
2cf90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cfa0 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 53 63               zSc
2cfb0 68 65 6d 61 4e 61 6d 65 2c 20 7a 54 61 62 4e 61  hemaName, zTabNa
2cfc0 6d 65 2c 20 7a 43 6f 6c 6e 61 6d 65 29 3b 0a 20  me, zColname);. 
2cfd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74                 t
2cfe0 65 73 74 63 61 73 65 28 20 70 58 2d 3e 7a 53 70  estcase( pX->zSp
2cff0 61 6e 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  an==0 );.       
2d000 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2d010 20 20 20 20 20 20 20 70 58 2d 3e 62 53 70 61 6e         pX->bSpan
2d020 49 73 54 61 62 20 3d 20 31 3b 0a 20 20 20 20 20  IsTab = 1;.     
2d030 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2d040 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72       sqlite3DbFr
2d050 65 65 28 64 62 2c 20 7a 54 6f 46 72 65 65 29 3b  ee(db, zToFree);
2d060 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
2d070 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
2d080 66 28 20 21 74 61 62 6c 65 53 65 65 6e 20 29 7b  f( !tableSeen ){
2d090 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 7a  .          if( z
2d0a0 54 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 20  TName ){.       
2d0b0 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
2d0c0 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6e 6f  rMsg(pParse, "no
2d0d0 20 73 75 63 68 20 74 61 62 6c 65 3a 20 25 73 22   such table: %s"
2d0e0 2c 20 7a 54 4e 61 6d 65 29 3b 0a 20 20 20 20 20  , zTName);.     
2d0f0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
2d100 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
2d110 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
2d120 22 6e 6f 20 74 61 62 6c 65 73 20 73 70 65 63 69  "no tables speci
2d130 66 69 65 64 22 29 3b 0a 20 20 20 20 20 20 20 20  fied");.        
2d140 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
2d150 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
2d160 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
2d170 65 6c 65 74 65 28 64 62 2c 20 70 45 4c 69 73 74  elete(db, pEList
2d180 29 3b 0a 20 20 20 20 70 2d 3e 70 45 4c 69 73 74  );.    p->pEList
2d190 20 3d 20 70 4e 65 77 3b 0a 20 20 7d 0a 20 20 69   = pNew;.  }.  i
2d1a0 66 28 20 70 2d 3e 70 45 4c 69 73 74 20 29 7b 0a  f( p->pEList ){.
2d1b0 20 20 20 20 69 66 28 20 70 2d 3e 70 45 4c 69 73      if( p->pELis
2d1c0 74 2d 3e 6e 45 78 70 72 3e 64 62 2d 3e 61 4c 69  t->nExpr>db->aLi
2d1d0 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54  mit[SQLITE_LIMIT
2d1e0 5f 43 4f 4c 55 4d 4e 5d 20 29 7b 0a 20 20 20 20  _COLUMN] ){.    
2d1f0 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
2d200 67 28 70 50 61 72 73 65 2c 20 22 74 6f 6f 20 6d  g(pParse, "too m
2d210 61 6e 79 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 72  any columns in r
2d220 65 73 75 6c 74 20 73 65 74 22 29 3b 0a 20 20 20  esult set");.   
2d230 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62     return WRC_Ab
2d240 6f 72 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ort;.    }.    i
2d250 66 28 20 28 65 6c 69 73 74 46 6c 61 67 73 20 26  f( (elistFlags &
2d260 20 28 45 50 5f 48 61 73 46 75 6e 63 7c 45 50 5f   (EP_HasFunc|EP_
2d270 53 75 62 71 75 65 72 79 29 29 21 3d 30 20 29 7b  Subquery))!=0 ){
2d280 0a 20 20 20 20 20 20 70 2d 3e 73 65 6c 46 6c 61  .      p->selFla
2d290 67 73 20 7c 3d 20 53 46 5f 43 6f 6d 70 6c 65 78  gs |= SF_Complex
2d2a0 52 65 73 75 6c 74 3b 0a 20 20 20 20 7d 0a 20 20  Result;.    }.  
2d2b0 7d 0a 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43  }.  return WRC_C
2d2c0 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a  ontinue;.}../*.*
2d2d0 2a 20 4e 6f 2d 6f 70 20 72 6f 75 74 69 6e 65 20  * No-op routine 
2d2e0 66 6f 72 20 74 68 65 20 70 61 72 73 65 2d 74 72  for the parse-tr
2d2f0 65 65 20 77 61 6c 6b 65 72 2e 0a 2a 2a 0a 2a 2a  ee walker..**.**
2d300 20 57 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69   When this routi
2d310 6e 65 20 69 73 20 74 68 65 20 57 61 6c 6b 65 72  ne is the Walker
2d320 2e 78 45 78 70 72 43 61 6c 6c 62 61 63 6b 20 74  .xExprCallback t
2d330 68 65 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74  hen expression t
2d340 72 65 65 73 0a 2a 2a 20 61 72 65 20 77 61 6c 6b  rees.** are walk
2d350 65 64 20 77 69 74 68 6f 75 74 20 61 6e 79 20 61  ed without any a
2d360 63 74 69 6f 6e 73 20 62 65 69 6e 67 20 74 61 6b  ctions being tak
2d370 65 6e 20 61 74 20 65 61 63 68 20 6e 6f 64 65 2e  en at each node.
2d380 20 20 50 72 65 73 75 6d 61 62 6c 79 2c 0a 2a 2a    Presumably,.**
2d390 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69   when this routi
2d3a0 6e 65 20 69 73 20 75 73 65 64 20 66 6f 72 20 57  ne is used for W
2d3b0 61 6c 6b 65 72 2e 78 45 78 70 72 43 61 6c 6c 62  alker.xExprCallb
2d3c0 61 63 6b 20 74 68 65 6e 20 0a 2a 2a 20 57 61 6c  ack then .** Wal
2d3d0 6b 65 72 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62  ker.xSelectCallb
2d3e0 61 63 6b 20 69 73 20 73 65 74 20 74 6f 20 64 6f  ack is set to do
2d3f0 20 73 6f 6d 65 74 68 69 6e 67 20 75 73 65 66 75   something usefu
2d400 6c 20 66 6f 72 20 65 76 65 72 79 20 0a 2a 2a 20  l for every .** 
2d410 73 75 62 71 75 65 72 79 20 69 6e 20 74 68 65 20  subquery in the 
2d420 70 61 72 73 65 72 20 74 72 65 65 2e 0a 2a 2f 0a  parser tree..*/.
2d430 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 57  int sqlite3ExprW
2d440 61 6c 6b 4e 6f 6f 70 28 57 61 6c 6b 65 72 20 2a  alkNoop(Walker *
2d450 4e 6f 74 55 73 65 64 2c 20 45 78 70 72 20 2a 4e  NotUsed, Expr *N
2d460 6f 74 55 73 65 64 32 29 7b 0a 20 20 55 4e 55 53  otUsed2){.  UNUS
2d470 45 44 5f 50 41 52 41 4d 45 54 45 52 32 28 4e 6f  ED_PARAMETER2(No
2d480 74 55 73 65 64 2c 20 4e 6f 74 55 73 65 64 32 29  tUsed, NotUsed2)
2d490 3b 0a 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43  ;.  return WRC_C
2d4a0 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a  ontinue;.}../*.*
2d4b0 2a 20 4e 6f 2d 6f 70 20 72 6f 75 74 69 6e 65 20  * No-op routine 
2d4c0 66 6f 72 20 74 68 65 20 70 61 72 73 65 2d 74 72  for the parse-tr
2d4d0 65 65 20 77 61 6c 6b 65 72 20 66 6f 72 20 53 45  ee walker for SE
2d4e0 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73 2e  LECT statements.
2d4f0 0a 2a 2a 20 73 75 62 71 75 65 72 79 20 69 6e 20  .** subquery in 
2d500 74 68 65 20 70 61 72 73 65 72 20 74 72 65 65 2e  the parser tree.
2d510 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 53  .*/.int sqlite3S
2d520 65 6c 65 63 74 57 61 6c 6b 4e 6f 6f 70 28 57 61  electWalkNoop(Wa
2d530 6c 6b 65 72 20 2a 4e 6f 74 55 73 65 64 2c 20 53  lker *NotUsed, S
2d540 65 6c 65 63 74 20 2a 4e 6f 74 55 73 65 64 32 29  elect *NotUsed2)
2d550 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  {.  UNUSED_PARAM
2d560 45 54 45 52 32 28 4e 6f 74 55 73 65 64 2c 20 4e  ETER2(NotUsed, N
2d570 6f 74 55 73 65 64 32 29 3b 0a 20 20 72 65 74 75  otUsed2);.  retu
2d580 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b  rn WRC_Continue;
2d590 0a 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 44  .}..#if SQLITE_D
2d5a0 45 42 55 47 0a 2f 2a 0a 2a 2a 20 41 6c 77 61 79  EBUG./*.** Alway
2d5b0 73 20 61 73 73 65 72 74 2e 20 20 54 68 69 73 20  s assert.  This 
2d5c0 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 32  xSelectCallback2
2d5d0 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
2d5e0 70 72 6f 76 65 73 20 74 68 61 74 20 74 68 65 0a  proves that the.
2d5f0 2a 2a 20 78 53 65 6c 65 63 74 43 61 6c 6c 62 61  ** xSelectCallba
2d600 63 6b 32 20 69 73 20 6e 65 76 65 72 20 69 6e 76  ck2 is never inv
2d610 6f 6b 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  oked..*/.void sq
2d620 6c 69 74 65 33 53 65 6c 65 63 74 57 61 6c 6b 41  lite3SelectWalkA
2d630 73 73 65 72 74 32 28 57 61 6c 6b 65 72 20 2a 4e  ssert2(Walker *N
2d640 6f 74 55 73 65 64 2c 20 53 65 6c 65 63 74 20 2a  otUsed, Select *
2d650 4e 6f 74 55 73 65 64 32 29 7b 0a 20 20 55 4e 55  NotUsed2){.  UNU
2d660 53 45 44 5f 50 41 52 41 4d 45 54 45 52 32 28 4e  SED_PARAMETER2(N
2d670 6f 74 55 73 65 64 2c 20 4e 6f 74 55 73 65 64 32  otUsed, NotUsed2
2d680 29 3b 0a 20 20 61 73 73 65 72 74 28 20 30 20 29  );.  assert( 0 )
2d690 3b 0a 7d 0a 23 65 6e 64 69 66 0a 2f 2a 0a 2a 2a  ;.}.#endif./*.**
2d6a0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 22 65   This routine "e
2d6b0 78 70 61 6e 64 73 22 20 61 20 53 45 4c 45 43 54  xpands" a SELECT
2d6c0 20 73 74 61 74 65 6d 65 6e 74 20 61 6e 64 20 61   statement and a
2d6d0 6c 6c 20 6f 66 20 69 74 73 20 73 75 62 71 75 65  ll of its subque
2d6e0 72 69 65 73 2e 0a 2a 2a 20 46 6f 72 20 61 64 64  ries..** For add
2d6f0 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74  itional informat
2d700 69 6f 6e 20 6f 6e 20 77 68 61 74 20 69 74 20 6d  ion on what it m
2d710 65 61 6e 73 20 74 6f 20 22 65 78 70 61 6e 64 22  eans to "expand"
2d720 20 61 20 53 45 4c 45 43 54 0a 2a 2a 20 73 74 61   a SELECT.** sta
2d730 74 65 6d 65 6e 74 2c 20 73 65 65 20 74 68 65 20  tement, see the 
2d740 63 6f 6d 6d 65 6e 74 20 6f 6e 20 74 68 65 20 73  comment on the s
2d750 65 6c 65 63 74 45 78 70 61 6e 64 20 77 6f 72 6b  electExpand work
2d760 65 72 20 63 61 6c 6c 62 61 63 6b 20 61 62 6f 76  er callback abov
2d770 65 2e 0a 2a 2a 0a 2a 2a 20 45 78 70 61 6e 64 69  e..**.** Expandi
2d780 6e 67 20 61 20 53 45 4c 45 43 54 20 73 74 61 74  ng a SELECT stat
2d790 65 6d 65 6e 74 20 69 73 20 74 68 65 20 66 69 72  ement is the fir
2d7a0 73 74 20 73 74 65 70 20 69 6e 20 70 72 6f 63 65  st step in proce
2d7b0 73 73 69 6e 67 20 61 0a 2a 2a 20 53 45 4c 45 43  ssing a.** SELEC
2d7c0 54 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 54 68  T statement.  Th
2d7d0 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  e SELECT stateme
2d7e0 6e 74 20 6d 75 73 74 20 62 65 20 65 78 70 61 6e  nt must be expan
2d7f0 64 65 64 20 62 65 66 6f 72 65 0a 2a 2a 20 6e 61  ded before.** na
2d800 6d 65 20 72 65 73 6f 6c 75 74 69 6f 6e 20 69 73  me resolution is
2d810 20 70 65 72 66 6f 72 6d 65 64 2e 0a 2a 2a 0a 2a   performed..**.*
2d820 2a 20 49 66 20 61 6e 79 74 68 69 6e 67 20 67 6f  * If anything go
2d830 65 73 20 77 72 6f 6e 67 2c 20 61 6e 20 65 72 72  es wrong, an err
2d840 6f 72 20 6d 65 73 73 61 67 65 20 69 73 20 77 72  or message is wr
2d850 69 74 74 65 6e 20 69 6e 74 6f 20 70 50 61 72 73  itten into pPars
2d860 65 2e 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 69 6e  e..** The callin
2d870 67 20 66 75 6e 63 74 69 6f 6e 20 63 61 6e 20 64  g function can d
2d880 65 74 65 63 74 20 74 68 65 20 70 72 6f 62 6c 65  etect the proble
2d890 6d 20 62 79 20 6c 6f 6f 6b 69 6e 67 20 61 74 20  m by looking at 
2d8a0 70 50 61 72 73 65 2d 3e 6e 45 72 72 0a 2a 2a 20  pParse->nErr.** 
2d8b0 61 6e 64 2f 6f 72 20 70 50 61 72 73 65 2d 3e 64  and/or pParse->d
2d8c0 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 2e  b->mallocFailed.
2d8d0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
2d8e0 73 71 6c 69 74 65 33 53 65 6c 65 63 74 45 78 70  sqlite3SelectExp
2d8f0 61 6e 64 28 50 61 72 73 65 20 2a 70 50 61 72 73  and(Parse *pPars
2d900 65 2c 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65  e, Select *pSele
2d910 63 74 29 7b 0a 20 20 57 61 6c 6b 65 72 20 77 3b  ct){.  Walker w;
2d920 0a 20 20 77 2e 78 45 78 70 72 43 61 6c 6c 62 61  .  w.xExprCallba
2d930 63 6b 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ck = sqlite3Expr
2d940 57 61 6c 6b 4e 6f 6f 70 3b 0a 20 20 77 2e 70 50  WalkNoop;.  w.pP
2d950 61 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20  arse = pParse;. 
2d960 20 69 66 28 20 4f 4b 5f 49 46 5f 41 4c 57 41 59   if( OK_IF_ALWAY
2d970 53 5f 54 52 55 45 28 70 50 61 72 73 65 2d 3e 68  S_TRUE(pParse->h
2d980 61 73 43 6f 6d 70 6f 75 6e 64 29 20 29 7b 0a 20  asCompound) ){. 
2d990 20 20 20 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c     w.xSelectCall
2d9a0 62 61 63 6b 20 3d 20 63 6f 6e 76 65 72 74 43 6f  back = convertCo
2d9b0 6d 70 6f 75 6e 64 53 65 6c 65 63 74 54 6f 53 75  mpoundSelectToSu
2d9c0 62 71 75 65 72 79 3b 0a 20 20 20 20 77 2e 78 53  bquery;.    w.xS
2d9d0 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 32 20 3d  electCallback2 =
2d9e0 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 57   0;.    sqlite3W
2d9f0 61 6c 6b 53 65 6c 65 63 74 28 26 77 2c 20 70 53  alkSelect(&w, pS
2da00 65 6c 65 63 74 29 3b 0a 20 20 7d 0a 20 20 77 2e  elect);.  }.  w.
2da10 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20  xSelectCallback 
2da20 3d 20 73 65 6c 65 63 74 45 78 70 61 6e 64 65 72  = selectExpander
2da30 3b 0a 20 20 77 2e 78 53 65 6c 65 63 74 43 61 6c  ;.  w.xSelectCal
2da40 6c 62 61 63 6b 32 20 3d 20 73 65 6c 65 63 74 50  lback2 = selectP
2da50 6f 70 57 69 74 68 3b 0a 20 20 77 2e 65 43 6f 64  opWith;.  w.eCod
2da60 65 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33  e = 0;.  sqlite3
2da70 57 61 6c 6b 53 65 6c 65 63 74 28 26 77 2c 20 70  WalkSelect(&w, p
2da80 53 65 6c 65 63 74 29 3b 0a 7d 0a 0a 0a 23 69 66  Select);.}...#if
2da90 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
2daa0 5f 53 55 42 51 55 45 52 59 0a 2f 2a 0a 2a 2a 20  _SUBQUERY./*.** 
2dab0 54 68 69 73 20 69 73 20 61 20 57 61 6c 6b 65 72  This is a Walker
2dac0 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b  .xSelectCallback
2dad0 20 63 61 6c 6c 62 61 63 6b 20 66 6f 72 20 74 68   callback for th
2dae0 65 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 54  e sqlite3SelectT
2daf0 79 70 65 49 6e 66 6f 28 29 0a 2a 2a 20 69 6e 74  ypeInfo().** int
2db00 65 72 66 61 63 65 2e 0a 2a 2a 0a 2a 2a 20 46 6f  erface..**.** Fo
2db10 72 20 65 61 63 68 20 46 52 4f 4d 2d 63 6c 61 75  r each FROM-clau
2db20 73 65 20 73 75 62 71 75 65 72 79 2c 20 61 64 64  se subquery, add
2db30 20 43 6f 6c 75 6d 6e 2e 7a 54 79 70 65 20 61 6e   Column.zType an
2db40 64 20 43 6f 6c 75 6d 6e 2e 7a 43 6f 6c 6c 0a 2a  d Column.zColl.*
2db50 2a 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 6f  * information to
2db60 20 74 68 65 20 54 61 62 6c 65 20 73 74 72 75 63   the Table struc
2db70 74 75 72 65 20 74 68 61 74 20 72 65 70 72 65 73  ture that repres
2db80 65 6e 74 73 20 74 68 65 20 72 65 73 75 6c 74 20  ents the result 
2db90 73 65 74 0a 2a 2a 20 6f 66 20 74 68 61 74 20 73  set.** of that s
2dba0 75 62 71 75 65 72 79 2e 0a 2a 2a 0a 2a 2a 20 54  ubquery..**.** T
2dbb0 68 65 20 54 61 62 6c 65 20 73 74 72 75 63 74 75  he Table structu
2dbc0 72 65 20 74 68 61 74 20 72 65 70 72 65 73 65 6e  re that represen
2dbd0 74 73 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  ts the result se
2dbe0 74 20 77 61 73 20 63 6f 6e 73 74 72 75 63 74 65  t was constructe
2dbf0 64 0a 2a 2a 20 62 79 20 73 65 6c 65 63 74 45 78  d.** by selectEx
2dc00 70 61 6e 64 65 72 28 29 20 62 75 74 20 74 68 65  pander() but the
2dc10 20 74 79 70 65 20 61 6e 64 20 63 6f 6c 6c 61 74   type and collat
2dc20 69 6f 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ion information 
2dc30 77 61 73 20 6f 6d 69 74 74 65 64 0a 2a 2a 20 61  was omitted.** a
2dc40 74 20 74 68 61 74 20 70 6f 69 6e 74 20 62 65 63  t that point bec
2dc50 61 75 73 65 20 69 64 65 6e 74 69 66 69 65 72 73  ause identifiers
2dc60 20 68 61 64 20 6e 6f 74 20 79 65 74 20 62 65 65   had not yet bee
2dc70 6e 20 72 65 73 6f 6c 76 65 64 2e 20 20 54 68 69  n resolved.  Thi
2dc80 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 69 73 20  s.** routine is 
2dc90 63 61 6c 6c 65 64 20 61 66 74 65 72 20 69 64 65  called after ide
2dca0 6e 74 69 66 69 65 72 20 72 65 73 6f 6c 75 74 69  ntifier resoluti
2dcb0 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  on..*/.static vo
2dcc0 69 64 20 73 65 6c 65 63 74 41 64 64 53 75 62 71  id selectAddSubq
2dcd0 75 65 72 79 54 79 70 65 49 6e 66 6f 28 57 61 6c  ueryTypeInfo(Wal
2dce0 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 53 65  ker *pWalker, Se
2dcf0 6c 65 63 74 20 2a 70 29 7b 0a 20 20 50 61 72 73  lect *p){.  Pars
2dd00 65 20 2a 70 50 61 72 73 65 3b 0a 20 20 69 6e 74  e *pParse;.  int
2dd10 20 69 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70   i;.  SrcList *p
2dd20 54 61 62 4c 69 73 74 3b 0a 20 20 73 74 72 75 63  TabList;.  struc
2dd30 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
2dd40 70 46 72 6f 6d 3b 0a 0a 20 20 61 73 73 65 72 74  pFrom;..  assert
2dd50 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20  ( p->selFlags & 
2dd60 53 46 5f 52 65 73 6f 6c 76 65 64 20 29 3b 0a 20  SF_Resolved );. 
2dd70 20 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73   if( p->selFlags
2dd80 20 26 20 53 46 5f 48 61 73 54 79 70 65 49 6e 66   & SF_HasTypeInf
2dd90 6f 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 2d  o ) return;.  p-
2dda0 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f  >selFlags |= SF_
2ddb0 48 61 73 54 79 70 65 49 6e 66 6f 3b 0a 20 20 70  HasTypeInfo;.  p
2ddc0 50 61 72 73 65 20 3d 20 70 57 61 6c 6b 65 72 2d  Parse = pWalker-
2ddd0 3e 70 50 61 72 73 65 3b 0a 20 20 70 54 61 62 4c  >pParse;.  pTabL
2dde0 69 73 74 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20  ist = p->pSrc;. 
2ddf0 20 66 6f 72 28 69 3d 30 2c 20 70 46 72 6f 6d 3d   for(i=0, pFrom=
2de00 70 54 61 62 4c 69 73 74 2d 3e 61 3b 20 69 3c 70  pTabList->a; i<p
2de10 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69  TabList->nSrc; i
2de20 2b 2b 2c 20 70 46 72 6f 6d 2b 2b 29 7b 0a 20 20  ++, pFrom++){.  
2de30 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20    Table *pTab = 
2de40 70 46 72 6f 6d 2d 3e 70 54 61 62 3b 0a 20 20 20  pFrom->pTab;.   
2de50 20 61 73 73 65 72 74 28 20 70 54 61 62 21 3d 30   assert( pTab!=0
2de60 20 29 3b 0a 20 20 20 20 69 66 28 20 28 70 54 61   );.    if( (pTa
2de70 62 2d 3e 74 61 62 46 6c 61 67 73 20 26 20 54 46  b->tabFlags & TF
2de80 5f 45 70 68 65 6d 65 72 61 6c 29 21 3d 30 20 29  _Ephemeral)!=0 )
2de90 7b 0a 20 20 20 20 20 20 2f 2a 20 41 20 73 75 62  {.      /* A sub
2dea0 2d 71 75 65 72 79 20 69 6e 20 74 68 65 20 46 52  -query in the FR
2deb0 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 61 20 53  OM clause of a S
2dec0 45 4c 45 43 54 20 2a 2f 0a 20 20 20 20 20 20 53  ELECT */.      S
2ded0 65 6c 65 63 74 20 2a 70 53 65 6c 20 3d 20 70 46  elect *pSel = pF
2dee0 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a 20 20  rom->pSelect;.  
2def0 20 20 20 20 69 66 28 20 70 53 65 6c 20 29 7b 0a      if( pSel ){.
2df00 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 70          while( p
2df10 53 65 6c 2d 3e 70 50 72 69 6f 72 20 29 20 70 53  Sel->pPrior ) pS
2df20 65 6c 20 3d 20 70 53 65 6c 2d 3e 70 50 72 69 6f  el = pSel->pPrio
2df30 72 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  r;.        sqlit
2df40 65 33 53 65 6c 65 63 74 41 64 64 43 6f 6c 75 6d  e3SelectAddColum
2df50 6e 54 79 70 65 41 6e 64 43 6f 6c 6c 61 74 69 6f  nTypeAndCollatio
2df60 6e 28 0a 20 20 20 20 20 20 20 20 20 20 70 50 61  n(.          pPa
2df70 72 73 65 2c 20 70 54 61 62 2c 20 70 53 65 6c 2c  rse, pTab, pSel,
2df80 20 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42   SQLITE_AFF_BLOB
2df90 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20  .        );.    
2dfa0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a    }.    }.  }.}.
2dfb0 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 54  #endif.../*.** T
2dfc0 68 69 73 20 72 6f 75 74 69 6e 65 20 61 64 64 73  his routine adds
2dfd0 20 64 61 74 61 74 79 70 65 20 61 6e 64 20 63 6f   datatype and co
2dfe0 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
2dff0 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 6f 0a   information to.
2e000 2a 2a 20 74 68 65 20 54 61 62 6c 65 20 73 74 72  ** the Table str
2e010 75 63 74 75 72 65 73 20 6f 66 20 61 6c 6c 20 46  uctures of all F
2e020 52 4f 4d 2d 63 6c 61 75 73 65 20 73 75 62 71 75  ROM-clause subqu
2e030 65 72 69 65 73 20 69 6e 20 61 0a 2a 2a 20 53 45  eries in a.** SE
2e040 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a  LECT statement..
2e050 2a 2a 0a 2a 2a 20 55 73 65 20 74 68 69 73 20 72  **.** Use this r
2e060 6f 75 74 69 6e 65 20 61 66 74 65 72 20 6e 61 6d  outine after nam
2e070 65 20 72 65 73 6f 6c 75 74 69 6f 6e 2e 0a 2a 2f  e resolution..*/
2e080 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c  .static void sql
2e090 69 74 65 33 53 65 6c 65 63 74 41 64 64 54 79 70  ite3SelectAddTyp
2e0a0 65 49 6e 66 6f 28 50 61 72 73 65 20 2a 70 50 61  eInfo(Parse *pPa
2e0b0 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 53 65  rse, Select *pSe
2e0c0 6c 65 63 74 29 7b 0a 23 69 66 6e 64 65 66 20 53  lect){.#ifndef S
2e0d0 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
2e0e0 45 52 59 0a 20 20 57 61 6c 6b 65 72 20 77 3b 0a  ERY.  Walker w;.
2e0f0 20 20 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62    w.xSelectCallb
2e100 61 63 6b 20 3d 20 73 71 6c 69 74 65 33 53 65 6c  ack = sqlite3Sel
2e110 65 63 74 57 61 6c 6b 4e 6f 6f 70 3b 0a 20 20 77  ectWalkNoop;.  w
2e120 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b  .xSelectCallback
2e130 32 20 3d 20 73 65 6c 65 63 74 41 64 64 53 75 62  2 = selectAddSub
2e140 71 75 65 72 79 54 79 70 65 49 6e 66 6f 3b 0a 20  queryTypeInfo;. 
2e150 20 77 2e 78 45 78 70 72 43 61 6c 6c 62 61 63 6b   w.xExprCallback
2e160 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 57 61   = sqlite3ExprWa
2e170 6c 6b 4e 6f 6f 70 3b 0a 20 20 77 2e 70 50 61 72  lkNoop;.  w.pPar
2e180 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20 73  se = pParse;.  s
2e190 71 6c 69 74 65 33 57 61 6c 6b 53 65 6c 65 63 74  qlite3WalkSelect
2e1a0 28 26 77 2c 20 70 53 65 6c 65 63 74 29 3b 0a 23  (&w, pSelect);.#
2e1b0 65 6e 64 69 66 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  endif.}.../*.** 
2e1c0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74  This routine set
2e1d0 73 20 75 70 20 61 20 53 45 4c 45 43 54 20 73 74  s up a SELECT st
2e1e0 61 74 65 6d 65 6e 74 20 66 6f 72 20 70 72 6f 63  atement for proc
2e1f0 65 73 73 69 6e 67 2e 20 20 54 68 65 0a 2a 2a 20  essing.  The.** 
2e200 66 6f 6c 6c 6f 77 69 6e 67 20 69 73 20 61 63 63  following is acc
2e210 6f 6d 70 6c 69 73 68 65 64 3a 0a 2a 2a 0a 2a 2a  omplished:.**.**
2e220 20 20 20 20 20 2a 20 20 56 44 42 45 20 43 75 72       *  VDBE Cur
2e230 73 6f 72 20 6e 75 6d 62 65 72 73 20 61 72 65 20  sor numbers are 
2e240 61 73 73 69 67 6e 65 64 20 74 6f 20 61 6c 6c 20  assigned to all 
2e250 46 52 4f 4d 2d 63 6c 61 75 73 65 20 74 65 72 6d  FROM-clause term
2e260 73 2e 0a 2a 2a 20 20 20 20 20 2a 20 20 45 70 68  s..**     *  Eph
2e270 65 6d 65 72 61 6c 20 54 61 62 6c 65 20 6f 62 6a  emeral Table obj
2e280 65 63 74 73 20 61 72 65 20 63 72 65 61 74 65 64  ects are created
2e290 20 66 6f 72 20 61 6c 6c 20 46 52 4f 4d 2d 63 6c   for all FROM-cl
2e2a0 61 75 73 65 20 73 75 62 71 75 65 72 69 65 73 2e  ause subqueries.
2e2b0 0a 2a 2a 20 20 20 20 20 2a 20 20 4f 4e 20 61 6e  .**     *  ON an
2e2c0 64 20 55 53 49 4e 47 20 63 6c 61 75 73 65 73 20  d USING clauses 
2e2d0 61 72 65 20 73 68 69 66 74 65 64 20 69 6e 74 6f  are shifted into
2e2e0 20 57 48 45 52 45 20 73 74 61 74 65 6d 65 6e 74   WHERE statement
2e2f0 73 0a 2a 2a 20 20 20 20 20 2a 20 20 57 69 6c 64  s.**     *  Wild
2e300 63 61 72 64 73 20 22 2a 22 20 61 6e 64 20 22 54  cards "*" and "T
2e310 41 42 4c 45 2e 2a 22 20 69 6e 20 72 65 73 75 6c  ABLE.*" in resul
2e320 74 20 73 65 74 73 20 61 72 65 20 65 78 70 61 6e  t sets are expan
2e330 64 65 64 2e 0a 2a 2a 20 20 20 20 20 2a 20 20 49  ded..**     *  I
2e340 64 65 6e 74 69 66 69 65 72 73 20 69 6e 20 65 78  dentifiers in ex
2e350 70 72 65 73 73 69 6f 6e 20 61 72 65 20 6d 61 74  pression are mat
2e360 63 68 65 64 20 74 6f 20 74 61 62 6c 65 73 2e 0a  ched to tables..
2e370 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
2e380 6e 65 20 61 63 74 73 20 72 65 63 75 72 73 69 76  ne acts recursiv
2e390 65 6c 79 20 6f 6e 20 61 6c 6c 20 73 75 62 71 75  ely on all subqu
2e3a0 65 72 69 65 73 20 77 69 74 68 69 6e 20 74 68 65  eries within the
2e3b0 20 53 45 4c 45 43 54 2e 0a 2a 2f 0a 76 6f 69 64   SELECT..*/.void
2e3c0 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 50 72   sqlite3SelectPr
2e3d0 65 70 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  ep(.  Parse *pPa
2e3e0 72 73 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  rse,         /* 
2e3f0 54 68 65 20 70 61 72 73 65 72 20 63 6f 6e 74 65  The parser conte
2e400 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  xt */.  Select *
2e410 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  p,             /
2e420 2a 20 54 68 65 20 53 45 4c 45 43 54 20 73 74 61  * The SELECT sta
2e430 74 65 6d 65 6e 74 20 62 65 69 6e 67 20 63 6f 64  tement being cod
2e440 65 64 2e 20 2a 2f 0a 20 20 4e 61 6d 65 43 6f 6e  ed. */.  NameCon
2e450 74 65 78 74 20 2a 70 4f 75 74 65 72 4e 43 20 20  text *pOuterNC  
2e460 2f 2a 20 4e 61 6d 65 20 63 6f 6e 74 65 78 74 20  /* Name context 
2e470 66 6f 72 20 63 6f 6e 74 61 69 6e 65 72 20 2a 2f  for container */
2e480 0a 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 21  .){.  assert( p!
2e490 3d 30 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62  =0 || pParse->db
2e4a0 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
2e4b0 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  ;.  if( pParse->
2e4c0 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
2e4d0 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28   ) return;.  if(
2e4e0 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53   p->selFlags & S
2e4f0 46 5f 48 61 73 54 79 70 65 49 6e 66 6f 20 29 20  F_HasTypeInfo ) 
2e500 72 65 74 75 72 6e 3b 0a 20 20 73 71 6c 69 74 65  return;.  sqlite
2e510 33 53 65 6c 65 63 74 45 78 70 61 6e 64 28 70 50  3SelectExpand(pP
2e520 61 72 73 65 2c 20 70 29 3b 0a 20 20 69 66 28 20  arse, p);.  if( 
2e530 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20  pParse->nErr || 
2e540 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c  pParse->db->mall
2e550 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74 75 72  ocFailed ) retur
2e560 6e 3b 0a 20 20 73 71 6c 69 74 65 33 52 65 73 6f  n;.  sqlite3Reso
2e570 6c 76 65 53 65 6c 65 63 74 4e 61 6d 65 73 28 70  lveSelectNames(p
2e580 50 61 72 73 65 2c 20 70 2c 20 70 4f 75 74 65 72  Parse, p, pOuter
2e590 4e 43 29 3b 0a 20 20 69 66 28 20 70 50 61 72 73  NC);.  if( pPars
2e5a0 65 2d 3e 6e 45 72 72 20 7c 7c 20 70 50 61 72 73  e->nErr || pPars
2e5b0 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  e->db->mallocFai
2e5c0 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  led ) return;.  
2e5d0 73 71 6c 69 74 65 33 53 65 6c 65 63 74 41 64 64  sqlite3SelectAdd
2e5e0 54 79 70 65 49 6e 66 6f 28 70 50 61 72 73 65 2c  TypeInfo(pParse,
2e5f0 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65   p);.}../*.** Re
2e600 73 65 74 20 74 68 65 20 61 67 67 72 65 67 61 74  set the aggregat
2e610 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 2e 0a 2a  e accumulator..*
2e620 2a 0a 2a 2a 20 54 68 65 20 61 67 67 72 65 67 61  *.** The aggrega
2e630 74 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 20 69  te accumulator i
2e640 73 20 61 20 73 65 74 20 6f 66 20 6d 65 6d 6f 72  s a set of memor
2e650 79 20 63 65 6c 6c 73 20 74 68 61 74 20 68 6f 6c  y cells that hol
2e660 64 0a 2a 2a 20 69 6e 74 65 72 6d 65 64 69 61 74  d.** intermediat
2e670 65 20 72 65 73 75 6c 74 73 20 77 68 69 6c 65 20  e results while 
2e680 63 61 6c 63 75 6c 61 74 69 6e 67 20 61 6e 20 61  calculating an a
2e690 67 67 72 65 67 61 74 65 2e 20 20 54 68 69 73 0a  ggregate.  This.
2e6a0 2a 2a 20 72 6f 75 74 69 6e 65 20 67 65 6e 65 72  ** routine gener
2e6b0 61 74 65 73 20 63 6f 64 65 20 74 68 61 74 20 73  ates code that s
2e6c0 74 6f 72 65 73 20 4e 55 4c 4c 73 20 69 6e 20 61  tores NULLs in a
2e6d0 6c 6c 20 6f 66 20 74 68 6f 73 65 20 6d 65 6d 6f  ll of those memo
2e6e0 72 79 0a 2a 2a 20 63 65 6c 6c 73 2e 0a 2a 2f 0a  ry.** cells..*/.
2e6f0 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 73 65  static void rese
2e700 74 41 63 63 75 6d 75 6c 61 74 6f 72 28 50 61 72  tAccumulator(Par
2e710 73 65 20 2a 70 50 61 72 73 65 2c 20 41 67 67 49  se *pParse, AggI
2e720 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f 29 7b 0a  nfo *pAggInfo){.
2e730 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
2e740 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74  se->pVdbe;.  int
2e750 20 69 3b 0a 20 20 73 74 72 75 63 74 20 41 67 67   i;.  struct Agg
2e760 49 6e 66 6f 5f 66 75 6e 63 20 2a 70 46 75 6e 63  Info_func *pFunc
2e770 3b 0a 20 20 69 6e 74 20 6e 52 65 67 20 3d 20 70  ;.  int nReg = p
2e780 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 20 2b  AggInfo->nFunc +
2e790 20 70 41 67 67 49 6e 66 6f 2d 3e 6e 43 6f 6c 75   pAggInfo->nColu
2e7a0 6d 6e 3b 0a 20 20 69 66 28 20 6e 52 65 67 3d 3d  mn;.  if( nReg==
2e7b0 30 20 29 20 72 65 74 75 72 6e 3b 0a 23 69 66 64  0 ) return;.#ifd
2e7c0 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
2e7d0 20 20 2f 2a 20 56 65 72 69 66 79 20 74 68 61 74    /* Verify that
2e7e0 20 61 6c 6c 20 41 67 67 49 6e 66 6f 20 72 65 67   all AggInfo reg
2e7f0 69 73 74 65 72 73 20 61 72 65 20 77 69 74 68 69  isters are withi
2e800 6e 20 74 68 65 20 72 61 6e 67 65 20 73 70 65 63  n the range spec
2e810 69 66 69 65 64 20 62 79 0a 20 20 2a 2a 20 41 67  ified by.  ** Ag
2e820 67 49 6e 66 6f 2e 6d 6e 52 65 67 2e 2e 41 67 67  gInfo.mnReg..Agg
2e830 49 6e 66 6f 2e 6d 78 52 65 67 20 2a 2f 0a 20 20  Info.mxReg */.  
2e840 61 73 73 65 72 74 28 20 6e 52 65 67 3d 3d 70 41  assert( nReg==pA
2e850 67 67 49 6e 66 6f 2d 3e 6d 78 52 65 67 2d 70 41  ggInfo->mxReg-pA
2e860 67 67 49 6e 66 6f 2d 3e 6d 6e 52 65 67 2b 31 20  ggInfo->mnReg+1 
2e870 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  );.  for(i=0; i<
2e880 70 41 67 67 49 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d  pAggInfo->nColum
2e890 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 61 73 73  n; i++){.    ass
2e8a0 65 72 74 28 20 70 41 67 67 49 6e 66 6f 2d 3e 61  ert( pAggInfo->a
2e8b0 43 6f 6c 5b 69 5d 2e 69 4d 65 6d 3e 3d 70 41 67  Col[i].iMem>=pAg
2e8c0 67 49 6e 66 6f 2d 3e 6d 6e 52 65 67 0a 20 20 20  gInfo->mnReg.   
2e8d0 20 20 20 20 20 20 26 26 20 70 41 67 67 49 6e 66        && pAggInf
2e8e0 6f 2d 3e 61 43 6f 6c 5b 69 5d 2e 69 4d 65 6d 3c  o->aCol[i].iMem<
2e8f0 3d 70 41 67 67 49 6e 66 6f 2d 3e 6d 78 52 65 67  =pAggInfo->mxReg
2e900 20 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d   );.  }.  for(i=
2e910 30 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e  0; i<pAggInfo->n
2e920 46 75 6e 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Func; i++){.    
2e930 61 73 73 65 72 74 28 20 70 41 67 67 49 6e 66 6f  assert( pAggInfo
2e940 2d 3e 61 46 75 6e 63 5b 69 5d 2e 69 4d 65 6d 3e  ->aFunc[i].iMem>
2e950 3d 70 41 67 67 49 6e 66 6f 2d 3e 6d 6e 52 65 67  =pAggInfo->mnReg
2e960 0a 20 20 20 20 20 20 20 20 20 26 26 20 70 41 67  .         && pAg
2e970 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 69 5d 2e  gInfo->aFunc[i].
2e980 69 4d 65 6d 3c 3d 70 41 67 67 49 6e 66 6f 2d 3e  iMem<=pAggInfo->
2e990 6d 78 52 65 67 20 29 3b 0a 20 20 7d 0a 23 65 6e  mxReg );.  }.#en
2e9a0 64 69 66 0a 20 20 73 71 6c 69 74 65 33 56 64 62  dif.  sqlite3Vdb
2e9b0 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4e 75  eAddOp3(v, OP_Nu
2e9c0 6c 6c 2c 20 30 2c 20 70 41 67 67 49 6e 66 6f 2d  ll, 0, pAggInfo-
2e9d0 3e 6d 6e 52 65 67 2c 20 70 41 67 67 49 6e 66 6f  >mnReg, pAggInfo
2e9e0 2d 3e 6d 78 52 65 67 29 3b 0a 20 20 66 6f 72 28  ->mxReg);.  for(
2e9f0 70 46 75 6e 63 3d 70 41 67 67 49 6e 66 6f 2d 3e  pFunc=pAggInfo->
2ea00 61 46 75 6e 63 2c 20 69 3d 30 3b 20 69 3c 70 41  aFunc, i=0; i<pA
2ea10 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3b 20 69  ggInfo->nFunc; i
2ea20 2b 2b 2c 20 70 46 75 6e 63 2b 2b 29 7b 0a 20 20  ++, pFunc++){.  
2ea30 20 20 69 66 28 20 70 46 75 6e 63 2d 3e 69 44 69    if( pFunc->iDi
2ea40 73 74 69 6e 63 74 3e 3d 30 20 29 7b 0a 20 20 20  stinct>=0 ){.   
2ea50 20 20 20 45 78 70 72 20 2a 70 45 20 3d 20 70 46     Expr *pE = pF
2ea60 75 6e 63 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20  unc->pExpr;.    
2ea70 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48    assert( !ExprH
2ea80 61 73 50 72 6f 70 65 72 74 79 28 70 45 2c 20 45  asProperty(pE, E
2ea90 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a  P_xIsSelect) );.
2eaa0 20 20 20 20 20 20 69 66 28 20 70 45 2d 3e 78 2e        if( pE->x.
2eab0 70 4c 69 73 74 3d 3d 30 20 7c 7c 20 70 45 2d 3e  pList==0 || pE->
2eac0 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d  x.pList->nExpr!=
2ead0 31 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  1 ){.        sql
2eae0 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
2eaf0 72 73 65 2c 20 22 44 49 53 54 49 4e 43 54 20 61  rse, "DISTINCT a
2eb00 67 67 72 65 67 61 74 65 73 20 6d 75 73 74 20 68  ggregates must h
2eb10 61 76 65 20 65 78 61 63 74 6c 79 20 6f 6e 65 20  ave exactly one 
2eb20 22 0a 20 20 20 20 20 20 20 20 20 20 20 22 61 72  ".           "ar
2eb30 67 75 6d 65 6e 74 22 29 3b 0a 20 20 20 20 20 20  gument");.      
2eb40 20 20 70 46 75 6e 63 2d 3e 69 44 69 73 74 69 6e    pFunc->iDistin
2eb50 63 74 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 7d  ct = -1;.      }
2eb60 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 4b 65  else{.        Ke
2eb70 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 20  yInfo *pKeyInfo 
2eb80 3d 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f  = sqlite3KeyInfo
2eb90 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 70 50 61  FromExprList(pPa
2eba0 72 73 65 2c 20 70 45 2d 3e 78 2e 70 4c 69 73 74  rse, pE->x.pList
2ebb0 2c 30 2c 30 29 3b 0a 20 20 20 20 20 20 20 20 73  ,0,0);.        s
2ebc0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
2ebd0 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d  (v, OP_OpenEphem
2ebe0 65 72 61 6c 2c 20 70 46 75 6e 63 2d 3e 69 44 69  eral, pFunc->iDi
2ebf0 73 74 69 6e 63 74 2c 20 30 2c 20 30 2c 0a 20 20  stinct, 0, 0,.  
2ec00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ec10 20 20 20 20 20 20 20 20 28 63 68 61 72 2a 29 70          (char*)p
2ec20 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49  KeyInfo, P4_KEYI
2ec30 4e 46 4f 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  NFO);.      }.  
2ec40 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
2ec50 20 49 6e 76 6f 6b 65 20 74 68 65 20 4f 50 5f 41   Invoke the OP_A
2ec60 67 67 46 69 6e 61 6c 69 7a 65 20 6f 70 63 6f 64  ggFinalize opcod
2ec70 65 20 66 6f 72 20 65 76 65 72 79 20 61 67 67 72  e for every aggr
2ec80 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 0a 2a  egate function.*
2ec90 2a 20 69 6e 20 74 68 65 20 41 67 67 49 6e 66 6f  * in the AggInfo
2eca0 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73   structure..*/.s
2ecb0 74 61 74 69 63 20 76 6f 69 64 20 66 69 6e 61 6c  tatic void final
2ecc0 69 7a 65 41 67 67 46 75 6e 63 74 69 6f 6e 73 28  izeAggFunctions(
2ecd0 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 41  Parse *pParse, A
2ece0 67 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f  ggInfo *pAggInfo
2ecf0 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  ){.  Vdbe *v = p
2ed00 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
2ed10 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20  int i;.  struct 
2ed20 41 67 67 49 6e 66 6f 5f 66 75 6e 63 20 2a 70 46  AggInfo_func *pF
2ed30 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 46 3d  ;.  for(i=0, pF=
2ed40 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 3b  pAggInfo->aFunc;
2ed50 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75   i<pAggInfo->nFu
2ed60 6e 63 3b 20 69 2b 2b 2c 20 70 46 2b 2b 29 7b 0a  nc; i++, pF++){.
2ed70 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c      ExprList *pL
2ed80 69 73 74 20 3d 20 70 46 2d 3e 70 45 78 70 72 2d  ist = pF->pExpr-
2ed90 3e 78 2e 70 4c 69 73 74 3b 0a 20 20 20 20 61 73  >x.pList;.    as
2eda0 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72  sert( !ExprHasPr
2edb0 6f 70 65 72 74 79 28 70 46 2d 3e 70 45 78 70 72  operty(pF->pExpr
2edc0 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20  , EP_xIsSelect) 
2edd0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
2ede0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41  beAddOp2(v, OP_A
2edf0 67 67 46 69 6e 61 6c 2c 20 70 46 2d 3e 69 4d 65  ggFinal, pF->iMe
2ee00 6d 2c 20 70 4c 69 73 74 20 3f 20 70 4c 69 73 74  m, pList ? pList
2ee10 2d 3e 6e 45 78 70 72 20 3a 20 30 29 3b 0a 20 20  ->nExpr : 0);.  
2ee20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 70 70    sqlite3VdbeApp
2ee30 65 6e 64 50 34 28 76 2c 20 70 46 2d 3e 70 46 75  endP4(v, pF->pFu
2ee40 6e 63 2c 20 50 34 5f 46 55 4e 43 44 45 46 29 3b  nc, P4_FUNCDEF);
2ee50 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 55  .  }.}.../*.** U
2ee60 70 64 61 74 65 20 74 68 65 20 61 63 63 75 6d 75  pdate the accumu
2ee70 6c 61 74 6f 72 20 6d 65 6d 6f 72 79 20 63 65 6c  lator memory cel
2ee80 6c 73 20 66 6f 72 20 61 6e 20 61 67 67 72 65 67  ls for an aggreg
2ee90 61 74 65 20 62 61 73 65 64 20 6f 6e 0a 2a 2a 20  ate based on.** 
2eea0 74 68 65 20 63 75 72 72 65 6e 74 20 63 75 72 73  the current curs
2eeb0 6f 72 20 70 6f 73 69 74 69 6f 6e 2e 0a 2a 2a 0a  or position..**.
2eec0 2a 2a 20 49 66 20 72 65 67 41 63 63 20 69 73 20  ** If regAcc is 
2eed0 6e 6f 6e 2d 7a 65 72 6f 20 61 6e 64 20 74 68 65  non-zero and the
2eee0 72 65 20 61 72 65 20 6e 6f 20 6d 69 6e 28 29 20  re are no min() 
2eef0 6f 72 20 6d 61 78 28 29 20 61 67 67 72 65 67 61  or max() aggrega
2ef00 74 65 73 0a 2a 2a 20 69 6e 20 70 41 67 67 49 6e  tes.** in pAggIn
2ef10 66 6f 2c 20 74 68 65 6e 20 6f 6e 6c 79 20 70 6f  fo, then only po
2ef20 70 75 6c 61 74 65 20 74 68 65 20 70 41 67 67 49  pulate the pAggI
2ef30 6e 66 6f 2d 3e 6e 41 63 63 75 6d 75 6c 61 74 6f  nfo->nAccumulato
2ef40 72 20 61 63 63 75 6d 75 6c 61 74 6f 72 0a 2a 2a  r accumulator.**
2ef50 20 72 65 67 69 73 74 65 72 73 20 69 66 20 72 65   registers if re
2ef60 67 69 73 74 65 72 20 72 65 67 41 63 63 20 63 6f  gister regAcc co
2ef70 6e 74 61 69 6e 73 20 30 2e 20 54 68 65 20 63 61  ntains 0. The ca
2ef80 6c 6c 65 72 20 77 69 6c 6c 20 74 61 6b 65 20 63  ller will take c
2ef90 61 72 65 0a 2a 2a 20 6f 66 20 73 65 74 74 69 6e  are.** of settin
2efa0 67 20 61 6e 64 20 63 6c 65 61 72 69 6e 67 20 72  g and clearing r
2efb0 65 67 41 63 63 2e 0a 2a 2f 0a 73 74 61 74 69 63  egAcc..*/.static
2efc0 20 76 6f 69 64 20 75 70 64 61 74 65 41 63 63 75   void updateAccu
2efd0 6d 75 6c 61 74 6f 72 28 50 61 72 73 65 20 2a 70  mulator(Parse *p
2efe0 50 61 72 73 65 2c 20 69 6e 74 20 72 65 67 41 63  Parse, int regAc
2eff0 63 2c 20 41 67 67 49 6e 66 6f 20 2a 70 41 67 67  c, AggInfo *pAgg
2f000 49 6e 66 6f 29 7b 0a 20 20 56 64 62 65 20 2a 76  Info){.  Vdbe *v
2f010 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
2f020 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74  ;.  int i;.  int
2f030 20 72 65 67 48 69 74 20 3d 20 30 3b 0a 20 20 69   regHit = 0;.  i
2f040 6e 74 20 61 64 64 72 48 69 74 54 65 73 74 20 3d  nt addrHitTest =
2f050 20 30 3b 0a 20 20 73 74 72 75 63 74 20 41 67 67   0;.  struct Agg
2f060 49 6e 66 6f 5f 66 75 6e 63 20 2a 70 46 3b 0a 20  Info_func *pF;. 
2f070 20 73 74 72 75 63 74 20 41 67 67 49 6e 66 6f 5f   struct AggInfo_
2f080 63 6f 6c 20 2a 70 43 3b 0a 0a 20 20 70 41 67 67  col *pC;..  pAgg
2f090 49 6e 66 6f 2d 3e 64 69 72 65 63 74 4d 6f 64 65  Info->directMode
2f0a0 20 3d 20 31 3b 0a 20 20 66 6f 72 28 69 3d 30 2c   = 1;.  for(i=0,
2f0b0 20 70 46 3d 70 41 67 67 49 6e 66 6f 2d 3e 61 46   pF=pAggInfo->aF
2f0c0 75 6e 63 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d  unc; i<pAggInfo-
2f0d0 3e 6e 46 75 6e 63 3b 20 69 2b 2b 2c 20 70 46 2b  >nFunc; i++, pF+
2f0e0 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6e 41 72 67  +){.    int nArg
2f0f0 3b 0a 20 20 20 20 69 6e 74 20 61 64 64 72 4e 65  ;.    int addrNe
2f100 78 74 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20  xt = 0;.    int 
2f110 72 65 67 41 67 67 3b 0a 20 20 20 20 45 78 70 72  regAgg;.    Expr
2f120 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d 20 70 46  List *pList = pF
2f130 2d 3e 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74  ->pExpr->x.pList
2f140 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 45  ;.    assert( !E
2f150 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
2f160 46 2d 3e 70 45 78 70 72 2c 20 45 50 5f 78 49 73  F->pExpr, EP_xIs
2f170 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 20 20 61  Select) );.    a
2f180 73 73 65 72 74 28 20 21 49 73 57 69 6e 64 6f 77  ssert( !IsWindow
2f190 46 75 6e 63 28 70 46 2d 3e 70 45 78 70 72 29 20  Func(pF->pExpr) 
2f1a0 29 3b 0a 20 20 20 20 69 66 28 20 45 78 70 72 48  );.    if( ExprH
2f1b0 61 73 50 72 6f 70 65 72 74 79 28 70 46 2d 3e 70  asProperty(pF->p
2f1c0 45 78 70 72 2c 20 45 50 5f 57 69 6e 46 75 6e 63  Expr, EP_WinFunc
2f1d0 29 20 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20  ) ){.      Expr 
2f1e0 2a 70 46 69 6c 74 65 72 20 3d 20 70 46 2d 3e 70  *pFilter = pF->p
2f1f0 45 78 70 72 2d 3e 79 2e 70 57 69 6e 2d 3e 70 46  Expr->y.pWin->pF
2f200 69 6c 74 65 72 3b 0a 20 20 20 20 20 20 61 64 64  ilter;.      add
2f210 72 4e 65 78 74 20 3d 20 73 71 6c 69 74 65 33 56  rNext = sqlite3V
2f220 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 70 50 61  dbeMakeLabel(pPa
2f230 72 73 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  rse);.      sqli
2f240 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70  te3ExprIfFalse(p
2f250 50 61 72 73 65 2c 20 70 46 69 6c 74 65 72 2c 20  Parse, pFilter, 
2f260 61 64 64 72 4e 65 78 74 2c 20 53 51 4c 49 54 45  addrNext, SQLITE
2f270 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20  _JUMPIFNULL);.  
2f280 20 20 7d 0a 20 20 20 20 69 66 28 20 70 4c 69 73    }.    if( pLis
2f290 74 20 29 7b 0a 20 20 20 20 20 20 6e 41 72 67 20  t ){.      nArg 
2f2a0 3d 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a  = pList->nExpr;.
2f2b0 20 20 20 20 20 20 72 65 67 41 67 67 20 3d 20 73        regAgg = s
2f2c0 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 61 6e  qlite3GetTempRan
2f2d0 67 65 28 70 50 61 72 73 65 2c 20 6e 41 72 67 29  ge(pParse, nArg)
2f2e0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
2f2f0 78 70 72 43 6f 64 65 45 78 70 72 4c 69 73 74 28  xprCodeExprList(
2f300 70 50 61 72 73 65 2c 20 70 4c 69 73 74 2c 20 72  pParse, pList, r
2f310 65 67 41 67 67 2c 20 30 2c 20 53 51 4c 49 54 45  egAgg, 0, SQLITE
2f320 5f 45 43 45 4c 5f 44 55 50 29 3b 0a 20 20 20 20  _ECEL_DUP);.    
2f330 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 41 72  }else{.      nAr
2f340 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 65 67  g = 0;.      reg
2f350 41 67 67 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  Agg = 0;.    }. 
2f360 20 20 20 69 66 28 20 70 46 2d 3e 69 44 69 73 74     if( pF->iDist
2f370 69 6e 63 74 3e 3d 30 20 29 7b 0a 20 20 20 20 20  inct>=0 ){.     
2f380 20 69 66 28 20 61 64 64 72 4e 65 78 74 3d 3d 30   if( addrNext==0
2f390 20 29 7b 20 0a 20 20 20 20 20 20 20 20 61 64 64   ){ .        add
2f3a0 72 4e 65 78 74 20 3d 20 73 71 6c 69 74 65 33 56  rNext = sqlite3V
2f3b0 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 70 50 61  dbeMakeLabel(pPa
2f3c0 72 73 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rse);.      }.  
2f3d0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6e 41      testcase( nA
2f3e0 72 67 3d 3d 30 20 29 3b 20 20 2f 2a 20 45 72 72  rg==0 );  /* Err
2f3f0 6f 72 20 63 6f 6e 64 69 74 69 6f 6e 20 2a 2f 0a  or condition */.
2f400 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
2f410 6e 41 72 67 3e 31 20 29 3b 20 20 20 2f 2a 20 41  nArg>1 );   /* A
2f420 6c 73 6f 20 61 6e 20 65 72 72 6f 72 20 2a 2f 0a  lso an error */.
2f430 20 20 20 20 20 20 63 6f 64 65 44 69 73 74 69 6e        codeDistin
2f440 63 74 28 70 50 61 72 73 65 2c 20 70 46 2d 3e 69  ct(pParse, pF->i
2f450 44 69 73 74 69 6e 63 74 2c 20 61 64 64 72 4e 65  Distinct, addrNe
2f460 78 74 2c 20 31 2c 20 72 65 67 41 67 67 29 3b 0a  xt, 1, regAgg);.
2f470 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 46      }.    if( pF
2f480 2d 3e 70 46 75 6e 63 2d 3e 66 75 6e 63 46 6c 61  ->pFunc->funcFla
2f490 67 73 20 26 20 53 51 4c 49 54 45 5f 46 55 4e 43  gs & SQLITE_FUNC
2f4a0 5f 4e 45 45 44 43 4f 4c 4c 20 29 7b 0a 20 20 20  _NEEDCOLL ){.   
2f4b0 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c     CollSeq *pCol
2f4c0 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 74 72  l = 0;.      str
2f4d0 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
2f4e0 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 20 20 20 20  m *pItem;.      
2f4f0 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 61 73 73  int j;.      ass
2f500 65 72 74 28 20 70 4c 69 73 74 21 3d 30 20 29 3b  ert( pList!=0 );
2f510 20 20 2f 2a 20 70 4c 69 73 74 21 3d 30 20 69 66    /* pList!=0 if
2f520 20 70 46 2d 3e 70 46 75 6e 63 20 68 61 73 20 4e   pF->pFunc has N
2f530 45 45 44 43 4f 4c 4c 20 2a 2f 0a 20 20 20 20 20  EEDCOLL */.     
2f540 20 66 6f 72 28 6a 3d 30 2c 20 70 49 74 65 6d 3d   for(j=0, pItem=
2f550 70 4c 69 73 74 2d 3e 61 3b 20 21 70 43 6f 6c 6c  pList->a; !pColl
2f560 20 26 26 20 6a 3c 6e 41 72 67 3b 20 6a 2b 2b 2c   && j<nArg; j++,
2f570 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20   pItem++){.     
2f580 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74     pColl = sqlit
2f590 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50  e3ExprCollSeq(pP
2f5a0 61 72 73 65 2c 20 70 49 74 65 6d 2d 3e 70 45 78  arse, pItem->pEx
2f5b0 70 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  pr);.      }.   
2f5c0 20 20 20 69 66 28 20 21 70 43 6f 6c 6c 20 29 7b     if( !pColl ){
2f5d0 0a 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d  .        pColl =
2f5e0 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 70 44 66   pParse->db->pDf
2f5f0 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a  ltColl;.      }.
2f600 20 20 20 20 20 20 69 66 28 20 72 65 67 48 69 74        if( regHit
2f610 3d 3d 30 20 26 26 20 70 41 67 67 49 6e 66 6f 2d  ==0 && pAggInfo-
2f620 3e 6e 41 63 63 75 6d 75 6c 61 74 6f 72 20 29 20  >nAccumulator ) 
2f630 72 65 67 48 69 74 20 3d 20 2b 2b 70 50 61 72 73  regHit = ++pPars
2f640 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 73  e->nMem;.      s
2f650 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
2f660 28 76 2c 20 4f 50 5f 43 6f 6c 6c 53 65 71 2c 20  (v, OP_CollSeq, 
2f670 72 65 67 48 69 74 2c 20 30 2c 20 30 2c 20 28 63  regHit, 0, 0, (c
2f680 68 61 72 20 2a 29 70 43 6f 6c 6c 2c 20 50 34 5f  har *)pColl, P4_
2f690 43 4f 4c 4c 53 45 51 29 3b 0a 20 20 20 20 7d 0a  COLLSEQ);.    }.
2f6a0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
2f6b0 64 64 4f 70 33 28 76 2c 20 4f 50 5f 41 67 67 53  ddOp3(v, OP_AggS
2f6c0 74 65 70 2c 20 30 2c 20 72 65 67 41 67 67 2c 20  tep, 0, regAgg, 
2f6d0 70 46 2d 3e 69 4d 65 6d 29 3b 0a 20 20 20 20 73  pF->iMem);.    s
2f6e0 71 6c 69 74 65 33 56 64 62 65 41 70 70 65 6e 64  qlite3VdbeAppend
2f6f0 50 34 28 76 2c 20 70 46 2d 3e 70 46 75 6e 63 2c  P4(v, pF->pFunc,
2f700 20 50 34 5f 46 55 4e 43 44 45 46 29 3b 0a 20 20   P4_FUNCDEF);.  
2f710 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
2f720 6e 67 65 50 35 28 76 2c 20 28 75 38 29 6e 41 72  ngeP5(v, (u8)nAr
2f730 67 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 52  g);.    sqlite3R
2f740 65 6c 65 61 73 65 54 65 6d 70 52 61 6e 67 65 28  eleaseTempRange(
2f750 70 50 61 72 73 65 2c 20 72 65 67 41 67 67 2c 20  pParse, regAgg, 
2f760 6e 41 72 67 29 3b 0a 20 20 20 20 69 66 28 20 61  nArg);.    if( a
2f770 64 64 72 4e 65 78 74 20 29 7b 0a 20 20 20 20 20  ddrNext ){.     
2f780 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
2f790 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61 64 64 72  lveLabel(v, addr
2f7a0 4e 65 78 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  Next);.    }.  }
2f7b0 0a 20 20 69 66 28 20 72 65 67 48 69 74 3d 3d 30  .  if( regHit==0
2f7c0 20 26 26 20 70 41 67 67 49 6e 66 6f 2d 3e 6e 41   && pAggInfo->nA
2f7d0 63 63 75 6d 75 6c 61 74 6f 72 20 29 7b 0a 20 20  ccumulator ){.  
2f7e0 20 20 72 65 67 48 69 74 20 3d 20 72 65 67 41 63    regHit = regAc
2f7f0 63 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 65 67  c;.  }.  if( reg
2f800 48 69 74 20 29 7b 0a 20 20 20 20 61 64 64 72 48  Hit ){.    addrH
2f810 69 74 54 65 73 74 20 3d 20 73 71 6c 69 74 65 33  itTest = sqlite3
2f820 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
2f830 5f 49 66 2c 20 72 65 67 48 69 74 29 3b 20 56 64  _If, regHit); Vd
2f840 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
2f850 20 7d 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 43   }.  for(i=0, pC
2f860 3d 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 3b  =pAggInfo->aCol;
2f870 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 41 63   i<pAggInfo->nAc
2f880 63 75 6d 75 6c 61 74 6f 72 3b 20 69 2b 2b 2c 20  cumulator; i++, 
2f890 70 43 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74  pC++){.    sqlit
2f8a0 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73  e3ExprCode(pPars
2f8b0 65 2c 20 70 43 2d 3e 70 45 78 70 72 2c 20 70 43  e, pC->pExpr, pC
2f8c0 2d 3e 69 4d 65 6d 29 3b 0a 20 20 7d 0a 20 20 70  ->iMem);.  }.  p
2f8d0 41 67 67 49 6e 66 6f 2d 3e 64 69 72 65 63 74 4d  AggInfo->directM
2f8e0 6f 64 65 20 3d 20 30 3b 0a 20 20 69 66 28 20 61  ode = 0;.  if( a
2f8f0 64 64 72 48 69 74 54 65 73 74 20 29 7b 0a 20 20  ddrHitTest ){.  
2f900 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
2f910 70 48 65 72 65 28 76 2c 20 61 64 64 72 48 69 74  pHere(v, addrHit
2f920 54 65 73 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  Test);.  }.}../*
2f930 0a 2a 2a 20 41 64 64 20 61 20 73 69 6e 67 6c 65  .** Add a single
2f940 20 4f 50 5f 45 78 70 6c 61 69 6e 20 69 6e 73 74   OP_Explain inst
2f950 72 75 63 74 69 6f 6e 20 74 6f 20 74 68 65 20 56  ruction to the V
2f960 44 42 45 20 74 6f 20 65 78 70 6c 61 69 6e 20 61  DBE to explain a
2f970 20 73 69 6d 70 6c 65 0a 2a 2a 20 63 6f 75 6e 74   simple.** count
2f980 28 2a 29 20 71 75 65 72 79 20 28 22 53 45 4c 45  (*) query ("SELE
2f990 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d  CT count(*) FROM
2f9a0 20 70 54 61 62 22 29 2e 0a 2a 2f 0a 23 69 66 6e   pTab")..*/.#ifn
2f9b0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
2f9c0 45 58 50 4c 41 49 4e 0a 73 74 61 74 69 63 20 76  EXPLAIN.static v
2f9d0 6f 69 64 20 65 78 70 6c 61 69 6e 53 69 6d 70 6c  oid explainSimpl
2f9e0 65 43 6f 75 6e 74 28 0a 20 20 50 61 72 73 65 20  eCount(.  Parse 
2f9f0 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
2fa00 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72            /* Par
2fa10 73 65 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  se context */.  
2fa20 54 61 62 6c 65 20 2a 70 54 61 62 2c 20 20 20 20  Table *pTab,    
2fa30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2fa40 2f 2a 20 54 61 62 6c 65 20 62 65 69 6e 67 20 71  /* Table being q
2fa50 75 65 72 69 65 64 20 2a 2f 0a 20 20 49 6e 64 65  ueried */.  Inde
2fa60 78 20 2a 70 49 64 78 20 20 20 20 20 20 20 20 20  x *pIdx         
2fa70 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
2fa80 6e 64 65 78 20 75 73 65 64 20 74 6f 20 6f 70 74  ndex used to opt
2fa90 69 6d 69 7a 65 20 73 63 61 6e 2c 20 6f 72 20 4e  imize scan, or N
2faa0 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20  ULL */.){.  if( 
2fab0 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 3d  pParse->explain=
2fac0 3d 32 20 29 7b 0a 20 20 20 20 69 6e 74 20 62 43  =2 ){.    int bC
2fad0 6f 76 65 72 20 3d 20 28 70 49 64 78 21 3d 30 20  over = (pIdx!=0 
2fae0 26 26 20 28 48 61 73 52 6f 77 69 64 28 70 54 61  && (HasRowid(pTa
2faf0 62 29 20 7c 7c 20 21 49 73 50 72 69 6d 61 72 79  b) || !IsPrimary
2fb00 4b 65 79 49 6e 64 65 78 28 70 49 64 78 29 29 29  KeyIndex(pIdx)))
2fb10 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
2fb20 65 45 78 70 6c 61 69 6e 28 70 50 61 72 73 65 2c  eExplain(pParse,
2fb30 20 30 2c 20 22 53 43 41 4e 20 54 41 42 4c 45 20   0, "SCAN TABLE 
2fb40 25 73 25 73 25 73 22 2c 0a 20 20 20 20 20 20 20  %s%s%s",.       
2fb50 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 0a 20 20   pTab->zName,.  
2fb60 20 20 20 20 20 20 62 43 6f 76 65 72 20 3f 20 22        bCover ? "
2fb70 20 55 53 49 4e 47 20 43 4f 56 45 52 49 4e 47 20   USING COVERING 
2fb80 49 4e 44 45 58 20 22 20 3a 20 22 22 2c 0a 20 20  INDEX " : "",.  
2fb90 20 20 20 20 20 20 62 43 6f 76 65 72 20 3f 20 70        bCover ? p
2fba0 49 64 78 2d 3e 7a 4e 61 6d 65 20 3a 20 22 22 0a  Idx->zName : "".
2fbb0 20 20 20 20 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6c      );.  }.}.#el
2fbc0 73 65 0a 23 20 64 65 66 69 6e 65 20 65 78 70 6c  se.# define expl
2fbd0 61 69 6e 53 69 6d 70 6c 65 43 6f 75 6e 74 28 61  ainSimpleCount(a
2fbe0 2c 62 2c 63 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a  ,b,c).#endif../*
2fbf0 0a 2a 2a 20 73 71 6c 69 74 65 33 57 61 6c 6b 45  .** sqlite3WalkE
2fc00 78 70 72 28 29 20 63 61 6c 6c 62 61 63 6b 20 75  xpr() callback u
2fc10 73 65 64 20 62 79 20 68 61 76 69 6e 67 54 6f 57  sed by havingToW
2fc20 68 65 72 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66  here()..**.** If
2fc30 20 74 68 65 20 6e 6f 64 65 20 70 61 73 73 65 64   the node passed
2fc40 20 74 6f 20 74 68 65 20 63 61 6c 6c 62 61 63 6b   to the callback
2fc50 20 69 73 20 61 20 54 4b 5f 41 4e 44 20 6e 6f 64   is a TK_AND nod
2fc60 65 2c 20 72 65 74 75 72 6e 20 0a 2a 2a 20 57 52  e, return .** WR
2fc70 43 5f 43 6f 6e 74 69 6e 75 65 20 74 6f 20 74 65  C_Continue to te
2fc80 6c 6c 20 73 71 6c 69 74 65 33 57 61 6c 6b 45 78  ll sqlite3WalkEx
2fc90 70 72 28 29 20 74 6f 20 69 74 65 72 61 74 65 20  pr() to iterate 
2fca0 74 68 72 6f 75 67 68 20 63 68 69 6c 64 20 6e 6f  through child no
2fcb0 64 65 73 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72  des..**.** Other
2fcc0 77 69 73 65 2c 20 72 65 74 75 72 6e 20 57 52 43  wise, return WRC
2fcd0 5f 50 72 75 6e 65 2e 20 49 6e 20 74 68 69 73 20  _Prune. In this 
2fce0 63 61 73 65 2c 20 61 6c 73 6f 20 63 68 65 63 6b  case, also check
2fcf0 20 69 66 20 74 68 65 20 0a 2a 2a 20 73 75 62 2d   if the .** sub-
2fd00 65 78 70 72 65 73 73 69 6f 6e 20 6d 61 74 63 68  expression match
2fd10 65 73 20 74 68 65 20 63 72 69 74 65 72 69 61 20  es the criteria 
2fd20 66 6f 72 20 62 65 69 6e 67 20 6d 6f 76 65 64 20  for being moved 
2fd30 74 6f 20 74 68 65 20 57 48 45 52 45 0a 2a 2a 20  to the WHERE.** 
2fd40 63 6c 61 75 73 65 2e 20 49 66 20 73 6f 2c 20 61  clause. If so, a
2fd50 64 64 20 69 74 20 74 6f 20 74 68 65 20 57 48 45  dd it to the WHE
2fd60 52 45 20 63 6c 61 75 73 65 20 61 6e 64 20 72 65  RE clause and re
2fd70 70 6c 61 63 65 20 74 68 65 20 73 75 62 2d 65 78  place the sub-ex
2fd80 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 77 69 74 68  pression.** with
2fd90 69 6e 20 74 68 65 20 48 41 56 49 4e 47 20 65 78  in the HAVING ex
2fda0 70 72 65 73 73 69 6f 6e 20 77 69 74 68 20 61 20  pression with a 
2fdb0 63 6f 6e 73 74 61 6e 74 20 22 31 22 2e 0a 2a 2f  constant "1"..*/
2fdc0 0a 73 74 61 74 69 63 20 69 6e 74 20 68 61 76 69  .static int havi
2fdd0 6e 67 54 6f 57 68 65 72 65 45 78 70 72 43 62 28  ngToWhereExprCb(
2fde0 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c  Walker *pWalker,
2fdf0 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20   Expr *pExpr){. 
2fe00 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d   if( pExpr->op!=
2fe10 54 4b 5f 41 4e 44 20 29 7b 0a 20 20 20 20 53 65  TK_AND ){.    Se
2fe20 6c 65 63 74 20 2a 70 53 20 3d 20 70 57 61 6c 6b  lect *pS = pWalk
2fe30 65 72 2d 3e 75 2e 70 53 65 6c 65 63 74 3b 0a 20  er->u.pSelect;. 
2fe40 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78     if( sqlite3Ex
2fe50 70 72 49 73 43 6f 6e 73 74 61 6e 74 4f 72 47 72  prIsConstantOrGr
2fe60 6f 75 70 42 79 28 70 57 61 6c 6b 65 72 2d 3e 70  oupBy(pWalker->p
2fe70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 70 53  Parse, pExpr, pS
2fe80 2d 3e 70 47 72 6f 75 70 42 79 29 20 29 7b 0a 20  ->pGroupBy) ){. 
2fe90 20 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62       sqlite3 *db
2fea0 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 70 50 61 72   = pWalker->pPar
2feb0 73 65 2d 3e 64 62 3b 0a 20 20 20 20 20 20 45 78  se->db;.      Ex
2fec0 70 72 20 2a 70 4e 65 77 20 3d 20 73 71 6c 69 74  pr *pNew = sqlit
2fed0 65 33 45 78 70 72 41 6c 6c 6f 63 28 64 62 2c 20  e3ExprAlloc(db, 
2fee0 54 4b 5f 49 4e 54 45 47 45 52 2c 20 26 73 71 6c  TK_INTEGER, &sql
2fef0 69 74 65 33 49 6e 74 54 6f 6b 65 6e 73 5b 31 5d  ite3IntTokens[1]
2ff00 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 0);.      if( 
2ff10 70 4e 65 77 20 29 7b 0a 20 20 20 20 20 20 20 20  pNew ){.        
2ff20 45 78 70 72 20 2a 70 57 68 65 72 65 20 3d 20 70  Expr *pWhere = p
2ff30 53 2d 3e 70 57 68 65 72 65 3b 0a 20 20 20 20 20  S->pWhere;.     
2ff40 20 20 20 53 57 41 50 28 45 78 70 72 2c 20 2a 70     SWAP(Expr, *p
2ff50 4e 65 77 2c 20 2a 70 45 78 70 72 29 3b 0a 20 20  New, *pExpr);.  
2ff60 20 20 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c        pNew = sql
2ff70 69 74 65 33 45 78 70 72 41 6e 64 28 70 57 61 6c  ite3ExprAnd(pWal
2ff80 6b 65 72 2d 3e 70 50 61 72 73 65 2c 20 70 57 68  ker->pParse, pWh
2ff90 65 72 65 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20  ere, pNew);.    
2ffa0 20 20 20 20 70 53 2d 3e 70 57 68 65 72 65 20 3d      pS->pWhere =
2ffb0 20 70 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 70   pNew;.        p
2ffc0 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 20 3d 20  Walker->eCode = 
2ffd0 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  1;.      }.    }
2ffe0 0a 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f  .    return WRC_
2fff0 50 72 75 6e 65 3b 0a 20 20 7d 0a 20 20 72 65 74  Prune;.  }.  ret
30000 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65  urn WRC_Continue
30010 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 61 6e 73  ;.}../*.** Trans
30020 66 65 72 20 65 6c 69 67 69 62 6c 65 20 74 65 72  fer eligible ter
30030 6d 73 20 66 72 6f 6d 20 74 68 65 20 48 41 56 49  ms from the HAVI
30040 4e 47 20 63 6c 61 75 73 65 20 6f 66 20 61 20 71  NG clause of a q
30050 75 65 72 79 2c 20 77 68 69 63 68 20 69 73 0a 2a  uery, which is.*
30060 2a 20 70 72 6f 63 65 73 73 65 64 20 61 66 74 65  * processed afte
30070 72 20 67 72 6f 75 70 69 6e 67 2c 20 74 6f 20 74  r grouping, to t
30080 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 2c  he WHERE clause,
30090 20 77 68 69 63 68 20 69 73 20 70 72 6f 63 65 73   which is proces
300a0 73 65 64 20 62 65 66 6f 72 65 0a 2a 2a 20 67 72  sed before.** gr
300b0 6f 75 70 69 6e 67 2e 20 46 6f 72 20 65 78 61 6d  ouping. For exam
300c0 70 6c 65 2c 20 74 68 65 20 71 75 65 72 79 3a 0a  ple, the query:.
300d0 2a 2a 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20 2a  **.**   SELECT *
300e0 20 46 52 4f 4d 20 3c 74 61 62 6c 65 73 3e 20 57   FROM <tables> W
300f0 48 45 52 45 20 61 3d 3f 20 47 52 4f 55 50 20 42  HERE a=? GROUP B
30100 59 20 62 20 48 41 56 49 4e 47 20 62 3d 3f 20 41  Y b HAVING b=? A
30110 4e 44 20 63 3d 3f 0a 2a 2a 0a 2a 2a 20 63 61 6e  ND c=?.**.** can
30120 20 62 65 20 72 65 77 72 69 74 74 65 6e 20 61 73   be rewritten as
30130 3a 0a 2a 2a 0a 2a 2a 20 20 20 53 45 4c 45 43 54  :.**.**   SELECT
30140 20 2a 20 46 52 4f 4d 20 3c 74 61 62 6c 65 73 3e   * FROM <tables>
30150 20 57 48 45 52 45 20 61 3d 3f 20 41 4e 44 20 62   WHERE a=? AND b
30160 3d 3f 20 47 52 4f 55 50 20 42 59 20 62 20 48 41  =? GROUP BY b HA
30170 56 49 4e 47 20 63 3d 3f 0a 2a 2a 0a 2a 2a 20 41  VING c=?.**.** A
30180 20 74 65 72 6d 20 6f 66 20 74 68 65 20 48 41 56   term of the HAV
30190 49 4e 47 20 65 78 70 72 65 73 73 69 6f 6e 20 69  ING expression i
301a0 73 20 65 6c 69 67 69 62 6c 65 20 66 6f 72 20 74  s eligible for t
301b0 72 61 6e 73 66 65 72 20 69 66 20 69 74 20 63 6f  ransfer if it co
301c0 6e 73 69 73 74 73 0a 2a 2a 20 65 6e 74 69 72 65  nsists.** entire
301d0 6c 79 20 6f 66 20 63 6f 6e 73 74 61 6e 74 73 20  ly of constants 
301e0 61 6e 64 20 65 78 70 72 65 73 73 69 6f 6e 73 20  and expressions 
301f0 74 68 61 74 20 61 72 65 20 61 6c 73 6f 20 47 52  that are also GR
30200 4f 55 50 20 42 59 20 74 65 72 6d 73 20 74 68 61  OUP BY terms tha
30210 74 0a 2a 2a 20 75 73 65 20 74 68 65 20 22 42 49  t.** use the "BI
30220 4e 41 52 59 22 20 63 6f 6c 6c 61 74 69 6f 6e 20  NARY" collation 
30230 73 65 71 75 65 6e 63 65 2e 0a 2a 2f 0a 73 74 61  sequence..*/.sta
30240 74 69 63 20 76 6f 69 64 20 68 61 76 69 6e 67 54  tic void havingT
30250 6f 57 68 65 72 65 28 50 61 72 73 65 20 2a 70 50  oWhere(Parse *pP
30260 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 29  arse, Select *p)
30270 7b 0a 20 20 57 61 6c 6b 65 72 20 73 57 61 6c 6b  {.  Walker sWalk
30280 65 72 3b 0a 20 20 6d 65 6d 73 65 74 28 26 73 57  er;.  memset(&sW
30290 61 6c 6b 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66  alker, 0, sizeof
302a0 28 73 57 61 6c 6b 65 72 29 29 3b 0a 20 20 73 57  (sWalker));.  sW
302b0 61 6c 6b 65 72 2e 70 50 61 72 73 65 20 3d 20 70  alker.pParse = p
302c0 50 61 72 73 65 3b 0a 20 20 73 57 61 6c 6b 65 72  Parse;.  sWalker
302d0 2e 78 45 78 70 72 43 61 6c 6c 62 61 63 6b 20 3d  .xExprCallback =
302e0 20 68 61 76 69 6e 67 54 6f 57 68 65 72 65 45 78   havingToWhereEx
302f0 70 72 43 62 3b 0a 20 20 73 57 61 6c 6b 65 72 2e  prCb;.  sWalker.
30300 75 2e 70 53 65 6c 65 63 74 20 3d 20 70 3b 0a 20  u.pSelect = p;. 
30310 20 73 71 6c 69 74 65 33 57 61 6c 6b 45 78 70 72   sqlite3WalkExpr
30320 28 26 73 57 61 6c 6b 65 72 2c 20 70 2d 3e 70 48  (&sWalker, p->pH
30330 61 76 69 6e 67 29 3b 0a 23 69 66 20 53 45 4c 45  aving);.#if SELE
30340 43 54 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a  CTTRACE_ENABLED.
30350 20 20 69 66 28 20 73 57 61 6c 6b 65 72 2e 65 43    if( sWalker.eC
30360 6f 64 65 20 26 26 20 28 73 71 6c 69 74 65 33 53  ode && (sqlite3S
30370 65 6c 65 63 74 54 72 61 63 65 20 26 20 30 78 31  electTrace & 0x1
30380 30 30 29 21 3d 30 20 29 7b 0a 20 20 20 20 53 45  00)!=0 ){.    SE
30390 4c 45 43 54 54 52 41 43 45 28 30 78 31 30 30 2c  LECTTRACE(0x100,
303a0 70 50 61 72 73 65 2c 70 2c 28 22 4d 6f 76 65 20  pParse,p,("Move 
303b0 48 41 56 49 4e 47 20 74 65 72 6d 73 20 69 6e 74  HAVING terms int
303c0 6f 20 57 48 45 52 45 3a 5c 6e 22 29 29 3b 0a 20  o WHERE:\n"));. 
303d0 20 20 20 73 71 6c 69 74 65 33 54 72 65 65 56 69     sqlite3TreeVi
303e0 65 77 53 65 6c 65 63 74 28 30 2c 20 70 2c 20 30  ewSelect(0, p, 0
303f0 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a  );.  }.#endif.}.
30400 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 6f 20  ./*.** Check to 
30410 73 65 65 20 69 66 20 74 68 65 20 70 54 68 69 73  see if the pThis
30420 20 65 6e 74 72 79 20 6f 66 20 70 54 61 62 4c 69   entry of pTabLi
30430 73 74 20 69 73 20 61 20 73 65 6c 66 2d 6a 6f 69  st is a self-joi
30440 6e 20 6f 66 20 61 20 70 72 69 6f 72 20 76 69 65  n of a prior vie
30450 77 2e 0a 2a 2a 20 49 66 20 69 74 20 69 73 2c 20  w..** If it is, 
30460 74 68 65 6e 20 72 65 74 75 72 6e 20 74 68 65 20  then return the 
30470 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 66 6f 72  SrcList_item for
30480 20 74 68 65 20 70 72 69 6f 72 20 76 69 65 77 2e   the prior view.
30490 20 20 49 66 20 69 74 20 69 73 20 6e 6f 74 2c 0a    If it is not,.
304a0 2a 2a 20 74 68 65 6e 20 72 65 74 75 72 6e 20 30  ** then return 0
304b0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 73 74 72 75  ..*/.static stru
304c0 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
304d0 2a 69 73 53 65 6c 66 4a 6f 69 6e 56 69 65 77 28  *isSelfJoinView(
304e0 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62  .  SrcList *pTab
304f0 4c 69 73 74 2c 20 20 20 20 20 20 20 20 20 20 20  List,           
30500 2f 2a 20 53 65 61 72 63 68 20 66 6f 72 20 73 65  /* Search for se
30510 6c 66 2d 6a 6f 69 6e 73 20 69 6e 20 74 68 69 73  lf-joins in this
30520 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a   FROM clause */.
30530 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
30540 5f 69 74 65 6d 20 2a 70 54 68 69 73 20 20 20 2f  _item *pThis   /
30550 2a 20 53 65 61 72 63 68 20 66 6f 72 20 70 72 69  * Search for pri
30560 6f 72 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20  or reference to 
30570 74 68 69 73 20 73 75 62 71 75 65 72 79 20 2a 2f  this subquery */
30580 0a 29 7b 0a 20 20 73 74 72 75 63 74 20 53 72 63  .){.  struct Src
30590 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
305a0 3b 0a 20 20 66 6f 72 28 70 49 74 65 6d 20 3d 20  ;.  for(pItem = 
305b0 70 54 61 62 4c 69 73 74 2d 3e 61 3b 20 70 49 74  pTabList->a; pIt
305c0 65 6d 3c 70 54 68 69 73 3b 20 70 49 74 65 6d 2b  em<pThis; pItem+
305d0 2b 29 7b 0a 20 20 20 20 53 65 6c 65 63 74 20 2a  +){.    Select *
305e0 70 53 31 3b 0a 20 20 20 20 69 66 28 20 70 49 74  pS1;.    if( pIt
305f0 65 6d 2d 3e 70 53 65 6c 65 63 74 3d 3d 30 20 29  em->pSelect==0 )
30600 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69   continue;.    i
30610 66 28 20 70 49 74 65 6d 2d 3e 66 67 2e 76 69 61  f( pItem->fg.via
30620 43 6f 72 6f 75 74 69 6e 65 20 29 20 63 6f 6e 74  Coroutine ) cont
30630 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 70 49  inue;.    if( pI
30640 74 65 6d 2d 3e 7a 4e 61 6d 65 3d 3d 30 20 29 20  tem->zName==0 ) 
30650 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 61 73  continue;.    as
30660 73 65 72 74 28 20 70 49 74 65 6d 2d 3e 70 54 61  sert( pItem->pTa
30670 62 21 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65  b!=0 );.    asse
30680 72 74 28 20 70 54 68 69 73 2d 3e 70 54 61 62 21  rt( pThis->pTab!
30690 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 70 49  =0 );.    if( pI
306a0 74 65 6d 2d 3e 70 54 61 62 2d 3e 70 53 63 68 65  tem->pTab->pSche
306b0 6d 61 21 3d 70 54 68 69 73 2d 3e 70 54 61 62 2d  ma!=pThis->pTab-
306c0 3e 70 53 63 68 65 6d 61 20 29 20 63 6f 6e 74 69  >pSchema ) conti
306d0 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 73 71 6c  nue;.    if( sql
306e0 69 74 65 33 5f 73 74 72 69 63 6d 70 28 70 49 74  ite3_stricmp(pIt
306f0 65 6d 2d 3e 7a 4e 61 6d 65 2c 20 70 54 68 69 73  em->zName, pThis
30700 2d 3e 7a 4e 61 6d 65 29 21 3d 30 20 29 20 63 6f  ->zName)!=0 ) co
30710 6e 74 69 6e 75 65 3b 0a 20 20 20 20 70 53 31 20  ntinue;.    pS1 
30720 3d 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74  = pItem->pSelect
30730 3b 0a 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d  ;.    if( pItem-
30740 3e 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 3d 3d  >pTab->pSchema==
30750 30 20 26 26 20 70 54 68 69 73 2d 3e 70 53 65 6c  0 && pThis->pSel
30760 65 63 74 2d 3e 73 65 6c 49 64 21 3d 70 53 31 2d  ect->selId!=pS1-
30770 3e 73 65 6c 49 64 20 29 7b 0a 20 20 20 20 20 20  >selId ){.      
30780 2f 2a 20 54 68 65 20 71 75 65 72 79 20 66 6c 61  /* The query fla
30790 74 74 65 6e 65 72 20 6c 65 66 74 20 74 77 6f 20  ttener left two 
307a0 64 69 66 66 65 72 65 6e 74 20 43 54 45 20 74 61  different CTE ta
307b0 62 6c 65 73 20 77 69 74 68 20 69 64 65 6e 74 69  bles with identi
307c0 63 61 6c 0a 20 20 20 20 20 20 2a 2a 20 6e 61 6d  cal.      ** nam
307d0 65 73 20 69 6e 20 74 68 65 20 73 61 6d 65 20 46  es in the same F
307e0 52 4f 4d 20 63 6c 61 75 73 65 2e 20 2a 2f 0a 20  ROM clause. */. 
307f0 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
30800 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73 71 6c     }.    if( sql
30810 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28  ite3ExprCompare(
30820 30 2c 20 70 54 68 69 73 2d 3e 70 53 65 6c 65 63  0, pThis->pSelec
30830 74 2d 3e 70 57 68 65 72 65 2c 20 70 53 31 2d 3e  t->pWhere, pS1->
30840 70 57 68 65 72 65 2c 20 2d 31 29 0a 20 20 20 20  pWhere, -1).    
30850 20 7c 7c 20 73 71 6c 69 74 65 33 45 78 70 72 43   || sqlite3ExprC
30860 6f 6d 70 61 72 65 28 30 2c 20 70 54 68 69 73 2d  ompare(0, pThis-
30870 3e 70 53 65 6c 65 63 74 2d 3e 70 48 61 76 69 6e  >pSelect->pHavin
30880 67 2c 20 70 53 31 2d 3e 70 48 61 76 69 6e 67 2c  g, pS1->pHaving,
30890 20 2d 31 29 20 0a 20 20 20 20 29 7b 0a 20 20 20   -1) .    ){.   
308a0 20 20 20 2f 2a 20 54 68 65 20 76 69 65 77 20 77     /* The view w
308b0 61 73 20 6d 6f 64 69 66 69 65 64 20 62 79 20 73  as modified by s
308c0 6f 6d 65 20 6f 74 68 65 72 20 6f 70 74 69 6d 69  ome other optimi
308d0 7a 61 74 69 6f 6e 20 73 75 63 68 20 61 73 0a 20  zation such as. 
308e0 20 20 20 20 20 2a 2a 20 70 75 73 68 44 6f 77 6e       ** pushDown
308f0 57 68 65 72 65 54 65 72 6d 73 28 29 20 2a 2f 0a  WhereTerms() */.
30900 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
30910 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e      }.    return
30920 20 70 49 74 65 6d 3b 0a 20 20 7d 0a 20 20 72 65   pItem;.  }.  re
30930 74 75 72 6e 20 30 3b 0a 7d 0a 0a 23 69 66 64 65  turn 0;.}..#ifde
30940 66 20 53 51 4c 49 54 45 5f 43 4f 55 4e 54 4f 46  f SQLITE_COUNTOF
30950 56 49 45 57 5f 4f 50 54 49 4d 49 5a 41 54 49 4f  VIEW_OPTIMIZATIO
30960 4e 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20  N./*.** Attempt 
30970 74 6f 20 74 72 61 6e 73 66 6f 72 6d 20 61 20 71  to transform a q
30980 75 65 72 79 20 6f 66 20 74 68 65 20 66 6f 72 6d  uery of the form
30990 0a 2a 2a 0a 2a 2a 20 20 20 20 53 45 4c 45 43 54  .**.**    SELECT
309a0 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 28   count(*) FROM (
309b0 53 45 4c 45 43 54 20 78 20 46 52 4f 4d 20 74 31  SELECT x FROM t1
309c0 20 55 4e 49 4f 4e 20 41 4c 4c 20 53 45 4c 45 43   UNION ALL SELEC
309d0 54 20 79 20 46 52 4f 4d 20 74 32 29 0a 2a 2a 0a  T y FROM t2).**.
309e0 2a 2a 20 49 6e 74 6f 20 74 68 69 73 3a 0a 2a 2a  ** Into this:.**
309f0 0a 2a 2a 20 20 20 20 53 45 4c 45 43 54 20 28 53  .**    SELECT (S
30a00 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46  ELECT count(*) F
30a10 52 4f 4d 20 74 31 29 2b 28 53 45 4c 45 43 54 20  ROM t1)+(SELECT 
30a20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 74 32  count(*) FROM t2
30a30 29 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 72 61 6e  ).**.** The tran
30a40 73 66 6f 72 6d 61 74 69 6f 6e 20 6f 6e 6c 79 20  sformation only 
30a50 77 6f 72 6b 73 20 69 66 20 61 6c 6c 20 6f 66 20  works if all of 
30a60 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72  the following ar
30a70 65 20 74 72 75 65 3a 0a 2a 2a 0a 2a 2a 20 20 20  e true:.**.**   
30a80 2a 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20  *  The subquery 
30a90 69 73 20 61 20 55 4e 49 4f 4e 20 41 4c 4c 20 6f  is a UNION ALL o
30aa0 66 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 74 65  f two or more te
30ab0 72 6d 73 0a 2a 2a 20 20 20 2a 20 20 54 68 65 20  rms.**   *  The 
30ac0 73 75 62 71 75 65 72 79 20 64 6f 65 73 20 6e 6f  subquery does no
30ad0 74 20 68 61 76 65 20 61 20 4c 49 4d 49 54 20 63  t have a LIMIT c
30ae0 6c 61 75 73 65 0a 2a 2a 20 20 20 2a 20 20 54 68  lause.**   *  Th
30af0 65 72 65 20 69 73 20 6e 6f 20 57 48 45 52 45 20  ere is no WHERE 
30b00 6f 72 20 47 52 4f 55 50 20 42 59 20 6f 72 20 48  or GROUP BY or H
30b10 41 56 49 4e 47 20 63 6c 61 75 73 65 73 20 6f 6e  AVING clauses on
30b20 20 74 68 65 20 73 75 62 71 75 65 72 69 65 73 0a   the subqueries.
30b30 2a 2a 20 20 20 2a 20 20 54 68 65 20 6f 75 74 65  **   *  The oute
30b40 72 20 71 75 65 72 79 20 69 73 20 61 20 73 69 6d  r query is a sim
30b50 70 6c 65 20 63 6f 75 6e 74 28 2a 29 20 77 69 74  ple count(*) wit
30b60 68 20 6e 6f 20 57 48 45 52 45 20 63 6c 61 75 73  h no WHERE claus
30b70 65 20 6f 72 20 6f 74 68 65 72 0a 2a 2a 20 20 20  e or other.**   
30b80 20 20 20 65 78 74 72 61 6e 65 6f 75 73 20 73 79     extraneous sy
30b90 6e 74 61 78 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75  ntax..**.** Retu
30ba0 72 6e 20 54 52 55 45 20 69 66 20 74 68 65 20 6f  rn TRUE if the o
30bb0 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20 75  ptimization is u
30bc0 6e 64 65 72 74 61 6b 65 6e 2e 0a 2a 2f 0a 73 74  ndertaken..*/.st
30bd0 61 74 69 63 20 69 6e 74 20 63 6f 75 6e 74 4f 66  atic int countOf
30be0 56 69 65 77 4f 70 74 69 6d 69 7a 61 74 69 6f 6e  ViewOptimization
30bf0 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
30c00 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 53 65  Select *p){.  Se
30c10 6c 65 63 74 20 2a 70 53 75 62 2c 20 2a 70 50 72  lect *pSub, *pPr
30c20 69 6f 72 3b 0a 20 20 45 78 70 72 20 2a 70 45 78  ior;.  Expr *pEx
30c30 70 72 3b 0a 20 20 45 78 70 72 20 2a 70 43 6f 75  pr;.  Expr *pCou
30c40 6e 74 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  nt;.  sqlite3 *d
30c50 62 3b 0a 20 20 69 66 28 20 28 70 2d 3e 73 65 6c  b;.  if( (p->sel
30c60 46 6c 61 67 73 20 26 20 53 46 5f 41 67 67 72 65  Flags & SF_Aggre
30c70 67 61 74 65 29 3d 3d 30 20 29 20 72 65 74 75 72  gate)==0 ) retur
30c80 6e 20 30 3b 20 20 20 2f 2a 20 54 68 69 73 20 69  n 0;   /* This i
30c90 73 20 61 6e 20 61 67 67 72 65 67 61 74 65 20 2a  s an aggregate *
30ca0 2f 0a 20 20 69 66 28 20 70 2d 3e 70 45 4c 69 73  /.  if( p->pELis
30cb0 74 2d 3e 6e 45 78 70 72 21 3d 31 20 29 20 72 65  t->nExpr!=1 ) re
30cc0 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20  turn 0;         
30cd0 20 20 20 20 20 20 2f 2a 20 53 69 6e 67 6c 65 20        /* Single 
30ce0 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 20 2a 2f  result column */
30cf0 0a 20 20 69 66 28 20 70 2d 3e 70 57 68 65 72 65  .  if( p->pWhere
30d00 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69   ) return 0;.  i
30d10 66 28 20 70 2d 3e 70 47 72 6f 75 70 42 79 20 29  f( p->pGroupBy )
30d20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 45 78   return 0;.  pEx
30d30 70 72 20 3d 20 70 2d 3e 70 45 4c 69 73 74 2d 3e  pr = p->pEList->
30d40 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20 69 66  a[0].pExpr;.  if
30d50 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f  ( pExpr->op!=TK_
30d60 41 47 47 5f 46 55 4e 43 54 49 4f 4e 20 29 20 72  AGG_FUNCTION ) r
30d70 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20  eturn 0;        
30d80 2f 2a 20 52 65 73 75 6c 74 20 69 73 20 61 6e 20  /* Result is an 
30d90 61 67 67 72 65 67 61 74 65 20 2a 2f 0a 20 20 69  aggregate */.  i
30da0 66 28 20 73 71 6c 69 74 65 33 5f 73 74 72 69 63  f( sqlite3_stric
30db0 6d 70 28 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b  mp(pExpr->u.zTok
30dc0 65 6e 2c 22 63 6f 75 6e 74 22 29 20 29 20 72 65  en,"count") ) re
30dd0 74 75 72 6e 20 30 3b 20 20 2f 2a 20 49 73 20 63  turn 0;  /* Is c
30de0 6f 75 6e 74 28 29 20 2a 2f 0a 20 20 69 66 28 20  ount() */.  if( 
30df0 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 21 3d  pExpr->x.pList!=
30e00 30 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20  0 ) return 0;   
30e10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
30e20 20 4d 75 73 74 20 62 65 20 63 6f 75 6e 74 28 2a   Must be count(*
30e30 29 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 53  ) */.  if( p->pS
30e40 72 63 2d 3e 6e 53 72 63 21 3d 31 20 29 20 72 65  rc->nSrc!=1 ) re
30e50 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20  turn 0;         
30e60 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20           /* One 
30e70 74 61 62 6c 65 20 69 6e 20 46 52 4f 4d 20 20 2a  table in FROM  *
30e80 2f 0a 20 20 70 53 75 62 20 3d 20 70 2d 3e 70 53  /.  pSub = p->pS
30e90 72 63 2d 3e 61 5b 30 5d 2e 70 53 65 6c 65 63 74  rc->a[0].pSelect
30ea0 3b 0a 20 20 69 66 28 20 70 53 75 62 3d 3d 30 20  ;.  if( pSub==0 
30eb0 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20  ) return 0;     
30ec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30ed0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 46 52 4f        /* The FRO
30ee0 4d 20 69 73 20 61 20 73 75 62 71 75 65 72 79 20  M is a subquery 
30ef0 2a 2f 0a 20 20 69 66 28 20 70 53 75 62 2d 3e 70  */.  if( pSub->p
30f00 50 72 69 6f 72 3d 3d 30 20 29 20 72 65 74 75 72  Prior==0 ) retur
30f10 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  n 0;            
30f20 20 20 20 20 20 20 20 2f 2a 20 4d 75 73 74 20 62         /* Must b
30f30 65 20 61 20 63 6f 6d 70 6f 75 6e 64 20 72 79 20  e a compound ry 
30f40 2a 2f 0a 20 20 64 6f 7b 0a 20 20 20 20 69 66 28  */.  do{.    if(
30f50 20 70 53 75 62 2d 3e 6f 70 21 3d 54 4b 5f 41 4c   pSub->op!=TK_AL
30f60 4c 20 26 26 20 70 53 75 62 2d 3e 70 50 72 69 6f  L && pSub->pPrio
30f70 72 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 2f  r ) return 0;  /
30f80 2a 20 4d 75 73 74 20 62 65 20 55 4e 49 4f 4e 20  * Must be UNION 
30f90 41 4c 4c 20 2a 2f 0a 20 20 20 20 69 66 28 20 70  ALL */.    if( p
30fa0 53 75 62 2d 3e 70 57 68 65 72 65 20 29 20 72 65  Sub->pWhere ) re
30fb0 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20  turn 0;         
30fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
30fd0 4e 6f 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  No WHERE clause 
30fe0 2a 2f 0a 20 20 20 20 69 66 28 20 70 53 75 62 2d  */.    if( pSub-
30ff0 3e 70 4c 69 6d 69 74 20 29 20 72 65 74 75 72 6e  >pLimit ) return
31000 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
31010 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 20 4c           /* No L
31020 49 4d 49 54 20 63 6c 61 75 73 65 20 2a 2f 0a 20  IMIT clause */. 
31030 20 20 20 69 66 28 20 70 53 75 62 2d 3e 73 65 6c     if( pSub->sel
31040 46 6c 61 67 73 20 26 20 53 46 5f 41 67 67 72 65  Flags & SF_Aggre
31050 67 61 74 65 20 29 20 72 65 74 75 72 6e 20 30 3b  gate ) return 0;
31060 20 20 20 20 20 2f 2a 20 4e 6f 74 20 61 6e 20 61       /* Not an a
31070 67 67 72 65 67 61 74 65 20 2a 2f 0a 20 20 20 20  ggregate */.    
31080 70 53 75 62 20 3d 20 70 53 75 62 2d 3e 70 50 72  pSub = pSub->pPr
31090 69 6f 72 3b 20 20 20 20 20 20 20 20 20 20 20 20  ior;            
310a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
310b0 20 20 2f 2a 20 52 65 70 65 61 74 20 6f 76 65 72    /* Repeat over
310c0 20 63 6f 6d 70 6f 75 6e 64 20 2a 2f 0a 20 20 7d   compound */.  }
310d0 77 68 69 6c 65 28 20 70 53 75 62 20 29 3b 0a 0a  while( pSub );..
310e0 20 20 2f 2a 20 49 66 20 77 65 20 72 65 61 63 68    /* If we reach
310f0 20 74 68 69 73 20 70 6f 69 6e 74 20 74 68 65 6e   this point then
31100 20 69 74 20 69 73 20 4f 4b 20 74 6f 20 70 65 72   it is OK to per
31110 66 6f 72 6d 20 74 68 65 20 74 72 61 6e 73 66 6f  form the transfo
31120 72 6d 61 74 69 6f 6e 20 2a 2f 0a 0a 20 20 64 62  rmation */..  db
31130 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
31140 20 70 43 6f 75 6e 74 20 3d 20 70 45 78 70 72 3b   pCount = pExpr;
31150 0a 20 20 70 45 78 70 72 20 3d 20 30 3b 0a 20 20  .  pExpr = 0;.  
31160 70 53 75 62 20 3d 20 70 2d 3e 70 53 72 63 2d 3e  pSub = p->pSrc->
31170 61 5b 30 5d 2e 70 53 65 6c 65 63 74 3b 0a 20 20  a[0].pSelect;.  
31180 70 2d 3e 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 53  p->pSrc->a[0].pS
31190 65 6c 65 63 74 20 3d 20 30 3b 0a 20 20 73 71 6c  elect = 0;.  sql
311a0 69 74 65 33 53 72 63 4c 69 73 74 44 65 6c 65 74  ite3SrcListDelet
311b0 65 28 64 62 2c 20 70 2d 3e 70 53 72 63 29 3b 0a  e(db, p->pSrc);.
311c0 20 20 70 2d 3e 70 53 72 63 20 3d 20 73 71 6c 69    p->pSrc = sqli
311d0 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28  te3DbMallocZero(
311e0 70 50 61 72 73 65 2d 3e 64 62 2c 20 73 69 7a 65  pParse->db, size
311f0 6f 66 28 2a 70 2d 3e 70 53 72 63 29 29 3b 0a 20  of(*p->pSrc));. 
31200 20 77 68 69 6c 65 28 20 70 53 75 62 20 29 7b 0a   while( pSub ){.
31210 20 20 20 20 45 78 70 72 20 2a 70 54 65 72 6d 3b      Expr *pTerm;
31220 0a 20 20 20 20 70 50 72 69 6f 72 20 3d 20 70 53  .    pPrior = pS
31230 75 62 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20  ub->pPrior;.    
31240 70 53 75 62 2d 3e 70 50 72 69 6f 72 20 3d 20 30  pSub->pPrior = 0
31250 3b 0a 20 20 20 20 70 53 75 62 2d 3e 70 4e 65 78  ;.    pSub->pNex
31260 74 20 3d 20 30 3b 0a 20 20 20 20 70 53 75 62 2d  t = 0;.    pSub-
31270 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f  >selFlags |= SF_
31280 41 67 67 72 65 67 61 74 65 3b 0a 20 20 20 20 70  Aggregate;.    p
31290 53 75 62 2d 3e 73 65 6c 46 6c 61 67 73 20 26 3d  Sub->selFlags &=
312a0 20 7e 53 46 5f 43 6f 6d 70 6f 75 6e 64 3b 0a 20   ~SF_Compound;. 
312b0 20 20 20 70 53 75 62 2d 3e 6e 53 65 6c 65 63 74     pSub->nSelect
312c0 52 6f 77 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c  Row = 0;.    sql
312d0 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65  ite3ExprListDele
312e0 74 65 28 64 62 2c 20 70 53 75 62 2d 3e 70 45 4c  te(db, pSub->pEL
312f0 69 73 74 29 3b 0a 20 20 20 20 70 54 65 72 6d 20  ist);.    pTerm 
31300 3d 20 70 50 72 69 6f 72 20 3f 20 73 71 6c 69 74  = pPrior ? sqlit
31310 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 43  e3ExprDup(db, pC
31320 6f 75 6e 74 2c 20 30 29 20 3a 20 70 43 6f 75 6e  ount, 0) : pCoun
31330 74 3b 0a 20 20 20 20 70 53 75 62 2d 3e 70 45 4c  t;.    pSub->pEL
31340 69 73 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ist = sqlite3Exp
31350 72 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61 72  rListAppend(pPar
31360 73 65 2c 20 30 2c 20 70 54 65 72 6d 29 3b 0a 20  se, 0, pTerm);. 
31370 20 20 20 70 54 65 72 6d 20 3d 20 73 71 6c 69 74     pTerm = sqlit
31380 65 33 50 45 78 70 72 28 70 50 61 72 73 65 2c 20  e3PExpr(pParse, 
31390 54 4b 5f 53 45 4c 45 43 54 2c 20 30 2c 20 30 29  TK_SELECT, 0, 0)
313a0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 45 78  ;.    sqlite3PEx
313b0 70 72 41 64 64 53 65 6c 65 63 74 28 70 50 61 72  prAddSelect(pPar
313c0 73 65 2c 20 70 54 65 72 6d 2c 20 70 53 75 62 29  se, pTerm, pSub)
313d0 3b 0a 20 20 20 20 69 66 28 20 70 45 78 70 72 3d  ;.    if( pExpr=
313e0 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 45 78 70  =0 ){.      pExp
313f0 72 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20 7d  r = pTerm;.    }
31400 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 45 78 70  else{.      pExp
31410 72 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72  r = sqlite3PExpr
31420 28 70 50 61 72 73 65 2c 20 54 4b 5f 50 4c 55 53  (pParse, TK_PLUS
31430 2c 20 70 54 65 72 6d 2c 20 70 45 78 70 72 29 3b  , pTerm, pExpr);
31440 0a 20 20 20 20 7d 0a 20 20 20 20 70 53 75 62 20  .    }.    pSub 
31450 3d 20 70 50 72 69 6f 72 3b 0a 20 20 7d 0a 20 20  = pPrior;.  }.  
31460 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e  p->pEList->a[0].
31470 70 45 78 70 72 20 3d 20 70 45 78 70 72 3b 0a 20  pExpr = pExpr;. 
31480 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 3d 20   p->selFlags &= 
31490 7e 53 46 5f 41 67 67 72 65 67 61 74 65 3b 0a 0a  ~SF_Aggregate;..
314a0 23 69 66 20 53 45 4c 45 43 54 54 52 41 43 45 5f  #if SELECTTRACE_
314b0 45 4e 41 42 4c 45 44 0a 20 20 69 66 28 20 73 71  ENABLED.  if( sq
314c0 6c 69 74 65 33 53 65 6c 65 63 74 54 72 61 63 65  lite3SelectTrace
314d0 20 26 20 30 78 34 30 30 20 29 7b 0a 20 20 20 20   & 0x400 ){.    
314e0 53 45 4c 45 43 54 54 52 41 43 45 28 30 78 34 30  SELECTTRACE(0x40
314f0 30 2c 70 50 61 72 73 65 2c 70 2c 28 22 41 66 74  0,pParse,p,("Aft
31500 65 72 20 63 6f 75 6e 74 2d 6f 66 2d 76 69 65 77  er count-of-view
31510 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 3a 5c 6e   optimization:\n
31520 22 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  "));.    sqlite3
31530 54 72 65 65 56 69 65 77 53 65 6c 65 63 74 28 30  TreeViewSelect(0
31540 2c 20 70 2c 20 30 29 3b 0a 20 20 7d 0a 23 65 6e  , p, 0);.  }.#en
31550 64 69 66 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a  dif.  return 1;.
31560 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
31570 54 45 5f 43 4f 55 4e 54 4f 46 56 49 45 57 5f 4f  TE_COUNTOFVIEW_O
31580 50 54 49 4d 49 5a 41 54 49 4f 4e 20 2a 2f 0a 0a  PTIMIZATION */..
31590 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  /*.** Generate c
315a0 6f 64 65 20 66 6f 72 20 74 68 65 20 53 45 4c 45  ode for the SELE
315b0 43 54 20 73 74 61 74 65 6d 65 6e 74 20 67 69 76  CT statement giv
315c0 65 6e 20 69 6e 20 74 68 65 20 70 20 61 72 67 75  en in the p argu
315d0 6d 65 6e 74 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68  ment.  .**.** Th
315e0 65 20 72 65 73 75 6c 74 73 20 61 72 65 20 72 65  e results are re
315f0 74 75 72 6e 65 64 20 61 63 63 6f 72 64 69 6e 67  turned according
31600 20 74 6f 20 74 68 65 20 53 65 6c 65 63 74 44 65   to the SelectDe
31610 73 74 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a  st structure..**
31620 20 53 65 65 20 63 6f 6d 6d 65 6e 74 73 20 69 6e   See comments in
31630 20 73 71 6c 69 74 65 49 6e 74 2e 68 20 66 6f 72   sqliteInt.h for
31640 20 66 75 72 74 68 65 72 20 69 6e 66 6f 72 6d 61   further informa
31650 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  tion..**.** This
31660 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73   routine returns
31670 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65   the number of e
31680 72 72 6f 72 73 2e 20 20 49 66 20 61 6e 79 20 65  rrors.  If any e
31690 72 72 6f 72 73 20 61 72 65 0a 2a 2a 20 65 6e 63  rrors are.** enc
316a0 6f 75 6e 74 65 72 65 64 2c 20 74 68 65 6e 20 61  ountered, then a
316b0 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20 65 72  n appropriate er
316c0 72 6f 72 20 6d 65 73 73 61 67 65 20 69 73 20 6c  ror message is l
316d0 65 66 74 20 69 6e 0a 2a 2a 20 70 50 61 72 73 65  eft in.** pParse
316e0 2d 3e 7a 45 72 72 4d 73 67 2e 0a 2a 2a 0a 2a 2a  ->zErrMsg..**.**
316f0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 64 6f   This routine do
31700 65 73 20 4e 4f 54 20 66 72 65 65 20 74 68 65 20  es NOT free the 
31710 53 65 6c 65 63 74 20 73 74 72 75 63 74 75 72 65  Select structure
31720 20 70 61 73 73 65 64 20 69 6e 2e 20 20 54 68 65   passed in.  The
31730 0a 2a 2a 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63  .** calling func
31740 74 69 6f 6e 20 6e 65 65 64 73 20 74 6f 20 64 6f  tion needs to do
31750 20 74 68 61 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71   that..*/.int sq
31760 6c 69 74 65 33 53 65 6c 65 63 74 28 0a 20 20 50  lite3Select(.  P
31770 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
31780 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72        /* The par
31790 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ser context */. 
317a0 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20   Select *p,     
317b0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 53          /* The S
317c0 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
317d0 62 65 69 6e 67 20 63 6f 64 65 64 2e 20 2a 2f 0a  being coded. */.
317e0 20 20 53 65 6c 65 63 74 44 65 73 74 20 2a 70 44    SelectDest *pD
317f0 65 73 74 20 20 20 20 20 20 2f 2a 20 57 68 61 74  est      /* What
31800 20 74 6f 20 64 6f 20 77 69 74 68 20 74 68 65 20   to do with the 
31810 71 75 65 72 79 20 72 65 73 75 6c 74 73 20 2a 2f  query results */
31820 0a 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 20  .){.  int i, j; 
31830 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
31840 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f  Loop counters */
31850 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57  .  WhereInfo *pW
31860 49 6e 66 6f 3b 20 20 20 20 20 2f 2a 20 52 65 74  Info;     /* Ret
31870 75 72 6e 20 66 72 6f 6d 20 73 71 6c 69 74 65 33  urn from sqlite3
31880 57 68 65 72 65 42 65 67 69 6e 28 29 20 2a 2f 0a  WhereBegin() */.
31890 20 20 56 64 62 65 20 2a 76 3b 20 20 20 20 20 20    Vdbe *v;      
318a0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
318b0 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 20  virtual machine 
318c0 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69  under constructi
318d0 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 73 41 67  on */.  int isAg
318e0 67 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  g;             /
318f0 2a 20 54 72 75 65 20 66 6f 72 20 73 65 6c 65 63  * True for selec
31900 74 20 6c 69 73 74 73 20 6c 69 6b 65 20 22 63 6f  t lists like "co
31910 75 6e 74 28 2a 29 22 20 2a 2f 0a 20 20 45 78 70  unt(*)" */.  Exp
31920 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 20 3d 20  rList *pEList = 
31930 30 3b 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 63  0;  /* List of c
31940 6f 6c 75 6d 6e 73 20 74 6f 20 65 78 74 72 61 63  olumns to extrac
31950 74 2e 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20  t. */.  SrcList 
31960 2a 70 54 61 62 4c 69 73 74 3b 20 20 20 20 20 2f  *pTabList;     /
31970 2a 20 4c 69 73 74 20 6f 66 20 74 61 62 6c 65 73  * List of tables
31980 20 74 6f 20 73 65 6c 65 63 74 20 66 72 6f 6d 20   to select from 
31990 2a 2f 0a 20 20 45 78 70 72 20 2a 70 57 68 65 72  */.  Expr *pWher
319a0 65 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  e;          /* T
319b0 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e  he WHERE clause.
319c0 20 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f    May be NULL */
319d0 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 47 72  .  ExprList *pGr
319e0 6f 75 70 42 79 3b 20 20 20 20 2f 2a 20 54 68 65  oupBy;    /* The
319f0 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65   GROUP BY clause
31a00 2e 20 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a  .  May be NULL *
31a10 2f 0a 20 20 45 78 70 72 20 2a 70 48 61 76 69 6e  /.  Expr *pHavin
31a20 67 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  g;         /* Th
31a30 65 20 48 41 56 49 4e 47 20 63 6c 61 75 73 65 2e  e HAVING clause.
31a40 20 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f    May be NULL */
31a50 0a 20 20 69 6e 74 20 72 63 20 3d 20 31 3b 20 20  .  int rc = 1;  
31a60 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c            /* Val
31a70 75 65 20 74 6f 20 72 65 74 75 72 6e 20 66 72 6f  ue to return fro
31a80 6d 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  m this function 
31a90 2a 2f 0a 20 20 44 69 73 74 69 6e 63 74 43 74 78  */.  DistinctCtx
31aa0 20 73 44 69 73 74 69 6e 63 74 3b 20 2f 2a 20 49   sDistinct; /* I
31ab0 6e 66 6f 20 6f 6e 20 68 6f 77 20 74 6f 20 63 6f  nfo on how to co
31ac0 64 65 20 74 68 65 20 44 49 53 54 49 4e 43 54 20  de the DISTINCT 
31ad0 6b 65 79 77 6f 72 64 20 2a 2f 0a 20 20 53 6f 72  keyword */.  Sor
31ae0 74 43 74 78 20 73 53 6f 72 74 3b 20 20 20 20 20  tCtx sSort;     
31af0 20 20 20 20 2f 2a 20 49 6e 66 6f 20 6f 6e 20 68      /* Info on h
31b00 6f 77 20 74 6f 20 63 6f 64 65 20 74 68 65 20 4f  ow to code the O
31b10 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a  RDER BY clause *
31b20 2f 0a 20 20 41 67 67 49 6e 66 6f 20 73 41 67 67  /.  AggInfo sAgg
31b30 49 6e 66 6f 3b 20 20 20 20 20 20 2f 2a 20 49 6e  Info;      /* In
31b40 66 6f 72 6d 61 74 69 6f 6e 20 75 73 65 64 20 62  formation used b
31b50 79 20 61 67 67 72 65 67 61 74 65 20 71 75 65 72  y aggregate quer
31b60 69 65 73 20 2a 2f 0a 20 20 69 6e 74 20 69 45 6e  ies */.  int iEn
31b70 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d;              
31b80 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 68  /* Address of th
31b90 65 20 65 6e 64 20 6f 66 20 74 68 65 20 71 75 65  e end of the que
31ba0 72 79 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20  ry */.  sqlite3 
31bb0 2a 64 62 3b 20 20 20 20 20 20 20 20 20 20 20 2f  *db;           /
31bc0 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20 63  * The database c
31bd0 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 45  onnection */.  E
31be0 78 70 72 4c 69 73 74 20 2a 70 4d 69 6e 4d 61 78  xprList *pMinMax
31bf0 4f 72 64 65 72 42 79 20 3d 20 30 3b 20 20 2f 2a  OrderBy = 0;  /*
31c00 20 41 64 64 65 64 20 4f 52 44 45 52 20 42 59 20   Added ORDER BY 
31c10 66 6f 72 20 6d 69 6e 2f 6d 61 78 20 71 75 65 72  for min/max quer
31c20 69 65 73 20 2a 2f 0a 20 20 75 38 20 6d 69 6e 4d  ies */.  u8 minM
31c30 61 78 46 6c 61 67 3b 20 20 20 20 20 20 20 20 20  axFlag;         
31c40 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 20          /* Flag 
31c50 66 6f 72 20 6d 69 6e 2f 6d 61 78 20 71 75 65 72  for min/max quer
31c60 69 65 73 20 2a 2f 0a 0a 20 20 64 62 20 3d 20 70  ies */..  db = p
31c70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 76 20 3d  Parse->db;.  v =
31c80 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
31c90 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 70  pParse);.  if( p
31ca0 3d 3d 30 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f  ==0 || db->mallo
31cb0 63 46 61 69 6c 65 64 20 7c 7c 20 70 50 61 72 73  cFailed || pPars
31cc0 65 2d 3e 6e 45 72 72 20 29 7b 0a 20 20 20 20 72  e->nErr ){.    r
31cd0 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 69  eturn 1;.  }.  i
31ce0 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68  f( sqlite3AuthCh
31cf0 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49  eck(pParse, SQLI
31d00 54 45 5f 53 45 4c 45 43 54 2c 20 30 2c 20 30 2c  TE_SELECT, 0, 0,
31d10 20 30 29 20 29 20 72 65 74 75 72 6e 20 31 3b 0a   0) ) return 1;.
31d20 20 20 6d 65 6d 73 65 74 28 26 73 41 67 67 49 6e    memset(&sAggIn
31d30 66 6f 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 41  fo, 0, sizeof(sA
31d40 67 67 49 6e 66 6f 29 29 3b 0a 23 69 66 20 53 45  ggInfo));.#if SE
31d50 4c 45 43 54 54 52 41 43 45 5f 45 4e 41 42 4c 45  LECTTRACE_ENABLE
31d60 44 0a 20 20 53 45 4c 45 43 54 54 52 41 43 45 28  D.  SELECTTRACE(
31d70 31 2c 70 50 61 72 73 65 2c 70 2c 20 28 22 62 65  1,pParse,p, ("be
31d80 67 69 6e 20 70 72 6f 63 65 73 73 69 6e 67 3a 5c  gin processing:\
31d90 6e 22 2c 20 70 50 61 72 73 65 2d 3e 61 64 64 72  n", pParse->addr
31da0 45 78 70 6c 61 69 6e 29 29 3b 0a 20 20 69 66 28  Explain));.  if(
31db0 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 54 72   sqlite3SelectTr
31dc0 61 63 65 20 26 20 30 78 31 30 30 20 29 7b 0a 20  ace & 0x100 ){. 
31dd0 20 20 20 73 71 6c 69 74 65 33 54 72 65 65 56 69     sqlite3TreeVi
31de0 65 77 53 65 6c 65 63 74 28 30 2c 20 70 2c 20 30  ewSelect(0, p, 0
31df0 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  );.  }.#endif.. 
31e00 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4f 72 64   assert( p->pOrd
31e10 65 72 42 79 3d 3d 30 20 7c 7c 20 70 44 65 73 74  erBy==0 || pDest
31e20 2d 3e 65 44 65 73 74 21 3d 53 52 54 5f 44 69 73  ->eDest!=SRT_Dis
31e30 74 46 69 66 6f 20 29 3b 0a 20 20 61 73 73 65 72  tFifo );.  asser
31e40 74 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 3d 3d  t( p->pOrderBy==
31e50 30 20 7c 7c 20 70 44 65 73 74 2d 3e 65 44 65 73  0 || pDest->eDes
31e60 74 21 3d 53 52 54 5f 46 69 66 6f 20 29 3b 0a 20  t!=SRT_Fifo );. 
31e70 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4f 72 64   assert( p->pOrd
31e80 65 72 42 79 3d 3d 30 20 7c 7c 20 70 44 65 73 74  erBy==0 || pDest
31e90 2d 3e 65 44 65 73 74 21 3d 53 52 54 5f 44 69 73  ->eDest!=SRT_Dis
31ea0 74 51 75 65 75 65 20 29 3b 0a 20 20 61 73 73 65  tQueue );.  asse
31eb0 72 74 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 3d  rt( p->pOrderBy=
31ec0 3d 30 20 7c 7c 20 70 44 65 73 74 2d 3e 65 44 65  =0 || pDest->eDe
31ed0 73 74 21 3d 53 52 54 5f 51 75 65 75 65 20 29 3b  st!=SRT_Queue );
31ee0 0a 20 20 69 66 28 20 49 67 6e 6f 72 61 62 6c 65  .  if( Ignorable
31ef0 4f 72 64 65 72 62 79 28 70 44 65 73 74 29 20 29  Orderby(pDest) )
31f00 7b 0a 20 20 20 20 61 73 73 65 72 74 28 70 44 65  {.    assert(pDe
31f10 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 45  st->eDest==SRT_E
31f20 78 69 73 74 73 20 7c 7c 20 70 44 65 73 74 2d 3e  xists || pDest->
31f30 65 44 65 73 74 3d 3d 53 52 54 5f 55 6e 69 6f 6e  eDest==SRT_Union
31f40 20 7c 7c 20 0a 20 20 20 20 20 20 20 20 20 20 20   || .           
31f50 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52  pDest->eDest==SR
31f60 54 5f 45 78 63 65 70 74 20 7c 7c 20 70 44 65 73  T_Except || pDes
31f70 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 44 69  t->eDest==SRT_Di
31f80 73 63 61 72 64 20 7c 7c 0a 20 20 20 20 20 20 20  scard ||.       
31f90 20 20 20 20 70 44 65 73 74 2d 3e 65 44 65 73 74      pDest->eDest
31fa0 3d 3d 53 52 54 5f 51 75 65 75 65 20 20 7c 7c 20  ==SRT_Queue  || 
31fb0 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52  pDest->eDest==SR
31fc0 54 5f 44 69 73 74 46 69 66 6f 20 7c 7c 0a 20 20  T_DistFifo ||.  
31fd0 20 20 20 20 20 20 20 20 20 70 44 65 73 74 2d 3e           pDest->
31fe0 65 44 65 73 74 3d 3d 53 52 54 5f 44 69 73 74 51  eDest==SRT_DistQ
31ff0 75 65 75 65 20 7c 7c 20 70 44 65 73 74 2d 3e 65  ueue || pDest->e
32000 44 65 73 74 3d 3d 53 52 54 5f 46 69 66 6f 29 3b  Dest==SRT_Fifo);
32010 0a 20 20 20 20 2f 2a 20 49 66 20 4f 52 44 45 52  .    /* If ORDER
32020 20 42 59 20 6d 61 6b 65 73 20 6e 6f 20 64 69 66   BY makes no dif
32030 66 65 72 65 6e 63 65 20 69 6e 20 74 68 65 20 6f  ference in the o
32040 75 74 70 75 74 20 74 68 65 6e 20 6e 65 69 74 68  utput then neith
32050 65 72 20 64 6f 65 73 0a 20 20 20 20 2a 2a 20 44  er does.    ** D
32060 49 53 54 49 4e 43 54 20 73 6f 20 69 74 20 63 61  ISTINCT so it ca
32070 6e 20 62 65 20 72 65 6d 6f 76 65 64 20 74 6f 6f  n be removed too
32080 2e 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33  . */.    sqlite3
32090 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64  ExprListDelete(d
320a0 62 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79 29 3b  b, p->pOrderBy);
320b0 0a 20 20 20 20 70 2d 3e 70 4f 72 64 65 72 42 79  .    p->pOrderBy
320c0 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 73 65 6c   = 0;.    p->sel
320d0 46 6c 61 67 73 20 26 3d 20 7e 53 46 5f 44 69 73  Flags &= ~SF_Dis
320e0 74 69 6e 63 74 3b 0a 20 20 7d 0a 20 20 73 71 6c  tinct;.  }.  sql
320f0 69 74 65 33 53 65 6c 65 63 74 50 72 65 70 28 70  ite3SelectPrep(p
32100 50 61 72 73 65 2c 20 70 2c 20 30 29 3b 0a 20 20  Parse, p, 0);.  
32110 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72  if( pParse->nErr
32120 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61   || db->mallocFa
32130 69 6c 65 64 20 29 7b 0a 20 20 20 20 67 6f 74 6f  iled ){.    goto
32140 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d   select_end;.  }
32150 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45  .  assert( p->pE
32160 4c 69 73 74 21 3d 30 20 29 3b 0a 23 69 66 20 53  List!=0 );.#if S
32170 45 4c 45 43 54 54 52 41 43 45 5f 45 4e 41 42 4c  ELECTTRACE_ENABL
32180 45 44 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  ED.  if( sqlite3
32190 53 65 6c 65 63 74 54 72 61 63 65 20 26 20 30 78  SelectTrace & 0x
321a0 31 30 34 20 29 7b 0a 20 20 20 20 53 45 4c 45 43  104 ){.    SELEC
321b0 54 54 52 41 43 45 28 30 78 31 30 34 2c 70 50 61  TTRACE(0x104,pPa
321c0 72 73 65 2c 70 2c 20 28 22 61 66 74 65 72 20 6e  rse,p, ("after n
321d0 61 6d 65 20 72 65 73 6f 6c 75 74 69 6f 6e 3a 5c  ame resolution:\
321e0 6e 22 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  n"));.    sqlite
321f0 33 54 72 65 65 56 69 65 77 53 65 6c 65 63 74 28  3TreeViewSelect(
32200 30 2c 20 70 2c 20 30 29 3b 0a 20 20 7d 0a 23 65  0, p, 0);.  }.#e
32210 6e 64 69 66 0a 0a 20 20 69 66 28 20 70 44 65 73  ndif..  if( pDes
32220 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75  t->eDest==SRT_Ou
32230 74 70 75 74 20 29 7b 0a 20 20 20 20 67 65 6e 65  tput ){.    gene
32240 72 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28  rateColumnNames(
32250 70 50 61 72 73 65 2c 20 70 29 3b 0a 20 20 7d 0a  pParse, p);.  }.
32260 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
32270 4f 4d 49 54 5f 57 49 4e 44 4f 57 46 55 4e 43 0a  OMIT_WINDOWFUNC.
32280 20 20 69 66 28 20 73 71 6c 69 74 65 33 57 69 6e    if( sqlite3Win
32290 64 6f 77 52 65 77 72 69 74 65 28 70 50 61 72 73  dowRewrite(pPars
322a0 65 2c 20 70 29 20 29 7b 0a 20 20 20 20 67 6f 74  e, p) ){.    got
322b0 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  o select_end;.  
322c0 7d 0a 23 69 66 20 53 45 4c 45 43 54 54 52 41 43  }.#if SELECTTRAC
322d0 45 5f 45 4e 41 42 4c 45 44 0a 20 20 69 66 28 20  E_ENABLED.  if( 
322e0 73 71 6c 69 74 65 33 53 65 6c 65 63 74 54 72 61  sqlite3SelectTra
322f0 63 65 20 26 20 30 78 31 30 38 20 29 7b 0a 20 20  ce & 0x108 ){.  
32300 20 20 53 45 4c 45 43 54 54 52 41 43 45 28 30 78    SELECTTRACE(0x
32310 31 30 34 2c 70 50 61 72 73 65 2c 70 2c 20 28 22  104,pParse,p, ("
32320 61 66 74 65 72 20 77 69 6e 64 6f 77 20 72 65 77  after window rew
32330 72 69 74 65 3a 5c 6e 22 29 29 3b 0a 20 20 20 20  rite:\n"));.    
32340 73 71 6c 69 74 65 33 54 72 65 65 56 69 65 77 53  sqlite3TreeViewS
32350 65 6c 65 63 74 28 30 2c 20 70 2c 20 30 29 3b 0a  elect(0, p, 0);.
32360 20 20 7d 0a 23 65 6e 64 69 66 0a 23 65 6e 64 69    }.#endif.#endi
32370 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
32380 5f 57 49 4e 44 4f 57 46 55 4e 43 20 2a 2f 0a 20  _WINDOWFUNC */. 
32390 20 70 54 61 62 4c 69 73 74 20 3d 20 70 2d 3e 70   pTabList = p->p
323a0 53 72 63 3b 0a 20 20 69 73 41 67 67 20 3d 20 28  Src;.  isAgg = (
323b0 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46  p->selFlags & SF
323c0 5f 41 67 67 72 65 67 61 74 65 29 21 3d 30 3b 0a  _Aggregate)!=0;.
323d0 20 20 6d 65 6d 73 65 74 28 26 73 53 6f 72 74 2c    memset(&sSort,
323e0 20 30 2c 20 73 69 7a 65 6f 66 28 73 53 6f 72 74   0, sizeof(sSort
323f0 29 29 3b 0a 20 20 73 53 6f 72 74 2e 70 4f 72 64  ));.  sSort.pOrd
32400 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72  erBy = p->pOrder
32410 42 79 3b 0a 0a 20 20 2f 2a 20 54 72 79 20 74 6f  By;..  /* Try to
32420 20 76 61 72 69 6f 75 73 20 6f 70 74 69 6d 69 7a   various optimiz
32430 61 74 69 6f 6e 73 20 28 66 6c 61 74 74 65 6e 69  ations (flatteni
32440 6e 67 20 73 75 62 71 75 65 72 69 65 73 2c 20 61  ng subqueries, a
32450 6e 64 20 73 74 72 65 6e 67 74 68 0a 20 20 2a 2a  nd strength.  **
32460 20 72 65 64 75 63 74 69 6f 6e 20 6f 66 20 6a 6f   reduction of jo
32470 69 6e 20 6f 70 65 72 61 74 6f 72 73 29 20 69 6e  in operators) in
32480 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
32490 20 75 70 20 69 6e 74 6f 20 74 68 65 20 6d 61 69   up into the mai
324a0 6e 20 71 75 65 72 79 0a 20 20 2a 2f 0a 23 69 66  n query.  */.#if
324b0 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
324c0 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29 20  _OMIT_SUBQUERY) 
324d0 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  || !defined(SQLI
324e0 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 0a 20 20  TE_OMIT_VIEW).  
324f0 66 6f 72 28 69 3d 30 3b 20 21 70 2d 3e 70 50 72  for(i=0; !p->pPr
32500 69 6f 72 20 26 26 20 69 3c 70 54 61 62 4c 69 73  ior && i<pTabLis
32510 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20  t->nSrc; i++){. 
32520 20 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73     struct SrcLis
32530 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20  t_item *pItem = 
32540 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 3b  &pTabList->a[i];
32550 0a 20 20 20 20 53 65 6c 65 63 74 20 2a 70 53 75  .    Select *pSu
32560 62 20 3d 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65  b = pItem->pSele
32570 63 74 3b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70  ct;.    Table *p
32580 54 61 62 20 3d 20 70 49 74 65 6d 2d 3e 70 54 61  Tab = pItem->pTa
32590 62 3b 0a 0a 20 20 20 20 2f 2a 20 43 6f 6e 76 65  b;..    /* Conve
325a0 72 74 20 4c 45 46 54 20 4a 4f 49 4e 20 69 6e 74  rt LEFT JOIN int
325b0 6f 20 4a 4f 49 4e 20 69 66 20 74 68 65 72 65 20  o JOIN if there 
325c0 61 72 65 20 74 65 72 6d 73 20 6f 66 20 74 68 65  are terms of the
325d0 20 72 69 67 68 74 20 74 61 62 6c 65 0a 20 20 20   right table.   
325e0 20 2a 2a 20 6f 66 20 74 68 65 20 4c 45 46 54 20   ** of the LEFT 
325f0 4a 4f 49 4e 20 75 73 65 64 20 69 6e 20 74 68 65  JOIN used in the
32600 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e 0a 20   WHERE clause.. 
32610 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 70     */.    if( (p
32620 49 74 65 6d 2d 3e 66 67 2e 6a 6f 69 6e 74 79 70  Item->fg.jointyp
32630 65 20 26 20 4a 54 5f 4c 45 46 54 29 21 3d 30 0a  e & JT_LEFT)!=0.
32640 20 20 20 20 20 26 26 20 73 71 6c 69 74 65 33 45       && sqlite3E
32650 78 70 72 49 6d 70 6c 69 65 73 4e 6f 6e 4e 75 6c  xprImpliesNonNul
32660 6c 52 6f 77 28 70 2d 3e 70 57 68 65 72 65 2c 20  lRow(p->pWhere, 
32670 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 29 0a  pItem->iCursor).
32680 20 20 20 20 20 26 26 20 4f 70 74 69 6d 69 7a 61       && Optimiza
32690 74 69 6f 6e 45 6e 61 62 6c 65 64 28 64 62 2c 20  tionEnabled(db, 
326a0 53 51 4c 49 54 45 5f 53 69 6d 70 6c 69 66 79 4a  SQLITE_SimplifyJ
326b0 6f 69 6e 29 0a 20 20 20 20 29 7b 0a 20 20 20 20  oin).    ){.    
326c0 20 20 53 45 4c 45 43 54 54 52 41 43 45 28 30 78    SELECTTRACE(0x
326d0 31 30 30 2c 70 50 61 72 73 65 2c 70 2c 0a 20 20  100,pParse,p,.  
326e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 22                ("
326f0 4c 45 46 54 2d 4a 4f 49 4e 20 73 69 6d 70 6c 69  LEFT-JOIN simpli
32700 66 69 65 73 20 74 6f 20 4a 4f 49 4e 20 6f 6e 20  fies to JOIN on 
32710 74 65 72 6d 20 25 64 5c 6e 22 2c 69 29 29 3b 0a  term %d\n",i));.
32720 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 66 67 2e        pItem->fg.
32730 6a 6f 69 6e 74 79 70 65 20 26 3d 20 7e 28 4a 54  jointype &= ~(JT
32740 5f 4c 45 46 54 7c 4a 54 5f 4f 55 54 45 52 29 3b  _LEFT|JT_OUTER);
32750 0a 20 20 20 20 20 20 75 6e 73 65 74 4a 6f 69 6e  .      unsetJoin
32760 45 78 70 72 28 70 2d 3e 70 57 68 65 72 65 2c 20  Expr(p->pWhere, 
32770 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 29 3b  pItem->iCursor);
32780 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4e  .    }..    /* N
32790 6f 20 66 75 74 68 65 72 20 61 63 74 69 6f 6e 20  o futher action 
327a0 69 66 20 74 68 69 73 20 74 65 72 6d 20 6f 66 20  if this term of 
327b0 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
327c0 69 73 20 6e 6f 20 61 20 73 75 62 71 75 65 72 79  is no a subquery
327d0 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 53 75 62   */.    if( pSub
327e0 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ==0 ) continue;.
327f0 0a 20 20 20 20 2f 2a 20 43 61 74 63 68 20 6d 69  .    /* Catch mi
32800 73 6d 61 74 63 68 20 69 6e 20 74 68 65 20 64 65  smatch in the de
32810 63 6c 61 72 65 64 20 63 6f 6c 75 6d 6e 73 20 6f  clared columns o
32820 66 20 61 20 76 69 65 77 20 61 6e 64 20 74 68 65  f a view and the
32830 20 6e 75 6d 62 65 72 20 6f 66 0a 20 20 20 20 2a   number of.    *
32840 2a 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65  * columns in the
32850 20 53 45 4c 45 43 54 20 6f 6e 20 74 68 65 20 52   SELECT on the R
32860 48 53 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 54  HS */.    if( pT
32870 61 62 2d 3e 6e 43 6f 6c 21 3d 70 53 75 62 2d 3e  ab->nCol!=pSub->
32880 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 7b  pEList->nExpr ){
32890 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72  .      sqlite3Er
328a0 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
328b0 65 78 70 65 63 74 65 64 20 25 64 20 63 6f 6c 75  expected %d colu
328c0 6d 6e 73 20 66 6f 72 20 27 25 73 27 20 62 75 74  mns for '%s' but
328d0 20 67 6f 74 20 25 64 22 2c 0a 20 20 20 20 20 20   got %d",.      
328e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
328f0 70 54 61 62 2d 3e 6e 43 6f 6c 2c 20 70 54 61 62  pTab->nCol, pTab
32900 2d 3e 7a 4e 61 6d 65 2c 20 70 53 75 62 2d 3e 70  ->zName, pSub->p
32910 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b 0a 20  EList->nExpr);. 
32920 20 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74       goto select
32930 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  _end;.    }..   
32940 20 2f 2a 20 44 6f 20 6e 6f 74 20 74 72 79 20 74   /* Do not try t
32950 6f 20 66 6c 61 74 74 65 6e 20 61 6e 20 61 67 67  o flatten an agg
32960 72 65 67 61 74 65 20 73 75 62 71 75 65 72 79 2e  regate subquery.
32970 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 46  .    **.    ** F
32980 6c 61 74 74 65 6e 69 6e 67 20 61 6e 20 61 67 67  lattening an agg
32990 72 65 67 61 74 65 20 73 75 62 71 75 65 72 79 20  regate subquery 
329a0 69 73 20 6f 6e 6c 79 20 70 6f 73 73 69 62 6c 65  is only possible
329b0 20 69 66 20 74 68 65 20 6f 75 74 65 72 20 71 75   if the outer qu
329c0 65 72 79 0a 20 20 20 20 2a 2a 20 69 73 20 6e 6f  ery.    ** is no
329d0 74 20 61 20 6a 6f 69 6e 2e 20 20 42 75 74 20 69  t a join.  But i
329e0 66 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  f the outer quer
329f0 79 20 69 73 20 6e 6f 74 20 61 20 6a 6f 69 6e 2c  y is not a join,
32a00 20 74 68 65 6e 20 74 68 65 20 73 75 62 71 75 65   then the subque
32a10 72 79 0a 20 20 20 20 2a 2a 20 77 69 6c 6c 20 62  ry.    ** will b
32a20 65 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 61 73  e implemented as
32a30 20 61 20 63 6f 2d 72 6f 75 74 69 6e 65 20 61 6e   a co-routine an
32a40 64 20 74 68 65 72 65 20 69 73 20 6e 6f 20 61 64  d there is no ad
32a50 76 61 6e 74 61 67 65 20 74 6f 0a 20 20 20 20 2a  vantage to.    *
32a60 2a 20 66 6c 61 74 74 65 6e 69 6e 67 20 69 6e 20  * flattening in 
32a70 74 68 61 74 20 63 61 73 65 2e 0a 20 20 20 20 2a  that case..    *
32a80 2f 0a 20 20 20 20 69 66 28 20 28 70 53 75 62 2d  /.    if( (pSub-
32a90 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 41  >selFlags & SF_A
32aa0 67 67 72 65 67 61 74 65 29 21 3d 30 20 29 20 63  ggregate)!=0 ) c
32ab0 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 61 73 73  ontinue;.    ass
32ac0 65 72 74 28 20 70 53 75 62 2d 3e 70 47 72 6f 75  ert( pSub->pGrou
32ad0 70 42 79 3d 3d 30 20 29 3b 0a 0a 20 20 20 20 2f  pBy==0 );..    /
32ae0 2a 20 49 66 20 74 68 65 20 6f 75 74 65 72 20 71  * If the outer q
32af0 75 65 72 79 20 63 6f 6e 74 61 69 6e 73 20 61 20  uery contains a 
32b00 22 63 6f 6d 70 6c 65 78 22 20 72 65 73 75 6c 74  "complex" result
32b10 20 73 65 74 20 28 74 68 61 74 20 69 73 2c 0a 20   set (that is,. 
32b20 20 20 20 2a 2a 20 69 66 20 74 68 65 20 72 65 73     ** if the res
32b30 75 6c 74 20 73 65 74 20 6f 66 20 74 68 65 20 6f  ult set of the o
32b40 75 74 65 72 20 71 75 65 72 79 20 75 73 65 73 20  uter query uses 
32b50 66 75 6e 63 74 69 6f 6e 73 20 6f 72 20 73 75 62  functions or sub
32b60 71 75 65 72 69 65 73 29 0a 20 20 20 20 2a 2a 20  queries).    ** 
32b70 61 6e 64 20 69 66 20 74 68 65 20 73 75 62 71 75  and if the subqu
32b80 65 72 79 20 63 6f 6e 74 61 69 6e 73 20 61 6e 20  ery contains an 
32b90 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
32ba0 61 6e 64 20 69 66 0a 20 20 20 20 2a 2a 20 69 74  and if.    ** it
32bb0 20 77 69 6c 6c 20 62 65 20 69 6d 70 6c 65 6d 65   will be impleme
32bc0 6e 74 65 64 20 61 73 20 61 20 63 6f 2d 72 6f 75  nted as a co-rou
32bd0 74 69 6e 65 2c 20 74 68 65 6e 20 64 6f 20 6e 6f  tine, then do no
32be0 74 20 66 6c 61 74 74 65 6e 2e 20 20 54 68 69 73  t flatten.  This
32bf0 0a 20 20 20 20 2a 2a 20 72 65 73 74 72 69 63 74  .    ** restrict
32c00 69 6f 6e 20 61 6c 6c 6f 77 73 20 53 51 4c 20 63  ion allows SQL c
32c10 6f 6e 73 74 72 75 63 74 73 20 6c 69 6b 65 20 74  onstructs like t
32c20 68 69 73 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20  his:.    **.    
32c30 2a 2a 20 20 53 45 4c 45 43 54 20 65 78 70 65 6e  **  SELECT expen
32c40 73 69 76 65 5f 66 75 6e 63 74 69 6f 6e 28 78 29  sive_function(x)
32c50 0a 20 20 20 20 2a 2a 20 20 20 20 46 52 4f 4d 20  .    **    FROM 
32c60 28 53 45 4c 45 43 54 20 78 20 46 52 4f 4d 20 74  (SELECT x FROM t
32c70 61 62 20 4f 52 44 45 52 20 42 59 20 79 20 4c 49  ab ORDER BY y LI
32c80 4d 49 54 20 31 30 29 3b 0a 20 20 20 20 2a 2a 0a  MIT 10);.    **.
32c90 20 20 20 20 2a 2a 20 54 68 65 20 65 78 70 65 6e      ** The expen
32ca0 73 69 76 65 5f 66 75 6e 63 74 69 6f 6e 28 29 20  sive_function() 
32cb0 69 73 20 6f 6e 6c 79 20 63 6f 6d 70 75 74 65 64  is only computed
32cc0 20 6f 6e 20 74 68 65 20 31 30 20 72 6f 77 73 20   on the 10 rows 
32cd0 74 68 61 74 0a 20 20 20 20 2a 2a 20 61 72 65 20  that.    ** are 
32ce0 6f 75 74 70 75 74 2c 20 72 61 74 68 65 72 20 74  output, rather t
32cf0 68 61 6e 20 65 76 65 72 79 20 72 6f 77 20 6f 66  han every row of
32d00 20 74 68 65 20 74 61 62 6c 65 2e 0a 20 20 20 20   the table..    
32d10 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 72 65  **.    ** The re
32d20 71 75 69 72 65 6d 65 6e 74 20 74 68 61 74 20 74  quirement that t
32d30 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 68  he outer query h
32d40 61 76 65 20 61 20 63 6f 6d 70 6c 65 78 20 72 65  ave a complex re
32d50 73 75 6c 74 20 73 65 74 0a 20 20 20 20 2a 2a 20  sult set.    ** 
32d60 6d 65 61 6e 73 20 74 68 61 74 20 66 6c 61 74 74  means that flatt
32d70 65 6e 69 6e 67 20 64 6f 65 73 20 6f 63 63 75 72  ening does occur
32d80 20 6f 6e 20 73 69 6d 70 6c 65 72 20 53 51 4c 20   on simpler SQL 
32d90 63 6f 6e 73 74 72 61 69 6e 74 73 20 77 69 74 68  constraints with
32da0 6f 75 74 0a 20 20 20 20 2a 2a 20 74 68 65 20 65  out.    ** the e
32db0 78 70 65 6e 73 69 76 65 5f 66 75 6e 63 74 69 6f  xpensive_functio
32dc0 6e 28 29 20 6c 69 6b 65 3a 0a 20 20 20 20 2a 2a  n() like:.    **
32dd0 0a 20 20 20 20 2a 2a 20 20 53 45 4c 45 43 54 20  .    **  SELECT 
32de0 78 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20 78  x FROM (SELECT x
32df0 20 46 52 4f 4d 20 74 61 62 20 4f 52 44 45 52 20   FROM tab ORDER 
32e00 42 59 20 79 20 4c 49 4d 49 54 20 31 30 29 3b 0a  BY y LIMIT 10);.
32e10 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
32e20 53 75 62 2d 3e 70 4f 72 64 65 72 42 79 21 3d 30  Sub->pOrderBy!=0
32e30 0a 20 20 20 20 20 26 26 20 69 3d 3d 30 0a 20 20  .     && i==0.  
32e40 20 20 20 26 26 20 28 70 2d 3e 73 65 6c 46 6c 61     && (p->selFla
32e50 67 73 20 26 20 53 46 5f 43 6f 6d 70 6c 65 78 52  gs & SF_ComplexR
32e60 65 73 75 6c 74 29 21 3d 30 0a 20 20 20 20 20 26  esult)!=0.     &
32e70 26 20 28 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72  & (pTabList->nSr
32e80 63 3d 3d 31 0a 20 20 20 20 20 20 20 20 20 7c 7c  c==1.         ||
32e90 20 28 70 54 61 62 4c 69 73 74 2d 3e 61 5b 31 5d   (pTabList->a[1]
32ea0 2e 66 67 2e 6a 6f 69 6e 74 79 70 65 26 28 4a 54  .fg.jointype&(JT
32eb0 5f 4c 45 46 54 7c 4a 54 5f 43 52 4f 53 53 29 29  _LEFT|JT_CROSS))
32ec0 21 3d 30 29 0a 20 20 20 20 29 7b 0a 20 20 20 20  !=0).    ){.    
32ed0 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
32ee0 7d 0a 0a 20 20 20 20 69 66 28 20 66 6c 61 74 74  }..    if( flatt
32ef0 65 6e 53 75 62 71 75 65 72 79 28 70 50 61 72 73  enSubquery(pPars
32f00 65 2c 20 70 2c 20 69 2c 20 69 73 41 67 67 29 20  e, p, i, isAgg) 
32f10 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 50 61  ){.      if( pPa
32f20 72 73 65 2d 3e 6e 45 72 72 20 29 20 67 6f 74 6f  rse->nErr ) goto
32f30 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20   select_end;.   
32f40 20 20 20 2f 2a 20 54 68 69 73 20 73 75 62 71 75     /* This subqu
32f50 65 72 79 20 63 61 6e 20 62 65 20 61 62 73 6f 72  ery can be absor
32f60 62 65 64 20 69 6e 74 6f 20 69 74 73 20 70 61 72  bed into its par
32f70 65 6e 74 2e 20 2a 2f 0a 20 20 20 20 20 20 69 20  ent. */.      i 
32f80 3d 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20  = -1;.    }.    
32f90 70 54 61 62 4c 69 73 74 20 3d 20 70 2d 3e 70 53  pTabList = p->pS
32fa0 72 63 3b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e  rc;.    if( db->
32fb0 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 67  mallocFailed ) g
32fc0 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  oto select_end;.
32fd0 20 20 20 20 69 66 28 20 21 49 67 6e 6f 72 61 62      if( !Ignorab
32fe0 6c 65 4f 72 64 65 72 62 79 28 70 44 65 73 74 29  leOrderby(pDest)
32ff0 20 29 7b 0a 20 20 20 20 20 20 73 53 6f 72 74 2e   ){.      sSort.
33000 70 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f  pOrderBy = p->pO
33010 72 64 65 72 42 79 3b 0a 20 20 20 20 7d 0a 20 20  rderBy;.    }.  
33020 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65  }.#endif..#ifnde
33030 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f  f SQLITE_OMIT_CO
33040 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 0a 20 20  MPOUND_SELECT.  
33050 2f 2a 20 48 61 6e 64 6c 65 20 63 6f 6d 70 6f 75  /* Handle compou
33060 6e 64 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  nd SELECT statem
33070 65 6e 74 73 20 75 73 69 6e 67 20 74 68 65 20 73  ents using the s
33080 65 70 61 72 61 74 65 20 6d 75 6c 74 69 53 65 6c  eparate multiSel
33090 65 63 74 28 29 0a 20 20 2a 2a 20 70 72 6f 63 65  ect().  ** proce
330a0 64 75 72 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  dure..  */.  if(
330b0 20 70 2d 3e 70 50 72 69 6f 72 20 29 7b 0a 20 20   p->pPrior ){.  
330c0 20 20 72 63 20 3d 20 6d 75 6c 74 69 53 65 6c 65    rc = multiSele
330d0 63 74 28 70 50 61 72 73 65 2c 20 70 2c 20 70 44  ct(pParse, p, pD
330e0 65 73 74 29 3b 0a 23 69 66 20 53 45 4c 45 43 54  est);.#if SELECT
330f0 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20  TRACE_ENABLED.  
33100 20 20 53 45 4c 45 43 54 54 52 41 43 45 28 30 78    SELECTTRACE(0x
33110 31 2c 70 50 61 72 73 65 2c 70 2c 28 22 65 6e 64  1,pParse,p,("end
33120 20 63 6f 6d 70 6f 75 6e 64 2d 73 65 6c 65 63 74   compound-select
33130 20 70 72 6f 63 65 73 73 69 6e 67 5c 6e 22 29 29   processing\n"))
33140 3b 0a 20 20 20 20 69 66 28 20 28 73 71 6c 69 74  ;.    if( (sqlit
33150 65 33 53 65 6c 65 63 74 54 72 61 63 65 20 26 20  e3SelectTrace & 
33160 30 78 32 30 30 30 29 21 3d 30 20 26 26 20 45 78  0x2000)!=0 && Ex
33170 70 6c 61 69 6e 51 75 65 72 79 50 6c 61 6e 50 61  plainQueryPlanPa
33180 72 65 6e 74 28 70 50 61 72 73 65 29 3d 3d 30 20  rent(pParse)==0 
33190 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
331a0 54 72 65 65 56 69 65 77 53 65 6c 65 63 74 28 30  TreeViewSelect(0
331b0 2c 20 70 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 23  , p, 0);.    }.#
331c0 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20 70 2d  endif.    if( p-
331d0 3e 70 4e 65 78 74 3d 3d 30 20 29 20 45 78 70 6c  >pNext==0 ) Expl
331e0 61 69 6e 51 75 65 72 79 50 6c 61 6e 50 6f 70 28  ainQueryPlanPop(
331f0 70 50 61 72 73 65 29 3b 0a 20 20 20 20 72 65 74  pParse);.    ret
33200 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 23 65 6e 64  urn rc;.  }.#end
33210 69 66 0a 0a 20 20 2f 2a 20 44 6f 20 74 68 65 20  if..  /* Do the 
33220 57 48 45 52 45 2d 63 6c 61 75 73 65 20 63 6f 6e  WHERE-clause con
33230 73 74 61 6e 74 20 70 72 6f 70 61 67 61 74 69 6f  stant propagatio
33240 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69  n optimization i
33250 66 20 74 68 69 73 20 69 73 0a 20 20 2a 2a 20 61  f this is.  ** a
33260 20 6a 6f 69 6e 2e 20 20 4e 6f 20 6e 65 65 64 20   join.  No need 
33270 74 6f 20 73 70 65 65 64 20 74 69 6d 65 20 6f 6e  to speed time on
33280 20 74 68 69 73 20 6f 70 65 72 61 74 69 6f 6e 20   this operation 
33290 66 6f 72 20 6e 6f 6e 2d 6a 6f 69 6e 20 71 75 65  for non-join que
332a0 72 69 65 73 0a 20 20 2a 2a 20 61 73 20 74 68 65  ries.  ** as the
332b0 20 65 71 75 69 76 61 6c 65 6e 74 20 6f 70 74 69   equivalent opti
332c0 6d 69 7a 61 74 69 6f 6e 20 77 69 6c 6c 20 62 65  mization will be
332d0 20 68 61 6e 64 6c 65 64 20 62 79 20 71 75 65 72   handled by quer
332e0 79 20 70 6c 61 6e 6e 65 72 20 69 6e 0a 20 20 2a  y planner in.  *
332f0 2a 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65  * sqlite3WhereBe
33300 67 69 6e 28 29 2e 0a 20 20 2a 2f 0a 20 20 69 66  gin()..  */.  if
33310 28 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63  ( pTabList->nSrc
33320 3e 31 0a 20 20 20 26 26 20 4f 70 74 69 6d 69 7a  >1.   && Optimiz
33330 61 74 69 6f 6e 45 6e 61 62 6c 65 64 28 64 62 2c  ationEnabled(db,
33340 20 53 51 4c 49 54 45 5f 50 72 6f 70 61 67 61 74   SQLITE_Propagat
33350 65 43 6f 6e 73 74 29 0a 20 20 20 26 26 20 70 72  eConst).   && pr
33360 6f 70 61 67 61 74 65 43 6f 6e 73 74 61 6e 74 73  opagateConstants
33370 28 70 50 61 72 73 65 2c 20 70 29 0a 20 20 29 7b  (pParse, p).  ){
33380 0a 23 69 66 20 53 45 4c 45 43 54 54 52 41 43 45  .#if SELECTTRACE
33390 5f 45 4e 41 42 4c 45 44 0a 20 20 20 20 69 66 28  _ENABLED.    if(
333a0 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 54 72   sqlite3SelectTr
333b0 61 63 65 20 26 20 30 78 31 30 30 20 29 7b 0a 20  ace & 0x100 ){. 
333c0 20 20 20 20 20 53 45 4c 45 43 54 54 52 41 43 45       SELECTTRACE
333d0 28 30 78 31 30 30 2c 70 50 61 72 73 65 2c 70 2c  (0x100,pParse,p,
333e0 28 22 41 66 74 65 72 20 63 6f 6e 73 74 61 6e 74  ("After constant
333f0 20 70 72 6f 70 61 67 61 74 69 6f 6e 3a 5c 6e 22   propagation:\n"
33400 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ));.      sqlite
33410 33 54 72 65 65 56 69 65 77 53 65 6c 65 63 74 28  3TreeViewSelect(
33420 30 2c 20 70 2c 20 30 29 3b 0a 20 20 20 20 7d 0a  0, p, 0);.    }.
33430 23 65 6e 64 69 66 0a 20 20 7d 65 6c 73 65 7b 0a  #endif.  }else{.
33440 20 20 20 20 53 45 4c 45 43 54 54 52 41 43 45 28      SELECTTRACE(
33450 30 78 31 30 30 2c 70 50 61 72 73 65 2c 70 2c 28  0x100,pParse,p,(
33460 22 43 6f 6e 73 74 61 6e 74 20 70 72 6f 70 61 67  "Constant propag
33470 61 74 69 6f 6e 20 6e 6f 74 20 68 65 6c 70 66 75  ation not helpfu
33480 6c 5c 6e 22 29 29 3b 0a 20 20 7d 0a 0a 23 69 66  l\n"));.  }..#if
33490 64 65 66 20 53 51 4c 49 54 45 5f 43 4f 55 4e 54  def SQLITE_COUNT
334a0 4f 46 56 49 45 57 5f 4f 50 54 49 4d 49 5a 41 54  OFVIEW_OPTIMIZAT
334b0 49 4f 4e 0a 20 20 69 66 28 20 4f 70 74 69 6d 69  ION.  if( Optimi
334c0 7a 61 74 69 6f 6e 45 6e 61 62 6c 65 64 28 64 62  zationEnabled(db
334d0 2c 20 53 51 4c 49 54 45 5f 51 75 65 72 79 46 6c  , SQLITE_QueryFl
334e0 61 74 74 65 6e 65 72 7c 53 51 4c 49 54 45 5f 43  attener|SQLITE_C
334f0 6f 75 6e 74 4f 66 56 69 65 77 29 0a 20 20 20 26  ountOfView).   &
33500 26 20 63 6f 75 6e 74 4f 66 56 69 65 77 4f 70 74  & countOfViewOpt
33510 69 6d 69 7a 61 74 69 6f 6e 28 70 50 61 72 73 65  imization(pParse
33520 2c 20 70 29 0a 20 20 29 7b 0a 20 20 20 20 69 66  , p).  ){.    if
33530 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
33540 65 64 20 29 20 67 6f 74 6f 20 73 65 6c 65 63 74  ed ) goto select
33550 5f 65 6e 64 3b 0a 20 20 20 20 70 45 4c 69 73 74  _end;.    pEList
33560 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 20 20   = p->pEList;.  
33570 20 20 70 54 61 62 4c 69 73 74 20 3d 20 70 2d 3e    pTabList = p->
33580 70 53 72 63 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  pSrc;.  }.#endif
33590 0a 0a 20 20 2f 2a 20 46 6f 72 20 65 61 63 68 20  ..  /* For each 
335a0 74 65 72 6d 20 69 6e 20 74 68 65 20 46 52 4f 4d  term in the FROM
335b0 20 63 6c 61 75 73 65 2c 20 64 6f 20 74 77 6f 20   clause, do two 
335c0 74 68 69 6e 67 73 3a 0a 20 20 2a 2a 20 28 31 29  things:.  ** (1)
335d0 20 41 75 74 68 6f 72 69 7a 65 64 20 75 6e 72 65   Authorized unre
335e0 66 65 72 65 6e 63 65 64 20 74 61 62 6c 65 73 0a  ferenced tables.
335f0 20 20 2a 2a 20 28 32 29 20 47 65 6e 65 72 61 74    ** (2) Generat
33600 65 20 63 6f 64 65 20 66 6f 72 20 61 6c 6c 20 73  e code for all s
33610 75 62 2d 71 75 65 72 69 65 73 0a 20 20 2a 2f 0a  ub-queries.  */.
33620 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54 61    for(i=0; i<pTa
33630 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b  bList->nSrc; i++
33640 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 53 72  ){.    struct Sr
33650 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  cList_item *pIte
33660 6d 20 3d 20 26 70 54 61 62 4c 69 73 74 2d 3e 61  m = &pTabList->a
33670 5b 69 5d 3b 0a 20 20 20 20 53 65 6c 65 63 74 44  [i];.    SelectD
33680 65 73 74 20 64 65 73 74 3b 0a 20 20 20 20 53 65  est dest;.    Se
33690 6c 65 63 74 20 2a 70 53 75 62 3b 0a 23 69 66 20  lect *pSub;.#if 
336a0 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
336b0 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29 20 7c  OMIT_SUBQUERY) |
336c0 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  | !defined(SQLIT
336d0 45 5f 4f 4d 49 54 5f 56 49 45 57 29 0a 20 20 20  E_OMIT_VIEW).   
336e0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 61   const char *zSa
336f0 76 65 64 41 75 74 68 43 6f 6e 74 65 78 74 3b 0a  vedAuthContext;.
33700 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 49  #endif..    /* I
33710 73 73 75 65 20 53 51 4c 49 54 45 5f 52 45 41 44  ssue SQLITE_READ
33720 20 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e 73 20   authorizations 
33730 77 69 74 68 20 61 20 66 61 6b 65 20 63 6f 6c 75  with a fake colu
33740 6d 6e 20 6e 61 6d 65 20 66 6f 72 20 61 6e 79 0a  mn name for any.
33750 20 20 20 20 2a 2a 20 74 61 62 6c 65 73 20 74 68      ** tables th
33760 61 74 20 61 72 65 20 72 65 66 65 72 65 6e 63 65  at are reference
33770 64 20 62 75 74 20 66 72 6f 6d 20 77 68 69 63 68  d but from which
33780 20 6e 6f 20 76 61 6c 75 65 73 20 61 72 65 20 65   no values are e
33790 78 74 72 61 63 74 65 64 2e 0a 20 20 20 20 2a 2a  xtracted..    **
337a0 20 45 78 61 6d 70 6c 65 73 20 6f 66 20 77 68 65   Examples of whe
337b0 72 65 20 74 68 65 73 65 20 6b 69 6e 64 73 20 6f  re these kinds o
337c0 66 20 6e 75 6c 6c 20 53 51 4c 49 54 45 5f 52 45  f null SQLITE_RE
337d0 41 44 20 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e  AD authorization
337e0 73 0a 20 20 20 20 2a 2a 20 77 6f 75 6c 64 20 6f  s.    ** would o
337f0 63 63 75 72 3a 0a 20 20 20 20 2a 2a 0a 20 20 20  ccur:.    **.   
33800 20 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 63   **     SELECT c
33810 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 74 31 3b  ount(*) FROM t1;
33820 20 20 20 2d 2d 20 53 51 4c 49 54 45 5f 52 45 41     -- SQLITE_REA
33830 44 20 74 31 2e 22 22 0a 20 20 20 20 2a 2a 20 20  D t1."".    **  
33840 20 20 20 53 45 4c 45 43 54 20 74 31 2e 2a 20 46     SELECT t1.* F
33850 52 4f 4d 20 74 31 2c 20 74 32 3b 20 20 20 2d 2d  ROM t1, t2;   --
33860 20 53 51 4c 49 54 45 5f 52 45 41 44 20 74 32 2e   SQLITE_READ t2.
33870 22 22 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  "".    **.    **
33880 20 54 68 65 20 66 61 6b 65 20 63 6f 6c 75 6d 6e   The fake column
33890 20 6e 61 6d 65 20 69 73 20 61 6e 20 65 6d 70 74   name is an empt
338a0 79 20 73 74 72 69 6e 67 2e 20 20 49 74 20 69 73  y string.  It is
338b0 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 61 20   possible for a 
338c0 74 61 62 6c 65 20 74 6f 0a 20 20 20 20 2a 2a 20  table to.    ** 
338d0 68 61 76 65 20 61 20 63 6f 6c 75 6d 6e 20 6e 61  have a column na
338e0 6d 65 64 20 62 79 20 74 68 65 20 65 6d 70 74 79  med by the empty
338f0 20 73 74 72 69 6e 67 2c 20 69 6e 20 77 68 69 63   string, in whic
33900 68 20 63 61 73 65 20 74 68 65 72 65 20 69 73 20  h case there is 
33910 6e 6f 20 77 61 79 20 74 6f 0a 20 20 20 20 2a 2a  no way to.    **
33920 20 64 69 73 74 69 6e 67 75 69 73 68 20 62 65 74   distinguish bet
33930 77 65 65 6e 20 61 6e 20 75 6e 72 65 66 65 72 65  ween an unrefere
33940 6e 63 65 64 20 74 61 62 6c 65 20 61 6e 64 20 61  nced table and a
33950 6e 20 61 63 74 75 61 6c 20 72 65 66 65 72 65 6e  n actual referen
33960 63 65 20 74 6f 20 74 68 65 0a 20 20 20 20 2a 2a  ce to the.    **
33970 20 22 22 20 63 6f 6c 75 6d 6e 2e 20 54 68 65 20   "" column. The 
33980 6f 72 69 67 69 6e 61 6c 20 64 65 73 69 67 6e 20  original design 
33990 77 61 73 20 66 6f 72 20 74 68 65 20 66 61 6b 65  was for the fake
339a0 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 74 6f 20   column name to 
339b0 62 65 20 61 20 4e 55 4c 4c 2c 0a 20 20 20 20 2a  be a NULL,.    *
339c0 2a 20 77 68 69 63 68 20 77 6f 75 6c 64 20 62 65  * which would be
339d0 20 75 6e 61 6d 62 69 67 75 6f 75 73 2e 20 20 42   unambiguous.  B
339e0 75 74 20 6c 65 67 61 63 79 20 61 75 74 68 6f 72  ut legacy author
339f0 69 7a 61 74 69 6f 6e 20 63 61 6c 6c 62 61 63 6b  ization callback
33a00 73 20 6d 69 67 68 74 0a 20 20 20 20 2a 2a 20 61  s might.    ** a
33a10 73 73 75 6d 65 20 74 68 65 20 63 6f 6c 75 6d 6e  ssume the column
33a20 20 6e 61 6d 65 20 69 73 20 6e 6f 6e 2d 4e 55 4c   name is non-NUL
33a30 4c 20 61 6e 64 20 73 65 67 66 61 75 6c 74 2e 20  L and segfault. 
33a40 20 54 68 65 20 75 73 65 20 6f 66 20 61 6e 20 65   The use of an e
33a50 6d 70 74 79 0a 20 20 20 20 2a 2a 20 73 74 72 69  mpty.    ** stri
33a60 6e 67 20 66 6f 72 20 74 68 65 20 66 61 6b 65 20  ng for the fake 
33a70 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 73 65 65 6d  column name seem
33a80 73 20 73 61 66 65 72 2e 0a 20 20 20 20 2a 2f 0a  s safer..    */.
33a90 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 63      if( pItem->c
33aa0 6f 6c 55 73 65 64 3d 3d 30 20 29 7b 0a 20 20 20  olUsed==0 ){.   
33ab0 20 20 20 73 71 6c 69 74 65 33 41 75 74 68 43 68     sqlite3AuthCh
33ac0 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49  eck(pParse, SQLI
33ad0 54 45 5f 52 45 41 44 2c 20 70 49 74 65 6d 2d 3e  TE_READ, pItem->
33ae0 7a 4e 61 6d 65 2c 20 22 22 2c 20 70 49 74 65 6d  zName, "", pItem
33af0 2d 3e 7a 44 61 74 61 62 61 73 65 29 3b 0a 20 20  ->zDatabase);.  
33b00 20 20 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e 65    }..#if !define
33b10 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  d(SQLITE_OMIT_SU
33b20 42 51 55 45 52 59 29 20 7c 7c 20 21 64 65 66 69  BQUERY) || !defi
33b30 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
33b40 56 49 45 57 29 0a 20 20 20 20 2f 2a 20 47 65 6e  VIEW).    /* Gen
33b50 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 61  erate code for a
33b60 6c 6c 20 73 75 62 2d 71 75 65 72 69 65 73 20 69  ll sub-queries i
33b70 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  n the FROM claus
33b80 65 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 53 75  e.    */.    pSu
33b90 62 20 3d 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65  b = pItem->pSele
33ba0 63 74 3b 0a 20 20 20 20 69 66 28 20 70 53 75 62  ct;.    if( pSub
33bb0 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ==0 ) continue;.
33bc0 0a 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 64 65  .    /* The code
33bd0 20 66 6f 72 20 61 20 73 75 62 71 75 65 72 79 20   for a subquery 
33be0 73 68 6f 75 6c 64 20 6f 6e 6c 79 20 62 65 20 67  should only be g
33bf0 65 6e 65 72 61 74 65 64 20 6f 6e 63 65 2c 20 74  enerated once, t
33c00 68 6f 75 67 68 20 69 74 20 69 73 0a 20 20 20 20  hough it is.    
33c10 2a 2a 20 74 65 63 68 6e 69 63 61 6c 6c 79 20 68  ** technically h
33c20 61 72 6d 6c 65 73 73 20 66 6f 72 20 69 74 20 74  armless for it t
33c30 6f 20 62 65 20 67 65 6e 65 72 61 74 65 64 20 6d  o be generated m
33c40 75 6c 74 69 70 6c 65 20 74 69 6d 65 73 2e 20 54  ultiple times. T
33c50 68 65 0a 20 20 20 20 2a 2a 20 66 6f 6c 6c 6f 77  he.    ** follow
33c60 69 6e 67 20 61 73 73 65 72 74 28 29 20 77 69 6c  ing assert() wil
33c70 6c 20 64 65 74 65 63 74 20 69 66 20 73 6f 6d 65  l detect if some
33c80 74 68 69 6e 67 20 63 68 61 6e 67 65 73 20 74 6f  thing changes to
33c90 20 63 61 75 73 65 0a 20 20 20 20 2a 2a 20 74 68   cause.    ** th
33ca0 65 20 73 61 6d 65 20 73 75 62 71 75 65 72 79 20  e same subquery 
33cb0 74 6f 20 62 65 20 63 6f 64 65 64 20 6d 75 6c 74  to be coded mult
33cc0 69 70 6c 65 20 74 69 6d 65 73 2c 20 61 73 20 61  iple times, as a
33cd0 20 73 69 67 6e 61 6c 20 74 6f 20 74 68 65 0a 20   signal to the. 
33ce0 20 20 20 2a 2a 20 64 65 76 65 6c 6f 70 65 72 73     ** developers
33cf0 20 74 6f 20 74 72 79 20 74 6f 20 6f 70 74 69 6d   to try to optim
33d00 69 7a 65 20 74 68 65 20 73 69 74 75 61 74 69 6f  ize the situatio
33d10 6e 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  n..    **.    **
33d20 20 55 70 64 61 74 65 20 32 30 31 39 2d 30 37 2d   Update 2019-07-
33d30 32 34 3a 0a 20 20 20 20 2a 2a 20 53 65 65 20 74  24:.    ** See t
33d40 69 63 6b 65 74 20 68 74 74 70 73 3a 2f 2f 73 71  icket https://sq
33d50 6c 69 74 65 2e 6f 72 67 2f 73 72 63 2f 74 6b 74  lite.org/src/tkt
33d60 76 69 65 77 2f 63 35 32 62 30 39 63 37 66 33 38  view/c52b09c7f38
33d70 39 30 33 62 31 33 31 31 63 65 63 34 30 2e 0a 20  903b1311cec40.. 
33d80 20 20 20 2a 2a 20 54 68 65 20 64 62 73 71 6c 66     ** The dbsqlf
33d90 75 7a 7a 20 66 75 7a 7a 65 72 20 66 6f 75 6e 64  uzz fuzzer found
33da0 20 61 20 63 61 73 65 20 77 68 65 72 65 20 74 68   a case where th
33db0 65 20 73 61 6d 65 20 73 75 62 71 75 65 72 79 20  e same subquery 
33dc0 67 65 74 73 0a 20 20 20 20 2a 2a 20 63 6f 64 65  gets.    ** code
33dd0 64 20 74 77 69 63 65 2e 20 20 53 6f 20 74 68 69  d twice.  So thi
33de0 73 20 61 73 73 65 72 74 28 29 20 6e 6f 77 20 62  s assert() now b
33df0 65 63 6f 6d 65 73 20 61 20 74 65 73 74 63 61 73  ecomes a testcas
33e00 65 28 29 2e 20 20 49 74 20 73 68 6f 75 6c 64 0a  e().  It should.
33e10 20 20 20 20 2a 2a 20 62 65 20 76 65 72 79 20 72      ** be very r
33e20 61 72 65 2c 20 74 68 6f 75 67 68 2e 0a 20 20 20  are, though..   
33e30 20 2a 2f 0a 20 20 20 20 74 65 73 74 63 61 73 65   */.    testcase
33e40 28 20 70 49 74 65 6d 2d 3e 61 64 64 72 46 69 6c  ( pItem->addrFil
33e50 6c 53 75 62 21 3d 30 20 29 3b 0a 0a 20 20 20 20  lSub!=0 );..    
33e60 2f 2a 20 49 6e 63 72 65 6d 65 6e 74 20 50 61 72  /* Increment Par
33e70 73 65 2e 6e 48 65 69 67 68 74 20 62 79 20 74 68  se.nHeight by th
33e80 65 20 68 65 69 67 68 74 20 6f 66 20 74 68 65 20  e height of the 
33e90 6c 61 72 67 65 73 74 20 65 78 70 72 65 73 73 69  largest expressi
33ea0 6f 6e 0a 20 20 20 20 2a 2a 20 74 72 65 65 20 72  on.    ** tree r
33eb0 65 66 65 72 72 65 64 20 74 6f 20 62 79 20 74 68  eferred to by th
33ec0 69 73 2c 20 74 68 65 20 70 61 72 65 6e 74 20 73  is, the parent s
33ed0 65 6c 65 63 74 2e 20 54 68 65 20 63 68 69 6c 64  elect. The child
33ee0 20 73 65 6c 65 63 74 0a 20 20 20 20 2a 2a 20 6d   select.    ** m
33ef0 61 79 20 63 6f 6e 74 61 69 6e 20 65 78 70 72 65  ay contain expre
33f00 73 73 69 6f 6e 20 74 72 65 65 73 20 6f 66 20 61  ssion trees of a
33f10 74 20 6d 6f 73 74 0a 20 20 20 20 2a 2a 20 28 53  t most.    ** (S
33f20 51 4c 49 54 45 5f 4d 41 58 5f 45 58 50 52 5f 44  QLITE_MAX_EXPR_D
33f30 45 50 54 48 2d 50 61 72 73 65 2e 6e 48 65 69 67  EPTH-Parse.nHeig
33f40 68 74 29 20 68 65 69 67 68 74 2e 20 54 68 69 73  ht) height. This
33f50 20 69 73 20 61 20 62 69 74 0a 20 20 20 20 2a 2a   is a bit.    **
33f60 20 6d 6f 72 65 20 63 6f 6e 73 65 72 76 61 74 69   more conservati
33f70 76 65 20 74 68 61 6e 20 6e 65 63 65 73 73 61 72  ve than necessar
33f80 79 2c 20 62 75 74 20 6d 75 63 68 20 65 61 73 69  y, but much easi
33f90 65 72 20 74 68 61 6e 20 65 6e 66 6f 72 63 69 6e  er than enforcin
33fa0 67 0a 20 20 20 20 2a 2a 20 61 6e 20 65 78 61 63  g.    ** an exac
33fb0 74 20 6c 69 6d 69 74 2e 0a 20 20 20 20 2a 2f 0a  t limit..    */.
33fc0 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 48 65 69      pParse->nHei
33fd0 67 68 74 20 2b 3d 20 73 71 6c 69 74 65 33 53 65  ght += sqlite3Se
33fe0 6c 65 63 74 45 78 70 72 48 65 69 67 68 74 28 70  lectExprHeight(p
33ff0 29 3b 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 20  );..    /* Make 
34000 63 6f 70 69 65 73 20 6f 66 20 63 6f 6e 73 74 61  copies of consta
34010 6e 74 20 57 48 45 52 45 2d 63 6c 61 75 73 65 20  nt WHERE-clause 
34020 74 65 72 6d 73 20 69 6e 20 74 68 65 20 6f 75 74  terms in the out
34030 65 72 20 71 75 65 72 79 20 64 6f 77 6e 0a 20 20  er query down.  
34040 20 20 2a 2a 20 69 6e 73 69 64 65 20 74 68 65 20    ** inside the 
34050 73 75 62 71 75 65 72 79 2e 20 20 54 68 69 73 20  subquery.  This 
34060 63 61 6e 20 68 65 6c 70 20 74 68 65 20 73 75 62  can help the sub
34070 71 75 65 72 79 20 74 6f 20 72 75 6e 20 6d 6f 72  query to run mor
34080 65 20 65 66 66 69 63 69 65 6e 74 6c 79 2e 0a 20  e efficiently.. 
34090 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 4f 70     */.    if( Op
340a0 74 69 6d 69 7a 61 74 69 6f 6e 45 6e 61 62 6c 65  timizationEnable
340b0 64 28 64 62 2c 20 53 51 4c 49 54 45 5f 50 75 73  d(db, SQLITE_Pus
340c0 68 44 6f 77 6e 29 0a 20 20 20 20 20 26 26 20 70  hDown).     && p
340d0 75 73 68 44 6f 77 6e 57 68 65 72 65 54 65 72 6d  ushDownWhereTerm
340e0 73 28 70 50 61 72 73 65 2c 20 70 53 75 62 2c 20  s(pParse, pSub, 
340f0 70 2d 3e 70 57 68 65 72 65 2c 20 70 49 74 65 6d  p->pWhere, pItem
34100 2d 3e 69 43 75 72 73 6f 72 2c 0a 20 20 20 20 20  ->iCursor,.     
34110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34120 20 20 20 20 20 20 28 70 49 74 65 6d 2d 3e 66 67        (pItem->fg
34130 2e 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 4f  .jointype & JT_O
34140 55 54 45 52 29 21 3d 30 29 0a 20 20 20 20 29 7b  UTER)!=0).    ){
34150 0a 23 69 66 20 53 45 4c 45 43 54 54 52 41 43 45  .#if SELECTTRACE
34160 5f 45 4e 41 42 4c 45 44 0a 20 20 20 20 20 20 69  _ENABLED.      i
34170 66 28 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  f( sqlite3Select
34180 54 72 61 63 65 20 26 20 30 78 31 30 30 20 29 7b  Trace & 0x100 ){
34190 0a 20 20 20 20 20 20 20 20 53 45 4c 45 43 54 54  .        SELECTT
341a0 52 41 43 45 28 30 78 31 30 30 2c 70 50 61 72 73  RACE(0x100,pPars
341b0 65 2c 70 2c 0a 20 20 20 20 20 20 20 20 20 20 20  e,p,.           
341c0 20 28 22 41 66 74 65 72 20 57 48 45 52 45 2d 63   ("After WHERE-c
341d0 6c 61 75 73 65 20 70 75 73 68 2d 64 6f 77 6e 20  lause push-down 
341e0 69 6e 74 6f 20 73 75 62 71 75 65 72 79 20 25 64  into subquery %d
341f0 3a 5c 6e 22 2c 20 70 53 75 62 2d 3e 73 65 6c 49  :\n", pSub->selI
34200 64 29 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  d));.        sql
34210 69 74 65 33 54 72 65 65 56 69 65 77 53 65 6c 65  ite3TreeViewSele
34220 63 74 28 30 2c 20 70 2c 20 30 29 3b 0a 20 20 20  ct(0, p, 0);.   
34230 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
34240 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 53 45 4c  }else{.      SEL
34250 45 43 54 54 52 41 43 45 28 30 78 31 30 30 2c 70  ECTTRACE(0x100,p
34260 50 61 72 73 65 2c 70 2c 28 22 50 75 73 68 2d 64  Parse,p,("Push-d
34270 6f 77 6e 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65  own not possible
34280 5c 6e 22 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  \n"));.    }..  
34290 20 20 7a 53 61 76 65 64 41 75 74 68 43 6f 6e 74    zSavedAuthCont
342a0 65 78 74 20 3d 20 70 50 61 72 73 65 2d 3e 7a 41  ext = pParse->zA
342b0 75 74 68 43 6f 6e 74 65 78 74 3b 0a 20 20 20 20  uthContext;.    
342c0 70 50 61 72 73 65 2d 3e 7a 41 75 74 68 43 6f 6e  pParse->zAuthCon
342d0 74 65 78 74 20 3d 20 70 49 74 65 6d 2d 3e 7a 4e  text = pItem->zN
342e0 61 6d 65 3b 0a 0a 20 20 20 20 2f 2a 20 47 65 6e  ame;..    /* Gen
342f0 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 69 6d  erate code to im
34300 70 6c 65 6d 65 6e 74 20 74 68 65 20 73 75 62 71  plement the subq
34310 75 65 72 79 0a 20 20 20 20 2a 2a 0a 20 20 20 20  uery.    **.    
34320 2a 2a 20 54 68 65 20 73 75 62 71 75 65 72 79 20  ** The subquery 
34330 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 61  is implemented a
34340 73 20 61 20 63 6f 2d 72 6f 75 74 69 6e 65 20 69  s a co-routine i
34350 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20 69  f the subquery i
34360 73 0a 20 20 20 20 2a 2a 20 67 75 61 72 61 6e 74  s.    ** guarant
34370 65 65 64 20 74 6f 20 62 65 20 74 68 65 20 6f 75  eed to be the ou
34380 74 65 72 20 6c 6f 6f 70 20 28 73 6f 20 74 68 61  ter loop (so tha
34390 74 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 6e 65  t it does not ne
343a0 65 64 20 74 6f 20 62 65 0a 20 20 20 20 2a 2a 20  ed to be.    ** 
343b0 63 6f 6d 70 75 74 65 64 20 6d 6f 72 65 20 74 68  computed more th
343c0 61 6e 20 6f 6e 63 65 29 0a 20 20 20 20 2a 2a 0a  an once).    **.
343d0 20 20 20 20 2a 2a 20 54 4f 44 4f 3a 20 41 72 65      ** TODO: Are
343e0 20 74 68 65 72 65 20 6f 74 68 65 72 20 72 65 61   there other rea
343f0 73 6f 6e 73 20 62 65 73 69 64 65 20 28 31 29 20  sons beside (1) 
34400 74 6f 20 75 73 65 20 61 20 63 6f 2d 72 6f 75 74  to use a co-rout
34410 69 6e 65 0a 20 20 20 20 2a 2a 20 69 6d 70 6c 65  ine.    ** imple
34420 6d 65 6e 74 61 74 69 6f 6e 3f 0a 20 20 20 20 2a  mentation?.    *
34430 2f 0a 20 20 20 20 69 66 28 20 69 3d 3d 30 0a 20  /.    if( i==0. 
34440 20 20 20 20 26 26 20 28 70 54 61 62 4c 69 73 74      && (pTabList
34450 2d 3e 6e 53 72 63 3d 3d 31 0a 20 20 20 20 20 20  ->nSrc==1.      
34460 20 20 20 20 20 20 7c 7c 20 28 70 54 61 62 4c 69        || (pTabLi
34470 73 74 2d 3e 61 5b 31 5d 2e 66 67 2e 6a 6f 69 6e  st->a[1].fg.join
34480 74 79 70 65 26 28 4a 54 5f 4c 45 46 54 7c 4a 54  type&(JT_LEFT|JT
34490 5f 43 52 4f 53 53 29 29 21 3d 30 29 20 20 2f 2a  _CROSS))!=0)  /*
344a0 20 28 31 29 20 2a 2f 0a 20 20 20 20 29 7b 0a 20   (1) */.    ){. 
344b0 20 20 20 20 20 2f 2a 20 49 6d 70 6c 65 6d 65 6e       /* Implemen
344c0 74 20 61 20 63 6f 2d 72 6f 75 74 69 6e 65 20 74  t a co-routine t
344d0 68 61 74 20 77 69 6c 6c 20 72 65 74 75 72 6e 20  hat will return 
344e0 61 20 73 69 6e 67 6c 65 20 72 6f 77 20 6f 66 20  a single row of 
344f0 74 68 65 20 72 65 73 75 6c 74 0a 20 20 20 20 20  the result.     
34500 20 2a 2a 20 73 65 74 20 6f 6e 20 65 61 63 68 20   ** set on each 
34510 69 6e 76 6f 63 61 74 69 6f 6e 2e 0a 20 20 20 20  invocation..    
34520 20 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61    */.      int a
34530 64 64 72 54 6f 70 20 3d 20 73 71 6c 69 74 65 33  ddrTop = sqlite3
34540 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
34550 76 29 2b 31 3b 0a 20 20 20 20 20 0a 20 20 20 20  v)+1;.     .    
34560 20 20 70 49 74 65 6d 2d 3e 72 65 67 52 65 74 75    pItem->regRetu
34570 72 6e 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  rn = ++pParse->n
34580 4d 65 6d 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  Mem;.      sqlit
34590 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
345a0 4f 50 5f 49 6e 69 74 43 6f 72 6f 75 74 69 6e 65  OP_InitCoroutine
345b0 2c 20 70 49 74 65 6d 2d 3e 72 65 67 52 65 74 75  , pItem->regRetu
345c0 72 6e 2c 20 30 2c 20 61 64 64 72 54 6f 70 29 3b  rn, 0, addrTop);
345d0 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65  .      VdbeComme
345e0 6e 74 28 28 76 2c 20 22 25 73 22 2c 20 70 49 74  nt((v, "%s", pIt
345f0 65 6d 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65 29  em->pTab->zName)
34600 29 3b 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e  );.      pItem->
34610 61 64 64 72 46 69 6c 6c 53 75 62 20 3d 20 61 64  addrFillSub = ad
34620 64 72 54 6f 70 3b 0a 20 20 20 20 20 20 73 71 6c  drTop;.      sql
34630 69 74 65 33 53 65 6c 65 63 74 44 65 73 74 49 6e  ite3SelectDestIn
34640 69 74 28 26 64 65 73 74 2c 20 53 52 54 5f 43 6f  it(&dest, SRT_Co
34650 72 6f 75 74 69 6e 65 2c 20 70 49 74 65 6d 2d 3e  routine, pItem->
34660 72 65 67 52 65 74 75 72 6e 29 3b 0a 20 20 20 20  regReturn);.    
34670 20 20 45 78 70 6c 61 69 6e 51 75 65 72 79 50 6c    ExplainQueryPl
34680 61 6e 28 28 70 50 61 72 73 65 2c 20 31 2c 20 22  an((pParse, 1, "
34690 43 4f 2d 52 4f 55 54 49 4e 45 20 25 75 22 2c 20  CO-ROUTINE %u", 
346a0 70 53 75 62 2d 3e 73 65 6c 49 64 29 29 3b 0a 20  pSub->selId));. 
346b0 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65       sqlite3Sele
346c0 63 74 28 70 50 61 72 73 65 2c 20 70 53 75 62 2c  ct(pParse, pSub,
346d0 20 26 64 65 73 74 29 3b 0a 20 20 20 20 20 20 70   &dest);.      p
346e0 49 74 65 6d 2d 3e 70 54 61 62 2d 3e 6e 52 6f 77  Item->pTab->nRow
346f0 4c 6f 67 45 73 74 20 3d 20 70 53 75 62 2d 3e 6e  LogEst = pSub->n
34700 53 65 6c 65 63 74 52 6f 77 3b 0a 20 20 20 20 20  SelectRow;.     
34710 20 70 49 74 65 6d 2d 3e 66 67 2e 76 69 61 43 6f   pItem->fg.viaCo
34720 72 6f 75 74 69 6e 65 20 3d 20 31 3b 0a 20 20 20  routine = 1;.   
34730 20 20 20 70 49 74 65 6d 2d 3e 72 65 67 52 65 73     pItem->regRes
34740 75 6c 74 20 3d 20 64 65 73 74 2e 69 53 64 73 74  ult = dest.iSdst
34750 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
34760 64 62 65 45 6e 64 43 6f 72 6f 75 74 69 6e 65 28  dbeEndCoroutine(
34770 76 2c 20 70 49 74 65 6d 2d 3e 72 65 67 52 65 74  v, pItem->regRet
34780 75 72 6e 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  urn);.      sqli
34790 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
347a0 76 2c 20 61 64 64 72 54 6f 70 2d 31 29 3b 0a 20  v, addrTop-1);. 
347b0 20 20 20 20 20 73 71 6c 69 74 65 33 43 6c 65 61       sqlite3Clea
347c0 72 54 65 6d 70 52 65 67 43 61 63 68 65 28 70 50  rTempRegCache(pP
347d0 61 72 73 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65  arse);.    }else
347e0 7b 0a 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72  {.      /* Gener
347f0 61 74 65 20 61 20 73 75 62 72 6f 75 74 69 6e 65  ate a subroutine
34800 20 74 68 61 74 20 77 69 6c 6c 20 66 69 6c 6c 20   that will fill 
34810 61 6e 20 65 70 68 65 6d 65 72 61 6c 20 74 61 62  an ephemeral tab
34820 6c 65 20 77 69 74 68 0a 20 20 20 20 20 20 2a 2a  le with.      **
34830 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20   the content of 
34840 74 68 69 73 20 73 75 62 71 75 65 72 79 2e 20 20  this subquery.  
34850 70 49 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53  pItem->addrFillS
34860 75 62 20 77 69 6c 6c 20 70 6f 69 6e 74 0a 20 20  ub will point.  
34870 20 20 20 20 2a 2a 20 74 6f 20 74 68 65 20 61 64      ** to the ad
34880 64 72 65 73 73 20 6f 66 20 74 68 65 20 67 65 6e  dress of the gen
34890 65 72 61 74 65 64 20 73 75 62 72 6f 75 74 69 6e  erated subroutin
348a0 65 2e 20 20 70 49 74 65 6d 2d 3e 72 65 67 52 65  e.  pItem->regRe
348b0 74 75 72 6e 0a 20 20 20 20 20 20 2a 2a 20 69 73  turn.      ** is
348c0 20 61 20 72 65 67 69 73 74 65 72 20 61 6c 6c 6f   a register allo
348d0 63 61 74 65 64 20 74 6f 20 68 6f 6c 64 20 74 68  cated to hold th
348e0 65 20 73 75 62 72 6f 75 74 69 6e 65 20 72 65 74  e subroutine ret
348f0 75 72 6e 20 61 64 64 72 65 73 73 0a 20 20 20 20  urn address.    
34900 20 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 74    */.      int t
34910 6f 70 41 64 64 72 3b 0a 20 20 20 20 20 20 69 6e  opAddr;.      in
34920 74 20 6f 6e 63 65 41 64 64 72 20 3d 20 30 3b 0a  t onceAddr = 0;.
34930 20 20 20 20 20 20 69 6e 74 20 72 65 74 41 64 64        int retAdd
34940 72 3b 0a 20 20 20 20 20 20 73 74 72 75 63 74 20  r;.      struct 
34950 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 50  SrcList_item *pP
34960 72 69 6f 72 3b 0a 0a 20 20 20 20 20 20 74 65 73  rior;..      tes
34970 74 63 61 73 65 28 20 70 49 74 65 6d 2d 3e 61 64  tcase( pItem->ad
34980 64 72 46 69 6c 6c 53 75 62 3d 3d 30 20 29 3b 20  drFillSub==0 ); 
34990 2f 2a 20 54 69 63 6b 65 74 20 63 35 32 62 30 39  /* Ticket c52b09
349a0 63 37 66 33 38 39 30 33 62 31 33 31 31 20 2a 2f  c7f38903b1311 */
349b0 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 72 65  .      pItem->re
349c0 67 52 65 74 75 72 6e 20 3d 20 2b 2b 70 50 61 72  gReturn = ++pPar
349d0 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20  se->nMem;.      
349e0 74 6f 70 41 64 64 72 20 3d 20 73 71 6c 69 74 65  topAddr = sqlite
349f0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
34a00 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 70 49  P_Integer, 0, pI
34a10 74 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e 29 3b  tem->regReturn);
34a20 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 61 64  .      pItem->ad
34a30 64 72 46 69 6c 6c 53 75 62 20 3d 20 74 6f 70 41  drFillSub = topA
34a40 64 64 72 2b 31 3b 0a 20 20 20 20 20 20 69 66 28  ddr+1;.      if(
34a50 20 70 49 74 65 6d 2d 3e 66 67 2e 69 73 43 6f 72   pItem->fg.isCor
34a60 72 65 6c 61 74 65 64 3d 3d 30 20 29 7b 0a 20 20  related==0 ){.  
34a70 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20        /* If the 
34a80 73 75 62 71 75 65 72 79 20 69 73 20 6e 6f 74 20  subquery is not 
34a90 63 6f 72 72 65 6c 61 74 65 64 20 61 6e 64 20 69  correlated and i
34aa0 66 20 77 65 20 61 72 65 20 6e 6f 74 20 69 6e 73  f we are not ins
34ab0 69 64 65 20 6f 66 0a 20 20 20 20 20 20 20 20 2a  ide of.        *
34ac0 2a 20 61 20 74 72 69 67 67 65 72 2c 20 74 68 65  * a trigger, the
34ad0 6e 20 77 65 20 6f 6e 6c 79 20 6e 65 65 64 20 74  n we only need t
34ae0 6f 20 63 6f 6d 70 75 74 65 20 74 68 65 20 76 61  o compute the va
34af0 6c 75 65 20 6f 66 20 74 68 65 20 73 75 62 71 75  lue of the subqu
34b00 65 72 79 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f  ery.        ** o
34b10 6e 63 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  nce. */.        
34b20 6f 6e 63 65 41 64 64 72 20 3d 20 73 71 6c 69 74  onceAddr = sqlit
34b30 65 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20  e3VdbeAddOp0(v, 
34b40 4f 50 5f 4f 6e 63 65 29 3b 20 56 64 62 65 43 6f  OP_Once); VdbeCo
34b50 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20  verage(v);.     
34b60 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
34b70 76 2c 20 22 6d 61 74 65 72 69 61 6c 69 7a 65 20  v, "materialize 
34b80 5c 22 25 73 5c 22 22 2c 20 70 49 74 65 6d 2d 3e  \"%s\"", pItem->
34b90 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20  pTab->zName));. 
34ba0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
34bb0 20 20 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d      VdbeNoopComm
34bc0 65 6e 74 28 28 76 2c 20 22 6d 61 74 65 72 69 61  ent((v, "materia
34bd0 6c 69 7a 65 20 5c 22 25 73 5c 22 22 2c 20 70 49  lize \"%s\"", pI
34be0 74 65 6d 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65  tem->pTab->zName
34bf0 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ));.      }.    
34c00 20 20 70 50 72 69 6f 72 20 3d 20 69 73 53 65 6c    pPrior = isSel
34c10 66 4a 6f 69 6e 56 69 65 77 28 70 54 61 62 4c 69  fJoinView(pTabLi
34c20 73 74 2c 20 70 49 74 65 6d 29 3b 0a 20 20 20 20  st, pItem);.    
34c30 20 20 69 66 28 20 70 50 72 69 6f 72 20 29 7b 0a    if( pPrior ){.
34c40 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
34c50 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
34c60 4f 70 65 6e 44 75 70 2c 20 70 49 74 65 6d 2d 3e  OpenDup, pItem->
34c70 69 43 75 72 73 6f 72 2c 20 70 50 72 69 6f 72 2d  iCursor, pPrior-
34c80 3e 69 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 20  >iCursor);.     
34c90 20 20 20 61 73 73 65 72 74 28 20 70 50 72 69 6f     assert( pPrio
34ca0 72 2d 3e 70 53 65 6c 65 63 74 21 3d 30 20 29 3b  r->pSelect!=0 );
34cb0 0a 20 20 20 20 20 20 20 20 70 53 75 62 2d 3e 6e  .        pSub->n
34cc0 53 65 6c 65 63 74 52 6f 77 20 3d 20 70 50 72 69  SelectRow = pPri
34cd0 6f 72 2d 3e 70 53 65 6c 65 63 74 2d 3e 6e 53 65  or->pSelect->nSe
34ce0 6c 65 63 74 52 6f 77 3b 0a 20 20 20 20 20 20 7d  lectRow;.      }
34cf0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
34d00 6c 69 74 65 33 53 65 6c 65 63 74 44 65 73 74 49  lite3SelectDestI
34d10 6e 69 74 28 26 64 65 73 74 2c 20 53 52 54 5f 45  nit(&dest, SRT_E
34d20 70 68 65 6d 54 61 62 2c 20 70 49 74 65 6d 2d 3e  phemTab, pItem->
34d30 69 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 20 20  iCursor);.      
34d40 20 20 45 78 70 6c 61 69 6e 51 75 65 72 79 50 6c    ExplainQueryPl
34d50 61 6e 28 28 70 50 61 72 73 65 2c 20 31 2c 20 22  an((pParse, 1, "
34d60 4d 41 54 45 52 49 41 4c 49 5a 45 20 25 75 22 2c  MATERIALIZE %u",
34d70 20 70 53 75 62 2d 3e 73 65 6c 49 64 29 29 3b 0a   pSub->selId));.
34d80 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 53          sqlite3S
34d90 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 53  elect(pParse, pS
34da0 75 62 2c 20 26 64 65 73 74 29 3b 0a 20 20 20 20  ub, &dest);.    
34db0 20 20 7d 0a 20 20 20 20 20 20 70 49 74 65 6d 2d    }.      pItem-
34dc0 3e 70 54 61 62 2d 3e 6e 52 6f 77 4c 6f 67 45 73  >pTab->nRowLogEs
34dd0 74 20 3d 20 70 53 75 62 2d 3e 6e 53 65 6c 65 63  t = pSub->nSelec
34de0 74 52 6f 77 3b 0a 20 20 20 20 20 20 69 66 28 20  tRow;.      if( 
34df0 6f 6e 63 65 41 64 64 72 20 29 20 73 71 6c 69 74  onceAddr ) sqlit
34e00 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
34e10 2c 20 6f 6e 63 65 41 64 64 72 29 3b 0a 20 20 20  , onceAddr);.   
34e20 20 20 20 72 65 74 41 64 64 72 20 3d 20 73 71 6c     retAddr = sql
34e30 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
34e40 2c 20 4f 50 5f 52 65 74 75 72 6e 2c 20 70 49 74  , OP_Return, pIt
34e50 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e 29 3b 0a  em->regReturn);.
34e60 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e        VdbeCommen
34e70 74 28 28 76 2c 20 22 65 6e 64 20 25 73 22 2c 20  t((v, "end %s", 
34e80 70 49 74 65 6d 2d 3e 70 54 61 62 2d 3e 7a 4e 61  pItem->pTab->zNa
34e90 6d 65 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  me));.      sqli
34ea0 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 31 28  te3VdbeChangeP1(
34eb0 76 2c 20 74 6f 70 41 64 64 72 2c 20 72 65 74 41  v, topAddr, retA
34ec0 64 64 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ddr);.      sqli
34ed0 74 65 33 43 6c 65 61 72 54 65 6d 70 52 65 67 43  te3ClearTempRegC
34ee0 61 63 68 65 28 70 50 61 72 73 65 29 3b 0a 20 20  ache(pParse);.  
34ef0 20 20 7d 0a 20 20 20 20 69 66 28 20 64 62 2d 3e    }.    if( db->
34f00 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 67  mallocFailed ) g
34f10 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  oto select_end;.
34f20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 48 65 69      pParse->nHei
34f30 67 68 74 20 2d 3d 20 73 71 6c 69 74 65 33 53 65  ght -= sqlite3Se
34f40 6c 65 63 74 45 78 70 72 48 65 69 67 68 74 28 70  lectExprHeight(p
34f50 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 7a  );.    pParse->z
34f60 41 75 74 68 43 6f 6e 74 65 78 74 20 3d 20 7a 53  AuthContext = zS
34f70 61 76 65 64 41 75 74 68 43 6f 6e 74 65 78 74 3b  avedAuthContext;
34f80 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 20 20 2f  .#endif.  }..  /
34f90 2a 20 56 61 72 69 6f 75 73 20 65 6c 65 6d 65 6e  * Various elemen
34fa0 74 73 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54  ts of the SELECT
34fb0 20 63 6f 70 69 65 64 20 69 6e 74 6f 20 6c 6f 63   copied into loc
34fc0 61 6c 20 76 61 72 69 61 62 6c 65 73 20 66 6f 72  al variables for
34fd0 0a 20 20 2a 2a 20 63 6f 6e 76 65 6e 69 65 6e 63  .  ** convenienc
34fe0 65 20 2a 2f 0a 20 20 70 45 4c 69 73 74 20 3d 20  e */.  pEList = 
34ff0 70 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 70 57 68  p->pEList;.  pWh
35000 65 72 65 20 3d 20 70 2d 3e 70 57 68 65 72 65 3b  ere = p->pWhere;
35010 0a 20 20 70 47 72 6f 75 70 42 79 20 3d 20 70 2d  .  pGroupBy = p-
35020 3e 70 47 72 6f 75 70 42 79 3b 0a 20 20 70 48 61  >pGroupBy;.  pHa
35030 76 69 6e 67 20 3d 20 70 2d 3e 70 48 61 76 69 6e  ving = p->pHavin
35040 67 3b 0a 20 20 73 44 69 73 74 69 6e 63 74 2e 69  g;.  sDistinct.i
35050 73 54 6e 63 74 20 3d 20 28 70 2d 3e 73 65 6c 46  sTnct = (p->selF
35060 6c 61 67 73 20 26 20 53 46 5f 44 69 73 74 69 6e  lags & SF_Distin
35070 63 74 29 21 3d 30 3b 0a 0a 23 69 66 20 53 45 4c  ct)!=0;..#if SEL
35080 45 43 54 54 52 41 43 45 5f 45 4e 41 42 4c 45 44  ECTTRACE_ENABLED
35090 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 65  .  if( sqlite3Se
350a0 6c 65 63 74 54 72 61 63 65 20 26 20 30 78 34 30  lectTrace & 0x40
350b0 30 20 29 7b 0a 20 20 20 20 53 45 4c 45 43 54 54  0 ){.    SELECTT
350c0 52 41 43 45 28 30 78 34 30 30 2c 70 50 61 72 73  RACE(0x400,pPars
350d0 65 2c 70 2c 28 22 41 66 74 65 72 20 61 6c 6c 20  e,p,("After all 
350e0 46 52 4f 4d 2d 63 6c 61 75 73 65 20 61 6e 61 6c  FROM-clause anal
350f0 79 73 69 73 3a 5c 6e 22 29 29 3b 0a 20 20 20 20  ysis:\n"));.    
35100 73 71 6c 69 74 65 33 54 72 65 65 56 69 65 77 53  sqlite3TreeViewS
35110 65 6c 65 63 74 28 30 2c 20 70 2c 20 30 29 3b 0a  elect(0, p, 0);.
35120 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a    }.#endif..  /*
35130 20 49 66 20 74 68 65 20 71 75 65 72 79 20 69 73   If the query is
35140 20 44 49 53 54 49 4e 43 54 20 77 69 74 68 20 61   DISTINCT with a
35150 6e 20 4f 52 44 45 52 20 42 59 20 62 75 74 20 69  n ORDER BY but i
35160 73 20 6e 6f 74 20 61 6e 20 61 67 67 72 65 67 61  s not an aggrega
35170 74 65 2c 20 61 6e 64 20 0a 20 20 2a 2a 20 69 66  te, and .  ** if
35180 20 74 68 65 20 73 65 6c 65 63 74 2d 6c 69 73 74   the select-list
35190 20 69 73 20 74 68 65 20 73 61 6d 65 20 61 73 20   is the same as 
351a0 74 68 65 20 4f 52 44 45 52 20 42 59 20 6c 69 73  the ORDER BY lis
351b0 74 2c 20 74 68 65 6e 20 74 68 69 73 20 71 75 65  t, then this que
351c0 72 79 0a 20 20 2a 2a 20 63 61 6e 20 62 65 20 72  ry.  ** can be r
351d0 65 77 72 69 74 74 65 6e 20 61 73 20 61 20 47 52  ewritten as a GR
351e0 4f 55 50 20 42 59 2e 20 49 6e 20 6f 74 68 65 72  OUP BY. In other
351f0 20 77 6f 72 64 73 2c 20 74 68 69 73 3a 0a 20 20   words, this:.  
35200 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c 45  **.  **     SELE
35210 43 54 20 44 49 53 54 49 4e 43 54 20 78 79 7a 20  CT DISTINCT xyz 
35220 46 52 4f 4d 20 2e 2e 2e 20 4f 52 44 45 52 20 42  FROM ... ORDER B
35230 59 20 78 79 7a 0a 20 20 2a 2a 0a 20 20 2a 2a 20  Y xyz.  **.  ** 
35240 69 73 20 74 72 61 6e 73 66 6f 72 6d 65 64 20 74  is transformed t
35250 6f 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20  o:.  **.  **    
35260 20 53 45 4c 45 43 54 20 78 79 7a 20 46 52 4f 4d   SELECT xyz FROM
35270 20 2e 2e 2e 20 47 52 4f 55 50 20 42 59 20 78 79   ... GROUP BY xy
35280 7a 20 4f 52 44 45 52 20 42 59 20 78 79 7a 0a 20  z ORDER BY xyz. 
35290 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 73 65 63   **.  ** The sec
352a0 6f 6e 64 20 66 6f 72 6d 20 69 73 20 70 72 65 66  ond form is pref
352b0 65 72 72 65 64 20 61 73 20 61 20 73 69 6e 67 6c  erred as a singl
352c0 65 20 69 6e 64 65 78 20 28 6f 72 20 74 65 6d 70  e index (or temp
352d0 2d 74 61 62 6c 65 29 20 6d 61 79 20 62 65 20 0a  -table) may be .
352e0 20 20 2a 2a 20 75 73 65 64 20 66 6f 72 20 62 6f    ** used for bo
352f0 74 68 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  th the ORDER BY 
35300 61 6e 64 20 44 49 53 54 49 4e 43 54 20 70 72 6f  and DISTINCT pro
35310 63 65 73 73 69 6e 67 2e 20 41 73 20 6f 72 69 67  cessing. As orig
35320 69 6e 61 6c 6c 79 20 0a 20 20 2a 2a 20 77 72 69  inally .  ** wri
35330 74 74 65 6e 20 74 68 65 20 71 75 65 72 79 20 6d  tten the query m
35340 75 73 74 20 75 73 65 20 61 20 74 65 6d 70 2d 74  ust use a temp-t
35350 61 62 6c 65 20 66 6f 72 20 61 74 20 6c 65 61 73  able for at leas
35360 74 20 6f 6e 65 20 6f 66 20 74 68 65 20 4f 52 44  t one of the ORD
35370 45 52 20 0a 20 20 2a 2a 20 42 59 20 61 6e 64 20  ER .  ** BY and 
35380 44 49 53 54 49 4e 43 54 2c 20 61 6e 64 20 61 6e  DISTINCT, and an
35390 20 69 6e 64 65 78 20 6f 72 20 73 65 70 61 72 61   index or separa
353a0 74 65 20 74 65 6d 70 2d 74 61 62 6c 65 20 66 6f  te temp-table fo
353b0 72 20 74 68 65 20 6f 74 68 65 72 2e 0a 20 20 2a  r the other..  *
353c0 2f 0a 20 20 69 66 28 20 28 70 2d 3e 73 65 6c 46  /.  if( (p->selF
353d0 6c 61 67 73 20 26 20 28 53 46 5f 44 69 73 74 69  lags & (SF_Disti
353e0 6e 63 74 7c 53 46 5f 41 67 67 72 65 67 61 74 65  nct|SF_Aggregate
353f0 29 29 3d 3d 53 46 5f 44 69 73 74 69 6e 63 74 20  ))==SF_Distinct 
35400 0a 20 20 20 26 26 20 73 71 6c 69 74 65 33 45 78  .   && sqlite3Ex
35410 70 72 4c 69 73 74 43 6f 6d 70 61 72 65 28 73 53  prListCompare(sS
35420 6f 72 74 2e 70 4f 72 64 65 72 42 79 2c 20 70 45  ort.pOrderBy, pE
35430 4c 69 73 74 2c 20 2d 31 29 3d 3d 30 0a 20 20 29  List, -1)==0.  )
35440 7b 0a 20 20 20 20 70 2d 3e 73 65 6c 46 6c 61 67  {.    p->selFlag
35450 73 20 26 3d 20 7e 53 46 5f 44 69 73 74 69 6e 63  s &= ~SF_Distinc
35460 74 3b 0a 20 20 20 20 70 47 72 6f 75 70 42 79 20  t;.    pGroupBy 
35470 3d 20 70 2d 3e 70 47 72 6f 75 70 42 79 20 3d 20  = p->pGroupBy = 
35480 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
35490 75 70 28 64 62 2c 20 70 45 4c 69 73 74 2c 20 30  up(db, pEList, 0
354a0 29 3b 0a 20 20 20 20 2f 2a 20 4e 6f 74 69 63 65  );.    /* Notice
354b0 20 74 68 61 74 20 65 76 65 6e 20 74 68 6f 75 67   that even thoug
354c0 68 74 20 53 46 5f 44 69 73 74 69 6e 63 74 20 68  ht SF_Distinct h
354d0 61 73 20 62 65 65 6e 20 63 6c 65 61 72 65 64 20  as been cleared 
354e0 66 72 6f 6d 20 70 2d 3e 73 65 6c 46 6c 61 67 73  from p->selFlags
354f0 2c 0a 20 20 20 20 2a 2a 20 74 68 65 20 73 44 69  ,.    ** the sDi
35500 73 74 69 6e 63 74 2e 69 73 54 6e 63 74 20 69 73  stinct.isTnct is
35510 20 73 74 69 6c 6c 20 73 65 74 2e 20 20 48 65 6e   still set.  Hen
35520 63 65 2c 20 69 73 54 6e 63 74 20 72 65 70 72 65  ce, isTnct repre
35530 73 65 6e 74 73 20 74 68 65 0a 20 20 20 20 2a 2a  sents the.    **
35540 20 6f 72 69 67 69 6e 61 6c 20 73 65 74 74 69 6e   original settin
35550 67 20 6f 66 20 74 68 65 20 53 46 5f 44 69 73 74  g of the SF_Dist
35560 69 6e 63 74 20 66 6c 61 67 2c 20 6e 6f 74 20 74  inct flag, not t
35570 68 65 20 63 75 72 72 65 6e 74 20 73 65 74 74 69  he current setti
35580 6e 67 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74  ng */.    assert
35590 28 20 73 44 69 73 74 69 6e 63 74 2e 69 73 54 6e  ( sDistinct.isTn
355a0 63 74 20 29 3b 0a 0a 23 69 66 20 53 45 4c 45 43  ct );..#if SELEC
355b0 54 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20  TTRACE_ENABLED. 
355c0 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 65     if( sqlite3Se
355d0 6c 65 63 74 54 72 61 63 65 20 26 20 30 78 34 30  lectTrace & 0x40
355e0 30 20 29 7b 0a 20 20 20 20 20 20 53 45 4c 45 43  0 ){.      SELEC
355f0 54 54 52 41 43 45 28 30 78 34 30 30 2c 70 50 61  TTRACE(0x400,pPa
35600 72 73 65 2c 70 2c 28 22 54 72 61 6e 73 66 6f 72  rse,p,("Transfor
35610 6d 20 44 49 53 54 49 4e 43 54 20 69 6e 74 6f 20  m DISTINCT into 
35620 47 52 4f 55 50 20 42 59 3a 5c 6e 22 29 29 3b 0a  GROUP BY:\n"));.
35630 20 20 20 20 20 20 73 71 6c 69 74 65 33 54 72 65        sqlite3Tre
35640 65 56 69 65 77 53 65 6c 65 63 74 28 30 2c 20 70  eViewSelect(0, p
35650 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  , 0);.    }.#end
35660 69 66 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  if.  }..  /* If 
35670 74 68 65 72 65 20 69 73 20 61 6e 20 4f 52 44 45  there is an ORDE
35680 52 20 42 59 20 63 6c 61 75 73 65 2c 20 74 68 65  R BY clause, the
35690 6e 20 63 72 65 61 74 65 20 61 6e 20 65 70 68 65  n create an ephe
356a0 6d 65 72 61 6c 20 69 6e 64 65 78 20 74 6f 0a 20  meral index to. 
356b0 20 2a 2a 20 64 6f 20 74 68 65 20 73 6f 72 74 69   ** do the sorti
356c0 6e 67 2e 20 20 42 75 74 20 74 68 69 73 20 73 6f  ng.  But this so
356d0 72 74 69 6e 67 20 65 70 68 65 6d 65 72 61 6c 20  rting ephemeral 
356e0 69 6e 64 65 78 20 6d 69 67 68 74 20 65 6e 64 20  index might end 
356f0 75 70 0a 20 20 2a 2a 20 62 65 69 6e 67 20 75 6e  up.  ** being un
35700 75 73 65 64 20 69 66 20 74 68 65 20 64 61 74 61  used if the data
35710 20 63 61 6e 20 62 65 20 65 78 74 72 61 63 74 65   can be extracte
35720 64 20 69 6e 20 70 72 65 2d 73 6f 72 74 65 64 20  d in pre-sorted 
35730 6f 72 64 65 72 2e 0a 20 20 2a 2a 20 49 66 20 74  order..  ** If t
35740 68 61 74 20 69 73 20 74 68 65 20 63 61 73 65 2c  hat is the case,
35750 20 74 68 65 6e 20 74 68 65 20 4f 50 5f 4f 70 65   then the OP_Ope
35760 6e 45 70 68 65 6d 65 72 61 6c 20 69 6e 73 74 72  nEphemeral instr
35770 75 63 74 69 6f 6e 20 77 69 6c 6c 20 62 65 0a 20  uction will be. 
35780 20 2a 2a 20 63 68 61 6e 67 65 64 20 74 6f 20 61   ** changed to a
35790 6e 20 4f 50 5f 4e 6f 6f 70 20 6f 6e 63 65 20 77  n OP_Noop once w
357a0 65 20 66 69 67 75 72 65 20 6f 75 74 20 74 68 61  e figure out tha
357b0 74 20 74 68 65 20 73 6f 72 74 69 6e 67 20 69 6e  t the sorting in
357c0 64 65 78 20 69 73 0a 20 20 2a 2a 20 6e 6f 74 20  dex is.  ** not 
357d0 6e 65 65 64 65 64 2e 20 20 54 68 65 20 73 53 6f  needed.  The sSo
357e0 72 74 2e 61 64 64 72 53 6f 72 74 49 6e 64 65 78  rt.addrSortIndex
357f0 20 76 61 72 69 61 62 6c 65 20 69 73 20 75 73 65   variable is use
35800 64 20 74 6f 20 66 61 63 69 6c 69 74 61 74 65 0a  d to facilitate.
35810 20 20 2a 2a 20 74 68 61 74 20 63 68 61 6e 67 65    ** that change
35820 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 73 53 6f  ..  */.  if( sSo
35830 72 74 2e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20  rt.pOrderBy ){. 
35840 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79     KeyInfo *pKey
35850 49 6e 66 6f 3b 0a 20 20 20 20 70 4b 65 79 49 6e  Info;.    pKeyIn
35860 66 6f 20 3d 20 73 71 6c 69 74 65 33 4b 65 79 49  fo = sqlite3KeyI
35870 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74 28  nfoFromExprList(
35880 0a 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2c  .        pParse,
35890 20 73 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 2c   sSort.pOrderBy,
358a0 20 30 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70   0, pEList->nExp
358b0 72 29 3b 0a 20 20 20 20 73 53 6f 72 74 2e 69 45  r);.    sSort.iE
358c0 43 75 72 73 6f 72 20 3d 20 70 50 61 72 73 65 2d  Cursor = pParse-
358d0 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 73 53 6f  >nTab++;.    sSo
358e0 72 74 2e 61 64 64 72 53 6f 72 74 49 6e 64 65 78  rt.addrSortIndex
358f0 20 3d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   =.      sqlite3
35900 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
35910 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 0a  _OpenEphemeral,.
35920 20 20 20 20 20 20 20 20 20 20 73 53 6f 72 74 2e            sSort.
35930 69 45 43 75 72 73 6f 72 2c 20 73 53 6f 72 74 2e  iECursor, sSort.
35940 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 2b  pOrderBy->nExpr+
35950 31 2b 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c  1+pEList->nExpr,
35960 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 28 63   0,.          (c
35970 68 61 72 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50  har*)pKeyInfo, P
35980 34 5f 4b 45 59 49 4e 46 4f 0a 20 20 20 20 20 20  4_KEYINFO.      
35990 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
359a0 73 53 6f 72 74 2e 61 64 64 72 53 6f 72 74 49 6e  sSort.addrSortIn
359b0 64 65 78 20 3d 20 2d 31 3b 0a 20 20 7d 0a 0a 20  dex = -1;.  }.. 
359c0 20 2f 2a 20 49 66 20 74 68 65 20 6f 75 74 70 75   /* If the outpu
359d0 74 20 69 73 20 64 65 73 74 69 6e 65 64 20 66 6f  t is destined fo
359e0 72 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74 61  r a temporary ta
359f0 62 6c 65 2c 20 6f 70 65 6e 20 74 68 61 74 20 74  ble, open that t
35a00 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  able..  */.  if(
35a10 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53   pDest->eDest==S
35a20 52 54 5f 45 70 68 65 6d 54 61 62 20 29 7b 0a 20  RT_EphemTab ){. 
35a30 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
35a40 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45  dOp2(v, OP_OpenE
35a50 70 68 65 6d 65 72 61 6c 2c 20 70 44 65 73 74 2d  phemeral, pDest-
35a60 3e 69 53 44 50 61 72 6d 2c 20 70 45 4c 69 73 74  >iSDParm, pEList
35a70 2d 3e 6e 45 78 70 72 29 3b 0a 20 20 7d 0a 0a 20  ->nExpr);.  }.. 
35a80 20 2f 2a 20 53 65 74 20 74 68 65 20 6c 69 6d 69   /* Set the limi
35a90 74 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 45 6e 64  ter..  */.  iEnd
35aa0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
35ab0 6b 65 4c 61 62 65 6c 28 70 50 61 72 73 65 29 3b  keLabel(pParse);
35ac0 0a 20 20 69 66 28 20 28 70 2d 3e 73 65 6c 46 6c  .  if( (p->selFl
35ad0 61 67 73 20 26 20 53 46 5f 46 69 78 65 64 4c 69  ags & SF_FixedLi
35ae0 6d 69 74 29 3d 3d 30 20 29 7b 0a 20 20 20 20 70  mit)==0 ){.    p
35af0 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 33  ->nSelectRow = 3
35b00 32 30 3b 20 20 2f 2a 20 34 20 62 69 6c 6c 69 6f  20;  /* 4 billio
35b10 6e 20 72 6f 77 73 20 2a 2f 0a 20 20 7d 0a 20 20  n rows */.  }.  
35b20 63 6f 6d 70 75 74 65 4c 69 6d 69 74 52 65 67 69  computeLimitRegi
35b30 73 74 65 72 73 28 70 50 61 72 73 65 2c 20 70 2c  sters(pParse, p,
35b40 20 69 45 6e 64 29 3b 0a 20 20 69 66 28 20 70 2d   iEnd);.  if( p-
35b50 3e 69 4c 69 6d 69 74 3d 3d 30 20 26 26 20 73 53  >iLimit==0 && sS
35b60 6f 72 74 2e 61 64 64 72 53 6f 72 74 49 6e 64 65  ort.addrSortInde
35b70 78 3e 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  x>=0 ){.    sqli
35b80 74 65 33 56 64 62 65 43 68 61 6e 67 65 4f 70 63  te3VdbeChangeOpc
35b90 6f 64 65 28 76 2c 20 73 53 6f 72 74 2e 61 64 64  ode(v, sSort.add
35ba0 72 53 6f 72 74 49 6e 64 65 78 2c 20 4f 50 5f 53  rSortIndex, OP_S
35bb0 6f 72 74 65 72 4f 70 65 6e 29 3b 0a 20 20 20 20  orterOpen);.    
35bc0 73 53 6f 72 74 2e 73 6f 72 74 46 6c 61 67 73 20  sSort.sortFlags 
35bd0 7c 3d 20 53 4f 52 54 46 4c 41 47 5f 55 73 65 53  |= SORTFLAG_UseS
35be0 6f 72 74 65 72 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  orter;.  }..  /*
35bf0 20 4f 70 65 6e 20 61 6e 20 65 70 68 65 6d 65 72   Open an ephemer
35c00 61 6c 20 69 6e 64 65 78 20 74 6f 20 75 73 65 20  al index to use 
35c10 66 6f 72 20 74 68 65 20 64 69 73 74 69 6e 63 74  for the distinct
35c20 20 73 65 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28   set..  */.  if(
35c30 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53   p->selFlags & S
35c40 46 5f 44 69 73 74 69 6e 63 74 20 29 7b 0a 20 20  F_Distinct ){.  
35c50 20 20 73 44 69 73 74 69 6e 63 74 2e 74 61 62 54    sDistinct.tabT
35c60 6e 63 74 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54  nct = pParse->nT
35c70 61 62 2b 2b 3b 0a 20 20 20 20 73 44 69 73 74 69  ab++;.    sDisti
35c80 6e 63 74 2e 61 64 64 72 54 6e 63 74 20 3d 20 73  nct.addrTnct = s
35c90 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
35ca0 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d  (v, OP_OpenEphem
35cb0 65 72 61 6c 2c 0a 20 20 20 20 20 20 20 20 20 20  eral,.          
35cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 73 44 69               sDi
35cd0 73 74 69 6e 63 74 2e 74 61 62 54 6e 63 74 2c 20  stinct.tabTnct, 
35ce0 30 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20  0, 0,.          
35cf0 20 20 20 20 20 20 20 20 20 20 20 20 20 28 63 68               (ch
35d00 61 72 2a 29 73 71 6c 69 74 65 33 4b 65 79 49 6e  ar*)sqlite3KeyIn
35d10 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 70  foFromExprList(p
35d20 50 61 72 73 65 2c 20 70 2d 3e 70 45 4c 69 73 74  Parse, p->pEList
35d30 2c 30 2c 30 29 2c 0a 20 20 20 20 20 20 20 20 20  ,0,0),.         
35d40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 50 34                P4
35d50 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 20 20 73  _KEYINFO);.    s
35d60 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
35d70 50 35 28 76 2c 20 42 54 52 45 45 5f 55 4e 4f 52  P5(v, BTREE_UNOR
35d80 44 45 52 45 44 29 3b 0a 20 20 20 20 73 44 69 73  DERED);.    sDis
35d90 74 69 6e 63 74 2e 65 54 6e 63 74 54 79 70 65 20  tinct.eTnctType 
35da0 3d 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54  = WHERE_DISTINCT
35db0 5f 55 4e 4f 52 44 45 52 45 44 3b 0a 20 20 7d 65  _UNORDERED;.  }e
35dc0 6c 73 65 7b 0a 20 20 20 20 73 44 69 73 74 69 6e  lse{.    sDistin
35dd0 63 74 2e 65 54 6e 63 74 54 79 70 65 20 3d 20 57  ct.eTnctType = W
35de0 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 4e 4f  HERE_DISTINCT_NO
35df0 4f 50 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 21  OP;.  }..  if( !
35e00 69 73 41 67 67 20 26 26 20 70 47 72 6f 75 70 42  isAgg && pGroupB
35e10 79 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 4e  y==0 ){.    /* N
35e20 6f 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63  o aggregate func
35e30 74 69 6f 6e 73 20 61 6e 64 20 6e 6f 20 47 52 4f  tions and no GRO
35e40 55 50 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a  UP BY clause */.
35e50 20 20 20 20 75 31 36 20 77 63 74 72 6c 46 6c 61      u16 wctrlFla
35e60 67 73 20 3d 20 28 73 44 69 73 74 69 6e 63 74 2e  gs = (sDistinct.
35e70 69 73 54 6e 63 74 20 3f 20 57 48 45 52 45 5f 57  isTnct ? WHERE_W
35e80 41 4e 54 5f 44 49 53 54 49 4e 43 54 20 3a 20 30  ANT_DISTINCT : 0
35e90 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ).              
35ea0 20 20 20 20 20 7c 20 28 70 2d 3e 73 65 6c 46 6c       | (p->selFl
35eb0 61 67 73 20 26 20 53 46 5f 46 69 78 65 64 4c 69  ags & SF_FixedLi
35ec0 6d 69 74 29 3b 0a 23 69 66 6e 64 65 66 20 53 51  mit);.#ifndef SQ
35ed0 4c 49 54 45 5f 4f 4d 49 54 5f 57 49 4e 44 4f 57  LITE_OMIT_WINDOW
35ee0 46 55 4e 43 0a 20 20 20 20 57 69 6e 64 6f 77 20  FUNC.    Window 
35ef0 2a 70 57 69 6e 20 3d 20 70 2d 3e 70 57 69 6e 3b  *pWin = p->pWin;
35f00 20 20 20 20 20 20 2f 2a 20 4d 61 73 74 65 72 20        /* Master 
35f10 77 69 6e 64 6f 77 20 6f 62 6a 65 63 74 20 28 6f  window object (o
35f20 72 20 4e 55 4c 4c 29 20 2a 2f 0a 20 20 20 20 69  r NULL) */.    i
35f30 66 28 20 70 57 69 6e 20 29 7b 0a 20 20 20 20 20  f( pWin ){.     
35f40 20 73 71 6c 69 74 65 33 57 69 6e 64 6f 77 43 6f   sqlite3WindowCo
35f50 64 65 49 6e 69 74 28 70 50 61 72 73 65 2c 20 70  deInit(pParse, p
35f60 57 69 6e 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  Win);.    }.#end
35f70 69 66 0a 20 20 20 20 61 73 73 65 72 74 28 20 57  if.    assert( W
35f80 48 45 52 45 5f 55 53 45 5f 4c 49 4d 49 54 3d 3d  HERE_USE_LIMIT==
35f90 53 46 5f 46 69 78 65 64 4c 69 6d 69 74 20 29 3b  SF_FixedLimit );
35fa0 0a 0a 0a 20 20 20 20 2f 2a 20 42 65 67 69 6e 20  ...    /* Begin 
35fb0 74 68 65 20 64 61 74 61 62 61 73 65 20 73 63 61  the database sca
35fc0 6e 2e 20 2a 2f 0a 20 20 20 20 53 45 4c 45 43 54  n. */.    SELECT
35fd0 54 52 41 43 45 28 31 2c 70 50 61 72 73 65 2c 70  TRACE(1,pParse,p
35fe0 2c 28 22 57 68 65 72 65 42 65 67 69 6e 5c 6e 22  ,("WhereBegin\n"
35ff0 29 29 3b 0a 20 20 20 20 70 57 49 6e 66 6f 20 3d  ));.    pWInfo =
36000 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67   sqlite3WhereBeg
36010 69 6e 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c  in(pParse, pTabL
36020 69 73 74 2c 20 70 57 68 65 72 65 2c 20 73 53 6f  ist, pWhere, sSo
36030 72 74 2e 70 4f 72 64 65 72 42 79 2c 0a 20 20 20  rt.pOrderBy,.   
36040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36050 20 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70              p->p
36060 45 4c 69 73 74 2c 20 77 63 74 72 6c 46 6c 61 67  EList, wctrlFlag
36070 73 2c 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77  s, p->nSelectRow
36080 29 3b 0a 20 20 20 20 69 66 28 20 70 57 49 6e 66  );.    if( pWInf
36090 6f 3d 3d 30 20 29 20 67 6f 74 6f 20 73 65 6c 65  o==0 ) goto sele
360a0 63 74 5f 65 6e 64 3b 0a 20 20 20 20 69 66 28 20  ct_end;.    if( 
360b0 73 71 6c 69 74 65 33 57 68 65 72 65 4f 75 74 70  sqlite3WhereOutp
360c0 75 74 52 6f 77 43 6f 75 6e 74 28 70 57 49 6e 66  utRowCount(pWInf
360d0 6f 29 20 3c 20 70 2d 3e 6e 53 65 6c 65 63 74 52  o) < p->nSelectR
360e0 6f 77 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6e  ow ){.      p->n
360f0 53 65 6c 65 63 74 52 6f 77 20 3d 20 73 71 6c 69  SelectRow = sqli
36100 74 65 33 57 68 65 72 65 4f 75 74 70 75 74 52 6f  te3WhereOutputRo
36110 77 43 6f 75 6e 74 28 70 57 49 6e 66 6f 29 3b 0a  wCount(pWInfo);.
36120 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73 44      }.    if( sD
36130 69 73 74 69 6e 63 74 2e 69 73 54 6e 63 74 20 26  istinct.isTnct &
36140 26 20 73 71 6c 69 74 65 33 57 68 65 72 65 49 73  & sqlite3WhereIs
36150 44 69 73 74 69 6e 63 74 28 70 57 49 6e 66 6f 29  Distinct(pWInfo)
36160 20 29 7b 0a 20 20 20 20 20 20 73 44 69 73 74 69   ){.      sDisti
36170 6e 63 74 2e 65 54 6e 63 74 54 79 70 65 20 3d 20  nct.eTnctType = 
36180 73 71 6c 69 74 65 33 57 68 65 72 65 49 73 44 69  sqlite3WhereIsDi
36190 73 74 69 6e 63 74 28 70 57 49 6e 66 6f 29 3b 0a  stinct(pWInfo);.
361a0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73 53      }.    if( sS
361b0 6f 72 74 2e 70 4f 72 64 65 72 42 79 20 29 7b 0a  ort.pOrderBy ){.
361c0 20 20 20 20 20 20 73 53 6f 72 74 2e 6e 4f 42 53        sSort.nOBS
361d0 61 74 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72  at = sqlite3Wher
361e0 65 49 73 4f 72 64 65 72 65 64 28 70 57 49 6e 66  eIsOrdered(pWInf
361f0 6f 29 3b 0a 20 20 20 20 20 20 73 53 6f 72 74 2e  o);.      sSort.
36200 6c 61 62 65 6c 4f 42 4c 6f 70 74 20 3d 20 73 71  labelOBLopt = sq
36210 6c 69 74 65 33 57 68 65 72 65 4f 72 64 65 72 42  lite3WhereOrderB
36220 79 4c 69 6d 69 74 4f 70 74 4c 61 62 65 6c 28 70  yLimitOptLabel(p
36230 57 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 69 66  WInfo);.      if
36240 28 20 73 53 6f 72 74 2e 6e 4f 42 53 61 74 3d 3d  ( sSort.nOBSat==
36250 73 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 2d 3e  sSort.pOrderBy->
36260 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20 20  nExpr ){.       
36270 20 73 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 20   sSort.pOrderBy 
36280 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 0;.      }.   
36290 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 73 6f   }..    /* If so
362a0 72 74 69 6e 67 20 69 6e 64 65 78 20 74 68 61 74  rting index that
362b0 20 77 61 73 20 63 72 65 61 74 65 64 20 62 79 20   was created by 
362c0 61 20 70 72 69 6f 72 20 4f 50 5f 4f 70 65 6e 45  a prior OP_OpenE
362d0 70 68 65 6d 65 72 61 6c 20 0a 20 20 20 20 2a 2a  phemeral .    **
362e0 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 65 6e 64   instruction end
362f0 65 64 20 75 70 20 6e 6f 74 20 62 65 69 6e 67 20  ed up not being 
36300 6e 65 65 64 65 64 2c 20 74 68 65 6e 20 63 68 61  needed, then cha
36310 6e 67 65 20 74 68 65 20 4f 50 5f 4f 70 65 6e 45  nge the OP_OpenE
36320 70 68 65 6d 65 72 61 6c 0a 20 20 20 20 2a 2a 20  phemeral.    ** 
36330 69 6e 74 6f 20 61 6e 20 4f 50 5f 4e 6f 6f 70 2e  into an OP_Noop.
36340 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
36350 73 53 6f 72 74 2e 61 64 64 72 53 6f 72 74 49 6e  sSort.addrSortIn
36360 64 65 78 3e 3d 30 20 26 26 20 73 53 6f 72 74 2e  dex>=0 && sSort.
36370 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 7b 0a 20  pOrderBy==0 ){. 
36380 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
36390 43 68 61 6e 67 65 54 6f 4e 6f 6f 70 28 76 2c 20  ChangeToNoop(v, 
363a0 73 53 6f 72 74 2e 61 64 64 72 53 6f 72 74 49 6e  sSort.addrSortIn
363b0 64 65 78 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  dex);.    }..   
363c0 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69   assert( p->pELi
363d0 73 74 3d 3d 70 45 4c 69 73 74 20 29 3b 0a 23 69  st==pEList );.#i
363e0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
363f0 54 5f 57 49 4e 44 4f 57 46 55 4e 43 0a 20 20 20  T_WINDOWFUNC.   
36400 20 69 66 28 20 70 57 69 6e 20 29 7b 0a 20 20 20   if( pWin ){.   
36410 20 20 20 69 6e 74 20 61 64 64 72 47 6f 73 75 62     int addrGosub
36420 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
36430 6b 65 4c 61 62 65 6c 28 70 50 61 72 73 65 29 3b  keLabel(pParse);
36440 0a 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6e 74  .      int iCont
36450 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
36460 6b 65 4c 61 62 65 6c 28 70 50 61 72 73 65 29 3b  keLabel(pParse);
36470 0a 20 20 20 20 20 20 69 6e 74 20 69 42 72 65 61  .      int iBrea
36480 6b 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  k = sqlite3VdbeM
36490 61 6b 65 4c 61 62 65 6c 28 70 50 61 72 73 65 29  akeLabel(pParse)
364a0 3b 0a 20 20 20 20 20 20 69 6e 74 20 72 65 67 47  ;.      int regG
364b0 6f 73 75 62 20 3d 20 2b 2b 70 50 61 72 73 65 2d  osub = ++pParse-
364c0 3e 6e 4d 65 6d 3b 0a 0a 20 20 20 20 20 20 73 71  >nMem;..      sq
364d0 6c 69 74 65 33 57 69 6e 64 6f 77 43 6f 64 65 53  lite3WindowCodeS
364e0 74 65 70 28 70 50 61 72 73 65 2c 20 70 2c 20 70  tep(pParse, p, p
364f0 57 49 6e 66 6f 2c 20 72 65 67 47 6f 73 75 62 2c  WInfo, regGosub,
36500 20 61 64 64 72 47 6f 73 75 62 29 3b 0a 0a 20 20   addrGosub);..  
36510 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
36520 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f  ddOp2(v, OP_Goto
36530 2c 20 30 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20  , 0, iBreak);.  
36540 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52      sqlite3VdbeR
36550 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61  esolveLabel(v, a
36560 64 64 72 47 6f 73 75 62 29 3b 0a 20 20 20 20 20  ddrGosub);.     
36570 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74   VdbeNoopComment
36580 28 28 76 2c 20 22 69 6e 6e 65 72 2d 6c 6f 6f 70  ((v, "inner-loop
36590 20 73 75 62 72 6f 75 74 69 6e 65 22 29 29 3b 0a   subroutine"));.
365a0 20 20 20 20 20 20 73 53 6f 72 74 2e 6c 61 62 65        sSort.labe
365b0 6c 4f 42 4c 6f 70 74 20 3d 20 30 3b 0a 20 20 20  lOBLopt = 0;.   
365c0 20 20 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f     selectInnerLo
365d0 6f 70 28 70 50 61 72 73 65 2c 20 70 2c 20 2d 31  op(pParse, p, -1
365e0 2c 20 26 73 53 6f 72 74 2c 20 26 73 44 69 73 74  , &sSort, &sDist
365f0 69 6e 63 74 2c 20 70 44 65 73 74 2c 20 69 43 6f  inct, pDest, iCo
36600 6e 74 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20  nt, iBreak);.   
36610 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
36620 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69 43  solveLabel(v, iC
36630 6f 6e 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ont);.      sqli
36640 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
36650 20 4f 50 5f 52 65 74 75 72 6e 2c 20 72 65 67 47   OP_Return, regG
36660 6f 73 75 62 29 3b 0a 20 20 20 20 20 20 56 64 62  osub);.      Vdb
36670 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 65 6e  eComment((v, "en
36680 64 20 69 6e 6e 65 72 2d 6c 6f 6f 70 20 73 75 62  d inner-loop sub
36690 72 6f 75 74 69 6e 65 22 29 29 3b 0a 20 20 20 20  routine"));.    
366a0 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
366b0 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69 42 72  olveLabel(v, iBr
366c0 65 61 6b 29 3b 0a 20 20 20 20 7d 65 6c 73 65 0a  eak);.    }else.
366d0 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
366e0 5f 4f 4d 49 54 5f 57 49 4e 44 4f 57 46 55 4e 43  _OMIT_WINDOWFUNC
366f0 20 2a 2f 0a 20 20 20 20 7b 0a 20 20 20 20 20 20   */.    {.      
36700 2f 2a 20 55 73 65 20 74 68 65 20 73 74 61 6e 64  /* Use the stand
36710 61 72 64 20 69 6e 6e 65 72 20 6c 6f 6f 70 2e 20  ard inner loop. 
36720 2a 2f 0a 20 20 20 20 20 20 73 65 6c 65 63 74 49  */.      selectI
36730 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c  nnerLoop(pParse,
36740 20 70 2c 20 2d 31 2c 20 26 73 53 6f 72 74 2c 20   p, -1, &sSort, 
36750 26 73 44 69 73 74 69 6e 63 74 2c 20 70 44 65 73  &sDistinct, pDes
36760 74 2c 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  t,.          sql
36770 69 74 65 33 57 68 65 72 65 43 6f 6e 74 69 6e 75  ite3WhereContinu
36780 65 4c 61 62 65 6c 28 70 57 49 6e 66 6f 29 2c 0a  eLabel(pWInfo),.
36790 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
367a0 33 57 68 65 72 65 42 72 65 61 6b 4c 61 62 65 6c  3WhereBreakLabel
367b0 28 70 57 49 6e 66 6f 29 29 3b 0a 0a 20 20 20 20  (pWInfo));..    
367c0 20 20 2f 2a 20 45 6e 64 20 74 68 65 20 64 61 74    /* End the dat
367d0 61 62 61 73 65 20 73 63 61 6e 20 6c 6f 6f 70 2e  abase scan loop.
367e0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
367f0 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28  sqlite3WhereEnd(
36800 70 57 49 6e 66 6f 29 3b 0a 20 20 20 20 7d 0a 20  pWInfo);.    }. 
36810 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54   }else{.    /* T
36820 68 69 73 20 63 61 73 65 20 77 68 65 6e 20 74 68  his case when th
36830 65 72 65 20 65 78 69 73 74 20 61 67 67 72 65 67  ere exist aggreg
36840 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 20 6f 72  ate functions or
36850 20 61 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75   a GROUP BY clau
36860 73 65 0a 20 20 20 20 2a 2a 20 6f 72 20 62 6f 74  se.    ** or bot
36870 68 20 2a 2f 0a 20 20 20 20 4e 61 6d 65 43 6f 6e  h */.    NameCon
36880 74 65 78 74 20 73 4e 43 3b 20 20 20 20 2f 2a 20  text sNC;    /* 
36890 4e 61 6d 65 20 63 6f 6e 74 65 78 74 20 66 6f 72  Name context for
368a0 20 70 72 6f 63 65 73 73 69 6e 67 20 61 67 67 72   processing aggr
368b0 65 67 61 74 65 20 69 6e 66 6f 72 6d 61 74 69 6f  egate informatio
368c0 6e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 41 4d  n */.    int iAM
368d0 65 6d 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  em;          /* 
368e0 46 69 72 73 74 20 4d 65 6d 20 61 64 64 72 65 73  First Mem addres
368f0 73 20 66 6f 72 20 73 74 6f 72 69 6e 67 20 63 75  s for storing cu
36900 72 72 65 6e 74 20 47 52 4f 55 50 20 42 59 20 2a  rrent GROUP BY *
36910 2f 0a 20 20 20 20 69 6e 74 20 69 42 4d 65 6d 3b  /.    int iBMem;
36920 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72            /* Fir
36930 73 74 20 4d 65 6d 20 61 64 64 72 65 73 73 20 66  st Mem address f
36940 6f 72 20 70 72 65 76 69 6f 75 73 20 47 52 4f 55  or previous GROU
36950 50 20 42 59 20 2a 2f 0a 20 20 20 20 69 6e 74 20  P BY */.    int 
36960 69 55 73 65 46 6c 61 67 3b 20 20 20 20 20 20 20  iUseFlag;       
36970 2f 2a 20 4d 65 6d 20 61 64 64 72 65 73 73 20 68  /* Mem address h
36980 6f 6c 64 69 6e 67 20 66 6c 61 67 20 69 6e 64 69  olding flag indi
36990 63 61 74 69 6e 67 20 74 68 61 74 20 61 74 20 6c  cating that at l
369a0 65 61 73 74 0a 20 20 20 20 20 20 20 20 20 20 20  east.           
369b0 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20               ** 
369c0 6f 6e 65 20 72 6f 77 20 6f 66 20 74 68 65 20 69  one row of the i
369d0 6e 70 75 74 20 74 6f 20 74 68 65 20 61 67 67 72  nput to the aggr
369e0 65 67 61 74 6f 72 20 68 61 73 20 62 65 65 6e 0a  egator has been.
369f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36a00 20 20 20 20 20 20 20 20 2a 2a 20 70 72 6f 63 65          ** proce
36a10 73 73 65 64 20 2a 2f 0a 20 20 20 20 69 6e 74 20  ssed */.    int 
36a20 69 41 62 6f 72 74 46 6c 61 67 3b 20 20 20 20 20  iAbortFlag;     
36a30 2f 2a 20 4d 65 6d 20 61 64 64 72 65 73 73 20 77  /* Mem address w
36a40 68 69 63 68 20 63 61 75 73 65 73 20 71 75 65 72  hich causes quer
36a50 79 20 61 62 6f 72 74 20 69 66 20 70 6f 73 69 74  y abort if posit
36a60 69 76 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 67  ive */.    int g
36a70 72 6f 75 70 42 79 53 6f 72 74 3b 20 20 20 20 2f  roupBySort;    /
36a80 2a 20 52 6f 77 73 20 63 6f 6d 65 20 66 72 6f 6d  * Rows come from
36a90 20 73 6f 75 72 63 65 20 69 6e 20 47 52 4f 55 50   source in GROUP
36aa0 20 42 59 20 6f 72 64 65 72 20 2a 2f 0a 20 20 20   BY order */.   
36ab0 20 69 6e 74 20 61 64 64 72 45 6e 64 3b 20 20 20   int addrEnd;   
36ac0 20 20 20 20 20 2f 2a 20 45 6e 64 20 6f 66 20 70       /* End of p
36ad0 72 6f 63 65 73 73 69 6e 67 20 66 6f 72 20 74 68  rocessing for th
36ae0 69 73 20 53 45 4c 45 43 54 20 2a 2f 0a 20 20 20  is SELECT */.   
36af0 20 69 6e 74 20 73 6f 72 74 50 54 61 62 20 3d 20   int sortPTab = 
36b00 30 3b 20 20 20 2f 2a 20 50 73 65 75 64 6f 74 61  0;   /* Pseudota
36b10 62 6c 65 20 75 73 65 64 20 74 6f 20 64 65 63 6f  ble used to deco
36b20 64 65 20 73 6f 72 74 69 6e 67 20 72 65 73 75 6c  de sorting resul
36b30 74 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20 73 6f  ts */.    int so
36b40 72 74 4f 75 74 20 3d 20 30 3b 20 20 20 20 2f 2a  rtOut = 0;    /*
36b50 20 4f 75 74 70 75 74 20 72 65 67 69 73 74 65 72   Output register
36b60 20 66 72 6f 6d 20 74 68 65 20 73 6f 72 74 65 72   from the sorter
36b70 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6f 72 64 65   */.    int orde
36b80 72 42 79 47 72 70 20 3d 20 30 3b 20 2f 2a 20 54  rByGrp = 0; /* T
36b90 72 75 65 20 69 66 20 74 68 65 20 47 52 4f 55 50  rue if the GROUP
36ba0 20 42 59 20 61 6e 64 20 4f 52 44 45 52 20 42 59   BY and ORDER BY
36bb0 20 61 72 65 20 74 68 65 20 73 61 6d 65 20 2a 2f   are the same */
36bc0 0a 0a 20 20 20 20 2f 2a 20 52 65 6d 6f 76 65 20  ..    /* Remove 
36bd0 61 6e 79 20 61 6e 64 20 61 6c 6c 20 61 6c 69 61  any and all alia
36be0 73 65 73 20 62 65 74 77 65 65 6e 20 74 68 65 20  ses between the 
36bf0 72 65 73 75 6c 74 20 73 65 74 20 61 6e 64 20 74  result set and t
36c00 68 65 0a 20 20 20 20 2a 2a 20 47 52 4f 55 50 20  he.    ** GROUP 
36c10 42 59 20 63 6c 61 75 73 65 2e 0a 20 20 20 20 2a  BY clause..    *
36c20 2f 0a 20 20 20 20 69 66 28 20 70 47 72 6f 75 70  /.    if( pGroup
36c30 42 79 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  By ){.      int 
36c40 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k;              
36c50 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
36c60 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20  p counter */.   
36c70 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69     struct ExprLi
36c80 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 20  st_item *pItem; 
36c90 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20   /* For looping 
36ca0 6f 76 65 72 20 65 78 70 72 65 73 73 69 6f 6e 20  over expression 
36cb0 69 6e 20 61 20 6c 69 73 74 20 2a 2f 0a 0a 20 20  in a list */..  
36cc0 20 20 20 20 66 6f 72 28 6b 3d 70 2d 3e 70 45 4c      for(k=p->pEL
36cd0 69 73 74 2d 3e 6e 45 78 70 72 2c 20 70 49 74 65  ist->nExpr, pIte
36ce0 6d 3d 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 3b 20  m=p->pEList->a; 
36cf0 6b 3e 30 3b 20 6b 2d 2d 2c 20 70 49 74 65 6d 2b  k>0; k--, pItem+
36d00 2b 29 7b 0a 20 20 20 20 20 20 20 20 70 49 74 65  +){.        pIte
36d10 6d 2d 3e 75 2e 78 2e 69 41 6c 69 61 73 20 3d 20  m->u.x.iAlias = 
36d20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  0;.      }.     
36d30 20 66 6f 72 28 6b 3d 70 47 72 6f 75 70 42 79 2d   for(k=pGroupBy-
36d40 3e 6e 45 78 70 72 2c 20 70 49 74 65 6d 3d 70 47  >nExpr, pItem=pG
36d50 72 6f 75 70 42 79 2d 3e 61 3b 20 6b 3e 30 3b 20  roupBy->a; k>0; 
36d60 6b 2d 2d 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20  k--, pItem++){. 
36d70 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 75 2e         pItem->u.
36d80 78 2e 69 41 6c 69 61 73 20 3d 20 30 3b 0a 20 20  x.iAlias = 0;.  
36d90 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65      }.      asse
36da0 72 74 28 20 36 36 3d 3d 73 71 6c 69 74 65 33 4c  rt( 66==sqlite3L
36db0 6f 67 45 73 74 28 31 30 30 29 20 29 3b 0a 20 20  ogEst(100) );.  
36dc0 20 20 20 20 69 66 28 20 70 2d 3e 6e 53 65 6c 65      if( p->nSele
36dd0 63 74 52 6f 77 3e 36 36 20 29 20 70 2d 3e 6e 53  ctRow>66 ) p->nS
36de0 65 6c 65 63 74 52 6f 77 20 3d 20 36 36 3b 0a 20  electRow = 66;. 
36df0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
36e00 61 73 73 65 72 74 28 20 30 3d 3d 73 71 6c 69 74  assert( 0==sqlit
36e10 65 33 4c 6f 67 45 73 74 28 31 29 20 29 3b 0a 20  e3LogEst(1) );. 
36e20 20 20 20 20 20 70 2d 3e 6e 53 65 6c 65 63 74 52       p->nSelectR
36e30 6f 77 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a 20  ow = 0;.    }.. 
36e40 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69     /* If there i
36e50 73 20 62 6f 74 68 20 61 20 47 52 4f 55 50 20 42  s both a GROUP B
36e60 59 20 61 6e 64 20 61 6e 20 4f 52 44 45 52 20 42  Y and an ORDER B
36e70 59 20 63 6c 61 75 73 65 20 61 6e 64 20 74 68 65  Y clause and the
36e80 79 20 61 72 65 0a 20 20 20 20 2a 2a 20 69 64 65  y are.    ** ide
36e90 6e 74 69 63 61 6c 2c 20 74 68 65 6e 20 69 74 20  ntical, then it 
36ea0 6d 61 79 20 62 65 20 70 6f 73 73 69 62 6c 65 20  may be possible 
36eb0 74 6f 20 64 69 73 61 62 6c 65 20 74 68 65 20 4f  to disable the O
36ec0 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 0a  RDER BY clause .
36ed0 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20 67 72      ** on the gr
36ee0 6f 75 6e 64 73 20 74 68 61 74 20 74 68 65 20 47  ounds that the G
36ef0 52 4f 55 50 20 42 59 20 77 69 6c 6c 20 63 61 75  ROUP BY will cau
36f00 73 65 20 65 6c 65 6d 65 6e 74 73 20 74 6f 20 63  se elements to c
36f10 6f 6d 65 20 6f 75 74 20 0a 20 20 20 20 2a 2a 20  ome out .    ** 
36f20 69 6e 20 74 68 65 20 63 6f 72 72 65 63 74 20 6f  in the correct o
36f30 72 64 65 72 2e 20 49 74 20 61 6c 73 6f 20 6d 61  rder. It also ma
36f40 79 20 6e 6f 74 20 2d 20 74 68 65 20 47 52 4f 55  y not - the GROU
36f50 50 20 42 59 20 6d 69 67 68 74 20 75 73 65 20 61  P BY might use a
36f60 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65  .    ** database
36f70 20 69 6e 64 65 78 20 74 68 61 74 20 63 61 75 73   index that caus
36f80 65 73 20 72 6f 77 73 20 74 6f 20 62 65 20 67 72  es rows to be gr
36f90 6f 75 70 65 64 20 74 6f 67 65 74 68 65 72 20 61  ouped together a
36fa0 73 20 72 65 71 75 69 72 65 64 0a 20 20 20 20 2a  s required.    *
36fb0 2a 20 62 75 74 20 6e 6f 74 20 61 63 74 75 61 6c  * but not actual
36fc0 6c 79 20 73 6f 72 74 65 64 2e 20 45 69 74 68 65  ly sorted. Eithe
36fd0 72 20 77 61 79 2c 20 72 65 63 6f 72 64 20 74 68  r way, record th
36fe0 65 20 66 61 63 74 20 74 68 61 74 20 74 68 65 0a  e fact that the.
36ff0 20 20 20 20 2a 2a 20 4f 52 44 45 52 20 42 59 20      ** ORDER BY 
37000 61 6e 64 20 47 52 4f 55 50 20 42 59 20 63 6c 61  and GROUP BY cla
37010 75 73 65 73 20 61 72 65 20 74 68 65 20 73 61 6d  uses are the sam
37020 65 20 62 79 20 73 65 74 74 69 6e 67 20 74 68 65  e by setting the
37030 20 6f 72 64 65 72 42 79 47 72 70 0a 20 20 20 20   orderByGrp.    
37040 2a 2a 20 76 61 72 69 61 62 6c 65 2e 20 20 2a 2f  ** variable.  */
37050 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
37060 45 78 70 72 4c 69 73 74 43 6f 6d 70 61 72 65 28  ExprListCompare(
37070 70 47 72 6f 75 70 42 79 2c 20 73 53 6f 72 74 2e  pGroupBy, sSort.
37080 70 4f 72 64 65 72 42 79 2c 20 2d 31 29 3d 3d 30  pOrderBy, -1)==0
37090 20 29 7b 0a 20 20 20 20 20 20 6f 72 64 65 72 42   ){.      orderB
370a0 79 47 72 70 20 3d 20 31 3b 0a 20 20 20 20 7d 0a  yGrp = 1;.    }.
370b0 20 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20   .    /* Create 
370c0 61 20 6c 61 62 65 6c 20 74 6f 20 6a 75 6d 70 20  a label to jump 
370d0 74 6f 20 77 68 65 6e 20 77 65 20 77 61 6e 74 20  to when we want 
370e0 74 6f 20 61 62 6f 72 74 20 74 68 65 20 71 75 65  to abort the que
370f0 72 79 20 2a 2f 0a 20 20 20 20 61 64 64 72 45 6e  ry */.    addrEn
37100 64 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  d = sqlite3VdbeM
37110 61 6b 65 4c 61 62 65 6c 28 70 50 61 72 73 65 29  akeLabel(pParse)
37120 3b 0a 0a 20 20 20 20 2f 2a 20 43 6f 6e 76 65 72  ;..    /* Conver
37130 74 20 54 4b 5f 43 4f 4c 55 4d 4e 20 6e 6f 64 65  t TK_COLUMN node
37140 73 20 69 6e 74 6f 20 54 4b 5f 41 47 47 5f 43 4f  s into TK_AGG_CO
37150 4c 55 4d 4e 20 61 6e 64 20 6d 61 6b 65 20 65 6e  LUMN and make en
37160 74 72 69 65 73 20 69 6e 0a 20 20 20 20 2a 2a 20  tries in.    ** 
37170 73 41 67 67 49 6e 66 6f 20 66 6f 72 20 61 6c 6c  sAggInfo for all
37180 20 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e   TK_AGG_FUNCTION
37190 20 6e 6f 64 65 73 20 69 6e 20 65 78 70 72 65 73   nodes in expres
371a0 73 69 6f 6e 73 20 6f 66 20 74 68 65 0a 20 20 20  sions of the.   
371b0 20 2a 2a 20 53 45 4c 45 43 54 20 73 74 61 74 65   ** SELECT state
371c0 6d 65 6e 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ment..    */.   
371d0 20 6d 65 6d 73 65 74 28 26 73 4e 43 2c 20 30 2c   memset(&sNC, 0,
371e0 20 73 69 7a 65 6f 66 28 73 4e 43 29 29 3b 0a 20   sizeof(sNC));. 
371f0 20 20 20 73 4e 43 2e 70 50 61 72 73 65 20 3d 20     sNC.pParse = 
37200 70 50 61 72 73 65 3b 0a 20 20 20 20 73 4e 43 2e  pParse;.    sNC.
37210 70 53 72 63 4c 69 73 74 20 3d 20 70 54 61 62 4c  pSrcList = pTabL
37220 69 73 74 3b 0a 20 20 20 20 73 4e 43 2e 75 4e 43  ist;.    sNC.uNC
37230 2e 70 41 67 67 49 6e 66 6f 20 3d 20 26 73 41 67  .pAggInfo = &sAg
37240 67 49 6e 66 6f 3b 0a 20 20 20 20 56 56 41 5f 4f  gInfo;.    VVA_O
37250 4e 4c 59 28 20 73 4e 43 2e 6e 63 46 6c 61 67 73  NLY( sNC.ncFlags
37260 20 3d 20 4e 43 5f 55 41 67 67 49 6e 66 6f 3b 20   = NC_UAggInfo; 
37270 29 0a 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 6d  ).    sAggInfo.m
37280 6e 52 65 67 20 3d 20 70 50 61 72 73 65 2d 3e 6e  nReg = pParse->n
37290 4d 65 6d 2b 31 3b 0a 20 20 20 20 73 41 67 67 49  Mem+1;.    sAggI
372a0 6e 66 6f 2e 6e 53 6f 72 74 69 6e 67 43 6f 6c 75  nfo.nSortingColu
372b0 6d 6e 20 3d 20 70 47 72 6f 75 70 42 79 20 3f 20  mn = pGroupBy ? 
372c0 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 20  pGroupBy->nExpr 
372d0 3a 20 30 3b 0a 20 20 20 20 73 41 67 67 49 6e 66  : 0;.    sAggInf
372e0 6f 2e 70 47 72 6f 75 70 42 79 20 3d 20 70 47 72  o.pGroupBy = pGr
372f0 6f 75 70 42 79 3b 0a 20 20 20 20 73 71 6c 69 74  oupBy;.    sqlit
37300 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67  e3ExprAnalyzeAgg
37310 4c 69 73 74 28 26 73 4e 43 2c 20 70 45 4c 69 73  List(&sNC, pELis
37320 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  t);.    sqlite3E
37330 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 4c 69 73  xprAnalyzeAggLis
37340 74 28 26 73 4e 43 2c 20 73 53 6f 72 74 2e 70 4f  t(&sNC, sSort.pO
37350 72 64 65 72 42 79 29 3b 0a 20 20 20 20 69 66 28  rderBy);.    if(
37360 20 70 48 61 76 69 6e 67 20 29 7b 0a 20 20 20 20   pHaving ){.    
37370 20 20 69 66 28 20 70 47 72 6f 75 70 42 79 20 29    if( pGroupBy )
37380 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
37390 28 20 70 57 68 65 72 65 3d 3d 70 2d 3e 70 57 68  ( pWhere==p->pWh
373a0 65 72 65 20 29 3b 0a 20 20 20 20 20 20 20 20 61  ere );.        a
373b0 73 73 65 72 74 28 20 70 48 61 76 69 6e 67 3d 3d  ssert( pHaving==
373c0 70 2d 3e 70 48 61 76 69 6e 67 20 29 3b 0a 20 20  p->pHaving );.  
373d0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 47        assert( pG
373e0 72 6f 75 70 42 79 3d 3d 70 2d 3e 70 47 72 6f 75  roupBy==p->pGrou
373f0 70 42 79 20 29 3b 0a 20 20 20 20 20 20 20 20 68  pBy );.        h
37400 61 76 69 6e 67 54 6f 57 68 65 72 65 28 70 50 61  avingToWhere(pPa
37410 72 73 65 2c 20 70 29 3b 0a 20 20 20 20 20 20 20  rse, p);.       
37420 20 70 57 68 65 72 65 20 3d 20 70 2d 3e 70 57 68   pWhere = p->pWh
37430 65 72 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ere;.      }.   
37440 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e     sqlite3ExprAn
37450 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73 28  alyzeAggregates(
37460 26 73 4e 43 2c 20 70 48 61 76 69 6e 67 29 3b 0a  &sNC, pHaving);.
37470 20 20 20 20 7d 0a 20 20 20 20 73 41 67 67 49 6e      }.    sAggIn
37480 66 6f 2e 6e 41 63 63 75 6d 75 6c 61 74 6f 72 20  fo.nAccumulator 
37490 3d 20 73 41 67 67 49 6e 66 6f 2e 6e 43 6f 6c 75  = sAggInfo.nColu
374a0 6d 6e 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 70  mn;.    if( p->p
374b0 47 72 6f 75 70 42 79 3d 3d 30 20 26 26 20 70 2d  GroupBy==0 && p-
374c0 3e 70 48 61 76 69 6e 67 3d 3d 30 20 26 26 20 73  >pHaving==0 && s
374d0 41 67 67 49 6e 66 6f 2e 6e 46 75 6e 63 3d 3d 31  AggInfo.nFunc==1
374e0 20 29 7b 0a 20 20 20 20 20 20 6d 69 6e 4d 61 78   ){.      minMax
374f0 46 6c 61 67 20 3d 20 6d 69 6e 4d 61 78 51 75 65  Flag = minMaxQue
37500 72 79 28 64 62 2c 20 73 41 67 67 49 6e 66 6f 2e  ry(db, sAggInfo.
37510 61 46 75 6e 63 5b 30 5d 2e 70 45 78 70 72 2c 20  aFunc[0].pExpr, 
37520 26 70 4d 69 6e 4d 61 78 4f 72 64 65 72 42 79 29  &pMinMaxOrderBy)
37530 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
37540 20 20 20 6d 69 6e 4d 61 78 46 6c 61 67 20 3d 20     minMaxFlag = 
37550 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4e 4f  WHERE_ORDERBY_NO
37560 52 4d 41 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 20  RMAL;.    }.    
37570 66 6f 72 28 69 3d 30 3b 20 69 3c 73 41 67 67 49  for(i=0; i<sAggI
37580 6e 66 6f 2e 6e 46 75 6e 63 3b 20 69 2b 2b 29 7b  nfo.nFunc; i++){
37590 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 45 78  .      Expr *pEx
375a0 70 72 20 3d 20 73 41 67 67 49 6e 66 6f 2e 61 46  pr = sAggInfo.aF
375b0 75 6e 63 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20  unc[i].pExpr;.  
375c0 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70      assert( !Exp
375d0 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
375e0 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74  pr, EP_xIsSelect
375f0 29 20 29 3b 0a 20 20 20 20 20 20 73 4e 43 2e 6e  ) );.      sNC.n
37600 63 46 6c 61 67 73 20 7c 3d 20 4e 43 5f 49 6e 41  cFlags |= NC_InA
37610 67 67 46 75 6e 63 3b 0a 20 20 20 20 20 20 73 71  ggFunc;.      sq
37620 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65  lite3ExprAnalyze
37630 41 67 67 4c 69 73 74 28 26 73 4e 43 2c 20 70 45  AggList(&sNC, pE
37640 78 70 72 2d 3e 78 2e 70 4c 69 73 74 29 3b 0a 23  xpr->x.pList);.#
37650 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
37660 49 54 5f 57 49 4e 44 4f 57 46 55 4e 43 0a 20 20  IT_WINDOWFUNC.  
37670 20 20 20 20 61 73 73 65 72 74 28 20 21 49 73 57      assert( !IsW
37680 69 6e 64 6f 77 46 75 6e 63 28 70 45 78 70 72 29  indowFunc(pExpr)
37690 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 45 78   );.      if( Ex
376a0 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
376b0 78 70 72 2c 20 45 50 5f 57 69 6e 46 75 6e 63 29  xpr, EP_WinFunc)
376c0 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
376d0 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67  te3ExprAnalyzeAg
376e0 67 72 65 67 61 74 65 73 28 26 73 4e 43 2c 20 70  gregates(&sNC, p
376f0 45 78 70 72 2d 3e 79 2e 70 57 69 6e 2d 3e 70 46  Expr->y.pWin->pF
37700 69 6c 74 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a  ilter);.      }.
37710 23 65 6e 64 69 66 0a 20 20 20 20 20 20 73 4e 43  #endif.      sNC
37720 2e 6e 63 46 6c 61 67 73 20 26 3d 20 7e 4e 43 5f  .ncFlags &= ~NC_
37730 49 6e 41 67 67 46 75 6e 63 3b 0a 20 20 20 20 7d  InAggFunc;.    }
37740 0a 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 6d 78  .    sAggInfo.mx
37750 52 65 67 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d  Reg = pParse->nM
37760 65 6d 3b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e  em;.    if( db->
37770 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 67  mallocFailed ) g
37780 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  oto select_end;.
37790 23 69 66 20 53 45 4c 45 43 54 54 52 41 43 45 5f  #if SELECTTRACE_
377a0 45 4e 41 42 4c 45 44 0a 20 20 20 20 69 66 28 20  ENABLED.    if( 
377b0 73 71 6c 69 74 65 33 53 65 6c 65 63 74 54 72 61  sqlite3SelectTra
377c0 63 65 20 26 20 30 78 34 30 30 20 29 7b 0a 20 20  ce & 0x400 ){.  
377d0 20 20 20 20 69 6e 74 20 69 69 3b 0a 20 20 20 20      int ii;.    
377e0 20 20 53 45 4c 45 43 54 54 52 41 43 45 28 30 78    SELECTTRACE(0x
377f0 34 30 30 2c 70 50 61 72 73 65 2c 70 2c 28 22 41  400,pParse,p,("A
37800 66 74 65 72 20 61 67 67 72 65 67 61 74 65 20 61  fter aggregate a
37810 6e 61 6c 79 73 69 73 3a 5c 6e 22 29 29 3b 0a 20  nalysis:\n"));. 
37820 20 20 20 20 20 73 71 6c 69 74 65 33 54 72 65 65       sqlite3Tree
37830 56 69 65 77 53 65 6c 65 63 74 28 30 2c 20 70 2c  ViewSelect(0, p,
37840 20 30 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69   0);.      for(i
37850 69 3d 30 3b 20 69 69 3c 73 41 67 67 49 6e 66 6f  i=0; ii<sAggInfo
37860 2e 6e 43 6f 6c 75 6d 6e 3b 20 69 69 2b 2b 29 7b  .nColumn; ii++){
37870 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
37880 44 65 62 75 67 50 72 69 6e 74 66 28 22 61 67 67  DebugPrintf("agg
37890 2d 63 6f 6c 75 6d 6e 5b 25 64 5d 20 69 4d 65 6d  -column[%d] iMem
378a0 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  =%d\n",.        
378b0 20 20 20 20 69 69 2c 20 73 41 67 67 49 6e 66 6f      ii, sAggInfo
378c0 2e 61 43 6f 6c 5b 69 69 5d 2e 69 4d 65 6d 29 3b  .aCol[ii].iMem);
378d0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
378e0 54 72 65 65 56 69 65 77 45 78 70 72 28 30 2c 20  TreeViewExpr(0, 
378f0 73 41 67 67 49 6e 66 6f 2e 61 43 6f 6c 5b 69 69  sAggInfo.aCol[ii
37900 5d 2e 70 45 78 70 72 2c 20 30 29 3b 0a 20 20 20  ].pExpr, 0);.   
37910 20 20 20 7d 0a 20 20 20 20 20 20 66 6f 72 28 69     }.      for(i
37920 69 3d 30 3b 20 69 69 3c 73 41 67 67 49 6e 66 6f  i=0; ii<sAggInfo
37930 2e 6e 46 75 6e 63 3b 20 69 69 2b 2b 29 7b 0a 20  .nFunc; ii++){. 
37940 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65         sqlite3De
37950 62 75 67 50 72 69 6e 74 66 28 22 61 67 67 2d 66  bugPrintf("agg-f
37960 75 6e 63 5b 25 64 5d 3a 20 69 4d 65 6d 3d 25 64  unc[%d]: iMem=%d
37970 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
37980 20 69 69 2c 20 73 41 67 67 49 6e 66 6f 2e 61 46   ii, sAggInfo.aF
37990 75 6e 63 5b 69 69 5d 2e 69 4d 65 6d 29 3b 0a 20  unc[ii].iMem);. 
379a0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 54 72         sqlite3Tr
379b0 65 65 56 69 65 77 45 78 70 72 28 30 2c 20 73 41  eeViewExpr(0, sA
379c0 67 67 49 6e 66 6f 2e 61 46 75 6e 63 5b 69 69 5d  ggInfo.aFunc[ii]
379d0 2e 70 45 78 70 72 2c 20 30 29 3b 0a 20 20 20 20  .pExpr, 0);.    
379e0 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66    }.    }.#endif
379f0 0a 0a 0a 20 20 20 20 2f 2a 20 50 72 6f 63 65 73  ...    /* Proces
37a00 73 69 6e 67 20 66 6f 72 20 61 67 67 72 65 67 61  sing for aggrega
37a10 74 65 73 20 77 69 74 68 20 47 52 4f 55 50 20 42  tes with GROUP B
37a20 59 20 69 73 20 76 65 72 79 20 64 69 66 66 65 72  Y is very differ
37a30 65 6e 74 20 61 6e 64 0a 20 20 20 20 2a 2a 20 6d  ent and.    ** m
37a40 75 63 68 20 6d 6f 72 65 20 63 6f 6d 70 6c 65 78  uch more complex
37a50 20 74 68 61 6e 20 61 67 67 72 65 67 61 74 65 73   than aggregates
37a60 20 77 69 74 68 6f 75 74 20 61 20 47 52 4f 55 50   without a GROUP
37a70 20 42 59 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20   BY..    */.    
37a80 69 66 28 20 70 47 72 6f 75 70 42 79 20 29 7b 0a  if( pGroupBy ){.
37a90 20 20 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70        KeyInfo *p
37aa0 4b 65 79 49 6e 66 6f 3b 20 20 2f 2a 20 4b 65 79  KeyInfo;  /* Key
37ab0 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ing information 
37ac0 66 6f 72 20 74 68 65 20 67 72 6f 75 70 20 62 79  for the group by
37ad0 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20 20   clause */.     
37ae0 20 69 6e 74 20 61 64 64 72 31 3b 20 20 20 20 20   int addr1;     
37af0 20 20 20 20 20 2f 2a 20 41 2d 76 73 2d 42 20 63       /* A-vs-B c
37b00 6f 6d 70 61 72 69 73 69 6f 6e 20 6a 75 6d 70 20  omparision jump 
37b10 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64  */.      int add
37b20 72 4f 75 74 70 75 74 52 6f 77 3b 20 20 2f 2a 20  rOutputRow;  /* 
37b30 53 74 61 72 74 20 6f 66 20 73 75 62 72 6f 75 74  Start of subrout
37b40 69 6e 65 20 74 68 61 74 20 6f 75 74 70 75 74 73  ine that outputs
37b50 20 61 20 72 65 73 75 6c 74 20 72 6f 77 20 2a 2f   a result row */
37b60 0a 20 20 20 20 20 20 69 6e 74 20 72 65 67 4f 75  .      int regOu
37b70 74 70 75 74 52 6f 77 3b 20 20 20 2f 2a 20 52 65  tputRow;   /* Re
37b80 74 75 72 6e 20 61 64 64 72 65 73 73 20 72 65 67  turn address reg
37b90 69 73 74 65 72 20 66 6f 72 20 6f 75 74 70 75 74  ister for output
37ba0 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20   subroutine */. 
37bb0 20 20 20 20 20 69 6e 74 20 61 64 64 72 53 65 74       int addrSet
37bc0 41 62 6f 72 74 3b 20 20 20 2f 2a 20 53 65 74 20  Abort;   /* Set 
37bd0 74 68 65 20 61 62 6f 72 74 20 66 6c 61 67 20 61  the abort flag a
37be0 6e 64 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20 20  nd return */.   
37bf0 20 20 20 69 6e 74 20 61 64 64 72 54 6f 70 4f 66     int addrTopOf
37c00 4c 6f 6f 70 3b 20 20 2f 2a 20 54 6f 70 20 6f 66  Loop;  /* Top of
37c10 20 74 68 65 20 69 6e 70 75 74 20 6c 6f 6f 70 20   the input loop 
37c20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64  */.      int add
37c30 72 53 6f 72 74 69 6e 67 49 64 78 3b 20 2f 2a 20  rSortingIdx; /* 
37c40 54 68 65 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d  The OP_OpenEphem
37c50 65 72 61 6c 20 66 6f 72 20 74 68 65 20 73 6f 72  eral for the sor
37c60 74 69 6e 67 20 69 6e 64 65 78 20 2a 2f 0a 20 20  ting index */.  
37c70 20 20 20 20 69 6e 74 20 61 64 64 72 52 65 73 65      int addrRese
37c80 74 3b 20 20 20 20 20 20 2f 2a 20 53 75 62 72 6f  t;      /* Subro
37c90 75 74 69 6e 65 20 66 6f 72 20 72 65 73 65 74 74  utine for resett
37ca0 69 6e 67 20 74 68 65 20 61 63 63 75 6d 75 6c 61  ing the accumula
37cb0 74 6f 72 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  tor */.      int
37cc0 20 72 65 67 52 65 73 65 74 3b 20 20 20 20 20 20   regReset;      
37cd0 20 2f 2a 20 52 65 74 75 72 6e 20 61 64 64 72 65   /* Return addre
37ce0 73 73 20 72 65 67 69 73 74 65 72 20 66 6f 72 20  ss register for 
37cf0 72 65 73 65 74 20 73 75 62 72 6f 75 74 69 6e 65  reset subroutine
37d00 20 2a 2f 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66   */..      /* If
37d10 20 74 68 65 72 65 20 69 73 20 61 20 47 52 4f 55   there is a GROU
37d20 50 20 42 59 20 63 6c 61 75 73 65 20 77 65 20 6d  P BY clause we m
37d30 69 67 68 74 20 6e 65 65 64 20 61 20 73 6f 72 74  ight need a sort
37d40 69 6e 67 20 69 6e 64 65 78 20 74 6f 0a 20 20 20  ing index to.   
37d50 20 20 20 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 20     ** implement 
37d60 69 74 2e 20 20 41 6c 6c 6f 63 61 74 65 20 74 68  it.  Allocate th
37d70 61 74 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78  at sorting index
37d80 20 6e 6f 77 2e 20 20 49 66 20 69 74 20 74 75 72   now.  If it tur
37d90 6e 73 20 6f 75 74 0a 20 20 20 20 20 20 2a 2a 20  ns out.      ** 
37da0 74 68 61 74 20 77 65 20 64 6f 20 6e 6f 74 20 6e  that we do not n
37db0 65 65 64 20 69 74 20 61 66 74 65 72 20 61 6c 6c  eed it after all
37dc0 2c 20 74 68 65 20 4f 50 5f 53 6f 72 74 65 72 4f  , the OP_SorterO
37dd0 70 65 6e 20 69 6e 73 74 72 75 63 74 69 6f 6e 0a  pen instruction.
37de0 20 20 20 20 20 20 2a 2a 20 77 69 6c 6c 20 62 65        ** will be
37df0 20 63 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f 20   converted into 
37e00 61 20 4e 6f 6f 70 2e 20 20 0a 20 20 20 20 20 20  a Noop.  .      
37e10 2a 2f 0a 20 20 20 20 20 20 73 41 67 67 49 6e 66  */.      sAggInf
37e20 6f 2e 73 6f 72 74 69 6e 67 49 64 78 20 3d 20 70  o.sortingIdx = p
37e30 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20  Parse->nTab++;. 
37e40 20 20 20 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20       pKeyInfo = 
37e50 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 46 72  sqlite3KeyInfoFr
37e60 6f 6d 45 78 70 72 4c 69 73 74 28 70 50 61 72 73  omExprList(pPars
37e70 65 2c 70 47 72 6f 75 70 42 79 2c 30 2c 73 41 67  e,pGroupBy,0,sAg
37e80 67 49 6e 66 6f 2e 6e 43 6f 6c 75 6d 6e 29 3b 0a  gInfo.nColumn);.
37e90 20 20 20 20 20 20 61 64 64 72 53 6f 72 74 69 6e        addrSortin
37ea0 67 49 64 78 20 3d 20 73 71 6c 69 74 65 33 56 64  gIdx = sqlite3Vd
37eb0 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 53  beAddOp4(v, OP_S
37ec0 6f 72 74 65 72 4f 70 65 6e 2c 20 0a 20 20 20 20  orterOpen, .    
37ed0 20 20 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 73        sAggInfo.s
37ee0 6f 72 74 69 6e 67 49 64 78 2c 20 73 41 67 67 49  ortingIdx, sAggI
37ef0 6e 66 6f 2e 6e 53 6f 72 74 69 6e 67 43 6f 6c 75  nfo.nSortingColu
37f00 6d 6e 2c 20 0a 20 20 20 20 20 20 20 20 20 20 30  mn, .          0
37f10 2c 20 28 63 68 61 72 2a 29 70 4b 65 79 49 6e 66  , (char*)pKeyInf
37f20 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a  o, P4_KEYINFO);.
37f30 0a 20 20 20 20 20 20 2f 2a 20 49 6e 69 74 69 61  .      /* Initia
37f40 6c 69 7a 65 20 6d 65 6d 6f 72 79 20 6c 6f 63 61  lize memory loca
37f50 74 69 6f 6e 73 20 75 73 65 64 20 62 79 20 47 52  tions used by GR
37f60 4f 55 50 20 42 59 20 61 67 67 72 65 67 61 74 65  OUP BY aggregate
37f70 20 70 72 6f 63 65 73 73 69 6e 67 0a 20 20 20 20   processing.    
37f80 20 20 2a 2f 0a 20 20 20 20 20 20 69 55 73 65 46    */.      iUseF
37f90 6c 61 67 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  lag = ++pParse->
37fa0 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 69 41 62 6f  nMem;.      iAbo
37fb0 72 74 46 6c 61 67 20 3d 20 2b 2b 70 50 61 72 73  rtFlag = ++pPars
37fc0 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 72  e->nMem;.      r
37fd0 65 67 4f 75 74 70 75 74 52 6f 77 20 3d 20 2b 2b  egOutputRow = ++
37fe0 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
37ff0 20 20 20 20 61 64 64 72 4f 75 74 70 75 74 52 6f      addrOutputRo
38000 77 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  w = sqlite3VdbeM
38010 61 6b 65 4c 61 62 65 6c 28 70 50 61 72 73 65 29  akeLabel(pParse)
38020 3b 0a 20 20 20 20 20 20 72 65 67 52 65 73 65 74  ;.      regReset
38030 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
38040 6d 3b 0a 20 20 20 20 20 20 61 64 64 72 52 65 73  m;.      addrRes
38050 65 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  et = sqlite3Vdbe
38060 4d 61 6b 65 4c 61 62 65 6c 28 70 50 61 72 73 65  MakeLabel(pParse
38070 29 3b 0a 20 20 20 20 20 20 69 41 4d 65 6d 20 3d  );.      iAMem =
38080 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 20   pParse->nMem + 
38090 31 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d  1;.      pParse-
380a0 3e 6e 4d 65 6d 20 2b 3d 20 70 47 72 6f 75 70 42  >nMem += pGroupB
380b0 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20  y->nExpr;.      
380c0 69 42 4d 65 6d 20 3d 20 70 50 61 72 73 65 2d 3e  iBMem = pParse->
380d0 6e 4d 65 6d 20 2b 20 31 3b 0a 20 20 20 20 20 20  nMem + 1;.      
380e0 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20  pParse->nMem += 
380f0 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 3b  pGroupBy->nExpr;
38100 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
38110 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
38120 6e 74 65 67 65 72 2c 20 30 2c 20 69 41 62 6f 72  nteger, 0, iAbor
38130 74 46 6c 61 67 29 3b 0a 20 20 20 20 20 20 56 64  tFlag);.      Vd
38140 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 63  beComment((v, "c
38150 6c 65 61 72 20 61 62 6f 72 74 20 66 6c 61 67 22  lear abort flag"
38160 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ));.      sqlite
38170 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
38180 50 5f 4e 75 6c 6c 2c 20 30 2c 20 69 41 4d 65 6d  P_Null, 0, iAMem
38190 2c 20 69 41 4d 65 6d 2b 70 47 72 6f 75 70 42 79  , iAMem+pGroupBy
381a0 2d 3e 6e 45 78 70 72 2d 31 29 3b 0a 0a 20 20 20  ->nExpr-1);..   
381b0 20 20 20 2f 2a 20 42 65 67 69 6e 20 61 20 6c 6f     /* Begin a lo
381c0 6f 70 20 74 68 61 74 20 77 69 6c 6c 20 65 78 74  op that will ext
381d0 72 61 63 74 20 61 6c 6c 20 73 6f 75 72 63 65 20  ract all source 
381e0 72 6f 77 73 20 69 6e 20 47 52 4f 55 50 20 42 59  rows in GROUP BY
381f0 20 6f 72 64 65 72 2e 0a 20 20 20 20 20 20 2a 2a   order..      **
38200 20 54 68 69 73 20 6d 69 67 68 74 20 69 6e 76 6f   This might invo
38210 6c 76 65 20 74 77 6f 20 73 65 70 61 72 61 74 65  lve two separate
38220 20 6c 6f 6f 70 73 20 77 69 74 68 20 61 6e 20 4f   loops with an O
38230 50 5f 53 6f 72 74 20 69 6e 20 62 65 74 77 65 65  P_Sort in betwee
38240 6e 2c 20 6f 72 0a 20 20 20 20 20 20 2a 2a 20 69  n, or.      ** i
38250 74 20 6d 69 67 68 74 20 62 65 20 61 20 73 69 6e  t might be a sin
38260 67 6c 65 20 6c 6f 6f 70 20 74 68 61 74 20 75 73  gle loop that us
38270 65 73 20 61 6e 20 69 6e 64 65 78 20 74 6f 20 65  es an index to e
38280 78 74 72 61 63 74 20 69 6e 66 6f 72 6d 61 74 69  xtract informati
38290 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 69 6e 20 74  on.      ** in t
382a0 68 65 20 72 69 67 68 74 20 6f 72 64 65 72 20 74  he right order t
382b0 6f 20 62 65 67 69 6e 20 77 69 74 68 2e 0a 20 20  o begin with..  
382c0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c      */.      sql
382d0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
382e0 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 52  , OP_Gosub, regR
382f0 65 73 65 74 2c 20 61 64 64 72 52 65 73 65 74 29  eset, addrReset)
38300 3b 0a 20 20 20 20 20 20 53 45 4c 45 43 54 54 52  ;.      SELECTTR
38310 41 43 45 28 31 2c 70 50 61 72 73 65 2c 70 2c 28  ACE(1,pParse,p,(
38320 22 57 68 65 72 65 42 65 67 69 6e 5c 6e 22 29 29  "WhereBegin\n"))
38330 3b 0a 20 20 20 20 20 20 70 57 49 6e 66 6f 20 3d  ;.      pWInfo =