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

Artifact 98362f190fd6f70f8f612f38a898da4e30b086f13f4c5dab8c04c21ae5a61804:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ******.** This f
0180: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 43 20 63  ile contains C c
0190: 6f 64 65 20 72 6f 75 74 69 6e 65 73 20 74 68 61  ode routines tha
01a0: 74 20 61 72 65 20 63 61 6c 6c 65 64 20 62 79 20  t are called by 
01b0: 74 68 65 20 70 61 72 73 65 72 0a 2a 2a 20 74 6f  the parser.** to
01c0: 20 68 61 6e 64 6c 65 20 53 45 4c 45 43 54 20 73   handle SELECT s
01d0: 74 61 74 65 6d 65 6e 74 73 20 69 6e 20 53 51 4c  tatements in SQL
01e0: 69 74 65 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65  ite..*/.#include
01f0: 20 22 73 71 6c 69 74 65 49 6e 74 2e 68 22 0a 0a   "sqliteInt.h"..
0200: 2f 2a 0a 2a 2a 20 54 72 61 63 65 20 6f 75 74 70  /*.** Trace outp
0210: 75 74 20 6d 61 63 72 6f 73 0a 2a 2f 0a 23 69 66  ut macros.*/.#if
0220: 20 53 45 4c 45 43 54 54 52 41 43 45 5f 45 4e 41   SELECTTRACE_ENA
0230: 42 4c 45 44 0a 2f 2a 2a 2a 2f 20 69 6e 74 20 73  BLED./***/ int s
0240: 71 6c 69 74 65 33 53 65 6c 65 63 74 54 72 61 63  qlite3SelectTrac
0250: 65 20 3d 20 30 3b 0a 23 20 64 65 66 69 6e 65 20  e = 0;.# define 
0260: 53 45 4c 45 43 54 54 52 41 43 45 28 4b 2c 50 2c  SELECTTRACE(K,P,
0270: 53 2c 58 29 20 20 5c 0a 20 20 69 66 28 73 71 6c  S,X)  \.  if(sql
0280: 69 74 65 33 53 65 6c 65 63 74 54 72 61 63 65 26  ite3SelectTrace&
0290: 28 4b 29 29 20 20 20 5c 0a 20 20 20 20 73 71 6c  (K))   \.    sql
02a0: 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
02b0: 22 25 75 2f 25 64 2f 25 70 3a 20 22 2c 28 53 29  "%u/%d/%p: ",(S)
02c0: 2d 3e 73 65 6c 49 64 2c 28 50 29 2d 3e 61 64 64  ->selId,(P)->add
02d0: 72 45 78 70 6c 61 69 6e 2c 28 53 29 29 2c 5c 0a  rExplain,(S)),\.
02e0: 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
02f0: 50 72 69 6e 74 66 20 58 0a 23 65 6c 73 65 0a 23  Printf X.#else.#
0300: 20 64 65 66 69 6e 65 20 53 45 4c 45 43 54 54 52   define SELECTTR
0310: 41 43 45 28 4b 2c 50 2c 53 2c 58 29 0a 23 65 6e  ACE(K,P,S,X).#en
0320: 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69  dif.../*.** An i
0330: 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66  nstance of the f
0340: 6f 6c 6c 6f 77 69 6e 67 20 6f 62 6a 65 63 74 20  ollowing object 
0350: 69 73 20 75 73 65 64 20 74 6f 20 72 65 63 6f 72  is used to recor
0360: 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62  d information ab
0370: 6f 75 74 0a 2a 2a 20 68 6f 77 20 74 6f 20 70 72  out.** how to pr
0380: 6f 63 65 73 73 20 74 68 65 20 44 49 53 54 49 4e  ocess the DISTIN
0390: 43 54 20 6b 65 79 77 6f 72 64 2c 20 74 6f 20 73  CT keyword, to s
03a0: 69 6d 70 6c 69 66 79 20 70 61 73 73 69 6e 67 20  implify passing 
03b0: 74 68 61 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  that information
03c0: 0a 2a 2a 20 69 6e 74 6f 20 74 68 65 20 73 65 6c  .** into the sel
03d0: 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 29 20 72  ectInnerLoop() r
03e0: 6f 75 74 69 6e 65 2e 0a 2a 2f 0a 74 79 70 65 64  outine..*/.typed
03f0: 65 66 20 73 74 72 75 63 74 20 44 69 73 74 69 6e  ef struct Distin
0400: 63 74 43 74 78 20 44 69 73 74 69 6e 63 74 43 74  ctCtx DistinctCt
0410: 78 3b 0a 73 74 72 75 63 74 20 44 69 73 74 69 6e  x;.struct Distin
0420: 63 74 43 74 78 20 7b 0a 20 20 75 38 20 69 73 54  ctCtx {.  u8 isT
0430: 6e 63 74 3b 20 20 20 20 20 20 2f 2a 20 54 72 75  nct;      /* Tru
0440: 65 20 69 66 20 74 68 65 20 44 49 53 54 49 4e 43  e if the DISTINC
0450: 54 20 6b 65 79 77 6f 72 64 20 69 73 20 70 72 65  T keyword is pre
0460: 73 65 6e 74 20 2a 2f 0a 20 20 75 38 20 65 54 6e  sent */.  u8 eTn
0470: 63 74 54 79 70 65 3b 20 20 20 2f 2a 20 4f 6e 65  ctType;   /* One
0480: 20 6f 66 20 74 68 65 20 57 48 45 52 45 5f 44 49   of the WHERE_DI
0490: 53 54 49 4e 43 54 5f 2a 20 6f 70 65 72 61 74 6f  STINCT_* operato
04a0: 72 73 20 2a 2f 0a 20 20 69 6e 74 20 74 61 62 54  rs */.  int tabT
04b0: 6e 63 74 3b 20 20 20 20 2f 2a 20 45 70 68 65 6d  nct;    /* Ephem
04c0: 65 72 61 6c 20 74 61 62 6c 65 20 75 73 65 64 20  eral table used 
04d0: 66 6f 72 20 44 49 53 54 49 4e 43 54 20 70 72 6f  for DISTINCT pro
04e0: 63 65 73 73 69 6e 67 20 2a 2f 0a 20 20 69 6e 74  cessing */.  int
04f0: 20 61 64 64 72 54 6e 63 74 3b 20 20 20 2f 2a 20   addrTnct;   /* 
0500: 41 64 64 72 65 73 73 20 6f 66 20 4f 50 5f 4f 70  Address of OP_Op
0510: 65 6e 45 70 68 65 6d 65 72 61 6c 20 6f 70 63 6f  enEphemeral opco
0520: 64 65 20 66 6f 72 20 74 61 62 54 6e 63 74 20 2a  de for tabTnct *
0530: 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69  /.};../*.** An i
0540: 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66  nstance of the f
0550: 6f 6c 6c 6f 77 69 6e 67 20 6f 62 6a 65 63 74 20  ollowing object 
0560: 69 73 20 75 73 65 64 20 74 6f 20 72 65 63 6f 72  is used to recor
0570: 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62  d information ab
0580: 6f 75 74 0a 2a 2a 20 74 68 65 20 4f 52 44 45 52  out.** the ORDER
0590: 20 42 59 20 28 6f 72 20 47 52 4f 55 50 20 42 59   BY (or GROUP BY
05a0: 29 20 63 6c 61 75 73 65 20 6f 66 20 71 75 65 72  ) clause of quer
05b0: 79 20 69 73 20 62 65 69 6e 67 20 63 6f 64 65 64  y is being coded
05c0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 44 65 66  ..**.** The aDef
05d0: 65 72 5b 5d 20 61 72 72 61 79 20 69 73 20 75 73  er[] array is us
05e0: 65 64 20 62 79 20 74 68 65 20 73 6f 72 74 65 72  ed by the sorter
05f0: 2d 72 65 66 65 72 65 6e 63 65 73 20 6f 70 74 69  -references opti
0600: 6d 69 7a 61 74 69 6f 6e 2e 20 46 6f 72 0a 2a 2a  mization. For.**
0610: 20 65 78 61 6d 70 6c 65 2c 20 61 73 73 75 6d 69   example, assumi
0620: 6e 67 20 74 68 65 72 65 20 69 73 20 6e 6f 20 69  ng there is no i
0630: 6e 64 65 78 20 74 68 61 74 20 63 61 6e 20 62 65  ndex that can be
0640: 20 75 73 65 64 20 66 6f 72 20 74 68 65 20 4f 52   used for the OR
0650: 44 45 52 20 42 59 2c 0a 2a 2a 20 66 6f 72 20 74  DER BY,.** for t
0660: 68 65 20 71 75 65 72 79 3a 0a 2a 2a 0a 2a 2a 20  he query:.**.** 
0670: 20 20 20 20 53 45 4c 45 43 54 20 61 2c 20 62 69      SELECT a, bi
0680: 67 62 6c 6f 62 20 46 52 4f 4d 20 74 31 20 4f 52  gblob FROM t1 OR
0690: 44 45 52 20 42 59 20 61 20 4c 49 4d 49 54 20 31  DER BY a LIMIT 1
06a0: 30 3b 0a 2a 2a 0a 2a 2a 20 69 74 20 6d 61 79 20  0;.**.** it may 
06b0: 62 65 20 6d 6f 72 65 20 65 66 66 69 63 69 65 6e  be more efficien
06c0: 74 20 74 6f 20 61 64 64 20 6a 75 73 74 20 74 68  t to add just th
06d0: 65 20 22 61 22 20 76 61 6c 75 65 73 20 74 6f 20  e "a" values to 
06e0: 74 68 65 20 73 6f 72 74 65 72 2c 20 61 6e 64 0a  the sorter, and.
06f0: 2a 2a 20 72 65 74 72 69 65 76 65 20 74 68 65 20  ** retrieve the 
0700: 61 73 73 6f 63 69 61 74 65 64 20 22 62 69 67 62  associated "bigb
0710: 6c 6f 62 22 20 76 61 6c 75 65 73 20 64 69 72 65  lob" values dire
0720: 63 74 6c 79 20 66 72 6f 6d 20 74 61 62 6c 65 20  ctly from table 
0730: 74 31 20 61 73 20 74 68 65 0a 2a 2a 20 31 30 20  t1 as the.** 10 
0740: 73 6d 61 6c 6c 65 73 74 20 22 61 22 20 76 61 6c  smallest "a" val
0750: 75 65 73 20 61 72 65 20 65 78 74 72 61 63 74 65  ues are extracte
0760: 64 20 66 72 6f 6d 20 74 68 65 20 73 6f 72 74 65  d from the sorte
0770: 72 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68  r..**.** When th
0780: 65 20 73 6f 72 74 65 72 2d 72 65 66 65 72 65 6e  e sorter-referen
0790: 63 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20  ce optimization 
07a0: 69 73 20 75 73 65 64 2c 20 74 68 65 72 65 20 69  is used, there i
07b0: 73 20 6f 6e 65 20 65 6e 74 72 79 20 69 6e 20 74  s one entry in t
07c0: 68 65 0a 2a 2a 20 61 44 65 66 65 72 5b 5d 20 61  he.** aDefer[] a
07d0: 72 72 61 79 20 66 6f 72 20 65 61 63 68 20 64 61  rray for each da
07e0: 74 61 62 61 73 65 20 74 61 62 6c 65 20 74 68 61  tabase table tha
07f0: 74 20 6d 61 79 20 62 65 20 72 65 61 64 20 61 73  t may be read as
0800: 20 76 61 6c 75 65 73 20 61 72 65 0a 2a 2a 20 65   values are.** e
0810: 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20 74 68  xtracted from th
0820: 65 20 73 6f 72 74 65 72 2e 0a 2a 2f 0a 74 79 70  e sorter..*/.typ
0830: 65 64 65 66 20 73 74 72 75 63 74 20 53 6f 72 74  edef struct Sort
0840: 43 74 78 20 53 6f 72 74 43 74 78 3b 0a 73 74 72  Ctx SortCtx;.str
0850: 75 63 74 20 53 6f 72 74 43 74 78 20 7b 0a 20 20  uct SortCtx {.  
0860: 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72  ExprList *pOrder
0870: 42 79 3b 20 20 20 2f 2a 20 54 68 65 20 4f 52 44  By;   /* The ORD
0880: 45 52 20 42 59 20 28 6f 72 20 47 52 4f 55 50 20  ER BY (or GROUP 
0890: 42 59 20 63 6c 61 75 73 65 29 20 2a 2f 0a 20 20  BY clause) */.  
08a0: 69 6e 74 20 6e 4f 42 53 61 74 3b 20 20 20 20 20  int nOBSat;     
08b0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
08c0: 6f 66 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d  of ORDER BY term
08d0: 73 20 73 61 74 69 73 66 69 65 64 20 62 79 20 69  s satisfied by i
08e0: 6e 64 69 63 65 73 20 2a 2f 0a 20 20 69 6e 74 20  ndices */.  int 
08f0: 69 45 43 75 72 73 6f 72 3b 20 20 20 20 20 20 20  iECursor;       
0900: 20 20 2f 2a 20 43 75 72 73 6f 72 20 6e 75 6d 62    /* Cursor numb
0910: 65 72 20 66 6f 72 20 74 68 65 20 73 6f 72 74 65  er for the sorte
0920: 72 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 52 65  r */.  int regRe
0930: 74 75 72 6e 3b 20 20 20 20 20 20 20 20 2f 2a 20  turn;        /* 
0940: 52 65 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67  Register holding
0950: 20 62 6c 6f 63 6b 2d 6f 75 74 70 75 74 20 72 65   block-output re
0960: 74 75 72 6e 20 61 64 64 72 65 73 73 20 2a 2f 0a  turn address */.
0970: 20 20 69 6e 74 20 6c 61 62 65 6c 42 6b 4f 75 74    int labelBkOut
0980: 3b 20 20 20 20 20 20 20 2f 2a 20 53 74 61 72 74  ;       /* Start
0990: 20 6c 61 62 65 6c 20 66 6f 72 20 74 68 65 20 62   label for the b
09a0: 6c 6f 63 6b 2d 6f 75 74 70 75 74 20 73 75 62 72  lock-output subr
09b0: 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20  outine */.  int 
09c0: 61 64 64 72 53 6f 72 74 49 6e 64 65 78 3b 20 20  addrSortIndex;  
09d0: 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20    /* Address of 
09e0: 74 68 65 20 4f 50 5f 53 6f 72 74 65 72 4f 70 65  the OP_SorterOpe
09f0: 6e 20 6f 72 20 4f 50 5f 4f 70 65 6e 45 70 68 65  n or OP_OpenEphe
0a00: 6d 65 72 61 6c 20 2a 2f 0a 20 20 69 6e 74 20 6c  meral */.  int l
0a10: 61 62 65 6c 44 6f 6e 65 3b 20 20 20 20 20 20 20  abelDone;       
0a20: 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 77 68   /* Jump here wh
0a30: 65 6e 20 64 6f 6e 65 2c 20 65 78 3a 20 4c 49 4d  en done, ex: LIM
0a40: 49 54 20 72 65 61 63 68 65 64 20 2a 2f 0a 20 20  IT reached */.  
0a50: 69 6e 74 20 6c 61 62 65 6c 4f 42 4c 6f 70 74 3b  int labelOBLopt;
0a60: 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65        /* Jump he
0a70: 72 65 20 77 68 65 6e 20 73 6f 72 74 65 72 20 69  re when sorter i
0a80: 73 20 66 75 6c 6c 20 2a 2f 0a 20 20 75 38 20 73  s full */.  u8 s
0a90: 6f 72 74 46 6c 61 67 73 3b 20 20 20 20 20 20 20  ortFlags;       
0aa0: 20 20 2f 2a 20 5a 65 72 6f 20 6f 72 20 6d 6f 72    /* Zero or mor
0ab0: 65 20 53 4f 52 54 46 4c 41 47 5f 2a 20 62 69 74  e SORTFLAG_* bit
0ac0: 73 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  s */.#ifdef SQLI
0ad0: 54 45 5f 45 4e 41 42 4c 45 5f 53 4f 52 54 45 52  TE_ENABLE_SORTER
0ae0: 5f 52 45 46 45 52 45 4e 43 45 53 0a 20 20 75 38  _REFERENCES.  u8
0af0: 20 6e 44 65 66 65 72 3b 20 20 20 20 20 20 20 20   nDefer;        
0b00: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
0b10: 20 76 61 6c 69 64 20 65 6e 74 72 69 65 73 20 69   valid entries i
0b20: 6e 20 61 44 65 66 65 72 5b 5d 20 2a 2f 0a 20 20  n aDefer[] */.  
0b30: 73 74 72 75 63 74 20 44 65 66 65 72 72 65 64 43  struct DeferredC
0b40: 73 72 20 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a  sr {.    Table *
0b50: 70 54 61 62 3b 20 20 20 20 20 20 20 20 2f 2a 20  pTab;        /* 
0b60: 54 61 62 6c 65 20 64 65 66 69 6e 69 74 69 6f 6e  Table definition
0b70: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 43 73 72   */.    int iCsr
0b80: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43  ;           /* C
0b90: 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 66 6f 72  ursor number for
0ba0: 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 69 6e   table */.    in
0bb0: 74 20 6e 4b 65 79 3b 20 20 20 20 20 20 20 20 20  t nKey;         
0bc0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 50    /* Number of P
0bd0: 4b 20 63 6f 6c 75 6d 6e 73 20 66 6f 72 20 74 61  K columns for ta
0be0: 62 6c 65 20 70 54 61 62 20 28 3e 3d 31 29 20 2a  ble pTab (>=1) *
0bf0: 2f 0a 20 20 7d 20 61 44 65 66 65 72 5b 34 5d 3b  /.  } aDefer[4];
0c00: 0a 23 65 6e 64 69 66 0a 20 20 73 74 72 75 63 74  .#endif.  struct
0c10: 20 52 6f 77 4c 6f 61 64 49 6e 66 6f 20 2a 70 44   RowLoadInfo *pD
0c20: 65 66 65 72 72 65 64 52 6f 77 4c 6f 61 64 3b 20  eferredRowLoad; 
0c30: 20 2f 2a 20 44 65 66 65 72 72 65 64 20 72 6f 77   /* Deferred row
0c40: 20 6c 6f 61 64 69 6e 67 20 69 6e 66 6f 20 6f 72   loading info or
0c50: 20 4e 55 4c 4c 20 2a 2f 0a 7d 3b 0a 23 64 65 66   NULL */.};.#def
0c60: 69 6e 65 20 53 4f 52 54 46 4c 41 47 5f 55 73 65  ine SORTFLAG_Use
0c70: 53 6f 72 74 65 72 20 20 30 78 30 31 20 20 20 2f  Sorter  0x01   /
0c80: 2a 20 55 73 65 20 53 6f 72 74 65 72 4f 70 65 6e  * Use SorterOpen
0c90: 20 69 6e 73 74 65 61 64 20 6f 66 20 4f 70 65 6e   instead of Open
0ca0: 45 70 68 65 6d 65 72 61 6c 20 2a 2f 0a 0a 2f 2a  Ephemeral */../*
0cb0: 0a 2a 2a 20 44 65 6c 65 74 65 20 61 6c 6c 20 74  .** Delete all t
0cc0: 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 20  he content of a 
0cd0: 53 65 6c 65 63 74 20 73 74 72 75 63 74 75 72 65  Select structure
0ce0: 2e 20 20 44 65 61 6c 6c 6f 63 61 74 65 20 74 68  .  Deallocate th
0cf0: 65 20 73 74 72 75 63 74 75 72 65 0a 2a 2a 20 69  e structure.** i
0d00: 74 73 65 6c 66 20 6f 6e 6c 79 20 69 66 20 62 46  tself only if bF
0d10: 72 65 65 20 69 73 20 74 72 75 65 2e 0a 2a 2f 0a  ree is true..*/.
0d20: 73 74 61 74 69 63 20 76 6f 69 64 20 63 6c 65 61  static void clea
0d30: 72 53 65 6c 65 63 74 28 73 71 6c 69 74 65 33 20  rSelect(sqlite3 
0d40: 2a 64 62 2c 20 53 65 6c 65 63 74 20 2a 70 2c 20  *db, Select *p, 
0d50: 69 6e 74 20 62 46 72 65 65 29 7b 0a 20 20 77 68  int bFree){.  wh
0d60: 69 6c 65 28 20 70 20 29 7b 0a 20 20 20 20 53 65  ile( p ){.    Se
0d70: 6c 65 63 74 20 2a 70 50 72 69 6f 72 20 3d 20 70  lect *pPrior = p
0d80: 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 73 71  ->pPrior;.    sq
0d90: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c  lite3ExprListDel
0da0: 65 74 65 28 64 62 2c 20 70 2d 3e 70 45 4c 69 73  ete(db, p->pELis
0db0: 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 53  t);.    sqlite3S
0dc0: 72 63 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c  rcListDelete(db,
0dd0: 20 70 2d 3e 70 53 72 63 29 3b 0a 20 20 20 20 73   p->pSrc);.    s
0de0: 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
0df0: 28 64 62 2c 20 70 2d 3e 70 57 68 65 72 65 29 3b  (db, p->pWhere);
0e00: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
0e10: 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70  ListDelete(db, p
0e20: 2d 3e 70 47 72 6f 75 70 42 79 29 3b 0a 20 20 20  ->pGroupBy);.   
0e30: 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
0e40: 74 65 28 64 62 2c 20 70 2d 3e 70 48 61 76 69 6e  te(db, p->pHavin
0e50: 67 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  g);.    sqlite3E
0e60: 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62  xprListDelete(db
0e70: 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79 29 3b 0a  , p->pOrderBy);.
0e80: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44      sqlite3ExprD
0e90: 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 4c 69  elete(db, p->pLi
0ea0: 6d 69 74 29 3b 0a 23 69 66 6e 64 65 66 20 53 51  mit);.#ifndef SQ
0eb0: 4c 49 54 45 5f 4f 4d 49 54 5f 57 49 4e 44 4f 57  LITE_OMIT_WINDOW
0ec0: 46 55 4e 43 0a 20 20 20 20 69 66 28 20 4f 4b 5f  FUNC.    if( OK_
0ed0: 49 46 5f 41 4c 57 41 59 53 5f 54 52 55 45 28 70  IF_ALWAYS_TRUE(p
0ee0: 2d 3e 70 57 69 6e 44 65 66 6e 29 20 29 7b 0a 20  ->pWinDefn) ){. 
0ef0: 20 20 20 20 20 73 71 6c 69 74 65 33 57 69 6e 64       sqlite3Wind
0f00: 6f 77 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c  owListDelete(db,
0f10: 20 70 2d 3e 70 57 69 6e 44 65 66 6e 29 3b 0a 20   p->pWinDefn);. 
0f20: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
0f30: 69 66 28 20 4f 4b 5f 49 46 5f 41 4c 57 41 59 53  if( OK_IF_ALWAYS
0f40: 5f 54 52 55 45 28 70 2d 3e 70 57 69 74 68 29 20  _TRUE(p->pWith) 
0f50: 29 20 73 71 6c 69 74 65 33 57 69 74 68 44 65 6c  ) sqlite3WithDel
0f60: 65 74 65 28 64 62 2c 20 70 2d 3e 70 57 69 74 68  ete(db, p->pWith
0f70: 29 3b 0a 20 20 20 20 69 66 28 20 62 46 72 65 65  );.    if( bFree
0f80: 20 29 20 73 71 6c 69 74 65 33 44 62 46 72 65 65   ) sqlite3DbFree
0f90: 4e 4e 28 64 62 2c 20 70 29 3b 0a 20 20 20 20 70  NN(db, p);.    p
0fa0: 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20 20 62   = pPrior;.    b
0fb0: 46 72 65 65 20 3d 20 31 3b 0a 20 20 7d 0a 7d 0a  Free = 1;.  }.}.
0fc0: 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a  ./*.** Initializ
0fd0: 65 20 61 20 53 65 6c 65 63 74 44 65 73 74 20 73  e a SelectDest s
0fe0: 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 76 6f 69  tructure..*/.voi
0ff0: 64 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44  d sqlite3SelectD
1000: 65 73 74 49 6e 69 74 28 53 65 6c 65 63 74 44 65  estInit(SelectDe
1010: 73 74 20 2a 70 44 65 73 74 2c 20 69 6e 74 20 65  st *pDest, int e
1020: 44 65 73 74 2c 20 69 6e 74 20 69 50 61 72 6d 29  Dest, int iParm)
1030: 7b 0a 20 20 70 44 65 73 74 2d 3e 65 44 65 73 74  {.  pDest->eDest
1040: 20 3d 20 28 75 38 29 65 44 65 73 74 3b 0a 20 20   = (u8)eDest;.  
1050: 70 44 65 73 74 2d 3e 69 53 44 50 61 72 6d 20 3d  pDest->iSDParm =
1060: 20 69 50 61 72 6d 3b 0a 20 20 70 44 65 73 74 2d   iParm;.  pDest-
1070: 3e 7a 41 66 66 53 64 73 74 20 3d 20 30 3b 0a 20  >zAffSdst = 0;. 
1080: 20 70 44 65 73 74 2d 3e 69 53 64 73 74 20 3d 20   pDest->iSdst = 
1090: 30 3b 0a 20 20 70 44 65 73 74 2d 3e 6e 53 64 73  0;.  pDest->nSds
10a0: 74 20 3d 20 30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  t = 0;.}.../*.**
10b0: 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20   Allocate a new 
10c0: 53 65 6c 65 63 74 20 73 74 72 75 63 74 75 72 65  Select structure
10d0: 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20 70 6f   and return a po
10e0: 69 6e 74 65 72 20 74 6f 20 74 68 61 74 0a 2a 2a  inter to that.**
10f0: 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 53   structure..*/.S
1100: 65 6c 65 63 74 20 2a 73 71 6c 69 74 65 33 53 65  elect *sqlite3Se
1110: 6c 65 63 74 4e 65 77 28 0a 20 20 50 61 72 73 65  lectNew(.  Parse
1120: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
1130: 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
1140: 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  ext */.  ExprLis
1150: 74 20 2a 70 45 4c 69 73 74 2c 20 20 20 20 20 2f  t *pEList,     /
1160: 2a 20 77 68 69 63 68 20 63 6f 6c 75 6d 6e 73 20  * which columns 
1170: 74 6f 20 69 6e 63 6c 75 64 65 20 69 6e 20 74 68  to include in th
1180: 65 20 72 65 73 75 6c 74 20 2a 2f 0a 20 20 53 72  e result */.  Sr
1190: 63 4c 69 73 74 20 2a 70 53 72 63 2c 20 20 20 20  cList *pSrc,    
11a0: 20 20 20 20 2f 2a 20 74 68 65 20 46 52 4f 4d 20      /* the FROM 
11b0: 63 6c 61 75 73 65 20 2d 2d 20 77 68 69 63 68 20  clause -- which 
11c0: 74 61 62 6c 65 73 20 74 6f 20 73 63 61 6e 20 2a  tables to scan *
11d0: 2f 0a 20 20 45 78 70 72 20 2a 70 57 68 65 72 65  /.  Expr *pWhere
11e0: 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 74 68 65  ,         /* the
11f0: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f   WHERE clause */
1200: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 47 72  .  ExprList *pGr
1210: 6f 75 70 42 79 2c 20 20 20 2f 2a 20 74 68 65 20  oupBy,   /* the 
1220: 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 20  GROUP BY clause 
1230: 2a 2f 0a 20 20 45 78 70 72 20 2a 70 48 61 76 69  */.  Expr *pHavi
1240: 6e 67 2c 20 20 20 20 20 20 20 20 2f 2a 20 74 68  ng,        /* th
1250: 65 20 48 41 56 49 4e 47 20 63 6c 61 75 73 65 20  e HAVING clause 
1260: 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
1270: 4f 72 64 65 72 42 79 2c 20 20 20 2f 2a 20 74 68  OrderBy,   /* th
1280: 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
1290: 65 20 2a 2f 0a 20 20 75 33 32 20 73 65 6c 46 6c  e */.  u32 selFl
12a0: 61 67 73 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  ags,         /* 
12b0: 46 6c 61 67 20 70 61 72 61 6d 65 74 65 72 73 2c  Flag parameters,
12c0: 20 73 75 63 68 20 61 73 20 53 46 5f 44 69 73 74   such as SF_Dist
12d0: 69 6e 63 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a  inct */.  Expr *
12e0: 70 4c 69 6d 69 74 20 20 20 20 20 20 20 20 20 20  pLimit          
12f0: 2f 2a 20 4c 49 4d 49 54 20 76 61 6c 75 65 2e 20  /* LIMIT value. 
1300: 20 4e 55 4c 4c 20 6d 65 61 6e 73 20 6e 6f 74 20   NULL means not 
1310: 75 73 65 64 20 2a 2f 0a 29 7b 0a 20 20 53 65 6c  used */.){.  Sel
1320: 65 63 74 20 2a 70 4e 65 77 3b 0a 20 20 53 65 6c  ect *pNew;.  Sel
1330: 65 63 74 20 73 74 61 6e 64 69 6e 3b 0a 20 20 70  ect standin;.  p
1340: 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  New = sqlite3DbM
1350: 61 6c 6c 6f 63 52 61 77 4e 4e 28 70 50 61 72 73  allocRawNN(pPars
1360: 65 2d 3e 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70  e->db, sizeof(*p
1370: 4e 65 77 29 20 29 3b 0a 20 20 69 66 28 20 70 4e  New) );.  if( pN
1380: 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73 73  ew==0 ){.    ass
1390: 65 72 74 28 20 70 50 61 72 73 65 2d 3e 64 62 2d  ert( pParse->db-
13a0: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b  >mallocFailed );
13b0: 0a 20 20 20 20 70 4e 65 77 20 3d 20 26 73 74 61  .    pNew = &sta
13c0: 6e 64 69 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20  ndin;.  }.  if( 
13d0: 70 45 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20  pEList==0 ){.   
13e0: 20 70 45 4c 69 73 74 20 3d 20 73 71 6c 69 74 65   pEList = sqlite
13f0: 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28  3ExprListAppend(
1400: 70 50 61 72 73 65 2c 20 30 2c 0a 20 20 20 20 20  pParse, 0,.     
1410: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1420: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
1430: 6c 69 74 65 33 45 78 70 72 28 70 50 61 72 73 65  lite3Expr(pParse
1440: 2d 3e 64 62 2c 54 4b 5f 41 53 54 45 52 49 53 4b  ->db,TK_ASTERISK
1450: 2c 30 29 29 3b 0a 20 20 7d 0a 20 20 70 4e 65 77  ,0));.  }.  pNew
1460: 2d 3e 70 45 4c 69 73 74 20 3d 20 70 45 4c 69 73  ->pEList = pELis
1470: 74 3b 0a 20 20 70 4e 65 77 2d 3e 6f 70 20 3d 20  t;.  pNew->op = 
1480: 54 4b 5f 53 45 4c 45 43 54 3b 0a 20 20 70 4e 65  TK_SELECT;.  pNe
1490: 77 2d 3e 73 65 6c 46 6c 61 67 73 20 3d 20 73 65  w->selFlags = se
14a0: 6c 46 6c 61 67 73 3b 0a 20 20 70 4e 65 77 2d 3e  lFlags;.  pNew->
14b0: 69 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 70 4e  iLimit = 0;.  pN
14c0: 65 77 2d 3e 69 4f 66 66 73 65 74 20 3d 20 30 3b  ew->iOffset = 0;
14d0: 0a 20 20 70 4e 65 77 2d 3e 73 65 6c 49 64 20 3d  .  pNew->selId =
14e0: 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 53 65 6c 65   ++pParse->nSele
14f0: 63 74 3b 0a 20 20 70 4e 65 77 2d 3e 61 64 64 72  ct;.  pNew->addr
1500: 4f 70 65 6e 45 70 68 6d 5b 30 5d 20 3d 20 2d 31  OpenEphm[0] = -1
1510: 3b 0a 20 20 70 4e 65 77 2d 3e 61 64 64 72 4f 70  ;.  pNew->addrOp
1520: 65 6e 45 70 68 6d 5b 31 5d 20 3d 20 2d 31 3b 0a  enEphm[1] = -1;.
1530: 20 20 70 4e 65 77 2d 3e 6e 53 65 6c 65 63 74 52    pNew->nSelectR
1540: 6f 77 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 53  ow = 0;.  if( pS
1550: 72 63 3d 3d 30 20 29 20 70 53 72 63 20 3d 20 73  rc==0 ) pSrc = s
1560: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65  qlite3DbMallocZe
1570: 72 6f 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 73  ro(pParse->db, s
1580: 69 7a 65 6f 66 28 2a 70 53 72 63 29 29 3b 0a 20  izeof(*pSrc));. 
1590: 20 70 4e 65 77 2d 3e 70 53 72 63 20 3d 20 70 53   pNew->pSrc = pS
15a0: 72 63 3b 0a 20 20 70 4e 65 77 2d 3e 70 57 68 65  rc;.  pNew->pWhe
15b0: 72 65 20 3d 20 70 57 68 65 72 65 3b 0a 20 20 70  re = pWhere;.  p
15c0: 4e 65 77 2d 3e 70 47 72 6f 75 70 42 79 20 3d 20  New->pGroupBy = 
15d0: 70 47 72 6f 75 70 42 79 3b 0a 20 20 70 4e 65 77  pGroupBy;.  pNew
15e0: 2d 3e 70 48 61 76 69 6e 67 20 3d 20 70 48 61 76  ->pHaving = pHav
15f0: 69 6e 67 3b 0a 20 20 70 4e 65 77 2d 3e 70 4f 72  ing;.  pNew->pOr
1600: 64 65 72 42 79 20 3d 20 70 4f 72 64 65 72 42 79  derBy = pOrderBy
1610: 3b 0a 20 20 70 4e 65 77 2d 3e 70 50 72 69 6f 72  ;.  pNew->pPrior
1620: 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 70 4e   = 0;.  pNew->pN
1630: 65 78 74 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d  ext = 0;.  pNew-
1640: 3e 70 4c 69 6d 69 74 20 3d 20 70 4c 69 6d 69 74  >pLimit = pLimit
1650: 3b 0a 20 20 70 4e 65 77 2d 3e 70 57 69 74 68 20  ;.  pNew->pWith 
1660: 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  = 0;.#ifndef SQL
1670: 49 54 45 5f 4f 4d 49 54 5f 57 49 4e 44 4f 57 46  ITE_OMIT_WINDOWF
1680: 55 4e 43 0a 20 20 70 4e 65 77 2d 3e 70 57 69 6e  UNC.  pNew->pWin
1690: 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 70 57   = 0;.  pNew->pW
16a0: 69 6e 44 65 66 6e 20 3d 20 30 3b 0a 23 65 6e 64  inDefn = 0;.#end
16b0: 69 66 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  if.  if( pParse-
16c0: 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
16d0: 64 20 29 20 7b 0a 20 20 20 20 63 6c 65 61 72 53  d ) {.    clearS
16e0: 65 6c 65 63 74 28 70 50 61 72 73 65 2d 3e 64 62  elect(pParse->db
16f0: 2c 20 70 4e 65 77 2c 20 70 4e 65 77 21 3d 26 73  , pNew, pNew!=&s
1700: 74 61 6e 64 69 6e 29 3b 0a 20 20 20 20 70 4e 65  tandin);.    pNe
1710: 77 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a  w = 0;.  }else{.
1720: 20 20 20 20 61 73 73 65 72 74 28 20 70 4e 65 77      assert( pNew
1730: 2d 3e 70 53 72 63 21 3d 30 20 7c 7c 20 70 50 61  ->pSrc!=0 || pPa
1740: 72 73 65 2d 3e 6e 45 72 72 3e 30 20 29 3b 0a 20  rse->nErr>0 );. 
1750: 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 4e 65   }.  assert( pNe
1760: 77 21 3d 26 73 74 61 6e 64 69 6e 20 29 3b 0a 20  w!=&standin );. 
1770: 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a   return pNew;.}.
1780: 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 74  ../*.** Delete t
1790: 68 65 20 67 69 76 65 6e 20 53 65 6c 65 63 74 20  he given Select 
17a0: 73 74 72 75 63 74 75 72 65 20 61 6e 64 20 61 6c  structure and al
17b0: 6c 20 6f 66 20 69 74 73 20 73 75 62 73 74 72 75  l of its substru
17c0: 63 74 75 72 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20  ctures..*/.void 
17d0: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c  sqlite3SelectDel
17e0: 65 74 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  ete(sqlite3 *db,
17f0: 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 69   Select *p){.  i
1800: 66 28 20 4f 4b 5f 49 46 5f 41 4c 57 41 59 53 5f  f( OK_IF_ALWAYS_
1810: 54 52 55 45 28 70 29 20 29 20 63 6c 65 61 72 53  TRUE(p) ) clearS
1820: 65 6c 65 63 74 28 64 62 2c 20 70 2c 20 31 29 3b  elect(db, p, 1);
1830: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
1840: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
1850: 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 53 45 4c  e right-most SEL
1860: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 69 6e  ECT statement in
1870: 20 61 20 63 6f 6d 70 6f 75 6e 64 2e 0a 2a 2f 0a   a compound..*/.
1880: 73 74 61 74 69 63 20 53 65 6c 65 63 74 20 2a 66  static Select *f
1890: 69 6e 64 52 69 67 68 74 6d 6f 73 74 28 53 65 6c  indRightmost(Sel
18a0: 65 63 74 20 2a 70 29 7b 0a 20 20 77 68 69 6c 65  ect *p){.  while
18b0: 28 20 70 2d 3e 70 4e 65 78 74 20 29 20 70 20 3d  ( p->pNext ) p =
18c0: 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 72 65 74   p->pNext;.  ret
18d0: 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn p;.}../*.** 
18e0: 47 69 76 65 6e 20 31 20 74 6f 20 33 20 69 64 65  Given 1 to 3 ide
18f0: 6e 74 69 66 69 65 72 73 20 70 72 65 63 65 64 69  ntifiers precedi
1900: 6e 67 20 74 68 65 20 4a 4f 49 4e 20 6b 65 79 77  ng the JOIN keyw
1910: 6f 72 64 2c 20 64 65 74 65 72 6d 69 6e 65 20 74  ord, determine t
1920: 68 65 0a 2a 2a 20 74 79 70 65 20 6f 66 20 6a 6f  he.** type of jo
1930: 69 6e 2e 20 20 52 65 74 75 72 6e 20 61 6e 20 69  in.  Return an i
1940: 6e 74 65 67 65 72 20 63 6f 6e 73 74 61 6e 74 20  nteger constant 
1950: 74 68 61 74 20 65 78 70 72 65 73 73 65 73 20 74  that expresses t
1960: 68 61 74 20 74 79 70 65 0a 2a 2a 20 69 6e 20 74  hat type.** in t
1970: 65 72 6d 73 20 6f 66 20 74 68 65 20 66 6f 6c 6c  erms of the foll
1980: 6f 77 69 6e 67 20 62 69 74 20 76 61 6c 75 65 73  owing bit values
1990: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 4a 54 5f 49  :.**.**     JT_I
19a0: 4e 4e 45 52 0a 2a 2a 20 20 20 20 20 4a 54 5f 43  NNER.**     JT_C
19b0: 52 4f 53 53 0a 2a 2a 20 20 20 20 20 4a 54 5f 4f  ROSS.**     JT_O
19c0: 55 54 45 52 0a 2a 2a 20 20 20 20 20 4a 54 5f 4e  UTER.**     JT_N
19d0: 41 54 55 52 41 4c 0a 2a 2a 20 20 20 20 20 4a 54  ATURAL.**     JT
19e0: 5f 4c 45 46 54 0a 2a 2a 20 20 20 20 20 4a 54 5f  _LEFT.**     JT_
19f0: 52 49 47 48 54 0a 2a 2a 0a 2a 2a 20 41 20 66 75  RIGHT.**.** A fu
1a00: 6c 6c 20 6f 75 74 65 72 20 6a 6f 69 6e 20 69 73  ll outer join is
1a10: 20 74 68 65 20 63 6f 6d 62 69 6e 61 74 69 6f 6e   the combination
1a20: 20 6f 66 20 4a 54 5f 4c 45 46 54 20 61 6e 64 20   of JT_LEFT and 
1a30: 4a 54 5f 52 49 47 48 54 2e 0a 2a 2a 0a 2a 2a 20  JT_RIGHT..**.** 
1a40: 49 66 20 61 6e 20 69 6c 6c 65 67 61 6c 20 6f 72  If an illegal or
1a50: 20 75 6e 73 75 70 70 6f 72 74 65 64 20 6a 6f 69   unsupported joi
1a60: 6e 20 74 79 70 65 20 69 73 20 73 65 65 6e 2c 20  n type is seen, 
1a70: 74 68 65 6e 20 73 74 69 6c 6c 20 72 65 74 75 72  then still retur
1a80: 6e 0a 2a 2a 20 61 20 6a 6f 69 6e 20 74 79 70 65  n.** a join type
1a90: 2c 20 62 75 74 20 70 75 74 20 61 6e 20 65 72 72  , but put an err
1aa0: 6f 72 20 69 6e 20 74 68 65 20 70 50 61 72 73 65  or in the pParse
1ab0: 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 69   structure..*/.i
1ac0: 6e 74 20 73 71 6c 69 74 65 33 4a 6f 69 6e 54 79  nt sqlite3JoinTy
1ad0: 70 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  pe(Parse *pParse
1ae0: 2c 20 54 6f 6b 65 6e 20 2a 70 41 2c 20 54 6f 6b  , Token *pA, Tok
1af0: 65 6e 20 2a 70 42 2c 20 54 6f 6b 65 6e 20 2a 70  en *pB, Token *p
1b00: 43 29 7b 0a 20 20 69 6e 74 20 6a 6f 69 6e 74 79  C){.  int jointy
1b10: 70 65 20 3d 20 30 3b 0a 20 20 54 6f 6b 65 6e 20  pe = 0;.  Token 
1b20: 2a 61 70 41 6c 6c 5b 33 5d 3b 0a 20 20 54 6f 6b  *apAll[3];.  Tok
1b30: 65 6e 20 2a 70 3b 0a 20 20 20 20 20 20 20 20 20  en *p;.         
1b40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b50: 20 20 20 20 2f 2a 20 20 20 30 31 32 33 34 35 36      /*   0123456
1b60: 37 38 39 20 31 32 33 34 35 36 37 38 39 20 31 32  789 123456789 12
1b70: 33 34 35 36 37 38 39 20 31 32 33 20 2a 2f 0a 20  3456789 123 */. 
1b80: 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68   static const ch
1b90: 61 72 20 7a 4b 65 79 54 65 78 74 5b 5d 20 3d 20  ar zKeyText[] = 
1ba0: 22 6e 61 74 75 72 61 6c 65 66 74 6f 75 74 65 72  "naturaleftouter
1bb0: 69 67 68 74 66 75 6c 6c 69 6e 6e 65 72 63 72 6f  ightfullinnercro
1bc0: 73 73 22 3b 0a 20 20 73 74 61 74 69 63 20 63 6f  ss";.  static co
1bd0: 6e 73 74 20 73 74 72 75 63 74 20 7b 0a 20 20 20  nst struct {.   
1be0: 20 75 38 20 69 3b 20 20 20 20 20 20 20 20 2f 2a   u8 i;        /*
1bf0: 20 42 65 67 69 6e 6e 69 6e 67 20 6f 66 20 6b 65   Beginning of ke
1c00: 79 77 6f 72 64 20 74 65 78 74 20 69 6e 20 7a 4b  yword text in zK
1c10: 65 79 54 65 78 74 5b 5d 20 2a 2f 0a 20 20 20 20  eyText[] */.    
1c20: 75 38 20 6e 43 68 61 72 3b 20 20 20 20 2f 2a 20  u8 nChar;    /* 
1c30: 4c 65 6e 67 74 68 20 6f 66 20 74 68 65 20 6b 65  Length of the ke
1c40: 79 77 6f 72 64 20 69 6e 20 63 68 61 72 61 63 74  yword in charact
1c50: 65 72 73 20 2a 2f 0a 20 20 20 20 75 38 20 63 6f  ers */.    u8 co
1c60: 64 65 3b 20 20 20 20 20 2f 2a 20 4a 6f 69 6e 20  de;     /* Join 
1c70: 74 79 70 65 20 6d 61 73 6b 20 2a 2f 0a 20 20 7d  type mask */.  }
1c80: 20 61 4b 65 79 77 6f 72 64 5b 5d 20 3d 20 7b 0a   aKeyword[] = {.
1c90: 20 20 20 20 2f 2a 20 6e 61 74 75 72 61 6c 20 2a      /* natural *
1ca0: 2f 20 7b 20 30 2c 20 20 37 2c 20 4a 54 5f 4e 41  / { 0,  7, JT_NA
1cb0: 54 55 52 41 4c 20 20 20 20 20 20 20 20 20 20 20  TURAL           
1cc0: 20 20 20 20 20 7d 2c 0a 20 20 20 20 2f 2a 20 6c       },.    /* l
1cd0: 65 66 74 20 20 20 20 2a 2f 20 7b 20 36 2c 20 20  eft    */ { 6,  
1ce0: 34 2c 20 4a 54 5f 4c 45 46 54 7c 4a 54 5f 4f 55  4, JT_LEFT|JT_OU
1cf0: 54 45 52 20 20 20 20 20 20 20 20 20 20 7d 2c 0a  TER          },.
1d00: 20 20 20 20 2f 2a 20 6f 75 74 65 72 20 20 20 2a      /* outer   *
1d10: 2f 20 7b 20 31 30 2c 20 35 2c 20 4a 54 5f 4f 55  / { 10, 5, JT_OU
1d20: 54 45 52 20 20 20 20 20 20 20 20 20 20 20 20 20  TER             
1d30: 20 20 20 20 20 7d 2c 0a 20 20 20 20 2f 2a 20 72       },.    /* r
1d40: 69 67 68 74 20 20 20 2a 2f 20 7b 20 31 34 2c 20  ight   */ { 14, 
1d50: 35 2c 20 4a 54 5f 52 49 47 48 54 7c 4a 54 5f 4f  5, JT_RIGHT|JT_O
1d60: 55 54 45 52 20 20 20 20 20 20 20 20 20 7d 2c 0a  UTER         },.
1d70: 20 20 20 20 2f 2a 20 66 75 6c 6c 20 20 20 20 2a      /* full    *
1d80: 2f 20 7b 20 31 39 2c 20 34 2c 20 4a 54 5f 4c 45  / { 19, 4, JT_LE
1d90: 46 54 7c 4a 54 5f 52 49 47 48 54 7c 4a 54 5f 4f  FT|JT_RIGHT|JT_O
1da0: 55 54 45 52 20 7d 2c 0a 20 20 20 20 2f 2a 20 69  UTER },.    /* i
1db0: 6e 6e 65 72 20 20 20 2a 2f 20 7b 20 32 33 2c 20  nner   */ { 23, 
1dc0: 35 2c 20 4a 54 5f 49 4e 4e 45 52 20 20 20 20 20  5, JT_INNER     
1dd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a               },.
1de0: 20 20 20 20 2f 2a 20 63 72 6f 73 73 20 20 20 2a      /* cross   *
1df0: 2f 20 7b 20 32 38 2c 20 35 2c 20 4a 54 5f 49 4e  / { 28, 5, JT_IN
1e00: 4e 45 52 7c 4a 54 5f 43 52 4f 53 53 20 20 20 20  NER|JT_CROSS    
1e10: 20 20 20 20 20 7d 2c 0a 20 20 7d 3b 0a 20 20 69       },.  };.  i
1e20: 6e 74 20 69 2c 20 6a 3b 0a 20 20 61 70 41 6c 6c  nt i, j;.  apAll
1e30: 5b 30 5d 20 3d 20 70 41 3b 0a 20 20 61 70 41 6c  [0] = pA;.  apAl
1e40: 6c 5b 31 5d 20 3d 20 70 42 3b 0a 20 20 61 70 41  l[1] = pB;.  apA
1e50: 6c 6c 5b 32 5d 20 3d 20 70 43 3b 0a 20 20 66 6f  ll[2] = pC;.  fo
1e60: 72 28 69 3d 30 3b 20 69 3c 33 20 26 26 20 61 70  r(i=0; i<3 && ap
1e70: 41 6c 6c 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20  All[i]; i++){.  
1e80: 20 20 70 20 3d 20 61 70 41 6c 6c 5b 69 5d 3b 0a    p = apAll[i];.
1e90: 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 41      for(j=0; j<A
1ea0: 72 72 61 79 53 69 7a 65 28 61 4b 65 79 77 6f 72  rraySize(aKeywor
1eb0: 64 29 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  d); j++){.      
1ec0: 69 66 28 20 70 2d 3e 6e 3d 3d 61 4b 65 79 77 6f  if( p->n==aKeywo
1ed0: 72 64 5b 6a 5d 2e 6e 43 68 61 72 20 0a 20 20 20  rd[j].nChar .   
1ee0: 20 20 20 20 20 20 20 26 26 20 73 71 6c 69 74 65         && sqlite
1ef0: 33 53 74 72 4e 49 43 6d 70 28 28 63 68 61 72 2a  3StrNICmp((char*
1f00: 29 70 2d 3e 7a 2c 20 26 7a 4b 65 79 54 65 78 74  )p->z, &zKeyText
1f10: 5b 61 4b 65 79 77 6f 72 64 5b 6a 5d 2e 69 5d 2c  [aKeyword[j].i],
1f20: 20 70 2d 3e 6e 29 3d 3d 30 20 29 7b 0a 20 20 20   p->n)==0 ){.   
1f30: 20 20 20 20 20 6a 6f 69 6e 74 79 70 65 20 7c 3d       jointype |=
1f40: 20 61 4b 65 79 77 6f 72 64 5b 6a 5d 2e 63 6f 64   aKeyword[j].cod
1f50: 65 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  e;.        break
1f60: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1f70: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 3d      testcase( j=
1f80: 3d 30 20 7c 7c 20 6a 3d 3d 31 20 7c 7c 20 6a 3d  =0 || j==1 || j=
1f90: 3d 32 20 7c 7c 20 6a 3d 3d 33 20 7c 7c 20 6a 3d  =2 || j==3 || j=
1fa0: 3d 34 20 7c 7c 20 6a 3d 3d 35 20 7c 7c 20 6a 3d  =4 || j==5 || j=
1fb0: 3d 36 20 29 3b 0a 20 20 20 20 69 66 28 20 6a 3e  =6 );.    if( j>
1fc0: 3d 41 72 72 61 79 53 69 7a 65 28 61 4b 65 79 77  =ArraySize(aKeyw
1fd0: 6f 72 64 29 20 29 7b 0a 20 20 20 20 20 20 6a 6f  ord) ){.      jo
1fe0: 69 6e 74 79 70 65 20 7c 3d 20 4a 54 5f 45 52 52  intype |= JT_ERR
1ff0: 4f 52 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  OR;.      break;
2000: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
2010: 0a 20 20 20 20 20 28 6a 6f 69 6e 74 79 70 65 20  .     (jointype 
2020: 26 20 28 4a 54 5f 49 4e 4e 45 52 7c 4a 54 5f 4f  & (JT_INNER|JT_O
2030: 55 54 45 52 29 29 3d 3d 28 4a 54 5f 49 4e 4e 45  UTER))==(JT_INNE
2040: 52 7c 4a 54 5f 4f 55 54 45 52 29 20 7c 7c 0a 20  R|JT_OUTER) ||. 
2050: 20 20 20 20 28 6a 6f 69 6e 74 79 70 65 20 26 20      (jointype & 
2060: 4a 54 5f 45 52 52 4f 52 29 21 3d 30 0a 20 20 29  JT_ERROR)!=0.  )
2070: 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  {.    const char
2080: 20 2a 7a 53 70 20 3d 20 22 20 22 3b 0a 20 20 20   *zSp = " ";.   
2090: 20 61 73 73 65 72 74 28 20 70 42 21 3d 30 20 29   assert( pB!=0 )
20a0: 3b 0a 20 20 20 20 69 66 28 20 70 43 3d 3d 30 20  ;.    if( pC==0 
20b0: 29 7b 20 7a 53 70 2b 2b 3b 20 7d 0a 20 20 20 20  ){ zSp++; }.    
20c0: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
20d0: 70 50 61 72 73 65 2c 20 22 75 6e 6b 6e 6f 77 6e  pParse, "unknown
20e0: 20 6f 72 20 75 6e 73 75 70 70 6f 72 74 65 64 20   or unsupported 
20f0: 6a 6f 69 6e 20 74 79 70 65 3a 20 22 0a 20 20 20  join type: ".   
2100: 20 20 20 20 22 25 54 20 25 54 25 73 25 54 22 2c      "%T %T%s%T",
2110: 20 70 41 2c 20 70 42 2c 20 7a 53 70 2c 20 70 43   pA, pB, zSp, pC
2120: 29 3b 0a 20 20 20 20 6a 6f 69 6e 74 79 70 65 20  );.    jointype 
2130: 3d 20 4a 54 5f 49 4e 4e 45 52 3b 0a 20 20 7d 65  = JT_INNER;.  }e
2140: 6c 73 65 20 69 66 28 20 28 6a 6f 69 6e 74 79 70  lse if( (jointyp
2150: 65 20 26 20 4a 54 5f 4f 55 54 45 52 29 21 3d 30  e & JT_OUTER)!=0
2160: 20 0a 20 20 20 20 20 20 20 20 20 26 26 20 28 6a   .         && (j
2170: 6f 69 6e 74 79 70 65 20 26 20 28 4a 54 5f 4c 45  ointype & (JT_LE
2180: 46 54 7c 4a 54 5f 52 49 47 48 54 29 29 21 3d 4a  FT|JT_RIGHT))!=J
2190: 54 5f 4c 45 46 54 20 29 7b 0a 20 20 20 20 73 71  T_LEFT ){.    sq
21a0: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
21b0: 61 72 73 65 2c 20 0a 20 20 20 20 20 20 22 52 49  arse, .      "RI
21c0: 47 48 54 20 61 6e 64 20 46 55 4c 4c 20 4f 55 54  GHT and FULL OUT
21d0: 45 52 20 4a 4f 49 4e 73 20 61 72 65 20 6e 6f 74  ER JOINs are not
21e0: 20 63 75 72 72 65 6e 74 6c 79 20 73 75 70 70 6f   currently suppo
21f0: 72 74 65 64 22 29 3b 0a 20 20 20 20 6a 6f 69 6e  rted");.    join
2200: 74 79 70 65 20 3d 20 4a 54 5f 49 4e 4e 45 52 3b  type = JT_INNER;
2210: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6a 6f  .  }.  return jo
2220: 69 6e 74 79 70 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  intype;.}../*.**
2230: 20 52 65 74 75 72 6e 20 74 68 65 20 69 6e 64 65   Return the inde
2240: 78 20 6f 66 20 61 20 63 6f 6c 75 6d 6e 20 69 6e  x of a column in
2250: 20 61 20 74 61 62 6c 65 2e 20 20 52 65 74 75 72   a table.  Retur
2260: 6e 20 2d 31 20 69 66 20 74 68 65 20 63 6f 6c 75  n -1 if the colu
2270: 6d 6e 0a 2a 2a 20 69 73 20 6e 6f 74 20 63 6f 6e  mn.** is not con
2280: 74 61 69 6e 65 64 20 69 6e 20 74 68 65 20 74 61  tained in the ta
2290: 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ble..*/.static i
22a0: 6e 74 20 63 6f 6c 75 6d 6e 49 6e 64 65 78 28 54  nt columnIndex(T
22b0: 61 62 6c 65 20 2a 70 54 61 62 2c 20 63 6f 6e 73  able *pTab, cons
22c0: 74 20 63 68 61 72 20 2a 7a 43 6f 6c 29 7b 0a 20  t char *zCol){. 
22d0: 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d   int i;.  for(i=
22e0: 30 3b 20 69 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b  0; i<pTab->nCol;
22f0: 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 73   i++){.    if( s
2300: 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 54  qlite3StrICmp(pT
2310: 61 62 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 4e 61 6d  ab->aCol[i].zNam
2320: 65 2c 20 7a 43 6f 6c 29 3d 3d 30 20 29 20 72 65  e, zCol)==0 ) re
2330: 74 75 72 6e 20 69 3b 0a 20 20 7d 0a 20 20 72 65  turn i;.  }.  re
2340: 74 75 72 6e 20 2d 31 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn -1;.}../*.*
2350: 2a 20 53 65 61 72 63 68 20 74 68 65 20 66 69 72  * Search the fir
2360: 73 74 20 4e 20 74 61 62 6c 65 73 20 69 6e 20 70  st N tables in p
2370: 53 72 63 2c 20 66 72 6f 6d 20 6c 65 66 74 20 74  Src, from left t
2380: 6f 20 72 69 67 68 74 2c 20 6c 6f 6f 6b 69 6e 67  o right, looking
2390: 20 66 6f 72 20 61 0a 2a 2a 20 74 61 62 6c 65 20   for a.** table 
23a0: 74 68 61 74 20 68 61 73 20 61 20 63 6f 6c 75 6d  that has a colum
23b0: 6e 20 6e 61 6d 65 64 20 7a 43 6f 6c 2e 20 20 0a  n named zCol.  .
23c0: 2a 2a 0a 2a 2a 20 57 68 65 6e 20 66 6f 75 6e 64  **.** When found
23d0: 2c 20 73 65 74 20 2a 70 69 54 61 62 20 61 6e 64  , set *piTab and
23e0: 20 2a 70 69 43 6f 6c 20 74 6f 20 74 68 65 20 74   *piCol to the t
23f0: 61 62 6c 65 20 69 6e 64 65 78 20 61 6e 64 20 63  able index and c
2400: 6f 6c 75 6d 6e 20 69 6e 64 65 78 0a 2a 2a 20 6f  olumn index.** o
2410: 66 20 74 68 65 20 6d 61 74 63 68 69 6e 67 20 63  f the matching c
2420: 6f 6c 75 6d 6e 20 61 6e 64 20 72 65 74 75 72 6e  olumn and return
2430: 20 54 52 55 45 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   TRUE..**.** If 
2440: 6e 6f 74 20 66 6f 75 6e 64 2c 20 72 65 74 75 72  not found, retur
2450: 6e 20 46 41 4c 53 45 2e 0a 2a 2f 0a 73 74 61 74  n FALSE..*/.stat
2460: 69 63 20 69 6e 74 20 74 61 62 6c 65 41 6e 64 43  ic int tableAndC
2470: 6f 6c 75 6d 6e 49 6e 64 65 78 28 0a 20 20 53 72  olumnIndex(.  Sr
2480: 63 4c 69 73 74 20 2a 70 53 72 63 2c 20 20 20 20  cList *pSrc,    
2490: 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 74     /* Array of t
24a0: 61 62 6c 65 73 20 74 6f 20 73 65 61 72 63 68 20  ables to search 
24b0: 2a 2f 0a 20 20 69 6e 74 20 4e 2c 20 20 20 20 20  */.  int N,     
24c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
24d0: 62 65 72 20 6f 66 20 74 61 62 6c 65 73 20 69 6e  ber of tables in
24e0: 20 70 53 72 63 2d 3e 61 5b 5d 20 74 6f 20 73 65   pSrc->a[] to se
24f0: 61 72 63 68 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  arch */.  const 
2500: 63 68 61 72 20 2a 7a 43 6f 6c 2c 20 20 20 20 2f  char *zCol,    /
2510: 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 63 6f  * Name of the co
2520: 6c 75 6d 6e 20 77 65 20 61 72 65 20 6c 6f 6f 6b  lumn we are look
2530: 69 6e 67 20 66 6f 72 20 2a 2f 0a 20 20 69 6e 74  ing for */.  int
2540: 20 2a 70 69 54 61 62 2c 20 20 20 20 20 20 20 20   *piTab,        
2550: 20 20 2f 2a 20 57 72 69 74 65 20 69 6e 64 65 78    /* Write index
2560: 20 6f 66 20 70 53 72 63 2d 3e 61 5b 5d 20 68 65   of pSrc->a[] he
2570: 72 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 69 43  re */.  int *piC
2580: 6f 6c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ol           /* 
2590: 57 72 69 74 65 20 69 6e 64 65 78 20 6f 66 20 70  Write index of p
25a0: 53 72 63 2d 3e 61 5b 2a 70 69 54 61 62 5d 2e 70  Src->a[*piTab].p
25b0: 54 61 62 2d 3e 61 43 6f 6c 5b 5d 20 68 65 72 65  Tab->aCol[] here
25c0: 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 20   */.){.  int i; 
25d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
25e0: 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65   For looping ove
25f0: 72 20 74 61 62 6c 65 73 20 69 6e 20 70 53 72 63  r tables in pSrc
2600: 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 3b 20   */.  int iCol; 
2610: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
2620: 64 65 78 20 6f 66 20 63 6f 6c 75 6d 6e 20 6d 61  dex of column ma
2630: 74 63 68 69 6e 67 20 7a 43 6f 6c 20 2a 2f 0a 0a  tching zCol */..
2640: 20 20 61 73 73 65 72 74 28 20 28 70 69 54 61 62    assert( (piTab
2650: 3d 3d 30 29 3d 3d 28 70 69 43 6f 6c 3d 3d 30 29  ==0)==(piCol==0)
2660: 20 29 3b 20 20 2f 2a 20 42 6f 74 68 20 6f 72 20   );  /* Both or 
2670: 6e 65 69 74 68 65 72 20 61 72 65 20 4e 55 4c 4c  neither are NULL
2680: 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   */.  for(i=0; i
2690: 3c 4e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 43  <N; i++){.    iC
26a0: 6f 6c 20 3d 20 63 6f 6c 75 6d 6e 49 6e 64 65 78  ol = columnIndex
26b0: 28 70 53 72 63 2d 3e 61 5b 69 5d 2e 70 54 61 62  (pSrc->a[i].pTab
26c0: 2c 20 7a 43 6f 6c 29 3b 0a 20 20 20 20 69 66 28  , zCol);.    if(
26d0: 20 69 43 6f 6c 3e 3d 30 20 29 7b 0a 20 20 20 20   iCol>=0 ){.    
26e0: 20 20 69 66 28 20 70 69 54 61 62 20 29 7b 0a 20    if( piTab ){. 
26f0: 20 20 20 20 20 20 20 2a 70 69 54 61 62 20 3d 20         *piTab = 
2700: 69 3b 0a 20 20 20 20 20 20 20 20 2a 70 69 43 6f  i;.        *piCo
2710: 6c 20 3d 20 69 43 6f 6c 3b 0a 20 20 20 20 20 20  l = iCol;.      
2720: 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31  }.      return 1
2730: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
2740: 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
2750: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
2760: 73 20 75 73 65 64 20 74 6f 20 61 64 64 20 74 65  s used to add te
2770: 72 6d 73 20 69 6d 70 6c 69 65 64 20 62 79 20 4a  rms implied by J
2780: 4f 49 4e 20 73 79 6e 74 61 78 20 74 6f 20 74 68  OIN syntax to th
2790: 65 0a 2a 2a 20 57 48 45 52 45 20 63 6c 61 75 73  e.** WHERE claus
27a0: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6f 66 20  e expression of 
27b0: 61 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  a SELECT stateme
27c0: 6e 74 2e 20 54 68 65 20 6e 65 77 20 74 65 72 6d  nt. The new term
27d0: 2c 20 77 68 69 63 68 0a 2a 2a 20 69 73 20 41 4e  , which.** is AN
27e0: 44 65 64 20 77 69 74 68 20 74 68 65 20 65 78 69  Ded with the exi
27f0: 73 74 69 6e 67 20 57 48 45 52 45 20 63 6c 61 75  sting WHERE clau
2800: 73 65 2c 20 69 73 20 6f 66 20 74 68 65 20 66 6f  se, is of the fo
2810: 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 28 74 61  rm:.**.**    (ta
2820: 62 31 2e 63 6f 6c 31 20 3d 20 74 61 62 32 2e 63  b1.col1 = tab2.c
2830: 6f 6c 32 29 0a 2a 2a 0a 2a 2a 20 77 68 65 72 65  ol2).**.** where
2840: 20 74 61 62 31 20 69 73 20 74 68 65 20 69 53 72   tab1 is the iSr
2850: 63 27 74 68 20 74 61 62 6c 65 20 69 6e 20 53 72  c'th table in Sr
2860: 63 4c 69 73 74 20 70 53 72 63 20 61 6e 64 20 74  cList pSrc and t
2870: 61 62 32 20 69 73 20 74 68 65 20 0a 2a 2a 20 28  ab2 is the .** (
2880: 69 53 72 63 2b 31 29 27 74 68 2e 20 43 6f 6c 75  iSrc+1)'th. Colu
2890: 6d 6e 20 63 6f 6c 31 20 69 73 20 63 6f 6c 75 6d  mn col1 is colum
28a0: 6e 20 69 43 6f 6c 4c 65 66 74 20 6f 66 20 74 61  n iColLeft of ta
28b0: 62 31 2c 20 61 6e 64 20 63 6f 6c 32 20 69 73 0a  b1, and col2 is.
28c0: 2a 2a 20 63 6f 6c 75 6d 6e 20 69 43 6f 6c 52 69  ** column iColRi
28d0: 67 68 74 20 6f 66 20 74 61 62 32 2e 0a 2a 2f 0a  ght of tab2..*/.
28e0: 73 74 61 74 69 63 20 76 6f 69 64 20 61 64 64 57  static void addW
28f0: 68 65 72 65 54 65 72 6d 28 0a 20 20 50 61 72 73  hereTerm(.  Pars
2900: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
2910: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
2920: 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
2930: 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72  /.  SrcList *pSr
2940: 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
2950: 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 74      /* List of t
2960: 61 62 6c 65 73 20 69 6e 20 46 52 4f 4d 20 63 6c  ables in FROM cl
2970: 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69 4c  ause */.  int iL
2980: 65 66 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  eft,            
2990: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
29a0: 65 78 20 6f 66 20 66 69 72 73 74 20 74 61 62 6c  ex of first tabl
29b0: 65 20 74 6f 20 6a 6f 69 6e 20 69 6e 20 70 53 72  e to join in pSr
29c0: 63 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 4c  c */.  int iColL
29d0: 65 66 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  eft,            
29e0: 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
29f0: 6f 66 20 63 6f 6c 75 6d 6e 20 69 6e 20 66 69 72  of column in fir
2a00: 73 74 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e  st table */.  in
2a10: 74 20 69 52 69 67 68 74 2c 20 20 20 20 20 20 20  t iRight,       
2a20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2a30: 20 49 6e 64 65 78 20 6f 66 20 73 65 63 6f 6e 64   Index of second
2a40: 20 74 61 62 6c 65 20 69 6e 20 70 53 72 63 20 2a   table in pSrc *
2a50: 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 52 69 67 68  /.  int iColRigh
2a60: 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t,              
2a70: 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20      /* Index of 
2a80: 63 6f 6c 75 6d 6e 20 69 6e 20 73 65 63 6f 6e 64  column in second
2a90: 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20   table */.  int 
2aa0: 69 73 4f 75 74 65 72 4a 6f 69 6e 2c 20 20 20 20  isOuterJoin,    
2ab0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
2ac0: 72 75 65 20 69 66 20 74 68 69 73 20 69 73 20 61  rue if this is a
2ad0: 6e 20 4f 55 54 45 52 20 6a 6f 69 6e 20 2a 2f 0a  n OUTER join */.
2ae0: 20 20 45 78 70 72 20 2a 2a 70 70 57 68 65 72 65    Expr **ppWhere
2af0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b00: 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 54 68 65    /* IN/OUT: The
2b10: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 6f   WHERE clause to
2b20: 20 61 64 64 20 74 6f 20 2a 2f 0a 29 7b 0a 20 20   add to */.){.  
2b30: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
2b40: 61 72 73 65 2d 3e 64 62 3b 0a 20 20 45 78 70 72  arse->db;.  Expr
2b50: 20 2a 70 45 31 3b 0a 20 20 45 78 70 72 20 2a 70   *pE1;.  Expr *p
2b60: 45 32 3b 0a 20 20 45 78 70 72 20 2a 70 45 71 3b  E2;.  Expr *pEq;
2b70: 0a 0a 20 20 61 73 73 65 72 74 28 20 69 4c 65 66  ..  assert( iLef
2b80: 74 3c 69 52 69 67 68 74 20 29 3b 0a 20 20 61 73  t<iRight );.  as
2b90: 73 65 72 74 28 20 70 53 72 63 2d 3e 6e 53 72 63  sert( pSrc->nSrc
2ba0: 3e 69 52 69 67 68 74 20 29 3b 0a 20 20 61 73 73  >iRight );.  ass
2bb0: 65 72 74 28 20 70 53 72 63 2d 3e 61 5b 69 4c 65  ert( pSrc->a[iLe
2bc0: 66 74 5d 2e 70 54 61 62 20 29 3b 0a 20 20 61 73  ft].pTab );.  as
2bd0: 73 65 72 74 28 20 70 53 72 63 2d 3e 61 5b 69 52  sert( pSrc->a[iR
2be0: 69 67 68 74 5d 2e 70 54 61 62 20 29 3b 0a 0a 20  ight].pTab );.. 
2bf0: 20 70 45 31 20 3d 20 73 71 6c 69 74 65 33 43 72   pE1 = sqlite3Cr
2c00: 65 61 74 65 43 6f 6c 75 6d 6e 45 78 70 72 28 64  eateColumnExpr(d
2c10: 62 2c 20 70 53 72 63 2c 20 69 4c 65 66 74 2c 20  b, pSrc, iLeft, 
2c20: 69 43 6f 6c 4c 65 66 74 29 3b 0a 20 20 70 45 32  iColLeft);.  pE2
2c30: 20 3d 20 73 71 6c 69 74 65 33 43 72 65 61 74 65   = sqlite3Create
2c40: 43 6f 6c 75 6d 6e 45 78 70 72 28 64 62 2c 20 70  ColumnExpr(db, p
2c50: 53 72 63 2c 20 69 52 69 67 68 74 2c 20 69 43 6f  Src, iRight, iCo
2c60: 6c 52 69 67 68 74 29 3b 0a 0a 20 20 70 45 71 20  lRight);..  pEq 
2c70: 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70  = sqlite3PExpr(p
2c80: 50 61 72 73 65 2c 20 54 4b 5f 45 51 2c 20 70 45  Parse, TK_EQ, pE
2c90: 31 2c 20 70 45 32 29 3b 0a 20 20 69 66 28 20 70  1, pE2);.  if( p
2ca0: 45 71 20 26 26 20 69 73 4f 75 74 65 72 4a 6f 69  Eq && isOuterJoi
2cb0: 6e 20 29 7b 0a 20 20 20 20 45 78 70 72 53 65 74  n ){.    ExprSet
2cc0: 50 72 6f 70 65 72 74 79 28 70 45 71 2c 20 45 50  Property(pEq, EP
2cd0: 5f 46 72 6f 6d 4a 6f 69 6e 29 3b 0a 20 20 20 20  _FromJoin);.    
2ce0: 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73  assert( !ExprHas
2cf0: 50 72 6f 70 65 72 74 79 28 70 45 71 2c 20 45 50  Property(pEq, EP
2d00: 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 52 65  _TokenOnly|EP_Re
2d10: 64 75 63 65 64 29 20 29 3b 0a 20 20 20 20 45 78  duced) );.    Ex
2d20: 70 72 53 65 74 56 56 41 50 72 6f 70 65 72 74 79  prSetVVAProperty
2d30: 28 70 45 71 2c 20 45 50 5f 4e 6f 52 65 64 75 63  (pEq, EP_NoReduc
2d40: 65 29 3b 0a 20 20 20 20 70 45 71 2d 3e 69 52 69  e);.    pEq->iRi
2d50: 67 68 74 4a 6f 69 6e 54 61 62 6c 65 20 3d 20 28  ghtJoinTable = (
2d60: 69 31 36 29 70 45 32 2d 3e 69 54 61 62 6c 65 3b  i16)pE2->iTable;
2d70: 0a 20 20 7d 0a 20 20 2a 70 70 57 68 65 72 65 20  .  }.  *ppWhere 
2d80: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 64  = sqlite3ExprAnd
2d90: 28 70 50 61 72 73 65 2c 20 2a 70 70 57 68 65 72  (pParse, *ppWher
2da0: 65 2c 20 70 45 71 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  e, pEq);.}../*.*
2db0: 2a 20 53 65 74 20 74 68 65 20 45 50 5f 46 72 6f  * Set the EP_Fro
2dc0: 6d 4a 6f 69 6e 20 70 72 6f 70 65 72 74 79 20 6f  mJoin property o
2dd0: 6e 20 61 6c 6c 20 74 65 72 6d 73 20 6f 66 20 74  n all terms of t
2de0: 68 65 20 67 69 76 65 6e 20 65 78 70 72 65 73 73  he given express
2df0: 69 6f 6e 2e 0a 2a 2a 20 41 6e 64 20 73 65 74 20  ion..** And set 
2e00: 74 68 65 20 45 78 70 72 2e 69 52 69 67 68 74 4a  the Expr.iRightJ
2e10: 6f 69 6e 54 61 62 6c 65 20 74 6f 20 69 54 61 62  oinTable to iTab
2e20: 6c 65 20 66 6f 72 20 65 76 65 72 79 20 74 65 72  le for every ter
2e30: 6d 20 69 6e 20 74 68 65 0a 2a 2a 20 65 78 70 72  m in the.** expr
2e40: 65 73 73 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68  ession..**.** Th
2e50: 65 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 20 70 72  e EP_FromJoin pr
2e60: 6f 70 65 72 74 79 20 69 73 20 75 73 65 64 20 6f  operty is used o
2e70: 6e 20 74 65 72 6d 73 20 6f 66 20 61 6e 20 65 78  n terms of an ex
2e80: 70 72 65 73 73 69 6f 6e 20 74 6f 20 74 65 6c 6c  pression to tell
2e90: 0a 2a 2a 20 74 68 65 20 4c 45 46 54 20 4f 55 54  .** the LEFT OUT
2ea0: 45 52 20 4a 4f 49 4e 20 70 72 6f 63 65 73 73 69  ER JOIN processi
2eb0: 6e 67 20 6c 6f 67 69 63 20 74 68 61 74 20 74 68  ng logic that th
2ec0: 69 73 20 74 65 72 6d 20 69 73 20 70 61 72 74 20  is term is part 
2ed0: 6f 66 20 74 68 65 0a 2a 2a 20 6a 6f 69 6e 20 72  of the.** join r
2ee0: 65 73 74 72 69 63 74 69 6f 6e 20 73 70 65 63 69  estriction speci
2ef0: 66 69 65 64 20 69 6e 20 74 68 65 20 4f 4e 20 6f  fied in the ON o
2f00: 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65 20 61  r USING clause a
2f10: 6e 64 20 6e 6f 74 20 61 20 70 61 72 74 0a 2a 2a  nd not a part.**
2f20: 20 6f 66 20 74 68 65 20 6d 6f 72 65 20 67 65 6e   of the more gen
2f30: 65 72 61 6c 20 57 48 45 52 45 20 63 6c 61 75 73  eral WHERE claus
2f40: 65 2e 20 20 54 68 65 73 65 20 74 65 72 6d 73 20  e.  These terms 
2f50: 61 72 65 20 6d 6f 76 65 64 20 6f 76 65 72 20 74  are moved over t
2f60: 6f 20 74 68 65 0a 2a 2a 20 57 48 45 52 45 20 63  o the.** WHERE c
2f70: 6c 61 75 73 65 20 64 75 72 69 6e 67 20 6a 6f 69  lause during joi
2f80: 6e 20 70 72 6f 63 65 73 73 69 6e 67 20 62 75 74  n processing but
2f90: 20 77 65 20 6e 65 65 64 20 74 6f 20 72 65 6d 65   we need to reme
2fa0: 6d 62 65 72 20 74 68 61 74 20 74 68 65 79 0a 2a  mber that they.*
2fb0: 2a 20 6f 72 69 67 69 6e 61 74 65 64 20 69 6e 20  * originated in 
2fc0: 74 68 65 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20  the ON or USING 
2fd0: 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  clause..**.** Th
2fe0: 65 20 45 78 70 72 2e 69 52 69 67 68 74 4a 6f 69  e Expr.iRightJoi
2ff0: 6e 54 61 62 6c 65 20 74 65 6c 6c 73 20 74 68 65  nTable tells the
3000: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 70 72   WHERE clause pr
3010: 6f 63 65 73 73 69 6e 67 20 74 68 61 74 20 74 68  ocessing that th
3020: 65 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20  e.** expression 
3030: 64 65 70 65 6e 64 73 20 6f 6e 20 74 61 62 6c 65  depends on table
3040: 20 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65   iRightJoinTable
3050: 20 65 76 65 6e 20 69 66 20 74 68 61 74 20 74 61   even if that ta
3060: 62 6c 65 20 69 73 20 6e 6f 74 0a 2a 2a 20 65 78  ble is not.** ex
3070: 70 6c 69 63 69 74 6c 79 20 6d 65 6e 74 69 6f 6e  plicitly mention
3080: 65 64 20 69 6e 20 74 68 65 20 65 78 70 72 65 73  ed in the expres
3090: 73 69 6f 6e 2e 20 20 54 68 61 74 20 69 6e 66 6f  sion.  That info
30a0: 72 6d 61 74 69 6f 6e 20 69 73 20 6e 65 65 64 65  rmation is neede
30b0: 64 0a 2a 2a 20 66 6f 72 20 63 61 73 65 73 20 6c  d.** for cases l
30c0: 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20  ike this:.**.** 
30d0: 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d     SELECT * FROM
30e0: 20 74 31 20 4c 45 46 54 20 4a 4f 49 4e 20 74 32   t1 LEFT JOIN t2
30f0: 20 4f 4e 20 74 31 2e 61 3d 74 32 2e 62 20 41 4e   ON t1.a=t2.b AN
3100: 44 20 74 31 2e 78 3d 35 0a 2a 2a 0a 2a 2a 20 54  D t1.x=5.**.** T
3110: 68 65 20 77 68 65 72 65 20 63 6c 61 75 73 65 20  he where clause 
3120: 6e 65 65 64 73 20 74 6f 20 64 65 66 65 72 20 74  needs to defer t
3130: 68 65 20 68 61 6e 64 6c 69 6e 67 20 6f 66 20 74  he handling of t
3140: 68 65 20 74 31 2e 78 3d 35 0a 2a 2a 20 74 65 72  he t1.x=5.** ter
3150: 6d 20 75 6e 74 69 6c 20 61 66 74 65 72 20 74 68  m until after th
3160: 65 20 74 32 20 6c 6f 6f 70 20 6f 66 20 74 68 65  e t2 loop of the
3170: 20 6a 6f 69 6e 2e 20 20 49 6e 20 74 68 61 74 20   join.  In that 
3180: 77 61 79 2c 20 61 0a 2a 2a 20 4e 55 4c 4c 20 74  way, a.** NULL t
3190: 32 20 72 6f 77 20 77 69 6c 6c 20 62 65 20 69 6e  2 row will be in
31a0: 73 65 72 74 65 64 20 77 68 65 6e 65 76 65 72 20  serted whenever 
31b0: 74 31 2e 78 21 3d 35 2e 20 20 49 66 20 77 65 20  t1.x!=5.  If we 
31c0: 64 6f 20 6e 6f 74 0a 2a 2a 20 64 65 66 65 72 20  do not.** defer 
31d0: 74 68 65 20 68 61 6e 64 6c 69 6e 67 20 6f 66 20  the handling of 
31e0: 74 31 2e 78 3d 35 2c 20 69 74 20 77 69 6c 6c 20  t1.x=5, it will 
31f0: 62 65 20 70 72 6f 63 65 73 73 65 64 20 69 6d 6d  be processed imm
3200: 65 64 69 61 74 65 6c 79 0a 2a 2a 20 61 66 74 65  ediately.** afte
3210: 72 20 74 68 65 20 74 31 20 6c 6f 6f 70 20 61 6e  r the t1 loop an
3220: 64 20 72 6f 77 73 20 77 69 74 68 20 74 31 2e 78  d rows with t1.x
3230: 21 3d 35 20 77 69 6c 6c 20 6e 65 76 65 72 20 61  !=5 will never a
3240: 70 70 65 61 72 20 69 6e 0a 2a 2a 20 74 68 65 20  ppear in.** the 
3250: 6f 75 74 70 75 74 2c 20 77 68 69 63 68 20 69 73  output, which is
3260: 20 69 6e 63 6f 72 72 65 63 74 2e 0a 2a 2f 0a 73   incorrect..*/.s
3270: 74 61 74 69 63 20 76 6f 69 64 20 73 65 74 4a 6f  tatic void setJo
3280: 69 6e 45 78 70 72 28 45 78 70 72 20 2a 70 2c 20  inExpr(Expr *p, 
3290: 69 6e 74 20 69 54 61 62 6c 65 29 7b 0a 20 20 77  int iTable){.  w
32a0: 68 69 6c 65 28 20 70 20 29 7b 0a 20 20 20 20 45  hile( p ){.    E
32b0: 78 70 72 53 65 74 50 72 6f 70 65 72 74 79 28 70  xprSetProperty(p
32c0: 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 3b 0a  , EP_FromJoin);.
32d0: 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70      assert( !Exp
32e0: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20  rHasProperty(p, 
32f0: 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f  EP_TokenOnly|EP_
3300: 52 65 64 75 63 65 64 29 20 29 3b 0a 20 20 20 20  Reduced) );.    
3310: 45 78 70 72 53 65 74 56 56 41 50 72 6f 70 65 72  ExprSetVVAProper
3320: 74 79 28 70 2c 20 45 50 5f 4e 6f 52 65 64 75 63  ty(p, EP_NoReduc
3330: 65 29 3b 0a 20 20 20 20 70 2d 3e 69 52 69 67 68  e);.    p->iRigh
3340: 74 4a 6f 69 6e 54 61 62 6c 65 20 3d 20 28 69 31  tJoinTable = (i1
3350: 36 29 69 54 61 62 6c 65 3b 0a 20 20 20 20 69 66  6)iTable;.    if
3360: 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 46 55 4e 43  ( p->op==TK_FUNC
3370: 54 49 4f 4e 20 26 26 20 70 2d 3e 78 2e 70 4c 69  TION && p->x.pLi
3380: 73 74 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  st ){.      int 
3390: 69 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  i;.      for(i=0
33a0: 3b 20 69 3c 70 2d 3e 78 2e 70 4c 69 73 74 2d 3e  ; i<p->x.pList->
33b0: 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
33c0: 20 20 20 20 20 73 65 74 4a 6f 69 6e 45 78 70 72       setJoinExpr
33d0: 28 70 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 69  (p->x.pList->a[i
33e0: 5d 2e 70 45 78 70 72 2c 20 69 54 61 62 6c 65 29  ].pExpr, iTable)
33f0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
3400: 20 20 20 20 73 65 74 4a 6f 69 6e 45 78 70 72 28      setJoinExpr(
3410: 70 2d 3e 70 4c 65 66 74 2c 20 69 54 61 62 6c 65  p->pLeft, iTable
3420: 29 3b 0a 20 20 20 20 70 20 3d 20 70 2d 3e 70 52  );.    p = p->pR
3430: 69 67 68 74 3b 0a 20 20 7d 20 0a 7d 0a 0a 2f 2a  ight;.  } .}../*
3440: 20 55 6e 64 6f 20 74 68 65 20 77 6f 72 6b 20 6f   Undo the work o
3450: 66 20 73 65 74 4a 6f 69 6e 45 78 70 72 28 29 2e  f setJoinExpr().
3460: 20 20 49 6e 20 74 68 65 20 65 78 70 72 65 73 73    In the express
3470: 69 6f 6e 20 74 72 65 65 20 70 2c 20 63 6f 6e 76  ion tree p, conv
3480: 65 72 74 20 65 76 65 72 79 0a 2a 2a 20 74 65 72  ert every.** ter
3490: 6d 20 74 68 61 74 20 69 73 20 6d 61 72 6b 65 64  m that is marked
34a0: 20 77 69 74 68 20 45 50 5f 46 72 6f 6d 4a 6f 69   with EP_FromJoi
34b0: 6e 20 61 6e 64 20 69 52 69 67 68 74 4a 6f 69 6e  n and iRightJoin
34c0: 54 61 62 6c 65 3d 3d 69 54 61 62 6c 65 20 69 6e  Table==iTable in
34d0: 74 6f 0a 2a 2a 20 61 6e 20 6f 72 64 69 6e 61 72  to.** an ordinar
34e0: 79 20 74 65 72 6d 20 74 68 61 74 20 6f 6d 69 74  y term that omit
34f0: 73 20 74 68 65 20 45 50 5f 46 72 6f 6d 4a 6f 69  s the EP_FromJoi
3500: 6e 20 6d 61 72 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68  n mark..**.** Th
3510: 69 73 20 68 61 70 70 65 6e 73 20 77 68 65 6e 20  is happens when 
3520: 61 20 4c 45 46 54 20 4a 4f 49 4e 20 69 73 20 73  a LEFT JOIN is s
3530: 69 6d 70 6c 69 66 69 65 64 20 69 6e 74 6f 20 61  implified into a
3540: 6e 20 6f 72 64 69 6e 61 72 79 20 4a 4f 49 4e 2e  n ordinary JOIN.
3550: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
3560: 75 6e 73 65 74 4a 6f 69 6e 45 78 70 72 28 45 78  unsetJoinExpr(Ex
3570: 70 72 20 2a 70 2c 20 69 6e 74 20 69 54 61 62 6c  pr *p, int iTabl
3580: 65 29 7b 0a 20 20 77 68 69 6c 65 28 20 70 20 29  e){.  while( p )
3590: 7b 0a 20 20 20 20 69 66 28 20 45 78 70 72 48 61  {.    if( ExprHa
35a0: 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f  sProperty(p, EP_
35b0: 46 72 6f 6d 4a 6f 69 6e 29 0a 20 20 20 20 20 26  FromJoin).     &
35c0: 26 20 28 69 54 61 62 6c 65 3c 30 20 7c 7c 20 70  & (iTable<0 || p
35d0: 2d 3e 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c  ->iRightJoinTabl
35e0: 65 3d 3d 69 54 61 62 6c 65 29 20 29 7b 0a 20 20  e==iTable) ){.  
35f0: 20 20 20 20 45 78 70 72 43 6c 65 61 72 50 72 6f      ExprClearPro
3600: 70 65 72 74 79 28 70 2c 20 45 50 5f 46 72 6f 6d  perty(p, EP_From
3610: 4a 6f 69 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Join);.    }.   
3620: 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 46   if( p->op==TK_F
3630: 55 4e 43 54 49 4f 4e 20 26 26 20 70 2d 3e 78 2e  UNCTION && p->x.
3640: 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20 69  pList ){.      i
3650: 6e 74 20 69 3b 0a 20 20 20 20 20 20 66 6f 72 28  nt i;.      for(
3660: 69 3d 30 3b 20 69 3c 70 2d 3e 78 2e 70 4c 69 73  i=0; i<p->x.pLis
3670: 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a  t->nExpr; i++){.
3680: 20 20 20 20 20 20 20 20 75 6e 73 65 74 4a 6f 69          unsetJoi
3690: 6e 45 78 70 72 28 70 2d 3e 78 2e 70 4c 69 73 74  nExpr(p->x.pList
36a0: 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20 69 54  ->a[i].pExpr, iT
36b0: 61 62 6c 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20  able);.      }. 
36c0: 20 20 20 7d 0a 20 20 20 20 75 6e 73 65 74 4a 6f     }.    unsetJo
36d0: 69 6e 45 78 70 72 28 70 2d 3e 70 4c 65 66 74 2c  inExpr(p->pLeft,
36e0: 20 69 54 61 62 6c 65 29 3b 0a 20 20 20 20 70 20   iTable);.    p 
36f0: 3d 20 70 2d 3e 70 52 69 67 68 74 3b 0a 20 20 7d  = p->pRight;.  }
3700: 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20   .}../*.** This 
3710: 72 6f 75 74 69 6e 65 20 70 72 6f 63 65 73 73 65  routine processe
3720: 73 20 74 68 65 20 6a 6f 69 6e 20 69 6e 66 6f 72  s the join infor
3730: 6d 61 74 69 6f 6e 20 66 6f 72 20 61 20 53 45 4c  mation for a SEL
3740: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a  ECT statement..*
3750: 2a 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20 63  * ON and USING c
3760: 6c 61 75 73 65 73 20 61 72 65 20 63 6f 6e 76 65  lauses are conve
3770: 72 74 65 64 20 69 6e 74 6f 20 65 78 74 72 61 20  rted into extra 
3780: 74 65 72 6d 73 20 6f 66 20 74 68 65 20 57 48 45  terms of the WHE
3790: 52 45 20 63 6c 61 75 73 65 2e 0a 2a 2a 20 4e 41  RE clause..** NA
37a0: 54 55 52 41 4c 20 6a 6f 69 6e 73 20 61 6c 73 6f  TURAL joins also
37b0: 20 63 72 65 61 74 65 20 65 78 74 72 61 20 57 48   create extra WH
37c0: 45 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d 73  ERE clause terms
37d0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 65 72 6d  ..**.** The term
37e0: 73 20 6f 66 20 61 20 46 52 4f 4d 20 63 6c 61 75  s of a FROM clau
37f0: 73 65 20 61 72 65 20 63 6f 6e 74 61 69 6e 65 64  se are contained
3800: 20 69 6e 20 74 68 65 20 53 65 6c 65 63 74 2e 70   in the Select.p
3810: 53 72 63 20 73 74 72 75 63 74 75 72 65 2e 0a 2a  Src structure..*
3820: 2a 20 54 68 65 20 6c 65 66 74 20 6d 6f 73 74 20  * The left most 
3830: 74 61 62 6c 65 20 69 73 20 74 68 65 20 66 69 72  table is the fir
3840: 73 74 20 65 6e 74 72 79 20 69 6e 20 53 65 6c 65  st entry in Sele
3850: 63 74 2e 70 53 72 63 2e 20 20 54 68 65 20 72 69  ct.pSrc.  The ri
3860: 67 68 74 2d 6d 6f 73 74 0a 2a 2a 20 74 61 62 6c  ght-most.** tabl
3870: 65 20 69 73 20 74 68 65 20 6c 61 73 74 20 65 6e  e is the last en
3880: 74 72 79 2e 20 20 54 68 65 20 6a 6f 69 6e 20 6f  try.  The join o
3890: 70 65 72 61 74 6f 72 20 69 73 20 68 65 6c 64 20  perator is held 
38a0: 69 6e 20 74 68 65 20 65 6e 74 72 79 20 74 6f 0a  in the entry to.
38b0: 2a 2a 20 74 68 65 20 6c 65 66 74 2e 20 20 54 68  ** the left.  Th
38c0: 75 73 20 65 6e 74 72 79 20 30 20 63 6f 6e 74 61  us entry 0 conta
38d0: 69 6e 73 20 74 68 65 20 6a 6f 69 6e 20 6f 70 65  ins the join ope
38e0: 72 61 74 6f 72 20 66 6f 72 20 74 68 65 20 6a 6f  rator for the jo
38f0: 69 6e 20 62 65 74 77 65 65 6e 0a 2a 2a 20 65 6e  in between.** en
3900: 74 72 69 65 73 20 30 20 61 6e 64 20 31 2e 20 20  tries 0 and 1.  
3910: 41 6e 79 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20  Any ON or USING 
3920: 63 6c 61 75 73 65 73 20 61 73 73 6f 63 69 61 74  clauses associat
3930: 65 64 20 77 69 74 68 20 74 68 65 20 6a 6f 69 6e  ed with the join
3940: 20 61 72 65 0a 2a 2a 20 61 6c 73 6f 20 61 74 74   are.** also att
3950: 61 63 68 65 64 20 74 6f 20 74 68 65 20 6c 65 66  ached to the lef
3960: 74 20 65 6e 74 72 79 2e 0a 2a 2a 0a 2a 2a 20 54  t entry..**.** T
3970: 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75  his routine retu
3980: 72 6e 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  rns the number o
3990: 66 20 65 72 72 6f 72 73 20 65 6e 63 6f 75 6e 74  f errors encount
39a0: 65 72 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ered..*/.static 
39b0: 69 6e 74 20 73 71 6c 69 74 65 50 72 6f 63 65 73  int sqliteProces
39c0: 73 4a 6f 69 6e 28 50 61 72 73 65 20 2a 70 50 61  sJoin(Parse *pPa
39d0: 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b  rse, Select *p){
39e0: 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63  .  SrcList *pSrc
39f0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
3a00: 20 20 20 2f 2a 20 41 6c 6c 20 74 61 62 6c 65 73     /* All tables
3a10: 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   in the FROM cla
3a20: 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69 2c 20  use */.  int i, 
3a30: 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  j;              
3a40: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
3a50: 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 73   counters */.  s
3a60: 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
3a70: 65 6d 20 2a 70 4c 65 66 74 3b 20 20 20 20 20 2f  em *pLeft;     /
3a80: 2a 20 4c 65 66 74 20 74 61 62 6c 65 20 62 65 69  * Left table bei
3a90: 6e 67 20 6a 6f 69 6e 65 64 20 2a 2f 0a 20 20 73  ng joined */.  s
3aa0: 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
3ab0: 65 6d 20 2a 70 52 69 67 68 74 3b 20 20 20 20 2f  em *pRight;    /
3ac0: 2a 20 52 69 67 68 74 20 74 61 62 6c 65 20 62 65  * Right table be
3ad0: 69 6e 67 20 6a 6f 69 6e 65 64 20 2a 2f 0a 0a 20  ing joined */.. 
3ae0: 20 70 53 72 63 20 3d 20 70 2d 3e 70 53 72 63 3b   pSrc = p->pSrc;
3af0: 0a 20 20 70 4c 65 66 74 20 3d 20 26 70 53 72 63  .  pLeft = &pSrc
3b00: 2d 3e 61 5b 30 5d 3b 0a 20 20 70 52 69 67 68 74  ->a[0];.  pRight
3b10: 20 3d 20 26 70 4c 65 66 74 5b 31 5d 3b 0a 20 20   = &pLeft[1];.  
3b20: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 53 72 63 2d  for(i=0; i<pSrc-
3b30: 3e 6e 53 72 63 2d 31 3b 20 69 2b 2b 2c 20 70 52  >nSrc-1; i++, pR
3b40: 69 67 68 74 2b 2b 2c 20 70 4c 65 66 74 2b 2b 29  ight++, pLeft++)
3b50: 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 52 69  {.    Table *pRi
3b60: 67 68 74 54 61 62 20 3d 20 70 52 69 67 68 74 2d  ghtTab = pRight-
3b70: 3e 70 54 61 62 3b 0a 20 20 20 20 69 6e 74 20 69  >pTab;.    int i
3b80: 73 4f 75 74 65 72 3b 0a 0a 20 20 20 20 69 66 28  sOuter;..    if(
3b90: 20 4e 45 56 45 52 28 70 4c 65 66 74 2d 3e 70 54   NEVER(pLeft->pT
3ba0: 61 62 3d 3d 30 20 7c 7c 20 70 52 69 67 68 74 54  ab==0 || pRightT
3bb0: 61 62 3d 3d 30 29 20 29 20 63 6f 6e 74 69 6e 75  ab==0) ) continu
3bc0: 65 3b 0a 20 20 20 20 69 73 4f 75 74 65 72 20 3d  e;.    isOuter =
3bd0: 20 28 70 52 69 67 68 74 2d 3e 66 67 2e 6a 6f 69   (pRight->fg.joi
3be0: 6e 74 79 70 65 20 26 20 4a 54 5f 4f 55 54 45 52  ntype & JT_OUTER
3bf0: 29 21 3d 30 3b 0a 0a 20 20 20 20 2f 2a 20 57 68  )!=0;..    /* Wh
3c00: 65 6e 20 74 68 65 20 4e 41 54 55 52 41 4c 20 6b  en the NATURAL k
3c10: 65 79 77 6f 72 64 20 69 73 20 70 72 65 73 65 6e  eyword is presen
3c20: 74 2c 20 61 64 64 20 57 48 45 52 45 20 63 6c 61  t, add WHERE cla
3c30: 75 73 65 20 74 65 72 6d 73 20 66 6f 72 0a 20 20  use terms for.  
3c40: 20 20 2a 2a 20 65 76 65 72 79 20 63 6f 6c 75 6d    ** every colum
3c50: 6e 20 74 68 61 74 20 74 68 65 20 74 77 6f 20 74  n that the two t
3c60: 61 62 6c 65 73 20 68 61 76 65 20 69 6e 20 63 6f  ables have in co
3c70: 6d 6d 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  mmon..    */.   
3c80: 20 69 66 28 20 70 52 69 67 68 74 2d 3e 66 67 2e   if( pRight->fg.
3c90: 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 4e 41  jointype & JT_NA
3ca0: 54 55 52 41 4c 20 29 7b 0a 20 20 20 20 20 20 69  TURAL ){.      i
3cb0: 66 28 20 70 52 69 67 68 74 2d 3e 70 4f 6e 20 7c  f( pRight->pOn |
3cc0: 7c 20 70 52 69 67 68 74 2d 3e 70 55 73 69 6e 67  | pRight->pUsing
3cd0: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
3ce0: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
3cf0: 73 65 2c 20 22 61 20 4e 41 54 55 52 41 4c 20 6a  se, "a NATURAL j
3d00: 6f 69 6e 20 6d 61 79 20 6e 6f 74 20 68 61 76 65  oin may not have
3d10: 20 22 0a 20 20 20 20 20 20 20 20 20 20 20 22 61   ".           "a
3d20: 6e 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c  n ON or USING cl
3d30: 61 75 73 65 22 2c 20 30 29 3b 0a 20 20 20 20 20  ause", 0);.     
3d40: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
3d50: 20 20 20 7d 0a 20 20 20 20 20 20 66 6f 72 28 6a     }.      for(j
3d60: 3d 30 3b 20 6a 3c 70 52 69 67 68 74 54 61 62 2d  =0; j<pRightTab-
3d70: 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20  >nCol; j++){.   
3d80: 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65       char *zName
3d90: 3b 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 63  ;   /* Name of c
3da0: 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20 72 69 67  olumn in the rig
3db0: 68 74 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20  ht table */.    
3dc0: 20 20 20 20 69 6e 74 20 69 4c 65 66 74 3b 20 20      int iLeft;  
3dd0: 20 20 20 2f 2a 20 4d 61 74 63 68 69 6e 67 20 6c     /* Matching l
3de0: 65 66 74 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20  eft table */.   
3df0: 20 20 20 20 20 69 6e 74 20 69 4c 65 66 74 43 6f       int iLeftCo
3e00: 6c 3b 20 20 2f 2a 20 4d 61 74 63 68 69 6e 67 20  l;  /* Matching 
3e10: 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20 6c 65  column in the le
3e20: 66 74 20 74 61 62 6c 65 20 2a 2f 0a 0a 20 20 20  ft table */..   
3e30: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 70 52 69       zName = pRi
3e40: 67 68 74 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e  ghtTab->aCol[j].
3e50: 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 69  zName;.        i
3e60: 66 28 20 74 61 62 6c 65 41 6e 64 43 6f 6c 75 6d  f( tableAndColum
3e70: 6e 49 6e 64 65 78 28 70 53 72 63 2c 20 69 2b 31  nIndex(pSrc, i+1
3e80: 2c 20 7a 4e 61 6d 65 2c 20 26 69 4c 65 66 74 2c  , zName, &iLeft,
3e90: 20 26 69 4c 65 66 74 43 6f 6c 29 20 29 7b 0a 20   &iLeftCol) ){. 
3ea0: 20 20 20 20 20 20 20 20 20 61 64 64 57 68 65 72           addWher
3eb0: 65 54 65 72 6d 28 70 50 61 72 73 65 2c 20 70 53  eTerm(pParse, pS
3ec0: 72 63 2c 20 69 4c 65 66 74 2c 20 69 4c 65 66 74  rc, iLeft, iLeft
3ed0: 43 6f 6c 2c 20 69 2b 31 2c 20 6a 2c 0a 20 20 20  Col, i+1, j,.   
3ee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3ef0: 20 20 20 20 69 73 4f 75 74 65 72 2c 20 26 70 2d      isOuter, &p-
3f00: 3e 70 57 68 65 72 65 29 3b 0a 20 20 20 20 20 20  >pWhere);.      
3f10: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
3f20: 7d 0a 0a 20 20 20 20 2f 2a 20 44 69 73 61 6c 6c  }..    /* Disall
3f30: 6f 77 20 62 6f 74 68 20 4f 4e 20 61 6e 64 20 55  ow both ON and U
3f40: 53 49 4e 47 20 63 6c 61 75 73 65 73 20 69 6e 20  SING clauses in 
3f50: 74 68 65 20 73 61 6d 65 20 6a 6f 69 6e 0a 20 20  the same join.  
3f60: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 52 69    */.    if( pRi
3f70: 67 68 74 2d 3e 70 4f 6e 20 26 26 20 70 52 69 67  ght->pOn && pRig
3f80: 68 74 2d 3e 70 55 73 69 6e 67 20 29 7b 0a 20 20  ht->pUsing ){.  
3f90: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
3fa0: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 63 61 6e  Msg(pParse, "can
3fb0: 6e 6f 74 20 68 61 76 65 20 62 6f 74 68 20 4f 4e  not have both ON
3fc0: 20 61 6e 64 20 55 53 49 4e 47 20 22 0a 20 20 20   and USING ".   
3fd0: 20 20 20 20 20 22 63 6c 61 75 73 65 73 20 69 6e       "clauses in
3fe0: 20 74 68 65 20 73 61 6d 65 20 6a 6f 69 6e 22 29   the same join")
3ff0: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31  ;.      return 1
4000: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
4010: 41 64 64 20 74 68 65 20 4f 4e 20 63 6c 61 75 73  Add the ON claus
4020: 65 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20  e to the end of 
4030: 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
4040: 2c 20 63 6f 6e 6e 65 63 74 65 64 20 62 79 0a 20  , connected by. 
4050: 20 20 20 2a 2a 20 61 6e 20 41 4e 44 20 6f 70 65     ** an AND ope
4060: 72 61 74 6f 72 2e 0a 20 20 20 20 2a 2f 0a 20 20  rator..    */.  
4070: 20 20 69 66 28 20 70 52 69 67 68 74 2d 3e 70 4f    if( pRight->pO
4080: 6e 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 69  n ){.      if( i
4090: 73 4f 75 74 65 72 20 29 20 73 65 74 4a 6f 69 6e  sOuter ) setJoin
40a0: 45 78 70 72 28 70 52 69 67 68 74 2d 3e 70 4f 6e  Expr(pRight->pOn
40b0: 2c 20 70 52 69 67 68 74 2d 3e 69 43 75 72 73 6f  , pRight->iCurso
40c0: 72 29 3b 0a 20 20 20 20 20 20 70 2d 3e 70 57 68  r);.      p->pWh
40d0: 65 72 65 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ere = sqlite3Exp
40e0: 72 41 6e 64 28 70 50 61 72 73 65 2c 20 70 2d 3e  rAnd(pParse, p->
40f0: 70 57 68 65 72 65 2c 20 70 52 69 67 68 74 2d 3e  pWhere, pRight->
4100: 70 4f 6e 29 3b 0a 20 20 20 20 20 20 70 52 69 67  pOn);.      pRig
4110: 68 74 2d 3e 70 4f 6e 20 3d 20 30 3b 0a 20 20 20  ht->pOn = 0;.   
4120: 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61 74   }..    /* Creat
4130: 65 20 65 78 74 72 61 20 74 65 72 6d 73 20 6f 6e  e extra terms on
4140: 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
4150: 65 20 66 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d  e for each colum
4160: 6e 20 6e 61 6d 65 64 0a 20 20 20 20 2a 2a 20 69  n named.    ** i
4170: 6e 20 74 68 65 20 55 53 49 4e 47 20 63 6c 61 75  n the USING clau
4180: 73 65 2e 20 20 45 78 61 6d 70 6c 65 3a 20 49 66  se.  Example: If
4190: 20 74 68 65 20 74 77 6f 20 74 61 62 6c 65 73 20   the two tables 
41a0: 74 6f 20 62 65 20 6a 6f 69 6e 65 64 20 61 72 65  to be joined are
41b0: 20 0a 20 20 20 20 2a 2a 20 41 20 61 6e 64 20 42   .    ** A and B
41c0: 20 61 6e 64 20 74 68 65 20 55 53 49 4e 47 20 63   and the USING c
41d0: 6c 61 75 73 65 20 6e 61 6d 65 73 20 58 2c 20 59  lause names X, Y
41e0: 2c 20 61 6e 64 20 5a 2c 20 74 68 65 6e 20 61 64  , and Z, then ad
41f0: 64 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 74 6f  d this.    ** to
4200: 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
4210: 65 3a 20 20 20 20 41 2e 58 3d 42 2e 58 20 41 4e  e:    A.X=B.X AN
4220: 44 20 41 2e 59 3d 42 2e 59 20 41 4e 44 20 41 2e  D A.Y=B.Y AND A.
4230: 5a 3d 42 2e 5a 0a 20 20 20 20 2a 2a 20 52 65 70  Z=B.Z.    ** Rep
4240: 6f 72 74 20 61 6e 20 65 72 72 6f 72 20 69 66 20  ort an error if 
4250: 61 6e 79 20 63 6f 6c 75 6d 6e 20 6d 65 6e 74 69  any column menti
4260: 6f 6e 65 64 20 69 6e 20 74 68 65 20 55 53 49 4e  oned in the USIN
4270: 47 20 63 6c 61 75 73 65 20 69 73 0a 20 20 20 20  G clause is.    
4280: 2a 2a 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 65 64  ** not contained
4290: 20 69 6e 20 62 6f 74 68 20 74 61 62 6c 65 73 20   in both tables 
42a0: 74 6f 20 62 65 20 6a 6f 69 6e 65 64 2e 0a 20 20  to be joined..  
42b0: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 52 69    */.    if( pRi
42c0: 67 68 74 2d 3e 70 55 73 69 6e 67 20 29 7b 0a 20  ght->pUsing ){. 
42d0: 20 20 20 20 20 49 64 4c 69 73 74 20 2a 70 4c 69       IdList *pLi
42e0: 73 74 20 3d 20 70 52 69 67 68 74 2d 3e 70 55 73  st = pRight->pUs
42f0: 69 6e 67 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a  ing;.      for(j
4300: 3d 30 3b 20 6a 3c 70 4c 69 73 74 2d 3e 6e 49 64  =0; j<pList->nId
4310: 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; j++){.        
4320: 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 20 20 20 20  char *zName;    
4330: 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
4340: 74 65 72 6d 20 69 6e 20 74 68 65 20 55 53 49 4e  term in the USIN
4350: 47 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20  G clause */.    
4360: 20 20 20 20 69 6e 74 20 69 4c 65 66 74 3b 20 20      int iLeft;  
4370: 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 6f 6e       /* Table on
4380: 20 74 68 65 20 6c 65 66 74 20 77 69 74 68 20 6d   the left with m
4390: 61 74 63 68 69 6e 67 20 63 6f 6c 75 6d 6e 20 6e  atching column n
43a0: 61 6d 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 69  ame */.        i
43b0: 6e 74 20 69 4c 65 66 74 43 6f 6c 3b 20 20 20 20  nt iLeftCol;    
43c0: 2f 2a 20 43 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72  /* Column number
43d0: 20 6f 66 20 6d 61 74 63 68 69 6e 67 20 63 6f 6c   of matching col
43e0: 75 6d 6e 20 6f 6e 20 74 68 65 20 6c 65 66 74 20  umn on the left 
43f0: 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69  */.        int i
4400: 52 69 67 68 74 43 6f 6c 3b 20 20 20 2f 2a 20 43  RightCol;   /* C
4410: 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 6f 66 20  olumn number of 
4420: 6d 61 74 63 68 69 6e 67 20 63 6f 6c 75 6d 6e 20  matching column 
4430: 6f 6e 20 74 68 65 20 72 69 67 68 74 20 2a 2f 0a  on the right */.
4440: 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d  .        zName =
4450: 20 70 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 7a 4e 61   pList->a[j].zNa
4460: 6d 65 3b 0a 20 20 20 20 20 20 20 20 69 52 69 67  me;.        iRig
4470: 68 74 43 6f 6c 20 3d 20 63 6f 6c 75 6d 6e 49 6e  htCol = columnIn
4480: 64 65 78 28 70 52 69 67 68 74 54 61 62 2c 20 7a  dex(pRightTab, z
4490: 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 69  Name);.        i
44a0: 66 28 20 69 52 69 67 68 74 43 6f 6c 3c 30 0a 20  f( iRightCol<0. 
44b0: 20 20 20 20 20 20 20 20 7c 7c 20 21 74 61 62 6c          || !tabl
44c0: 65 41 6e 64 43 6f 6c 75 6d 6e 49 6e 64 65 78 28  eAndColumnIndex(
44d0: 70 53 72 63 2c 20 69 2b 31 2c 20 7a 4e 61 6d 65  pSrc, i+1, zName
44e0: 2c 20 26 69 4c 65 66 74 2c 20 26 69 4c 65 66 74  , &iLeft, &iLeft
44f0: 43 6f 6c 29 0a 20 20 20 20 20 20 20 20 29 7b 0a  Col).        ){.
4500: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
4510: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
4520: 2c 20 22 63 61 6e 6e 6f 74 20 6a 6f 69 6e 20 75  , "cannot join u
4530: 73 69 6e 67 20 63 6f 6c 75 6d 6e 20 25 73 20 2d  sing column %s -
4540: 20 63 6f 6c 75 6d 6e 20 22 0a 20 20 20 20 20 20   column ".      
4550: 20 20 20 20 20 20 22 6e 6f 74 20 70 72 65 73 65        "not prese
4560: 6e 74 20 69 6e 20 62 6f 74 68 20 74 61 62 6c 65  nt in both table
4570: 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  s", zName);.    
4580: 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
4590: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
45a0: 20 20 61 64 64 57 68 65 72 65 54 65 72 6d 28 70    addWhereTerm(p
45b0: 50 61 72 73 65 2c 20 70 53 72 63 2c 20 69 4c 65  Parse, pSrc, iLe
45c0: 66 74 2c 20 69 4c 65 66 74 43 6f 6c 2c 20 69 2b  ft, iLeftCol, i+
45d0: 31 2c 20 69 52 69 67 68 74 43 6f 6c 2c 0a 20 20  1, iRightCol,.  
45e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
45f0: 20 20 20 69 73 4f 75 74 65 72 2c 20 26 70 2d 3e     isOuter, &p->
4600: 70 57 68 65 72 65 29 3b 0a 20 20 20 20 20 20 7d  pWhere);.      }
4610: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
4620: 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
4630: 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74  An instance of t
4640: 68 69 73 20 6f 62 6a 65 63 74 20 68 6f 6c 64 73  his object holds
4650: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 28 62 65   information (be
4660: 79 6f 6e 64 20 70 50 61 72 73 65 20 61 6e 64 20  yond pParse and 
4670: 70 53 65 6c 65 63 74 29 0a 2a 2a 20 6e 65 65 64  pSelect).** need
4680: 65 64 20 74 6f 20 6c 6f 61 64 20 74 68 65 20 6e  ed to load the n
4690: 65 78 74 20 72 65 73 75 6c 74 20 72 6f 77 20 74  ext result row t
46a0: 68 61 74 20 69 73 20 74 6f 20 62 65 20 61 64 64  hat is to be add
46b0: 65 64 20 74 6f 20 74 68 65 20 73 6f 72 74 65 72  ed to the sorter
46c0: 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72  ..*/.typedef str
46d0: 75 63 74 20 52 6f 77 4c 6f 61 64 49 6e 66 6f 20  uct RowLoadInfo 
46e0: 52 6f 77 4c 6f 61 64 49 6e 66 6f 3b 0a 73 74 72  RowLoadInfo;.str
46f0: 75 63 74 20 52 6f 77 4c 6f 61 64 49 6e 66 6f 20  uct RowLoadInfo 
4700: 7b 0a 20 20 69 6e 74 20 72 65 67 52 65 73 75 6c  {.  int regResul
4710: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
4720: 20 2f 2a 20 53 74 6f 72 65 20 72 65 73 75 6c 74   /* Store result
4730: 73 20 69 6e 20 61 72 72 61 79 20 6f 66 20 72 65  s in array of re
4740: 67 69 73 74 65 72 73 20 68 65 72 65 20 2a 2f 0a  gisters here */.
4750: 20 20 75 38 20 65 63 65 6c 46 6c 61 67 73 3b 20    u8 ecelFlags; 
4760: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
4770: 2a 20 46 6c 61 67 20 61 72 67 75 6d 65 6e 74 20  * Flag argument 
4780: 74 6f 20 45 78 70 72 43 6f 64 65 45 78 70 72 4c  to ExprCodeExprL
4790: 69 73 74 28 29 20 2a 2f 0a 23 69 66 64 65 66 20  ist() */.#ifdef 
47a0: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 4f  SQLITE_ENABLE_SO
47b0: 52 54 45 52 5f 52 45 46 45 52 45 4e 43 45 53 0a  RTER_REFERENCES.
47c0: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 78 74    ExprList *pExt
47d0: 72 61 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  ra;            /
47e0: 2a 20 45 78 74 72 61 20 63 6f 6c 75 6d 6e 73 20  * Extra columns 
47f0: 6e 65 65 64 65 64 20 62 79 20 73 6f 72 74 65 72  needed by sorter
4800: 20 72 65 66 73 20 2a 2f 0a 20 20 69 6e 74 20 72   refs */.  int r
4810: 65 67 45 78 74 72 61 52 65 73 75 6c 74 3b 20 20  egExtraResult;  
4820: 20 20 20 20 20 20 20 20 2f 2a 20 57 68 65 72 65          /* Where
4830: 20 74 6f 20 6c 6f 61 64 20 74 68 65 20 65 78 74   to load the ext
4840: 72 61 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 23 65  ra columns */.#e
4850: 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54  ndif.};../*.** T
4860: 68 69 73 20 72 6f 75 74 69 6e 65 20 64 6f 65 73  his routine does
4870: 20 74 68 65 20 77 6f 72 6b 20 6f 66 20 6c 6f 61   the work of loa
4880: 64 69 6e 67 20 71 75 65 72 79 20 64 61 74 61 20  ding query data 
4890: 69 6e 74 6f 20 61 6e 20 61 72 72 61 79 20 6f 66  into an array of
48a0: 0a 2a 2a 20 72 65 67 69 73 74 65 72 73 20 73 6f  .** registers so
48b0: 20 74 68 61 74 20 69 74 20 63 61 6e 20 62 65 20   that it can be 
48c0: 61 64 64 65 64 20 74 6f 20 74 68 65 20 73 6f 72  added to the sor
48d0: 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ter..*/.static v
48e0: 6f 69 64 20 69 6e 6e 65 72 4c 6f 6f 70 4c 6f 61  oid innerLoopLoa
48f0: 64 52 6f 77 28 0a 20 20 50 61 72 73 65 20 2a 70  dRow(.  Parse *p
4900: 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20  Parse,          
4910: 20 20 20 2f 2a 20 53 74 61 74 65 6d 65 6e 74 20     /* Statement 
4920: 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69  under constructi
4930: 6f 6e 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  on */.  Select *
4940: 70 53 65 6c 65 63 74 2c 20 20 20 20 20 20 20 20  pSelect,        
4950: 20 20 20 2f 2a 20 54 68 65 20 71 75 65 72 79 20     /* The query 
4960: 62 65 69 6e 67 20 63 6f 64 65 64 20 2a 2f 0a 20  being coded */. 
4970: 20 52 6f 77 4c 6f 61 64 49 6e 66 6f 20 2a 70 49   RowLoadInfo *pI
4980: 6e 66 6f 20 20 20 20 20 20 20 20 20 2f 2a 20 49  nfo         /* I
4990: 6e 66 6f 20 6e 65 65 64 65 64 20 74 6f 20 63 6f  nfo needed to co
49a0: 6d 70 6c 65 74 65 20 74 68 65 20 72 6f 77 20 6c  mplete the row l
49b0: 6f 61 64 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69  oad */.){.  sqli
49c0: 74 65 33 45 78 70 72 43 6f 64 65 45 78 70 72 4c  te3ExprCodeExprL
49d0: 69 73 74 28 70 50 61 72 73 65 2c 20 70 53 65 6c  ist(pParse, pSel
49e0: 65 63 74 2d 3e 70 45 4c 69 73 74 2c 20 70 49 6e  ect->pEList, pIn
49f0: 66 6f 2d 3e 72 65 67 52 65 73 75 6c 74 2c 0a 20  fo->regResult,. 
4a00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4a10: 20 20 20 20 20 20 20 20 20 30 2c 20 70 49 6e 66           0, pInf
4a20: 6f 2d 3e 65 63 65 6c 46 6c 61 67 73 29 3b 0a 23  o->ecelFlags);.#
4a30: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
4a40: 42 4c 45 5f 53 4f 52 54 45 52 5f 52 45 46 45 52  BLE_SORTER_REFER
4a50: 45 4e 43 45 53 0a 20 20 69 66 28 20 70 49 6e 66  ENCES.  if( pInf
4a60: 6f 2d 3e 70 45 78 74 72 61 20 29 7b 0a 20 20 20  o->pExtra ){.   
4a70: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
4a80: 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c  ExprList(pParse,
4a90: 20 70 49 6e 66 6f 2d 3e 70 45 78 74 72 61 2c 20   pInfo->pExtra, 
4aa0: 70 49 6e 66 6f 2d 3e 72 65 67 45 78 74 72 61 52  pInfo->regExtraR
4ab0: 65 73 75 6c 74 2c 20 30 2c 20 30 29 3b 0a 20 20  esult, 0, 0);.  
4ac0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73    sqlite3ExprLis
4ad0: 74 44 65 6c 65 74 65 28 70 50 61 72 73 65 2d 3e  tDelete(pParse->
4ae0: 64 62 2c 20 70 49 6e 66 6f 2d 3e 70 45 78 74 72  db, pInfo->pExtr
4af0: 61 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d  a);.  }.#endif.}
4b00: 0a 0a 2f 2a 0a 2a 2a 20 43 6f 64 65 20 74 68 65  ../*.** Code the
4b10: 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 20 69   OP_MakeRecord i
4b20: 6e 73 74 72 75 63 74 69 6f 6e 20 74 68 61 74 20  nstruction that 
4b30: 67 65 6e 65 72 61 74 65 73 20 74 68 65 20 65 6e  generates the en
4b40: 74 72 79 20 74 6f 20 62 65 0a 2a 2a 20 61 64 64  try to be.** add
4b50: 65 64 20 69 6e 74 6f 20 74 68 65 20 73 6f 72 74  ed into the sort
4b60: 65 72 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  er..**.** Return
4b70: 20 74 68 65 20 72 65 67 69 73 74 65 72 20 69 6e   the register in
4b80: 20 77 68 69 63 68 20 74 68 65 20 72 65 73 75 6c   which the resul
4b90: 74 20 69 73 20 73 74 6f 72 65 64 2e 0a 2a 2f 0a  t is stored..*/.
4ba0: 73 74 61 74 69 63 20 69 6e 74 20 6d 61 6b 65 53  static int makeS
4bb0: 6f 72 74 65 72 52 65 63 6f 72 64 28 0a 20 20 50  orterRecord(.  P
4bc0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 0a 20 20  arse *pParse,.  
4bd0: 53 6f 72 74 43 74 78 20 2a 70 53 6f 72 74 2c 0a  SortCtx *pSort,.
4be0: 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63    Select *pSelec
4bf0: 74 2c 0a 20 20 69 6e 74 20 72 65 67 42 61 73 65  t,.  int regBase
4c00: 2c 0a 20 20 69 6e 74 20 6e 42 61 73 65 0a 29 7b  ,.  int nBase.){
4c10: 0a 20 20 69 6e 74 20 6e 4f 42 53 61 74 20 3d 20  .  int nOBSat = 
4c20: 70 53 6f 72 74 2d 3e 6e 4f 42 53 61 74 3b 0a 20  pSort->nOBSat;. 
4c30: 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
4c40: 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20  e->pVdbe;.  int 
4c50: 72 65 67 4f 75 74 20 3d 20 2b 2b 70 50 61 72 73  regOut = ++pPars
4c60: 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 69 66 28 20 70  e->nMem;.  if( p
4c70: 53 6f 72 74 2d 3e 70 44 65 66 65 72 72 65 64 52  Sort->pDeferredR
4c80: 6f 77 4c 6f 61 64 20 29 7b 0a 20 20 20 20 69 6e  owLoad ){.    in
4c90: 6e 65 72 4c 6f 6f 70 4c 6f 61 64 52 6f 77 28 70  nerLoopLoadRow(p
4ca0: 50 61 72 73 65 2c 20 70 53 65 6c 65 63 74 2c 20  Parse, pSelect, 
4cb0: 70 53 6f 72 74 2d 3e 70 44 65 66 65 72 72 65 64  pSort->pDeferred
4cc0: 52 6f 77 4c 6f 61 64 29 3b 0a 20 20 7d 0a 20 20  RowLoad);.  }.  
4cd0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
4ce0: 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f  3(v, OP_MakeReco
4cf0: 72 64 2c 20 72 65 67 42 61 73 65 2b 6e 4f 42 53  rd, regBase+nOBS
4d00: 61 74 2c 20 6e 42 61 73 65 2d 6e 4f 42 53 61 74  at, nBase-nOBSat
4d10: 2c 20 72 65 67 4f 75 74 29 3b 0a 20 20 72 65 74  , regOut);.  ret
4d20: 75 72 6e 20 72 65 67 4f 75 74 3b 0a 7d 0a 0a 2f  urn regOut;.}../
4d30: 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  *.** Generate co
4d40: 64 65 20 74 68 61 74 20 77 69 6c 6c 20 70 75 73  de that will pus
4d50: 68 20 74 68 65 20 72 65 63 6f 72 64 20 69 6e 20  h the record in 
4d60: 72 65 67 69 73 74 65 72 73 20 72 65 67 44 61 74  registers regDat
4d70: 61 0a 2a 2a 20 74 68 72 6f 75 67 68 20 72 65 67  a.** through reg
4d80: 44 61 74 61 2b 6e 44 61 74 61 2d 31 20 6f 6e 74  Data+nData-1 ont
4d90: 6f 20 74 68 65 20 73 6f 72 74 65 72 2e 0a 2a 2f  o the sorter..*/
4da0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 75 73  .static void pus
4db0: 68 4f 6e 74 6f 53 6f 72 74 65 72 28 0a 20 20 50  hOntoSorter(.  P
4dc0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
4dd0: 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65 72 20        /* Parser 
4de0: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 6f 72  context */.  Sor
4df0: 74 43 74 78 20 2a 70 53 6f 72 74 2c 20 20 20 20  tCtx *pSort,    
4e00: 20 20 20 20 2f 2a 20 49 6e 66 6f 72 6d 61 74 69      /* Informati
4e10: 6f 6e 20 61 62 6f 75 74 20 74 68 65 20 4f 52 44  on about the ORD
4e20: 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a  ER BY clause */.
4e30: 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63    Select *pSelec
4e40: 74 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  t,       /* The 
4e50: 77 68 6f 6c 65 20 53 45 4c 45 43 54 20 73 74 61  whole SELECT sta
4e60: 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20  tement */.  int 
4e70: 72 65 67 44 61 74 61 2c 20 20 20 20 20 20 20 20  regData,        
4e80: 20 20 20 2f 2a 20 46 69 72 73 74 20 72 65 67 69     /* First regi
4e90: 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 64 61 74  ster holding dat
4ea0: 61 20 74 6f 20 62 65 20 73 6f 72 74 65 64 20 2a  a to be sorted *
4eb0: 2f 0a 20 20 69 6e 74 20 72 65 67 4f 72 69 67 44  /.  int regOrigD
4ec0: 61 74 61 2c 20 20 20 20 20 20 20 2f 2a 20 46 69  ata,       /* Fi
4ed0: 72 73 74 20 72 65 67 69 73 74 65 72 20 68 6f 6c  rst register hol
4ee0: 64 69 6e 67 20 64 61 74 61 20 62 65 66 6f 72 65  ding data before
4ef0: 20 70 61 63 6b 69 6e 67 20 2a 2f 0a 20 20 69 6e   packing */.  in
4f00: 74 20 6e 44 61 74 61 2c 20 20 20 20 20 20 20 20  t nData,        
4f10: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
4f20: 66 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20 74 68  f elements in th
4f30: 65 20 72 65 67 44 61 74 61 20 64 61 74 61 20 61  e regData data a
4f40: 72 72 61 79 20 2a 2f 0a 20 20 69 6e 74 20 6e 50  rray */.  int nP
4f50: 72 65 66 69 78 52 65 67 20 20 20 20 20 20 20 20  refixReg        
4f60: 20 2f 2a 20 4e 6f 2e 20 6f 66 20 72 65 67 20 70   /* No. of reg p
4f70: 72 69 6f 72 20 74 6f 20 72 65 67 44 61 74 61 20  rior to regData 
4f80: 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 75 73  available for us
4f90: 65 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a  e */.){.  Vdbe *
4fa0: 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
4fb0: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
4fc0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74             /* St
4fd0: 6d 74 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75  mt under constru
4fe0: 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 62  ction */.  int b
4ff0: 53 65 71 20 3d 20 28 28 70 53 6f 72 74 2d 3e 73  Seq = ((pSort->s
5000: 6f 72 74 46 6c 61 67 73 20 26 20 53 4f 52 54 46  ortFlags & SORTF
5010: 4c 41 47 5f 55 73 65 53 6f 72 74 65 72 29 3d 3d  LAG_UseSorter)==
5020: 30 29 3b 0a 20 20 69 6e 74 20 6e 45 78 70 72 20  0);.  int nExpr 
5030: 3d 20 70 53 6f 72 74 2d 3e 70 4f 72 64 65 72 42  = pSort->pOrderB
5040: 79 2d 3e 6e 45 78 70 72 3b 20 20 20 20 20 20 20  y->nExpr;       
5050: 20 20 20 20 20 20 20 2f 2a 20 4e 6f 2e 20 6f 66         /* No. of
5060: 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d 73 20   ORDER BY terms 
5070: 2a 2f 0a 20 20 69 6e 74 20 6e 42 61 73 65 20 3d  */.  int nBase =
5080: 20 6e 45 78 70 72 20 2b 20 62 53 65 71 20 2b 20   nExpr + bSeq + 
5090: 6e 44 61 74 61 3b 20 20 20 20 20 20 20 20 20 20  nData;          
50a0: 20 20 20 20 20 20 2f 2a 20 46 69 65 6c 64 73 20        /* Fields 
50b0: 69 6e 20 73 6f 72 74 65 72 20 72 65 63 6f 72 64  in sorter record
50c0: 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 42 61 73   */.  int regBas
50d0: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
50e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
50f0: 20 20 20 20 20 20 20 2f 2a 20 52 65 67 73 20 66         /* Regs f
5100: 6f 72 20 73 6f 72 74 65 72 20 72 65 63 6f 72 64  or sorter record
5110: 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 52 65 63   */.  int regRec
5120: 6f 72 64 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ord = 0;        
5130: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5140: 20 20 20 20 20 20 20 2f 2a 20 41 73 73 65 6d 62         /* Assemb
5150: 6c 65 64 20 73 6f 72 74 65 72 20 72 65 63 6f 72  led sorter recor
5160: 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f 42 53 61  d */.  int nOBSa
5170: 74 20 3d 20 70 53 6f 72 74 2d 3e 6e 4f 42 53 61  t = pSort->nOBSa
5180: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
5190: 20 20 20 20 20 20 20 20 2f 2a 20 4f 52 44 45 52          /* ORDER
51a0: 20 42 59 20 74 65 72 6d 73 20 74 6f 20 73 6b 69   BY terms to ski
51b0: 70 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 3b 20 20  p */.  int op;  
51c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
51d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 63            /* Opc
51e0: 6f 64 65 20 74 6f 20 61 64 64 20 73 6f 72 74 65  ode to add sorte
51f0: 72 20 72 65 63 6f 72 64 20 74 6f 20 73 6f 72 74  r record to sort
5200: 65 72 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 69 6d  er */.  int iLim
5210: 69 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  it;             
5220: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 49             /* LI
5230: 4d 49 54 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  MIT counter */. 
5240: 20 69 6e 74 20 69 53 6b 69 70 20 3d 20 30 3b 20   int iSkip = 0; 
5250: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5260: 20 20 20 20 2f 2a 20 45 6e 64 20 6f 66 20 74 68      /* End of th
5270: 65 20 73 6f 72 74 65 72 20 69 6e 73 65 72 74 20  e sorter insert 
5280: 6c 6f 6f 70 20 2a 2f 0a 0a 20 20 61 73 73 65 72  loop */..  asser
5290: 74 28 20 62 53 65 71 3d 3d 30 20 7c 7c 20 62 53  t( bSeq==0 || bS
52a0: 65 71 3d 3d 31 20 29 3b 0a 0a 20 20 2f 2a 20 54  eq==1 );..  /* T
52b0: 68 72 65 65 20 63 61 73 65 73 3a 0a 20 20 2a 2a  hree cases:.  **
52c0: 20 20 20 28 31 29 20 54 68 65 20 64 61 74 61 20     (1) The data 
52d0: 74 6f 20 62 65 20 73 6f 72 74 65 64 20 68 61 73  to be sorted has
52e0: 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 70 61   already been pa
52f0: 63 6b 65 64 20 69 6e 74 6f 20 61 20 52 65 63 6f  cked into a Reco
5300: 72 64 0a 20 20 2a 2a 20 20 20 20 20 20 20 62 79  rd.  **       by
5310: 20 61 20 70 72 69 6f 72 20 4f 50 5f 4d 61 6b 65   a prior OP_Make
5320: 52 65 63 6f 72 64 2e 20 20 49 6e 20 74 68 69 73  Record.  In this
5330: 20 63 61 73 65 20 6e 44 61 74 61 3d 3d 31 20 61   case nData==1 a
5340: 6e 64 20 72 65 67 44 61 74 61 0a 20 20 2a 2a 20  nd regData.  ** 
5350: 20 20 20 20 20 20 77 69 6c 6c 20 62 65 20 63 6f        will be co
5360: 6d 70 6c 65 74 65 6c 79 20 75 6e 72 65 6c 61 74  mpletely unrelat
5370: 65 64 20 74 6f 20 72 65 67 4f 72 69 67 44 61 74  ed to regOrigDat
5380: 61 2e 0a 20 20 2a 2a 20 20 20 28 32 29 20 41 6c  a..  **   (2) Al
5390: 6c 20 6f 75 74 70 75 74 20 63 6f 6c 75 6d 6e 73  l output columns
53a0: 20 61 72 65 20 69 6e 63 6c 75 64 65 64 20 69 6e   are included in
53b0: 20 74 68 65 20 73 6f 72 74 20 72 65 63 6f 72 64   the sort record
53c0: 2e 20 20 49 6e 20 74 68 61 74 0a 20 20 2a 2a 20  .  In that.  ** 
53d0: 20 20 20 20 20 20 63 61 73 65 20 72 65 67 44 61        case regDa
53e0: 74 61 3d 3d 72 65 67 4f 72 69 67 44 61 74 61 2e  ta==regOrigData.
53f0: 0a 20 20 2a 2a 20 20 20 28 33 29 20 53 6f 6d 65  .  **   (3) Some
5400: 20 6f 75 74 70 75 74 20 63 6f 6c 75 6d 6e 73 20   output columns 
5410: 61 72 65 20 6f 6d 69 74 74 65 64 20 66 72 6f 6d  are omitted from
5420: 20 74 68 65 20 73 6f 72 74 20 72 65 63 6f 72 64   the sort record
5430: 20 64 75 65 20 74 6f 0a 20 20 2a 2a 20 20 20 20   due to.  **    
5440: 20 20 20 74 68 65 20 53 51 4c 49 54 45 5f 45 4e     the SQLITE_EN
5450: 41 42 4c 45 5f 53 4f 52 54 45 52 5f 52 45 46 45  ABLE_SORTER_REFE
5460: 52 45 4e 43 45 20 6f 70 74 69 6d 69 7a 61 74 69  RENCE optimizati
5470: 6f 6e 2c 20 6f 72 20 64 75 65 20 74 6f 20 74 68  on, or due to th
5480: 65 0a 20 20 2a 2a 20 20 20 20 20 20 20 53 51 4c  e.  **       SQL
5490: 49 54 45 5f 45 43 45 4c 5f 4f 4d 49 54 52 45 46  ITE_ECEL_OMITREF
54a0: 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2c 20 6f   optimization, o
54b0: 72 20 64 75 65 20 74 6f 20 74 68 65 20 0a 20 20  r due to the .  
54c0: 2a 2a 20 20 20 20 20 20 20 53 6f 72 74 43 74 78  **       SortCtx
54d0: 2e 70 44 65 66 65 72 72 65 64 52 6f 77 4c 6f 61  .pDeferredRowLoa
54e0: 64 20 6f 70 74 69 6d 69 61 74 69 6f 6e 2e 20 20  d optimiation.  
54f0: 49 6e 20 61 6e 79 20 6f 66 20 74 68 65 73 65 20  In any of these 
5500: 63 61 73 65 73 0a 20 20 2a 2a 20 20 20 20 20 20  cases.  **      
5510: 20 72 65 67 4f 72 69 67 44 61 74 61 20 69 73 20   regOrigData is 
5520: 30 20 74 6f 20 70 72 65 76 65 6e 74 20 74 68 69  0 to prevent thi
5530: 73 20 72 6f 75 74 69 6e 65 20 66 72 6f 6d 20 74  s routine from t
5540: 72 79 69 6e 67 20 74 6f 20 63 6f 70 79 0a 20 20  rying to copy.  
5550: 2a 2a 20 20 20 20 20 20 20 76 61 6c 75 65 73 20  **       values 
5560: 74 68 61 74 20 6d 69 67 68 74 20 6e 6f 74 20 79  that might not y
5570: 65 74 20 65 78 69 73 74 2e 0a 20 20 2a 2f 0a 20  et exist..  */. 
5580: 20 61 73 73 65 72 74 28 20 6e 44 61 74 61 3d 3d   assert( nData==
5590: 31 20 7c 7c 20 72 65 67 44 61 74 61 3d 3d 72 65  1 || regData==re
55a0: 67 4f 72 69 67 44 61 74 61 20 7c 7c 20 72 65 67  gOrigData || reg
55b0: 4f 72 69 67 44 61 74 61 3d 3d 30 20 29 3b 0a 0a  OrigData==0 );..
55c0: 20 20 69 66 28 20 6e 50 72 65 66 69 78 52 65 67    if( nPrefixReg
55d0: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
55e0: 6e 50 72 65 66 69 78 52 65 67 3d 3d 6e 45 78 70  nPrefixReg==nExp
55f0: 72 2b 62 53 65 71 20 29 3b 0a 20 20 20 20 72 65  r+bSeq );.    re
5600: 67 42 61 73 65 20 3d 20 72 65 67 44 61 74 61 20  gBase = regData 
5610: 2d 20 6e 50 72 65 66 69 78 52 65 67 3b 0a 20 20  - nPrefixReg;.  
5620: 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 67 42 61  }else{.    regBa
5630: 73 65 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65  se = pParse->nMe
5640: 6d 20 2b 20 31 3b 0a 20 20 20 20 70 50 61 72 73  m + 1;.    pPars
5650: 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 42 61 73 65  e->nMem += nBase
5660: 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
5670: 70 53 65 6c 65 63 74 2d 3e 69 4f 66 66 73 65 74  pSelect->iOffset
5680: 3d 3d 30 20 7c 7c 20 70 53 65 6c 65 63 74 2d 3e  ==0 || pSelect->
5690: 69 4c 69 6d 69 74 21 3d 30 20 29 3b 0a 20 20 69  iLimit!=0 );.  i
56a0: 4c 69 6d 69 74 20 3d 20 70 53 65 6c 65 63 74 2d  Limit = pSelect-
56b0: 3e 69 4f 66 66 73 65 74 20 3f 20 70 53 65 6c 65  >iOffset ? pSele
56c0: 63 74 2d 3e 69 4f 66 66 73 65 74 2b 31 20 3a 20  ct->iOffset+1 : 
56d0: 70 53 65 6c 65 63 74 2d 3e 69 4c 69 6d 69 74 3b  pSelect->iLimit;
56e0: 0a 20 20 70 53 6f 72 74 2d 3e 6c 61 62 65 6c 44  .  pSort->labelD
56f0: 6f 6e 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62  one = sqlite3Vdb
5700: 65 4d 61 6b 65 4c 61 62 65 6c 28 70 50 61 72 73  eMakeLabel(pPars
5710: 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70  e);.  sqlite3Exp
5720: 72 43 6f 64 65 45 78 70 72 4c 69 73 74 28 70 50  rCodeExprList(pP
5730: 61 72 73 65 2c 20 70 53 6f 72 74 2d 3e 70 4f 72  arse, pSort->pOr
5740: 64 65 72 42 79 2c 20 72 65 67 42 61 73 65 2c 20  derBy, regBase, 
5750: 72 65 67 4f 72 69 67 44 61 74 61 2c 0a 20 20 20  regOrigData,.   
5760: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5770: 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 45 43         SQLITE_EC
5780: 45 4c 5f 44 55 50 20 7c 20 28 72 65 67 4f 72 69  EL_DUP | (regOri
5790: 67 44 61 74 61 3f 20 53 51 4c 49 54 45 5f 45 43  gData? SQLITE_EC
57a0: 45 4c 5f 52 45 46 20 3a 20 30 29 29 3b 0a 20 20  EL_REF : 0));.  
57b0: 69 66 28 20 62 53 65 71 20 29 7b 0a 20 20 20 20  if( bSeq ){.    
57c0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
57d0: 32 28 76 2c 20 4f 50 5f 53 65 71 75 65 6e 63 65  2(v, OP_Sequence
57e0: 2c 20 70 53 6f 72 74 2d 3e 69 45 43 75 72 73 6f  , pSort->iECurso
57f0: 72 2c 20 72 65 67 42 61 73 65 2b 6e 45 78 70 72  r, regBase+nExpr
5800: 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 50 72  );.  }.  if( nPr
5810: 65 66 69 78 52 65 67 3d 3d 30 20 26 26 20 6e 44  efixReg==0 && nD
5820: 61 74 61 3e 30 20 29 7b 0a 20 20 20 20 73 71 6c  ata>0 ){.    sql
5830: 69 74 65 33 45 78 70 72 43 6f 64 65 4d 6f 76 65  ite3ExprCodeMove
5840: 28 70 50 61 72 73 65 2c 20 72 65 67 44 61 74 61  (pParse, regData
5850: 2c 20 72 65 67 42 61 73 65 2b 6e 45 78 70 72 2b  , regBase+nExpr+
5860: 62 53 65 71 2c 20 6e 44 61 74 61 29 3b 0a 20 20  bSeq, nData);.  
5870: 7d 0a 20 20 69 66 28 20 6e 4f 42 53 61 74 3e 30  }.  if( nOBSat>0
5880: 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 65 67 50   ){.    int regP
5890: 72 65 76 4b 65 79 3b 20 20 20 2f 2a 20 54 68 65  revKey;   /* The
58a0: 20 66 69 72 73 74 20 6e 4f 42 53 61 74 20 63 6f   first nOBSat co
58b0: 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20 70 72 65  lumns of the pre
58c0: 76 69 6f 75 73 20 72 6f 77 20 2a 2f 0a 20 20 20  vious row */.   
58d0: 20 69 6e 74 20 61 64 64 72 46 69 72 73 74 3b 20   int addrFirst; 
58e0: 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66     /* Address of
58f0: 20 74 68 65 20 4f 50 5f 49 66 4e 6f 74 20 6f 70   the OP_IfNot op
5900: 63 6f 64 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20  code */.    int 
5910: 61 64 64 72 4a 6d 70 3b 20 20 20 20 20 20 2f 2a  addrJmp;      /*
5920: 20 41 64 64 72 65 73 73 20 6f 66 20 74 68 65 20   Address of the 
5930: 4f 50 5f 4a 75 6d 70 20 6f 70 63 6f 64 65 20 2a  OP_Jump opcode *
5940: 2f 0a 20 20 20 20 56 64 62 65 4f 70 20 2a 70 4f  /.    VdbeOp *pO
5950: 70 3b 20 20 20 20 20 20 2f 2a 20 4f 70 63 6f 64  p;      /* Opcod
5960: 65 20 74 68 61 74 20 6f 70 65 6e 73 20 74 68 65  e that opens the
5970: 20 73 6f 72 74 65 72 20 2a 2f 0a 20 20 20 20 69   sorter */.    i
5980: 6e 74 20 6e 4b 65 79 3b 20 20 20 20 20 20 20 20  nt nKey;        
5990: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 73 6f   /* Number of so
59a0: 72 74 69 6e 67 20 6b 65 79 20 63 6f 6c 75 6d 6e  rting key column
59b0: 73 2c 20 69 6e 63 6c 75 64 69 6e 67 20 4f 50 5f  s, including OP_
59c0: 53 65 71 75 65 6e 63 65 20 2a 2f 0a 20 20 20 20  Sequence */.    
59d0: 4b 65 79 49 6e 66 6f 20 2a 70 4b 49 3b 20 20 20  KeyInfo *pKI;   
59e0: 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 4b 65    /* Original Ke
59f0: 79 49 6e 66 6f 20 6f 6e 20 74 68 65 20 73 6f 72  yInfo on the sor
5a00: 74 65 72 20 74 61 62 6c 65 20 2a 2f 0a 0a 20 20  ter table */..  
5a10: 20 20 72 65 67 52 65 63 6f 72 64 20 3d 20 6d 61    regRecord = ma
5a20: 6b 65 53 6f 72 74 65 72 52 65 63 6f 72 64 28 70  keSorterRecord(p
5a30: 50 61 72 73 65 2c 20 70 53 6f 72 74 2c 20 70 53  Parse, pSort, pS
5a40: 65 6c 65 63 74 2c 20 72 65 67 42 61 73 65 2c 20  elect, regBase, 
5a50: 6e 42 61 73 65 29 3b 0a 20 20 20 20 72 65 67 50  nBase);.    regP
5a60: 72 65 76 4b 65 79 20 3d 20 70 50 61 72 73 65 2d  revKey = pParse-
5a70: 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20 70 50 61  >nMem+1;.    pPa
5a80: 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 70 53 6f  rse->nMem += pSo
5a90: 72 74 2d 3e 6e 4f 42 53 61 74 3b 0a 20 20 20 20  rt->nOBSat;.    
5aa0: 6e 4b 65 79 20 3d 20 6e 45 78 70 72 20 2d 20 70  nKey = nExpr - p
5ab0: 53 6f 72 74 2d 3e 6e 4f 42 53 61 74 20 2b 20 62  Sort->nOBSat + b
5ac0: 53 65 71 3b 0a 20 20 20 20 69 66 28 20 62 53 65  Seq;.    if( bSe
5ad0: 71 20 29 7b 0a 20 20 20 20 20 20 61 64 64 72 46  q ){.      addrF
5ae0: 69 72 73 74 20 3d 20 73 71 6c 69 74 65 33 56 64  irst = sqlite3Vd
5af0: 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49  beAddOp1(v, OP_I
5b00: 66 4e 6f 74 2c 20 72 65 67 42 61 73 65 2b 6e 45  fNot, regBase+nE
5b10: 78 70 72 29 3b 20 0a 20 20 20 20 7d 65 6c 73 65  xpr); .    }else
5b20: 7b 0a 20 20 20 20 20 20 61 64 64 72 46 69 72 73  {.      addrFirs
5b30: 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  t = sqlite3VdbeA
5b40: 64 64 4f 70 31 28 76 2c 20 4f 50 5f 53 65 71 75  ddOp1(v, OP_Sequ
5b50: 65 6e 63 65 54 65 73 74 2c 20 70 53 6f 72 74 2d  enceTest, pSort-
5b60: 3e 69 45 43 75 72 73 6f 72 29 3b 0a 20 20 20 20  >iECursor);.    
5b70: 7d 0a 20 20 20 20 56 64 62 65 43 6f 76 65 72 61  }.    VdbeCovera
5b80: 67 65 28 76 29 3b 0a 20 20 20 20 73 71 6c 69 74  ge(v);.    sqlit
5b90: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
5ba0: 4f 50 5f 43 6f 6d 70 61 72 65 2c 20 72 65 67 50  OP_Compare, regP
5bb0: 72 65 76 4b 65 79 2c 20 72 65 67 42 61 73 65 2c  revKey, regBase,
5bc0: 20 70 53 6f 72 74 2d 3e 6e 4f 42 53 61 74 29 3b   pSort->nOBSat);
5bd0: 0a 20 20 20 20 70 4f 70 20 3d 20 73 71 6c 69 74  .    pOp = sqlit
5be0: 65 33 56 64 62 65 47 65 74 4f 70 28 76 2c 20 70  e3VdbeGetOp(v, p
5bf0: 53 6f 72 74 2d 3e 61 64 64 72 53 6f 72 74 49 6e  Sort->addrSortIn
5c00: 64 65 78 29 3b 0a 20 20 20 20 69 66 28 20 70 50  dex);.    if( pP
5c10: 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  arse->db->malloc
5c20: 46 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b  Failed ) return;
5c30: 0a 20 20 20 20 70 4f 70 2d 3e 70 32 20 3d 20 6e  .    pOp->p2 = n
5c40: 4b 65 79 20 2b 20 6e 44 61 74 61 3b 0a 20 20 20  Key + nData;.   
5c50: 20 70 4b 49 20 3d 20 70 4f 70 2d 3e 70 34 2e 70   pKI = pOp->p4.p
5c60: 4b 65 79 49 6e 66 6f 3b 0a 20 20 20 20 6d 65 6d  KeyInfo;.    mem
5c70: 73 65 74 28 70 4b 49 2d 3e 61 53 6f 72 74 4f 72  set(pKI->aSortOr
5c80: 64 65 72 2c 20 30 2c 20 70 4b 49 2d 3e 6e 4b 65  der, 0, pKI->nKe
5c90: 79 46 69 65 6c 64 29 3b 20 2f 2a 20 4d 61 6b 65  yField); /* Make
5ca0: 73 20 4f 50 5f 4a 75 6d 70 20 74 65 73 74 61 62  s OP_Jump testab
5cb0: 6c 65 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65  le */.    sqlite
5cc0: 33 56 64 62 65 43 68 61 6e 67 65 50 34 28 76 2c  3VdbeChangeP4(v,
5cd0: 20 2d 31 2c 20 28 63 68 61 72 2a 29 70 4b 49 2c   -1, (char*)pKI,
5ce0: 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20   P4_KEYINFO);.  
5cf0: 20 20 74 65 73 74 63 61 73 65 28 20 70 4b 49 2d    testcase( pKI-
5d00: 3e 6e 41 6c 6c 46 69 65 6c 64 20 3e 20 70 4b 49  >nAllField > pKI
5d10: 2d 3e 6e 4b 65 79 46 69 65 6c 64 2b 32 20 29 3b  ->nKeyField+2 );
5d20: 0a 20 20 20 20 70 4f 70 2d 3e 70 34 2e 70 4b 65  .    pOp->p4.pKe
5d30: 79 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 4b  yInfo = sqlite3K
5d40: 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69  eyInfoFromExprLi
5d50: 73 74 28 70 50 61 72 73 65 2c 70 53 6f 72 74 2d  st(pParse,pSort-
5d60: 3e 70 4f 72 64 65 72 42 79 2c 6e 4f 42 53 61 74  >pOrderBy,nOBSat
5d70: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
5d80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5d90: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 4b 49               pKI
5da0: 2d 3e 6e 41 6c 6c 46 69 65 6c 64 2d 70 4b 49 2d  ->nAllField-pKI-
5db0: 3e 6e 4b 65 79 46 69 65 6c 64 2d 31 29 3b 0a 20  >nKeyField-1);. 
5dc0: 20 20 20 61 64 64 72 4a 6d 70 20 3d 20 73 71 6c     addrJmp = sql
5dd0: 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
5de0: 64 64 72 28 76 29 3b 0a 20 20 20 20 73 71 6c 69  ddr(v);.    sqli
5df0: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
5e00: 20 4f 50 5f 4a 75 6d 70 2c 20 61 64 64 72 4a 6d   OP_Jump, addrJm
5e10: 70 2b 31 2c 20 30 2c 20 61 64 64 72 4a 6d 70 2b  p+1, 0, addrJmp+
5e20: 31 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  1); VdbeCoverage
5e30: 28 76 29 3b 0a 20 20 20 20 70 53 6f 72 74 2d 3e  (v);.    pSort->
5e40: 6c 61 62 65 6c 42 6b 4f 75 74 20 3d 20 73 71 6c  labelBkOut = sql
5e50: 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
5e60: 6c 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 70  l(pParse);.    p
5e70: 53 6f 72 74 2d 3e 72 65 67 52 65 74 75 72 6e 20  Sort->regReturn 
5e80: 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
5e90: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
5ea0: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f  eAddOp2(v, OP_Go
5eb0: 73 75 62 2c 20 70 53 6f 72 74 2d 3e 72 65 67 52  sub, pSort->regR
5ec0: 65 74 75 72 6e 2c 20 70 53 6f 72 74 2d 3e 6c 61  eturn, pSort->la
5ed0: 62 65 6c 42 6b 4f 75 74 29 3b 0a 20 20 20 20 73  belBkOut);.    s
5ee0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
5ef0: 28 76 2c 20 4f 50 5f 52 65 73 65 74 53 6f 72 74  (v, OP_ResetSort
5f00: 65 72 2c 20 70 53 6f 72 74 2d 3e 69 45 43 75 72  er, pSort->iECur
5f10: 73 6f 72 29 3b 0a 20 20 20 20 69 66 28 20 69 4c  sor);.    if( iL
5f20: 69 6d 69 74 20 29 7b 0a 20 20 20 20 20 20 73 71  imit ){.      sq
5f30: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
5f40: 76 2c 20 4f 50 5f 49 66 4e 6f 74 2c 20 69 4c 69  v, OP_IfNot, iLi
5f50: 6d 69 74 2c 20 70 53 6f 72 74 2d 3e 6c 61 62 65  mit, pSort->labe
5f60: 6c 44 6f 6e 65 29 3b 0a 20 20 20 20 20 20 56 64  lDone);.      Vd
5f70: 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
5f80: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
5f90: 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
5fa0: 61 64 64 72 46 69 72 73 74 29 3b 0a 20 20 20 20  addrFirst);.    
5fb0: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 4d  sqlite3ExprCodeM
5fc0: 6f 76 65 28 70 50 61 72 73 65 2c 20 72 65 67 42  ove(pParse, regB
5fd0: 61 73 65 2c 20 72 65 67 50 72 65 76 4b 65 79 2c  ase, regPrevKey,
5fe0: 20 70 53 6f 72 74 2d 3e 6e 4f 42 53 61 74 29 3b   pSort->nOBSat);
5ff0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
6000: 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72  JumpHere(v, addr
6010: 4a 6d 70 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  Jmp);.  }.  if( 
6020: 69 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 2f 2a  iLimit ){.    /*
6030: 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 20 74   At this point t
6040: 68 65 20 76 61 6c 75 65 73 20 66 6f 72 20 74 68  he values for th
6050: 65 20 6e 65 77 20 73 6f 72 74 65 72 20 65 6e 74  e new sorter ent
6060: 72 79 20 61 72 65 20 73 74 6f 72 65 64 0a 20 20  ry are stored.  
6070: 20 20 2a 2a 20 69 6e 20 61 6e 20 61 72 72 61 79    ** in an array
6080: 20 6f 66 20 72 65 67 69 73 74 65 72 73 2e 20 54   of registers. T
6090: 68 65 79 20 6e 65 65 64 20 74 6f 20 62 65 20 63  hey need to be c
60a0: 6f 6d 70 6f 73 65 64 20 69 6e 74 6f 20 61 20 72  omposed into a r
60b0: 65 63 6f 72 64 0a 20 20 20 20 2a 2a 20 61 6e 64  ecord.    ** and
60c0: 20 69 6e 73 65 72 74 65 64 20 69 6e 74 6f 20 74   inserted into t
60d0: 68 65 20 73 6f 72 74 65 72 20 69 66 20 65 69 74  he sorter if eit
60e0: 68 65 72 20 28 61 29 20 74 68 65 72 65 20 61 72  her (a) there ar
60f0: 65 20 63 75 72 72 65 6e 74 6c 79 0a 20 20 20 20  e currently.    
6100: 2a 2a 20 6c 65 73 73 20 74 68 61 6e 20 4c 49 4d  ** less than LIM
6110: 49 54 2b 4f 46 46 53 45 54 20 69 74 65 6d 73 20  IT+OFFSET items 
6120: 6f 72 20 28 62 29 20 74 68 65 20 6e 65 77 20 72  or (b) the new r
6130: 65 63 6f 72 64 20 69 73 20 73 6d 61 6c 6c 65 72  ecord is smaller
6140: 20 74 68 61 6e 20 0a 20 20 20 20 2a 2a 20 74 68   than .    ** th
6150: 65 20 6c 61 72 67 65 73 74 20 72 65 63 6f 72 64  e largest record
6160: 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 74 68   currently in th
6170: 65 20 73 6f 72 74 65 72 2e 20 49 66 20 28 62 29  e sorter. If (b)
6180: 20 69 73 20 74 72 75 65 20 61 6e 64 20 74 68 65   is true and the
6190: 72 65 0a 20 20 20 20 2a 2a 20 61 72 65 20 61 6c  re.    ** are al
61a0: 72 65 61 64 79 20 4c 49 4d 49 54 2b 4f 46 46 53  ready LIMIT+OFFS
61b0: 45 54 20 69 74 65 6d 73 20 69 6e 20 74 68 65 20  ET items in the 
61c0: 73 6f 72 74 65 72 2c 20 64 65 6c 65 74 65 20 74  sorter, delete t
61d0: 68 65 20 6c 61 72 67 65 73 74 0a 20 20 20 20 2a  he largest.    *
61e0: 2a 20 65 6e 74 72 79 20 62 65 66 6f 72 65 20 69  * entry before i
61f0: 6e 73 65 72 74 69 6e 67 20 74 68 65 20 6e 65 77  nserting the new
6200: 20 6f 6e 65 2e 20 54 68 69 73 20 77 61 79 20 74   one. This way t
6210: 68 65 72 65 20 61 72 65 20 6e 65 76 65 72 20 6d  here are never m
6220: 6f 72 65 20 0a 20 20 20 20 2a 2a 20 74 68 61 6e  ore .    ** than
6230: 20 4c 49 4d 49 54 2b 4f 46 46 53 45 54 20 69 74   LIMIT+OFFSET it
6240: 65 6d 73 20 69 6e 20 74 68 65 20 73 6f 72 74 65  ems in the sorte
6250: 72 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  r..    **.    **
6260: 20 49 66 20 74 68 65 20 6e 65 77 20 72 65 63 6f   If the new reco
6270: 72 64 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64  rd does not need
6280: 20 74 6f 20 62 65 20 69 6e 73 65 72 74 65 64 20   to be inserted 
6290: 69 6e 74 6f 20 74 68 65 20 73 6f 72 74 65 72 2c  into the sorter,
62a0: 0a 20 20 20 20 2a 2a 20 6a 75 6d 70 20 74 6f 20  .    ** jump to 
62b0: 74 68 65 20 6e 65 78 74 20 69 74 65 72 61 74 69  the next iterati
62c0: 6f 6e 20 6f 66 20 74 68 65 20 6c 6f 6f 70 2e 20  on of the loop. 
62d0: 49 66 20 74 68 65 20 70 53 6f 72 74 2d 3e 6c 61  If the pSort->la
62e0: 62 65 6c 4f 42 4c 6f 70 74 0a 20 20 20 20 2a 2a  belOBLopt.    **
62f0: 20 76 61 6c 75 65 20 69 73 20 6e 6f 74 20 7a 65   value is not ze
6300: 72 6f 2c 20 74 68 65 6e 20 69 74 20 69 73 20 61  ro, then it is a
6310: 20 6c 61 62 65 6c 20 6f 66 20 77 68 65 72 65 20   label of where 
6320: 74 6f 20 6a 75 6d 70 2e 20 20 4f 74 68 65 72 77  to jump.  Otherw
6330: 69 73 65 2c 0a 20 20 20 20 2a 2a 20 6a 75 73 74  ise,.    ** just
6340: 20 62 79 70 61 73 73 20 74 68 65 20 72 6f 77 20   bypass the row 
6350: 69 6e 73 65 72 74 20 6c 6f 67 69 63 2e 20 20 53  insert logic.  S
6360: 65 65 20 74 68 65 20 68 65 61 64 65 72 20 63 6f  ee the header co
6370: 6d 6d 65 6e 74 20 6f 6e 20 74 68 65 0a 20 20 20  mment on the.   
6380: 20 2a 2a 20 73 71 6c 69 74 65 33 57 68 65 72 65   ** sqlite3Where
6390: 4f 72 64 65 72 42 79 4c 69 6d 69 74 4f 70 74 4c  OrderByLimitOptL
63a0: 61 62 65 6c 28 29 20 66 75 6e 63 74 69 6f 6e 20  abel() function 
63b0: 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69  for additional i
63c0: 6e 66 6f 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  nfo..    */.    
63d0: 69 6e 74 20 69 43 73 72 20 3d 20 70 53 6f 72 74  int iCsr = pSort
63e0: 2d 3e 69 45 43 75 72 73 6f 72 3b 0a 20 20 20 20  ->iECursor;.    
63f0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
6400: 32 28 76 2c 20 4f 50 5f 49 66 4e 6f 74 5a 65 72  2(v, OP_IfNotZer
6410: 6f 2c 20 69 4c 69 6d 69 74 2c 20 73 71 6c 69 74  o, iLimit, sqlit
6420: 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
6430: 72 28 76 29 2b 34 29 3b 0a 20 20 20 20 56 64 62  r(v)+4);.    Vdb
6440: 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
6450: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
6460: 4f 70 32 28 76 2c 20 4f 50 5f 4c 61 73 74 2c 20  Op2(v, OP_Last, 
6470: 69 43 73 72 2c 20 30 29 3b 0a 20 20 20 20 69 53  iCsr, 0);.    iS
6480: 6b 69 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62  kip = sqlite3Vdb
6490: 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50  eAddOp4Int(v, OP
64a0: 5f 49 64 78 4c 45 2c 0a 20 20 20 20 20 20 20 20  _IdxLE,.        
64b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
64c0: 20 20 20 20 20 20 20 20 20 69 43 73 72 2c 20 30           iCsr, 0
64d0: 2c 20 72 65 67 42 61 73 65 2b 6e 4f 42 53 61 74  , regBase+nOBSat
64e0: 2c 20 6e 45 78 70 72 2d 6e 4f 42 53 61 74 29 3b  , nExpr-nOBSat);
64f0: 0a 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67  .    VdbeCoverag
6500: 65 28 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  e(v);.    sqlite
6510: 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
6520: 50 5f 44 65 6c 65 74 65 2c 20 69 43 73 72 29 3b  P_Delete, iCsr);
6530: 0a 20 20 7d 0a 20 20 69 66 28 20 72 65 67 52 65  .  }.  if( regRe
6540: 63 6f 72 64 3d 3d 30 20 29 7b 0a 20 20 20 20 72  cord==0 ){.    r
6550: 65 67 52 65 63 6f 72 64 20 3d 20 6d 61 6b 65 53  egRecord = makeS
6560: 6f 72 74 65 72 52 65 63 6f 72 64 28 70 50 61 72  orterRecord(pPar
6570: 73 65 2c 20 70 53 6f 72 74 2c 20 70 53 65 6c 65  se, pSort, pSele
6580: 63 74 2c 20 72 65 67 42 61 73 65 2c 20 6e 42 61  ct, regBase, nBa
6590: 73 65 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  se);.  }.  if( p
65a0: 53 6f 72 74 2d 3e 73 6f 72 74 46 6c 61 67 73 20  Sort->sortFlags 
65b0: 26 20 53 4f 52 54 46 4c 41 47 5f 55 73 65 53 6f  & SORTFLAG_UseSo
65c0: 72 74 65 72 20 29 7b 0a 20 20 20 20 6f 70 20 3d  rter ){.    op =
65d0: 20 4f 50 5f 53 6f 72 74 65 72 49 6e 73 65 72 74   OP_SorterInsert
65e0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6f  ;.  }else{.    o
65f0: 70 20 3d 20 4f 50 5f 49 64 78 49 6e 73 65 72 74  p = OP_IdxInsert
6600: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56  ;.  }.  sqlite3V
6610: 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20  dbeAddOp4Int(v, 
6620: 6f 70 2c 20 70 53 6f 72 74 2d 3e 69 45 43 75 72  op, pSort->iECur
6630: 73 6f 72 2c 20 72 65 67 52 65 63 6f 72 64 2c 0a  sor, regRecord,.
6640: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6650: 20 20 20 20 20 20 20 72 65 67 42 61 73 65 2b 6e         regBase+n
6660: 4f 42 53 61 74 2c 20 6e 42 61 73 65 2d 6e 4f 42  OBSat, nBase-nOB
6670: 53 61 74 29 3b 0a 20 20 69 66 28 20 69 53 6b 69  Sat);.  if( iSki
6680: 70 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  p ){.    sqlite3
6690: 56 64 62 65 43 68 61 6e 67 65 50 32 28 76 2c 20  VdbeChangeP2(v, 
66a0: 69 53 6b 69 70 2c 0a 20 20 20 20 20 20 20 20 20  iSkip,.         
66b0: 70 53 6f 72 74 2d 3e 6c 61 62 65 6c 4f 42 4c 6f  pSort->labelOBLo
66c0: 70 74 20 3f 20 70 53 6f 72 74 2d 3e 6c 61 62 65  pt ? pSort->labe
66d0: 6c 4f 42 4c 6f 70 74 20 3a 20 73 71 6c 69 74 65  lOBLopt : sqlite
66e0: 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
66f0: 28 76 29 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  (v));.  }.}../*.
6700: 2a 2a 20 41 64 64 20 63 6f 64 65 20 74 6f 20 69  ** Add code to i
6710: 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 4f 46 46  mplement the OFF
6720: 53 45 54 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  SET.*/.static vo
6730: 69 64 20 63 6f 64 65 4f 66 66 73 65 74 28 0a 20  id codeOffset(. 
6740: 20 56 64 62 65 20 2a 76 2c 20 20 20 20 20 20 20   Vdbe *v,       
6750: 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63     /* Generate c
6760: 6f 64 65 20 69 6e 74 6f 20 74 68 69 73 20 56 4d  ode into this VM
6770: 20 2a 2f 0a 20 20 69 6e 74 20 69 4f 66 66 73 65   */.  int iOffse
6780: 74 2c 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73  t,      /* Regis
6790: 74 65 72 20 68 6f 6c 64 69 6e 67 20 74 68 65 20  ter holding the 
67a0: 6f 66 66 73 65 74 20 63 6f 75 6e 74 65 72 20 2a  offset counter *
67b0: 2f 0a 20 20 69 6e 74 20 69 43 6f 6e 74 69 6e 75  /.  int iContinu
67c0: 65 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65  e     /* Jump he
67d0: 72 65 20 74 6f 20 73 6b 69 70 20 74 68 65 20 63  re to skip the c
67e0: 75 72 72 65 6e 74 20 72 65 63 6f 72 64 20 2a 2f  urrent record */
67f0: 0a 29 7b 0a 20 20 69 66 28 20 69 4f 66 66 73 65  .){.  if( iOffse
6800: 74 3e 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  t>0 ){.    sqlit
6810: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
6820: 4f 50 5f 49 66 50 6f 73 2c 20 69 4f 66 66 73 65  OP_IfPos, iOffse
6830: 74 2c 20 69 43 6f 6e 74 69 6e 75 65 2c 20 31 29  t, iContinue, 1)
6840: 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
6850: 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 6d 6d 65  );.    VdbeComme
6860: 6e 74 28 28 76 2c 20 22 4f 46 46 53 45 54 22 29  nt((v, "OFFSET")
6870: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
6880: 41 64 64 20 63 6f 64 65 20 74 68 61 74 20 77 69  Add code that wi
6890: 6c 6c 20 63 68 65 63 6b 20 74 6f 20 6d 61 6b 65  ll check to make
68a0: 20 73 75 72 65 20 74 68 65 20 4e 20 72 65 67 69   sure the N regi
68b0: 73 74 65 72 73 20 73 74 61 72 74 69 6e 67 20 61  sters starting a
68c0: 74 20 69 4d 65 6d 0a 2a 2a 20 66 6f 72 6d 20 61  t iMem.** form a
68d0: 20 64 69 73 74 69 6e 63 74 20 65 6e 74 72 79 2e   distinct entry.
68e0: 20 20 69 54 61 62 20 69 73 20 61 20 73 6f 72 74    iTab is a sort
68f0: 69 6e 67 20 69 6e 64 65 78 20 74 68 61 74 20 68  ing index that h
6900: 6f 6c 64 73 20 70 72 65 76 69 6f 75 73 6c 79 0a  olds previously.
6910: 2a 2a 20 73 65 65 6e 20 63 6f 6d 62 69 6e 61 74  ** seen combinat
6920: 69 6f 6e 73 20 6f 66 20 74 68 65 20 4e 20 76 61  ions of the N va
6930: 6c 75 65 73 2e 20 20 41 20 6e 65 77 20 65 6e 74  lues.  A new ent
6940: 72 79 20 69 73 20 6d 61 64 65 20 69 6e 20 69 54  ry is made in iT
6950: 61 62 0a 2a 2a 20 69 66 20 74 68 65 20 63 75 72  ab.** if the cur
6960: 72 65 6e 74 20 4e 20 76 61 6c 75 65 73 20 61 72  rent N values ar
6970: 65 20 6e 65 77 2e 0a 2a 2a 0a 2a 2a 20 41 20 6a  e new..**.** A j
6980: 75 6d 70 20 74 6f 20 61 64 64 72 52 65 70 65 61  ump to addrRepea
6990: 74 20 69 73 20 6d 61 64 65 20 61 6e 64 20 74 68  t is made and th
69a0: 65 20 4e 2b 31 20 76 61 6c 75 65 73 20 61 72 65  e N+1 values are
69b0: 20 70 6f 70 70 65 64 20 66 72 6f 6d 20 74 68 65   popped from the
69c0: 0a 2a 2a 20 73 74 61 63 6b 20 69 66 20 74 68 65  .** stack if the
69d0: 20 74 6f 70 20 4e 20 65 6c 65 6d 65 6e 74 73 20   top N elements 
69e0: 61 72 65 20 6e 6f 74 20 64 69 73 74 69 6e 63 74  are not distinct
69f0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
6a00: 20 63 6f 64 65 44 69 73 74 69 6e 63 74 28 0a 20   codeDistinct(. 
6a10: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
6a20: 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 61      /* Parsing a
6a30: 6e 64 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69  nd code generati
6a40: 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
6a50: 69 6e 74 20 69 54 61 62 2c 20 20 20 20 20 20 20  int iTab,       
6a60: 20 20 20 2f 2a 20 41 20 73 6f 72 74 69 6e 67 20     /* A sorting 
6a70: 69 6e 64 65 78 20 75 73 65 64 20 74 6f 20 74 65  index used to te
6a80: 73 74 20 66 6f 72 20 64 69 73 74 69 6e 63 74 6e  st for distinctn
6a90: 65 73 73 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64  ess */.  int add
6aa0: 72 52 65 70 65 61 74 2c 20 20 20 20 2f 2a 20 4a  rRepeat,    /* J
6ab0: 75 6d 70 20 74 6f 20 68 65 72 65 20 69 66 20 6e  ump to here if n
6ac0: 6f 74 20 64 69 73 74 69 6e 63 74 20 2a 2f 0a 20  ot distinct */. 
6ad0: 20 69 6e 74 20 4e 2c 20 20 20 20 20 20 20 20 20   int N,         
6ae0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
6af0: 20 65 6c 65 6d 65 6e 74 73 20 2a 2f 0a 20 20 69   elements */.  i
6b00: 6e 74 20 69 4d 65 6d 20 20 20 20 20 20 20 20 20  nt iMem         
6b10: 20 20 2f 2a 20 46 69 72 73 74 20 65 6c 65 6d 65    /* First eleme
6b20: 6e 74 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20  nt */.){.  Vdbe 
6b30: 2a 76 3b 0a 20 20 69 6e 74 20 72 31 3b 0a 0a 20  *v;.  int r1;.. 
6b40: 20 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64   v = pParse->pVd
6b50: 62 65 3b 0a 20 20 72 31 20 3d 20 73 71 6c 69 74  be;.  r1 = sqlit
6b60: 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61  e3GetTempReg(pPa
6b70: 72 73 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  rse);.  sqlite3V
6b80: 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20  dbeAddOp4Int(v, 
6b90: 4f 50 5f 46 6f 75 6e 64 2c 20 69 54 61 62 2c 20  OP_Found, iTab, 
6ba0: 61 64 64 72 52 65 70 65 61 74 2c 20 69 4d 65 6d  addrRepeat, iMem
6bb0: 2c 20 4e 29 3b 20 56 64 62 65 43 6f 76 65 72 61  , N); VdbeCovera
6bc0: 67 65 28 76 29 3b 0a 20 20 73 71 6c 69 74 65 33  ge(v);.  sqlite3
6bd0: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
6be0: 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 69 4d 65  _MakeRecord, iMe
6bf0: 6d 2c 20 4e 2c 20 72 31 29 3b 0a 20 20 73 71 6c  m, N, r1);.  sql
6c00: 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e  ite3VdbeAddOp4In
6c10: 74 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72  t(v, OP_IdxInser
6c20: 74 2c 20 69 54 61 62 2c 20 72 31 2c 20 69 4d 65  t, iTab, r1, iMe
6c30: 6d 2c 20 4e 29 3b 0a 20 20 73 71 6c 69 74 65 33  m, N);.  sqlite3
6c40: 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20  VdbeChangeP5(v, 
6c50: 4f 50 46 4c 41 47 5f 55 53 45 53 45 45 4b 52 45  OPFLAG_USESEEKRE
6c60: 53 55 4c 54 29 3b 0a 20 20 73 71 6c 69 74 65 33  SULT);.  sqlite3
6c70: 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
6c80: 50 61 72 73 65 2c 20 72 31 29 3b 0a 7d 0a 0a 23  Parse, r1);.}..#
6c90: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
6ca0: 42 4c 45 5f 53 4f 52 54 45 52 5f 52 45 46 45 52  BLE_SORTER_REFER
6cb0: 45 4e 43 45 53 0a 2f 2a 0a 2a 2a 20 54 68 69 73  ENCES./*.** This
6cc0: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
6cd0: 6c 65 64 20 61 73 20 70 61 72 74 20 6f 66 20 69  led as part of i
6ce0: 6e 6e 65 72 2d 6c 6f 6f 70 20 67 65 6e 65 72 61  nner-loop genera
6cf0: 74 69 6f 6e 20 66 6f 72 20 61 20 53 45 4c 45 43  tion for a SELEC
6d00: 54 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 77  T.** statement w
6d10: 69 74 68 20 61 6e 20 4f 52 44 45 52 20 42 59 20  ith an ORDER BY 
6d20: 74 68 61 74 20 69 73 20 6e 6f 74 20 6f 70 74 69  that is not opti
6d30: 6d 69 7a 65 64 20 62 79 20 61 6e 20 69 6e 64 65  mized by an inde
6d40: 78 2e 20 49 74 20 0a 2a 2a 20 64 65 74 65 72 6d  x. It .** determ
6d50: 69 6e 65 73 20 74 68 65 20 65 78 70 72 65 73 73  ines the express
6d60: 69 6f 6e 73 2c 20 69 66 20 61 6e 79 2c 20 74 68  ions, if any, th
6d70: 61 74 20 74 68 65 20 73 6f 72 74 65 72 2d 72 65  at the sorter-re
6d80: 66 65 72 65 6e 63 65 20 0a 2a 2a 20 6f 70 74 69  ference .** opti
6d90: 6d 69 7a 61 74 69 6f 6e 20 73 68 6f 75 6c 64 20  mization should 
6da0: 62 65 20 75 73 65 64 20 66 6f 72 2e 20 54 68 65  be used for. The
6db0: 20 73 6f 72 74 65 72 2d 72 65 66 65 72 65 6e 63   sorter-referenc
6dc0: 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 0a 2a  e optimization.*
6dd0: 2a 20 69 73 20 75 73 65 64 20 66 6f 72 20 53 45  * is used for SE
6de0: 4c 45 43 54 20 71 75 65 72 69 65 73 20 6c 69 6b  LECT queries lik
6df0: 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 53 45 4c 45 43  e:.**.**   SELEC
6e00: 54 20 61 2c 20 62 69 67 62 6c 6f 62 20 46 52 4f  T a, bigblob FRO
6e10: 4d 20 74 31 20 4f 52 44 45 52 20 42 59 20 61 20  M t1 ORDER BY a 
6e20: 4c 49 4d 49 54 20 31 30 0a 2a 2a 0a 2a 2a 20 49  LIMIT 10.**.** I
6e30: 66 20 74 68 65 20 6f 70 74 69 6d 69 7a 61 74 69  f the optimizati
6e40: 6f 6e 20 69 73 20 75 73 65 64 20 66 6f 72 20 65  on is used for e
6e50: 78 70 72 65 73 73 69 6f 6e 20 22 62 69 67 62 6c  xpression "bigbl
6e60: 6f 62 22 2c 20 74 68 65 6e 20 69 6e 73 74 65 61  ob", then instea
6e70: 64 20 6f 66 0a 2a 2a 20 73 74 6f 72 69 6e 67 20  d of.** storing 
6e80: 76 61 6c 75 65 73 20 72 65 61 64 20 66 72 6f 6d  values read from
6e90: 20 74 68 61 74 20 63 6f 6c 75 6d 6e 20 69 6e 20   that column in 
6ea0: 74 68 65 20 73 6f 72 74 65 72 20 72 65 63 6f 72  the sorter recor
6eb0: 64 73 2c 20 74 68 65 20 50 4b 20 6f 66 0a 2a 2a  ds, the PK of.**
6ec0: 20 74 68 65 20 72 6f 77 20 66 72 6f 6d 20 74 61   the row from ta
6ed0: 62 6c 65 20 74 31 20 69 73 20 73 74 6f 72 65 64  ble t1 is stored
6ee0: 20 69 6e 73 74 65 61 64 2e 20 54 68 65 6e 2c 20   instead. Then, 
6ef0: 61 73 20 72 65 63 6f 72 64 73 20 61 72 65 20 65  as records are e
6f00: 78 74 72 61 63 74 65 64 20 66 72 6f 6d 0a 2a 2a  xtracted from.**
6f10: 20 74 68 65 20 73 6f 72 74 65 72 20 74 6f 20 72   the sorter to r
6f20: 65 74 75 72 6e 20 74 6f 20 74 68 65 20 75 73 65  eturn to the use
6f30: 72 2c 20 74 68 65 20 72 65 71 75 69 72 65 64 20  r, the required 
6f40: 76 61 6c 75 65 20 6f 66 20 62 69 67 62 6c 6f 62  value of bigblob
6f50: 20 69 73 0a 2a 2a 20 72 65 74 72 69 65 76 65 64   is.** retrieved
6f60: 20 64 69 72 65 63 74 6c 79 20 66 72 6f 6d 20 74   directly from t
6f70: 61 62 6c 65 20 74 31 2e 20 49 66 20 74 68 65 20  able t1. If the 
6f80: 76 61 6c 75 65 73 20 61 72 65 20 76 65 72 79 20  values are very 
6f90: 6c 61 72 67 65 2c 20 74 68 69 73 20 0a 2a 2a 20  large, this .** 
6fa0: 63 61 6e 20 62 65 20 6d 6f 72 65 20 65 66 66 69  can be more effi
6fb0: 63 69 65 6e 74 20 74 68 61 6e 20 73 74 6f 72 69  cient than stori
6fc0: 6e 67 20 74 68 65 6d 20 64 69 72 65 63 74 6c 79  ng them directly
6fd0: 20 69 6e 20 74 68 65 20 73 6f 72 74 65 72 20 72   in the sorter r
6fe0: 65 63 6f 72 64 73 2e 0a 2a 2a 0a 2a 2a 20 54 68  ecords..**.** Th
6ff0: 65 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 2e  e ExprList_item.
7000: 62 53 6f 72 74 65 72 52 65 66 20 66 6c 61 67 20  bSorterRef flag 
7010: 69 73 20 73 65 74 20 66 6f 72 20 65 61 63 68 20  is set for each 
7020: 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 70 45  expression in pE
7030: 4c 69 73 74 20 0a 2a 2a 20 66 6f 72 20 77 68 69  List .** for whi
7040: 63 68 20 74 68 65 20 73 6f 72 74 65 72 2d 72 65  ch the sorter-re
7050: 66 65 72 65 6e 63 65 20 6f 70 74 69 6d 69 7a 61  ference optimiza
7060: 74 69 6f 6e 20 73 68 6f 75 6c 64 20 62 65 20 65  tion should be e
7070: 6e 61 62 6c 65 64 2e 20 0a 2a 2a 20 41 64 64 69  nabled. .** Addi
7080: 74 69 6f 6e 61 6c 6c 79 2c 20 74 68 65 20 70 53  tionally, the pS
7090: 6f 72 74 2d 3e 61 44 65 66 65 72 5b 5d 20 61 72  ort->aDefer[] ar
70a0: 72 61 79 20 69 73 20 70 6f 70 75 6c 61 74 65 64  ray is populated
70b0: 20 77 69 74 68 20 65 6e 74 72 69 65 73 0a 2a 2a   with entries.**
70c0: 20 66 6f 72 20 61 6c 6c 20 63 75 72 73 6f 72 73   for all cursors
70d0: 20 72 65 71 75 69 72 65 64 20 74 6f 20 65 76 61   required to eva
70e0: 6c 75 61 74 65 20 61 6c 6c 20 73 65 6c 65 63 74  luate all select
70f0: 65 64 20 65 78 70 72 65 73 73 69 6f 6e 73 2e 20  ed expressions. 
7100: 46 69 6e 61 6c 6c 79 2e 0a 2a 2a 20 6f 75 74 70  Finally..** outp
7110: 75 74 20 76 61 72 69 61 62 6c 65 20 28 2a 70 70  ut variable (*pp
7120: 45 78 74 72 61 29 20 69 73 20 73 65 74 20 74 6f  Extra) is set to
7130: 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 6c   an expression l
7140: 69 73 74 20 63 6f 6e 74 61 69 6e 69 6e 67 0a 2a  ist containing.*
7150: 2a 20 65 78 70 72 65 73 73 69 6f 6e 73 20 66 6f  * expressions fo
7160: 72 20 61 6c 6c 20 65 78 74 72 61 20 50 4b 20 76  r all extra PK v
7170: 61 6c 75 65 73 20 74 68 61 74 20 73 68 6f 75 6c  alues that shoul
7180: 64 20 62 65 20 73 74 6f 72 65 64 20 69 6e 20 74  d be stored in t
7190: 68 65 0a 2a 2a 20 73 6f 72 74 65 72 20 72 65 63  he.** sorter rec
71a0: 6f 72 64 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ords..*/.static 
71b0: 76 6f 69 64 20 73 65 6c 65 63 74 45 78 70 72 44  void selectExprD
71c0: 65 66 65 72 28 0a 20 20 50 61 72 73 65 20 2a 70  efer(.  Parse *p
71d0: 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20  Parse,          
71e0: 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 61 76 65          /* Leave
71f0: 20 61 6e 79 20 65 72 72 6f 72 20 68 65 72 65 20   any error here 
7200: 2a 2f 0a 20 20 53 6f 72 74 43 74 78 20 2a 70 53  */.  SortCtx *pS
7210: 6f 72 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  ort,            
7220: 20 20 20 20 20 2f 2a 20 53 6f 72 74 65 72 20 63       /* Sorter c
7230: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72  ontext */.  Expr
7240: 4c 69 73 74 20 2a 70 45 4c 69 73 74 2c 20 20 20  List *pEList,   
7250: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45              /* E
7260: 78 70 72 65 73 73 69 6f 6e 73 20 64 65 73 74 69  xpressions desti
7270: 6e 65 64 20 66 6f 72 20 73 6f 72 74 65 72 20 2a  ned for sorter *
7280: 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 2a 70  /.  ExprList **p
7290: 70 45 78 74 72 61 20 20 20 20 20 20 20 20 20 20  pExtra          
72a0: 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f      /* Expressio
72b0: 6e 73 20 74 6f 20 61 70 70 65 6e 64 20 74 6f 20  ns to append to 
72c0: 73 6f 72 74 65 72 20 72 65 63 6f 72 64 20 2a 2f  sorter record */
72d0: 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  .){.  int i;.  i
72e0: 6e 74 20 6e 44 65 66 65 72 20 3d 20 30 3b 0a 20  nt nDefer = 0;. 
72f0: 20 45 78 70 72 4c 69 73 74 20 2a 70 45 78 74 72   ExprList *pExtr
7300: 61 20 3d 20 30 3b 0a 20 20 66 6f 72 28 69 3d 30  a = 0;.  for(i=0
7310: 3b 20 69 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70  ; i<pEList->nExp
7320: 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72  r; i++){.    str
7330: 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
7340: 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70 45 4c 69  m *pItem = &pELi
7350: 73 74 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 69 66  st->a[i];.    if
7360: 28 20 70 49 74 65 6d 2d 3e 75 2e 78 2e 69 4f 72  ( pItem->u.x.iOr
7370: 64 65 72 42 79 43 6f 6c 3d 3d 30 20 29 7b 0a 20  derByCol==0 ){. 
7380: 20 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72       Expr *pExpr
7390: 20 3d 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 3b   = pItem->pExpr;
73a0: 0a 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54  .      Table *pT
73b0: 61 62 20 3d 20 70 45 78 70 72 2d 3e 79 2e 70 54  ab = pExpr->y.pT
73c0: 61 62 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45  ab;.      if( pE
73d0: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55  xpr->op==TK_COLU
73e0: 4d 4e 20 26 26 20 70 45 78 70 72 2d 3e 69 43 6f  MN && pExpr->iCo
73f0: 6c 75 6d 6e 3e 3d 30 20 26 26 20 70 54 61 62 20  lumn>=0 && pTab 
7400: 26 26 20 21 49 73 56 69 72 74 75 61 6c 28 70 54  && !IsVirtual(pT
7410: 61 62 29 0a 20 20 20 20 20 20 20 26 26 20 28 70  ab).       && (p
7420: 54 61 62 2d 3e 61 43 6f 6c 5b 70 45 78 70 72 2d  Tab->aCol[pExpr-
7430: 3e 69 43 6f 6c 75 6d 6e 5d 2e 63 6f 6c 46 6c 61  >iColumn].colFla
7440: 67 73 20 26 20 43 4f 4c 46 4c 41 47 5f 53 4f 52  gs & COLFLAG_SOR
7450: 54 45 52 52 45 46 29 0a 20 20 20 20 20 20 29 7b  TERREF).      ){
7460: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a  .        int j;.
7470: 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b          for(j=0;
7480: 20 6a 3c 6e 44 65 66 65 72 3b 20 6a 2b 2b 29 7b   j<nDefer; j++){
7490: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
74a0: 53 6f 72 74 2d 3e 61 44 65 66 65 72 5b 6a 5d 2e  Sort->aDefer[j].
74b0: 69 43 73 72 3d 3d 70 45 78 70 72 2d 3e 69 54 61  iCsr==pExpr->iTa
74c0: 62 6c 65 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ble ) break;.   
74d0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
74e0: 66 28 20 6a 3d 3d 6e 44 65 66 65 72 20 29 7b 0a  f( j==nDefer ){.
74f0: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6e 44            if( nD
7500: 65 66 65 72 3d 3d 41 72 72 61 79 53 69 7a 65 28  efer==ArraySize(
7510: 70 53 6f 72 74 2d 3e 61 44 65 66 65 72 29 20 29  pSort->aDefer) )
7520: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 6f  {.            co
7530: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
7540: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
7550: 20 20 20 20 20 69 6e 74 20 6e 4b 65 79 20 3d 20       int nKey = 
7560: 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  1;.            i
7570: 6e 74 20 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  nt k;.          
7580: 20 20 49 6e 64 65 78 20 2a 70 50 6b 20 3d 20 30    Index *pPk = 0
7590: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
75a0: 28 20 21 48 61 73 52 6f 77 69 64 28 70 54 61 62  ( !HasRowid(pTab
75b0: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ) ){.           
75c0: 20 20 20 70 50 6b 20 3d 20 73 71 6c 69 74 65 33     pPk = sqlite3
75d0: 50 72 69 6d 61 72 79 4b 65 79 49 6e 64 65 78 28  PrimaryKeyIndex(
75e0: 70 54 61 62 29 3b 0a 20 20 20 20 20 20 20 20 20  pTab);.         
75f0: 20 20 20 20 20 6e 4b 65 79 20 3d 20 70 50 6b 2d       nKey = pPk-
7600: 3e 6e 4b 65 79 43 6f 6c 3b 0a 20 20 20 20 20 20  >nKeyCol;.      
7610: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
7620: 20 20 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 6e      for(k=0; k<n
7630: 4b 65 79 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 20  Key; k++){.     
7640: 20 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70           Expr *p
7650: 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 50 45 78  New = sqlite3PEx
7660: 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 43 4f  pr(pParse, TK_CO
7670: 4c 55 4d 4e 2c 20 30 2c 20 30 29 3b 0a 20 20 20  LUMN, 0, 0);.   
7680: 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70             if( p
7690: 4e 65 77 20 29 7b 0a 20 20 20 20 20 20 20 20 20  New ){.         
76a0: 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 69 54 61         pNew->iTa
76b0: 62 6c 65 20 3d 20 70 45 78 70 72 2d 3e 69 54 61  ble = pExpr->iTa
76c0: 62 6c 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ble;.           
76d0: 20 20 20 20 20 70 4e 65 77 2d 3e 79 2e 70 54 61       pNew->y.pTa
76e0: 62 20 3d 20 70 45 78 70 72 2d 3e 79 2e 70 54 61  b = pExpr->y.pTa
76f0: 62 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  b;.             
7700: 20 20 20 70 4e 65 77 2d 3e 69 43 6f 6c 75 6d 6e     pNew->iColumn
7710: 20 3d 20 70 50 6b 20 3f 20 70 50 6b 2d 3e 61 69   = pPk ? pPk->ai
7720: 43 6f 6c 75 6d 6e 5b 6b 5d 20 3a 20 2d 31 3b 0a  Column[k] : -1;.
7730: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7740: 70 45 78 74 72 61 20 3d 20 73 71 6c 69 74 65 33  pExtra = sqlite3
7750: 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70  ExprListAppend(p
7760: 50 61 72 73 65 2c 20 70 45 78 74 72 61 2c 20 70  Parse, pExtra, p
7770: 4e 65 77 29 3b 0a 20 20 20 20 20 20 20 20 20 20  New);.          
7780: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
7790: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
77a0: 70 53 6f 72 74 2d 3e 61 44 65 66 65 72 5b 6e 44  pSort->aDefer[nD
77b0: 65 66 65 72 5d 2e 70 54 61 62 20 3d 20 70 45 78  efer].pTab = pEx
77c0: 70 72 2d 3e 79 2e 70 54 61 62 3b 0a 20 20 20 20  pr->y.pTab;.    
77d0: 20 20 20 20 20 20 20 20 70 53 6f 72 74 2d 3e 61          pSort->a
77e0: 44 65 66 65 72 5b 6e 44 65 66 65 72 5d 2e 69 43  Defer[nDefer].iC
77f0: 73 72 20 3d 20 70 45 78 70 72 2d 3e 69 54 61 62  sr = pExpr->iTab
7800: 6c 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  le;.            
7810: 70 53 6f 72 74 2d 3e 61 44 65 66 65 72 5b 6e 44  pSort->aDefer[nD
7820: 65 66 65 72 5d 2e 6e 4b 65 79 20 3d 20 6e 4b 65  efer].nKey = nKe
7830: 79 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6e  y;.            n
7840: 44 65 66 65 72 2b 2b 3b 0a 20 20 20 20 20 20 20  Defer++;.       
7850: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
7860: 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 62 53         pItem->bS
7870: 6f 72 74 65 72 52 65 66 20 3d 20 31 3b 0a 20 20  orterRef = 1;.  
7880: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
7890: 20 20 70 53 6f 72 74 2d 3e 6e 44 65 66 65 72 20    pSort->nDefer 
78a0: 3d 20 28 75 38 29 6e 44 65 66 65 72 3b 0a 20 20  = (u8)nDefer;.  
78b0: 2a 70 70 45 78 74 72 61 20 3d 20 70 45 78 74 72  *ppExtra = pExtr
78c0: 61 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  a;.}.#endif../*.
78d0: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
78e0: 67 65 6e 65 72 61 74 65 73 20 74 68 65 20 63 6f  generates the co
78f0: 64 65 20 66 6f 72 20 74 68 65 20 69 6e 73 69 64  de for the insid
7900: 65 20 6f 66 20 74 68 65 20 69 6e 6e 65 72 20 6c  e of the inner l
7910: 6f 6f 70 0a 2a 2a 20 6f 66 20 61 20 53 45 4c 45  oop.** of a SELE
7920: 43 54 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 72 63  CT..**.** If src
7930: 54 61 62 20 69 73 20 6e 65 67 61 74 69 76 65 2c  Tab is negative,
7940: 20 74 68 65 6e 20 74 68 65 20 70 2d 3e 70 45 4c   then the p->pEL
7950: 69 73 74 20 65 78 70 72 65 73 73 69 6f 6e 73 0a  ist expressions.
7960: 2a 2a 20 61 72 65 20 65 76 61 6c 75 61 74 65 64  ** are evaluated
7970: 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 67 65 74   in order to get
7980: 20 74 68 65 20 64 61 74 61 20 66 6f 72 20 74 68   the data for th
7990: 69 73 20 72 6f 77 2e 20 20 49 66 20 73 72 63 54  is row.  If srcT
79a0: 61 62 20 69 73 0a 2a 2a 20 7a 65 72 6f 20 6f 72  ab is.** zero or
79b0: 20 6d 6f 72 65 2c 20 74 68 65 6e 20 64 61 74 61   more, then data
79c0: 20 69 73 20 70 75 6c 6c 65 64 20 66 72 6f 6d 20   is pulled from 
79d0: 73 72 63 54 61 62 20 61 6e 64 20 70 2d 3e 70 45  srcTab and p->pE
79e0: 4c 69 73 74 20 69 73 20 75 73 65 64 20 6f 6e 6c  List is used onl
79f0: 79 20 0a 2a 2a 20 74 6f 20 67 65 74 20 74 68 65  y .** to get the
7a00: 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d   number of colum
7a10: 6e 73 20 61 6e 64 20 74 68 65 20 63 6f 6c 6c 61  ns and the colla
7a20: 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 66 6f  tion sequence fo
7a30: 72 20 65 61 63 68 20 63 6f 6c 75 6d 6e 2e 0a 2a  r each column..*
7a40: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 65  /.static void se
7a50: 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 0a 20  lectInnerLoop(. 
7a60: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
7a70: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
7a80: 70 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a  parser context *
7a90: 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20  /.  Select *p,  
7aa0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
7ab0: 68 65 20 63 6f 6d 70 6c 65 74 65 20 73 65 6c 65  he complete sele
7ac0: 63 74 20 73 74 61 74 65 6d 65 6e 74 20 62 65 69  ct statement bei
7ad0: 6e 67 20 63 6f 64 65 64 20 2a 2f 0a 20 20 69 6e  ng coded */.  in
7ae0: 74 20 73 72 63 54 61 62 2c 20 20 20 20 20 20 20  t srcTab,       
7af0: 20 20 20 20 20 20 2f 2a 20 50 75 6c 6c 20 64 61        /* Pull da
7b00: 74 61 20 66 72 6f 6d 20 74 68 69 73 20 74 61 62  ta from this tab
7b10: 6c 65 20 69 66 20 6e 6f 6e 2d 6e 65 67 61 74 69  le if non-negati
7b20: 76 65 20 2a 2f 0a 20 20 53 6f 72 74 43 74 78 20  ve */.  SortCtx 
7b30: 2a 70 53 6f 72 74 2c 20 20 20 20 20 20 20 20 20  *pSort,         
7b40: 2f 2a 20 49 66 20 6e 6f 74 20 4e 55 4c 4c 2c 20  /* If not NULL, 
7b50: 69 6e 66 6f 20 6f 6e 20 68 6f 77 20 74 6f 20 70  info on how to p
7b60: 72 6f 63 65 73 73 20 4f 52 44 45 52 20 42 59 20  rocess ORDER BY 
7b70: 2a 2f 0a 20 20 44 69 73 74 69 6e 63 74 43 74 78  */.  DistinctCtx
7b80: 20 2a 70 44 69 73 74 69 6e 63 74 2c 20 2f 2a 20   *pDistinct, /* 
7b90: 49 66 20 6e 6f 74 20 4e 55 4c 4c 2c 20 69 6e 66  If not NULL, inf
7ba0: 6f 20 6f 6e 20 68 6f 77 20 74 6f 20 70 72 6f 63  o on how to proc
7bb0: 65 73 73 20 44 49 53 54 49 4e 43 54 20 2a 2f 0a  ess DISTINCT */.
7bc0: 20 20 53 65 6c 65 63 74 44 65 73 74 20 2a 70 44    SelectDest *pD
7bd0: 65 73 74 2c 20 20 20 20 20 20 2f 2a 20 48 6f 77  est,      /* How
7be0: 20 74 6f 20 64 69 73 70 6f 73 65 20 6f 66 20 74   to dispose of t
7bf0: 68 65 20 72 65 73 75 6c 74 73 20 2a 2f 0a 20 20  he results */.  
7c00: 69 6e 74 20 69 43 6f 6e 74 69 6e 75 65 2c 20 20  int iContinue,  
7c10: 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20          /* Jump 
7c20: 68 65 72 65 20 74 6f 20 63 6f 6e 74 69 6e 75 65  here to continue
7c30: 20 77 69 74 68 20 6e 65 78 74 20 72 6f 77 20 2a   with next row *
7c40: 2f 0a 20 20 69 6e 74 20 69 42 72 65 61 6b 20 20  /.  int iBreak  
7c50: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4a              /* J
7c60: 75 6d 70 20 68 65 72 65 20 74 6f 20 62 72 65 61  ump here to brea
7c70: 6b 20 6f 75 74 20 6f 66 20 74 68 65 20 69 6e 6e  k out of the inn
7c80: 65 72 20 6c 6f 6f 70 20 2a 2f 0a 29 7b 0a 20 20  er loop */.){.  
7c90: 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65  Vdbe *v = pParse
7ca0: 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69  ->pVdbe;.  int i
7cb0: 3b 0a 20 20 69 6e 74 20 68 61 73 44 69 73 74 69  ;.  int hasDisti
7cc0: 6e 63 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  nct;            
7cd0: 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65 20 44  /* True if the D
7ce0: 49 53 54 49 4e 43 54 20 6b 65 79 77 6f 72 64 20  ISTINCT keyword 
7cf0: 69 73 20 70 72 65 73 65 6e 74 20 2a 2f 0a 20 20  is present */.  
7d00: 69 6e 74 20 65 44 65 73 74 20 3d 20 70 44 65 73  int eDest = pDes
7d10: 74 2d 3e 65 44 65 73 74 3b 20 20 20 2f 2a 20 48  t->eDest;   /* H
7d20: 6f 77 20 74 6f 20 64 69 73 70 6f 73 65 20 6f 66  ow to dispose of
7d30: 20 72 65 73 75 6c 74 73 20 2a 2f 0a 20 20 69 6e   results */.  in
7d40: 74 20 69 50 61 72 6d 20 3d 20 70 44 65 73 74 2d  t iParm = pDest-
7d50: 3e 69 53 44 50 61 72 6d 3b 20 2f 2a 20 46 69 72  >iSDParm; /* Fir
7d60: 73 74 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 64  st argument to d
7d70: 69 73 70 6f 73 61 6c 20 6d 65 74 68 6f 64 20 2a  isposal method *
7d80: 2f 0a 20 20 69 6e 74 20 6e 52 65 73 75 6c 74 43  /.  int nResultC
7d90: 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ol;             
7da0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 73  /* Number of res
7db0: 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20  ult columns */. 
7dc0: 20 69 6e 74 20 6e 50 72 65 66 69 78 52 65 67 20   int nPrefixReg 
7dd0: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  = 0;         /* 
7de0: 4e 75 6d 62 65 72 20 6f 66 20 65 78 74 72 61 20  Number of extra 
7df0: 72 65 67 69 73 74 65 72 73 20 62 65 66 6f 72 65  registers before
7e00: 20 72 65 67 52 65 73 75 6c 74 20 2a 2f 0a 20 20   regResult */.  
7e10: 52 6f 77 4c 6f 61 64 49 6e 66 6f 20 73 52 6f 77  RowLoadInfo sRow
7e20: 4c 6f 61 64 49 6e 66 6f 3b 20 20 20 2f 2a 20 49  LoadInfo;   /* I
7e30: 6e 66 6f 20 66 6f 72 20 64 65 66 65 72 72 65 64  nfo for deferred
7e40: 20 72 6f 77 20 6c 6f 61 64 69 6e 67 20 2a 2f 0a   row loading */.
7e50: 0a 20 20 2f 2a 20 55 73 75 61 6c 6c 79 2c 20 72  .  /* Usually, r
7e60: 65 67 52 65 73 75 6c 74 20 69 73 20 74 68 65 20  egResult is the 
7e70: 66 69 72 73 74 20 63 65 6c 6c 20 69 6e 20 61 6e  first cell in an
7e80: 20 61 72 72 61 79 20 6f 66 20 6d 65 6d 6f 72 79   array of memory
7e90: 20 63 65 6c 6c 73 0a 20 20 2a 2a 20 63 6f 6e 74   cells.  ** cont
7ea0: 61 69 6e 69 6e 67 20 74 68 65 20 63 75 72 72 65  aining the curre
7eb0: 6e 74 20 72 65 73 75 6c 74 20 72 6f 77 2e 20 49  nt result row. I
7ec0: 6e 20 74 68 69 73 20 63 61 73 65 20 72 65 67 4f  n this case regO
7ed0: 72 69 67 20 69 73 20 73 65 74 20 74 6f 20 74 68  rig is set to th
7ee0: 65 0a 20 20 2a 2a 20 73 61 6d 65 20 76 61 6c 75  e.  ** same valu
7ef0: 65 2e 20 48 6f 77 65 76 65 72 2c 20 69 66 20 74  e. However, if t
7f00: 68 65 20 72 65 73 75 6c 74 73 20 61 72 65 20 62  he results are b
7f10: 65 69 6e 67 20 73 65 6e 74 20 74 6f 20 74 68 65  eing sent to the
7f20: 20 73 6f 72 74 65 72 2c 20 74 68 65 0a 20 20 2a   sorter, the.  *
7f30: 2a 20 76 61 6c 75 65 73 20 66 6f 72 20 61 6e 79  * values for any
7f40: 20 65 78 70 72 65 73 73 69 6f 6e 73 20 74 68 61   expressions tha
7f50: 74 20 61 72 65 20 61 6c 73 6f 20 70 61 72 74 20  t are also part 
7f60: 6f 66 20 74 68 65 20 73 6f 72 74 2d 6b 65 79 20  of the sort-key 
7f70: 61 72 65 20 6f 6d 69 74 74 65 64 0a 20 20 2a 2a  are omitted.  **
7f80: 20 66 72 6f 6d 20 74 68 69 73 20 61 72 72 61 79   from this array
7f90: 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 72  . In this case r
7fa0: 65 67 4f 72 69 67 20 69 73 20 73 65 74 20 74 6f  egOrig is set to
7fb0: 20 7a 65 72 6f 2e 20 20 2a 2f 0a 20 20 69 6e 74   zero.  */.  int
7fc0: 20 72 65 67 52 65 73 75 6c 74 3b 20 20 20 20 20   regResult;     
7fd0: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74 61 72           /* Star
7fe0: 74 20 6f 66 20 6d 65 6d 6f 72 79 20 68 6f 6c 64  t of memory hold
7ff0: 69 6e 67 20 63 75 72 72 65 6e 74 20 72 65 73 75  ing current resu
8000: 6c 74 73 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67  lts */.  int reg
8010: 4f 72 69 67 3b 20 20 20 20 20 20 20 20 20 20 20  Orig;           
8020: 20 20 20 20 20 2f 2a 20 53 74 61 72 74 20 6f 66       /* Start of
8030: 20 6d 65 6d 6f 72 79 20 68 6f 6c 64 69 6e 67 20   memory holding 
8040: 66 75 6c 6c 20 72 65 73 75 6c 74 20 28 6f 72 20  full result (or 
8050: 30 29 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  0) */..  assert(
8060: 20 76 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20   v );.  assert( 
8070: 70 2d 3e 70 45 4c 69 73 74 21 3d 30 20 29 3b 0a  p->pEList!=0 );.
8080: 20 20 68 61 73 44 69 73 74 69 6e 63 74 20 3d 20    hasDistinct = 
8090: 70 44 69 73 74 69 6e 63 74 20 3f 20 70 44 69 73  pDistinct ? pDis
80a0: 74 69 6e 63 74 2d 3e 65 54 6e 63 74 54 79 70 65  tinct->eTnctType
80b0: 20 3a 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43   : WHERE_DISTINC
80c0: 54 5f 4e 4f 4f 50 3b 0a 20 20 69 66 28 20 70 53  T_NOOP;.  if( pS
80d0: 6f 72 74 20 26 26 20 70 53 6f 72 74 2d 3e 70 4f  ort && pSort->pO
80e0: 72 64 65 72 42 79 3d 3d 30 20 29 20 70 53 6f 72  rderBy==0 ) pSor
80f0: 74 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 53 6f  t = 0;.  if( pSo
8100: 72 74 3d 3d 30 20 26 26 20 21 68 61 73 44 69 73  rt==0 && !hasDis
8110: 74 69 6e 63 74 20 29 7b 0a 20 20 20 20 61 73 73  tinct ){.    ass
8120: 65 72 74 28 20 69 43 6f 6e 74 69 6e 75 65 21 3d  ert( iContinue!=
8130: 30 20 29 3b 0a 20 20 20 20 63 6f 64 65 4f 66 66  0 );.    codeOff
8140: 73 65 74 28 76 2c 20 70 2d 3e 69 4f 66 66 73 65  set(v, p->iOffse
8150: 74 2c 20 69 43 6f 6e 74 69 6e 75 65 29 3b 0a 20  t, iContinue);. 
8160: 20 7d 0a 0a 20 20 2f 2a 20 50 75 6c 6c 20 74 68   }..  /* Pull th
8170: 65 20 72 65 71 75 65 73 74 65 64 20 63 6f 6c 75  e requested colu
8180: 6d 6e 73 2e 0a 20 20 2a 2f 0a 20 20 6e 52 65 73  mns..  */.  nRes
8190: 75 6c 74 43 6f 6c 20 3d 20 70 2d 3e 70 45 4c 69  ultCol = p->pELi
81a0: 73 74 2d 3e 6e 45 78 70 72 3b 0a 0a 20 20 69 66  st->nExpr;..  if
81b0: 28 20 70 44 65 73 74 2d 3e 69 53 64 73 74 3d 3d  ( pDest->iSdst==
81c0: 30 20 29 7b 0a 20 20 20 20 69 66 28 20 70 53 6f  0 ){.    if( pSo
81d0: 72 74 20 29 7b 0a 20 20 20 20 20 20 6e 50 72 65  rt ){.      nPre
81e0: 66 69 78 52 65 67 20 3d 20 70 53 6f 72 74 2d 3e  fixReg = pSort->
81f0: 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b  pOrderBy->nExpr;
8200: 0a 20 20 20 20 20 20 69 66 28 20 21 28 70 53 6f  .      if( !(pSo
8210: 72 74 2d 3e 73 6f 72 74 46 6c 61 67 73 20 26 20  rt->sortFlags & 
8220: 53 4f 52 54 46 4c 41 47 5f 55 73 65 53 6f 72 74  SORTFLAG_UseSort
8230: 65 72 29 20 29 20 6e 50 72 65 66 69 78 52 65 67  er) ) nPrefixReg
8240: 2b 2b 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65  ++;.      pParse
8250: 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 50 72 65 66 69  ->nMem += nPrefi
8260: 78 52 65 67 3b 0a 20 20 20 20 7d 0a 20 20 20 20  xReg;.    }.    
8270: 70 44 65 73 74 2d 3e 69 53 64 73 74 20 3d 20 70  pDest->iSdst = p
8280: 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20  Parse->nMem+1;. 
8290: 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20     pParse->nMem 
82a0: 2b 3d 20 6e 52 65 73 75 6c 74 43 6f 6c 3b 0a 20  += nResultCol;. 
82b0: 20 7d 65 6c 73 65 20 69 66 28 20 70 44 65 73 74   }else if( pDest
82c0: 2d 3e 69 53 64 73 74 2b 6e 52 65 73 75 6c 74 43  ->iSdst+nResultC
82d0: 6f 6c 20 3e 20 70 50 61 72 73 65 2d 3e 6e 4d 65  ol > pParse->nMe
82e0: 6d 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73  m ){.    /* This
82f0: 20 69 73 20 61 6e 20 65 72 72 6f 72 20 63 6f 6e   is an error con
8300: 64 69 74 69 6f 6e 20 74 68 61 74 20 63 61 6e 20  dition that can 
8310: 72 65 73 75 6c 74 2c 20 66 6f 72 20 65 78 61 6d  result, for exam
8320: 70 6c 65 2c 20 77 68 65 6e 20 61 20 53 45 4c 45  ple, when a SELE
8330: 43 54 0a 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65  CT.    ** on the
8340: 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65   right-hand side
8350: 20 6f 66 20 61 6e 20 49 4e 53 45 52 54 20 63 6f   of an INSERT co
8360: 6e 74 61 69 6e 73 20 6d 6f 72 65 20 72 65 73 75  ntains more resu
8370: 6c 74 20 63 6f 6c 75 6d 6e 73 20 74 68 61 6e 0a  lt columns than.
8380: 20 20 20 20 2a 2a 20 74 68 65 72 65 20 61 72 65      ** there are
8390: 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20   columns in the 
83a0: 74 61 62 6c 65 20 6f 6e 20 74 68 65 20 6c 65 66  table on the lef
83b0: 74 2e 20 20 54 68 65 20 65 72 72 6f 72 20 77 69  t.  The error wi
83c0: 6c 6c 20 62 65 20 63 61 75 67 68 74 0a 20 20 20  ll be caught.   
83d0: 20 2a 2a 20 61 6e 64 20 72 65 70 6f 72 74 65 64   ** and reported
83e0: 20 6c 61 74 65 72 2e 20 20 42 75 74 20 77 65 20   later.  But we 
83f0: 6e 65 65 64 20 74 6f 20 6d 61 6b 65 20 73 75 72  need to make sur
8400: 65 20 65 6e 6f 75 67 68 20 6d 65 6d 6f 72 79 20  e enough memory 
8410: 69 73 20 61 6c 6c 6f 63 61 74 65 64 0a 20 20 20  is allocated.   
8420: 20 2a 2a 20 74 6f 20 61 76 6f 69 64 20 6f 74 68   ** to avoid oth
8430: 65 72 20 73 70 75 72 69 6f 75 73 20 65 72 72 6f  er spurious erro
8440: 72 73 20 69 6e 20 74 68 65 20 6d 65 61 6e 74 69  rs in the meanti
8450: 6d 65 2e 20 2a 2f 0a 20 20 20 20 70 50 61 72 73  me. */.    pPars
8460: 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 52 65 73 75  e->nMem += nResu
8470: 6c 74 43 6f 6c 3b 0a 20 20 7d 0a 20 20 70 44 65  ltCol;.  }.  pDe
8480: 73 74 2d 3e 6e 53 64 73 74 20 3d 20 6e 52 65 73  st->nSdst = nRes
8490: 75 6c 74 43 6f 6c 3b 0a 20 20 72 65 67 4f 72 69  ultCol;.  regOri
84a0: 67 20 3d 20 72 65 67 52 65 73 75 6c 74 20 3d 20  g = regResult = 
84b0: 70 44 65 73 74 2d 3e 69 53 64 73 74 3b 0a 20 20  pDest->iSdst;.  
84c0: 69 66 28 20 73 72 63 54 61 62 3e 3d 30 20 29 7b  if( srcTab>=0 ){
84d0: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
84e0: 6e 52 65 73 75 6c 74 43 6f 6c 3b 20 69 2b 2b 29  nResultCol; i++)
84f0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
8500: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
8510: 43 6f 6c 75 6d 6e 2c 20 73 72 63 54 61 62 2c 20  Column, srcTab, 
8520: 69 2c 20 72 65 67 52 65 73 75 6c 74 2b 69 29 3b  i, regResult+i);
8530: 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65  .      VdbeComme
8540: 6e 74 28 28 76 2c 20 22 25 73 22 2c 20 70 2d 3e  nt((v, "%s", p->
8550: 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61  pEList->a[i].zNa
8560: 6d 65 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  me));.    }.  }e
8570: 6c 73 65 20 69 66 28 20 65 44 65 73 74 21 3d 53  lse if( eDest!=S
8580: 52 54 5f 45 78 69 73 74 73 20 29 7b 0a 23 69 66  RT_Exists ){.#if
8590: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
85a0: 45 5f 53 4f 52 54 45 52 5f 52 45 46 45 52 45 4e  E_SORTER_REFEREN
85b0: 43 45 53 0a 20 20 20 20 45 78 70 72 4c 69 73 74  CES.    ExprList
85c0: 20 2a 70 45 78 74 72 61 20 3d 20 30 3b 0a 23 65   *pExtra = 0;.#e
85d0: 6e 64 69 66 0a 20 20 20 20 2f 2a 20 49 66 20 74  ndif.    /* If t
85e0: 68 65 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 69  he destination i
85f0: 73 20 61 6e 20 45 58 49 53 54 53 28 2e 2e 2e 29  s an EXISTS(...)
8600: 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 74 68 65   expression, the
8610: 20 61 63 74 75 61 6c 0a 20 20 20 20 2a 2a 20 76   actual.    ** v
8620: 61 6c 75 65 73 20 72 65 74 75 72 6e 65 64 20 62  alues returned b
8630: 79 20 74 68 65 20 53 45 4c 45 43 54 20 61 72 65  y the SELECT are
8640: 20 6e 6f 74 20 72 65 71 75 69 72 65 64 2e 0a 20   not required.. 
8650: 20 20 20 2a 2f 0a 20 20 20 20 75 38 20 65 63 65     */.    u8 ece
8660: 6c 46 6c 61 67 73 3b 20 20 20 20 2f 2a 20 22 65  lFlags;    /* "e
8670: 63 65 6c 22 20 69 73 20 61 6e 20 61 62 62 72 65  cel" is an abbre
8680: 76 69 61 74 69 6f 6e 20 6f 66 20 22 45 78 70 72  viation of "Expr
8690: 43 6f 64 65 45 78 70 72 4c 69 73 74 22 20 2a 2f  CodeExprList" */
86a0: 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70  .    ExprList *p
86b0: 45 4c 69 73 74 3b 0a 20 20 20 20 69 66 28 20 65  EList;.    if( e
86c0: 44 65 73 74 3d 3d 53 52 54 5f 4d 65 6d 20 7c 7c  Dest==SRT_Mem ||
86d0: 20 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70   eDest==SRT_Outp
86e0: 75 74 20 7c 7c 20 65 44 65 73 74 3d 3d 53 52 54  ut || eDest==SRT
86f0: 5f 43 6f 72 6f 75 74 69 6e 65 20 29 7b 0a 20 20  _Coroutine ){.  
8700: 20 20 20 20 65 63 65 6c 46 6c 61 67 73 20 3d 20      ecelFlags = 
8710: 53 51 4c 49 54 45 5f 45 43 45 4c 5f 44 55 50 3b  SQLITE_ECEL_DUP;
8720: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
8730: 20 20 65 63 65 6c 46 6c 61 67 73 20 3d 20 30 3b    ecelFlags = 0;
8740: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
8750: 53 6f 72 74 20 26 26 20 68 61 73 44 69 73 74 69  Sort && hasDisti
8760: 6e 63 74 3d 3d 30 20 26 26 20 65 44 65 73 74 21  nct==0 && eDest!
8770: 3d 53 52 54 5f 45 70 68 65 6d 54 61 62 20 26 26  =SRT_EphemTab &&
8780: 20 65 44 65 73 74 21 3d 53 52 54 5f 54 61 62 6c   eDest!=SRT_Tabl
8790: 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 46 6f  e ){.      /* Fo
87a0: 72 20 65 61 63 68 20 65 78 70 72 65 73 73 69 6f  r each expressio
87b0: 6e 20 69 6e 20 70 2d 3e 70 45 4c 69 73 74 20 74  n in p->pEList t
87c0: 68 61 74 20 69 73 20 61 20 63 6f 70 79 20 6f 66  hat is a copy of
87d0: 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 69   an expression i
87e0: 6e 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 4f  n.      ** the O
87f0: 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 28  RDER BY clause (
8800: 70 53 6f 72 74 2d 3e 70 4f 72 64 65 72 42 79 29  pSort->pOrderBy)
8810: 2c 20 73 65 74 20 74 68 65 20 61 73 73 6f 63 69  , set the associ
8820: 61 74 65 64 20 0a 20 20 20 20 20 20 2a 2a 20 69  ated .      ** i
8830: 4f 72 64 65 72 42 79 43 6f 6c 20 76 61 6c 75 65  OrderByCol value
8840: 20 74 6f 20 6f 6e 65 20 6d 6f 72 65 20 74 68 61   to one more tha
8850: 6e 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74  n the index of t
8860: 68 65 20 4f 52 44 45 52 20 42 59 20 0a 20 20 20  he ORDER BY .   
8870: 20 20 20 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e     ** expression
8880: 20 77 69 74 68 69 6e 20 74 68 65 20 73 6f 72 74   within the sort
8890: 2d 6b 65 79 20 74 68 61 74 20 70 75 73 68 4f 6e  -key that pushOn
88a0: 74 6f 53 6f 72 74 65 72 28 29 20 77 69 6c 6c 20  toSorter() will 
88b0: 67 65 6e 65 72 61 74 65 2e 0a 20 20 20 20 20 20  generate..      
88c0: 2a 2a 20 54 68 69 73 20 61 6c 6c 6f 77 73 20 74  ** This allows t
88d0: 68 65 20 70 2d 3e 70 45 4c 69 73 74 20 66 69 65  he p->pEList fie
88e0: 6c 64 20 74 6f 20 62 65 20 6f 6d 69 74 74 65 64  ld to be omitted
88f0: 20 66 72 6f 6d 20 74 68 65 20 73 6f 72 74 65 64   from the sorted
8900: 20 72 65 63 6f 72 64 2c 0a 20 20 20 20 20 20 2a   record,.      *
8910: 2a 20 73 61 76 69 6e 67 20 73 70 61 63 65 20 61  * saving space a
8920: 6e 64 20 43 50 55 20 63 79 63 6c 65 73 2e 20 20  nd CPU cycles.  
8930: 2a 2f 0a 20 20 20 20 20 20 65 63 65 6c 46 6c 61  */.      ecelFla
8940: 67 73 20 7c 3d 20 28 53 51 4c 49 54 45 5f 45 43  gs |= (SQLITE_EC
8950: 45 4c 5f 4f 4d 49 54 52 45 46 7c 53 51 4c 49 54  EL_OMITREF|SQLIT
8960: 45 5f 45 43 45 4c 5f 52 45 46 29 3b 0a 0a 20 20  E_ECEL_REF);..  
8970: 20 20 20 20 66 6f 72 28 69 3d 70 53 6f 72 74 2d      for(i=pSort-
8980: 3e 6e 4f 42 53 61 74 3b 20 69 3c 70 53 6f 72 74  >nOBSat; i<pSort
8990: 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70  ->pOrderBy->nExp
89a0: 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  r; i++){.       
89b0: 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 20 20   int j;.        
89c0: 69 66 28 20 28 6a 20 3d 20 70 53 6f 72 74 2d 3e  if( (j = pSort->
89d0: 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 75  pOrderBy->a[i].u
89e0: 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 29 3e  .x.iOrderByCol)>
89f0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  0 ){.          p
8a00: 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 6a 2d 31 5d  ->pEList->a[j-1]
8a10: 2e 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c  .u.x.iOrderByCol
8a20: 20 3d 20 69 2b 31 2d 70 53 6f 72 74 2d 3e 6e 4f   = i+1-pSort->nO
8a30: 42 53 61 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a  BSat;.        }.
8a40: 20 20 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53        }.#ifdef S
8a50: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 4f 52  QLITE_ENABLE_SOR
8a60: 54 45 52 5f 52 45 46 45 52 45 4e 43 45 53 0a 20  TER_REFERENCES. 
8a70: 20 20 20 20 20 73 65 6c 65 63 74 45 78 70 72 44       selectExprD
8a80: 65 66 65 72 28 70 50 61 72 73 65 2c 20 70 53 6f  efer(pParse, pSo
8a90: 72 74 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20 26  rt, p->pEList, &
8aa0: 70 45 78 74 72 61 29 3b 0a 20 20 20 20 20 20 69  pExtra);.      i
8ab0: 66 28 20 70 45 78 74 72 61 20 26 26 20 70 50 61  f( pExtra && pPa
8ac0: 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  rse->db->mallocF
8ad0: 61 69 6c 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20  ailed==0 ){.    
8ae0: 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20      /* If there 
8af0: 61 72 65 20 61 6e 79 20 65 78 74 72 61 20 50 4b  are any extra PK
8b00: 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 61 64 64 20   columns to add 
8b10: 74 6f 20 74 68 65 20 73 6f 72 74 65 72 20 72 65  to the sorter re
8b20: 63 6f 72 64 73 2c 0a 20 20 20 20 20 20 20 20 2a  cords,.        *
8b30: 2a 20 61 6c 6c 6f 63 61 74 65 20 65 78 74 72 61  * allocate extra
8b40: 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20 61 6e   memory cells an
8b50: 64 20 61 64 6a 75 73 74 20 74 68 65 20 4f 70 65  d adjust the Ope
8b60: 6e 45 70 68 65 6d 65 72 61 6c 20 0a 20 20 20 20  nEphemeral .    
8b70: 20 20 20 20 2a 2a 20 69 6e 73 74 72 75 63 74 69      ** instructi
8b80: 6f 6e 20 74 6f 20 61 63 63 6f 75 6e 74 20 66 6f  on to account fo
8b90: 72 20 74 68 65 20 6c 61 72 67 65 72 20 72 65 63  r the larger rec
8ba0: 6f 72 64 73 2e 20 54 68 69 73 20 69 73 20 6f 6e  ords. This is on
8bb0: 6c 79 0a 20 20 20 20 20 20 20 20 2a 2a 20 72 65  ly.        ** re
8bc0: 71 75 69 72 65 64 20 69 66 20 74 68 65 72 65 20  quired if there 
8bd0: 61 72 65 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20  are one or more 
8be0: 57 49 54 48 4f 55 54 20 52 4f 57 49 44 20 74 61  WITHOUT ROWID ta
8bf0: 62 6c 65 73 20 77 69 74 68 0a 20 20 20 20 20 20  bles with.      
8c00: 20 20 2a 2a 20 63 6f 6d 70 6f 73 69 74 65 20 70    ** composite p
8c10: 72 69 6d 61 72 79 20 6b 65 79 73 20 69 6e 20 74  rimary keys in t
8c20: 68 65 20 53 6f 72 74 43 74 78 2e 61 44 65 66 65  he SortCtx.aDefe
8c30: 72 5b 5d 20 61 72 72 61 79 2e 20 20 2a 2f 0a 20  r[] array.  */. 
8c40: 20 20 20 20 20 20 20 56 64 62 65 4f 70 20 2a 70         VdbeOp *p
8c50: 4f 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  Op = sqlite3Vdbe
8c60: 47 65 74 4f 70 28 76 2c 20 70 53 6f 72 74 2d 3e  GetOp(v, pSort->
8c70: 61 64 64 72 53 6f 72 74 49 6e 64 65 78 29 3b 0a  addrSortIndex);.
8c80: 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 70 32 20          pOp->p2 
8c90: 2b 3d 20 28 70 45 78 74 72 61 2d 3e 6e 45 78 70  += (pExtra->nExp
8ca0: 72 20 2d 20 70 53 6f 72 74 2d 3e 6e 44 65 66 65  r - pSort->nDefe
8cb0: 72 29 3b 0a 20 20 20 20 20 20 20 20 70 4f 70 2d  r);.        pOp-
8cc0: 3e 70 34 2e 70 4b 65 79 49 6e 66 6f 2d 3e 6e 41  >p4.pKeyInfo->nA
8cd0: 6c 6c 46 69 65 6c 64 20 2b 3d 20 28 70 45 78 74  llField += (pExt
8ce0: 72 61 2d 3e 6e 45 78 70 72 20 2d 20 70 53 6f 72  ra->nExpr - pSor
8cf0: 74 2d 3e 6e 44 65 66 65 72 29 3b 0a 20 20 20 20  t->nDefer);.    
8d00: 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d      pParse->nMem
8d10: 20 2b 3d 20 70 45 78 74 72 61 2d 3e 6e 45 78 70   += pExtra->nExp
8d20: 72 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69  r;.      }.#endi
8d30: 66 0a 0a 20 20 20 20 20 20 2f 2a 20 41 64 6a 75  f..      /* Adju
8d40: 73 74 20 6e 52 65 73 75 6c 74 43 6f 6c 20 74 6f  st nResultCol to
8d50: 20 61 63 63 6f 75 6e 74 20 66 6f 72 20 63 6f 6c   account for col
8d60: 75 6d 6e 73 20 74 68 61 74 20 61 72 65 20 6f 6d  umns that are om
8d70: 69 74 74 65 64 0a 20 20 20 20 20 20 2a 2a 20 66  itted.      ** f
8d80: 72 6f 6d 20 74 68 65 20 73 6f 72 74 65 72 20 62  rom the sorter b
8d90: 79 20 74 68 65 20 6f 70 74 69 6d 69 7a 61 74 69  y the optimizati
8da0: 6f 6e 73 20 69 6e 20 74 68 69 73 20 62 72 61 6e  ons in this bran
8db0: 63 68 20 2a 2f 0a 20 20 20 20 20 20 70 45 4c 69  ch */.      pELi
8dc0: 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a  st = p->pEList;.
8dd0: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
8de0: 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20  <pEList->nExpr; 
8df0: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66  i++){.        if
8e00: 28 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 75  ( pEList->a[i].u
8e10: 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 3e 30  .x.iOrderByCol>0
8e20: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
8e30: 4e 41 42 4c 45 5f 53 4f 52 54 45 52 5f 52 45 46  NABLE_SORTER_REF
8e40: 45 52 45 4e 43 45 53 0a 20 20 20 20 20 20 20 20  ERENCES.        
8e50: 20 7c 7c 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d   || pEList->a[i]
8e60: 2e 62 53 6f 72 74 65 72 52 65 66 0a 23 65 6e 64  .bSorterRef.#end
8e70: 69 66 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20  if.        ){.  
8e80: 20 20 20 20 20 20 20 20 6e 52 65 73 75 6c 74 43          nResultC
8e90: 6f 6c 2d 2d 3b 0a 20 20 20 20 20 20 20 20 20 20  ol--;.          
8ea0: 72 65 67 4f 72 69 67 20 3d 20 30 3b 0a 20 20 20  regOrig = 0;.   
8eb0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a       }.      }..
8ec0: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
8ed0: 72 65 67 4f 72 69 67 20 29 3b 0a 20 20 20 20 20  regOrig );.     
8ee0: 20 74 65 73 74 63 61 73 65 28 20 65 44 65 73 74   testcase( eDest
8ef0: 3d 3d 53 52 54 5f 53 65 74 20 29 3b 0a 20 20 20  ==SRT_Set );.   
8f00: 20 20 20 74 65 73 74 63 61 73 65 28 20 65 44 65     testcase( eDe
8f10: 73 74 3d 3d 53 52 54 5f 4d 65 6d 20 29 3b 0a 20  st==SRT_Mem );. 
8f20: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 65       testcase( e
8f30: 44 65 73 74 3d 3d 53 52 54 5f 43 6f 72 6f 75 74  Dest==SRT_Corout
8f40: 69 6e 65 20 29 3b 0a 20 20 20 20 20 20 74 65 73  ine );.      tes
8f50: 74 63 61 73 65 28 20 65 44 65 73 74 3d 3d 53 52  tcase( eDest==SR
8f60: 54 5f 4f 75 74 70 75 74 20 29 3b 0a 20 20 20 20  T_Output );.    
8f70: 20 20 61 73 73 65 72 74 28 20 65 44 65 73 74 3d    assert( eDest=
8f80: 3d 53 52 54 5f 53 65 74 20 7c 7c 20 65 44 65 73  =SRT_Set || eDes
8f90: 74 3d 3d 53 52 54 5f 4d 65 6d 20 0a 20 20 20 20  t==SRT_Mem .    
8fa0: 20 20 20 20 20 20 20 7c 7c 20 65 44 65 73 74 3d         || eDest=
8fb0: 3d 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 20 7c  =SRT_Coroutine |
8fc0: 7c 20 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74  | eDest==SRT_Out
8fd0: 70 75 74 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20  put );.    }.   
8fe0: 20 73 52 6f 77 4c 6f 61 64 49 6e 66 6f 2e 72 65   sRowLoadInfo.re
8ff0: 67 52 65 73 75 6c 74 20 3d 20 72 65 67 52 65 73  gResult = regRes
9000: 75 6c 74 3b 0a 20 20 20 20 73 52 6f 77 4c 6f 61  ult;.    sRowLoa
9010: 64 49 6e 66 6f 2e 65 63 65 6c 46 6c 61 67 73 20  dInfo.ecelFlags 
9020: 3d 20 65 63 65 6c 46 6c 61 67 73 3b 0a 23 69 66  = ecelFlags;.#if
9030: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
9040: 45 5f 53 4f 52 54 45 52 5f 52 45 46 45 52 45 4e  E_SORTER_REFEREN
9050: 43 45 53 0a 20 20 20 20 73 52 6f 77 4c 6f 61 64  CES.    sRowLoad
9060: 49 6e 66 6f 2e 70 45 78 74 72 61 20 3d 20 70 45  Info.pExtra = pE
9070: 78 74 72 61 3b 0a 20 20 20 20 73 52 6f 77 4c 6f  xtra;.    sRowLo
9080: 61 64 49 6e 66 6f 2e 72 65 67 45 78 74 72 61 52  adInfo.regExtraR
9090: 65 73 75 6c 74 20 3d 20 72 65 67 52 65 73 75 6c  esult = regResul
90a0: 74 20 2b 20 6e 52 65 73 75 6c 74 43 6f 6c 3b 0a  t + nResultCol;.
90b0: 20 20 20 20 69 66 28 20 70 45 78 74 72 61 20 29      if( pExtra )
90c0: 20 6e 52 65 73 75 6c 74 43 6f 6c 20 2b 3d 20 70   nResultCol += p
90d0: 45 78 74 72 61 2d 3e 6e 45 78 70 72 3b 0a 23 65  Extra->nExpr;.#e
90e0: 6e 64 69 66 0a 20 20 20 20 69 66 28 20 70 2d 3e  ndif.    if( p->
90f0: 69 4c 69 6d 69 74 0a 20 20 20 20 20 26 26 20 28  iLimit.     && (
9100: 65 63 65 6c 46 6c 61 67 73 20 26 20 53 51 4c 49  ecelFlags & SQLI
9110: 54 45 5f 45 43 45 4c 5f 4f 4d 49 54 52 45 46 29  TE_ECEL_OMITREF)
9120: 21 3d 30 20 0a 20 20 20 20 20 26 26 20 6e 50 72  !=0 .     && nPr
9130: 65 66 69 78 52 65 67 3e 30 0a 20 20 20 20 29 7b  efixReg>0.    ){
9140: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
9150: 53 6f 72 74 21 3d 30 20 29 3b 0a 20 20 20 20 20  Sort!=0 );.     
9160: 20 61 73 73 65 72 74 28 20 68 61 73 44 69 73 74   assert( hasDist
9170: 69 6e 63 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20  inct==0 );.     
9180: 20 70 53 6f 72 74 2d 3e 70 44 65 66 65 72 72 65   pSort->pDeferre
9190: 64 52 6f 77 4c 6f 61 64 20 3d 20 26 73 52 6f 77  dRowLoad = &sRow
91a0: 4c 6f 61 64 49 6e 66 6f 3b 0a 20 20 20 20 20 20  LoadInfo;.      
91b0: 72 65 67 4f 72 69 67 20 3d 20 30 3b 0a 20 20 20  regOrig = 0;.   
91c0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e   }else{.      in
91d0: 6e 65 72 4c 6f 6f 70 4c 6f 61 64 52 6f 77 28 70  nerLoopLoadRow(p
91e0: 50 61 72 73 65 2c 20 70 2c 20 26 73 52 6f 77 4c  Parse, p, &sRowL
91f0: 6f 61 64 49 6e 66 6f 29 3b 0a 20 20 20 20 7d 0a  oadInfo);.    }.
9200: 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65    }..  /* If the
9210: 20 44 49 53 54 49 4e 43 54 20 6b 65 79 77 6f 72   DISTINCT keywor
9220: 64 20 77 61 73 20 70 72 65 73 65 6e 74 20 6f 6e  d was present on
9230: 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74   the SELECT stat
9240: 65 6d 65 6e 74 0a 20 20 2a 2a 20 61 6e 64 20 74  ement.  ** and t
9250: 68 69 73 20 72 6f 77 20 68 61 73 20 62 65 65 6e  his row has been
9260: 20 73 65 65 6e 20 62 65 66 6f 72 65 2c 20 74 68   seen before, th
9270: 65 6e 20 64 6f 20 6e 6f 74 20 6d 61 6b 65 20 74  en do not make t
9280: 68 69 73 20 72 6f 77 0a 20 20 2a 2a 20 70 61 72  his row.  ** par
9290: 74 20 6f 66 20 74 68 65 20 72 65 73 75 6c 74 2e  t of the result.
92a0: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 68 61 73 44  .  */.  if( hasD
92b0: 69 73 74 69 6e 63 74 20 29 7b 0a 20 20 20 20 73  istinct ){.    s
92c0: 77 69 74 63 68 28 20 70 44 69 73 74 69 6e 63 74  witch( pDistinct
92d0: 2d 3e 65 54 6e 63 74 54 79 70 65 20 29 7b 0a 20  ->eTnctType ){. 
92e0: 20 20 20 20 20 63 61 73 65 20 57 48 45 52 45 5f       case WHERE_
92f0: 44 49 53 54 49 4e 43 54 5f 4f 52 44 45 52 45 44  DISTINCT_ORDERED
9300: 3a 20 7b 0a 20 20 20 20 20 20 20 20 56 64 62 65  : {.        Vdbe
9310: 4f 70 20 2a 70 4f 70 3b 20 20 20 20 20 20 20 20  Op *pOp;        
9320: 20 20 20 20 2f 2a 20 4e 6f 20 6c 6f 6e 67 65 72      /* No longer
9330: 20 72 65 71 75 69 72 65 64 20 4f 70 65 6e 45 70   required OpenEp
9340: 68 65 6d 65 72 61 6c 20 69 6e 73 74 72 2e 20 2a  hemeral instr. *
9350: 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 4a  /.        int iJ
9360: 75 6d 70 3b 20 20 20 20 20 20 20 20 20 20 20 20  ump;            
9370: 20 20 2f 2a 20 4a 75 6d 70 20 64 65 73 74 69 6e    /* Jump destin
9380: 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 20  ation */.       
9390: 20 69 6e 74 20 72 65 67 50 72 65 76 3b 20 20 20   int regPrev;   
93a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72 65 76           /* Prev
93b0: 69 6f 75 73 20 72 6f 77 20 63 6f 6e 74 65 6e 74  ious row content
93c0: 20 2a 2f 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20   */..        /* 
93d0: 41 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66  Allocate space f
93e0: 6f 72 20 74 68 65 20 70 72 65 76 69 6f 75 73 20  or the previous 
93f0: 72 6f 77 20 2a 2f 0a 20 20 20 20 20 20 20 20 72  row */.        r
9400: 65 67 50 72 65 76 20 3d 20 70 50 61 72 73 65 2d  egPrev = pParse-
9410: 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20 20 20 20  >nMem+1;.       
9420: 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d   pParse->nMem +=
9430: 20 6e 52 65 73 75 6c 74 43 6f 6c 3b 0a 0a 20 20   nResultCol;..  
9440: 20 20 20 20 20 20 2f 2a 20 43 68 61 6e 67 65 20        /* Change 
9450: 74 68 65 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d  the OP_OpenEphem
9460: 65 72 61 6c 20 63 6f 64 65 64 20 65 61 72 6c 69  eral coded earli
9470: 65 72 20 74 6f 20 61 6e 20 4f 50 5f 4e 75 6c 6c  er to an OP_Null
9480: 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 65 74 73  .        ** sets
9490: 20 74 68 65 20 4d 45 4d 5f 43 6c 65 61 72 65 64   the MEM_Cleared
94a0: 20 62 69 74 20 6f 6e 20 74 68 65 20 66 69 72 73   bit on the firs
94b0: 74 20 72 65 67 69 73 74 65 72 20 6f 66 20 74 68  t register of th
94c0: 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 72 65  e.        ** pre
94d0: 76 69 6f 75 73 20 76 61 6c 75 65 2e 20 20 54 68  vious value.  Th
94e0: 69 73 20 77 69 6c 6c 20 63 61 75 73 65 20 74 68  is will cause th
94f0: 65 20 4f 50 5f 4e 65 20 62 65 6c 6f 77 20 74 6f  e OP_Ne below to
9500: 20 61 6c 77 61 79 73 0a 20 20 20 20 20 20 20 20   always.        
9510: 2a 2a 20 66 61 69 6c 20 6f 6e 20 74 68 65 20 66  ** fail on the f
9520: 69 72 73 74 20 69 74 65 72 61 74 69 6f 6e 20 6f  irst iteration o
9530: 66 20 74 68 65 20 6c 6f 6f 70 20 65 76 65 6e 20  f the loop even 
9540: 69 66 20 74 68 65 20 66 69 72 73 74 0a 20 20 20  if the first.   
9550: 20 20 20 20 20 2a 2a 20 72 6f 77 20 69 73 20 61       ** row is a
9560: 6c 6c 20 4e 55 4c 4c 73 2e 0a 20 20 20 20 20 20  ll NULLs..      
9570: 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 73 71 6c    */.        sql
9580: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 54 6f  ite3VdbeChangeTo
9590: 4e 6f 6f 70 28 76 2c 20 70 44 69 73 74 69 6e 63  Noop(v, pDistinc
95a0: 74 2d 3e 61 64 64 72 54 6e 63 74 29 3b 0a 20 20  t->addrTnct);.  
95b0: 20 20 20 20 20 20 70 4f 70 20 3d 20 73 71 6c 69        pOp = sqli
95c0: 74 65 33 56 64 62 65 47 65 74 4f 70 28 76 2c 20  te3VdbeGetOp(v, 
95d0: 70 44 69 73 74 69 6e 63 74 2d 3e 61 64 64 72 54  pDistinct->addrT
95e0: 6e 63 74 29 3b 0a 20 20 20 20 20 20 20 20 70 4f  nct);.        pO
95f0: 70 2d 3e 6f 70 63 6f 64 65 20 3d 20 4f 50 5f 4e  p->opcode = OP_N
9600: 75 6c 6c 3b 0a 20 20 20 20 20 20 20 20 70 4f 70  ull;.        pOp
9610: 2d 3e 70 31 20 3d 20 31 3b 0a 20 20 20 20 20 20  ->p1 = 1;.      
9620: 20 20 70 4f 70 2d 3e 70 32 20 3d 20 72 65 67 50    pOp->p2 = regP
9630: 72 65 76 3b 0a 0a 20 20 20 20 20 20 20 20 69 4a  rev;..        iJ
9640: 75 6d 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ump = sqlite3Vdb
9650: 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 20  eCurrentAddr(v) 
9660: 2b 20 6e 52 65 73 75 6c 74 43 6f 6c 3b 0a 20 20  + nResultCol;.  
9670: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
9680: 3c 6e 52 65 73 75 6c 74 43 6f 6c 3b 20 69 2b 2b  <nResultCol; i++
9690: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 43 6f 6c  ){.          Col
96a0: 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 73 71  lSeq *pColl = sq
96b0: 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71  lite3ExprCollSeq
96c0: 28 70 50 61 72 73 65 2c 20 70 2d 3e 70 45 4c 69  (pParse, p->pELi
96d0: 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b  st->a[i].pExpr);
96e0: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69  .          if( i
96f0: 3c 6e 52 65 73 75 6c 74 43 6f 6c 2d 31 20 29 7b  <nResultCol-1 ){
9700: 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
9710: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
9720: 2c 20 4f 50 5f 4e 65 2c 20 72 65 67 52 65 73 75  , OP_Ne, regResu
9730: 6c 74 2b 69 2c 20 69 4a 75 6d 70 2c 20 72 65 67  lt+i, iJump, reg
9740: 50 72 65 76 2b 69 29 3b 0a 20 20 20 20 20 20 20  Prev+i);.       
9750: 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
9760: 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20  e(v);.          
9770: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
9780: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
9790: 64 4f 70 33 28 76 2c 20 4f 50 5f 45 71 2c 20 72  dOp3(v, OP_Eq, r
97a0: 65 67 52 65 73 75 6c 74 2b 69 2c 20 69 43 6f 6e  egResult+i, iCon
97b0: 74 69 6e 75 65 2c 20 72 65 67 50 72 65 76 2b 69  tinue, regPrev+i
97c0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 56  );.            V
97d0: 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
97e0: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
97f0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
9800: 62 65 43 68 61 6e 67 65 50 34 28 76 2c 20 2d 31  beChangeP4(v, -1
9810: 2c 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29  , (const char *)
9820: 70 43 6f 6c 6c 2c 20 50 34 5f 43 4f 4c 4c 53 45  pColl, P4_COLLSE
9830: 51 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  Q);.          sq
9840: 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
9850: 35 28 76 2c 20 53 51 4c 49 54 45 5f 4e 55 4c 4c  5(v, SQLITE_NULL
9860: 45 51 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  EQ);.        }. 
9870: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73         assert( s
9880: 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
9890: 74 41 64 64 72 28 76 29 3d 3d 69 4a 75 6d 70 20  tAddr(v)==iJump 
98a0: 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d  || pParse->db->m
98b0: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20  allocFailed );. 
98c0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
98d0: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43  beAddOp3(v, OP_C
98e0: 6f 70 79 2c 20 72 65 67 52 65 73 75 6c 74 2c 20  opy, regResult, 
98f0: 72 65 67 50 72 65 76 2c 20 6e 52 65 73 75 6c 74  regPrev, nResult
9900: 43 6f 6c 2d 31 29 3b 0a 20 20 20 20 20 20 20 20  Col-1);.        
9910: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a  break;.      }..
9920: 20 20 20 20 20 20 63 61 73 65 20 57 48 45 52 45        case WHERE
9930: 5f 44 49 53 54 49 4e 43 54 5f 55 4e 49 51 55 45  _DISTINCT_UNIQUE
9940: 3a 20 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  : {.        sqli
9950: 74 65 33 56 64 62 65 43 68 61 6e 67 65 54 6f 4e  te3VdbeChangeToN
9960: 6f 6f 70 28 76 2c 20 70 44 69 73 74 69 6e 63 74  oop(v, pDistinct
9970: 2d 3e 61 64 64 72 54 6e 63 74 29 3b 0a 20 20 20  ->addrTnct);.   
9980: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
9990: 20 20 7d 0a 0a 20 20 20 20 20 20 64 65 66 61 75    }..      defau
99a0: 6c 74 3a 20 7b 0a 20 20 20 20 20 20 20 20 61 73  lt: {.        as
99b0: 73 65 72 74 28 20 70 44 69 73 74 69 6e 63 74 2d  sert( pDistinct-
99c0: 3e 65 54 6e 63 74 54 79 70 65 3d 3d 57 48 45 52  >eTnctType==WHER
99d0: 45 5f 44 49 53 54 49 4e 43 54 5f 55 4e 4f 52 44  E_DISTINCT_UNORD
99e0: 45 52 45 44 20 29 3b 0a 20 20 20 20 20 20 20 20  ERED );.        
99f0: 63 6f 64 65 44 69 73 74 69 6e 63 74 28 70 50 61  codeDistinct(pPa
9a00: 72 73 65 2c 20 70 44 69 73 74 69 6e 63 74 2d 3e  rse, pDistinct->
9a10: 74 61 62 54 6e 63 74 2c 20 69 43 6f 6e 74 69 6e  tabTnct, iContin
9a20: 75 65 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 2c 0a  ue, nResultCol,.
9a30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9a40: 20 20 20 20 20 72 65 67 52 65 73 75 6c 74 29 3b       regResult);
9a50: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
9a60: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
9a70: 20 20 69 66 28 20 70 53 6f 72 74 3d 3d 30 20 29    if( pSort==0 )
9a80: 7b 0a 20 20 20 20 20 20 63 6f 64 65 4f 66 66 73  {.      codeOffs
9a90: 65 74 28 76 2c 20 70 2d 3e 69 4f 66 66 73 65 74  et(v, p->iOffset
9aa0: 2c 20 69 43 6f 6e 74 69 6e 75 65 29 3b 0a 20 20  , iContinue);.  
9ab0: 20 20 7d 0a 20 20 7d 0a 0a 20 20 73 77 69 74 63    }.  }..  switc
9ac0: 68 28 20 65 44 65 73 74 20 29 7b 0a 20 20 20 20  h( eDest ){.    
9ad0: 2f 2a 20 49 6e 20 74 68 69 73 20 6d 6f 64 65 2c  /* In this mode,
9ae0: 20 77 72 69 74 65 20 65 61 63 68 20 71 75 65 72   write each quer
9af0: 79 20 72 65 73 75 6c 74 20 74 6f 20 74 68 65 20  y result to the 
9b00: 6b 65 79 20 6f 66 20 74 68 65 20 74 65 6d 70 6f  key of the tempo
9b10: 72 61 72 79 0a 20 20 20 20 2a 2a 20 74 61 62 6c  rary.    ** tabl
9b20: 65 20 69 50 61 72 6d 2e 0a 20 20 20 20 2a 2f 0a  e iParm..    */.
9b30: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
9b40: 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c  MIT_COMPOUND_SEL
9b50: 45 43 54 0a 20 20 20 20 63 61 73 65 20 53 52 54  ECT.    case SRT
9b60: 5f 55 6e 69 6f 6e 3a 20 7b 0a 20 20 20 20 20 20  _Union: {.      
9b70: 69 6e 74 20 72 31 3b 0a 20 20 20 20 20 20 72 31  int r1;.      r1
9b80: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
9b90: 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20  pReg(pParse);.  
9ba0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
9bb0: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65  ddOp3(v, OP_Make
9bc0: 52 65 63 6f 72 64 2c 20 72 65 67 52 65 73 75 6c  Record, regResul
9bd0: 74 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 2c 20 72  t, nResultCol, r
9be0: 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  1);.      sqlite
9bf0: 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76  3VdbeAddOp4Int(v
9c00: 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20  , OP_IdxInsert, 
9c10: 69 50 61 72 6d 2c 20 72 31 2c 20 72 65 67 52 65  iParm, r1, regRe
9c20: 73 75 6c 74 2c 20 6e 52 65 73 75 6c 74 43 6f 6c  sult, nResultCol
9c30: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
9c40: 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
9c50: 50 61 72 73 65 2c 20 72 31 29 3b 0a 20 20 20 20  Parse, r1);.    
9c60: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
9c70: 20 20 20 20 2f 2a 20 43 6f 6e 73 74 72 75 63 74      /* Construct
9c80: 20 61 20 72 65 63 6f 72 64 20 66 72 6f 6d 20 74   a record from t
9c90: 68 65 20 71 75 65 72 79 20 72 65 73 75 6c 74 2c  he query result,
9ca0: 20 62 75 74 20 69 6e 73 74 65 61 64 20 6f 66 0a   but instead of.
9cb0: 20 20 20 20 2a 2a 20 73 61 76 69 6e 67 20 74 68      ** saving th
9cc0: 61 74 20 72 65 63 6f 72 64 2c 20 75 73 65 20 69  at record, use i
9cd0: 74 20 61 73 20 61 20 6b 65 79 20 74 6f 20 64 65  t as a key to de
9ce0: 6c 65 74 65 20 65 6c 65 6d 65 6e 74 73 20 66 72  lete elements fr
9cf0: 6f 6d 0a 20 20 20 20 2a 2a 20 74 68 65 20 74 65  om.    ** the te
9d00: 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 69 50  mporary table iP
9d10: 61 72 6d 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  arm..    */.    
9d20: 63 61 73 65 20 53 52 54 5f 45 78 63 65 70 74 3a  case SRT_Except:
9d30: 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   {.      sqlite3
9d40: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
9d50: 5f 49 64 78 44 65 6c 65 74 65 2c 20 69 50 61 72  _IdxDelete, iPar
9d60: 6d 2c 20 72 65 67 52 65 73 75 6c 74 2c 20 6e 52  m, regResult, nR
9d70: 65 73 75 6c 74 43 6f 6c 29 3b 0a 20 20 20 20 20  esultCol);.     
9d80: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65   break;.    }.#e
9d90: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
9da0: 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c  MIT_COMPOUND_SEL
9db0: 45 43 54 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 53  ECT */..    /* S
9dc0: 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 20  tore the result 
9dd0: 61 73 20 64 61 74 61 20 75 73 69 6e 67 20 61 20  as data using a 
9de0: 75 6e 69 71 75 65 20 6b 65 79 2e 0a 20 20 20 20  unique key..    
9df0: 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f  */.    case SRT_
9e00: 46 69 66 6f 3a 0a 20 20 20 20 63 61 73 65 20 53  Fifo:.    case S
9e10: 52 54 5f 44 69 73 74 46 69 66 6f 3a 0a 20 20 20  RT_DistFifo:.   
9e20: 20 63 61 73 65 20 53 52 54 5f 54 61 62 6c 65 3a   case SRT_Table:
9e30: 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 45 70  .    case SRT_Ep
9e40: 68 65 6d 54 61 62 3a 20 7b 0a 20 20 20 20 20 20  hemTab: {.      
9e50: 69 6e 74 20 72 31 20 3d 20 73 71 6c 69 74 65 33  int r1 = sqlite3
9e60: 47 65 74 54 65 6d 70 52 61 6e 67 65 28 70 50 61  GetTempRange(pPa
9e70: 72 73 65 2c 20 6e 50 72 65 66 69 78 52 65 67 2b  rse, nPrefixReg+
9e80: 31 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  1);.      testca
9e90: 73 65 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 54  se( eDest==SRT_T
9ea0: 61 62 6c 65 20 29 3b 0a 20 20 20 20 20 20 74 65  able );.      te
9eb0: 73 74 63 61 73 65 28 20 65 44 65 73 74 3d 3d 53  stcase( eDest==S
9ec0: 52 54 5f 45 70 68 65 6d 54 61 62 20 29 3b 0a 20  RT_EphemTab );. 
9ed0: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 65       testcase( e
9ee0: 44 65 73 74 3d 3d 53 52 54 5f 46 69 66 6f 20 29  Dest==SRT_Fifo )
9ef0: 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
9f00: 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 44 69 73  ( eDest==SRT_Dis
9f10: 74 46 69 66 6f 20 29 3b 0a 20 20 20 20 20 20 73  tFifo );.      s
9f20: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
9f30: 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72  (v, OP_MakeRecor
9f40: 64 2c 20 72 65 67 52 65 73 75 6c 74 2c 20 6e 52  d, regResult, nR
9f50: 65 73 75 6c 74 43 6f 6c 2c 20 72 31 2b 6e 50 72  esultCol, r1+nPr
9f60: 65 66 69 78 52 65 67 29 3b 0a 23 69 66 6e 64 65  efixReg);.#ifnde
9f70: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 54  f SQLITE_OMIT_CT
9f80: 45 0a 20 20 20 20 20 20 69 66 28 20 65 44 65 73  E.      if( eDes
9f90: 74 3d 3d 53 52 54 5f 44 69 73 74 46 69 66 6f 20  t==SRT_DistFifo 
9fa0: 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66  ){.        /* If
9fb0: 20 74 68 65 20 64 65 73 74 69 6e 61 74 69 6f 6e   the destination
9fc0: 20 69 73 20 44 69 73 74 46 69 66 6f 2c 20 74 68   is DistFifo, th
9fd0: 65 6e 20 63 75 72 73 6f 72 20 28 69 50 61 72 6d  en cursor (iParm
9fe0: 2b 31 29 20 69 73 20 6f 70 65 6e 0a 20 20 20 20  +1) is open.    
9ff0: 20 20 20 20 2a 2a 20 6f 6e 20 61 6e 20 65 70 68      ** on an eph
a000: 65 6d 65 72 61 6c 20 69 6e 64 65 78 2e 20 49 66  emeral index. If
a010: 20 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f 77   the current row
a020: 20 69 73 20 61 6c 72 65 61 64 79 20 70 72 65 73   is already pres
a030: 65 6e 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 69  ent.        ** i
a040: 6e 20 74 68 65 20 69 6e 64 65 78 2c 20 64 6f 20  n the index, do 
a050: 6e 6f 74 20 77 72 69 74 65 20 69 74 20 74 6f 20  not write it to 
a060: 74 68 65 20 6f 75 74 70 75 74 2e 20 49 66 20 6e  the output. If n
a070: 6f 74 2c 20 61 64 64 20 74 68 65 0a 20 20 20 20  ot, add the.    
a080: 20 20 20 20 2a 2a 20 63 75 72 72 65 6e 74 20 72      ** current r
a090: 6f 77 20 74 6f 20 74 68 65 20 69 6e 64 65 78 20  ow to the index 
a0a0: 61 6e 64 20 70 72 6f 63 65 65 64 20 77 69 74 68  and proceed with
a0b0: 20 77 72 69 74 69 6e 67 20 69 74 20 74 6f 20 74   writing it to t
a0c0: 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 75  he.        ** ou
a0d0: 74 70 75 74 20 74 61 62 6c 65 20 61 73 20 77 65  tput table as we
a0e0: 6c 6c 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20  ll.  */.        
a0f0: 69 6e 74 20 61 64 64 72 20 3d 20 73 71 6c 69 74  int addr = sqlit
a100: 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
a110: 72 28 76 29 20 2b 20 34 3b 0a 20 20 20 20 20 20  r(v) + 4;.      
a120: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
a130: 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 46 6f 75  Op4Int(v, OP_Fou
a140: 6e 64 2c 20 69 50 61 72 6d 2b 31 2c 20 61 64 64  nd, iParm+1, add
a150: 72 2c 20 72 31 2c 20 30 29 3b 0a 20 20 20 20 20  r, r1, 0);.     
a160: 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28     VdbeCoverage(
a170: 76 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  v);.        sqli
a180: 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74  te3VdbeAddOp4Int
a190: 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74  (v, OP_IdxInsert
a1a0: 2c 20 69 50 61 72 6d 2b 31 2c 20 72 31 2c 72 65  , iParm+1, r1,re
a1b0: 67 52 65 73 75 6c 74 2c 6e 52 65 73 75 6c 74 43  gResult,nResultC
a1c0: 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  ol);.        ass
a1d0: 65 72 74 28 20 70 53 6f 72 74 3d 3d 30 20 29 3b  ert( pSort==0 );
a1e0: 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  .      }.#endif.
a1f0: 20 20 20 20 20 20 69 66 28 20 70 53 6f 72 74 20        if( pSort 
a200: 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ){.        asser
a210: 74 28 20 72 65 67 52 65 73 75 6c 74 3d 3d 72 65  t( regResult==re
a220: 67 4f 72 69 67 20 29 3b 0a 20 20 20 20 20 20 20  gOrig );.       
a230: 20 70 75 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28   pushOntoSorter(
a240: 70 50 61 72 73 65 2c 20 70 53 6f 72 74 2c 20 70  pParse, pSort, p
a250: 2c 20 72 31 2b 6e 50 72 65 66 69 78 52 65 67 2c  , r1+nPrefixReg,
a260: 20 72 65 67 4f 72 69 67 2c 20 31 2c 20 6e 50 72   regOrig, 1, nPr
a270: 65 66 69 78 52 65 67 29 3b 0a 20 20 20 20 20 20  efixReg);.      
a280: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69  }else{.        i
a290: 6e 74 20 72 32 20 3d 20 73 71 6c 69 74 65 33 47  nt r2 = sqlite3G
a2a0: 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  etTempReg(pParse
a2b0: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
a2c0: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
a2d0: 4f 50 5f 4e 65 77 52 6f 77 69 64 2c 20 69 50 61  OP_NewRowid, iPa
a2e0: 72 6d 2c 20 72 32 29 3b 0a 20 20 20 20 20 20 20  rm, r2);.       
a2f0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
a300: 70 33 28 76 2c 20 4f 50 5f 49 6e 73 65 72 74 2c  p3(v, OP_Insert,
a310: 20 69 50 61 72 6d 2c 20 72 31 2c 20 72 32 29 3b   iParm, r1, r2);
a320: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
a330: 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20  VdbeChangeP5(v, 
a340: 4f 50 46 4c 41 47 5f 41 50 50 45 4e 44 29 3b 0a  OPFLAG_APPEND);.
a350: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52          sqlite3R
a360: 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
a370: 61 72 73 65 2c 20 72 32 29 3b 0a 20 20 20 20 20  arse, r2);.     
a380: 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
a390: 52 65 6c 65 61 73 65 54 65 6d 70 52 61 6e 67 65  ReleaseTempRange
a3a0: 28 70 50 61 72 73 65 2c 20 72 31 2c 20 6e 50 72  (pParse, r1, nPr
a3b0: 65 66 69 78 52 65 67 2b 31 29 3b 0a 20 20 20 20  efixReg+1);.    
a3c0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
a3d0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
a3e0: 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20 20  MIT_SUBQUERY.   
a3f0: 20 2f 2a 20 49 66 20 77 65 20 61 72 65 20 63 72   /* If we are cr
a400: 65 61 74 69 6e 67 20 61 20 73 65 74 20 66 6f 72  eating a set for
a410: 20 61 6e 20 22 65 78 70 72 20 49 4e 20 28 53 45   an "expr IN (SE
a420: 4c 45 43 54 20 2e 2e 2e 29 22 20 63 6f 6e 73 74  LECT ...)" const
a430: 72 75 63 74 2c 0a 20 20 20 20 2a 2a 20 74 68 65  ruct,.    ** the
a440: 6e 20 74 68 65 72 65 20 73 68 6f 75 6c 64 20 62  n there should b
a450: 65 20 61 20 73 69 6e 67 6c 65 20 69 74 65 6d 20  e a single item 
a460: 6f 6e 20 74 68 65 20 73 74 61 63 6b 2e 20 20 57  on the stack.  W
a470: 72 69 74 65 20 74 68 69 73 0a 20 20 20 20 2a 2a  rite this.    **
a480: 20 69 74 65 6d 20 69 6e 74 6f 20 74 68 65 20 73   item into the s
a490: 65 74 20 74 61 62 6c 65 20 77 69 74 68 20 62 6f  et table with bo
a4a0: 67 75 73 20 64 61 74 61 2e 0a 20 20 20 20 2a 2f  gus data..    */
a4b0: 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 53 65  .    case SRT_Se
a4c0: 74 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 70  t: {.      if( p
a4d0: 53 6f 72 74 20 29 7b 0a 20 20 20 20 20 20 20 20  Sort ){.        
a4e0: 2f 2a 20 41 74 20 66 69 72 73 74 20 67 6c 61 6e  /* At first glan
a4f0: 63 65 20 79 6f 75 20 77 6f 75 6c 64 20 74 68 69  ce you would thi
a500: 6e 6b 20 77 65 20 63 6f 75 6c 64 20 6f 70 74 69  nk we could opti
a510: 6d 69 7a 65 20 6f 75 74 20 74 68 65 0a 20 20 20  mize out the.   
a520: 20 20 20 20 20 2a 2a 20 4f 52 44 45 52 20 42 59       ** ORDER BY
a530: 20 69 6e 20 74 68 69 73 20 63 61 73 65 20 73 69   in this case si
a540: 6e 63 65 20 74 68 65 20 6f 72 64 65 72 20 6f 66  nce the order of
a550: 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20   entries in the 
a560: 73 65 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 64  set.        ** d
a570: 6f 65 73 20 6e 6f 74 20 6d 61 74 74 65 72 2e 20  oes not matter. 
a580: 20 42 75 74 20 74 68 65 72 65 20 6d 69 67 68 74   But there might
a590: 20 62 65 20 61 20 4c 49 4d 49 54 20 63 6c 61 75   be a LIMIT clau
a5a0: 73 65 2c 20 69 6e 20 77 68 69 63 68 0a 20 20 20  se, in which.   
a5b0: 20 20 20 20 20 2a 2a 20 63 61 73 65 20 74 68 65       ** case the
a5c0: 20 6f 72 64 65 72 20 64 6f 65 73 20 6d 61 74 74   order does matt
a5d0: 65 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 75  er */.        pu
a5e0: 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28 0a 20 20  shOntoSorter(.  
a5f0: 20 20 20 20 20 20 20 20 20 20 70 50 61 72 73 65            pParse
a600: 2c 20 70 53 6f 72 74 2c 20 70 2c 20 72 65 67 52  , pSort, p, regR
a610: 65 73 75 6c 74 2c 20 72 65 67 4f 72 69 67 2c 20  esult, regOrig, 
a620: 6e 52 65 73 75 6c 74 43 6f 6c 2c 20 6e 50 72 65  nResultCol, nPre
a630: 66 69 78 52 65 67 29 3b 0a 20 20 20 20 20 20 7d  fixReg);.      }
a640: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 6e  else{.        in
a650: 74 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65  t r1 = sqlite3Ge
a660: 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29  tTempReg(pParse)
a670: 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
a680: 28 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  ( sqlite3Strlen3
a690: 30 28 70 44 65 73 74 2d 3e 7a 41 66 66 53 64 73  0(pDest->zAffSds
a6a0: 74 29 3d 3d 6e 52 65 73 75 6c 74 43 6f 6c 20 29  t)==nResultCol )
a6b0: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
a6c0: 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
a6d0: 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 65  P_MakeRecord, re
a6e0: 67 52 65 73 75 6c 74 2c 20 6e 52 65 73 75 6c 74  gResult, nResult
a6f0: 43 6f 6c 2c 20 0a 20 20 20 20 20 20 20 20 20 20  Col, .          
a700: 20 20 72 31 2c 20 70 44 65 73 74 2d 3e 7a 41 66    r1, pDest->zAf
a710: 66 53 64 73 74 2c 20 6e 52 65 73 75 6c 74 43 6f  fSdst, nResultCo
a720: 6c 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  l);.        sqli
a730: 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74  te3VdbeAddOp4Int
a740: 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74  (v, OP_IdxInsert
a750: 2c 20 69 50 61 72 6d 2c 20 72 31 2c 20 72 65 67  , iParm, r1, reg
a760: 52 65 73 75 6c 74 2c 20 6e 52 65 73 75 6c 74 43  Result, nResultC
a770: 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  ol);.        sql
a780: 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
a790: 65 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a  eg(pParse, r1);.
a7a0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
a7b0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  eak;.    }..    
a7c0: 2f 2a 20 49 66 20 61 6e 79 20 72 6f 77 20 65 78  /* If any row ex
a7d0: 69 73 74 20 69 6e 20 74 68 65 20 72 65 73 75 6c  ist in the resul
a7e0: 74 20 73 65 74 2c 20 72 65 63 6f 72 64 20 74 68  t set, record th
a7f0: 61 74 20 66 61 63 74 20 61 6e 64 20 61 62 6f 72  at fact and abor
a800: 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61  t..    */.    ca
a810: 73 65 20 53 52 54 5f 45 78 69 73 74 73 3a 20 7b  se SRT_Exists: {
a820: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
a830: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
a840: 6e 74 65 67 65 72 2c 20 31 2c 20 69 50 61 72 6d  nteger, 1, iParm
a850: 29 3b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20  );.      /* The 
a860: 4c 49 4d 49 54 20 63 6c 61 75 73 65 20 77 69 6c  LIMIT clause wil
a870: 6c 20 74 65 72 6d 69 6e 61 74 65 20 74 68 65 20  l terminate the 
a880: 6c 6f 6f 70 20 66 6f 72 20 75 73 20 2a 2f 0a 20  loop for us */. 
a890: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
a8a0: 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69  }..    /* If thi
a8b0: 73 20 69 73 20 61 20 73 63 61 6c 61 72 20 73 65  s is a scalar se
a8c0: 6c 65 63 74 20 74 68 61 74 20 69 73 20 70 61 72  lect that is par
a8d0: 74 20 6f 66 20 61 6e 20 65 78 70 72 65 73 73 69  t of an expressi
a8e0: 6f 6e 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20  on, then.    ** 
a8f0: 73 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74  store the result
a900: 73 20 69 6e 20 74 68 65 20 61 70 70 72 6f 70 72  s in the appropr
a910: 69 61 74 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c  iate memory cell
a920: 20 6f 72 20 61 72 72 61 79 20 6f 66 20 0a 20 20   or array of .  
a930: 20 20 2a 2a 20 6d 65 6d 6f 72 79 20 63 65 6c 6c    ** memory cell
a940: 73 20 61 6e 64 20 62 72 65 61 6b 20 6f 75 74 20  s and break out 
a950: 6f 66 20 74 68 65 20 73 63 61 6e 20 6c 6f 6f 70  of the scan loop
a960: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73  ..    */.    cas
a970: 65 20 53 52 54 5f 4d 65 6d 3a 20 7b 0a 20 20 20  e SRT_Mem: {.   
a980: 20 20 20 69 66 28 20 70 53 6f 72 74 20 29 7b 0a     if( pSort ){.
a990: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
a9a0: 6e 52 65 73 75 6c 74 43 6f 6c 3c 3d 70 44 65 73  nResultCol<=pDes
a9b0: 74 2d 3e 6e 53 64 73 74 20 29 3b 0a 20 20 20 20  t->nSdst );.    
a9c0: 20 20 20 20 70 75 73 68 4f 6e 74 6f 53 6f 72 74      pushOntoSort
a9d0: 65 72 28 0a 20 20 20 20 20 20 20 20 20 20 20 20  er(.            
a9e0: 70 50 61 72 73 65 2c 20 70 53 6f 72 74 2c 20 70  pParse, pSort, p
a9f0: 2c 20 72 65 67 52 65 73 75 6c 74 2c 20 72 65 67  , regResult, reg
aa00: 4f 72 69 67 2c 20 6e 52 65 73 75 6c 74 43 6f 6c  Orig, nResultCol
aa10: 2c 20 6e 50 72 65 66 69 78 52 65 67 29 3b 0a 20  , nPrefixReg);. 
aa20: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
aa30: 20 20 20 20 61 73 73 65 72 74 28 20 6e 52 65 73      assert( nRes
aa40: 75 6c 74 43 6f 6c 3d 3d 70 44 65 73 74 2d 3e 6e  ultCol==pDest->n
aa50: 53 64 73 74 20 29 3b 0a 20 20 20 20 20 20 20 20  Sdst );.        
aa60: 61 73 73 65 72 74 28 20 72 65 67 52 65 73 75 6c  assert( regResul
aa70: 74 3d 3d 69 50 61 72 6d 20 29 3b 0a 20 20 20 20  t==iParm );.    
aa80: 20 20 20 20 2f 2a 20 54 68 65 20 4c 49 4d 49 54      /* The LIMIT
aa90: 20 63 6c 61 75 73 65 20 77 69 6c 6c 20 6a 75 6d   clause will jum
aaa0: 70 20 6f 75 74 20 6f 66 20 74 68 65 20 6c 6f 6f  p out of the loo
aab0: 70 20 66 6f 72 20 75 73 20 2a 2f 0a 20 20 20 20  p for us */.    
aac0: 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
aad0: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a  .    }.#endif /*
aae0: 20 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f   #ifndef SQLITE_
aaf0: 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 20 2a 2f  OMIT_SUBQUERY */
ab00: 0a 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 43  ..    case SRT_C
ab10: 6f 72 6f 75 74 69 6e 65 3a 20 20 20 20 20 20 20  oroutine:       
ab20: 2f 2a 20 53 65 6e 64 20 64 61 74 61 20 74 6f 20  /* Send data to 
ab30: 61 20 63 6f 2d 72 6f 75 74 69 6e 65 20 2a 2f 0a  a co-routine */.
ab40: 20 20 20 20 63 61 73 65 20 53 52 54 5f 4f 75 74      case SRT_Out
ab50: 70 75 74 3a 20 7b 20 20 20 20 20 20 20 20 2f 2a  put: {        /*
ab60: 20 52 65 74 75 72 6e 20 74 68 65 20 72 65 73 75   Return the resu
ab70: 6c 74 73 20 2a 2f 0a 20 20 20 20 20 20 74 65 73  lts */.      tes
ab80: 74 63 61 73 65 28 20 65 44 65 73 74 3d 3d 53 52  tcase( eDest==SR
ab90: 54 5f 43 6f 72 6f 75 74 69 6e 65 20 29 3b 0a 20  T_Coroutine );. 
aba0: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 65       testcase( e
abb0: 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74  Dest==SRT_Output
abc0: 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 53   );.      if( pS
abd0: 6f 72 74 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ort ){.        p
abe0: 75 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28 70 50  ushOntoSorter(pP
abf0: 61 72 73 65 2c 20 70 53 6f 72 74 2c 20 70 2c 20  arse, pSort, p, 
ac00: 72 65 67 52 65 73 75 6c 74 2c 20 72 65 67 4f 72  regResult, regOr
ac10: 69 67 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 2c 0a  ig, nResultCol,.
ac20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ac30: 20 20 20 20 20 20 20 6e 50 72 65 66 69 78 52 65         nPrefixRe
ac40: 67 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  g);.      }else 
ac50: 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 43  if( eDest==SRT_C
ac60: 6f 72 6f 75 74 69 6e 65 20 29 7b 0a 20 20 20 20  oroutine ){.    
ac70: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
ac80: 64 64 4f 70 31 28 76 2c 20 4f 50 5f 59 69 65 6c  ddOp1(v, OP_Yiel
ac90: 64 2c 20 70 44 65 73 74 2d 3e 69 53 44 50 61 72  d, pDest->iSDPar
aca0: 6d 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  m);.      }else{
acb0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
acc0: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
acd0: 5f 52 65 73 75 6c 74 52 6f 77 2c 20 72 65 67 52  _ResultRow, regR
ace0: 65 73 75 6c 74 2c 20 6e 52 65 73 75 6c 74 43 6f  esult, nResultCo
acf0: 6c 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  l);.      }.    
ad00: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
ad10: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
ad20: 4d 49 54 5f 43 54 45 0a 20 20 20 20 2f 2a 20 57  MIT_CTE.    /* W
ad30: 72 69 74 65 20 74 68 65 20 72 65 73 75 6c 74 73  rite the results
ad40: 20 69 6e 74 6f 20 61 20 70 72 69 6f 72 69 74 79   into a priority
ad50: 20 71 75 65 75 65 20 74 68 61 74 20 69 73 20 6f   queue that is o
ad60: 72 64 65 72 20 61 63 63 6f 72 64 69 6e 67 20 74  rder according t
ad70: 6f 0a 20 20 20 20 2a 2a 20 70 44 65 73 74 2d 3e  o.    ** pDest->
ad80: 70 4f 72 64 65 72 42 79 20 28 69 6e 20 70 53 4f  pOrderBy (in pSO
ad90: 29 2e 20 20 70 44 65 73 74 2d 3e 69 53 44 50 61  ).  pDest->iSDPa
ada0: 72 6d 20 28 69 6e 20 69 50 61 72 6d 29 20 69 73  rm (in iParm) is
adb0: 20 74 68 65 20 63 75 72 73 6f 72 20 66 6f 72 20   the cursor for 
adc0: 61 6e 0a 20 20 20 20 2a 2a 20 69 6e 64 65 78 20  an.    ** index 
add0: 77 69 74 68 20 70 53 4f 2d 3e 6e 45 78 70 72 2b  with pSO->nExpr+
ade0: 32 20 63 6f 6c 75 6d 6e 73 2e 20 20 42 75 69 6c  2 columns.  Buil
adf0: 64 20 61 20 6b 65 79 20 75 73 69 6e 67 20 70 53  d a key using pS
ae00: 4f 20 66 6f 72 20 74 68 65 20 66 69 72 73 74 0a  O for the first.
ae10: 20 20 20 20 2a 2a 20 70 53 4f 2d 3e 6e 45 78 70      ** pSO->nExp
ae20: 72 20 63 6f 6c 75 6d 6e 73 2c 20 74 68 65 6e 20  r columns, then 
ae30: 6d 61 6b 65 20 73 75 72 65 20 61 6c 6c 20 6b 65  make sure all ke
ae40: 79 73 20 61 72 65 20 75 6e 69 71 75 65 20 62 79  ys are unique by
ae50: 20 61 64 64 69 6e 67 20 61 0a 20 20 20 20 2a 2a   adding a.    **
ae60: 20 66 69 6e 61 6c 20 4f 50 5f 53 65 71 75 65 6e   final OP_Sequen
ae70: 63 65 20 63 6f 6c 75 6d 6e 2e 20 20 54 68 65 20  ce column.  The 
ae80: 6c 61 73 74 20 63 6f 6c 75 6d 6e 20 69 73 20 74  last column is t
ae90: 68 65 20 72 65 63 6f 72 64 20 61 73 20 61 20 62  he record as a b
aea0: 6c 6f 62 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  lob..    */.    
aeb0: 63 61 73 65 20 53 52 54 5f 44 69 73 74 51 75 65  case SRT_DistQue
aec0: 75 65 3a 0a 20 20 20 20 63 61 73 65 20 53 52 54  ue:.    case SRT
aed0: 5f 51 75 65 75 65 3a 20 7b 0a 20 20 20 20 20 20  _Queue: {.      
aee0: 69 6e 74 20 6e 4b 65 79 3b 0a 20 20 20 20 20 20  int nKey;.      
aef0: 69 6e 74 20 72 31 2c 20 72 32 2c 20 72 33 3b 0a  int r1, r2, r3;.
af00: 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 54 65        int addrTe
af10: 73 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 45 78  st = 0;.      Ex
af20: 70 72 4c 69 73 74 20 2a 70 53 4f 3b 0a 20 20 20  prList *pSO;.   
af30: 20 20 20 70 53 4f 20 3d 20 70 44 65 73 74 2d 3e     pSO = pDest->
af40: 70 4f 72 64 65 72 42 79 3b 0a 20 20 20 20 20 20  pOrderBy;.      
af50: 61 73 73 65 72 74 28 20 70 53 4f 20 29 3b 0a 20  assert( pSO );. 
af60: 20 20 20 20 20 6e 4b 65 79 20 3d 20 70 53 4f 2d       nKey = pSO-
af70: 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 72 31  >nExpr;.      r1
af80: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
af90: 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20  pReg(pParse);.  
afa0: 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33      r2 = sqlite3
afb0: 47 65 74 54 65 6d 70 52 61 6e 67 65 28 70 50 61  GetTempRange(pPa
afc0: 72 73 65 2c 20 6e 4b 65 79 2b 32 29 3b 0a 20 20  rse, nKey+2);.  
afd0: 20 20 20 20 72 33 20 3d 20 72 32 2b 6e 4b 65 79      r3 = r2+nKey
afe0: 2b 31 3b 0a 20 20 20 20 20 20 69 66 28 20 65 44  +1;.      if( eD
aff0: 65 73 74 3d 3d 53 52 54 5f 44 69 73 74 51 75 65  est==SRT_DistQue
b000: 75 65 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  ue ){.        /*
b010: 20 49 66 20 74 68 65 20 64 65 73 74 69 6e 61 74   If the destinat
b020: 69 6f 6e 20 69 73 20 44 69 73 74 51 75 65 75 65  ion is DistQueue
b030: 2c 20 74 68 65 6e 20 63 75 72 73 6f 72 20 28 69  , then cursor (i
b040: 50 61 72 6d 2b 31 29 20 69 73 20 6f 70 65 6e 0a  Parm+1) is open.
b050: 20 20 20 20 20 20 20 20 2a 2a 20 6f 6e 20 61 20          ** on a 
b060: 73 65 63 6f 6e 64 20 65 70 68 65 6d 65 72 61 6c  second ephemeral
b070: 20 69 6e 64 65 78 20 74 68 61 74 20 68 6f 6c 64   index that hold
b080: 73 20 61 6c 6c 20 76 61 6c 75 65 73 20 65 76 65  s all values eve
b090: 72 79 20 70 72 65 76 69 6f 75 73 6c 79 0a 20 20  ry previously.  
b0a0: 20 20 20 20 20 20 2a 2a 20 61 64 64 65 64 20 74        ** added t
b0b0: 6f 20 74 68 65 20 71 75 65 75 65 2e 20 2a 2f 0a  o the queue. */.
b0c0: 20 20 20 20 20 20 20 20 61 64 64 72 54 65 73 74          addrTest
b0d0: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
b0e0: 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 46 6f  dOp4Int(v, OP_Fo
b0f0: 75 6e 64 2c 20 69 50 61 72 6d 2b 31 2c 20 30 2c  und, iParm+1, 0,
b100: 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
b110: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b120: 20 20 20 20 20 20 20 20 20 20 72 65 67 52 65 73            regRes
b130: 75 6c 74 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 29  ult, nResultCol)
b140: 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65 43 6f  ;.        VdbeCo
b150: 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20  verage(v);.     
b160: 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
b170: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
b180: 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 65 67  _MakeRecord, reg
b190: 52 65 73 75 6c 74 2c 20 6e 52 65 73 75 6c 74 43  Result, nResultC
b1a0: 6f 6c 2c 20 72 33 29 3b 0a 20 20 20 20 20 20 69  ol, r3);.      i
b1b0: 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 44 69  f( eDest==SRT_Di
b1c0: 73 74 51 75 65 75 65 20 29 7b 0a 20 20 20 20 20  stQueue ){.     
b1d0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
b1e0: 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78 49 6e  dOp2(v, OP_IdxIn
b1f0: 73 65 72 74 2c 20 69 50 61 72 6d 2b 31 2c 20 72  sert, iParm+1, r
b200: 33 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  3);.        sqli
b210: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28  te3VdbeChangeP5(
b220: 76 2c 20 4f 50 46 4c 41 47 5f 55 53 45 53 45 45  v, OPFLAG_USESEE
b230: 4b 52 45 53 55 4c 54 29 3b 0a 20 20 20 20 20 20  KRESULT);.      
b240: 7d 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  }.      for(i=0;
b250: 20 69 3c 6e 4b 65 79 3b 20 69 2b 2b 29 7b 0a 20   i<nKey; i++){. 
b260: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
b270: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53  beAddOp2(v, OP_S
b280: 43 6f 70 79 2c 0a 20 20 20 20 20 20 20 20 20 20  Copy,.          
b290: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b2a0: 72 65 67 52 65 73 75 6c 74 20 2b 20 70 53 4f 2d  regResult + pSO-
b2b0: 3e 61 5b 69 5d 2e 75 2e 78 2e 69 4f 72 64 65 72  >a[i].u.x.iOrder
b2c0: 42 79 43 6f 6c 20 2d 20 31 2c 0a 20 20 20 20 20  ByCol - 1,.     
b2d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b2e0: 20 20 20 20 20 72 32 2b 69 29 3b 0a 20 20 20 20       r2+i);.    
b2f0: 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
b300: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
b310: 50 5f 53 65 71 75 65 6e 63 65 2c 20 69 50 61 72  P_Sequence, iPar
b320: 6d 2c 20 72 32 2b 6e 4b 65 79 29 3b 0a 20 20 20  m, r2+nKey);.   
b330: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
b340: 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52  dOp3(v, OP_MakeR
b350: 65 63 6f 72 64 2c 20 72 32 2c 20 6e 4b 65 79 2b  ecord, r2, nKey+
b360: 32 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 73 71  2, r1);.      sq
b370: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 49  lite3VdbeAddOp4I
b380: 6e 74 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65  nt(v, OP_IdxInse
b390: 72 74 2c 20 69 50 61 72 6d 2c 20 72 31 2c 20 72  rt, iParm, r1, r
b3a0: 32 2c 20 6e 4b 65 79 2b 32 29 3b 0a 20 20 20 20  2, nKey+2);.    
b3b0: 20 20 69 66 28 20 61 64 64 72 54 65 73 74 20 29    if( addrTest )
b3c0: 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
b3d0: 48 65 72 65 28 76 2c 20 61 64 64 72 54 65 73 74  Here(v, addrTest
b3e0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
b3f0: 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
b400: 50 61 72 73 65 2c 20 72 31 29 3b 0a 20 20 20 20  Parse, r1);.    
b410: 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
b420: 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65  TempRange(pParse
b430: 2c 20 72 32 2c 20 6e 4b 65 79 2b 32 29 3b 0a 20  , r2, nKey+2);. 
b440: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
b450: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
b460: 54 45 5f 4f 4d 49 54 5f 43 54 45 20 2a 2f 0a 0a  TE_OMIT_CTE */..
b470: 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  ..#if !defined(S
b480: 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47  QLITE_OMIT_TRIGG
b490: 45 52 29 0a 20 20 20 20 2f 2a 20 44 69 73 63 61  ER).    /* Disca
b4a0: 72 64 20 74 68 65 20 72 65 73 75 6c 74 73 2e 20  rd the results. 
b4b0: 20 54 68 69 73 20 69 73 20 75 73 65 64 20 66 6f   This is used fo
b4c0: 72 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  r SELECT stateme
b4d0: 6e 74 73 20 69 6e 73 69 64 65 0a 20 20 20 20 2a  nts inside.    *
b4e0: 2a 20 74 68 65 20 62 6f 64 79 20 6f 66 20 61 20  * the body of a 
b4f0: 54 52 49 47 47 45 52 2e 20 20 54 68 65 20 70 75  TRIGGER.  The pu
b500: 72 70 6f 73 65 20 6f 66 20 73 75 63 68 20 73 65  rpose of such se
b510: 6c 65 63 74 73 20 69 73 20 74 6f 20 63 61 6c 6c  lects is to call
b520: 0a 20 20 20 20 2a 2a 20 75 73 65 72 2d 64 65 66  .    ** user-def
b530: 69 6e 65 64 20 66 75 6e 63 74 69 6f 6e 73 20 74  ined functions t
b540: 68 61 74 20 68 61 76 65 20 73 69 64 65 20 65 66  hat have side ef
b550: 66 65 63 74 73 2e 20 20 57 65 20 64 6f 20 6e 6f  fects.  We do no
b560: 74 20 63 61 72 65 0a 20 20 20 20 2a 2a 20 61 62  t care.    ** ab
b570: 6f 75 74 20 74 68 65 20 61 63 74 75 61 6c 20 72  out the actual r
b580: 65 73 75 6c 74 73 20 6f 66 20 74 68 65 20 73 65  esults of the se
b590: 6c 65 63 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  lect..    */.   
b5a0: 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20   default: {.    
b5b0: 20 20 61 73 73 65 72 74 28 20 65 44 65 73 74 3d    assert( eDest=
b5c0: 3d 53 52 54 5f 44 69 73 63 61 72 64 20 29 3b 0a  =SRT_Discard );.
b5d0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
b5e0: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 20   }.#endif.  }.. 
b5f0: 20 2f 2a 20 4a 75 6d 70 20 74 6f 20 74 68 65 20   /* Jump to the 
b600: 65 6e 64 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20  end of the loop 
b610: 69 66 20 74 68 65 20 4c 49 4d 49 54 20 69 73 20  if the LIMIT is 
b620: 72 65 61 63 68 65 64 2e 20 20 45 78 63 65 70 74  reached.  Except
b630: 2c 20 69 66 0a 20 20 2a 2a 20 74 68 65 72 65 20  , if.  ** there 
b640: 69 73 20 61 20 73 6f 72 74 65 72 2c 20 69 6e 20  is a sorter, in 
b650: 77 68 69 63 68 20 63 61 73 65 20 74 68 65 20 73  which case the s
b660: 6f 72 74 65 72 20 68 61 73 20 61 6c 72 65 61 64  orter has alread
b670: 79 20 6c 69 6d 69 74 65 64 0a 20 20 2a 2a 20 74  y limited.  ** t
b680: 68 65 20 6f 75 74 70 75 74 20 66 6f 72 20 75 73  he output for us
b690: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 53 6f  ..  */.  if( pSo
b6a0: 72 74 3d 3d 30 20 26 26 20 70 2d 3e 69 4c 69 6d  rt==0 && p->iLim
b6b0: 69 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  it ){.    sqlite
b6c0: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
b6d0: 50 5f 44 65 63 72 4a 75 6d 70 5a 65 72 6f 2c 20  P_DecrJumpZero, 
b6e0: 70 2d 3e 69 4c 69 6d 69 74 2c 20 69 42 72 65 61  p->iLimit, iBrea
b6f0: 6b 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  k); VdbeCoverage
b700: 28 76 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  (v);.  }.}../*.*
b710: 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 4b 65 79  * Allocate a Key
b720: 49 6e 66 6f 20 6f 62 6a 65 63 74 20 73 75 66 66  Info object suff
b730: 69 63 69 65 6e 74 20 66 6f 72 20 61 6e 20 69 6e  icient for an in
b740: 64 65 78 20 6f 66 20 4e 20 6b 65 79 20 63 6f 6c  dex of N key col
b750: 75 6d 6e 73 20 61 6e 64 0a 2a 2a 20 58 20 65 78  umns and.** X ex
b760: 74 72 61 20 63 6f 6c 75 6d 6e 73 2e 0a 2a 2f 0a  tra columns..*/.
b770: 4b 65 79 49 6e 66 6f 20 2a 73 71 6c 69 74 65 33  KeyInfo *sqlite3
b780: 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63 28 73 71 6c  KeyInfoAlloc(sql
b790: 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 4e 2c  ite3 *db, int N,
b7a0: 20 69 6e 74 20 58 29 7b 0a 20 20 69 6e 74 20 6e   int X){.  int n
b7b0: 45 78 74 72 61 20 3d 20 28 4e 2b 58 29 2a 28 73  Extra = (N+X)*(s
b7c0: 69 7a 65 6f 66 28 43 6f 6c 6c 53 65 71 2a 29 2b  izeof(CollSeq*)+
b7d0: 31 29 20 2d 20 73 69 7a 65 6f 66 28 43 6f 6c 6c  1) - sizeof(Coll
b7e0: 53 65 71 2a 29 3b 0a 20 20 4b 65 79 49 6e 66 6f  Seq*);.  KeyInfo
b7f0: 20 2a 70 20 3d 20 73 71 6c 69 74 65 33 44 62 4d   *p = sqlite3DbM
b800: 61 6c 6c 6f 63 52 61 77 4e 4e 28 64 62 2c 20 73  allocRawNN(db, s
b810: 69 7a 65 6f 66 28 4b 65 79 49 6e 66 6f 29 20 2b  izeof(KeyInfo) +
b820: 20 6e 45 78 74 72 61 29 3b 0a 20 20 69 66 28 20   nExtra);.  if( 
b830: 70 20 29 7b 0a 20 20 20 20 70 2d 3e 61 53 6f 72  p ){.    p->aSor
b840: 74 4f 72 64 65 72 20 3d 20 28 75 38 2a 29 26 70  tOrder = (u8*)&p
b850: 2d 3e 61 43 6f 6c 6c 5b 4e 2b 58 5d 3b 0a 20 20  ->aColl[N+X];.  
b860: 20 20 70 2d 3e 6e 4b 65 79 46 69 65 6c 64 20 3d    p->nKeyField =
b870: 20 28 75 31 36 29 4e 3b 0a 20 20 20 20 70 2d 3e   (u16)N;.    p->
b880: 6e 41 6c 6c 46 69 65 6c 64 20 3d 20 28 75 31 36  nAllField = (u16
b890: 29 28 4e 2b 58 29 3b 0a 20 20 20 20 70 2d 3e 65  )(N+X);.    p->e
b8a0: 6e 63 20 3d 20 45 4e 43 28 64 62 29 3b 0a 20 20  nc = ENC(db);.  
b8b0: 20 20 70 2d 3e 64 62 20 3d 20 64 62 3b 0a 20 20    p->db = db;.  
b8c0: 20 20 70 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20    p->nRef = 1;. 
b8d0: 20 20 20 6d 65 6d 73 65 74 28 26 70 5b 31 5d 2c     memset(&p[1],
b8e0: 20 30 2c 20 6e 45 78 74 72 61 29 3b 0a 20 20 7d   0, nExtra);.  }
b8f0: 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65  else{.    sqlite
b900: 33 4f 6f 6d 46 61 75 6c 74 28 64 62 29 3b 0a 20  3OomFault(db);. 
b910: 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d   }.  return p;.}
b920: 0a 0a 2f 2a 0a 2a 2a 20 44 65 61 6c 6c 6f 63 61  ../*.** Dealloca
b930: 74 65 20 61 20 4b 65 79 49 6e 66 6f 20 6f 62 6a  te a KeyInfo obj
b940: 65 63 74 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ect.*/.void sqli
b950: 74 65 33 4b 65 79 49 6e 66 6f 55 6e 72 65 66 28  te3KeyInfoUnref(
b960: 4b 65 79 49 6e 66 6f 20 2a 70 29 7b 0a 20 20 69  KeyInfo *p){.  i
b970: 66 28 20 70 20 29 7b 0a 20 20 20 20 61 73 73 65  f( p ){.    asse
b980: 72 74 28 20 70 2d 3e 6e 52 65 66 3e 30 20 29 3b  rt( p->nRef>0 );
b990: 0a 20 20 20 20 70 2d 3e 6e 52 65 66 2d 2d 3b 0a  .    p->nRef--;.
b9a0: 20 20 20 20 69 66 28 20 70 2d 3e 6e 52 65 66 3d      if( p->nRef=
b9b0: 3d 30 20 29 20 73 71 6c 69 74 65 33 44 62 46 72  =0 ) sqlite3DbFr
b9c0: 65 65 4e 4e 28 70 2d 3e 64 62 2c 20 70 29 3b 0a  eeNN(p->db, p);.
b9d0: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b    }.}../*.** Mak
b9e0: 65 20 61 20 6e 65 77 20 70 6f 69 6e 74 65 72 20  e a new pointer 
b9f0: 74 6f 20 61 20 4b 65 79 49 6e 66 6f 20 6f 62 6a  to a KeyInfo obj
ba00: 65 63 74 0a 2a 2f 0a 4b 65 79 49 6e 66 6f 20 2a  ect.*/.KeyInfo *
ba10: 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 52 65  sqlite3KeyInfoRe
ba20: 66 28 4b 65 79 49 6e 66 6f 20 2a 70 29 7b 0a 20  f(KeyInfo *p){. 
ba30: 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 61 73   if( p ){.    as
ba40: 73 65 72 74 28 20 70 2d 3e 6e 52 65 66 3e 30 20  sert( p->nRef>0 
ba50: 29 3b 0a 20 20 20 20 70 2d 3e 6e 52 65 66 2b 2b  );.    p->nRef++
ba60: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  ;.  }.  return p
ba70: 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  ;.}..#ifdef SQLI
ba80: 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 52  TE_DEBUG./*.** R
ba90: 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 61 20  eturn TRUE if a 
baa0: 4b 65 79 49 6e 66 6f 20 6f 62 6a 65 63 74 20 63  KeyInfo object c
bab0: 61 6e 20 62 65 20 63 68 61 6e 67 65 2e 20 20 54  an be change.  T
bac0: 68 65 20 4b 65 79 49 6e 66 6f 20 6f 62 6a 65 63  he KeyInfo objec
bad0: 74 0a 2a 2a 20 63 61 6e 20 6f 6e 6c 79 20 62 65  t.** can only be
bae0: 20 63 68 61 6e 67 65 64 20 69 66 20 74 68 69 73   changed if this
baf0: 20 69 73 20 6a 75 73 74 20 61 20 73 69 6e 67 6c   is just a singl
bb00: 65 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74  e reference to t
bb10: 68 65 20 6f 62 6a 65 63 74 2e 0a 2a 2a 0a 2a 2a  he object..**.**
bb20: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
bb30: 20 75 73 65 64 20 6f 6e 6c 79 20 69 6e 73 69 64   used only insid
bb40: 65 20 6f 66 20 61 73 73 65 72 74 28 29 20 73 74  e of assert() st
bb50: 61 74 65 6d 65 6e 74 73 2e 0a 2a 2f 0a 69 6e 74  atements..*/.int
bb60: 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 49   sqlite3KeyInfoI
bb70: 73 57 72 69 74 65 61 62 6c 65 28 4b 65 79 49 6e  sWriteable(KeyIn
bb80: 66 6f 20 2a 70 29 7b 20 72 65 74 75 72 6e 20 70  fo *p){ return p
bb90: 2d 3e 6e 52 65 66 3d 3d 31 3b 20 7d 0a 23 65 6e  ->nRef==1; }.#en
bba0: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 44 45  dif /* SQLITE_DE
bbb0: 42 55 47 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 47 69  BUG */../*.** Gi
bbc0: 76 65 6e 20 61 6e 20 65 78 70 72 65 73 73 69 6f  ven an expressio
bbd0: 6e 20 6c 69 73 74 2c 20 67 65 6e 65 72 61 74 65  n list, generate
bbe0: 20 61 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63   a KeyInfo struc
bbf0: 74 75 72 65 20 74 68 61 74 20 72 65 63 6f 72 64  ture that record
bc00: 73 0a 2a 2a 20 74 68 65 20 63 6f 6c 6c 61 74 69  s.** the collati
bc10: 6e 67 20 73 65 71 75 65 6e 63 65 20 66 6f 72 20  ng sequence for 
bc20: 65 61 63 68 20 65 78 70 72 65 73 73 69 6f 6e 20  each expression 
bc30: 69 6e 20 74 68 61 74 20 65 78 70 72 65 73 73 69  in that expressi
bc40: 6f 6e 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 49  on list..**.** I
bc50: 66 20 74 68 65 20 45 78 70 72 4c 69 73 74 20 69  f the ExprList i
bc60: 73 20 61 6e 20 4f 52 44 45 52 20 42 59 20 6f 72  s an ORDER BY or
bc70: 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65   GROUP BY clause
bc80: 20 74 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74   then the result
bc90: 69 6e 67 0a 2a 2a 20 4b 65 79 49 6e 66 6f 20 73  ing.** KeyInfo s
bca0: 74 72 75 63 74 75 72 65 20 69 73 20 61 70 70 72  tructure is appr
bcb0: 6f 70 72 69 61 74 65 20 66 6f 72 20 69 6e 69 74  opriate for init
bcc0: 69 61 6c 69 7a 69 6e 67 20 61 20 76 69 72 74 75  ializing a virtu
bcd0: 61 6c 20 69 6e 64 65 78 20 74 6f 0a 2a 2a 20 69  al index to.** i
bce0: 6d 70 6c 65 6d 65 6e 74 20 74 68 61 74 20 63 6c  mplement that cl
bcf0: 61 75 73 65 2e 20 20 49 66 20 74 68 65 20 45 78  ause.  If the Ex
bd00: 70 72 4c 69 73 74 20 69 73 20 74 68 65 20 72 65  prList is the re
bd10: 73 75 6c 74 20 73 65 74 20 6f 66 20 61 20 53 45  sult set of a SE
bd20: 4c 45 43 54 0a 2a 2a 20 74 68 65 6e 20 74 68 65  LECT.** then the
bd30: 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75   KeyInfo structu
bd40: 72 65 20 69 73 20 61 70 70 72 6f 70 72 69 61 74  re is appropriat
bd50: 65 20 66 6f 72 20 69 6e 69 74 69 61 6c 69 7a 69  e for initializi
bd60: 6e 67 20 61 20 76 69 72 74 75 61 6c 0a 2a 2a 20  ng a virtual.** 
bd70: 69 6e 64 65 78 20 74 6f 20 69 6d 70 6c 65 6d 65  index to impleme
bd80: 6e 74 20 61 20 44 49 53 54 49 4e 43 54 20 74 65  nt a DISTINCT te
bd90: 73 74 2e 0a 2a 2a 0a 2a 2a 20 53 70 61 63 65 20  st..**.** Space 
bda0: 74 6f 20 68 6f 6c 64 20 74 68 65 20 4b 65 79 49  to hold the KeyI
bdb0: 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 69 73  nfo structure is
bdc0: 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 6d   obtained from m
bdd0: 61 6c 6c 6f 63 2e 20 20 54 68 65 20 63 61 6c 6c  alloc.  The call
bde0: 69 6e 67 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20  ing.** function 
bdf0: 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66  is responsible f
be00: 6f 72 20 73 65 65 69 6e 67 20 74 68 61 74 20 74  or seeing that t
be10: 68 69 73 20 73 74 72 75 63 74 75 72 65 20 69 73  his structure is
be20: 20 65 76 65 6e 74 75 61 6c 6c 79 0a 2a 2a 20 66   eventually.** f
be30: 72 65 65 64 2e 0a 2a 2f 0a 4b 65 79 49 6e 66 6f  reed..*/.KeyInfo
be40: 20 2a 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f   *sqlite3KeyInfo
be50: 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 0a 20 20  FromExprList(.  
be60: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
be70: 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
be80: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70  context */.  Exp
be90: 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20  rList *pList,   
bea0: 20 20 2f 2a 20 46 6f 72 6d 20 74 68 65 20 4b 65    /* Form the Ke
beb0: 79 49 6e 66 6f 20 6f 62 6a 65 63 74 20 66 72 6f  yInfo object fro
bec0: 6d 20 74 68 69 73 20 45 78 70 72 4c 69 73 74 20  m this ExprList 
bed0: 2a 2f 0a 20 20 69 6e 74 20 69 53 74 61 72 74 2c  */.  int iStart,
bee0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 65 67            /* Beg
bef0: 69 6e 20 77 69 74 68 20 74 68 69 73 20 63 6f 6c  in with this col
bf00: 75 6d 6e 20 6f 66 20 70 4c 69 73 74 20 2a 2f 0a  umn of pList */.
bf10: 20 20 69 6e 74 20 6e 45 78 74 72 61 20 20 20 20    int nExtra    
bf20: 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20 74 68         /* Add th
bf30: 69 73 20 6d 61 6e 79 20 65 78 74 72 61 20 63 6f  is many extra co
bf40: 6c 75 6d 6e 73 20 74 6f 20 74 68 65 20 65 6e 64  lumns to the end
bf50: 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 45 78   */.){.  int nEx
bf60: 70 72 3b 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70  pr;.  KeyInfo *p
bf70: 49 6e 66 6f 3b 0a 20 20 73 74 72 75 63 74 20 45  Info;.  struct E
bf80: 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  xprList_item *pI
bf90: 74 65 6d 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a  tem;.  sqlite3 *
bfa0: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
bfb0: 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 6e 45 78  .  int i;..  nEx
bfc0: 70 72 20 3d 20 70 4c 69 73 74 2d 3e 6e 45 78 70  pr = pList->nExp
bfd0: 72 3b 0a 20 20 70 49 6e 66 6f 20 3d 20 73 71 6c  r;.  pInfo = sql
bfe0: 69 74 65 33 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63  ite3KeyInfoAlloc
bff0: 28 64 62 2c 20 6e 45 78 70 72 2d 69 53 74 61 72  (db, nExpr-iStar
c000: 74 2c 20 6e 45 78 74 72 61 2b 31 29 3b 0a 20 20  t, nExtra+1);.  
c010: 69 66 28 20 70 49 6e 66 6f 20 29 7b 0a 20 20 20  if( pInfo ){.   
c020: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
c030: 4b 65 79 49 6e 66 6f 49 73 57 72 69 74 65 61 62  KeyInfoIsWriteab
c040: 6c 65 28 70 49 6e 66 6f 29 20 29 3b 0a 20 20 20  le(pInfo) );.   
c050: 20 66 6f 72 28 69 3d 69 53 74 61 72 74 2c 20 70   for(i=iStart, p
c060: 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 2b 69 53  Item=pList->a+iS
c070: 74 61 72 74 3b 20 69 3c 6e 45 78 70 72 3b 20 69  tart; i<nExpr; i
c080: 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20  ++, pItem++){.  
c090: 20 20 20 20 70 49 6e 66 6f 2d 3e 61 43 6f 6c 6c      pInfo->aColl
c0a0: 5b 69 2d 69 53 74 61 72 74 5d 20 3d 20 73 71 6c  [i-iStart] = sql
c0b0: 69 74 65 33 45 78 70 72 4e 4e 43 6f 6c 6c 53 65  ite3ExprNNCollSe
c0c0: 71 28 70 50 61 72 73 65 2c 20 70 49 74 65 6d 2d  q(pParse, pItem-
c0d0: 3e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 70  >pExpr);.      p
c0e0: 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72  Info->aSortOrder
c0f0: 5b 69 2d 69 53 74 61 72 74 5d 20 3d 20 70 49 74  [i-iStart] = pIt
c100: 65 6d 2d 3e 73 6f 72 74 4f 72 64 65 72 3b 0a 20  em->sortOrder;. 
c110: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
c120: 6e 20 70 49 6e 66 6f 3b 0a 7d 0a 0a 2f 2a 0a 2a  n pInfo;.}../*.*
c130: 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 63 6f  * Name of the co
c140: 6e 6e 65 63 74 69 6f 6e 20 6f 70 65 72 61 74 6f  nnection operato
c150: 72 2c 20 75 73 65 64 20 66 6f 72 20 65 72 72 6f  r, used for erro
c160: 72 20 6d 65 73 73 61 67 65 73 2e 0a 2a 2f 0a 73  r messages..*/.s
c170: 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72  tatic const char
c180: 20 2a 73 65 6c 65 63 74 4f 70 4e 61 6d 65 28 69   *selectOpName(i
c190: 6e 74 20 69 64 29 7b 0a 20 20 63 68 61 72 20 2a  nt id){.  char *
c1a0: 7a 3b 0a 20 20 73 77 69 74 63 68 28 20 69 64 20  z;.  switch( id 
c1b0: 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41  ){.    case TK_A
c1c0: 4c 4c 3a 20 20 20 20 20 20 20 7a 20 3d 20 22 55  LL:       z = "U
c1d0: 4e 49 4f 4e 20 41 4c 4c 22 3b 20 20 20 62 72 65  NION ALL";   bre
c1e0: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ak;.    case TK_
c1f0: 49 4e 54 45 52 53 45 43 54 3a 20 7a 20 3d 20 22  INTERSECT: z = "
c200: 49 4e 54 45 52 53 45 43 54 22 3b 20 20 20 62 72  INTERSECT";   br
c210: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b  eak;.    case TK
c220: 5f 45 58 43 45 50 54 3a 20 20 20 20 7a 20 3d 20  _EXCEPT:    z = 
c230: 22 45 58 43 45 50 54 22 3b 20 20 20 20 20 20 62  "EXCEPT";      b
c240: 72 65 61 6b 3b 0a 20 20 20 20 64 65 66 61 75 6c  reak;.    defaul
c250: 74 3a 20 20 20 20 20 20 20 20 20 20 20 7a 20 3d  t:           z =
c260: 20 22 55 4e 49 4f 4e 22 3b 20 20 20 20 20 20 20   "UNION";       
c270: 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 65 74  break;.  }.  ret
c280: 75 72 6e 20 7a 3b 0a 7d 0a 0a 23 69 66 6e 64 65  urn z;.}..#ifnde
c290: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58  f SQLITE_OMIT_EX
c2a0: 50 4c 41 49 4e 0a 2f 2a 0a 2a 2a 20 55 6e 6c 65  PLAIN./*.** Unle
c2b0: 73 73 20 61 6e 20 22 45 58 50 4c 41 49 4e 20 51  ss an "EXPLAIN Q
c2c0: 55 45 52 59 20 50 4c 41 4e 22 20 63 6f 6d 6d 61  UERY PLAN" comma
c2d0: 6e 64 20 69 73 20 62 65 69 6e 67 20 70 72 6f 63  nd is being proc
c2e0: 65 73 73 65 64 2c 20 74 68 69 73 20 66 75 6e 63  essed, this func
c2f0: 74 69 6f 6e 0a 2a 2a 20 69 73 20 61 20 6e 6f 2d  tion.** is a no-
c300: 6f 70 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69  op. Otherwise, i
c310: 74 20 61 64 64 73 20 61 20 73 69 6e 67 6c 65 20  t adds a single 
c320: 72 6f 77 20 6f 66 20 6f 75 74 70 75 74 20 74 6f  row of output to
c330: 20 74 68 65 20 45 51 50 20 72 65 73 75 6c 74 2c   the EQP result,
c340: 0a 2a 2a 20 77 68 65 72 65 20 74 68 65 20 63 61  .** where the ca
c350: 70 74 69 6f 6e 20 69 73 20 6f 66 20 74 68 65 20  ption is of the 
c360: 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 22 55  form:.**.**   "U
c370: 53 45 20 54 45 4d 50 20 42 2d 54 52 45 45 20 46  SE TEMP B-TREE F
c380: 4f 52 20 78 78 78 22 0a 2a 2a 0a 2a 2a 20 77 68  OR xxx".**.** wh
c390: 65 72 65 20 78 78 78 20 69 73 20 6f 6e 65 20 6f  ere xxx is one o
c3a0: 66 20 22 44 49 53 54 49 4e 43 54 22 2c 20 22 4f  f "DISTINCT", "O
c3b0: 52 44 45 52 20 42 59 22 20 6f 72 20 22 47 52 4f  RDER BY" or "GRO
c3c0: 55 50 20 42 59 22 2e 20 45 78 61 63 74 6c 79 20  UP BY". Exactly 
c3d0: 77 68 69 63 68 0a 2a 2a 20 69 73 20 64 65 74 65  which.** is dete
c3e0: 72 6d 69 6e 65 64 20 62 79 20 74 68 65 20 7a 55  rmined by the zU
c3f0: 73 61 67 65 20 61 72 67 75 6d 65 6e 74 2e 0a 2a  sage argument..*
c400: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65 78  /.static void ex
c410: 70 6c 61 69 6e 54 65 6d 70 54 61 62 6c 65 28 50  plainTempTable(P
c420: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 63 6f  arse *pParse, co
c430: 6e 73 74 20 63 68 61 72 20 2a 7a 55 73 61 67 65  nst char *zUsage
c440: 29 7b 0a 20 20 45 78 70 6c 61 69 6e 51 75 65 72  ){.  ExplainQuer
c450: 79 50 6c 61 6e 28 28 70 50 61 72 73 65 2c 20 30  yPlan((pParse, 0
c460: 2c 20 22 55 53 45 20 54 45 4d 50 20 42 2d 54 52  , "USE TEMP B-TR
c470: 45 45 20 46 4f 52 20 25 73 22 2c 20 7a 55 73 61  EE FOR %s", zUsa
c480: 67 65 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  ge));.}../*.** A
c490: 73 73 69 67 6e 20 65 78 70 72 65 73 73 69 6f 6e  ssign expression
c4a0: 20 62 20 74 6f 20 6c 76 61 6c 75 65 20 61 2e 20   b to lvalue a. 
c4b0: 41 20 73 65 63 6f 6e 64 2c 20 6e 6f 2d 6f 70 2c  A second, no-op,
c4c0: 20 76 65 72 73 69 6f 6e 20 6f 66 20 74 68 69 73   version of this
c4d0: 20 6d 61 63 72 6f 0a 2a 2a 20 69 73 20 70 72 6f   macro.** is pro
c4e0: 76 69 64 65 64 20 77 68 65 6e 20 53 51 4c 49 54  vided when SQLIT
c4f0: 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 20 69  E_OMIT_EXPLAIN i
c500: 73 20 64 65 66 69 6e 65 64 2e 20 54 68 69 73 20  s defined. This 
c510: 61 6c 6c 6f 77 73 20 74 68 65 20 63 6f 64 65 0a  allows the code.
c520: 2a 2a 20 69 6e 20 73 71 6c 69 74 65 33 53 65 6c  ** in sqlite3Sel
c530: 65 63 74 28 29 20 74 6f 20 61 73 73 69 67 6e 20  ect() to assign 
c540: 76 61 6c 75 65 73 20 74 6f 20 73 74 72 75 63 74  values to struct
c550: 75 72 65 20 6d 65 6d 62 65 72 20 76 61 72 69 61  ure member varia
c560: 62 6c 65 73 20 74 68 61 74 0a 2a 2a 20 6f 6e 6c  bles that.** onl
c570: 79 20 65 78 69 73 74 20 69 66 20 53 51 4c 49 54  y exist if SQLIT
c580: 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 20 69  E_OMIT_EXPLAIN i
c590: 73 20 6e 6f 74 20 64 65 66 69 6e 65 64 20 77 69  s not defined wi
c5a0: 74 68 6f 75 74 20 70 6f 6c 6c 75 74 69 6e 67 20  thout polluting 
c5b0: 74 68 65 0a 2a 2a 20 63 6f 64 65 20 77 69 74 68  the.** code with
c5c0: 20 23 69 66 6e 64 65 66 20 64 69 72 65 63 74 69   #ifndef directi
c5d0: 76 65 73 2e 0a 2a 2f 0a 23 20 64 65 66 69 6e 65  ves..*/.# define
c5e0: 20 65 78 70 6c 61 69 6e 53 65 74 49 6e 74 65 67   explainSetInteg
c5f0: 65 72 28 61 2c 20 62 29 20 61 20 3d 20 62 0a 0a  er(a, b) a = b..
c600: 23 65 6c 73 65 0a 2f 2a 20 4e 6f 2d 6f 70 20 76  #else./* No-op v
c610: 65 72 73 69 6f 6e 73 20 6f 66 20 74 68 65 20 65  ersions of the e
c620: 78 70 6c 61 69 6e 58 58 58 28 29 20 66 75 6e 63  xplainXXX() func
c630: 74 69 6f 6e 73 20 61 6e 64 20 6d 61 63 72 6f 73  tions and macros
c640: 2e 20 2a 2f 0a 23 20 64 65 66 69 6e 65 20 65 78  . */.# define ex
c650: 70 6c 61 69 6e 54 65 6d 70 54 61 62 6c 65 28 79  plainTempTable(y
c660: 2c 7a 29 0a 23 20 64 65 66 69 6e 65 20 65 78 70  ,z).# define exp
c670: 6c 61 69 6e 53 65 74 49 6e 74 65 67 65 72 28 79  lainSetInteger(y
c680: 2c 7a 29 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a  ,z).#endif.../*.
c690: 2a 2a 20 49 66 20 74 68 65 20 69 6e 6e 65 72 20  ** If the inner 
c6a0: 6c 6f 6f 70 20 77 61 73 20 67 65 6e 65 72 61 74  loop was generat
c6b0: 65 64 20 75 73 69 6e 67 20 61 20 6e 6f 6e 2d 6e  ed using a non-n
c6c0: 75 6c 6c 20 70 4f 72 64 65 72 42 79 20 61 72 67  ull pOrderBy arg
c6d0: 75 6d 65 6e 74 2c 0a 2a 2a 20 74 68 65 6e 20 74  ument,.** then t
c6e0: 68 65 20 72 65 73 75 6c 74 73 20 77 65 72 65 20  he results were 
c6f0: 70 6c 61 63 65 64 20 69 6e 20 61 20 73 6f 72 74  placed in a sort
c700: 65 72 2e 20 20 41 66 74 65 72 20 74 68 65 20 6c  er.  After the l
c710: 6f 6f 70 20 69 73 20 74 65 72 6d 69 6e 61 74 65  oop is terminate
c720: 64 0a 2a 2a 20 77 65 20 6e 65 65 64 20 74 6f 20  d.** we need to 
c730: 72 75 6e 20 74 68 65 20 73 6f 72 74 65 72 20 61  run the sorter a
c740: 6e 64 20 6f 75 74 70 75 74 20 74 68 65 20 72 65  nd output the re
c750: 73 75 6c 74 73 2e 20 20 54 68 65 20 66 6f 6c 6c  sults.  The foll
c760: 6f 77 69 6e 67 0a 2a 2a 20 72 6f 75 74 69 6e 65  owing.** routine
c770: 20 67 65 6e 65 72 61 74 65 73 20 74 68 65 20 63   generates the c
c780: 6f 64 65 20 6e 65 65 64 65 64 20 74 6f 20 64 6f  ode needed to do
c790: 20 74 68 61 74 2e 0a 2a 2f 0a 73 74 61 74 69 63   that..*/.static
c7a0: 20 76 6f 69 64 20 67 65 6e 65 72 61 74 65 53 6f   void generateSo
c7b0: 72 74 54 61 69 6c 28 0a 20 20 50 61 72 73 65 20  rtTail(.  Parse 
c7c0: 2a 70 50 61 72 73 65 2c 20 20 20 20 2f 2a 20 50  *pParse,    /* P
c7d0: 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
c7e0: 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20  /.  Select *p,  
c7f0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 53 45 4c        /* The SEL
c800: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f  ECT statement */
c810: 0a 20 20 53 6f 72 74 43 74 78 20 2a 70 53 6f 72  .  SortCtx *pSor
c820: 74 2c 20 20 20 2f 2a 20 49 6e 66 6f 72 6d 61 74  t,   /* Informat
c830: 69 6f 6e 20 6f 6e 20 74 68 65 20 4f 52 44 45 52  ion on the ORDER
c840: 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20   BY clause */.  
c850: 69 6e 74 20 6e 43 6f 6c 75 6d 6e 2c 20 20 20 20  int nColumn,    
c860: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63    /* Number of c
c870: 6f 6c 75 6d 6e 73 20 6f 66 20 64 61 74 61 20 2a  olumns of data *
c880: 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 2a  /.  SelectDest *
c890: 70 44 65 73 74 20 2f 2a 20 57 72 69 74 65 20 74  pDest /* Write t
c8a0: 68 65 20 73 6f 72 74 65 64 20 72 65 73 75 6c 74  he sorted result
c8b0: 73 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 56  s here */.){.  V
c8c0: 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
c8d0: 3e 70 56 64 62 65 3b 20 20 20 20 20 20 20 20 20  >pVdbe;         
c8e0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
c8f0: 68 65 20 70 72 65 70 61 72 65 64 20 73 74 61 74  he prepared stat
c900: 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 61  ement */.  int a
c910: 64 64 72 42 72 65 61 6b 20 3d 20 70 53 6f 72 74  ddrBreak = pSort
c920: 2d 3e 6c 61 62 65 6c 44 6f 6e 65 3b 20 20 20 20  ->labelDone;    
c930: 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20          /* Jump 
c940: 68 65 72 65 20 74 6f 20 65 78 69 74 20 6c 6f 6f  here to exit loo
c950: 70 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 43  p */.  int addrC
c960: 6f 6e 74 69 6e 75 65 20 3d 20 73 71 6c 69 74 65  ontinue = sqlite
c970: 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 70  3VdbeMakeLabel(p
c980: 50 61 72 73 65 29 3b 2f 2a 20 4a 75 6d 70 20 68  Parse);/* Jump h
c990: 65 72 65 20 66 6f 72 20 6e 65 78 74 20 63 79 63  ere for next cyc
c9a0: 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72  le */.  int addr
c9b0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
c9c0: 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 70 20 6f          /* Top o
c9d0: 66 20 6f 75 74 70 75 74 20 6c 6f 6f 70 2e 20 4a  f output loop. J
c9e0: 75 6d 70 20 66 6f 72 20 4e 65 78 74 2e 20 2a 2f  ump for Next. */
c9f0: 0a 20 20 69 6e 74 20 61 64 64 72 4f 6e 63 65 20  .  int addrOnce 
ca00: 3d 20 30 3b 0a 20 20 69 6e 74 20 69 54 61 62 3b  = 0;.  int iTab;
ca10: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72  .  ExprList *pOr
ca20: 64 65 72 42 79 20 3d 20 70 53 6f 72 74 2d 3e 70  derBy = pSort->p
ca30: 4f 72 64 65 72 42 79 3b 0a 20 20 69 6e 74 20 65  OrderBy;.  int e
ca40: 44 65 73 74 20 3d 20 70 44 65 73 74 2d 3e 65 44  Dest = pDest->eD
ca50: 65 73 74 3b 0a 20 20 69 6e 74 20 69 50 61 72 6d  est;.  int iParm
ca60: 20 3d 20 70 44 65 73 74 2d 3e 69 53 44 50 61 72   = pDest->iSDPar
ca70: 6d 3b 0a 20 20 69 6e 74 20 72 65 67 52 6f 77 3b  m;.  int regRow;
ca80: 0a 20 20 69 6e 74 20 72 65 67 52 6f 77 69 64 3b  .  int regRowid;
ca90: 0a 20 20 69 6e 74 20 69 43 6f 6c 3b 0a 20 20 69  .  int iCol;.  i
caa0: 6e 74 20 6e 4b 65 79 3b 20 20 20 20 20 20 20 20  nt nKey;        
cab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
cac0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6b 65 79 20  * Number of key 
cad0: 63 6f 6c 75 6d 6e 73 20 69 6e 20 73 6f 72 74 65  columns in sorte
cae0: 72 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 69 6e  r record */.  in
caf0: 74 20 69 53 6f 72 74 54 61 62 3b 20 20 20 20 20  t iSortTab;     
cb00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
cb10: 20 53 6f 72 74 65 72 20 63 75 72 73 6f 72 20 74   Sorter cursor t
cb20: 6f 20 72 65 61 64 20 66 72 6f 6d 20 2a 2f 0a 20  o read from */. 
cb30: 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 62 53   int i;.  int bS
cb40: 65 71 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  eq;             
cb50: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
cb60: 65 20 69 66 20 73 6f 72 74 65 72 20 72 65 63 6f  e if sorter reco
cb70: 72 64 20 69 6e 63 6c 75 64 65 73 20 73 65 71 2e  rd includes seq.
cb80: 20 6e 6f 2e 20 2a 2f 0a 20 20 69 6e 74 20 6e 52   no. */.  int nR
cb90: 65 66 4b 65 79 20 3d 20 30 3b 0a 20 20 73 74 72  efKey = 0;.  str
cba0: 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
cbb0: 6d 20 2a 61 4f 75 74 45 78 20 3d 20 70 2d 3e 70  m *aOutEx = p->p
cbc0: 45 4c 69 73 74 2d 3e 61 3b 0a 0a 20 20 61 73 73  EList->a;..  ass
cbd0: 65 72 74 28 20 61 64 64 72 42 72 65 61 6b 3c 30  ert( addrBreak<0
cbe0: 20 29 3b 0a 20 20 69 66 28 20 70 53 6f 72 74 2d   );.  if( pSort-
cbf0: 3e 6c 61 62 65 6c 42 6b 4f 75 74 20 29 7b 0a 20  >labelBkOut ){. 
cc00: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
cc10: 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62  dOp2(v, OP_Gosub
cc20: 2c 20 70 53 6f 72 74 2d 3e 72 65 67 52 65 74 75  , pSort->regRetu
cc30: 72 6e 2c 20 70 53 6f 72 74 2d 3e 6c 61 62 65 6c  rn, pSort->label
cc40: 42 6b 4f 75 74 29 3b 0a 20 20 20 20 73 71 6c 69  BkOut);.    sqli
cc50: 74 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 61  te3VdbeGoto(v, a
cc60: 64 64 72 42 72 65 61 6b 29 3b 0a 20 20 20 20 73  ddrBreak);.    s
cc70: 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
cc80: 65 4c 61 62 65 6c 28 76 2c 20 70 53 6f 72 74 2d  eLabel(v, pSort-
cc90: 3e 6c 61 62 65 6c 42 6b 4f 75 74 29 3b 0a 20 20  >labelBkOut);.  
cca0: 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  }..#ifdef SQLITE
ccb0: 5f 45 4e 41 42 4c 45 5f 53 4f 52 54 45 52 5f 52  _ENABLE_SORTER_R
ccc0: 45 46 45 52 45 4e 43 45 53 0a 20 20 2f 2a 20 4f  EFERENCES.  /* O
ccd0: 70 65 6e 20 61 6e 79 20 63 75 72 73 6f 72 73 20  pen any cursors 
cce0: 6e 65 65 64 65 64 20 66 6f 72 20 73 6f 72 74 65  needed for sorte
ccf0: 72 2d 72 65 66 65 72 65 6e 63 65 20 65 78 70 72  r-reference expr
cd00: 65 73 73 69 6f 6e 73 20 2a 2f 0a 20 20 66 6f 72  essions */.  for
cd10: 28 69 3d 30 3b 20 69 3c 70 53 6f 72 74 2d 3e 6e  (i=0; i<pSort->n
cd20: 44 65 66 65 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  Defer; i++){.   
cd30: 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70   Table *pTab = p
cd40: 53 6f 72 74 2d 3e 61 44 65 66 65 72 5b 69 5d 2e  Sort->aDefer[i].
cd50: 70 54 61 62 3b 0a 20 20 20 20 69 6e 74 20 69 44  pTab;.    int iD
cd60: 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d  b = sqlite3Schem
cd70: 61 54 6f 49 6e 64 65 78 28 70 50 61 72 73 65 2d  aToIndex(pParse-
cd80: 3e 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68 65  >db, pTab->pSche
cd90: 6d 61 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ma);.    sqlite3
cda0: 4f 70 65 6e 54 61 62 6c 65 28 70 50 61 72 73 65  OpenTable(pParse
cdb0: 2c 20 70 53 6f 72 74 2d 3e 61 44 65 66 65 72 5b  , pSort->aDefer[
cdc0: 69 5d 2e 69 43 73 72 2c 20 69 44 62 2c 20 70 54  i].iCsr, iDb, pT
cdd0: 61 62 2c 20 4f 50 5f 4f 70 65 6e 52 65 61 64 29  ab, OP_OpenRead)
cde0: 3b 0a 20 20 20 20 6e 52 65 66 4b 65 79 20 3d 20  ;.    nRefKey = 
cdf0: 4d 41 58 28 6e 52 65 66 4b 65 79 2c 20 70 53 6f  MAX(nRefKey, pSo
ce00: 72 74 2d 3e 61 44 65 66 65 72 5b 69 5d 2e 6e 4b  rt->aDefer[i].nK
ce10: 65 79 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  ey);.  }.#endif.
ce20: 0a 20 20 69 54 61 62 20 3d 20 70 53 6f 72 74 2d  .  iTab = pSort-
ce30: 3e 69 45 43 75 72 73 6f 72 3b 0a 20 20 69 66 28  >iECursor;.  if(
ce40: 20 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70   eDest==SRT_Outp
ce50: 75 74 20 7c 7c 20 65 44 65 73 74 3d 3d 53 52 54  ut || eDest==SRT
ce60: 5f 43 6f 72 6f 75 74 69 6e 65 20 7c 7c 20 65 44  _Coroutine || eD
ce70: 65 73 74 3d 3d 53 52 54 5f 4d 65 6d 20 29 7b 0a  est==SRT_Mem ){.
ce80: 20 20 20 20 72 65 67 52 6f 77 69 64 20 3d 20 30      regRowid = 0
ce90: 3b 0a 20 20 20 20 72 65 67 52 6f 77 20 3d 20 70  ;.    regRow = p
cea0: 44 65 73 74 2d 3e 69 53 64 73 74 3b 0a 20 20 7d  Dest->iSdst;.  }
ceb0: 65 6c 73 65 7b 0a 20 20 20 20 72 65 67 52 6f 77  else{.    regRow
cec0: 69 64 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  id = sqlite3GetT
ced0: 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a  empReg(pParse);.
cee0: 20 20 20 20 69 66 28 20 65 44 65 73 74 3d 3d 53      if( eDest==S
cef0: 52 54 5f 45 70 68 65 6d 54 61 62 20 7c 7c 20 65  RT_EphemTab || e
cf00: 44 65 73 74 3d 3d 53 52 54 5f 54 61 62 6c 65 20  Dest==SRT_Table 
cf10: 29 7b 0a 20 20 20 20 20 20 72 65 67 52 6f 77 20  ){.      regRow 
cf20: 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
cf30: 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20  Reg(pParse);.   
cf40: 20 20 20 6e 43 6f 6c 75 6d 6e 20 3d 20 30 3b 0a     nColumn = 0;.
cf50: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
cf60: 20 72 65 67 52 6f 77 20 3d 20 73 71 6c 69 74 65   regRow = sqlite
cf70: 33 47 65 74 54 65 6d 70 52 61 6e 67 65 28 70 50  3GetTempRange(pP
cf80: 61 72 73 65 2c 20 6e 43 6f 6c 75 6d 6e 29 3b 0a  arse, nColumn);.
cf90: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 6e 4b 65 79      }.  }.  nKey
cfa0: 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78   = pOrderBy->nEx
cfb0: 70 72 20 2d 20 70 53 6f 72 74 2d 3e 6e 4f 42 53  pr - pSort->nOBS
cfc0: 61 74 3b 0a 20 20 69 66 28 20 70 53 6f 72 74 2d  at;.  if( pSort-
cfd0: 3e 73 6f 72 74 46 6c 61 67 73 20 26 20 53 4f 52  >sortFlags & SOR
cfe0: 54 46 4c 41 47 5f 55 73 65 53 6f 72 74 65 72 20  TFLAG_UseSorter 
cff0: 29 7b 0a 20 20 20 20 69 6e 74 20 72 65 67 53 6f  ){.    int regSo
d000: 72 74 4f 75 74 20 3d 20 2b 2b 70 50 61 72 73 65  rtOut = ++pParse
d010: 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 69 53 6f 72  ->nMem;.    iSor
d020: 74 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 6e  tTab = pParse->n
d030: 54 61 62 2b 2b 3b 0a 20 20 20 20 69 66 28 20 70  Tab++;.    if( p
d040: 53 6f 72 74 2d 3e 6c 61 62 65 6c 42 6b 4f 75 74  Sort->labelBkOut
d050: 20 29 7b 0a 20 20 20 20 20 20 61 64 64 72 4f 6e   ){.      addrOn
d060: 63 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  ce = sqlite3Vdbe
d070: 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f 4f 6e 63  AddOp0(v, OP_Onc
d080: 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  e); VdbeCoverage
d090: 28 76 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  (v);.    }.    s
d0a0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
d0b0: 28 76 2c 20 4f 50 5f 4f 70 65 6e 50 73 65 75 64  (v, OP_OpenPseud
d0c0: 6f 2c 20 69 53 6f 72 74 54 61 62 2c 20 72 65 67  o, iSortTab, reg
d0d0: 53 6f 72 74 4f 75 74 2c 20 0a 20 20 20 20 20 20  SortOut, .      
d0e0: 20 20 6e 4b 65 79 2b 31 2b 6e 43 6f 6c 75 6d 6e    nKey+1+nColumn
d0f0: 2b 6e 52 65 66 4b 65 79 29 3b 0a 20 20 20 20 69  +nRefKey);.    i
d100: 66 28 20 61 64 64 72 4f 6e 63 65 20 29 20 73 71  f( addrOnce ) sq
d110: 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
d120: 65 28 76 2c 20 61 64 64 72 4f 6e 63 65 29 3b 0a  e(v, addrOnce);.
d130: 20 20 20 20 61 64 64 72 20 3d 20 31 20 2b 20 73      addr = 1 + s
d140: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
d150: 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72 53 6f 72  (v, OP_SorterSor
d160: 74 2c 20 69 54 61 62 2c 20 61 64 64 72 42 72 65  t, iTab, addrBre
d170: 61 6b 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 76  ak);.    VdbeCov
d180: 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 63 6f  erage(v);.    co
d190: 64 65 4f 66 66 73 65 74 28 76 2c 20 70 2d 3e 69  deOffset(v, p->i
d1a0: 4f 66 66 73 65 74 2c 20 61 64 64 72 43 6f 6e 74  Offset, addrCont
d1b0: 69 6e 75 65 29 3b 0a 20 20 20 20 73 71 6c 69 74  inue);.    sqlit
d1c0: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
d1d0: 4f 50 5f 53 6f 72 74 65 72 44 61 74 61 2c 20 69  OP_SorterData, i
d1e0: 54 61 62 2c 20 72 65 67 53 6f 72 74 4f 75 74 2c  Tab, regSortOut,
d1f0: 20 69 53 6f 72 74 54 61 62 29 3b 0a 20 20 20 20   iSortTab);.    
d200: 62 53 65 71 20 3d 20 30 3b 0a 20 20 7d 65 6c 73  bSeq = 0;.  }els
d210: 65 7b 0a 20 20 20 20 61 64 64 72 20 3d 20 31 20  e{.    addr = 1 
d220: 2b 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  + sqlite3VdbeAdd
d230: 4f 70 32 28 76 2c 20 4f 50 5f 53 6f 72 74 2c 20  Op2(v, OP_Sort, 
d240: 69 54 61 62 2c 20 61 64 64 72 42 72 65 61 6b 29  iTab, addrBreak)
d250: 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
d260: 29 3b 0a 20 20 20 20 63 6f 64 65 4f 66 66 73 65  );.    codeOffse
d270: 74 28 76 2c 20 70 2d 3e 69 4f 66 66 73 65 74 2c  t(v, p->iOffset,
d280: 20 61 64 64 72 43 6f 6e 74 69 6e 75 65 29 3b 0a   addrContinue);.
d290: 20 20 20 20 69 53 6f 72 74 54 61 62 20 3d 20 69      iSortTab = i
d2a0: 54 61 62 3b 0a 20 20 20 20 62 53 65 71 20 3d 20  Tab;.    bSeq = 
d2b0: 31 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30  1;.  }.  for(i=0
d2c0: 2c 20 69 43 6f 6c 3d 6e 4b 65 79 2b 62 53 65 71  , iCol=nKey+bSeq
d2d0: 2d 31 3b 20 69 3c 6e 43 6f 6c 75 6d 6e 3b 20 69  -1; i<nColumn; i
d2e0: 2b 2b 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49  ++){.#ifdef SQLI
d2f0: 54 45 5f 45 4e 41 42 4c 45 5f 53 4f 52 54 45 52  TE_ENABLE_SORTER
d300: 5f 52 45 46 45 52 45 4e 43 45 53 0a 20 20 20 20  _REFERENCES.    
d310: 69 66 28 20 61 4f 75 74 45 78 5b 69 5d 2e 62 53  if( aOutEx[i].bS
d320: 6f 72 74 65 72 52 65 66 20 29 20 63 6f 6e 74 69  orterRef ) conti
d330: 6e 75 65 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  nue;.#endif.    
d340: 69 66 28 20 61 4f 75 74 45 78 5b 69 5d 2e 75 2e  if( aOutEx[i].u.
d350: 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 3d 3d 30  x.iOrderByCol==0
d360: 20 29 20 69 43 6f 6c 2b 2b 3b 0a 20 20 7d 0a 23   ) iCol++;.  }.#
d370: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
d380: 42 4c 45 5f 53 4f 52 54 45 52 5f 52 45 46 45 52  BLE_SORTER_REFER
d390: 45 4e 43 45 53 0a 20 20 69 66 28 20 70 53 6f 72  ENCES.  if( pSor
d3a0: 74 2d 3e 6e 44 65 66 65 72 20 29 7b 0a 20 20 20  t->nDefer ){.   
d3b0: 20 69 6e 74 20 69 4b 65 79 20 3d 20 69 43 6f 6c   int iKey = iCol
d3c0: 2b 31 3b 0a 20 20 20 20 69 6e 74 20 72 65 67 4b  +1;.    int regK
d3d0: 65 79 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  ey = sqlite3GetT
d3e0: 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c  empRange(pParse,
d3f0: 20 6e 52 65 66 4b 65 79 29 3b 0a 0a 20 20 20 20   nRefKey);..    
d400: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 53 6f 72 74  for(i=0; i<pSort
d410: 2d 3e 6e 44 65 66 65 72 3b 20 69 2b 2b 29 7b 0a  ->nDefer; i++){.
d420: 20 20 20 20 20 20 69 6e 74 20 69 43 73 72 20 3d        int iCsr =
d430: 20 70 53 6f 72 74 2d 3e 61 44 65 66 65 72 5b 69   pSort->aDefer[i
d440: 5d 2e 69 43 73 72 3b 0a 20 20 20 20 20 20 54 61  ].iCsr;.      Ta
d450: 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 53 6f 72  ble *pTab = pSor
d460: 74 2d 3e 61 44 65 66 65 72 5b 69 5d 2e 70 54 61  t->aDefer[i].pTa
d470: 62 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 4b 65  b;.      int nKe
d480: 79 20 3d 20 70 53 6f 72 74 2d 3e 61 44 65 66 65  y = pSort->aDefe
d490: 72 5b 69 5d 2e 6e 4b 65 79 3b 0a 0a 20 20 20 20  r[i].nKey;..    
d4a0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
d4b0: 4f 70 31 28 76 2c 20 4f 50 5f 4e 75 6c 6c 52 6f  Op1(v, OP_NullRo
d4c0: 77 2c 20 69 43 73 72 29 3b 0a 20 20 20 20 20 20  w, iCsr);.      
d4d0: 69 66 28 20 48 61 73 52 6f 77 69 64 28 70 54 61  if( HasRowid(pTa
d4e0: 62 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  b) ){.        sq
d4f0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
d500: 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69 53  v, OP_Column, iS
d510: 6f 72 74 54 61 62 2c 20 69 4b 65 79 2b 2b 2c 20  ortTab, iKey++, 
d520: 72 65 67 4b 65 79 29 3b 0a 20 20 20 20 20 20 20  regKey);.       
d530: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
d540: 70 33 28 76 2c 20 4f 50 5f 53 65 65 6b 52 6f 77  p3(v, OP_SeekRow
d550: 69 64 2c 20 69 43 73 72 2c 20 0a 20 20 20 20 20  id, iCsr, .     
d560: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
d570: 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
d580: 2b 31 2c 20 72 65 67 4b 65 79 29 3b 0a 20 20 20  +1, regKey);.   
d590: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
d5a0: 20 20 69 6e 74 20 6b 3b 0a 20 20 20 20 20 20 20    int k;.       
d5b0: 20 69 6e 74 20 69 4a 6d 70 3b 0a 20 20 20 20 20   int iJmp;.     
d5c0: 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
d5d0: 65 33 50 72 69 6d 61 72 79 4b 65 79 49 6e 64 65  e3PrimaryKeyInde
d5e0: 78 28 70 54 61 62 29 2d 3e 6e 4b 65 79 43 6f 6c  x(pTab)->nKeyCol
d5f0: 3d 3d 6e 4b 65 79 20 29 3b 0a 20 20 20 20 20 20  ==nKey );.      
d600: 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 6e 4b 65    for(k=0; k<nKe
d610: 79 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 20 20 20  y; k++){.       
d620: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
d630: 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d  dOp3(v, OP_Colum
d640: 6e 2c 20 69 53 6f 72 74 54 61 62 2c 20 69 4b 65  n, iSortTab, iKe
d650: 79 2b 2b 2c 20 72 65 67 4b 65 79 2b 6b 29 3b 0a  y++, regKey+k);.
d660: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
d670: 20 20 69 4a 6d 70 20 3d 20 73 71 6c 69 74 65 33    iJmp = sqlite3
d680: 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
d690: 76 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  v);.        sqli
d6a0: 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74  te3VdbeAddOp4Int
d6b0: 28 76 2c 20 4f 50 5f 53 65 65 6b 47 45 2c 20 69  (v, OP_SeekGE, i
d6c0: 43 73 72 2c 20 69 4a 6d 70 2b 32 2c 20 72 65 67  Csr, iJmp+2, reg
d6d0: 4b 65 79 2c 20 6e 4b 65 79 29 3b 0a 20 20 20 20  Key, nKey);.    
d6e0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
d6f0: 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 49  ddOp4Int(v, OP_I
d700: 64 78 4c 45 2c 20 69 43 73 72 2c 20 69 4a 6d 70  dxLE, iCsr, iJmp
d710: 2b 33 2c 20 72 65 67 4b 65 79 2c 20 6e 4b 65 79  +3, regKey, nKey
d720: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
d730: 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
d740: 4f 50 5f 4e 75 6c 6c 52 6f 77 2c 20 69 43 73 72  OP_NullRow, iCsr
d750: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
d760: 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65  .    sqlite3Rele
d770: 61 73 65 54 65 6d 70 52 61 6e 67 65 28 70 50 61  aseTempRange(pPa
d780: 72 73 65 2c 20 72 65 67 4b 65 79 2c 20 6e 52 65  rse, regKey, nRe
d790: 66 4b 65 79 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  fKey);.  }.#endi
d7a0: 66 0a 20 20 66 6f 72 28 69 3d 6e 43 6f 6c 75 6d  f.  for(i=nColum
d7b0: 6e 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b  n-1; i>=0; i--){
d7c0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
d7d0: 4e 41 42 4c 45 5f 53 4f 52 54 45 52 5f 52 45 46  NABLE_SORTER_REF
d7e0: 45 52 45 4e 43 45 53 0a 20 20 20 20 69 66 28 20  ERENCES.    if( 
d7f0: 61 4f 75 74 45 78 5b 69 5d 2e 62 53 6f 72 74 65  aOutEx[i].bSorte
d800: 72 52 65 66 20 29 7b 0a 20 20 20 20 20 20 73 71  rRef ){.      sq
d810: 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50  lite3ExprCode(pP
d820: 61 72 73 65 2c 20 61 4f 75 74 45 78 5b 69 5d 2e  arse, aOutEx[i].
d830: 70 45 78 70 72 2c 20 72 65 67 52 6f 77 2b 69 29  pExpr, regRow+i)
d840: 3b 0a 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64  ;.    }else.#end
d850: 69 66 0a 20 20 20 20 7b 0a 20 20 20 20 20 20 69  if.    {.      i
d860: 6e 74 20 69 52 65 61 64 3b 0a 20 20 20 20 20 20  nt iRead;.      
d870: 69 66 28 20 61 4f 75 74 45 78 5b 69 5d 2e 75 2e  if( aOutEx[i].u.
d880: 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 20 29 7b  x.iOrderByCol ){
d890: 0a 20 20 20 20 20 20 20 20 69 52 65 61 64 20 3d  .        iRead =
d8a0: 20 61 4f 75 74 45 78 5b 69 5d 2e 75 2e 78 2e 69   aOutEx[i].u.x.i
d8b0: 4f 72 64 65 72 42 79 43 6f 6c 2d 31 3b 0a 20 20  OrderByCol-1;.  
d8c0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
d8d0: 20 20 20 69 52 65 61 64 20 3d 20 69 43 6f 6c 2d     iRead = iCol-
d8e0: 2d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  -;.      }.     
d8f0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
d900: 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c  p3(v, OP_Column,
d910: 20 69 53 6f 72 74 54 61 62 2c 20 69 52 65 61 64   iSortTab, iRead
d920: 2c 20 72 65 67 52 6f 77 2b 69 29 3b 0a 20 20 20  , regRow+i);.   
d930: 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
d940: 76 2c 20 22 25 73 22 2c 20 61 4f 75 74 45 78 5b  v, "%s", aOutEx[
d950: 69 5d 2e 7a 4e 61 6d 65 3f 61 4f 75 74 45 78 5b  i].zName?aOutEx[
d960: 69 5d 2e 7a 4e 61 6d 65 20 3a 20 61 4f 75 74 45  i].zName : aOutE
d970: 78 5b 69 5d 2e 7a 53 70 61 6e 29 29 3b 0a 20 20  x[i].zSpan));.  
d980: 20 20 7d 0a 20 20 7d 0a 20 20 73 77 69 74 63 68    }.  }.  switch
d990: 28 20 65 44 65 73 74 20 29 7b 0a 20 20 20 20 63  ( eDest ){.    c
d9a0: 61 73 65 20 53 52 54 5f 54 61 62 6c 65 3a 0a 20  ase SRT_Table:. 
d9b0: 20 20 20 63 61 73 65 20 53 52 54 5f 45 70 68 65     case SRT_Ephe
d9c0: 6d 54 61 62 3a 20 7b 0a 20 20 20 20 20 20 73 71  mTab: {.      sq
d9d0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
d9e0: 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69 53  v, OP_Column, iS
d9f0: 6f 72 74 54 61 62 2c 20 6e 4b 65 79 2b 62 53 65  ortTab, nKey+bSe
da00: 71 2c 20 72 65 67 52 6f 77 29 3b 0a 20 20 20 20  q, regRow);.    
da10: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
da20: 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 77 52 6f 77  Op2(v, OP_NewRow
da30: 69 64 2c 20 69 50 61 72 6d 2c 20 72 65 67 52 6f  id, iParm, regRo
da40: 77 69 64 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  wid);.      sqli
da50: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
da60: 20 4f 50 5f 49 6e 73 65 72 74 2c 20 69 50 61 72   OP_Insert, iPar
da70: 6d 2c 20 72 65 67 52 6f 77 2c 20 72 65 67 52 6f  m, regRow, regRo
da80: 77 69 64 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  wid);.      sqli
da90: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28  te3VdbeChangeP5(
daa0: 76 2c 20 4f 50 46 4c 41 47 5f 41 50 50 45 4e 44  v, OPFLAG_APPEND
dab0: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
dac0: 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51      }.#ifndef SQ
dad0: 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
dae0: 52 59 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f  RY.    case SRT_
daf0: 53 65 74 3a 20 7b 0a 20 20 20 20 20 20 61 73 73  Set: {.      ass
db00: 65 72 74 28 20 6e 43 6f 6c 75 6d 6e 3d 3d 73 71  ert( nColumn==sq
db10: 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70 44  lite3Strlen30(pD
db20: 65 73 74 2d 3e 7a 41 66 66 53 64 73 74 29 20 29  est->zAffSdst) )
db30: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
db40: 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
db50: 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 65 67 52  MakeRecord, regR
db60: 6f 77 2c 20 6e 43 6f 6c 75 6d 6e 2c 20 72 65 67  ow, nColumn, reg
db70: 52 6f 77 69 64 2c 0a 20 20 20 20 20 20 20 20 20  Rowid,.         
db80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
db90: 44 65 73 74 2d 3e 7a 41 66 66 53 64 73 74 2c 20  Dest->zAffSdst, 
dba0: 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20  nColumn);.      
dbb0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
dbc0: 34 49 6e 74 28 76 2c 20 4f 50 5f 49 64 78 49 6e  4Int(v, OP_IdxIn
dbd0: 73 65 72 74 2c 20 69 50 61 72 6d 2c 20 72 65 67  sert, iParm, reg
dbe0: 52 6f 77 69 64 2c 20 72 65 67 52 6f 77 2c 20 6e  Rowid, regRow, n
dbf0: 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20 62  Column);.      b
dc00: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
dc10: 63 61 73 65 20 53 52 54 5f 4d 65 6d 3a 20 7b 0a  case SRT_Mem: {.
dc20: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 4c 49 4d        /* The LIM
dc30: 49 54 20 63 6c 61 75 73 65 20 77 69 6c 6c 20 74  IT clause will t
dc40: 65 72 6d 69 6e 61 74 65 20 74 68 65 20 6c 6f 6f  erminate the loo
dc50: 70 20 66 6f 72 20 75 73 20 2a 2f 0a 20 20 20 20  p for us */.    
dc60: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
dc70: 65 6e 64 69 66 0a 20 20 20 20 64 65 66 61 75 6c  endif.    defaul
dc80: 74 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72  t: {.      asser
dc90: 74 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75  t( eDest==SRT_Ou
dca0: 74 70 75 74 20 7c 7c 20 65 44 65 73 74 3d 3d 53  tput || eDest==S
dcb0: 52 54 5f 43 6f 72 6f 75 74 69 6e 65 20 29 3b 20  RT_Coroutine ); 
dcc0: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
dcd0: 20 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70   eDest==SRT_Outp
dce0: 75 74 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  ut );.      test
dcf0: 63 61 73 65 28 20 65 44 65 73 74 3d 3d 53 52 54  case( eDest==SRT
dd00: 5f 43 6f 72 6f 75 74 69 6e 65 20 29 3b 0a 20 20  _Coroutine );.  
dd10: 20 20 20 20 69 66 28 20 65 44 65 73 74 3d 3d 53      if( eDest==S
dd20: 52 54 5f 4f 75 74 70 75 74 20 29 7b 0a 20 20 20  RT_Output ){.   
dd30: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
dd40: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 73  AddOp2(v, OP_Res
dd50: 75 6c 74 52 6f 77 2c 20 70 44 65 73 74 2d 3e 69  ultRow, pDest->i
dd60: 53 64 73 74 2c 20 6e 43 6f 6c 75 6d 6e 29 3b 0a  Sdst, nColumn);.
dd70: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
dd80: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
dd90: 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 59 69 65  AddOp1(v, OP_Yie
dda0: 6c 64 2c 20 70 44 65 73 74 2d 3e 69 53 44 50 61  ld, pDest->iSDPa
ddb0: 72 6d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  rm);.      }.   
ddc0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
ddd0: 20 20 7d 0a 20 20 69 66 28 20 72 65 67 52 6f 77    }.  if( regRow
dde0: 69 64 20 29 7b 0a 20 20 20 20 69 66 28 20 65 44  id ){.    if( eD
ddf0: 65 73 74 3d 3d 53 52 54 5f 53 65 74 20 29 7b 0a  est==SRT_Set ){.
de00: 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c        sqlite3Rel
de10: 65 61 73 65 54 65 6d 70 52 61 6e 67 65 28 70 50  easeTempRange(pP
de20: 61 72 73 65 2c 20 72 65 67 52 6f 77 2c 20 6e 43  arse, regRow, nC
de30: 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 7d 65 6c 73  olumn);.    }els
de40: 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  e{.      sqlite3
de50: 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
de60: 50 61 72 73 65 2c 20 72 65 67 52 6f 77 29 3b 0a  Parse, regRow);.
de70: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
de80: 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
de90: 70 50 61 72 73 65 2c 20 72 65 67 52 6f 77 69 64  pParse, regRowid
dea0: 29 3b 0a 20 20 7d 0a 20 20 2f 2a 20 54 68 65 20  );.  }.  /* The 
deb0: 62 6f 74 74 6f 6d 20 6f 66 20 74 68 65 20 6c 6f  bottom of the lo
dec0: 6f 70 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65  op.  */.  sqlite
ded0: 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
dee0: 6c 28 76 2c 20 61 64 64 72 43 6f 6e 74 69 6e 75  l(v, addrContinu
def0: 65 29 3b 0a 20 20 69 66 28 20 70 53 6f 72 74 2d  e);.  if( pSort-
df00: 3e 73 6f 72 74 46 6c 61 67 73 20 26 20 53 4f 52  >sortFlags & SOR
df10: 54 46 4c 41 47 5f 55 73 65 53 6f 72 74 65 72 20  TFLAG_UseSorter 
df20: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
df30: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53  beAddOp2(v, OP_S
df40: 6f 72 74 65 72 4e 65 78 74 2c 20 69 54 61 62 2c  orterNext, iTab,
df50: 20 61 64 64 72 29 3b 20 56 64 62 65 43 6f 76 65   addr); VdbeCove
df60: 72 61 67 65 28 76 29 3b 0a 20 20 7d 65 6c 73 65  rage(v);.  }else
df70: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
df80: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65  eAddOp2(v, OP_Ne
df90: 78 74 2c 20 69 54 61 62 2c 20 61 64 64 72 29 3b  xt, iTab, addr);
dfa0: 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
dfb0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 53 6f 72  ;.  }.  if( pSor
dfc0: 74 2d 3e 72 65 67 52 65 74 75 72 6e 20 29 20 73  t->regReturn ) s
dfd0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
dfe0: 28 76 2c 20 4f 50 5f 52 65 74 75 72 6e 2c 20 70  (v, OP_Return, p
dff0: 53 6f 72 74 2d 3e 72 65 67 52 65 74 75 72 6e 29  Sort->regReturn)
e000: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 52  ;.  sqlite3VdbeR
e010: 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61  esolveLabel(v, a
e020: 64 64 72 42 72 65 61 6b 29 3b 0a 7d 0a 0a 2f 2a  ddrBreak);.}../*
e030: 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69  .** Return a poi
e040: 6e 74 65 72 20 74 6f 20 61 20 73 74 72 69 6e 67  nter to a string
e050: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20   containing the 
e060: 27 64 65 63 6c 61 72 61 74 69 6f 6e 20 74 79 70  'declaration typ
e070: 65 27 20 6f 66 20 74 68 65 0a 2a 2a 20 65 78 70  e' of the.** exp
e080: 72 65 73 73 69 6f 6e 20 70 45 78 70 72 2e 20 54  ression pExpr. T
e090: 68 65 20 73 74 72 69 6e 67 20 6d 61 79 20 62 65  he string may be
e0a0: 20 74 72 65 61 74 65 64 20 61 73 20 73 74 61 74   treated as stat
e0b0: 69 63 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72  ic by the caller
e0c0: 2e 0a 2a 2a 0a 2a 2a 20 41 6c 73 6f 20 74 72 79  ..**.** Also try
e0d0: 20 74 6f 20 65 73 74 69 6d 61 74 65 20 74 68 65   to estimate the
e0e0: 20 73 69 7a 65 20 6f 66 20 74 68 65 20 72 65 74   size of the ret
e0f0: 75 72 6e 65 64 20 76 61 6c 75 65 20 61 6e 64 20  urned value and 
e100: 72 65 74 75 72 6e 20 74 68 61 74 0a 2a 2a 20 72  return that.** r
e110: 65 73 75 6c 74 20 69 6e 20 2a 70 45 73 74 57 69  esult in *pEstWi
e120: 64 74 68 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64  dth..**.** The d
e130: 65 63 6c 61 72 61 74 69 6f 6e 20 74 79 70 65 20  eclaration type 
e140: 69 73 20 74 68 65 20 65 78 61 63 74 20 64 61 74  is the exact dat
e150: 61 74 79 70 65 20 64 65 66 69 6e 69 74 69 6f 6e  atype definition
e160: 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20   extracted from 
e170: 74 68 65 0a 2a 2a 20 6f 72 69 67 69 6e 61 6c 20  the.** original 
e180: 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61  CREATE TABLE sta
e190: 74 65 6d 65 6e 74 20 69 66 20 74 68 65 20 65 78  tement if the ex
e1a0: 70 72 65 73 73 69 6f 6e 20 69 73 20 61 20 63 6f  pression is a co
e1b0: 6c 75 6d 6e 2e 20 54 68 65 0a 2a 2a 20 64 65 63  lumn. The.** dec
e1c0: 6c 61 72 61 74 69 6f 6e 20 74 79 70 65 20 66 6f  laration type fo
e1d0: 72 20 61 20 52 4f 57 49 44 20 66 69 65 6c 64 20  r a ROWID field 
e1e0: 69 73 20 49 4e 54 45 47 45 52 2e 20 45 78 61 63  is INTEGER. Exac
e1f0: 74 6c 79 20 77 68 65 6e 20 61 6e 20 65 78 70 72  tly when an expr
e200: 65 73 73 69 6f 6e 0a 2a 2a 20 69 73 20 63 6f 6e  ession.** is con
e210: 73 69 64 65 72 65 64 20 61 20 63 6f 6c 75 6d 6e  sidered a column
e220: 20 63 61 6e 20 62 65 20 63 6f 6d 70 6c 65 78 20   can be complex 
e230: 69 6e 20 74 68 65 20 70 72 65 73 65 6e 63 65 20  in the presence 
e240: 6f 66 20 73 75 62 71 75 65 72 69 65 73 2e 20 54  of subqueries. T
e250: 68 65 0a 2a 2a 20 72 65 73 75 6c 74 2d 73 65 74  he.** result-set
e260: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 61   expression in a
e270: 6c 6c 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ll of the follow
e280: 69 6e 67 20 53 45 4c 45 43 54 20 73 74 61 74 65  ing SELECT state
e290: 6d 65 6e 74 73 20 69 73 20 0a 2a 2a 20 63 6f 6e  ments is .** con
e2a0: 73 69 64 65 72 65 64 20 61 20 63 6f 6c 75 6d 6e  sidered a column
e2b0: 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f   by this functio
e2c0: 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 53 45 4c 45 43  n..**.**   SELEC
e2d0: 54 20 63 6f 6c 20 46 52 4f 4d 20 74 62 6c 3b 0a  T col FROM tbl;.
e2e0: 2a 2a 20 20 20 53 45 4c 45 43 54 20 28 53 45 4c  **   SELECT (SEL
e2f0: 45 43 54 20 63 6f 6c 20 46 52 4f 4d 20 74 62 6c  ECT col FROM tbl
e300: 3b 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20 28 53  ;.**   SELECT (S
e310: 45 4c 45 43 54 20 63 6f 6c 20 46 52 4f 4d 20 74  ELECT col FROM t
e320: 62 6c 29 3b 0a 2a 2a 20 20 20 53 45 4c 45 43 54  bl);.**   SELECT
e330: 20 61 62 63 20 46 52 4f 4d 20 28 53 45 4c 45 43   abc FROM (SELEC
e340: 54 20 63 6f 6c 20 41 53 20 61 62 63 20 46 52 4f  T col AS abc FRO
e350: 4d 20 74 62 6c 29 3b 0a 2a 2a 20 0a 2a 2a 20 54  M tbl);.** .** T
e360: 68 65 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 74  he declaration t
e370: 79 70 65 20 66 6f 72 20 61 6e 79 20 65 78 70 72  ype for any expr
e380: 65 73 73 69 6f 6e 20 6f 74 68 65 72 20 74 68 61  ession other tha
e390: 6e 20 61 20 63 6f 6c 75 6d 6e 20 69 73 20 4e 55  n a column is NU
e3a0: 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  LL..**.** This r
e3b0: 6f 75 74 69 6e 65 20 68 61 73 20 65 69 74 68 65  outine has eithe
e3c0: 72 20 33 20 6f 72 20 36 20 70 61 72 61 6d 65 74  r 3 or 6 paramet
e3d0: 65 72 73 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e  ers depending on
e3e0: 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 0a   whether or not.
e3f0: 2a 2a 20 74 68 65 20 53 51 4c 49 54 45 5f 45 4e  ** the SQLITE_EN
e400: 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41  ABLE_COLUMN_META
e410: 44 41 54 41 20 63 6f 6d 70 69 6c 65 2d 74 69 6d  DATA compile-tim
e420: 65 20 6f 70 74 69 6f 6e 20 69 73 20 75 73 65 64  e option is used
e430: 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  ..*/.#ifdef SQLI
e440: 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e  TE_ENABLE_COLUMN
e450: 5f 4d 45 54 41 44 41 54 41 0a 23 20 64 65 66 69  _METADATA.# defi
e460: 6e 65 20 63 6f 6c 75 6d 6e 54 79 70 65 28 41 2c  ne columnType(A,
e470: 42 2c 43 2c 44 2c 45 29 20 63 6f 6c 75 6d 6e 54  B,C,D,E) columnT
e480: 79 70 65 49 6d 70 6c 28 41 2c 42 2c 43 2c 44 2c  ypeImpl(A,B,C,D,
e490: 45 29 0a 23 65 6c 73 65 20 2f 2a 20 69 66 20 21  E).#else /* if !
e4a0: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45  defined(SQLITE_E
e4b0: 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54  NABLE_COLUMN_MET
e4c0: 41 44 41 54 41 29 20 2a 2f 0a 23 20 64 65 66 69  ADATA) */.# defi
e4d0: 6e 65 20 63 6f 6c 75 6d 6e 54 79 70 65 28 41 2c  ne columnType(A,
e4e0: 42 2c 43 2c 44 2c 45 29 20 63 6f 6c 75 6d 6e 54  B,C,D,E) columnT
e4f0: 79 70 65 49 6d 70 6c 28 41 2c 42 29 0a 23 65 6e  ypeImpl(A,B).#en
e500: 64 69 66 0a 73 74 61 74 69 63 20 63 6f 6e 73 74  dif.static const
e510: 20 63 68 61 72 20 2a 63 6f 6c 75 6d 6e 54 79 70   char *columnTyp
e520: 65 49 6d 70 6c 28 0a 20 20 4e 61 6d 65 43 6f 6e  eImpl(.  NameCon
e530: 74 65 78 74 20 2a 70 4e 43 2c 20 0a 23 69 66 6e  text *pNC, .#ifn
e540: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
e550: 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41 54  E_COLUMN_METADAT
e560: 41 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 0a  A.  Expr *pExpr.
e570: 23 65 6c 73 65 0a 20 20 45 78 70 72 20 2a 70 45  #else.  Expr *pE
e580: 78 70 72 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61  xpr,.  const cha
e590: 72 20 2a 2a 70 7a 4f 72 69 67 44 62 2c 0a 20 20  r **pzOrigDb,.  
e5a0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a 70 7a 4f  const char **pzO
e5b0: 72 69 67 54 61 62 2c 0a 20 20 63 6f 6e 73 74 20  rigTab,.  const 
e5c0: 63 68 61 72 20 2a 2a 70 7a 4f 72 69 67 43 6f 6c  char **pzOrigCol
e5d0: 0a 23 65 6e 64 69 66 0a 29 7b 0a 20 20 63 68 61  .#endif.){.  cha
e5e0: 72 20 63 6f 6e 73 74 20 2a 7a 54 79 70 65 20 3d  r const *zType =
e5f0: 20 30 3b 0a 20 20 69 6e 74 20 6a 3b 0a 23 69 66   0;.  int j;.#if
e600: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
e610: 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41 54  E_COLUMN_METADAT
e620: 41 0a 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a  A.  char const *
e630: 7a 4f 72 69 67 44 62 20 3d 20 30 3b 0a 20 20 63  zOrigDb = 0;.  c
e640: 68 61 72 20 63 6f 6e 73 74 20 2a 7a 4f 72 69 67  har const *zOrig
e650: 54 61 62 20 3d 20 30 3b 0a 20 20 63 68 61 72 20  Tab = 0;.  char 
e660: 63 6f 6e 73 74 20 2a 7a 4f 72 69 67 43 6f 6c 20  const *zOrigCol 
e670: 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 61  = 0;.#endif..  a
e680: 73 73 65 72 74 28 20 70 45 78 70 72 21 3d 30 20  ssert( pExpr!=0 
e690: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4e 43  );.  assert( pNC
e6a0: 2d 3e 70 53 72 63 4c 69 73 74 21 3d 30 20 29 3b  ->pSrcList!=0 );
e6b0: 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72  .  assert( pExpr
e6c0: 2d 3e 6f 70 21 3d 54 4b 5f 41 47 47 5f 43 4f 4c  ->op!=TK_AGG_COL
e6d0: 55 4d 4e 20 29 3b 20 20 2f 2a 20 54 68 69 73 20  UMN );  /* This 
e6e0: 72 6f 75 74 69 6e 65 20 72 75 6e 65 73 20 62 65  routine runes be
e6f0: 66 6f 72 65 20 61 67 67 72 65 67 61 74 65 73 0a  fore aggregates.
e700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e710: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e720: 20 20 20 20 20 20 20 2a 2a 20 61 72 65 20 70 72         ** are pr
e730: 6f 63 65 73 73 65 64 20 2a 2f 0a 20 20 73 77 69  ocessed */.  swi
e740: 74 63 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29  tch( pExpr->op )
e750: 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f  {.    case TK_CO
e760: 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20 20 20 2f 2a  LUMN: {.      /*
e770: 20 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   The expression 
e780: 69 73 20 61 20 63 6f 6c 75 6d 6e 2e 20 4c 6f 63  is a column. Loc
e790: 61 74 65 20 74 68 65 20 74 61 62 6c 65 20 74 68  ate the table th
e7a0: 65 20 63 6f 6c 75 6d 6e 20 69 73 20 62 65 69 6e  e column is bein
e7b0: 67 0a 20 20 20 20 20 20 2a 2a 20 65 78 74 72 61  g.      ** extra
e7c0: 63 74 65 64 20 66 72 6f 6d 20 69 6e 20 4e 61 6d  cted from in Nam
e7d0: 65 43 6f 6e 74 65 78 74 2e 70 53 72 63 4c 69 73  eContext.pSrcLis
e7e0: 74 2e 20 54 68 69 73 20 74 61 62 6c 65 20 6d 61  t. This table ma
e7f0: 79 20 62 65 20 72 65 61 6c 0a 20 20 20 20 20 20  y be real.      
e800: 2a 2a 20 64 61 74 61 62 61 73 65 20 74 61 62 6c  ** database tabl
e810: 65 20 6f 72 20 61 20 73 75 62 71 75 65 72 79 2e  e or a subquery.
e820: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
e830: 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 30 3b  Table *pTab = 0;
e840: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
e850: 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 20 63  able structure c
e860: 6f 6c 75 6d 6e 20 69 73 20 65 78 74 72 61 63 74  olumn is extract
e870: 65 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 20 20 20  ed from */.     
e880: 20 53 65 6c 65 63 74 20 2a 70 53 20 3d 20 30 3b   Select *pS = 0;
e890: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
e8a0: 53 65 6c 65 63 74 20 74 68 65 20 63 6f 6c 75 6d  Select the colum
e8b0: 6e 20 69 73 20 65 78 74 72 61 63 74 65 64 20 66  n is extracted f
e8c0: 72 6f 6d 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  rom */.      int
e8d0: 20 69 43 6f 6c 20 3d 20 70 45 78 70 72 2d 3e 69   iCol = pExpr->i
e8e0: 43 6f 6c 75 6d 6e 3b 20 20 2f 2a 20 49 6e 64 65  Column;  /* Inde
e8f0: 78 20 6f 66 20 63 6f 6c 75 6d 6e 20 69 6e 20 70  x of column in p
e900: 54 61 62 20 2a 2f 0a 20 20 20 20 20 20 77 68 69  Tab */.      whi
e910: 6c 65 28 20 70 4e 43 20 26 26 20 21 70 54 61 62  le( pNC && !pTab
e920: 20 29 7b 0a 20 20 20 20 20 20 20 20 53 72 63 4c   ){.        SrcL
e930: 69 73 74 20 2a 70 54 61 62 4c 69 73 74 20 3d 20  ist *pTabList = 
e940: 70 4e 43 2d 3e 70 53 72 63 4c 69 73 74 3b 0a 20  pNC->pSrcList;. 
e950: 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 6a         for(j=0;j
e960: 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 20  <pTabList->nSrc 
e970: 26 26 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 6a  && pTabList->a[j
e980: 5d 2e 69 43 75 72 73 6f 72 21 3d 70 45 78 70 72  ].iCursor!=pExpr
e990: 2d 3e 69 54 61 62 6c 65 3b 6a 2b 2b 29 3b 0a 20  ->iTable;j++);. 
e9a0: 20 20 20 20 20 20 20 69 66 28 20 6a 3c 70 54 61         if( j<pTa
e9b0: 62 4c 69 73 74 2d 3e 6e 53 72 63 20 29 7b 0a 20  bList->nSrc ){. 
e9c0: 20 20 20 20 20 20 20 20 20 70 54 61 62 20 3d 20           pTab = 
e9d0: 70 54 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 70  pTabList->a[j].p
e9e0: 54 61 62 3b 0a 20 20 20 20 20 20 20 20 20 20 70  Tab;.          p
e9f0: 53 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b  S = pTabList->a[
ea00: 6a 5d 2e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20  j].pSelect;.    
ea10: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
ea20: 20 20 20 20 20 70 4e 43 20 3d 20 70 4e 43 2d 3e       pNC = pNC->
ea30: 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 20 20 7d  pNext;.        }
ea40: 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
ea50: 69 66 28 20 70 54 61 62 3d 3d 30 20 29 7b 0a 20  if( pTab==0 ){. 
ea60: 20 20 20 20 20 20 20 2f 2a 20 41 74 20 6f 6e 65         /* At one
ea70: 20 74 69 6d 65 2c 20 63 6f 64 65 20 73 75 63 68   time, code such
ea80: 20 61 73 20 22 53 45 4c 45 43 54 20 6e 65 77 2e   as "SELECT new.
ea90: 78 22 20 77 69 74 68 69 6e 20 61 20 74 72 69 67  x" within a trig
eaa0: 67 65 72 20 77 6f 75 6c 64 0a 20 20 20 20 20 20  ger would.      
eab0: 20 20 2a 2a 20 63 61 75 73 65 20 74 68 69 73 20    ** cause this 
eac0: 63 6f 6e 64 69 74 69 6f 6e 20 74 6f 20 72 75 6e  condition to run
ead0: 2e 20 20 53 69 6e 63 65 20 74 68 65 6e 2c 20 77  .  Since then, w
eae0: 65 20 68 61 76 65 20 72 65 73 74 72 75 63 74 75  e have restructu
eaf0: 72 65 64 20 68 6f 77 0a 20 20 20 20 20 20 20 20  red how.        
eb00: 2a 2a 20 74 72 69 67 67 65 72 20 63 6f 64 65 20  ** trigger code 
eb10: 69 73 20 67 65 6e 65 72 61 74 65 64 20 61 6e 64  is generated and
eb20: 20 73 6f 20 74 68 69 73 20 63 6f 6e 64 69 74 69   so this conditi
eb30: 6f 6e 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20  on is no longer 
eb40: 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 6f 73 73  .        ** poss
eb50: 69 62 6c 65 2e 20 48 6f 77 65 76 65 72 2c 20 69  ible. However, i
eb60: 74 20 63 61 6e 20 73 74 69 6c 6c 20 62 65 20 74  t can still be t
eb70: 72 75 65 20 66 6f 72 20 73 74 61 74 65 6d 65 6e  rue for statemen
eb80: 74 73 20 6c 69 6b 65 0a 20 20 20 20 20 20 20 20  ts like.        
eb90: 2a 2a 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** the following
eba0: 3a 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20  :.        **.   
ebb0: 20 20 20 20 20 2a 2a 20 20 20 43 52 45 41 54 45       **   CREATE
ebc0: 20 54 41 42 4c 45 20 74 31 28 63 6f 6c 20 49 4e   TABLE t1(col IN
ebd0: 54 45 47 45 52 29 3b 0a 20 20 20 20 20 20 20 20  TEGER);.        
ebe0: 2a 2a 20 20 20 53 45 4c 45 43 54 20 28 53 45 4c  **   SELECT (SEL
ebf0: 45 43 54 20 74 31 2e 63 6f 6c 29 20 46 52 4f 4d  ECT t1.col) FROM
ec00: 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 20 20   FROM t1;.      
ec10: 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20    **.        ** 
ec20: 77 68 65 6e 20 63 6f 6c 75 6d 6e 54 79 70 65 28  when columnType(
ec30: 29 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e 20 74  ) is called on t
ec40: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 22 74  he expression "t
ec50: 31 2e 63 6f 6c 22 20 69 6e 20 74 68 65 20 0a 20  1.col" in the . 
ec60: 20 20 20 20 20 20 20 2a 2a 20 73 75 62 2d 73 65         ** sub-se
ec70: 6c 65 63 74 2e 20 49 6e 20 74 68 69 73 20 63 61  lect. In this ca
ec80: 73 65 2c 20 73 65 74 20 74 68 65 20 63 6f 6c 75  se, set the colu
ec90: 6d 6e 20 74 79 70 65 20 74 6f 20 4e 55 4c 4c 2c  mn type to NULL,
eca0: 20 65 76 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a   even.        **
ecb0: 20 74 68 6f 75 67 68 20 69 74 20 73 68 6f 75 6c   though it shoul
ecc0: 64 20 72 65 61 6c 6c 79 20 62 65 20 22 49 4e 54  d really be "INT
ecd0: 45 47 45 52 22 2e 0a 20 20 20 20 20 20 20 20 2a  EGER"..        *
ece0: 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 54 68 69  *.        ** Thi
ecf0: 73 20 69 73 20 6e 6f 74 20 61 20 70 72 6f 62 6c  s is not a probl
ed00: 65 6d 2c 20 61 73 20 74 68 65 20 63 6f 6c 75 6d  em, as the colum
ed10: 6e 20 74 79 70 65 20 6f 66 20 22 74 31 2e 63 6f  n type of "t1.co
ed20: 6c 22 20 69 73 20 6e 65 76 65 72 0a 20 20 20 20  l" is never.    
ed30: 20 20 20 20 2a 2a 20 75 73 65 64 2e 20 57 68 65      ** used. Whe
ed40: 6e 20 63 6f 6c 75 6d 6e 54 79 70 65 28 29 20 69  n columnType() i
ed50: 73 20 63 61 6c 6c 65 64 20 6f 6e 20 74 68 65 20  s called on the 
ed60: 65 78 70 72 65 73 73 69 6f 6e 20 0a 20 20 20 20  expression .    
ed70: 20 20 20 20 2a 2a 20 22 28 53 45 4c 45 43 54 20      ** "(SELECT 
ed80: 74 31 2e 63 6f 6c 29 22 2c 20 74 68 65 20 63 6f  t1.col)", the co
ed90: 72 72 65 63 74 20 74 79 70 65 20 69 73 20 72 65  rrect type is re
eda0: 74 75 72 6e 65 64 20 28 73 65 65 20 74 68 65 20  turned (see the 
edb0: 54 4b 5f 53 45 4c 45 43 54 0a 20 20 20 20 20 20  TK_SELECT.      
edc0: 20 20 2a 2a 20 62 72 61 6e 63 68 20 62 65 6c 6f    ** branch belo
edd0: 77 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 62  w.  */.        b
ede0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  reak;.      }.. 
edf0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54 61       assert( pTa
ee00: 62 20 26 26 20 70 45 78 70 72 2d 3e 79 2e 70 54  b && pExpr->y.pT
ee10: 61 62 3d 3d 70 54 61 62 20 29 3b 0a 20 20 20 20  ab==pTab );.    
ee20: 20 20 69 66 28 20 70 53 20 29 7b 0a 20 20 20 20    if( pS ){.    
ee30: 20 20 20 20 2f 2a 20 54 68 65 20 22 74 61 62 6c      /* The "tabl
ee40: 65 22 20 69 73 20 61 63 74 75 61 6c 6c 79 20 61  e" is actually a
ee50: 20 73 75 62 2d 73 65 6c 65 63 74 20 6f 72 20 61   sub-select or a
ee60: 20 76 69 65 77 20 69 6e 20 74 68 65 20 46 52 4f   view in the FRO
ee70: 4d 20 63 6c 61 75 73 65 0a 20 20 20 20 20 20 20  M clause.       
ee80: 20 2a 2a 20 6f 66 20 74 68 65 20 53 45 4c 45 43   ** of the SELEC
ee90: 54 20 73 74 61 74 65 6d 65 6e 74 2e 20 52 65 74  T statement. Ret
eea0: 75 72 6e 20 74 68 65 20 64 65 63 6c 61 72 61 74  urn the declarat
eeb0: 69 6f 6e 20 74 79 70 65 20 61 6e 64 20 6f 72 69  ion type and ori
eec0: 67 69 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 64  gin.        ** d
eed0: 61 74 61 20 66 6f 72 20 74 68 65 20 72 65 73 75  ata for the resu
eee0: 6c 74 2d 73 65 74 20 63 6f 6c 75 6d 6e 20 6f 66  lt-set column of
eef0: 20 74 68 65 20 73 75 62 2d 73 65 6c 65 63 74 2e   the sub-select.
ef00: 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
ef10: 20 20 20 20 69 66 28 20 69 43 6f 6c 3e 3d 30 20      if( iCol>=0 
ef20: 26 26 20 69 43 6f 6c 3c 70 53 2d 3e 70 45 4c 69  && iCol<pS->pELi
ef30: 73 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20  st->nExpr ){.   
ef40: 20 20 20 20 20 20 20 2f 2a 20 49 66 20 69 43 6f         /* If iCo
ef50: 6c 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 7a  l is less than z
ef60: 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 65 78  ero, then the ex
ef70: 70 72 65 73 73 69 6f 6e 20 72 65 71 75 65 73 74  pression request
ef80: 73 20 74 68 65 0a 20 20 20 20 20 20 20 20 20 20  s the.          
ef90: 2a 2a 20 72 6f 77 69 64 20 6f 66 20 74 68 65 20  ** rowid of the 
efa0: 73 75 62 2d 73 65 6c 65 63 74 20 6f 72 20 76 69  sub-select or vi
efb0: 65 77 2e 20 54 68 69 73 20 65 78 70 72 65 73 73  ew. This express
efc0: 69 6f 6e 20 69 73 20 6c 65 67 61 6c 20 28 73 65  ion is legal (se
efd0: 65 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  e .          ** 
efe0: 74 65 73 74 20 63 61 73 65 20 6d 69 73 63 32 2e  test case misc2.
eff0: 32 2e 32 29 20 2d 20 69 74 20 61 6c 77 61 79 73  2.2) - it always
f000: 20 65 76 61 6c 75 61 74 65 73 20 74 6f 20 4e 55   evaluates to NU
f010: 4c 4c 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f  LL..          */
f020: 0a 20 20 20 20 20 20 20 20 20 20 4e 61 6d 65 43  .          NameC
f030: 6f 6e 74 65 78 74 20 73 4e 43 3b 0a 20 20 20 20  ontext sNC;.    
f040: 20 20 20 20 20 20 45 78 70 72 20 2a 70 20 3d 20        Expr *p = 
f050: 70 53 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 69 43  pS->pEList->a[iC
f060: 6f 6c 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20  ol].pExpr;.     
f070: 20 20 20 20 20 73 4e 43 2e 70 53 72 63 4c 69 73       sNC.pSrcLis
f080: 74 20 3d 20 70 53 2d 3e 70 53 72 63 3b 0a 20 20  t = pS->pSrc;.  
f090: 20 20 20 20 20 20 20 20 73 4e 43 2e 70 4e 65 78          sNC.pNex
f0a0: 74 20 3d 20 70 4e 43 3b 0a 20 20 20 20 20 20 20  t = pNC;.       
f0b0: 20 20 20 73 4e 43 2e 70 50 61 72 73 65 20 3d 20     sNC.pParse = 
f0c0: 70 4e 43 2d 3e 70 50 61 72 73 65 3b 0a 20 20 20  pNC->pParse;.   
f0d0: 20 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20 63         zType = c
f0e0: 6f 6c 75 6d 6e 54 79 70 65 28 26 73 4e 43 2c 20  olumnType(&sNC, 
f0f0: 70 2c 26 7a 4f 72 69 67 44 62 2c 26 7a 4f 72 69  p,&zOrigDb,&zOri
f100: 67 54 61 62 2c 26 7a 4f 72 69 67 43 6f 6c 29 3b  gTab,&zOrigCol);
f110: 20 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20   .        }.    
f120: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
f130: 20 2f 2a 20 41 20 72 65 61 6c 20 74 61 62 6c 65   /* A real table
f140: 20 6f 72 20 61 20 43 54 45 20 74 61 62 6c 65 20   or a CTE table 
f150: 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  */.        asser
f160: 74 28 20 21 70 53 20 29 3b 0a 23 69 66 64 65 66  t( !pS );.#ifdef
f170: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43   SQLITE_ENABLE_C
f180: 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41 54 41 0a 20  OLUMN_METADATA. 
f190: 20 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3c         if( iCol<
f1a0: 30 20 29 20 69 43 6f 6c 20 3d 20 70 54 61 62 2d  0 ) iCol = pTab-
f1b0: 3e 69 50 4b 65 79 3b 0a 20 20 20 20 20 20 20 20  >iPKey;.        
f1c0: 61 73 73 65 72 74 28 20 69 43 6f 6c 3d 3d 58 4e  assert( iCol==XN
f1d0: 5f 52 4f 57 49 44 20 7c 7c 20 28 69 43 6f 6c 3e  _ROWID || (iCol>
f1e0: 3d 30 20 26 26 20 69 43 6f 6c 3c 70 54 61 62 2d  =0 && iCol<pTab-
f1f0: 3e 6e 43 6f 6c 29 20 29 3b 0a 20 20 20 20 20 20  >nCol) );.      
f200: 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 29 7b 0a    if( iCol<0 ){.
f210: 20 20 20 20 20 20 20 20 20 20 7a 54 79 70 65 20            zType 
f220: 3d 20 22 49 4e 54 45 47 45 52 22 3b 0a 20 20 20  = "INTEGER";.   
f230: 20 20 20 20 20 20 20 7a 4f 72 69 67 43 6f 6c 20         zOrigCol 
f240: 3d 20 22 72 6f 77 69 64 22 3b 0a 20 20 20 20 20  = "rowid";.     
f250: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
f260: 20 20 20 20 7a 4f 72 69 67 43 6f 6c 20 3d 20 70      zOrigCol = p
f270: 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e  Tab->aCol[iCol].
f280: 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 20  zName;.         
f290: 20 7a 54 79 70 65 20 3d 20 73 71 6c 69 74 65 33   zType = sqlite3
f2a0: 43 6f 6c 75 6d 6e 54 79 70 65 28 26 70 54 61 62  ColumnType(&pTab
f2b0: 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2c 30 29 3b  ->aCol[iCol],0);
f2c0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
f2d0: 20 20 20 7a 4f 72 69 67 54 61 62 20 3d 20 70 54     zOrigTab = pT
f2e0: 61 62 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20  ab->zName;.     
f2f0: 20 20 20 69 66 28 20 70 4e 43 2d 3e 70 50 61 72     if( pNC->pPar
f300: 73 65 20 26 26 20 70 54 61 62 2d 3e 70 53 63 68  se && pTab->pSch
f310: 65 6d 61 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ema ){.         
f320: 20 69 6e 74 20 69 44 62 20 3d 20 73 71 6c 69 74   int iDb = sqlit
f330: 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28  e3SchemaToIndex(
f340: 70 4e 43 2d 3e 70 50 61 72 73 65 2d 3e 64 62 2c  pNC->pParse->db,
f350: 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b   pTab->pSchema);
f360: 0a 20 20 20 20 20 20 20 20 20 20 7a 4f 72 69 67  .          zOrig
f370: 44 62 20 3d 20 70 4e 43 2d 3e 70 50 61 72 73 65  Db = pNC->pParse
f380: 2d 3e 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a  ->db->aDb[iDb].z
f390: 44 62 53 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20  DbSName;.       
f3a0: 20 7d 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 20   }.#else.       
f3b0: 20 61 73 73 65 72 74 28 20 69 43 6f 6c 3d 3d 58   assert( iCol==X
f3c0: 4e 5f 52 4f 57 49 44 20 7c 7c 20 28 69 43 6f 6c  N_ROWID || (iCol
f3d0: 3e 3d 30 20 26 26 20 69 43 6f 6c 3c 70 54 61 62  >=0 && iCol<pTab
f3e0: 2d 3e 6e 43 6f 6c 29 20 29 3b 0a 20 20 20 20 20  ->nCol) );.     
f3f0: 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 29 7b     if( iCol<0 ){
f400: 0a 20 20 20 20 20 20 20 20 20 20 7a 54 79 70 65  .          zType
f410: 20 3d 20 22 49 4e 54 45 47 45 52 22 3b 0a 20 20   = "INTEGER";.  
f420: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
f430: 20 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20 73         zType = s
f440: 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 54 79 70 65  qlite3ColumnType
f450: 28 26 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f  (&pTab->aCol[iCo
f460: 6c 5d 2c 30 29 3b 0a 20 20 20 20 20 20 20 20 7d  l],0);.        }
f470: 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 7d 0a  .#endif.      }.
f480: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
f490: 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54   }.#ifndef SQLIT
f4a0: 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a  E_OMIT_SUBQUERY.
f4b0: 20 20 20 20 63 61 73 65 20 54 4b 5f 53 45 4c 45      case TK_SELE
f4c0: 43 54 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 54  CT: {.      /* T
f4d0: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  he expression is
f4e0: 20 61 20 73 75 62 2d 73 65 6c 65 63 74 2e 20 52   a sub-select. R
f4f0: 65 74 75 72 6e 20 74 68 65 20 64 65 63 6c 61 72  eturn the declar
f500: 61 74 69 6f 6e 20 74 79 70 65 20 61 6e 64 0a 20  ation type and. 
f510: 20 20 20 20 20 2a 2a 20 6f 72 69 67 69 6e 20 69       ** origin i
f520: 6e 66 6f 20 66 6f 72 20 74 68 65 20 73 69 6e 67  nfo for the sing
f530: 6c 65 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65  le column in the
f540: 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20 74   result set of t
f550: 68 65 20 53 45 4c 45 43 54 0a 20 20 20 20 20 20  he SELECT.      
f560: 2a 2a 20 73 74 61 74 65 6d 65 6e 74 2e 0a 20 20  ** statement..  
f570: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 4e 61 6d      */.      Nam
f580: 65 43 6f 6e 74 65 78 74 20 73 4e 43 3b 0a 20 20  eContext sNC;.  
f590: 20 20 20 20 53 65 6c 65 63 74 20 2a 70 53 20 3d      Select *pS =
f5a0: 20 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63   pExpr->x.pSelec
f5b0: 74 3b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70  t;.      Expr *p
f5c0: 20 3d 20 70 53 2d 3e 70 45 4c 69 73 74 2d 3e 61   = pS->pEList->a
f5d0: 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20  [0].pExpr;.     
f5e0: 20 61 73 73 65 72 74 28 20 45 78 70 72 48 61 73   assert( ExprHas
f5f0: 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
f600: 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b  EP_xIsSelect) );
f610: 0a 20 20 20 20 20 20 73 4e 43 2e 70 53 72 63 4c  .      sNC.pSrcL
f620: 69 73 74 20 3d 20 70 53 2d 3e 70 53 72 63 3b 0a  ist = pS->pSrc;.
f630: 20 20 20 20 20 20 73 4e 43 2e 70 4e 65 78 74 20        sNC.pNext 
f640: 3d 20 70 4e 43 3b 0a 20 20 20 20 20 20 73 4e 43  = pNC;.      sNC
f650: 2e 70 50 61 72 73 65 20 3d 20 70 4e 43 2d 3e 70  .pParse = pNC->p
f660: 50 61 72 73 65 3b 0a 20 20 20 20 20 20 7a 54 79  Parse;.      zTy
f670: 70 65 20 3d 20 63 6f 6c 75 6d 6e 54 79 70 65 28  pe = columnType(
f680: 26 73 4e 43 2c 20 70 2c 20 26 7a 4f 72 69 67 44  &sNC, p, &zOrigD
f690: 62 2c 20 26 7a 4f 72 69 67 54 61 62 2c 20 26 7a  b, &zOrigTab, &z
f6a0: 4f 72 69 67 43 6f 6c 29 3b 20 0a 20 20 20 20 20  OrigCol); .     
f6b0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65   break;.    }.#e
f6c0: 6e 64 69 66 0a 20 20 7d 0a 0a 23 69 66 64 65 66  ndif.  }..#ifdef
f6d0: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43   SQLITE_ENABLE_C
f6e0: 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41 54 41 20 20  OLUMN_METADATA  
f6f0: 0a 20 20 69 66 28 20 70 7a 4f 72 69 67 44 62 20  .  if( pzOrigDb 
f700: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
f710: 7a 4f 72 69 67 54 61 62 20 26 26 20 70 7a 4f 72  zOrigTab && pzOr
f720: 69 67 43 6f 6c 20 29 3b 0a 20 20 20 20 2a 70 7a  igCol );.    *pz
f730: 4f 72 69 67 44 62 20 3d 20 7a 4f 72 69 67 44 62  OrigDb = zOrigDb
f740: 3b 0a 20 20 20 20 2a 70 7a 4f 72 69 67 54 61 62  ;.    *pzOrigTab
f750: 20 3d 20 7a 4f 72 69 67 54 61 62 3b 0a 20 20 20   = zOrigTab;.   
f760: 20 2a 70 7a 4f 72 69 67 43 6f 6c 20 3d 20 7a 4f   *pzOrigCol = zO
f770: 72 69 67 43 6f 6c 3b 0a 20 20 7d 0a 23 65 6e 64  rigCol;.  }.#end
f780: 69 66 0a 20 20 72 65 74 75 72 6e 20 7a 54 79 70  if.  return zTyp
f790: 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  e;.}../*.** Gene
f7a0: 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 77  rate code that w
f7b0: 69 6c 6c 20 74 65 6c 6c 20 74 68 65 20 56 44 42  ill tell the VDB
f7c0: 45 20 74 68 65 20 64 65 63 6c 61 72 61 74 69 6f  E the declaratio
f7d0: 6e 20 74 79 70 65 73 20 6f 66 20 63 6f 6c 75 6d  n types of colum
f7e0: 6e 73 0a 2a 2a 20 69 6e 20 74 68 65 20 72 65 73  ns.** in the res
f7f0: 75 6c 74 20 73 65 74 2e 0a 2a 2f 0a 73 74 61 74  ult set..*/.stat
f800: 69 63 20 76 6f 69 64 20 67 65 6e 65 72 61 74 65  ic void generate
f810: 43 6f 6c 75 6d 6e 54 79 70 65 73 28 0a 20 20 50  ColumnTypes(.  P
f820: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
f830: 20 20 20 2f 2a 20 50 61 72 73 65 72 20 63 6f 6e     /* Parser con
f840: 74 65 78 74 20 2a 2f 0a 20 20 53 72 63 4c 69 73  text */.  SrcLis
f850: 74 20 2a 70 54 61 62 4c 69 73 74 2c 20 20 2f 2a  t *pTabList,  /*
f860: 20 4c 69 73 74 20 6f 66 20 74 61 62 6c 65 73 20   List of tables 
f870: 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
f880: 45 4c 69 73 74 20 20 20 20 2f 2a 20 45 78 70 72  EList    /* Expr
f890: 65 73 73 69 6f 6e 73 20 64 65 66 69 6e 69 6e 67  essions defining
f8a0: 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20   the result set 
f8b0: 2a 2f 0a 29 7b 0a 23 69 66 6e 64 65 66 20 53 51  */.){.#ifndef SQ
f8c0: 4c 49 54 45 5f 4f 4d 49 54 5f 44 45 43 4c 54 59  LITE_OMIT_DECLTY
f8d0: 50 45 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  PE.  Vdbe *v = p
f8e0: 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
f8f0: 69 6e 74 20 69 3b 0a 20 20 4e 61 6d 65 43 6f 6e  int i;.  NameCon
f900: 74 65 78 74 20 73 4e 43 3b 0a 20 20 73 4e 43 2e  text sNC;.  sNC.
f910: 70 53 72 63 4c 69 73 74 20 3d 20 70 54 61 62 4c  pSrcList = pTabL
f920: 69 73 74 3b 0a 20 20 73 4e 43 2e 70 50 61 72 73  ist;.  sNC.pPars
f930: 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20 73 4e  e = pParse;.  sN
f940: 43 2e 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 66  C.pNext = 0;.  f
f950: 6f 72 28 69 3d 30 3b 20 69 3c 70 45 4c 69 73 74  or(i=0; i<pEList
f960: 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20  ->nExpr; i++){. 
f970: 20 20 20 45 78 70 72 20 2a 70 20 3d 20 70 45 4c     Expr *p = pEL
f980: 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b  ist->a[i].pExpr;
f990: 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
f9a0: 2a 7a 54 79 70 65 3b 0a 23 69 66 64 65 66 20 53  *zType;.#ifdef S
f9b0: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c  QLITE_ENABLE_COL
f9c0: 55 4d 4e 5f 4d 45 54 41 44 41 54 41 0a 20 20 20  UMN_METADATA.   
f9d0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f 72   const char *zOr
f9e0: 69 67 44 62 20 3d 20 30 3b 0a 20 20 20 20 63 6f  igDb = 0;.    co
f9f0: 6e 73 74 20 63 68 61 72 20 2a 7a 4f 72 69 67 54  nst char *zOrigT
fa00: 61 62 20 3d 20 30 3b 0a 20 20 20 20 63 6f 6e 73  ab = 0;.    cons
fa10: 74 20 63 68 61 72 20 2a 7a 4f 72 69 67 43 6f 6c  t char *zOrigCol
fa20: 20 3d 20 30 3b 0a 20 20 20 20 7a 54 79 70 65 20   = 0;.    zType 
fa30: 3d 20 63 6f 6c 75 6d 6e 54 79 70 65 28 26 73 4e  = columnType(&sN
fa40: 43 2c 20 70 2c 20 26 7a 4f 72 69 67 44 62 2c 20  C, p, &zOrigDb, 
fa50: 26 7a 4f 72 69 67 54 61 62 2c 20 26 7a 4f 72 69  &zOrigTab, &zOri
fa60: 67 43 6f 6c 29 3b 0a 0a 20 20 20 20 2f 2a 20 54  gCol);..    /* T
fa70: 68 65 20 76 64 62 65 20 6d 75 73 74 20 6d 61 6b  he vdbe must mak
fa80: 65 20 69 74 73 20 6f 77 6e 20 63 6f 70 79 20 6f  e its own copy o
fa90: 66 20 74 68 65 20 63 6f 6c 75 6d 6e 2d 74 79 70  f the column-typ
faa0: 65 20 61 6e 64 20 6f 74 68 65 72 20 0a 20 20 20  e and other .   
fab0: 20 2a 2a 20 63 6f 6c 75 6d 6e 20 73 70 65 63 69   ** column speci
fac0: 66 69 63 20 73 74 72 69 6e 67 73 2c 20 69 6e 20  fic strings, in 
fad0: 63 61 73 65 20 74 68 65 20 73 63 68 65 6d 61 20  case the schema 
fae0: 69 73 20 72 65 73 65 74 20 62 65 66 6f 72 65 20  is reset before 
faf0: 74 68 69 73 0a 20 20 20 20 2a 2a 20 76 69 72 74  this.    ** virt
fb00: 75 61 6c 20 6d 61 63 68 69 6e 65 20 69 73 20 64  ual machine is d
fb10: 65 6c 65 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20  eleted..    */. 
fb20: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65     sqlite3VdbeSe
fb30: 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43  tColName(v, i, C
fb40: 4f 4c 4e 41 4d 45 5f 44 41 54 41 42 41 53 45 2c  OLNAME_DATABASE,
fb50: 20 7a 4f 72 69 67 44 62 2c 20 53 51 4c 49 54 45   zOrigDb, SQLITE
fb60: 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20  _TRANSIENT);.   
fb70: 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43   sqlite3VdbeSetC
fb80: 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c  olName(v, i, COL
fb90: 4e 41 4d 45 5f 54 41 42 4c 45 2c 20 7a 4f 72 69  NAME_TABLE, zOri
fba0: 67 54 61 62 2c 20 53 51 4c 49 54 45 5f 54 52 41  gTab, SQLITE_TRA
fbb0: 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20 73 71 6c  NSIENT);.    sql
fbc0: 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61  ite3VdbeSetColNa
fbd0: 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45  me(v, i, COLNAME
fbe0: 5f 43 4f 4c 55 4d 4e 2c 20 7a 4f 72 69 67 43 6f  _COLUMN, zOrigCo
fbf0: 6c 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49  l, SQLITE_TRANSI
fc00: 45 4e 54 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20  ENT);.#else.    
fc10: 7a 54 79 70 65 20 3d 20 63 6f 6c 75 6d 6e 54 79  zType = columnTy
fc20: 70 65 28 26 73 4e 43 2c 20 70 2c 20 30 2c 20 30  pe(&sNC, p, 0, 0
fc30: 2c 20 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  , 0);.#endif.   
fc40: 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43   sqlite3VdbeSetC
fc50: 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c  olName(v, i, COL
fc60: 4e 41 4d 45 5f 44 45 43 4c 54 59 50 45 2c 20 7a  NAME_DECLTYPE, z
fc70: 54 79 70 65 2c 20 53 51 4c 49 54 45 5f 54 52 41  Type, SQLITE_TRA
fc80: 4e 53 49 45 4e 54 29 3b 0a 20 20 7d 0a 23 65 6e  NSIENT);.  }.#en
fc90: 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28  dif /* !defined(
fca0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 45 43 4c  SQLITE_OMIT_DECL
fcb0: 54 59 50 45 29 20 2a 2f 0a 7d 0a 0a 0a 2f 2a 0a  TYPE) */.}.../*.
fcc0: 2a 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20 63  ** Compute the c
fcd0: 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 66 6f 72 20  olumn names for 
fce0: 61 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  a SELECT stateme
fcf0: 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 6e  nt..**.** The on
fd00: 6c 79 20 67 75 61 72 61 6e 74 65 65 20 74 68 61  ly guarantee tha
fd10: 74 20 53 51 4c 69 74 65 20 6d 61 6b 65 73 20 61  t SQLite makes a
fd20: 62 6f 75 74 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65  bout column name
fd30: 73 20 69 73 20 74 68 61 74 20 69 66 20 74 68 65  s is that if the
fd40: 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 68 61 73 20 61  .** column has a
fd50: 6e 20 41 53 20 63 6c 61 75 73 65 20 61 73 73 69  n AS clause assi
fd60: 67 6e 69 6e 67 20 69 74 20 61 20 6e 61 6d 65 2c  gning it a name,
fd70: 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20 74 68   that will be th
fd80: 65 20 6e 61 6d 65 20 75 73 65 64 2e 0a 2a 2a 20  e name used..** 
fd90: 54 68 61 74 20 69 73 20 74 68 65 20 6f 6e 6c 79  That is the only
fda0: 20 64 6f 63 75 6d 65 6e 74 65 64 20 67 75 61 72   documented guar
fdb0: 61 6e 74 65 65 2e 20 20 48 6f 77 65 76 65 72 2c  antee.  However,
fdc0: 20 63 6f 75 6e 74 6c 65 73 73 20 61 70 70 6c 69   countless appli
fdd0: 63 61 74 69 6f 6e 73 0a 2a 2a 20 64 65 76 65 6c  cations.** devel
fde0: 6f 70 65 64 20 6f 76 65 72 20 74 68 65 20 79 65  oped over the ye
fdf0: 61 72 73 20 68 61 76 65 20 6d 61 64 65 20 62 61  ars have made ba
fe00: 73 65 6c 65 73 73 20 61 73 73 75 6d 70 74 69 6f  seless assumptio
fe10: 6e 73 20 61 62 6f 75 74 20 63 6f 6c 75 6d 6e 20  ns about column 
fe20: 6e 61 6d 65 73 0a 2a 2a 20 61 6e 64 20 77 69 6c  names.** and wil
fe30: 6c 20 62 72 65 61 6b 20 69 66 20 74 68 6f 73 65  l break if those
fe40: 20 61 73 73 75 6d 70 74 69 6f 6e 73 20 63 68 61   assumptions cha
fe50: 6e 67 65 73 2e 20 20 48 65 6e 63 65 2c 20 75 73  nges.  Hence, us
fe60: 65 20 65 78 74 72 65 6d 65 20 63 61 75 74 69 6f  e extreme cautio
fe70: 6e 0a 2a 2a 20 77 68 65 6e 20 6d 6f 64 69 66 79  n.** when modify
fe80: 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ing this routine
fe90: 20 74 6f 20 61 76 6f 69 64 20 62 72 65 61 6b 69   to avoid breaki
fea0: 6e 67 20 6c 65 67 61 63 79 2e 0a 2a 2a 0a 2a 2a  ng legacy..**.**
feb0: 20 53 65 65 20 41 6c 73 6f 3a 20 73 71 6c 69 74   See Also: sqlit
fec0: 65 33 43 6f 6c 75 6d 6e 73 46 72 6f 6d 45 78 70  e3ColumnsFromExp
fed0: 72 4c 69 73 74 28 29 0a 2a 2a 0a 2a 2a 20 54 68  rList().**.** Th
fee0: 65 20 50 52 41 47 4d 41 20 73 68 6f 72 74 5f 63  e PRAGMA short_c
fef0: 6f 6c 75 6d 6e 5f 6e 61 6d 65 73 20 61 6e 64 20  olumn_names and 
ff00: 50 52 41 47 4d 41 20 66 75 6c 6c 5f 63 6f 6c 75  PRAGMA full_colu
ff10: 6d 6e 5f 6e 61 6d 65 73 20 73 65 74 74 69 6e 67  mn_names setting
ff20: 73 20 61 72 65 0a 2a 2a 20 64 65 70 72 65 63 61  s are.** depreca
ff30: 74 65 64 2e 20 20 54 68 65 20 64 65 66 61 75 6c  ted.  The defaul
ff40: 74 20 73 65 74 74 69 6e 67 20 69 73 20 73 68 6f  t setting is sho
ff50: 72 74 3d 4f 4e 2c 20 66 75 6c 6c 3d 4f 46 46 2e  rt=ON, full=OFF.
ff60: 20 20 39 39 2e 39 25 20 6f 66 20 61 6c 6c 0a 2a    99.9% of all.*
ff70: 2a 20 61 70 70 6c 69 63 61 74 69 6f 6e 73 20 73  * applications s
ff80: 68 6f 75 6c 64 20 6f 70 65 72 61 74 65 20 74 68  hould operate th
ff90: 69 73 20 77 61 79 2e 20 20 4e 65 76 65 72 74 68  is way.  Neverth
ffa0: 65 6c 65 73 73 2c 20 77 65 20 6e 65 65 64 20 74  eless, we need t
ffb0: 6f 20 73 75 70 70 6f 72 74 20 74 68 65 0a 2a 2a  o support the.**
ffc0: 20 6f 74 68 65 72 20 6d 6f 64 65 73 20 66 6f 72   other modes for
ffd0: 20 6c 65 67 61 63 79 3a 0a 2a 2a 0a 2a 2a 20 20   legacy:.**.**  
ffe0: 20 20 73 68 6f 72 74 3d 4f 46 46 2c 20 66 75 6c    short=OFF, ful
fff0: 6c 3d 4f 46 46 3a 20 20 20 20 20 20 43 6f 6c 75  l=OFF:      Colu
10000 6d 6e 20 6e 61 6d 65 20 69 73 20 74 68 65 20 74  mn name is the t
10010 65 78 74 20 6f 66 20 74 68 65 20 65 78 70 72 65  ext of the expre
10020 73 73 69 6f 6e 20 68 61 73 20 69 74 0a 2a 2a 20  ssion has it.** 
10030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10040 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 72 69               ori
10050 67 69 6e 61 6c 6c 79 20 61 70 70 65 61 72 73 20  ginally appears 
10060 69 6e 20 74 68 65 20 53 45 4c 45 43 54 20 73 74  in the SELECT st
10070 61 74 65 6d 65 6e 74 2e 20 20 49 6e 0a 2a 2a 20  atement.  In.** 
10080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10090 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 74 68               oth
100a0 65 72 20 77 6f 72 64 73 2c 20 74 68 65 20 7a 53  er words, the zS
100b0 70 61 6e 20 6f 66 20 74 68 65 20 72 65 73 75 6c  pan of the resul
100c0 74 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a  t expression..**
100d0 0a 2a 2a 20 20 20 20 73 68 6f 72 74 3d 4f 4e 2c  .**    short=ON,
100e0 20 66 75 6c 6c 3d 4f 46 46 3a 20 20 20 20 20 20   full=OFF:      
100f0 20 28 54 68 69 73 20 69 73 20 74 68 65 20 64 65   (This is the de
10100 66 61 75 6c 74 20 73 65 74 74 69 6e 67 29 2e 20  fault setting). 
10110 20 49 66 20 74 68 65 20 72 65 73 75 6c 74 0a 2a   If the result.*
10120 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
10130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
10140 65 66 65 72 73 20 64 69 72 65 63 74 6c 79 20 74  efers directly t
10150 6f 20 61 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e  o a table column
10160 2c 20 74 68 65 6e 20 74 68 65 0a 2a 2a 20 20 20  , then the.**   
10170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10180 20 20 20 20 20 20 20 20 20 20 20 72 65 73 75 6c             resul
10190 74 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 69 73  t column name is
101a0 20 6a 75 73 74 20 74 68 65 20 74 61 62 6c 65 20   just the table 
101b0 63 6f 6c 75 6d 6e 0a 2a 2a 20 20 20 20 20 20 20  column.**       
101c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
101d0 20 20 20 20 20 20 20 6e 61 6d 65 3a 20 43 4f 4c         name: COL
101e0 55 4d 4e 2e 20 20 4f 74 68 65 72 77 69 73 65 20  UMN.  Otherwise 
101f0 75 73 65 20 7a 53 70 61 6e 2e 0a 2a 2a 0a 2a 2a  use zSpan..**.**
10200 20 20 20 20 66 75 6c 6c 3d 4f 4e 2c 20 73 68 6f      full=ON, sho
10210 72 74 3d 41 4e 59 3a 20 20 20 20 20 20 20 49 66  rt=ANY:       If
10220 20 74 68 65 20 72 65 73 75 6c 74 20 72 65 66 65   the result refe
10230 72 73 20 64 69 72 65 63 74 6c 79 20 74 6f 20 61  rs directly to a
10240 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 2c 0a 2a   table column,.*
10250 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
10260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74                 t
10270 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74 20 63  hen the result c
10280 6f 6c 75 6d 6e 20 6e 61 6d 65 20 77 69 74 68 20  olumn name with 
10290 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 0a 2a  the table name.*
102a0 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
102b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
102c0 72 65 66 69 78 2c 20 65 78 3a 20 54 41 42 4c 45  refix, ex: TABLE
102d0 2e 43 4f 4c 55 4d 4e 2e 20 20 4f 74 68 65 72 77  .COLUMN.  Otherw
102e0 69 73 65 20 75 73 65 20 7a 53 70 61 6e 2e 0a 2a  ise use zSpan..*
102f0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 67 65  /.static void ge
10300 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65  nerateColumnName
10310 73 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  s(.  Parse *pPar
10320 73 65 2c 20 20 20 20 20 20 2f 2a 20 50 61 72 73  se,      /* Pars
10330 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  er context */.  
10340 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 20  Select *pSelect 
10350 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20      /* Generate 
10360 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 66 6f 72  column names for
10370 20 74 68 69 73 20 53 45 4c 45 43 54 20 73 74 61   this SELECT sta
10380 74 65 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 56  tement */.){.  V
10390 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
103a0 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b  >pVdbe;.  int i;
103b0 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a  .  Table *pTab;.
103c0 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c    SrcList *pTabL
103d0 69 73 74 3b 0a 20 20 45 78 70 72 4c 69 73 74 20  ist;.  ExprList 
103e0 2a 70 45 4c 69 73 74 3b 0a 20 20 73 71 6c 69 74  *pEList;.  sqlit
103f0 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
10400 3e 64 62 3b 0a 20 20 69 6e 74 20 66 75 6c 6c 4e  >db;.  int fullN
10410 61 6d 65 3b 20 20 20 20 2f 2a 20 54 41 42 4c 45  ame;    /* TABLE
10420 2e 43 4f 4c 55 4d 4e 20 69 66 20 6e 6f 20 41 53  .COLUMN if no AS
10430 20 63 6c 61 75 73 65 20 61 6e 64 20 69 73 20 61   clause and is a
10440 20 64 69 72 65 63 74 20 74 61 62 6c 65 20 72 65   direct table re
10450 66 20 2a 2f 0a 20 20 69 6e 74 20 73 72 63 4e 61  f */.  int srcNa
10460 6d 65 3b 20 20 20 20 20 2f 2a 20 43 4f 4c 55 4d  me;     /* COLUM
10470 4e 20 6f 72 20 54 41 42 4c 45 2e 43 4f 4c 55 4d  N or TABLE.COLUM
10480 4e 20 69 66 20 6e 6f 20 41 53 20 63 6c 61 75 73  N if no AS claus
10490 65 20 61 6e 64 20 69 73 20 64 69 72 65 63 74 20  e and is direct 
104a0 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  */..#ifndef SQLI
104b0 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a  TE_OMIT_EXPLAIN.
104c0 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20    /* If this is 
104d0 61 6e 20 45 58 50 4c 41 49 4e 2c 20 73 6b 69 70  an EXPLAIN, skip
104e0 20 74 68 69 73 20 73 74 65 70 20 2a 2f 0a 20 20   this step */.  
104f0 69 66 28 20 70 50 61 72 73 65 2d 3e 65 78 70 6c  if( pParse->expl
10500 61 69 6e 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ain ){.    retur
10510 6e 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  n;.  }.#endif.. 
10520 20 69 66 28 20 70 50 61 72 73 65 2d 3e 63 6f 6c   if( pParse->col
10530 4e 61 6d 65 73 53 65 74 20 29 20 72 65 74 75 72  NamesSet ) retur
10540 6e 3b 0a 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 6e  n;.  /* Column n
10550 61 6d 65 73 20 61 72 65 20 64 65 74 65 72 6d 69  ames are determi
10560 6e 65 64 20 62 79 20 74 68 65 20 6c 65 66 74 2d  ned by the left-
10570 6d 6f 73 74 20 74 65 72 6d 20 6f 66 20 61 20 63  most term of a c
10580 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 20 2a  ompound select *
10590 2f 0a 20 20 77 68 69 6c 65 28 20 70 53 65 6c 65  /.  while( pSele
105a0 63 74 2d 3e 70 50 72 69 6f 72 20 29 20 70 53 65  ct->pPrior ) pSe
105b0 6c 65 63 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e  lect = pSelect->
105c0 70 50 72 69 6f 72 3b 0a 20 20 53 45 4c 45 43 54  pPrior;.  SELECT
105d0 54 52 41 43 45 28 31 2c 70 50 61 72 73 65 2c 70  TRACE(1,pParse,p
105e0 53 65 6c 65 63 74 2c 28 22 67 65 6e 65 72 61 74  Select,("generat
105f0 69 6e 67 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73  ing column names
10600 5c 6e 22 29 29 3b 0a 20 20 70 54 61 62 4c 69 73  \n"));.  pTabLis
10610 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70 53 72  t = pSelect->pSr
10620 63 3b 0a 20 20 70 45 4c 69 73 74 20 3d 20 70 53  c;.  pEList = pS
10630 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 3b 0a 20  elect->pEList;. 
10640 20 61 73 73 65 72 74 28 20 76 21 3d 30 20 29 3b   assert( v!=0 );
10650 0a 20 20 61 73 73 65 72 74 28 20 70 54 61 62 4c  .  assert( pTabL
10660 69 73 74 21 3d 30 20 29 3b 0a 20 20 70 50 61 72  ist!=0 );.  pPar
10670 73 65 2d 3e 63 6f 6c 4e 61 6d 65 73 53 65 74 20  se->colNamesSet 
10680 3d 20 31 3b 0a 20 20 66 75 6c 6c 4e 61 6d 65 20  = 1;.  fullName 
10690 3d 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20 53  = (db->flags & S
106a0 51 4c 49 54 45 5f 46 75 6c 6c 43 6f 6c 4e 61 6d  QLITE_FullColNam
106b0 65 73 29 21 3d 30 3b 0a 20 20 73 72 63 4e 61 6d  es)!=0;.  srcNam
106c0 65 20 3d 20 28 64 62 2d 3e 66 6c 61 67 73 20 26  e = (db->flags &
106d0 20 53 51 4c 49 54 45 5f 53 68 6f 72 74 43 6f 6c   SQLITE_ShortCol
106e0 4e 61 6d 65 73 29 21 3d 30 20 7c 7c 20 66 75 6c  Names)!=0 || ful
106f0 6c 4e 61 6d 65 3b 0a 20 20 73 71 6c 69 74 65 33  lName;.  sqlite3
10700 56 64 62 65 53 65 74 4e 75 6d 43 6f 6c 73 28 76  VdbeSetNumCols(v
10710 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29  , pEList->nExpr)
10720 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
10730 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b  EList->nExpr; i+
10740 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 20  +){.    Expr *p 
10750 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70  = pEList->a[i].p
10760 45 78 70 72 3b 0a 0a 20 20 20 20 61 73 73 65 72  Expr;..    asser
10770 74 28 20 70 21 3d 30 20 29 3b 0a 20 20 20 20 61  t( p!=0 );.    a
10780 73 73 65 72 74 28 20 70 2d 3e 6f 70 21 3d 54 4b  ssert( p->op!=TK
10790 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 29 3b 20 20  _AGG_COLUMN );  
107a0 2f 2a 20 41 67 67 20 70 72 6f 63 65 73 73 69 6e  /* Agg processin
107b0 67 20 68 61 73 20 6e 6f 74 20 72 75 6e 20 79 65  g has not run ye
107c0 74 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28  t */.    assert(
107d0 20 70 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d   p->op!=TK_COLUM
107e0 4e 20 7c 7c 20 70 2d 3e 79 2e 70 54 61 62 21 3d  N || p->y.pTab!=
107f0 30 20 29 3b 20 2f 2a 20 43 6f 76 65 72 69 6e 67  0 ); /* Covering
10800 20 69 64 78 20 6e 6f 74 20 79 65 74 20 63 6f 64   idx not yet cod
10810 65 64 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 45  ed */.    if( pE
10820 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65  List->a[i].zName
10830 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 6e 20   ){.      /* An 
10840 41 53 20 63 6c 61 75 73 65 20 61 6c 77 61 79 73  AS clause always
10850 20 74 61 6b 65 73 20 66 69 72 73 74 20 70 72 69   takes first pri
10860 6f 72 69 74 79 20 2a 2f 0a 20 20 20 20 20 20 63  ority */.      c
10870 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 70 45 4c  har *zName = pEL
10880 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 3b  ist->a[i].zName;
10890 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
108a0 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20  beSetColName(v, 
108b0 69 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c  i, COLNAME_NAME,
108c0 20 7a 4e 61 6d 65 2c 20 53 51 4c 49 54 45 5f 54   zName, SQLITE_T
108d0 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20 7d  RANSIENT);.    }
108e0 65 6c 73 65 20 69 66 28 20 73 72 63 4e 61 6d 65  else if( srcName
108f0 20 26 26 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f   && p->op==TK_CO
10900 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 20 20 63 68  LUMN ){.      ch
10910 61 72 20 2a 7a 43 6f 6c 3b 0a 20 20 20 20 20 20  ar *zCol;.      
10920 69 6e 74 20 69 43 6f 6c 20 3d 20 70 2d 3e 69 43  int iCol = p->iC
10930 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 70 54 61  olumn;.      pTa
10940 62 20 3d 20 70 2d 3e 79 2e 70 54 61 62 3b 0a 20  b = p->y.pTab;. 
10950 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54 61       assert( pTa
10960 62 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66  b!=0 );.      if
10970 28 20 69 43 6f 6c 3c 30 20 29 20 69 43 6f 6c 20  ( iCol<0 ) iCol 
10980 3d 20 70 54 61 62 2d 3e 69 50 4b 65 79 3b 0a 20  = pTab->iPKey;. 
10990 20 20 20 20 20 61 73 73 65 72 74 28 20 69 43 6f       assert( iCo
109a0 6c 3d 3d 2d 31 20 7c 7c 20 28 69 43 6f 6c 3e 3d  l==-1 || (iCol>=
109b0 30 20 26 26 20 69 43 6f 6c 3c 70 54 61 62 2d 3e  0 && iCol<pTab->
109c0 6e 43 6f 6c 29 20 29 3b 0a 20 20 20 20 20 20 69  nCol) );.      i
109d0 66 28 20 69 43 6f 6c 3c 30 20 29 7b 0a 20 20 20  f( iCol<0 ){.   
109e0 20 20 20 20 20 7a 43 6f 6c 20 3d 20 22 72 6f 77       zCol = "row
109f0 69 64 22 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  id";.      }else
10a00 7b 0a 20 20 20 20 20 20 20 20 7a 43 6f 6c 20 3d  {.        zCol =
10a10 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c   pTab->aCol[iCol
10a20 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 7d  ].zName;.      }
10a30 0a 20 20 20 20 20 20 69 66 28 20 66 75 6c 6c 4e  .      if( fullN
10a40 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 20 20 63  ame ){.        c
10a50 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 30 3b 0a  har *zName = 0;.
10a60 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20          zName = 
10a70 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64  sqlite3MPrintf(d
10a80 62 2c 20 22 25 73 2e 25 73 22 2c 20 70 54 61 62  b, "%s.%s", pTab
10a90 2d 3e 7a 4e 61 6d 65 2c 20 7a 43 6f 6c 29 3b 0a  ->zName, zCol);.
10aa0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
10ab0 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c  dbeSetColName(v,
10ac0 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45   i, COLNAME_NAME
10ad0 2c 20 7a 4e 61 6d 65 2c 20 53 51 4c 49 54 45 5f  , zName, SQLITE_
10ae0 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 20 20  DYNAMIC);.      
10af0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
10b00 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c  qlite3VdbeSetCol
10b10 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41  Name(v, i, COLNA
10b20 4d 45 5f 4e 41 4d 45 2c 20 7a 43 6f 6c 2c 20 53  ME_NAME, zCol, S
10b30 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29  QLITE_TRANSIENT)
10b40 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
10b50 6c 73 65 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74  lse{.      const
10b60 20 63 68 61 72 20 2a 7a 20 3d 20 70 45 4c 69 73   char *z = pELis
10b70 74 2d 3e 61 5b 69 5d 2e 7a 53 70 61 6e 3b 0a 20  t->a[i].zSpan;. 
10b80 20 20 20 20 20 7a 20 3d 20 7a 3d 3d 30 20 3f 20       z = z==0 ? 
10b90 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64  sqlite3MPrintf(d
10ba0 62 2c 20 22 63 6f 6c 75 6d 6e 25 64 22 2c 20 69  b, "column%d", i
10bb0 2b 31 29 20 3a 20 73 71 6c 69 74 65 33 44 62 53  +1) : sqlite3DbS
10bc0 74 72 44 75 70 28 64 62 2c 20 7a 29 3b 0a 20 20  trDup(db, z);.  
10bd0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53      sqlite3VdbeS
10be0 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20  etColName(v, i, 
10bf0 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20 7a 2c  COLNAME_NAME, z,
10c00 20 53 51 4c 49 54 45 5f 44 59 4e 41 4d 49 43 29   SQLITE_DYNAMIC)
10c10 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 67 65  ;.    }.  }.  ge
10c20 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 54 79 70 65  nerateColumnType
10c30 73 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69  s(pParse, pTabLi
10c40 73 74 2c 20 70 45 4c 69 73 74 29 3b 0a 7d 0a 0a  st, pEList);.}..
10c50 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 6e 20 65  /*.** Given an e
10c60 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 20 28  xpression list (
10c70 77 68 69 63 68 20 69 73 20 72 65 61 6c 6c 79 20  which is really 
10c80 74 68 65 20 6c 69 73 74 20 6f 66 20 65 78 70 72  the list of expr
10c90 65 73 73 69 6f 6e 73 0a 2a 2a 20 74 68 61 74 20  essions.** that 
10ca0 66 6f 72 6d 20 74 68 65 20 72 65 73 75 6c 74 20  form the result 
10cb0 73 65 74 20 6f 66 20 61 20 53 45 4c 45 43 54 20  set of a SELECT 
10cc0 73 74 61 74 65 6d 65 6e 74 29 20 63 6f 6d 70 75  statement) compu
10cd0 74 65 20 61 70 70 72 6f 70 72 69 61 74 65 0a 2a  te appropriate.*
10ce0 2a 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 66  * column names f
10cf0 6f 72 20 61 20 74 61 62 6c 65 20 74 68 61 74 20  or a table that 
10d00 77 6f 75 6c 64 20 68 6f 6c 64 20 74 68 65 20 65  would hold the e
10d10 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e 0a  xpression list..
10d20 2a 2a 0a 2a 2a 20 41 6c 6c 20 63 6f 6c 75 6d 6e  **.** All column
10d30 20 6e 61 6d 65 73 20 77 69 6c 6c 20 62 65 20 75   names will be u
10d40 6e 69 71 75 65 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c  nique..**.** Onl
10d50 79 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d  y the column nam
10d60 65 73 20 61 72 65 20 63 6f 6d 70 75 74 65 64 2e  es are computed.
10d70 20 20 43 6f 6c 75 6d 6e 2e 7a 54 79 70 65 2c 20    Column.zType, 
10d80 43 6f 6c 75 6d 6e 2e 7a 43 6f 6c 6c 2c 0a 2a 2a  Column.zColl,.**
10d90 20 61 6e 64 20 6f 74 68 65 72 20 66 69 65 6c 64   and other field
10da0 73 20 6f 66 20 43 6f 6c 75 6d 6e 20 61 72 65 20  s of Column are 
10db0 7a 65 72 6f 65 64 2e 0a 2a 2a 0a 2a 2a 20 52 65  zeroed..**.** Re
10dc0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f  turn SQLITE_OK o
10dd0 6e 20 73 75 63 63 65 73 73 2e 20 20 49 66 20 61  n success.  If a
10de0 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69   memory allocati
10df0 6f 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  on error occurs,
10e00 0a 2a 2a 20 73 74 6f 72 65 20 4e 55 4c 4c 20 69  .** store NULL i
10e10 6e 20 2a 70 61 43 6f 6c 20 61 6e 64 20 30 20 69  n *paCol and 0 i
10e20 6e 20 2a 70 6e 43 6f 6c 20 61 6e 64 20 72 65 74  n *pnCol and ret
10e30 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
10e40 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 6e 6c 79  ..**.** The only
10e50 20 67 75 61 72 61 6e 74 65 65 20 74 68 61 74 20   guarantee that 
10e60 53 51 4c 69 74 65 20 6d 61 6b 65 73 20 61 62 6f  SQLite makes abo
10e70 75 74 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20  ut column names 
10e80 69 73 20 74 68 61 74 20 69 66 20 74 68 65 0a 2a  is that if the.*
10e90 2a 20 63 6f 6c 75 6d 6e 20 68 61 73 20 61 6e 20  * column has an 
10ea0 41 53 20 63 6c 61 75 73 65 20 61 73 73 69 67 6e  AS clause assign
10eb0 69 6e 67 20 69 74 20 61 20 6e 61 6d 65 2c 20 74  ing it a name, t
10ec0 68 61 74 20 77 69 6c 6c 20 62 65 20 74 68 65 20  hat will be the 
10ed0 6e 61 6d 65 20 75 73 65 64 2e 0a 2a 2a 20 54 68  name used..** Th
10ee0 61 74 20 69 73 20 74 68 65 20 6f 6e 6c 79 20 64  at is the only d
10ef0 6f 63 75 6d 65 6e 74 65 64 20 67 75 61 72 61 6e  ocumented guaran
10f00 74 65 65 2e 20 20 48 6f 77 65 76 65 72 2c 20 63  tee.  However, c
10f10 6f 75 6e 74 6c 65 73 73 20 61 70 70 6c 69 63 61  ountless applica
10f20 74 69 6f 6e 73 0a 2a 2a 20 64 65 76 65 6c 6f 70  tions.** develop
10f30 65 64 20 6f 76 65 72 20 74 68 65 20 79 65 61 72  ed over the year
10f40 73 20 68 61 76 65 20 6d 61 64 65 20 62 61 73 65  s have made base
10f50 6c 65 73 73 20 61 73 73 75 6d 70 74 69 6f 6e 73  less assumptions
10f60 20 61 62 6f 75 74 20 63 6f 6c 75 6d 6e 20 6e 61   about column na
10f70 6d 65 73 0a 2a 2a 20 61 6e 64 20 77 69 6c 6c 20  mes.** and will 
10f80 62 72 65 61 6b 20 69 66 20 74 68 6f 73 65 20 61  break if those a
10f90 73 73 75 6d 70 74 69 6f 6e 73 20 63 68 61 6e 67  ssumptions chang
10fa0 65 73 2e 20 20 48 65 6e 63 65 2c 20 75 73 65 20  es.  Hence, use 
10fb0 65 78 74 72 65 6d 65 20 63 61 75 74 69 6f 6e 0a  extreme caution.
10fc0 2a 2a 20 77 68 65 6e 20 6d 6f 64 69 66 79 69 6e  ** when modifyin
10fd0 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 74  g this routine t
10fe0 6f 20 61 76 6f 69 64 20 62 72 65 61 6b 69 6e 67  o avoid breaking
10ff0 20 6c 65 67 61 63 79 2e 0a 2a 2a 0a 2a 2a 20 53   legacy..**.** S
11000 65 65 20 41 6c 73 6f 3a 20 67 65 6e 65 72 61 74  ee Also: generat
11010 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 29 0a 2a  eColumnNames().*
11020 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 43 6f 6c  /.int sqlite3Col
11030 75 6d 6e 73 46 72 6f 6d 45 78 70 72 4c 69 73 74  umnsFromExprList
11040 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
11050 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50  e,          /* P
11060 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
11070 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45  /.  ExprList *pE
11080 4c 69 73 74 2c 20 20 20 20 20 20 20 2f 2a 20 45  List,       /* E
11090 78 70 72 20 6c 69 73 74 20 66 72 6f 6d 20 77 68  xpr list from wh
110a0 69 63 68 20 74 6f 20 64 65 72 69 76 65 20 63 6f  ich to derive co
110b0 6c 75 6d 6e 20 6e 61 6d 65 73 20 2a 2f 0a 20 20  lumn names */.  
110c0 69 31 36 20 2a 70 6e 43 6f 6c 2c 20 20 20 20 20  i16 *pnCol,     
110d0 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65          /* Write
110e0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63   the number of c
110f0 6f 6c 75 6d 6e 73 20 68 65 72 65 20 2a 2f 0a 20  olumns here */. 
11100 20 43 6f 6c 75 6d 6e 20 2a 2a 70 61 43 6f 6c 20   Column **paCol 
11110 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74           /* Writ
11120 65 20 74 68 65 20 6e 65 77 20 63 6f 6c 75 6d 6e  e the new column
11130 20 6c 69 73 74 20 68 65 72 65 20 2a 2f 0a 29 7b   list here */.){
11140 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
11150 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 20 2f   pParse->db;   /
11160 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  * Database conne
11170 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 69  ction */.  int i
11180 2c 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20  , j;            
11190 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
111a0 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 75 33 32  ounters */.  u32
111b0 20 63 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20   cnt;           
111c0 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
111d0 78 20 61 64 64 65 64 20 74 6f 20 6d 61 6b 65 20  x added to make 
111e0 74 68 65 20 6e 61 6d 65 20 75 6e 69 71 75 65 20  the name unique 
111f0 2a 2f 0a 20 20 43 6f 6c 75 6d 6e 20 2a 61 43 6f  */.  Column *aCo
11200 6c 2c 20 2a 70 43 6f 6c 3b 20 20 20 20 20 20 20  l, *pCol;       
11210 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20   /* For looping 
11220 6f 76 65 72 20 72 65 73 75 6c 74 20 63 6f 6c 75  over result colu
11230 6d 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f  mns */.  int nCo
11240 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
11250 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
11260 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65  f columns in the
11270 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 20   result set */. 
11280 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 20 20 20   char *zName;   
11290 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
112a0 43 6f 6c 75 6d 6e 20 6e 61 6d 65 20 2a 2f 0a 20  Column name */. 
112b0 20 69 6e 74 20 6e 4e 61 6d 65 3b 20 20 20 20 20   int nName;     
112c0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
112d0 53 69 7a 65 20 6f 66 20 6e 61 6d 65 20 69 6e 20  Size of name in 
112e0 7a 4e 61 6d 65 5b 5d 20 2a 2f 0a 20 20 48 61 73  zName[] */.  Has
112f0 68 20 68 74 3b 20 20 20 20 20 20 20 20 20 20 20  h ht;           
11300 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61 73 68           /* Hash
11310 20 74 61 62 6c 65 20 6f 66 20 63 6f 6c 75 6d 6e   table of column
11320 20 6e 61 6d 65 73 20 2a 2f 0a 0a 20 20 73 71 6c   names */..  sql
11330 69 74 65 33 48 61 73 68 49 6e 69 74 28 26 68 74  ite3HashInit(&ht
11340 29 3b 0a 20 20 69 66 28 20 70 45 4c 69 73 74 20  );.  if( pEList 
11350 29 7b 0a 20 20 20 20 6e 43 6f 6c 20 3d 20 70 45  ){.    nCol = pE
11360 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 20  List->nExpr;.   
11370 20 61 43 6f 6c 20 3d 20 73 71 6c 69 74 65 33 44   aCol = sqlite3D
11380 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20  bMallocZero(db, 
11390 73 69 7a 65 6f 66 28 61 43 6f 6c 5b 30 5d 29 2a  sizeof(aCol[0])*
113a0 6e 43 6f 6c 29 3b 0a 20 20 20 20 74 65 73 74 63  nCol);.    testc
113b0 61 73 65 28 20 61 43 6f 6c 3d 3d 30 20 29 3b 0a  ase( aCol==0 );.
113c0 20 20 20 20 69 66 28 20 6e 43 6f 6c 3e 33 32 37      if( nCol>327
113d0 36 37 20 29 20 6e 43 6f 6c 20 3d 20 33 32 37 36  67 ) nCol = 3276
113e0 37 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  7;.  }else{.    
113f0 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 61 43  nCol = 0;.    aC
11400 6f 6c 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 61 73  ol = 0;.  }.  as
11410 73 65 72 74 28 20 6e 43 6f 6c 3d 3d 28 69 31 36  sert( nCol==(i16
11420 29 6e 43 6f 6c 20 29 3b 0a 20 20 2a 70 6e 43 6f  )nCol );.  *pnCo
11430 6c 20 3d 20 6e 43 6f 6c 3b 0a 20 20 2a 70 61 43  l = nCol;.  *paC
11440 6f 6c 20 3d 20 61 43 6f 6c 3b 0a 0a 20 20 66 6f  ol = aCol;..  fo
11450 72 28 69 3d 30 2c 20 70 43 6f 6c 3d 61 43 6f 6c  r(i=0, pCol=aCol
11460 3b 20 69 3c 6e 43 6f 6c 20 26 26 20 21 64 62 2d  ; i<nCol && !db-
11470 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 3b 20 69  >mallocFailed; i
11480 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20  ++, pCol++){.   
11490 20 2f 2a 20 47 65 74 20 61 6e 20 61 70 70 72 6f   /* Get an appro
114a0 70 72 69 61 74 65 20 6e 61 6d 65 20 66 6f 72 20  priate name for 
114b0 74 68 65 20 63 6f 6c 75 6d 6e 0a 20 20 20 20 2a  the column.    *
114c0 2f 0a 20 20 20 20 69 66 28 20 28 7a 4e 61 6d 65  /.    if( (zName
114d0 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e   = pEList->a[i].
114e0 7a 4e 61 6d 65 29 21 3d 30 20 29 7b 0a 20 20 20  zName)!=0 ){.   
114f0 20 20 20 2f 2a 20 49 66 20 74 68 65 20 63 6f 6c     /* If the col
11500 75 6d 6e 20 63 6f 6e 74 61 69 6e 73 20 61 6e 20  umn contains an 
11510 22 41 53 20 3c 6e 61 6d 65 3e 22 20 70 68 72 61  "AS <name>" phra
11520 73 65 2c 20 75 73 65 20 3c 6e 61 6d 65 3e 20 61  se, use <name> a
11530 73 20 74 68 65 20 6e 61 6d 65 20 2a 2f 0a 20 20  s the name */.  
11540 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 45    }else{.      E
11550 78 70 72 20 2a 70 43 6f 6c 45 78 70 72 20 3d 20  xpr *pColExpr = 
11560 73 71 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43  sqlite3ExprSkipC
11570 6f 6c 6c 61 74 65 28 70 45 4c 69 73 74 2d 3e 61  ollate(pEList->a
11580 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20  [i].pExpr);.    
11590 20 20 77 68 69 6c 65 28 20 70 43 6f 6c 45 78 70    while( pColExp
115a0 72 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f 54 20 29 7b  r->op==TK_DOT ){
115b0 0a 20 20 20 20 20 20 20 20 70 43 6f 6c 45 78 70  .        pColExp
115c0 72 20 3d 20 70 43 6f 6c 45 78 70 72 2d 3e 70 52  r = pColExpr->pR
115d0 69 67 68 74 3b 0a 20 20 20 20 20 20 20 20 61 73  ight;.        as
115e0 73 65 72 74 28 20 70 43 6f 6c 45 78 70 72 21 3d  sert( pColExpr!=
115f0 30 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  0 );.      }.   
11600 20 20 20 61 73 73 65 72 74 28 20 70 43 6f 6c 45     assert( pColE
11610 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 41 47 47 5f  xpr->op!=TK_AGG_
11620 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20  COLUMN );.      
11630 69 66 28 20 70 43 6f 6c 45 78 70 72 2d 3e 6f 70  if( pColExpr->op
11640 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20  ==TK_COLUMN ){. 
11650 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 63 6f         /* For co
11660 6c 75 6d 6e 73 20 75 73 65 20 74 68 65 20 63 6f  lumns use the co
11670 6c 75 6d 6e 20 6e 61 6d 65 20 6e 61 6d 65 20 2a  lumn name name *
11680 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 43  /.        int iC
11690 6f 6c 20 3d 20 70 43 6f 6c 45 78 70 72 2d 3e 69  ol = pColExpr->i
116a0 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 20 20  Column;.        
116b0 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 43  Table *pTab = pC
116c0 6f 6c 45 78 70 72 2d 3e 79 2e 70 54 61 62 3b 0a  olExpr->y.pTab;.
116d0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
116e0 70 54 61 62 21 3d 30 20 29 3b 0a 20 20 20 20 20  pTab!=0 );.     
116f0 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 29 20     if( iCol<0 ) 
11700 69 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 69 50 4b  iCol = pTab->iPK
11710 65 79 3b 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d  ey;.        zNam
11720 65 20 3d 20 69 43 6f 6c 3e 3d 30 20 3f 20 70 54  e = iCol>=0 ? pT
11730 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a  ab->aCol[iCol].z
11740 4e 61 6d 65 20 3a 20 22 72 6f 77 69 64 22 3b 0a  Name : "rowid";.
11750 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
11760 70 43 6f 6c 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  pColExpr->op==TK
11770 5f 49 44 20 29 7b 0a 20 20 20 20 20 20 20 20 61  _ID ){.        a
11780 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50  ssert( !ExprHasP
11790 72 6f 70 65 72 74 79 28 70 43 6f 6c 45 78 70 72  roperty(pColExpr
117a0 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29  , EP_IntValue) )
117b0 3b 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20  ;.        zName 
117c0 3d 20 70 43 6f 6c 45 78 70 72 2d 3e 75 2e 7a 54  = pColExpr->u.zT
117d0 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 7d 65 6c 73  oken;.      }els
117e0 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 55 73  e{.        /* Us
117f0 65 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 74  e the original t
11800 65 78 74 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d  ext of the colum
11810 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 61 73 20  n expression as 
11820 69 74 73 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20  its name */.    
11830 20 20 20 20 7a 4e 61 6d 65 20 3d 20 70 45 4c 69      zName = pELi
11840 73 74 2d 3e 61 5b 69 5d 2e 7a 53 70 61 6e 3b 0a  st->a[i].zSpan;.
11850 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
11860 20 20 69 66 28 20 7a 4e 61 6d 65 20 29 7b 0a 20    if( zName ){. 
11870 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c       zName = sql
11880 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c  ite3DbStrDup(db,
11890 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 65 6c   zName);.    }el
118a0 73 65 7b 0a 20 20 20 20 20 20 7a 4e 61 6d 65 20  se{.      zName 
118b0 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66  = sqlite3MPrintf
118c0 28 64 62 2c 22 63 6f 6c 75 6d 6e 25 64 22 2c 69  (db,"column%d",i
118d0 2b 31 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  +1);.    }..    
118e0 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65  /* Make sure the
118f0 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 69 73 20   column name is 
11900 75 6e 69 71 75 65 2e 20 20 49 66 20 74 68 65 20  unique.  If the 
11910 6e 61 6d 65 20 69 73 20 6e 6f 74 20 75 6e 69 71  name is not uniq
11920 75 65 2c 0a 20 20 20 20 2a 2a 20 61 70 70 65 6e  ue,.    ** appen
11930 64 20 61 6e 20 69 6e 74 65 67 65 72 20 74 6f 20  d an integer to 
11940 74 68 65 20 6e 61 6d 65 20 73 6f 20 74 68 61 74  the name so that
11950 20 69 74 20 62 65 63 6f 6d 65 73 20 75 6e 69 71   it becomes uniq
11960 75 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63  ue..    */.    c
11970 6e 74 20 3d 20 30 3b 0a 20 20 20 20 77 68 69 6c  nt = 0;.    whil
11980 65 28 20 7a 4e 61 6d 65 20 26 26 20 73 71 6c 69  e( zName && sqli
11990 74 65 33 48 61 73 68 46 69 6e 64 28 26 68 74 2c  te3HashFind(&ht,
119a0 20 7a 4e 61 6d 65 29 21 3d 30 20 29 7b 0a 20 20   zName)!=0 ){.  
119b0 20 20 20 20 6e 4e 61 6d 65 20 3d 20 73 71 6c 69      nName = sqli
119c0 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 4e 61 6d  te3Strlen30(zNam
119d0 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 4e  e);.      if( nN
119e0 61 6d 65 3e 30 20 29 7b 0a 20 20 20 20 20 20 20  ame>0 ){.       
119f0 20 66 6f 72 28 6a 3d 6e 4e 61 6d 65 2d 31 3b 20   for(j=nName-1; 
11a00 6a 3e 30 20 26 26 20 73 71 6c 69 74 65 33 49 73  j>0 && sqlite3Is
11a10 64 69 67 69 74 28 7a 4e 61 6d 65 5b 6a 5d 29 3b  digit(zName[j]);
11a20 20 6a 2d 2d 29 7b 7d 0a 20 20 20 20 20 20 20 20   j--){}.        
11a30 69 66 28 20 7a 4e 61 6d 65 5b 6a 5d 3d 3d 27 3a  if( zName[j]==':
11a40 27 20 29 20 6e 4e 61 6d 65 20 3d 20 6a 3b 0a 20  ' ) nName = j;. 
11a50 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 4e 61       }.      zNa
11a60 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69  me = sqlite3MPri
11a70 6e 74 66 28 64 62 2c 20 22 25 2e 2a 7a 3a 25 75  ntf(db, "%.*z:%u
11a80 22 2c 20 6e 4e 61 6d 65 2c 20 7a 4e 61 6d 65 2c  ", nName, zName,
11a90 20 2b 2b 63 6e 74 29 3b 0a 20 20 20 20 20 20 69   ++cnt);.      i
11aa0 66 28 20 63 6e 74 3e 33 20 29 20 73 71 6c 69 74  f( cnt>3 ) sqlit
11ab0 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 73 69  e3_randomness(si
11ac0 7a 65 6f 66 28 63 6e 74 29 2c 20 26 63 6e 74 29  zeof(cnt), &cnt)
11ad0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 43 6f 6c  ;.    }.    pCol
11ae0 2d 3e 7a 4e 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b  ->zName = zName;
11af0 0a 20 20 20 20 73 71 6c 69 74 65 33 43 6f 6c 75  .    sqlite3Colu
11b00 6d 6e 50 72 6f 70 65 72 74 69 65 73 46 72 6f 6d  mnPropertiesFrom
11b10 4e 61 6d 65 28 30 2c 20 70 43 6f 6c 29 3b 0a 20  Name(0, pCol);. 
11b20 20 20 20 69 66 28 20 7a 4e 61 6d 65 20 26 26 20     if( zName && 
11b30 73 71 6c 69 74 65 33 48 61 73 68 49 6e 73 65 72  sqlite3HashInser
11b40 74 28 26 68 74 2c 20 7a 4e 61 6d 65 2c 20 70 43  t(&ht, zName, pC
11b50 6f 6c 29 3d 3d 70 43 6f 6c 20 29 7b 0a 20 20 20  ol)==pCol ){.   
11b60 20 20 20 73 71 6c 69 74 65 33 4f 6f 6d 46 61 75     sqlite3OomFau
11b70 6c 74 28 64 62 29 3b 0a 20 20 20 20 7d 0a 20 20  lt(db);.    }.  
11b80 7d 0a 20 20 73 71 6c 69 74 65 33 48 61 73 68 43  }.  sqlite3HashC
11b90 6c 65 61 72 28 26 68 74 29 3b 0a 20 20 69 66 28  lear(&ht);.  if(
11ba0 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
11bb0 64 20 29 7b 0a 20 20 20 20 66 6f 72 28 6a 3d 30  d ){.    for(j=0
11bc0 3b 20 6a 3c 69 3b 20 6a 2b 2b 29 7b 0a 20 20 20  ; j<i; j++){.   
11bd0 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
11be0 28 64 62 2c 20 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61  (db, aCol[j].zNa
11bf0 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  me);.    }.    s
11c00 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
11c10 20 61 43 6f 6c 29 3b 0a 20 20 20 20 2a 70 61 43   aCol);.    *paC
11c20 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 2a 70 6e 43  ol = 0;.    *pnC
11c30 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 72 65 74 75  ol = 0;.    retu
11c40 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f  rn SQLITE_NOMEM_
11c50 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 72 65 74 75  BKPT;.  }.  retu
11c60 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
11c70 0a 2f 2a 0a 2a 2a 20 41 64 64 20 74 79 70 65 20  ./*.** Add type 
11c80 61 6e 64 20 63 6f 6c 6c 61 74 69 6f 6e 20 69 6e  and collation in
11c90 66 6f 72 6d 61 74 69 6f 6e 20 74 6f 20 61 20 63  formation to a c
11ca0 6f 6c 75 6d 6e 20 6c 69 73 74 20 62 61 73 65 64  olumn list based
11cb0 20 6f 6e 0a 2a 2a 20 61 20 53 45 4c 45 43 54 20   on.** a SELECT 
11cc0 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 0a 2a  statement..** .*
11cd0 2a 20 54 68 65 20 63 6f 6c 75 6d 6e 20 6c 69 73  * The column lis
11ce0 74 20 70 72 65 73 75 6d 61 62 6c 79 20 63 61 6d  t presumably cam
11cf0 65 20 66 72 6f 6d 20 73 65 6c 65 63 74 43 6f 6c  e from selectCol
11d00 75 6d 6e 4e 61 6d 65 73 46 72 6f 6d 45 78 70 72  umnNamesFromExpr
11d10 4c 69 73 74 28 29 2e 0a 2a 2a 20 54 68 65 20 63  List()..** The c
11d20 6f 6c 75 6d 6e 20 6c 69 73 74 20 68 61 73 20 6f  olumn list has o
11d30 6e 6c 79 20 6e 61 6d 65 73 2c 20 6e 6f 74 20 74  nly names, not t
11d40 79 70 65 73 20 6f 72 20 63 6f 6c 6c 61 74 69 6f  ypes or collatio
11d50 6e 73 2e 20 20 54 68 69 73 0a 2a 2a 20 72 6f 75  ns.  This.** rou
11d60 74 69 6e 65 20 67 6f 65 73 20 74 68 72 6f 75 67  tine goes throug
11d70 68 20 61 6e 64 20 61 64 64 73 20 74 68 65 20 74  h and adds the t
11d80 79 70 65 73 20 61 6e 64 20 63 6f 6c 6c 61 74 69  ypes and collati
11d90 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ons..**.** This 
11da0 72 6f 75 74 69 6e 65 20 72 65 71 75 69 72 65 73  routine requires
11db0 20 74 68 61 74 20 61 6c 6c 20 69 64 65 6e 74 69   that all identi
11dc0 66 69 65 72 73 20 69 6e 20 74 68 65 20 53 45 4c  fiers in the SEL
11dd0 45 43 54 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74  ECT.** statement
11de0 20 62 65 20 72 65 73 6f 6c 76 65 64 2e 0a 2a 2f   be resolved..*/
11df0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53 65 6c  .void sqlite3Sel
11e00 65 63 74 41 64 64 43 6f 6c 75 6d 6e 54 79 70 65  ectAddColumnType
11e10 41 6e 64 43 6f 6c 6c 61 74 69 6f 6e 28 0a 20 20  AndCollation(.  
11e20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
11e30 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
11e40 20 63 6f 6e 74 65 78 74 73 20 2a 2f 0a 20 20 54   contexts */.  T
11e50 61 62 6c 65 20 2a 70 54 61 62 2c 20 20 20 20 20  able *pTab,     
11e60 20 20 20 20 20 2f 2a 20 41 64 64 20 63 6f 6c 75       /* Add colu
11e70 6d 6e 20 74 79 70 65 20 69 6e 66 6f 72 6d 61 74  mn type informat
11e80 69 6f 6e 20 74 6f 20 74 68 69 73 20 74 61 62 6c  ion to this tabl
11e90 65 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70  e */.  Select *p
11ea0 53 65 6c 65 63 74 20 20 20 20 20 20 20 2f 2a 20  Select       /* 
11eb0 53 45 4c 45 43 54 20 75 73 65 64 20 74 6f 20 64  SELECT used to d
11ec0 65 74 65 72 6d 69 6e 65 20 74 79 70 65 73 20 61  etermine types a
11ed0 6e 64 20 63 6f 6c 6c 61 74 69 6f 6e 73 20 2a 2f  nd collations */
11ee0 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  .){.  sqlite3 *d
11ef0 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
11f00 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 73 4e    NameContext sN
11f10 43 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f  C;.  Column *pCo
11f20 6c 3b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43  l;.  CollSeq *pC
11f30 6f 6c 6c 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  oll;.  int i;.  
11f40 45 78 70 72 20 2a 70 3b 0a 20 20 73 74 72 75 63  Expr *p;.  struc
11f50 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20  t ExprList_item 
11f60 2a 61 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  *a;..  assert( p
11f70 53 65 6c 65 63 74 21 3d 30 20 29 3b 0a 20 20 61  Select!=0 );.  a
11f80 73 73 65 72 74 28 20 28 70 53 65 6c 65 63 74 2d  ssert( (pSelect-
11f90 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 52  >selFlags & SF_R
11fa0 65 73 6f 6c 76 65 64 29 21 3d 30 20 29 3b 0a 20  esolved)!=0 );. 
11fb0 20 61 73 73 65 72 74 28 20 70 54 61 62 2d 3e 6e   assert( pTab->n
11fc0 43 6f 6c 3d 3d 70 53 65 6c 65 63 74 2d 3e 70 45  Col==pSelect->pE
11fd0 4c 69 73 74 2d 3e 6e 45 78 70 72 20 7c 7c 20 64  List->nExpr || d
11fe0 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
11ff0 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c  );.  if( db->mal
12000 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74 75  locFailed ) retu
12010 72 6e 3b 0a 20 20 6d 65 6d 73 65 74 28 26 73 4e  rn;.  memset(&sN
12020 43 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 4e 43  C, 0, sizeof(sNC
12030 29 29 3b 0a 20 20 73 4e 43 2e 70 53 72 63 4c 69  ));.  sNC.pSrcLi
12040 73 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70 53  st = pSelect->pS
12050 72 63 3b 0a 20 20 61 20 3d 20 70 53 65 6c 65 63  rc;.  a = pSelec
12060 74 2d 3e 70 45 4c 69 73 74 2d 3e 61 3b 0a 20 20  t->pEList->a;.  
12070 66 6f 72 28 69 3d 30 2c 20 70 43 6f 6c 3d 70 54  for(i=0, pCol=pT
12080 61 62 2d 3e 61 43 6f 6c 3b 20 69 3c 70 54 61 62  ab->aCol; i<pTab
12090 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 70 43 6f  ->nCol; i++, pCo
120a0 6c 2b 2b 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20  l++){.    const 
120b0 63 68 61 72 20 2a 7a 54 79 70 65 3b 0a 20 20 20  char *zType;.   
120c0 20 69 6e 74 20 6e 2c 20 6d 3b 0a 20 20 20 20 70   int n, m;.    p
120d0 20 3d 20 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20   = a[i].pExpr;. 
120e0 20 20 20 7a 54 79 70 65 20 3d 20 63 6f 6c 75 6d     zType = colum
120f0 6e 54 79 70 65 28 26 73 4e 43 2c 20 70 2c 20 30  nType(&sNC, p, 0
12100 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 2f 2a 20  , 0, 0);.    /* 
12110 70 43 6f 6c 2d 3e 73 7a 45 73 74 20 3d 20 2e 2e  pCol->szEst = ..
12120 2e 20 2f 2f 20 43 6f 6c 75 6d 6e 20 73 69 7a 65  . // Column size
12130 20 65 73 74 20 66 6f 72 20 53 45 4c 45 43 54 20   est for SELECT 
12140 74 61 62 6c 65 73 20 6e 65 76 65 72 20 75 73 65  tables never use
12150 64 20 2a 2f 0a 20 20 20 20 70 43 6f 6c 2d 3e 61  d */.    pCol->a
12160 66 66 69 6e 69 74 79 20 3d 20 73 71 6c 69 74 65  ffinity = sqlite
12170 33 45 78 70 72 41 66 66 69 6e 69 74 79 28 70 29  3ExprAffinity(p)
12180 3b 0a 20 20 20 20 69 66 28 20 7a 54 79 70 65 20  ;.    if( zType 
12190 29 7b 0a 20 20 20 20 20 20 6d 20 3d 20 73 71 6c  ){.      m = sql
121a0 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 54 79  ite3Strlen30(zTy
121b0 70 65 29 3b 0a 20 20 20 20 20 20 6e 20 3d 20 73  pe);.      n = s
121c0 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70  qlite3Strlen30(p
121d0 43 6f 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  Col->zName);.   
121e0 20 20 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 20 3d     pCol->zName =
121f0 20 73 71 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f   sqlite3DbReallo
12200 63 4f 72 46 72 65 65 28 64 62 2c 20 70 43 6f 6c  cOrFree(db, pCol
12210 2d 3e 7a 4e 61 6d 65 2c 20 6e 2b 6d 2b 32 29 3b  ->zName, n+m+2);
12220 0a 20 20 20 20 20 20 69 66 28 20 70 43 6f 6c 2d  .      if( pCol-
12230 3e 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20  >zName ){.      
12240 20 20 6d 65 6d 63 70 79 28 26 70 43 6f 6c 2d 3e    memcpy(&pCol->
12250 7a 4e 61 6d 65 5b 6e 2b 31 5d 2c 20 7a 54 79 70  zName[n+1], zTyp
12260 65 2c 20 6d 2b 31 29 3b 0a 20 20 20 20 20 20 20  e, m+1);.       
12270 20 70 43 6f 6c 2d 3e 63 6f 6c 46 6c 61 67 73 20   pCol->colFlags 
12280 7c 3d 20 43 4f 4c 46 4c 41 47 5f 48 41 53 54 59  |= COLFLAG_HASTY
12290 50 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  PE;.      }.    
122a0 7d 0a 20 20 20 20 69 66 28 20 70 43 6f 6c 2d 3e  }.    if( pCol->
122b0 61 66 66 69 6e 69 74 79 3d 3d 30 20 29 20 70 43  affinity==0 ) pC
122c0 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 20 3d 20 53  ol->affinity = S
122d0 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42 3b 0a  QLITE_AFF_BLOB;.
122e0 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69      pColl = sqli
122f0 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70  te3ExprCollSeq(p
12300 50 61 72 73 65 2c 20 70 29 3b 0a 20 20 20 20 69  Parse, p);.    i
12310 66 28 20 70 43 6f 6c 6c 20 26 26 20 70 43 6f 6c  f( pColl && pCol
12320 2d 3e 7a 43 6f 6c 6c 3d 3d 30 20 29 7b 0a 20 20  ->zColl==0 ){.  
12330 20 20 20 20 70 43 6f 6c 2d 3e 7a 43 6f 6c 6c 20      pCol->zColl 
12340 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75  = sqlite3DbStrDu
12350 70 28 64 62 2c 20 70 43 6f 6c 6c 2d 3e 7a 4e 61  p(db, pColl->zNa
12360 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  me);.    }.  }. 
12370 20 70 54 61 62 2d 3e 73 7a 54 61 62 52 6f 77 20   pTab->szTabRow 
12380 3d 20 31 3b 20 2f 2a 20 41 6e 79 20 6e 6f 6e 2d  = 1; /* Any non-
12390 7a 65 72 6f 20 76 61 6c 75 65 20 77 6f 72 6b 73  zero value works
123a0 20 2a 2f 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76   */.}../*.** Giv
123b0 65 6e 20 61 20 53 45 4c 45 43 54 20 73 74 61 74  en a SELECT stat
123c0 65 6d 65 6e 74 2c 20 67 65 6e 65 72 61 74 65 20  ement, generate 
123d0 61 20 54 61 62 6c 65 20 73 74 72 75 63 74 75 72  a Table structur
123e0 65 20 74 68 61 74 20 64 65 73 63 72 69 62 65 73  e that describes
123f0 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 20 73  .** the result s
12400 65 74 20 6f 66 20 74 68 61 74 20 53 45 4c 45 43  et of that SELEC
12410 54 2e 0a 2a 2f 0a 54 61 62 6c 65 20 2a 73 71 6c  T..*/.Table *sql
12420 69 74 65 33 52 65 73 75 6c 74 53 65 74 4f 66 53  ite3ResultSetOfS
12430 65 6c 65 63 74 28 50 61 72 73 65 20 2a 70 50 61  elect(Parse *pPa
12440 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 53 65  rse, Select *pSe
12450 6c 65 63 74 29 7b 0a 20 20 54 61 62 6c 65 20 2a  lect){.  Table *
12460 70 54 61 62 3b 0a 20 20 73 71 6c 69 74 65 33 20  pTab;.  sqlite3 
12470 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
12480 3b 0a 20 20 75 36 34 20 73 61 76 65 64 46 6c 61  ;.  u64 savedFla
12490 67 73 3b 0a 0a 20 20 73 61 76 65 64 46 6c 61 67  gs;..  savedFlag
124a0 73 20 3d 20 64 62 2d 3e 66 6c 61 67 73 3b 0a 20  s = db->flags;. 
124b0 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 28   db->flags &= ~(
124c0 75 36 34 29 53 51 4c 49 54 45 5f 46 75 6c 6c 43  u64)SQLITE_FullC
124d0 6f 6c 4e 61 6d 65 73 3b 0a 20 20 64 62 2d 3e 66  olNames;.  db->f
124e0 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 53  lags |= SQLITE_S
124f0 68 6f 72 74 43 6f 6c 4e 61 6d 65 73 3b 0a 20 20  hortColNames;.  
12500 73 71 6c 69 74 65 33 53 65 6c 65 63 74 50 72 65  sqlite3SelectPre
12510 70 28 70 50 61 72 73 65 2c 20 70 53 65 6c 65 63  p(pParse, pSelec
12520 74 2c 20 30 29 3b 0a 20 20 64 62 2d 3e 66 6c 61  t, 0);.  db->fla
12530 67 73 20 3d 20 73 61 76 65 64 46 6c 61 67 73 3b  gs = savedFlags;
12540 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e  .  if( pParse->n
12550 45 72 72 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  Err ) return 0;.
12560 20 20 77 68 69 6c 65 28 20 70 53 65 6c 65 63 74    while( pSelect
12570 2d 3e 70 50 72 69 6f 72 20 29 20 70 53 65 6c 65  ->pPrior ) pSele
12580 63 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70 50  ct = pSelect->pP
12590 72 69 6f 72 3b 0a 20 20 70 54 61 62 20 3d 20 73  rior;.  pTab = s
125a0 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65  qlite3DbMallocZe
125b0 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 54 61  ro(db, sizeof(Ta
125c0 62 6c 65 29 20 29 3b 0a 20 20 69 66 28 20 70 54  ble) );.  if( pT
125d0 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  ab==0 ){.    ret
125e0 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 54 61  urn 0;.  }.  pTa
125f0 62 2d 3e 6e 54 61 62 52 65 66 20 3d 20 31 3b 0a  b->nTabRef = 1;.
12600 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 20 3d 20    pTab->zName = 
12610 30 3b 0a 20 20 70 54 61 62 2d 3e 6e 52 6f 77 4c  0;.  pTab->nRowL
12620 6f 67 45 73 74 20 3d 20 32 30 30 3b 20 61 73 73  ogEst = 200; ass
12630 65 72 74 28 20 32 30 30 3d 3d 73 71 6c 69 74 65  ert( 200==sqlite
12640 33 4c 6f 67 45 73 74 28 31 30 34 38 35 37 36 29  3LogEst(1048576)
12650 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 43 6f 6c   );.  sqlite3Col
12660 75 6d 6e 73 46 72 6f 6d 45 78 70 72 4c 69 73 74  umnsFromExprList
12670 28 70 50 61 72 73 65 2c 20 70 53 65 6c 65 63 74  (pParse, pSelect
12680 2d 3e 70 45 4c 69 73 74 2c 20 26 70 54 61 62 2d  ->pEList, &pTab-
12690 3e 6e 43 6f 6c 2c 20 26 70 54 61 62 2d 3e 61 43  >nCol, &pTab->aC
126a0 6f 6c 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 65  ol);.  sqlite3Se
126b0 6c 65 63 74 41 64 64 43 6f 6c 75 6d 6e 54 79 70  lectAddColumnTyp
126c0 65 41 6e 64 43 6f 6c 6c 61 74 69 6f 6e 28 70 50  eAndCollation(pP
126d0 61 72 73 65 2c 20 70 54 61 62 2c 20 70 53 65 6c  arse, pTab, pSel
126e0 65 63 74 29 3b 0a 20 20 70 54 61 62 2d 3e 69 50  ect);.  pTab->iP
126f0 4b 65 79 20 3d 20 2d 31 3b 0a 20 20 69 66 28 20  Key = -1;.  if( 
12700 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
12710 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44   ){.    sqlite3D
12720 65 6c 65 74 65 54 61 62 6c 65 28 64 62 2c 20 70  eleteTable(db, p
12730 54 61 62 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  Tab);.    return
12740 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   0;.  }.  return
12750 20 70 54 61 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   pTab;.}../*.** 
12760 47 65 74 20 61 20 56 44 42 45 20 66 6f 72 20 74  Get a VDBE for t
12770 68 65 20 67 69 76 65 6e 20 70 61 72 73 65 72 20  he given parser 
12780 63 6f 6e 74 65 78 74 2e 20 20 43 72 65 61 74 65  context.  Create
12790 20 61 20 6e 65 77 20 6f 6e 65 20 69 66 20 6e 65   a new one if ne
127a0 63 65 73 73 61 72 79 2e 0a 2a 2a 20 49 66 20 61  cessary..** If a
127b0 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  n error occurs, 
127c0 72 65 74 75 72 6e 20 4e 55 4c 4c 20 61 6e 64 20  return NULL and 
127d0 6c 65 61 76 65 20 61 20 6d 65 73 73 61 67 65 20  leave a message 
127e0 69 6e 20 70 50 61 72 73 65 2e 0a 2a 2f 0a 56 64  in pParse..*/.Vd
127f0 62 65 20 2a 73 71 6c 69 74 65 33 47 65 74 56 64  be *sqlite3GetVd
12800 62 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  be(Parse *pParse
12810 29 7b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  ){.  if( pParse-
12820 3e 70 56 64 62 65 20 29 7b 0a 20 20 20 20 72 65  >pVdbe ){.    re
12830 74 75 72 6e 20 70 50 61 72 73 65 2d 3e 70 56 64  turn pParse->pVd
12840 62 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50  be;.  }.  if( pP
12850 61 72 73 65 2d 3e 70 54 6f 70 6c 65 76 65 6c 3d  arse->pToplevel=
12860 3d 30 0a 20 20 20 26 26 20 4f 70 74 69 6d 69 7a  =0.   && Optimiz
12870 61 74 69 6f 6e 45 6e 61 62 6c 65 64 28 70 50 61  ationEnabled(pPa
12880 72 73 65 2d 3e 64 62 2c 53 51 4c 49 54 45 5f 46  rse->db,SQLITE_F
12890 61 63 74 6f 72 4f 75 74 43 6f 6e 73 74 29 0a 20  actorOutConst). 
128a0 20 29 7b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e   ){.    pParse->
128b0 6f 6b 43 6f 6e 73 74 46 61 63 74 6f 72 20 3d 20  okConstFactor = 
128c0 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  1;.  }.  return 
128d0 73 71 6c 69 74 65 33 56 64 62 65 43 72 65 61 74  sqlite3VdbeCreat
128e0 65 28 70 50 61 72 73 65 29 3b 0a 7d 0a 0a 0a 2f  e(pParse);.}.../
128f0 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 74 68 65  *.** Compute the
12900 20 69 4c 69 6d 69 74 20 61 6e 64 20 69 4f 66 66   iLimit and iOff
12910 73 65 74 20 66 69 65 6c 64 73 20 6f 66 20 74 68  set fields of th
12920 65 20 53 45 4c 45 43 54 20 62 61 73 65 64 20 6f  e SELECT based o
12930 6e 20 74 68 65 0a 2a 2a 20 70 4c 69 6d 69 74 20  n the.** pLimit 
12940 65 78 70 72 65 73 73 69 6f 6e 73 2e 20 20 70 4c  expressions.  pL
12950 69 6d 69 74 2d 3e 70 4c 65 66 74 20 61 6e 64 20  imit->pLeft and 
12960 70 4c 69 6d 69 74 2d 3e 70 52 69 67 68 74 20 68  pLimit->pRight h
12970 6f 6c 64 20 74 68 65 20 65 78 70 72 65 73 73 69  old the expressi
12980 6f 6e 73 0a 2a 2a 20 74 68 61 74 20 61 70 70 65  ons.** that appe
12990 61 72 20 69 6e 20 74 68 65 20 6f 72 69 67 69 6e  ar in the origin
129a0 61 6c 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74  al SQL statement
129b0 20 61 66 74 65 72 20 74 68 65 20 4c 49 4d 49 54   after the LIMIT
129c0 20 61 6e 64 20 4f 46 46 53 45 54 0a 2a 2a 20 6b   and OFFSET.** k
129d0 65 79 77 6f 72 64 73 2e 20 20 4f 72 20 4e 55 4c  eywords.  Or NUL
129e0 4c 20 69 66 20 74 68 6f 73 65 20 6b 65 79 77 6f  L if those keywo
129f0 72 64 73 20 61 72 65 20 6f 6d 69 74 74 65 64 2e  rds are omitted.
12a00 20 69 4c 69 6d 69 74 20 61 6e 64 20 69 4f 66 66   iLimit and iOff
12a10 73 65 74 20 0a 2a 2a 20 61 72 65 20 74 68 65 20  set .** are the 
12a20 69 6e 74 65 67 65 72 20 6d 65 6d 6f 72 79 20 72  integer memory r
12a30 65 67 69 73 74 65 72 20 6e 75 6d 62 65 72 73 20  egister numbers 
12a40 66 6f 72 20 63 6f 75 6e 74 65 72 73 20 75 73 65  for counters use
12a50 64 20 74 6f 20 63 6f 6d 70 75 74 65 20 0a 2a 2a  d to compute .**
12a60 20 74 68 65 20 6c 69 6d 69 74 20 61 6e 64 20 6f   the limit and o
12a70 66 66 73 65 74 2e 20 20 49 66 20 74 68 65 72 65  ffset.  If there
12a80 20 69 73 20 6e 6f 20 6c 69 6d 69 74 20 61 6e 64   is no limit and
12a90 2f 6f 72 20 6f 66 66 73 65 74 2c 20 74 68 65 6e  /or offset, then
12aa0 20 0a 2a 2a 20 69 4c 69 6d 69 74 20 61 6e 64 20   .** iLimit and 
12ab0 69 4f 66 66 73 65 74 20 61 72 65 20 6e 65 67 61  iOffset are nega
12ac0 74 69 76 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  tive..**.** This
12ad0 20 72 6f 75 74 69 6e 65 20 63 68 61 6e 67 65 73   routine changes
12ae0 20 74 68 65 20 76 61 6c 75 65 73 20 6f 66 20 69   the values of i
12af0 4c 69 6d 69 74 20 61 6e 64 20 69 4f 66 66 73 65  Limit and iOffse
12b00 74 20 6f 6e 6c 79 20 69 66 0a 2a 2a 20 61 20 6c  t only if.** a l
12b10 69 6d 69 74 20 6f 72 20 6f 66 66 73 65 74 20 69  imit or offset i
12b20 73 20 64 65 66 69 6e 65 64 20 62 79 20 70 4c 69  s defined by pLi
12b30 6d 69 74 2d 3e 70 4c 65 66 74 20 61 6e 64 20 70  mit->pLeft and p
12b40 4c 69 6d 69 74 2d 3e 70 52 69 67 68 74 2e 20 20  Limit->pRight.  
12b50 69 4c 69 6d 69 74 0a 2a 2a 20 61 6e 64 20 69 4f  iLimit.** and iO
12b60 66 66 73 65 74 20 73 68 6f 75 6c 64 20 68 61 76  ffset should hav
12b70 65 20 62 65 65 6e 20 70 72 65 73 65 74 20 74 6f  e been preset to
12b80 20 61 70 70 72 6f 70 72 69 61 74 65 20 64 65 66   appropriate def
12b90 61 75 6c 74 20 76 61 6c 75 65 73 20 28 7a 65 72  ault values (zer
12ba0 6f 29 0a 2a 2a 20 70 72 69 6f 72 20 74 6f 20 63  o).** prior to c
12bb0 61 6c 6c 69 6e 67 20 74 68 69 73 20 72 6f 75 74  alling this rout
12bc0 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69  ine..**.** The i
12bd0 4f 66 66 73 65 74 20 72 65 67 69 73 74 65 72 20  Offset register 
12be0 28 69 66 20 69 74 20 65 78 69 73 74 73 29 20 69  (if it exists) i
12bf0 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f  s initialized to
12c00 20 74 68 65 20 76 61 6c 75 65 0a 2a 2a 20 6f 66   the value.** of
12c10 20 74 68 65 20 4f 46 46 53 45 54 2e 20 20 54 68   the OFFSET.  Th
12c20 65 20 69 4c 69 6d 69 74 20 72 65 67 69 73 74 65  e iLimit registe
12c30 72 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64  r is initialized
12c40 20 74 6f 20 4c 49 4d 49 54 2e 20 20 52 65 67 69   to LIMIT.  Regi
12c50 73 74 65 72 0a 2a 2a 20 69 4f 66 66 73 65 74 2b  ster.** iOffset+
12c60 31 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64  1 is initialized
12c70 20 74 6f 20 4c 49 4d 49 54 2b 4f 46 46 53 45 54   to LIMIT+OFFSET
12c80 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20 69 66 20  ..**.** Only if 
12c90 70 4c 69 6d 69 74 2d 3e 70 4c 65 66 74 21 3d 30  pLimit->pLeft!=0
12ca0 20 64 6f 20 74 68 65 20 6c 69 6d 69 74 20 72 65   do the limit re
12cb0 67 69 73 74 65 72 73 20 67 65 74 0a 2a 2a 20 72  gisters get.** r
12cc0 65 64 65 66 69 6e 65 64 2e 20 20 54 68 65 20 55  edefined.  The U
12cd0 4e 49 4f 4e 20 41 4c 4c 20 6f 70 65 72 61 74 6f  NION ALL operato
12ce0 72 20 75 73 65 73 20 74 68 69 73 20 70 72 6f 70  r uses this prop
12cf0 65 72 74 79 20 74 6f 20 66 6f 72 63 65 0a 2a 2a  erty to force.**
12d00 20 74 68 65 20 72 65 75 73 65 20 6f 66 20 74 68   the reuse of th
12d10 65 20 73 61 6d 65 20 6c 69 6d 69 74 20 61 6e 64  e same limit and
12d20 20 6f 66 66 73 65 74 20 72 65 67 69 73 74 65 72   offset register
12d30 73 20 61 63 72 6f 73 73 20 6d 75 6c 74 69 70 6c  s across multipl
12d40 65 0a 2a 2a 20 53 45 4c 45 43 54 20 73 74 61 74  e.** SELECT stat
12d50 65 6d 65 6e 74 73 2e 0a 2a 2f 0a 73 74 61 74 69  ements..*/.stati
12d60 63 20 76 6f 69 64 20 63 6f 6d 70 75 74 65 4c 69  c void computeLi
12d70 6d 69 74 52 65 67 69 73 74 65 72 73 28 50 61 72  mitRegisters(Par
12d80 73 65 20 2a 70 50 61 72 73 65 2c 20 53 65 6c 65  se *pParse, Sele
12d90 63 74 20 2a 70 2c 20 69 6e 74 20 69 42 72 65 61  ct *p, int iBrea
12da0 6b 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  k){.  Vdbe *v = 
12db0 30 3b 0a 20 20 69 6e 74 20 69 4c 69 6d 69 74 20  0;.  int iLimit 
12dc0 3d 20 30 3b 0a 20 20 69 6e 74 20 69 4f 66 66 73  = 0;.  int iOffs
12dd0 65 74 3b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 45  et;.  int n;.  E
12de0 78 70 72 20 2a 70 4c 69 6d 69 74 20 3d 20 70 2d  xpr *pLimit = p-
12df0 3e 70 4c 69 6d 69 74 3b 0a 0a 20 20 69 66 28 20  >pLimit;..  if( 
12e00 70 2d 3e 69 4c 69 6d 69 74 20 29 20 72 65 74 75  p->iLimit ) retu
12e10 72 6e 3b 0a 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20  rn;..  /* .  ** 
12e20 22 4c 49 4d 49 54 20 2d 31 22 20 61 6c 77 61 79  "LIMIT -1" alway
12e30 73 20 73 68 6f 77 73 20 61 6c 6c 20 72 6f 77 73  s shows all rows
12e40 2e 20 20 54 68 65 72 65 20 69 73 20 73 6f 6d 65  .  There is some
12e50 0a 20 20 2a 2a 20 63 6f 6e 74 72 6f 76 65 72 73  .  ** controvers
12e60 79 20 61 62 6f 75 74 20 77 68 61 74 20 74 68 65  y about what the
12e70 20 63 6f 72 72 65 63 74 20 62 65 68 61 76 69 6f   correct behavio
12e80 72 20 73 68 6f 75 6c 64 20 62 65 2e 0a 20 20 2a  r should be..  *
12e90 2a 20 54 68 65 20 63 75 72 72 65 6e 74 20 69 6d  * The current im
12ea0 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 69 6e 74  plementation int
12eb0 65 72 70 72 65 74 73 20 22 4c 49 4d 49 54 20 30  erprets "LIMIT 0
12ec0 22 20 74 6f 20 6d 65 61 6e 0a 20 20 2a 2a 20 6e  " to mean.  ** n
12ed0 6f 20 72 6f 77 73 2e 0a 20 20 2a 2f 0a 20 20 69  o rows..  */.  i
12ee0 66 28 20 70 4c 69 6d 69 74 20 29 7b 0a 20 20 20  f( pLimit ){.   
12ef0 20 61 73 73 65 72 74 28 20 70 4c 69 6d 69 74 2d   assert( pLimit-
12f00 3e 6f 70 3d 3d 54 4b 5f 4c 49 4d 49 54 20 29 3b  >op==TK_LIMIT );
12f10 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 69  .    assert( pLi
12f20 6d 69 74 2d 3e 70 4c 65 66 74 21 3d 30 20 29 3b  mit->pLeft!=0 );
12f30 0a 20 20 20 20 70 2d 3e 69 4c 69 6d 69 74 20 3d  .    p->iLimit =
12f40 20 69 4c 69 6d 69 74 20 3d 20 2b 2b 70 50 61 72   iLimit = ++pPar
12f50 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 76 20  se->nMem;.    v 
12f60 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  = sqlite3GetVdbe
12f70 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 61 73  (pParse);.    as
12f80 73 65 72 74 28 20 76 21 3d 30 20 29 3b 0a 20 20  sert( v!=0 );.  
12f90 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70    if( sqlite3Exp
12fa0 72 49 73 49 6e 74 65 67 65 72 28 70 4c 69 6d 69  rIsInteger(pLimi
12fb0 74 2d 3e 70 4c 65 66 74 2c 20 26 6e 29 20 29 7b  t->pLeft, &n) ){
12fc0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
12fd0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
12fe0 6e 74 65 67 65 72 2c 20 6e 2c 20 69 4c 69 6d 69  nteger, n, iLimi
12ff0 74 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  t);.      VdbeCo
13000 6d 6d 65 6e 74 28 28 76 2c 20 22 4c 49 4d 49 54  mment((v, "LIMIT
13010 20 63 6f 75 6e 74 65 72 22 29 29 3b 0a 20 20 20   counter"));.   
13020 20 20 20 69 66 28 20 6e 3d 3d 30 20 29 7b 0a 20     if( n==0 ){. 
13030 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
13040 62 65 47 6f 74 6f 28 76 2c 20 69 42 72 65 61 6b  beGoto(v, iBreak
13050 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  );.      }else i
13060 66 28 20 6e 3e 3d 30 20 26 26 20 70 2d 3e 6e 53  f( n>=0 && p->nS
13070 65 6c 65 63 74 52 6f 77 3e 73 71 6c 69 74 65 33  electRow>sqlite3
13080 4c 6f 67 45 73 74 28 28 75 36 34 29 6e 29 20 29  LogEst((u64)n) )
13090 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 6e 53 65  {.        p->nSe
130a0 6c 65 63 74 52 6f 77 20 3d 20 73 71 6c 69 74 65  lectRow = sqlite
130b0 33 4c 6f 67 45 73 74 28 28 75 36 34 29 6e 29 3b  3LogEst((u64)n);
130c0 0a 20 20 20 20 20 20 20 20 70 2d 3e 73 65 6c 46  .        p->selF
130d0 6c 61 67 73 20 7c 3d 20 53 46 5f 46 69 78 65 64  lags |= SF_Fixed
130e0 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 7d 0a 20  Limit;.      }. 
130f0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
13100 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
13110 70 50 61 72 73 65 2c 20 70 4c 69 6d 69 74 2d 3e  pParse, pLimit->
13120 70 4c 65 66 74 2c 20 69 4c 69 6d 69 74 29 3b 0a  pLeft, iLimit);.
13130 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
13140 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4d 75  eAddOp1(v, OP_Mu
13150 73 74 42 65 49 6e 74 2c 20 69 4c 69 6d 69 74 29  stBeInt, iLimit)
13160 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
13170 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d  );.      VdbeCom
13180 6d 65 6e 74 28 28 76 2c 20 22 4c 49 4d 49 54 20  ment((v, "LIMIT 
13190 63 6f 75 6e 74 65 72 22 29 29 3b 0a 20 20 20 20  counter"));.    
131a0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
131b0 4f 70 32 28 76 2c 20 4f 50 5f 49 66 4e 6f 74 2c  Op2(v, OP_IfNot,
131c0 20 69 4c 69 6d 69 74 2c 20 69 42 72 65 61 6b 29   iLimit, iBreak)
131d0 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
131e0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
131f0 20 70 4c 69 6d 69 74 2d 3e 70 52 69 67 68 74 20   pLimit->pRight 
13200 29 7b 0a 20 20 20 20 20 20 70 2d 3e 69 4f 66 66  ){.      p->iOff
13210 73 65 74 20 3d 20 69 4f 66 66 73 65 74 20 3d 20  set = iOffset = 
13220 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
13230 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d        pParse->nM
13240 65 6d 2b 2b 3b 20 20 20 2f 2a 20 41 6c 6c 6f 63  em++;   /* Alloc
13250 61 74 65 20 61 6e 20 65 78 74 72 61 20 72 65 67  ate an extra reg
13260 69 73 74 65 72 20 66 6f 72 20 6c 69 6d 69 74 2b  ister for limit+
13270 6f 66 66 73 65 74 20 2a 2f 0a 20 20 20 20 20 20  offset */.      
13280 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
13290 70 50 61 72 73 65 2c 20 70 4c 69 6d 69 74 2d 3e  pParse, pLimit->
132a0 70 52 69 67 68 74 2c 20 69 4f 66 66 73 65 74 29  pRight, iOffset)
132b0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
132c0 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
132d0 4d 75 73 74 42 65 49 6e 74 2c 20 69 4f 66 66 73  MustBeInt, iOffs
132e0 65 74 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  et); VdbeCoverag
132f0 65 28 76 29 3b 0a 20 20 20 20 20 20 56 64 62 65  e(v);.      Vdbe
13300 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4f 46 46  Comment((v, "OFF
13310 53 45 54 20 63 6f 75 6e 74 65 72 22 29 29 3b 0a  SET counter"));.
13320 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
13330 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4f 66  eAddOp3(v, OP_Of
13340 66 73 65 74 4c 69 6d 69 74 2c 20 69 4c 69 6d 69  fsetLimit, iLimi
13350 74 2c 20 69 4f 66 66 73 65 74 2b 31 2c 20 69 4f  t, iOffset+1, iO
13360 66 66 73 65 74 29 3b 0a 20 20 20 20 20 20 56 64  ffset);.      Vd
13370 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4c  beComment((v, "L
13380 49 4d 49 54 2b 4f 46 46 53 45 54 22 29 29 3b 0a  IMIT+OFFSET"));.
13390 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 23 69 66      }.  }.}..#if
133a0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
133b0 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54  _COMPOUND_SELECT
133c0 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
133d0 65 20 61 70 70 72 6f 70 72 69 61 74 65 20 63 6f  e appropriate co
133e0 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
133f0 20 66 6f 72 20 74 68 65 20 69 43 6f 6c 2d 74 68   for the iCol-th
13400 20 63 6f 6c 75 6d 6e 20 6f 66 0a 2a 2a 20 74 68   column of.** th
13410 65 20 72 65 73 75 6c 74 20 73 65 74 20 66 6f 72  e result set for
13420 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 2d 73 65   the compound-se
13430 6c 65 63 74 20 73 74 61 74 65 6d 65 6e 74 20 22  lect statement "
13440 70 22 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c  p".  Return NULL
13450 20 69 66 0a 2a 2a 20 74 68 65 20 63 6f 6c 75 6d   if.** the colum
13460 6e 20 68 61 73 20 6e 6f 20 64 65 66 61 75 6c 74  n has no default
13470 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
13480 6e 63 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63  nce..**.** The c
13490 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
134a0 65 20 66 6f 72 20 74 68 65 20 63 6f 6d 70 6f 75  e for the compou
134b0 6e 64 20 73 65 6c 65 63 74 20 69 73 20 74 61 6b  nd select is tak
134c0 65 6e 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20 6c  en from the.** l
134d0 65 66 74 2d 6d 6f 73 74 20 74 65 72 6d 20 6f 66  eft-most term of
134e0 20 74 68 65 20 73 65 6c 65 63 74 20 74 68 61 74   the select that
134f0 20 68 61 73 20 61 20 63 6f 6c 6c 61 74 69 6e 67   has a collating
13500 20 73 65 71 75 65 6e 63 65 2e 0a 2a 2f 0a 73 74   sequence..*/.st
13510 61 74 69 63 20 43 6f 6c 6c 53 65 71 20 2a 6d 75  atic CollSeq *mu
13520 6c 74 69 53 65 6c 65 63 74 43 6f 6c 6c 53 65 71  ltiSelectCollSeq
13530 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
13540 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20 69  Select *p, int i
13550 43 6f 6c 29 7b 0a 20 20 43 6f 6c 6c 53 65 71 20  Col){.  CollSeq 
13560 2a 70 52 65 74 3b 0a 20 20 69 66 28 20 70 2d 3e  *pRet;.  if( p->
13570 70 50 72 69 6f 72 20 29 7b 0a 20 20 20 20 70 52  pPrior ){.    pR
13580 65 74 20 3d 20 6d 75 6c 74 69 53 65 6c 65 63 74  et = multiSelect
13590 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
135a0 70 2d 3e 70 50 72 69 6f 72 2c 20 69 43 6f 6c 29  p->pPrior, iCol)
135b0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
135c0 52 65 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 61  Ret = 0;.  }.  a
135d0 73 73 65 72 74 28 20 69 43 6f 6c 3e 3d 30 20 29  ssert( iCol>=0 )
135e0 3b 0a 20 20 2f 2a 20 69 43 6f 6c 20 6d 75 73 74  ;.  /* iCol must
135f0 20 62 65 20 6c 65 73 73 20 74 68 61 6e 20 70 2d   be less than p-
13600 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2e 20  >pEList->nExpr. 
13610 20 4f 74 68 65 72 77 69 73 65 20 61 6e 20 65 72   Otherwise an er
13620 72 6f 72 20 77 6f 75 6c 64 0a 20 20 2a 2a 20 68  ror would.  ** h
13630 61 76 65 20 62 65 65 6e 20 74 68 72 6f 77 6e 20  ave been thrown 
13640 64 75 72 69 6e 67 20 6e 61 6d 65 20 72 65 73 6f  during name reso
13650 6c 75 74 69 6f 6e 20 61 6e 64 20 77 65 20 77 6f  lution and we wo
13660 75 6c 64 20 6e 6f 74 20 68 61 76 65 20 67 6f 74  uld not have got
13670 74 65 6e 0a 20 20 2a 2a 20 74 68 69 73 20 66 61  ten.  ** this fa
13680 72 20 2a 2f 0a 20 20 69 66 28 20 70 52 65 74 3d  r */.  if( pRet=
13690 3d 30 20 26 26 20 41 4c 57 41 59 53 28 69 43 6f  =0 && ALWAYS(iCo
136a0 6c 3c 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78  l<p->pEList->nEx
136b0 70 72 29 20 29 7b 0a 20 20 20 20 70 52 65 74 20  pr) ){.    pRet 
136c0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c  = sqlite3ExprCol
136d0 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 2d 3e  lSeq(pParse, p->
136e0 70 45 4c 69 73 74 2d 3e 61 5b 69 43 6f 6c 5d 2e  pEList->a[iCol].
136f0 70 45 78 70 72 29 3b 0a 20 20 7d 0a 20 20 72 65  pExpr);.  }.  re
13700 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 0a 2f 2a  turn pRet;.}../*
13710 0a 2a 2a 20 54 68 65 20 73 65 6c 65 63 74 20 73  .** The select s
13720 74 61 74 65 6d 65 6e 74 20 70 61 73 73 65 64 20  tatement passed 
13730 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 70 61  as the second pa
13740 72 61 6d 65 74 65 72 20 69 73 20 61 20 63 6f 6d  rameter is a com
13750 70 6f 75 6e 64 20 53 45 4c 45 43 54 0a 2a 2a 20  pound SELECT.** 
13760 77 69 74 68 20 61 6e 20 4f 52 44 45 52 20 42 59  with an ORDER BY
13770 20 63 6c 61 75 73 65 2e 20 54 68 69 73 20 66 75   clause. This fu
13780 6e 63 74 69 6f 6e 20 61 6c 6c 6f 63 61 74 65 73  nction allocates
13790 20 61 6e 64 20 72 65 74 75 72 6e 73 20 61 20 4b   and returns a K
137a0 65 79 49 6e 66 6f 0a 2a 2a 20 73 74 72 75 63 74  eyInfo.** struct
137b0 75 72 65 20 73 75 69 74 61 62 6c 65 20 66 6f 72  ure suitable for
137c0 20 69 6d 70 6c 65 6d 65 6e 74 69 6e 67 20 74 68   implementing th
137d0 65 20 4f 52 44 45 52 20 42 59 2e 0a 2a 2a 0a 2a  e ORDER BY..**.*
137e0 2a 20 53 70 61 63 65 20 74 6f 20 68 6f 6c 64 20  * Space to hold 
137f0 74 68 65 20 4b 65 79 49 6e 66 6f 20 73 74 72 75  the KeyInfo stru
13800 63 74 75 72 65 20 69 73 20 6f 62 74 61 69 6e 65  cture is obtaine
13810 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 2e 20 54  d from malloc. T
13820 68 65 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 66 75  he calling.** fu
13830 6e 63 74 69 6f 6e 20 69 73 20 72 65 73 70 6f 6e  nction is respon
13840 73 69 62 6c 65 20 66 6f 72 20 65 6e 73 75 72 69  sible for ensuri
13850 6e 67 20 74 68 61 74 20 74 68 69 73 20 73 74 72  ng that this str
13860 75 63 74 75 72 65 20 69 73 20 65 76 65 6e 74 75  ucture is eventu
13870 61 6c 6c 79 0a 2a 2a 20 66 72 65 65 64 2e 0a 2a  ally.** freed..*
13880 2f 0a 73 74 61 74 69 63 20 4b 65 79 49 6e 66 6f  /.static KeyInfo
13890 20 2a 6d 75 6c 74 69 53 65 6c 65 63 74 4f 72 64   *multiSelectOrd
138a0 65 72 42 79 4b 65 79 49 6e 66 6f 28 50 61 72 73  erByKeyInfo(Pars
138b0 65 20 2a 70 50 61 72 73 65 2c 20 53 65 6c 65 63  e *pParse, Selec
138c0 74 20 2a 70 2c 20 69 6e 74 20 6e 45 78 74 72 61  t *p, int nExtra
138d0 29 7b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  ){.  ExprList *p
138e0 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72  OrderBy = p->pOr
138f0 64 65 72 42 79 3b 0a 20 20 69 6e 74 20 6e 4f 72  derBy;.  int nOr
13900 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65  derBy = p->pOrde
13910 72 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 73 71  rBy->nExpr;.  sq
13920 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
13930 73 65 2d 3e 64 62 3b 0a 20 20 4b 65 79 49 6e 66  se->db;.  KeyInf
13940 6f 20 2a 70 52 65 74 20 3d 20 73 71 6c 69 74 65  o *pRet = sqlite
13950 33 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63 28 64 62  3KeyInfoAlloc(db
13960 2c 20 6e 4f 72 64 65 72 42 79 2b 6e 45 78 74 72  , nOrderBy+nExtr
13970 61 2c 20 31 29 3b 0a 20 20 69 66 28 20 70 52 65  a, 1);.  if( pRe
13980 74 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  t ){.    int i;.
13990 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
139a0 4f 72 64 65 72 42 79 3b 20 69 2b 2b 29 7b 0a 20  OrderBy; i++){. 
139b0 20 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72       struct Expr
139c0 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
139d0 20 3d 20 26 70 4f 72 64 65 72 42 79 2d 3e 61 5b   = &pOrderBy->a[
139e0 69 5d 3b 0a 20 20 20 20 20 20 45 78 70 72 20 2a  i];.      Expr *
139f0 70 54 65 72 6d 20 3d 20 70 49 74 65 6d 2d 3e 70  pTerm = pItem->p
13a00 45 78 70 72 3b 0a 20 20 20 20 20 20 43 6f 6c 6c  Expr;.      Coll
13a10 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 0a 20 20 20  Seq *pColl;..   
13a20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 66 6c     if( pTerm->fl
13a30 61 67 73 20 26 20 45 50 5f 43 6f 6c 6c 61 74 65  ags & EP_Collate
13a40 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43 6f 6c   ){.        pCol
13a50 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  l = sqlite3ExprC
13a60 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70  ollSeq(pParse, p
13a70 54 65 72 6d 29 3b 0a 20 20 20 20 20 20 7d 65 6c  Term);.      }el
13a80 73 65 7b 0a 20 20 20 20 20 20 20 20 70 43 6f 6c  se{.        pCol
13a90 6c 20 3d 20 6d 75 6c 74 69 53 65 6c 65 63 74 43  l = multiSelectC
13aa0 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70  ollSeq(pParse, p
13ab0 2c 20 70 49 74 65 6d 2d 3e 75 2e 78 2e 69 4f 72  , pItem->u.x.iOr
13ac0 64 65 72 42 79 43 6f 6c 2d 31 29 3b 0a 20 20 20  derByCol-1);.   
13ad0 20 20 20 20 20 69 66 28 20 70 43 6f 6c 6c 3d 3d       if( pColl==
13ae0 30 20 29 20 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e  0 ) pColl = db->
13af0 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20  pDfltColl;.     
13b00 20 20 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69     pOrderBy->a[i
13b10 5d 2e 70 45 78 70 72 20 3d 0a 20 20 20 20 20 20  ].pExpr =.      
13b20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 41      sqlite3ExprA
13b30 64 64 43 6f 6c 6c 61 74 65 53 74 72 69 6e 67 28  ddCollateString(
13b40 70 50 61 72 73 65 2c 20 70 54 65 72 6d 2c 20 70  pParse, pTerm, p
13b50 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  Coll->zName);.  
13b60 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65      }.      asse
13b70 72 74 28 20 73 71 6c 69 74 65 33 4b 65 79 49 6e  rt( sqlite3KeyIn
13b80 66 6f 49 73 57 72 69 74 65 61 62 6c 65 28 70 52  foIsWriteable(pR
13b90 65 74 29 20 29 3b 0a 20 20 20 20 20 20 70 52 65  et) );.      pRe
13ba0 74 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 3d 20 70 43  t->aColl[i] = pC
13bb0 6f 6c 6c 3b 0a 20 20 20 20 20 20 70 52 65 74 2d  oll;.      pRet-
13bc0 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d 20 3d  >aSortOrder[i] =
13bd0 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e   pOrderBy->a[i].
13be0 73 6f 72 74 4f 72 64 65 72 3b 0a 20 20 20 20 7d  sortOrder;.    }
13bf0 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70  .  }..  return p
13c00 52 65 74 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20  Ret;.}..#ifndef 
13c10 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 54 45 0a  SQLITE_OMIT_CTE.
13c20 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
13c30 6e 65 20 67 65 6e 65 72 61 74 65 73 20 56 44 42  ne generates VDB
13c40 45 20 63 6f 64 65 20 74 6f 20 63 6f 6d 70 75 74  E code to comput
13c50 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66  e the content of
13c60 20 61 20 57 49 54 48 20 52 45 43 55 52 53 49 56   a WITH RECURSIV
13c70 45 0a 2a 2a 20 71 75 65 72 79 20 6f 66 20 74 68  E.** query of th
13c80 65 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20  e form:.**.**   
13c90 3c 72 65 63 75 72 73 69 76 65 2d 74 61 62 6c 65  <recursive-table
13ca0 3e 20 41 53 20 28 3c 73 65 74 75 70 2d 71 75 65  > AS (<setup-que
13cb0 72 79 3e 20 55 4e 49 4f 4e 20 5b 41 4c 4c 5d 20  ry> UNION [ALL] 
13cc0 3c 72 65 63 75 72 73 69 76 65 2d 71 75 65 72 79  <recursive-query
13cd0 3e 29 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  >).**           
13ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 5f                \_
13cf0 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 20 20 20 20 20  __________/     
13d00 20 20 20 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f          \_______
13d10 5f 5f 5f 5f 5f 5f 5f 5f 2f 0a 2a 2a 20 20 20 20  ________/.**    
13d20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13d30 20 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72         p->pPrior
13d40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13d50 20 20 20 20 20 20 70 0a 2a 2a 0a 2a 2a 0a 2a 2a        p.**.**.**
13d60 20 54 68 65 72 65 20 69 73 20 65 78 61 63 74 6c   There is exactl
13d70 79 20 6f 6e 65 20 72 65 66 65 72 65 6e 63 65 20  y one reference 
13d80 74 6f 20 74 68 65 20 72 65 63 75 72 73 69 76 65  to the recursive
13d90 2d 74 61 62 6c 65 20 69 6e 20 74 68 65 20 46 52  -table in the FR
13da0 4f 4d 20 63 6c 61 75 73 65 0a 2a 2a 20 6f 66 20  OM clause.** of 
13db0 72 65 63 75 72 73 69 76 65 2d 71 75 65 72 79 2c  recursive-query,
13dc0 20 6d 61 72 6b 65 64 20 77 69 74 68 20 74 68 65   marked with the
13dd0 20 53 72 63 4c 69 73 74 2d 3e 61 5b 5d 2e 66 67   SrcList->a[].fg
13de0 2e 69 73 52 65 63 75 72 73 69 76 65 20 66 6c 61  .isRecursive fla
13df0 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 65 74  g..**.** The set
13e00 75 70 2d 71 75 65 72 79 20 72 75 6e 73 20 6f 6e  up-query runs on
13e10 63 65 20 74 6f 20 67 65 6e 65 72 61 74 65 20 61  ce to generate a
13e20 6e 20 69 6e 69 74 69 61 6c 20 73 65 74 20 6f 66  n initial set of
13e30 20 72 6f 77 73 20 74 68 61 74 20 67 6f 0a 2a 2a   rows that go.**
13e40 20 69 6e 74 6f 20 61 20 51 75 65 75 65 20 74 61   into a Queue ta
13e50 62 6c 65 2e 20 20 52 6f 77 73 20 61 72 65 20 65  ble.  Rows are e
13e60 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20 74 68  xtracted from th
13e70 65 20 51 75 65 75 65 20 74 61 62 6c 65 20 6f 6e  e Queue table on
13e80 65 20 62 79 0a 2a 2a 20 6f 6e 65 2e 20 20 45 61  e by.** one.  Ea
13e90 63 68 20 72 6f 77 20 65 78 74 72 61 63 74 65 64  ch row extracted
13ea0 20 66 72 6f 6d 20 51 75 65 75 65 20 69 73 20 6f   from Queue is o
13eb0 75 74 70 75 74 20 74 6f 20 70 44 65 73 74 2e 20  utput to pDest. 
13ec0 20 54 68 65 6e 20 74 68 65 20 73 69 6e 67 6c 65   Then the single
13ed0 0a 2a 2a 20 65 78 74 72 61 63 74 65 64 20 72 6f  .** extracted ro
13ee0 77 20 28 6e 6f 77 20 69 6e 20 74 68 65 20 69 43  w (now in the iC
13ef0 75 72 72 65 6e 74 20 74 61 62 6c 65 29 20 62 65  urrent table) be
13f00 63 6f 6d 65 73 20 74 68 65 20 63 6f 6e 74 65 6e  comes the conten
13f10 74 20 6f 66 20 74 68 65 0a 2a 2a 20 72 65 63 75  t of the.** recu
13f20 72 73 69 76 65 2d 74 61 62 6c 65 20 66 6f 72 20  rsive-table for 
13f30 61 20 72 65 63 75 72 73 69 76 65 2d 71 75 65 72  a recursive-quer
13f40 79 20 72 75 6e 2e 20 20 54 68 65 20 6f 75 74 70  y run.  The outp
13f50 75 74 20 6f 66 20 74 68 65 20 72 65 63 75 72 73  ut of the recurs
13f60 69 76 65 2d 71 75 65 72 79 0a 2a 2a 20 69 73 20  ive-query.** is 
13f70 61 64 64 65 64 20 62 61 63 6b 20 69 6e 74 6f 20  added back into 
13f80 74 68 65 20 51 75 65 75 65 20 74 61 62 6c 65 2e  the Queue table.
13f90 20 20 54 68 65 6e 20 61 6e 6f 74 68 65 72 20 72    Then another r
13fa0 6f 77 20 69 73 20 65 78 74 72 61 63 74 65 64 20  ow is extracted 
13fb0 66 72 6f 6d 20 51 75 65 75 65 0a 2a 2a 20 61 6e  from Queue.** an
13fc0 64 20 74 68 65 20 69 74 65 72 61 74 69 6f 6e 20  d the iteration 
13fd0 63 6f 6e 74 69 6e 75 65 73 20 75 6e 74 69 6c 20  continues until 
13fe0 74 68 65 20 51 75 65 75 65 20 74 61 62 6c 65 20  the Queue table 
13ff0 69 73 20 65 6d 70 74 79 2e 0a 2a 2a 0a 2a 2a 20  is empty..**.** 
14000 49 66 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20  If the compound 
14010 71 75 65 72 79 20 6f 70 65 72 61 74 6f 72 20 69  query operator i
14020 73 20 55 4e 49 4f 4e 20 74 68 65 6e 20 6e 6f 20  s UNION then no 
14030 64 75 70 6c 69 63 61 74 65 20 72 6f 77 73 20 61  duplicate rows a
14040 72 65 20 65 76 65 72 0a 2a 2a 20 69 6e 73 65 72  re ever.** inser
14050 74 65 64 20 69 6e 74 6f 20 74 68 65 20 51 75 65  ted into the Que
14060 75 65 20 74 61 62 6c 65 2e 20 20 54 68 65 20 69  ue table.  The i
14070 44 69 73 74 69 6e 63 74 20 74 61 62 6c 65 20 6b  Distinct table k
14080 65 65 70 73 20 61 20 63 6f 70 79 20 6f 66 20 61  eeps a copy of a
14090 6c 6c 20 72 6f 77 73 0a 2a 2a 20 74 68 61 74 20  ll rows.** that 
140a0 68 61 76 65 20 65 76 65 72 20 62 65 65 6e 20 69  have ever been i
140b0 6e 73 65 72 74 65 64 20 69 6e 74 6f 20 51 75 65  nserted into Que
140c0 75 65 20 61 6e 64 20 63 61 75 73 65 73 20 64 75  ue and causes du
140d0 70 6c 69 63 61 74 65 73 20 74 6f 20 62 65 0a 2a  plicates to be.*
140e0 2a 20 64 69 73 63 61 72 64 65 64 2e 20 20 49 66  * discarded.  If
140f0 20 74 68 65 20 6f 70 65 72 61 74 6f 72 20 69 73   the operator is
14100 20 55 4e 49 4f 4e 20 41 4c 4c 2c 20 74 68 65 6e   UNION ALL, then
14110 20 64 75 70 6c 69 63 61 74 65 73 20 61 72 65 20   duplicates are 
14120 61 6c 6c 6f 77 65 64 2e 0a 2a 2a 20 0a 2a 2a 20  allowed..** .** 
14130 49 66 20 74 68 65 20 71 75 65 72 79 20 68 61 73  If the query has
14140 20 61 6e 20 4f 52 44 45 52 20 42 59 2c 20 74 68   an ORDER BY, th
14150 65 6e 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68  en entries in th
14160 65 20 51 75 65 75 65 20 74 61 62 6c 65 20 61 72  e Queue table ar
14170 65 20 6b 65 70 74 20 69 6e 0a 2a 2a 20 4f 52 44  e kept in.** ORD
14180 45 52 20 42 59 20 6f 72 64 65 72 20 61 6e 64 20  ER BY order and 
14190 74 68 65 20 66 69 72 73 74 20 65 6e 74 72 79 20  the first entry 
141a0 69 73 20 65 78 74 72 61 63 74 65 64 20 66 6f 72  is extracted for
141b0 20 65 61 63 68 20 63 79 63 6c 65 2e 20 20 57 69   each cycle.  Wi
141c0 74 68 6f 75 74 0a 2a 2a 20 61 6e 20 4f 52 44 45  thout.** an ORDE
141d0 52 20 42 59 2c 20 74 68 65 20 51 75 65 75 65 20  R BY, the Queue 
141e0 74 61 62 6c 65 20 69 73 20 6a 75 73 74 20 61 20  table is just a 
141f0 46 49 46 4f 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  FIFO..**.** If a
14200 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 20 69 73   LIMIT clause is
14210 20 70 72 6f 76 69 64 65 64 2c 20 74 68 65 6e 20   provided, then 
14220 74 68 65 20 69 74 65 72 61 74 69 6f 6e 20 73 74  the iteration st
14230 6f 70 73 20 61 66 74 65 72 20 4c 49 4d 49 54 20  ops after LIMIT 
14240 72 6f 77 73 0a 2a 2a 20 68 61 76 65 20 62 65 65  rows.** have bee
14250 6e 20 6f 75 74 70 75 74 20 74 6f 20 70 44 65 73  n output to pDes
14260 74 2e 20 20 41 20 4c 49 4d 49 54 20 6f 66 20 7a  t.  A LIMIT of z
14270 65 72 6f 20 6d 65 61 6e 73 20 74 6f 20 6f 75 74  ero means to out
14280 70 75 74 20 6e 6f 20 72 6f 77 73 20 61 6e 64 20  put no rows and 
14290 61 0a 2a 2a 20 6e 65 67 61 74 69 76 65 20 4c 49  a.** negative LI
142a0 4d 49 54 20 6d 65 61 6e 73 20 74 6f 20 6f 75 74  MIT means to out
142b0 70 75 74 20 61 6c 6c 20 72 6f 77 73 2e 20 20 49  put all rows.  I
142c0 66 20 74 68 65 72 65 20 69 73 20 61 6c 73 6f 20  f there is also 
142d0 61 6e 20 4f 46 46 53 45 54 20 63 6c 61 75 73 65  an OFFSET clause
142e0 0a 2a 2a 20 77 69 74 68 20 61 20 70 6f 73 69 74  .** with a posit
142f0 69 76 65 20 76 61 6c 75 65 2c 20 74 68 65 6e 20  ive value, then 
14300 74 68 65 20 66 69 72 73 74 20 4f 46 46 53 45 54  the first OFFSET
14310 20 6f 75 74 70 75 74 73 20 61 72 65 20 64 69 73   outputs are dis
14320 63 61 72 64 65 64 20 72 61 74 68 65 72 0a 2a 2a  carded rather.**
14330 20 74 68 61 6e 20 62 65 69 6e 67 20 73 65 6e 74   than being sent
14340 20 74 6f 20 70 44 65 73 74 2e 20 20 54 68 65 20   to pDest.  The 
14350 4c 49 4d 49 54 20 63 6f 75 6e 74 20 64 6f 65 73  LIMIT count does
14360 20 6e 6f 74 20 62 65 67 69 6e 20 75 6e 74 69 6c   not begin until
14370 20 61 66 74 65 72 20 4f 46 46 53 45 54 0a 2a 2a   after OFFSET.**
14380 20 72 6f 77 73 20 68 61 76 65 20 62 65 65 6e 20   rows have been 
14390 73 6b 69 70 70 65 64 2e 0a 2a 2f 0a 73 74 61 74  skipped..*/.stat
143a0 69 63 20 76 6f 69 64 20 67 65 6e 65 72 61 74 65  ic void generate
143b0 57 69 74 68 52 65 63 75 72 73 69 76 65 51 75 65  WithRecursiveQue
143c0 72 79 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  ry(.  Parse *pPa
143d0 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50  rse,        /* P
143e0 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
143f0 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20  /.  Select *p,  
14400 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
14410 20 72 65 63 75 72 73 69 76 65 20 53 45 4c 45 43   recursive SELEC
14420 54 20 74 6f 20 62 65 20 63 6f 64 65 64 20 2a 2f  T to be coded */
14430 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 2a 70  .  SelectDest *p
14440 44 65 73 74 20 20 20 20 20 2f 2a 20 57 68 61 74  Dest     /* What
14450 20 74 6f 20 64 6f 20 77 69 74 68 20 71 75 65 72   to do with quer
14460 79 20 72 65 73 75 6c 74 73 20 2a 2f 0a 29 7b 0a  y results */.){.
14470 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63 20    SrcList *pSrc 
14480 3d 20 70 2d 3e 70 53 72 63 3b 20 20 20 20 20 20  = p->pSrc;      
14490 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c 61 75  /* The FROM clau
144a0 73 65 20 6f 66 20 74 68 65 20 72 65 63 75 72 73  se of the recurs
144b0 69 76 65 20 71 75 65 72 79 20 2a 2f 0a 20 20 69  ive query */.  i
144c0 6e 74 20 6e 43 6f 6c 20 3d 20 70 2d 3e 70 45 4c  nt nCol = p->pEL
144d0 69 73 74 2d 3e 6e 45 78 70 72 3b 20 20 2f 2a 20  ist->nExpr;  /* 
144e0 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e  Number of column
144f0 73 20 69 6e 20 74 68 65 20 72 65 63 75 72 73 69  s in the recursi
14500 76 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 56 64  ve table */.  Vd
14510 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
14520 70 56 64 62 65 3b 20 20 20 20 20 20 2f 2a 20 54  pVdbe;      /* T
14530 68 65 20 70 72 65 70 61 72 65 64 20 73 74 61 74  he prepared stat
14540 65 6d 65 6e 74 20 75 6e 64 65 72 20 63 6f 6e 73  ement under cons
14550 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 53 65  truction */.  Se
14560 6c 65 63 74 20 2a 70 53 65 74 75 70 20 3d 20 70  lect *pSetup = p
14570 2d 3e 70 50 72 69 6f 72 3b 20 20 20 2f 2a 20 54  ->pPrior;   /* T
14580 68 65 20 73 65 74 75 70 20 71 75 65 72 79 20 2a  he setup query *
14590 2f 0a 20 20 69 6e 74 20 61 64 64 72 54 6f 70 3b  /.  int addrTop;
145a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
145b0 20 20 2f 2a 20 54 6f 70 20 6f 66 20 74 68 65 20    /* Top of the 
145c0 6c 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74 20 61 64  loop */.  int ad
145d0 64 72 43 6f 6e 74 2c 20 61 64 64 72 42 72 65 61  drCont, addrBrea
145e0 6b 3b 20 20 20 20 20 20 2f 2a 20 43 4f 4e 54 49  k;      /* CONTI
145f0 4e 55 45 20 61 6e 64 20 42 52 45 41 4b 20 61 64  NUE and BREAK ad
14600 64 72 65 73 73 65 73 20 2a 2f 0a 20 20 69 6e 74  dresses */.  int
14610 20 69 43 75 72 72 65 6e 74 20 3d 20 30 3b 20 20   iCurrent = 0;  
14620 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
14630 65 20 43 75 72 72 65 6e 74 20 74 61 62 6c 65 20  e Current table 
14640 2a 2f 0a 20 20 69 6e 74 20 72 65 67 43 75 72 72  */.  int regCurr
14650 65 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  ent;            
14660 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 68     /* Register h
14670 6f 6c 64 69 6e 67 20 43 75 72 72 65 6e 74 20 74  olding Current t
14680 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 51  able */.  int iQ
14690 75 65 75 65 3b 20 20 20 20 20 20 20 20 20 20 20  ueue;           
146a0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 51          /* The Q
146b0 75 65 75 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20  ueue table */.  
146c0 69 6e 74 20 69 44 69 73 74 69 6e 63 74 20 3d 20  int iDistinct = 
146d0 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  0;            /*
146e0 20 54 6f 20 65 6e 73 75 72 65 20 75 6e 69 71 75   To ensure uniqu
146f0 65 20 72 65 73 75 6c 74 73 20 69 66 20 55 4e 49  e results if UNI
14700 4f 4e 20 2a 2f 0a 20 20 69 6e 74 20 65 44 65 73  ON */.  int eDes
14710 74 20 3d 20 53 52 54 5f 46 69 66 6f 3b 20 20 20  t = SRT_Fifo;   
14720 20 20 20 20 20 20 2f 2a 20 48 6f 77 20 74 6f 20        /* How to 
14730 77 72 69 74 65 20 74 6f 20 51 75 65 75 65 20 2a  write to Queue *
14740 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 64  /.  SelectDest d
14750 65 73 74 51 75 65 75 65 3b 20 20 20 20 20 20 20  estQueue;       
14760 20 20 2f 2a 20 53 65 6c 65 63 74 44 65 73 74 20    /* SelectDest 
14770 74 61 72 67 65 74 74 69 6e 67 20 74 68 65 20 51  targetting the Q
14780 75 65 75 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20  ueue table */.  
14790 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20  int i;          
147a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
147b0 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   Loop counter */
147c0 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
147d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
147e0 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20   /* Result code 
147f0 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
14800 4f 72 64 65 72 42 79 3b 20 20 20 20 20 20 20 20  OrderBy;        
14810 20 20 20 2f 2a 20 54 68 65 20 4f 52 44 45 52 20     /* The ORDER 
14820 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45  BY clause */.  E
14830 78 70 72 20 2a 70 4c 69 6d 69 74 3b 20 20 20 20  xpr *pLimit;    
14840 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
14850 53 61 76 65 64 20 4c 49 4d 49 54 20 61 6e 64 20  Saved LIMIT and 
14860 4f 46 46 53 45 54 20 2a 2f 0a 20 20 69 6e 74 20  OFFSET */.  int 
14870 72 65 67 4c 69 6d 69 74 2c 20 72 65 67 4f 66 66  regLimit, regOff
14880 73 65 74 3b 20 20 20 20 20 20 2f 2a 20 52 65 67  set;      /* Reg
14890 69 73 74 65 72 73 20 75 73 65 64 20 62 79 20 4c  isters used by L
148a0 49 4d 49 54 20 61 6e 64 20 4f 46 46 53 45 54 20  IMIT and OFFSET 
148b0 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  */..#ifndef SQLI
148c0 54 45 5f 4f 4d 49 54 5f 57 49 4e 44 4f 57 46 55  TE_OMIT_WINDOWFU
148d0 4e 43 0a 20 20 69 66 28 20 70 2d 3e 70 57 69 6e  NC.  if( p->pWin
148e0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
148f0 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
14900 22 63 61 6e 6e 6f 74 20 75 73 65 20 77 69 6e 64  "cannot use wind
14910 6f 77 20 66 75 6e 63 74 69 6f 6e 73 20 69 6e 20  ow functions in 
14920 72 65 63 75 72 73 69 76 65 20 71 75 65 72 69 65  recursive querie
14930 73 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b  s");.    return;
14940 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  .  }.#endif..  /
14950 2a 20 4f 62 74 61 69 6e 20 61 75 74 68 6f 72 69  * Obtain authori
14960 7a 61 74 69 6f 6e 20 74 6f 20 64 6f 20 61 20 72  zation to do a r
14970 65 63 75 72 73 69 76 65 20 71 75 65 72 79 20 2a  ecursive query *
14980 2f 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 41  /.  if( sqlite3A
14990 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c  uthCheck(pParse,
149a0 20 53 51 4c 49 54 45 5f 52 45 43 55 52 53 49 56   SQLITE_RECURSIV
149b0 45 2c 20 30 2c 20 30 2c 20 30 29 20 29 20 72 65  E, 0, 0, 0) ) re
149c0 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20 50 72 6f 63  turn;..  /* Proc
149d0 65 73 73 20 74 68 65 20 4c 49 4d 49 54 20 61 6e  ess the LIMIT an
149e0 64 20 4f 46 46 53 45 54 20 63 6c 61 75 73 65 73  d OFFSET clauses
149f0 2c 20 69 66 20 74 68 65 79 20 65 78 69 73 74 20  , if they exist 
14a00 2a 2f 0a 20 20 61 64 64 72 42 72 65 61 6b 20 3d  */.  addrBreak =
14a10 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
14a20 4c 61 62 65 6c 28 70 50 61 72 73 65 29 3b 0a 20  Label(pParse);. 
14a30 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d   p->nSelectRow =
14a40 20 33 32 30 3b 20 20 2f 2a 20 34 20 62 69 6c 6c   320;  /* 4 bill
14a50 69 6f 6e 20 72 6f 77 73 20 2a 2f 0a 20 20 63 6f  ion rows */.  co
14a60 6d 70 75 74 65 4c 69 6d 69 74 52 65 67 69 73 74  mputeLimitRegist
14a70 65 72 73 28 70 50 61 72 73 65 2c 20 70 2c 20 61  ers(pParse, p, a
14a80 64 64 72 42 72 65 61 6b 29 3b 0a 20 20 70 4c 69  ddrBreak);.  pLi
14a90 6d 69 74 20 3d 20 70 2d 3e 70 4c 69 6d 69 74 3b  mit = p->pLimit;
14aa0 0a 20 20 72 65 67 4c 69 6d 69 74 20 3d 20 70 2d  .  regLimit = p-
14ab0 3e 69 4c 69 6d 69 74 3b 0a 20 20 72 65 67 4f 66  >iLimit;.  regOf
14ac0 66 73 65 74 20 3d 20 70 2d 3e 69 4f 66 66 73 65  fset = p->iOffse
14ad0 74 3b 0a 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d  t;.  p->pLimit =
14ae0 20 30 3b 0a 20 20 70 2d 3e 69 4c 69 6d 69 74 20   0;.  p->iLimit 
14af0 3d 20 70 2d 3e 69 4f 66 66 73 65 74 20 3d 20 30  = p->iOffset = 0
14b00 3b 0a 20 20 70 4f 72 64 65 72 42 79 20 3d 20 70  ;.  pOrderBy = p
14b10 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 0a 20 20 2f  ->pOrderBy;..  /
14b20 2a 20 4c 6f 63 61 74 65 20 74 68 65 20 63 75 72  * Locate the cur
14b30 73 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20 74 68  sor number of th
14b40 65 20 43 75 72 72 65 6e 74 20 74 61 62 6c 65 20  e Current table 
14b50 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 41 4c  */.  for(i=0; AL
14b60 57 41 59 53 28 69 3c 70 53 72 63 2d 3e 6e 53 72  WAYS(i<pSrc->nSr
14b70 63 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  c); i++){.    if
14b80 28 20 70 53 72 63 2d 3e 61 5b 69 5d 2e 66 67 2e  ( pSrc->a[i].fg.
14b90 69 73 52 65 63 75 72 73 69 76 65 20 29 7b 0a 20  isRecursive ){. 
14ba0 20 20 20 20 20 69 43 75 72 72 65 6e 74 20 3d 20       iCurrent = 
14bb0 70 53 72 63 2d 3e 61 5b 69 5d 2e 69 43 75 72 73  pSrc->a[i].iCurs
14bc0 6f 72 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  or;.      break;
14bd0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
14be0 20 41 6c 6c 6f 63 61 74 65 20 63 75 72 73 6f 72   Allocate cursor
14bf0 73 20 6e 75 6d 62 65 72 73 20 66 6f 72 20 51 75  s numbers for Qu
14c00 65 75 65 20 61 6e 64 20 44 69 73 74 69 6e 63 74  eue and Distinct
14c10 2e 20 20 54 68 65 20 63 75 72 73 6f 72 20 6e 75  .  The cursor nu
14c20 6d 62 65 72 20 66 6f 72 0a 20 20 2a 2a 20 74 68  mber for.  ** th
14c30 65 20 44 69 73 74 69 6e 63 74 20 74 61 62 6c 65  e Distinct table
14c40 20 6d 75 73 74 20 62 65 20 65 78 61 63 74 6c 79   must be exactly
14c50 20 6f 6e 65 20 67 72 65 61 74 65 72 20 74 68 61   one greater tha
14c60 6e 20 51 75 65 75 65 20 69 6e 20 6f 72 64 65 72  n Queue in order
14c70 0a 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 53 52  .  ** for the SR
14c80 54 5f 44 69 73 74 46 69 66 6f 20 61 6e 64 20 53  T_DistFifo and S
14c90 52 54 5f 44 69 73 74 51 75 65 75 65 20 64 65 73  RT_DistQueue des
14ca0 74 69 6e 61 74 69 6f 6e 73 20 74 6f 20 77 6f 72  tinations to wor
14cb0 6b 2e 20 2a 2f 0a 20 20 69 51 75 65 75 65 20 3d  k. */.  iQueue =
14cc0 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b   pParse->nTab++;
14cd0 0a 20 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b  .  if( p->op==TK
14ce0 5f 55 4e 49 4f 4e 20 29 7b 0a 20 20 20 20 65 44  _UNION ){.    eD
14cf0 65 73 74 20 3d 20 70 4f 72 64 65 72 42 79 20 3f  est = pOrderBy ?
14d00 20 53 52 54 5f 44 69 73 74 51 75 65 75 65 20 3a   SRT_DistQueue :
14d10 20 53 52 54 5f 44 69 73 74 46 69 66 6f 3b 0a 20   SRT_DistFifo;. 
14d20 20 20 20 69 44 69 73 74 69 6e 63 74 20 3d 20 70     iDistinct = p
14d30 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20  Parse->nTab++;. 
14d40 20 7d 65 6c 73 65 7b 0a 20 20 20 20 65 44 65 73   }else{.    eDes
14d50 74 20 3d 20 70 4f 72 64 65 72 42 79 20 3f 20 53  t = pOrderBy ? S
14d60 52 54 5f 51 75 65 75 65 20 3a 20 53 52 54 5f 46  RT_Queue : SRT_F
14d70 69 66 6f 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  ifo;.  }.  sqlit
14d80 65 33 53 65 6c 65 63 74 44 65 73 74 49 6e 69 74  e3SelectDestInit
14d90 28 26 64 65 73 74 51 75 65 75 65 2c 20 65 44 65  (&destQueue, eDe
14da0 73 74 2c 20 69 51 75 65 75 65 29 3b 0a 0a 20 20  st, iQueue);..  
14db0 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 63 75 72 73  /* Allocate curs
14dc0 6f 72 73 20 66 6f 72 20 43 75 72 72 65 6e 74 2c  ors for Current,
14dd0 20 51 75 65 75 65 2c 20 61 6e 64 20 44 69 73 74   Queue, and Dist
14de0 69 6e 63 74 2e 20 2a 2f 0a 20 20 72 65 67 43 75  inct. */.  regCu
14df0 72 72 65 6e 74 20 3d 20 2b 2b 70 50 61 72 73 65  rrent = ++pParse
14e00 2d 3e 6e 4d 65 6d 3b 0a 20 20 73 71 6c 69 74 65  ->nMem;.  sqlite
14e10 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
14e20 50 5f 4f 70 65 6e 50 73 65 75 64 6f 2c 20 69 43  P_OpenPseudo, iC
14e30 75 72 72 65 6e 74 2c 20 72 65 67 43 75 72 72 65  urrent, regCurre
14e40 6e 74 2c 20 6e 43 6f 6c 29 3b 0a 20 20 69 66 28  nt, nCol);.  if(
14e50 20 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20   pOrderBy ){.   
14e60 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e   KeyInfo *pKeyIn
14e70 66 6f 20 3d 20 6d 75 6c 74 69 53 65 6c 65 63 74  fo = multiSelect
14e80 4f 72 64 65 72 42 79 4b 65 79 49 6e 66 6f 28 70  OrderByKeyInfo(p
14e90 50 61 72 73 65 2c 20 70 2c 20 31 29 3b 0a 20 20  Parse, p, 1);.  
14ea0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
14eb0 4f 70 34 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70  Op4(v, OP_OpenEp
14ec0 68 65 6d 65 72 61 6c 2c 20 69 51 75 65 75 65 2c  hemeral, iQueue,
14ed0 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72   pOrderBy->nExpr
14ee0 2b 32 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20  +2, 0,.         
14ef0 20 20 20 20 20 20 20 20 20 20 20 20 20 28 63 68               (ch
14f00 61 72 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50 34  ar*)pKeyInfo, P4
14f10 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 20 20 64  _KEYINFO);.    d
14f20 65 73 74 51 75 65 75 65 2e 70 4f 72 64 65 72 42  estQueue.pOrderB
14f30 79 20 3d 20 70 4f 72 64 65 72 42 79 3b 0a 20 20  y = pOrderBy;.  
14f40 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74  }else{.    sqlit
14f50 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
14f60 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c  OP_OpenEphemeral
14f70 2c 20 69 51 75 65 75 65 2c 20 6e 43 6f 6c 29 3b  , iQueue, nCol);
14f80 0a 20 20 7d 0a 20 20 56 64 62 65 43 6f 6d 6d 65  .  }.  VdbeComme
14f90 6e 74 28 28 76 2c 20 22 51 75 65 75 65 20 74 61  nt((v, "Queue ta
14fa0 62 6c 65 22 29 29 3b 0a 20 20 69 66 28 20 69 44  ble"));.  if( iD
14fb0 69 73 74 69 6e 63 74 20 29 7b 0a 20 20 20 20 70  istinct ){.    p
14fc0 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 30  ->addrOpenEphm[0
14fd0 5d 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  ] = sqlite3VdbeA
14fe0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e  ddOp2(v, OP_Open
14ff0 45 70 68 65 6d 65 72 61 6c 2c 20 69 44 69 73 74  Ephemeral, iDist
15000 69 6e 63 74 2c 20 30 29 3b 0a 20 20 20 20 70 2d  inct, 0);.    p-
15010 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f  >selFlags |= SF_
15020 55 73 65 73 45 70 68 65 6d 65 72 61 6c 3b 0a 20  UsesEphemeral;. 
15030 20 7d 0a 0a 20 20 2f 2a 20 44 65 74 61 63 68 20   }..  /* Detach 
15040 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
15050 75 73 65 20 66 72 6f 6d 20 74 68 65 20 63 6f 6d  use from the com
15060 70 6f 75 6e 64 20 53 45 4c 45 43 54 20 2a 2f 0a  pound SELECT */.
15070 20 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20    p->pOrderBy = 
15080 30 3b 0a 0a 20 20 2f 2a 20 53 74 6f 72 65 20 74  0;..  /* Store t
15090 68 65 20 72 65 73 75 6c 74 73 20 6f 66 20 74 68  he results of th
150a0 65 20 73 65 74 75 70 2d 71 75 65 72 79 20 69 6e  e setup-query in
150b0 20 51 75 65 75 65 2e 20 2a 2f 0a 20 20 70 53 65   Queue. */.  pSe
150c0 74 75 70 2d 3e 70 4e 65 78 74 20 3d 20 30 3b 0a  tup->pNext = 0;.
150d0 20 20 45 78 70 6c 61 69 6e 51 75 65 72 79 50 6c    ExplainQueryPl
150e0 61 6e 28 28 70 50 61 72 73 65 2c 20 31 2c 20 22  an((pParse, 1, "
150f0 53 45 54 55 50 22 29 29 3b 0a 20 20 72 63 20 3d  SETUP"));.  rc =
15100 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70   sqlite3Select(p
15110 50 61 72 73 65 2c 20 70 53 65 74 75 70 2c 20 26  Parse, pSetup, &
15120 64 65 73 74 51 75 65 75 65 29 3b 0a 20 20 70 53  destQueue);.  pS
15130 65 74 75 70 2d 3e 70 4e 65 78 74 20 3d 20 70 3b  etup->pNext = p;
15140 0a 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f  .  if( rc ) goto
15150 20 65 6e 64 5f 6f 66 5f 72 65 63 75 72 73 69 76   end_of_recursiv
15160 65 5f 71 75 65 72 79 3b 0a 0a 20 20 2f 2a 20 46  e_query;..  /* F
15170 69 6e 64 20 74 68 65 20 6e 65 78 74 20 72 6f 77  ind the next row
15180 20 69 6e 20 74 68 65 20 51 75 65 75 65 20 61 6e   in the Queue an
15190 64 20 6f 75 74 70 75 74 20 74 68 61 74 20 72 6f  d output that ro
151a0 77 20 2a 2f 0a 20 20 61 64 64 72 54 6f 70 20 3d  w */.  addrTop =
151b0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
151c0 70 32 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c  p2(v, OP_Rewind,
151d0 20 69 51 75 65 75 65 2c 20 61 64 64 72 42 72 65   iQueue, addrBre
151e0 61 6b 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  ak); VdbeCoverag
151f0 65 28 76 29 3b 0a 0a 20 20 2f 2a 20 54 72 61 6e  e(v);..  /* Tran
15200 73 66 65 72 20 74 68 65 20 6e 65 78 74 20 72 6f  sfer the next ro
15210 77 20 69 6e 20 51 75 65 75 65 20 6f 76 65 72 20  w in Queue over 
15220 74 6f 20 43 75 72 72 65 6e 74 20 2a 2f 0a 20 20  to Current */.  
15230 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
15240 31 28 76 2c 20 4f 50 5f 4e 75 6c 6c 52 6f 77 2c  1(v, OP_NullRow,
15250 20 69 43 75 72 72 65 6e 74 29 3b 20 2f 2a 20 54   iCurrent); /* T
15260 6f 20 72 65 73 65 74 20 63 6f 6c 75 6d 6e 20 63  o reset column c
15270 61 63 68 65 20 2a 2f 0a 20 20 69 66 28 20 70 4f  ache */.  if( pO
15280 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 73 71  rderBy ){.    sq
15290 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
152a0 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69 51  v, OP_Column, iQ
152b0 75 65 75 65 2c 20 70 4f 72 64 65 72 42 79 2d 3e  ueue, pOrderBy->
152c0 6e 45 78 70 72 2b 31 2c 20 72 65 67 43 75 72 72  nExpr+1, regCurr
152d0 65 6e 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ent);.  }else{. 
152e0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
152f0 64 4f 70 32 28 76 2c 20 4f 50 5f 52 6f 77 44 61  dOp2(v, OP_RowDa
15300 74 61 2c 20 69 51 75 65 75 65 2c 20 72 65 67 43  ta, iQueue, regC
15310 75 72 72 65 6e 74 29 3b 0a 20 20 7d 0a 20 20 73  urrent);.  }.  s
15320 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
15330 28 76 2c 20 4f 50 5f 44 65 6c 65 74 65 2c 20 69  (v, OP_Delete, i
15340 51 75 65 75 65 29 3b 0a 0a 20 20 2f 2a 20 4f 75  Queue);..  /* Ou
15350 74 70 75 74 20 74 68 65 20 73 69 6e 67 6c 65 20  tput the single 
15360 72 6f 77 20 69 6e 20 43 75 72 72 65 6e 74 20 2a  row in Current *
15370 2f 0a 20 20 61 64 64 72 43 6f 6e 74 20 3d 20 73  /.  addrCont = s
15380 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
15390 62 65 6c 28 70 50 61 72 73 65 29 3b 0a 20 20 63  bel(pParse);.  c
153a0 6f 64 65 4f 66 66 73 65 74 28 76 2c 20 72 65 67  odeOffset(v, reg
153b0 4f 66 66 73 65 74 2c 20 61 64 64 72 43 6f 6e 74  Offset, addrCont
153c0 29 3b 0a 20 20 73 65 6c 65 63 74 49 6e 6e 65 72  );.  selectInner
153d0 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20 70 2c 20  Loop(pParse, p, 
153e0 69 43 75 72 72 65 6e 74 2c 0a 20 20 20 20 20 20  iCurrent,.      
153f0 30 2c 20 30 2c 20 70 44 65 73 74 2c 20 61 64 64  0, 0, pDest, add
15400 72 43 6f 6e 74 2c 20 61 64 64 72 42 72 65 61 6b  rCont, addrBreak
15410 29 3b 0a 20 20 69 66 28 20 72 65 67 4c 69 6d 69  );.  if( regLimi
15420 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  t ){.    sqlite3
15430 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
15440 5f 44 65 63 72 4a 75 6d 70 5a 65 72 6f 2c 20 72  _DecrJumpZero, r
15450 65 67 4c 69 6d 69 74 2c 20 61 64 64 72 42 72 65  egLimit, addrBre
15460 61 6b 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 76  ak);.    VdbeCov
15470 65 72 61 67 65 28 76 29 3b 0a 20 20 7d 0a 20 20  erage(v);.  }.  
15480 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
15490 76 65 4c 61 62 65 6c 28 76 2c 20 61 64 64 72 43  veLabel(v, addrC
154a0 6f 6e 74 29 3b 0a 0a 20 20 2f 2a 20 45 78 65 63  ont);..  /* Exec
154b0 75 74 65 20 74 68 65 20 72 65 63 75 72 73 69 76  ute the recursiv
154c0 65 20 53 45 4c 45 43 54 20 74 61 6b 69 6e 67 20  e SELECT taking 
154d0 74 68 65 20 73 69 6e 67 6c 65 20 72 6f 77 20 69  the single row i
154e0 6e 20 43 75 72 72 65 6e 74 20 61 73 0a 20 20 2a  n Current as.  *
154f0 2a 20 74 68 65 20 76 61 6c 75 65 20 66 6f 72 20  * the value for 
15500 74 68 65 20 72 65 63 75 72 73 69 76 65 2d 74 61  the recursive-ta
15510 62 6c 65 2e 20 53 74 6f 72 65 20 74 68 65 20 72  ble. Store the r
15520 65 73 75 6c 74 73 20 69 6e 20 74 68 65 20 51 75  esults in the Qu
15530 65 75 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  eue..  */.  if( 
15540 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46  p->selFlags & SF
15550 5f 41 67 67 72 65 67 61 74 65 20 29 7b 0a 20 20  _Aggregate ){.  
15560 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
15570 67 28 70 50 61 72 73 65 2c 20 22 72 65 63 75 72  g(pParse, "recur
15580 73 69 76 65 20 61 67 67 72 65 67 61 74 65 20 71  sive aggregate q
15590 75 65 72 69 65 73 20 6e 6f 74 20 73 75 70 70 6f  ueries not suppo
155a0 72 74 65 64 22 29 3b 0a 20 20 7d 65 6c 73 65 7b  rted");.  }else{
155b0 0a 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d  .    p->pPrior =
155c0 20 30 3b 0a 20 20 20 20 45 78 70 6c 61 69 6e 51   0;.    ExplainQ
155d0 75 65 72 79 50 6c 61 6e 28 28 70 50 61 72 73 65  ueryPlan((pParse
155e0 2c 20 31 2c 20 22 52 45 43 55 52 53 49 56 45 20  , 1, "RECURSIVE 
155f0 53 54 45 50 22 29 29 3b 0a 20 20 20 20 73 71 6c  STEP"));.    sql
15600 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73  ite3Select(pPars
15610 65 2c 20 70 2c 20 26 64 65 73 74 51 75 65 75 65  e, p, &destQueue
15620 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
15630 2d 3e 70 50 72 69 6f 72 3d 3d 30 20 29 3b 0a 20  ->pPrior==0 );. 
15640 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70     p->pPrior = p
15650 53 65 74 75 70 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  Setup;.  }..  /*
15660 20 4b 65 65 70 20 72 75 6e 6e 69 6e 67 20 74 68   Keep running th
15670 65 20 6c 6f 6f 70 20 75 6e 74 69 6c 20 74 68 65  e loop until the
15680 20 51 75 65 75 65 20 69 73 20 65 6d 70 74 79 20   Queue is empty 
15690 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  */.  sqlite3Vdbe
156a0 47 6f 74 6f 28 76 2c 20 61 64 64 72 54 6f 70 29  Goto(v, addrTop)
156b0 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 52  ;.  sqlite3VdbeR
156c0 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61  esolveLabel(v, a
156d0 64 64 72 42 72 65 61 6b 29 3b 0a 0a 65 6e 64 5f  ddrBreak);..end_
156e0 6f 66 5f 72 65 63 75 72 73 69 76 65 5f 71 75 65  of_recursive_que
156f0 72 79 3a 0a 20 20 73 71 6c 69 74 65 33 45 78 70  ry:.  sqlite3Exp
15700 72 4c 69 73 74 44 65 6c 65 74 65 28 70 50 61 72  rListDelete(pPar
15710 73 65 2d 3e 64 62 2c 20 70 2d 3e 70 4f 72 64 65  se->db, p->pOrde
15720 72 42 79 29 3b 0a 20 20 70 2d 3e 70 4f 72 64 65  rBy);.  p->pOrde
15730 72 42 79 20 3d 20 70 4f 72 64 65 72 42 79 3b 0a  rBy = pOrderBy;.
15740 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 70 4c    p->pLimit = pL
15750 69 6d 69 74 3b 0a 20 20 72 65 74 75 72 6e 3b 0a  imit;.  return;.
15760 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
15770 54 45 5f 4f 4d 49 54 5f 43 54 45 20 2a 2f 0a 0a  TE_OMIT_CTE */..
15780 2f 2a 20 46 6f 72 77 61 72 64 20 72 65 66 65 72  /* Forward refer
15790 65 6e 63 65 73 20 2a 2f 0a 73 74 61 74 69 63 20  ences */.static 
157a0 69 6e 74 20 6d 75 6c 74 69 53 65 6c 65 63 74 4f  int multiSelectO
157b0 72 64 65 72 42 79 28 0a 20 20 50 61 72 73 65 20  rderBy(.  Parse 
157c0 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
157d0 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
157e0 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  xt */.  Select *
157f0 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  p,            /*
15800 20 54 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20   The right-most 
15810 6f 66 20 53 45 4c 45 43 54 73 20 74 6f 20 62 65  of SELECTs to be
15820 20 63 6f 64 65 64 20 2a 2f 0a 20 20 53 65 6c 65   coded */.  Sele
15830 63 74 44 65 73 74 20 2a 70 44 65 73 74 20 20 20  ctDest *pDest   
15840 20 20 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f 20    /* What to do 
15850 77 69 74 68 20 71 75 65 72 79 20 72 65 73 75 6c  with query resul
15860 74 73 20 2a 2f 0a 29 3b 0a 0a 2f 2a 0a 2a 2a 20  ts */.);../*.** 
15870 48 61 6e 64 6c 65 20 74 68 65 20 73 70 65 63 69  Handle the speci
15880 61 6c 20 63 61 73 65 20 6f 66 20 61 20 63 6f 6d  al case of a com
15890 70 6f 75 6e 64 2d 73 65 6c 65 63 74 20 74 68 61  pound-select tha
158a0 74 20 6f 72 69 67 69 6e 61 74 65 73 20 66 72 6f  t originates fro
158b0 6d 20 61 0a 2a 2a 20 56 41 4c 55 45 53 20 63 6c  m a.** VALUES cl
158c0 61 75 73 65 2e 20 20 42 79 20 68 61 6e 64 6c 69  ause.  By handli
158d0 6e 67 20 74 68 69 73 20 61 73 20 61 20 73 70 65  ng this as a spe
158e0 63 69 61 6c 20 63 61 73 65 2c 20 77 65 20 61 76  cial case, we av
158f0 6f 69 64 20 64 65 65 70 0a 2a 2a 20 72 65 63 75  oid deep.** recu
15900 72 73 69 6f 6e 2c 20 61 6e 64 20 74 68 75 73 20  rsion, and thus 
15910 64 6f 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 65  do not need to e
15920 6e 66 6f 72 63 65 20 74 68 65 20 53 51 4c 49 54  nforce the SQLIT
15930 45 5f 4c 49 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44  E_LIMIT_COMPOUND
15940 5f 53 45 4c 45 43 54 0a 2a 2a 20 6f 6e 20 61 20  _SELECT.** on a 
15950 56 41 4c 55 45 53 20 63 6c 61 75 73 65 2e 0a 2a  VALUES clause..*
15960 2a 0a 2a 2a 20 42 65 63 61 75 73 65 20 74 68 65  *.** Because the
15970 20 53 65 6c 65 63 74 20 6f 62 6a 65 63 74 20 6f   Select object o
15980 72 69 67 69 6e 61 74 65 73 20 66 72 6f 6d 20 61  riginates from a
15990 20 56 41 4c 55 45 53 20 63 6c 61 75 73 65 3a 0a   VALUES clause:.
159a0 2a 2a 20 20 20 28 31 29 20 54 68 65 72 65 20 69  **   (1) There i
159b0 73 20 6e 6f 20 4c 49 4d 49 54 20 6f 72 20 4f 46  s no LIMIT or OF
159c0 46 53 45 54 20 6f 72 20 65 6c 73 65 20 74 68 65  FSET or else the
159d0 72 65 20 69 73 20 61 20 4c 49 4d 49 54 20 6f 66  re is a LIMIT of
159e0 20 65 78 61 63 74 6c 79 20 31 0a 2a 2a 20 20 20   exactly 1.**   
159f0 28 32 29 20 41 6c 6c 20 74 65 72 6d 73 20 61 72  (2) All terms ar
15a00 65 20 55 4e 49 4f 4e 20 41 4c 4c 0a 2a 2a 20 20  e UNION ALL.**  
15a10 20 28 33 29 20 54 68 65 72 65 20 69 73 20 6e 6f   (3) There is no
15a20 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
15a30 0a 2a 2a 0a 2a 2a 20 54 68 65 20 22 4c 49 4d 49  .**.** The "LIMI
15a40 54 20 6f 66 20 65 78 61 63 74 6c 79 20 31 22 20  T of exactly 1" 
15a50 63 61 73 65 20 6f 66 20 63 6f 6e 64 69 74 69 6f  case of conditio
15a60 6e 20 28 31 29 20 63 6f 6d 65 73 20 61 62 6f 75  n (1) comes abou
15a70 74 20 77 68 65 6e 20 61 20 56 41 4c 55 45 53 0a  t when a VALUES.
15a80 2a 2a 20 63 6c 61 75 73 65 20 6f 63 63 75 72 73  ** clause occurs
15a90 20 77 69 74 68 69 6e 20 73 63 61 6c 61 72 20 65   within scalar e
15aa0 78 70 72 65 73 73 69 6f 6e 20 28 65 78 3a 20 22  xpression (ex: "
15ab0 53 45 4c 45 43 54 20 28 56 41 4c 55 45 53 28 31  SELECT (VALUES(1
15ac0 29 2c 28 32 29 2c 28 33 29 29 22 29 2e 0a 2a 2a  ),(2),(3))")..**
15ad0 20 54 68 65 20 73 71 6c 69 74 65 33 43 6f 64 65   The sqlite3Code
15ae0 53 75 62 73 65 6c 65 63 74 20 77 69 6c 6c 20 68  Subselect will h
15af0 61 76 65 20 61 64 64 65 64 20 74 68 65 20 4c 49  ave added the LI
15b00 4d 49 54 20 31 20 63 6c 61 75 73 65 20 69 6e 20  MIT 1 clause in 
15b10 74 68 74 20 63 61 73 65 2e 0a 2a 2a 20 53 69 6e  tht case..** Sin
15b20 63 65 20 74 68 65 20 6c 69 6d 69 74 20 69 73 20  ce the limit is 
15b30 65 78 61 63 74 6c 79 20 31 2c 20 77 65 20 6f 6e  exactly 1, we on
15b40 6c 79 20 6e 65 65 64 20 74 6f 20 65 76 61 6c 75  ly need to evalu
15b50 74 65 73 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73  tes the left-mos
15b60 74 20 56 41 4c 55 45 53 2e 0a 2a 2f 0a 73 74 61  t VALUES..*/.sta
15b70 74 69 63 20 69 6e 74 20 6d 75 6c 74 69 53 65 6c  tic int multiSel
15b80 65 63 74 56 61 6c 75 65 73 28 0a 20 20 50 61 72  ectValues(.  Par
15b90 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
15ba0 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
15bb0 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63  ntext */.  Selec
15bc0 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  t *p,           
15bd0 20 2f 2a 20 54 68 65 20 72 69 67 68 74 2d 6d 6f   /* The right-mo
15be0 73 74 20 6f 66 20 53 45 4c 45 43 54 73 20 74 6f  st of SELECTs to
15bf0 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20 53   be coded */.  S
15c00 65 6c 65 63 74 44 65 73 74 20 2a 70 44 65 73 74  electDest *pDest
15c10 20 20 20 20 20 2f 2a 20 57 68 61 74 20 74 6f 20       /* What to 
15c20 64 6f 20 77 69 74 68 20 71 75 65 72 79 20 72 65  do with query re
15c30 73 75 6c 74 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e  sults */.){.  in
15c40 74 20 6e 52 6f 77 20 3d 20 31 3b 0a 20 20 69 6e  t nRow = 1;.  in
15c50 74 20 72 63 20 3d 20 30 3b 0a 20 20 69 6e 74 20  t rc = 0;.  int 
15c60 62 53 68 6f 77 41 6c 6c 20 3d 20 70 2d 3e 70 4c  bShowAll = p->pL
15c70 69 6d 69 74 3d 3d 30 3b 0a 20 20 61 73 73 65 72  imit==0;.  asser
15c80 74 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26  t( p->selFlags &
15c90 20 53 46 5f 4d 75 6c 74 69 56 61 6c 75 65 20 29   SF_MultiValue )
15ca0 3b 0a 20 20 64 6f 7b 0a 20 20 20 20 61 73 73 65  ;.  do{.    asse
15cb0 72 74 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20  rt( p->selFlags 
15cc0 26 20 53 46 5f 56 61 6c 75 65 73 20 29 3b 0a 20  & SF_Values );. 
15cd0 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6f 70     assert( p->op
15ce0 3d 3d 54 4b 5f 41 4c 4c 20 7c 7c 20 28 70 2d 3e  ==TK_ALL || (p->
15cf0 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 26 26  op==TK_SELECT &&
15d00 20 70 2d 3e 70 50 72 69 6f 72 3d 3d 30 29 20 29   p->pPrior==0) )
15d10 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  ;.    assert( p-
15d20 3e 70 4e 65 78 74 3d 3d 30 20 7c 7c 20 70 2d 3e  >pNext==0 || p->
15d30 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 70  pEList->nExpr==p
15d40 2d 3e 70 4e 65 78 74 2d 3e 70 45 4c 69 73 74 2d  ->pNext->pEList-
15d50 3e 6e 45 78 70 72 20 29 3b 0a 20 20 20 20 69 66  >nExpr );.    if
15d60 28 20 70 2d 3e 70 50 72 69 6f 72 3d 3d 30 20 29  ( p->pPrior==0 )
15d70 20 62 72 65 61 6b 3b 0a 20 20 20 20 61 73 73 65   break;.    asse
15d80 72 74 28 20 70 2d 3e 70 50 72 69 6f 72 2d 3e 70  rt( p->pPrior->p
15d90 4e 65 78 74 3d 3d 70 20 29 3b 0a 20 20 20 20 70  Next==p );.    p
15da0 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20   = p->pPrior;.  
15db0 20 20 6e 52 6f 77 20 2b 3d 20 62 53 68 6f 77 41    nRow += bShowA
15dc0 6c 6c 3b 0a 20 20 7d 77 68 69 6c 65 28 31 29 3b  ll;.  }while(1);
15dd0 0a 20 20 45 78 70 6c 61 69 6e 51 75 65 72 79 50  .  ExplainQueryP
15de0 6c 61 6e 28 28 70 50 61 72 73 65 2c 20 30 2c 20  lan((pParse, 0, 
15df0 22 53 43 41 4e 20 25 64 20 43 4f 4e 53 54 41 4e  "SCAN %d CONSTAN
15e00 54 20 52 4f 57 25 73 22 2c 20 6e 52 6f 77 2c 0a  T ROW%s", nRow,.
15e10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15e20 20 20 20 20 6e 52 6f 77 3d 3d 31 20 3f 20 22 22      nRow==1 ? ""
15e30 20 3a 20 22 53 22 29 29 3b 0a 20 20 77 68 69 6c   : "S"));.  whil
15e40 65 28 20 70 20 29 7b 0a 20 20 20 20 73 65 6c 65  e( p ){.    sele
15e50 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72  ctInnerLoop(pPar
15e60 73 65 2c 20 70 2c 20 2d 31 2c 20 30 2c 20 30 2c  se, p, -1, 0, 0,
15e70 20 70 44 65 73 74 2c 20 31 2c 20 31 29 3b 0a 20   pDest, 1, 1);. 
15e80 20 20 20 69 66 28 20 21 62 53 68 6f 77 41 6c 6c     if( !bShowAll
15e90 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 70 2d   ) break;.    p-
15ea0 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 6e 52  >nSelectRow = nR
15eb0 6f 77 3b 0a 20 20 20 20 70 20 3d 20 70 2d 3e 70  ow;.    p = p->p
15ec0 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 72 65 74 75  Next;.  }.  retu
15ed0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
15ee0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
15ef0 63 61 6c 6c 65 64 20 74 6f 20 70 72 6f 63 65 73  called to proces
15f00 73 20 61 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65  s a compound que
15f10 72 79 20 66 6f 72 6d 20 66 72 6f 6d 0a 2a 2a 20  ry form from.** 
15f20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 73 65 70 61  two or more sepa
15f30 72 61 74 65 20 71 75 65 72 69 65 73 20 75 73 69  rate queries usi
15f40 6e 67 20 55 4e 49 4f 4e 2c 20 55 4e 49 4f 4e 20  ng UNION, UNION 
15f50 41 4c 4c 2c 20 45 58 43 45 50 54 2c 20 6f 72 0a  ALL, EXCEPT, or.
15f60 2a 2a 20 49 4e 54 45 52 53 45 43 54 0a 2a 2a 0a  ** INTERSECT.**.
15f70 2a 2a 20 22 70 22 20 70 6f 69 6e 74 73 20 74 6f  ** "p" points to
15f80 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20   the right-most 
15f90 6f 66 20 74 68 65 20 74 77 6f 20 71 75 65 72 69  of the two queri
15fa0 65 73 2e 20 20 74 68 65 20 71 75 65 72 79 20 6f  es.  the query o
15fb0 6e 20 74 68 65 0a 2a 2a 20 6c 65 66 74 20 69 73  n the.** left is
15fc0 20 70 2d 3e 70 50 72 69 6f 72 2e 20 20 54 68 65   p->pPrior.  The
15fd0 20 6c 65 66 74 20 71 75 65 72 79 20 63 6f 75 6c   left query coul
15fe0 64 20 61 6c 73 6f 20 62 65 20 61 20 63 6f 6d 70  d also be a comp
15ff0 6f 75 6e 64 20 71 75 65 72 79 0a 2a 2a 20 69 6e  ound query.** in
16000 20 77 68 69 63 68 20 63 61 73 65 20 74 68 69 73   which case this
16010 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 62 65   routine will be
16020 20 63 61 6c 6c 65 64 20 72 65 63 75 72 73 69 76   called recursiv
16030 65 6c 79 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ely. .**.** The 
16040 72 65 73 75 6c 74 73 20 6f 66 20 74 68 65 20 74  results of the t
16050 6f 74 61 6c 20 71 75 65 72 79 20 61 72 65 20 74  otal query are t
16060 6f 20 62 65 20 77 72 69 74 74 65 6e 20 69 6e 74  o be written int
16070 6f 20 61 20 64 65 73 74 69 6e 61 74 69 6f 6e 0a  o a destination.
16080 2a 2a 20 6f 66 20 74 79 70 65 20 65 44 65 73 74  ** of type eDest
16090 20 77 69 74 68 20 70 61 72 61 6d 65 74 65 72 20   with parameter 
160a0 69 50 61 72 6d 2e 0a 2a 2a 0a 2a 2a 20 45 78 61  iParm..**.** Exa
160b0 6d 70 6c 65 20 31 3a 20 20 43 6f 6e 73 69 64 65  mple 1:  Conside
160c0 72 20 61 20 74 68 72 65 65 2d 77 61 79 20 63 6f  r a three-way co
160d0 6d 70 6f 75 6e 64 20 53 51 4c 20 73 74 61 74 65  mpound SQL state
160e0 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20  ment..**.**     
160f0 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 74 31  SELECT a FROM t1
16100 20 55 4e 49 4f 4e 20 53 45 4c 45 43 54 20 62 20   UNION SELECT b 
16110 46 52 4f 4d 20 74 32 20 55 4e 49 4f 4e 20 53 45  FROM t2 UNION SE
16120 4c 45 43 54 20 63 20 46 52 4f 4d 20 74 33 0a 2a  LECT c FROM t3.*
16130 2a 0a 2a 2a 20 54 68 69 73 20 73 74 61 74 65 6d  *.** This statem
16140 65 6e 74 20 69 73 20 70 61 72 73 65 64 20 75 70  ent is parsed up
16150 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a   as follows:.**.
16160 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 63 20  **     SELECT c 
16170 46 52 4f 4d 20 74 33 0a 2a 2a 20 20 20 20 20 20  FROM t3.**      
16180 7c 0a 2a 2a 20 20 20 20 20 20 60 2d 2d 2d 2d 2d  |.**      `-----
16190 3e 20 20 53 45 4c 45 43 54 20 62 20 46 52 4f 4d  >  SELECT b FROM
161a0 20 74 32 0a 2a 2a 20 20 20 20 20 20 20 20 20 20   t2.**          
161b0 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20        |.**      
161c0 20 20 20 20 20 20 20 20 20 20 60 2d 2d 2d 2d 2d            `-----
161d0 2d 3e 20 20 53 45 4c 45 43 54 20 61 20 46 52 4f  ->  SELECT a FRO
161e0 4d 20 74 31 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61  M t1.**.** The a
161f0 72 72 6f 77 73 20 69 6e 20 74 68 65 20 64 69 61  rrows in the dia
16200 67 72 61 6d 20 61 62 6f 76 65 20 72 65 70 72 65  gram above repre
16210 73 65 6e 74 20 74 68 65 20 53 65 6c 65 63 74 2e  sent the Select.
16220 70 50 72 69 6f 72 20 70 6f 69 6e 74 65 72 2e 0a  pPrior pointer..
16230 2a 2a 20 53 6f 20 69 66 20 74 68 69 73 20 72 6f  ** So if this ro
16240 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
16250 77 69 74 68 20 70 20 65 71 75 61 6c 20 74 6f 20  with p equal to 
16260 74 68 65 20 74 33 20 71 75 65 72 79 2c 20 74 68  the t3 query, th
16270 65 6e 0a 2a 2a 20 70 50 72 69 6f 72 20 77 69 6c  en.** pPrior wil
16280 6c 20 62 65 20 74 68 65 20 74 32 20 71 75 65 72  l be the t2 quer
16290 79 2e 20 20 70 2d 3e 6f 70 20 77 69 6c 6c 20 62  y.  p->op will b
162a0 65 20 54 4b 5f 55 4e 49 4f 4e 20 69 6e 20 74 68  e TK_UNION in th
162b0 69 73 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 4e  is case..**.** N
162c0 6f 74 69 63 65 20 74 68 61 74 20 62 65 63 61 75  otice that becau
162d0 73 65 20 6f 66 20 74 68 65 20 77 61 79 20 53 51  se of the way SQ
162e0 4c 69 74 65 20 70 61 72 73 65 73 20 63 6f 6d 70  Lite parses comp
162f0 6f 75 6e 64 20 53 45 4c 45 43 54 73 2c 20 74 68  ound SELECTs, th
16300 65 0a 2a 2a 20 69 6e 64 69 76 69 64 75 61 6c 20  e.** individual 
16310 73 65 6c 65 63 74 73 20 61 6c 77 61 79 73 20 67  selects always g
16320 72 6f 75 70 20 66 72 6f 6d 20 6c 65 66 74 20 74  roup from left t
16330 6f 20 72 69 67 68 74 2e 0a 2a 2f 0a 73 74 61 74  o right..*/.stat
16340 69 63 20 69 6e 74 20 6d 75 6c 74 69 53 65 6c 65  ic int multiSele
16350 63 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  ct(.  Parse *pPa
16360 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50  rse,        /* P
16370 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
16380 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20  /.  Select *p,  
16390 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
163a0 20 72 69 67 68 74 2d 6d 6f 73 74 20 6f 66 20 53   right-most of S
163b0 45 4c 45 43 54 73 20 74 6f 20 62 65 20 63 6f 64  ELECTs to be cod
163c0 65 64 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65  ed */.  SelectDe
163d0 73 74 20 2a 70 44 65 73 74 20 20 20 20 20 2f 2a  st *pDest     /*
163e0 20 57 68 61 74 20 74 6f 20 64 6f 20 77 69 74 68   What to do with
163f0 20 71 75 65 72 79 20 72 65 73 75 6c 74 73 20 2a   query results *
16400 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  /.){.  int rc = 
16410 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 2f 2a 20  SQLITE_OK;   /* 
16420 53 75 63 63 65 73 73 20 63 6f 64 65 20 66 72 6f  Success code fro
16430 6d 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20 2a  m a subroutine *
16440 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 50 72 69  /.  Select *pPri
16450 6f 72 3b 20 20 20 20 20 20 20 2f 2a 20 41 6e 6f  or;       /* Ano
16460 74 68 65 72 20 53 45 4c 45 43 54 20 69 6d 6d 65  ther SELECT imme
16470 64 69 61 74 65 6c 79 20 74 6f 20 6f 75 72 20 6c  diately to our l
16480 65 66 74 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76  eft */.  Vdbe *v
16490 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
164a0 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
164b0 74 6f 20 74 68 69 73 20 56 44 42 45 20 2a 2f 0a  to this VDBE */.
164c0 20 20 53 65 6c 65 63 74 44 65 73 74 20 64 65 73    SelectDest des
164d0 74 3b 20 20 20 20 20 20 2f 2a 20 41 6c 74 65 72  t;      /* Alter
164e0 6e 61 74 69 76 65 20 64 61 74 61 20 64 65 73 74  native data dest
164f0 69 6e 61 74 69 6f 6e 20 2a 2f 0a 20 20 53 65 6c  ination */.  Sel
16500 65 63 74 20 2a 70 44 65 6c 65 74 65 20 3d 20 30  ect *pDelete = 0
16510 3b 20 20 2f 2a 20 43 68 61 69 6e 20 6f 66 20 73  ;  /* Chain of s
16520 69 6d 70 6c 65 20 73 65 6c 65 63 74 73 20 74 6f  imple selects to
16530 20 64 65 6c 65 74 65 20 2a 2f 0a 20 20 73 71 6c   delete */.  sql
16540 69 74 65 33 20 2a 64 62 3b 20 20 20 20 20 20 20  ite3 *db;       
16550 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63     /* Database c
16560 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 0a 20 20  onnection */..  
16570 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65  /* Make sure the
16580 72 65 20 69 73 20 6e 6f 20 4f 52 44 45 52 20 42  re is no ORDER B
16590 59 20 6f 72 20 4c 49 4d 49 54 20 63 6c 61 75 73  Y or LIMIT claus
165a0 65 20 6f 6e 20 70 72 69 6f 72 20 53 45 4c 45 43  e on prior SELEC
165b0 54 73 2e 20 20 4f 6e 6c 79 0a 20 20 2a 2a 20 74  Ts.  Only.  ** t
165c0 68 65 20 6c 61 73 74 20 28 72 69 67 68 74 2d 6d  he last (right-m
165d0 6f 73 74 29 20 53 45 4c 45 43 54 20 69 6e 20 74  ost) SELECT in t
165e0 68 65 20 73 65 72 69 65 73 20 6d 61 79 20 68 61  he series may ha
165f0 76 65 20 61 6e 20 4f 52 44 45 52 20 42 59 20 6f  ve an ORDER BY o
16600 72 20 4c 49 4d 49 54 2e 0a 20 20 2a 2f 0a 20 20  r LIMIT..  */.  
16610 61 73 73 65 72 74 28 20 70 20 26 26 20 70 2d 3e  assert( p && p->
16620 70 50 72 69 6f 72 20 29 3b 20 20 2f 2a 20 43 61  pPrior );  /* Ca
16630 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 67  lling function g
16640 75 61 72 61 6e 74 65 65 73 20 74 68 69 73 20 6d  uarantees this m
16650 75 63 68 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  uch */.  assert(
16660 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20   (p->selFlags & 
16670 53 46 5f 52 65 63 75 72 73 69 76 65 29 3d 3d 30  SF_Recursive)==0
16680 20 7c 7c 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c   || p->op==TK_AL
16690 4c 20 7c 7c 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55  L || p->op==TK_U
166a0 4e 49 4f 4e 20 29 3b 0a 20 20 61 73 73 65 72 74  NION );.  assert
166b0 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20  ( p->selFlags & 
166c0 53 46 5f 43 6f 6d 70 6f 75 6e 64 20 29 3b 0a 20  SF_Compound );. 
166d0 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62   db = pParse->db
166e0 3b 0a 20 20 70 50 72 69 6f 72 20 3d 20 70 2d 3e  ;.  pPrior = p->
166f0 70 50 72 69 6f 72 3b 0a 20 20 64 65 73 74 20 3d  pPrior;.  dest =
16700 20 2a 70 44 65 73 74 3b 0a 20 20 69 66 28 20 70   *pDest;.  if( p
16710 50 72 69 6f 72 2d 3e 70 4f 72 64 65 72 42 79 20  Prior->pOrderBy 
16720 7c 7c 20 70 50 72 69 6f 72 2d 3e 70 4c 69 6d 69  || pPrior->pLimi
16730 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  t ){.    sqlite3
16740 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
16750 22 25 73 20 63 6c 61 75 73 65 20 73 68 6f 75 6c  "%s clause shoul
16760 64 20 63 6f 6d 65 20 61 66 74 65 72 20 25 73 20  d come after %s 
16770 6e 6f 74 20 62 65 66 6f 72 65 22 2c 0a 20 20 20  not before",.   
16780 20 20 20 70 50 72 69 6f 72 2d 3e 70 4f 72 64 65     pPrior->pOrde
16790 72 42 79 21 3d 30 20 3f 20 22 4f 52 44 45 52 20  rBy!=0 ? "ORDER 
167a0 42 59 22 20 3a 20 22 4c 49 4d 49 54 22 2c 20 73  BY" : "LIMIT", s
167b0 65 6c 65 63 74 4f 70 4e 61 6d 65 28 70 2d 3e 6f  electOpName(p->o
167c0 70 29 29 3b 0a 20 20 20 20 72 63 20 3d 20 31 3b  p));.    rc = 1;
167d0 0a 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f  .    goto multi_
167e0 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a  select_end;.  }.
167f0 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65  .  v = sqlite3Ge
16800 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20  tVdbe(pParse);. 
16810 20 61 73 73 65 72 74 28 20 76 21 3d 30 20 29 3b   assert( v!=0 );
16820 20 20 2f 2a 20 54 68 65 20 56 44 42 45 20 61 6c    /* The VDBE al
16830 72 65 61 64 79 20 63 72 65 61 74 65 64 20 62 79  ready created by
16840 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f   calling functio
16850 6e 20 2a 2f 0a 0a 20 20 2f 2a 20 43 72 65 61 74  n */..  /* Creat
16860 65 20 74 68 65 20 64 65 73 74 69 6e 61 74 69 6f  e the destinatio
16870 6e 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  n temporary tabl
16880 65 20 69 66 20 6e 65 63 65 73 73 61 72 79 0a 20  e if necessary. 
16890 20 2a 2f 0a 20 20 69 66 28 20 64 65 73 74 2e 65   */.  if( dest.e
168a0 44 65 73 74 3d 3d 53 52 54 5f 45 70 68 65 6d 54  Dest==SRT_EphemT
168b0 61 62 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  ab ){.    assert
168c0 28 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20  ( p->pEList );. 
168d0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
168e0 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45  dOp2(v, OP_OpenE
168f0 70 68 65 6d 65 72 61 6c 2c 20 64 65 73 74 2e 69  phemeral, dest.i
16900 53 44 50 61 72 6d 2c 20 70 2d 3e 70 45 4c 69 73  SDParm, p->pELis
16910 74 2d 3e 6e 45 78 70 72 29 3b 0a 20 20 20 20 64  t->nExpr);.    d
16920 65 73 74 2e 65 44 65 73 74 20 3d 20 53 52 54 5f  est.eDest = SRT_
16930 54 61 62 6c 65 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  Table;.  }..  /*
16940 20 53 70 65 63 69 61 6c 20 68 61 6e 64 6c 69 6e   Special handlin
16950 67 20 66 6f 72 20 61 20 63 6f 6d 70 6f 75 6e 64  g for a compound
16960 2d 73 65 6c 65 63 74 20 74 68 61 74 20 6f 72 69  -select that ori
16970 67 69 6e 61 74 65 73 20 61 73 20 61 20 56 41 4c  ginates as a VAL
16980 55 45 53 20 63 6c 61 75 73 65 2e 0a 20 20 2a 2f  UES clause..  */
16990 0a 20 20 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61  .  if( p->selFla
169a0 67 73 20 26 20 53 46 5f 4d 75 6c 74 69 56 61 6c  gs & SF_MultiVal
169b0 75 65 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 6d  ue ){.    rc = m
169c0 75 6c 74 69 53 65 6c 65 63 74 56 61 6c 75 65 73  ultiSelectValues
169d0 28 70 50 61 72 73 65 2c 20 70 2c 20 26 64 65 73  (pParse, p, &des
169e0 74 29 3b 0a 20 20 20 20 67 6f 74 6f 20 6d 75 6c  t);.    goto mul
169f0 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20  ti_select_end;. 
16a00 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75   }..  /* Make su
16a10 72 65 20 61 6c 6c 20 53 45 4c 45 43 54 73 20 69  re all SELECTs i
16a20 6e 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  n the statement 
16a30 68 61 76 65 20 74 68 65 20 73 61 6d 65 20 6e 75  have the same nu
16a40 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73  mber of elements
16a50 0a 20 20 2a 2a 20 69 6e 20 74 68 65 69 72 20 72  .  ** in their r
16a60 65 73 75 6c 74 20 73 65 74 73 2e 0a 20 20 2a 2f  esult sets..  */
16a70 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45  .  assert( p->pE
16a80 4c 69 73 74 20 26 26 20 70 50 72 69 6f 72 2d 3e  List && pPrior->
16a90 70 45 4c 69 73 74 20 29 3b 0a 20 20 61 73 73 65  pEList );.  asse
16aa0 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e  rt( p->pEList->n
16ab0 45 78 70 72 3d 3d 70 50 72 69 6f 72 2d 3e 70 45  Expr==pPrior->pE
16ac0 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 3b 0a 0a  List->nExpr );..
16ad0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
16ae0 4d 49 54 5f 43 54 45 0a 20 20 69 66 28 20 70 2d  MIT_CTE.  if( p-
16af0 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 52  >selFlags & SF_R
16b00 65 63 75 72 73 69 76 65 20 29 7b 0a 20 20 20 20  ecursive ){.    
16b10 67 65 6e 65 72 61 74 65 57 69 74 68 52 65 63 75  generateWithRecu
16b20 72 73 69 76 65 51 75 65 72 79 28 70 50 61 72 73  rsiveQuery(pPars
16b30 65 2c 20 70 2c 20 26 64 65 73 74 29 3b 0a 20 20  e, p, &dest);.  
16b40 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 0a 20 20  }else.#endif..  
16b50 2f 2a 20 43 6f 6d 70 6f 75 6e 64 20 53 45 4c 45  /* Compound SELE
16b60 43 54 73 20 74 68 61 74 20 68 61 76 65 20 61 6e  CTs that have an
16b70 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
16b80 20 61 72 65 20 68 61 6e 64 6c 65 64 20 73 65 70   are handled sep
16b90 61 72 61 74 65 6c 79 2e 0a 20 20 2a 2f 0a 20 20  arately..  */.  
16ba0 69 66 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 20  if( p->pOrderBy 
16bb0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 6d 75  ){.    return mu
16bc0 6c 74 69 53 65 6c 65 63 74 4f 72 64 65 72 42 79  ltiSelectOrderBy
16bd0 28 70 50 61 72 73 65 2c 20 70 2c 20 70 44 65 73  (pParse, p, pDes
16be0 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 0a 23 69  t);.  }else{..#i
16bf0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
16c00 54 5f 45 58 50 4c 41 49 4e 0a 20 20 20 20 69 66  T_EXPLAIN.    if
16c10 28 20 70 50 72 69 6f 72 2d 3e 70 50 72 69 6f 72  ( pPrior->pPrior
16c20 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 45 78 70  ==0 ){.      Exp
16c30 6c 61 69 6e 51 75 65 72 79 50 6c 61 6e 28 28 70  lainQueryPlan((p
16c40 50 61 72 73 65 2c 20 31 2c 20 22 43 4f 4d 50 4f  Parse, 1, "COMPO
16c50 55 4e 44 20 51 55 45 52 59 22 29 29 3b 0a 20 20  UND QUERY"));.  
16c60 20 20 20 20 45 78 70 6c 61 69 6e 51 75 65 72 79      ExplainQuery
16c70 50 6c 61 6e 28 28 70 50 61 72 73 65 2c 20 31 2c  Plan((pParse, 1,
16c80 20 22 4c 45 46 54 2d 4d 4f 53 54 20 53 55 42 51   "LEFT-MOST SUBQ
16c90 55 45 52 59 22 29 29 3b 0a 20 20 20 20 7d 0a 23  UERY"));.    }.#
16ca0 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 47 65  endif..    /* Ge
16cb0 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20  nerate code for 
16cc0 74 68 65 20 6c 65 66 74 20 61 6e 64 20 72 69 67  the left and rig
16cd0 68 74 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  ht SELECT statem
16ce0 65 6e 74 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ents..    */.   
16cf0 20 73 77 69 74 63 68 28 20 70 2d 3e 6f 70 20 29   switch( p->op )
16d00 7b 0a 20 20 20 20 20 20 63 61 73 65 20 54 4b 5f  {.      case TK_
16d10 41 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 20 20 69  ALL: {.        i
16d20 6e 74 20 61 64 64 72 20 3d 20 30 3b 0a 20 20 20  nt addr = 0;.   
16d30 20 20 20 20 20 69 6e 74 20 6e 4c 69 6d 69 74 3b       int nLimit;
16d40 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
16d50 20 21 70 50 72 69 6f 72 2d 3e 70 4c 69 6d 69 74   !pPrior->pLimit
16d60 20 29 3b 0a 20 20 20 20 20 20 20 20 70 50 72 69   );.        pPri
16d70 6f 72 2d 3e 69 4c 69 6d 69 74 20 3d 20 70 2d 3e  or->iLimit = p->
16d80 69 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 20 20  iLimit;.        
16d90 70 50 72 69 6f 72 2d 3e 69 4f 66 66 73 65 74 20  pPrior->iOffset 
16da0 3d 20 70 2d 3e 69 4f 66 66 73 65 74 3b 0a 20 20  = p->iOffset;.  
16db0 20 20 20 20 20 20 70 50 72 69 6f 72 2d 3e 70 4c        pPrior->pL
16dc0 69 6d 69 74 20 3d 20 70 2d 3e 70 4c 69 6d 69 74  imit = p->pLimit
16dd0 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  ;.        rc = s
16de0 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61  qlite3Select(pPa
16df0 72 73 65 2c 20 70 50 72 69 6f 72 2c 20 26 64 65  rse, pPrior, &de
16e00 73 74 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e  st);.        p->
16e10 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20  pLimit = 0;.    
16e20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
16e30 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c          goto mul
16e40 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20  ti_select_end;. 
16e50 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
16e60 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a   p->pPrior = 0;.
16e70 20 20 20 20 20 20 20 20 70 2d 3e 69 4c 69 6d 69          p->iLimi
16e80 74 20 3d 20 70 50 72 69 6f 72 2d 3e 69 4c 69 6d  t = pPrior->iLim
16e90 69 74 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 69  it;.        p->i
16ea0 4f 66 66 73 65 74 20 3d 20 70 50 72 69 6f 72 2d  Offset = pPrior-
16eb0 3e 69 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20  >iOffset;.      
16ec0 20 20 69 66 28 20 70 2d 3e 69 4c 69 6d 69 74 20    if( p->iLimit 
16ed0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 64 64  ){.          add
16ee0 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  r = sqlite3VdbeA
16ef0 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66 4e 6f  ddOp1(v, OP_IfNo
16f00 74 2c 20 70 2d 3e 69 4c 69 6d 69 74 29 3b 20 56  t, p->iLimit); V
16f10 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
16f20 20 20 20 20 20 20 20 20 20 20 56 64 62 65 43 6f            VdbeCo
16f30 6d 6d 65 6e 74 28 28 76 2c 20 22 4a 75 6d 70 20  mment((v, "Jump 
16f40 61 68 65 61 64 20 69 66 20 4c 49 4d 49 54 20 72  ahead if LIMIT r
16f50 65 61 63 68 65 64 22 29 29 3b 0a 20 20 20 20 20  eached"));.     
16f60 20 20 20 20 20 69 66 28 20 70 2d 3e 69 4f 66 66       if( p->iOff
16f70 73 65 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20  set ){.         
16f80 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
16f90 64 4f 70 33 28 76 2c 20 4f 50 5f 4f 66 66 73 65  dOp3(v, OP_Offse
16fa0 74 4c 69 6d 69 74 2c 0a 20 20 20 20 20 20 20 20  tLimit,.        
16fb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16fc0 20 20 20 20 20 20 70 2d 3e 69 4c 69 6d 69 74 2c        p->iLimit,
16fd0 20 70 2d 3e 69 4f 66 66 73 65 74 2b 31 2c 20 70   p->iOffset+1, p
16fe0 2d 3e 69 4f 66 66 73 65 74 29 3b 0a 20 20 20 20  ->iOffset);.    
16ff0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
17000 7d 0a 20 20 20 20 20 20 20 20 45 78 70 6c 61 69  }.        Explai
17010 6e 51 75 65 72 79 50 6c 61 6e 28 28 70 50 61 72  nQueryPlan((pPar
17020 73 65 2c 20 31 2c 20 22 55 4e 49 4f 4e 20 41 4c  se, 1, "UNION AL
17030 4c 22 29 29 3b 0a 20 20 20 20 20 20 20 20 72 63  L"));.        rc
17040 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74   = sqlite3Select
17050 28 70 50 61 72 73 65 2c 20 70 2c 20 26 64 65 73  (pParse, p, &des
17060 74 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74  t);.        test
17070 63 61 73 65 28 20 72 63 21 3d 53 51 4c 49 54 45  case( rc!=SQLITE
17080 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 20 20 70  _OK );.        p
17090 44 65 6c 65 74 65 20 3d 20 70 2d 3e 70 50 72 69  Delete = p->pPri
170a0 6f 72 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 70  or;.        p->p
170b0 50 72 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a  Prior = pPrior;.
170c0 20 20 20 20 20 20 20 20 70 2d 3e 6e 53 65 6c 65          p->nSele
170d0 63 74 52 6f 77 20 3d 20 73 71 6c 69 74 65 33 4c  ctRow = sqlite3L
170e0 6f 67 45 73 74 41 64 64 28 70 2d 3e 6e 53 65 6c  ogEstAdd(p->nSel
170f0 65 63 74 52 6f 77 2c 20 70 50 72 69 6f 72 2d 3e  ectRow, pPrior->
17100 6e 53 65 6c 65 63 74 52 6f 77 29 3b 0a 20 20 20  nSelectRow);.   
17110 20 20 20 20 20 69 66 28 20 70 50 72 69 6f 72 2d       if( pPrior-
17120 3e 70 4c 69 6d 69 74 0a 20 20 20 20 20 20 20 20  >pLimit.        
17130 20 26 26 20 73 71 6c 69 74 65 33 45 78 70 72 49   && sqlite3ExprI
17140 73 49 6e 74 65 67 65 72 28 70 50 72 69 6f 72 2d  sInteger(pPrior-
17150 3e 70 4c 69 6d 69 74 2d 3e 70 4c 65 66 74 2c 20  >pLimit->pLeft, 
17160 26 6e 4c 69 6d 69 74 29 0a 20 20 20 20 20 20 20  &nLimit).       
17170 20 20 26 26 20 6e 4c 69 6d 69 74 3e 30 20 26 26    && nLimit>0 &&
17180 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3e   p->nSelectRow >
17190 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 28   sqlite3LogEst((
171a0 75 36 34 29 6e 4c 69 6d 69 74 29 20 0a 20 20 20  u64)nLimit) .   
171b0 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
171c0 20 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20    p->nSelectRow 
171d0 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28  = sqlite3LogEst(
171e0 28 75 36 34 29 6e 4c 69 6d 69 74 29 3b 0a 20 20  (u64)nLimit);.  
171f0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
17200 69 66 28 20 61 64 64 72 20 29 7b 0a 20 20 20 20  if( addr ){.    
17210 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
17220 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64  eJumpHere(v, add
17230 72 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  r);.        }.  
17240 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
17250 20 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65 20     }.      case 
17260 54 4b 5f 45 58 43 45 50 54 3a 0a 20 20 20 20 20  TK_EXCEPT:.     
17270 20 63 61 73 65 20 54 4b 5f 55 4e 49 4f 4e 3a 20   case TK_UNION: 
17280 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 75 6e  {.        int un
17290 69 6f 6e 54 61 62 3b 20 20 20 20 2f 2a 20 43 75  ionTab;    /* Cu
172a0 72 73 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20 74  rsor number of t
172b0 68 65 20 74 65 6d 70 20 74 61 62 6c 65 20 68 6f  he temp table ho
172c0 6c 64 69 6e 67 20 72 65 73 75 6c 74 20 2a 2f 0a  lding result */.
172d0 20 20 20 20 20 20 20 20 75 38 20 6f 70 20 3d 20          u8 op = 
172e0 30 3b 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20  0;       /* One 
172f0 6f 66 20 74 68 65 20 53 52 54 5f 20 6f 70 65 72  of the SRT_ oper
17300 61 74 69 6f 6e 73 20 74 6f 20 61 70 70 6c 79 20  ations to apply 
17310 74 6f 20 73 65 6c 66 20 2a 2f 0a 20 20 20 20 20  to self */.     
17320 20 20 20 69 6e 74 20 70 72 69 6f 72 4f 70 3b 20     int priorOp; 
17330 20 20 20 20 2f 2a 20 54 68 65 20 53 52 54 5f 20      /* The SRT_ 
17340 6f 70 65 72 61 74 69 6f 6e 20 74 6f 20 61 70 70  operation to app
17350 6c 79 20 74 6f 20 70 72 69 6f 72 20 73 65 6c 65  ly to prior sele
17360 63 74 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 45  cts */.        E
17370 78 70 72 20 2a 70 4c 69 6d 69 74 3b 20 20 20 20  xpr *pLimit;    
17380 2f 2a 20 53 61 76 65 64 20 76 61 6c 75 65 73 20  /* Saved values 
17390 6f 66 20 70 2d 3e 6e 4c 69 6d 69 74 20 20 2a 2f  of p->nLimit  */
173a0 0a 20 20 20 20 20 20 20 20 69 6e 74 20 61 64 64  .        int add
173b0 72 3b 0a 20 20 20 20 20 20 20 20 53 65 6c 65 63  r;.        Selec
173c0 74 44 65 73 74 20 75 6e 69 6f 6e 64 65 73 74 3b  tDest uniondest;
173d0 0a 20 20 0a 20 20 20 20 20 20 20 20 74 65 73 74  .  .        test
173e0 63 61 73 65 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f  case( p->op==TK_
173f0 45 58 43 45 50 54 20 29 3b 0a 20 20 20 20 20 20  EXCEPT );.      
17400 20 20 74 65 73 74 63 61 73 65 28 20 70 2d 3e 6f    testcase( p->o
17410 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29 3b 0a 20  p==TK_UNION );. 
17420 20 20 20 20 20 20 20 70 72 69 6f 72 4f 70 20 3d         priorOp =
17430 20 53 52 54 5f 55 6e 69 6f 6e 3b 0a 20 20 20 20   SRT_Union;.    
17440 20 20 20 20 69 66 28 20 64 65 73 74 2e 65 44 65      if( dest.eDe
17450 73 74 3d 3d 70 72 69 6f 72 4f 70 20 29 7b 0a 20  st==priorOp ){. 
17460 20 20 20 20 20 20 20 20 20 2f 2a 20 57 65 20 63           /* We c
17470 61 6e 20 72 65 75 73 65 20 61 20 74 65 6d 70 6f  an reuse a tempo
17480 72 61 72 79 20 74 61 62 6c 65 20 67 65 6e 65 72  rary table gener
17490 61 74 65 64 20 62 79 20 61 20 53 45 4c 45 43 54  ated by a SELECT
174a0 20 74 6f 20 6f 75 72 0a 20 20 20 20 20 20 20 20   to our.        
174b0 20 20 2a 2a 20 72 69 67 68 74 2e 0a 20 20 20 20    ** right..    
174c0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
174d0 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4c     assert( p->pL
174e0 69 6d 69 74 3d 3d 30 20 29 3b 20 20 20 20 20 20  imit==0 );      
174f0 2f 2a 20 4e 6f 74 20 61 6c 6c 6f 77 65 64 20 6f  /* Not allowed o
17500 6e 20 6c 65 66 74 77 61 72 64 20 65 6c 65 6d 65  n leftward eleme
17510 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  nts */.         
17520 20 75 6e 69 6f 6e 54 61 62 20 3d 20 64 65 73 74   unionTab = dest
17530 2e 69 53 44 50 61 72 6d 3b 0a 20 20 20 20 20 20  .iSDParm;.      
17540 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
17550 20 20 20 2f 2a 20 57 65 20 77 69 6c 6c 20 6e 65     /* We will ne
17560 65 64 20 74 6f 20 63 72 65 61 74 65 20 6f 75 72  ed to create our
17570 20 6f 77 6e 20 74 65 6d 70 6f 72 61 72 79 20 74   own temporary t
17580 61 62 6c 65 20 74 6f 20 68 6f 6c 64 20 74 68 65  able to hold the
17590 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69 6e  .          ** in
175a0 74 65 72 6d 65 64 69 61 74 65 20 72 65 73 75 6c  termediate resul
175b0 74 73 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f  ts..          */
175c0 0a 20 20 20 20 20 20 20 20 20 20 75 6e 69 6f 6e  .          union
175d0 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54  Tab = pParse->nT
175e0 61 62 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20  ab++;.          
175f0 61 73 73 65 72 74 28 20 70 2d 3e 70 4f 72 64 65  assert( p->pOrde
17600 72 42 79 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  rBy==0 );.      
17610 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74      addr = sqlit
17620 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
17630 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c  OP_OpenEphemeral
17640 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 30 29 3b 0a  , unionTab, 0);.
17650 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
17660 28 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68  ( p->addrOpenEph
17670 6d 5b 30 5d 20 3d 3d 20 2d 31 20 29 3b 0a 20 20  m[0] == -1 );.  
17680 20 20 20 20 20 20 20 20 70 2d 3e 61 64 64 72 4f          p->addrO
17690 70 65 6e 45 70 68 6d 5b 30 5d 20 3d 20 61 64 64  penEphm[0] = add
176a0 72 3b 0a 20 20 20 20 20 20 20 20 20 20 66 69 6e  r;.          fin
176b0 64 52 69 67 68 74 6d 6f 73 74 28 70 29 2d 3e 73  dRightmost(p)->s
176c0 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f 55 73  elFlags |= SF_Us
176d0 65 73 45 70 68 65 6d 65 72 61 6c 3b 0a 20 20 20  esEphemeral;.   
176e0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
176f0 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20 20 20  ->pEList );.    
17700 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 20 20 20      }.  .       
17710 20 2f 2a 20 43 6f 64 65 20 74 68 65 20 53 45 4c   /* Code the SEL
17720 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73 20 74  ECT statements t
17730 6f 20 6f 75 72 20 6c 65 66 74 0a 20 20 20 20 20  o our left.     
17740 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73     */.        as
17750 73 65 72 74 28 20 21 70 50 72 69 6f 72 2d 3e 70  sert( !pPrior->p
17760 4f 72 64 65 72 42 79 20 29 3b 0a 20 20 20 20 20  OrderBy );.     
17770 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74     sqlite3Select
17780 44 65 73 74 49 6e 69 74 28 26 75 6e 69 6f 6e 64  DestInit(&uniond
17790 65 73 74 2c 20 70 72 69 6f 72 4f 70 2c 20 75 6e  est, priorOp, un
177a0 69 6f 6e 54 61 62 29 3b 0a 20 20 20 20 20 20 20  ionTab);.       
177b0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53 65 6c   rc = sqlite3Sel
177c0 65 63 74 28 70 50 61 72 73 65 2c 20 70 50 72 69  ect(pParse, pPri
177d0 6f 72 2c 20 26 75 6e 69 6f 6e 64 65 73 74 29 3b  or, &uniondest);
177e0 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20  .        if( rc 
177f0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  ){.          got
17800 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65  o multi_select_e
17810 6e 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  nd;.        }.  
17820 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 64 65  .        /* Code
17830 20 74 68 65 20 63 75 72 72 65 6e 74 20 53 45 4c   the current SEL
17840 45 43 54 20 73 74 61 74 65 6d 65 6e 74 0a 20 20  ECT statement.  
17850 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
17860 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 45   if( p->op==TK_E
17870 58 43 45 50 54 20 29 7b 0a 20 20 20 20 20 20 20  XCEPT ){.       
17880 20 20 20 6f 70 20 3d 20 53 52 54 5f 45 78 63 65     op = SRT_Exce
17890 70 74 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  pt;.        }els
178a0 65 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  e{.          ass
178b0 65 72 74 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55  ert( p->op==TK_U
178c0 4e 49 4f 4e 20 29 3b 0a 20 20 20 20 20 20 20 20  NION );.        
178d0 20 20 6f 70 20 3d 20 53 52 54 5f 55 6e 69 6f 6e    op = SRT_Union
178e0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
178f0 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20      p->pPrior = 
17900 30 3b 0a 20 20 20 20 20 20 20 20 70 4c 69 6d 69  0;.        pLimi
17910 74 20 3d 20 70 2d 3e 70 4c 69 6d 69 74 3b 0a 20  t = p->pLimit;. 
17920 20 20 20 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74         p->pLimit
17930 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 75 6e   = 0;.        un
17940 69 6f 6e 64 65 73 74 2e 65 44 65 73 74 20 3d 20  iondest.eDest = 
17950 6f 70 3b 0a 20 20 20 20 20 20 20 20 45 78 70 6c  op;.        Expl
17960 61 69 6e 51 75 65 72 79 50 6c 61 6e 28 28 70 50  ainQueryPlan((pP
17970 61 72 73 65 2c 20 31 2c 20 22 25 73 20 55 53 49  arse, 1, "%s USI
17980 4e 47 20 54 45 4d 50 20 42 2d 54 52 45 45 22 2c  NG TEMP B-TREE",
17990 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
179a0 20 20 20 20 20 20 20 20 20 20 20 73 65 6c 65 63             selec
179b0 74 4f 70 4e 61 6d 65 28 70 2d 3e 6f 70 29 29 29  tOpName(p->op)))
179c0 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  ;.        rc = s
179d0 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61  qlite3Select(pPa
179e0 72 73 65 2c 20 70 2c 20 26 75 6e 69 6f 6e 64 65  rse, p, &unionde
179f0 73 74 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73  st);.        tes
17a00 74 63 61 73 65 28 20 72 63 21 3d 53 51 4c 49 54  tcase( rc!=SQLIT
17a10 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 20 20  E_OK );.        
17a20 2f 2a 20 51 75 65 72 79 20 66 6c 61 74 74 65 6e  /* Query flatten
17a30 69 6e 67 20 69 6e 20 73 71 6c 69 74 65 33 53 65  ing in sqlite3Se
17a40 6c 65 63 74 28 29 20 6d 69 67 68 74 20 72 65 66  lect() might ref
17a50 69 6c 6c 20 70 2d 3e 70 4f 72 64 65 72 42 79 2e  ill p->pOrderBy.
17a60 0a 20 20 20 20 20 20 20 20 2a 2a 20 42 65 20 73  .        ** Be s
17a70 75 72 65 20 74 6f 20 64 65 6c 65 74 65 20 70 2d  ure to delete p-
17a80 3e 70 4f 72 64 65 72 42 79 2c 20 74 68 65 72 65  >pOrderBy, there
17a90 66 6f 72 65 2c 20 74 6f 20 61 76 6f 69 64 20 61  fore, to avoid a
17aa0 20 6d 65 6d 6f 72 79 20 6c 65 61 6b 2e 20 2a 2f   memory leak. */
17ab0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
17ac0 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64  ExprListDelete(d
17ad0 62 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79 29 3b  b, p->pOrderBy);
17ae0 0a 20 20 20 20 20 20 20 20 70 44 65 6c 65 74 65  .        pDelete
17af0 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20   = p->pPrior;.  
17b00 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20        p->pPrior 
17b10 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20  = pPrior;.      
17b20 20 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20    p->pOrderBy = 
17b30 30 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  0;.        if( p
17b40 2d 3e 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29  ->op==TK_UNION )
17b50 7b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 6e  {.          p->n
17b60 53 65 6c 65 63 74 52 6f 77 20 3d 20 73 71 6c 69  SelectRow = sqli
17b70 74 65 33 4c 6f 67 45 73 74 41 64 64 28 70 2d 3e  te3LogEstAdd(p->
17b80 6e 53 65 6c 65 63 74 52 6f 77 2c 20 70 50 72 69  nSelectRow, pPri
17b90 6f 72 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 29 3b  or->nSelectRow);
17ba0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
17bb0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65     sqlite3ExprDe
17bc0 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 4c 69 6d  lete(db, p->pLim
17bd0 69 74 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e  it);.        p->
17be0 70 4c 69 6d 69 74 20 3d 20 70 4c 69 6d 69 74 3b  pLimit = pLimit;
17bf0 0a 20 20 20 20 20 20 20 20 70 2d 3e 69 4c 69 6d  .        p->iLim
17c00 69 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  it = 0;.        
17c10 70 2d 3e 69 4f 66 66 73 65 74 20 3d 20 30 3b 0a  p->iOffset = 0;.
17c20 20 20 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 6f    .        /* Co
17c30 6e 76 65 72 74 20 74 68 65 20 64 61 74 61 20 69  nvert the data i
17c40 6e 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20  n the temporary 
17c50 74 61 62 6c 65 20 69 6e 74 6f 20 77 68 61 74 65  table into whate
17c60 76 65 72 20 66 6f 72 6d 0a 20 20 20 20 20 20 20  ver form.       
17c70 20 2a 2a 20 69 74 20 69 73 20 74 68 61 74 20 77   ** it is that w
17c80 65 20 63 75 72 72 65 6e 74 6c 79 20 6e 65 65 64  e currently need
17c90 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
17ca0 20 20 20 20 20 61 73 73 65 72 74 28 20 75 6e 69       assert( uni
17cb0 6f 6e 54 61 62 3d 3d 64 65 73 74 2e 69 53 44 50  onTab==dest.iSDP
17cc0 61 72 6d 20 7c 7c 20 64 65 73 74 2e 65 44 65 73  arm || dest.eDes
17cd0 74 21 3d 70 72 69 6f 72 4f 70 20 29 3b 0a 20 20  t!=priorOp );.  
17ce0 20 20 20 20 20 20 69 66 28 20 64 65 73 74 2e 65        if( dest.e
17cf0 44 65 73 74 21 3d 70 72 69 6f 72 4f 70 20 29 7b  Dest!=priorOp ){
17d00 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 69  .          int i
17d10 43 6f 6e 74 2c 20 69 42 72 65 61 6b 2c 20 69 53  Cont, iBreak, iS
17d20 74 61 72 74 3b 0a 20 20 20 20 20 20 20 20 20 20  tart;.          
17d30 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73  assert( p->pELis
17d40 74 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  t );.          i
17d50 42 72 65 61 6b 20 3d 20 73 71 6c 69 74 65 33 56  Break = sqlite3V
17d60 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 70 50 61  dbeMakeLabel(pPa
17d70 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  rse);.          
17d80 69 43 6f 6e 74 20 3d 20 73 71 6c 69 74 65 33 56  iCont = sqlite3V
17d90 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 70 50 61  dbeMakeLabel(pPa
17da0 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  rse);.          
17db0 63 6f 6d 70 75 74 65 4c 69 6d 69 74 52 65 67 69  computeLimitRegi
17dc0 73 74 65 72 73 28 70 50 61 72 73 65 2c 20 70 2c  sters(pParse, p,
17dd0 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20   iBreak);.      
17de0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
17df0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 77 69  ddOp2(v, OP_Rewi
17e00 6e 64 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 69 42  nd, unionTab, iB
17e10 72 65 61 6b 29 3b 20 56 64 62 65 43 6f 76 65 72  reak); VdbeCover
17e20 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20  age(v);.        
17e30 20 20 69 53 74 61 72 74 20 3d 20 73 71 6c 69 74    iStart = sqlit
17e40 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
17e50 72 28 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20  r(v);.          
17e60 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28  selectInnerLoop(
17e70 70 50 61 72 73 65 2c 20 70 2c 20 75 6e 69 6f 6e  pParse, p, union
17e80 54 61 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20  Tab,.           
17e90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
17ea0 2c 20 30 2c 20 26 64 65 73 74 2c 20 69 43 6f 6e  , 0, &dest, iCon
17eb0 74 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20  t, iBreak);.    
17ec0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
17ed0 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
17ee0 20 69 43 6f 6e 74 29 3b 0a 20 20 20 20 20 20 20   iCont);.       
17ef0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
17f00 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c  dOp2(v, OP_Next,
17f10 20 75 6e 69 6f 6e 54 61 62 2c 20 69 53 74 61 72   unionTab, iStar
17f20 74 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  t); VdbeCoverage
17f30 28 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73  (v);.          s
17f40 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
17f50 65 4c 61 62 65 6c 28 76 2c 20 69 42 72 65 61 6b  eLabel(v, iBreak
17f60 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
17f70 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
17f80 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 75 6e 69 6f  , OP_Close, unio
17f90 6e 54 61 62 2c 20 30 29 3b 0a 20 20 20 20 20 20  nTab, 0);.      
17fa0 20 20 7d 0a 20 20 20 20 20 20 20 20 62 72 65 61    }.        brea
17fb0 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
17fc0 20 64 65 66 61 75 6c 74 3a 20 61 73 73 65 72 74   default: assert
17fd0 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 54 45  ( p->op==TK_INTE
17fe0 52 53 45 43 54 20 29 3b 20 7b 0a 20 20 20 20 20  RSECT ); {.     
17ff0 20 20 20 69 6e 74 20 74 61 62 31 2c 20 74 61 62     int tab1, tab
18000 32 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69  2;.        int i
18010 43 6f 6e 74 2c 20 69 42 72 65 61 6b 2c 20 69 53  Cont, iBreak, iS
18020 74 61 72 74 3b 0a 20 20 20 20 20 20 20 20 45 78  tart;.        Ex
18030 70 72 20 2a 70 4c 69 6d 69 74 3b 0a 20 20 20 20  pr *pLimit;.    
18040 20 20 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20      int addr;.  
18050 20 20 20 20 20 20 53 65 6c 65 63 74 44 65 73 74        SelectDest
18060 20 69 6e 74 65 72 73 65 63 74 64 65 73 74 3b 0a   intersectdest;.
18070 20 20 20 20 20 20 20 20 69 6e 74 20 72 31 3b 0a          int r1;.
18080 20 20 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 4e    .        /* IN
18090 54 45 52 53 45 43 54 20 69 73 20 64 69 66 66 65  TERSECT is diffe
180a0 72 65 6e 74 20 66 72 6f 6d 20 74 68 65 20 6f 74  rent from the ot
180b0 68 65 72 73 20 73 69 6e 63 65 20 69 74 20 72 65  hers since it re
180c0 71 75 69 72 65 73 0a 20 20 20 20 20 20 20 20 2a  quires.        *
180d0 2a 20 74 77 6f 20 74 65 6d 70 6f 72 61 72 79 20  * two temporary 
180e0 74 61 62 6c 65 73 2e 20 20 48 65 6e 63 65 20 69  tables.  Hence i
180f0 74 20 68 61 73 20 69 74 73 20 6f 77 6e 20 63 61  t has its own ca
18100 73 65 2e 20 20 42 65 67 69 6e 0a 20 20 20 20 20  se.  Begin.     
18110 20 20 20 2a 2a 20 62 79 20 61 6c 6c 6f 63 61 74     ** by allocat
18120 69 6e 67 20 74 68 65 20 74 61 62 6c 65 73 20 77  ing the tables w
18130 65 20 77 69 6c 6c 20 6e 65 65 64 2e 0a 20 20 20  e will need..   
18140 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
18150 74 61 62 31 20 3d 20 70 50 61 72 73 65 2d 3e 6e  tab1 = pParse->n
18160 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 20 20 74  Tab++;.        t
18170 61 62 32 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54  ab2 = pParse->nT
18180 61 62 2b 2b 3b 0a 20 20 20 20 20 20 20 20 61 73  ab++;.        as
18190 73 65 72 74 28 20 70 2d 3e 70 4f 72 64 65 72 42  sert( p->pOrderB
181a0 79 3d 3d 30 20 29 3b 0a 20 20 0a 20 20 20 20 20  y==0 );.  .     
181b0 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65     addr = sqlite
181c0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
181d0 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c  P_OpenEphemeral,
181e0 20 74 61 62 31 2c 20 30 29 3b 0a 20 20 20 20 20   tab1, 0);.     
181f0 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 64     assert( p->ad
18200 64 72 4f 70 65 6e 45 70 68 6d 5b 30 5d 20 3d 3d  drOpenEphm[0] ==
18210 20 2d 31 20 29 3b 0a 20 20 20 20 20 20 20 20 70   -1 );.        p
18220 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 30  ->addrOpenEphm[0
18230 5d 20 3d 20 61 64 64 72 3b 0a 20 20 20 20 20 20  ] = addr;.      
18240 20 20 66 69 6e 64 52 69 67 68 74 6d 6f 73 74 28    findRightmost(
18250 70 29 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20  p)->selFlags |= 
18260 53 46 5f 55 73 65 73 45 70 68 65 6d 65 72 61 6c  SF_UsesEphemeral
18270 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
18280 28 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20  ( p->pEList );. 
18290 20 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 64   .        /* Cod
182a0 65 20 74 68 65 20 53 45 4c 45 43 54 73 20 74 6f  e the SELECTs to
182b0 20 6f 75 72 20 6c 65 66 74 20 69 6e 74 6f 20 74   our left into t
182c0 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 22  emporary table "
182d0 74 61 62 31 22 2e 0a 20 20 20 20 20 20 20 20 2a  tab1"..        *
182e0 2f 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  /.        sqlite
182f0 33 53 65 6c 65 63 74 44 65 73 74 49 6e 69 74 28  3SelectDestInit(
18300 26 69 6e 74 65 72 73 65 63 74 64 65 73 74 2c 20  &intersectdest, 
18310 53 52 54 5f 55 6e 69 6f 6e 2c 20 74 61 62 31 29  SRT_Union, tab1)
18320 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  ;.        rc = s
18330 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61  qlite3Select(pPa
18340 72 73 65 2c 20 70 50 72 69 6f 72 2c 20 26 69 6e  rse, pPrior, &in
18350 74 65 72 73 65 63 74 64 65 73 74 29 3b 0a 20 20  tersectdest);.  
18360 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a        if( rc ){.
18370 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d            goto m
18380 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b  ulti_select_end;
18390 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 0a 20 20  .        }.  .  
183a0 20 20 20 20 20 20 2f 2a 20 43 6f 64 65 20 74 68        /* Code th
183b0 65 20 63 75 72 72 65 6e 74 20 53 45 4c 45 43 54  e current SELECT
183c0 20 69 6e 74 6f 20 74 65 6d 70 6f 72 61 72 79 20   into temporary 
183d0 74 61 62 6c 65 20 22 74 61 62 32 22 0a 20 20 20  table "tab2".   
183e0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
183f0 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64  addr = sqlite3Vd
18400 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f  beAddOp2(v, OP_O
18410 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 74 61  penEphemeral, ta
18420 62 32 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  b2, 0);.        
18430 61 73 73 65 72 74 28 20 70 2d 3e 61 64 64 72 4f  assert( p->addrO
18440 70 65 6e 45 70 68 6d 5b 31 5d 20 3d 3d 20 2d 31  penEphm[1] == -1
18450 20 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 61   );.        p->a
18460 64 64 72 4f 70 65 6e 45 70 68 6d 5b 31 5d 20 3d  ddrOpenEphm[1] =
18470 20 61 64 64 72 3b 0a 20 20 20 20 20 20 20 20 70   addr;.        p
18480 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20  ->pPrior = 0;.  
18490 20 20 20 20 20 20 70 4c 69 6d 69 74 20 3d 20 70        pLimit = p
184a0 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20  ->pLimit;.      
184b0 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b    p->pLimit = 0;
184c0 0a 20 20 20 20 20 20 20 20 69 6e 74 65 72 73 65  .        interse
184d0 63 74 64 65 73 74 2e 69 53 44 50 61 72 6d 20 3d  ctdest.iSDParm =
184e0 20 74 61 62 32 3b 0a 20 20 20 20 20 20 20 20 45   tab2;.        E
184f0 78 70 6c 61 69 6e 51 75 65 72 79 50 6c 61 6e 28  xplainQueryPlan(
18500 28 70 50 61 72 73 65 2c 20 31 2c 20 22 25 73 20  (pParse, 1, "%s 
18510 55 53 49 4e 47 20 54 45 4d 50 20 42 2d 54 52 45  USING TEMP B-TRE
18520 45 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  E",.            
18530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 65                se
18540 6c 65 63 74 4f 70 4e 61 6d 65 28 70 2d 3e 6f 70  lectOpName(p->op
18550 29 29 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20  )));.        rc 
18560 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28  = sqlite3Select(
18570 70 50 61 72 73 65 2c 20 70 2c 20 26 69 6e 74 65  pParse, p, &inte
18580 72 73 65 63 74 64 65 73 74 29 3b 0a 20 20 20 20  rsectdest);.    
18590 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 63      testcase( rc
185a0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  !=SQLITE_OK );. 
185b0 20 20 20 20 20 20 20 70 44 65 6c 65 74 65 20 3d         pDelete =
185c0 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20   p->pPrior;.    
185d0 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20      p->pPrior = 
185e0 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 20 20  pPrior;.        
185f0 69 66 28 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f  if( p->nSelectRo
18600 77 3e 70 50 72 69 6f 72 2d 3e 6e 53 65 6c 65 63  w>pPrior->nSelec
18610 74 52 6f 77 20 29 7b 0a 20 20 20 20 20 20 20 20  tRow ){.        
18620 20 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20    p->nSelectRow 
18630 3d 20 70 50 72 69 6f 72 2d 3e 6e 53 65 6c 65 63  = pPrior->nSelec
18640 74 52 6f 77 3b 0a 20 20 20 20 20 20 20 20 7d 0a  tRow;.        }.
18650 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
18660 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 2d  xprDelete(db, p-
18670 3e 70 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20 20  >pLimit);.      
18680 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 70 4c    p->pLimit = pL
18690 69 6d 69 74 3b 0a 20 20 0a 20 20 20 20 20 20 20  imit;.  .       
186a0 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64   /* Generate cod
186b0 65 20 74 6f 20 74 61 6b 65 20 74 68 65 20 69 6e  e to take the in
186c0 74 65 72 73 65 63 74 69 6f 6e 20 6f 66 20 74 68  tersection of th
186d0 65 20 74 77 6f 20 74 65 6d 70 6f 72 61 72 79 0a  e two temporary.
186e0 20 20 20 20 20 20 20 20 2a 2a 20 74 61 62 6c 65          ** table
186f0 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  s..        */.  
18700 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
18710 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20 20 20 20  >pEList );.     
18720 20 20 20 69 42 72 65 61 6b 20 3d 20 73 71 6c 69     iBreak = sqli
18730 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
18740 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
18750 20 20 69 43 6f 6e 74 20 3d 20 73 71 6c 69 74 65    iCont = sqlite
18760 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 70  3VdbeMakeLabel(p
18770 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20  Parse);.        
18780 63 6f 6d 70 75 74 65 4c 69 6d 69 74 52 65 67 69  computeLimitRegi
18790 73 74 65 72 73 28 70 50 61 72 73 65 2c 20 70 2c  sters(pParse, p,
187a0 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20   iBreak);.      
187b0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
187c0 4f 70 32 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64  Op2(v, OP_Rewind
187d0 2c 20 74 61 62 31 2c 20 69 42 72 65 61 6b 29 3b  , tab1, iBreak);
187e0 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
187f0 3b 0a 20 20 20 20 20 20 20 20 72 31 20 3d 20 73  ;.        r1 = s
18800 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67  qlite3GetTempReg
18810 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
18820 20 20 69 53 74 61 72 74 20 3d 20 73 71 6c 69 74    iStart = sqlit
18830 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
18840 4f 50 5f 52 6f 77 44 61 74 61 2c 20 74 61 62 31  OP_RowData, tab1
18850 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 20 20 73  , r1);.        s
18860 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
18870 49 6e 74 28 76 2c 20 4f 50 5f 4e 6f 74 46 6f 75  Int(v, OP_NotFou
18880 6e 64 2c 20 74 61 62 32 2c 20 69 43 6f 6e 74 2c  nd, tab2, iCont,
18890 20 72 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 20   r1, 0);.       
188a0 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
188b0 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
188c0 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
188d0 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 20 20 20  pParse, r1);.   
188e0 20 20 20 20 20 73 65 6c 65 63 74 49 6e 6e 65 72       selectInner
188f0 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20 70 2c 20  Loop(pParse, p, 
18900 74 61 62 31 2c 0a 20 20 20 20 20 20 20 20 20 20  tab1,.          
18910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 2c                0,
18920 20 30 2c 20 26 64 65 73 74 2c 20 69 43 6f 6e 74   0, &dest, iCont
18930 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20  , iBreak);.     
18940 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
18950 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69 43  solveLabel(v, iC
18960 6f 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 73 71  ont);.        sq
18970 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
18980 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 74 61 62 31  v, OP_Next, tab1
18990 2c 20 69 53 74 61 72 74 29 3b 20 56 64 62 65 43  , iStart); VdbeC
189a0 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
189b0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52      sqlite3VdbeR
189c0 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69  esolveLabel(v, i
189d0 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 20 20  Break);.        
189e0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
189f0 32 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 74  2(v, OP_Close, t
18a00 61 62 32 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  ab2, 0);.       
18a10 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
18a20 70 32 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20  p2(v, OP_Close, 
18a30 74 61 62 31 2c 20 30 29 3b 0a 20 20 20 20 20 20  tab1, 0);.      
18a40 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
18a50 0a 20 20 20 20 7d 0a 20 20 0a 20 20 23 69 66 6e  .    }.  .  #ifn
18a60 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
18a70 45 58 50 4c 41 49 4e 0a 20 20 20 20 69 66 28 20  EXPLAIN.    if( 
18a80 70 2d 3e 70 4e 65 78 74 3d 3d 30 20 29 7b 0a 20  p->pNext==0 ){. 
18a90 20 20 20 20 20 45 78 70 6c 61 69 6e 51 75 65 72       ExplainQuer
18aa0 79 50 6c 61 6e 50 6f 70 28 70 50 61 72 73 65 29  yPlanPop(pParse)
18ab0 3b 0a 20 20 20 20 7d 0a 20 20 23 65 6e 64 69 66  ;.    }.  #endif
18ac0 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 43 6f 6d  .  }.  .  /* Com
18ad0 70 75 74 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73  pute collating s
18ae0 65 71 75 65 6e 63 65 73 20 75 73 65 64 20 62 79  equences used by
18af0 20 0a 20 20 2a 2a 20 74 65 6d 70 6f 72 61 72 79   .  ** temporary
18b00 20 74 61 62 6c 65 73 20 6e 65 65 64 65 64 20 74   tables needed t
18b10 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20  o implement the 
18b20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 2e  compound select.
18b30 0a 20 20 2a 2a 20 41 74 74 61 63 68 20 74 68 65  .  ** Attach the
18b40 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75   KeyInfo structu
18b50 72 65 20 74 6f 20 61 6c 6c 20 74 65 6d 70 6f 72  re to all tempor
18b60 61 72 79 20 74 61 62 6c 65 73 2e 0a 20 20 2a 2a  ary tables..  **
18b70 0a 20 20 2a 2a 20 54 68 69 73 20 73 65 63 74 69  .  ** This secti
18b80 6f 6e 20 69 73 20 72 75 6e 20 62 79 20 74 68 65  on is run by the
18b90 20 72 69 67 68 74 2d 6d 6f 73 74 20 53 45 4c 45   right-most SELE
18ba0 43 54 20 73 74 61 74 65 6d 65 6e 74 20 6f 6e 6c  CT statement onl
18bb0 79 2e 0a 20 20 2a 2a 20 53 45 4c 45 43 54 20 73  y..  ** SELECT s
18bc0 74 61 74 65 6d 65 6e 74 73 20 74 6f 20 74 68 65  tatements to the
18bd0 20 6c 65 66 74 20 61 6c 77 61 79 73 20 73 6b 69   left always ski
18be0 70 20 74 68 69 73 20 70 61 72 74 2e 20 20 54 68  p this part.  Th
18bf0 65 20 72 69 67 68 74 2d 6d 6f 73 74 0a 20 20 2a  e right-most.  *
18c00 2a 20 53 45 4c 45 43 54 20 6d 69 67 68 74 20 61  * SELECT might a
18c10 6c 73 6f 20 73 6b 69 70 20 74 68 69 73 20 70 61  lso skip this pa
18c20 72 74 20 69 66 20 69 74 20 68 61 73 20 6e 6f 20  rt if it has no 
18c30 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
18c40 61 6e 64 0a 20 20 2a 2a 20 6e 6f 20 74 65 6d 70  and.  ** no temp
18c50 20 74 61 62 6c 65 73 20 61 72 65 20 72 65 71 75   tables are requ
18c60 69 72 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ired..  */.  if(
18c70 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53   p->selFlags & S
18c80 46 5f 55 73 65 73 45 70 68 65 6d 65 72 61 6c 20  F_UsesEphemeral 
18c90 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 20 20 20  ){.    int i;   
18ca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18cb0 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
18cc0 6e 74 65 72 20 2a 2f 0a 20 20 20 20 4b 65 79 49  nter */.    KeyI
18cd0 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b 20 20  nfo *pKeyInfo;  
18ce0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c            /* Col
18cf0 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20  lating sequence 
18d00 66 6f 72 20 74 68 65 20 72 65 73 75 6c 74 20 73  for the result s
18d10 65 74 20 2a 2f 0a 20 20 20 20 53 65 6c 65 63 74  et */.    Select
18d20 20 2a 70 4c 6f 6f 70 3b 20 20 20 20 20 20 20 20   *pLoop;        
18d30 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c          /* For l
18d40 6f 6f 70 69 6e 67 20 74 68 72 6f 75 67 68 20 53  ooping through S
18d50 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73  ELECT statements
18d60 20 2a 2f 0a 20 20 20 20 43 6f 6c 6c 53 65 71 20   */.    CollSeq 
18d70 2a 2a 61 70 43 6f 6c 6c 3b 20 20 20 20 20 20 20  **apColl;       
18d80 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f        /* For loo
18d90 70 69 6e 67 20 74 68 72 6f 75 67 68 20 70 4b 65  ping through pKe
18da0 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 5d 20 2a  yInfo->aColl[] *
18db0 2f 0a 20 20 20 20 69 6e 74 20 6e 43 6f 6c 3b 20  /.    int nCol; 
18dc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18dd0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
18de0 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 72 65 73 75   columns in resu
18df0 6c 74 20 73 65 74 20 2a 2f 0a 0a 20 20 20 20 61  lt set */..    a
18e00 73 73 65 72 74 28 20 70 2d 3e 70 4e 65 78 74 3d  ssert( p->pNext=
18e10 3d 30 20 29 3b 0a 20 20 20 20 6e 43 6f 6c 20 3d  =0 );.    nCol =
18e20 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70   p->pEList->nExp
18e30 72 3b 0a 20 20 20 20 70 4b 65 79 49 6e 66 6f 20  r;.    pKeyInfo 
18e40 3d 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f  = sqlite3KeyInfo
18e50 41 6c 6c 6f 63 28 64 62 2c 20 6e 43 6f 6c 2c 20  Alloc(db, nCol, 
18e60 31 29 3b 0a 20 20 20 20 69 66 28 20 21 70 4b 65  1);.    if( !pKe
18e70 79 49 6e 66 6f 20 29 7b 0a 20 20 20 20 20 20 72  yInfo ){.      r
18e80 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
18e90 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 67 6f 74  _BKPT;.      got
18ea0 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65  o multi_select_e
18eb0 6e 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f  nd;.    }.    fo
18ec0 72 28 69 3d 30 2c 20 61 70 43 6f 6c 6c 3d 70 4b  r(i=0, apColl=pK
18ed0 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 3b 20 69  eyInfo->aColl; i
18ee0 3c 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 61 70 43 6f  <nCol; i++, apCo
18ef0 6c 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 2a 61 70  ll++){.      *ap
18f00 43 6f 6c 6c 20 3d 20 6d 75 6c 74 69 53 65 6c 65  Coll = multiSele
18f10 63 74 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  ctCollSeq(pParse
18f20 2c 20 70 2c 20 69 29 3b 0a 20 20 20 20 20 20 69  , p, i);.      i
18f30 66 28 20 30 3d 3d 2a 61 70 43 6f 6c 6c 20 29 7b  f( 0==*apColl ){
18f40 0a 20 20 20 20 20 20 20 20 2a 61 70 43 6f 6c 6c  .        *apColl
18f50 20 3d 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c   = db->pDfltColl
18f60 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
18f70 0a 20 20 20 20 66 6f 72 28 70 4c 6f 6f 70 3d 70  .    for(pLoop=p
18f80 3b 20 70 4c 6f 6f 70 3b 20 70 4c 6f 6f 70 3d 70  ; pLoop; pLoop=p
18f90 4c 6f 6f 70 2d 3e 70 50 72 69 6f 72 29 7b 0a 20  Loop->pPrior){. 
18fa0 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
18fb0 32 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  2; i++){.       
18fc0 20 69 6e 74 20 61 64 64 72 20 3d 20 70 4c 6f 6f   int addr = pLoo
18fd0 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b  p->addrOpenEphm[
18fe0 69 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  i];.        if( 
18ff0 61 64 64 72 3c 30 20 29 7b 0a 20 20 20 20 20 20  addr<0 ){.      
19000 20 20 20 20 2f 2a 20 49 66 20 5b 30 5d 20 69 73      /* If [0] is
19010 20 75 6e 75 73 65 64 20 74 68 65 6e 20 5b 31 5d   unused then [1]
19020 20 69 73 20 61 6c 73 6f 20 75 6e 75 73 65 64 2e   is also unused.
19030 20 20 53 6f 20 77 65 20 63 61 6e 0a 20 20 20 20    So we can.    
19040 20 20 20 20 20 20 2a 2a 20 61 6c 77 61 79 73 20        ** always 
19050 73 61 66 65 6c 79 20 61 62 6f 72 74 20 61 73 20  safely abort as 
19060 73 6f 6f 6e 20 61 73 20 74 68 65 20 66 69 72 73  soon as the firs
19070 74 20 75 6e 75 73 65 64 20 73 6c 6f 74 20 69 73  t unused slot is
19080 20 66 6f 75 6e 64 20 2a 2f 0a 20 20 20 20 20 20   found */.      
19090 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 6f 6f      assert( pLoo
190a0 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b  p->addrOpenEphm[
190b0 31 5d 3c 30 20 29 3b 0a 20 20 20 20 20 20 20 20  1]<0 );.        
190c0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
190d0 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74   }.        sqlit
190e0 65 33 56 64 62 65 43 68 61 6e 67 65 50 32 28 76  e3VdbeChangeP2(v
190f0 2c 20 61 64 64 72 2c 20 6e 43 6f 6c 29 3b 0a 20  , addr, nCol);. 
19100 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
19110 62 65 43 68 61 6e 67 65 50 34 28 76 2c 20 61 64  beChangeP4(v, ad
19120 64 72 2c 20 28 63 68 61 72 2a 29 73 71 6c 69 74  dr, (char*)sqlit
19130 65 33 4b 65 79 49 6e 66 6f 52 65 66 28 70 4b 65  e3KeyInfoRef(pKe
19140 79 49 6e 66 6f 29 2c 0a 20 20 20 20 20 20 20 20  yInfo),.        
19150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19160 20 20 20 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b      P4_KEYINFO);
19170 0a 20 20 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e  .        pLoop->
19180 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 69 5d 20  addrOpenEphm[i] 
19190 3d 20 2d 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20  = -1;.      }.  
191a0 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 4b    }.    sqlite3K
191b0 65 79 49 6e 66 6f 55 6e 72 65 66 28 70 4b 65 79  eyInfoUnref(pKey
191c0 49 6e 66 6f 29 3b 0a 20 20 7d 0a 0a 6d 75 6c 74  Info);.  }..mult
191d0 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3a 0a 20 20  i_select_end:.  
191e0 70 44 65 73 74 2d 3e 69 53 64 73 74 20 3d 20 64  pDest->iSdst = d
191f0 65 73 74 2e 69 53 64 73 74 3b 0a 20 20 70 44 65  est.iSdst;.  pDe
19200 73 74 2d 3e 6e 53 64 73 74 20 3d 20 64 65 73 74  st->nSdst = dest
19210 2e 6e 53 64 73 74 3b 0a 20 20 73 71 6c 69 74 65  .nSdst;.  sqlite
19220 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62  3SelectDelete(db
19230 2c 20 70 44 65 6c 65 74 65 29 3b 0a 20 20 72 65  , pDelete);.  re
19240 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69  turn rc;.}.#endi
19250 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
19260 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54  _COMPOUND_SELECT
19270 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 45 72 72 6f 72   */../*.** Error
19280 20 6d 65 73 73 61 67 65 20 66 6f 72 20 77 68 65   message for whe
19290 6e 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 74 65  n two or more te
192a0 72 6d 73 20 6f 66 20 61 20 63 6f 6d 70 6f 75 6e  rms of a compoun
192b0 64 20 73 65 6c 65 63 74 20 68 61 76 65 20 64 69  d select have di
192c0 66 66 65 72 65 6e 74 0a 2a 2a 20 73 69 7a 65 20  fferent.** size 
192d0 72 65 73 75 6c 74 20 73 65 74 73 2e 0a 2a 2f 0a  result sets..*/.
192e0 76 6f 69 64 20 73 71 6c 69 74 65 33 53 65 6c 65  void sqlite3Sele
192f0 63 74 57 72 6f 6e 67 4e 75 6d 54 65 72 6d 73 45  ctWrongNumTermsE
19300 72 72 6f 72 28 50 61 72 73 65 20 2a 70 50 61 72  rror(Parse *pPar
19310 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a  se, Select *p){.
19320 20 20 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61 67    if( p->selFlag
19330 73 20 26 20 53 46 5f 56 61 6c 75 65 73 20 29 7b  s & SF_Values ){
19340 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
19350 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 61 6c  rMsg(pParse, "al
19360 6c 20 56 41 4c 55 45 53 20 6d 75 73 74 20 68 61  l VALUES must ha
19370 76 65 20 74 68 65 20 73 61 6d 65 20 6e 75 6d 62  ve the same numb
19380 65 72 20 6f 66 20 74 65 72 6d 73 22 29 3b 0a 20  er of terms");. 
19390 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69   }else{.    sqli
193a0 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
193b0 73 65 2c 20 22 53 45 4c 45 43 54 73 20 74 6f 20  se, "SELECTs to 
193c0 74 68 65 20 6c 65 66 74 20 61 6e 64 20 72 69 67  the left and rig
193d0 68 74 20 6f 66 20 25 73 22 0a 20 20 20 20 20 20  ht of %s".      
193e0 22 20 64 6f 20 6e 6f 74 20 68 61 76 65 20 74 68  " do not have th
193f0 65 20 73 61 6d 65 20 6e 75 6d 62 65 72 20 6f 66  e same number of
19400 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 22   result columns"
19410 2c 20 73 65 6c 65 63 74 4f 70 4e 61 6d 65 28 70  , selectOpName(p
19420 2d 3e 6f 70 29 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  ->op));.  }.}../
19430 2a 0a 2a 2a 20 43 6f 64 65 20 61 6e 20 6f 75 74  *.** Code an out
19440 70 75 74 20 73 75 62 72 6f 75 74 69 6e 65 20 66  put subroutine f
19450 6f 72 20 61 20 63 6f 72 6f 75 74 69 6e 65 20 69  or a coroutine i
19460 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66  mplementation of
19470 20 61 0a 2a 2a 20 53 45 4c 45 43 54 20 73 74 61   a.** SELECT sta
19480 74 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  tment..**.** The
19490 20 64 61 74 61 20 74 6f 20 62 65 20 6f 75 74 70   data to be outp
194a0 75 74 20 69 73 20 63 6f 6e 74 61 69 6e 65 64 20  ut is contained 
194b0 69 6e 20 70 49 6e 2d 3e 69 53 64 73 74 2e 20 20  in pIn->iSdst.  
194c0 54 68 65 72 65 20 61 72 65 0a 2a 2a 20 70 49 6e  There are.** pIn
194d0 2d 3e 6e 53 64 73 74 20 63 6f 6c 75 6d 6e 73 20  ->nSdst columns 
194e0 74 6f 20 62 65 20 6f 75 74 70 75 74 2e 20 20 70  to be output.  p
194f0 44 65 73 74 20 69 73 20 77 68 65 72 65 20 74 68  Dest is where th
19500 65 20 6f 75 74 70 75 74 20 73 68 6f 75 6c 64 0a  e output should.
19510 2a 2a 20 62 65 20 73 65 6e 74 2e 0a 2a 2a 0a 2a  ** be sent..**.*
19520 2a 20 72 65 67 52 65 74 75 72 6e 20 69 73 20 74  * regReturn is t
19530 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65  he number of the
19540 20 72 65 67 69 73 74 65 72 20 68 6f 6c 64 69 6e   register holdin
19550 67 20 74 68 65 20 73 75 62 72 6f 75 74 69 6e 65  g the subroutine
19560 0a 2a 2a 20 72 65 74 75 72 6e 20 61 64 64 72 65  .** return addre
19570 73 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 72 65 67  ss..**.** If reg
19580 50 72 65 76 3e 30 20 74 68 65 6e 20 69 74 20 69  Prev>0 then it i
19590 73 20 74 68 65 20 66 69 72 73 74 20 72 65 67 69  s the first regi
195a0 73 74 65 72 20 69 6e 20 61 20 76 65 63 74 6f 72  ster in a vector
195b0 20 74 68 61 74 0a 2a 2a 20 72 65 63 6f 72 64 73   that.** records
195c0 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 6f 75   the previous ou
195d0 74 70 75 74 2e 20 20 6d 65 6d 5b 72 65 67 50 72  tput.  mem[regPr
195e0 65 76 5d 20 69 73 20 61 20 66 6c 61 67 20 74 68  ev] is a flag th
195f0 61 74 20 69 73 20 66 61 6c 73 65 0a 2a 2a 20 69  at is false.** i
19600 66 20 74 68 65 72 65 20 68 61 73 20 62 65 65 6e  f there has been
19610 20 6e 6f 20 70 72 65 76 69 6f 75 73 20 6f 75 74   no previous out
19620 70 75 74 2e 20 20 49 66 20 72 65 67 50 72 65 76  put.  If regPrev
19630 3e 30 20 74 68 65 6e 20 63 6f 64 65 20 69 73 0a  >0 then code is.
19640 2a 2a 20 67 65 6e 65 72 61 74 65 64 20 74 6f 20  ** generated to 
19650 73 75 70 70 72 65 73 73 20 64 75 70 6c 69 63 61  suppress duplica
19660 74 65 73 2e 20 20 70 4b 65 79 49 6e 66 6f 20 69  tes.  pKeyInfo i
19670 73 20 75 73 65 64 20 66 6f 72 20 63 6f 6d 70 61  s used for compa
19680 72 69 6e 67 0a 2a 2a 20 6b 65 79 73 2e 0a 2a 2a  ring.** keys..**
19690 0a 2a 2a 20 49 66 20 74 68 65 20 4c 49 4d 49 54  .** If the LIMIT
196a0 20 66 6f 75 6e 64 20 69 6e 20 70 2d 3e 69 4c 69   found in p->iLi
196b0 6d 69 74 20 69 73 20 72 65 61 63 68 65 64 2c 20  mit is reached, 
196c0 6a 75 6d 70 20 69 6d 6d 65 64 69 61 74 65 6c 79  jump immediately
196d0 20 74 6f 0a 2a 2a 20 69 42 72 65 61 6b 2e 0a 2a   to.** iBreak..*
196e0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67 65 6e  /.static int gen
196f0 65 72 61 74 65 4f 75 74 70 75 74 53 75 62 72 6f  erateOutputSubro
19700 75 74 69 6e 65 28 0a 20 20 50 61 72 73 65 20 2a  utine(.  Parse *
19710 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20  pParse,         
19720 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
19730 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20  ext */.  Select 
19740 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *p,             
19750 20 2f 2a 20 54 68 65 20 53 45 4c 45 43 54 20 73   /* The SELECT s
19760 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 53 65  tatement */.  Se
19770 6c 65 63 74 44 65 73 74 20 2a 70 49 6e 2c 20 20  lectDest *pIn,  
19780 20 20 20 20 20 20 2f 2a 20 43 6f 72 6f 75 74 69        /* Corouti
19790 6e 65 20 73 75 70 70 6c 79 69 6e 67 20 64 61 74  ne supplying dat
197a0 61 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73  a */.  SelectDes
197b0 74 20 2a 70 44 65 73 74 2c 20 20 20 20 20 20 2f  t *pDest,      /
197c0 2a 20 57 68 65 72 65 20 74 6f 20 73 65 6e 64 20  * Where to send 
197d0 74 68 65 20 64 61 74 61 20 2a 2f 0a 20 20 69 6e  the data */.  in
197e0 74 20 72 65 67 52 65 74 75 72 6e 2c 20 20 20 20  t regReturn,    
197f0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65 74        /* The ret
19800 75 72 6e 20 61 64 64 72 65 73 73 20 72 65 67 69  urn address regi
19810 73 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 65  ster */.  int re
19820 67 50 72 65 76 2c 20 20 20 20 20 20 20 20 20 20  gPrev,          
19830 20 20 2f 2a 20 50 72 65 76 69 6f 75 73 20 72 65    /* Previous re
19840 73 75 6c 74 20 72 65 67 69 73 74 65 72 2e 20 20  sult register.  
19850 4e 6f 20 75 6e 69 71 75 65 6e 65 73 73 20 69 66  No uniqueness if
19860 20 30 20 2a 2f 0a 20 20 4b 65 79 49 6e 66 6f 20   0 */.  KeyInfo 
19870 2a 70 4b 65 79 49 6e 66 6f 2c 20 20 20 20 20 20  *pKeyInfo,      
19880 2f 2a 20 46 6f 72 20 63 6f 6d 70 61 72 69 6e 67  /* For comparing
19890 20 77 69 74 68 20 70 72 65 76 69 6f 75 73 20 65   with previous e
198a0 6e 74 72 79 20 2a 2f 0a 20 20 69 6e 74 20 69 42  ntry */.  int iB
198b0 72 65 61 6b 20 20 20 20 20 20 20 20 20 20 20 20  reak            
198c0 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 69    /* Jump here i
198d0 66 20 77 65 20 68 69 74 20 74 68 65 20 4c 49 4d  f we hit the LIM
198e0 49 54 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20  IT */.){.  Vdbe 
198f0 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64  *v = pParse->pVd
19900 62 65 3b 0a 20 20 69 6e 74 20 69 43 6f 6e 74 69  be;.  int iConti
19910 6e 75 65 3b 0a 20 20 69 6e 74 20 61 64 64 72 3b  nue;.  int addr;
19920 0a 0a 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74  ..  addr = sqlit
19930 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
19940 72 28 76 29 3b 0a 20 20 69 43 6f 6e 74 69 6e 75  r(v);.  iContinu
19950 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  e = sqlite3VdbeM
19960 61 6b 65 4c 61 62 65 6c 28 70 50 61 72 73 65 29  akeLabel(pParse)
19970 3b 0a 0a 20 20 2f 2a 20 53 75 70 70 72 65 73 73  ;..  /* Suppress
19980 20 64 75 70 6c 69 63 61 74 65 73 20 66 6f 72 20   duplicates for 
19990 55 4e 49 4f 4e 2c 20 45 58 43 45 50 54 2c 20 61  UNION, EXCEPT, a
199a0 6e 64 20 49 4e 54 45 52 53 45 43 54 20 0a 20 20  nd INTERSECT .  
199b0 2a 2f 0a 20 20 69 66 28 20 72 65 67 50 72 65 76  */.  if( regPrev
199c0 20 29 7b 0a 20 20 20 20 69 6e 74 20 61 64 64 72   ){.    int addr
199d0 31 2c 20 61 64 64 72 32 3b 0a 20 20 20 20 61 64  1, addr2;.    ad
199e0 64 72 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62  dr1 = sqlite3Vdb
199f0 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66  eAddOp1(v, OP_If
19a00 4e 6f 74 2c 20 72 65 67 50 72 65 76 29 3b 20 56  Not, regPrev); V
19a10 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
19a20 20 20 20 20 61 64 64 72 32 20 3d 20 73 71 6c 69      addr2 = sqli
19a30 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
19a40 20 4f 50 5f 43 6f 6d 70 61 72 65 2c 20 70 49 6e   OP_Compare, pIn
19a50 2d 3e 69 53 64 73 74 2c 20 72 65 67 50 72 65 76  ->iSdst, regPrev
19a60 2b 31 2c 20 70 49 6e 2d 3e 6e 53 64 73 74 2c 0a  +1, pIn->nSdst,.
19a70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19a80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 63                (c
19a90 68 61 72 2a 29 73 71 6c 69 74 65 33 4b 65 79 49  har*)sqlite3KeyI
19aa0 6e 66 6f 52 65 66 28 70 4b 65 79 49 6e 66 6f 29  nfoRef(pKeyInfo)
19ab0 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20  , P4_KEYINFO);. 
19ac0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
19ad0 64 4f 70 33 28 76 2c 20 4f 50 5f 4a 75 6d 70 2c  dOp3(v, OP_Jump,
19ae0 20 61 64 64 72 32 2b 32 2c 20 69 43 6f 6e 74 69   addr2+2, iConti
19af0 6e 75 65 2c 20 61 64 64 72 32 2b 32 29 3b 20 56  nue, addr2+2); V
19b00 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
19b10 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a      sqlite3VdbeJ
19b20 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 31  umpHere(v, addr1
19b30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
19b40 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43  beAddOp3(v, OP_C
19b50 6f 70 79 2c 20 70 49 6e 2d 3e 69 53 64 73 74 2c  opy, pIn->iSdst,
19b60 20 72 65 67 50 72 65 76 2b 31 2c 20 70 49 6e 2d   regPrev+1, pIn-
19b70 3e 6e 53 64 73 74 2d 31 29 3b 0a 20 20 20 20 73  >nSdst-1);.    s
19b80 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
19b90 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
19ba0 31 2c 20 72 65 67 50 72 65 76 29 3b 0a 20 20 7d  1, regPrev);.  }
19bb0 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 64  .  if( pParse->d
19bc0 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
19bd0 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20 2f  ) return 0;..  /
19be0 2a 20 53 75 70 70 72 65 73 73 20 74 68 65 20 66  * Suppress the f
19bf0 69 72 73 74 20 4f 46 46 53 45 54 20 65 6e 74 72  irst OFFSET entr
19c00 69 65 73 20 69 66 20 74 68 65 72 65 20 69 73 20  ies if there is 
19c10 61 6e 20 4f 46 46 53 45 54 20 63 6c 61 75 73 65  an OFFSET clause
19c20 0a 20 20 2a 2f 0a 20 20 63 6f 64 65 4f 66 66 73  .  */.  codeOffs
19c30 65 74 28 76 2c 20 70 2d 3e 69 4f 66 66 73 65 74  et(v, p->iOffset
19c40 2c 20 69 43 6f 6e 74 69 6e 75 65 29 3b 0a 0a 20  , iContinue);.. 
19c50 20 61 73 73 65 72 74 28 20 70 44 65 73 74 2d 3e   assert( pDest->
19c60 65 44 65 73 74 21 3d 53 52 54 5f 45 78 69 73 74  eDest!=SRT_Exist
19c70 73 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  s );.  assert( p
19c80 44 65 73 74 2d 3e 65 44 65 73 74 21 3d 53 52 54  Dest->eDest!=SRT
19c90 5f 54 61 62 6c 65 20 29 3b 0a 20 20 73 77 69 74  _Table );.  swit
19ca0 63 68 28 20 70 44 65 73 74 2d 3e 65 44 65 73 74  ch( pDest->eDest
19cb0 20 29 7b 0a 20 20 20 20 2f 2a 20 53 74 6f 72 65   ){.    /* Store
19cc0 20 74 68 65 20 72 65 73 75 6c 74 20 61 73 20 64   the result as d
19cd0 61 74 61 20 75 73 69 6e 67 20 61 20 75 6e 69 71  ata using a uniq
19ce0 75 65 20 6b 65 79 2e 0a 20 20 20 20 2a 2f 0a 20  ue key..    */. 
19cf0 20 20 20 63 61 73 65 20 53 52 54 5f 45 70 68 65     case SRT_Ephe
19d00 6d 54 61 62 3a 20 7b 0a 20 20 20 20 20 20 69 6e  mTab: {.      in
19d10 74 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65  t r1 = sqlite3Ge
19d20 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29  tTempReg(pParse)
19d30 3b 0a 20 20 20 20 20 20 69 6e 74 20 72 32 20 3d  ;.      int r2 =
19d40 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
19d50 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  eg(pParse);.    
19d60 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
19d70 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65  Op3(v, OP_MakeRe
19d80 63 6f 72 64 2c 20 70 49 6e 2d 3e 69 53 64 73 74  cord, pIn->iSdst
19d90 2c 20 70 49 6e 2d 3e 6e 53 64 73 74 2c 20 72 31  , pIn->nSdst, r1
19da0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
19db0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
19dc0 5f 4e 65 77 52 6f 77 69 64 2c 20 70 44 65 73 74  _NewRowid, pDest
19dd0 2d 3e 69 53 44 50 61 72 6d 2c 20 72 32 29 3b 0a  ->iSDParm, r2);.
19de0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
19df0 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e  eAddOp3(v, OP_In
19e00 73 65 72 74 2c 20 70 44 65 73 74 2d 3e 69 53 44  sert, pDest->iSD
19e10 50 61 72 6d 2c 20 72 31 2c 20 72 32 29 3b 0a 20  Parm, r1, r2);. 
19e20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
19e30 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c  ChangeP5(v, OPFL
19e40 41 47 5f 41 50 50 45 4e 44 29 3b 0a 20 20 20 20  AG_APPEND);.    
19e50 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
19e60 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
19e70 72 32 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  r2);.      sqlit
19e80 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
19e90 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 20 20  (pParse, r1);.  
19ea0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
19eb0 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
19ec0 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20  _OMIT_SUBQUERY. 
19ed0 20 20 20 2f 2a 20 49 66 20 77 65 20 61 72 65 20     /* If we are 
19ee0 63 72 65 61 74 69 6e 67 20 61 20 73 65 74 20 66  creating a set f
19ef0 6f 72 20 61 6e 20 22 65 78 70 72 20 49 4e 20 28  or an "expr IN (
19f00 53 45 4c 45 43 54 20 2e 2e 2e 29 22 2e 0a 20 20  SELECT ...)"..  
19f10 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52    */.    case SR
19f20 54 5f 53 65 74 3a 20 7b 0a 20 20 20 20 20 20 69  T_Set: {.      i
19f30 6e 74 20 72 31 3b 0a 20 20 20 20 20 20 74 65 73  nt r1;.      tes
19f40 74 63 61 73 65 28 20 70 49 6e 2d 3e 6e 53 64 73  tcase( pIn->nSds
19f50 74 3e 31 20 29 3b 0a 20 20 20 20 20 20 72 31 20  t>1 );.      r1 
19f60 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
19f70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20  Reg(pParse);.   
19f80 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
19f90 64 4f 70 34 28 76 2c 20 4f 50 5f 4d 61 6b 65 52  dOp4(v, OP_MakeR
19fa0 65 63 6f 72 64 2c 20 70 49 6e 2d 3e 69 53 64 73  ecord, pIn->iSds
19fb0 74 2c 20 70 49 6e 2d 3e 6e 53 64 73 74 2c 20 0a  t, pIn->nSdst, .
19fc0 20 20 20 20 20 20 20 20 20 20 72 31 2c 20 70 44            r1, pD
19fd0 65 73 74 2d 3e 7a 41 66 66 53 64 73 74 2c 20 70  est->zAffSdst, p
19fe0 49 6e 2d 3e 6e 53 64 73 74 29 3b 0a 20 20 20 20  In->nSdst);.    
19ff0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1a000 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 49 64 78  Op4Int(v, OP_Idx
1a010 49 6e 73 65 72 74 2c 20 70 44 65 73 74 2d 3e 69  Insert, pDest->i
1a020 53 44 50 61 72 6d 2c 20 72 31 2c 0a 20 20 20 20  SDParm, r1,.    
1a030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a040 20 20 20 20 20 20 20 70 49 6e 2d 3e 69 53 64 73         pIn->iSds
1a050 74 2c 20 70 49 6e 2d 3e 6e 53 64 73 74 29 3b 0a  t, pIn->nSdst);.
1a060 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c        sqlite3Rel
1a070 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
1a080 73 65 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 62  se, r1);.      b
1a090 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  reak;.    }..   
1a0a0 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61   /* If this is a
1a0b0 20 73 63 61 6c 61 72 20 73 65 6c 65 63 74 20 74   scalar select t
1a0c0 68 61 74 20 69 73 20 70 61 72 74 20 6f 66 20 61  hat is part of a
1a0d0 6e 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 74 68  n expression, th
1a0e0 65 6e 0a 20 20 20 20 2a 2a 20 73 74 6f 72 65 20  en.    ** store 
1a0f0 74 68 65 20 72 65 73 75 6c 74 73 20 69 6e 20 74  the results in t
1a100 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 20 6d  he appropriate m
1a110 65 6d 6f 72 79 20 63 65 6c 6c 20 61 6e 64 20 62  emory cell and b
1a120 72 65 61 6b 20 6f 75 74 0a 20 20 20 20 2a 2a 20  reak out.    ** 
1a130 6f 66 20 74 68 65 20 73 63 61 6e 20 6c 6f 6f 70  of the scan loop
1a140 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73  ..    */.    cas
1a150 65 20 53 52 54 5f 4d 65 6d 3a 20 7b 0a 20 20 20  e SRT_Mem: {.   
1a160 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 2d 3e     assert( pIn->
1a170 6e 53 64 73 74 3d 3d 31 20 7c 7c 20 70 50 61 72  nSdst==1 || pPar
1a180 73 65 2d 3e 6e 45 72 72 3e 30 20 29 3b 20 20 74  se->nErr>0 );  t
1a190 65 73 74 63 61 73 65 28 20 70 49 6e 2d 3e 6e 53  estcase( pIn->nS
1a1a0 64 73 74 21 3d 31 20 29 3b 0a 20 20 20 20 20 20  dst!=1 );.      
1a1b0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 4d  sqlite3ExprCodeM
1a1c0 6f 76 65 28 70 50 61 72 73 65 2c 20 70 49 6e 2d  ove(pParse, pIn-
1a1d0 3e 69 53 64 73 74 2c 20 70 44 65 73 74 2d 3e 69  >iSdst, pDest->i
1a1e0 53 44 50 61 72 6d 2c 20 31 29 3b 0a 20 20 20 20  SDParm, 1);.    
1a1f0 20 20 2f 2a 20 54 68 65 20 4c 49 4d 49 54 20 63    /* The LIMIT c
1a200 6c 61 75 73 65 20 77 69 6c 6c 20 6a 75 6d 70 20  lause will jump 
1a210 6f 75 74 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20  out of the loop 
1a220 66 6f 72 20 75 73 20 2a 2f 0a 20 20 20 20 20 20  for us */.      
1a230 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e  break;.    }.#en
1a240 64 69 66 20 2f 2a 20 23 69 66 6e 64 65 66 20 53  dif /* #ifndef S
1a250 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
1a260 45 52 59 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 54  ERY */..    /* T
1a270 68 65 20 72 65 73 75 6c 74 73 20 61 72 65 20 73  he results are s
1a280 74 6f 72 65 64 20 69 6e 20 61 20 73 65 71 75 65  tored in a seque
1a290 6e 63 65 20 6f 66 20 72 65 67 69 73 74 65 72 73  nce of registers
1a2a0 0a 20 20 20 20 2a 2a 20 73 74 61 72 74 69 6e 67  .    ** starting
1a2b0 20 61 74 20 70 44 65 73 74 2d 3e 69 53 64 73 74   at pDest->iSdst
1a2c0 2e 20 20 54 68 65 6e 20 74 68 65 20 63 6f 2d 72  .  Then the co-r
1a2d0 6f 75 74 69 6e 65 20 79 69 65 6c 64 73 2e 0a 20  outine yields.. 
1a2e0 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53     */.    case S
1a2f0 52 54 5f 43 6f 72 6f 75 74 69 6e 65 3a 20 7b 0a  RT_Coroutine: {.
1a300 20 20 20 20 20 20 69 66 28 20 70 44 65 73 74 2d        if( pDest-
1a310 3e 69 53 64 73 74 3d 3d 30 20 29 7b 0a 20 20 20  >iSdst==0 ){.   
1a320 20 20 20 20 20 70 44 65 73 74 2d 3e 69 53 64 73       pDest->iSds
1a330 74 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  t = sqlite3GetTe
1a340 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20  mpRange(pParse, 
1a350 70 49 6e 2d 3e 6e 53 64 73 74 29 3b 0a 20 20 20  pIn->nSdst);.   
1a360 20 20 20 20 20 70 44 65 73 74 2d 3e 6e 53 64 73       pDest->nSds
1a370 74 20 3d 20 70 49 6e 2d 3e 6e 53 64 73 74 3b 0a  t = pIn->nSdst;.
1a380 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
1a390 6c 69 74 65 33 45 78 70 72 43 6f 64 65 4d 6f 76  lite3ExprCodeMov
1a3a0 65 28 70 50 61 72 73 65 2c 20 70 49 6e 2d 3e 69  e(pParse, pIn->i
1a3b0 53 64 73 74 2c 20 70 44 65 73 74 2d 3e 69 53 64  Sdst, pDest->iSd
1a3c0 73 74 2c 20 70 49 6e 2d 3e 6e 53 64 73 74 29 3b  st, pIn->nSdst);
1a3d0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
1a3e0 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 59  beAddOp1(v, OP_Y
1a3f0 69 65 6c 64 2c 20 70 44 65 73 74 2d 3e 69 53 44  ield, pDest->iSD
1a400 50 61 72 6d 29 3b 0a 20 20 20 20 20 20 62 72 65  Parm);.      bre
1a410 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ak;.    }..    /
1a420 2a 20 49 66 20 6e 6f 6e 65 20 6f 66 20 74 68 65  * If none of the
1a430 20 61 62 6f 76 65 2c 20 74 68 65 6e 20 74 68 65   above, then the
1a440 20 72 65 73 75 6c 74 20 64 65 73 74 69 6e 61 74   result destinat
1a450 69 6f 6e 20 6d 75 73 74 20 62 65 0a 20 20 20 20  ion must be.    
1a460 2a 2a 20 53 52 54 5f 4f 75 74 70 75 74 2e 20 20  ** SRT_Output.  
1a470 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
1a480 6e 65 76 65 72 20 63 61 6c 6c 65 64 20 77 69 74  never called wit
1a490 68 20 61 6e 79 20 6f 74 68 65 72 0a 20 20 20 20  h any other.    
1a4a0 2a 2a 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 6f  ** destination o
1a4b0 74 68 65 72 20 74 68 61 6e 20 74 68 65 20 6f 6e  ther than the on
1a4c0 65 73 20 68 61 6e 64 6c 65 64 20 61 62 6f 76 65  es handled above
1a4d0 20 6f 72 20 53 52 54 5f 4f 75 74 70 75 74 2e 0a   or SRT_Output..
1a4e0 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 46 6f      **.    ** Fo
1a4f0 72 20 53 52 54 5f 4f 75 74 70 75 74 2c 20 72 65  r SRT_Output, re
1a500 73 75 6c 74 73 20 61 72 65 20 73 74 6f 72 65 64  sults are stored
1a510 20 69 6e 20 61 20 73 65 71 75 65 6e 63 65 20 6f   in a sequence o
1a520 66 20 72 65 67 69 73 74 65 72 73 2e 20 20 0a 20  f registers.  . 
1a530 20 20 20 2a 2a 20 54 68 65 6e 20 74 68 65 20 4f     ** Then the O
1a540 50 5f 52 65 73 75 6c 74 52 6f 77 20 6f 70 63 6f  P_ResultRow opco
1a550 64 65 20 69 73 20 75 73 65 64 20 74 6f 20 63 61  de is used to ca
1a560 75 73 65 20 73 71 6c 69 74 65 33 5f 73 74 65 70  use sqlite3_step
1a570 28 29 20 74 6f 0a 20 20 20 20 2a 2a 20 72 65 74  () to.    ** ret
1a580 75 72 6e 20 74 68 65 20 6e 65 78 74 20 72 6f 77  urn the next row
1a590 20 6f 66 20 72 65 73 75 6c 74 2e 0a 20 20 20 20   of result..    
1a5a0 2a 2f 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20  */.    default: 
1a5b0 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
1a5c0 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52  pDest->eDest==SR
1a5d0 54 5f 4f 75 74 70 75 74 20 29 3b 0a 20 20 20 20  T_Output );.    
1a5e0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1a5f0 4f 70 32 28 76 2c 20 4f 50 5f 52 65 73 75 6c 74  Op2(v, OP_Result
1a600 52 6f 77 2c 20 70 49 6e 2d 3e 69 53 64 73 74 2c  Row, pIn->iSdst,
1a610 20 70 49 6e 2d 3e 6e 53 64 73 74 29 3b 0a 20 20   pIn->nSdst);.  
1a620 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
1a630 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20  .  }..  /* Jump 
1a640 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  to the end of th
1a650 65 20 6c 6f 6f 70 20 69 66 20 74 68 65 20 4c 49  e loop if the LI
1a660 4d 49 54 20 69 73 20 72 65 61 63 68 65 64 2e 0a  MIT is reached..
1a670 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 69 4c    */.  if( p->iL
1a680 69 6d 69 74 20 29 7b 0a 20 20 20 20 73 71 6c 69  imit ){.    sqli
1a690 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
1a6a0 20 4f 50 5f 44 65 63 72 4a 75 6d 70 5a 65 72 6f   OP_DecrJumpZero
1a6b0 2c 20 70 2d 3e 69 4c 69 6d 69 74 2c 20 69 42 72  , p->iLimit, iBr
1a6c0 65 61 6b 29 3b 20 56 64 62 65 43 6f 76 65 72 61  eak); VdbeCovera
1a6d0 67 65 28 76 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  ge(v);.  }..  /*
1a6e0 20 47 65 6e 65 72 61 74 65 20 74 68 65 20 73 75   Generate the su
1a6f0 62 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 0a  broutine return.
1a700 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64    */.  sqlite3Vd
1a710 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
1a720 2c 20 69 43 6f 6e 74 69 6e 75 65 29 3b 0a 20 20  , iContinue);.  
1a730 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1a740 31 28 76 2c 20 4f 50 5f 52 65 74 75 72 6e 2c 20  1(v, OP_Return, 
1a750 72 65 67 52 65 74 75 72 6e 29 3b 0a 0a 20 20 72  regReturn);..  r
1a760 65 74 75 72 6e 20 61 64 64 72 3b 0a 7d 0a 0a 2f  eturn addr;.}../
1a770 2a 0a 2a 2a 20 41 6c 74 65 72 6e 61 74 69 76 65  *.** Alternative
1a780 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74   compound select
1a790 20 63 6f 64 65 20 67 65 6e 65 72 61 74 6f 72 20   code generator 
1a7a0 66 6f 72 20 63 61 73 65 73 20 77 68 65 6e 20 74  for cases when t
1a7b0 68 65 72 65 0a 2a 2a 20 69 73 20 61 6e 20 4f 52  here.** is an OR
1a7c0 44 45 52 20 42 59 20 63 6c 61 75 73 65 2e 0a 2a  DER BY clause..*
1a7d0 2a 0a 2a 2a 20 57 65 20 61 73 73 75 6d 65 20 61  *.** We assume a
1a7e0 20 71 75 65 72 79 20 6f 66 20 74 68 65 20 66 6f   query of the fo
1a7f0 6c 6c 6f 77 69 6e 67 20 66 6f 72 6d 3a 0a 2a 2a  llowing form:.**
1a800 0a 2a 2a 20 20 20 20 20 20 3c 73 65 6c 65 63 74  .**      <select
1a810 41 3e 20 20 3c 6f 70 65 72 61 74 6f 72 3e 20 20  A>  <operator>  
1a820 3c 73 65 6c 65 63 74 42 3e 20 20 4f 52 44 45 52  <selectB>  ORDER
1a830 20 42 59 20 3c 6f 72 64 65 72 62 79 6c 69 73 74   BY <orderbylist
1a840 3e 0a 2a 2a 0a 2a 2a 20 3c 6f 70 65 72 61 74 6f  >.**.** <operato
1a850 72 3e 20 69 73 20 6f 6e 65 20 6f 66 20 55 4e 49  r> is one of UNI
1a860 4f 4e 20 41 4c 4c 2c 20 55 4e 49 4f 4e 2c 20 45  ON ALL, UNION, E
1a870 58 43 45 50 54 2c 20 6f 72 20 49 4e 54 45 52 53  XCEPT, or INTERS
1a880 45 43 54 2e 20 20 54 68 65 20 69 64 65 61 0a 2a  ECT.  The idea.*
1a890 2a 20 69 73 20 74 6f 20 63 6f 64 65 20 62 6f 74  * is to code bot
1a8a0 68 20 3c 73 65 6c 65 63 74 41 3e 20 61 6e 64 20  h <selectA> and 
1a8b0 3c 73 65 6c 65 63 74 42 3e 20 77 69 74 68 20 74  <selectB> with t
1a8c0 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
1a8d0 73 65 20 61 73 0a 2a 2a 20 63 6f 2d 72 6f 75 74  se as.** co-rout
1a8e0 69 6e 65 73 2e 20 20 54 68 65 6e 20 72 75 6e 20  ines.  Then run 
1a8f0 74 68 65 20 63 6f 2d 72 6f 75 74 69 6e 65 73 20  the co-routines 
1a900 69 6e 20 70 61 72 61 6c 6c 65 6c 20 61 6e 64 20  in parallel and 
1a910 6d 65 72 67 65 20 74 68 65 20 72 65 73 75 6c 74  merge the result
1a920 73 0a 2a 2a 20 69 6e 74 6f 20 74 68 65 20 6f 75  s.** into the ou
1a930 74 70 75 74 2e 20 20 49 6e 20 61 64 64 69 74 69  tput.  In additi
1a940 6f 6e 20 74 6f 20 74 68 65 20 74 77 6f 20 63 6f  on to the two co
1a950 72 6f 75 74 69 6e 65 73 20 28 63 61 6c 6c 65 64  routines (called
1a960 20 73 65 6c 65 63 74 41 20 61 6e 64 0a 2a 2a 20   selectA and.** 
1a970 73 65 6c 65 63 74 42 29 20 74 68 65 72 65 20 61  selectB) there a
1a980 72 65 20 37 20 73 75 62 72 6f 75 74 69 6e 65 73  re 7 subroutines
1a990 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 6f 75 74 41 3a  :.**.**    outA:
1a9a0 20 20 20 20 4d 6f 76 65 20 74 68 65 20 6f 75 74      Move the out
1a9b0 70 75 74 20 6f 66 20 74 68 65 20 73 65 6c 65 63  put of the selec
1a9c0 74 41 20 63 6f 72 6f 75 74 69 6e 65 20 69 6e 74  tA coroutine int
1a9d0 6f 20 74 68 65 20 6f 75 74 70 75 74 0a 2a 2a 20  o the output.** 
1a9e0 20 20 20 20 20 20 20 20 20 20 20 20 6f 66 20 74              of t
1a9f0 68 65 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72  he compound quer
1aa00 79 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 6f 75 74 42  y..**.**    outB
1aa10 3a 20 20 20 20 4d 6f 76 65 20 74 68 65 20 6f 75  :    Move the ou
1aa20 74 70 75 74 20 6f 66 20 74 68 65 20 73 65 6c 65  tput of the sele
1aa30 63 74 42 20 63 6f 72 6f 75 74 69 6e 65 20 69 6e  ctB coroutine in
1aa40 74 6f 20 74 68 65 20 6f 75 74 70 75 74 0a 2a 2a  to the output.**
1aa50 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 66 20               of 
1aa60 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65  the compound que
1aa70 72 79 2e 20 20 28 4f 6e 6c 79 20 67 65 6e 65 72  ry.  (Only gener
1aa80 61 74 65 64 20 66 6f 72 20 55 4e 49 4f 4e 20 61  ated for UNION a
1aa90 6e 64 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  nd.**           
1aaa0 20 20 55 4e 49 4f 4e 20 41 4c 4c 2e 20 20 45 58    UNION ALL.  EX
1aab0 43 45 50 54 20 61 6e 64 20 49 4e 53 45 52 54 53  CEPT and INSERTS
1aac0 45 43 54 20 6e 65 76 65 72 20 6f 75 74 70 75 74  ECT never output
1aad0 20 61 20 72 6f 77 20 74 68 61 74 0a 2a 2a 20 20   a row that.**  
1aae0 20 20 20 20 20 20 20 20 20 20 20 61 70 70 65 61             appea
1aaf0 72 73 20 6f 6e 6c 79 20 69 6e 20 42 2e 29 0a 2a  rs only in B.).*
1ab00 2a 0a 2a 2a 20 20 20 20 41 6c 74 42 3a 20 20 20  *.**    AltB:   
1ab10 20 43 61 6c 6c 65 64 20 77 68 65 6e 20 74 68 65   Called when the
1ab20 72 65 20 69 73 20 64 61 74 61 20 66 72 6f 6d 20  re is data from 
1ab30 62 6f 74 68 20 63 6f 72 6f 75 74 69 6e 65 73 20  both coroutines 
1ab40 61 6e 64 20 41 3c 42 2e 0a 2a 2a 0a 2a 2a 20 20  and A<B..**.**  
1ab50 20 20 41 65 71 42 3a 20 20 20 20 43 61 6c 6c 65    AeqB:    Calle
1ab60 64 20 77 68 65 6e 20 74 68 65 72 65 20 69 73 20  d when there is 
1ab70 64 61 74 61 20 66 72 6f 6d 20 62 6f 74 68 20 63  data from both c
1ab80 6f 72 6f 75 74 69 6e 65 73 20 61 6e 64 20 41 3d  oroutines and A=
1ab90 3d 42 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 41 67 74  =B..**.**    Agt
1aba0 42 3a 20 20 20 20 43 61 6c 6c 65 64 20 77 68 65  B:    Called whe
1abb0 6e 20 74 68 65 72 65 20 69 73 20 64 61 74 61 20  n there is data 
1abc0 66 72 6f 6d 20 62 6f 74 68 20 63 6f 72 6f 75 74  from both corout
1abd0 69 6e 65 73 20 61 6e 64 20 41 3e 42 2e 0a 2a 2a  ines and A>B..**
1abe0 0a 2a 2a 20 20 20 20 45 6f 66 41 3a 20 20 20 20  .**    EofA:    
1abf0 43 61 6c 6c 65 64 20 77 68 65 6e 20 64 61 74 61  Called when data
1ac00 20 69 73 20 65 78 68 61 75 73 74 65 64 20 66 72   is exhausted fr
1ac10 6f 6d 20 73 65 6c 65 63 74 41 2e 0a 2a 2a 0a 2a  om selectA..**.*
1ac20 2a 20 20 20 20 45 6f 66 42 3a 20 20 20 20 43 61  *    EofB:    Ca
1ac30 6c 6c 65 64 20 77 68 65 6e 20 64 61 74 61 20 69  lled when data i
1ac40 73 20 65 78 68 61 75 73 74 65 64 20 66 72 6f 6d  s exhausted from
1ac50 20 73 65 6c 65 63 74 42 2e 0a 2a 2a 0a 2a 2a 20   selectB..**.** 
1ac60 54 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  The implementati
1ac70 6f 6e 20 6f 66 20 74 68 65 20 6c 61 74 74 65 72  on of the latter
1ac80 20 66 69 76 65 20 73 75 62 72 6f 75 74 69 6e 65   five subroutine
1ac90 73 20 64 65 70 65 6e 64 20 6f 6e 20 77 68 69 63  s depend on whic
1aca0 68 20 0a 2a 2a 20 3c 6f 70 65 72 61 74 6f 72 3e  h .** <operator>
1acb0 20 69 73 20 75 73 65 64 3a 0a 2a 2a 0a 2a 2a 0a   is used:.**.**.
1acc0 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 55  **             U
1acd0 4e 49 4f 4e 20 41 4c 4c 20 20 20 20 20 20 20 20  NION ALL        
1ace0 20 55 4e 49 4f 4e 20 20 20 20 20 20 20 20 20 20   UNION          
1acf0 20 20 45 58 43 45 50 54 20 20 20 20 20 20 20 20    EXCEPT        
1ad00 20 20 49 4e 54 45 52 53 45 43 54 0a 2a 2a 20 20    INTERSECT.**  
1ad10 20 20 20 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d          --------
1ad20 2d 2d 2d 2d 2d 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d  -----  ---------
1ad30 2d 2d 2d 2d 2d 2d 2d 2d 20 20 2d 2d 2d 2d 2d 2d  --------  ------
1ad40 2d 2d 2d 2d 2d 2d 2d 2d 20 20 2d 2d 2d 2d 2d 2d  --------  ------
1ad50 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20  -----------.**  
1ad60 20 41 6c 74 42 3a 20 20 20 6f 75 74 41 2c 20 6e   AltB:   outA, n
1ad70 65 78 74 41 20 20 20 20 20 20 6f 75 74 41 2c 20  extA      outA, 
1ad80 6e 65 78 74 41 20 20 20 20 20 20 20 6f 75 74 41  nextA       outA
1ad90 2c 20 6e 65 78 74 41 20 20 20 20 20 20 20 20 20  , nextA         
1ada0 6e 65 78 74 41 0a 2a 2a 0a 2a 2a 20 20 20 41 65  nextA.**.**   Ae
1adb0 71 42 3a 20 20 20 6f 75 74 41 2c 20 6e 65 78 74  qB:   outA, next
1adc0 41 20 20 20 20 20 20 20 20 20 6e 65 78 74 41 20  A         nextA 
1add0 20 20 20 20 20 20 20 20 20 20 20 20 6e 65 78 74              next
1ade0 41 20 20 20 20 20 20 20 20 20 6f 75 74 41 2c 20  A         outA, 
1adf0 6e 65 78 74 41 0a 2a 2a 0a 2a 2a 20 20 20 41 67  nextA.**.**   Ag
1ae00 74 42 3a 20 20 20 6f 75 74 42 2c 20 6e 65 78 74  tB:   outB, next
1ae10 42 20 20 20 20 20 20 6f 75 74 42 2c 20 6e 65 78  B      outB, nex
1ae20 74 42 20 20 20 20 20 20 20 20 20 20 6e 65 78 74  tB          next
1ae30 42 20 20 20 20 20 20 20 20 20 20 20 20 6e 65 78  B            nex
1ae40 74 42 0a 2a 2a 0a 2a 2a 20 20 20 45 6f 66 41 3a  tB.**.**   EofA:
1ae50 20 20 20 6f 75 74 42 2c 20 6e 65 78 74 42 20 20     outB, nextB  
1ae60 20 20 20 20 6f 75 74 42 2c 20 6e 65 78 74 42 20      outB, nextB 
1ae70 20 20 20 20 20 20 20 20 20 68 61 6c 74 20 20 20           halt   
1ae80 20 20 20 20 20 20 20 20 20 20 68 61 6c 74 0a 2a            halt.*
1ae90 2a 0a 2a 2a 20 20 20 45 6f 66 42 3a 20 20 20 6f  *.**   EofB:   o
1aea0 75 74 41 2c 20 6e 65 78 74 41 20 20 20 20 20 20  utA, nextA      
1aeb0 6f 75 74 41 2c 20 6e 65 78 74 41 20 20 20 20 20  outA, nextA     
1aec0 20 20 6f 75 74 41 2c 20 6e 65 78 74 41 20 20 20    outA, nextA   
1aed0 20 20 20 20 20 20 68 61 6c 74 0a 2a 2a 0a 2a 2a        halt.**.**
1aee0 20 49 6e 20 74 68 65 20 41 6c 74 42 2c 20 41 65   In the AltB, Ae
1aef0 71 42 2c 20 61 6e 64 20 41 67 74 42 20 73 75 62  qB, and AgtB sub
1af00 72 6f 75 74 69 6e 65 73 2c 20 61 6e 20 45 4f 46  routines, an EOF
1af10 20 6f 6e 20 41 20 66 6f 6c 6c 6f 77 69 6e 67 20   on A following 
1af20 6e 65 78 74 41 0a 2a 2a 20 63 61 75 73 65 73 20  nextA.** causes 
1af30 61 6e 20 69 6d 6d 65 64 69 61 74 65 20 6a 75 6d  an immediate jum
1af40 70 20 74 6f 20 45 6f 66 41 20 61 6e 64 20 61 6e  p to EofA and an
1af50 20 45 4f 46 20 6f 6e 20 42 20 66 6f 6c 6c 6f 77   EOF on B follow
1af60 69 6e 67 20 6e 65 78 74 42 20 63 61 75 73 65 73  ing nextB causes
1af70 0a 2a 2a 20 61 6e 20 69 6d 6d 65 64 69 61 74 65  .** an immediate
1af80 20 6a 75 6d 70 20 74 6f 20 45 6f 66 42 2e 20 20   jump to EofB.  
1af90 57 69 74 68 69 6e 20 45 6f 66 41 20 61 6e 64 20  Within EofA and 
1afa0 45 6f 66 42 2c 20 61 6e 64 20 45 4f 46 20 6f 6e  EofB, and EOF on
1afb0 20 65 6e 74 72 79 20 6f 72 0a 2a 2a 20 66 6f 6c   entry or.** fol
1afc0 6c 6f 77 69 6e 67 20 6e 65 78 74 58 20 63 61 75  lowing nextX cau
1afd0 73 65 73 20 61 20 6a 75 6d 70 20 74 6f 20 74 68  ses a jump to th
1afe0 65 20 65 6e 64 20 6f 66 20 74 68 65 20 73 65 6c  e end of the sel
1aff0 65 63 74 20 70 72 6f 63 65 73 73 69 6e 67 2e 0a  ect processing..
1b000 2a 2a 0a 2a 2a 20 44 75 70 6c 69 63 61 74 65 20  **.** Duplicate 
1b010 72 65 6d 6f 76 61 6c 20 69 6e 20 74 68 65 20 55  removal in the U
1b020 4e 49 4f 4e 2c 20 45 58 43 45 50 54 2c 20 61 6e  NION, EXCEPT, an
1b030 64 20 49 4e 54 45 52 53 45 43 54 20 63 61 73 65  d INTERSECT case
1b040 73 20 69 73 20 68 61 6e 64 6c 65 64 0a 2a 2a 20  s is handled.** 
1b050 77 69 74 68 69 6e 20 74 68 65 20 6f 75 74 70 75  within the outpu
1b060 74 20 73 75 62 72 6f 75 74 69 6e 65 2e 20 20 54  t subroutine.  T
1b070 68 65 20 72 65 67 50 72 65 76 20 72 65 67 69 73  he regPrev regis
1b080 74 65 72 20 73 65 74 20 68 6f 6c 64 73 20 74 68  ter set holds th
1b090 65 20 70 72 65 76 69 6f 75 73 6c 79 0a 2a 2a 20  e previously.** 
1b0a0 6f 75 74 70 75 74 20 76 61 6c 75 65 2e 20 20 41  output value.  A
1b0b0 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69 73 20 6d   comparison is m
1b0c0 61 64 65 20 61 67 61 69 6e 73 74 20 74 68 69 73  ade against this
1b0d0 20 76 61 6c 75 65 20 61 6e 64 20 74 68 65 20 6f   value and the o
1b0e0 75 74 70 75 74 0a 2a 2a 20 69 73 20 73 6b 69 70  utput.** is skip
1b0f0 70 65 64 20 69 66 20 74 68 65 20 6e 65 78 74 20  ped if the next 
1b100 72 65 73 75 6c 74 73 20 77 6f 75 6c 64 20 62 65  results would be
1b110 20 74 68 65 20 73 61 6d 65 20 61 73 20 74 68 65   the same as the
1b120 20 70 72 65 76 69 6f 75 73 2e 0a 2a 2a 0a 2a 2a   previous..**.**
1b130 20 54 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74   The implementat
1b140 69 6f 6e 20 70 6c 61 6e 20 69 73 20 74 6f 20 69  ion plan is to i
1b150 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 74 77 6f  mplement the two
1b160 20 63 6f 72 6f 75 74 69 6e 65 73 20 61 6e 64 20   coroutines and 
1b170 73 65 76 65 6e 0a 2a 2a 20 73 75 62 72 6f 75 74  seven.** subrout
1b180 69 6e 65 73 20 66 69 72 73 74 2c 20 74 68 65 6e  ines first, then
1b190 20 70 75 74 20 74 68 65 20 63 6f 6e 74 72 6f 6c   put the control
1b1a0 20 6c 6f 67 69 63 20 61 74 20 74 68 65 20 62 6f   logic at the bo
1b1b0 74 74 6f 6d 2e 20 20 4c 69 6b 65 20 74 68 69 73  ttom.  Like this
1b1c0 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20  :.**.**         
1b1d0 20 67 6f 74 6f 20 49 6e 69 74 0a 2a 2a 20 20 20   goto Init.**   
1b1e0 20 20 63 6f 41 3a 20 63 6f 72 6f 75 74 69 6e 65    coA: coroutine
1b1f0 20 66 6f 72 20 6c 65 66 74 20 71 75 65 72 79 20   for left query 
1b200 28 41 29 0a 2a 2a 20 20 20 20 20 63 6f 42 3a 20  (A).**     coB: 
1b210 63 6f 72 6f 75 74 69 6e 65 20 66 6f 72 20 72 69  coroutine for ri
1b220 67 68 74 20 71 75 65 72 79 20 28 42 29 0a 2a 2a  ght query (B).**
1b230 20 20 20 20 6f 75 74 41 3a 20 6f 75 74 70 75 74      outA: output
1b240 20 6f 6e 65 20 72 6f 77 20 6f 66 20 41 0a 2a 2a   one row of A.**
1b250 20 20 20 20 6f 75 74 42 3a 20 6f 75 74 70 75 74      outB: output
1b260 20 6f 6e 65 20 72 6f 77 20 6f 66 20 42 20 28 55   one row of B (U
1b270 4e 49 4f 4e 20 61 6e 64 20 55 4e 49 4f 4e 20 41  NION and UNION A
1b280 4c 4c 20 6f 6e 6c 79 29 0a 2a 2a 20 20 20 20 45  LL only).**    E
1b290 6f 66 41 3a 20 2e 2e 2e 0a 2a 2a 20 20 20 20 45  ofA: ....**    E
1b2a0 6f 66 42 3a 20 2e 2e 2e 0a 2a 2a 20 20 20 20 41  ofB: ....**    A
1b2b0 6c 74 42 3a 20 2e 2e 2e 0a 2a 2a 20 20 20 20 41  ltB: ....**    A
1b2c0 65 71 42 3a 20 2e 2e 2e 0a 2a 2a 20 20 20 20 41  eqB: ....**    A
1b2d0 67 74 42 3a 20 2e 2e 2e 0a 2a 2a 20 20 20 20 49  gtB: ....**    I
1b2e0 6e 69 74 3a 20 69 6e 69 74 69 61 6c 69 7a 65 20  nit: initialize 
1b2f0 63 6f 72 6f 75 74 69 6e 65 20 72 65 67 69 73 74  coroutine regist
1b300 65 72 73 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ers.**          
1b310 79 69 65 6c 64 20 63 6f 41 0a 2a 2a 20 20 20 20  yield coA.**    
1b320 20 20 20 20 20 20 69 66 20 65 6f 66 28 41 29 20        if eof(A) 
1b330 67 6f 74 6f 20 45 6f 66 41 0a 2a 2a 20 20 20 20  goto EofA.**    
1b340 20 20 20 20 20 20 79 69 65 6c 64 20 63 6f 42 0a        yield coB.
1b350 2a 2a 20 20 20 20 20 20 20 20 20 20 69 66 20 65  **          if e
1b360 6f 66 28 42 29 20 67 6f 74 6f 20 45 6f 66 42 0a  of(B) goto EofB.
1b370 2a 2a 20 20 20 20 43 6d 70 72 3a 20 43 6f 6d 70  **    Cmpr: Comp
1b380 61 72 65 20 41 2c 20 42 0a 2a 2a 20 20 20 20 20  are A, B.**     
1b390 20 20 20 20 20 4a 75 6d 70 20 41 6c 74 42 2c 20       Jump AltB, 
1b3a0 41 65 71 42 2c 20 41 67 74 42 0a 2a 2a 20 20 20  AeqB, AgtB.**   
1b3b0 20 20 45 6e 64 3a 20 2e 2e 2e 0a 2a 2a 0a 2a 2a    End: ....**.**
1b3c0 20 57 65 20 63 61 6c 6c 20 41 6c 74 42 2c 20 41   We call AltB, A
1b3d0 65 71 42 2c 20 41 67 74 42 2c 20 45 6f 66 41 2c  eqB, AgtB, EofA,
1b3e0 20 61 6e 64 20 45 6f 66 42 20 22 73 75 62 72 6f   and EofB "subro
1b3f0 75 74 69 6e 65 73 22 20 62 75 74 20 74 68 65 79  utines" but they
1b400 20 61 72 65 20 6e 6f 74 0a 2a 2a 20 61 63 74 75   are not.** actu
1b410 61 6c 6c 79 20 63 61 6c 6c 65 64 20 75 73 69 6e  ally called usin
1b420 67 20 47 6f 73 75 62 20 61 6e 64 20 74 68 65 79  g Gosub and they
1b430 20 64 6f 20 6e 6f 74 20 52 65 74 75 72 6e 2e 20   do not Return. 
1b440 20 45 6f 66 41 20 61 6e 64 20 45 6f 66 42 20 6c   EofA and EofB l
1b450 6f 6f 70 0a 2a 2a 20 75 6e 74 69 6c 20 61 6c 6c  oop.** until all
1b460 20 64 61 74 61 20 69 73 20 65 78 68 61 75 73 74   data is exhaust
1b470 65 64 20 74 68 65 6e 20 6a 75 6d 70 20 74 6f 20  ed then jump to 
1b480 74 68 65 20 22 65 6e 64 22 20 6c 61 62 65 2e 20  the "end" labe. 
1b490 20 41 6c 74 42 2c 20 41 65 71 42 2c 0a 2a 2a 20   AltB, AeqB,.** 
1b4a0 61 6e 64 20 41 67 74 42 20 6a 75 6d 70 20 74 6f  and AgtB jump to
1b4b0 20 65 69 74 68 65 72 20 4c 32 20 6f 72 20 74 6f   either L2 or to
1b4c0 20 6f 6e 65 20 6f 66 20 45 6f 66 41 20 6f 72 20   one of EofA or 
1b4d0 45 6f 66 42 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66  EofB..*/.#ifndef
1b4e0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d   SQLITE_OMIT_COM
1b4f0 50 4f 55 4e 44 5f 53 45 4c 45 43 54 0a 73 74 61  POUND_SELECT.sta
1b500 74 69 63 20 69 6e 74 20 6d 75 6c 74 69 53 65 6c  tic int multiSel
1b510 65 63 74 4f 72 64 65 72 42 79 28 0a 20 20 50 61  ectOrderBy(.  Pa
1b520 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
1b530 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63      /* Parsing c
1b540 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65  ontext */.  Sele
1b550 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  ct *p,          
1b560 20 20 2f 2a 20 54 68 65 20 72 69 67 68 74 2d 6d    /* The right-m
1b570 6f 73 74 20 6f 66 20 53 45 4c 45 43 54 73 20 74  ost of SELECTs t
1b580 6f 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20  o be coded */.  
1b590 53 65 6c 65 63 74 44 65 73 74 20 2a 70 44 65 73  SelectDest *pDes
1b5a0 74 20 20 20 20 20 2f 2a 20 57 68 61 74 20 74 6f  t     /* What to
1b5b0 20 64 6f 20 77 69 74 68 20 71 75 65 72 79 20 72   do with query r
1b5c0 65 73 75 6c 74 73 20 2a 2f 0a 29 7b 0a 20 20 69  esults */.){.  i
1b5d0 6e 74 20 69 2c 20 6a 3b 20 20 20 20 20 20 20 20  nt i, j;        
1b5e0 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
1b5f0 6e 74 65 72 73 20 2a 2f 0a 20 20 53 65 6c 65 63  nters */.  Selec
1b600 74 20 2a 70 50 72 69 6f 72 3b 20 20 20 20 20 20  t *pPrior;      
1b610 20 2f 2a 20 41 6e 6f 74 68 65 72 20 53 45 4c 45   /* Another SELE
1b620 43 54 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 74  CT immediately t
1b630 6f 20 6f 75 72 20 6c 65 66 74 20 2a 2f 0a 20 20  o our left */.  
1b640 56 64 62 65 20 2a 76 3b 20 20 20 20 20 20 20 20  Vdbe *v;        
1b650 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74        /* Generat
1b660 65 20 63 6f 64 65 20 74 6f 20 74 68 69 73 20 56  e code to this V
1b670 44 42 45 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44  DBE */.  SelectD
1b680 65 73 74 20 64 65 73 74 41 3b 20 20 20 20 20 2f  est destA;     /
1b690 2a 20 44 65 73 74 69 6e 61 74 69 6f 6e 20 66 6f  * Destination fo
1b6a0 72 20 63 6f 72 6f 75 74 69 6e 65 20 41 20 2a 2f  r coroutine A */
1b6b0 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 64 65  .  SelectDest de
1b6c0 73 74 42 3b 20 20 20 20 20 2f 2a 20 44 65 73 74  stB;     /* Dest
1b6d0 69 6e 61 74 69 6f 6e 20 66 6f 72 20 63 6f 72 6f  ination for coro
1b6e0 75 74 69 6e 65 20 42 20 2a 2f 0a 20 20 69 6e 74  utine B */.  int
1b6f0 20 72 65 67 41 64 64 72 41 3b 20 20 20 20 20 20   regAddrA;      
1b700 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 72 65     /* Address re
1b710 67 69 73 74 65 72 20 66 6f 72 20 73 65 6c 65 63  gister for selec
1b720 74 2d 41 20 63 6f 72 6f 75 74 69 6e 65 20 2a 2f  t-A coroutine */
1b730 0a 20 20 69 6e 74 20 72 65 67 41 64 64 72 42 3b  .  int regAddrB;
1b740 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72           /* Addr
1b750 65 73 73 20 72 65 67 69 73 74 65 72 20 66 6f 72  ess register for
1b760 20 73 65 6c 65 63 74 2d 42 20 63 6f 72 6f 75 74   select-B corout
1b770 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64  ine */.  int add
1b780 72 53 65 6c 65 63 74 41 3b 20 20 20 20 20 20 2f  rSelectA;      /
1b790 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 68 65  * Address of the
1b7a0 20 73 65 6c 65 63 74 2d 41 20 63 6f 72 6f 75 74   select-A corout
1b7b0 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64  ine */.  int add
1b7c0 72 53 65 6c 65 63 74 42 3b 20 20 20 20 20 20 2f  rSelectB;      /
1b7d0 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 68 65  * Address of the
1b7e0 20 73 65 6c 65 63 74 2d 42 20 63 6f 72 6f 75 74   select-B corout
1b7f0 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67  ine */.  int reg
1b800 4f 75 74 41 3b 20 20 20 20 20 20 20 20 20 20 2f  OutA;          /
1b810 2a 20 41 64 64 72 65 73 73 20 72 65 67 69 73 74  * Address regist
1b820 65 72 20 66 6f 72 20 74 68 65 20 6f 75 74 70 75  er for the outpu
1b830 74 2d 41 20 73 75 62 72 6f 75 74 69 6e 65 20 2a  t-A subroutine *
1b840 2f 0a 20 20 69 6e 74 20 72 65 67 4f 75 74 42 3b  /.  int regOutB;
1b850 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64            /* Add
1b860 72 65 73 73 20 72 65 67 69 73 74 65 72 20 66 6f  ress register fo
1b870 72 20 74 68 65 20 6f 75 74 70 75 74 2d 42 20 73  r the output-B s
1b880 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69  ubroutine */.  i
1b890 6e 74 20 61 64 64 72 4f 75 74 41 3b 20 20 20 20  nt addrOutA;    
1b8a0 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
1b8b0 6f 66 20 74 68 65 20 6f 75 74 70 75 74 2d 41 20  of the output-A 
1b8c0 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20  subroutine */.  
1b8d0 69 6e 74 20 61 64 64 72 4f 75 74 42 20 3d 20 30  int addrOutB = 0
1b8e0 3b 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73  ;     /* Address
1b8f0 20 6f 66 20 74 68 65 20 6f 75 74 70 75 74 2d 42   of the output-B
1b900 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20   subroutine */. 
1b910 20 69 6e 74 20 61 64 64 72 45 6f 66 41 3b 20 20   int addrEofA;  
1b920 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73         /* Addres
1b930 73 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74 2d  s of the select-
1b940 41 2d 65 78 68 61 75 73 74 65 64 20 73 75 62 72  A-exhausted subr
1b950 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20  outine */.  int 
1b960 61 64 64 72 45 6f 66 41 5f 6e 6f 42 3b 20 20 20  addrEofA_noB;   
1b970 20 20 2f 2a 20 41 6c 74 65 72 6e 61 74 65 20 61    /* Alternate a
1b980 64 64 72 45 6f 66 41 20 69 66 20 42 20 69 73 20  ddrEofA if B is 
1b990 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64 20 2a 2f  uninitialized */
1b9a0 0a 20 20 69 6e 74 20 61 64 64 72 45 6f 66 42 3b  .  int addrEofB;
1b9b0 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72           /* Addr
1b9c0 65 73 73 20 6f 66 20 74 68 65 20 73 65 6c 65 63  ess of the selec
1b9d0 74 2d 42 2d 65 78 68 61 75 73 74 65 64 20 73 75  t-B-exhausted su
1b9e0 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e  broutine */.  in
1b9f0 74 20 61 64 64 72 41 6c 74 42 3b 20 20 20 20 20  t addrAltB;     
1ba00 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f      /* Address o
1ba10 66 20 74 68 65 20 41 3c 42 20 73 75 62 72 6f 75  f the A<B subrou
1ba20 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64  tine */.  int ad
1ba30 64 72 41 65 71 42 3b 20 20 20 20 20 20 20 20 20  drAeqB;         
1ba40 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 68  /* Address of th
1ba50 65 20 41 3d 3d 42 20 73 75 62 72 6f 75 74 69 6e  e A==B subroutin
1ba60 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 41  e */.  int addrA
1ba70 67 74 42 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  gtB;         /* 
1ba80 41 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 41  Address of the A
1ba90 3e 42 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f  >B subroutine */
1baa0 0a 20 20 69 6e 74 20 72 65 67 4c 69 6d 69 74 41  .  int regLimitA
1bab0 3b 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 6d 69  ;        /* Limi
1bac0 74 20 72 65 67 69 73 74 65 72 20 66 6f 72 20 73  t register for s
1bad0 65 6c 65 63 74 2d 41 20 2a 2f 0a 20 20 69 6e 74  elect-A */.  int
1bae0 20 72 65 67 4c 69 6d 69 74 42 3b 20 20 20 20 20   regLimitB;     
1baf0 20 20 20 2f 2a 20 4c 69 6d 69 74 20 72 65 67 69     /* Limit regi
1bb00 73 74 65 72 20 66 6f 72 20 73 65 6c 65 63 74 2d  ster for select-
1bb10 41 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 50 72  A */.  int regPr
1bb20 65 76 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ev;          /* 
1bb30 41 20 72 61 6e 67 65 20 6f 66 20 72 65 67 69 73  A range of regis
1bb40 74 65 72 73 20 74 6f 20 68 6f 6c 64 20 70 72 65  ters to hold pre
1bb50 76 69 6f 75 73 20 6f 75 74 70 75 74 20 2a 2f 0a  vious output */.
1bb60 20 20 69 6e 74 20 73 61 76 65 64 4c 69 6d 69 74    int savedLimit
1bb70 3b 20 20 20 20 20 20 20 2f 2a 20 53 61 76 65 64  ;       /* Saved
1bb80 20 76 61 6c 75 65 20 6f 66 20 70 2d 3e 69 4c 69   value of p->iLi
1bb90 6d 69 74 20 2a 2f 0a 20 20 69 6e 74 20 73 61 76  mit */.  int sav
1bba0 65 64 4f 66 66 73 65 74 3b 20 20 20 20 20 20 2f  edOffset;      /
1bbb0 2a 20 53 61 76 65 64 20 76 61 6c 75 65 20 6f 66  * Saved value of
1bbc0 20 70 2d 3e 69 4f 66 66 73 65 74 20 2a 2f 0a 20   p->iOffset */. 
1bbd0 20 69 6e 74 20 6c 61 62 65 6c 43 6d 70 72 3b 20   int labelCmpr; 
1bbe0 20 20 20 20 20 20 20 2f 2a 20 4c 61 62 65 6c 20         /* Label 
1bbf0 66 6f 72 20 74 68 65 20 73 74 61 72 74 20 6f 66  for the start of
1bc00 20 74 68 65 20 6d 65 72 67 65 20 61 6c 67 6f 72   the merge algor
1bc10 69 74 68 6d 20 2a 2f 0a 20 20 69 6e 74 20 6c 61  ithm */.  int la
1bc20 62 65 6c 45 6e 64 3b 20 20 20 20 20 20 20 20 20  belEnd;         
1bc30 2f 2a 20 4c 61 62 65 6c 20 66 6f 72 20 74 68 65  /* Label for the
1bc40 20 65 6e 64 20 6f 66 20 74 68 65 20 6f 76 65 72   end of the over
1bc50 61 6c 6c 20 53 45 4c 45 43 54 20 73 74 6d 74 20  all SELECT stmt 
1bc60 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 31 3b 20  */.  int addr1; 
1bc70 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75             /* Ju
1bc80 6d 70 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 20  mp instructions 
1bc90 74 68 61 74 20 67 65 74 20 72 65 74 61 72 67 65  that get retarge
1bca0 74 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 70  tted */.  int op
1bcb0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1bcc0 2f 2a 20 4f 6e 65 20 6f 66 20 54 4b 5f 41 4c 4c  /* One of TK_ALL
1bcd0 2c 20 54 4b 5f 55 4e 49 4f 4e 2c 20 54 4b 5f 45  , TK_UNION, TK_E
1bce0 58 43 45 50 54 2c 20 54 4b 5f 49 4e 54 45 52 53  XCEPT, TK_INTERS
1bcf0 45 43 54 20 2a 2f 0a 20 20 4b 65 79 49 6e 66 6f  ECT */.  KeyInfo
1bd00 20 2a 70 4b 65 79 44 75 70 20 3d 20 30 3b 20 2f   *pKeyDup = 0; /
1bd10 2a 20 43 6f 6d 70 61 72 69 73 6f 6e 20 69 6e 66  * Comparison inf
1bd20 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20 64 75 70  ormation for dup
1bd30 6c 69 63 61 74 65 20 72 65 6d 6f 76 61 6c 20 2a  licate removal *
1bd40 2f 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65  /.  KeyInfo *pKe
1bd50 79 4d 65 72 67 65 3b 20 20 20 2f 2a 20 43 6f 6d  yMerge;   /* Com
1bd60 70 61 72 69 73 6f 6e 20 69 6e 66 6f 72 6d 61 74  parison informat
1bd70 69 6f 6e 20 66 6f 72 20 6d 65 72 67 69 6e 67 20  ion for merging 
1bd80 72 6f 77 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65  rows */.  sqlite
1bd90 33 20 2a 64 62 3b 20 20 20 20 20 20 20 20 20 20  3 *db;          
1bda0 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e  /* Database conn
1bdb0 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 45 78 70 72  ection */.  Expr
1bdc0 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 3b 20  List *pOrderBy; 
1bdd0 20 20 2f 2a 20 54 68 65 20 4f 52 44 45 52 20 42    /* The ORDER B
1bde0 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e  Y clause */.  in
1bdf0 74 20 6e 4f 72 64 65 72 42 79 3b 20 20 20 20 20  t nOrderBy;     
1be00 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
1be10 20 74 65 72 6d 73 20 69 6e 20 74 68 65 20 4f 52   terms in the OR
1be20 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f  DER BY clause */
1be30 0a 20 20 69 6e 74 20 2a 61 50 65 72 6d 75 74 65  .  int *aPermute
1be40 3b 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 70 70  ;        /* Mapp
1be50 69 6e 67 20 66 72 6f 6d 20 4f 52 44 45 52 20 42  ing from ORDER B
1be60 59 20 74 65 72 6d 73 20 74 6f 20 72 65 73 75 6c  Y terms to resul
1be70 74 20 73 65 74 20 63 6f 6c 75 6d 6e 73 20 2a 2f  t set columns */
1be80 0a 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70  ..  assert( p->p
1be90 4f 72 64 65 72 42 79 21 3d 30 20 29 3b 0a 20 20  OrderBy!=0 );.  
1bea0 61 73 73 65 72 74 28 20 70 4b 65 79 44 75 70 3d  assert( pKeyDup=
1beb0 3d 30 20 29 3b 20 2f 2a 20 22 4d 61 6e 61 67 65  =0 ); /* "Manage
1bec0 64 22 20 63 6f 64 65 20 6e 65 65 64 73 20 74 68  d" code needs th
1bed0 69 73 2e 20 20 54 69 63 6b 65 74 20 23 33 33 38  is.  Ticket #338
1bee0 32 2e 20 2a 2f 0a 20 20 64 62 20 3d 20 70 50 61  2. */.  db = pPa
1bef0 72 73 65 2d 3e 64 62 3b 0a 20 20 76 20 3d 20 70  rse->db;.  v = p
1bf00 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
1bf10 61 73 73 65 72 74 28 20 76 21 3d 30 20 29 3b 20  assert( v!=0 ); 
1bf20 20 20 20 20 20 20 2f 2a 20 41 6c 72 65 61 64 79        /* Already
1bf30 20 74 68 72 6f 77 6e 20 74 68 65 20 65 72 72 6f   thrown the erro
1bf40 72 20 69 66 20 56 44 42 45 20 61 6c 6c 6f 63 20  r if VDBE alloc 
1bf50 66 61 69 6c 65 64 20 2a 2f 0a 20 20 6c 61 62 65  failed */.  labe
1bf60 6c 45 6e 64 20 3d 20 73 71 6c 69 74 65 33 56 64  lEnd = sqlite3Vd
1bf70 62 65 4d 61 6b 65 4c 61 62 65 6c 28 70 50 61 72  beMakeLabel(pPar
1bf80 73 65 29 3b 0a 20 20 6c 61 62 65 6c 43 6d 70 72  se);.  labelCmpr
1bf90 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
1bfa0 6b 65 4c 61 62 65 6c 28 70 50 61 72 73 65 29 3b  keLabel(pParse);
1bfb0 0a 0a 0a 20 20 2f 2a 20 50 61 74 63 68 20 75 70  ...  /* Patch up
1bfc0 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   the ORDER BY cl
1bfd0 61 75 73 65 0a 20 20 2a 2f 0a 20 20 6f 70 20 3d  ause.  */.  op =
1bfe0 20 70 2d 3e 6f 70 3b 20 20 0a 20 20 70 50 72 69   p->op;  .  pPri
1bff0 6f 72 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 0a  or = p->pPrior;.
1c000 20 20 61 73 73 65 72 74 28 20 70 50 72 69 6f 72    assert( pPrior
1c010 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 3b  ->pOrderBy==0 );
1c020 0a 20 20 70 4f 72 64 65 72 42 79 20 3d 20 70 2d  .  pOrderBy = p-
1c030 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 61 73 73  >pOrderBy;.  ass
1c040 65 72 74 28 20 70 4f 72 64 65 72 42 79 20 29 3b  ert( pOrderBy );
1c050 0a 20 20 6e 4f 72 64 65 72 42 79 20 3d 20 70 4f  .  nOrderBy = pO
1c060 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 0a 0a  rderBy->nExpr;..
1c070 20 20 2f 2a 20 46 6f 72 20 6f 70 65 72 61 74 6f    /* For operato
1c080 72 73 20 6f 74 68 65 72 20 74 68 61 6e 20 55 4e  rs other than UN
1c090 49 4f 4e 20 41 4c 4c 20 77 65 20 68 61 76 65 20  ION ALL we have 
1c0a0 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61  to make sure tha
1c0b0 74 0a 20 20 2a 2a 20 74 68 65 20 4f 52 44 45 52  t.  ** the ORDER
1c0c0 20 42 59 20 63 6c 61 75 73 65 20 63 6f 76 65 72   BY clause cover
1c0d0 73 20 65 76 65 72 79 20 74 65 72 6d 20 6f 66 20  s every term of 
1c0e0 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 2e 20  the result set. 
1c0f0 20 41 64 64 0a 20 20 2a 2a 20 74 65 72 6d 73 20   Add.  ** terms 
1c100 74 6f 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  to the ORDER BY 
1c110 63 6c 61 75 73 65 20 61 73 20 6e 65 63 65 73 73  clause as necess
1c120 61 72 79 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ary..  */.  if( 
1c130 6f 70 21 3d 54 4b 5f 41 4c 4c 20 29 7b 0a 20 20  op!=TK_ALL ){.  
1c140 20 20 66 6f 72 28 69 3d 31 3b 20 64 62 2d 3e 6d    for(i=1; db->m
1c150 61 6c 6c 6f 63 46 61 69 6c 65 64 3d 3d 30 20 26  allocFailed==0 &
1c160 26 20 69 3c 3d 70 2d 3e 70 45 4c 69 73 74 2d 3e  & i<=p->pEList->
1c170 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
1c180 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69     struct ExprLi
1c190 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a  st_item *pItem;.
1c1a0 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 2c 20 70        for(j=0, p
1c1b0 49 74 65 6d 3d 70 4f 72 64 65 72 42 79 2d 3e 61  Item=pOrderBy->a
1c1c0 3b 20 6a 3c 6e 4f 72 64 65 72 42 79 3b 20 6a 2b  ; j<nOrderBy; j+
1c1d0 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20  +, pItem++){.   
1c1e0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49 74       assert( pIt
1c1f0 65 6d 2d 3e 75 2e 78 2e 69 4f 72 64 65 72 42 79  em->u.x.iOrderBy
1c200 43 6f 6c 3e 30 20 29 3b 0a 20 20 20 20 20 20 20  Col>0 );.       
1c210 20 69 66 28 20 70 49 74 65 6d 2d 3e 75 2e 78 2e   if( pItem->u.x.
1c220 69 4f 72 64 65 72 42 79 43 6f 6c 3d 3d 69 20 29  iOrderByCol==i )
1c230 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
1c240 20 20 20 20 20 20 69 66 28 20 6a 3d 3d 6e 4f 72        if( j==nOr
1c250 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20 20  derBy ){.       
1c260 20 45 78 70 72 20 2a 70 4e 65 77 20 3d 20 73 71   Expr *pNew = sq
1c270 6c 69 74 65 33 45 78 70 72 28 64 62 2c 20 54 4b  lite3Expr(db, TK
1c280 5f 49 4e 54 45 47 45 52 2c 20 30 29 3b 0a 20 20  _INTEGER, 0);.  
1c290 20 20 20 20 20 20 69 66 28 20 70 4e 65 77 3d 3d        if( pNew==
1c2a0 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  0 ) return SQLIT
1c2b0 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20  E_NOMEM_BKPT;.  
1c2c0 20 20 20 20 20 20 70 4e 65 77 2d 3e 66 6c 61 67        pNew->flag
1c2d0 73 20 7c 3d 20 45 50 5f 49 6e 74 56 61 6c 75 65  s |= EP_IntValue
1c2e0 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e  ;.        pNew->
1c2f0 75 2e 69 56 61 6c 75 65 20 3d 20 69 3b 0a 20 20  u.iValue = i;.  
1c300 20 20 20 20 20 20 70 2d 3e 70 4f 72 64 65 72 42        p->pOrderB
1c310 79 20 3d 20 70 4f 72 64 65 72 42 79 20 3d 20 73  y = pOrderBy = s
1c320 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70  qlite3ExprListAp
1c330 70 65 6e 64 28 70 50 61 72 73 65 2c 20 70 4f 72  pend(pParse, pOr
1c340 64 65 72 42 79 2c 20 70 4e 65 77 29 3b 0a 20 20  derBy, pNew);.  
1c350 20 20 20 20 20 20 69 66 28 20 70 4f 72 64 65 72        if( pOrder
1c360 42 79 20 29 20 70 4f 72 64 65 72 42 79 2d 3e 61  By ) pOrderBy->a
1c370 5b 6e 4f 72 64 65 72 42 79 2b 2b 5d 2e 75 2e 78  [nOrderBy++].u.x
1c380 2e 69 4f 72 64 65 72 42 79 43 6f 6c 20 3d 20 28  .iOrderByCol = (
1c390 75 31 36 29 69 3b 0a 20 20 20 20 20 20 7d 0a 20  u16)i;.      }. 
1c3a0 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43     }.  }..  /* C
1c3b0 6f 6d 70 75 74 65 20 74 68 65 20 63 6f 6d 70 61  ompute the compa
1c3c0 72 69 73 6f 6e 20 70 65 72 6d 75 74 61 74 69 6f  rison permutatio
1c3d0 6e 20 61 6e 64 20 6b 65 79 69 6e 66 6f 20 74 68  n and keyinfo th
1c3e0 61 74 20 69 73 20 75 73 65 64 20 77 69 74 68 0a  at is used with.
1c3f0 20 20 2a 2a 20 74 68 65 20 70 65 72 6d 75 74 61    ** the permuta
1c400 74 69 6f 6e 20 75 73 65 64 20 74 6f 20 64 65 74  tion used to det
1c410 65 72 6d 69 6e 65 20 69 66 20 74 68 65 20 6e 65  ermine if the ne
1c420 78 74 0a 20 20 2a 2a 20 72 6f 77 20 6f 66 20 72  xt.  ** row of r
1c430 65 73 75 6c 74 73 20 63 6f 6d 65 73 20 66 72 6f  esults comes fro
1c440 6d 20 73 65 6c 65 63 74 41 20 6f 72 20 73 65 6c  m selectA or sel
1c450 65 63 74 42 2e 20 20 41 6c 73 6f 20 61 64 64 20  ectB.  Also add 
1c460 65 78 70 6c 69 63 69 74 0a 20 20 2a 2a 20 63 6f  explicit.  ** co
1c470 6c 6c 61 74 69 6f 6e 73 20 74 6f 20 74 68 65 20  llations to the 
1c480 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
1c490 74 65 72 6d 73 20 73 6f 20 74 68 61 74 20 77 68  terms so that wh
1c4a0 65 6e 20 74 68 65 20 73 75 62 71 75 65 72 69 65  en the subquerie
1c4b0 73 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20 72 69  s.  ** to the ri
1c4c0 67 68 74 20 61 6e 64 20 74 68 65 20 6c 65 66 74  ght and the left
1c4d0 20 61 72 65 20 65 76 61 6c 75 61 74 65 64 2c 20   are evaluated, 
1c4e0 74 68 65 79 20 75 73 65 20 74 68 65 20 63 6f 72  they use the cor
1c4f0 72 65 63 74 0a 20 20 2a 2a 20 63 6f 6c 6c 61 74  rect.  ** collat
1c500 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 61 50 65 72  ion..  */.  aPer
1c510 6d 75 74 65 20 3d 20 73 71 6c 69 74 65 33 44 62  mute = sqlite3Db
1c520 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 64 62 2c 20  MallocRawNN(db, 
1c530 73 69 7a 65 6f 66 28 69 6e 74 29 2a 28 6e 4f 72  sizeof(int)*(nOr
1c540 64 65 72 42 79 20 2b 20 31 29 29 3b 0a 20 20 69  derBy + 1));.  i
1c550 66 28 20 61 50 65 72 6d 75 74 65 20 29 7b 0a 20  f( aPermute ){. 
1c560 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69     struct ExprLi
1c570 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a  st_item *pItem;.
1c580 20 20 20 20 61 50 65 72 6d 75 74 65 5b 30 5d 20      aPermute[0] 
1c590 3d 20 6e 4f 72 64 65 72 42 79 3b 0a 20 20 20 20  = nOrderBy;.    
1c5a0 66 6f 72 28 69 3d 31 2c 20 70 49 74 65 6d 3d 70  for(i=1, pItem=p
1c5b0 4f 72 64 65 72 42 79 2d 3e 61 3b 20 69 3c 3d 6e  OrderBy->a; i<=n
1c5c0 4f 72 64 65 72 42 79 3b 20 69 2b 2b 2c 20 70 49  OrderBy; i++, pI
1c5d0 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 61 73  tem++){.      as
1c5e0 73 65 72 74 28 20 70 49 74 65 6d 2d 3e 75 2e 78  sert( pItem->u.x
1c5f0 2e 69 4f 72 64 65 72 42 79 43 6f 6c 3e 30 20 29  .iOrderByCol>0 )
1c600 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
1c610 70 49 74 65 6d 2d 3e 75 2e 78 2e 69 4f 72 64 65  pItem->u.x.iOrde
1c620 72 42 79 43 6f 6c 3c 3d 70 2d 3e 70 45 4c 69 73  rByCol<=p->pELis
1c630 74 2d 3e 6e 45 78 70 72 20 29 3b 0a 20 20 20 20  t->nExpr );.    
1c640 20 20 61 50 65 72 6d 75 74 65 5b 69 5d 20 3d 20    aPermute[i] = 
1c650 70 49 74 65 6d 2d 3e 75 2e 78 2e 69 4f 72 64 65  pItem->u.x.iOrde
1c660 72 42 79 43 6f 6c 20 2d 20 31 3b 0a 20 20 20 20  rByCol - 1;.    
1c670 7d 0a 20 20 20 20 70 4b 65 79 4d 65 72 67 65 20  }.    pKeyMerge 
1c680 3d 20 6d 75 6c 74 69 53 65 6c 65 63 74 4f 72 64  = multiSelectOrd
1c690 65 72 42 79 4b 65 79 49 6e 66 6f 28 70 50 61 72  erByKeyInfo(pPar
1c6a0 73 65 2c 20 70 2c 20 31 29 3b 0a 20 20 7d 65 6c  se, p, 1);.  }el
1c6b0 73 65 7b 0a 20 20 20 20 70 4b 65 79 4d 65 72 67  se{.    pKeyMerg
1c6c0 65 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  e = 0;.  }..  /*
1c6d0 20 52 65 61 74 74 61 63 68 20 74 68 65 20 4f 52   Reattach the OR
1c6e0 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 74 6f  DER BY clause to
1c6f0 20 74 68 65 20 71 75 65 72 79 2e 0a 20 20 2a 2f   the query..  */
1c700 0a 20 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d  .  p->pOrderBy =
1c710 20 70 4f 72 64 65 72 42 79 3b 0a 20 20 70 50 72   pOrderBy;.  pPr
1c720 69 6f 72 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20  ior->pOrderBy = 
1c730 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
1c740 75 70 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  up(pParse->db, p
1c750 4f 72 64 65 72 42 79 2c 20 30 29 3b 0a 0a 20 20  OrderBy, 0);..  
1c760 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 72 61  /* Allocate a ra
1c770 6e 67 65 20 6f 66 20 74 65 6d 70 6f 72 61 72 79  nge of temporary
1c780 20 72 65 67 69 73 74 65 72 73 20 61 6e 64 20 74   registers and t
1c790 68 65 20 4b 65 79 49 6e 66 6f 20 6e 65 65 64 65  he KeyInfo neede
1c7a0 64 0a 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 6c  d.  ** for the l
1c7b0 6f 67 69 63 20 74 68 61 74 20 72 65 6d 6f 76 65  ogic that remove
1c7c0 73 20 64 75 70 6c 69 63 61 74 65 20 72 65 73 75  s duplicate resu
1c7d0 6c 74 20 72 6f 77 73 20 77 68 65 6e 20 74 68 65  lt rows when the
1c7e0 0a 20 20 2a 2a 20 6f 70 65 72 61 74 6f 72 20 69  .  ** operator i
1c7f0 73 20 55 4e 49 4f 4e 2c 20 45 58 43 45 50 54 2c  s UNION, EXCEPT,
1c800 20 6f 72 20 49 4e 54 45 52 53 45 43 54 20 28 62   or INTERSECT (b
1c810 75 74 20 6e 6f 74 20 55 4e 49 4f 4e 20 41 4c 4c  ut not UNION ALL
1c820 29 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6f 70  )..  */.  if( op
1c830 3d 3d 54 4b 5f 41 4c 4c 20 29 7b 0a 20 20 20 20  ==TK_ALL ){.    
1c840 72 65 67 50 72 65 76 20 3d 20 30 3b 0a 20 20 7d  regPrev = 0;.  }
1c850 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 6e 45  else{.    int nE
1c860 78 70 72 20 3d 20 70 2d 3e 70 45 4c 69 73 74 2d  xpr = p->pEList-
1c870 3e 6e 45 78 70 72 3b 0a 20 20 20 20 61 73 73 65  >nExpr;.    asse
1c880 72 74 28 20 6e 4f 72 64 65 72 42 79 3e 3d 6e 45  rt( nOrderBy>=nE
1c890 78 70 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f  xpr || db->mallo
1c8a0 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 72  cFailed );.    r
1c8b0 65 67 50 72 65 76 20 3d 20 70 50 61 72 73 65 2d  egPrev = pParse-
1c8c0 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20 70 50 61  >nMem+1;.    pPa
1c8d0 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 45 78  rse->nMem += nEx
1c8e0 70 72 2b 31 3b 0a 20 20 20 20 73 71 6c 69 74 65  pr+1;.    sqlite
1c8f0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
1c900 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 72 65  P_Integer, 0, re
1c910 67 50 72 65 76 29 3b 0a 20 20 20 20 70 4b 65 79  gPrev);.    pKey
1c920 44 75 70 20 3d 20 73 71 6c 69 74 65 33 4b 65 79  Dup = sqlite3Key
1c930 49 6e 66 6f 41 6c 6c 6f 63 28 64 62 2c 20 6e 45  InfoAlloc(db, nE
1c940 78 70 72 2c 20 31 29 3b 0a 20 20 20 20 69 66 28  xpr, 1);.    if(
1c950 20 70 4b 65 79 44 75 70 20 29 7b 0a 20 20 20 20   pKeyDup ){.    
1c960 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
1c970 33 4b 65 79 49 6e 66 6f 49 73 57 72 69 74 65 61  3KeyInfoIsWritea
1c980 62 6c 65 28 70 4b 65 79 44 75 70 29 20 29 3b 0a  ble(pKeyDup) );.
1c990 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
1c9a0 3c 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20  <nExpr; i++){.  
1c9b0 20 20 20 20 20 20 70 4b 65 79 44 75 70 2d 3e 61        pKeyDup->a
1c9c0 43 6f 6c 6c 5b 69 5d 20 3d 20 6d 75 6c 74 69 53  Coll[i] = multiS
1c9d0 65 6c 65 63 74 43 6f 6c 6c 53 65 71 28 70 50 61  electCollSeq(pPa
1c9e0 72 73 65 2c 20 70 2c 20 69 29 3b 0a 20 20 20 20  rse, p, i);.    
1c9f0 20 20 20 20 70 4b 65 79 44 75 70 2d 3e 61 53 6f      pKeyDup->aSo
1ca00 72 74 4f 72 64 65 72 5b 69 5d 20 3d 20 30 3b 0a  rtOrder[i] = 0;.
1ca10 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
1ca20 7d 0a 20 0a 20 20 2f 2a 20 53 65 70 61 72 61 74  }. .  /* Separat
1ca30 65 20 74 68 65 20 6c 65 66 74 20 61 6e 64 20 74  e the left and t
1ca40 68 65 20 72 69 67 68 74 20 71 75 65 72 79 20 66  he right query f
1ca50 72 6f 6d 20 6f 6e 65 20 61 6e 6f 74 68 65 72 0a  rom one another.
1ca60 20 20 2a 2f 0a 20 20 70 2d 3e 70 50 72 69 6f 72    */.  p->pPrior
1ca70 20 3d 20 30 3b 0a 20 20 70 50 72 69 6f 72 2d 3e   = 0;.  pPrior->
1ca80 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 73 71 6c  pNext = 0;.  sql
1ca90 69 74 65 33 52 65 73 6f 6c 76 65 4f 72 64 65 72  ite3ResolveOrder
1caa0 47 72 6f 75 70 42 79 28 70 50 61 72 73 65 2c 20  GroupBy(pParse, 
1cab0 70 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20  p, p->pOrderBy, 
1cac0 22 4f 52 44 45 52 22 29 3b 0a 20 20 69 66 28 20  "ORDER");.  if( 
1cad0 70 50 72 69 6f 72 2d 3e 70 50 72 69 6f 72 3d 3d  pPrior->pPrior==
1cae0 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
1caf0 52 65 73 6f 6c 76 65 4f 72 64 65 72 47 72 6f 75  ResolveOrderGrou
1cb00 70 42 79 28 70 50 61 72 73 65 2c 20 70 50 72 69  pBy(pParse, pPri
1cb10 6f 72 2c 20 70 50 72 69 6f 72 2d 3e 70 4f 72 64  or, pPrior->pOrd
1cb20 65 72 42 79 2c 20 22 4f 52 44 45 52 22 29 3b 0a  erBy, "ORDER");.
1cb30 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75 74    }..  /* Comput
1cb40 65 20 74 68 65 20 6c 69 6d 69 74 20 72 65 67 69  e the limit regi
1cb50 73 74 65 72 73 20 2a 2f 0a 20 20 63 6f 6d 70 75  sters */.  compu
1cb60 74 65 4c 69 6d 69 74 52 65 67 69 73 74 65 72 73  teLimitRegisters
1cb70 28 70 50 61 72 73 65 2c 20 70 2c 20 6c 61 62 65  (pParse, p, labe
1cb80 6c 45 6e 64 29 3b 0a 20 20 69 66 28 20 70 2d 3e  lEnd);.  if( p->
1cb90 69 4c 69 6d 69 74 20 26 26 20 6f 70 3d 3d 54 4b  iLimit && op==TK
1cba0 5f 41 4c 4c 20 29 7b 0a 20 20 20 20 72 65 67 4c  _ALL ){.    regL
1cbb0 69 6d 69 74 41 20 3d 20 2b 2b 70 50 61 72 73 65  imitA = ++pParse
1cbc0 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 72 65 67 4c  ->nMem;.    regL
1cbd0 69 6d 69 74 42 20 3d 20 2b 2b 70 50 61 72 73 65  imitB = ++pParse
1cbe0 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 73 71 6c 69  ->nMem;.    sqli
1cbf0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
1cc00 20 4f 50 5f 43 6f 70 79 2c 20 70 2d 3e 69 4f 66   OP_Copy, p->iOf
1cc10 66 73 65 74 20 3f 20 70 2d 3e 69 4f 66 66 73 65  fset ? p->iOffse
1cc20 74 2b 31 20 3a 20 70 2d 3e 69 4c 69 6d 69 74 2c  t+1 : p->iLimit,
1cc30 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1cc40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cc50 20 20 20 72 65 67 4c 69 6d 69 74 41 29 3b 0a 20     regLimitA);. 
1cc60 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1cc70 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6f 70 79 2c  dOp2(v, OP_Copy,
1cc80 20 72 65 67 4c 69 6d 69 74 41 2c 20 72 65 67 4c   regLimitA, regL
1cc90 69 6d 69 74 42 29 3b 0a 20 20 7d 65 6c 73 65 7b  imitB);.  }else{
1cca0 0a 20 20 20 20 72 65 67 4c 69 6d 69 74 41 20 3d  .    regLimitA =
1ccb0 20 72 65 67 4c 69 6d 69 74 42 20 3d 20 30 3b 0a   regLimitB = 0;.
1ccc0 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 45 78 70    }.  sqlite3Exp
1ccd0 72 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70  rDelete(db, p->p
1cce0 4c 69 6d 69 74 29 3b 0a 20 20 70 2d 3e 70 4c 69  Limit);.  p->pLi
1ccf0 6d 69 74 20 3d 20 30 3b 0a 0a 20 20 72 65 67 41  mit = 0;..  regA
1cd00 64 64 72 41 20 3d 20 2b 2b 70 50 61 72 73 65 2d  ddrA = ++pParse-
1cd10 3e 6e 4d 65 6d 3b 0a 20 20 72 65 67 41 64 64 72  >nMem;.  regAddr
1cd20 42 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  B = ++pParse->nM
1cd30 65 6d 3b 0a 20 20 72 65 67 4f 75 74 41 20 3d 20  em;.  regOutA = 
1cd40 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
1cd50 20 20 72 65 67 4f 75 74 42 20 3d 20 2b 2b 70 50    regOutB = ++pP
1cd60 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 73 71  arse->nMem;.  sq
1cd70 6c 69 74 65 33 53 65 6c 65 63 74 44 65 73 74 49  lite3SelectDestI
1cd80 6e 69 74 28 26 64 65 73 74 41 2c 20 53 52 54 5f  nit(&destA, SRT_
1cd90 43 6f 72 6f 75 74 69 6e 65 2c 20 72 65 67 41 64  Coroutine, regAd
1cda0 64 72 41 29 3b 0a 20 20 73 71 6c 69 74 65 33 53  drA);.  sqlite3S
1cdb0 65 6c 65 63 74 44 65 73 74 49 6e 69 74 28 26 64  electDestInit(&d
1cdc0 65 73 74 42 2c 20 53 52 54 5f 43 6f 72 6f 75 74  estB, SRT_Corout
1cdd0 69 6e 65 2c 20 72 65 67 41 64 64 72 42 29 3b 0a  ine, regAddrB);.
1cde0 0a 20 20 45 78 70 6c 61 69 6e 51 75 65 72 79 50  .  ExplainQueryP
1cdf0 6c 61 6e 28 28 70 50 61 72 73 65 2c 20 31 2c 20  lan((pParse, 1, 
1ce00 22 4d 45 52 47 45 20 28 25 73 29 22 2c 20 73 65  "MERGE (%s)", se
1ce10 6c 65 63 74 4f 70 4e 61 6d 65 28 70 2d 3e 6f 70  lectOpName(p->op
1ce20 29 29 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72  )));..  /* Gener
1ce30 61 74 65 20 61 20 63 6f 72 6f 75 74 69 6e 65 20  ate a coroutine 
1ce40 74 6f 20 65 76 61 6c 75 61 74 65 20 74 68 65 20  to evaluate the 
1ce50 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
1ce60 20 74 6f 20 74 68 65 0a 20 20 2a 2a 20 6c 65 66   to the.  ** lef
1ce70 74 20 6f 66 20 74 68 65 20 63 6f 6d 70 6f 75 6e  t of the compoun
1ce80 64 20 6f 70 65 72 61 74 6f 72 20 2d 20 74 68 65  d operator - the
1ce90 20 22 41 22 20 73 65 6c 65 63 74 2e 0a 20 20 2a   "A" select..  *
1cea0 2f 0a 20 20 61 64 64 72 53 65 6c 65 63 74 41 20  /.  addrSelectA 
1ceb0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  = sqlite3VdbeCur
1cec0 72 65 6e 74 41 64 64 72 28 76 29 20 2b 20 31 3b  rentAddr(v) + 1;
1ced0 0a 20 20 61 64 64 72 31 20 3d 20 73 71 6c 69 74  .  addr1 = sqlit
1cee0 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
1cef0 4f 50 5f 49 6e 69 74 43 6f 72 6f 75 74 69 6e 65  OP_InitCoroutine
1cf00 2c 20 72 65 67 41 64 64 72 41 2c 20 30 2c 20 61  , regAddrA, 0, a
1cf10 64 64 72 53 65 6c 65 63 74 41 29 3b 0a 20 20 56  ddrSelectA);.  V
1cf20 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
1cf30 6c 65 66 74 20 53 45 4c 45 43 54 22 29 29 3b 0a  left SELECT"));.
1cf40 20 20 70 50 72 69 6f 72 2d 3e 69 4c 69 6d 69 74    pPrior->iLimit
1cf50 20 3d 20 72 65 67 4c 69 6d 69 74 41 3b 0a 20 20   = regLimitA;.  
1cf60 45 78 70 6c 61 69 6e 51 75 65 72 79 50 6c 61 6e  ExplainQueryPlan
1cf70 28 28 70 50 61 72 73 65 2c 20 31 2c 20 22 4c 45  ((pParse, 1, "LE
1cf80 46 54 22 29 29 3b 0a 20 20 73 71 6c 69 74 65 33  FT"));.  sqlite3
1cf90 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70  Select(pParse, p
1cfa0 50 72 69 6f 72 2c 20 26 64 65 73 74 41 29 3b 0a  Prior, &destA);.
1cfb0 20 20 73 71 6c 69 74 65 33 56 64 62 65 45 6e 64    sqlite3VdbeEnd
1cfc0 43 6f 72 6f 75 74 69 6e 65 28 76 2c 20 72 65 67  Coroutine(v, reg
1cfd0 41 64 64 72 41 29 3b 0a 20 20 73 71 6c 69 74 65  AddrA);.  sqlite
1cfe0 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
1cff0 20 61 64 64 72 31 29 3b 0a 0a 20 20 2f 2a 20 47   addr1);..  /* G
1d000 65 6e 65 72 61 74 65 20 61 20 63 6f 72 6f 75 74  enerate a corout
1d010 69 6e 65 20 74 6f 20 65 76 61 6c 75 61 74 65 20  ine to evaluate 
1d020 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65  the SELECT state
1d030 6d 65 6e 74 20 6f 6e 20 0a 20 20 2a 2a 20 74 68  ment on .  ** th
1d040 65 20 72 69 67 68 74 20 2d 20 74 68 65 20 22 42  e right - the "B
1d050 22 20 73 65 6c 65 63 74 0a 20 20 2a 2f 0a 20 20  " select.  */.  
1d060 61 64 64 72 53 65 6c 65 63 74 42 20 3d 20 73 71  addrSelectB = sq
1d070 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
1d080 41 64 64 72 28 76 29 20 2b 20 31 3b 0a 20 20 61  Addr(v) + 1;.  a
1d090 64 64 72 31 20 3d 20 73 71 6c 69 74 65 33 56 64  ddr1 = sqlite3Vd
1d0a0 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49  beAddOp3(v, OP_I
1d0b0 6e 69 74 43 6f 72 6f 75 74 69 6e 65 2c 20 72 65  nitCoroutine, re
1d0c0 67 41 64 64 72 42 2c 20 30 2c 20 61 64 64 72 53  gAddrB, 0, addrS
1d0d0 65 6c 65 63 74 42 29 3b 0a 20 20 56 64 62 65 43  electB);.  VdbeC
1d0e0 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 72 69 67 68  omment((v, "righ
1d0f0 74 20 53 45 4c 45 43 54 22 29 29 3b 0a 20 20 73  t SELECT"));.  s
1d100 61 76 65 64 4c 69 6d 69 74 20 3d 20 70 2d 3e 69  avedLimit = p->i
1d110 4c 69 6d 69 74 3b 0a 20 20 73 61 76 65 64 4f 66  Limit;.  savedOf
1d120 66 73 65 74 20 3d 20 70 2d 3e 69 4f 66 66 73 65  fset = p->iOffse
1d130 74 3b 0a 20 20 70 2d 3e 69 4c 69 6d 69 74 20 3d  t;.  p->iLimit =
1d140 20 72 65 67 4c 69 6d 69 74 42 3b 0a 20 20 70 2d   regLimitB;.  p-
1d150 3e 69 4f 66 66 73 65 74 20 3d 20 30 3b 20 20 0a  >iOffset = 0;  .
1d160 20 20 45 78 70 6c 61 69 6e 51 75 65 72 79 50 6c    ExplainQueryPl
1d170 61 6e 28 28 70 50 61 72 73 65 2c 20 31 2c 20 22  an((pParse, 1, "
1d180 52 49 47 48 54 22 29 29 3b 0a 20 20 73 71 6c 69  RIGHT"));.  sqli
1d190 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65  te3Select(pParse
1d1a0 2c 20 70 2c 20 26 64 65 73 74 42 29 3b 0a 20 20  , p, &destB);.  
1d1b0 70 2d 3e 69 4c 69 6d 69 74 20 3d 20 73 61 76 65  p->iLimit = save
1d1c0 64 4c 69 6d 69 74 3b 0a 20 20 70 2d 3e 69 4f 66  dLimit;.  p->iOf
1d1d0 66 73 65 74 20 3d 20 73 61 76 65 64 4f 66 66 73  fset = savedOffs
1d1e0 65 74 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  et;.  sqlite3Vdb
1d1f0 65 45 6e 64 43 6f 72 6f 75 74 69 6e 65 28 76 2c  eEndCoroutine(v,
1d200 20 72 65 67 41 64 64 72 42 29 3b 0a 0a 20 20 2f   regAddrB);..  /
1d210 2a 20 47 65 6e 65 72 61 74 65 20 61 20 73 75 62  * Generate a sub
1d220 72 6f 75 74 69 6e 65 20 74 68 61 74 20 6f 75 74  routine that out
1d230 70 75 74 73 20 74 68 65 20 63 75 72 72 65 6e 74  puts the current
1d240 20 72 6f 77 20 6f 66 20 74 68 65 20 41 0a 20 20   row of the A.  
1d250 2a 2a 20 73 65 6c 65 63 74 20 61 73 20 74 68 65  ** select as the
1d260 20 6e 65 78 74 20 6f 75 74 70 75 74 20 72 6f 77   next output row
1d270 20 6f 66 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64   of the compound
1d280 20 73 65 6c 65 63 74 2e 0a 20 20 2a 2f 0a 20 20   select..  */.  
1d290 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28  VdbeNoopComment(
1d2a0 28 76 2c 20 22 4f 75 74 70 75 74 20 72 6f 75 74  (v, "Output rout
1d2b0 69 6e 65 20 66 6f 72 20 41 22 29 29 3b 0a 20 20  ine for A"));.  
1d2c0 61 64 64 72 4f 75 74 41 20 3d 20 67 65 6e 65 72  addrOutA = gener
1d2d0 61 74 65 4f 75 74 70 75 74 53 75 62 72 6f 75 74  ateOutputSubrout
1d2e0 69 6e 65 28 70 50 61 72 73 65 2c 0a 20 20 20 20  ine(pParse,.    
1d2f0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 2c 20               p, 
1d300 26 64 65 73 74 41 2c 20 70 44 65 73 74 2c 20 72  &destA, pDest, r
1d310 65 67 4f 75 74 41 2c 0a 20 20 20 20 20 20 20 20  egOutA,.        
1d320 20 20 20 20 20 20 20 20 20 72 65 67 50 72 65 76           regPrev
1d330 2c 20 70 4b 65 79 44 75 70 2c 20 6c 61 62 65 6c  , pKeyDup, label
1d340 45 6e 64 29 3b 0a 20 20 0a 20 20 2f 2a 20 47 65  End);.  .  /* Ge
1d350 6e 65 72 61 74 65 20 61 20 73 75 62 72 6f 75 74  nerate a subrout
1d360 69 6e 65 20 74 68 61 74 20 6f 75 74 70 75 74 73  ine that outputs
1d370 20 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f 77   the current row
1d380 20 6f 66 20 74 68 65 20 42 0a 20 20 2a 2a 20 73   of the B.  ** s
1d390 65 6c 65 63 74 20 61 73 20 74 68 65 20 6e 65 78  elect as the nex
1d3a0 74 20 6f 75 74 70 75 74 20 72 6f 77 20 6f 66 20  t output row of 
1d3b0 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c  the compound sel
1d3c0 65 63 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ect..  */.  if( 
1d3d0 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 7c 7c 20 6f 70  op==TK_ALL || op
1d3e0 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29 7b 0a 20 20  ==TK_UNION ){.  
1d3f0 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e    VdbeNoopCommen
1d400 74 28 28 76 2c 20 22 4f 75 74 70 75 74 20 72 6f  t((v, "Output ro
1d410 75 74 69 6e 65 20 66 6f 72 20 42 22 29 29 3b 0a  utine for B"));.
1d420 20 20 20 20 61 64 64 72 4f 75 74 42 20 3d 20 67      addrOutB = g
1d430 65 6e 65 72 61 74 65 4f 75 74 70 75 74 53 75 62  enerateOutputSub
1d440 72 6f 75 74 69 6e 65 28 70 50 61 72 73 65 2c 0a  routine(pParse,.
1d450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d460 20 70 2c 20 26 64 65 73 74 42 2c 20 70 44 65 73   p, &destB, pDes
1d470 74 2c 20 72 65 67 4f 75 74 42 2c 0a 20 20 20 20  t, regOutB,.    
1d480 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65 67               reg
1d490 50 72 65 76 2c 20 70 4b 65 79 44 75 70 2c 20 6c  Prev, pKeyDup, l
1d4a0 61 62 65 6c 45 6e 64 29 3b 0a 20 20 7d 0a 20 20  abelEnd);.  }.  
1d4b0 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 55 6e  sqlite3KeyInfoUn
1d4c0 72 65 66 28 70 4b 65 79 44 75 70 29 3b 0a 0a 20  ref(pKeyDup);.. 
1d4d0 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20 73   /* Generate a s
1d4e0 75 62 72 6f 75 74 69 6e 65 20 74 6f 20 72 75 6e  ubroutine to run
1d4f0 20 77 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74   when the result
1d500 73 20 66 72 6f 6d 20 73 65 6c 65 63 74 20 41 0a  s from select A.
1d510 20 20 2a 2a 20 61 72 65 20 65 78 68 61 75 73 74    ** are exhaust
1d520 65 64 20 61 6e 64 20 6f 6e 6c 79 20 64 61 74 61  ed and only data
1d530 20 69 6e 20 73 65 6c 65 63 74 20 42 20 72 65 6d   in select B rem
1d540 61 69 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ains..  */.  if(
1d550 20 6f 70 3d 3d 54 4b 5f 45 58 43 45 50 54 20 7c   op==TK_EXCEPT |
1d560 7c 20 6f 70 3d 3d 54 4b 5f 49 4e 54 45 52 53 45  | op==TK_INTERSE
1d570 43 54 20 29 7b 0a 20 20 20 20 61 64 64 72 45 6f  CT ){.    addrEo
1d580 66 41 5f 6e 6f 42 20 3d 20 61 64 64 72 45 6f 66  fA_noB = addrEof
1d590 41 20 3d 20 6c 61 62 65 6c 45 6e 64 3b 0a 20 20  A = labelEnd;.  
1d5a0 7d 65 6c 73 65 7b 20 20 0a 20 20 20 20 56 64 62  }else{  .    Vdb
1d5b0 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c  eNoopComment((v,
1d5c0 20 22 65 6f 66 2d 41 20 73 75 62 72 6f 75 74 69   "eof-A subrouti
1d5d0 6e 65 22 29 29 3b 0a 20 20 20 20 61 64 64 72 45  ne"));.    addrE
1d5e0 6f 66 41 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ofA = sqlite3Vdb
1d5f0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f  eAddOp2(v, OP_Go
1d600 73 75 62 2c 20 72 65 67 4f 75 74 42 2c 20 61 64  sub, regOutB, ad
1d610 64 72 4f 75 74 42 29 3b 0a 20 20 20 20 61 64 64  drOutB);.    add
1d620 72 45 6f 66 41 5f 6e 6f 42 20 3d 20 73 71 6c 69  rEofA_noB = sqli
1d630 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
1d640 20 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67 41 64   OP_Yield, regAd
1d650 64 72 42 2c 20 6c 61 62 65 6c 45 6e 64 29 3b 0a  drB, labelEnd);.
1d660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d680 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
1d690 65 28 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  e(v);.    sqlite
1d6a0 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 61 64 64  3VdbeGoto(v, add
1d6b0 72 45 6f 66 41 29 3b 0a 20 20 20 20 70 2d 3e 6e  rEofA);.    p->n
1d6c0 53 65 6c 65 63 74 52 6f 77 20 3d 20 73 71 6c 69  SelectRow = sqli
1d6d0 74 65 33 4c 6f 67 45 73 74 41 64 64 28 70 2d 3e  te3LogEstAdd(p->
1d6e0 6e 53 65 6c 65 63 74 52 6f 77 2c 20 70 50 72 69  nSelectRow, pPri
1d6f0 6f 72 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 29 3b  or->nSelectRow);
1d700 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72  .  }..  /* Gener
1d710 61 74 65 20 61 20 73 75 62 72 6f 75 74 69 6e 65  ate a subroutine
1d720 20 74 6f 20 72 75 6e 20 77 68 65 6e 20 74 68 65   to run when the
1d730 20 72 65 73 75 6c 74 73 20 66 72 6f 6d 20 73 65   results from se
1d740 6c 65 63 74 20 42 0a 20 20 2a 2a 20 61 72 65 20  lect B.  ** are 
1d750 65 78 68 61 75 73 74 65 64 20 61 6e 64 20 6f 6e  exhausted and on
1d760 6c 79 20 64 61 74 61 20 69 6e 20 73 65 6c 65 63  ly data in selec
1d770 74 20 41 20 72 65 6d 61 69 6e 73 2e 0a 20 20 2a  t A remains..  *
1d780 2f 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 49  /.  if( op==TK_I
1d790 4e 54 45 52 53 45 43 54 20 29 7b 0a 20 20 20 20  NTERSECT ){.    
1d7a0 61 64 64 72 45 6f 66 42 20 3d 20 61 64 64 72 45  addrEofB = addrE
1d7b0 6f 66 41 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e  ofA;.    if( p->
1d7c0 6e 53 65 6c 65 63 74 52 6f 77 20 3e 20 70 50 72  nSelectRow > pPr
1d7d0 69 6f 72 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20  ior->nSelectRow 
1d7e0 29 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20  ) p->nSelectRow 
1d7f0 3d 20 70 50 72 69 6f 72 2d 3e 6e 53 65 6c 65 63  = pPrior->nSelec
1d800 74 52 6f 77 3b 0a 20 20 7d 65 6c 73 65 7b 20 20  tRow;.  }else{  
1d810 0a 20 20 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d  .    VdbeNoopCom
1d820 6d 65 6e 74 28 28 76 2c 20 22 65 6f 66 2d 42 20  ment((v, "eof-B 
1d830 73 75 62 72 6f 75 74 69 6e 65 22 29 29 3b 0a 20  subroutine"));. 
1d840 20 20 20 61 64 64 72 45 6f 66 42 20 3d 20 73 71     addrEofB = sq
1d850 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
1d860 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67  v, OP_Gosub, reg
1d870 4f 75 74 41 2c 20 61 64 64 72 4f 75 74 41 29 3b  OutA, addrOutA);
1d880 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
1d890 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 59 69 65  AddOp2(v, OP_Yie
1d8a0 6c 64 2c 20 72 65 67 41 64 64 72 41 2c 20 6c 61  ld, regAddrA, la
1d8b0 62 65 6c 45 6e 64 29 3b 20 56 64 62 65 43 6f 76  belEnd); VdbeCov
1d8c0 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 73 71  erage(v);.    sq
1d8d0 6c 69 74 65 33 56 64 62 65 47 6f 74 6f 28 76 2c  lite3VdbeGoto(v,
1d8e0 20 61 64 64 72 45 6f 66 42 29 3b 0a 20 20 7d 0a   addrEofB);.  }.
1d8f0 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63  .  /* Generate c
1d900 6f 64 65 20 74 6f 20 68 61 6e 64 6c 65 20 74 68  ode to handle th
1d910 65 20 63 61 73 65 20 6f 66 20 41 3c 42 0a 20 20  e case of A<B.  
1d920 2a 2f 0a 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d  */.  VdbeNoopCom
1d930 6d 65 6e 74 28 28 76 2c 20 22 41 2d 6c 74 2d 42  ment((v, "A-lt-B
1d940 20 73 75 62 72 6f 75 74 69 6e 65 22 29 29 3b 0a   subroutine"));.
1d950 20 20 61 64 64 72 41 6c 74 42 20 3d 20 73 71 6c    addrAltB = sql
1d960 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
1d970 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 4f  , OP_Gosub, regO
1d980 75 74 41 2c 20 61 64 64 72 4f 75 74 41 29 3b 0a  utA, addrOutA);.
1d990 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1d9a0 4f 70 32 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c  Op2(v, OP_Yield,
1d9b0 20 72 65 67 41 64 64 72 41 2c 20 61 64 64 72 45   regAddrA, addrE
1d9c0 6f 66 41 29 3b 20 56 64 62 65 43 6f 76 65 72 61  ofA); VdbeCovera
1d9d0 67 65 28 76 29 3b 0a 20 20 73 71 6c 69 74 65 33  ge(v);.  sqlite3
1d9e0 56 64 62 65 47 6f 74 6f 28 76 2c 20 6c 61 62 65  VdbeGoto(v, labe
1d9f0 6c 43 6d 70 72 29 3b 0a 0a 20 20 2f 2a 20 47 65  lCmpr);..  /* Ge
1da00 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 68  nerate code to h
1da10 61 6e 64 6c 65 20 74 68 65 20 63 61 73 65 20 6f  andle the case o
1da20 66 20 41 3d 3d 42 0a 20 20 2a 2f 0a 20 20 69 66  f A==B.  */.  if
1da30 28 20 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 29 7b 0a  ( op==TK_ALL ){.
1da40 20 20 20 20 61 64 64 72 41 65 71 42 20 3d 20 61      addrAeqB = a
1da50 64 64 72 41 6c 74 42 3b 0a 20 20 7d 65 6c 73 65  ddrAltB;.  }else
1da60 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 49 4e 54 45   if( op==TK_INTE
1da70 52 53 45 43 54 20 29 7b 0a 20 20 20 20 61 64 64  RSECT ){.    add
1da80 72 41 65 71 42 20 3d 20 61 64 64 72 41 6c 74 42  rAeqB = addrAltB
1da90 3b 0a 20 20 20 20 61 64 64 72 41 6c 74 42 2b 2b  ;.    addrAltB++
1daa0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 56  ;.  }else{.    V
1dab0 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28  dbeNoopComment((
1dac0 76 2c 20 22 41 2d 65 71 2d 42 20 73 75 62 72 6f  v, "A-eq-B subro
1dad0 75 74 69 6e 65 22 29 29 3b 0a 20 20 20 20 61 64  utine"));.    ad
1dae0 64 72 41 65 71 42 20 3d 0a 20 20 20 20 73 71 6c  drAeqB =.    sql
1daf0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
1db00 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67 41  , OP_Yield, regA
1db10 64 64 72 41 2c 20 61 64 64 72 45 6f 66 41 29 3b  ddrA, addrEofA);
1db20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
1db30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
1db40 65 47 6f 74 6f 28 76 2c 20 6c 61 62 65 6c 43 6d  eGoto(v, labelCm
1db50 70 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47  pr);.  }..  /* G
1db60 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20  enerate code to 
1db70 68 61 6e 64 6c 65 20 74 68 65 20 63 61 73 65 20  handle the case 
1db80 6f 66 20 41 3e 42 0a 20 20 2a 2f 0a 20 20 56 64  of A>B.  */.  Vd
1db90 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76  beNoopComment((v
1dba0 2c 20 22 41 2d 67 74 2d 42 20 73 75 62 72 6f 75  , "A-gt-B subrou
1dbb0 74 69 6e 65 22 29 29 3b 0a 20 20 61 64 64 72 41  tine"));.  addrA
1dbc0 67 74 42 20 3d 20 73 71 6c 69 74 65 33 56 64 62  gtB = sqlite3Vdb
1dbd0 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b  eCurrentAddr(v);
1dbe0 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 41 4c  .  if( op==TK_AL
1dbf0 4c 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 55 4e 49 4f  L || op==TK_UNIO
1dc00 4e 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  N ){.    sqlite3
1dc10 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
1dc20 5f 47 6f 73 75 62 2c 20 72 65 67 4f 75 74 42 2c  _Gosub, regOutB,
1dc30 20 61 64 64 72 4f 75 74 42 29 3b 0a 20 20 7d 0a   addrOutB);.  }.
1dc40 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1dc50 4f 70 32 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c  Op2(v, OP_Yield,
1dc60 20 72 65 67 41 64 64 72 42 2c 20 61 64 64 72 45   regAddrB, addrE
1dc70 6f 66 42 29 3b 20 56 64 62 65 43 6f 76 65 72 61  ofB); VdbeCovera
1dc80 67 65 28 76 29 3b 0a 20 20 73 71 6c 69 74 65 33  ge(v);.  sqlite3
1dc90 56 64 62 65 47 6f 74 6f 28 76 2c 20 6c 61 62 65  VdbeGoto(v, labe
1dca0 6c 43 6d 70 72 29 3b 0a 0a 20 20 2f 2a 20 54 68  lCmpr);..  /* Th
1dcb0 69 73 20 63 6f 64 65 20 72 75 6e 73 20 6f 6e 63  is code runs onc
1dcc0 65 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20  e to initialize 
1dcd0 65 76 65 72 79 74 68 69 6e 67 2e 0a 20 20 2a 2f  everything..  */
1dce0 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75  .  sqlite3VdbeJu
1dcf0 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 31 29  mpHere(v, addr1)
1dd00 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
1dd10 64 64 4f 70 32 28 76 2c 20 4f 50 5f 59 69 65 6c  ddOp2(v, OP_Yiel
1dd20 64 2c 20 72 65 67 41 64 64 72 41 2c 20 61 64 64  d, regAddrA, add
1dd30 72 45 6f 66 41 5f 6e 6f 42 29 3b 20 56 64 62 65  rEofA_noB); Vdbe
1dd40 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 73  Coverage(v);.  s
1dd50 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
1dd60 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 72 65  (v, OP_Yield, re
1dd70 67 41 64 64 72 42 2c 20 61 64 64 72 45 6f 66 42  gAddrB, addrEofB
1dd80 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
1dd90 76 29 3b 0a 0a 20 20 2f 2a 20 49 6d 70 6c 65 6d  v);..  /* Implem
1dda0 65 6e 74 20 74 68 65 20 6d 61 69 6e 20 6d 65 72  ent the main mer
1ddb0 67 65 20 6c 6f 6f 70 0a 20 20 2a 2f 0a 20 20 73  ge loop.  */.  s
1ddc0 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
1ddd0 65 4c 61 62 65 6c 28 76 2c 20 6c 61 62 65 6c 43  eLabel(v, labelC
1dde0 6d 70 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  mpr);.  sqlite3V
1ddf0 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
1de00 50 65 72 6d 75 74 61 74 69 6f 6e 2c 20 30 2c 20  Permutation, 0, 
1de10 30 2c 20 30 2c 20 28 63 68 61 72 2a 29 61 50 65  0, 0, (char*)aPe
1de20 72 6d 75 74 65 2c 20 50 34 5f 49 4e 54 41 52 52  rmute, P4_INTARR
1de30 41 59 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  AY);.  sqlite3Vd
1de40 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 43  beAddOp4(v, OP_C
1de50 6f 6d 70 61 72 65 2c 20 64 65 73 74 41 2e 69 53  ompare, destA.iS
1de60 64 73 74 2c 20 64 65 73 74 42 2e 69 53 64 73 74  dst, destB.iSdst
1de70 2c 20 6e 4f 72 64 65 72 42 79 2c 0a 20 20 20 20  , nOrderBy,.    
1de80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1de90 20 20 20 20 20 28 63 68 61 72 2a 29 70 4b 65 79       (char*)pKey
1dea0 4d 65 72 67 65 2c 20 50 34 5f 4b 45 59 49 4e 46  Merge, P4_KEYINF
1deb0 4f 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  O);.  sqlite3Vdb
1dec0 65 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46  eChangeP5(v, OPF
1ded0 4c 41 47 5f 50 45 52 4d 55 54 45 29 3b 0a 20 20  LAG_PERMUTE);.  
1dee0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1def0 33 28 76 2c 20 4f 50 5f 4a 75 6d 70 2c 20 61 64  3(v, OP_Jump, ad
1df00 64 72 41 6c 74 42 2c 20 61 64 64 72 41 65 71 42  drAltB, addrAeqB
1df10 2c 20 61 64 64 72 41 67 74 42 29 3b 20 56 64 62  , addrAgtB); Vdb
1df20 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 0a 20  eCoverage(v);.. 
1df30 20 2f 2a 20 4a 75 6d 70 20 74 6f 20 74 68 65 20   /* Jump to the 
1df40 74 68 69 73 20 70 6f 69 6e 74 20 69 6e 20 6f 72  this point in or
1df50 64 65 72 20 74 6f 20 74 65 72 6d 69 6e 61 74 65  der to terminate
1df60 20 74 68 65 20 71 75 65 72 79 2e 0a 20 20 2a 2f   the query..  */
1df70 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65  .  sqlite3VdbeRe
1df80 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 6c 61  solveLabel(v, la
1df90 62 65 6c 45 6e 64 29 3b 0a 0a 20 20 2f 2a 20 52  belEnd);..  /* R
1dfa0 65 61 73 73 65 6d 62 6c 79 20 74 68 65 20 63 6f  eassembly the co
1dfb0 6d 70 6f 75 6e 64 20 71 75 65 72 79 20 73 6f 20  mpound query so 
1dfc0 74 68 61 74 20 69 74 20 77 69 6c 6c 20 62 65 20  that it will be 
1dfd0 66 72 65 65 64 20 63 6f 72 72 65 63 74 6c 79 0a  freed correctly.
1dfe0 20 20 2a 2a 20 62 79 20 74 68 65 20 63 61 6c 6c    ** by the call
1dff0 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a  ing function */.
1e000 20 20 69 66 28 20 70 2d 3e 70 50 72 69 6f 72 20    if( p->pPrior 
1e010 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65  ){.    sqlite3Se
1e020 6c 65 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70  lectDelete(db, p
1e030 2d 3e 70 50 72 69 6f 72 29 3b 0a 20 20 7d 0a 20  ->pPrior);.  }. 
1e040 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50 72   p->pPrior = pPr
1e050 69 6f 72 3b 0a 20 20 70 50 72 69 6f 72 2d 3e 70  ior;.  pPrior->p
1e060 4e 65 78 74 20 3d 20 70 3b 0a 0a 20 20 2f 2a 2a  Next = p;..  /**
1e070 2a 20 54 42 44 3a 20 20 49 6e 73 65 72 74 20 73  * TBD:  Insert s
1e080 75 62 72 6f 75 74 69 6e 65 20 63 61 6c 6c 73 20  ubroutine calls 
1e090 74 6f 20 63 6c 6f 73 65 20 63 75 72 73 6f 72 73  to close cursors
1e0a0 20 6f 6e 20 69 6e 63 6f 6d 70 6c 65 74 65 0a 20   on incomplete. 
1e0b0 20 2a 2a 2a 2a 20 73 75 62 71 75 65 72 69 65 73   **** subqueries
1e0c0 20 2a 2a 2a 2a 2f 0a 20 20 45 78 70 6c 61 69 6e   ****/.  Explain
1e0d0 51 75 65 72 79 50 6c 61 6e 50 6f 70 28 70 50 61  QueryPlanPop(pPa
1e0e0 72 73 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  rse);.  return p
1e0f0 50 61 72 73 65 2d 3e 6e 45 72 72 21 3d 30 3b 0a  Parse->nErr!=0;.
1e100 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 21 64  }.#endif..#if !d
1e110 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
1e120 49 54 5f 53 55 42 51 55 45 52 59 29 20 7c 7c 20  IT_SUBQUERY) || 
1e130 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
1e140 4f 4d 49 54 5f 56 49 45 57 29 0a 0a 2f 2a 20 41  OMIT_VIEW)../* A
1e150 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68  n instance of th
1e160 65 20 53 75 62 73 74 43 6f 6e 74 65 78 74 20 6f  e SubstContext o
1e170 62 6a 65 63 74 20 64 65 73 63 72 69 62 65 73 20  bject describes 
1e180 61 6e 20 73 75 62 73 74 69 74 75 74 69 6f 6e 20  an substitution 
1e190 65 64 69 74 0a 2a 2a 20 74 6f 20 62 65 20 70 65  edit.** to be pe
1e1a0 72 66 6f 72 6d 65 64 20 6f 6e 20 61 20 70 61 72  rformed on a par
1e1b0 73 65 20 74 72 65 65 2e 0a 2a 2a 0a 2a 2a 20 41  se tree..**.** A
1e1c0 6c 6c 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f  ll references to
1e1d0 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 61 62 6c   columns in tabl
1e1e0 65 20 69 54 61 62 6c 65 20 61 72 65 20 74 6f 20  e iTable are to 
1e1f0 62 65 20 72 65 70 6c 61 63 65 64 20 62 79 20 63  be replaced by c
1e200 6f 72 72 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20  orresponding.** 
1e210 65 78 70 72 65 73 73 69 6f 6e 73 20 69 6e 20 70  expressions in p
1e220 45 4c 69 73 74 2e 0a 2a 2f 0a 74 79 70 65 64 65  EList..*/.typede
1e230 66 20 73 74 72 75 63 74 20 53 75 62 73 74 43 6f  f struct SubstCo
1e240 6e 74 65 78 74 20 7b 0a 20 20 50 61 72 73 65 20  ntext {.  Parse 
1e250 2a 70 50 61 72 73 65 3b 20 20 20 20 20 20 20 20  *pParse;        
1e260 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 69      /* The parsi
1e270 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
1e280 69 6e 74 20 69 54 61 62 6c 65 3b 20 20 20 20 20  int iTable;     
1e290 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 70            /* Rep
1e2a0 6c 61 63 65 20 72 65 66 65 72 65 6e 63 65 73 20  lace references 
1e2b0 74 6f 20 74 68 69 73 20 74 61 62 6c 65 20 2a 2f  to this table */
1e2c0 0a 20 20 69 6e 74 20 69 4e 65 77 54 61 62 6c 65  .  int iNewTable
1e2d0 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
1e2e0 4e 65 77 20 74 61 62 6c 65 20 6e 75 6d 62 65 72  New table number
1e2f0 20 2a 2f 0a 20 20 69 6e 74 20 69 73 4c 65 66 74   */.  int isLeft
1e300 4a 6f 69 6e 3b 20 20 20 20 20 20 20 20 20 20 20  Join;           
1e310 2f 2a 20 41 64 64 20 54 4b 5f 49 46 5f 4e 55 4c  /* Add TK_IF_NUL
1e320 4c 5f 52 4f 57 20 6f 70 63 6f 64 65 73 20 6f 6e  L_ROW opcodes on
1e330 20 65 61 63 68 20 72 65 70 6c 61 63 65 6d 65 6e   each replacemen
1e340 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  t */.  ExprList 
1e350 2a 70 45 4c 69 73 74 3b 20 20 20 20 20 20 20 20  *pEList;        
1e360 20 2f 2a 20 52 65 70 6c 61 63 65 6d 65 6e 74 20   /* Replacement 
1e370 65 78 70 72 65 73 73 69 6f 6e 73 20 2a 2f 0a 7d  expressions */.}
1e380 20 53 75 62 73 74 43 6f 6e 74 65 78 74 3b 0a 0a   SubstContext;..
1e390 2f 2a 20 46 6f 72 77 61 72 64 20 44 65 63 6c 61  /* Forward Decla
1e3a0 72 61 74 69 6f 6e 73 20 2a 2f 0a 73 74 61 74 69  rations */.stati
1e3b0 63 20 76 6f 69 64 20 73 75 62 73 74 45 78 70 72  c void substExpr
1e3c0 4c 69 73 74 28 53 75 62 73 74 43 6f 6e 74 65 78  List(SubstContex
1e3d0 74 2a 2c 20 45 78 70 72 4c 69 73 74 2a 29 3b 0a  t*, ExprList*);.
1e3e0 73 74 61 74 69 63 20 76 6f 69 64 20 73 75 62 73  static void subs
1e3f0 74 53 65 6c 65 63 74 28 53 75 62 73 74 43 6f 6e  tSelect(SubstCon
1e400 74 65 78 74 2a 2c 20 53 65 6c 65 63 74 2a 2c 20  text*, Select*, 
1e410 69 6e 74 29 3b 0a 0a 2f 2a 0a 2a 2a 20 53 63 61  int);../*.** Sca
1e420 6e 20 74 68 72 6f 75 67 68 20 74 68 65 20 65 78  n through the ex
1e430 70 72 65 73 73 69 6f 6e 20 70 45 78 70 72 2e 20  pression pExpr. 
1e440 20 52 65 70 6c 61 63 65 20 65 76 65 72 79 20 72   Replace every r
1e450 65 66 65 72 65 6e 63 65 20 74 6f 0a 2a 2a 20 61  eference to.** a
1e460 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 61 62 6c 65   column in table
1e470 20 6e 75 6d 62 65 72 20 69 54 61 62 6c 65 20 77   number iTable w
1e480 69 74 68 20 61 20 63 6f 70 79 20 6f 66 20 74 68  ith a copy of th
1e490 65 20 69 43 6f 6c 75 6d 6e 2d 74 68 0a 2a 2a 20  e iColumn-th.** 
1e4a0 65 6e 74 72 79 20 69 6e 20 70 45 4c 69 73 74 2e  entry in pEList.
1e4b0 20 20 28 42 75 74 20 6c 65 61 76 65 20 72 65 66    (But leave ref
1e4c0 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20 52  erences to the R
1e4d0 4f 57 49 44 20 63 6f 6c 75 6d 6e 20 0a 2a 2a 20  OWID column .** 
1e4e0 75 6e 63 68 61 6e 67 65 64 2e 29 0a 2a 2a 0a 2a  unchanged.).**.*
1e4f0 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
1e500 73 20 70 61 72 74 20 6f 66 20 74 68 65 20 66 6c  s part of the fl
1e510 61 74 74 65 6e 69 6e 67 20 70 72 6f 63 65 64 75  attening procedu
1e520 72 65 2e 20 20 41 20 73 75 62 71 75 65 72 79 0a  re.  A subquery.
1e530 2a 2a 20 77 68 6f 73 65 20 72 65 73 75 6c 74 20  ** whose result 
1e540 73 65 74 20 69 73 20 64 65 66 69 6e 65 64 20 62  set is defined b
1e550 79 20 70 45 4c 69 73 74 20 61 70 70 65 61 72 73  y pEList appears
1e560 20 61 73 20 65 6e 74 72 79 20 69 6e 20 74 68 65   as entry in the
1e570 0a 2a 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  .** FROM clause 
1e580 6f 66 20 61 20 53 45 4c 45 43 54 20 73 75 63 68  of a SELECT such
1e590 20 74 68 61 74 20 74 68 65 20 56 44 42 45 20 63   that the VDBE c
1e5a0 75 72 73 6f 72 20 61 73 73 69 67 6e 65 64 20 74  ursor assigned t
1e5b0 6f 20 74 68 61 74 0a 2a 2a 20 46 4f 52 4d 20 63  o that.** FORM c
1e5c0 6c 61 75 73 65 20 65 6e 74 72 79 20 69 73 20 69  lause entry is i
1e5d0 54 61 62 6c 65 2e 20 20 54 68 69 73 20 72 6f 75  Table.  This rou
1e5e0 74 69 6e 65 20 6d 61 6b 65 73 20 74 68 65 20 6e  tine makes the n
1e5f0 65 63 65 73 73 61 72 79 20 0a 2a 2a 20 63 68 61  ecessary .** cha
1e600 6e 67 65 73 20 74 6f 20 70 45 78 70 72 20 73 6f  nges to pExpr so
1e610 20 74 68 61 74 20 69 74 20 72 65 66 65 72 73 20   that it refers 
1e620 64 69 72 65 63 74 6c 79 20 74 6f 20 74 68 65 20  directly to the 
1e630 73 6f 75 72 63 65 20 74 61 62 6c 65 0a 2a 2a 20  source table.** 
1e640 6f 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20  of the subquery 
1e650 72 61 74 68 65 72 20 74 68 65 20 72 65 73 75 6c  rather the resul
1e660 74 20 73 65 74 20 6f 66 20 74 68 65 20 73 75 62  t set of the sub
1e670 71 75 65 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63  query..*/.static
1e680 20 45 78 70 72 20 2a 73 75 62 73 74 45 78 70 72   Expr *substExpr
1e690 28 0a 20 20 53 75 62 73 74 43 6f 6e 74 65 78 74  (.  SubstContext
1e6a0 20 2a 70 53 75 62 73 74 2c 20 20 2f 2a 20 44 65   *pSubst,  /* De
1e6b0 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 74 68 65  scription of the
1e6c0 20 73 75 62 73 74 69 74 75 74 69 6f 6e 20 2a 2f   substitution */
1e6d0 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 20  .  Expr *pExpr  
1e6e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 70            /* Exp
1e6f0 72 20 69 6e 20 77 68 69 63 68 20 73 75 62 73 74  r in which subst
1e700 69 74 75 74 69 6f 6e 20 6f 63 63 75 72 73 20 2a  itution occurs *
1e710 2f 0a 29 7b 0a 20 20 69 66 28 20 70 45 78 70 72  /.){.  if( pExpr
1e720 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
1e730 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f    if( ExprHasPro
1e740 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
1e750 46 72 6f 6d 4a 6f 69 6e 29 0a 20 20 20 26 26 20  FromJoin).   && 
1e760 70 45 78 70 72 2d 3e 69 52 69 67 68 74 4a 6f 69  pExpr->iRightJoi
1e770 6e 54 61 62 6c 65 3d 3d 70 53 75 62 73 74 2d 3e  nTable==pSubst->
1e780 69 54 61 62 6c 65 0a 20 20 29 7b 0a 20 20 20 20  iTable.  ){.    
1e790 70 45 78 70 72 2d 3e 69 52 69 67 68 74 4a 6f 69  pExpr->iRightJoi
1e7a0 6e 54 61 62 6c 65 20 3d 20 70 53 75 62 73 74 2d  nTable = pSubst-
1e7b0 3e 69 4e 65 77 54 61 62 6c 65 3b 0a 20 20 7d 0a  >iNewTable;.  }.
1e7c0 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d    if( pExpr->op=
1e7d0 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20 70 45  =TK_COLUMN && pE
1e7e0 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 70 53 75  xpr->iTable==pSu
1e7f0 62 73 74 2d 3e 69 54 61 62 6c 65 20 29 7b 0a 20  bst->iTable ){. 
1e800 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 69 43     if( pExpr->iC
1e810 6f 6c 75 6d 6e 3c 30 20 29 7b 0a 20 20 20 20 20  olumn<0 ){.     
1e820 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f   pExpr->op = TK_
1e830 4e 55 4c 4c 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  NULL;.    }else{
1e840 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 4e 65  .      Expr *pNe
1e850 77 3b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70  w;.      Expr *p
1e860 43 6f 70 79 20 3d 20 70 53 75 62 73 74 2d 3e 70  Copy = pSubst->p
1e870 45 4c 69 73 74 2d 3e 61 5b 70 45 78 70 72 2d 3e  EList->a[pExpr->
1e880 69 43 6f 6c 75 6d 6e 5d 2e 70 45 78 70 72 3b 0a  iColumn].pExpr;.
1e890 20 20 20 20 20 20 45 78 70 72 20 69 66 4e 75 6c        Expr ifNul
1e8a0 6c 52 6f 77 3b 0a 20 20 20 20 20 20 61 73 73 65  lRow;.      asse
1e8b0 72 74 28 20 70 53 75 62 73 74 2d 3e 70 45 4c 69  rt( pSubst->pELi
1e8c0 73 74 21 3d 30 20 26 26 20 70 45 78 70 72 2d 3e  st!=0 && pExpr->
1e8d0 69 43 6f 6c 75 6d 6e 3c 70 53 75 62 73 74 2d 3e  iColumn<pSubst->
1e8e0 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 3b  pEList->nExpr );
1e8f0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
1e900 45 78 70 72 2d 3e 70 52 69 67 68 74 3d 3d 30 20  Expr->pRight==0 
1e910 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c  );.      if( sql
1e920 69 74 65 33 45 78 70 72 49 73 56 65 63 74 6f 72  ite3ExprIsVector
1e930 28 70 43 6f 70 79 29 20 29 7b 0a 20 20 20 20 20  (pCopy) ){.     
1e940 20 20 20 73 71 6c 69 74 65 33 56 65 63 74 6f 72     sqlite3Vector
1e950 45 72 72 6f 72 4d 73 67 28 70 53 75 62 73 74 2d  ErrorMsg(pSubst-
1e960 3e 70 50 61 72 73 65 2c 20 70 43 6f 70 79 29 3b  >pParse, pCopy);
1e970 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
1e980 20 20 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64        sqlite3 *d
1e990 62 20 3d 20 70 53 75 62 73 74 2d 3e 70 50 61 72  b = pSubst->pPar
1e9a0 73 65 2d 3e 64 62 3b 0a 20 20 20 20 20 20 20 20  se->db;.        
1e9b0 69 66 28 20 70 53 75 62 73 74 2d 3e 69 73 4c 65  if( pSubst->isLe
1e9c0 66 74 4a 6f 69 6e 20 26 26 20 70 43 6f 70 79 2d  ftJoin && pCopy-
1e9d0 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29  >op!=TK_COLUMN )
1e9e0 7b 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 73  {.          mems
1e9f0 65 74 28 26 69 66 4e 75 6c 6c 52 6f 77 2c 20 30  et(&ifNullRow, 0
1ea00 2c 20 73 69 7a 65 6f 66 28 69 66 4e 75 6c 6c 52  , sizeof(ifNullR
1ea10 6f 77 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ow));.          
1ea20 69 66 4e 75 6c 6c 52 6f 77 2e 6f 70 20 3d 20 54  ifNullRow.op = T
1ea30 4b 5f 49 46 5f 4e 55 4c 4c 5f 52 4f 57 3b 0a 20  K_IF_NULL_ROW;. 
1ea40 20 20 20 20 20 20 20 20 20 69 66 4e 75 6c 6c 52           ifNullR
1ea50 6f 77 2e 70 4c 65 66 74 20 3d 20 70 43 6f 70 79  ow.pLeft = pCopy
1ea60 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 4e 75  ;.          ifNu
1ea70 6c 6c 52 6f 77 2e 69 54 61 62 6c 65 20 3d 20 70  llRow.iTable = p
1ea80 53 75 62 73 74 2d 3e 69 4e 65 77 54 61 62 6c 65  Subst->iNewTable
1ea90 3b 0a 20 20 20 20 20 20 20 20 20 20 70 43 6f 70  ;.          pCop
1eaa0 79 20 3d 20 26 69 66 4e 75 6c 6c 52 6f 77 3b 0a  y = &ifNullRow;.
1eab0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1eac0 20 20 74 65 73 74 63 61 73 65 28 20 45 78 70 72    testcase( Expr
1ead0 48 61 73 50 72 6f 70 65 72 74 79 28 70 43 6f 70  HasProperty(pCop
1eae0 79 2c 20 45 50 5f 53 75 62 71 75 65 72 79 29 20  y, EP_Subquery) 
1eaf0 29 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 20  );.        pNew 
1eb00 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70  = sqlite3ExprDup
1eb10 28 64 62 2c 20 70 43 6f 70 79 2c 20 30 29 3b 0a  (db, pCopy, 0);.
1eb20 20 20 20 20 20 20 20 20 69 66 28 20 70 4e 65 77          if( pNew
1eb30 20 26 26 20 70 53 75 62 73 74 2d 3e 69 73 4c 65   && pSubst->isLe
1eb40 66 74 4a 6f 69 6e 20 29 7b 0a 20 20 20 20 20 20  ftJoin ){.      
1eb50 20 20 20 20 45 78 70 72 53 65 74 50 72 6f 70 65      ExprSetPrope
1eb60 72 74 79 28 70 4e 65 77 2c 20 45 50 5f 43 61 6e  rty(pNew, EP_Can
1eb70 42 65 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 20  BeNull);.       
1eb80 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 70   }.        if( p
1eb90 4e 65 77 20 26 26 20 45 78 70 72 48 61 73 50 72  New && ExprHasPr
1eba0 6f 70 65 72 74 79 28 70 45 78 70 72 2c 45 50 5f  operty(pExpr,EP_
1ebb0 46 72 6f 6d 4a 6f 69 6e 29 20 29 7b 0a 20 20 20  FromJoin) ){.   
1ebc0 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 69 52 69         pNew->iRi
1ebd0 67 68 74 4a 6f 69 6e 54 61 62 6c 65 20 3d 20 70  ghtJoinTable = p
1ebe0 45 78 70 72 2d 3e 69 52 69 67 68 74 4a 6f 69 6e  Expr->iRightJoin
1ebf0 54 61 62 6c 65 3b 0a 20 20 20 20 20 20 20 20 20  Table;.         
1ec00 20 45 78 70 72 53 65 74 50 72 6f 70 65 72 74 79   ExprSetProperty
1ec10 28 70 4e 65 77 2c 20 45 50 5f 46 72 6f 6d 4a 6f  (pNew, EP_FromJo
1ec20 69 6e 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  in);.        }. 
1ec30 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
1ec40 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 45 78  prDelete(db, pEx
1ec50 70 72 29 3b 0a 20 20 20 20 20 20 20 20 70 45 78  pr);.        pEx
1ec60 70 72 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 20  pr = pNew;.     
1ec70 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65   }.    }.  }else
1ec80 7b 0a 20 20 20 20 69 66 28 20 70 45 78 70 72 2d  {.    if( pExpr-
1ec90 3e 6f 70 3d 3d 54 4b 5f 49 46 5f 4e 55 4c 4c 5f  >op==TK_IF_NULL_
1eca0 52 4f 57 20 26 26 20 70 45 78 70 72 2d 3e 69 54  ROW && pExpr->iT
1ecb0 61 62 6c 65 3d 3d 70 53 75 62 73 74 2d 3e 69 54  able==pSubst->iT
1ecc0 61 62 6c 65 20 29 7b 0a 20 20 20 20 20 20 70 45  able ){.      pE
1ecd0 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20 70 53  xpr->iTable = pS
1ece0 75 62 73 74 2d 3e 69 4e 65 77 54 61 62 6c 65 3b  ubst->iNewTable;
1ecf0 0a 20 20 20 20 7d 0a 20 20 20 20 70 45 78 70 72  .    }.    pExpr
1ed00 2d 3e 70 4c 65 66 74 20 3d 20 73 75 62 73 74 45  ->pLeft = substE
1ed10 78 70 72 28 70 53 75 62 73 74 2c 20 70 45 78 70  xpr(pSubst, pExp
1ed20 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 70  r->pLeft);.    p
1ed30 45 78 70 72 2d 3e 70 52 69 67 68 74 20 3d 20 73  Expr->pRight = s
1ed40 75 62 73 74 45 78 70 72 28 70 53 75 62 73 74 2c  ubstExpr(pSubst,
1ed50 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 29 3b   pExpr->pRight);
1ed60 0a 20 20 20 20 69 66 28 20 45 78 70 72 48 61 73  .    if( ExprHas
1ed70 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
1ed80 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 7b  EP_xIsSelect) ){
1ed90 0a 20 20 20 20 20 20 73 75 62 73 74 53 65 6c 65  .      substSele
1eda0 63 74 28 70 53 75 62 73 74 2c 20 70 45 78 70 72  ct(pSubst, pExpr
1edb0 2d 3e 78 2e 70 53 65 6c 65 63 74 2c 20 31 29 3b  ->x.pSelect, 1);
1edc0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1edd0 20 20 73 75 62 73 74 45 78 70 72 4c 69 73 74 28    substExprList(
1ede0 70 53 75 62 73 74 2c 20 70 45 78 70 72 2d 3e 78  pSubst, pExpr->x
1edf0 2e 70 4c 69 73 74 29 3b 0a 20 20 20 20 7d 0a 20  .pList);.    }. 
1ee00 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 45 78 70   }.  return pExp
1ee10 72 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64  r;.}.static void
1ee20 20 73 75 62 73 74 45 78 70 72 4c 69 73 74 28 0a   substExprList(.
1ee30 20 20 53 75 62 73 74 43 6f 6e 74 65 78 74 20 2a    SubstContext *
1ee40 70 53 75 62 73 74 2c 20 2f 2a 20 44 65 73 63 72  pSubst, /* Descr
1ee50 69 70 74 69 6f 6e 20 6f 66 20 74 68 65 20 73 75  iption of the su
1ee60 62 73 74 69 74 75 74 69 6f 6e 20 2a 2f 0a 20 20  bstitution */.  
1ee70 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 20  ExprList *pList 
1ee80 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 74 6f        /* List to
1ee90 20 73 63 61 6e 20 61 6e 64 20 69 6e 20 77 68 69   scan and in whi
1eea0 63 68 20 74 6f 20 6d 61 6b 65 20 73 75 62 73 74  ch to make subst
1eeb0 69 74 75 74 65 73 20 2a 2f 0a 29 7b 0a 20 20 69  itutes */.){.  i
1eec0 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 4c 69 73  nt i;.  if( pLis
1eed0 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  t==0 ) return;. 
1eee0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73   for(i=0; i<pLis
1eef0 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a  t->nExpr; i++){.
1ef00 20 20 20 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e      pList->a[i].
1ef10 70 45 78 70 72 20 3d 20 73 75 62 73 74 45 78 70  pExpr = substExp
1ef20 72 28 70 53 75 62 73 74 2c 20 70 4c 69 73 74 2d  r(pSubst, pList-
1ef30 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20  >a[i].pExpr);.  
1ef40 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20  }.}.static void 
1ef50 73 75 62 73 74 53 65 6c 65 63 74 28 0a 20 20 53  substSelect(.  S
1ef60 75 62 73 74 43 6f 6e 74 65 78 74 20 2a 70 53 75  ubstContext *pSu
1ef70 62 73 74 2c 20 2f 2a 20 44 65 73 63 72 69 70 74  bst, /* Descript
1ef80 69 6f 6e 20 6f 66 20 74 68 65 20 73 75 62 73 74  ion of the subst
1ef90 69 74 75 74 69 6f 6e 20 2a 2f 0a 20 20 53 65 6c  itution */.  Sel
1efa0 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20  ect *p,         
1efb0 20 20 20 2f 2a 20 53 45 4c 45 43 54 20 73 74 61     /* SELECT sta
1efc0 74 65 6d 65 6e 74 20 69 6e 20 77 68 69 63 68 20  tement in which 
1efd0 74 6f 20 6d 61 6b 65 20 73 75 62 73 74 69 74 75  to make substitu
1efe0 74 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 64  tions */.  int d
1eff0 6f 50 72 69 6f 72 20 20 20 20 20 20 20 20 20 20  oPrior          
1f000 20 2f 2a 20 44 6f 20 73 75 62 73 74 69 74 75 74   /* Do substitut
1f010 65 73 20 6f 6e 20 70 2d 3e 70 50 72 69 6f 72 20  es on p->pPrior 
1f020 74 6f 6f 20 2a 2f 0a 29 7b 0a 20 20 53 72 63 4c  too */.){.  SrcL
1f030 69 73 74 20 2a 70 53 72 63 3b 0a 20 20 73 74 72  ist *pSrc;.  str
1f040 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
1f050 20 2a 70 49 74 65 6d 3b 0a 20 20 69 6e 74 20 69   *pItem;.  int i
1f060 3b 0a 20 20 69 66 28 20 21 70 20 29 20 72 65 74  ;.  if( !p ) ret
1f070 75 72 6e 3b 0a 20 20 64 6f 7b 0a 20 20 20 20 73  urn;.  do{.    s
1f080 75 62 73 74 45 78 70 72 4c 69 73 74 28 70 53 75  ubstExprList(pSu
1f090 62 73 74 2c 20 70 2d 3e 70 45 4c 69 73 74 29 3b  bst, p->pEList);
1f0a0 0a 20 20 20 20 73 75 62 73 74 45 78 70 72 4c 69  .    substExprLi
1f0b0 73 74 28 70 53 75 62 73 74 2c 20 70 2d 3e 70 47  st(pSubst, p->pG
1f0c0 72 6f 75 70 42 79 29 3b 0a 20 20 20 20 73 75 62  roupBy);.    sub
1f0d0 73 74 45 78 70 72 4c 69 73 74 28 70 53 75 62 73  stExprList(pSubs
1f0e0 74 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79 29 3b  t, p->pOrderBy);
1f0f0 0a 20 20 20 20 70 2d 3e 70 48 61 76 69 6e 67 20  .    p->pHaving 
1f100 3d 20 73 75 62 73 74 45 78 70 72 28 70 53 75 62  = substExpr(pSub
1f110 73 74 2c 20 70 2d 3e 70 48 61 76 69 6e 67 29 3b  st, p->pHaving);
1f120 0a 20 20 20 20 70 2d 3e 70 57 68 65 72 65 20 3d  .    p->pWhere =
1f130 20 73 75 62 73 74 45 78 70 72 28 70 53 75 62 73   substExpr(pSubs
1f140 74 2c 20 70 2d 3e 70 57 68 65 72 65 29 3b 0a 20  t, p->pWhere);. 
1f150 20 20 20 70 53 72 63 20 3d 20 70 2d 3e 70 53 72     pSrc = p->pSr
1f160 63 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  c;.    assert( p
1f170 53 72 63 21 3d 30 20 29 3b 0a 20 20 20 20 66 6f  Src!=0 );.    fo
1f180 72 28 69 3d 70 53 72 63 2d 3e 6e 53 72 63 2c 20  r(i=pSrc->nSrc, 
1f190 70 49 74 65 6d 3d 70 53 72 63 2d 3e 61 3b 20 69  pItem=pSrc->a; i
1f1a0 3e 30 3b 20 69 2d 2d 2c 20 70 49 74 65 6d 2b 2b  >0; i--, pItem++
1f1b0 29 7b 0a 20 20 20 20 20 20 73 75 62 73 74 53 65  ){.      substSe
1f1c0 6c 65 63 74 28 70 53 75 62 73 74 2c 20 70 49 74  lect(pSubst, pIt
1f1d0 65 6d 2d 3e 70 53 65 6c 65 63 74 2c 20 31 29 3b  em->pSelect, 1);
1f1e0 0a 20 20 20 20 20 20 69 66 28 20 70 49 74 65 6d  .      if( pItem
1f1f0 2d 3e 66 67 2e 69 73 54 61 62 46 75 6e 63 20 29  ->fg.isTabFunc )
1f200 7b 0a 20 20 20 20 20 20 20 20 73 75 62 73 74 45  {.        substE
1f210 78 70 72 4c 69 73 74 28 70 53 75 62 73 74 2c 20  xprList(pSubst, 
1f220 70 49 74 65 6d 2d 3e 75 31 2e 70 46 75 6e 63 41  pItem->u1.pFuncA
1f230 72 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  rg);.      }.   
1f240 20 7d 0a 20 20 7d 77 68 69 6c 65 28 20 64 6f 50   }.  }while( doP
1f250 72 69 6f 72 20 26 26 20 28 70 20 3d 20 70 2d 3e  rior && (p = p->
1f260 70 50 72 69 6f 72 29 21 3d 30 20 29 3b 0a 7d 0a  pPrior)!=0 );.}.
1f270 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e  #endif /* !defin
1f280 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ed(SQLITE_OMIT_S
1f290 55 42 51 55 45 52 59 29 20 7c 7c 20 21 64 65 66  UBQUERY) || !def
1f2a0 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
1f2b0 5f 56 49 45 57 29 20 2a 2f 0a 0a 23 69 66 20 21  _VIEW) */..#if !
1f2c0 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
1f2d0 4d 49 54 5f 53 55 42 51 55 45 52 59 29 20 7c 7c  MIT_SUBQUERY) ||
1f2e0 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
1f2f0 5f 4f 4d 49 54 5f 56 49 45 57 29 0a 2f 2a 0a 2a  _OMIT_VIEW)./*.*
1f300 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61  * This routine a
1f310 74 74 65 6d 70 74 73 20 74 6f 20 66 6c 61 74 74  ttempts to flatt
1f320 65 6e 20 73 75 62 71 75 65 72 69 65 73 20 61 73  en subqueries as
1f330 20 61 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 6f   a performance o
1f340 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 0a 2a 2a 20  ptimization..** 
1f350 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74  This routine ret
1f360 75 72 6e 73 20 31 20 69 66 20 69 74 20 6d 61 6b  urns 1 if it mak
1f370 65 73 20 63 68 61 6e 67 65 73 20 61 6e 64 20 30  es changes and 0
1f380 20 69 66 20 6e 6f 20 66 6c 61 74 74 65 6e 69 6e   if no flattenin
1f390 67 20 6f 63 63 75 72 73 2e 0a 2a 2a 0a 2a 2a 20  g occurs..**.** 
1f3a0 54 6f 20 75 6e 64 65 72 73 74 61 6e 64 20 74 68  To understand th
1f3b0 65 20 63 6f 6e 63 65 70 74 20 6f 66 20 66 6c 61  e concept of fla
1f3c0 74 74 65 6e 69 6e 67 2c 20 63 6f 6e 73 69 64 65  ttening, conside
1f3d0 72 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a  r the following.
1f3e0 2a 2a 20 71 75 65 72 79 3a 0a 2a 2a 0a 2a 2a 20  ** query:.**.** 
1f3f0 20 20 20 20 53 45 4c 45 43 54 20 61 20 46 52 4f      SELECT a FRO
1f400 4d 20 28 53 45 4c 45 43 54 20 78 2b 79 20 41 53  M (SELECT x+y AS
1f410 20 61 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45   a FROM t1 WHERE
1f420 20 7a 3c 31 30 30 29 20 57 48 45 52 45 20 61 3e   z<100) WHERE a>
1f430 35 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 65 66 61  5.**.** The defa
1f440 75 6c 74 20 77 61 79 20 6f 66 20 69 6d 70 6c 65  ult way of imple
1f450 6d 65 6e 74 69 6e 67 20 74 68 69 73 20 71 75 65  menting this que
1f460 72 79 20 69 73 20 74 6f 20 65 78 65 63 75 74 65  ry is to execute
1f470 20 74 68 65 0a 2a 2a 20 73 75 62 71 75 65 72 79   the.** subquery
1f480 20 66 69 72 73 74 20 61 6e 64 20 73 74 6f 72 65   first and store
1f490 20 74 68 65 20 72 65 73 75 6c 74 73 20 69 6e 20   the results in 
1f4a0 61 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  a temporary tabl
1f4b0 65 2c 20 74 68 65 6e 0a 2a 2a 20 72 75 6e 20 74  e, then.** run t
1f4c0 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 6f  he outer query o
1f4d0 6e 20 74 68 61 74 20 74 65 6d 70 6f 72 61 72 79  n that temporary
1f4e0 20 74 61 62 6c 65 2e 20 20 54 68 69 73 20 72 65   table.  This re
1f4f0 71 75 69 72 65 73 20 74 77 6f 0a 2a 2a 20 70 61  quires two.** pa
1f500 73 73 65 73 20 6f 76 65 72 20 74 68 65 20 64 61  sses over the da
1f510 74 61 2e 20 20 46 75 72 74 68 65 72 6d 6f 72 65  ta.  Furthermore
1f520 2c 20 62 65 63 61 75 73 65 20 74 68 65 20 74 65  , because the te
1f530 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 0a 2a 2a  mporary table.**
1f540 20 68 61 73 20 6e 6f 20 69 6e 64 69 63 65 73 2c   has no indices,
1f550 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
1f560 65 20 6f 6e 20 74 68 65 20 6f 75 74 65 72 20 71  e on the outer q
1f570 75 65 72 79 20 63 61 6e 6e 6f 74 20 62 65 0a 2a  uery cannot be.*
1f580 2a 20 6f 70 74 69 6d 69 7a 65 64 2e 0a 2a 2a 0a  * optimized..**.
1f590 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
1f5a0 61 74 74 65 6d 70 74 73 20 74 6f 20 72 65 77 72  attempts to rewr
1f5b0 69 74 65 20 71 75 65 72 69 65 73 20 73 75 63 68  ite queries such
1f5c0 20 61 73 20 74 68 65 20 61 62 6f 76 65 20 69 6e   as the above in
1f5d0 74 6f 0a 2a 2a 20 61 20 73 69 6e 67 6c 65 20 66  to.** a single f
1f5e0 6c 61 74 20 73 65 6c 65 63 74 2c 20 6c 69 6b 65  lat select, like
1f5f0 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20   this:.**.**    
1f600 20 53 45 4c 45 43 54 20 78 2b 79 20 41 53 20 61   SELECT x+y AS a
1f610 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 7a   FROM t1 WHERE z
1f620 3c 31 30 30 20 41 4e 44 20 61 3e 35 0a 2a 2a 0a  <100 AND a>5.**.
1f630 2a 2a 20 54 68 65 20 63 6f 64 65 20 67 65 6e 65  ** The code gene
1f640 72 61 74 65 64 20 66 6f 72 20 74 68 69 73 20 73  rated for this s
1f650 69 6d 70 6c 69 66 69 63 61 74 69 6f 6e 20 67 69  implification gi
1f660 76 65 73 20 74 68 65 20 73 61 6d 65 20 72 65 73  ves the same res
1f670 75 6c 74 0a 2a 2a 20 62 75 74 20 6f 6e 6c 79 20  ult.** but only 
1f680 68 61 73 20 74 6f 20 73 63 61 6e 20 74 68 65 20  has to scan the 
1f690 64 61 74 61 20 6f 6e 63 65 2e 20 20 41 6e 64 20  data once.  And 
1f6a0 62 65 63 61 75 73 65 20 69 6e 64 69 63 65 73 20  because indices 
1f6b0 6d 69 67 68 74 20 0a 2a 2a 20 65 78 69 73 74 20  might .** exist 
1f6c0 6f 6e 20 74 68 65 20 74 61 62 6c 65 20 74 31 2c  on the table t1,
1f6d0 20 61 20 63 6f 6d 70 6c 65 74 65 20 73 63 61 6e   a complete scan
1f6e0 20 6f 66 20 74 68 65 20 64 61 74 61 20 6d 69 67   of the data mig
1f6f0 68 74 20 62 65 0a 2a 2a 20 61 76 6f 69 64 65 64  ht be.** avoided
1f700 2e 0a 2a 2a 0a 2a 2a 20 46 6c 61 74 74 65 6e 69  ..**.** Flatteni
1f710 6e 67 20 69 73 20 73 75 62 6a 65 63 74 20 74 6f  ng is subject to
1f720 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63   the following c
1f730 6f 6e 73 74 72 61 69 6e 74 73 3a 0a 2a 2a 0a 2a  onstraints:.**.*
1f740 2a 20 20 28 2a 2a 29 20 20 57 65 20 6e 6f 20 6c  *  (**)  We no l
1f750 6f 6e 67 65 72 20 61 74 74 65 6d 70 74 20 74 6f  onger attempt to
1f760 20 66 6c 61 74 74 65 6e 20 61 67 67 72 65 67 61   flatten aggrega
1f770 74 65 20 73 75 62 71 75 65 72 69 65 73 2e 20 57  te subqueries. W
1f780 61 73 3a 0a 2a 2a 20 20 20 20 20 20 20 20 54 68  as:.**        Th
1f790 65 20 73 75 62 71 75 65 72 79 20 61 6e 64 20 74  e subquery and t
1f7a0 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 63  he outer query c
1f7b0 61 6e 6e 6f 74 20 62 6f 74 68 20 62 65 20 61 67  annot both be ag
1f7c0 67 72 65 67 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20  gregates..**.** 
1f7d0 20 28 2a 2a 29 20 20 57 65 20 6e 6f 20 6c 6f 6e   (**)  We no lon
1f7e0 67 65 72 20 61 74 74 65 6d 70 74 20 74 6f 20 66  ger attempt to f
1f7f0 6c 61 74 74 65 6e 20 61 67 67 72 65 67 61 74 65  latten aggregate
1f800 20 73 75 62 71 75 65 72 69 65 73 2e 20 57 61 73   subqueries. Was
1f810 3a 0a 2a 2a 20 20 20 20 20 20 20 20 28 32 29 20  :.**        (2) 
1f820 49 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20  If the subquery 
1f830 69 73 20 61 6e 20 61 67 67 72 65 67 61 74 65 20  is an aggregate 
1f840 74 68 65 6e 0a 2a 2a 20 20 20 20 20 20 20 20 28  then.**        (
1f850 32 61 29 20 74 68 65 20 6f 75 74 65 72 20 71 75  2a) the outer qu
1f860 65 72 79 20 6d 75 73 74 20 6e 6f 74 20 62 65 20  ery must not be 
1f870 61 20 6a 6f 69 6e 20 61 6e 64 0a 2a 2a 20 20 20  a join and.**   
1f880 20 20 20 20 20 28 32 62 29 20 74 68 65 20 6f 75       (2b) the ou
1f890 74 65 72 20 71 75 65 72 79 20 6d 75 73 74 20 6e  ter query must n
1f8a0 6f 74 20 75 73 65 20 73 75 62 71 75 65 72 69 65  ot use subquerie
1f8b0 73 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  s.**            
1f8c0 20 6f 74 68 65 72 20 74 68 61 6e 20 74 68 65 20   other than the 
1f8d0 6f 6e 65 20 46 52 4f 4d 2d 63 6c 61 75 73 65 20  one FROM-clause 
1f8e0 73 75 62 71 75 65 72 79 20 74 68 61 74 20 69 73  subquery that is
1f8f0 20 61 20 63 61 6e 64 69 64 61 74 65 0a 2a 2a 20   a candidate.** 
1f900 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 20              for 
1f910 66 6c 61 74 74 65 6e 69 6e 67 2e 20 20 28 54 68  flattening.  (Th
1f920 69 73 20 69 73 20 64 75 65 20 74 6f 20 74 69 63  is is due to tic
1f930 6b 65 74 20 5b 32 66 37 31 37 30 64 37 33 62 66  ket [2f7170d73bf
1f940 39 61 62 66 38 30 5d 0a 2a 2a 20 20 20 20 20 20  9abf80].**      
1f950 20 20 20 20 20 20 20 66 72 6f 6d 20 32 30 31 35         from 2015
1f960 2d 30 32 2d 30 39 2e 29 0a 2a 2a 0a 2a 2a 20 20  -02-09.).**.**  
1f970 20 28 33 29 20 20 49 66 20 74 68 65 20 73 75 62   (3)  If the sub
1f980 71 75 65 72 79 20 69 73 20 74 68 65 20 72 69 67  query is the rig
1f990 68 74 20 6f 70 65 72 61 6e 64 20 6f 66 20 61 20  ht operand of a 
1f9a0 4c 45 46 54 20 4a 4f 49 4e 20 74 68 65 6e 0a 2a  LEFT JOIN then.*
1f9b0 2a 20 20 20 20 20 20 20 20 28 33 61 29 20 74 68  *        (3a) th
1f9c0 65 20 73 75 62 71 75 65 72 79 20 6d 61 79 20 6e  e subquery may n
1f9d0 6f 74 20 62 65 20 61 20 6a 6f 69 6e 20 61 6e 64  ot be a join and
1f9e0 0a 2a 2a 20 20 20 20 20 20 20 20 28 33 62 29 20  .**        (3b) 
1f9f0 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
1fa00 6f 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20  of the subquery 
1fa10 6d 61 79 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20  may not contain 
1fa20 61 20 76 69 72 74 75 61 6c 0a 2a 2a 20 20 20 20  a virtual.**    
1fa30 20 20 20 20 20 20 20 20 20 74 61 62 6c 65 20 61           table a
1fa40 6e 64 0a 2a 2a 20 20 20 20 20 20 20 20 28 33 63  nd.**        (3c
1fa50 29 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  ) the outer quer
1fa60 79 20 6d 61 79 20 6e 6f 74 20 62 65 20 61 6e 20  y may not be an 
1fa70 61 67 67 72 65 67 61 74 65 2e 0a 2a 2a 0a 2a 2a  aggregate..**.**
1fa80 20 20 20 28 34 29 20 20 54 68 65 20 73 75 62 71     (4)  The subq
1fa90 75 65 72 79 20 63 61 6e 20 6e 6f 74 20 62 65 20  uery can not be 
1faa0 44 49 53 54 49 4e 43 54 2e 0a 2a 2a 0a 2a 2a 20  DISTINCT..**.** 
1fab0 20 28 2a 2a 29 20 20 41 74 20 6f 6e 65 20 70 6f   (**)  At one po
1fac0 69 6e 74 20 72 65 73 74 72 69 63 74 69 6f 6e 73  int restrictions
1fad0 20 28 34 29 20 61 6e 64 20 28 35 29 20 64 65 66   (4) and (5) def
1fae0 69 6e 65 64 20 61 20 73 75 62 73 65 74 20 6f 66  ined a subset of
1faf0 20 44 49 53 54 49 4e 43 54 0a 2a 2a 20 20 20 20   DISTINCT.**    
1fb00 20 20 20 20 73 75 62 2d 71 75 65 72 69 65 73 20      sub-queries 
1fb10 74 68 61 74 20 77 65 72 65 20 65 78 63 6c 75 64  that were exclud
1fb20 65 64 20 66 72 6f 6d 20 74 68 69 73 20 6f 70 74  ed from this opt
1fb30 69 6d 69 7a 61 74 69 6f 6e 2e 20 52 65 73 74 72  imization. Restr
1fb40 69 63 74 69 6f 6e 20 0a 2a 2a 20 20 20 20 20 20  iction .**      
1fb50 20 20 28 34 29 20 68 61 73 20 73 69 6e 63 65 20    (4) has since 
1fb60 62 65 65 6e 20 65 78 70 61 6e 64 65 64 20 74 6f  been expanded to
1fb70 20 65 78 63 6c 75 64 65 20 61 6c 6c 20 44 49 53   exclude all DIS
1fb80 54 49 4e 43 54 20 73 75 62 71 75 65 72 69 65 73  TINCT subqueries
1fb90 2e 0a 2a 2a 0a 2a 2a 20 20 28 2a 2a 29 20 20 57  ..**.**  (**)  W
1fba0 65 20 6e 6f 20 6c 6f 6e 67 65 72 20 61 74 74 65  e no longer atte
1fbb0 6d 70 74 20 74 6f 20 66 6c 61 74 74 65 6e 20 61  mpt to flatten a
1fbc0 67 67 72 65 67 61 74 65 20 73 75 62 71 75 65 72  ggregate subquer
1fbd0 69 65 73 2e 20 20 57 61 73 3a 0a 2a 2a 20 20 20  ies.  Was:.**   
1fbe0 20 20 20 20 20 49 66 20 74 68 65 20 73 75 62 71       If the subq
1fbf0 75 65 72 79 20 69 73 20 61 67 67 72 65 67 61 74  uery is aggregat
1fc00 65 2c 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  e, the outer que
1fc10 72 79 20 6d 61 79 20 6e 6f 74 20 62 65 20 44 49  ry may not be DI
1fc20 53 54 49 4e 43 54 2e 0a 2a 2a 0a 2a 2a 20 20 20  STINCT..**.**   
1fc30 28 37 29 20 20 54 68 65 20 73 75 62 71 75 65 72  (7)  The subquer
1fc40 79 20 6d 75 73 74 20 68 61 76 65 20 61 20 46 52  y must have a FR
1fc50 4f 4d 20 63 6c 61 75 73 65 2e 20 20 54 4f 44 4f  OM clause.  TODO
1fc60 3a 20 20 46 6f 72 20 73 75 62 71 75 65 72 69 65  :  For subquerie
1fc70 73 20 77 69 74 68 6f 75 74 0a 2a 2a 20 20 20 20  s without.**    
1fc80 20 20 20 20 41 20 46 52 4f 4d 20 63 6c 61 75 73      A FROM claus
1fc90 65 2c 20 63 6f 6e 73 69 64 65 72 20 61 64 64 69  e, consider addi
1fca0 6e 67 20 61 20 46 52 4f 4d 20 63 6c 61 75 73 65  ng a FROM clause
1fcb0 20 77 69 74 68 20 74 68 65 20 73 70 65 63 69 61   with the specia
1fcc0 6c 0a 2a 2a 20 20 20 20 20 20 20 20 74 61 62 6c  l.**        tabl
1fcd0 65 20 73 71 6c 69 74 65 5f 6f 6e 63 65 20 74 68  e sqlite_once th
1fce0 61 74 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61  at consists of a
1fcf0 20 73 69 6e 67 6c 65 20 72 6f 77 20 63 6f 6e 74   single row cont
1fd00 61 69 6e 69 6e 67 20 61 0a 2a 2a 20 20 20 20 20  aining a.**     
1fd10 20 20 20 73 69 6e 67 6c 65 20 4e 55 4c 4c 2e 0a     single NULL..
1fd20 2a 2a 0a 2a 2a 20 20 20 28 38 29 20 20 49 66 20  **.**   (8)  If 
1fd30 74 68 65 20 73 75 62 71 75 65 72 79 20 75 73 65  the subquery use
1fd40 73 20 4c 49 4d 49 54 20 74 68 65 6e 20 74 68 65  s LIMIT then the
1fd50 20 6f 75 74 65 72 20 71 75 65 72 79 20 6d 61 79   outer query may
1fd60 20 6e 6f 74 20 62 65 20 61 20 6a 6f 69 6e 2e 0a   not be a join..
1fd70 2a 2a 0a 2a 2a 20 20 20 28 39 29 20 20 49 66 20  **.**   (9)  If 
1fd80 74 68 65 20 73 75 62 71 75 65 72 79 20 75 73 65  the subquery use
1fd90 73 20 4c 49 4d 49 54 20 74 68 65 6e 20 74 68 65  s LIMIT then the
1fda0 20 6f 75 74 65 72 20 71 75 65 72 79 20 6d 61 79   outer query may
1fdb0 20 6e 6f 74 20 62 65 20 61 67 67 72 65 67 61 74   not be aggregat
1fdc0 65 2e 0a 2a 2a 0a 2a 2a 20 20 28 2a 2a 29 20 20  e..**.**  (**)  
1fdd0 52 65 73 74 72 69 63 74 69 6f 6e 20 28 31 30 29  Restriction (10)
1fde0 20 77 61 73 20 72 65 6d 6f 76 65 64 20 66 72 6f   was removed fro
1fdf0 6d 20 74 68 65 20 63 6f 64 65 20 6f 6e 20 32 30  m the code on 20
1fe00 30 35 2d 30 32 2d 30 35 20 62 75 74 20 77 65 0a  05-02-05 but we.
1fe10 2a 2a 20 20 20 20 20 20 20 20 61 63 63 69 64 65  **        accide
1fe20 6e 74 6c 79 20 63 61 72 72 69 65 64 20 74 68 65  ntly carried the
1fe30 20 63 6f 6d 6d 65 6e 74 20 66 6f 72 77 61 72 64   comment forward
1fe40 20 75 6e 74 69 6c 20 32 30 31 34 2d 30 39 2d 31   until 2014-09-1
1fe50 35 2e 20 20 4f 72 69 67 69 6e 61 6c 0a 2a 2a 20  5.  Original.** 
1fe60 20 20 20 20 20 20 20 63 6f 6e 73 74 72 61 69 6e         constrain
1fe70 74 3a 20 22 49 66 20 74 68 65 20 73 75 62 71 75  t: "If the subqu
1fe80 65 72 79 20 69 73 20 61 67 67 72 65 67 61 74 65  ery is aggregate
1fe90 20 74 68 65 6e 20 74 68 65 20 6f 75 74 65 72 20   then the outer 
1fea0 71 75 65 72 79 20 0a 2a 2a 20 20 20 20 20 20 20  query .**       
1feb0 20 6d 61 79 20 6e 6f 74 20 75 73 65 20 4c 49 4d   may not use LIM
1fec0 49 54 2e 22 0a 2a 2a 0a 2a 2a 20 20 28 31 31 29  IT.".**.**  (11)
1fed0 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20 61    The subquery a
1fee0 6e 64 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  nd the outer que
1fef0 72 79 20 6d 61 79 20 6e 6f 74 20 62 6f 74 68 20  ry may not both 
1ff00 68 61 76 65 20 4f 52 44 45 52 20 42 59 20 63 6c  have ORDER BY cl
1ff10 61 75 73 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 28 2a  auses..**.**  (*
1ff20 2a 29 20 20 4e 6f 74 20 69 6d 70 6c 65 6d 65 6e  *)  Not implemen
1ff30 74 65 64 2e 20 20 53 75 62 73 75 6d 65 64 20 69  ted.  Subsumed i
1ff40 6e 74 6f 20 72 65 73 74 72 69 63 74 69 6f 6e 20  nto restriction 
1ff50 28 33 29 2e 20 20 57 61 73 20 70 72 65 76 69 6f  (3).  Was previo
1ff60 75 73 6c 79 0a 2a 2a 20 20 20 20 20 20 20 20 61  usly.**        a
1ff70 20 73 65 70 61 72 61 74 65 20 72 65 73 74 72 69   separate restri
1ff80 63 74 69 6f 6e 20 64 65 72 69 76 69 6e 67 20 66  ction deriving f
1ff90 72 6f 6d 20 74 69 63 6b 65 74 20 23 33 35 30 2e  rom ticket #350.
1ffa0 0a 2a 2a 0a 2a 2a 20 20 28 31 33 29 20 20 54 68  .**.**  (13)  Th
1ffb0 65 20 73 75 62 71 75 65 72 79 20 61 6e 64 20 6f  e subquery and o
1ffc0 75 74 65 72 20 71 75 65 72 79 20 6d 61 79 20 6e  uter query may n
1ffd0 6f 74 20 62 6f 74 68 20 75 73 65 20 4c 49 4d 49  ot both use LIMI
1ffe0 54 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 34 29 20 20  T..**.**  (14)  
1fff0 54 68 65 20 73 75 62 71 75 65 72 79 20 6d 61 79  The subquery may
20000 20 6e 6f 74 20 75 73 65 20 4f 46 46 53 45 54 2e   not use OFFSET.
20010 0a 2a 2a 0a 2a 2a 20 20 28 31 35 29 20 20 49 66  .**.**  (15)  If
20020 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
20030 20 69 73 20 70 61 72 74 20 6f 66 20 61 20 63 6f   is part of a co
20040 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 2c 20 74  mpound select, t
20050 68 65 6e 20 74 68 65 0a 2a 2a 20 20 20 20 20 20  hen the.**      
20060 20 20 73 75 62 71 75 65 72 79 20 6d 61 79 20 6e    subquery may n
20070 6f 74 20 75 73 65 20 4c 49 4d 49 54 2e 0a 2a 2a  ot use LIMIT..**
20080 20 20 20 20 20 20 20 20 28 53 65 65 20 74 69 63          (See tic
20090 6b 65 74 20 23 32 33 33 39 20 61 6e 64 20 74 69  ket #2339 and ti
200a0 63 6b 65 74 20 5b 30 32 61 38 65 38 31 64 34 34  cket [02a8e81d44
200b0 5d 29 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 36 29 20  ])..**.**  (16) 
200c0 20 49 66 20 74 68 65 20 6f 75 74 65 72 20 71 75   If the outer qu
200d0 65 72 79 20 69 73 20 61 67 67 72 65 67 61 74 65  ery is aggregate
200e0 2c 20 74 68 65 6e 20 74 68 65 20 73 75 62 71 75  , then the subqu
200f0 65 72 79 20 6d 61 79 20 6e 6f 74 0a 2a 2a 20 20  ery may not.**  
20100 20 20 20 20 20 20 75 73 65 20 4f 52 44 45 52 20        use ORDER 
20110 42 59 2e 20 20 28 54 69 63 6b 65 74 20 23 32 39  BY.  (Ticket #29
20120 34 32 29 20 20 54 68 69 73 20 75 73 65 64 20 74  42)  This used t
20130 6f 20 6e 6f 74 20 6d 61 74 74 65 72 0a 2a 2a 20  o not matter.** 
20140 20 20 20 20 20 20 20 75 6e 74 69 6c 20 77 65 20         until we 
20150 69 6e 74 72 6f 64 75 63 65 64 20 74 68 65 20 67  introduced the g
20160 72 6f 75 70 5f 63 6f 6e 63 61 74 28 29 20 66 75  roup_concat() fu
20170 6e 63 74 69 6f 6e 2e 20 20 0a 2a 2a 0a 2a 2a 20  nction.  .**.** 
20180 20 28 31 37 29 20 20 49 66 20 74 68 65 20 73 75   (17)  If the su
20190 62 71 75 65 72 79 20 69 73 20 61 20 63 6f 6d 70  bquery is a comp
201a0 6f 75 6e 64 20 73 65 6c 65 63 74 2c 20 74 68 65  ound select, the
201b0 6e 0a 2a 2a 20 20 20 20 20 20 20 20 28 31 37 61  n.**        (17a
201c0 29 20 61 6c 6c 20 63 6f 6d 70 6f 75 6e 64 20 6f  ) all compound o
201d0 70 65 72 61 74 6f 72 73 20 6d 75 73 74 20 62 65  perators must be
201e0 20 61 20 55 4e 49 4f 4e 20 41 4c 4c 2c 20 61 6e   a UNION ALL, an
201f0 64 0a 2a 2a 20 20 20 20 20 20 20 20 28 31 37 62  d.**        (17b
20200 29 20 6e 6f 20 74 65 72 6d 73 20 77 69 74 68 69  ) no terms withi
20210 6e 20 74 68 65 20 73 75 62 71 75 65 72 79 20 63  n the subquery c
20220 6f 6d 70 6f 75 6e 64 20 6d 61 79 20 62 65 20 61  ompound may be a
20230 67 67 72 65 67 61 74 65 0a 2a 2a 20 20 20 20 20  ggregate.**     
20240 20 20 20 20 20 20 20 20 20 6f 72 20 44 49 53 54           or DIST
20250 49 4e 43 54 2c 20 61 6e 64 0a 2a 2a 20 20 20 20  INCT, and.**    
20260 20 20 20 20 28 31 37 63 29 20 65 76 65 72 79 20      (17c) every 
20270 74 65 72 6d 20 77 69 74 68 69 6e 20 74 68 65 20  term within the 
20280 73 75 62 71 75 65 72 79 20 63 6f 6d 70 6f 75 6e  subquery compoun
20290 64 20 6d 75 73 74 20 68 61 76 65 20 61 20 46 52  d must have a FR
202a0 4f 4d 20 63 6c 61 75 73 65 0a 2a 2a 20 20 20 20  OM clause.**    
202b0 20 20 20 20 28 31 37 64 29 20 74 68 65 20 6f 75      (17d) the ou
202c0 74 65 72 20 71 75 65 72 79 20 6d 61 79 20 6e 6f  ter query may no
202d0 74 20 62 65 0a 2a 2a 20 20 20 20 20 20 20 20 20  t be.**         
202e0 20 20 20 20 20 28 31 37 64 31 29 20 61 67 67 72       (17d1) aggr
202f0 65 67 61 74 65 2c 20 6f 72 0a 2a 2a 20 20 20 20  egate, or.**    
20300 20 20 20 20 20 20 20 20 20 20 28 31 37 64 32 29            (17d2)
20310 20 44 49 53 54 49 4e 43 54 2c 20 6f 72 0a 2a 2a   DISTINCT, or.**
20320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 31                (1
20330 37 64 33 29 20 61 20 6a 6f 69 6e 2e 0a 2a 2a 0a  7d3) a join..**.
20340 2a 2a 20 20 20 20 20 20 20 20 54 68 65 20 70 61  **        The pa
20350 72 65 6e 74 20 61 6e 64 20 73 75 62 2d 71 75 65  rent and sub-que
20360 72 79 20 6d 61 79 20 63 6f 6e 74 61 69 6e 20 57  ry may contain W
20370 48 45 52 45 20 63 6c 61 75 73 65 73 2e 20 53 75  HERE clauses. Su
20380 62 6a 65 63 74 20 74 6f 0a 2a 2a 20 20 20 20 20  bject to.**     
20390 20 20 20 72 75 6c 65 73 20 28 31 31 29 2c 20 28     rules (11), (
203a0 31 33 29 20 61 6e 64 20 28 31 34 29 2c 20 74 68  13) and (14), th
203b0 65 79 20 6d 61 79 20 61 6c 73 6f 20 63 6f 6e 74  ey may also cont
203c0 61 69 6e 20 4f 52 44 45 52 20 42 59 2c 0a 2a 2a  ain ORDER BY,.**
203d0 20 20 20 20 20 20 20 20 4c 49 4d 49 54 20 61 6e          LIMIT an
203e0 64 20 4f 46 46 53 45 54 20 63 6c 61 75 73 65 73  d OFFSET clauses
203f0 2e 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20  .  The subquery 
20400 63 61 6e 6e 6f 74 20 75 73 65 20 61 6e 79 20 63  cannot use any c
20410 6f 6d 70 6f 75 6e 64 0a 2a 2a 20 20 20 20 20 20  ompound.**      
20420 20 20 6f 70 65 72 61 74 6f 72 20 6f 74 68 65 72    operator other
20430 20 74 68 61 6e 20 55 4e 49 4f 4e 20 41 4c 4c 20   than UNION ALL 
20440 62 65 63 61 75 73 65 20 61 6c 6c 20 74 68 65 20  because all the 
20450 6f 74 68 65 72 20 63 6f 6d 70 6f 75 6e 64 0a 2a  other compound.*
20460 2a 20 20 20 20 20 20 20 20 6f 70 65 72 61 74 6f  *        operato
20470 72 73 20 68 61 76 65 20 61 6e 20 69 6d 70 6c 69  rs have an impli
20480 65 64 20 44 49 53 54 49 4e 43 54 20 77 68 69 63  ed DISTINCT whic
20490 68 20 69 73 20 64 69 73 61 6c 6c 6f 77 65 64 20  h is disallowed 
204a0 62 79 0a 2a 2a 20 20 20 20 20 20 20 20 72 65 73  by.**        res
204b0 74 72 69 63 74 69 6f 6e 20 28 34 29 2e 0a 2a 2a  triction (4)..**
204c0 0a 2a 2a 20 20 20 20 20 20 20 20 41 6c 73 6f 2c  .**        Also,
204d0 20 65 61 63 68 20 63 6f 6d 70 6f 6e 65 6e 74 20   each component 
204e0 6f 66 20 74 68 65 20 73 75 62 2d 71 75 65 72 79  of the sub-query
204f0 20 6d 75 73 74 20 72 65 74 75 72 6e 20 74 68 65   must return the
20500 20 73 61 6d 65 20 6e 75 6d 62 65 72 0a 2a 2a 20   same number.** 
20510 20 20 20 20 20 20 20 6f 66 20 72 65 73 75 6c 74         of result
20520 20 63 6f 6c 75 6d 6e 73 2e 20 54 68 69 73 20 69   columns. This i
20530 73 20 61 63 74 75 61 6c 6c 79 20 61 20 72 65 71  s actually a req
20540 75 69 72 65 6d 65 6e 74 20 66 6f 72 20 61 6e 79  uirement for any
20550 20 63 6f 6d 70 6f 75 6e 64 0a 2a 2a 20 20 20 20   compound.**    
20560 20 20 20 20 53 45 4c 45 43 54 20 73 74 61 74 65      SELECT state
20570 6d 65 6e 74 2c 20 62 75 74 20 61 6c 6c 20 74 68  ment, but all th
20580 65 20 63 6f 64 65 20 68 65 72 65 20 64 6f 65 73  e code here does
20590 20 69 73 20 6d 61 6b 65 20 73 75 72 65 20 74 68   is make sure th
205a0 61 74 20 6e 6f 0a 2a 2a 20 20 20 20 20 20 20 20  at no.**        
205b0 73 75 63 68 20 28 69 6c 6c 65 67 61 6c 29 20 73  such (illegal) s
205c0 75 62 2d 71 75 65 72 79 20 69 73 20 66 6c 61 74  ub-query is flat
205d0 74 65 6e 65 64 2e 20 54 68 65 20 63 61 6c 6c 65  tened. The calle
205e0 72 20 77 69 6c 6c 20 64 65 74 65 63 74 20 74 68  r will detect th
205f0 65 0a 2a 2a 20 20 20 20 20 20 20 20 73 79 6e 74  e.**        synt
20600 61 78 20 65 72 72 6f 72 20 61 6e 64 20 72 65 74  ax error and ret
20610 75 72 6e 20 61 20 64 65 74 61 69 6c 65 64 20 6d  urn a detailed m
20620 65 73 73 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 20 28  essage..**.**  (
20630 31 38 29 20 20 49 66 20 74 68 65 20 73 75 62 2d  18)  If the sub-
20640 71 75 65 72 79 20 69 73 20 61 20 63 6f 6d 70 6f  query is a compo
20650 75 6e 64 20 73 65 6c 65 63 74 2c 20 74 68 65 6e  und select, then
20660 20 61 6c 6c 20 74 65 72 6d 73 20 6f 66 20 74 68   all terms of th
20670 65 0a 2a 2a 20 20 20 20 20 20 20 20 4f 52 44 45  e.**        ORDE
20680 52 20 42 59 20 63 6c 61 75 73 65 20 6f 66 20 74  R BY clause of t
20690 68 65 20 70 61 72 65 6e 74 20 6d 75 73 74 20 62  he parent must b
206a0 65 20 73 69 6d 70 6c 65 20 72 65 66 65 72 65 6e  e simple referen
206b0 63 65 73 20 74 6f 20 0a 2a 2a 20 20 20 20 20 20  ces to .**      
206c0 20 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65    columns of the
206d0 20 73 75 62 2d 71 75 65 72 79 2e 0a 2a 2a 0a 2a   sub-query..**.*
206e0 2a 20 20 28 31 39 29 20 20 49 66 20 74 68 65 20  *  (19)  If the 
206f0 73 75 62 71 75 65 72 79 20 75 73 65 73 20 4c 49  subquery uses LI
20700 4d 49 54 20 74 68 65 6e 20 74 68 65 20 6f 75 74  MIT then the out
20710 65 72 20 71 75 65 72 79 20 6d 61 79 20 6e 6f 74  er query may not
20720 0a 2a 2a 20 20 20 20 20 20 20 20 68 61 76 65 20  .**        have 
20730 61 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e 0a  a WHERE clause..
20740 2a 2a 0a 2a 2a 20 20 28 32 30 29 20 20 49 66 20  **.**  (20)  If 
20750 74 68 65 20 73 75 62 2d 71 75 65 72 79 20 69 73  the sub-query is
20760 20 61 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65   a compound sele
20770 63 74 2c 20 74 68 65 6e 20 69 74 20 6d 75 73 74  ct, then it must
20780 20 6e 6f 74 20 75 73 65 0a 2a 2a 20 20 20 20 20   not use.**     
20790 20 20 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63     an ORDER BY c
207a0 6c 61 75 73 65 2e 20 20 54 69 63 6b 65 74 20 23  lause.  Ticket #
207b0 33 37 37 33 2e 20 20 57 65 20 63 6f 75 6c 64 20  3773.  We could 
207c0 72 65 6c 61 78 20 74 68 69 73 20 63 6f 6e 73 74  relax this const
207d0 72 61 69 6e 74 0a 2a 2a 20 20 20 20 20 20 20 20  raint.**        
207e0 73 6f 6d 65 77 68 61 74 20 62 79 20 73 61 79 69  somewhat by sayi
207f0 6e 67 20 74 68 61 74 20 74 68 65 20 74 65 72 6d  ng that the term
20800 73 20 6f 66 20 74 68 65 20 4f 52 44 45 52 20 42  s of the ORDER B
20810 59 20 63 6c 61 75 73 65 20 6d 75 73 74 0a 2a 2a  Y clause must.**
20820 20 20 20 20 20 20 20 20 61 70 70 65 61 72 20 61          appear a
20830 73 20 75 6e 6d 6f 64 69 66 69 65 64 20 72 65 73  s unmodified res
20840 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74  ult columns in t
20850 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 2e 20  he outer query. 
20860 20 42 75 74 20 77 65 0a 2a 2a 20 20 20 20 20 20   But we.**      
20870 20 20 68 61 76 65 20 6f 74 68 65 72 20 6f 70 74    have other opt
20880 69 6d 69 7a 61 74 69 6f 6e 73 20 69 6e 20 6d 69  imizations in mi
20890 6e 64 20 74 6f 20 64 65 61 6c 20 77 69 74 68 20  nd to deal with 
208a0 74 68 61 74 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a  that case..**.**
208b0 20 20 28 32 31 29 20 20 49 66 20 74 68 65 20 73    (21)  If the s
208c0 75 62 71 75 65 72 79 20 75 73 65 73 20 4c 49 4d  ubquery uses LIM
208d0 49 54 20 74 68 65 6e 20 74 68 65 20 6f 75 74 65  IT then the oute
208e0 72 20 71 75 65 72 79 20 6d 61 79 20 6e 6f 74 20  r query may not 
208f0 62 65 0a 2a 2a 20 20 20 20 20 20 20 20 44 49 53  be.**        DIS
20900 54 49 4e 43 54 2e 20 20 28 53 65 65 20 74 69 63  TINCT.  (See tic
20910 6b 65 74 20 5b 37 35 32 65 31 36 34 36 66 63 5d  ket [752e1646fc]
20920 29 2e 0a 2a 2a 0a 2a 2a 20 20 28 32 32 29 20 20  )..**.**  (22)  
20930 54 68 65 20 73 75 62 71 75 65 72 79 20 6d 61 79  The subquery may
20940 20 6e 6f 74 20 62 65 20 61 20 72 65 63 75 72 73   not be a recurs
20950 69 76 65 20 43 54 45 2e 0a 2a 2a 0a 2a 2a 20 20  ive CTE..**.**  
20960 28 2a 2a 29 20 20 53 75 62 73 75 6d 65 64 20 69  (**)  Subsumed i
20970 6e 74 6f 20 72 65 73 74 72 69 63 74 69 6f 6e 20  nto restriction 
20980 28 31 37 64 33 29 2e 20 20 57 61 73 3a 20 49 66  (17d3).  Was: If
20990 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
209a0 20 69 73 0a 2a 2a 20 20 20 20 20 20 20 20 61 20   is.**        a 
209b0 72 65 63 75 72 73 69 76 65 20 43 54 45 2c 20 74  recursive CTE, t
209c0 68 65 6e 20 74 68 65 20 73 75 62 2d 71 75 65 72  hen the sub-quer
209d0 79 20 6d 61 79 20 6e 6f 74 20 62 65 20 61 20 63  y may not be a c
209e0 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79 2e 0a 2a  ompound query..*
209f0 2a 20 20 20 20 20 20 20 20 54 68 69 73 20 72 65  *        This re
20a00 73 74 72 69 63 74 69 6f 6e 20 69 73 20 62 65 63  striction is bec
20a10 61 75 73 65 20 74 72 61 6e 73 66 6f 72 6d 69 6e  ause transformin
20a20 67 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20  g the.**        
20a30 70 61 72 65 6e 74 20 74 6f 20 61 20 63 6f 6d 70  parent to a comp
20a40 6f 75 6e 64 20 71 75 65 72 79 20 63 6f 6e 66 75  ound query confu
20a50 73 65 73 20 74 68 65 20 63 6f 64 65 20 74 68 61  ses the code tha
20a60 74 20 68 61 6e 64 6c 65 73 0a 2a 2a 20 20 20 20  t handles.**    
20a70 20 20 20 20 72 65 63 75 72 73 69 76 65 20 71 75      recursive qu
20a80 65 72 69 65 73 20 69 6e 20 6d 75 6c 74 69 53 65  eries in multiSe
20a90 6c 65 63 74 28 29 2e 0a 2a 2a 0a 2a 2a 20 20 28  lect()..**.**  (
20aa0 2a 2a 29 20 20 57 65 20 6e 6f 20 6c 6f 6e 67 65  **)  We no longe
20ab0 72 20 61 74 74 65 6d 70 74 20 74 6f 20 66 6c 61  r attempt to fla
20ac0 74 74 65 6e 20 61 67 67 72 65 67 61 74 65 20 73  tten aggregate s
20ad0 75 62 71 75 65 72 69 65 73 2e 20 20 57 61 73 3a  ubqueries.  Was:
20ae0 0a 2a 2a 20 20 20 20 20 20 20 20 54 68 65 20 73  .**        The s
20af0 75 62 71 75 65 72 79 20 6d 61 79 20 6e 6f 74 20  ubquery may not 
20b00 62 65 20 61 6e 20 61 67 67 72 65 67 61 74 65 20  be an aggregate 
20b10 74 68 61 74 20 75 73 65 73 20 74 68 65 20 62 75  that uses the bu
20b20 69 6c 74 2d 69 6e 20 6d 69 6e 28 29 20 6f 72 20  ilt-in min() or 
20b30 0a 2a 2a 20 20 20 20 20 20 20 20 6f 72 20 6d 61  .**        or ma
20b40 78 28 29 20 66 75 6e 63 74 69 6f 6e 73 2e 20 20  x() functions.  
20b50 28 57 69 74 68 6f 75 74 20 74 68 69 73 20 72 65  (Without this re
20b60 73 74 72 69 63 74 69 6f 6e 2c 20 61 20 71 75 65  striction, a que
20b70 72 79 20 6c 69 6b 65 3a 0a 2a 2a 20 20 20 20 20  ry like:.**     
20b80 20 20 20 22 53 45 4c 45 43 54 20 78 20 46 52 4f     "SELECT x FRO
20b90 4d 20 28 53 45 4c 45 43 54 20 6d 61 78 28 79 29  M (SELECT max(y)
20ba0 2c 20 78 20 46 52 4f 4d 20 74 31 29 22 20 77 6f  , x FROM t1)" wo
20bb0 75 6c 64 20 6e 6f 74 20 6e 65 63 65 73 73 61 72  uld not necessar
20bc0 69 6c 79 0a 2a 2a 20 20 20 20 20 20 20 20 72 65  ily.**        re
20bd0 74 75 72 6e 20 74 68 65 20 76 61 6c 75 65 20 58  turn the value X
20be0 20 66 6f 72 20 77 68 69 63 68 20 59 20 77 61 73   for which Y was
20bf0 20 6d 61 78 69 6d 61 6c 2e 29 0a 2a 2a 0a 2a 2a   maximal.).**.**
20c00 20 20 28 32 35 29 20 20 49 66 20 65 69 74 68 65    (25)  If eithe
20c10 72 20 74 68 65 20 73 75 62 71 75 65 72 79 20 6f  r the subquery o
20c20 72 20 74 68 65 20 70 61 72 65 6e 74 20 71 75 65  r the parent que
20c30 72 79 20 63 6f 6e 74 61 69 6e 73 20 61 20 77 69  ry contains a wi
20c40 6e 64 6f 77 0a 2a 2a 20 20 20 20 20 20 20 20 66  ndow.**        f
20c50 75 6e 63 74 69 6f 6e 20 69 6e 20 74 68 65 20 73  unction in the s
20c60 65 6c 65 63 74 20 6c 69 73 74 20 6f 72 20 4f 52  elect list or OR
20c70 44 45 52 20 42 59 20 63 6c 61 75 73 65 2c 20 66  DER BY clause, f
20c80 6c 61 74 74 65 6e 69 6e 67 0a 2a 2a 20 20 20 20  lattening.**    
20c90 20 20 20 20 69 73 20 6e 6f 74 20 61 74 74 65 6d      is not attem
20ca0 70 74 65 64 2e 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 49  pted..**.**.** I
20cb0 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2c 20  n this routine, 
20cc0 74 68 65 20 22 70 22 20 70 61 72 61 6d 65 74 65  the "p" paramete
20cd0 72 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74  r is a pointer t
20ce0 6f 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  o the outer quer
20cf0 79 2e 0a 2a 2a 20 54 68 65 20 73 75 62 71 75 65  y..** The subque
20d00 72 79 20 69 73 20 70 2d 3e 70 53 72 63 2d 3e 61  ry is p->pSrc->a
20d10 5b 69 46 72 6f 6d 5d 2e 20 20 69 73 41 67 67 20  [iFrom].  isAgg 
20d20 69 73 20 74 72 75 65 20 69 66 20 74 68 65 20 6f  is true if the o
20d30 75 74 65 72 20 71 75 65 72 79 0a 2a 2a 20 75 73  uter query.** us
20d40 65 73 20 61 67 67 72 65 67 61 74 65 73 2e 0a 2a  es aggregates..*
20d50 2a 0a 2a 2a 20 49 66 20 66 6c 61 74 74 65 6e 69  *.** If flatteni
20d60 6e 67 20 69 73 20 6e 6f 74 20 61 74 74 65 6d 70  ng is not attemp
20d70 74 65 64 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  ted, this routin
20d80 65 20 69 73 20 61 20 6e 6f 2d 6f 70 20 61 6e 64  e is a no-op and
20d90 20 72 65 74 75 72 6e 73 20 30 2e 0a 2a 2a 20 49   returns 0..** I
20da0 66 20 66 6c 61 74 74 65 6e 69 6e 67 20 69 73 20  f flattening is 
20db0 61 74 74 65 6d 70 74 65 64 20 74 68 69 73 20 72  attempted this r
20dc0 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 31  outine returns 1
20dd0 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 6f 66 20 74  ..**.** All of t
20de0 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 61 6e  he expression an
20df0 61 6c 79 73 69 73 20 6d 75 73 74 20 6f 63 63 75  alysis must occu
20e00 72 20 6f 6e 20 62 6f 74 68 20 74 68 65 20 6f 75  r on both the ou
20e10 74 65 72 20 71 75 65 72 79 20 61 6e 64 0a 2a 2a  ter query and.**
20e20 20 74 68 65 20 73 75 62 71 75 65 72 79 20 62 65   the subquery be
20e30 66 6f 72 65 20 74 68 69 73 20 72 6f 75 74 69 6e  fore this routin
20e40 65 20 72 75 6e 73 2e 0a 2a 2f 0a 73 74 61 74 69  e runs..*/.stati
20e50 63 20 69 6e 74 20 66 6c 61 74 74 65 6e 53 75 62  c int flattenSub
20e60 71 75 65 72 79 28 0a 20 20 50 61 72 73 65 20 2a  query(.  Parse *
20e70 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 2f 2a  pParse,       /*
20e80 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
20e90 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c   */.  Select *p,
20ea0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
20eb0 65 20 70 61 72 65 6e 74 20 6f 72 20 6f 75 74 65  e parent or oute
20ec0 72 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  r SELECT stateme
20ed0 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 69 46 72 6f  nt */.  int iFro
20ee0 6d 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  m,           /* 
20ef0 49 6e 64 65 78 20 69 6e 20 70 2d 3e 70 53 72 63  Index in p->pSrc
20f00 2d 3e 61 5b 5d 20 6f 66 20 74 68 65 20 69 6e 6e  ->a[] of the inn
20f10 65 72 20 73 75 62 71 75 65 72 79 20 2a 2f 0a 20  er subquery */. 
20f20 20 69 6e 74 20 69 73 41 67 67 20 20 20 20 20 20   int isAgg      
20f30 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
20f40 20 6f 75 74 65 72 20 53 45 4c 45 43 54 20 75 73   outer SELECT us
20f50 65 73 20 61 67 67 72 65 67 61 74 65 20 66 75 6e  es aggregate fun
20f60 63 74 69 6f 6e 73 20 2a 2f 0a 29 7b 0a 20 20 63  ctions */.){.  c
20f70 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 61 76 65  onst char *zSave
20f80 64 41 75 74 68 43 6f 6e 74 65 78 74 20 3d 20 70  dAuthContext = p
20f90 50 61 72 73 65 2d 3e 7a 41 75 74 68 43 6f 6e 74  Parse->zAuthCont
20fa0 65 78 74 3b 0a 20 20 53 65 6c 65 63 74 20 2a 70  ext;.  Select *p
20fb0 50 61 72 65 6e 74 3b 20 20 20 20 2f 2a 20 43 75  Parent;    /* Cu
20fc0 72 72 65 6e 74 20 55 4e 49 4f 4e 20 41 4c 4c 20  rrent UNION ALL 
20fd0 74 65 72 6d 20 6f 66 20 74 68 65 20 6f 74 68 65  term of the othe
20fe0 72 20 71 75 65 72 79 20 2a 2f 0a 20 20 53 65 6c  r query */.  Sel
20ff0 65 63 74 20 2a 70 53 75 62 3b 20 20 20 20 20 20  ect *pSub;      
21000 20 2f 2a 20 54 68 65 20 69 6e 6e 65 72 20 71 75   /* The inner qu
21010 65 72 79 20 6f 72 20 22 73 75 62 71 75 65 72 79  ery or "subquery
21020 22 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70  " */.  Select *p
21030 53 75 62 31 3b 20 20 20 20 20 20 2f 2a 20 50 6f  Sub1;      /* Po
21040 69 6e 74 65 72 20 74 6f 20 74 68 65 20 72 69 67  inter to the rig
21050 68 74 6d 6f 73 74 20 73 65 6c 65 63 74 20 69 6e  htmost select in
21060 20 73 75 62 2d 71 75 65 72 79 20 2a 2f 0a 20 20   sub-query */.  
21070 53 72 63 4c 69 73 74 20 2a 70 53 72 63 3b 20 20  SrcList *pSrc;  
21080 20 20 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20      /* The FROM 
21090 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 6f 75  clause of the ou
210a0 74 65 72 20 71 75 65 72 79 20 2a 2f 0a 20 20 53  ter query */.  S
210b0 72 63 4c 69 73 74 20 2a 70 53 75 62 53 72 63 3b  rcList *pSubSrc;
210c0 20 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63     /* The FROM c
210d0 6c 61 75 73 65 20 6f 66 20 74 68 65 20 73 75 62  lause of the sub
210e0 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20 69  query */.  int i
210f0 50 61 72 65 6e 74 3b 20 20 20 20 20 20 20 20 2f  Parent;        /
21100 2a 20 56 44 42 45 20 63 75 72 73 6f 72 20 6e 75  * VDBE cursor nu
21110 6d 62 65 72 20 6f 66 20 74 68 65 20 70 53 75 62  mber of the pSub
21120 20 72 65 73 75 6c 74 20 73 65 74 20 74 65 6d 70   result set temp
21130 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20   table */.  int 
21140 69 4e 65 77 50 61 72 65 6e 74 20 3d 20 2d 31 3b  iNewParent = -1;
21150 2f 2a 20 52 65 70 6c 61 63 65 6d 65 6e 74 20 74  /* Replacement t
21160 61 62 6c 65 20 66 6f 72 20 69 50 61 72 65 6e 74  able for iParent
21170 20 2a 2f 0a 20 20 69 6e 74 20 69 73 4c 65 66 74   */.  int isLeft
21180 4a 6f 69 6e 20 3d 20 30 3b 20 2f 2a 20 54 72 75  Join = 0; /* Tru
21190 65 20 69 66 20 70 53 75 62 20 69 73 20 74 68 65  e if pSub is the
211a0 20 72 69 67 68 74 20 73 69 64 65 20 6f 66 20 61   right side of a
211b0 20 4c 45 46 54 20 4a 4f 49 4e 20 2a 2f 20 20 20   LEFT JOIN */   
211c0 20 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20   .  int i;      
211d0 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
211e0 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 45 78 70  counter */.  Exp
211f0 72 20 2a 70 57 68 65 72 65 3b 20 20 20 20 20 20  r *pWhere;      
21200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
21210 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   The WHERE claus
21220 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72  e */.  struct Sr
21230 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53 75 62  cList_item *pSub
21240 69 74 65 6d 3b 20 20 20 2f 2a 20 54 68 65 20 73  item;   /* The s
21250 75 62 71 75 65 72 79 20 2a 2f 0a 20 20 73 71 6c  ubquery */.  sql
21260 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
21270 65 2d 3e 64 62 3b 0a 0a 20 20 2f 2a 20 43 68 65  e->db;..  /* Che
21280 63 6b 20 74 6f 20 73 65 65 20 69 66 20 66 6c 61  ck to see if fla
21290 74 74 65 6e 69 6e 67 20 69 73 20 70 65 72 6d 69  ttening is permi
212a0 74 74 65 64 2e 20 20 52 65 74 75 72 6e 20 30 20  tted.  Return 0 
212b0 69 66 20 6e 6f 74 2e 0a 20 20 2a 2f 0a 20 20 61  if not..  */.  a
212c0 73 73 65 72 74 28 20 70 21 3d 30 20 29 3b 0a 20  ssert( p!=0 );. 
212d0 20 61 73 73 65 72 74 28 20 70 2d 3e 70 50 72 69   assert( p->pPri
212e0 6f 72 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 4f  or==0 );.  if( O
212f0 70 74 69 6d 69 7a 61 74 69 6f 6e 44 69 73 61 62  ptimizationDisab
21300 6c 65 64 28 64 62 2c 20 53 51 4c 49 54 45 5f 51  led(db, SQLITE_Q
21310 75 65 72 79 46 6c 61 74 74 65 6e 65 72 29 20 29  ueryFlattener) )
21320 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 53 72   return 0;.  pSr
21330 63 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 61  c = p->pSrc;.  a
21340 73 73 65 72 74 28 20 70 53 72 63 20 26 26 20 69  ssert( pSrc && i
21350 46 72 6f 6d 3e 3d 30 20 26 26 20 69 46 72 6f 6d  From>=0 && iFrom
21360 3c 70 53 72 63 2d 3e 6e 53 72 63 20 29 3b 0a 20  <pSrc->nSrc );. 
21370 20 70 53 75 62 69 74 65 6d 20 3d 20 26 70 53 72   pSubitem = &pSr
21380 63 2d 3e 61 5b 69 46 72 6f 6d 5d 3b 0a 20 20 69  c->a[iFrom];.  i
21390 50 61 72 65 6e 74 20 3d 20 70 53 75 62 69 74 65  Parent = pSubite
213a0 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a 20 20 70 53  m->iCursor;.  pS
213b0 75 62 20 3d 20 70 53 75 62 69 74 65 6d 2d 3e 70  ub = pSubitem->p
213c0 53 65 6c 65 63 74 3b 0a 20 20 61 73 73 65 72 74  Select;.  assert
213d0 28 20 70 53 75 62 21 3d 30 20 29 3b 0a 0a 23 69  ( pSub!=0 );..#i
213e0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
213f0 54 5f 57 49 4e 44 4f 57 46 55 4e 43 0a 20 20 69  T_WINDOWFUNC.  i
21400 66 28 20 70 2d 3e 70 57 69 6e 20 7c 7c 20 70 53  f( p->pWin || pS
21410 75 62 2d 3e 70 57 69 6e 20 29 20 72 65 74 75 72  ub->pWin ) retur
21420 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  n 0;            
21430 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63        /* Restric
21440 74 69 6f 6e 20 28 32 35 29 20 2a 2f 0a 23 65 6e  tion (25) */.#en
21450 64 69 66 0a 0a 20 20 70 53 75 62 53 72 63 20 3d  dif..  pSubSrc =
21460 20 70 53 75 62 2d 3e 70 53 72 63 3b 0a 20 20 61   pSub->pSrc;.  a
21470 73 73 65 72 74 28 20 70 53 75 62 53 72 63 20 29  ssert( pSubSrc )
21480 3b 0a 20 20 2f 2a 20 50 72 69 6f 72 20 74 6f 20  ;.  /* Prior to 
21490 76 65 72 73 69 6f 6e 20 33 2e 31 2e 32 2c 20 77  version 3.1.2, w
214a0 68 65 6e 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46  hen LIMIT and OF
214b0 46 53 45 54 20 68 61 64 20 74 6f 20 62 65 20 73  FSET had to be s
214c0 69 6d 70 6c 65 20 63 6f 6e 73 74 61 6e 74 73 2c  imple constants,
214d0 0a 20 20 2a 2a 20 6e 6f 74 20 61 72 62 69 74 72  .  ** not arbitr
214e0 61 72 79 20 65 78 70 72 65 73 73 69 6f 6e 73 2c  ary expressions,
214f0 20 77 65 20 61 6c 6c 6f 77 65 64 20 73 6f 6d 65   we allowed some
21500 20 63 6f 6d 62 69 6e 69 6e 67 20 6f 66 20 4c 49   combining of LI
21510 4d 49 54 20 61 6e 64 20 4f 46 46 53 45 54 0a 20  MIT and OFFSET. 
21520 20 2a 2a 20 62 65 63 61 75 73 65 20 74 68 65 79   ** because they
21530 20 63 6f 75 6c 64 20 62 65 20 63 6f 6d 70 75 74   could be comput
21540 65 64 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69  ed at compile-ti
21550 6d 65 2e 20 20 42 75 74 20 77 68 65 6e 20 4c 49  me.  But when LI
21560 4d 49 54 20 61 6e 64 20 4f 46 46 53 45 54 0a 20  MIT and OFFSET. 
21570 20 2a 2a 20 62 65 63 61 6d 65 20 61 72 62 69 74   ** became arbit
21580 72 61 72 79 20 65 78 70 72 65 73 73 69 6f 6e 73  rary expressions
21590 2c 20 77 65 20 77 65 72 65 20 66 6f 72 63 65 64  , we were forced
215a0 20 74 6f 20 61 64 64 20 72 65 73 74 72 69 63 74   to add restrict
215b0 69 6f 6e 73 20 28 31 33 29 0a 20 20 2a 2a 20 61  ions (13).  ** a
215c0 6e 64 20 28 31 34 29 2e 20 2a 2f 0a 20 20 69 66  nd (14). */.  if
215d0 28 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20 26  ( pSub->pLimit &
215e0 26 20 70 2d 3e 70 4c 69 6d 69 74 20 29 20 72 65  & p->pLimit ) re
215f0 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20  turn 0;         
21600 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74       /* Restrict
21610 69 6f 6e 20 28 31 33 29 20 2a 2f 0a 20 20 69 66  ion (13) */.  if
21620 28 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20 26  ( pSub->pLimit &
21630 26 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74 2d 3e  & pSub->pLimit->
21640 70 52 69 67 68 74 20 29 20 72 65 74 75 72 6e 20  pRight ) return 
21650 30 3b 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74  0;   /* Restrict
21660 69 6f 6e 20 28 31 34 29 20 2a 2f 0a 20 20 69 66  ion (14) */.  if
21670 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26  ( (p->selFlags &
21680 20 53 46 5f 43 6f 6d 70 6f 75 6e 64 29 21 3d 30   SF_Compound)!=0
21690 20 26 26 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74   && pSub->pLimit
216a0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
216b0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
216c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
216d0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
216e0 52 65 73 74 72 69 63 74 69 6f 6e 20 28 31 35 29  Restriction (15)
216f0 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20 70 53   */.  }.  if( pS
21700 75 62 53 72 63 2d 3e 6e 53 72 63 3d 3d 30 20 29  ubSrc->nSrc==0 )
21710 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20   return 0;      
21720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21730 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20   /* Restriction 
21740 28 37 29 20 20 2a 2f 0a 20 20 69 66 28 20 70 53  (7)  */.  if( pS
21750 75 62 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53  ub->selFlags & S
21760 46 5f 44 69 73 74 69 6e 63 74 20 29 20 72 65 74  F_Distinct ) ret
21770 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20  urn 0;          
21780 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20   /* Restriction 
21790 28 34 29 20 20 2a 2f 0a 20 20 69 66 28 20 70 53  (4)  */.  if( pS
217a0 75 62 2d 3e 70 4c 69 6d 69 74 20 26 26 20 28 70  ub->pLimit && (p
217b0 53 72 63 2d 3e 6e 53 72 63 3e 31 20 7c 7c 20 69  Src->nSrc>1 || i
217c0 73 41 67 67 29 20 29 7b 0a 20 20 20 20 20 72 65  sAgg) ){.     re
217d0 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20  turn 0;         
217e0 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 73 20  /* Restrictions 
217f0 28 38 29 28 39 29 20 2a 2f 0a 20 20 7d 0a 20 20  (8)(9) */.  }.  
21800 69 66 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 20  if( p->pOrderBy 
21810 26 26 20 70 53 75 62 2d 3e 70 4f 72 64 65 72 42  && pSub->pOrderB
21820 79 20 29 7b 0a 20 20 20 20 20 72 65 74 75 72 6e  y ){.     return
21830 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
21840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
21860 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28 31 31   Restriction (11
21870 29 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20 69  ) */.  }.  if( i
21880 73 41 67 67 20 26 26 20 70 53 75 62 2d 3e 70 4f  sAgg && pSub->pO
21890 72 64 65 72 42 79 20 29 20 72 65 74 75 72 6e 20  rderBy ) return 
218a0 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
218b0 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e    /* Restriction
218c0 20 28 31 36 29 20 2a 2f 0a 20 20 69 66 28 20 70   (16) */.  if( p
218d0 53 75 62 2d 3e 70 4c 69 6d 69 74 20 26 26 20 70  Sub->pLimit && p
218e0 2d 3e 70 57 68 65 72 65 20 29 20 72 65 74 75 72  ->pWhere ) retur
218f0 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  n 0;            
21900 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e    /* Restriction
21910 20 28 31 39 29 20 2a 2f 0a 20 20 69 66 28 20 70   (19) */.  if( p
21920 53 75 62 2d 3e 70 4c 69 6d 69 74 20 26 26 20 28  Sub->pLimit && (
21930 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46  p->selFlags & SF
21940 5f 44 69 73 74 69 6e 63 74 29 21 3d 30 20 29 7b  _Distinct)!=0 ){
21950 0a 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20  .     return 0; 
21960 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72          /* Restr
21970 69 63 74 69 6f 6e 20 28 32 31 29 20 2a 2f 0a 20  iction (21) */. 
21980 20 7d 0a 20 20 69 66 28 20 70 53 75 62 2d 3e 73   }.  if( pSub->s
21990 65 6c 46 6c 61 67 73 20 26 20 28 53 46 5f 52 65  elFlags & (SF_Re
219a0 63 75 72 73 69 76 65 29 20 29 7b 0a 20 20 20 20  cursive) ){.    
219b0 72 65 74 75 72 6e 20 30 3b 20 2f 2a 20 52 65 73  return 0; /* Res
219c0 74 72 69 63 74 69 6f 6e 73 20 28 32 32 29 20 2a  trictions (22) *
219d0 2f 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a  /.  }..  /*.  **
219e0 20 49 66 20 74 68 65 20 73 75 62 71 75 65 72 79   If the subquery
219f0 20 69 73 20 74 68 65 20 72 69 67 68 74 20 6f 70   is the right op
21a00 65 72 61 6e 64 20 6f 66 20 61 20 4c 45 46 54 20  erand of a LEFT 
21a10 4a 4f 49 4e 2c 20 74 68 65 6e 20 74 68 65 0a 20  JOIN, then the. 
21a20 20 2a 2a 20 73 75 62 71 75 65 72 79 20 6d 61 79   ** subquery may
21a30 20 6e 6f 74 20 62 65 20 61 20 6a 6f 69 6e 20 69   not be a join i
21a40 74 73 65 6c 66 20 28 33 61 29 2e 20 45 78 61 6d  tself (3a). Exam
21a50 70 6c 65 20 6f 66 20 77 68 79 20 74 68 69 73 20  ple of why this 
21a60 69 73 20 6e 6f 74 0a 20 20 2a 2a 20 61 6c 6c 6f  is not.  ** allo
21a70 77 65 64 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  wed:.  **.  **  
21a80 20 20 20 20 20 20 20 74 31 20 4c 45 46 54 20 4f         t1 LEFT O
21a90 55 54 45 52 20 4a 4f 49 4e 20 28 74 32 20 4a 4f  UTER JOIN (t2 JO
21aa0 49 4e 20 74 33 29 0a 20 20 2a 2a 0a 20 20 2a 2a  IN t3).  **.  **
21ab0 20 49 66 20 77 65 20 66 6c 61 74 74 65 6e 20 74   If we flatten t
21ac0 68 65 20 61 62 6f 76 65 2c 20 77 65 20 77 6f 75  he above, we wou
21ad0 6c 64 20 67 65 74 0a 20 20 2a 2a 0a 20 20 2a 2a  ld get.  **.  **
21ae0 20 20 20 20 20 20 20 20 20 28 74 31 20 4c 45 46           (t1 LEF
21af0 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20 74 32 29  T OUTER JOIN t2)
21b00 20 4a 4f 49 4e 20 74 33 0a 20 20 2a 2a 0a 20 20   JOIN t3.  **.  
21b10 2a 2a 20 77 68 69 63 68 20 69 73 20 6e 6f 74 20  ** which is not 
21b20 61 74 20 61 6c 6c 20 74 68 65 20 73 61 6d 65 20  at all the same 
21b30 74 68 69 6e 67 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  thing..  **.  **
21b40 20 49 66 20 74 68 65 20 73 75 62 71 75 65 72 79   If the subquery
21b50 20 69 73 20 74 68 65 20 72 69 67 68 74 20 6f 70   is the right op
21b60 65 72 61 6e 64 20 6f 66 20 61 20 4c 45 46 54 20  erand of a LEFT 
21b70 4a 4f 49 4e 2c 20 74 68 65 6e 20 74 68 65 20 6f  JOIN, then the o
21b80 75 74 65 72 0a 20 20 2a 2a 20 71 75 65 72 79 20  uter.  ** query 
21b90 63 61 6e 6e 6f 74 20 62 65 20 61 6e 20 61 67 67  cannot be an agg
21ba0 72 65 67 61 74 65 2e 20 28 33 63 29 20 20 54 68  regate. (3c)  Th
21bb0 69 73 20 69 73 20 61 6e 20 61 72 74 69 66 61 63  is is an artifac
21bc0 74 20 6f 66 20 74 68 65 20 77 61 79 0a 20 20 2a  t of the way.  *
21bd0 2a 20 61 67 67 72 65 67 61 74 65 73 20 61 72 65  * aggregates are
21be0 20 70 72 6f 63 65 73 73 65 64 20 2d 20 74 68 65   processed - the
21bf0 72 65 20 69 73 20 6e 6f 20 6d 65 63 68 61 6e 69  re is no mechani
21c00 73 6d 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20  sm to determine 
21c10 69 66 0a 20 20 2a 2a 20 74 68 65 20 4c 45 46 54  if.  ** the LEFT
21c20 20 4a 4f 49 4e 20 74 61 62 6c 65 20 73 68 6f 75   JOIN table shou
21c30 6c 64 20 62 65 20 61 6c 6c 2d 4e 55 4c 4c 2e 0a  ld be all-NULL..
21c40 20 20 2a 2a 0a 20 20 2a 2a 20 53 65 65 20 61 6c    **.  ** See al
21c50 73 6f 20 74 69 63 6b 65 74 73 20 23 33 30 36 2c  so tickets #306,
21c60 20 23 33 35 30 2c 20 61 6e 64 20 23 33 33 30 30   #350, and #3300
21c70 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 70 53  ..  */.  if( (pS
21c80 75 62 69 74 65 6d 2d 3e 66 67 2e 6a 6f 69 6e 74  ubitem->fg.joint
21c90 79 70 65 20 26 20 4a 54 5f 4f 55 54 45 52 29 21  ype & JT_OUTER)!
21ca0 3d 30 20 29 7b 0a 20 20 20 20 69 73 4c 65 66 74  =0 ){.    isLeft
21cb0 4a 6f 69 6e 20 3d 20 31 3b 0a 20 20 20 20 69 66  Join = 1;.    if
21cc0 28 20 70 53 75 62 53 72 63 2d 3e 6e 53 72 63 3e  ( pSubSrc->nSrc>
21cd0 31 20 7c 7c 20 69 73 41 67 67 20 7c 7c 20 49 73  1 || isAgg || Is
21ce0 56 69 72 74 75 61 6c 28 70 53 75 62 53 72 63 2d  Virtual(pSubSrc-
21cf0 3e 61 5b 30 5d 2e 70 54 61 62 29 20 29 7b 0a 20  >a[0].pTab) ){. 
21d00 20 20 20 20 20 2f 2a 20 20 28 33 61 29 20 20 20       /*  (3a)   
21d10 20 20 20 20 20 20 20 20 20 20 28 33 63 29 20 20            (3c)  
21d20 20 20 20 28 33 62 29 20 2a 2f 0a 20 20 20 20 20     (3b) */.     
21d30 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d   return 0;.    }
21d40 0a 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49  .  }.#ifdef SQLI
21d50 54 45 5f 45 58 54 52 41 5f 49 46 4e 55 4c 4c 52  TE_EXTRA_IFNULLR
21d60 4f 57 0a 20 20 65 6c 73 65 20 69 66 28 20 69 46  OW.  else if( iF
21d70 72 6f 6d 3e 30 20 26 26 20 21 69 73 41 67 67 20  rom>0 && !isAgg 
21d80 29 7b 0a 20 20 20 20 2f 2a 20 53 65 74 74 69 6e  ){.    /* Settin
21d90 67 20 69 73 4c 65 66 74 4a 6f 69 6e 20 74 6f 20  g isLeftJoin to 
21da0 2d 31 20 63 61 75 73 65 73 20 4f 50 5f 49 66 4e  -1 causes OP_IfN
21db0 75 6c 6c 52 6f 77 20 6f 70 63 6f 64 65 73 20 74  ullRow opcodes t
21dc0 6f 20 62 65 20 67 65 6e 65 72 61 74 65 64 20 66  o be generated f
21dd0 6f 72 0a 20 20 20 20 2a 2a 20 65 76 65 72 79 20  or.    ** every 
21de0 72 65 66 65 72 65 6e 63 65 20 74 6f 20 61 6e 79  reference to any
21df0 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 20 66   result column f
21e00 72 6f 6d 20 73 75 62 71 75 65 72 79 20 69 6e 20  rom subquery in 
21e10 61 20 6a 6f 69 6e 2c 20 65 76 65 6e 0a 20 20 20  a join, even.   
21e20 20 2a 2a 20 74 68 6f 75 67 68 20 74 68 65 79 20   ** though they 
21e30 61 72 65 20 6e 6f 74 20 6e 65 63 65 73 73 61 72  are not necessar
21e40 79 2e 20 20 54 68 69 73 20 77 69 6c 6c 20 73 74  y.  This will st
21e50 72 65 73 73 2d 74 65 73 74 20 74 68 65 20 4f 50  ress-test the OP
21e60 5f 49 66 4e 75 6c 6c 52 6f 77 20 0a 20 20 20 20  _IfNullRow .    
21e70 2a 2a 20 6f 70 63 6f 64 65 2e 20 2a 2f 0a 20 20  ** opcode. */.  
21e80 20 20 69 73 4c 65 66 74 4a 6f 69 6e 20 3d 20 2d    isLeftJoin = -
21e90 31 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  1;.  }.#endif.. 
21ea0 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20   /* Restriction 
21eb0 28 31 37 29 3a 20 49 66 20 74 68 65 20 73 75 62  (17): If the sub
21ec0 2d 71 75 65 72 79 20 69 73 20 61 20 63 6f 6d 70  -query is a comp
21ed0 6f 75 6e 64 20 53 45 4c 45 43 54 2c 20 74 68 65  ound SELECT, the
21ee0 6e 20 69 74 20 6d 75 73 74 0a 20 20 2a 2a 20 75  n it must.  ** u
21ef0 73 65 20 6f 6e 6c 79 20 74 68 65 20 55 4e 49 4f  se only the UNIO
21f00 4e 20 41 4c 4c 20 6f 70 65 72 61 74 6f 72 2e 20  N ALL operator. 
21f10 41 6e 64 20 6e 6f 6e 65 20 6f 66 20 74 68 65 20  And none of the 
21f20 73 69 6d 70 6c 65 20 73 65 6c 65 63 74 20 71 75  simple select qu
21f30 65 72 69 65 73 0a 20 20 2a 2a 20 74 68 61 74 20  eries.  ** that 
21f40 6d 61 6b 65 20 75 70 20 74 68 65 20 63 6f 6d 70  make up the comp
21f50 6f 75 6e 64 20 53 45 4c 45 43 54 20 61 72 65 20  ound SELECT are 
21f60 61 6c 6c 6f 77 65 64 20 74 6f 20 62 65 20 61 67  allowed to be ag
21f70 67 72 65 67 61 74 65 20 6f 72 20 64 69 73 74 69  gregate or disti
21f80 6e 63 74 0a 20 20 2a 2a 20 71 75 65 72 69 65 73  nct.  ** queries
21f90 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 53 75  ..  */.  if( pSu
21fa0 62 2d 3e 70 50 72 69 6f 72 20 29 7b 0a 20 20 20  b->pPrior ){.   
21fb0 20 69 66 28 20 70 53 75 62 2d 3e 70 4f 72 64 65   if( pSub->pOrde
21fc0 72 42 79 20 29 7b 0a 20 20 20 20 20 20 72 65 74  rBy ){.      ret
21fd0 75 72 6e 20 30 3b 20 20 2f 2a 20 52 65 73 74 72  urn 0;  /* Restr
21fe0 69 63 74 69 6f 6e 20 28 32 30 29 20 2a 2f 0a 20  iction (20) */. 
21ff0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 73 41     }.    if( isA
22000 67 67 20 7c 7c 20 28 70 2d 3e 73 65 6c 46 6c 61  gg || (p->selFla
22010 67 73 20 26 20 53 46 5f 44 69 73 74 69 6e 63 74  gs & SF_Distinct
22020 29 21 3d 30 20 7c 7c 20 70 53 72 63 2d 3e 6e 53  )!=0 || pSrc->nS
22030 72 63 21 3d 31 20 29 7b 0a 20 20 20 20 20 20 72  rc!=1 ){.      r
22040 65 74 75 72 6e 20 30 3b 20 2f 2a 20 28 31 37 64  eturn 0; /* (17d
22050 31 29 2c 20 28 31 37 64 32 29 2c 20 6f 72 20 28  1), (17d2), or (
22060 31 37 64 33 29 20 2a 2f 0a 20 20 20 20 7d 0a 20  17d3) */.    }. 
22070 20 20 20 66 6f 72 28 70 53 75 62 31 3d 70 53 75     for(pSub1=pSu
22080 62 3b 20 70 53 75 62 31 3b 20 70 53 75 62 31 3d  b; pSub1; pSub1=
22090 70 53 75 62 31 2d 3e 70 50 72 69 6f 72 29 7b 0a  pSub1->pPrior){.
220a0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
220b0 28 70 53 75 62 31 2d 3e 73 65 6c 46 6c 61 67 73  (pSub1->selFlags
220c0 20 26 20 28 53 46 5f 44 69 73 74 69 6e 63 74 7c   & (SF_Distinct|
220d0 53 46 5f 41 67 67 72 65 67 61 74 65 29 29 3d 3d  SF_Aggregate))==
220e0 53 46 5f 44 69 73 74 69 6e 63 74 20 29 3b 0a 20  SF_Distinct );. 
220f0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 28       testcase( (
22100 70 53 75 62 31 2d 3e 73 65 6c 46 6c 61 67 73 20  pSub1->selFlags 
22110 26 20 28 53 46 5f 44 69 73 74 69 6e 63 74 7c 53  & (SF_Distinct|S
22120 46 5f 41 67 67 72 65 67 61 74 65 29 29 3d 3d 53  F_Aggregate))==S
22130 46 5f 41 67 67 72 65 67 61 74 65 20 29 3b 0a 20  F_Aggregate );. 
22140 20 20 20 20 20 61 73 73 65 72 74 28 20 70 53 75       assert( pSu
22150 62 2d 3e 70 53 72 63 21 3d 30 20 29 3b 0a 20 20  b->pSrc!=0 );.  
22160 20 20 20 20 61 73 73 65 72 74 28 20 70 53 75 62      assert( pSub
22170 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3d  ->pEList->nExpr=
22180 3d 70 53 75 62 31 2d 3e 70 45 4c 69 73 74 2d 3e  =pSub1->pEList->
22190 6e 45 78 70 72 20 29 3b 0a 20 20 20 20 20 20 69  nExpr );.      i
221a0 66 28 20 28 70 53 75 62 31 2d 3e 73 65 6c 46 6c  f( (pSub1->selFl
221b0 61 67 73 20 26 20 28 53 46 5f 44 69 73 74 69 6e  ags & (SF_Distin
221c0 63 74 7c 53 46 5f 41 67 67 72 65 67 61 74 65 29  ct|SF_Aggregate)
221d0 29 21 3d 30 20 20 20 20 2f 2a 20 28 31 37 62 29  )!=0    /* (17b)
221e0 20 2a 2f 0a 20 20 20 20 20 20 20 7c 7c 20 28 70   */.       || (p
221f0 53 75 62 31 2d 3e 70 50 72 69 6f 72 20 26 26 20  Sub1->pPrior && 
22200 70 53 75 62 31 2d 3e 6f 70 21 3d 54 4b 5f 41 4c  pSub1->op!=TK_AL
22210 4c 29 20 20 20 20 20 20 20 20 20 20 20 20 20 20  L)              
22220 20 20 20 2f 2a 20 28 31 37 61 29 20 2a 2f 0a 20     /* (17a) */. 
22230 20 20 20 20 20 20 7c 7c 20 70 53 75 62 31 2d 3e        || pSub1->
22240 70 53 72 63 2d 3e 6e 53 72 63 3c 31 20 20 20 20  pSrc->nSrc<1    
22250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
22270 20 28 31 37 63 29 20 2a 2f 0a 20 20 20 20 20 20   (17c) */.      
22280 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
22290 6e 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  n 0;.      }.   
222a0 20 20 20 74 65 73 74 63 61 73 65 28 20 70 53 75     testcase( pSu
222b0 62 31 2d 3e 70 53 72 63 2d 3e 6e 53 72 63 3e 31  b1->pSrc->nSrc>1
222c0 20 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f   );.    }..    /
222d0 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28 31  * Restriction (1
222e0 38 29 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70  8). */.    if( p
222f0 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20  ->pOrderBy ){.  
22300 20 20 20 20 69 6e 74 20 69 69 3b 0a 20 20 20 20      int ii;.    
22310 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70    for(ii=0; ii<p
22320 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70  ->pOrderBy->nExp
22330 72 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20  r; ii++){.      
22340 20 20 69 66 28 20 70 2d 3e 70 4f 72 64 65 72 42    if( p->pOrderB
22350 79 2d 3e 61 5b 69 69 5d 2e 75 2e 78 2e 69 4f 72  y->a[ii].u.x.iOr
22360 64 65 72 42 79 43 6f 6c 3d 3d 30 20 29 20 72 65  derByCol==0 ) re
22370 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d 0a  turn 0;.      }.
22380 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
22390 45 78 2d 72 65 73 74 72 69 63 74 69 6f 6e 20 28  Ex-restriction (
223a0 32 33 29 3a 0a 20 20 2a 2a 20 54 68 65 20 6f 6e  23):.  ** The on
223b0 6c 79 20 77 61 79 20 74 68 61 74 20 74 68 65 20  ly way that the 
223c0 72 65 63 75 72 73 69 76 65 20 70 61 72 74 20 6f  recursive part o
223d0 66 20 61 20 43 54 45 20 63 61 6e 20 63 6f 6e 74  f a CTE can cont
223e0 61 69 6e 20 61 20 63 6f 6d 70 6f 75 6e 64 0a 20  ain a compound. 
223f0 20 2a 2a 20 73 75 62 71 75 65 72 79 20 69 73 20   ** subquery is 
22400 66 6f 72 20 74 68 65 20 73 75 62 71 75 65 72 79  for the subquery
22410 20 74 6f 20 62 65 20 6f 6e 65 20 74 65 72 6d 20   to be one term 
22420 6f 66 20 61 20 6a 6f 69 6e 2e 20 20 42 75 74 20  of a join.  But 
22430 69 66 20 74 68 65 0a 20 20 2a 2a 20 73 75 62 71  if the.  ** subq
22440 75 65 72 79 20 69 73 20 61 20 6a 6f 69 6e 2c 20  uery is a join, 
22450 74 68 65 6e 20 74 68 65 20 66 6c 61 74 74 65 6e  then the flatten
22460 69 6e 67 20 68 61 73 20 61 6c 72 65 61 64 79 20  ing has already 
22470 62 65 65 6e 20 73 74 6f 70 70 65 64 20 62 79 0a  been stopped by.
22480 20 20 2a 2a 20 72 65 73 74 72 69 63 74 69 6f 6e    ** restriction
22490 20 28 31 37 64 33 29 0a 20 20 2a 2f 0a 20 20 61   (17d3).  */.  a
224a0 73 73 65 72 74 28 20 28 70 2d 3e 73 65 6c 46 6c  ssert( (p->selFl
224b0 61 67 73 20 26 20 53 46 5f 52 65 63 75 72 73 69  ags & SF_Recursi
224c0 76 65 29 3d 3d 30 20 7c 7c 20 70 53 75 62 2d 3e  ve)==0 || pSub->
224d0 70 50 72 69 6f 72 3d 3d 30 20 29 3b 0a 0a 20 20  pPrior==0 );..  
224e0 2f 2a 2a 2a 2a 2a 20 49 66 20 77 65 20 72 65 61  /***** If we rea
224f0 63 68 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 66  ch this point, f
22500 6c 61 74 74 65 6e 69 6e 67 20 69 73 20 70 65 72  lattening is per
22510 6d 69 74 74 65 64 2e 20 2a 2a 2a 2a 2a 2f 0a 20  mitted. *****/. 
22520 20 53 45 4c 45 43 54 54 52 41 43 45 28 31 2c 70   SELECTTRACE(1,p
22530 50 61 72 73 65 2c 70 2c 28 22 66 6c 61 74 74 65  Parse,p,("flatte
22540 6e 20 25 75 2e 25 70 20 66 72 6f 6d 20 74 65 72  n %u.%p from ter
22550 6d 20 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20  m %d\n",.       
22560 20 20 20 20 20 20 20 20 20 20 20 20 70 53 75 62              pSub
22570 2d 3e 73 65 6c 49 64 2c 20 70 53 75 62 2c 20 69  ->selId, pSub, i
22580 46 72 6f 6d 29 29 3b 0a 0a 20 20 2f 2a 20 41 75  From));..  /* Au
22590 74 68 6f 72 69 7a 65 20 74 68 65 20 73 75 62 71  thorize the subq
225a0 75 65 72 79 20 2a 2f 0a 20 20 70 50 61 72 73 65  uery */.  pParse
225b0 2d 3e 7a 41 75 74 68 43 6f 6e 74 65 78 74 20 3d  ->zAuthContext =
225c0 20 70 53 75 62 69 74 65 6d 2d 3e 7a 4e 61 6d 65   pSubitem->zName
225d0 3b 0a 20 20 54 45 53 54 4f 4e 4c 59 28 69 20 3d  ;.  TESTONLY(i =
225e0 29 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65  ) sqlite3AuthChe
225f0 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54  ck(pParse, SQLIT
22600 45 5f 53 45 4c 45 43 54 2c 20 30 2c 20 30 2c 20  E_SELECT, 0, 0, 
22610 30 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20  0);.  testcase( 
22620 69 3d 3d 53 51 4c 49 54 45 5f 44 45 4e 59 20 29  i==SQLITE_DENY )
22630 3b 0a 20 20 70 50 61 72 73 65 2d 3e 7a 41 75 74  ;.  pParse->zAut
22640 68 43 6f 6e 74 65 78 74 20 3d 20 7a 53 61 76 65  hContext = zSave
22650 64 41 75 74 68 43 6f 6e 74 65 78 74 3b 0a 0a 20  dAuthContext;.. 
22660 20 2f 2a 20 49 66 20 74 68 65 20 73 75 62 2d 71   /* If the sub-q
22670 75 65 72 79 20 69 73 20 61 20 63 6f 6d 70 6f 75  uery is a compou
22680 6e 64 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  nd SELECT statem
22690 65 6e 74 2c 20 74 68 65 6e 20 28 62 79 20 72 65  ent, then (by re
226a0 73 74 72 69 63 74 69 6f 6e 73 0a 20 20 2a 2a 20  strictions.  ** 
226b0 31 37 20 61 6e 64 20 31 38 20 61 62 6f 76 65 29  17 and 18 above)
226c0 20 69 74 20 6d 75 73 74 20 62 65 20 61 20 55 4e   it must be a UN
226d0 49 4f 4e 20 41 4c 4c 20 61 6e 64 20 74 68 65 20  ION ALL and the 
226e0 70 61 72 65 6e 74 20 71 75 65 72 79 20 6d 75 73  parent query mus
226f0 74 20 0a 20 20 2a 2a 20 62 65 20 6f 66 20 74 68  t .  ** be of th
22700 65 20 66 6f 72 6d 3a 0a 20 20 2a 2a 0a 20 20 2a  e form:.  **.  *
22710 2a 20 20 20 20 20 53 45 4c 45 43 54 20 3c 65 78  *     SELECT <ex
22720 70 72 2d 6c 69 73 74 3e 20 46 52 4f 4d 20 28 3c  pr-list> FROM (<
22730 73 75 62 2d 71 75 65 72 79 3e 29 20 3c 77 68 65  sub-query>) <whe
22740 72 65 2d 63 6c 61 75 73 65 3e 20 0a 20 20 2a 2a  re-clause> .  **
22750 0a 20 20 2a 2a 20 66 6f 6c 6c 6f 77 65 64 20 62  .  ** followed b
22760 79 20 61 6e 79 20 4f 52 44 45 52 20 42 59 2c 20  y any ORDER BY, 
22770 4c 49 4d 49 54 20 61 6e 64 2f 6f 72 20 4f 46 46  LIMIT and/or OFF
22780 53 45 54 20 63 6c 61 75 73 65 73 2e 20 54 68 69  SET clauses. Thi
22790 73 20 62 6c 6f 63 6b 0a 20 20 2a 2a 20 63 72 65  s block.  ** cre
227a0 61 74 65 73 20 4e 2d 31 20 63 6f 70 69 65 73 20  ates N-1 copies 
227b0 6f 66 20 74 68 65 20 70 61 72 65 6e 74 20 71 75  of the parent qu
227c0 65 72 79 20 77 69 74 68 6f 75 74 20 61 6e 79 20  ery without any 
227d0 4f 52 44 45 52 20 42 59 2c 20 4c 49 4d 49 54 20  ORDER BY, LIMIT 
227e0 6f 72 20 0a 20 20 2a 2a 20 4f 46 46 53 45 54 20  or .  ** OFFSET 
227f0 63 6c 61 75 73 65 73 20 61 6e 64 20 6a 6f 69 6e  clauses and join
22800 73 20 74 68 65 6d 20 74 6f 20 74 68 65 20 6c 65  s them to the le
22810 66 74 2d 68 61 6e 64 2d 73 69 64 65 20 6f 66 20  ft-hand-side of 
22820 74 68 65 20 6f 72 69 67 69 6e 61 6c 0a 20 20 2a  the original.  *
22830 2a 20 75 73 69 6e 67 20 55 4e 49 4f 4e 20 41 4c  * using UNION AL
22840 4c 20 6f 70 65 72 61 74 6f 72 73 2e 20 49 6e 20  L operators. In 
22850 74 68 69 73 20 63 61 73 65 20 4e 20 69 73 20 74  this case N is t
22860 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 73 69 6d  he number of sim
22870 70 6c 65 0a 20 20 2a 2a 20 73 65 6c 65 63 74 20  ple.  ** select 
22880 73 74 61 74 65 6d 65 6e 74 73 20 69 6e 20 74 68  statements in th
22890 65 20 63 6f 6d 70 6f 75 6e 64 20 73 75 62 2d 71  e compound sub-q
228a0 75 65 72 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  uery..  **.  ** 
228b0 45 78 61 6d 70 6c 65 3a 0a 20 20 2a 2a 0a 20 20  Example:.  **.  
228c0 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 61 2b  **     SELECT a+
228d0 31 20 46 52 4f 4d 20 28 0a 20 20 2a 2a 20 20 20  1 FROM (.  **   
228e0 20 20 20 20 20 53 45 4c 45 43 54 20 78 20 46 52       SELECT x FR
228f0 4f 4d 20 74 61 62 0a 20 20 2a 2a 20 20 20 20 20  OM tab.  **     
22900 20 20 20 55 4e 49 4f 4e 20 41 4c 4c 0a 20 20 2a     UNION ALL.  *
22910 2a 20 20 20 20 20 20 20 20 53 45 4c 45 43 54 20  *        SELECT 
22920 79 20 46 52 4f 4d 20 74 61 62 0a 20 20 2a 2a 20  y FROM tab.  ** 
22930 20 20 20 20 20 20 20 55 4e 49 4f 4e 20 41 4c 4c         UNION ALL
22940 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 53 45 4c  .  **        SEL
22950 45 43 54 20 61 62 73 28 7a 2a 32 29 20 46 52 4f  ECT abs(z*2) FRO
22960 4d 20 74 61 62 32 0a 20 20 2a 2a 20 20 20 20 20  M tab2.  **     
22970 29 20 57 48 45 52 45 20 61 21 3d 35 20 4f 52 44  ) WHERE a!=5 ORD
22980 45 52 20 42 59 20 31 0a 20 20 2a 2a 0a 20 20 2a  ER BY 1.  **.  *
22990 2a 20 54 72 61 6e 73 66 6f 72 6d 65 64 20 69 6e  * Transformed in
229a0 74 6f 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  to:.  **.  **   
229b0 20 20 53 45 4c 45 43 54 20 78 2b 31 20 46 52 4f    SELECT x+1 FRO
229c0 4d 20 74 61 62 20 57 48 45 52 45 20 78 2b 31 21  M tab WHERE x+1!
229d0 3d 35 0a 20 20 2a 2a 20 20 20 20 20 55 4e 49 4f  =5.  **     UNIO
229e0 4e 20 41 4c 4c 0a 20 20 2a 2a 20 20 20 20 20 53  N ALL.  **     S
229f0 45 4c 45 43 54 20 79 2b 31 20 46 52 4f 4d 20 74  ELECT y+1 FROM t
22a00 61 62 20 57 48 45 52 45 20 79 2b 31 21 3d 35 0a  ab WHERE y+1!=5.
22a10 20 20 2a 2a 20 20 20 20 20 55 4e 49 4f 4e 20 41    **     UNION A
22a20 4c 4c 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c 45  LL.  **     SELE
22a30 43 54 20 61 62 73 28 7a 2a 32 29 2b 31 20 46 52  CT abs(z*2)+1 FR
22a40 4f 4d 20 74 61 62 32 20 57 48 45 52 45 20 61 62  OM tab2 WHERE ab
22a50 73 28 7a 2a 32 29 2b 31 21 3d 35 0a 20 20 2a 2a  s(z*2)+1!=5.  **
22a60 20 20 20 20 20 4f 52 44 45 52 20 42 59 20 31 0a       ORDER BY 1.
22a70 20 20 2a 2a 0a 20 20 2a 2a 20 57 65 20 63 61 6c    **.  ** We cal
22a80 6c 20 74 68 69 73 20 74 68 65 20 22 63 6f 6d 70  l this the "comp
22a90 6f 75 6e 64 2d 73 75 62 71 75 65 72 79 20 66 6c  ound-subquery fl
22aa0 61 74 74 65 6e 69 6e 67 22 2e 0a 20 20 2a 2f 0a  attening"..  */.
22ab0 20 20 66 6f 72 28 70 53 75 62 3d 70 53 75 62 2d    for(pSub=pSub-
22ac0 3e 70 50 72 69 6f 72 3b 20 70 53 75 62 3b 20 70  >pPrior; pSub; p
22ad0 53 75 62 3d 70 53 75 62 2d 3e 70 50 72 69 6f 72  Sub=pSub->pPrior
22ae0 29 7b 0a 20 20 20 20 53 65 6c 65 63 74 20 2a 70  ){.    Select *p
22af0 4e 65 77 3b 0a 20 20 20 20 45 78 70 72 4c 69 73  New;.    ExprLis
22b00 74 20 2a 70 4f 72 64 65 72 42 79 20 3d 20 70 2d  t *pOrderBy = p-
22b10 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 20 20 45  >pOrderBy;.    E
22b20 78 70 72 20 2a 70 4c 69 6d 69 74 20 3d 20 70 2d  xpr *pLimit = p-
22b30 3e 70 4c 69 6d 69 74 3b 0a 20 20 20 20 53 65 6c  >pLimit;.    Sel
22b40 65 63 74 20 2a 70 50 72 69 6f 72 20 3d 20 70 2d  ect *pPrior = p-
22b50 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 70 2d 3e  >pPrior;.    p->
22b60 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20  pOrderBy = 0;.  
22b70 20 20 70 2d 3e 70 53 72 63 20 3d 20 30 3b 0a 20    p->pSrc = 0;. 
22b80 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30     p->pPrior = 0
22b90 3b 0a 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20  ;.    p->pLimit 
22ba0 3d 20 30 3b 0a 20 20 20 20 70 4e 65 77 20 3d 20  = 0;.    pNew = 
22bb0 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70  sqlite3SelectDup
22bc0 28 64 62 2c 20 70 2c 20 30 29 3b 0a 20 20 20 20  (db, p, 0);.    
22bd0 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 70 4c 69 6d  p->pLimit = pLim
22be0 69 74 3b 0a 20 20 20 20 70 2d 3e 70 4f 72 64 65  it;.    p->pOrde
22bf0 72 42 79 20 3d 20 70 4f 72 64 65 72 42 79 3b 0a  rBy = pOrderBy;.
22c00 20 20 20 20 70 2d 3e 70 53 72 63 20 3d 20 70 53      p->pSrc = pS
22c10 72 63 3b 0a 20 20 20 20 70 2d 3e 6f 70 20 3d 20  rc;.    p->op = 
22c20 54 4b 5f 41 4c 4c 3b 0a 20 20 20 20 69 66 28 20  TK_ALL;.    if( 
22c30 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20  pNew==0 ){.     
22c40 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50 72   p->pPrior = pPr
22c50 69 6f 72 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ior;.    }else{.
22c60 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 50 72 69        pNew->pPri
22c70 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20  or = pPrior;.   
22c80 20 20 20 69 66 28 20 70 50 72 69 6f 72 20 29 20     if( pPrior ) 
22c90 70 50 72 69 6f 72 2d 3e 70 4e 65 78 74 20 3d 20  pPrior->pNext = 
22ca0 70 4e 65 77 3b 0a 20 20 20 20 20 20 70 4e 65 77  pNew;.      pNew
22cb0 2d 3e 70 4e 65 78 74 20 3d 20 70 3b 0a 20 20 20  ->pNext = p;.   
22cc0 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70     p->pPrior = p
22cd0 4e 65 77 3b 0a 20 20 20 20 20 20 53 45 4c 45 43  New;.      SELEC
22ce0 54 54 52 41 43 45 28 32 2c 70 50 61 72 73 65 2c  TTRACE(2,pParse,
22cf0 70 2c 28 22 63 6f 6d 70 6f 75 6e 64 2d 73 75 62  p,("compound-sub
22d00 71 75 65 72 79 20 66 6c 61 74 74 65 6e 65 72 22  query flattener"
22d10 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
22d20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
22d30 20 63 72 65 61 74 65 73 20 25 75 20 61 73 20 70   creates %u as p
22d40 65 65 72 5c 6e 22 2c 70 4e 65 77 2d 3e 73 65 6c  eer\n",pNew->sel
22d50 49 64 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Id));.    }.    
22d60 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
22d70 69 6c 65 64 20 29 20 72 65 74 75 72 6e 20 31 3b  iled ) return 1;
22d80 0a 20 20 7d 0a 0a 20 20 2f 2a 20 42 65 67 69 6e  .  }..  /* Begin
22d90 20 66 6c 61 74 74 65 6e 69 6e 67 20 74 68 65 20   flattening the 
22da0 69 46 72 6f 6d 2d 74 68 20 65 6e 74 72 79 20 6f  iFrom-th entry o
22db0 66 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  f the FROM claus
22dc0 65 20 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20 6f  e .  ** in the o
22dd0 75 74 65 72 20 71 75 65 72 79 2e 0a 20 20 2a 2f  uter query..  */
22de0 0a 20 20 70 53 75 62 20 3d 20 70 53 75 62 31 20  .  pSub = pSub1 
22df0 3d 20 70 53 75 62 69 74 65 6d 2d 3e 70 53 65 6c  = pSubitem->pSel
22e00 65 63 74 3b 0a 0a 20 20 2f 2a 20 44 65 6c 65 74  ect;..  /* Delet
22e10 65 20 74 68 65 20 74 72 61 6e 73 69 65 6e 74 20  e the transient 
22e20 74 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 20  table structure 
22e30 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
22e40 74 68 65 0a 20 20 2a 2a 20 73 75 62 71 75 65 72  the.  ** subquer
22e50 79 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  y.  */.  sqlite3
22e60 44 62 46 72 65 65 28 64 62 2c 20 70 53 75 62 69  DbFree(db, pSubi
22e70 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65 29 3b  tem->zDatabase);
22e80 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
22e90 28 64 62 2c 20 70 53 75 62 69 74 65 6d 2d 3e 7a  (db, pSubitem->z
22ea0 4e 61 6d 65 29 3b 0a 20 20 73 71 6c 69 74 65 33  Name);.  sqlite3
22eb0 44 62 46 72 65 65 28 64 62 2c 20 70 53 75 62 69  DbFree(db, pSubi
22ec0 74 65 6d 2d 3e 7a 41 6c 69 61 73 29 3b 0a 20 20  tem->zAlias);.  
22ed0 70 53 75 62 69 74 65 6d 2d 3e 7a 44 61 74 61 62  pSubitem->zDatab
22ee0 61 73 65 20 3d 20 30 3b 0a 20 20 70 53 75 62 69  ase = 0;.  pSubi
22ef0 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 30 3b 0a  tem->zName = 0;.
22f00 20 20 70 53 75 62 69 74 65 6d 2d 3e 7a 41 6c 69    pSubitem->zAli
22f10 61 73 20 3d 20 30 3b 0a 20 20 70 53 75 62 69 74  as = 0;.  pSubit
22f20 65 6d 2d 3e 70 53 65 6c 65 63 74 20 3d 20 30 3b  em->pSelect = 0;
22f30 0a 0a 20 20 2f 2a 20 44 65 66 65 72 20 64 65 6c  ..  /* Defer del
22f40 65 74 69 6e 67 20 74 68 65 20 54 61 62 6c 65 20  eting the Table 
22f50 6f 62 6a 65 63 74 20 61 73 73 6f 63 69 61 74 65  object associate
22f60 64 20 77 69 74 68 20 74 68 65 0a 20 20 2a 2a 20  d with the.  ** 
22f70 73 75 62 71 75 65 72 79 20 75 6e 74 69 6c 20 63  subquery until c
22f80 6f 64 65 20 67 65 6e 65 72 61 74 69 6f 6e 20 69  ode generation i
22f90 73 0a 20 20 2a 2a 20 63 6f 6d 70 6c 65 74 65 2c  s.  ** complete,
22fa0 20 73 69 6e 63 65 20 74 68 65 72 65 20 6d 61 79   since there may
22fb0 20 73 74 69 6c 6c 20 65 78 69 73 74 20 45 78 70   still exist Exp
22fc0 72 2e 70 54 61 62 20 65 6e 74 72 69 65 73 20 74  r.pTab entries t
22fd0 68 61 74 0a 20 20 2a 2a 20 72 65 66 65 72 20 74  hat.  ** refer t
22fe0 6f 20 74 68 65 20 73 75 62 71 75 65 72 79 20 65  o the subquery e
22ff0 76 65 6e 20 61 66 74 65 72 20 66 6c 61 74 74 65  ven after flatte
23000 6e 69 6e 67 2e 20 20 54 69 63 6b 65 74 20 23 33  ning.  Ticket #3
23010 33 34 36 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 70  346..  **.  ** p
23020 53 75 62 69 74 65 6d 2d 3e 70 54 61 62 20 69 73  Subitem->pTab is
23030 20 61 6c 77 61 79 73 20 6e 6f 6e 2d 4e 55 4c 4c   always non-NULL
23040 20 62 79 20 74 65 73 74 20 72 65 73 74 72 69 63   by test restric
23050 74 69 6f 6e 73 20 61 6e 64 20 74 65 73 74 73 20  tions and tests 
23060 61 62 6f 76 65 2e 0a 20 20 2a 2f 0a 20 20 69 66  above..  */.  if
23070 28 20 41 4c 57 41 59 53 28 70 53 75 62 69 74 65  ( ALWAYS(pSubite
23080 6d 2d 3e 70 54 61 62 21 3d 30 29 20 29 7b 0a 20  m->pTab!=0) ){. 
23090 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 54 6f     Table *pTabTo
230a0 44 65 6c 20 3d 20 70 53 75 62 69 74 65 6d 2d 3e  Del = pSubitem->
230b0 70 54 61 62 3b 0a 20 20 20 20 69 66 28 20 70 54  pTab;.    if( pT
230c0 61 62 54 6f 44 65 6c 2d 3e 6e 54 61 62 52 65 66  abToDel->nTabRef
230d0 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 50 61 72  ==1 ){.      Par
230e0 73 65 20 2a 70 54 6f 70 6c 65 76 65 6c 20 3d 20  se *pToplevel = 
230f0 73 71 6c 69 74 65 33 50 61 72 73 65 54 6f 70 6c  sqlite3ParseTopl
23100 65 76 65 6c 28 70 50 61 72 73 65 29 3b 0a 20 20  evel(pParse);.  
23110 20 20 20 20 70 54 61 62 54 6f 44 65 6c 2d 3e 70      pTabToDel->p
23120 4e 65 78 74 5a 6f 6d 62 69 65 20 3d 20 70 54 6f  NextZombie = pTo
23130 70 6c 65 76 65 6c 2d 3e 70 5a 6f 6d 62 69 65 54  plevel->pZombieT
23140 61 62 3b 0a 20 20 20 20 20 20 70 54 6f 70 6c 65  ab;.      pTople
23150 76 65 6c 2d 3e 70 5a 6f 6d 62 69 65 54 61 62 20  vel->pZombieTab 
23160 3d 20 70 54 61 62 54 6f 44 65 6c 3b 0a 20 20 20  = pTabToDel;.   
23170 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 54   }else{.      pT
23180 61 62 54 6f 44 65 6c 2d 3e 6e 54 61 62 52 65 66  abToDel->nTabRef
23190 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 53  --;.    }.    pS
231a0 75 62 69 74 65 6d 2d 3e 70 54 61 62 20 3d 20 30  ubitem->pTab = 0
231b0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20  ;.  }..  /* The 
231c0 66 6f 6c 6c 6f 77 69 6e 67 20 6c 6f 6f 70 20 72  following loop r
231d0 75 6e 73 20 6f 6e 63 65 20 66 6f 72 20 65 61 63  uns once for eac
231e0 68 20 74 65 72 6d 20 69 6e 20 61 20 63 6f 6d 70  h term in a comp
231f0 6f 75 6e 64 2d 73 75 62 71 75 65 72 79 0a 20 20  ound-subquery.  
23200 2a 2a 20 66 6c 61 74 74 65 6e 69 6e 67 20 28 61  ** flattening (a
23210 73 20 64 65 73 63 72 69 62 65 64 20 61 62 6f 76  s described abov
23220 65 29 2e 20 20 49 66 20 77 65 20 61 72 65 20 64  e).  If we are d
23230 6f 69 6e 67 20 61 20 64 69 66 66 65 72 65 6e 74  oing a different
23240 20 6b 69 6e 64 0a 20 20 2a 2a 20 6f 66 20 66 6c   kind.  ** of fl
23250 61 74 74 65 6e 69 6e 67 20 2d 20 61 20 66 6c 61  attening - a fla
23260 74 74 65 6e 69 6e 67 20 6f 74 68 65 72 20 74 68  ttening other th
23270 61 6e 20 61 20 63 6f 6d 70 6f 75 6e 64 2d 73 75  an a compound-su
23280 62 71 75 65 72 79 20 66 6c 61 74 74 65 6e 69 6e  bquery flattenin
23290 67 20 2d 0a 20 20 2a 2a 20 74 68 65 6e 20 74 68  g -.  ** then th
232a0 69 73 20 6c 6f 6f 70 20 6f 6e 6c 79 20 72 75 6e  is loop only run
232b0 73 20 6f 6e 63 65 2e 0a 20 20 2a 2a 0a 20 20 2a  s once..  **.  *
232c0 2a 20 54 68 69 73 20 6c 6f 6f 70 20 6d 6f 76 65  * This loop move
232d0 73 20 61 6c 6c 20 6f 66 20 74 68 65 20 46 52 4f  s all of the FRO
232e0 4d 20 65 6c 65 6d 65 6e 74 73 20 6f 66 20 74 68  M elements of th
232f0 65 20 73 75 62 71 75 65 72 79 20 69 6e 74 6f 20  e subquery into 
23300 74 68 65 0a 20 20 2a 2a 20 74 68 65 20 46 52 4f  the.  ** the FRO
23310 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20  M clause of the 
23320 6f 75 74 65 72 20 71 75 65 72 79 2e 20 20 42 65  outer query.  Be
23330 66 6f 72 65 20 64 6f 69 6e 67 20 74 68 69 73 2c  fore doing this,
23340 20 72 65 6d 65 6d 62 65 72 0a 20 20 2a 2a 20 74   remember.  ** t
23350 68 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72  he cursor number
23360 20 66 6f 72 20 74 68 65 20 6f 72 69 67 69 6e 61   for the origina
23370 6c 20 6f 75 74 65 72 20 71 75 65 72 79 20 46 52  l outer query FR
23380 4f 4d 20 65 6c 65 6d 65 6e 74 20 69 6e 0a 20 20  OM element in.  
23390 2a 2a 20 69 50 61 72 65 6e 74 2e 20 20 54 68 65  ** iParent.  The
233a0 20 69 50 61 72 65 6e 74 20 63 75 72 73 6f 72 20   iParent cursor 
233b0 77 69 6c 6c 20 6e 65 76 65 72 20 62 65 20 75 73  will never be us
233c0 65 64 2e 20 20 53 75 62 73 65 71 75 65 6e 74 20  ed.  Subsequent 
233d0 63 6f 64 65 0a 20 20 2a 2a 20 77 69 6c 6c 20 73  code.  ** will s
233e0 63 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 73 20  can expressions 
233f0 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 69 50 61 72  looking for iPar
23400 65 6e 74 20 72 65 66 65 72 65 6e 63 65 73 20 61  ent references a
23410 6e 64 20 72 65 70 6c 61 63 65 0a 20 20 2a 2a 20  nd replace.  ** 
23420 74 68 6f 73 65 20 72 65 66 65 72 65 6e 63 65 73  those references
23430 20 77 69 74 68 20 65 78 70 72 65 73 73 69 6f 6e   with expression
23440 73 20 74 68 61 74 20 72 65 73 6f 6c 76 65 20 74  s that resolve t
23450 6f 20 74 68 65 20 73 75 62 71 75 65 72 79 20 46  o the subquery F
23460 52 4f 4d 0a 20 20 2a 2a 20 65 6c 65 6d 65 6e 74  ROM.  ** element
23470 73 20 77 65 20 61 72 65 20 6e 6f 77 20 63 6f 70  s we are now cop
23480 79 69 6e 67 20 69 6e 2e 0a 20 20 2a 2f 0a 20 20  ying in..  */.  
23490 66 6f 72 28 70 50 61 72 65 6e 74 3d 70 3b 20 70  for(pParent=p; p
234a0 50 61 72 65 6e 74 3b 20 70 50 61 72 65 6e 74 3d  Parent; pParent=
234b0 70 50 61 72 65 6e 74 2d 3e 70 50 72 69 6f 72 2c  pParent->pPrior,
234c0 20 70 53 75 62 3d 70 53 75 62 2d 3e 70 50 72 69   pSub=pSub->pPri
234d0 6f 72 29 7b 0a 20 20 20 20 69 6e 74 20 6e 53 75  or){.    int nSu
234e0 62 53 72 63 3b 0a 20 20 20 20 75 38 20 6a 6f 69  bSrc;.    u8 joi
234f0 6e 74 79 70 65 20 3d 20 30 3b 0a 20 20 20 20 70  ntype = 0;.    p
23500 53 75 62 53 72 63 20 3d 20 70 53 75 62 2d 3e 70  SubSrc = pSub->p
23510 53 72 63 3b 20 20 20 20 20 2f 2a 20 46 52 4f 4d  Src;     /* FROM
23520 20 63 6c 61 75 73 65 20 6f 66 20 73 75 62 71 75   clause of subqu
23530 65 72 79 20 2a 2f 0a 20 20 20 20 6e 53 75 62 53  ery */.    nSubS
23540 72 63 20 3d 20 70 53 75 62 53 72 63 2d 3e 6e 53  rc = pSubSrc->nS
23550 72 63 3b 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f  rc;  /* Number o
23560 66 20 74 65 72 6d 73 20 69 6e 20 73 75 62 71 75  f terms in subqu
23570 65 72 79 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  ery FROM clause 
23580 2a 2f 0a 20 20 20 20 70 53 72 63 20 3d 20 70 50  */.    pSrc = pP
23590 61 72 65 6e 74 2d 3e 70 53 72 63 3b 20 20 20 20  arent->pSrc;    
235a0 20 2f 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65 20   /* FROM clause 
235b0 6f 66 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  of the outer que
235c0 72 79 20 2a 2f 0a 0a 20 20 20 20 69 66 28 20 70  ry */..    if( p
235d0 53 72 63 20 29 7b 0a 20 20 20 20 20 20 61 73 73  Src ){.      ass
235e0 65 72 74 28 20 70 50 61 72 65 6e 74 3d 3d 70 20  ert( pParent==p 
235f0 29 3b 20 20 2f 2a 20 46 69 72 73 74 20 74 69 6d  );  /* First tim
23600 65 20 74 68 72 6f 75 67 68 20 74 68 65 20 6c 6f  e through the lo
23610 6f 70 20 2a 2f 0a 20 20 20 20 20 20 6a 6f 69 6e  op */.      join
23620 74 79 70 65 20 3d 20 70 53 75 62 69 74 65 6d 2d  type = pSubitem-
23630 3e 66 67 2e 6a 6f 69 6e 74 79 70 65 3b 0a 20 20  >fg.jointype;.  
23640 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61    }else{.      a
23650 73 73 65 72 74 28 20 70 50 61 72 65 6e 74 21 3d  ssert( pParent!=
23660 70 20 29 3b 20 20 2f 2a 20 32 6e 64 20 61 6e 64  p );  /* 2nd and
23670 20 73 75 62 73 65 71 75 65 6e 74 20 74 69 6d 65   subsequent time
23680 73 20 74 68 72 6f 75 67 68 20 74 68 65 20 6c 6f  s through the lo
23690 6f 70 20 2a 2f 0a 20 20 20 20 20 20 70 53 72 63  op */.      pSrc
236a0 20 3d 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73   = sqlite3SrcLis
236b0 74 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20  tAppend(pParse, 
236c0 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  0, 0, 0);.      
236d0 69 66 28 20 70 53 72 63 3d 3d 30 20 29 20 62 72  if( pSrc==0 ) br
236e0 65 61 6b 3b 0a 20 20 20 20 20 20 70 50 61 72 65  eak;.      pPare
236f0 6e 74 2d 3e 70 53 72 63 20 3d 20 70 53 72 63 3b  nt->pSrc = pSrc;
23700 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 54  .    }..    /* T
23710 68 65 20 73 75 62 71 75 65 72 79 20 75 73 65 73  he subquery uses
23720 20 61 20 73 69 6e 67 6c 65 20 73 6c 6f 74 20 6f   a single slot o
23730 66 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  f the FROM claus
23740 65 20 6f 66 20 74 68 65 20 6f 75 74 65 72 0a 20  e of the outer. 
23750 20 20 20 2a 2a 20 71 75 65 72 79 2e 20 20 49 66     ** query.  If
23760 20 74 68 65 20 73 75 62 71 75 65 72 79 20 68 61   the subquery ha
23770 73 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20  s more than one 
23780 65 6c 65 6d 65 6e 74 20 69 6e 20 69 74 73 20 46  element in its F
23790 52 4f 4d 20 63 6c 61 75 73 65 2c 0a 20 20 20 20  ROM clause,.    
237a0 2a 2a 20 74 68 65 6e 20 65 78 70 61 6e 64 20 74  ** then expand t
237b0 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 74  he outer query t
237c0 6f 20 6d 61 6b 65 20 73 70 61 63 65 20 66 6f 72  o make space for
237d0 20 69 74 20 74 6f 20 68 6f 6c 64 20 61 6c 6c 20   it to hold all 
237e0 65 6c 65 6d 65 6e 74 73 0a 20 20 20 20 2a 2a 20  elements.    ** 
237f0 6f 66 20 74 68 65 20 73 75 62 71 75 65 72 79 2e  of the subquery.
23800 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 45  .    **.    ** E
23810 78 61 6d 70 6c 65 3a 0a 20 20 20 20 2a 2a 0a 20  xample:.    **. 
23820 20 20 20 2a 2a 20 20 20 20 53 45 4c 45 43 54 20     **    SELECT 
23830 2a 20 46 52 4f 4d 20 74 61 62 41 2c 20 28 53 45  * FROM tabA, (SE
23840 4c 45 43 54 20 2a 20 46 52 4f 4d 20 73 75 62 31  LECT * FROM sub1
23850 2c 20 73 75 62 32 29 2c 20 74 61 62 42 3b 0a 20  , sub2), tabB;. 
23860 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65     **.    ** The
23870 20 6f 75 74 65 72 20 71 75 65 72 79 20 68 61 73   outer query has
23880 20 33 20 73 6c 6f 74 73 20 69 6e 20 69 74 73 20   3 slots in its 
23890 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20 20 4f 6e  FROM clause.  On
238a0 65 20 73 6c 6f 74 20 6f 66 20 74 68 65 0a 20 20  e slot of the.  
238b0 20 20 2a 2a 20 6f 75 74 65 72 20 71 75 65 72 79    ** outer query
238c0 20 28 74 68 65 20 6d 69 64 64 6c 65 20 73 6c 6f   (the middle slo
238d0 74 29 20 69 73 20 75 73 65 64 20 62 79 20 74 68  t) is used by th
238e0 65 20 73 75 62 71 75 65 72 79 2e 20 20 54 68 65  e subquery.  The
238f0 20 6e 65 78 74 0a 20 20 20 20 2a 2a 20 62 6c 6f   next.    ** blo
23900 63 6b 20 6f 66 20 63 6f 64 65 20 77 69 6c 6c 20  ck of code will 
23910 65 78 70 61 6e 64 20 74 68 65 20 6f 75 74 65 72  expand the outer
23920 20 71 75 65 72 79 20 46 52 4f 4d 20 63 6c 61 75   query FROM clau
23930 73 65 20 74 6f 20 34 20 73 6c 6f 74 73 2e 0a 20  se to 4 slots.. 
23940 20 20 20 2a 2a 20 54 68 65 20 6d 69 64 64 6c 65     ** The middle
23950 20 73 6c 6f 74 20 69 73 20 65 78 70 61 6e 64 65   slot is expande
23960 64 20 74 6f 20 74 77 6f 20 73 6c 6f 74 73 20 69  d to two slots i
23970 6e 20 6f 72 64 65 72 20 74 6f 20 6d 61 6b 65 20  n order to make 
23980 73 70 61 63 65 0a 20 20 20 20 2a 2a 20 66 6f 72  space.    ** for
23990 20 74 68 65 20 74 77 6f 20 65 6c 65 6d 65 6e 74   the two element
239a0 73 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c  s in the FROM cl
239b0 61 75 73 65 20 6f 66 20 74 68 65 20 73 75 62 71  ause of the subq
239c0 75 65 72 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  uery..    */.   
239d0 20 69 66 28 20 6e 53 75 62 53 72 63 3e 31 20 29   if( nSubSrc>1 )
239e0 7b 0a 20 20 20 20 20 20 70 53 72 63 20 3d 20 73  {.      pSrc = s
239f0 71 6c 69 74 65 33 53 72 63 4c 69 73 74 45 6e 6c  qlite3SrcListEnl
23a00 61 72 67 65 28 70 50 61 72 73 65 2c 20 70 53 72  arge(pParse, pSr
23a10 63 2c 20 6e 53 75 62 53 72 63 2d 31 2c 69 46 72  c, nSubSrc-1,iFr
23a20 6f 6d 2b 31 29 3b 0a 20 20 20 20 20 20 69 66 28  om+1);.      if(
23a30 20 70 53 72 63 3d 3d 30 20 29 20 62 72 65 61 6b   pSrc==0 ) break
23a40 3b 0a 20 20 20 20 20 20 70 50 61 72 65 6e 74 2d  ;.      pParent-
23a50 3e 70 53 72 63 20 3d 20 70 53 72 63 3b 0a 20 20  >pSrc = pSrc;.  
23a60 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 54 72 61 6e    }..    /* Tran
23a70 73 66 65 72 20 74 68 65 20 46 52 4f 4d 20 63 6c  sfer the FROM cl
23a80 61 75 73 65 20 74 65 72 6d 73 20 66 72 6f 6d 20  ause terms from 
23a90 74 68 65 20 73 75 62 71 75 65 72 79 20 69 6e 74  the subquery int
23aa0 6f 20 74 68 65 0a 20 20 20 20 2a 2a 20 6f 75 74  o the.    ** out
23ab0 65 72 20 71 75 65 72 79 2e 0a 20 20 20 20 2a 2f  er query..    */
23ac0 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
23ad0 6e 53 75 62 53 72 63 3b 20 69 2b 2b 29 7b 0a 20  nSubSrc; i++){. 
23ae0 20 20 20 20 20 73 71 6c 69 74 65 33 49 64 4c 69       sqlite3IdLi
23af0 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 53 72  stDelete(db, pSr
23b00 63 2d 3e 61 5b 69 2b 69 46 72 6f 6d 5d 2e 70 55  c->a[i+iFrom].pU
23b10 73 69 6e 67 29 3b 0a 20 20 20 20 20 20 61 73 73  sing);.      ass
23b20 65 72 74 28 20 70 53 72 63 2d 3e 61 5b 69 2b 69  ert( pSrc->a[i+i
23b30 46 72 6f 6d 5d 2e 66 67 2e 69 73 54 61 62 46 75  From].fg.isTabFu
23b40 6e 63 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70  nc==0 );.      p
23b50 53 72 63 2d 3e 61 5b 69 2b 69 46 72 6f 6d 5d 20  Src->a[i+iFrom] 
23b60 3d 20 70 53 75 62 53 72 63 2d 3e 61 5b 69 5d 3b  = pSubSrc->a[i];
23b70 0a 20 20 20 20 20 20 69 4e 65 77 50 61 72 65 6e  .      iNewParen
23b80 74 20 3d 20 70 53 75 62 53 72 63 2d 3e 61 5b 69  t = pSubSrc->a[i
23b90 5d 2e 69 43 75 72 73 6f 72 3b 0a 20 20 20 20 20  ].iCursor;.     
23ba0 20 6d 65 6d 73 65 74 28 26 70 53 75 62 53 72 63   memset(&pSubSrc
23bb0 2d 3e 61 5b 69 5d 2c 20 30 2c 20 73 69 7a 65 6f  ->a[i], 0, sizeo
23bc0 66 28 70 53 75 62 53 72 63 2d 3e 61 5b 69 5d 29  f(pSubSrc->a[i])
23bd0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 53 72  );.    }.    pSr
23be0 63 2d 3e 61 5b 69 46 72 6f 6d 5d 2e 66 67 2e 6a  c->a[iFrom].fg.j
23bf0 6f 69 6e 74 79 70 65 20 3d 20 6a 6f 69 6e 74 79  ointype = jointy
23c00 70 65 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 4e 6f  pe;.  .    /* No
23c10 77 20 62 65 67 69 6e 20 73 75 62 73 74 69 74 75  w begin substitu
23c20 74 69 6e 67 20 73 75 62 71 75 65 72 79 20 72 65  ting subquery re
23c30 73 75 6c 74 20 73 65 74 20 65 78 70 72 65 73 73  sult set express
23c40 69 6f 6e 73 20 66 6f 72 20 0a 20 20 20 20 2a 2a  ions for .    **
23c50 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74   references to t
23c60 68 65 20 69 50 61 72 65 6e 74 20 69 6e 20 74 68  he iParent in th
23c70 65 20 6f 75 74 65 72 20 71 75 65 72 79 2e 0a 20  e outer query.. 
23c80 20 20 20 2a 2a 20 0a 20 20 20 20 2a 2a 20 45 78     ** .    ** Ex
23c90 61 6d 70 6c 65 3a 0a 20 20 20 20 2a 2a 0a 20 20  ample:.    **.  
23ca0 20 20 2a 2a 20 20 20 53 45 4c 45 43 54 20 61 2b    **   SELECT a+
23cb0 35 2c 20 62 2a 31 30 20 46 52 4f 4d 20 28 53 45  5, b*10 FROM (SE
23cc0 4c 45 43 54 20 78 2a 33 20 41 53 20 61 2c 20 79  LECT x*3 AS a, y
23cd0 2b 31 30 20 41 53 20 62 20 46 52 4f 4d 20 74 31  +10 AS b FROM t1
23ce0 29 20 57 48 45 52 45 20 61 3e 62 3b 0a 20 20 20  ) WHERE a>b;.   
23cf0 20 2a 2a 20 20 20 5c 20 20 20 20 20 20 20 20 20   **   \         
23d00 20 20 20 20 20 20 20 20 20 20 20 20 5c 5f 5f 5f              \___
23d10 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 20 73 75 62 71 75  __________ subqu
23d20 65 72 79 20 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 20  ery __________/ 
23d30 20 20 20 20 20 20 20 20 20 2f 0a 20 20 20 20 2a           /.    *
23d40 2a 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  *    \__________
23d50 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 20 6f 75 74 65  ___________ oute
23d60 72 20 71 75 65 72 79 20 5f 5f 5f 5f 5f 5f 5f 5f  r query ________
23d70 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
23d80 5f 5f 5f 5f 5f 5f 2f 0a 20 20 20 20 2a 2a 0a 20  ______/.    **. 
23d90 20 20 20 2a 2a 20 57 65 20 6c 6f 6f 6b 20 61 74     ** We look at
23da0 20 65 76 65 72 79 20 65 78 70 72 65 73 73 69 6f   every expressio
23db0 6e 20 69 6e 20 74 68 65 20 6f 75 74 65 72 20 71  n in the outer q
23dc0 75 65 72 79 20 61 6e 64 20 65 76 65 72 79 20 70  uery and every p
23dd0 6c 61 63 65 20 77 65 20 73 65 65 0a 20 20 20 20  lace we see.    
23de0 2a 2a 20 22 61 22 20 77 65 20 73 75 62 73 74 69  ** "a" we substi
23df0 74 75 74 65 20 22 78 2a 33 22 20 61 6e 64 20 65  tute "x*3" and e
23e00 76 65 72 79 20 70 6c 61 63 65 20 77 65 20 73 65  very place we se
23e10 65 20 22 62 22 20 77 65 20 73 75 62 73 74 69 74  e "b" we substit
23e20 75 74 65 20 22 79 2b 31 30 22 2e 0a 20 20 20 20  ute "y+10"..    
23e30 2a 2f 0a 20 20 20 20 69 66 28 20 70 53 75 62 2d  */.    if( pSub-
23e40 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20  >pOrderBy ){.   
23e50 20 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f     /* At this po
23e60 69 6e 74 2c 20 61 6e 79 20 6e 6f 6e 2d 7a 65 72  int, any non-zer
23e70 6f 20 69 4f 72 64 65 72 42 79 43 6f 6c 20 76 61  o iOrderByCol va
23e80 6c 75 65 73 20 69 6e 64 69 63 61 74 65 20 74 68  lues indicate th
23e90 61 74 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20  at the.      ** 
23ea0 4f 52 44 45 52 20 42 59 20 63 6f 6c 75 6d 6e 20  ORDER BY column 
23eb0 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 69 64  expression is id
23ec0 65 6e 74 69 63 61 6c 20 74 6f 20 74 68 65 20 69  entical to the i
23ed0 4f 72 64 65 72 42 79 43 6f 6c 27 74 68 0a 20 20  OrderByCol'th.  
23ee0 20 20 20 20 2a 2a 20 65 78 70 72 65 73 73 69 6f      ** expressio
23ef0 6e 20 72 65 74 75 72 6e 65 64 20 62 79 20 53 45  n returned by SE
23f00 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 70  LECT statement p
23f10 53 75 62 2e 20 53 69 6e 63 65 20 74 68 65 73 65  Sub. Since these
23f20 20 76 61 6c 75 65 73 0a 20 20 20 20 20 20 2a 2a   values.      **
23f30 20 64 6f 20 6e 6f 74 20 6e 65 63 65 73 73 61 72   do not necessar
23f40 69 6c 79 20 63 6f 72 72 65 73 70 6f 6e 64 20 74  ily correspond t
23f50 6f 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 53 45 4c  o columns in SEL
23f60 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 70 50  ECT statement pP
23f70 61 72 65 6e 74 2c 0a 20 20 20 20 20 20 2a 2a 20  arent,.      ** 
23f80 7a 65 72 6f 20 74 68 65 6d 20 62 65 66 6f 72 65  zero them before
23f90 20 74 72 61 6e 73 66 65 72 69 6e 67 20 74 68 65   transfering the
23fa0 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
23fb0 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  ..      **.     
23fc0 20 2a 2a 20 4e 6f 74 20 64 6f 69 6e 67 20 74 68   ** Not doing th
23fd0 69 73 20 6d 61 79 20 63 61 75 73 65 20 61 6e 20  is may cause an 
23fe0 65 72 72 6f 72 20 69 66 20 61 20 73 75 62 73 65  error if a subse
23ff0 71 75 65 6e 74 20 63 61 6c 6c 20 74 6f 20 74 68  quent call to th
24000 69 73 0a 20 20 20 20 20 20 2a 2a 20 66 75 6e 63  is.      ** func
24010 74 69 6f 6e 20 61 74 74 65 6d 70 74 73 20 74 6f  tion attempts to
24020 20 66 6c 61 74 74 65 6e 20 61 20 63 6f 6d 70 6f   flatten a compo
24030 75 6e 64 20 73 75 62 2d 71 75 65 72 79 20 69 6e  und sub-query in
24040 74 6f 20 70 50 61 72 65 6e 74 0a 20 20 20 20 20  to pParent.     
24050 20 2a 2a 20 28 74 68 65 20 6f 6e 6c 79 20 77 61   ** (the only wa
24060 79 20 74 68 69 73 20 63 61 6e 20 68 61 70 70 65  y this can happe
24070 6e 20 69 73 20 69 66 20 74 68 65 20 63 6f 6d 70  n is if the comp
24080 6f 75 6e 64 20 73 75 62 2d 71 75 65 72 79 20 69  ound sub-query i
24090 73 0a 20 20 20 20 20 20 2a 2a 20 63 75 72 72 65  s.      ** curre
240a0 6e 74 6c 79 20 70 61 72 74 20 6f 66 20 70 53 75  ntly part of pSu
240b0 62 2d 3e 70 53 72 63 29 2e 20 53 65 65 20 74 69  b->pSrc). See ti
240c0 63 6b 65 74 20 5b 64 31 31 61 36 65 39 30 38 66  cket [d11a6e908f
240d0 5d 2e 20 20 2a 2f 0a 20 20 20 20 20 20 45 78 70  ].  */.      Exp
240e0 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 20  rList *pOrderBy 
240f0 3d 20 70 53 75 62 2d 3e 70 4f 72 64 65 72 42 79  = pSub->pOrderBy
24100 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  ;.      for(i=0;
24110 20 69 3c 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78   i<pOrderBy->nEx
24120 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  pr; i++){.      
24130 20 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d    pOrderBy->a[i]
24140 2e 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c  .u.x.iOrderByCol
24150 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 0;.      }.  
24160 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72      assert( pPar
24170 65 6e 74 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30  ent->pOrderBy==0
24180 20 29 3b 0a 20 20 20 20 20 20 70 50 61 72 65 6e   );.      pParen
24190 74 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 70 4f  t->pOrderBy = pO
241a0 72 64 65 72 42 79 3b 0a 20 20 20 20 20 20 70 53  rderBy;.      pS
241b0 75 62 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 30  ub->pOrderBy = 0
241c0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 57 68 65  ;.    }.    pWhe
241d0 72 65 20 3d 20 70 53 75 62 2d 3e 70 57 68 65 72  re = pSub->pWher
241e0 65 3b 0a 20 20 20 20 70 53 75 62 2d 3e 70 57 68  e;.    pSub->pWh
241f0 65 72 65 20 3d 20 30 3b 0a 20 20 20 20 69 66 28  ere = 0;.    if(
24200 20 69 73 4c 65 66 74 4a 6f 69 6e 3e 30 20 29 7b   isLeftJoin>0 ){
24210 0a 20 20 20 20 20 20 73 65 74 4a 6f 69 6e 45 78  .      setJoinEx
24220 70 72 28 70 57 68 65 72 65 2c 20 69 4e 65 77 50  pr(pWhere, iNewP
24230 61 72 65 6e 74 29 3b 0a 20 20 20 20 7d 0a 20 20  arent);.    }.  
24240 20 20 70 50 61 72 65 6e 74 2d 3e 70 57 68 65 72    pParent->pWher
24250 65 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41  e = sqlite3ExprA
24260 6e 64 28 70 50 61 72 73 65 2c 20 70 57 68 65 72  nd(pParse, pWher
24270 65 2c 20 70 50 61 72 65 6e 74 2d 3e 70 57 68 65  e, pParent->pWhe
24280 72 65 29 3b 0a 20 20 20 20 69 66 28 20 64 62 2d  re);.    if( db-
24290 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 3d 3d 30  >mallocFailed==0
242a0 20 29 7b 0a 20 20 20 20 20 20 53 75 62 73 74 43   ){.      SubstC
242b0 6f 6e 74 65 78 74 20 78 3b 0a 20 20 20 20 20 20  ontext x;.      
242c0 78 2e 70 50 61 72 73 65 20 3d 20 70 50 61 72 73  x.pParse = pPars
242d0 65 3b 0a 20 20 20 20 20 20 78 2e 69 54 61 62 6c  e;.      x.iTabl
242e0 65 20 3d 20 69 50 61 72 65 6e 74 3b 0a 20 20 20  e = iParent;.   
242f0 20 20 20 78 2e 69 4e 65 77 54 61 62 6c 65 20 3d     x.iNewTable =
24300 20 69 4e 65 77 50 61 72 65 6e 74 3b 0a 20 20 20   iNewParent;.   
24310 20 20 20 78 2e 69 73 4c 65 66 74 4a 6f 69 6e 20     x.isLeftJoin 
24320 3d 20 69 73 4c 65 66 74 4a 6f 69 6e 3b 0a 20 20  = isLeftJoin;.  
24330 20 20 20 20 78 2e 70 45 4c 69 73 74 20 3d 20 70      x.pEList = p
24340 53 75 62 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 20  Sub->pEList;.   
24350 20 20 20 73 75 62 73 74 53 65 6c 65 63 74 28 26     substSelect(&
24360 78 2c 20 70 50 61 72 65 6e 74 2c 20 30 29 3b 0a  x, pParent, 0);.
24370 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20      }.  .    /* 
24380 54 68 65 20 66 6c 61 74 74 65 6e 65 64 20 71 75  The flattened qu
24390 65 72 79 20 69 73 20 61 20 63 6f 6d 70 6f 75 6e  ery is a compoun
243a0 64 20 69 66 20 65 69 74 68 65 72 20 74 68 65 20  d if either the 
243b0 69 6e 6e 65 72 20 6f 72 20 74 68 65 0a 20 20 20  inner or the.   
243c0 20 2a 2a 20 6f 75 74 65 72 20 71 75 65 72 79 20   ** outer query 
243d0 69 73 20 61 20 63 6f 6d 70 6f 75 6e 64 2e 20 2a  is a compound. *
243e0 2f 0a 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 73  /.    pParent->s
243f0 65 6c 46 6c 61 67 73 20 7c 3d 20 70 53 75 62 2d  elFlags |= pSub-
24400 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 43  >selFlags & SF_C
24410 6f 6d 70 6f 75 6e 64 3b 0a 20 20 20 20 61 73 73  ompound;.    ass
24420 65 72 74 28 20 28 70 53 75 62 2d 3e 73 65 6c 46  ert( (pSub->selF
24430 6c 61 67 73 20 26 20 53 46 5f 44 69 73 74 69 6e  lags & SF_Distin
24440 63 74 29 3d 3d 30 20 29 3b 20 2f 2a 20 72 65 73  ct)==0 ); /* res
24450 74 72 69 63 74 69 6f 6e 20 28 31 37 62 29 20 2a  triction (17b) *
24460 2f 0a 20 20 0a 20 20 20 20 2f 2a 0a 20 20 20 20  /.  .    /*.    
24470 2a 2a 20 53 45 4c 45 43 54 20 2e 2e 2e 20 46 52  ** SELECT ... FR
24480 4f 4d 20 28 53 45 4c 45 43 54 20 2e 2e 2e 20 4c  OM (SELECT ... L
24490 49 4d 49 54 20 61 20 4f 46 46 53 45 54 20 62 29  IMIT a OFFSET b)
244a0 20 4c 49 4d 49 54 20 78 20 4f 46 46 53 45 54 20   LIMIT x OFFSET 
244b0 79 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  y;.    **.    **
244c0 20 4f 6e 65 20 69 73 20 74 65 6d 70 74 65 64 20   One is tempted 
244d0 74 6f 20 74 72 79 20 74 6f 20 61 64 64 20 61 20  to try to add a 
244e0 61 6e 64 20 62 20 74 6f 20 63 6f 6d 62 69 6e 65  and b to combine
244f0 20 74 68 65 20 6c 69 6d 69 74 73 2e 20 20 42 75   the limits.  Bu
24500 74 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 64 6f  t this.    ** do
24510 65 73 20 6e 6f 74 20 77 6f 72 6b 20 69 66 20 65  es not work if e
24520 69 74 68 65 72 20 6c 69 6d 69 74 20 69 73 20 6e  ither limit is n
24530 65 67 61 74 69 76 65 2e 0a 20 20 20 20 2a 2f 0a  egative..    */.
24540 20 20 20 20 69 66 28 20 70 53 75 62 2d 3e 70 4c      if( pSub->pL
24550 69 6d 69 74 20 29 7b 0a 20 20 20 20 20 20 70 50  imit ){.      pP
24560 61 72 65 6e 74 2d 3e 70 4c 69 6d 69 74 20 3d 20  arent->pLimit = 
24570 70 53 75 62 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20  pSub->pLimit;.  
24580 20 20 20 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74      pSub->pLimit
24590 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = 0;.    }.  }.
245a0 0a 20 20 2f 2a 20 46 69 6e 69 61 6c 6c 79 2c 20  .  /* Finially, 
245b0 64 65 6c 65 74 65 20 77 68 61 74 20 69 73 20 6c  delete what is l
245c0 65 66 74 20 6f 66 20 74 68 65 20 73 75 62 71 75  eft of the subqu
245d0 65 72 79 20 61 6e 64 20 72 65 74 75 72 6e 0a 20  ery and return. 
245e0 20 2a 2a 20 73 75 63 63 65 73 73 2e 0a 20 20 2a   ** success..  *
245f0 2f 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63  /.  sqlite3Selec
24600 74 44 65 6c 65 74 65 28 64 62 2c 20 70 53 75 62  tDelete(db, pSub
24610 31 29 3b 0a 0a 23 69 66 20 53 45 4c 45 43 54 54  1);..#if SELECTT
24620 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20 69  RACE_ENABLED.  i
24630 66 28 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  f( sqlite3Select
24640 54 72 61 63 65 20 26 20 30 78 31 30 30 20 29 7b  Trace & 0x100 ){
24650 0a 20 20 20 20 53 45 4c 45 43 54 54 52 41 43 45  .    SELECTTRACE
24660 28 30 78 31 30 30 2c 70 50 61 72 73 65 2c 70 2c  (0x100,pParse,p,
24670 28 22 41 66 74 65 72 20 66 6c 61 74 74 65 6e 69  ("After flatteni
24680 6e 67 3a 5c 6e 22 29 29 3b 0a 20 20 20 20 73 71  ng:\n"));.    sq
24690 6c 69 74 65 33 54 72 65 65 56 69 65 77 53 65 6c  lite3TreeViewSel
246a0 65 63 74 28 30 2c 20 70 2c 20 30 29 3b 0a 20 20  ect(0, p, 0);.  
246b0 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 72 65 74 75  }.#endif..  retu
246c0 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  rn 1;.}.#endif /
246d0 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  * !defined(SQLIT
246e0 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29  E_OMIT_SUBQUERY)
246f0 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c   || !defined(SQL
24700 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20 2a  ITE_OMIT_VIEW) *
24710 2f 0a 0a 2f 2a 0a 2a 2a 20 41 20 73 74 72 75 63  /../*.** A struc
24720 74 75 72 65 20 74 6f 20 6b 65 65 70 20 74 72 61  ture to keep tra
24730 63 6b 20 6f 66 20 61 6c 6c 20 6f 66 20 74 68 65  ck of all of the
24740 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 73 20 74   column values t
24750 68 61 74 20 61 72 65 20 66 69 78 65 64 20 74 6f  hat are fixed to
24760 0a 2a 2a 20 61 20 6b 6e 6f 77 6e 20 76 61 6c 75  .** a known valu
24770 65 20 64 75 65 20 74 6f 20 57 48 45 52 45 20 63  e due to WHERE c
24780 6c 61 75 73 65 20 63 6f 6e 73 74 72 61 69 6e 74  lause constraint
24790 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 43 4f  s of the form CO
247a0 4c 55 4d 4e 3d 56 41 4c 55 45 2e 0a 2a 2f 0a 74  LUMN=VALUE..*/.t
247b0 79 70 65 64 65 66 20 73 74 72 75 63 74 20 57 68  ypedef struct Wh
247c0 65 72 65 43 6f 6e 73 74 20 57 68 65 72 65 43 6f  ereConst WhereCo
247d0 6e 73 74 3b 0a 73 74 72 75 63 74 20 57 68 65 72  nst;.struct Wher
247e0 65 43 6f 6e 73 74 20 7b 0a 20 20 50 61 72 73 65  eConst {.  Parse
247f0 20 2a 70 50 61 72 73 65 3b 20 20 20 2f 2a 20 50   *pParse;   /* P
24800 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
24810 2f 0a 20 20 69 6e 74 20 6e 43 6f 6e 73 74 3b 20  /.  int nConst; 
24820 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 66       /* Number f
24830 6f 72 20 43 4f 4c 55 4d 4e 3d 43 4f 4e 53 54 41  or COLUMN=CONSTA
24840 4e 54 20 74 65 72 6d 73 20 2a 2f 0a 20 20 69 6e  NT terms */.  in
24850 74 20 6e 43 68 6e 67 3b 20 20 20 20 20 20 20 2f  t nChng;       /
24860 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74 69 6d 65  * Number of time
24870 73 20 61 20 63 6f 6e 73 74 61 6e 74 20 69 73 20  s a constant is 
24880 70 72 6f 70 61 67 61 74 65 64 20 2a 2f 0a 20 20  propagated */.  
24890 45 78 70 72 20 2a 2a 61 70 45 78 70 72 3b 20 20  Expr **apExpr;  
248a0 20 2f 2a 20 5b 69 2a 32 5d 20 69 73 20 43 4f 4c   /* [i*2] is COL
248b0 55 4d 4e 20 61 6e 64 20 5b 69 2a 32 2b 31 5d 20  UMN and [i*2+1] 
248c0 69 73 20 56 41 4c 55 45 20 2a 2f 0a 7d 3b 0a 0a  is VALUE */.};..
248d0 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6e 65 77 20  /*.** Add a new 
248e0 65 6e 74 72 79 20 74 6f 20 74 68 65 20 70 43 6f  entry to the pCo
248f0 6e 73 74 20 6f 62 6a 65 63 74 2e 20 20 45 78 63  nst object.  Exc
24900 65 70 74 2c 20 64 6f 20 6e 6f 74 20 61 64 64 20  ept, do not add 
24910 64 75 70 6c 69 63 61 74 65 0a 2a 2a 20 70 43 6f  duplicate.** pCo
24920 6c 75 6d 6e 20 65 6e 74 69 72 65 73 2e 0a 2a 2f  lumn entires..*/
24930 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f 6e  .static void con
24940 73 74 49 6e 73 65 72 74 28 0a 20 20 57 68 65 72  stInsert(.  Wher
24950 65 43 6f 6e 73 74 20 2a 70 43 6f 6e 73 74 2c 20  eConst *pConst, 
24960 20 20 20 20 20 2f 2a 20 54 68 65 20 57 68 65 72       /* The Wher
24970 65 43 6f 6e 73 74 20 69 6e 74 6f 20 77 68 69 63  eConst into whic
24980 68 20 77 65 20 61 72 65 20 69 6e 73 65 72 74 69  h we are inserti
24990 6e 67 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 43  ng */.  Expr *pC
249a0 6f 6c 75 6d 6e 2c 20 20 20 20 20 20 20 20 20 20  olumn,          
249b0 20 2f 2a 20 54 68 65 20 43 4f 4c 55 4d 4e 20 70   /* The COLUMN p
249c0 61 72 74 20 6f 66 20 74 68 65 20 63 6f 6e 73 74  art of the const
249d0 72 61 69 6e 74 20 2a 2f 0a 20 20 45 78 70 72 20  raint */.  Expr 
249e0 2a 70 56 61 6c 75 65 20 20 20 20 20 20 20 20 20  *pValue         
249f0 20 20 20 20 2f 2a 20 54 68 65 20 56 41 4c 55 45      /* The VALUE
24a00 20 70 61 72 74 20 6f 66 20 74 68 65 20 63 6f 6e   part of the con
24a10 73 74 72 61 69 6e 74 20 2a 2f 0a 29 7b 0a 20 20  straint */.){.  
24a20 69 6e 74 20 69 3b 0a 20 20 61 73 73 65 72 74 28  int i;.  assert(
24a30 20 70 43 6f 6c 75 6d 6e 2d 3e 6f 70 3d 3d 54 4b   pColumn->op==TK
24a40 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 0a 20 20 2f 2a  _COLUMN );..  /*
24a50 20 32 30 31 38 2d 31 30 2d 32 35 20 74 69 63 6b   2018-10-25 tick
24a60 65 74 20 5b 63 66 35 65 64 32 30 66 5d 0a 20 20  et [cf5ed20f].  
24a70 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65  ** Make sure the
24a80 20 73 61 6d 65 20 70 43 6f 6c 75 6d 6e 20 69 73   same pColumn is
24a90 20 6e 6f 74 20 69 6e 73 65 72 74 65 64 20 6d 6f   not inserted mo
24aa0 72 65 20 74 68 61 6e 20 6f 6e 63 65 20 2a 2f 0a  re than once */.
24ab0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 43 6f    for(i=0; i<pCo
24ac0 6e 73 74 2d 3e 6e 43 6f 6e 73 74 3b 20 69 2b 2b  nst->nConst; i++
24ad0 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 45 78 70  ){.    const Exp
24ae0 72 20 2a 70 45 78 70 72 20 3d 20 70 43 6f 6e 73  r *pExpr = pCons
24af0 74 2d 3e 61 70 45 78 70 72 5b 69 2a 32 5d 3b 0a  t->apExpr[i*2];.
24b00 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70      assert( pExp
24b10 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e  r->op==TK_COLUMN
24b20 20 29 3b 0a 20 20 20 20 69 66 28 20 70 45 78 70   );.    if( pExp
24b30 72 2d 3e 69 54 61 62 6c 65 3d 3d 70 43 6f 6c 75  r->iTable==pColu
24b40 6d 6e 2d 3e 69 54 61 62 6c 65 0a 20 20 20 20 20  mn->iTable.     
24b50 26 26 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d  && pExpr->iColum
24b60 6e 3d 3d 70 43 6f 6c 75 6d 6e 2d 3e 69 43 6f 6c  n==pColumn->iCol
24b70 75 6d 6e 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  umn.    ){.     
24b80 20 72 65 74 75 72 6e 3b 20 20 2f 2a 20 41 6c 72   return;  /* Alr
24b90 65 61 64 79 20 70 72 65 73 65 6e 74 2e 20 20 52  eady present.  R
24ba0 65 74 75 72 6e 20 77 69 74 68 6f 75 74 20 64 6f  eturn without do
24bb0 69 6e 67 20 61 6e 79 74 68 69 6e 67 2e 20 2a 2f  ing anything. */
24bc0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 43  .    }.  }..  pC
24bd0 6f 6e 73 74 2d 3e 6e 43 6f 6e 73 74 2b 2b 3b 0a  onst->nConst++;.
24be0 20 20 70 43 6f 6e 73 74 2d 3e 61 70 45 78 70 72    pConst->apExpr
24bf0 20 3d 20 73 71 6c 69 74 65 33 44 62 52 65 61 6c   = sqlite3DbReal
24c00 6c 6f 63 4f 72 46 72 65 65 28 70 43 6f 6e 73 74  locOrFree(pConst
24c10 2d 3e 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 43  ->pParse->db, pC
24c20 6f 6e 73 74 2d 3e 61 70 45 78 70 72 2c 0a 20 20  onst->apExpr,.  
24c30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24c40 20 20 20 20 20 20 20 70 43 6f 6e 73 74 2d 3e 6e         pConst->n
24c50 43 6f 6e 73 74 2a 32 2a 73 69 7a 65 6f 66 28 45  Const*2*sizeof(E
24c60 78 70 72 2a 29 29 3b 0a 20 20 69 66 28 20 70 43  xpr*));.  if( pC
24c70 6f 6e 73 74 2d 3e 61 70 45 78 70 72 3d 3d 30 20  onst->apExpr==0 
24c80 29 7b 0a 20 20 20 20 70 43 6f 6e 73 74 2d 3e 6e  ){.    pConst->n
24c90 43 6f 6e 73 74 20 3d 20 30 3b 0a 20 20 7d 65 6c  Const = 0;.  }el
24ca0 73 65 7b 0a 20 20 20 20 69 66 28 20 45 78 70 72  se{.    if( Expr
24cb0 48 61 73 50 72 6f 70 65 72 74 79 28 70 56 61 6c  HasProperty(pVal
24cc0 75 65 2c 20 45 50 5f 46 69 78 65 64 43 6f 6c 29  ue, EP_FixedCol)
24cd0 20 29 20 70 56 61 6c 75 65 20 3d 20 70 56 61 6c   ) pValue = pVal
24ce0 75 65 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20 70  ue->pLeft;.    p
24cf0 43 6f 6e 73 74 2d 3e 61 70 45 78 70 72 5b 70 43  Const->apExpr[pC
24d00 6f 6e 73 74 2d 3e 6e 43 6f 6e 73 74 2a 32 2d 32  onst->nConst*2-2
24d10 5d 20 3d 20 70 43 6f 6c 75 6d 6e 3b 0a 20 20 20  ] = pColumn;.   
24d20 20 70 43 6f 6e 73 74 2d 3e 61 70 45 78 70 72 5b   pConst->apExpr[
24d30 70 43 6f 6e 73 74 2d 3e 6e 43 6f 6e 73 74 2a 32  pConst->nConst*2
24d40 2d 31 5d 20 3d 20 70 56 61 6c 75 65 3b 0a 20 20  -1] = pValue;.  
24d50 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20  }.}../*.** Find 
24d60 61 6c 6c 20 74 65 72 6d 73 20 6f 66 20 43 4f 4c  all terms of COL
24d70 55 4d 4e 3d 56 41 4c 55 45 20 6f 72 20 56 41 4c  UMN=VALUE or VAL
24d80 55 45 3d 43 4f 4c 55 4d 4e 20 69 6e 20 70 45 78  UE=COLUMN in pEx
24d90 70 72 20 77 68 65 72 65 20 56 41 4c 55 45 0a 2a  pr where VALUE.*
24da0 2a 20 69 73 20 61 20 63 6f 6e 73 74 61 6e 74 20  * is a constant 
24db0 65 78 70 72 65 73 73 69 6f 6e 20 61 6e 64 20 77  expression and w
24dc0 68 65 72 65 20 74 68 65 20 74 65 72 6d 20 6d 75  here the term mu
24dd0 73 74 20 62 65 20 74 72 75 65 20 62 65 63 61 75  st be true becau
24de0 73 65 20 69 74 0a 2a 2a 20 69 73 20 70 61 72 74  se it.** is part
24df0 20 6f 66 20 74 68 65 20 41 4e 44 2d 63 6f 6e 6e   of the AND-conn
24e00 65 63 74 65 64 20 74 65 72 6d 73 20 6f 66 20 74  ected terms of t
24e10 68 65 20 65 78 70 72 65 73 73 69 6f 6e 2e 20 20  he expression.  
24e20 46 6f 72 20 65 61 63 68 20 74 65 72 6d 0a 2a 2a  For each term.**
24e30 20 66 6f 75 6e 64 2c 20 61 64 64 20 69 74 20 74   found, add it t
24e40 6f 20 74 68 65 20 70 43 6f 6e 73 74 20 73 74 72  o the pConst str
24e50 75 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69  ucture..*/.stati
24e60 63 20 76 6f 69 64 20 66 69 6e 64 43 6f 6e 73 74  c void findConst
24e70 49 6e 57 68 65 72 65 28 57 68 65 72 65 43 6f 6e  InWhere(WhereCon
24e80 73 74 20 2a 70 43 6f 6e 73 74 2c 20 45 78 70 72  st *pConst, Expr
24e90 20 2a 70 45 78 70 72 29 7b 0a 20 20 45 78 70 72   *pExpr){.  Expr
24ea0 20 2a 70 52 69 67 68 74 2c 20 2a 70 4c 65 66 74   *pRight, *pLeft
24eb0 3b 0a 20 20 69 66 28 20 70 45 78 70 72 3d 3d 30  ;.  if( pExpr==0
24ec0 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28   ) return;.  if(
24ed0 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79   ExprHasProperty
24ee0 28 70 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a  (pExpr, EP_FromJ
24ef0 6f 69 6e 29 20 29 20 72 65 74 75 72 6e 3b 0a 20  oin) ) return;. 
24f00 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d   if( pExpr->op==
24f10 54 4b 5f 41 4e 44 20 29 7b 0a 20 20 20 20 66 69  TK_AND ){.    fi
24f20 6e 64 43 6f 6e 73 74 49 6e 57 68 65 72 65 28 70  ndConstInWhere(p
24f30 43 6f 6e 73 74 2c 20 70 45 78 70 72 2d 3e 70 52  Const, pExpr->pR
24f40 69 67 68 74 29 3b 0a 20 20 20 20 66 69 6e 64 43  ight);.    findC
24f50 6f 6e 73 74 49 6e 57 68 65 72 65 28 70 43 6f 6e  onstInWhere(pCon
24f60 73 74 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  st, pExpr->pLeft
24f70 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  );.    return;. 
24f80 20 7d 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e   }.  if( pExpr->
24f90 6f 70 21 3d 54 4b 5f 45 51 20 29 20 72 65 74 75  op!=TK_EQ ) retu
24fa0 72 6e 3b 0a 20 20 70 52 69 67 68 74 20 3d 20 70  rn;.  pRight = p
24fb0 45 78 70 72 2d 3e 70 52 69 67 68 74 3b 0a 20 20  Expr->pRight;.  
24fc0 70 4c 65 66 74 20 3d 20 70 45 78 70 72 2d 3e 70  pLeft = pExpr->p
24fd0 4c 65 66 74 3b 0a 20 20 61 73 73 65 72 74 28 20  Left;.  assert( 
24fe0 70 52 69 67 68 74 21 3d 30 20 29 3b 0a 20 20 61  pRight!=0 );.  a
24ff0 73 73 65 72 74 28 20 70 4c 65 66 74 21 3d 30 20  ssert( pLeft!=0 
25000 29 3b 0a 20 20 69 66 28 20 70 52 69 67 68 74 2d  );.  if( pRight-
25010 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 0a 20  >op==TK_COLUMN. 
25020 20 20 26 26 20 21 45 78 70 72 48 61 73 50 72 6f    && !ExprHasPro
25030 70 65 72 74 79 28 70 52 69 67 68 74 2c 20 45 50  perty(pRight, EP
25040 5f 46 69 78 65 64 43 6f 6c 29 0a 20 20 20 26 26  _FixedCol).   &&
25050 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f   sqlite3ExprIsCo
25060 6e 73 74 61 6e 74 28 70 4c 65 66 74 29 0a 20 20  nstant(pLeft).  
25070 20 26 26 20 73 71 6c 69 74 65 33 49 73 42 69 6e   && sqlite3IsBin
25080 61 72 79 28 73 71 6c 69 74 65 33 42 69 6e 61 72  ary(sqlite3Binar
25090 79 43 6f 6d 70 61 72 65 43 6f 6c 6c 53 65 71 28  yCompareCollSeq(
250a0 70 43 6f 6e 73 74 2d 3e 70 50 61 72 73 65 2c 70  pConst->pParse,p
250b0 4c 65 66 74 2c 70 52 69 67 68 74 29 29 0a 20 20  Left,pRight)).  
250c0 29 7b 0a 20 20 20 20 63 6f 6e 73 74 49 6e 73 65  ){.    constInse
250d0 72 74 28 70 43 6f 6e 73 74 2c 20 70 52 69 67 68  rt(pConst, pRigh
250e0 74 2c 20 70 4c 65 66 74 29 3b 0a 20 20 7d 65 6c  t, pLeft);.  }el
250f0 73 65 0a 20 20 69 66 28 20 70 4c 65 66 74 2d 3e  se.  if( pLeft->
25100 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 0a 20 20  op==TK_COLUMN.  
25110 20 26 26 20 21 45 78 70 72 48 61 73 50 72 6f 70   && !ExprHasProp
25120 65 72 74 79 28 70 4c 65 66 74 2c 20 45 50 5f 46  erty(pLeft, EP_F
25130 69 78 65 64 43 6f 6c 29 0a 20 20 20 26 26 20 73  ixedCol).   && s
25140 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73  qlite3ExprIsCons
25150 74 61 6e 74 28 70 52 69 67 68 74 29 0a 20 20 20  tant(pRight).   
25160 26 26 20 73 71 6c 69 74 65 33 49 73 42 69 6e 61  && sqlite3IsBina
25170 72 79 28 73 71 6c 69 74 65 33 42 69 6e 61 72 79  ry(sqlite3Binary
25180 43 6f 6d 70 61 72 65 43 6f 6c 6c 53 65 71 28 70  CompareCollSeq(p
25190 43 6f 6e 73 74 2d 3e 70 50 61 72 73 65 2c 70 4c  Const->pParse,pL
251a0 65 66 74 2c 70 52 69 67 68 74 29 29 0a 20 20 29  eft,pRight)).  )
251b0 7b 0a 20 20 20 20 63 6f 6e 73 74 49 6e 73 65 72  {.    constInser
251c0 74 28 70 43 6f 6e 73 74 2c 20 70 4c 65 66 74 2c  t(pConst, pLeft,
251d0 20 70 52 69 67 68 74 29 3b 0a 20 20 7d 0a 7d 0a   pRight);.  }.}.
251e0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 61  ./*.** This is a
251f0 20 57 61 6c 6b 65 72 20 65 78 70 72 65 73 73 69   Walker expressi
25200 6f 6e 20 63 61 6c 6c 62 61 63 6b 2e 20 20 70 45  on callback.  pE
25210 78 70 72 20 69 73 20 61 20 63 61 6e 64 69 64 61  xpr is a candida
25220 74 65 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a  te expression.**
25230 20 74 6f 20 62 65 20 72 65 70 6c 61 63 65 64 20   to be replaced 
25240 62 79 20 61 20 76 61 6c 75 65 2e 20 20 49 66 20  by a value.  If 
25250 70 45 78 70 72 20 69 73 20 65 71 75 69 76 61 6c  pExpr is equival
25260 65 6e 74 20 74 6f 20 6f 6e 65 20 6f 66 20 74 68  ent to one of th
25270 65 0a 2a 2a 20 63 6f 6c 75 6d 6e 73 20 6e 61 6d  e.** columns nam
25280 65 64 20 69 6e 20 70 57 61 6c 6b 65 72 2d 3e 75  ed in pWalker->u
25290 2e 70 43 6f 6e 73 74 2c 20 74 68 65 6e 20 6f 76  .pConst, then ov
252a0 65 72 77 72 69 74 65 20 69 74 20 77 69 74 68 20  erwrite it with 
252b0 69 74 73 0a 2a 2a 20 63 6f 72 72 65 73 70 6f 6e  its.** correspon
252c0 64 69 6e 67 20 76 61 6c 75 65 2e 0a 2a 2f 0a 73  ding value..*/.s
252d0 74 61 74 69 63 20 69 6e 74 20 70 72 6f 70 61 67  tatic int propag
252e0 61 74 65 43 6f 6e 73 74 61 6e 74 45 78 70 72 52  ateConstantExprR
252f0 65 77 72 69 74 65 28 57 61 6c 6b 65 72 20 2a 70  ewrite(Walker *p
25300 57 61 6c 6b 65 72 2c 20 45 78 70 72 20 2a 70 45  Walker, Expr *pE
25310 78 70 72 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  xpr){.  int i;. 
25320 20 57 68 65 72 65 43 6f 6e 73 74 20 2a 70 43 6f   WhereConst *pCo
25330 6e 73 74 3b 0a 20 20 69 66 28 20 70 45 78 70 72  nst;.  if( pExpr
25340 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20  ->op!=TK_COLUMN 
25350 29 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e  ) return WRC_Con
25360 74 69 6e 75 65 3b 0a 20 20 69 66 28 20 45 78 70  tinue;.  if( Exp
25370 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
25380 70 72 2c 20 45 50 5f 46 69 78 65 64 43 6f 6c 29  pr, EP_FixedCol)
25390 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f   ) return WRC_Co
253a0 6e 74 69 6e 75 65 3b 0a 20 20 70 43 6f 6e 73 74  ntinue;.  pConst
253b0 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 75 2e 70 43   = pWalker->u.pC
253c0 6f 6e 73 74 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  onst;.  for(i=0;
253d0 20 69 3c 70 43 6f 6e 73 74 2d 3e 6e 43 6f 6e 73   i<pConst->nCons
253e0 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70  t; i++){.    Exp
253f0 72 20 2a 70 43 6f 6c 75 6d 6e 20 3d 20 70 43 6f  r *pColumn = pCo
25400 6e 73 74 2d 3e 61 70 45 78 70 72 5b 69 2a 32 5d  nst->apExpr[i*2]
25410 3b 0a 20 20 20 20 69 66 28 20 70 43 6f 6c 75 6d  ;.    if( pColum
25420 6e 3d 3d 70 45 78 70 72 20 29 20 63 6f 6e 74 69  n==pExpr ) conti
25430 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 70 43 6f  nue;.    if( pCo
25440 6c 75 6d 6e 2d 3e 69 54 61 62 6c 65 21 3d 70 45  lumn->iTable!=pE
25450 78 70 72 2d 3e 69 54 61 62 6c 65 20 29 20 63 6f  xpr->iTable ) co
25460 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20  ntinue;.    if( 
25470 70 43 6f 6c 75 6d 6e 2d 3e 69 43 6f 6c 75 6d 6e  pColumn->iColumn
25480 21 3d 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  !=pExpr->iColumn
25490 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
254a0 20 2f 2a 20 41 20 6d 61 74 63 68 20 69 73 20 66   /* A match is f
254b0 6f 75 6e 64 2e 20 20 41 64 64 20 74 68 65 20 45  ound.  Add the E
254c0 50 5f 46 69 78 65 64 43 6f 6c 20 70 72 6f 70 65  P_FixedCol prope
254d0 72 74 79 20 2a 2f 0a 20 20 20 20 70 43 6f 6e 73  rty */.    pCons
254e0 74 2d 3e 6e 43 68 6e 67 2b 2b 3b 0a 20 20 20 20  t->nChng++;.    
254f0 45 78 70 72 43 6c 65 61 72 50 72 6f 70 65 72 74  ExprClearPropert
25500 79 28 70 45 78 70 72 2c 20 45 50 5f 4c 65 61 66  y(pExpr, EP_Leaf
25510 29 3b 0a 20 20 20 20 45 78 70 72 53 65 74 50 72  );.    ExprSetPr
25520 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
25530 5f 46 69 78 65 64 43 6f 6c 29 3b 0a 20 20 20 20  _FixedCol);.    
25540 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 70  assert( pExpr->p
25550 4c 65 66 74 3d 3d 30 20 29 3b 0a 20 20 20 20 70  Left==0 );.    p
25560 45 78 70 72 2d 3e 70 4c 65 66 74 20 3d 20 73 71  Expr->pLeft = sq
25570 6c 69 74 65 33 45 78 70 72 44 75 70 28 70 43 6f  lite3ExprDup(pCo
25580 6e 73 74 2d 3e 70 50 61 72 73 65 2d 3e 64 62 2c  nst->pParse->db,
25590 20 70 43 6f 6e 73 74 2d 3e 61 70 45 78 70 72 5b   pConst->apExpr[
255a0 69 2a 32 2b 31 5d 2c 20 30 29 3b 0a 20 20 20 20  i*2+1], 0);.    
255b0 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 65 74  break;.  }.  ret
255c0 75 72 6e 20 57 52 43 5f 50 72 75 6e 65 3b 0a 7d  urn WRC_Prune;.}
255d0 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 57 48 45 52  ../*.** The WHER
255e0 45 2d 63 6c 61 75 73 65 20 63 6f 6e 73 74 61 6e  E-clause constan
255f0 74 20 70 72 6f 70 61 67 61 74 69 6f 6e 20 6f 70  t propagation op
25600 74 69 6d 69 7a 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a  timization..**.*
25610 2a 20 49 66 20 74 68 65 20 57 48 45 52 45 20 63  * If the WHERE c
25620 6c 61 75 73 65 20 63 6f 6e 74 61 69 6e 73 20 74  lause contains t
25630 65 72 6d 73 20 6f 66 20 74 68 65 20 66 6f 72 6d  erms of the form
25640 20 43 4f 4c 55 4d 4e 3d 43 4f 4e 53 54 41 4e 54   COLUMN=CONSTANT
25650 20 6f 72 0a 2a 2a 20 43 4f 4e 53 54 41 4e 54 3d   or.** CONSTANT=
25660 43 4f 4c 55 4d 4e 20 74 68 61 74 20 6d 75 73 74  COLUMN that must
25670 20 62 65 20 74 72 65 65 20 28 69 6e 20 6f 74 68   be tree (in oth
25680 65 72 20 77 6f 72 64 73 2c 20 69 66 20 74 68 65  er words, if the
25690 20 74 65 72 6d 73 20 74 6f 70 2d 6c 65 76 65 6c   terms top-level
256a0 0a 2a 2a 20 41 4e 44 2d 63 6f 6e 6e 65 63 74 65  .** AND-connecte
256b0 64 20 74 65 72 6d 73 20 74 68 61 74 20 61 72 65  d terms that are
256c0 20 6e 6f 74 20 70 61 72 74 20 6f 66 20 61 20 4f   not part of a O
256d0 4e 20 63 6c 61 75 73 65 20 66 72 6f 6d 20 61 20  N clause from a 
256e0 4c 45 46 54 20 4a 4f 49 4e 29 0a 2a 2a 20 74 68  LEFT JOIN).** th
256f0 65 6e 20 74 68 72 6f 75 67 68 6f 75 74 20 74 68  en throughout th
25700 65 20 71 75 65 72 79 20 72 65 70 6c 61 63 65 20  e query replace 
25710 61 6c 6c 20 6f 74 68 65 72 20 6f 63 63 75 72 72  all other occurr
25720 65 6e 63 65 73 20 6f 66 20 43 4f 4c 55 4d 4e 0a  ences of COLUMN.
25730 2a 2a 20 77 69 74 68 20 43 4f 4e 53 54 41 4e 54  ** with CONSTANT
25740 20 77 69 74 68 69 6e 20 74 68 65 20 57 48 45 52   within the WHER
25750 45 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20  E clause..**.** 
25760 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 74 68 65  For example, the
25770 20 71 75 65 72 79 3a 0a 2a 2a 0a 2a 2a 20 20 20   query:.**.**   
25780 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d     SELECT * FROM
25790 20 74 31 2c 20 74 32 2c 20 74 33 20 57 48 45 52   t1, t2, t3 WHER
257a0 45 20 74 31 2e 61 3d 33 39 20 41 4e 44 20 74 32  E t1.a=39 AND t2
257b0 2e 62 3d 74 31 2e 61 20 41 4e 44 20 74 33 2e 63  .b=t1.a AND t3.c
257c0 3d 74 32 2e 62 0a 2a 2a 0a 2a 2a 20 49 73 20 74  =t2.b.**.** Is t
257d0 72 61 6e 73 66 6f 72 6d 65 64 20 69 6e 74 6f 0a  ransformed into.
257e0 2a 2a 0a 2a 2a 20 20 20 20 20 20 53 45 4c 45 43  **.**      SELEC
257f0 54 20 2a 20 46 52 4f 4d 20 74 31 2c 20 74 32 2c  T * FROM t1, t2,
25800 20 74 33 20 57 48 45 52 45 20 74 31 2e 61 3d 33   t3 WHERE t1.a=3
25810 39 20 41 4e 44 20 74 32 2e 62 3d 33 39 20 41 4e  9 AND t2.b=39 AN
25820 44 20 74 33 2e 63 3d 33 39 0a 2a 2a 0a 2a 2a 20  D t3.c=39.**.** 
25830 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 61  Return true if a
25840 6e 79 20 74 72 61 6e 73 66 6f 72 6d 61 74 69 6f  ny transformatio
25850 6e 73 20 77 68 65 72 65 20 6d 61 64 65 20 61 6e  ns where made an
25860 64 20 66 61 6c 73 65 20 69 66 20 6e 6f 74 2e 0a  d false if not..
25870 2a 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61  **.** Implementa
25880 74 69 6f 6e 20 6e 6f 74 65 3a 20 20 43 6f 6e 73  tion note:  Cons
25890 74 61 6e 74 20 70 72 6f 70 61 67 61 74 69 6f 6e  tant propagation
258a0 20 69 73 20 74 72 69 63 6b 79 20 64 75 65 20 74   is tricky due t
258b0 6f 20 61 66 66 69 6e 69 74 79 0a 2a 2a 20 61 6e  o affinity.** an
258c0 64 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  d collating sequ
258d0 65 6e 63 65 20 69 6e 74 65 72 61 63 74 69 6f 6e  ence interaction
258e0 73 2e 20 20 43 6f 6e 73 69 64 65 72 20 74 68 69  s.  Consider thi
258f0 73 20 65 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a  s example:.**.**
25900 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
25910 20 74 31 28 61 20 49 4e 54 2c 62 20 54 45 58 54   t1(a INT,b TEXT
25920 29 3b 0a 2a 2a 20 20 20 20 49 4e 53 45 52 54 20  );.**    INSERT 
25930 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 31  INTO t1 VALUES(1
25940 32 33 2c 27 30 31 32 33 27 29 3b 0a 2a 2a 20 20  23,'0123');.**  
25950 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
25960 74 31 20 57 48 45 52 45 20 61 3d 31 32 33 20 41  t1 WHERE a=123 A
25970 4e 44 20 62 3d 61 3b 0a 2a 2a 20 20 20 20 53 45  ND b=a;.**    SE
25980 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 57  LECT * FROM t1 W
25990 48 45 52 45 20 61 3d 31 32 33 20 41 4e 44 20 62  HERE a=123 AND b
259a0 3d 31 32 33 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 20  =123;.**.** The 
259b0 74 77 6f 20 53 45 4c 45 43 54 20 73 74 61 74 65  two SELECT state
259c0 6d 65 6e 74 73 20 61 62 6f 76 65 20 73 68 6f 75  ments above shou
259d0 6c 64 20 72 65 74 75 72 6e 20 64 69 66 66 65 72  ld return differ
259e0 65 6e 74 20 61 6e 73 77 65 72 73 2e 20 20 62 3d  ent answers.  b=
259f0 61 0a 2a 2a 20 69 73 20 61 6c 77 61 79 20 74 72  a.** is alway tr
25a00 75 65 20 62 65 63 61 75 73 65 20 74 68 65 20 63  ue because the c
25a10 6f 6d 70 61 72 69 73 6f 6e 20 75 73 65 73 20 6e  omparison uses n
25a20 75 6d 65 72 69 63 20 61 66 66 69 6e 69 74 79 2c  umeric affinity,
25a30 20 62 75 74 20 62 3d 31 32 33 0a 2a 2a 20 69 73   but b=123.** is
25a40 20 66 61 6c 73 65 20 62 65 63 61 75 73 65 20 69   false because i
25a50 74 20 75 73 65 73 20 74 65 78 74 20 61 66 66 69  t uses text affi
25a60 6e 69 74 79 20 61 6e 64 20 27 30 31 32 33 27 20  nity and '0123' 
25a70 69 73 20 6e 6f 74 20 74 68 65 20 73 61 6d 65 20  is not the same 
25a80 61 73 20 27 31 32 33 27 2e 0a 2a 2a 20 54 6f 20  as '123'..** To 
25a90 77 6f 72 6b 20 61 72 6f 75 6e 64 20 74 68 69 73  work around this
25aa0 2c 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  , the expression
25ab0 20 74 72 65 65 20 69 73 20 6e 6f 74 20 61 63 74   tree is not act
25ac0 75 61 6c 6c 79 20 63 68 61 6e 67 65 64 20 66 72  ually changed fr
25ad0 6f 6d 0a 2a 2a 20 22 62 3d 61 22 20 74 6f 20 22  om.** "b=a" to "
25ae0 62 3d 31 32 33 22 20 62 75 74 20 72 61 74 68 65  b=123" but rathe
25af0 72 20 74 68 65 20 22 61 22 20 69 6e 20 22 62 3d  r the "a" in "b=
25b00 61 22 20 69 73 20 74 61 67 67 65 64 20 77 69 74  a" is tagged wit
25b10 68 20 45 50 5f 46 69 78 65 64 43 6f 6c 0a 2a 2a  h EP_FixedCol.**
25b20 20 61 6e 64 20 74 68 65 20 22 31 32 33 22 20 76   and the "123" v
25b30 61 6c 75 65 20 69 73 20 68 75 6e 67 20 6f 66 66  alue is hung off
25b40 20 6f 66 20 74 68 65 20 70 4c 65 66 74 20 70 6f   of the pLeft po
25b50 69 6e 74 65 72 2e 20 20 43 6f 64 65 20 67 65 6e  inter.  Code gen
25b60 65 72 61 74 6f 72 0a 2a 2a 20 72 6f 75 74 69 6e  erator.** routin
25b70 65 73 20 6b 6e 6f 77 20 74 6f 20 67 65 6e 65 72  es know to gener
25b80 61 74 65 20 74 68 65 20 63 6f 6e 73 74 61 6e 74  ate the constant
25b90 20 22 31 32 33 22 20 69 6e 73 74 65 61 64 20 6f   "123" instead o
25ba0 66 20 6c 6f 6f 6b 69 6e 67 20 75 70 20 74 68 65  f looking up the
25bb0 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65  .** column value
25bc0 2e 20 20 41 6c 73 6f 2c 20 74 6f 20 61 76 6f 69  .  Also, to avoi
25bd0 64 20 63 6f 6c 6c 61 74 69 6f 6e 20 70 72 6f 62  d collation prob
25be0 6c 65 6d 73 2c 20 74 68 69 73 20 6f 70 74 69 6d  lems, this optim
25bf0 69 7a 61 74 69 6f 6e 20 69 73 0a 2a 2a 20 6f 6e  ization is.** on
25c00 6c 79 20 61 74 74 65 6d 70 74 65 64 20 69 66 20  ly attempted if 
25c10 74 68 65 20 22 61 3d 31 32 33 22 20 74 65 72 6d  the "a=123" term
25c20 20 75 73 65 73 20 74 68 65 20 64 65 66 61 75 6c   uses the defaul
25c30 74 20 42 49 4e 41 52 59 20 63 6f 6c 6c 61 74 69  t BINARY collati
25c40 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  on..*/.static in
25c50 74 20 70 72 6f 70 61 67 61 74 65 43 6f 6e 73 74  t propagateConst
25c60 61 6e 74 73 28 0a 20 20 50 61 72 73 65 20 2a 70  ants(.  Parse *p
25c70 50 61 72 73 65 2c 20 20 20 2f 2a 20 54 68 65 20  Parse,   /* The 
25c80 70 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  parsing context 
25c90 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 20 20  */.  Select *p  
25ca0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 71 75 65        /* The que
25cb0 72 79 20 69 6e 20 77 68 69 63 68 20 74 6f 20 70  ry in which to p
25cc0 72 6f 70 61 67 61 74 65 20 63 6f 6e 73 74 61 6e  ropagate constan
25cd0 74 73 20 2a 2f 0a 29 7b 0a 20 20 57 68 65 72 65  ts */.){.  Where
25ce0 43 6f 6e 73 74 20 78 3b 0a 20 20 57 61 6c 6b 65  Const x;.  Walke
25cf0 72 20 77 3b 0a 20 20 69 6e 74 20 6e 43 68 6e 67  r w;.  int nChng
25d00 20 3d 20 30 3b 0a 20 20 78 2e 70 50 61 72 73 65   = 0;.  x.pParse
25d10 20 3d 20 70 50 61 72 73 65 3b 0a 20 20 64 6f 7b   = pParse;.  do{
25d20 0a 20 20 20 20 78 2e 6e 43 6f 6e 73 74 20 3d 20  .    x.nConst = 
25d30 30 3b 0a 20 20 20 20 78 2e 6e 43 68 6e 67 20 3d  0;.    x.nChng =
25d40 20 30 3b 0a 20 20 20 20 78 2e 61 70 45 78 70 72   0;.    x.apExpr
25d50 20 3d 20 30 3b 0a 20 20 20 20 66 69 6e 64 43 6f   = 0;.    findCo
25d60 6e 73 74 49 6e 57 68 65 72 65 28 26 78 2c 20 70  nstInWhere(&x, p
25d70 2d 3e 70 57 68 65 72 65 29 3b 0a 20 20 20 20 69  ->pWhere);.    i
25d80 66 28 20 78 2e 6e 43 6f 6e 73 74 20 29 7b 0a 20  f( x.nConst ){. 
25d90 20 20 20 20 20 6d 65 6d 73 65 74 28 26 77 2c 20       memset(&w, 
25da0 30 2c 20 73 69 7a 65 6f 66 28 77 29 29 3b 0a 20  0, sizeof(w));. 
25db0 20 20 20 20 20 77 2e 70 50 61 72 73 65 20 3d 20       w.pParse = 
25dc0 70 50 61 72 73 65 3b 0a 20 20 20 20 20 20 77 2e  pParse;.      w.
25dd0 78 45 78 70 72 43 61 6c 6c 62 61 63 6b 20 3d 20  xExprCallback = 
25de0 70 72 6f 70 61 67 61 74 65 43 6f 6e 73 74 61 6e  propagateConstan
25df0 74 45 78 70 72 52 65 77 72 69 74 65 3b 0a 20 20  tExprRewrite;.  
25e00 20 20 20 20 77 2e 78 53 65 6c 65 63 74 43 61 6c      w.xSelectCal
25e10 6c 62 61 63 6b 20 3d 20 73 71 6c 69 74 65 33 53  lback = sqlite3S
25e20 65 6c 65 63 74 57 61 6c 6b 4e 6f 6f 70 3b 0a 20  electWalkNoop;. 
25e30 20 20 20 20 20 77 2e 78 53 65 6c 65 63 74 43 61       w.xSelectCa
25e40 6c 6c 62 61 63 6b 32 20 3d 20 30 3b 0a 20 20 20  llback2 = 0;.   
25e50 20 20 20 77 2e 77 61 6c 6b 65 72 44 65 70 74 68     w.walkerDepth
25e60 20 3d 20 30 3b 0a 20 20 20 20 20 20 77 2e 75 2e   = 0;.      w.u.
25e70 70 43 6f 6e 73 74 20 3d 20 26 78 3b 0a 20 20 20  pConst = &x;.   
25e80 20 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 45 78     sqlite3WalkEx
25e90 70 72 28 26 77 2c 20 70 2d 3e 70 57 68 65 72 65  pr(&w, p->pWhere
25ea0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
25eb0 44 62 46 72 65 65 28 78 2e 70 50 61 72 73 65 2d  DbFree(x.pParse-
25ec0 3e 64 62 2c 20 78 2e 61 70 45 78 70 72 29 3b 0a  >db, x.apExpr);.
25ed0 20 20 20 20 20 20 6e 43 68 6e 67 20 2b 3d 20 78        nChng += x
25ee0 2e 6e 43 68 6e 67 3b 0a 20 20 20 20 7d 0a 20 20  .nChng;.    }.  
25ef0 7d 77 68 69 6c 65 28 20 78 2e 6e 43 68 6e 67 20  }while( x.nChng 
25f00 29 3b 20 20 0a 20 20 72 65 74 75 72 6e 20 6e 43  );  .  return nC
25f10 68 6e 67 3b 0a 7d 0a 0a 23 69 66 20 21 64 65 66  hng;.}..#if !def
25f20 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
25f30 5f 53 55 42 51 55 45 52 59 29 20 7c 7c 20 21 64  _SUBQUERY) || !d
25f40 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
25f50 49 54 5f 56 49 45 57 29 0a 2f 2a 0a 2a 2a 20 4d  IT_VIEW)./*.** M
25f60 61 6b 65 20 63 6f 70 69 65 73 20 6f 66 20 72 65  ake copies of re
25f70 6c 65 76 61 6e 74 20 57 48 45 52 45 20 63 6c 61  levant WHERE cla
25f80 75 73 65 20 74 65 72 6d 73 20 6f 66 20 74 68 65  use terms of the
25f90 20 6f 75 74 65 72 20 71 75 65 72 79 20 69 6e 74   outer query int
25fa0 6f 0a 2a 2a 20 74 68 65 20 57 48 45 52 45 20 63  o.** the WHERE c
25fb0 6c 61 75 73 65 20 6f 66 20 73 75 62 71 75 65 72  lause of subquer
25fc0 79 2e 20 20 45 78 61 6d 70 6c 65 3a 0a 2a 2a 0a  y.  Example:.**.
25fd0 2a 2a 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46  **    SELECT * F
25fe0 52 4f 4d 20 28 53 45 4c 45 43 54 20 61 20 41 53  ROM (SELECT a AS
25ff0 20 78 2c 20 63 2d 64 20 41 53 20 79 20 46 52 4f   x, c-d AS y FRO
26000 4d 20 74 31 29 20 57 48 45 52 45 20 78 3d 35 20  M t1) WHERE x=5 
26010 41 4e 44 20 79 3d 31 30 3b 0a 2a 2a 0a 2a 2a 20  AND y=10;.**.** 
26020 54 72 61 6e 73 66 6f 72 6d 65 64 20 69 6e 74 6f  Transformed into
26030 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 53 45 4c 45 43  :.**.**    SELEC
26040 54 20 2a 20 46 52 4f 4d 20 28 53 45 4c 45 43 54  T * FROM (SELECT
26050 20 61 20 41 53 20 78 2c 20 63 2d 64 20 41 53 20   a AS x, c-d AS 
26060 79 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20  y FROM t1 WHERE 
26070 61 3d 35 20 41 4e 44 20 63 2d 64 3d 31 30 29 0a  a=5 AND c-d=10).
26080 2a 2a 20 20 20 20 20 57 48 45 52 45 20 78 3d 35  **     WHERE x=5
26090 20 41 4e 44 20 79 3d 31 30 3b 0a 2a 2a 0a 2a 2a   AND y=10;.**.**
260a0 20 54 68 65 20 68 6f 70 65 20 69 73 20 74 68 61   The hope is tha
260b0 74 20 74 68 65 20 74 65 72 6d 73 20 61 64 64 65  t the terms adde
260c0 64 20 74 6f 20 74 68 65 20 69 6e 6e 65 72 20 71  d to the inner q
260d0 75 65 72 79 20 77 69 6c 6c 20 6d 61 6b 65 20 69  uery will make i
260e0 74 20 6d 6f 72 65 0a 2a 2a 20 65 66 66 69 63 69  t more.** effici
260f0 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 44 6f 20 6e 6f  ent..**.** Do no
26100 74 20 61 74 74 65 6d 70 74 20 74 68 69 73 20 6f  t attempt this o
26110 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69 66 3a 0a  ptimization if:.
26120 2a 2a 0a 2a 2a 20 20 20 28 31 29 20 28 2a 2a 20  **.**   (1) (** 
26130 54 68 69 73 20 72 65 73 74 72 69 63 74 69 6f 6e  This restriction
26140 20 77 61 73 20 72 65 6d 6f 76 65 64 20 6f 6e 20   was removed on 
26150 32 30 31 37 2d 30 39 2d 32 39 2e 20 20 57 65 20  2017-09-29.  We 
26160 75 73 65 64 20 74 6f 0a 2a 2a 20 20 20 20 20 20  used to.**      
26170 20 20 20 20 20 64 69 73 61 6c 6c 6f 77 20 74 68       disallow th
26180 69 73 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20  is optimization 
26190 66 6f 72 20 61 67 67 72 65 67 61 74 65 20 73 75  for aggregate su
261a0 62 71 75 65 72 69 65 73 2c 20 62 75 74 20 6e 6f  bqueries, but no
261b0 77 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 69  w.**           i
261c0 74 20 69 73 20 61 6c 6c 6f 77 65 64 20 62 79 20  t is allowed by 
261d0 70 75 74 74 69 6e 67 20 74 68 65 20 65 78 74 72  putting the extr
261e0 61 20 74 65 72 6d 73 20 6f 6e 20 74 68 65 20 48  a terms on the H
261f0 41 56 49 4e 47 20 63 6c 61 75 73 65 2e 0a 2a 2a  AVING clause..**
26200 20 20 20 20 20 20 20 20 20 20 20 54 68 65 20 61             The a
26210 64 64 65 64 20 48 41 56 49 4e 47 20 63 6c 61 75  dded HAVING clau
26220 73 65 20 69 73 20 70 6f 69 6e 74 6c 65 73 73 20  se is pointless 
26230 69 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20  if the subquery 
26240 6c 61 63 6b 73 0a 2a 2a 20 20 20 20 20 20 20 20  lacks.**        
26250 20 20 20 61 20 47 52 4f 55 50 20 42 59 20 63 6c     a GROUP BY cl
26260 61 75 73 65 2e 20 20 42 75 74 20 73 75 63 68 20  ause.  But such 
26270 61 20 48 41 56 49 4e 47 20 63 6c 61 75 73 65 20  a HAVING clause 
26280 69 73 20 61 6c 73 6f 20 68 61 72 6d 6c 65 73 73  is also harmless
26290 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 73 6f  .**           so
262a0 20 74 68 65 72 65 20 64 6f 65 73 20 6e 6f 74 20   there does not 
262b0 61 70 70 65 61 72 20 74 6f 20 62 65 20 61 6e 79  appear to be any
262c0 20 72 65 61 73 6f 6e 20 74 6f 20 61 64 64 20 65   reason to add e
262d0 78 74 72 61 20 6c 6f 67 69 63 0a 2a 2a 20 20 20  xtra logic.**   
262e0 20 20 20 20 20 20 20 20 74 6f 20 73 75 70 70 72          to suppr
262f0 65 73 73 20 69 74 2e 20 2a 2a 29 0a 2a 2a 0a 2a  ess it. **).**.*
26300 2a 20 20 20 28 32 29 20 54 68 65 20 69 6e 6e 65  *   (2) The inne
26310 72 20 71 75 65 72 79 20 69 73 20 74 68 65 20 72  r query is the r
26320 65 63 75 72 73 69 76 65 20 70 61 72 74 20 6f 66  ecursive part of
26330 20 61 20 63 6f 6d 6d 6f 6e 20 74 61 62 6c 65 20   a common table 
26340 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 0a 2a  expression..**.*
26350 2a 20 20 20 28 33 29 20 54 68 65 20 69 6e 6e 65  *   (3) The inne
26360 72 20 71 75 65 72 79 20 68 61 73 20 61 20 4c 49  r query has a LI
26370 4d 49 54 20 63 6c 61 75 73 65 20 28 73 69 6e 63  MIT clause (sinc
26380 65 20 74 68 65 20 63 68 61 6e 67 65 73 20 74 6f  e the changes to
26390 20 74 68 65 20 57 48 45 52 45 0a 2a 2a 20 20 20   the WHERE.**   
263a0 20 20 20 20 63 6c 61 75 73 65 20 77 6f 75 6c 64      clause would
263b0 20 63 68 61 6e 67 65 20 74 68 65 20 6d 65 61 6e   change the mean
263c0 69 6e 67 20 6f 66 20 74 68 65 20 4c 49 4d 49 54  ing of the LIMIT
263d0 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 34 29 20 54  )..**.**   (4) T
263e0 68 65 20 69 6e 6e 65 72 20 71 75 65 72 79 20 69  he inner query i
263f0 73 20 74 68 65 20 72 69 67 68 74 20 6f 70 65 72  s the right oper
26400 61 6e 64 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f  and of a LEFT JO
26410 49 4e 20 61 6e 64 20 74 68 65 0a 2a 2a 20 20 20  IN and the.**   
26420 20 20 20 20 65 78 70 72 65 73 73 69 6f 6e 20 74      expression t
26430 6f 20 62 65 20 70 75 73 68 65 64 20 64 6f 77 6e  o be pushed down
26440 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6d 65 20 66   does not come f
26450 72 6f 6d 20 74 68 65 20 4f 4e 20 63 6c 61 75 73  rom the ON claus
26460 65 0a 2a 2a 20 20 20 20 20 20 20 6f 6e 20 74 68  e.**       on th
26470 61 74 20 4c 45 46 54 20 4a 4f 49 4e 2e 0a 2a 2a  at LEFT JOIN..**
26480 0a 2a 2a 20 20 20 28 35 29 20 54 68 65 20 57 48  .**   (5) The WH
26490 45 52 45 20 63 6c 61 75 73 65 20 65 78 70 72 65  ERE clause expre
264a0 73 73 69 6f 6e 20 6f 72 69 67 69 6e 61 74 65 73  ssion originates
264b0 20 69 6e 20 74 68 65 20 4f 4e 20 6f 72 20 55 53   in the ON or US
264c0 49 4e 47 20 63 6c 61 75 73 65 0a 2a 2a 20 20 20  ING clause.**   
264d0 20 20 20 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f      of a LEFT JO
264e0 49 4e 20 77 68 65 72 65 20 69 43 75 72 73 6f 72  IN where iCursor
264f0 20 69 73 20 6e 6f 74 20 74 68 65 20 72 69 67 68   is not the righ
26500 74 2d 68 61 6e 64 20 74 61 62 6c 65 20 6f 66 20  t-hand table of 
26510 74 68 61 74 0a 2a 2a 20 20 20 20 20 20 20 6c 65  that.**       le
26520 66 74 20 6a 6f 69 6e 2e 20 20 41 6e 20 65 78 61  ft join.  An exa
26530 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  mple:.**.**     
26540 20 20 20 20 20 20 53 45 4c 45 43 54 20 2a 0a 2a        SELECT *.*
26550 2a 20 20 20 20 20 20 20 20 20 20 20 46 52 4f 4d  *           FROM
26560 20 28 53 45 4c 45 43 54 20 31 20 41 53 20 61 31   (SELECT 1 AS a1
26570 20 55 4e 49 4f 4e 20 41 4c 4c 20 53 45 4c 45 43   UNION ALL SELEC
26580 54 20 32 29 20 41 53 20 61 61 0a 2a 2a 20 20 20  T 2) AS aa.**   
26590 20 20 20 20 20 20 20 20 4a 4f 49 4e 20 28 53 45          JOIN (SE
265a0 4c 45 43 54 20 31 20 41 53 20 62 32 20 55 4e 49  LECT 1 AS b2 UNI
265b0 4f 4e 20 41 4c 4c 20 53 45 4c 45 43 54 20 32 29  ON ALL SELECT 2)
265c0 20 41 53 20 62 62 20 4f 4e 20 28 61 31 3d 62 32   AS bb ON (a1=b2
265d0 29 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 4c  ).**           L
265e0 45 46 54 20 4a 4f 49 4e 20 28 53 45 4c 45 43 54  EFT JOIN (SELECT
265f0 20 38 20 41 53 20 63 33 20 55 4e 49 4f 4e 20 41   8 AS c3 UNION A
26600 4c 4c 20 53 45 4c 45 43 54 20 39 29 20 41 53 20  LL SELECT 9) AS 
26610 63 63 20 4f 4e 20 28 62 32 3d 32 29 3b 0a 2a 2a  cc ON (b2=2);.**
26620 0a 2a 2a 20 20 20 20 20 20 20 54 68 65 20 63 6f  .**       The co
26630 72 72 65 63 74 20 61 6e 73 77 65 72 20 69 73 20  rrect answer is 
26640 74 68 72 65 65 20 72 6f 77 73 3a 20 20 28 31 2c  three rows:  (1,
26650 31 2c 4e 55 4c 4c 29 2c 28 32 2c 32 2c 38 29 2c  1,NULL),(2,2,8),
26660 28 32 2c 32 2c 39 29 2e 0a 2a 2a 20 20 20 20 20  (2,2,9)..**     
26670 20 20 42 75 74 20 69 66 20 74 68 65 20 28 62 32    But if the (b2
26680 3d 32 29 20 74 65 72 6d 20 77 65 72 65 20 74 6f  =2) term were to
26690 20 62 65 20 70 75 73 68 65 64 20 64 6f 77 6e 20   be pushed down 
266a0 69 6e 74 6f 20 74 68 65 20 62 62 20 73 75 62 71  into the bb subq
266b0 75 65 72 79 2c 0a 2a 2a 20 20 20 20 20 20 20 74  uery,.**       t
266c0 68 65 6e 20 74 68 65 20 28 31 2c 31 2c 4e 55 4c  hen the (1,1,NUL
266d0 4c 29 20 72 6f 77 20 77 6f 75 6c 64 20 62 65 20  L) row would be 
266e0 73 75 70 70 72 65 73 73 65 64 2e 0a 2a 2a 0a 2a  suppressed..**.*
266f0 2a 20 20 20 28 36 29 20 54 68 65 20 69 6e 6e 65  *   (6) The inne
26700 72 20 71 75 65 72 79 20 66 65 61 74 75 72 65 73  r query features
26710 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 77 69 6e   one or more win
26720 64 6f 77 2d 66 75 6e 63 74 69 6f 6e 73 20 28 73  dow-functions (s
26730 69 6e 63 65 20 0a 2a 2a 20 20 20 20 20 20 20 63  ince .**       c
26740 68 61 6e 67 65 73 20 74 6f 20 74 68 65 20 57 48  hanges to the WH
26750 45 52 45 20 63 6c 61 75 73 65 20 6f 66 20 74 68  ERE clause of th
26760 65 20 69 6e 6e 65 72 20 71 75 65 72 79 20 63 6f  e inner query co
26770 75 6c 64 20 63 68 61 6e 67 65 20 74 68 65 20 0a  uld change the .
26780 2a 2a 20 20 20 20 20 20 20 77 69 6e 64 6f 77 20  **       window 
26790 6f 76 65 72 20 77 68 69 63 68 20 77 69 6e 64 6f  over which windo
267a0 77 20 66 75 6e 63 74 69 6f 6e 73 20 61 72 65 20  w functions are 
267b0 63 61 6c 63 75 6c 61 74 65 64 29 2e 0a 2a 2a 0a  calculated)..**.
267c0 2a 2a 20 52 65 74 75 72 6e 20 30 20 69 66 20 6e  ** Return 0 if n
267d0 6f 20 63 68 61 6e 67 65 73 20 61 72 65 20 6d 61  o changes are ma
267e0 64 65 20 61 6e 64 20 6e 6f 6e 2d 7a 65 72 6f 20  de and non-zero 
267f0 69 66 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 57  if one or more W
26800 48 45 52 45 20 63 6c 61 75 73 65 0a 2a 2a 20 74  HERE clause.** t
26810 65 72 6d 73 20 61 72 65 20 64 75 70 6c 69 63 61  erms are duplica
26820 74 65 64 20 69 6e 74 6f 20 74 68 65 20 73 75 62  ted into the sub
26830 71 75 65 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63  query..*/.static
26840 20 69 6e 74 20 70 75 73 68 44 6f 77 6e 57 68 65   int pushDownWhe
26850 72 65 54 65 72 6d 73 28 0a 20 20 50 61 72 73 65  reTerms(.  Parse
26860 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
26870 20 2f 2a 20 50 61 72 73 65 20 63 6f 6e 74 65 78   /* Parse contex
26880 74 20 28 66 6f 72 20 6d 61 6c 6c 6f 63 28 29 20  t (for malloc() 
26890 61 6e 64 20 65 72 72 6f 72 20 72 65 70 6f 72 74  and error report
268a0 69 6e 67 29 20 2a 2f 0a 20 20 53 65 6c 65 63 74  ing) */.  Select
268b0 20 2a 70 53 75 62 71 2c 20 20 20 20 20 20 20 20   *pSubq,        
268c0 2f 2a 20 54 68 65 20 73 75 62 71 75 65 72 79 20  /* The subquery 
268d0 77 68 6f 73 65 20 57 48 45 52 45 20 63 6c 61 75  whose WHERE clau
268e0 73 65 20 69 73 20 74 6f 20 62 65 20 61 75 67 6d  se is to be augm
268f0 65 6e 74 65 64 20 2a 2f 0a 20 20 45 78 70 72 20  ented */.  Expr 
26900 2a 70 57 68 65 72 65 2c 20 20 20 20 20 20 20 20  *pWhere,        
26910 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c   /* The WHERE cl
26920 61 75 73 65 20 6f 66 20 74 68 65 20 6f 75 74 65  ause of the oute
26930 72 20 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74  r query */.  int
26940 20 69 43 75 72 73 6f 72 2c 20 20 20 20 20 20 20   iCursor,       
26950 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6e 75 6d     /* Cursor num
26960 62 65 72 20 6f 66 20 74 68 65 20 73 75 62 71 75  ber of the subqu
26970 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20 69 73 4c  ery */.  int isL
26980 65 66 74 4a 6f 69 6e 20 20 20 20 20 20 20 20 2f  eftJoin        /
26990 2a 20 54 72 75 65 20 69 66 20 70 53 75 62 71 20  * True if pSubq 
269a0 69 73 20 74 68 65 20 72 69 67 68 74 20 74 65 72  is the right ter
269b0 6d 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e  m of a LEFT JOIN
269c0 20 2a 2f 0a 29 7b 0a 20 20 45 78 70 72 20 2a 70   */.){.  Expr *p
269d0 4e 65 77 3b 0a 20 20 69 6e 74 20 6e 43 68 6e 67  New;.  int nChng
269e0 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 57 68 65   = 0;.  if( pWhe
269f0 72 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  re==0 ) return 0
26a00 3b 0a 20 20 69 66 28 20 70 53 75 62 71 2d 3e 73  ;.  if( pSubq->s
26a10 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 52 65 63  elFlags & SF_Rec
26a20 75 72 73 69 76 65 20 29 20 72 65 74 75 72 6e 20  ursive ) return 
26a30 30 3b 20 20 2f 2a 20 72 65 73 74 72 69 63 74 69  0;  /* restricti
26a40 6f 6e 20 28 32 29 20 2a 2f 0a 0a 23 69 66 6e 64  on (2) */..#ifnd
26a50 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57  ef SQLITE_OMIT_W
26a60 49 4e 44 4f 57 46 55 4e 43 0a 20 20 69 66 28 20  INDOWFUNC.  if( 
26a70 70 53 75 62 71 2d 3e 70 57 69 6e 20 29 20 72 65  pSubq->pWin ) re
26a80 74 75 72 6e 20 30 3b 20 20 20 20 2f 2a 20 72 65  turn 0;    /* re
26a90 73 74 72 69 63 74 69 6f 6e 20 28 36 29 20 2a 2f  striction (6) */
26aa0 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20  .#endif..#ifdef 
26ab0 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 2f  SQLITE_DEBUG.  /
26ac0 2a 20 4f 6e 6c 79 20 74 68 65 20 66 69 72 73 74  * Only the first
26ad0 20 74 65 72 6d 20 6f 66 20 61 20 63 6f 6d 70 6f   term of a compo
26ae0 75 6e 64 20 63 61 6e 20 68 61 76 65 20 61 20 57  und can have a W
26af0 49 54 48 20 63 6c 61 75 73 65 2e 20 20 42 75 74  ITH clause.  But
26b00 20 6d 61 6b 65 0a 20 20 2a 2a 20 73 75 72 65 20   make.  ** sure 
26b10 6e 6f 20 6f 74 68 65 72 20 74 65 72 6d 73 20 61  no other terms a
26b20 72 65 20 6d 61 72 6b 65 64 20 53 46 5f 52 65 63  re marked SF_Rec
26b30 75 72 73 69 76 65 20 69 6e 20 63 61 73 65 20 73  ursive in case s
26b40 6f 6d 65 74 68 69 6e 67 20 63 68 61 6e 67 65 73  omething changes
26b50 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20 66 75 74  .  ** in the fut
26b60 75 72 65 2e 0a 20 20 2a 2f 0a 20 20 7b 0a 20 20  ure..  */.  {.  
26b70 20 20 53 65 6c 65 63 74 20 2a 70 58 3b 20 20 0a    Select *pX;  .
26b80 20 20 20 20 66 6f 72 28 70 58 3d 70 53 75 62 71      for(pX=pSubq
26b90 3b 20 70 58 3b 20 70 58 3d 70 58 2d 3e 70 50 72  ; pX; pX=pX->pPr
26ba0 69 6f 72 29 7b 0a 20 20 20 20 20 20 61 73 73 65  ior){.      asse
26bb0 72 74 28 20 28 70 58 2d 3e 73 65 6c 46 6c 61 67  rt( (pX->selFlag
26bc0 73 20 26 20 28 53 46 5f 52 65 63 75 72 73 69 76  s & (SF_Recursiv
26bd0 65 29 29 3d 3d 30 20 29 3b 0a 20 20 20 20 7d 0a  e))==0 );.    }.
26be0 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66    }.#endif..  if
26bf0 28 20 70 53 75 62 71 2d 3e 70 4c 69 6d 69 74 21  ( pSubq->pLimit!
26c00 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
26c10 20 30 3b 20 2f 2a 20 72 65 73 74 72 69 63 74 69   0; /* restricti
26c20 6f 6e 20 28 33 29 20 2a 2f 0a 20 20 7d 0a 20 20  on (3) */.  }.  
26c30 77 68 69 6c 65 28 20 70 57 68 65 72 65 2d 3e 6f  while( pWhere->o
26c40 70 3d 3d 54 4b 5f 41 4e 44 20 29 7b 0a 20 20 20  p==TK_AND ){.   
26c50 20 6e 43 68 6e 67 20 2b 3d 20 70 75 73 68 44 6f   nChng += pushDo
26c60 77 6e 57 68 65 72 65 54 65 72 6d 73 28 70 50 61  wnWhereTerms(pPa
26c70 72 73 65 2c 20 70 53 75 62 71 2c 20 70 57 68 65  rse, pSubq, pWhe
26c80 72 65 2d 3e 70 52 69 67 68 74 2c 0a 20 20 20 20  re->pRight,.    
26c90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26ca0 20 20 20 20 20 20 20 20 20 20 20 20 69 43 75 72              iCur
26cb0 73 6f 72 2c 20 69 73 4c 65 66 74 4a 6f 69 6e 29  sor, isLeftJoin)
26cc0 3b 0a 20 20 20 20 70 57 68 65 72 65 20 3d 20 70  ;.    pWhere = p
26cd0 57 68 65 72 65 2d 3e 70 4c 65 66 74 3b 0a 20 20  Where->pLeft;.  
26ce0 7d 0a 20 20 69 66 28 20 69 73 4c 65 66 74 4a 6f  }.  if( isLeftJo
26cf0 69 6e 0a 20 20 20 26 26 20 28 45 78 70 72 48 61  in.   && (ExprHa
26d00 73 50 72 6f 70 65 72 74 79 28 70 57 68 65 72 65  sProperty(pWhere
26d10 2c 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 3d 3d 30  ,EP_FromJoin)==0
26d20 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 70 57 68  .         || pWh
26d30 65 72 65 2d 3e 69 52 69 67 68 74 4a 6f 69 6e 54  ere->iRightJoinT
26d40 61 62 6c 65 21 3d 69 43 75 72 73 6f 72 29 0a 20  able!=iCursor). 
26d50 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
26d60 3b 20 2f 2a 20 72 65 73 74 72 69 63 74 69 6f 6e  ; /* restriction
26d70 20 28 34 29 20 2a 2f 0a 20 20 7d 0a 20 20 69 66   (4) */.  }.  if
26d80 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  ( ExprHasPropert
26d90 79 28 70 57 68 65 72 65 2c 45 50 5f 46 72 6f 6d  y(pWhere,EP_From
26da0 4a 6f 69 6e 29 20 26 26 20 70 57 68 65 72 65 2d  Join) && pWhere-
26db0 3e 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65  >iRightJoinTable
26dc0 21 3d 69 43 75 72 73 6f 72 20 29 7b 0a 20 20 20  !=iCursor ){.   
26dd0 20 72 65 74 75 72 6e 20 30 3b 20 2f 2a 20 72 65   return 0; /* re
26de0 73 74 72 69 63 74 69 6f 6e 20 28 35 29 20 2a 2f  striction (5) */
26df0 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c 69 74  .  }.  if( sqlit
26e00 65 33 45 78 70 72 49 73 54 61 62 6c 65 43 6f 6e  e3ExprIsTableCon
26e10 73 74 61 6e 74 28 70 57 68 65 72 65 2c 20 69 43  stant(pWhere, iC
26e20 75 72 73 6f 72 29 20 29 7b 0a 20 20 20 20 6e 43  ursor) ){.    nC
26e30 68 6e 67 2b 2b 3b 0a 20 20 20 20 77 68 69 6c 65  hng++;.    while
26e40 28 20 70 53 75 62 71 20 29 7b 0a 20 20 20 20 20  ( pSubq ){.     
26e50 20 53 75 62 73 74 43 6f 6e 74 65 78 74 20 78 3b   SubstContext x;
26e60 0a 20 20 20 20 20 20 70 4e 65 77 20 3d 20 73 71  .      pNew = sq
26e70 6c 69 74 65 33 45 78 70 72 44 75 70 28 70 50 61  lite3ExprDup(pPa
26e80 72 73 65 2d 3e 64 62 2c 20 70 57 68 65 72 65 2c  rse->db, pWhere,
26e90 20 30 29 3b 0a 20 20 20 20 20 20 75 6e 73 65 74   0);.      unset
26ea0 4a 6f 69 6e 45 78 70 72 28 70 4e 65 77 2c 20 2d  JoinExpr(pNew, -
26eb0 31 29 3b 0a 20 20 20 20 20 20 78 2e 70 50 61 72  1);.      x.pPar
26ec0 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20 20  se = pParse;.   
26ed0 20 20 20 78 2e 69 54 61 62 6c 65 20 3d 20 69 43     x.iTable = iC
26ee0 75 72 73 6f 72 3b 0a 20 20 20 20 20 20 78 2e 69  ursor;.      x.i
26ef0 4e 65 77 54 61 62 6c 65 20 3d 20 69 43 75 72 73  NewTable = iCurs
26f00 6f 72 3b 0a 20 20 20 20 20 20 78 2e 69 73 4c 65  or;.      x.isLe
26f10 66 74 4a 6f 69 6e 20 3d 20 30 3b 0a 20 20 20 20  ftJoin = 0;.    
26f20 20 20 78 2e 70 45 4c 69 73 74 20 3d 20 70 53 75    x.pEList = pSu
26f30 62 71 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 20 20  bq->pEList;.    
26f40 20 20 70 4e 65 77 20 3d 20 73 75 62 73 74 45 78    pNew = substEx
26f50 70 72 28 26 78 2c 20 70 4e 65 77 29 3b 0a 20 20  pr(&x, pNew);.  
26f60 20 20 20 20 69 66 28 20 70 53 75 62 71 2d 3e 73      if( pSubq->s
26f70 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 41 67 67  elFlags & SF_Agg
26f80 72 65 67 61 74 65 20 29 7b 0a 20 20 20 20 20 20  regate ){.      
26f90 20 20 70 53 75 62 71 2d 3e 70 48 61 76 69 6e 67    pSubq->pHaving
26fa0 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e   = sqlite3ExprAn
26fb0 64 28 70 50 61 72 73 65 2c 20 70 53 75 62 71 2d  d(pParse, pSubq-
26fc0 3e 70 48 61 76 69 6e 67 2c 20 70 4e 65 77 29 3b  >pHaving, pNew);
26fd0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
26fe0 20 20 20 20 20 20 70 53 75 62 71 2d 3e 70 57 68        pSubq->pWh
26ff0 65 72 65 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ere = sqlite3Exp
27000 72 41 6e 64 28 70 50 61 72 73 65 2c 20 70 53 75  rAnd(pParse, pSu
27010 62 71 2d 3e 70 57 68 65 72 65 2c 20 70 4e 65 77  bq->pWhere, pNew
27020 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
27030 20 70 53 75 62 71 20 3d 20 70 53 75 62 71 2d 3e   pSubq = pSubq->
27040 70 50 72 69 6f 72 3b 0a 20 20 20 20 7d 0a 20 20  pPrior;.    }.  
27050 7d 0a 20 20 72 65 74 75 72 6e 20 6e 43 68 6e 67  }.  return nChng
27060 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64  ;.}.#endif /* !d
27070 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
27080 49 54 5f 53 55 42 51 55 45 52 59 29 20 7c 7c 20  IT_SUBQUERY) || 
27090 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
270a0 4f 4d 49 54 5f 56 49 45 57 29 20 2a 2f 0a 0a 2f  OMIT_VIEW) */../
270b0 2a 0a 2a 2a 20 54 68 65 20 70 46 75 6e 63 20 69  *.** The pFunc i
270c0 73 20 74 68 65 20 6f 6e 6c 79 20 61 67 67 72 65  s the only aggre
270d0 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 20 69 6e  gate function in
270e0 20 74 68 65 20 71 75 65 72 79 2e 20 20 43 68 65   the query.  Che
270f0 63 6b 20 74 6f 20 73 65 65 0a 2a 2a 20 69 66 20  ck to see.** if 
27100 74 68 65 20 71 75 65 72 79 20 69 73 20 61 20 63  the query is a c
27110 61 6e 64 69 64 61 74 65 20 66 6f 72 20 74 68 65  andidate for the
27120 20 6d 69 6e 2f 6d 61 78 20 6f 70 74 69 6d 69 7a   min/max optimiz
27130 61 74 69 6f 6e 2e 20 0a 2a 2a 0a 2a 2a 20 49 66  ation. .**.** If
27140 20 74 68 65 20 71 75 65 72 79 20 69 73 20 61 20   the query is a 
27150 63 61 6e 64 69 64 61 74 65 20 66 6f 72 20 74 68  candidate for th
27160 65 20 6d 69 6e 2f 6d 61 78 20 6f 70 74 69 6d 69  e min/max optimi
27170 7a 61 74 69 6f 6e 2c 20 74 68 65 6e 20 73 65 74  zation, then set
27180 0a 2a 2a 20 2a 70 70 4d 69 6e 4d 61 78 20 74 6f  .** *ppMinMax to
27190 20 62 65 20 61 6e 20 4f 52 44 45 52 20 42 59 20   be an ORDER BY 
271a0 63 6c 61 75 73 65 20 74 6f 20 62 65 20 75 73 65  clause to be use
271b0 64 20 66 6f 72 20 74 68 65 20 6f 70 74 69 6d 69  d for the optimi
271c0 7a 61 74 69 6f 6e 0a 2a 2a 20 61 6e 64 20 72 65  zation.** and re
271d0 74 75 72 6e 20 65 69 74 68 65 72 20 57 48 45 52  turn either WHER
271e0 45 5f 4f 52 44 45 52 42 59 5f 4d 49 4e 20 6f 72  E_ORDERBY_MIN or
271f0 20 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d   WHERE_ORDERBY_M
27200 41 58 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 0a  AX depending on.
27210 2a 2a 20 77 68 65 74 68 65 72 20 70 46 75 6e 63  ** whether pFunc
27220 20 69 73 20 61 20 6d 69 6e 28 29 20 6f 72 20 6d   is a min() or m
27230 61 78 28 29 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a  ax() function..*
27240 2a 0a 2a 2a 20 49 66 20 74 68 65 20 71 75 65 72  *.** If the quer
27250 79 20 69 73 20 6e 6f 74 20 61 20 63 61 6e 64 69  y is not a candi
27260 64 61 74 65 20 66 6f 72 20 74 68 65 20 6d 69 6e  date for the min
27270 2f 6d 61 78 20 6f 70 74 69 6d 69 7a 61 74 69 6f  /max optimizatio
27280 6e 2c 20 72 65 74 75 72 6e 0a 2a 2a 20 57 48 45  n, return.** WHE
27290 52 45 5f 4f 52 44 45 52 42 59 5f 4e 4f 52 4d 41  RE_ORDERBY_NORMA
272a0 4c 20 28 77 68 69 63 68 20 6d 75 73 74 20 62 65  L (which must be
272b0 20 7a 65 72 6f 29 2e 0a 2a 2a 0a 2a 2a 20 54 68   zero)..**.** Th
272c0 69 73 20 72 6f 75 74 69 6e 65 20 6d 75 73 74 20  is routine must 
272d0 62 65 20 63 61 6c 6c 65 64 20 61 66 74 65 72 20  be called after 
272e0 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69  aggregate functi
272f0 6f 6e 73 20 68 61 76 65 20 62 65 65 6e 0a 2a 2a  ons have been.**
27300 20 6c 6f 63 61 74 65 64 20 62 75 74 20 62 65 66   located but bef
27310 6f 72 65 20 74 68 65 69 72 20 61 72 67 75 6d 65  ore their argume
27320 6e 74 73 20 68 61 76 65 20 62 65 65 6e 20 73 75  nts have been su
27330 62 6a 65 63 74 65 64 20 74 6f 20 61 67 67 72 65  bjected to aggre
27340 67 61 74 65 0a 2a 2a 20 61 6e 61 6c 79 73 69 73  gate.** analysis
27350 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 38 20 6d  ..*/.static u8 m
27360 69 6e 4d 61 78 51 75 65 72 79 28 73 71 6c 69 74  inMaxQuery(sqlit
27370 65 33 20 2a 64 62 2c 20 45 78 70 72 20 2a 70 46  e3 *db, Expr *pF
27380 75 6e 63 2c 20 45 78 70 72 4c 69 73 74 20 2a 2a  unc, ExprList **
27390 70 70 4d 69 6e 4d 61 78 29 7b 0a 20 20 69 6e 74  ppMinMax){.  int
273a0 20 65 52 65 74 20 3d 20 57 48 45 52 45 5f 4f 52   eRet = WHERE_OR
273b0 44 45 52 42 59 5f 4e 4f 52 4d 41 4c 3b 20 20 20  DERBY_NORMAL;   
273c0 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 76 61 6c     /* Return val
273d0 75 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  ue */.  ExprList
273e0 20 2a 70 45 4c 69 73 74 20 3d 20 70 46 75 6e 63   *pEList = pFunc
273f0 2d 3e 78 2e 70 4c 69 73 74 3b 20 20 20 20 2f 2a  ->x.pList;    /*
27400 20 41 72 67 75 6d 65 6e 74 73 20 74 6f 20 61 67   Arguments to ag
27410 67 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20  g function */.  
27420 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 75 6e  const char *zFun
27430 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
27440 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
27450 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74   aggregate funct
27460 69 6f 6e 20 70 46 75 6e 63 20 2a 2f 0a 20 20 45  ion pFunc */.  E
27470 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42  xprList *pOrderB
27480 79 3b 0a 20 20 75 38 20 73 6f 72 74 4f 72 64 65  y;.  u8 sortOrde
27490 72 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 2a 70  r;..  assert( *p
274a0 70 4d 69 6e 4d 61 78 3d 3d 30 20 29 3b 0a 20 20  pMinMax==0 );.  
274b0 61 73 73 65 72 74 28 20 70 46 75 6e 63 2d 3e 6f  assert( pFunc->o
274c0 70 3d 3d 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49  p==TK_AGG_FUNCTI
274d0 4f 4e 20 29 3b 0a 20 20 69 66 28 20 70 45 4c 69  ON );.  if( pELi
274e0 73 74 3d 3d 30 20 7c 7c 20 70 45 4c 69 73 74 2d  st==0 || pEList-
274f0 3e 6e 45 78 70 72 21 3d 31 20 7c 7c 20 45 78 70  >nExpr!=1 || Exp
27500 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 46 75  rHasProperty(pFu
27510 6e 63 2c 20 45 50 5f 46 69 6c 74 65 72 29 20 29  nc, EP_Filter) )
27520 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 65 52 65  {.    return eRe
27530 74 3b 0a 20 20 7d 0a 20 20 7a 46 75 6e 63 20 3d  t;.  }.  zFunc =
27540 20 70 46 75 6e 63 2d 3e 75 2e 7a 54 6f 6b 65 6e   pFunc->u.zToken
27550 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 53  ;.  if( sqlite3S
27560 74 72 49 43 6d 70 28 7a 46 75 6e 63 2c 20 22 6d  trICmp(zFunc, "m
27570 69 6e 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 65  in")==0 ){.    e
27580 52 65 74 20 3d 20 57 48 45 52 45 5f 4f 52 44 45  Ret = WHERE_ORDE
27590 52 42 59 5f 4d 49 4e 3b 0a 20 20 20 20 73 6f 72  RBY_MIN;.    sor
275a0 74 4f 72 64 65 72 20 3d 20 53 51 4c 49 54 45 5f  tOrder = SQLITE_
275b0 53 4f 5f 41 53 43 3b 0a 20 20 7d 65 6c 73 65 20  SO_ASC;.  }else 
275c0 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43  if( sqlite3StrIC
275d0 6d 70 28 7a 46 75 6e 63 2c 20 22 6d 61 78 22 29  mp(zFunc, "max")
275e0 3d 3d 30 20 29 7b 0a 20 20 20 20 65 52 65 74 20  ==0 ){.    eRet 
275f0 3d 20 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f  = WHERE_ORDERBY_
27600 4d 41 58 3b 0a 20 20 20 20 73 6f 72 74 4f 72 64  MAX;.    sortOrd
27610 65 72 20 3d 20 53 51 4c 49 54 45 5f 53 4f 5f 44  er = SQLITE_SO_D
27620 45 53 43 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ESC;.  }else{.  
27630 20 20 72 65 74 75 72 6e 20 65 52 65 74 3b 0a 20    return eRet;. 
27640 20 7d 0a 20 20 2a 70 70 4d 69 6e 4d 61 78 20 3d   }.  *ppMinMax =
27650 20 70 4f 72 64 65 72 42 79 20 3d 20 73 71 6c 69   pOrderBy = sqli
27660 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 64  te3ExprListDup(d
27670 62 2c 20 70 45 4c 69 73 74 2c 20 30 29 3b 0a 20  b, pEList, 0);. 
27680 20 61 73 73 65 72 74 28 20 70 4f 72 64 65 72 42   assert( pOrderB
27690 79 21 3d 30 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c  y!=0 || db->mall
276a0 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 69 66  ocFailed );.  if
276b0 28 20 70 4f 72 64 65 72 42 79 20 29 20 70 4f 72  ( pOrderBy ) pOr
276c0 64 65 72 42 79 2d 3e 61 5b 30 5d 2e 73 6f 72 74  derBy->a[0].sort
276d0 4f 72 64 65 72 20 3d 20 73 6f 72 74 4f 72 64 65  Order = sortOrde
276e0 72 3b 0a 20 20 72 65 74 75 72 6e 20 65 52 65 74  r;.  return eRet
276f0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73  ;.}../*.** The s
27700 65 6c 65 63 74 20 73 74 61 74 65 6d 65 6e 74 20  elect statement 
27710 70 61 73 73 65 64 20 61 73 20 74 68 65 20 66 69  passed as the fi
27720 72 73 74 20 61 72 67 75 6d 65 6e 74 20 69 73 20  rst argument is 
27730 61 6e 20 61 67 67 72 65 67 61 74 65 20 71 75 65  an aggregate que
27740 72 79 2e 0a 2a 2a 20 54 68 65 20 73 65 63 6f 6e  ry..** The secon
27750 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74 68  d argument is th
27760 65 20 61 73 73 6f 63 69 61 74 65 64 20 61 67 67  e associated agg
27770 72 65 67 61 74 65 2d 69 6e 66 6f 20 6f 62 6a 65  regate-info obje
27780 63 74 2e 20 54 68 69 73 20 0a 2a 2a 20 66 75 6e  ct. This .** fun
27790 63 74 69 6f 6e 20 74 65 73 74 73 20 69 66 20 74  ction tests if t
277a0 68 65 20 53 45 4c 45 43 54 20 69 73 20 6f 66 20  he SELECT is of 
277b0 74 68 65 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20  the form:.**.** 
277c0 20 20 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a    SELECT count(*
277d0 29 20 46 52 4f 4d 20 3c 74 62 6c 3e 0a 2a 2a 0a  ) FROM <tbl>.**.
277e0 2a 2a 20 77 68 65 72 65 20 74 61 62 6c 65 20 69  ** where table i
277f0 73 20 61 20 64 61 74 61 62 61 73 65 20 74 61 62  s a database tab
27800 6c 65 2c 20 6e 6f 74 20 61 20 73 75 62 2d 73 65  le, not a sub-se
27810 6c 65 63 74 20 6f 72 20 76 69 65 77 2e 20 49 66  lect or view. If
27820 20 74 68 65 20 71 75 65 72 79 0a 2a 2a 20 64 6f   the query.** do
27830 65 73 20 6d 61 74 63 68 20 74 68 69 73 20 70 61  es match this pa
27840 74 74 65 72 6e 2c 20 74 68 65 6e 20 61 20 70 6f  ttern, then a po
27850 69 6e 74 65 72 20 74 6f 20 74 68 65 20 54 61 62  inter to the Tab
27860 6c 65 20 6f 62 6a 65 63 74 20 72 65 70 72 65 73  le object repres
27870 65 6e 74 69 6e 67 0a 2a 2a 20 3c 74 62 6c 3e 20  enting.** <tbl> 
27880 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68  is returned. Oth
27890 65 72 77 69 73 65 2c 20 30 20 69 73 20 72 65 74  erwise, 0 is ret
278a0 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  urned..*/.static
278b0 20 54 61 62 6c 65 20 2a 69 73 53 69 6d 70 6c 65   Table *isSimple
278c0 43 6f 75 6e 74 28 53 65 6c 65 63 74 20 2a 70 2c  Count(Select *p,
278d0 20 41 67 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e   AggInfo *pAggIn
278e0 66 6f 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54  fo){.  Table *pT
278f0 61 62 3b 0a 20 20 45 78 70 72 20 2a 70 45 78 70  ab;.  Expr *pExp
27900 72 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 21 70  r;..  assert( !p
27910 2d 3e 70 47 72 6f 75 70 42 79 20 29 3b 0a 0a 20  ->pGroupBy );.. 
27920 20 69 66 28 20 70 2d 3e 70 57 68 65 72 65 20 7c   if( p->pWhere |
27930 7c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78  | p->pEList->nEx
27940 70 72 21 3d 31 20 0a 20 20 20 7c 7c 20 70 2d 3e  pr!=1 .   || p->
27950 70 53 72 63 2d 3e 6e 53 72 63 21 3d 31 20 7c 7c  pSrc->nSrc!=1 ||
27960 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 30 5d 2e 70   p->pSrc->a[0].p
27970 53 65 6c 65 63 74 0a 20 20 29 7b 0a 20 20 20 20  Select.  ){.    
27980 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
27990 70 54 61 62 20 3d 20 70 2d 3e 70 53 72 63 2d 3e  pTab = p->pSrc->
279a0 61 5b 30 5d 2e 70 54 61 62 3b 0a 20 20 70 45 78  a[0].pTab;.  pEx
279b0 70 72 20 3d 20 70 2d 3e 70 45 4c 69 73 74 2d 3e  pr = p->pEList->
279c0 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20 61 73  a[0].pExpr;.  as
279d0 73 65 72 74 28 20 70 54 61 62 20 26 26 20 21 70  sert( pTab && !p
279e0 54 61 62 2d 3e 70 53 65 6c 65 63 74 20 26 26 20  Tab->pSelect && 
279f0 70 45 78 70 72 20 29 3b 0a 0a 20 20 69 66 28 20  pExpr );..  if( 
27a00 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 29 20  IsVirtual(pTab) 
27a10 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66  ) return 0;.  if
27a20 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f  ( pExpr->op!=TK_
27a30 41 47 47 5f 46 55 4e 43 54 49 4f 4e 20 29 20 72  AGG_FUNCTION ) r
27a40 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 4e  eturn 0;.  if( N
27a50 45 56 45 52 28 70 41 67 67 49 6e 66 6f 2d 3e 6e  EVER(pAggInfo->n
27a60 46 75 6e 63 3d 3d 30 29 20 29 20 72 65 74 75 72  Func==0) ) retur
27a70 6e 20 30 3b 0a 20 20 69 66 28 20 28 70 41 67 67  n 0;.  if( (pAgg
27a80 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 30 5d 2e 70  Info->aFunc[0].p
27a90 46 75 6e 63 2d 3e 66 75 6e 63 46 6c 61 67 73 26  Func->funcFlags&
27aa0 53 51 4c 49 54 45 5f 46 55 4e 43 5f 43 4f 55 4e  SQLITE_FUNC_COUN
27ab0 54 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  T)==0 ) return 0
27ac0 3b 0a 20 20 69 66 28 20 45 78 70 72 48 61 73 50  ;.  if( ExprHasP
27ad0 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
27ae0 50 5f 44 69 73 74 69 6e 63 74 7c 45 50 5f 46 69  P_Distinct|EP_Fi
27af0 6c 74 65 72 29 20 29 20 72 65 74 75 72 6e 20 30  lter) ) return 0
27b00 3b 0a 0a 20 20 72 65 74 75 72 6e 20 70 54 61 62  ;..  return pTab
27b10 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68  ;.}../*.** If th
27b20 65 20 73 6f 75 72 63 65 2d 6c 69 73 74 20 69 74  e source-list it
27b30 65 6d 20 70 61 73 73 65 64 20 61 73 20 61 6e 20  em passed as an 
27b40 61 72 67 75 6d 65 6e 74 20 77 61 73 20 61 75 67  argument was aug
27b50 6d 65 6e 74 65 64 20 77 69 74 68 20 61 6e 0a 2a  mented with an.*
27b60 2a 20 49 4e 44 45 58 45 44 20 42 59 20 63 6c 61  * INDEXED BY cla
27b70 75 73 65 2c 20 74 68 65 6e 20 74 72 79 20 74 6f  use, then try to
27b80 20 6c 6f 63 61 74 65 20 74 68 65 20 73 70 65 63   locate the spec
27b90 69 66 69 65 64 20 69 6e 64 65 78 2e 20 49 66 20  ified index. If 
27ba0 74 68 65 72 65 0a 2a 2a 20 77 61 73 20 73 75 63  there.** was suc
27bb0 68 20 61 20 63 6c 61 75 73 65 20 61 6e 64 20 74  h a clause and t
27bc0 68 65 20 6e 61 6d 65 64 20 69 6e 64 65 78 20 63  he named index c
27bd0 61 6e 6e 6f 74 20 62 65 20 66 6f 75 6e 64 2c 20  annot be found, 
27be0 72 65 74 75 72 6e 20 0a 2a 2a 20 53 51 4c 49 54  return .** SQLIT
27bf0 45 5f 45 52 52 4f 52 20 61 6e 64 20 6c 65 61 76  E_ERROR and leav
27c00 65 20 61 6e 20 65 72 72 6f 72 20 69 6e 20 70 50  e an error in pP
27c10 61 72 73 65 2e 20 4f 74 68 65 72 77 69 73 65 2c  arse. Otherwise,
27c20 20 70 6f 70 75 6c 61 74 65 20 0a 2a 2a 20 70 46   populate .** pF
27c30 72 6f 6d 2d 3e 70 49 6e 64 65 78 20 61 6e 64 20  rom->pIndex and 
27c40 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
27c50 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
27c60 49 6e 64 65 78 65 64 42 79 4c 6f 6f 6b 75 70 28  IndexedByLookup(
27c70 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 73  Parse *pParse, s
27c80 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
27c90 65 6d 20 2a 70 46 72 6f 6d 29 7b 0a 20 20 69 66  em *pFrom){.  if
27ca0 28 20 70 46 72 6f 6d 2d 3e 70 54 61 62 20 26 26  ( pFrom->pTab &&
27cb0 20 70 46 72 6f 6d 2d 3e 66 67 2e 69 73 49 6e 64   pFrom->fg.isInd
27cc0 65 78 65 64 42 79 20 29 7b 0a 20 20 20 20 54 61  exedBy ){.    Ta
27cd0 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 46 72 6f  ble *pTab = pFro
27ce0 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20 63 68 61  m->pTab;.    cha
27cf0 72 20 2a 7a 49 6e 64 65 78 65 64 42 79 20 3d 20  r *zIndexedBy = 
27d00 70 46 72 6f 6d 2d 3e 75 31 2e 7a 49 6e 64 65 78  pFrom->u1.zIndex
27d10 65 64 42 79 3b 0a 20 20 20 20 49 6e 64 65 78 20  edBy;.    Index 
27d20 2a 70 49 64 78 3b 0a 20 20 20 20 66 6f 72 28 70  *pIdx;.    for(p
27d30 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78  Idx=pTab->pIndex
27d40 3b 20 0a 20 20 20 20 20 20 20 20 70 49 64 78 20  ; .        pIdx 
27d50 26 26 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  && sqlite3StrICm
27d60 70 28 70 49 64 78 2d 3e 7a 4e 61 6d 65 2c 20 7a  p(pIdx->zName, z
27d70 49 6e 64 65 78 65 64 42 79 29 3b 20 0a 20 20 20  IndexedBy); .   
27d80 20 20 20 20 20 70 49 64 78 3d 70 49 64 78 2d 3e       pIdx=pIdx->
27d90 70 4e 65 78 74 0a 20 20 20 20 29 3b 0a 20 20 20  pNext.    );.   
27da0 20 69 66 28 20 21 70 49 64 78 20 29 7b 0a 20 20   if( !pIdx ){.  
27db0 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
27dc0 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6e 6f 20  Msg(pParse, "no 
27dd0 73 75 63 68 20 69 6e 64 65 78 3a 20 25 73 22 2c  such index: %s",
27de0 20 7a 49 6e 64 65 78 65 64 42 79 2c 20 30 29 3b   zIndexedBy, 0);
27df0 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 63  .      pParse->c
27e00 68 65 63 6b 53 63 68 65 6d 61 20 3d 20 31 3b 0a  heckSchema = 1;.
27e10 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
27e20 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  ITE_ERROR;.    }
27e30 0a 20 20 20 20 70 46 72 6f 6d 2d 3e 70 49 42 49  .    pFrom->pIBI
27e40 6e 64 65 78 20 3d 20 70 49 64 78 3b 0a 20 20 7d  ndex = pIdx;.  }
27e50 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
27e60 5f 4f 4b 3b 0a 7d 0a 2f 2a 0a 2a 2a 20 44 65 74  _OK;.}./*.** Det
27e70 65 63 74 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c  ect compound SEL
27e80 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73 20 74  ECT statements t
27e90 68 61 74 20 75 73 65 20 61 6e 20 4f 52 44 45 52  hat use an ORDER
27ea0 20 42 59 20 63 6c 61 75 73 65 20 77 69 74 68 20   BY clause with 
27eb0 0a 2a 2a 20 61 6e 20 61 6c 74 65 72 6e 61 74 69  .** an alternati
27ec0 76 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71  ve collating seq
27ed0 75 65 6e 63 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  uence..**.**    
27ee0 53 45 4c 45 43 54 20 2e 2e 2e 20 46 52 4f 4d 20  SELECT ... FROM 
27ef0 74 31 20 45 58 43 45 50 54 20 53 45 4c 45 43 54  t1 EXCEPT SELECT
27f00 20 2e 2e 2e 20 46 52 4f 4d 20 74 32 20 4f 52 44   ... FROM t2 ORD
27f10 45 52 20 42 59 20 2e 2e 20 43 4f 4c 4c 41 54 45  ER BY .. COLLATE
27f20 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 73 65   ....**.** These
27f30 20 61 72 65 20 72 65 77 72 69 74 74 65 6e 20 61   are rewritten a
27f40 73 20 61 20 73 75 62 71 75 65 72 79 3a 0a 2a 2a  s a subquery:.**
27f50 0a 2a 2a 20 20 20 20 53 45 4c 45 43 54 20 2a 20  .**    SELECT * 
27f60 46 52 4f 4d 20 28 53 45 4c 45 43 54 20 2e 2e 2e  FROM (SELECT ...
27f70 20 46 52 4f 4d 20 74 31 20 45 58 43 45 50 54 20   FROM t1 EXCEPT 
27f80 53 45 4c 45 43 54 20 2e 2e 2e 20 46 52 4f 4d 20  SELECT ... FROM 
27f90 74 32 29 0a 2a 2a 20 20 20 20 20 4f 52 44 45 52  t2).**     ORDER
27fa0 20 42 59 20 2e 2e 2e 20 43 4f 4c 4c 41 54 45 20   BY ... COLLATE 
27fb0 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 74  ....**.** This t
27fc0 72 61 6e 73 66 6f 72 6d 61 74 69 6f 6e 20 69 73  ransformation is
27fd0 20 6e 65 63 65 73 73 61 72 79 20 62 65 63 61 75   necessary becau
27fe0 73 65 20 74 68 65 20 6d 75 6c 74 69 53 65 6c 65  se the multiSele
27ff0 63 74 4f 72 64 65 72 42 79 28 29 20 72 6f 75 74  ctOrderBy() rout
28000 69 6e 65 0a 2a 2a 20 61 62 6f 76 65 20 74 68 61  ine.** above tha
28010 74 20 67 65 6e 65 72 61 74 65 73 20 74 68 65 20  t generates the 
28020 63 6f 64 65 20 66 6f 72 20 61 20 63 6f 6d 70 6f  code for a compo
28030 75 6e 64 20 53 45 4c 45 43 54 20 77 69 74 68 20  und SELECT with 
28040 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  an ORDER BY clau
28050 73 65 0a 2a 2a 20 75 73 65 73 20 61 20 6d 65 72  se.** uses a mer
28060 67 65 20 61 6c 67 6f 72 69 74 68 6d 20 74 68 61  ge algorithm tha
28070 74 20 72 65 71 75 69 72 65 73 20 74 68 65 20 73  t requires the s
28080 61 6d 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65  ame collating se
28090 71 75 65 6e 63 65 20 6f 6e 20 74 68 65 0a 2a 2a  quence on the.**
280a0 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20   result columns 
280b0 61 73 20 6f 6e 20 74 68 65 20 4f 52 44 45 52 20  as on the ORDER 
280c0 42 59 20 63 6c 61 75 73 65 2e 20 20 53 65 65 20  BY clause.  See 
280d0 74 69 63 6b 65 74 0a 2a 2a 20 68 74 74 70 3a 2f  ticket.** http:/
280e0 2f 77 77 77 2e 73 71 6c 69 74 65 2e 6f 72 67 2f  /www.sqlite.org/
280f0 73 72 63 2f 69 6e 66 6f 2f 36 37 30 39 35 37 34  src/info/6709574
28100 64 32 61 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 74  d2a.**.** This t
28110 72 61 6e 73 66 6f 72 6d 61 74 69 6f 6e 20 69 73  ransformation is
28120 20 6f 6e 6c 79 20 6e 65 65 64 65 64 20 66 6f 72   only needed for
28130 20 45 58 43 45 50 54 2c 20 49 4e 54 45 52 53 45   EXCEPT, INTERSE
28140 43 54 2c 20 61 6e 64 20 55 4e 49 4f 4e 2e 0a 2a  CT, and UNION..*
28150 2a 20 54 68 65 20 55 4e 49 4f 4e 20 41 4c 4c 20  * The UNION ALL 
28160 6f 70 65 72 61 74 6f 72 20 77 6f 72 6b 73 20 66  operator works f
28170 69 6e 65 20 77 69 74 68 20 6d 75 6c 74 69 53 65  ine with multiSe
28180 6c 65 63 74 4f 72 64 65 72 42 79 28 29 20 65 76  lectOrderBy() ev
28190 65 6e 20 77 68 65 6e 0a 2a 2a 20 74 68 65 72 65  en when.** there
281a0 20 61 72 65 20 43 4f 4c 4c 41 54 45 20 74 65 72   are COLLATE ter
281b0 6d 73 20 69 6e 20 74 68 65 20 4f 52 44 45 52 20  ms in the ORDER 
281c0 42 59 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  BY..*/.static in
281d0 74 20 63 6f 6e 76 65 72 74 43 6f 6d 70 6f 75 6e  t convertCompoun
281e0 64 53 65 6c 65 63 74 54 6f 53 75 62 71 75 65 72  dSelectToSubquer
281f0 79 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65  y(Walker *pWalke
28200 72 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20  r, Select *p){. 
28210 20 69 6e 74 20 69 3b 0a 20 20 53 65 6c 65 63 74   int i;.  Select
28220 20 2a 70 4e 65 77 3b 0a 20 20 53 65 6c 65 63 74   *pNew;.  Select
28230 20 2a 70 58 3b 0a 20 20 73 71 6c 69 74 65 33 20   *pX;.  sqlite3 
28240 2a 64 62 3b 0a 20 20 73 74 72 75 63 74 20 45 78  *db;.  struct Ex
28250 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 61 3b 0a  prList_item *a;.
28260 20 20 53 72 63 4c 69 73 74 20 2a 70 4e 65 77 53    SrcList *pNewS
28270 72 63 3b 0a 20 20 50 61 72 73 65 20 2a 70 50 61  rc;.  Parse *pPa
28280 72 73 65 3b 0a 20 20 54 6f 6b 65 6e 20 64 75 6d  rse;.  Token dum
28290 6d 79 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 70 50  my;..  if( p->pP
282a0 72 69 6f 72 3d 3d 30 20 29 20 72 65 74 75 72 6e  rior==0 ) return
282b0 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20   WRC_Continue;. 
282c0 20 69 66 28 20 70 2d 3e 70 4f 72 64 65 72 42 79   if( p->pOrderBy
282d0 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 57 52 43  ==0 ) return WRC
282e0 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20 20 66 6f 72  _Continue;.  for
282f0 28 70 58 3d 70 3b 20 70 58 20 26 26 20 28 70 58  (pX=p; pX && (pX
28300 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 7c 7c 20  ->op==TK_ALL || 
28310 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43  pX->op==TK_SELEC
28320 54 29 3b 20 70 58 3d 70 58 2d 3e 70 50 72 69 6f  T); pX=pX->pPrio
28330 72 29 7b 7d 0a 20 20 69 66 28 20 70 58 3d 3d 30  r){}.  if( pX==0
28340 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f   ) return WRC_Co
28350 6e 74 69 6e 75 65 3b 0a 20 20 61 20 3d 20 70 2d  ntinue;.  a = p-
28360 3e 70 4f 72 64 65 72 42 79 2d 3e 61 3b 0a 20 20  >pOrderBy->a;.  
28370 66 6f 72 28 69 3d 70 2d 3e 70 4f 72 64 65 72 42  for(i=p->pOrderB
28380 79 2d 3e 6e 45 78 70 72 2d 31 3b 20 69 3e 3d 30  y->nExpr-1; i>=0
28390 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 69 66 28 20  ; i--){.    if( 
283a0 61 5b 69 5d 2e 70 45 78 70 72 2d 3e 66 6c 61 67  a[i].pExpr->flag
283b0 73 20 26 20 45 50 5f 43 6f 6c 6c 61 74 65 20 29  s & EP_Collate )
283c0 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 69 66   break;.  }.  if
283d0 28 20 69 3c 30 20 29 20 72 65 74 75 72 6e 20 57  ( i<0 ) return W
283e0 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 0a 20 20  RC_Continue;..  
283f0 2f 2a 20 49 66 20 77 65 20 72 65 61 63 68 20 74  /* If we reach t
28400 68 69 73 20 70 6f 69 6e 74 2c 20 74 68 61 74 20  his point, that 
28410 6d 65 61 6e 73 20 74 68 65 20 74 72 61 6e 73 66  means the transf
28420 6f 72 6d 61 74 69 6f 6e 20 69 73 20 72 65 71 75  ormation is requ
28430 69 72 65 64 2e 20 2a 2f 0a 0a 20 20 70 50 61 72  ired. */..  pPar
28440 73 65 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 70 50  se = pWalker->pP
28450 61 72 73 65 3b 0a 20 20 64 62 20 3d 20 70 50 61  arse;.  db = pPa
28460 72 73 65 2d 3e 64 62 3b 0a 20 20 70 4e 65 77 20  rse->db;.  pNew 
28470 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
28480 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66  cZero(db, sizeof
28490 28 2a 70 4e 65 77 29 20 29 3b 0a 20 20 69 66 28  (*pNew) );.  if(
284a0 20 70 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72   pNew==0 ) retur
284b0 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 6d  n WRC_Abort;.  m
284c0 65 6d 73 65 74 28 26 64 75 6d 6d 79 2c 20 30 2c  emset(&dummy, 0,
284d0 20 73 69 7a 65 6f 66 28 64 75 6d 6d 79 29 29 3b   sizeof(dummy));
284e0 0a 20 20 70 4e 65 77 53 72 63 20 3d 20 73 71 6c  .  pNewSrc = sql
284f0 69 74 65 33 53 72 63 4c 69 73 74 41 70 70 65 6e  ite3SrcListAppen
28500 64 46 72 6f 6d 54 65 72 6d 28 70 50 61 72 73 65  dFromTerm(pParse
28510 2c 30 2c 30 2c 30 2c 26 64 75 6d 6d 79 2c 70 4e  ,0,0,0,&dummy,pN
28520 65 77 2c 30 2c 30 29 3b 0a 20 20 69 66 28 20 70  ew,0,0);.  if( p
28530 4e 65 77 53 72 63 3d 3d 30 20 29 20 72 65 74 75  NewSrc==0 ) retu
28540 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20  rn WRC_Abort;.  
28550 2a 70 4e 65 77 20 3d 20 2a 70 3b 0a 20 20 70 2d  *pNew = *p;.  p-
28560 3e 70 53 72 63 20 3d 20 70 4e 65 77 53 72 63 3b  >pSrc = pNewSrc;
28570 0a 20 20 70 2d 3e 70 45 4c 69 73 74 20 3d 20 73  .  p->pEList = s
28580 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70  qlite3ExprListAp
28590 70 65 6e 64 28 70 50 61 72 73 65 2c 20 30 2c 20  pend(pParse, 0, 
285a0 73 71 6c 69 74 65 33 45 78 70 72 28 64 62 2c 20  sqlite3Expr(db, 
285b0 54 4b 5f 41 53 54 45 52 49 53 4b 2c 20 30 29 29  TK_ASTERISK, 0))
285c0 3b 0a 20 20 70 2d 3e 6f 70 20 3d 20 54 4b 5f 53  ;.  p->op = TK_S
285d0 45 4c 45 43 54 3b 0a 20 20 70 2d 3e 70 57 68 65  ELECT;.  p->pWhe
285e0 72 65 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e  re = 0;.  pNew->
285f0 70 47 72 6f 75 70 42 79 20 3d 20 30 3b 0a 20 20  pGroupBy = 0;.  
28600 70 4e 65 77 2d 3e 70 48 61 76 69 6e 67 20 3d 20  pNew->pHaving = 
28610 30 3b 0a 20 20 70 4e 65 77 2d 3e 70 4f 72 64 65  0;.  pNew->pOrde
28620 72 42 79 20 3d 20 30 3b 0a 20 20 70 2d 3e 70 50  rBy = 0;.  p->pP
28630 72 69 6f 72 20 3d 20 30 3b 0a 20 20 70 2d 3e 70  rior = 0;.  p->p
28640 4e 65 78 74 20 3d 20 30 3b 0a 20 20 70 2d 3e 70  Next = 0;.  p->p
28650 57 69 74 68 20 3d 20 30 3b 0a 20 20 70 2d 3e 73  With = 0;.  p->s
28660 65 6c 46 6c 61 67 73 20 26 3d 20 7e 53 46 5f 43  elFlags &= ~SF_C
28670 6f 6d 70 6f 75 6e 64 3b 0a 20 20 61 73 73 65 72  ompound;.  asser
28680 74 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20  t( (p->selFlags 
28690 26 20 53 46 5f 43 6f 6e 76 65 72 74 65 64 29 3d  & SF_Converted)=
286a0 3d 30 20 29 3b 0a 20 20 70 2d 3e 73 65 6c 46 6c  =0 );.  p->selFl
286b0 61 67 73 20 7c 3d 20 53 46 5f 43 6f 6e 76 65 72  ags |= SF_Conver
286c0 74 65 64 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ted;.  assert( p
286d0 4e 65 77 2d 3e 70 50 72 69 6f 72 21 3d 30 20 29  New->pPrior!=0 )
286e0 3b 0a 20 20 70 4e 65 77 2d 3e 70 50 72 69 6f 72  ;.  pNew->pPrior
286f0 2d 3e 70 4e 65 78 74 20 3d 20 70 4e 65 77 3b 0a  ->pNext = pNew;.
28700 20 20 70 4e 65 77 2d 3e 70 4c 69 6d 69 74 20 3d    pNew->pLimit =
28710 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 57 52 43   0;.  return WRC
28720 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a  _Continue;.}../*
28730 0a 2a 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65  .** Check to see
28740 20 69 66 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   if the FROM cla
28750 75 73 65 20 74 65 72 6d 20 70 46 72 6f 6d 20 68  use term pFrom h
28760 61 73 20 74 61 62 6c 65 2d 76 61 6c 75 65 64 20  as table-valued 
28770 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 61 72 67 75  function.** argu
28780 6d 65 6e 74 73 2e 20 20 49 66 20 69 74 20 64 6f  ments.  If it do
28790 65 73 2c 20 6c 65 61 76 65 20 61 6e 20 65 72 72  es, leave an err
287a0 6f 72 20 6d 65 73 73 61 67 65 20 69 6e 20 70 50  or message in pP
287b0 61 72 73 65 20 61 6e 64 20 72 65 74 75 72 6e 0a  arse and return.
287c0 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 73 69 6e  ** non-zero, sin
287d0 63 65 20 70 46 72 6f 6d 20 69 73 20 6e 6f 74 20  ce pFrom is not 
287e0 61 6c 6c 6f 77 65 64 20 74 6f 20 62 65 20 61 20  allowed to be a 
287f0 74 61 62 6c 65 2d 76 61 6c 75 65 64 20 66 75 6e  table-valued fun
28800 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ction..*/.static
28810 20 69 6e 74 20 63 61 6e 6e 6f 74 42 65 46 75 6e   int cannotBeFun
28820 63 74 69 6f 6e 28 50 61 72 73 65 20 2a 70 50 61  ction(Parse *pPa
28830 72 73 65 2c 20 73 74 72 75 63 74 20 53 72 63 4c  rse, struct SrcL
28840 69 73 74 5f 69 74 65 6d 20 2a 70 46 72 6f 6d 29  ist_item *pFrom)
28850 7b 0a 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e 66  {.  if( pFrom->f
28860 67 2e 69 73 54 61 62 46 75 6e 63 20 29 7b 0a 20  g.isTabFunc ){. 
28870 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
28880 73 67 28 70 50 61 72 73 65 2c 20 22 27 25 73 27  sg(pParse, "'%s'
28890 20 69 73 20 6e 6f 74 20 61 20 66 75 6e 63 74 69   is not a functi
288a0 6f 6e 22 2c 20 70 46 72 6f 6d 2d 3e 7a 4e 61 6d  on", pFrom->zNam
288b0 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31  e);.    return 1
288c0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  ;.  }.  return 0
288d0 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  ;.}..#ifndef SQL
288e0 49 54 45 5f 4f 4d 49 54 5f 43 54 45 0a 2f 2a 0a  ITE_OMIT_CTE./*.
288f0 2a 2a 20 41 72 67 75 6d 65 6e 74 20 70 57 69 74  ** Argument pWit
28900 68 20 28 77 68 69 63 68 20 6d 61 79 20 62 65 20  h (which may be 
28910 4e 55 4c 4c 29 20 70 6f 69 6e 74 73 20 74 6f 20  NULL) points to 
28920 61 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66  a linked list of
28930 20 6e 65 73 74 65 64 20 0a 2a 2a 20 57 49 54 48   nested .** WITH
28940 20 63 6f 6e 74 65 78 74 73 2c 20 66 72 6f 6d 20   contexts, from 
28950 69 6e 6e 65 72 20 74 6f 20 6f 75 74 65 72 6d 6f  inner to outermo
28960 73 74 2e 20 49 66 20 74 68 65 20 74 61 62 6c 65  st. If the table
28970 20 69 64 65 6e 74 69 66 69 65 64 20 62 79 20 0a   identified by .
28980 2a 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 65  ** FROM clause e
28990 6c 65 6d 65 6e 74 20 70 49 74 65 6d 20 69 73 20  lement pItem is 
289a0 72 65 61 6c 6c 79 20 61 20 63 6f 6d 6d 6f 6e 2d  really a common-
289b0 74 61 62 6c 65 2d 65 78 70 72 65 73 73 69 6f 6e  table-expression
289c0 20 28 43 54 45 29 20 0a 2a 2a 20 74 68 65 6e 20   (CTE) .** then 
289d0 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  return a pointer
289e0 20 74 6f 20 74 68 65 20 43 54 45 20 64 65 66 69   to the CTE defi
289f0 6e 69 74 69 6f 6e 20 66 6f 72 20 74 68 61 74 20  nition for that 
28a00 74 61 62 6c 65 2e 20 4f 74 68 65 72 77 69 73 65  table. Otherwise
28a10 0a 2a 2a 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e  .** return NULL.
28a20 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 6e 6f 6e 2d  .**.** If a non-
28a30 4e 55 4c 4c 20 76 61 6c 75 65 20 69 73 20 72 65  NULL value is re
28a40 74 75 72 6e 65 64 2c 20 73 65 74 20 2a 70 70 43  turned, set *ppC
28a50 6f 6e 74 65 78 74 20 74 6f 20 70 6f 69 6e 74 20  ontext to point 
28a60 74 6f 20 74 68 65 20 57 69 74 68 0a 2a 2a 20 6f  to the With.** o
28a70 62 6a 65 63 74 20 74 68 61 74 20 74 68 65 20 72  bject that the r
28a80 65 74 75 72 6e 65 64 20 43 54 45 20 62 65 6c 6f  eturned CTE belo
28a90 6e 67 73 20 74 6f 2e 0a 2a 2f 0a 73 74 61 74 69  ngs to..*/.stati
28aa0 63 20 73 74 72 75 63 74 20 43 74 65 20 2a 73 65  c struct Cte *se
28ab0 61 72 63 68 57 69 74 68 28 0a 20 20 57 69 74 68  archWith(.  With
28ac0 20 2a 70 57 69 74 68 2c 20 20 20 20 20 20 20 20   *pWith,        
28ad0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
28ae0 75 72 72 65 6e 74 20 69 6e 6e 65 72 6d 6f 73 74  urrent innermost
28af0 20 57 49 54 48 20 63 6c 61 75 73 65 20 2a 2f 0a   WITH clause */.
28b00 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
28b10 5f 69 74 65 6d 20 2a 70 49 74 65 6d 2c 20 20 20  _item *pItem,   
28b20 20 20 2f 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65    /* FROM clause
28b30 20 65 6c 65 6d 65 6e 74 20 74 6f 20 72 65 73 6f   element to reso
28b40 6c 76 65 20 2a 2f 0a 20 20 57 69 74 68 20 2a 2a  lve */.  With **
28b50 70 70 43 6f 6e 74 65 78 74 20 20 20 20 20 20 20  ppContext       
28b60 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a           /* OUT:
28b70 20 57 49 54 48 20 63 6c 61 75 73 65 20 72 65 74   WITH clause ret
28b80 75 72 6e 20 76 61 6c 75 65 20 62 65 6c 6f 6e 67  urn value belong
28b90 73 20 74 6f 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e  s to */.){.  con
28ba0 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a  st char *zName;.
28bb0 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 7a 44 61    if( pItem->zDa
28bc0 74 61 62 61 73 65 3d 3d 30 20 26 26 20 28 7a 4e  tabase==0 && (zN
28bd0 61 6d 65 20 3d 20 70 49 74 65 6d 2d 3e 7a 4e 61  ame = pItem->zNa
28be0 6d 65 29 21 3d 30 20 29 7b 0a 20 20 20 20 57 69  me)!=0 ){.    Wi
28bf0 74 68 20 2a 70 3b 0a 20 20 20 20 66 6f 72 28 70  th *p;.    for(p
28c00 3d 70 57 69 74 68 3b 20 70 3b 20 70 3d 70 2d 3e  =pWith; p; p=p->
28c10 70 4f 75 74 65 72 29 7b 0a 20 20 20 20 20 20 69  pOuter){.      i
28c20 6e 74 20 69 3b 0a 20 20 20 20 20 20 66 6f 72 28  nt i;.      for(
28c30 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 74 65 3b 20  i=0; i<p->nCte; 
28c40 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66  i++){.        if
28c50 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  ( sqlite3StrICmp
28c60 28 7a 4e 61 6d 65 2c 20 70 2d 3e 61 5b 69 5d 2e  (zName, p->a[i].
28c70 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20  zName)==0 ){.   
28c80 20 20 20 20 20 20 20 2a 70 70 43 6f 6e 74 65 78         *ppContex
28c90 74 20 3d 20 70 3b 0a 20 20 20 20 20 20 20 20 20  t = p;.         
28ca0 20 72 65 74 75 72 6e 20 26 70 2d 3e 61 5b 69 5d   return &p->a[i]
28cb0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
28cc0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
28cd0 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 20  return 0;.}../* 
28ce0 54 68 65 20 63 6f 64 65 20 67 65 6e 65 72 61 74  The code generat
28cf0 6f 72 20 6d 61 69 6e 74 61 69 6e 73 20 61 20 73  or maintains a s
28d00 74 61 63 6b 20 6f 66 20 61 63 74 69 76 65 20 57  tack of active W
28d10 49 54 48 20 63 6c 61 75 73 65 73 0a 2a 2a 20 77  ITH clauses.** w
28d20 69 74 68 20 74 68 65 20 69 6e 6e 65 72 2d 6d 6f  ith the inner-mo
28d30 73 74 20 57 49 54 48 20 63 6c 61 75 73 65 20 62  st WITH clause b
28d40 65 69 6e 67 20 61 74 20 74 68 65 20 74 6f 70 20  eing at the top 
28d50 6f 66 20 74 68 65 20 73 74 61 63 6b 2e 0a 2a 2a  of the stack..**
28d60 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
28d70 20 70 75 73 68 65 73 20 74 68 65 20 57 49 54 48   pushes the WITH
28d80 20 63 6c 61 75 73 65 20 70 61 73 73 65 64 20 61   clause passed a
28d90 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67  s the second arg
28da0 75 6d 65 6e 74 0a 2a 2a 20 6f 6e 74 6f 20 74 68  ument.** onto th
28db0 65 20 74 6f 70 20 6f 66 20 74 68 65 20 73 74 61  e top of the sta
28dc0 63 6b 2e 20 49 66 20 61 72 67 75 6d 65 6e 74 20  ck. If argument 
28dd0 62 46 72 65 65 20 69 73 20 74 72 75 65 2c 20 74  bFree is true, t
28de0 68 65 6e 20 74 68 69 73 0a 2a 2a 20 57 49 54 48  hen this.** WITH
28df0 20 63 6c 61 75 73 65 20 77 69 6c 6c 20 6e 65 76   clause will nev
28e00 65 72 20 62 65 20 70 6f 70 70 65 64 20 66 72 6f  er be popped fro
28e10 6d 20 74 68 65 20 73 74 61 63 6b 2e 20 49 6e 20  m the stack. In 
28e20 74 68 69 73 20 63 61 73 65 20 69 74 0a 2a 2a 20  this case it.** 
28e30 73 68 6f 75 6c 64 20 62 65 20 66 72 65 65 64 20  should be freed 
28e40 61 6c 6f 6e 67 20 77 69 74 68 20 74 68 65 20 50  along with the P
28e50 61 72 73 65 20 6f 62 6a 65 63 74 2e 20 49 6e 20  arse object. In 
28e60 6f 74 68 65 72 20 63 61 73 65 73 2c 20 77 68 65  other cases, whe
28e70 6e 0a 2a 2a 20 62 46 72 65 65 3d 3d 30 2c 20 74  n.** bFree==0, t
28e80 68 65 20 57 69 74 68 20 6f 62 6a 65 63 74 20 77  he With object w
28e90 69 6c 6c 20 62 65 20 66 72 65 65 64 20 61 6c 6f  ill be freed alo
28ea0 6e 67 20 77 69 74 68 20 74 68 65 20 53 45 4c 45  ng with the SELE
28eb0 43 54 20 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74  CT .** statement
28ec0 20 77 69 74 68 20 77 68 69 63 68 20 69 74 20 69   with which it i
28ed0 73 20 61 73 73 6f 63 69 61 74 65 64 2e 0a 2a 2f  s associated..*/
28ee0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 57 69 74  .void sqlite3Wit
28ef0 68 50 75 73 68 28 50 61 72 73 65 20 2a 70 50 61  hPush(Parse *pPa
28f00 72 73 65 2c 20 57 69 74 68 20 2a 70 57 69 74 68  rse, With *pWith
28f10 2c 20 75 38 20 62 46 72 65 65 29 7b 0a 20 20 61  , u8 bFree){.  a
28f20 73 73 65 72 74 28 20 62 46 72 65 65 3d 3d 30 20  ssert( bFree==0 
28f30 7c 7c 20 28 70 50 61 72 73 65 2d 3e 70 57 69 74  || (pParse->pWit
28f40 68 3d 3d 30 20 26 26 20 70 50 61 72 73 65 2d 3e  h==0 && pParse->
28f50 70 57 69 74 68 54 6f 46 72 65 65 3d 3d 30 29 20  pWithToFree==0) 
28f60 29 3b 0a 20 20 69 66 28 20 70 57 69 74 68 20 29  );.  if( pWith )
28f70 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  {.    assert( pP
28f80 61 72 73 65 2d 3e 70 57 69 74 68 21 3d 70 57 69  arse->pWith!=pWi
28f90 74 68 20 29 3b 0a 20 20 20 20 70 57 69 74 68 2d  th );.    pWith-
28fa0 3e 70 4f 75 74 65 72 20 3d 20 70 50 61 72 73 65  >pOuter = pParse
28fb0 2d 3e 70 57 69 74 68 3b 0a 20 20 20 20 70 50 61  ->pWith;.    pPa
28fc0 72 73 65 2d 3e 70 57 69 74 68 20 3d 20 70 57 69  rse->pWith = pWi
28fd0 74 68 3b 0a 20 20 20 20 69 66 28 20 62 46 72 65  th;.    if( bFre
28fe0 65 20 29 20 70 50 61 72 73 65 2d 3e 70 57 69 74  e ) pParse->pWit
28ff0 68 54 6f 46 72 65 65 20 3d 20 70 57 69 74 68 3b  hToFree = pWith;
29000 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  .  }.}../*.** Th
29010 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 68 65 63  is function chec
29020 6b 73 20 69 66 20 61 72 67 75 6d 65 6e 74 20 70  ks if argument p
29030 46 72 6f 6d 20 72 65 66 65 72 73 20 74 6f 20 61  From refers to a
29040 20 43 54 45 20 64 65 63 6c 61 72 65 64 20 62 79   CTE declared by
29050 20 0a 2a 2a 20 61 20 57 49 54 48 20 63 6c 61 75   .** a WITH clau
29060 73 65 20 6f 6e 20 74 68 65 20 73 74 61 63 6b 20  se on the stack 
29070 63 75 72 72 65 6e 74 6c 79 20 6d 61 69 6e 74 61  currently mainta
29080 69 6e 65 64 20 62 79 20 74 68 65 20 70 61 72 73  ined by the pars
29090 65 72 2e 20 41 6e 64 2c 0a 2a 2a 20 69 66 20 63  er. And,.** if c
290a0 75 72 72 65 6e 74 6c 79 20 70 72 6f 63 65 73 73  urrently process
290b0 69 6e 67 20 61 20 43 54 45 20 65 78 70 72 65 73  ing a CTE expres
290c0 73 69 6f 6e 2c 20 69 66 20 69 74 20 69 73 20 61  sion, if it is a
290d0 20 72 65 63 75 72 73 69 76 65 0a 2a 2a 20 72 65   recursive.** re
290e0 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20 63  ference to the c
290f0 75 72 72 65 6e 74 20 43 54 45 2e 0a 2a 2a 0a 2a  urrent CTE..**.*
29100 2a 20 49 66 20 70 46 72 6f 6d 20 66 61 6c 6c 73  * If pFrom falls
29110 20 69 6e 74 6f 20 65 69 74 68 65 72 20 6f 66 20   into either of 
29120 74 68 65 20 74 77 6f 20 63 61 74 65 67 6f 72 69  the two categori
29130 65 73 20 61 62 6f 76 65 2c 20 70 46 72 6f 6d 2d  es above, pFrom-
29140 3e 70 54 61 62 0a 2a 2a 20 61 6e 64 20 6f 74 68  >pTab.** and oth
29150 65 72 20 66 69 65 6c 64 73 20 61 72 65 20 70 6f  er fields are po
29160 70 75 6c 61 74 65 64 20 61 63 63 6f 72 64 69 6e  pulated accordin
29170 67 6c 79 2e 20 54 68 65 20 63 61 6c 6c 65 72 20  gly. The caller 
29180 73 68 6f 75 6c 64 20 63 68 65 63 6b 0a 2a 2a 20  should check.** 
29190 28 70 46 72 6f 6d 2d 3e 70 54 61 62 21 3d 30 29  (pFrom->pTab!=0)
291a0 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 77 68   to determine wh
291b0 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 61 20 73  ether or not a s
291c0 75 63 63 65 73 73 66 75 6c 20 6d 61 74 63 68 0a  uccessful match.
291d0 2a 2a 20 77 61 73 20 66 6f 75 6e 64 2e 0a 2a 2a  ** was found..**
291e0 0a 2a 2a 20 57 68 65 74 68 65 72 20 6f 72 20 6e  .** Whether or n
291f0 6f 74 20 61 20 6d 61 74 63 68 20 69 73 20 66 6f  ot a match is fo
29200 75 6e 64 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69  und, SQLITE_OK i
29210 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 6e 6f  s returned if no
29220 20 65 72 72 6f 72 0a 2a 2a 20 6f 63 63 75 72 73   error.** occurs
29230 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20 64 6f  . If an error do
29240 65 73 20 6f 63 63 75 72 2c 20 61 6e 20 65 72 72  es occur, an err
29250 6f 72 20 6d 65 73 73 61 67 65 20 69 73 20 73 74  or message is st
29260 6f 72 65 64 20 69 6e 20 74 68 65 0a 2a 2a 20 70  ored in the.** p
29270 61 72 73 65 72 20 61 6e 64 20 73 6f 6d 65 20 65  arser and some e
29280 72 72 6f 72 20 63 6f 64 65 20 6f 74 68 65 72 20  rror code other 
29290 74 68 61 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 72  than SQLITE_OK r
292a0 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74  eturned..*/.stat
292b0 69 63 20 69 6e 74 20 77 69 74 68 45 78 70 61 6e  ic int withExpan
292c0 64 28 0a 20 20 57 61 6c 6b 65 72 20 2a 70 57 61  d(.  Walker *pWa
292d0 6c 6b 65 72 2c 20 0a 20 20 73 74 72 75 63 74 20  lker, .  struct 
292e0 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 46  SrcList_item *pF
292f0 72 6f 6d 0a 29 7b 0a 20 20 50 61 72 73 65 20 2a  rom.){.  Parse *
29300 70 50 61 72 73 65 20 3d 20 70 57 61 6c 6b 65 72  pParse = pWalker
29310 2d 3e 70 50 61 72 73 65 3b 0a 20 20 73 71 6c 69  ->pParse;.  sqli
29320 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
29330 2d 3e 64 62 3b 0a 20 20 73 74 72 75 63 74 20 43  ->db;.  struct C
29340 74 65 20 2a 70 43 74 65 3b 20 20 20 20 20 20 20  te *pCte;       
29350 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 74 63 68          /* Match
29360 65 64 20 43 54 45 20 28 6f 72 20 4e 55 4c 4c 20  ed CTE (or NULL 
29370 69 66 20 6e 6f 20 6d 61 74 63 68 29 20 2a 2f 0a  if no match) */.
29380 20 20 57 69 74 68 20 2a 70 57 69 74 68 3b 20 20    With *pWith;  
29390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
293a0 20 20 2f 2a 20 57 49 54 48 20 63 6c 61 75 73 65    /* WITH clause
293b0 20 74 68 61 74 20 70 43 74 65 20 62 65 6c 6f 6e   that pCte belon
293c0 67 73 20 74 6f 20 2a 2f 0a 0a 20 20 61 73 73 65  gs to */..  asse
293d0 72 74 28 20 70 46 72 6f 6d 2d 3e 70 54 61 62 3d  rt( pFrom->pTab=
293e0 3d 30 20 29 3b 0a 0a 20 20 70 43 74 65 20 3d 20  =0 );..  pCte = 
293f0 73 65 61 72 63 68 57 69 74 68 28 70 50 61 72 73  searchWith(pPars
29400 65 2d 3e 70 57 69 74 68 2c 20 70 46 72 6f 6d 2c  e->pWith, pFrom,
29410 20 26 70 57 69 74 68 29 3b 0a 20 20 69 66 28 20   &pWith);.  if( 
29420 70 43 74 65 20 29 7b 0a 20 20 20 20 54 61 62 6c  pCte ){.    Tabl
29430 65 20 2a 70 54 61 62 3b 0a 20 20 20 20 45 78 70  e *pTab;.    Exp
29440 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 0a 20  rList *pEList;. 
29450 20 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 3b     Select *pSel;
29460 0a 20 20 20 20 53 65 6c 65 63 74 20 2a 70 4c 65  .    Select *pLe
29470 66 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ft;             
29480 20 20 20 2f 2a 20 4c 65 66 74 2d 6d 6f 73 74 20     /* Left-most 
29490 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
294a0 20 2a 2f 0a 20 20 20 20 69 6e 74 20 62 4d 61 79   */.    int bMay
294b0 52 65 63 75 72 73 69 76 65 3b 20 20 20 20 20 20  Recursive;      
294c0 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
294d0 20 63 6f 6d 70 6f 75 6e 64 20 6a 6f 69 6e 65 64   compound joined
294e0 20 62 79 20 55 4e 49 4f 4e 20 5b 41 4c 4c 5d 20   by UNION [ALL] 
294f0 2a 2f 0a 20 20 20 20 57 69 74 68 20 2a 70 53 61  */.    With *pSa
29500 76 65 64 57 69 74 68 3b 20 20 20 20 20 20 20 20  vedWith;        
29510 20 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 20       /* Initial 
29520 76 61 6c 75 65 20 6f 66 20 70 50 61 72 73 65 2d  value of pParse-
29530 3e 70 57 69 74 68 20 2a 2f 0a 0a 20 20 20 20 2f  >pWith */..    /
29540 2a 20 49 66 20 70 43 74 65 2d 3e 7a 43 74 65 45  * If pCte->zCteE
29550 72 72 20 69 73 20 6e 6f 6e 2d 4e 55 4c 4c 20 61  rr is non-NULL a
29560 74 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 74 68  t this point, th
29570 65 6e 20 74 68 69 73 20 69 73 20 61 6e 20 69 6c  en this is an il
29580 6c 65 67 61 6c 0a 20 20 20 20 2a 2a 20 72 65 63  legal.    ** rec
29590 75 72 73 69 76 65 20 72 65 66 65 72 65 6e 63 65  ursive reference
295a0 20 74 6f 20 43 54 45 20 70 43 74 65 2e 20 4c 65   to CTE pCte. Le
295b0 61 76 65 20 61 6e 20 65 72 72 6f 72 20 69 6e 20  ave an error in 
295c0 70 50 61 72 73 65 20 61 6e 64 20 72 65 74 75 72  pParse and retur
295d0 6e 0a 20 20 20 20 2a 2a 20 65 61 72 6c 79 2e 20  n.    ** early. 
295e0 49 66 20 70 43 74 65 2d 3e 7a 43 74 65 45 72 72  If pCte->zCteErr
295f0 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 74   is NULL, then t
29600 68 69 73 20 69 73 20 6e 6f 74 20 61 20 72 65 63  his is not a rec
29610 75 72 73 69 76 65 20 72 65 66 65 72 65 6e 63 65  ursive reference
29620 2e 0a 20 20 20 20 2a 2a 20 49 6e 20 74 68 69 73  ..    ** In this
29630 20 63 61 73 65 2c 20 70 72 6f 63 65 65 64 2e 20   case, proceed. 
29640 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 43 74 65   */.    if( pCte
29650 2d 3e 7a 43 74 65 45 72 72 20 29 7b 0a 20 20 20  ->zCteErr ){.   
29660 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
29670 73 67 28 70 50 61 72 73 65 2c 20 70 43 74 65 2d  sg(pParse, pCte-
29680 3e 7a 43 74 65 45 72 72 2c 20 70 43 74 65 2d 3e  >zCteErr, pCte->
29690 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 72 65  zName);.      re
296a0 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
296b0 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  R;.    }.    if(
296c0 20 63 61 6e 6e 6f 74 42 65 46 75 6e 63 74 69 6f   cannotBeFunctio
296d0 6e 28 70 50 61 72 73 65 2c 20 70 46 72 6f 6d 29  n(pParse, pFrom)
296e0 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
296f0 5f 45 52 52 4f 52 3b 0a 0a 20 20 20 20 61 73 73  _ERROR;..    ass
29700 65 72 74 28 20 70 46 72 6f 6d 2d 3e 70 54 61 62  ert( pFrom->pTab
29710 3d 3d 30 20 29 3b 0a 20 20 20 20 70 46 72 6f 6d  ==0 );.    pFrom
29720 2d 3e 70 54 61 62 20 3d 20 70 54 61 62 20 3d 20  ->pTab = pTab = 
29730 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a  sqlite3DbMallocZ
29740 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 54  ero(db, sizeof(T
29750 61 62 6c 65 29 29 3b 0a 20 20 20 20 69 66 28 20  able));.    if( 
29760 70 54 61 62 3d 3d 30 20 29 20 72 65 74 75 72 6e  pTab==0 ) return
29770 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20   WRC_Abort;.    
29780 70 54 61 62 2d 3e 6e 54 61 62 52 65 66 20 3d 20  pTab->nTabRef = 
29790 31 3b 0a 20 20 20 20 70 54 61 62 2d 3e 7a 4e 61  1;.    pTab->zNa
297a0 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74  me = sqlite3DbSt
297b0 72 44 75 70 28 64 62 2c 20 70 43 74 65 2d 3e 7a  rDup(db, pCte->z
297c0 4e 61 6d 65 29 3b 0a 20 20 20 20 70 54 61 62 2d  Name);.    pTab-
297d0 3e 69 50 4b 65 79 20 3d 20 2d 31 3b 0a 20 20 20  >iPKey = -1;.   
297e0 20 70 54 61 62 2d 3e 6e 52 6f 77 4c 6f 67 45 73   pTab->nRowLogEs
297f0 74 20 3d 20 32 30 30 3b 20 61 73 73 65 72 74 28  t = 200; assert(
29800 20 32 30 30 3d 3d 73 71 6c 69 74 65 33 4c 6f 67   200==sqlite3Log
29810 45 73 74 28 31 30 34 38 35 37 36 29 20 29 3b 0a  Est(1048576) );.
29820 20 20 20 20 70 54 61 62 2d 3e 74 61 62 46 6c 61      pTab->tabFla
29830 67 73 20 7c 3d 20 54 46 5f 45 70 68 65 6d 65 72  gs |= TF_Ephemer
29840 61 6c 20 7c 20 54 46 5f 4e 6f 56 69 73 69 62 6c  al | TF_NoVisibl
29850 65 52 6f 77 69 64 3b 0a 20 20 20 20 70 46 72 6f  eRowid;.    pFro
29860 6d 2d 3e 70 53 65 6c 65 63 74 20 3d 20 73 71 6c  m->pSelect = sql
29870 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 64 62  ite3SelectDup(db
29880 2c 20 70 43 74 65 2d 3e 70 53 65 6c 65 63 74 2c  , pCte->pSelect,
29890 20 30 29 3b 0a 20 20 20 20 69 66 28 20 64 62 2d   0);.    if( db-
298a0 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20  >mallocFailed ) 
298b0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
298c0 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 61 73  MEM_BKPT;.    as
298d0 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e 70 53 65  sert( pFrom->pSe
298e0 6c 65 63 74 20 29 3b 0a 0a 20 20 20 20 2f 2a 20  lect );..    /* 
298f0 43 68 65 63 6b 20 69 66 20 74 68 69 73 20 69 73  Check if this is
29900 20 61 20 72 65 63 75 72 73 69 76 65 20 43 54 45   a recursive CTE
29910 2e 20 2a 2f 0a 20 20 20 20 70 53 65 6c 20 3d 20  . */.    pSel = 
29920 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a  pFrom->pSelect;.
29930 20 20 20 20 62 4d 61 79 52 65 63 75 72 73 69 76      bMayRecursiv
29940 65 20 3d 20 28 20 70 53 65 6c 2d 3e 6f 70 3d 3d  e = ( pSel->op==
29950 54 4b 5f 41 4c 4c 20 7c 7c 20 70 53 65 6c 2d 3e  TK_ALL || pSel->
29960 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29 3b 0a  op==TK_UNION );.
29970 20 20 20 20 69 66 28 20 62 4d 61 79 52 65 63 75      if( bMayRecu
29980 72 73 69 76 65 20 29 7b 0a 20 20 20 20 20 20 69  rsive ){.      i
29990 6e 74 20 69 3b 0a 20 20 20 20 20 20 53 72 63 4c  nt i;.      SrcL
299a0 69 73 74 20 2a 70 53 72 63 20 3d 20 70 46 72 6f  ist *pSrc = pFro
299b0 6d 2d 3e 70 53 65 6c 65 63 74 2d 3e 70 53 72 63  m->pSelect->pSrc
299c0 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  ;.      for(i=0;
299d0 20 69 3c 70 53 72 63 2d 3e 6e 53 72 63 3b 20 69   i<pSrc->nSrc; i
299e0 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 73 74 72  ++){.        str
299f0 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
29a00 20 2a 70 49 74 65 6d 20 3d 20 26 70 53 72 63 2d   *pItem = &pSrc-
29a10 3e 61 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 69  >a[i];.        i
29a20 66 28 20 70 49 74 65 6d 2d 3e 7a 44 61 74 61 62  f( pItem->zDatab
29a30 61 73 65 3d 3d 30 20 0a 20 20 20 20 20 20 20 20  ase==0 .        
29a40 20 26 26 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65   && pItem->zName
29a50 21 3d 30 20 0a 20 20 20 20 20 20 20 20 20 26 26  !=0 .         &&
29a60 20 30 3d 3d 73 71 6c 69 74 65 33 53 74 72 49 43   0==sqlite3StrIC
29a70 6d 70 28 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 2c  mp(pItem->zName,
29a80 20 70 43 74 65 2d 3e 7a 4e 61 6d 65 29 0a 20 20   pCte->zName).  
29a90 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20          ){.     
29aa0 20 20 20 20 20 70 49 74 65 6d 2d 3e 70 54 61 62       pItem->pTab
29ab0 20 3d 20 70 54 61 62 3b 0a 20 20 20 20 20 20 20   = pTab;.       
29ac0 20 20 20 70 49 74 65 6d 2d 3e 66 67 2e 69 73 52     pItem->fg.isR
29ad0 65 63 75 72 73 69 76 65 20 3d 20 31 3b 0a 20 20  ecursive = 1;.  
29ae0 20 20 20 20 20 20 20 20 70 54 61 62 2d 3e 6e 54          pTab->nT
29af0 61 62 52 65 66 2b 2b 3b 0a 20 20 20 20 20 20 20  abRef++;.       
29b00 20 20 20 70 53 65 6c 2d 3e 73 65 6c 46 6c 61 67     pSel->selFlag
29b10 73 20 7c 3d 20 53 46 5f 52 65 63 75 72 73 69 76  s |= SF_Recursiv
29b20 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  e;.        }.   
29b30 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
29b40 2f 2a 20 4f 6e 6c 79 20 6f 6e 65 20 72 65 63 75  /* Only one recu
29b50 72 73 69 76 65 20 72 65 66 65 72 65 6e 63 65 20  rsive reference 
29b60 69 73 20 70 65 72 6d 69 74 74 65 64 2e 20 2a 2f  is permitted. */
29b70 20 0a 20 20 20 20 69 66 28 20 70 54 61 62 2d 3e   .    if( pTab->
29b80 6e 54 61 62 52 65 66 3e 32 20 29 7b 0a 20 20 20  nTabRef>2 ){.   
29b90 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
29ba0 73 67 28 0a 20 20 20 20 20 20 20 20 20 20 70 50  sg(.          pP
29bb0 61 72 73 65 2c 20 22 6d 75 6c 74 69 70 6c 65 20  arse, "multiple 
29bc0 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 72 65  references to re
29bd0 63 75 72 73 69 76 65 20 74 61 62 6c 65 3a 20 25  cursive table: %
29be0 73 22 2c 20 70 43 74 65 2d 3e 7a 4e 61 6d 65 0a  s", pCte->zName.
29bf0 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 72        );.      r
29c00 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
29c10 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73  OR;.    }.    as
29c20 73 65 72 74 28 20 70 54 61 62 2d 3e 6e 54 61 62  sert( pTab->nTab
29c30 52 65 66 3d 3d 31 20 7c 7c 20 0a 20 20 20 20 20  Ref==1 || .     
29c40 20 20 20 20 20 20 20 28 28 70 53 65 6c 2d 3e 73         ((pSel->s
29c50 65 6c 46 6c 61 67 73 26 53 46 5f 52 65 63 75 72  elFlags&SF_Recur
29c60 73 69 76 65 29 20 26 26 20 70 54 61 62 2d 3e 6e  sive) && pTab->n
29c70 54 61 62 52 65 66 3d 3d 32 20 29 29 3b 0a 0a 20  TabRef==2 ));.. 
29c80 20 20 20 70 43 74 65 2d 3e 7a 43 74 65 45 72 72     pCte->zCteErr
29c90 20 3d 20 22 63 69 72 63 75 6c 61 72 20 72 65 66   = "circular ref
29ca0 65 72 65 6e 63 65 3a 20 25 73 22 3b 0a 20 20 20  erence: %s";.   
29cb0 20 70 53 61 76 65 64 57 69 74 68 20 3d 20 70 50   pSavedWith = pP
29cc0 61 72 73 65 2d 3e 70 57 69 74 68 3b 0a 20 20 20  arse->pWith;.   
29cd0 20 70 50 61 72 73 65 2d 3e 70 57 69 74 68 20 3d   pParse->pWith =
29ce0 20 70 57 69 74 68 3b 0a 20 20 20 20 69 66 28 20   pWith;.    if( 
29cf0 62 4d 61 79 52 65 63 75 72 73 69 76 65 20 29 7b  bMayRecursive ){
29d00 0a 20 20 20 20 20 20 53 65 6c 65 63 74 20 2a 70  .      Select *p
29d10 50 72 69 6f 72 20 3d 20 70 53 65 6c 2d 3e 70 50  Prior = pSel->pP
29d20 72 69 6f 72 3b 0a 20 20 20 20 20 20 61 73 73 65  rior;.      asse
29d30 72 74 28 20 70 50 72 69 6f 72 2d 3e 70 57 69 74  rt( pPrior->pWit
29d40 68 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 50  h==0 );.      pP
29d50 72 69 6f 72 2d 3e 70 57 69 74 68 20 3d 20 70 53  rior->pWith = pS
29d60 65 6c 2d 3e 70 57 69 74 68 3b 0a 20 20 20 20 20  el->pWith;.     
29d70 20 73 71 6c 69 74 65 33 57 61 6c 6b 53 65 6c 65   sqlite3WalkSele
29d80 63 74 28 70 57 61 6c 6b 65 72 2c 20 70 50 72 69  ct(pWalker, pPri
29d90 6f 72 29 3b 0a 20 20 20 20 20 20 70 50 72 69 6f  or);.      pPrio
29da0 72 2d 3e 70 57 69 74 68 20 3d 20 30 3b 0a 20 20  r->pWith = 0;.  
29db0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73    }else{.      s
29dc0 71 6c 69 74 65 33 57 61 6c 6b 53 65 6c 65 63 74  qlite3WalkSelect
29dd0 28 70 57 61 6c 6b 65 72 2c 20 70 53 65 6c 29 3b  (pWalker, pSel);
29de0 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 72 73  .    }.    pPars
29df0 65 2d 3e 70 57 69 74 68 20 3d 20 70 57 69 74 68  e->pWith = pWith
29e00 3b 0a 0a 20 20 20 20 66 6f 72 28 70 4c 65 66 74  ;..    for(pLeft
29e10 3d 70 53 65 6c 3b 20 70 4c 65 66 74 2d 3e 70 50  =pSel; pLeft->pP
29e20 72 69 6f 72 3b 20 70 4c 65 66 74 3d 70 4c 65 66  rior; pLeft=pLef
29e30 74 2d 3e 70 50 72 69 6f 72 29 3b 0a 20 20 20 20  t->pPrior);.    
29e40 70 45 4c 69 73 74 20 3d 20 70 4c 65 66 74 2d 3e  pEList = pLeft->
29e50 70 45 4c 69 73 74 3b 0a 20 20 20 20 69 66 28 20  pEList;.    if( 
29e60 70 43 74 65 2d 3e 70 43 6f 6c 73 20 29 7b 0a 20  pCte->pCols ){. 
29e70 20 20 20 20 20 69 66 28 20 70 45 4c 69 73 74 20       if( pEList 
29e80 26 26 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  && pEList->nExpr
29e90 21 3d 70 43 74 65 2d 3e 70 43 6f 6c 73 2d 3e 6e  !=pCte->pCols->n
29ea0 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20 20 20  Expr ){.        
29eb0 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
29ec0 70 50 61 72 73 65 2c 20 22 74 61 62 6c 65 20 25  pParse, "table %
29ed0 73 20 68 61 73 20 25 64 20 76 61 6c 75 65 73 20  s has %d values 
29ee0 66 6f 72 20 25 64 20 63 6f 6c 75 6d 6e 73 22 2c  for %d columns",
29ef0 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 43 74  .            pCt
29f00 65 2d 3e 7a 4e 61 6d 65 2c 20 70 45 4c 69 73 74  e->zName, pEList
29f10 2d 3e 6e 45 78 70 72 2c 20 70 43 74 65 2d 3e 70  ->nExpr, pCte->p
29f20 43 6f 6c 73 2d 3e 6e 45 78 70 72 0a 20 20 20 20  Cols->nExpr.    
29f30 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 70      );.        p
29f40 50 61 72 73 65 2d 3e 70 57 69 74 68 20 3d 20 70  Parse->pWith = p
29f50 53 61 76 65 64 57 69 74 68 3b 0a 20 20 20 20 20  SavedWith;.     
29f60 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
29f70 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a  _ERROR;.      }.
29f80 20 20 20 20 20 20 70 45 4c 69 73 74 20 3d 20 70        pEList = p
29f90 43 74 65 2d 3e 70 43 6f 6c 73 3b 0a 20 20 20 20  Cte->pCols;.    
29fa0 7d 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 43 6f  }..    sqlite3Co
29fb0 6c 75 6d 6e 73 46 72 6f 6d 45 78 70 72 4c 69 73  lumnsFromExprLis
29fc0 74 28 70 50 61 72 73 65 2c 20 70 45 4c 69 73 74  t(pParse, pEList
29fd0 2c 20 26 70 54 61 62 2d 3e 6e 43 6f 6c 2c 20 26  , &pTab->nCol, &
29fe0 70 54 61 62 2d 3e 61 43 6f 6c 29 3b 0a 20 20 20  pTab->aCol);.   
29ff0 20 69 66 28 20 62 4d 61 79 52 65 63 75 72 73 69   if( bMayRecursi
2a000 76 65 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  ve ){.      if( 
2a010 70 53 65 6c 2d 3e 73 65 6c 46 6c 61 67 73 20 26  pSel->selFlags &
2a020 20 53 46 5f 52 65 63 75 72 73 69 76 65 20 29 7b   SF_Recursive ){
2a030 0a 20 20 20 20 20 20 20 20 70 43 74 65 2d 3e 7a  .        pCte->z
2a040 43 74 65 45 72 72 20 3d 20 22 6d 75 6c 74 69 70  CteErr = "multip
2a050 6c 65 20 72 65 63 75 72 73 69 76 65 20 72 65 66  le recursive ref
2a060 65 72 65 6e 63 65 73 3a 20 25 73 22 3b 0a 20 20  erences: %s";.  
2a070 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2a080 20 20 20 70 43 74 65 2d 3e 7a 43 74 65 45 72 72     pCte->zCteErr
2a090 20 3d 20 22 72 65 63 75 72 73 69 76 65 20 72 65   = "recursive re
2a0a0 66 65 72 65 6e 63 65 20 69 6e 20 61 20 73 75 62  ference in a sub
2a0b0 71 75 65 72 79 3a 20 25 73 22 3b 0a 20 20 20 20  query: %s";.    
2a0c0 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
2a0d0 33 57 61 6c 6b 53 65 6c 65 63 74 28 70 57 61 6c  3WalkSelect(pWal
2a0e0 6b 65 72 2c 20 70 53 65 6c 29 3b 0a 20 20 20 20  ker, pSel);.    
2a0f0 7d 0a 20 20 20 20 70 43 74 65 2d 3e 7a 43 74 65  }.    pCte->zCte
2a100 45 72 72 20 3d 20 30 3b 0a 20 20 20 20 70 50 61  Err = 0;.    pPa
2a110 72 73 65 2d 3e 70 57 69 74 68 20 3d 20 70 53 61  rse->pWith = pSa
2a120 76 65 64 57 69 74 68 3b 0a 20 20 7d 0a 0a 20 20  vedWith;.  }..  
2a130 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
2a140 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e  ;.}.#endif..#ifn
2a150 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
2a160 43 54 45 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65  CTE./*.** If the
2a170 20 53 45 4c 45 43 54 20 70 61 73 73 65 64 20 61   SELECT passed a
2a180 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67  s the second arg
2a190 75 6d 65 6e 74 20 68 61 73 20 61 6e 20 61 73 73  ument has an ass
2a1a0 6f 63 69 61 74 65 64 20 57 49 54 48 20 0a 2a 2a  ociated WITH .**
2a1b0 20 63 6c 61 75 73 65 2c 20 70 6f 70 20 69 74 20   clause, pop it 
2a1c0 66 72 6f 6d 20 74 68 65 20 73 74 61 63 6b 20 73  from the stack s
2a1d0 74 6f 72 65 64 20 61 73 20 70 61 72 74 20 6f 66  tored as part of
2a1e0 20 74 68 65 20 50 61 72 73 65 20 6f 62 6a 65 63   the Parse objec
2a1f0 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75  t..**.** This fu
2a200 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20 61  nction is used a
2a210 73 20 74 68 65 20 78 53 65 6c 65 63 74 43 61 6c  s the xSelectCal
2a220 6c 62 61 63 6b 32 28 29 20 63 61 6c 6c 62 61 63  lback2() callbac
2a230 6b 20 62 79 0a 2a 2a 20 73 71 6c 69 74 65 33 53  k by.** sqlite3S
2a240 65 6c 65 63 74 45 78 70 61 6e 64 28 29 20 77 68  electExpand() wh
2a250 65 6e 20 77 61 6c 6b 69 6e 67 20 61 20 53 45 4c  en walking a SEL
2a260 45 43 54 20 74 72 65 65 20 74 6f 20 72 65 73 6f  ECT tree to reso
2a270 6c 76 65 20 74 61 62 6c 65 0a 2a 2a 20 6e 61 6d  lve table.** nam
2a280 65 73 20 61 6e 64 20 6f 74 68 65 72 20 46 52 4f  es and other FRO
2a290 4d 20 63 6c 61 75 73 65 20 65 6c 65 6d 65 6e 74  M clause element
2a2a0 73 2e 20 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  s. .*/.static vo
2a2b0 69 64 20 73 65 6c 65 63 74 50 6f 70 57 69 74 68  id selectPopWith
2a2c0 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72  (Walker *pWalker
2a2d0 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20  , Select *p){.  
2a2e0 50 61 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20  Parse *pParse = 
2a2f0 70 57 61 6c 6b 65 72 2d 3e 70 50 61 72 73 65 3b  pWalker->pParse;
2a300 0a 20 20 69 66 28 20 4f 4b 5f 49 46 5f 41 4c 57  .  if( OK_IF_ALW
2a310 41 59 53 5f 54 52 55 45 28 70 50 61 72 73 65 2d  AYS_TRUE(pParse-
2a320 3e 70 57 69 74 68 29 20 26 26 20 70 2d 3e 70 50  >pWith) && p->pP
2a330 72 69 6f 72 3d 3d 30 20 29 7b 0a 20 20 20 20 57  rior==0 ){.    W
2a340 69 74 68 20 2a 70 57 69 74 68 20 3d 20 66 69 6e  ith *pWith = fin
2a350 64 52 69 67 68 74 6d 6f 73 74 28 70 29 2d 3e 70  dRightmost(p)->p
2a360 57 69 74 68 3b 0a 20 20 20 20 69 66 28 20 70 57  With;.    if( pW
2a370 69 74 68 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  ith!=0 ){.      
2a380 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e  assert( pParse->
2a390 70 57 69 74 68 3d 3d 70 57 69 74 68 20 29 3b 0a  pWith==pWith );.
2a3a0 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 70 57        pParse->pW
2a3b0 69 74 68 20 3d 20 70 57 69 74 68 2d 3e 70 4f 75  ith = pWith->pOu
2a3c0 74 65 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  ter;.    }.  }.}
2a3d0 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 73  .#else.#define s
2a3e0 65 6c 65 63 74 50 6f 70 57 69 74 68 20 30 0a 23  electPopWith 0.#
2a3f0 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  endif../*.** The
2a400 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 73 74   SrcList_item st
2a410 72 75 63 74 75 72 65 20 70 61 73 73 65 64 20 61  ructure passed a
2a420 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67  s the second arg
2a430 75 6d 65 6e 74 20 72 65 70 72 65 73 65 6e 74 73  ument represents
2a440 20 61 0a 2a 2a 20 73 75 62 2d 71 75 65 72 79 20   a.** sub-query 
2a450 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  in the FROM clau
2a460 73 65 20 6f 66 20 61 20 53 45 4c 45 43 54 20 73  se of a SELECT s
2a470 74 61 74 65 6d 65 6e 74 2e 20 54 68 69 73 20 66  tatement. This f
2a480 75 6e 63 74 69 6f 6e 0a 2a 2a 20 61 6c 6c 6f 63  unction.** alloc
2a490 61 74 65 73 20 61 6e 64 20 70 6f 70 75 6c 61 74  ates and populat
2a4a0 65 73 20 74 68 65 20 53 72 63 4c 69 73 74 5f 69  es the SrcList_i
2a4b0 74 65 6d 2e 70 54 61 62 20 6f 62 6a 65 63 74 2e  tem.pTab object.
2a4c0 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 0a   If successful,.
2a4d0 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  ** SQLITE_OK is 
2a4e0 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77  returned. Otherw
2a4f0 69 73 65 2c 20 69 66 20 61 6e 20 4f 4f 4d 20 65  ise, if an OOM e
2a500 72 72 6f 72 20 69 73 20 65 6e 63 6f 75 6e 74 65  rror is encounte
2a510 72 65 64 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 4e  red,.** SQLITE_N
2a520 4f 4d 45 4d 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  OMEM..*/.int sql
2a530 69 74 65 33 45 78 70 61 6e 64 53 75 62 71 75 65  ite3ExpandSubque
2a540 72 79 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ry(Parse *pParse
2a550 2c 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74  , struct SrcList
2a560 5f 69 74 65 6d 20 2a 70 46 72 6f 6d 29 7b 0a 20  _item *pFrom){. 
2a570 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 20 3d 20   Select *pSel = 
2a580 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a  pFrom->pSelect;.
2a590 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 0a    Table *pTab;..
2a5a0 20 20 61 73 73 65 72 74 28 20 70 53 65 6c 20 29    assert( pSel )
2a5b0 3b 0a 20 20 70 46 72 6f 6d 2d 3e 70 54 61 62 20  ;.  pFrom->pTab 
2a5c0 3d 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33  = pTab = sqlite3
2a5d0 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 70 50 61  DbMallocZero(pPa
2a5e0 72 73 65 2d 3e 64 62 2c 20 73 69 7a 65 6f 66 28  rse->db, sizeof(
2a5f0 54 61 62 6c 65 29 29 3b 0a 20 20 69 66 28 20 70  Table));.  if( p
2a600 54 61 62 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  Tab==0 ) return 
2a610 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
2a620 70 54 61 62 2d 3e 6e 54 61 62 52 65 66 20 3d 20  pTab->nTabRef = 
2a630 31 3b 0a 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e  1;.  if( pFrom->
2a640 7a 41 6c 69 61 73 20 29 7b 0a 20 20 20 20 70 54  zAlias ){.    pT
2a650 61 62 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69  ab->zName = sqli
2a660 74 65 33 44 62 53 74 72 44 75 70 28 70 50 61 72  te3DbStrDup(pPar
2a670 73 65 2d 3e 64 62 2c 20 70 46 72 6f 6d 2d 3e 7a  se->db, pFrom->z
2a680 41 6c 69 61 73 29 3b 0a 20 20 7d 65 6c 73 65 7b  Alias);.  }else{
2a690 0a 20 20 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  .    pTab->zName
2a6a0 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74   = sqlite3MPrint
2a6b0 66 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 22 73  f(pParse->db, "s
2a6c0 75 62 71 75 65 72 79 5f 25 75 22 2c 20 70 53 65  ubquery_%u", pSe
2a6d0 6c 2d 3e 73 65 6c 49 64 29 3b 0a 20 20 7d 0a 20  l->selId);.  }. 
2a6e0 20 77 68 69 6c 65 28 20 70 53 65 6c 2d 3e 70 50   while( pSel->pP
2a6f0 72 69 6f 72 20 29 7b 20 70 53 65 6c 20 3d 20 70  rior ){ pSel = p
2a700 53 65 6c 2d 3e 70 50 72 69 6f 72 3b 20 7d 0a 20  Sel->pPrior; }. 
2a710 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 73 46   sqlite3ColumnsF
2a720 72 6f 6d 45 78 70 72 4c 69 73 74 28 70 50 61 72  romExprList(pPar
2a730 73 65 2c 20 70 53 65 6c 2d 3e 70 45 4c 69 73 74  se, pSel->pEList
2a740 2c 26 70 54 61 62 2d 3e 6e 43 6f 6c 2c 26 70 54  ,&pTab->nCol,&pT
2a750 61 62 2d 3e 61 43 6f 6c 29 3b 0a 20 20 70 54 61  ab->aCol);.  pTa
2a760 62 2d 3e 69 50 4b 65 79 20 3d 20 2d 31 3b 0a 20  b->iPKey = -1;. 
2a770 20 70 54 61 62 2d 3e 6e 52 6f 77 4c 6f 67 45 73   pTab->nRowLogEs
2a780 74 20 3d 20 32 30 30 3b 20 61 73 73 65 72 74 28  t = 200; assert(
2a790 20 32 30 30 3d 3d 73 71 6c 69 74 65 33 4c 6f 67   200==sqlite3Log
2a7a0 45 73 74 28 31 30 34 38 35 37 36 29 20 29 3b 0a  Est(1048576) );.
2a7b0 20 20 70 54 61 62 2d 3e 74 61 62 46 6c 61 67 73    pTab->tabFlags
2a7c0 20 7c 3d 20 54 46 5f 45 70 68 65 6d 65 72 61 6c   |= TF_Ephemeral
2a7d0 3b 0a 0a 20 20 72 65 74 75 72 6e 20 70 50 61 72  ;..  return pPar
2a7e0 73 65 2d 3e 6e 45 72 72 20 3f 20 53 51 4c 49 54  se->nErr ? SQLIT
2a7f0 45 5f 45 52 52 4f 52 20 3a 20 53 51 4c 49 54 45  E_ERROR : SQLITE
2a800 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  _OK;.}../*.** Th
2a810 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20  is routine is a 
2a820 57 61 6c 6b 65 72 20 63 61 6c 6c 62 61 63 6b 20  Walker callback 
2a830 66 6f 72 20 22 65 78 70 61 6e 64 69 6e 67 22 20  for "expanding" 
2a840 61 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  a SELECT stateme
2a850 6e 74 2e 0a 2a 2a 20 22 45 78 70 61 6e 64 69 6e  nt..** "Expandin
2a860 67 22 20 6d 65 61 6e 73 20 74 6f 20 64 6f 20 74  g" means to do t
2a870 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a  he following:.**
2a880 0a 2a 2a 20 20 20 20 28 31 29 20 20 4d 61 6b 65  .**    (1)  Make
2a890 20 73 75 72 65 20 56 44 42 45 20 63 75 72 73 6f   sure VDBE curso
2a8a0 72 20 6e 75 6d 62 65 72 73 20 68 61 76 65 20 62  r numbers have b
2a8b0 65 65 6e 20 61 73 73 69 67 6e 65 64 20 74 6f 20  een assigned to 
2a8c0 65 76 65 72 79 0a 2a 2a 20 20 20 20 20 20 20 20  every.**        
2a8d0 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65 20   element of the 
2a8e0 46 52 4f 4d 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a  FROM clause..**.
2a8f0 2a 2a 20 20 20 20 28 32 29 20 20 46 69 6c 6c 20  **    (2)  Fill 
2a900 69 6e 20 74 68 65 20 70 54 61 62 4c 69 73 74 2d  in the pTabList-
2a910 3e 61 5b 5d 2e 70 54 61 62 20 66 69 65 6c 64 73  >a[].pTab fields
2a920 20 69 6e 20 74 68 65 20 53 72 63 4c 69 73 74 20   in the SrcList 
2a930 74 68 61 74 20 0a 2a 2a 20 20 20 20 20 20 20 20  that .**        
2a940 20 64 65 66 69 6e 65 73 20 46 52 4f 4d 20 63 6c   defines FROM cl
2a950 61 75 73 65 2e 20 20 57 68 65 6e 20 76 69 65 77  ause.  When view
2a960 73 20 61 70 70 65 61 72 20 69 6e 20 74 68 65 20  s appear in the 
2a970 46 52 4f 4d 20 63 6c 61 75 73 65 2c 0a 2a 2a 20  FROM clause,.** 
2a980 20 20 20 20 20 20 20 20 66 69 6c 6c 20 70 54 61          fill pTa
2a990 62 4c 69 73 74 2d 3e 61 5b 5d 2e 70 53 65 6c 65  bList->a[].pSele
2a9a0 63 74 20 77 69 74 68 20 61 20 63 6f 70 79 20 6f  ct with a copy o
2a9b0 66 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61  f the SELECT sta
2a9c0 74 65 6d 65 6e 74 0a 2a 2a 20 20 20 20 20 20 20  tement.**       
2a9d0 20 20 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74    that implement
2a9e0 73 20 74 68 65 20 76 69 65 77 2e 20 20 41 20 63  s the view.  A c
2a9f0 6f 70 79 20 69 73 20 6d 61 64 65 20 6f 66 20 74  opy is made of t
2aa00 68 65 20 76 69 65 77 27 73 20 53 45 4c 45 43 54  he view's SELECT
2aa10 0a 2a 2a 20 20 20 20 20 20 20 20 20 73 74 61 74  .**         stat
2aa20 65 6d 65 6e 74 20 73 6f 20 74 68 61 74 20 77 65  ement so that we
2aa30 20 63 61 6e 20 66 72 65 65 6c 79 20 6d 6f 64 69   can freely modi
2aa40 66 79 20 6f 72 20 64 65 6c 65 74 65 20 74 68 61  fy or delete tha
2aa50 74 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 20  t statement.**  
2aa60 20 20 20 20 20 20 20 77 69 74 68 6f 75 74 20 77         without w
2aa70 6f 72 72 79 69 6e 67 20 61 62 6f 75 74 20 6d 65  orrying about me
2aa80 73 73 69 6e 67 20 75 70 20 74 68 65 20 70 65 72  ssing up the per
2aa90 73 69 73 74 65 6e 74 20 72 65 70 72 65 73 65 6e  sistent represen
2aaa0 74 61 74 69 6f 6e 0a 2a 2a 20 20 20 20 20 20 20  tation.**       
2aab0 20 20 6f 66 20 74 68 65 20 76 69 65 77 2e 0a 2a    of the view..*
2aac0 2a 0a 2a 2a 20 20 20 20 28 33 29 20 20 41 64 64  *.**    (3)  Add
2aad0 20 74 65 72 6d 73 20 74 6f 20 74 68 65 20 57 48   terms to the WH
2aae0 45 52 45 20 63 6c 61 75 73 65 20 74 6f 20 61 63  ERE clause to ac
2aaf0 63 6f 6d 6d 6f 64 61 74 65 20 74 68 65 20 4e 41  commodate the NA
2ab00 54 55 52 41 4c 20 6b 65 79 77 6f 72 64 0a 2a 2a  TURAL keyword.**
2ab10 20 20 20 20 20 20 20 20 20 6f 6e 20 6a 6f 69 6e           on join
2ab20 73 20 61 6e 64 20 74 68 65 20 4f 4e 20 61 6e 64  s and the ON and
2ab30 20 55 53 49 4e 47 20 63 6c 61 75 73 65 20 6f 66   USING clause of
2ab40 20 6a 6f 69 6e 73 2e 0a 2a 2a 0a 2a 2a 20 20 20   joins..**.**   
2ab50 20 28 34 29 20 20 53 63 61 6e 20 74 68 65 20 6c   (4)  Scan the l
2ab60 69 73 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69  ist of columns i
2ab70 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  n the result set
2ab80 20 28 70 45 4c 69 73 74 29 20 6c 6f 6f 6b 69 6e   (pEList) lookin
2ab90 67 0a 2a 2a 20 20 20 20 20 20 20 20 20 66 6f 72  g.**         for
2aba0 20 69 6e 73 74 61 6e 63 65 73 20 6f 66 20 74 68   instances of th
2abb0 65 20 22 2a 22 20 6f 70 65 72 61 74 6f 72 20 6f  e "*" operator o
2abc0 72 20 74 68 65 20 54 41 42 4c 45 2e 2a 20 6f 70  r the TABLE.* op
2abd0 65 72 61 74 6f 72 2e 0a 2a 2a 20 20 20 20 20 20  erator..**      
2abe0 20 20 20 49 66 20 66 6f 75 6e 64 2c 20 65 78 70     If found, exp
2abf0 61 6e 64 20 65 61 63 68 20 22 2a 22 20 74 6f 20  and each "*" to 
2ac00 62 65 20 65 76 65 72 79 20 63 6f 6c 75 6d 6e 20  be every column 
2ac10 69 6e 20 65 76 65 72 79 20 74 61 62 6c 65 0a 2a  in every table.*
2ac20 2a 20 20 20 20 20 20 20 20 20 61 6e 64 20 54 41  *         and TA
2ac30 42 4c 45 2e 2a 20 74 6f 20 62 65 20 65 76 65 72  BLE.* to be ever
2ac40 79 20 63 6f 6c 75 6d 6e 20 69 6e 20 54 41 42 4c  y column in TABL
2ac50 45 2e 0a 2a 2a 0a 2a 2f 0a 73 74 61 74 69 63 20  E..**.*/.static 
2ac60 69 6e 74 20 73 65 6c 65 63 74 45 78 70 61 6e 64  int selectExpand
2ac70 65 72 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b  er(Walker *pWalk
2ac80 65 72 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a  er, Select *p){.
2ac90 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 20    Parse *pParse 
2aca0 3d 20 70 57 61 6c 6b 65 72 2d 3e 70 50 61 72 73  = pWalker->pPars
2acb0 65 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 2c 20 6b  e;.  int i, j, k
2acc0 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61  ;.  SrcList *pTa
2acd0 62 4c 69 73 74 3b 0a 20 20 45 78 70 72 4c 69 73  bList;.  ExprLis
2ace0 74 20 2a 70 45 4c 69 73 74 3b 0a 20 20 73 74 72  t *pEList;.  str
2acf0 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
2ad00 20 2a 70 46 72 6f 6d 3b 0a 20 20 73 71 6c 69 74   *pFrom;.  sqlit
2ad10 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
2ad20 3e 64 62 3b 0a 20 20 45 78 70 72 20 2a 70 45 2c  >db;.  Expr *pE,
2ad30 20 2a 70 52 69 67 68 74 2c 20 2a 70 45 78 70 72   *pRight, *pExpr
2ad40 3b 0a 20 20 75 31 36 20 73 65 6c 46 6c 61 67 73  ;.  u16 selFlags
2ad50 20 3d 20 70 2d 3e 73 65 6c 46 6c 61 67 73 3b 0a   = p->selFlags;.
2ad60 20 20 75 33 32 20 65 6c 69 73 74 46 6c 61 67 73    u32 elistFlags
2ad70 20 3d 20 30 3b 0a 0a 20 20 70 2d 3e 73 65 6c 46   = 0;..  p->selF
2ad80 6c 61 67 73 20 7c 3d 20 53 46 5f 45 78 70 61 6e  lags |= SF_Expan
2ad90 64 65 64 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d  ded;.  if( db->m
2ada0 61 6c 6c 6f 63 46 61 69 6c 65 64 20 20 29 7b 0a  allocFailed  ){.
2adb0 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41      return WRC_A
2adc0 62 6f 72 74 3b 0a 20 20 7d 0a 20 20 61 73 73 65  bort;.  }.  asse
2add0 72 74 28 20 70 2d 3e 70 53 72 63 21 3d 30 20 29  rt( p->pSrc!=0 )
2ade0 3b 0a 20 20 69 66 28 20 28 73 65 6c 46 6c 61 67  ;.  if( (selFlag
2adf0 73 20 26 20 53 46 5f 45 78 70 61 6e 64 65 64 29  s & SF_Expanded)
2ae00 21 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  !=0 ){.    retur
2ae10 6e 20 57 52 43 5f 50 72 75 6e 65 3b 0a 20 20 7d  n WRC_Prune;.  }
2ae20 0a 20 20 69 66 28 20 70 57 61 6c 6b 65 72 2d 3e  .  if( pWalker->
2ae30 65 43 6f 64 65 20 29 7b 0a 20 20 20 20 2f 2a 20  eCode ){.    /* 
2ae40 52 65 6e 75 6d 62 65 72 20 73 65 6c 49 64 20 62  Renumber selId b
2ae50 65 63 61 75 73 65 20 69 74 20 68 61 73 20 62 65  ecause it has be
2ae60 65 6e 20 63 6f 70 69 65 64 20 66 72 6f 6d 20 61  en copied from a
2ae70 20 76 69 65 77 20 2a 2f 0a 20 20 20 20 70 2d 3e   view */.    p->
2ae80 73 65 6c 49 64 20 3d 20 2b 2b 70 50 61 72 73 65  selId = ++pParse
2ae90 2d 3e 6e 53 65 6c 65 63 74 3b 0a 20 20 7d 0a 20  ->nSelect;.  }. 
2aea0 20 70 54 61 62 4c 69 73 74 20 3d 20 70 2d 3e 70   pTabList = p->p
2aeb0 53 72 63 3b 0a 20 20 70 45 4c 69 73 74 20 3d 20  Src;.  pEList = 
2aec0 70 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 73 71 6c  p->pEList;.  sql
2aed0 69 74 65 33 57 69 74 68 50 75 73 68 28 70 50 61  ite3WithPush(pPa
2aee0 72 73 65 2c 20 70 2d 3e 70 57 69 74 68 2c 20 30  rse, p->pWith, 0
2aef0 29 3b 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75  );..  /* Make su
2af00 72 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72  re cursor number
2af10 73 20 68 61 76 65 20 62 65 65 6e 20 61 73 73 69  s have been assi
2af20 67 6e 65 64 20 74 6f 20 61 6c 6c 20 65 6e 74 72  gned to all entr
2af30 69 65 73 20 69 6e 0a 20 20 2a 2a 20 74 68 65 20  ies in.  ** the 
2af40 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74  FROM clause of t
2af50 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  he SELECT statem
2af60 65 6e 74 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69  ent..  */.  sqli
2af70 74 65 33 53 72 63 4c 69 73 74 41 73 73 69 67 6e  te3SrcListAssign
2af80 43 75 72 73 6f 72 73 28 70 50 61 72 73 65 2c 20  Cursors(pParse, 
2af90 70 54 61 62 4c 69 73 74 29 3b 0a 0a 20 20 2f 2a  pTabList);..  /*
2afa0 20 4c 6f 6f 6b 20 75 70 20 65 76 65 72 79 20 74   Look up every t
2afb0 61 62 6c 65 20 6e 61 6d 65 64 20 69 6e 20 74 68  able named in th
2afc0 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66  e FROM clause of
2afd0 20 74 68 65 20 73 65 6c 65 63 74 2e 20 20 49 66   the select.  If
2afe0 0a 20 20 2a 2a 20 61 6e 20 65 6e 74 72 79 20 6f  .  ** an entry o
2aff0 66 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  f the FROM claus
2b000 65 20 69 73 20 61 20 73 75 62 71 75 65 72 79 20  e is a subquery 
2b010 69 6e 73 74 65 61 64 20 6f 66 20 61 20 74 61 62  instead of a tab
2b020 6c 65 20 6f 72 20 76 69 65 77 2c 0a 20 20 2a 2a  le or view,.  **
2b030 20 74 68 65 6e 20 63 72 65 61 74 65 20 61 20 74   then create a t
2b040 72 61 6e 73 69 65 6e 74 20 74 61 62 6c 65 20 73  ransient table s
2b050 74 72 75 63 74 75 72 65 20 74 6f 20 64 65 73 63  tructure to desc
2b060 72 69 62 65 20 74 68 65 20 73 75 62 71 75 65 72  ribe the subquer
2b070 79 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d  y..  */.  for(i=
2b080 30 2c 20 70 46 72 6f 6d 3d 70 54 61 62 4c 69 73  0, pFrom=pTabLis
2b090 74 2d 3e 61 3b 20 69 3c 70 54 61 62 4c 69 73 74  t->a; i<pTabList
2b0a0 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 46 72  ->nSrc; i++, pFr
2b0b0 6f 6d 2b 2b 29 7b 0a 20 20 20 20 54 61 62 6c 65  om++){.    Table
2b0c0 20 2a 70 54 61 62 3b 0a 20 20 20 20 61 73 73 65   *pTab;.    asse
2b0d0 72 74 28 20 70 46 72 6f 6d 2d 3e 66 67 2e 69 73  rt( pFrom->fg.is
2b0e0 52 65 63 75 72 73 69 76 65 3d 3d 30 20 7c 7c 20  Recursive==0 || 
2b0f0 70 46 72 6f 6d 2d 3e 70 54 61 62 21 3d 30 20 29  pFrom->pTab!=0 )
2b100 3b 0a 20 20 20 20 69 66 28 20 70 46 72 6f 6d 2d  ;.    if( pFrom-
2b110 3e 66 67 2e 69 73 52 65 63 75 72 73 69 76 65 20  >fg.isRecursive 
2b120 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
2b130 61 73 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e 70  assert( pFrom->p
2b140 54 61 62 3d 3d 30 20 29 3b 0a 23 69 66 6e 64 65  Tab==0 );.#ifnde
2b150 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 54  f SQLITE_OMIT_CT
2b160 45 0a 20 20 20 20 69 66 28 20 77 69 74 68 45 78  E.    if( withEx
2b170 70 61 6e 64 28 70 57 61 6c 6b 65 72 2c 20 70 46  pand(pWalker, pF
2b180 72 6f 6d 29 20 29 20 72 65 74 75 72 6e 20 57 52  rom) ) return WR
2b190 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 69 66 28  C_Abort;.    if(
2b1a0 20 70 46 72 6f 6d 2d 3e 70 54 61 62 20 29 20 7b   pFrom->pTab ) {
2b1b0 7d 20 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20  } else.#endif.  
2b1c0 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e 7a 4e 61    if( pFrom->zNa
2b1d0 6d 65 3d 3d 30 20 29 7b 0a 23 69 66 6e 64 65 66  me==0 ){.#ifndef
2b1e0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42   SQLITE_OMIT_SUB
2b1f0 51 55 45 52 59 0a 20 20 20 20 20 20 53 65 6c 65  QUERY.      Sele
2b200 63 74 20 2a 70 53 65 6c 20 3d 20 70 46 72 6f 6d  ct *pSel = pFrom
2b210 2d 3e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 20  ->pSelect;.     
2b220 20 2f 2a 20 41 20 73 75 62 2d 71 75 65 72 79 20   /* A sub-query 
2b230 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  in the FROM clau
2b240 73 65 20 6f 66 20 61 20 53 45 4c 45 43 54 20 2a  se of a SELECT *
2b250 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  /.      assert( 
2b260 70 53 65 6c 21 3d 30 20 29 3b 0a 20 20 20 20 20  pSel!=0 );.     
2b270 20 61 73 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e   assert( pFrom->
2b280 70 54 61 62 3d 3d 30 20 29 3b 0a 20 20 20 20 20  pTab==0 );.     
2b290 20 69 66 28 20 73 71 6c 69 74 65 33 57 61 6c 6b   if( sqlite3Walk
2b2a0 53 65 6c 65 63 74 28 70 57 61 6c 6b 65 72 2c 20  Select(pWalker, 
2b2b0 70 53 65 6c 29 20 29 20 72 65 74 75 72 6e 20 57  pSel) ) return W
2b2c0 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 20 20  RC_Abort;.      
2b2d0 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 61 6e  if( sqlite3Expan
2b2e0 64 53 75 62 71 75 65 72 79 28 70 50 61 72 73 65  dSubquery(pParse
2b2f0 2c 20 70 46 72 6f 6d 29 20 29 20 72 65 74 75 72  , pFrom) ) retur
2b300 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 23 65 6e  n WRC_Abort;.#en
2b310 64 69 66 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  dif.    }else{. 
2b320 20 20 20 20 20 2f 2a 20 41 6e 20 6f 72 64 69 6e       /* An ordin
2b330 61 72 79 20 74 61 62 6c 65 20 6f 72 20 76 69 65  ary table or vie
2b340 77 20 6e 61 6d 65 20 69 6e 20 74 68 65 20 46 52  w name in the FR
2b350 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20  OM clause */.   
2b360 20 20 20 61 73 73 65 72 74 28 20 70 46 72 6f 6d     assert( pFrom
2b370 2d 3e 70 54 61 62 3d 3d 30 20 29 3b 0a 20 20 20  ->pTab==0 );.   
2b380 20 20 20 70 46 72 6f 6d 2d 3e 70 54 61 62 20 3d     pFrom->pTab =
2b390 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33 4c   pTab = sqlite3L
2b3a0 6f 63 61 74 65 54 61 62 6c 65 49 74 65 6d 28 70  ocateTableItem(p
2b3b0 50 61 72 73 65 2c 20 30 2c 20 70 46 72 6f 6d 29  Parse, 0, pFrom)
2b3c0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54 61 62  ;.      if( pTab
2b3d0 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 57 52 43  ==0 ) return WRC
2b3e0 5f 41 62 6f 72 74 3b 0a 20 20 20 20 20 20 69 66  _Abort;.      if
2b3f0 28 20 70 54 61 62 2d 3e 6e 54 61 62 52 65 66 3e  ( pTab->nTabRef>
2b400 3d 30 78 66 66 66 66 20 29 7b 0a 20 20 20 20 20  =0xffff ){.     
2b410 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
2b420 73 67 28 70 50 61 72 73 65 2c 20 22 74 6f 6f 20  sg(pParse, "too 
2b430 6d 61 6e 79 20 72 65 66 65 72 65 6e 63 65 73 20  many references 
2b440 74 6f 20 5c 22 25 73 5c 22 3a 20 6d 61 78 20 36  to \"%s\": max 6
2b450 35 35 33 35 22 2c 0a 20 20 20 20 20 20 20 20 20  5535",.         
2b460 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a    pTab->zName);.
2b470 20 20 20 20 20 20 20 20 70 46 72 6f 6d 2d 3e 70          pFrom->p
2b480 54 61 62 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  Tab = 0;.       
2b490 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72   return WRC_Abor
2b4a0 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  t;.      }.     
2b4b0 20 70 54 61 62 2d 3e 6e 54 61 62 52 65 66 2b 2b   pTab->nTabRef++
2b4c0 3b 0a 20 20 20 20 20 20 69 66 28 20 21 49 73 56  ;.      if( !IsV
2b4d0 69 72 74 75 61 6c 28 70 54 61 62 29 20 26 26 20  irtual(pTab) && 
2b4e0 63 61 6e 6e 6f 74 42 65 46 75 6e 63 74 69 6f 6e  cannotBeFunction
2b4f0 28 70 50 61 72 73 65 2c 20 70 46 72 6f 6d 29 20  (pParse, pFrom) 
2b500 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
2b510 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20  n WRC_Abort;.   
2b520 20 20 20 7d 0a 23 69 66 20 21 64 65 66 69 6e 65     }.#if !define
2b530 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  d(SQLITE_OMIT_VI
2b540 45 57 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 20  EW) || !defined 
2b550 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52  (SQLITE_OMIT_VIR
2b560 54 55 41 4c 54 41 42 4c 45 29 0a 20 20 20 20 20  TUALTABLE).     
2b570 20 69 66 28 20 49 73 56 69 72 74 75 61 6c 28 70   if( IsVirtual(p
2b580 54 61 62 29 20 7c 7c 20 70 54 61 62 2d 3e 70 53  Tab) || pTab->pS
2b590 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20 20  elect ){.       
2b5a0 20 69 31 36 20 6e 43 6f 6c 3b 0a 20 20 20 20 20   i16 nCol;.     
2b5b0 20 20 20 75 38 20 65 43 6f 64 65 4f 72 69 67 20     u8 eCodeOrig 
2b5c0 3d 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65  = pWalker->eCode
2b5d0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71  ;.        if( sq
2b5e0 6c 69 74 65 33 56 69 65 77 47 65 74 43 6f 6c 75  lite3ViewGetColu
2b5f0 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73 65 2c 20  mnNames(pParse, 
2b600 70 54 61 62 29 20 29 20 72 65 74 75 72 6e 20 57  pTab) ) return W
2b610 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 20 20  RC_Abort;.      
2b620 20 20 61 73 73 65 72 74 28 20 70 46 72 6f 6d 2d    assert( pFrom-
2b630 3e 70 53 65 6c 65 63 74 3d 3d 30 20 29 3b 0a 20  >pSelect==0 );. 
2b640 20 20 20 20 20 20 20 70 46 72 6f 6d 2d 3e 70 53         pFrom->pS
2b650 65 6c 65 63 74 20 3d 20 73 71 6c 69 74 65 33 53  elect = sqlite3S
2b660 65 6c 65 63 74 44 75 70 28 64 62 2c 20 70 54 61  electDup(db, pTa
2b670 62 2d 3e 70 53 65 6c 65 63 74 2c 20 30 29 3b 0a  b->pSelect, 0);.
2b680 20 20 20 20 20 20 20 20 6e 43 6f 6c 20 3d 20 70          nCol = p
2b690 54 61 62 2d 3e 6e 43 6f 6c 3b 0a 20 20 20 20 20  Tab->nCol;.     
2b6a0 20 20 20 70 54 61 62 2d 3e 6e 43 6f 6c 20 3d 20     pTab->nCol = 
2b6b0 2d 31 3b 0a 20 20 20 20 20 20 20 20 70 57 61 6c  -1;.        pWal
2b6c0 6b 65 72 2d 3e 65 43 6f 64 65 20 3d 20 31 3b 20  ker->eCode = 1; 
2b6d0 20 2f 2a 20 54 75 72 6e 20 6f 6e 20 53 65 6c 65   /* Turn on Sele
2b6e0 63 74 2e 73 65 6c 49 64 20 72 65 6e 75 6d 62 65  ct.selId renumbe
2b6f0 72 69 6e 67 20 2a 2f 0a 20 20 20 20 20 20 20 20  ring */.        
2b700 73 71 6c 69 74 65 33 57 61 6c 6b 53 65 6c 65 63  sqlite3WalkSelec
2b710 74 28 70 57 61 6c 6b 65 72 2c 20 70 46 72 6f 6d  t(pWalker, pFrom
2b720 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20  ->pSelect);.    
2b730 20 20 20 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f      pWalker->eCo
2b740 64 65 20 3d 20 65 43 6f 64 65 4f 72 69 67 3b 0a  de = eCodeOrig;.
2b750 20 20 20 20 20 20 20 20 70 54 61 62 2d 3e 6e 43          pTab->nC
2b760 6f 6c 20 3d 20 6e 43 6f 6c 3b 0a 20 20 20 20 20  ol = nCol;.     
2b770 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a   }.#endif.    }.
2b780 0a 20 20 20 20 2f 2a 20 4c 6f 63 61 74 65 20 74  .    /* Locate t
2b790 68 65 20 69 6e 64 65 78 20 6e 61 6d 65 64 20 62  he index named b
2b7a0 79 20 74 68 65 20 49 4e 44 45 58 45 44 20 42 59  y the INDEXED BY
2b7b0 20 63 6c 61 75 73 65 2c 20 69 66 20 61 6e 79 2e   clause, if any.
2b7c0 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 71 6c 69   */.    if( sqli
2b7d0 74 65 33 49 6e 64 65 78 65 64 42 79 4c 6f 6f 6b  te3IndexedByLook
2b7e0 75 70 28 70 50 61 72 73 65 2c 20 70 46 72 6f 6d  up(pParse, pFrom
2b7f0 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  ) ){.      retur
2b800 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20  n WRC_Abort;.   
2b810 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 50 72 6f   }.  }..  /* Pro
2b820 63 65 73 73 20 4e 41 54 55 52 41 4c 20 6b 65 79  cess NATURAL key
2b830 77 6f 72 64 73 2c 20 61 6e 64 20 4f 4e 20 61 6e  words, and ON an
2b840 64 20 55 53 49 4e 47 20 63 6c 61 75 73 65 73 20  d USING clauses 
2b850 6f 66 20 6a 6f 69 6e 73 2e 0a 20 20 2a 2f 0a 20  of joins..  */. 
2b860 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   if( db->mallocF
2b870 61 69 6c 65 64 20 7c 7c 20 73 71 6c 69 74 65 50  ailed || sqliteP
2b880 72 6f 63 65 73 73 4a 6f 69 6e 28 70 50 61 72 73  rocessJoin(pPars
2b890 65 2c 20 70 29 20 29 7b 0a 20 20 20 20 72 65 74  e, p) ){.    ret
2b8a0 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20  urn WRC_Abort;. 
2b8b0 20 7d 0a 0a 20 20 2f 2a 20 46 6f 72 20 65 76 65   }..  /* For eve
2b8c0 72 79 20 22 2a 22 20 74 68 61 74 20 6f 63 63 75  ry "*" that occu
2b8d0 72 73 20 69 6e 20 74 68 65 20 63 6f 6c 75 6d 6e  rs in the column
2b8e0 20 6c 69 73 74 2c 20 69 6e 73 65 72 74 20 74 68   list, insert th
2b8f0 65 20 6e 61 6d 65 73 20 6f 66 0a 20 20 2a 2a 20  e names of.  ** 
2b900 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 61  all columns in a
2b910 6c 6c 20 74 61 62 6c 65 73 2e 20 20 41 6e 64 20  ll tables.  And 
2b920 66 6f 72 20 65 76 65 72 79 20 54 41 42 4c 45 2e  for every TABLE.
2b930 2a 20 69 6e 73 65 72 74 20 74 68 65 20 6e 61 6d  * insert the nam
2b940 65 73 0a 20 20 2a 2a 20 6f 66 20 61 6c 6c 20 63  es.  ** of all c
2b950 6f 6c 75 6d 6e 73 20 69 6e 20 54 41 42 4c 45 2e  olumns in TABLE.
2b960 20 20 54 68 65 20 70 61 72 73 65 72 20 69 6e 73    The parser ins
2b970 65 72 74 65 64 20 61 20 73 70 65 63 69 61 6c 20  erted a special 
2b980 65 78 70 72 65 73 73 69 6f 6e 0a 20 20 2a 2a 20  expression.  ** 
2b990 77 69 74 68 20 74 68 65 20 54 4b 5f 41 53 54 45  with the TK_ASTE
2b9a0 52 49 53 4b 20 6f 70 65 72 61 74 6f 72 20 66 6f  RISK operator fo
2b9b0 72 20 65 61 63 68 20 22 2a 22 20 74 68 61 74 20  r each "*" that 
2b9c0 69 74 20 66 6f 75 6e 64 20 69 6e 20 74 68 65 20  it found in the 
2b9d0 63 6f 6c 75 6d 6e 0a 20 20 2a 2a 20 6c 69 73 74  column.  ** list
2b9e0 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  .  The following
2b9f0 20 63 6f 64 65 20 6a 75 73 74 20 68 61 73 20 74   code just has t
2ba00 6f 20 6c 6f 63 61 74 65 20 74 68 65 20 54 4b 5f  o locate the TK_
2ba10 41 53 54 45 52 49 53 4b 0a 20 20 2a 2a 20 65 78  ASTERISK.  ** ex
2ba20 70 72 65 73 73 69 6f 6e 73 20 61 6e 64 20 65 78  pressions and ex
2ba30 70 61 6e 64 20 65 61 63 68 20 6f 6e 65 20 74 6f  pand each one to
2ba40 20 74 68 65 20 6c 69 73 74 20 6f 66 20 61 6c 6c   the list of all
2ba50 20 63 6f 6c 75 6d 6e 73 20 69 6e 0a 20 20 2a 2a   columns in.  **
2ba60 20 61 6c 6c 20 74 61 62 6c 65 73 2e 0a 20 20 2a   all tables..  *
2ba70 2a 0a 20 20 2a 2a 20 54 68 65 20 66 69 72 73 74  *.  ** The first
2ba80 20 6c 6f 6f 70 20 6a 75 73 74 20 63 68 65 63 6b   loop just check
2ba90 73 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 72  s to see if ther
2baa0 65 20 61 72 65 20 61 6e 79 20 22 2a 22 20 6f 70  e are any "*" op
2bab0 65 72 61 74 6f 72 73 0a 20 20 2a 2a 20 74 68 61  erators.  ** tha
2bac0 74 20 6e 65 65 64 20 65 78 70 61 6e 64 69 6e 67  t need expanding
2bad0 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 6b 3d 30  ..  */.  for(k=0
2bae0 3b 20 6b 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70  ; k<pEList->nExp
2baf0 72 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 70 45 20  r; k++){.    pE 
2bb00 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 6b 5d 2e 70  = pEList->a[k].p
2bb10 45 78 70 72 3b 0a 20 20 20 20 69 66 28 20 70 45  Expr;.    if( pE
2bb20 2d 3e 6f 70 3d 3d 54 4b 5f 41 53 54 45 52 49 53  ->op==TK_ASTERIS
2bb30 4b 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 61  K ) break;.    a
2bb40 73 73 65 72 74 28 20 70 45 2d 3e 6f 70 21 3d 54  ssert( pE->op!=T
2bb50 4b 5f 44 4f 54 20 7c 7c 20 70 45 2d 3e 70 52 69  K_DOT || pE->pRi
2bb60 67 68 74 21 3d 30 20 29 3b 0a 20 20 20 20 61 73  ght!=0 );.    as
2bb70 73 65 72 74 28 20 70 45 2d 3e 6f 70 21 3d 54 4b  sert( pE->op!=TK
2bb80 5f 44 4f 54 20 7c 7c 20 28 70 45 2d 3e 70 4c 65  _DOT || (pE->pLe
2bb90 66 74 21 3d 30 20 26 26 20 70 45 2d 3e 70 4c 65  ft!=0 && pE->pLe
2bba0 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 49 44 29 20 29  ft->op==TK_ID) )
2bbb0 3b 0a 20 20 20 20 69 66 28 20 70 45 2d 3e 6f 70  ;.    if( pE->op
2bbc0 3d 3d 54 4b 5f 44 4f 54 20 26 26 20 70 45 2d 3e  ==TK_DOT && pE->
2bbd0 70 52 69 67 68 74 2d 3e 6f 70 3d 3d 54 4b 5f 41  pRight->op==TK_A
2bbe0 53 54 45 52 49 53 4b 20 29 20 62 72 65 61 6b 3b  STERISK ) break;
2bbf0 0a 20 20 20 20 65 6c 69 73 74 46 6c 61 67 73 20  .    elistFlags 
2bc00 7c 3d 20 70 45 2d 3e 66 6c 61 67 73 3b 0a 20 20  |= pE->flags;.  
2bc10 7d 0a 20 20 69 66 28 20 6b 3c 70 45 4c 69 73 74  }.  if( k<pEList
2bc20 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 2f  ->nExpr ){.    /
2bc30 2a 0a 20 20 20 20 2a 2a 20 49 66 20 77 65 20 67  *.    ** If we g
2bc40 65 74 20 68 65 72 65 20 69 74 20 6d 65 61 6e 73  et here it means
2bc50 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20   the result set 
2bc60 63 6f 6e 74 61 69 6e 73 20 6f 6e 65 20 6f 72 20  contains one or 
2bc70 6d 6f 72 65 20 22 2a 22 0a 20 20 20 20 2a 2a 20  more "*".    ** 
2bc80 6f 70 65 72 61 74 6f 72 73 20 74 68 61 74 20 6e  operators that n
2bc90 65 65 64 20 74 6f 20 62 65 20 65 78 70 61 6e 64  eed to be expand
2bca0 65 64 2e 20 20 4c 6f 6f 70 20 74 68 72 6f 75 67  ed.  Loop throug
2bcb0 68 20 65 61 63 68 20 65 78 70 72 65 73 73 69 6f  h each expressio
2bcc0 6e 0a 20 20 20 20 2a 2a 20 69 6e 20 74 68 65 20  n.    ** in the 
2bcd0 72 65 73 75 6c 74 20 73 65 74 20 61 6e 64 20 65  result set and e
2bce0 78 70 61 6e 64 20 74 68 65 6d 20 6f 6e 65 20 62  xpand them one b
2bcf0 79 20 6f 6e 65 2e 0a 20 20 20 20 2a 2f 0a 20 20  y one..    */.  
2bd00 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
2bd10 74 5f 69 74 65 6d 20 2a 61 20 3d 20 70 45 4c 69  t_item *a = pELi
2bd20 73 74 2d 3e 61 3b 0a 20 20 20 20 45 78 70 72 4c  st->a;.    ExprL
2bd30 69 73 74 20 2a 70 4e 65 77 20 3d 20 30 3b 0a 20  ist *pNew = 0;. 
2bd40 20 20 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 70     int flags = p
2bd50 50 61 72 73 65 2d 3e 64 62 2d 3e 66 6c 61 67 73  Parse->db->flags
2bd60 3b 0a 20 20 20 20 69 6e 74 20 6c 6f 6e 67 4e 61  ;.    int longNa
2bd70 6d 65 73 20 3d 20 28 66 6c 61 67 73 20 26 20 53  mes = (flags & S
2bd80 51 4c 49 54 45 5f 46 75 6c 6c 43 6f 6c 4e 61 6d  QLITE_FullColNam
2bd90 65 73 29 21 3d 30 0a 20 20 20 20 20 20 20 20 20  es)!=0.         
2bda0 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20               && 
2bdb0 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  (flags & SQLITE_
2bdc0 53 68 6f 72 74 43 6f 6c 4e 61 6d 65 73 29 3d 3d  ShortColNames)==
2bdd0 30 3b 0a 0a 20 20 20 20 66 6f 72 28 6b 3d 30 3b  0;..    for(k=0;
2bde0 20 6b 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72   k<pEList->nExpr
2bdf0 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 20 20 70 45  ; k++){.      pE
2be00 20 3d 20 61 5b 6b 5d 2e 70 45 78 70 72 3b 0a 20   = a[k].pExpr;. 
2be10 20 20 20 20 20 65 6c 69 73 74 46 6c 61 67 73 20       elistFlags 
2be20 7c 3d 20 70 45 2d 3e 66 6c 61 67 73 3b 0a 20 20  |= pE->flags;.  
2be30 20 20 20 20 70 52 69 67 68 74 20 3d 20 70 45 2d      pRight = pE-
2be40 3e 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20 61  >pRight;.      a
2be50 73 73 65 72 74 28 20 70 45 2d 3e 6f 70 21 3d 54  ssert( pE->op!=T
2be60 4b 5f 44 4f 54 20 7c 7c 20 70 52 69 67 68 74 21  K_DOT || pRight!
2be70 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  =0 );.      if( 
2be80 70 45 2d 3e 6f 70 21 3d 54 4b 5f 41 53 54 45 52  pE->op!=TK_ASTER
2be90 49 53 4b 0a 20 20 20 20 20 20 20 26 26 20 28 70  ISK.       && (p
2bea0 45 2d 3e 6f 70 21 3d 54 4b 5f 44 4f 54 20 7c 7c  E->op!=TK_DOT ||
2beb0 20 70 52 69 67 68 74 2d 3e 6f 70 21 3d 54 4b 5f   pRight->op!=TK_
2bec0 41 53 54 45 52 49 53 4b 29 0a 20 20 20 20 20 20  ASTERISK).      
2bed0 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ){.        /* Th
2bee0 69 73 20 70 61 72 74 69 63 75 6c 61 72 20 65 78  is particular ex
2bef0 70 72 65 73 73 69 6f 6e 20 64 6f 65 73 20 6e 6f  pression does no
2bf00 74 20 6e 65 65 64 20 74 6f 20 62 65 20 65 78 70  t need to be exp
2bf10 61 6e 64 65 64 2e 0a 20 20 20 20 20 20 20 20 2a  anded..        *
2bf20 2f 0a 20 20 20 20 20 20 20 20 70 4e 65 77 20 3d  /.        pNew =
2bf30 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
2bf40 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20 70  Append(pParse, p
2bf50 4e 65 77 2c 20 61 5b 6b 5d 2e 70 45 78 70 72 29  New, a[k].pExpr)
2bf60 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4e  ;.        if( pN
2bf70 65 77 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ew ){.          
2bf80 70 4e 65 77 2d 3e 61 5b 70 4e 65 77 2d 3e 6e 45  pNew->a[pNew->nE
2bf90 78 70 72 2d 31 5d 2e 7a 4e 61 6d 65 20 3d 20 61  xpr-1].zName = a
2bfa0 5b 6b 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20  [k].zName;.     
2bfb0 20 20 20 20 20 70 4e 65 77 2d 3e 61 5b 70 4e 65       pNew->a[pNe
2bfc0 77 2d 3e 6e 45 78 70 72 2d 31 5d 2e 7a 53 70 61  w->nExpr-1].zSpa
2bfd0 6e 20 3d 20 61 5b 6b 5d 2e 7a 53 70 61 6e 3b 0a  n = a[k].zSpan;.
2bfe0 20 20 20 20 20 20 20 20 20 20 61 5b 6b 5d 2e 7a            a[k].z
2bff0 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  Name = 0;.      
2c000 20 20 20 20 61 5b 6b 5d 2e 7a 53 70 61 6e 20 3d      a[k].zSpan =
2c010 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   0;.        }.  
2c020 20 20 20 20 20 20 61 5b 6b 5d 2e 70 45 78 70 72        a[k].pExpr
2c030 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73   = 0;.      }els
2c040 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68  e{.        /* Th
2c050 69 73 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  is expression is
2c060 20 61 20 22 2a 22 20 6f 72 20 61 20 22 54 41 42   a "*" or a "TAB
2c070 4c 45 2e 2a 22 20 61 6e 64 20 6e 65 65 64 73 20  LE.*" and needs 
2c080 74 6f 20 62 65 0a 20 20 20 20 20 20 20 20 2a 2a  to be.        **
2c090 20 65 78 70 61 6e 64 65 64 2e 20 2a 2f 0a 20 20   expanded. */.  
2c0a0 20 20 20 20 20 20 69 6e 74 20 74 61 62 6c 65 53        int tableS
2c0b0 65 65 6e 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a  een = 0;      /*
2c0c0 20 53 65 74 20 74 6f 20 31 20 77 68 65 6e 20 54   Set to 1 when T
2c0d0 41 42 4c 45 20 6d 61 74 63 68 65 73 20 2a 2f 0a  ABLE matches */.
2c0e0 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 54          char *zT
2c0f0 4e 61 6d 65 20 3d 20 30 3b 20 20 20 20 20 20 20  Name = 0;       
2c100 2f 2a 20 74 65 78 74 20 6f 66 20 6e 61 6d 65 20  /* text of name 
2c110 6f 66 20 54 41 42 4c 45 20 2a 2f 0a 20 20 20 20  of TABLE */.    
2c120 20 20 20 20 69 66 28 20 70 45 2d 3e 6f 70 3d 3d      if( pE->op==
2c130 54 4b 5f 44 4f 54 20 29 7b 0a 20 20 20 20 20 20  TK_DOT ){.      
2c140 20 20 20 20 61 73 73 65 72 74 28 20 70 45 2d 3e      assert( pE->
2c150 70 4c 65 66 74 21 3d 30 20 29 3b 0a 20 20 20 20  pLeft!=0 );.    
2c160 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45        assert( !E
2c170 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
2c180 45 2d 3e 70 4c 65 66 74 2c 20 45 50 5f 49 6e 74  E->pLeft, EP_Int
2c190 56 61 6c 75 65 29 20 29 3b 0a 20 20 20 20 20 20  Value) );.      
2c1a0 20 20 20 20 7a 54 4e 61 6d 65 20 3d 20 70 45 2d      zTName = pE-
2c1b0 3e 70 4c 65 66 74 2d 3e 75 2e 7a 54 6f 6b 65 6e  >pLeft->u.zToken
2c1c0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
2c1d0 20 20 20 20 66 6f 72 28 69 3d 30 2c 20 70 46 72      for(i=0, pFr
2c1e0 6f 6d 3d 70 54 61 62 4c 69 73 74 2d 3e 61 3b 20  om=pTabList->a; 
2c1f0 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63  i<pTabList->nSrc
2c200 3b 20 69 2b 2b 2c 20 70 46 72 6f 6d 2b 2b 29 7b  ; i++, pFrom++){
2c210 0a 20 20 20 20 20 20 20 20 20 20 54 61 62 6c 65  .          Table
2c220 20 2a 70 54 61 62 20 3d 20 70 46 72 6f 6d 2d 3e   *pTab = pFrom->
2c230 70 54 61 62 3b 0a 20 20 20 20 20 20 20 20 20 20  pTab;.          
2c240 53 65 6c 65 63 74 20 2a 70 53 75 62 20 3d 20 70  Select *pSub = p
2c250 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a 20  From->pSelect;. 
2c260 20 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a           char *z
2c270 54 61 62 4e 61 6d 65 20 3d 20 70 46 72 6f 6d 2d  TabName = pFrom-
2c280 3e 7a 41 6c 69 61 73 3b 0a 20 20 20 20 20 20 20  >zAlias;.       
2c290 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
2c2a0 53 63 68 65 6d 61 4e 61 6d 65 20 3d 20 30 3b 0a  SchemaName = 0;.
2c2b0 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 69 44            int iD
2c2c0 62 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  b;.          if(
2c2d0 20 7a 54 61 62 4e 61 6d 65 3d 3d 30 20 29 7b 0a   zTabName==0 ){.
2c2e0 20 20 20 20 20 20 20 20 20 20 20 20 7a 54 61 62              zTab
2c2f0 4e 61 6d 65 20 3d 20 70 54 61 62 2d 3e 7a 4e 61  Name = pTab->zNa
2c300 6d 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  me;.          }.
2c310 20 20 20 20 20 20 20 20 20 20 69 66 28 20 64 62            if( db
2c320 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
2c330 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
2c340 20 20 69 66 28 20 70 53 75 62 3d 3d 30 20 7c 7c    if( pSub==0 ||
2c350 20 28 70 53 75 62 2d 3e 73 65 6c 46 6c 61 67 73   (pSub->selFlags
2c360 20 26 20 53 46 5f 4e 65 73 74 65 64 46 72 6f 6d   & SF_NestedFrom
2c370 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
2c380 20 20 20 20 70 53 75 62 20 3d 20 30 3b 0a 20 20      pSub = 0;.  
2c390 20 20 20 20 20 20 20 20 20 20 69 66 28 20 7a 54            if( zT
2c3a0 4e 61 6d 65 20 26 26 20 73 71 6c 69 74 65 33 53  Name && sqlite3S
2c3b0 74 72 49 43 6d 70 28 7a 54 4e 61 6d 65 2c 20 7a  trICmp(zTName, z
2c3c0 54 61 62 4e 61 6d 65 29 21 3d 30 20 29 7b 0a 20  TabName)!=0 ){. 
2c3d0 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e               con
2c3e0 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20  tinue;.         
2c3f0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
2c400 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63   iDb = sqlite3Sc
2c410 68 65 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c 20  hemaToIndex(db, 
2c420 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a  pTab->pSchema);.
2c430 20 20 20 20 20 20 20 20 20 20 20 20 7a 53 63 68              zSch
2c440 65 6d 61 4e 61 6d 65 20 3d 20 69 44 62 3e 3d 30  emaName = iDb>=0
2c450 20 3f 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e   ? db->aDb[iDb].
2c460 7a 44 62 53 4e 61 6d 65 20 3a 20 22 2a 22 3b 0a  zDbSName : "*";.
2c470 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2c480 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a        for(j=0; j
2c490 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b  <pTab->nCol; j++
2c4a0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 63  ){.            c
2c4b0 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 70 54 61  har *zName = pTa
2c4c0 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65  b->aCol[j].zName
2c4d0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 68  ;.            ch
2c4e0 61 72 20 2a 7a 43 6f 6c 6e 61 6d 65 3b 20 20 2f  ar *zColname;  /
2c4f0 2a 20 54 68 65 20 63 6f 6d 70 75 74 65 64 20 63  * The computed c
2c500 6f 6c 75 6d 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20  olumn name */.  
2c510 20 20 20 20 20 20 20 20 20 20 63 68 61 72 20 2a            char *
2c520 7a 54 6f 46 72 65 65 3b 20 20 20 2f 2a 20 4d 61  zToFree;   /* Ma
2c530 6c 6c 6f 63 65 64 20 73 74 72 69 6e 67 20 74 68  lloced string th
2c540 61 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20 66  at needs to be f
2c550 72 65 65 64 20 2a 2f 0a 20 20 20 20 20 20 20 20  reed */.        
2c560 20 20 20 20 54 6f 6b 65 6e 20 73 43 6f 6c 6e 61      Token sColna
2c570 6d 65 3b 20 20 2f 2a 20 43 6f 6d 70 75 74 65 64  me;  /* Computed
2c580 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 61 73 20   column name as 
2c590 61 20 74 6f 6b 65 6e 20 2a 2f 0a 0a 20 20 20 20  a token */..    
2c5a0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
2c5b0 7a 4e 61 6d 65 20 29 3b 0a 20 20 20 20 20 20 20  zName );.       
2c5c0 20 20 20 20 20 69 66 28 20 7a 54 4e 61 6d 65 20       if( zTName 
2c5d0 26 26 20 70 53 75 62 0a 20 20 20 20 20 20 20 20  && pSub.        
2c5e0 20 20 20 20 20 26 26 20 73 71 6c 69 74 65 33 4d       && sqlite3M
2c5f0 61 74 63 68 53 70 61 6e 4e 61 6d 65 28 70 53 75  atchSpanName(pSu
2c600 62 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 6a 5d 2e  b->pEList->a[j].
2c610 7a 53 70 61 6e 2c 20 30 2c 20 7a 54 4e 61 6d 65  zSpan, 0, zTName
2c620 2c 20 30 29 3d 3d 30 0a 20 20 20 20 20 20 20 20  , 0)==0.        
2c630 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20      ){.         
2c640 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
2c650 20 20 20 20 20 20 20 20 20 20 20 7d 0a 0a 20 20             }..  
2c660 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20            /* If 
2c670 61 20 63 6f 6c 75 6d 6e 20 69 73 20 6d 61 72 6b  a column is mark
2c680 65 64 20 61 73 20 27 68 69 64 64 65 6e 27 2c 20  ed as 'hidden', 
2c690 6f 6d 69 74 20 69 74 20 66 72 6f 6d 20 74 68 65  omit it from the
2c6a0 20 65 78 70 61 6e 64 65 64 0a 20 20 20 20 20 20   expanded.      
2c6b0 20 20 20 20 20 20 2a 2a 20 72 65 73 75 6c 74 2d        ** result-
2c6c0 73 65 74 20 6c 69 73 74 20 75 6e 6c 65 73 73 20  set list unless 
2c6d0 74 68 65 20 53 45 4c 45 43 54 20 68 61 73 20 74  the SELECT has t
2c6e0 68 65 20 53 46 5f 49 6e 63 6c 75 64 65 48 69 64  he SF_IncludeHid
2c6f0 64 65 6e 0a 20 20 20 20 20 20 20 20 20 20 20 20  den.            
2c700 2a 2a 20 62 69 74 20 73 65 74 2e 0a 20 20 20 20  ** bit set..    
2c710 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
2c720 20 20 20 20 20 20 20 69 66 28 20 28 70 2d 3e 73         if( (p->s
2c730 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 49 6e 63  elFlags & SF_Inc
2c740 6c 75 64 65 48 69 64 64 65 6e 29 3d 3d 30 0a 20  ludeHidden)==0. 
2c750 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20 49              && I
2c760 73 48 69 64 64 65 6e 43 6f 6c 75 6d 6e 28 26 70  sHiddenColumn(&p
2c770 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 29 20 0a 20  Tab->aCol[j]) . 
2c780 20 20 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20             ){.  
2c790 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74              cont
2c7a0 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20  inue;.          
2c7b0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
2c7c0 74 61 62 6c 65 53 65 65 6e 20 3d 20 31 3b 0a 0a  tableSeen = 1;..
2c7d0 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
2c7e0 69 3e 30 20 26 26 20 7a 54 4e 61 6d 65 3d 3d 30  i>0 && zTName==0
2c7f0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
2c800 20 20 69 66 28 20 28 70 46 72 6f 6d 2d 3e 66 67    if( (pFrom->fg
2c810 2e 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 4e  .jointype & JT_N
2c820 41 54 55 52 41 4c 29 21 3d 30 0a 20 20 20 20 20  ATURAL)!=0.     
2c830 20 20 20 20 20 20 20 20 20 20 20 26 26 20 74 61             && ta
2c840 62 6c 65 41 6e 64 43 6f 6c 75 6d 6e 49 6e 64 65  bleAndColumnInde
2c850 78 28 70 54 61 62 4c 69 73 74 2c 20 69 2c 20 7a  x(pTabList, i, z
2c860 4e 61 6d 65 2c 20 30 2c 20 30 29 0a 20 20 20 20  Name, 0, 0).    
2c870 20 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20            ){.   
2c880 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2c890 49 6e 20 61 20 4e 41 54 55 52 41 4c 20 6a 6f 69  In a NATURAL joi
2c8a0 6e 2c 20 6f 6d 69 74 20 74 68 65 20 6a 6f 69 6e  n, omit the join
2c8b0 20 63 6f 6c 75 6d 6e 73 20 66 72 6f 6d 20 74 68   columns from th
2c8c0 65 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e .             
2c8d0 20 20 20 2a 2a 20 74 61 62 6c 65 20 74 6f 20 74     ** table to t
2c8e0 68 65 20 72 69 67 68 74 20 6f 66 20 74 68 65 20  he right of the 
2c8f0 6a 6f 69 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20  join */.        
2c900 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65          continue
2c910 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
2c920 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  }.              
2c930 69 66 28 20 73 71 6c 69 74 65 33 49 64 4c 69 73  if( sqlite3IdLis
2c940 74 49 6e 64 65 78 28 70 46 72 6f 6d 2d 3e 70 55  tIndex(pFrom->pU
2c950 73 69 6e 67 2c 20 7a 4e 61 6d 65 29 3e 3d 30 20  sing, zName)>=0 
2c960 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
2c970 20 20 20 2f 2a 20 49 6e 20 61 20 6a 6f 69 6e 20     /* In a join 
2c980 77 69 74 68 20 61 20 55 53 49 4e 47 20 63 6c 61  with a USING cla
2c990 75 73 65 2c 20 6f 6d 69 74 20 63 6f 6c 75 6d 6e  use, omit column
2c9a0 73 20 69 6e 20 74 68 65 0a 20 20 20 20 20 20 20  s in the.       
2c9b0 20 20 20 20 20 20 20 20 20 2a 2a 20 75 73 69 6e           ** usin
2c9c0 67 20 63 6c 61 75 73 65 20 66 72 6f 6d 20 74 68  g clause from th
2c9d0 65 20 74 61 62 6c 65 20 6f 6e 20 74 68 65 20 72  e table on the r
2c9e0 69 67 68 74 2e 20 2a 2f 0a 20 20 20 20 20 20 20  ight. */.       
2c9f0 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75           continu
2ca00 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e;.             
2ca10 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d   }.            }
2ca20 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 52 69  .            pRi
2ca30 67 68 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ght = sqlite3Exp
2ca40 72 28 64 62 2c 20 54 4b 5f 49 44 2c 20 7a 4e 61  r(db, TK_ID, zNa
2ca50 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  me);.           
2ca60 20 7a 43 6f 6c 6e 61 6d 65 20 3d 20 7a 4e 61 6d   zColname = zNam
2ca70 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a  e;.            z
2ca80 54 6f 46 72 65 65 20 3d 20 30 3b 0a 20 20 20 20  ToFree = 0;.    
2ca90 20 20 20 20 20 20 20 20 69 66 28 20 6c 6f 6e 67          if( long
2caa0 4e 61 6d 65 73 20 7c 7c 20 70 54 61 62 4c 69 73  Names || pTabLis
2cab0 74 2d 3e 6e 53 72 63 3e 31 20 29 7b 0a 20 20 20  t->nSrc>1 ){.   
2cac0 20 20 20 20 20 20 20 20 20 20 20 45 78 70 72 20             Expr 
2cad0 2a 70 4c 65 66 74 3b 0a 20 20 20 20 20 20 20 20  *pLeft;.        
2cae0 20 20 20 20 20 20 70 4c 65 66 74 20 3d 20 73 71        pLeft = sq
2caf0 6c 69 74 65 33 45 78 70 72 28 64 62 2c 20 54 4b  lite3Expr(db, TK
2cb00 5f 49 44 2c 20 7a 54 61 62 4e 61 6d 65 29 3b 0a  _ID, zTabName);.
2cb10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45                pE
2cb20 78 70 72 20 3d 20 73 71 6c 69 74 65 33 50 45 78  xpr = sqlite3PEx
2cb30 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 44 4f  pr(pParse, TK_DO
2cb40 54 2c 20 70 4c 65 66 74 2c 20 70 52 69 67 68 74  T, pLeft, pRight
2cb50 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
2cb60 20 69 66 28 20 7a 53 63 68 65 6d 61 4e 61 6d 65   if( zSchemaName
2cb70 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
2cb80 20 20 20 20 70 4c 65 66 74 20 3d 20 73 71 6c 69      pLeft = sqli
2cb90 74 65 33 45 78 70 72 28 64 62 2c 20 54 4b 5f 49  te3Expr(db, TK_I
2cba0 44 2c 20 7a 53 63 68 65 6d 61 4e 61 6d 65 29 3b  D, zSchemaName);
2cbb0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2cbc0 20 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33   pExpr = sqlite3
2cbd0 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b  PExpr(pParse, TK
2cbe0 5f 44 4f 54 2c 20 70 4c 65 66 74 2c 20 70 45 78  _DOT, pLeft, pEx
2cbf0 70 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  pr);.           
2cc00 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
2cc10 20 20 20 69 66 28 20 6c 6f 6e 67 4e 61 6d 65 73     if( longNames
2cc20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
2cc30 20 20 20 20 7a 43 6f 6c 6e 61 6d 65 20 3d 20 73      zColname = s
2cc40 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62  qlite3MPrintf(db
2cc50 2c 20 22 25 73 2e 25 73 22 2c 20 7a 54 61 62 4e  , "%s.%s", zTabN
2cc60 61 6d 65 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20  ame, zName);.   
2cc70 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 54 6f               zTo
2cc80 46 72 65 65 20 3d 20 7a 43 6f 6c 6e 61 6d 65 3b  Free = zColname;
2cc90 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  .              }
2cca0 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c  .            }el
2ccb0 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
2ccc0 20 20 70 45 78 70 72 20 3d 20 70 52 69 67 68 74    pExpr = pRight
2ccd0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
2cce0 20 20 20 20 20 20 20 20 20 20 20 20 70 4e 65 77              pNew
2ccf0 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69   = sqlite3ExprLi
2cd00 73 74 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c  stAppend(pParse,
2cd10 20 70 4e 65 77 2c 20 70 45 78 70 72 29 3b 0a 20   pNew, pExpr);. 
2cd20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
2cd30 65 33 54 6f 6b 65 6e 49 6e 69 74 28 26 73 43 6f  e3TokenInit(&sCo
2cd40 6c 6e 61 6d 65 2c 20 7a 43 6f 6c 6e 61 6d 65 29  lname, zColname)
2cd50 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  ;.            sq
2cd60 6c 69 74 65 33 45 78 70 72 4c 69 73 74 53 65 74  lite3ExprListSet
2cd70 4e 61 6d 65 28 70 50 61 72 73 65 2c 20 70 4e 65  Name(pParse, pNe
2cd80 77 2c 20 26 73 43 6f 6c 6e 61 6d 65 2c 20 30 29  w, &sColname, 0)
2cd90 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
2cda0 28 20 70 4e 65 77 20 26 26 20 28 70 2d 3e 73 65  ( pNew && (p->se
2cdb0 6c 46 6c 61 67 73 20 26 20 53 46 5f 4e 65 73 74  lFlags & SF_Nest
2cdc0 65 64 46 72 6f 6d 29 21 3d 30 20 29 7b 0a 20 20  edFrom)!=0 ){.  
2cdd0 20 20 20 20 20 20 20 20 20 20 20 20 73 74 72 75              stru
2cde0 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d  ct ExprList_item
2cdf0 20 2a 70 58 20 3d 20 26 70 4e 65 77 2d 3e 61 5b   *pX = &pNew->a[
2ce00 70 4e 65 77 2d 3e 6e 45 78 70 72 2d 31 5d 3b 0a  pNew->nExpr-1];.
2ce10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
2ce20 28 20 70 53 75 62 20 29 7b 0a 20 20 20 20 20 20  ( pSub ){.      
2ce30 20 20 20 20 20 20 20 20 20 20 70 58 2d 3e 7a 53            pX->zS
2ce40 70 61 6e 20 3d 20 73 71 6c 69 74 65 33 44 62 53  pan = sqlite3DbS
2ce50 74 72 44 75 70 28 64 62 2c 20 70 53 75 62 2d 3e  trDup(db, pSub->
2ce60 70 45 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 7a 53 70  pEList->a[j].zSp
2ce70 61 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  an);.           
2ce80 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
2ce90 58 2d 3e 7a 53 70 61 6e 3d 3d 30 20 29 3b 0a 20  X->zSpan==0 );. 
2cea0 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c               }el
2ceb0 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
2cec0 20 20 20 20 70 58 2d 3e 7a 53 70 61 6e 20 3d 20      pX->zSpan = 
2ced0 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64  sqlite3MPrintf(d
2cee0 62 2c 20 22 25 73 2e 25 73 2e 25 73 22 2c 0a 20  b, "%s.%s.%s",. 
2cef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cf00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cf10 20 20 20 20 20 20 20 20 20 20 7a 53 63 68 65 6d            zSchem
2cf20 61 4e 61 6d 65 2c 20 7a 54 61 62 4e 61 6d 65 2c  aName, zTabName,
2cf30 20 7a 43 6f 6c 6e 61 6d 65 29 3b 0a 20 20 20 20   zColname);.    
2cf40 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74              test
2cf50 63 61 73 65 28 20 70 58 2d 3e 7a 53 70 61 6e 3d  case( pX->zSpan=
2cf60 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  =0 );.          
2cf70 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
2cf80 20 20 20 20 70 58 2d 3e 62 53 70 61 6e 49 73 54      pX->bSpanIsT
2cf90 61 62 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  ab = 1;.        
2cfa0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
2cfb0 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
2cfc0 64 62 2c 20 7a 54 6f 46 72 65 65 29 3b 0a 20 20  db, zToFree);.  
2cfd0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2cfe0 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
2cff0 21 74 61 62 6c 65 53 65 65 6e 20 29 7b 0a 20 20  !tableSeen ){.  
2d000 20 20 20 20 20 20 20 20 69 66 28 20 7a 54 4e 61          if( zTNa
2d010 6d 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  me ){.          
2d020 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
2d030 67 28 70 50 61 72 73 65 2c 20 22 6e 6f 20 73 75  g(pParse, "no su
2d040 63 68 20 74 61 62 6c 65 3a 20 25 73 22 2c 20 7a  ch table: %s", z
2d050 54 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  TName);.        
2d060 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
2d070 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
2d080 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6e 6f  rMsg(pParse, "no
2d090 20 74 61 62 6c 65 73 20 73 70 65 63 69 66 69 65   tables specifie
2d0a0 64 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  d");.          }
2d0b0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
2d0c0 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c   }.    }.    sql
2d0d0 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65  ite3ExprListDele
2d0e0 74 65 28 64 62 2c 20 70 45 4c 69 73 74 29 3b 0a  te(db, pEList);.
2d0f0 20 20 20 20 70 2d 3e 70 45 4c 69 73 74 20 3d 20      p->pEList = 
2d100 70 4e 65 77 3b 0a 20 20 7d 0a 20 20 69 66 28 20  pNew;.  }.  if( 
2d110 70 2d 3e 70 45 4c 69 73 74 20 29 7b 0a 20 20 20  p->pEList ){.   
2d120 20 69 66 28 20 70 2d 3e 70 45 4c 69 73 74 2d 3e   if( p->pEList->
2d130 6e 45 78 70 72 3e 64 62 2d 3e 61 4c 69 6d 69 74  nExpr>db->aLimit
2d140 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 43 4f  [SQLITE_LIMIT_CO
2d150 4c 55 4d 4e 5d 20 29 7b 0a 20 20 20 20 20 20 73  LUMN] ){.      s
2d160 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
2d170 50 61 72 73 65 2c 20 22 74 6f 6f 20 6d 61 6e 79  Parse, "too many
2d180 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 72 65 73 75   columns in resu
2d190 6c 74 20 73 65 74 22 29 3b 0a 20 20 20 20 20 20  lt set");.      
2d1a0 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74  return WRC_Abort
2d1b0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
2d1c0 28 65 6c 69 73 74 46 6c 61 67 73 20 26 20 28 45  (elistFlags & (E
2d1d0 50 5f 48 61 73 46 75 6e 63 7c 45 50 5f 53 75 62  P_HasFunc|EP_Sub
2d1e0 71 75 65 72 79 29 29 21 3d 30 20 29 7b 0a 20 20  query))!=0 ){.  
2d1f0 20 20 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20      p->selFlags 
2d200 7c 3d 20 53 46 5f 43 6f 6d 70 6c 65 78 52 65 73  |= SF_ComplexRes
2d210 75 6c 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  ult;.    }.  }. 
2d220 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74   return WRC_Cont
2d230 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4e  inue;.}../*.** N
2d240 6f 2d 6f 70 20 72 6f 75 74 69 6e 65 20 66 6f 72  o-op routine for
2d250 20 74 68 65 20 70 61 72 73 65 2d 74 72 65 65 20   the parse-tree 
2d260 77 61 6c 6b 65 72 2e 0a 2a 2a 0a 2a 2a 20 57 68  walker..**.** Wh
2d270 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  en this routine 
2d280 69 73 20 74 68 65 20 57 61 6c 6b 65 72 2e 78 45  is the Walker.xE
2d290 78 70 72 43 61 6c 6c 62 61 63 6b 20 74 68 65 6e  xprCallback then
2d2a0 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65   expression tree
2d2b0 73 0a 2a 2a 20 61 72 65 20 77 61 6c 6b 65 64 20  s.** are walked 
2d2c0 77 69 74 68 6f 75 74 20 61 6e 79 20 61 63 74 69  without any acti
2d2d0 6f 6e 73 20 62 65 69 6e 67 20 74 61 6b 65 6e 20  ons being taken 
2d2e0 61 74 20 65 61 63 68 20 6e 6f 64 65 2e 20 20 50  at each node.  P
2d2f0 72 65 73 75 6d 61 62 6c 79 2c 0a 2a 2a 20 77 68  resumably,.** wh
2d300 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  en this routine 
2d310 69 73 20 75 73 65 64 20 66 6f 72 20 57 61 6c 6b  is used for Walk
2d320 65 72 2e 78 45 78 70 72 43 61 6c 6c 62 61 63 6b  er.xExprCallback
2d330 20 74 68 65 6e 20 0a 2a 2a 20 57 61 6c 6b 65 72   then .** Walker
2d340 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b  .xSelectCallback
2d350 20 69 73 20 73 65 74 20 74 6f 20 64 6f 20 73 6f   is set to do so
2d360 6d 65 74 68 69 6e 67 20 75 73 65 66 75 6c 20 66  mething useful f
2d370 6f 72 20 65 76 65 72 79 20 0a 2a 2a 20 73 75 62  or every .** sub
2d380 71 75 65 72 79 20 69 6e 20 74 68 65 20 70 61 72  query in the par
2d390 73 65 72 20 74 72 65 65 2e 0a 2a 2f 0a 69 6e 74  ser tree..*/.int
2d3a0 20 73 71 6c 69 74 65 33 45 78 70 72 57 61 6c 6b   sqlite3ExprWalk
2d3b0 4e 6f 6f 70 28 57 61 6c 6b 65 72 20 2a 4e 6f 74  Noop(Walker *Not
2d3c0 55 73 65 64 2c 20 45 78 70 72 20 2a 4e 6f 74 55  Used, Expr *NotU
2d3d0 73 65 64 32 29 7b 0a 20 20 55 4e 55 53 45 44 5f  sed2){.  UNUSED_
2d3e0 50 41 52 41 4d 45 54 45 52 32 28 4e 6f 74 55 73  PARAMETER2(NotUs
2d3f0 65 64 2c 20 4e 6f 74 55 73 65 64 32 29 3b 0a 20  ed, NotUsed2);. 
2d400 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74   return WRC_Cont
2d410 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4e  inue;.}../*.** N
2d420 6f 2d 6f 70 20 72 6f 75 74 69 6e 65 20 66 6f 72  o-op routine for
2d430 20 74 68 65 20 70 61 72 73 65 2d 74 72 65 65 20   the parse-tree 
2d440 77 61 6c 6b 65 72 20 66 6f 72 20 53 45 4c 45 43  walker for SELEC
2d450 54 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 2a 2a  T statements..**
2d460 20 73 75 62 71 75 65 72 79 20 69 6e 20 74 68 65   subquery in the
2d470 20 70 61 72 73 65 72 20 74 72 65 65 2e 0a 2a 2f   parser tree..*/
2d480 0a 69 6e 74 20 73 71 6c 69 74 65 33 53 65 6c 65  .int sqlite3Sele
2d490 63 74 57 61 6c 6b 4e 6f 6f 70 28 57 61 6c 6b 65  ctWalkNoop(Walke
2d4a0 72 20 2a 4e 6f 74 55 73 65 64 2c 20 53 65 6c 65  r *NotUsed, Sele
2d4b0 63 74 20 2a 4e 6f 74 55 73 65 64 32 29 7b 0a 20  ct *NotUsed2){. 
2d4c0 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
2d4d0 52 32 28 4e 6f 74 55 73 65 64 2c 20 4e 6f 74 55  R2(NotUsed, NotU
2d4e0 73 65 64 32 29 3b 0a 20 20 72 65 74 75 72 6e 20  sed2);.  return 
2d4f0 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a  WRC_Continue;.}.
2d500 0a 23 69 66 20 53 51 4c 49 54 45 5f 44 45 42 55  .#if SQLITE_DEBU
2d510 47 0a 2f 2a 0a 2a 2a 20 41 6c 77 61 79 73 20 61  G./*.** Always a
2d520 73 73 65 72 74 2e 20 20 54 68 69 73 20 78 53 65  ssert.  This xSe
2d530 6c 65 63 74 43 61 6c 6c 62 61 63 6b 32 20 69 6d  lectCallback2 im
2d540 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 70 72 6f  plementation pro
2d550 76 65 73 20 74 68 61 74 20 74 68 65 0a 2a 2a 20  ves that the.** 
2d560 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 32  xSelectCallback2
2d570 20 69 73 20 6e 65 76 65 72 20 69 6e 76 6f 6b 65   is never invoke
2d580 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  d..*/.void sqlit
2d590 65 33 53 65 6c 65 63 74 57 61 6c 6b 41 73 73 65  e3SelectWalkAsse
2d5a0 72 74 32 28 57 61 6c 6b 65 72 20 2a 4e 6f 74 55  rt2(Walker *NotU
2d5b0 73 65 64 2c 20 53 65 6c 65 63 74 20 2a 4e 6f 74  sed, Select *Not
2d5c0 55 73 65 64 32 29 7b 0a 20 20 55 4e 55 53 45 44  Used2){.  UNUSED
2d5d0 5f 50 41 52 41 4d 45 54 45 52 32 28 4e 6f 74 55  _PARAMETER2(NotU
2d5e0 73 65 64 2c 20 4e 6f 74 55 73 65 64 32 29 3b 0a  sed, NotUsed2);.
2d5f0 20 20 61 73 73 65 72 74 28 20 30 20 29 3b 0a 7d    assert( 0 );.}
2d600 0a 23 65 6e 64 69 66 0a 2f 2a 0a 2a 2a 20 54 68  .#endif./*.** Th
2d610 69 73 20 72 6f 75 74 69 6e 65 20 22 65 78 70 61  is routine "expa
2d620 6e 64 73 22 20 61 20 53 45 4c 45 43 54 20 73 74  nds" a SELECT st
2d630 61 74 65 6d 65 6e 74 20 61 6e 64 20 61 6c 6c 20  atement and all 
2d640 6f 66 20 69 74 73 20 73 75 62 71 75 65 72 69 65  of its subquerie
2d650 73 2e 0a 2a 2a 20 46 6f 72 20 61 64 64 69 74 69  s..** For additi
2d660 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  onal information
2d670 20 6f 6e 20 77 68 61 74 20 69 74 20 6d 65 61 6e   on what it mean
2d680 73 20 74 6f 20 22 65 78 70 61 6e 64 22 20 61 20  s to "expand" a 
2d690 53 45 4c 45 43 54 0a 2a 2a 20 73 74 61 74 65 6d  SELECT.** statem
2d6a0 65 6e 74 2c 20 73 65 65 20 74 68 65 20 63 6f 6d  ent, see the com
2d6b0 6d 65 6e 74 20 6f 6e 20 74 68 65 20 73 65 6c 65  ment on the sele
2d6c0 63 74 45 78 70 61 6e 64 20 77 6f 72 6b 65 72 20  ctExpand worker 
2d6d0 63 61 6c 6c 62 61 63 6b 20 61 62 6f 76 65 2e 0a  callback above..
2d6e0 2a 2a 0a 2a 2a 20 45 78 70 61 6e 64 69 6e 67 20  **.** Expanding 
2d6f0 61 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  a SELECT stateme
2d700 6e 74 20 69 73 20 74 68 65 20 66 69 72 73 74 20  nt is the first 
2d710 73 74 65 70 20 69 6e 20 70 72 6f 63 65 73 73 69  step in processi
2d720 6e 67 20 61 0a 2a 2a 20 53 45 4c 45 43 54 20 73  ng a.** SELECT s
2d730 74 61 74 65 6d 65 6e 74 2e 20 20 54 68 65 20 53  tatement.  The S
2d740 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
2d750 6d 75 73 74 20 62 65 20 65 78 70 61 6e 64 65 64  must be expanded
2d760 20 62 65 66 6f 72 65 0a 2a 2a 20 6e 61 6d 65 20   before.** name 
2d770 72 65 73 6f 6c 75 74 69 6f 6e 20 69 73 20 70 65  resolution is pe
2d780 72 66 6f 72 6d 65 64 2e 0a 2a 2a 0a 2a 2a 20 49  rformed..**.** I
2d790 66 20 61 6e 79 74 68 69 6e 67 20 67 6f 65 73 20  f anything goes 
2d7a0 77 72 6f 6e 67 2c 20 61 6e 20 65 72 72 6f 72 20  wrong, an error 
2d7b0 6d 65 73 73 61 67 65 20 69 73 20 77 72 69 74 74  message is writt
2d7c0 65 6e 20 69 6e 74 6f 20 70 50 61 72 73 65 2e 0a  en into pParse..
2d7d0 2a 2a 20 54 68 65 20 63 61 6c 6c 69 6e 67 20 66  ** The calling f
2d7e0 75 6e 63 74 69 6f 6e 20 63 61 6e 20 64 65 74 65  unction can dete
2d7f0 63 74 20 74 68 65 20 70 72 6f 62 6c 65 6d 20 62  ct the problem b
2d800 79 20 6c 6f 6f 6b 69 6e 67 20 61 74 20 70 50 61  y looking at pPa
2d810 72 73 65 2d 3e 6e 45 72 72 0a 2a 2a 20 61 6e 64  rse->nErr.** and
2d820 2f 6f 72 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e  /or pParse->db->
2d830 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 2e 0a 2a 2f  mallocFailed..*/
2d840 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c  .static void sql
2d850 69 74 65 33 53 65 6c 65 63 74 45 78 70 61 6e 64  ite3SelectExpand
2d860 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
2d870 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 29  Select *pSelect)
2d880 7b 0a 20 20 57 61 6c 6b 65 72 20 77 3b 0a 20 20  {.  Walker w;.  
2d890 77 2e 78 45 78 70 72 43 61 6c 6c 62 61 63 6b 20  w.xExprCallback 
2d8a0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 57 61 6c  = sqlite3ExprWal
2d8b0 6b 4e 6f 6f 70 3b 0a 20 20 77 2e 70 50 61 72 73  kNoop;.  w.pPars
2d8c0 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20 69 66  e = pParse;.  if
2d8d0 28 20 4f 4b 5f 49 46 5f 41 4c 57 41 59 53 5f 54  ( OK_IF_ALWAYS_T
2d8e0 52 55 45 28 70 50 61 72 73 65 2d 3e 68 61 73 43  RUE(pParse->hasC
2d8f0 6f 6d 70 6f 75 6e 64 29 20 29 7b 0a 20 20 20 20  ompound) ){.    
2d900 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63  w.xSelectCallbac
2d910 6b 20 3d 20 63 6f 6e 76 65 72 74 43 6f 6d 70 6f  k = convertCompo
2d920 75 6e 64 53 65 6c 65 63 74 54 6f 53 75 62 71 75  undSelectToSubqu
2d930 65 72 79 3b 0a 20 20 20 20 77 2e 78 53 65 6c 65  ery;.    w.xSele
2d940 63 74 43 61 6c 6c 62 61 63 6b 32 20 3d 20 30 3b  ctCallback2 = 0;
2d950 0a 20 20 20 20 73 71 6c 69 74 65 33 57 61 6c 6b  .    sqlite3Walk
2d960 53 65 6c 65 63 74 28 26 77 2c 20 70 53 65 6c 65  Select(&w, pSele
2d970 63 74 29 3b 0a 20 20 7d 0a 20 20 77 2e 78 53 65  ct);.  }.  w.xSe
2d980 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20 3d 20 73  lectCallback = s
2d990 65 6c 65 63 74 45 78 70 61 6e 64 65 72 3b 0a 20  electExpander;. 
2d9a0 20 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61   w.xSelectCallba
2d9b0 63 6b 32 20 3d 20 73 65 6c 65 63 74 50 6f 70 57  ck2 = selectPopW
2d9c0 69 74 68 3b 0a 20 20 77 2e 65 43 6f 64 65 20 3d  ith;.  w.eCode =
2d9d0 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 57 61 6c   0;.  sqlite3Wal
2d9e0 6b 53 65 6c 65 63 74 28 26 77 2c 20 70 53 65 6c  kSelect(&w, pSel
2d9f0 65 63 74 29 3b 0a 7d 0a 0a 0a 23 69 66 6e 64 65  ect);.}...#ifnde
2da00 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  f SQLITE_OMIT_SU
2da10 42 51 55 45 52 59 0a 2f 2a 0a 2a 2a 20 54 68 69  BQUERY./*.** Thi
2da20 73 20 69 73 20 61 20 57 61 6c 6b 65 72 2e 78 53  s is a Walker.xS
2da30 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20 63 61  electCallback ca
2da40 6c 6c 62 61 63 6b 20 66 6f 72 20 74 68 65 20 73  llback for the s
2da50 71 6c 69 74 65 33 53 65 6c 65 63 74 54 79 70 65  qlite3SelectType
2da60 49 6e 66 6f 28 29 0a 2a 2a 20 69 6e 74 65 72 66  Info().** interf
2da70 61 63 65 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65  ace..**.** For e
2da80 61 63 68 20 46 52 4f 4d 2d 63 6c 61 75 73 65 20  ach FROM-clause 
2da90 73 75 62 71 75 65 72 79 2c 20 61 64 64 20 43 6f  subquery, add Co
2daa0 6c 75 6d 6e 2e 7a 54 79 70 65 20 61 6e 64 20 43  lumn.zType and C
2dab0 6f 6c 75 6d 6e 2e 7a 43 6f 6c 6c 0a 2a 2a 20 69  olumn.zColl.** i
2dac0 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 6f 20 74 68  nformation to th
2dad0 65 20 54 61 62 6c 65 20 73 74 72 75 63 74 75 72  e Table structur
2dae0 65 20 74 68 61 74 20 72 65 70 72 65 73 65 6e 74  e that represent
2daf0 73 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  s the result set
2db00 0a 2a 2a 20 6f 66 20 74 68 61 74 20 73 75 62 71  .** of that subq
2db10 75 65 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  uery..**.** The 
2db20 54 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 20  Table structure 
2db30 74 68 61 74 20 72 65 70 72 65 73 65 6e 74 73 20  that represents 
2db40 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 77  the result set w
2db50 61 73 20 63 6f 6e 73 74 72 75 63 74 65 64 0a 2a  as constructed.*
2db60 2a 20 62 79 20 73 65 6c 65 63 74 45 78 70 61 6e  * by selectExpan
2db70 64 65 72 28 29 20 62 75 74 20 74 68 65 20 74 79  der() but the ty
2db80 70 65 20 61 6e 64 20 63 6f 6c 6c 61 74 69 6f 6e  pe and collation
2db90 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 77 61 73   information was
2dba0 20 6f 6d 69 74 74 65 64 0a 2a 2a 20 61 74 20 74   omitted.** at t
2dbb0 68 61 74 20 70 6f 69 6e 74 20 62 65 63 61 75 73  hat point becaus
2dbc0 65 20 69 64 65 6e 74 69 66 69 65 72 73 20 68 61  e identifiers ha
2dbd0 64 20 6e 6f 74 20 79 65 74 20 62 65 65 6e 20 72  d not yet been r
2dbe0 65 73 6f 6c 76 65 64 2e 20 20 54 68 69 73 0a 2a  esolved.  This.*
2dbf0 2a 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  * routine is cal
2dc00 6c 65 64 20 61 66 74 65 72 20 69 64 65 6e 74 69  led after identi
2dc10 66 69 65 72 20 72 65 73 6f 6c 75 74 69 6f 6e 2e  fier resolution.
2dc20 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
2dc30 73 65 6c 65 63 74 41 64 64 53 75 62 71 75 65 72  selectAddSubquer
2dc40 79 54 79 70 65 49 6e 66 6f 28 57 61 6c 6b 65 72  yTypeInfo(Walker
2dc50 20 2a 70 57 61 6c 6b 65 72 2c 20 53 65 6c 65 63   *pWalker, Selec
2dc60 74 20 2a 70 29 7b 0a 20 20 50 61 72 73 65 20 2a  t *p){.  Parse *
2dc70 70 50 61 72 73 65 3b 0a 20 20 69 6e 74 20 69 3b  pParse;.  int i;
2dc80 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62  .  SrcList *pTab
2dc90 4c 69 73 74 3b 0a 20 20 73 74 72 75 63 74 20 53  List;.  struct S
2dca0 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 46 72  rcList_item *pFr
2dcb0 6f 6d 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  om;..  assert( p
2dcc0 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f  ->selFlags & SF_
2dcd0 52 65 73 6f 6c 76 65 64 20 29 3b 0a 20 20 69 66  Resolved );.  if
2dce0 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20  ( p->selFlags & 
2dcf0 53 46 5f 48 61 73 54 79 70 65 49 6e 66 6f 20 29  SF_HasTypeInfo )
2dd00 20 72 65 74 75 72 6e 3b 0a 20 20 70 2d 3e 73 65   return;.  p->se
2dd10 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f 48 61 73  lFlags |= SF_Has
2dd20 54 79 70 65 49 6e 66 6f 3b 0a 20 20 70 50 61 72  TypeInfo;.  pPar
2dd30 73 65 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 70 50  se = pWalker->pP
2dd40 61 72 73 65 3b 0a 20 20 70 54 61 62 4c 69 73 74  arse;.  pTabList
2dd50 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 66 6f   = p->pSrc;.  fo
2dd60 72 28 69 3d 30 2c 20 70 46 72 6f 6d 3d 70 54 61  r(i=0, pFrom=pTa
2dd70 62 4c 69 73 74 2d 3e 61 3b 20 69 3c 70 54 61 62  bList->a; i<pTab
2dd80 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c  List->nSrc; i++,
2dd90 20 70 46 72 6f 6d 2b 2b 29 7b 0a 20 20 20 20 54   pFrom++){.    T
2dda0 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 46 72  able *pTab = pFr
2ddb0 6f 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20 61 73  om->pTab;.    as
2ddc0 73 65 72 74 28 20 70 54 61 62 21 3d 30 20 29 3b  sert( pTab!=0 );
2ddd0 0a 20 20 20 20 69 66 28 20 28 70 54 61 62 2d 3e  .    if( (pTab->
2dde0 74 61 62 46 6c 61 67 73 20 26 20 54 46 5f 45 70  tabFlags & TF_Ep
2ddf0 68 65 6d 65 72 61 6c 29 21 3d 30 20 29 7b 0a 20  hemeral)!=0 ){. 
2de00 20 20 20 20 20 2f 2a 20 41 20 73 75 62 2d 71 75       /* A sub-qu
2de10 65 72 79 20 69 6e 20 74 68 65 20 46 52 4f 4d 20  ery in the FROM 
2de20 63 6c 61 75 73 65 20 6f 66 20 61 20 53 45 4c 45  clause of a SELE
2de30 43 54 20 2a 2f 0a 20 20 20 20 20 20 53 65 6c 65  CT */.      Sele
2de40 63 74 20 2a 70 53 65 6c 20 3d 20 70 46 72 6f 6d  ct *pSel = pFrom
2de50 2d 3e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 20  ->pSelect;.     
2de60 20 69 66 28 20 70 53 65 6c 20 29 7b 0a 20 20 20   if( pSel ){.   
2de70 20 20 20 20 20 77 68 69 6c 65 28 20 70 53 65 6c       while( pSel
2de80 2d 3e 70 50 72 69 6f 72 20 29 20 70 53 65 6c 20  ->pPrior ) pSel 
2de90 3d 20 70 53 65 6c 2d 3e 70 50 72 69 6f 72 3b 0a  = pSel->pPrior;.
2dea0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 53          sqlite3S
2deb0 65 6c 65 63 74 41 64 64 43 6f 6c 75 6d 6e 54 79  electAddColumnTy
2dec0 70 65 41 6e 64 43 6f 6c 6c 61 74 69 6f 6e 28 70  peAndCollation(p
2ded0 50 61 72 73 65 2c 20 70 54 61 62 2c 20 70 53 65  Parse, pTab, pSe
2dee0 6c 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  l);.      }.    
2def0 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a  }.  }.}.#endif..
2df00 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
2df10 69 6e 65 20 61 64 64 73 20 64 61 74 61 74 79 70  ine adds datatyp
2df20 65 20 61 6e 64 20 63 6f 6c 6c 61 74 69 6e 67 20  e and collating 
2df30 73 65 71 75 65 6e 63 65 20 69 6e 66 6f 72 6d 61  sequence informa
2df40 74 69 6f 6e 20 74 6f 0a 2a 2a 20 74 68 65 20 54  tion to.** the T
2df50 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 73 20  able structures 
2df60 6f 66 20 61 6c 6c 20 46 52 4f 4d 2d 63 6c 61 75  of all FROM-clau
2df70 73 65 20 73 75 62 71 75 65 72 69 65 73 20 69 6e  se subqueries in
2df80 20 61 0a 2a 2a 20 53 45 4c 45 43 54 20 73 74 61   a.** SELECT sta
2df90 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 55 73  tement..**.** Us
2dfa0 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 61  e this routine a
2dfb0 66 74 65 72 20 6e 61 6d 65 20 72 65 73 6f 6c 75  fter name resolu
2dfc0 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tion..*/.static 
2dfd0 76 6f 69 64 20 73 71 6c 69 74 65 33 53 65 6c 65  void sqlite3Sele
2dfe0 63 74 41 64 64 54 79 70 65 49 6e 66 6f 28 50 61  ctAddTypeInfo(Pa
2dff0 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 65 6c  rse *pParse, Sel
2e000 65 63 74 20 2a 70 53 65 6c 65 63 74 29 7b 0a 23  ect *pSelect){.#
2e010 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
2e020 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20 57 61  IT_SUBQUERY.  Wa
2e030 6c 6b 65 72 20 77 3b 0a 20 20 77 2e 78 53 65 6c  lker w;.  w.xSel
2e040 65 63 74 43 61 6c 6c 62 61 63 6b 20 3d 20 73 71  ectCallback = sq
2e050 6c 69 74 65 33 53 65 6c 65 63 74 57 61 6c 6b 4e  lite3SelectWalkN
2e060 6f 6f 70 3b 0a 20 20 77 2e 78 53 65 6c 65 63 74  oop;.  w.xSelect
2e070 43 61 6c 6c 62 61 63 6b 32 20 3d 20 73 65 6c 65  Callback2 = sele
2e080 63 74 41 64 64 53 75 62 71 75 65 72 79 54 79 70  ctAddSubqueryTyp
2e090 65 49 6e 66 6f 3b 0a 20 20 77 2e 78 45 78 70 72  eInfo;.  w.xExpr
2e0a0 43 61 6c 6c 62 61 63 6b 20 3d 20 73 71 6c 69 74  Callback = sqlit
2e0b0 65 33 45 78 70 72 57 61 6c 6b 4e 6f 6f 70 3b 0a  e3ExprWalkNoop;.
2e0c0 20 20 77 2e 70 50 61 72 73 65 20 3d 20 70 50 61    w.pParse = pPa
2e0d0 72 73 65 3b 0a 20 20 73 71 6c 69 74 65 33 57 61  rse;.  sqlite3Wa
2e0e0 6c 6b 53 65 6c 65 63 74 28 26 77 2c 20 70 53 65  lkSelect(&w, pSe
2e0f0 6c 65 63 74 29 3b 0a 23 65 6e 64 69 66 0a 7d 0a  lect);.#endif.}.
2e100 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
2e110 74 69 6e 65 20 73 65 74 73 20 75 70 20 61 20 53  tine sets up a S
2e120 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
2e130 66 6f 72 20 70 72 6f 63 65 73 73 69 6e 67 2e 20  for processing. 
2e140 20 54 68 65 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e   The.** followin
2e150 67 20 69 73 20 61 63 63 6f 6d 70 6c 69 73 68 65  g is accomplishe
2e160 64 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 20 20  d:.**.**     *  
2e170 56 44 42 45 20 43 75 72 73 6f 72 20 6e 75 6d 62  VDBE Cursor numb
2e180 65 72 73 20 61 72 65 20 61 73 73 69 67 6e 65 64  ers are assigned
2e190 20 74 6f 20 61 6c 6c 20 46 52 4f 4d 2d 63 6c 61   to all FROM-cla
2e1a0 75 73 65 20 74 65 72 6d 73 2e 0a 2a 2a 20 20 20  use terms..**   
2e1b0 20 20 2a 20 20 45 70 68 65 6d 65 72 61 6c 20 54    *  Ephemeral T
2e1c0 61 62 6c 65 20 6f 62 6a 65 63 74 73 20 61 72 65  able objects are
2e1d0 20 63 72 65 61 74 65 64 20 66 6f 72 20 61 6c 6c   created for all
2e1e0 20 46 52 4f 4d 2d 63 6c 61 75 73 65 20 73 75 62   FROM-clause sub
2e1f0 71 75 65 72 69 65 73 2e 0a 2a 2a 20 20 20 20 20  queries..**     
2e200 2a 20 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20  *  ON and USING 
2e210 63 6c 61 75 73 65 73 20 61 72 65 20 73 68 69 66  clauses are shif
2e220 74 65 64 20 69 6e 74 6f 20 57 48 45 52 45 20 73  ted into WHERE s
2e230 74 61 74 65 6d 65 6e 74 73 0a 2a 2a 20 20 20 20  tatements.**    
2e240 20 2a 20 20 57 69 6c 64 63 61 72 64 73 20 22 2a   *  Wildcards "*
2e250 22 20 61 6e 64 20 22 54 41 42 4c 45 2e 2a 22 20  " and "TABLE.*" 
2e260 69 6e 20 72 65 73 75 6c 74 20 73 65 74 73 20 61  in result sets a
2e270 72 65 20 65 78 70 61 6e 64 65 64 2e 0a 2a 2a 20  re expanded..** 
2e280 20 20 20 20 2a 20 20 49 64 65 6e 74 69 66 69 65      *  Identifie
2e290 72 73 20 69 6e 20 65 78 70 72 65 73 73 69 6f 6e  rs in expression
2e2a0 20 61 72 65 20 6d 61 74 63 68 65 64 20 74 6f 20   are matched to 
2e2b0 74 61 62 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68  tables..**.** Th
2e2c0 69 73 20 72 6f 75 74 69 6e 65 20 61 63 74 73 20  is routine acts 
2e2d0 72 65 63 75 72 73 69 76 65 6c 79 20 6f 6e 20 61  recursively on a
2e2e0 6c 6c 20 73 75 62 71 75 65 72 69 65 73 20 77 69  ll subqueries wi
2e2f0 74 68 69 6e 20 74 68 65 20 53 45 4c 45 43 54 2e  thin the SELECT.
2e300 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
2e310 53 65 6c 65 63 74 50 72 65 70 28 0a 20 20 50 61  SelectPrep(.  Pa
2e320 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
2e330 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73       /* The pars
2e340 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  er context */.  
2e350 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20  Select *p,      
2e360 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 53 45         /* The SE
2e370 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 62  LECT statement b
2e380 65 69 6e 67 20 63 6f 64 65 64 2e 20 2a 2f 0a 20  eing coded. */. 
2e390 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4f   NameContext *pO
2e3a0 75 74 65 72 4e 43 20 20 2f 2a 20 4e 61 6d 65 20  uterNC  /* Name 
2e3b0 63 6f 6e 74 65 78 74 20 66 6f 72 20 63 6f 6e 74  context for cont
2e3c0 61 69 6e 65 72 20 2a 2f 0a 29 7b 0a 20 20 61 73  ainer */.){.  as
2e3d0 73 65 72 74 28 20 70 21 3d 30 20 7c 7c 20 70 50  sert( p!=0 || pP
2e3e0 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  arse->db->malloc
2e3f0 46 61 69 6c 65 64 20 29 3b 0a 20 20 69 66 28 20  Failed );.  if( 
2e400 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c  pParse->db->mall
2e410 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74 75 72  ocFailed ) retur
2e420 6e 3b 0a 20 20 69 66 28 20 70 2d 3e 73 65 6c 46  n;.  if( p->selF
2e430 6c 61 67 73 20 26 20 53 46 5f 48 61 73 54 79 70  lags & SF_HasTyp
2e440 65 49 6e 66 6f 20 29 20 72 65 74 75 72 6e 3b 0a  eInfo ) return;.
2e450 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 45    sqlite3SelectE
2e460 78 70 61 6e 64 28 70 50 61 72 73 65 2c 20 70 29  xpand(pParse, p)
2e470 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  ;.  if( pParse->
2e480 6e 45 72 72 20 7c 7c 20 70 50 61 72 73 65 2d 3e  nErr || pParse->
2e490 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
2e4a0 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 73 71 6c   ) return;.  sql
2e4b0 69 74 65 33 52 65 73 6f 6c 76 65 53 65 6c 65 63  ite3ResolveSelec
2e4c0 74 4e 61 6d 65 73 28 70 50 61 72 73 65 2c 20 70  tNames(pParse, p
2e4d0 2c 20 70 4f 75 74 65 72 4e 43 29 3b 0a 20 20 69  , pOuterNC);.  i
2e4e0 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20  f( pParse->nErr 
2e4f0 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d  || pParse->db->m
2e500 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65  allocFailed ) re
2e510 74 75 72 6e 3b 0a 20 20 73 71 6c 69 74 65 33 53  turn;.  sqlite3S
2e520 65 6c 65 63 74 41 64 64 54 79 70 65 49 6e 66 6f  electAddTypeInfo
2e530 28 70 50 61 72 73 65 2c 20 70 29 3b 0a 7d 0a 0a  (pParse, p);.}..
2e540 2f 2a 0a 2a 2a 20 52 65 73 65 74 20 74 68 65 20  /*.** Reset the 
2e550 61 67 67 72 65 67 61 74 65 20 61 63 63 75 6d 75  aggregate accumu
2e560 6c 61 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  lator..**.** The
2e570 20 61 67 67 72 65 67 61 74 65 20 61 63 63 75 6d   aggregate accum
2e580 75 6c 61 74 6f 72 20 69 73 20 61 20 73 65 74 20  ulator is a set 
2e590 6f 66 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20  of memory cells 
2e5a0 74 68 61 74 20 68 6f 6c 64 0a 2a 2a 20 69 6e 74  that hold.** int
2e5b0 65 72 6d 65 64 69 61 74 65 20 72 65 73 75 6c 74  ermediate result
2e5c0 73 20 77 68 69 6c 65 20 63 61 6c 63 75 6c 61 74  s while calculat
2e5d0 69 6e 67 20 61 6e 20 61 67 67 72 65 67 61 74 65  ing an aggregate
2e5e0 2e 20 20 54 68 69 73 0a 2a 2a 20 72 6f 75 74 69  .  This.** routi
2e5f0 6e 65 20 67 65 6e 65 72 61 74 65 73 20 63 6f 64  ne generates cod
2e600 65 20 74 68 61 74 20 73 74 6f 72 65 73 20 4e 55  e that stores NU
2e610 4c 4c 73 20 69 6e 20 61 6c 6c 20 6f 66 20 74 68  LLs in all of th
2e620 6f 73 65 20 6d 65 6d 6f 72 79 0a 2a 2a 20 63 65  ose memory.** ce
2e630 6c 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  lls..*/.static v
2e640 6f 69 64 20 72 65 73 65 74 41 63 63 75 6d 75 6c  oid resetAccumul
2e650 61 74 6f 72 28 50 61 72 73 65 20 2a 70 50 61 72  ator(Parse *pPar
2e660 73 65 2c 20 41 67 67 49 6e 66 6f 20 2a 70 41 67  se, AggInfo *pAg
2e670 67 49 6e 66 6f 29 7b 0a 20 20 56 64 62 65 20 2a  gInfo){.  Vdbe *
2e680 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
2e690 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74  e;.  int i;.  st
2e6a0 72 75 63 74 20 41 67 67 49 6e 66 6f 5f 66 75 6e  ruct AggInfo_fun
2e6b0 63 20 2a 70 46 75 6e 63 3b 0a 20 20 69 6e 74 20  c *pFunc;.  int 
2e6c0 6e 52 65 67 20 3d 20 70 41 67 67 49 6e 66 6f 2d  nReg = pAggInfo-
2e6d0 3e 6e 46 75 6e 63 20 2b 20 70 41 67 67 49 6e 66  >nFunc + pAggInf
2e6e0 6f 2d 3e 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 69 66  o->nColumn;.  if
2e6f0 28 20 6e 52 65 67 3d 3d 30 20 29 20 72 65 74 75  ( nReg==0 ) retu
2e700 72 6e 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  rn;.#ifdef SQLIT
2e710 45 5f 44 45 42 55 47 0a 20 20 2f 2a 20 56 65 72  E_DEBUG.  /* Ver
2e720 69 66 79 20 74 68 61 74 20 61 6c 6c 20 41 67 67  ify that all Agg
2e730 49 6e 66 6f 20 72 65 67 69 73 74 65 72 73 20 61  Info registers a
2e740 72 65 20 77 69 74 68 69 6e 20 74 68 65 20 72 61  re within the ra
2e750 6e 67 65 20 73 70 65 63 69 66 69 65 64 20 62 79  nge specified by
2e760 0a 20 20 2a 2a 20 41 67 67 49 6e 66 6f 2e 6d 6e  .  ** AggInfo.mn
2e770 52 65 67 2e 2e 41 67 67 49 6e 66 6f 2e 6d 78 52  Reg..AggInfo.mxR
2e780 65 67 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  eg */.  assert( 
2e790 6e 52 65 67 3d 3d 70 41 67 67 49 6e 66 6f 2d 3e  nReg==pAggInfo->
2e7a0 6d 78 52 65 67 2d 70 41 67 67 49 6e 66 6f 2d 3e  mxReg-pAggInfo->
2e7b0 6d 6e 52 65 67 2b 31 20 29 3b 0a 20 20 66 6f 72  mnReg+1 );.  for
2e7c0 28 69 3d 30 3b 20 69 3c 70 41 67 67 49 6e 66 6f  (i=0; i<pAggInfo
2e7d0 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b  ->nColumn; i++){
2e7e0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 41 67  .    assert( pAg
2e7f0 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 69 5d 2e 69  gInfo->aCol[i].i
2e800 4d 65 6d 3e 3d 70 41 67 67 49 6e 66 6f 2d 3e 6d  Mem>=pAggInfo->m
2e810 6e 52 65 67 0a 20 20 20 20 20 20 20 20 20 26 26  nReg.         &&
2e820 20 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b   pAggInfo->aCol[
2e830 69 5d 2e 69 4d 65 6d 3c 3d 70 41 67 67 49 6e 66  i].iMem<=pAggInf
2e840 6f 2d 3e 6d 78 52 65 67 20 29 3b 0a 20 20 7d 0a  o->mxReg );.  }.
2e850 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 41 67    for(i=0; i<pAg
2e860 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3b 20 69 2b  gInfo->nFunc; i+
2e870 2b 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20  +){.    assert( 
2e880 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b  pAggInfo->aFunc[
2e890 69 5d 2e 69 4d 65 6d 3e 3d 70 41 67 67 49 6e 66  i].iMem>=pAggInf
2e8a0 6f 2d 3e 6d 6e 52 65 67 0a 20 20 20 20 20 20 20  o->mnReg.       
2e8b0 20 20 26 26 20 70 41 67 67 49 6e 66 6f 2d 3e 61    && pAggInfo->a
2e8c0 46 75 6e 63 5b 69 5d 2e 69 4d 65 6d 3c 3d 70 41  Func[i].iMem<=pA
2e8d0 67 67 49 6e 66 6f 2d 3e 6d 78 52 65 67 20 29 3b  ggInfo->mxReg );
2e8e0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 73 71  .  }.#endif.  sq
2e8f0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
2e900 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 70  v, OP_Null, 0, p
2e910 41 67 67 49 6e 66 6f 2d 3e 6d 6e 52 65 67 2c 20  AggInfo->mnReg, 
2e920 70 41 67 67 49 6e 66 6f 2d 3e 6d 78 52 65 67 29  pAggInfo->mxReg)
2e930 3b 0a 20 20 66 6f 72 28 70 46 75 6e 63 3d 70 41  ;.  for(pFunc=pA
2e940 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 2c 20 69  ggInfo->aFunc, i
2e950 3d 30 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e  =0; i<pAggInfo->
2e960 6e 46 75 6e 63 3b 20 69 2b 2b 2c 20 70 46 75 6e  nFunc; i++, pFun
2e970 63 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 46  c++){.    if( pF
2e980 75 6e 63 2d 3e 69 44 69 73 74 69 6e 63 74 3e 3d  unc->iDistinct>=
2e990 30 20 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20  0 ){.      Expr 
2e9a0 2a 70 45 20 3d 20 70 46 75 6e 63 2d 3e 70 45 78  *pE = pFunc->pEx
2e9b0 70 72 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  pr;.      assert
2e9c0 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
2e9d0 74 79 28 70 45 2c 20 45 50 5f 78 49 73 53 65 6c  ty(pE, EP_xIsSel
2e9e0 65 63 74 29 20 29 3b 0a 20 20 20 20 20 20 69 66  ect) );.      if
2e9f0 28 20 70 45 2d 3e 78 2e 70 4c 69 73 74 3d 3d 30  ( pE->x.pList==0
2ea00 20 7c 7c 20 70 45 2d 3e 78 2e 70 4c 69 73 74 2d   || pE->x.pList-
2ea10 3e 6e 45 78 70 72 21 3d 31 20 29 7b 0a 20 20 20  >nExpr!=1 ){.   
2ea20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
2ea30 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 44 49  rMsg(pParse, "DI
2ea40 53 54 49 4e 43 54 20 61 67 67 72 65 67 61 74 65  STINCT aggregate
2ea50 73 20 6d 75 73 74 20 68 61 76 65 20 65 78 61 63  s must have exac
2ea60 74 6c 79 20 6f 6e 65 20 22 0a 20 20 20 20 20 20  tly one ".      
2ea70 20 20 20 20 20 22 61 72 67 75 6d 65 6e 74 22 29       "argument")
2ea80 3b 0a 20 20 20 20 20 20 20 20 70 46 75 6e 63 2d  ;.        pFunc-
2ea90 3e 69 44 69 73 74 69 6e 63 74 20 3d 20 2d 31 3b  >iDistinct = -1;
2eaa0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
2eab0 20 20 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70        KeyInfo *p
2eac0 4b 65 79 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65  KeyInfo = sqlite
2ead0 33 4b 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72  3KeyInfoFromExpr
2eae0 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 45 2d  List(pParse, pE-
2eaf0 3e 78 2e 70 4c 69 73 74 2c 30 2c 30 29 3b 0a 20  >x.pList,0,0);. 
2eb00 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
2eb10 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4f  beAddOp4(v, OP_O
2eb20 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 70 46  penEphemeral, pF
2eb30 75 6e 63 2d 3e 69 44 69 73 74 69 6e 63 74 2c 20  unc->iDistinct, 
2eb40 30 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20  0, 0,.          
2eb50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2eb60 28 63 68 61 72 2a 29 70 4b 65 79 49 6e 66 6f 2c  (char*)pKeyInfo,
2eb70 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20   P4_KEYINFO);.  
2eb80 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
2eb90 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20  }../*.** Invoke 
2eba0 74 68 65 20 4f 50 5f 41 67 67 46 69 6e 61 6c 69  the OP_AggFinali
2ebb0 7a 65 20 6f 70 63 6f 64 65 20 66 6f 72 20 65 76  ze opcode for ev
2ebc0 65 72 79 20 61 67 67 72 65 67 61 74 65 20 66 75  ery aggregate fu
2ebd0 6e 63 74 69 6f 6e 0a 2a 2a 20 69 6e 20 74 68 65  nction.** in the
2ebe0 20 41 67 67 49 6e 66 6f 20 73 74 72 75 63 74 75   AggInfo structu
2ebf0 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  re..*/.static vo
2ec00 69 64 20 66 69 6e 61 6c 69 7a 65 41 67 67 46 75  id finalizeAggFu
2ec10 6e 63 74 69 6f 6e 73 28 50 61 72 73 65 20 2a 70  nctions(Parse *p
2ec20 50 61 72 73 65 2c 20 41 67 67 49 6e 66 6f 20 2a  Parse, AggInfo *
2ec30 70 41 67 67 49 6e 66 6f 29 7b 0a 20 20 56 64 62  pAggInfo){.  Vdb
2ec40 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
2ec50 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  Vdbe;.  int i;. 
2ec60 20 73 74 72 75 63 74 20 41 67 67 49 6e 66 6f 5f   struct AggInfo_
2ec70 66 75 6e 63 20 2a 70 46 3b 0a 20 20 66 6f 72 28  func *pF;.  for(
2ec80 69 3d 30 2c 20 70 46 3d 70 41 67 67 49 6e 66 6f  i=0, pF=pAggInfo
2ec90 2d 3e 61 46 75 6e 63 3b 20 69 3c 70 41 67 67 49  ->aFunc; i<pAggI
2eca0 6e 66 6f 2d 3e 6e 46 75 6e 63 3b 20 69 2b 2b 2c  nfo->nFunc; i++,
2ecb0 20 70 46 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72   pF++){.    Expr
2ecc0 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d 20 70 46  List *pList = pF
2ecd0 2d 3e 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74  ->pExpr->x.pList
2ece0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 45  ;.    assert( !E
2ecf0 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
2ed00 46 2d 3e 70 45 78 70 72 2c 20 45 50 5f 78 49 73  F->pExpr, EP_xIs
2ed10 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 20 20 73  Select) );.    s
2ed20 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
2ed30 28 76 2c 20 4f 50 5f 41 67 67 46 69 6e 61 6c 2c  (v, OP_AggFinal,
2ed40 20 70 46 2d 3e 69 4d 65 6d 2c 20 70 4c 69 73 74   pF->iMem, pList
2ed50 20 3f 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20   ? pList->nExpr 
2ed60 3a 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  : 0);.    sqlite
2ed70 33 56 64 62 65 41 70 70 65 6e 64 50 34 28 76 2c  3VdbeAppendP4(v,
2ed80 20 70 46 2d 3e 70 46 75 6e 63 2c 20 50 34 5f 46   pF->pFunc, P4_F
2ed90 55 4e 43 44 45 46 29 3b 0a 20 20 7d 0a 7d 0a 0a  UNCDEF);.  }.}..
2eda0 0a 2f 2a 0a 2a 2a 20 55 70 64 61 74 65 20 74 68  ./*.** Update th
2edb0 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 20 6d 65  e accumulator me
2edc0 6d 6f 72 79 20 63 65 6c 6c 73 20 66 6f 72 20 61  mory cells for a
2edd0 6e 20 61 67 67 72 65 67 61 74 65 20 62 61 73 65  n aggregate base
2ede0 64 20 6f 6e 0a 2a 2a 20 74 68 65 20 63 75 72 72  d on.** the curr
2edf0 65 6e 74 20 63 75 72 73 6f 72 20 70 6f 73 69 74  ent cursor posit
2ee00 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 72 65  ion..**.** If re
2ee10 67 41 63 63 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f  gAcc is non-zero
2ee20 20 61 6e 64 20 74 68 65 72 65 20 61 72 65 20 6e   and there are n
2ee30 6f 20 6d 69 6e 28 29 20 6f 72 20 6d 61 78 28 29  o min() or max()
2ee40 20 61 67 67 72 65 67 61 74 65 73 0a 2a 2a 20 69   aggregates.** i
2ee50 6e 20 70 41 67 67 49 6e 66 6f 2c 20 74 68 65 6e  n pAggInfo, then
2ee60 20 6f 6e 6c 79 20 70 6f 70 75 6c 61 74 65 20 74   only populate t
2ee70 68 65 20 70 41 67 67 49 6e 66 6f 2d 3e 6e 41 63  he pAggInfo->nAc
2ee80 63 75 6d 75 6c 61 74 6f 72 20 61 63 63 75 6d 75  cumulator accumu
2ee90 6c 61 74 6f 72 0a 2a 2a 20 72 65 67 69 73 74 65  lator.** registe
2eea0 72 73 20 69 66 20 72 65 67 69 73 74 65 72 20 72  rs if register r
2eeb0 65 67 41 63 63 20 63 6f 6e 74 61 69 6e 73 20 30  egAcc contains 0
2eec0 2e 20 54 68 65 20 63 61 6c 6c 65 72 20 77 69 6c  . The caller wil
2eed0 6c 20 74 61 6b 65 20 63 61 72 65 0a 2a 2a 20 6f  l take care.** o
2eee0 66 20 73 65 74 74 69 6e 67 20 61 6e 64 20 63 6c  f setting and cl
2eef0 65 61 72 69 6e 67 20 72 65 67 41 63 63 2e 0a 2a  earing regAcc..*
2ef00 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75 70  /.static void up
2ef10 64 61 74 65 41 63 63 75 6d 75 6c 61 74 6f 72 28  dateAccumulator(
2ef20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69  Parse *pParse, i
2ef30 6e 74 20 72 65 67 41 63 63 2c 20 41 67 67 49 6e  nt regAcc, AggIn
2ef40 66 6f 20 2a 70 41 67 67 49 6e 66 6f 29 7b 0a 20  fo *pAggInfo){. 
2ef50 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
2ef60 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20  e->pVdbe;.  int 
2ef70 69 3b 0a 20 20 69 6e 74 20 72 65 67 48 69 74 20  i;.  int regHit 
2ef80 3d 20 30 3b 0a 20 20 69 6e 74 20 61 64 64 72 48  = 0;.  int addrH
2ef90 69 74 54 65 73 74 20 3d 20 30 3b 0a 20 20 73 74  itTest = 0;.  st
2efa0 72 75 63 74 20 41 67 67 49 6e 66 6f 5f 66 75 6e  ruct AggInfo_fun
2efb0 63 20 2a 70 46 3b 0a 20 20 73 74 72 75 63 74 20  c *pF;.  struct 
2efc0 41 67 67 49 6e 66 6f 5f 63 6f 6c 20 2a 70 43 3b  AggInfo_col *pC;
2efd0 0a 0a 20 20 70 41 67 67 49 6e 66 6f 2d 3e 64 69  ..  pAggInfo->di
2efe0 72 65 63 74 4d 6f 64 65 20 3d 20 31 3b 0a 20 20  rectMode = 1;.  
2eff0 66 6f 72 28 69 3d 30 2c 20 70 46 3d 70 41 67 67  for(i=0, pF=pAgg
2f000 49 6e 66 6f 2d 3e 61 46 75 6e 63 3b 20 69 3c 70  Info->aFunc; i<p
2f010 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3b 20  AggInfo->nFunc; 
2f020 69 2b 2b 2c 20 70 46 2b 2b 29 7b 0a 20 20 20 20  i++, pF++){.    
2f030 69 6e 74 20 6e 41 72 67 3b 0a 20 20 20 20 69 6e  int nArg;.    in
2f040 74 20 61 64 64 72 4e 65 78 74 20 3d 20 30 3b 0a  t addrNext = 0;.
2f050 20 20 20 20 69 6e 74 20 72 65 67 41 67 67 3b 0a      int regAgg;.
2f060 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c      ExprList *pL
2f070 69 73 74 20 3d 20 70 46 2d 3e 70 45 78 70 72 2d  ist = pF->pExpr-
2f080 3e 78 2e 70 4c 69 73 74 3b 0a 20 20 20 20 61 73  >x.pList;.    as
2f090 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72  sert( !ExprHasPr
2f0a0 6f 70 65 72 74 79 28 70 46 2d 3e 70 45 78 70 72  operty(pF->pExpr
2f0b0 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20  , EP_xIsSelect) 
2f0c0 29 3b 0a 20 20 20 20 69 66 28 20 45 78 70 72 48  );.    if( ExprH
2f0d0 61 73 50 72 6f 70 65 72 74 79 28 70 46 2d 3e 70  asProperty(pF->p
2f0e0 45 78 70 72 2c 20 45 50 5f 46 69 6c 74 65 72 29  Expr, EP_Filter)
2f0f0 20 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a   ){.      Expr *
2f100 70 46 69 6c 74 65 72 20 3d 20 70 46 2d 3e 70 45  pFilter = pF->pE
2f110 78 70 72 2d 3e 79 2e 70 46 69 6c 74 65 72 3b 0a  xpr->y.pFilter;.
2f120 20 20 20 20 20 20 61 64 64 72 4e 65 78 74 20 3d        addrNext =
2f130 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
2f140 4c 61 62 65 6c 28 70 50 61 72 73 65 29 3b 0a 20  Label(pParse);. 
2f150 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
2f160 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20  IfFalse(pParse, 
2f170 70 46 69 6c 74 65 72 2c 20 61 64 64 72 4e 65 78  pFilter, addrNex
2f180 74 2c 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46  t, SQLITE_JUMPIF
2f190 4e 55 4c 4c 29 3b 0a 20 20 20 20 7d 0a 20 20 20  NULL);.    }.   
2f1a0 20 69 66 28 20 70 4c 69 73 74 20 29 7b 0a 20 20   if( pList ){.  
2f1b0 20 20 20 20 6e 41 72 67 20 3d 20 70 4c 69 73 74      nArg = pList
2f1c0 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 72  ->nExpr;.      r
2f1d0 65 67 41 67 67 20 3d 20 73 71 6c 69 74 65 33 47  egAgg = sqlite3G
2f1e0 65 74 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72  etTempRange(pPar
2f1f0 73 65 2c 20 6e 41 72 67 29 3b 0a 20 20 20 20 20  se, nArg);.     
2f200 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
2f210 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c  ExprList(pParse,
2f220 20 70 4c 69 73 74 2c 20 72 65 67 41 67 67 2c 20   pList, regAgg, 
2f230 30 2c 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f 44  0, SQLITE_ECEL_D
2f240 55 50 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  UP);.    }else{.
2f250 20 20 20 20 20 20 6e 41 72 67 20 3d 20 30 3b 0a        nArg = 0;.
2f260 20 20 20 20 20 20 72 65 67 41 67 67 20 3d 20 30        regAgg = 0
2f270 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
2f280 70 46 2d 3e 69 44 69 73 74 69 6e 63 74 3e 3d 30  pF->iDistinct>=0
2f290 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 61 64   ){.      if( ad
2f2a0 64 72 4e 65 78 74 3d 3d 30 20 29 7b 20 0a 20 20  drNext==0 ){ .  
2f2b0 20 20 20 20 20 20 61 64 64 72 4e 65 78 74 20 3d        addrNext =
2f2c0 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
2f2d0 4c 61 62 65 6c 28 70 50 61 72 73 65 29 3b 0a 20  Label(pParse);. 
2f2e0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 74 65 73       }.      tes
2f2f0 74 63 61 73 65 28 20 6e 41 72 67 3d 3d 30 20 29  tcase( nArg==0 )
2f300 3b 20 20 2f 2a 20 45 72 72 6f 72 20 63 6f 6e 64  ;  /* Error cond
2f310 69 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 74  ition */.      t
2f320 65 73 74 63 61 73 65 28 20 6e 41 72 67 3e 31 20  estcase( nArg>1 
2f330 29 3b 20 20 20 2f 2a 20 41 6c 73 6f 20 61 6e 20  );   /* Also an 
2f340 65 72 72 6f 72 20 2a 2f 0a 20 20 20 20 20 20 63  error */.      c
2f350 6f 64 65 44 69 73 74 69 6e 63 74 28 70 50 61 72  odeDistinct(pPar
2f360 73 65 2c 20 70 46 2d 3e 69 44 69 73 74 69 6e 63  se, pF->iDistinc
2f370 74 2c 20 61 64 64 72 4e 65 78 74 2c 20 31 2c 20  t, addrNext, 1, 
2f380 72 65 67 41 67 67 29 3b 0a 20 20 20 20 7d 0a 20  regAgg);.    }. 
2f390 20 20 20 69 66 28 20 70 46 2d 3e 70 46 75 6e 63     if( pF->pFunc
2f3a0 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20 53 51  ->funcFlags & SQ
2f3b0 4c 49 54 45 5f 46 55 4e 43 5f 4e 45 45 44 43 4f  LITE_FUNC_NEEDCO
2f3c0 4c 4c 20 29 7b 0a 20 20 20 20 20 20 43 6f 6c 6c  LL ){.      Coll
2f3d0 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 30 3b 0a  Seq *pColl = 0;.
2f3e0 20 20 20 20 20 20 73 74 72 75 63 74 20 45 78 70        struct Exp
2f3f0 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  rList_item *pIte
2f400 6d 3b 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a  m;.      int j;.
2f410 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4c        assert( pL
2f420 69 73 74 21 3d 30 20 29 3b 20 20 2f 2a 20 70 4c  ist!=0 );  /* pL
2f430 69 73 74 21 3d 30 20 69 66 20 70 46 2d 3e 70 46  ist!=0 if pF->pF
2f440 75 6e 63 20 68 61 73 20 4e 45 45 44 43 4f 4c 4c  unc has NEEDCOLL
2f450 20 2a 2f 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d   */.      for(j=
2f460 30 2c 20 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e  0, pItem=pList->
2f470 61 3b 20 21 70 43 6f 6c 6c 20 26 26 20 6a 3c 6e  a; !pColl && j<n
2f480 41 72 67 3b 20 6a 2b 2b 2c 20 70 49 74 65 6d 2b  Arg; j++, pItem+
2f490 2b 29 7b 0a 20 20 20 20 20 20 20 20 70 43 6f 6c  +){.        pCol
2f4a0 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  l = sqlite3ExprC
2f4b0 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70  ollSeq(pParse, p
2f4c0 49 74 65 6d 2d 3e 70 45 78 70 72 29 3b 0a 20 20  Item->pExpr);.  
2f4d0 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
2f4e0 21 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20  !pColl ){.      
2f4f0 20 20 70 43 6f 6c 6c 20 3d 20 70 50 61 72 73 65    pColl = pParse
2f500 2d 3e 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b  ->db->pDfltColl;
2f510 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
2f520 66 28 20 72 65 67 48 69 74 3d 3d 30 20 26 26 20  f( regHit==0 && 
2f530 70 41 67 67 49 6e 66 6f 2d 3e 6e 41 63 63 75 6d  pAggInfo->nAccum
2f540 75 6c 61 74 6f 72 20 29 20 72 65 67 48 69 74 20  ulator ) regHit 
2f550 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
2f560 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
2f570 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
2f580 43 6f 6c 6c 53 65 71 2c 20 72 65 67 48 69 74 2c  CollSeq, regHit,
2f590 20 30 2c 20 30 2c 20 28 63 68 61 72 20 2a 29 70   0, 0, (char *)p
2f5a0 43 6f 6c 6c 2c 20 50 34 5f 43 4f 4c 4c 53 45 51  Coll, P4_COLLSEQ
2f5b0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
2f5c0 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
2f5d0 2c 20 4f 50 5f 41 67 67 53 74 65 70 2c 20 30 2c  , OP_AggStep, 0,
2f5e0 20 72 65 67 41 67 67 2c 20 70 46 2d 3e 69 4d 65   regAgg, pF->iMe
2f5f0 6d 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  m);.    sqlite3V
2f600 64 62 65 41 70 70 65 6e 64 50 34 28 76 2c 20 70  dbeAppendP4(v, p
2f610 46 2d 3e 70 46 75 6e 63 2c 20 50 34 5f 46 55 4e  F->pFunc, P4_FUN
2f620 43 44 45 46 29 3b 0a 20 20 20 20 73 71 6c 69 74  CDEF);.    sqlit
2f630 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76  e3VdbeChangeP5(v
2f640 2c 20 28 75 38 29 6e 41 72 67 29 3b 0a 20 20 20  , (u8)nArg);.   
2f650 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
2f660 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c  empRange(pParse,
2f670 20 72 65 67 41 67 67 2c 20 6e 41 72 67 29 3b 0a   regAgg, nArg);.
2f680 20 20 20 20 69 66 28 20 61 64 64 72 4e 65 78 74      if( addrNext
2f690 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
2f6a0 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
2f6b0 6c 28 76 2c 20 61 64 64 72 4e 65 78 74 29 3b 0a  l(v, addrNext);.
2f6c0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
2f6d0 72 65 67 48 69 74 3d 3d 30 20 26 26 20 70 41 67  regHit==0 && pAg
2f6e0 67 49 6e 66 6f 2d 3e 6e 41 63 63 75 6d 75 6c 61  gInfo->nAccumula
2f6f0 74 6f 72 20 29 7b 0a 20 20 20 20 72 65 67 48 69  tor ){.    regHi
2f700 74 20 3d 20 72 65 67 41 63 63 3b 0a 20 20 7d 0a  t = regAcc;.  }.
2f710 20 20 69 66 28 20 72 65 67 48 69 74 20 29 7b 0a    if( regHit ){.
2f720 20 20 20 20 61 64 64 72 48 69 74 54 65 73 74 20      addrHitTest 
2f730 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
2f740 4f 70 31 28 76 2c 20 4f 50 5f 49 66 2c 20 72 65  Op1(v, OP_If, re
2f750 67 48 69 74 29 3b 20 56 64 62 65 43 6f 76 65 72  gHit); VdbeCover
2f760 61 67 65 28 76 29 3b 0a 20 20 7d 0a 20 20 66 6f  age(v);.  }.  fo
2f770 72 28 69 3d 30 2c 20 70 43 3d 70 41 67 67 49 6e  r(i=0, pC=pAggIn
2f780 66 6f 2d 3e 61 43 6f 6c 3b 20 69 3c 70 41 67 67  fo->aCol; i<pAgg
2f790 49 6e 66 6f 2d 3e 6e 41 63 63 75 6d 75 6c 61 74  Info->nAccumulat
2f7a0 6f 72 3b 20 69 2b 2b 2c 20 70 43 2b 2b 29 7b 0a  or; i++, pC++){.
2f7b0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
2f7c0 6f 64 65 28 70 50 61 72 73 65 2c 20 70 43 2d 3e  ode(pParse, pC->
2f7d0 70 45 78 70 72 2c 20 70 43 2d 3e 69 4d 65 6d 29  pExpr, pC->iMem)
2f7e0 3b 0a 20 20 7d 0a 20 20 70 41 67 67 49 6e 66 6f  ;.  }.  pAggInfo
2f7f0 2d 3e 64 69 72 65 63 74 4d 6f 64 65 20 3d 20 30  ->directMode = 0
2f800 3b 0a 20 20 69 66 28 20 61 64 64 72 48 69 74 54  ;.  if( addrHitT
2f810 65 73 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  est ){.    sqlit
2f820 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
2f830 2c 20 61 64 64 72 48 69 74 54 65 73 74 29 3b 0a  , addrHitTest);.
2f840 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64    }.}../*.** Add
2f850 20 61 20 73 69 6e 67 6c 65 20 4f 50 5f 45 78 70   a single OP_Exp
2f860 6c 61 69 6e 20 69 6e 73 74 72 75 63 74 69 6f 6e  lain instruction
2f870 20 74 6f 20 74 68 65 20 56 44 42 45 20 74 6f 20   to the VDBE to 
2f880 65 78 70 6c 61 69 6e 20 61 20 73 69 6d 70 6c 65  explain a simple
2f890 0a 2a 2a 20 63 6f 75 6e 74 28 2a 29 20 71 75 65  .** count(*) que
2f8a0 72 79 20 28 22 53 45 4c 45 43 54 20 63 6f 75 6e  ry ("SELECT coun
2f8b0 74 28 2a 29 20 46 52 4f 4d 20 70 54 61 62 22 29  t(*) FROM pTab")
2f8c0 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  ..*/.#ifndef SQL
2f8d0 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e  ITE_OMIT_EXPLAIN
2f8e0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65 78 70  .static void exp
2f8f0 6c 61 69 6e 53 69 6d 70 6c 65 43 6f 75 6e 74 28  lainSimpleCount(
2f900 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
2f910 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2f920 20 20 20 2f 2a 20 50 61 72 73 65 20 63 6f 6e 74     /* Parse cont
2f930 65 78 74 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a  ext */.  Table *
2f940 70 54 61 62 2c 20 20 20 20 20 20 20 20 20 20 20  pTab,           
2f950 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c           /* Tabl
2f960 65 20 62 65 69 6e 67 20 71 75 65 72 69 65 64 20  e being queried 
2f970 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78  */.  Index *pIdx
2f980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f990 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 75 73       /* Index us
2f9a0 65 64 20 74 6f 20 6f 70 74 69 6d 69 7a 65 20 73  ed to optimize s
2f9b0 63 61 6e 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a  can, or NULL */.
2f9c0 29 7b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  ){.  if( pParse-
2f9d0 3e 65 78 70 6c 61 69 6e 3d 3d 32 20 29 7b 0a 20  >explain==2 ){. 
2f9e0 20 20 20 69 6e 74 20 62 43 6f 76 65 72 20 3d 20     int bCover = 
2f9f0 28 70 49 64 78 21 3d 30 20 26 26 20 28 48 61 73  (pIdx!=0 && (Has
2fa00 52 6f 77 69 64 28 70 54 61 62 29 20 7c 7c 20 21  Rowid(pTab) || !
2fa10 49 73 50 72 69 6d 61 72 79 4b 65 79 49 6e 64 65  IsPrimaryKeyInde
2fa20 78 28 70 49 64 78 29 29 29 3b 0a 20 20 20 20 73  x(pIdx)));.    s
2fa30 71 6c 69 74 65 33 56 64 62 65 45 78 70 6c 61 69  qlite3VdbeExplai
2fa40 6e 28 70 50 61 72 73 65 2c 20 30 2c 20 22 53 43  n(pParse, 0, "SC
2fa50 41 4e 20 54 41 42 4c 45 20 25 73 25 73 25 73 22  AN TABLE %s%s%s"
2fa60 2c 0a 20 20 20 20 20 20 20 20 70 54 61 62 2d 3e  ,.        pTab->
2fa70 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 62  zName,.        b
2fa80 43 6f 76 65 72 20 3f 20 22 20 55 53 49 4e 47 20  Cover ? " USING 
2fa90 43 4f 56 45 52 49 4e 47 20 49 4e 44 45 58 20 22  COVERING INDEX "
2faa0 20 3a 20 22 22 2c 0a 20 20 20 20 20 20 20 20 62   : "",.        b
2fab0 43 6f 76 65 72 20 3f 20 70 49 64 78 2d 3e 7a 4e  Cover ? pIdx->zN
2fac0 61 6d 65 20 3a 20 22 22 0a 20 20 20 20 29 3b 0a  ame : "".    );.
2fad0 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65    }.}.#else.# de
2fae0 66 69 6e 65 20 65 78 70 6c 61 69 6e 53 69 6d 70  fine explainSimp
2faf0 6c 65 43 6f 75 6e 74 28 61 2c 62 2c 63 29 0a 23  leCount(a,b,c).#
2fb00 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 73 71 6c  endif../*.** sql
2fb10 69 74 65 33 57 61 6c 6b 45 78 70 72 28 29 20 63  ite3WalkExpr() c
2fb20 61 6c 6c 62 61 63 6b 20 75 73 65 64 20 62 79 20  allback used by 
2fb30 68 61 76 69 6e 67 54 6f 57 68 65 72 65 28 29 2e  havingToWhere().
2fb40 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6e 6f  .**.** If the no
2fb50 64 65 20 70 61 73 73 65 64 20 74 6f 20 74 68 65  de passed to the
2fb60 20 63 61 6c 6c 62 61 63 6b 20 69 73 20 61 20 54   callback is a T
2fb70 4b 5f 41 4e 44 20 6e 6f 64 65 2c 20 72 65 74 75  K_AND node, retu
2fb80 72 6e 20 0a 2a 2a 20 57 52 43 5f 43 6f 6e 74 69  rn .** WRC_Conti
2fb90 6e 75 65 20 74 6f 20 74 65 6c 6c 20 73 71 6c 69  nue to tell sqli
2fba0 74 65 33 57 61 6c 6b 45 78 70 72 28 29 20 74 6f  te3WalkExpr() to
2fbb0 20 69 74 65 72 61 74 65 20 74 68 72 6f 75 67 68   iterate through
2fbc0 20 63 68 69 6c 64 20 6e 6f 64 65 73 2e 0a 2a 2a   child nodes..**
2fbd0 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 72  .** Otherwise, r
2fbe0 65 74 75 72 6e 20 57 52 43 5f 50 72 75 6e 65 2e  eturn WRC_Prune.
2fbf0 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20 61   In this case, a
2fc00 6c 73 6f 20 63 68 65 63 6b 20 69 66 20 74 68 65  lso check if the
2fc10 20 0a 2a 2a 20 73 75 62 2d 65 78 70 72 65 73 73   .** sub-express
2fc20 69 6f 6e 20 6d 61 74 63 68 65 73 20 74 68 65 20  ion matches the 
2fc30 63 72 69 74 65 72 69 61 20 66 6f 72 20 62 65 69  criteria for bei
2fc40 6e 67 20 6d 6f 76 65 64 20 74 6f 20 74 68 65 20  ng moved to the 
2fc50 57 48 45 52 45 0a 2a 2a 20 63 6c 61 75 73 65 2e  WHERE.** clause.
2fc60 20 49 66 20 73 6f 2c 20 61 64 64 20 69 74 20 74   If so, add it t
2fc70 6f 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  o the WHERE clau
2fc80 73 65 20 61 6e 64 20 72 65 70 6c 61 63 65 20 74  se and replace t
2fc90 68 65 20 73 75 62 2d 65 78 70 72 65 73 73 69 6f  he sub-expressio
2fca0 6e 0a 2a 2a 20 77 69 74 68 69 6e 20 74 68 65 20  n.** within the 
2fcb0 48 41 56 49 4e 47 20 65 78 70 72 65 73 73 69 6f  HAVING expressio
2fcc0 6e 20 77 69 74 68 20 61 20 63 6f 6e 73 74 61 6e  n with a constan
2fcd0 74 20 22 31 22 2e 0a 2a 2f 0a 73 74 61 74 69 63  t "1"..*/.static
2fce0 20 69 6e 74 20 68 61 76 69 6e 67 54 6f 57 68 65   int havingToWhe
2fcf0 72 65 45 78 70 72 43 62 28 57 61 6c 6b 65 72 20  reExprCb(Walker 
2fd00 2a 70 57 61 6c 6b 65 72 2c 20 45 78 70 72 20 2a  *pWalker, Expr *
2fd10 70 45 78 70 72 29 7b 0a 20 20 69 66 28 20 70 45  pExpr){.  if( pE
2fd20 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 41 4e 44 20  xpr->op!=TK_AND 
2fd30 29 7b 0a 20 20 20 20 53 65 6c 65 63 74 20 2a 70  ){.    Select *p
2fd40 53 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 75 2e 70  S = pWalker->u.p
2fd50 53 65 6c 65 63 74 3b 0a 20 20 20 20 69 66 28 20  Select;.    if( 
2fd60 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e  sqlite3ExprIsCon
2fd70 73 74 61 6e 74 4f 72 47 72 6f 75 70 42 79 28 70  stantOrGroupBy(p
2fd80 57 61 6c 6b 65 72 2d 3e 70 50 61 72 73 65 2c 20  Walker->pParse, 
2fd90 70 45 78 70 72 2c 20 70 53 2d 3e 70 47 72 6f 75  pExpr, pS->pGrou
2fda0 70 42 79 29 20 29 7b 0a 20 20 20 20 20 20 73 71  pBy) ){.      sq
2fdb0 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 57 61 6c  lite3 *db = pWal
2fdc0 6b 65 72 2d 3e 70 50 61 72 73 65 2d 3e 64 62 3b  ker->pParse->db;
2fdd0 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 4e 65  .      Expr *pNe
2fde0 77 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41  w = sqlite3ExprA
2fdf0 6c 6c 6f 63 28 64 62 2c 20 54 4b 5f 49 4e 54 45  lloc(db, TK_INTE
2fe00 47 45 52 2c 20 26 73 71 6c 69 74 65 33 49 6e 74  GER, &sqlite3Int
2fe10 54 6f 6b 65 6e 73 5b 31 5d 2c 20 30 29 3b 0a 20  Tokens[1], 0);. 
2fe20 20 20 20 20 20 69 66 28 20 70 4e 65 77 20 29 7b       if( pNew ){
2fe30 0a 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70  .        Expr *p
2fe40 57 68 65 72 65 20 3d 20 70 53 2d 3e 70 57 68 65  Where = pS->pWhe
2fe50 72 65 3b 0a 20 20 20 20 20 20 20 20 53 57 41 50  re;.        SWAP
2fe60 28 45 78 70 72 2c 20 2a 70 4e 65 77 2c 20 2a 70  (Expr, *pNew, *p
2fe70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 70  Expr);.        p
2fe80 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 45 78 70  New = sqlite3Exp
2fe90 72 41 6e 64 28 70 57 61 6c 6b 65 72 2d 3e 70 50  rAnd(pWalker->pP
2fea0 61 72 73 65 2c 20 70 57 68 65 72 65 2c 20 70 4e  arse, pWhere, pN
2feb0 65 77 29 3b 0a 20 20 20 20 20 20 20 20 70 53 2d  ew);.        pS-
2fec0 3e 70 57 68 65 72 65 20 3d 20 70 4e 65 77 3b 0a  >pWhere = pNew;.
2fed0 20 20 20 20 20 20 20 20 70 57 61 6c 6b 65 72 2d          pWalker-
2fee0 3e 65 43 6f 64 65 20 3d 20 31 3b 0a 20 20 20 20  >eCode = 1;.    
2fef0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 72 65    }.    }.    re
2ff00 74 75 72 6e 20 57 52 43 5f 50 72 75 6e 65 3b 0a  turn WRC_Prune;.
2ff10 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 57 52 43    }.  return WRC
2ff20 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a  _Continue;.}../*
2ff30 0a 2a 2a 20 54 72 61 6e 73 66 65 72 20 65 6c 69  .** Transfer eli
2ff40 67 69 62 6c 65 20 74 65 72 6d 73 20 66 72 6f 6d  gible terms from
2ff50 20 74 68 65 20 48 41 56 49 4e 47 20 63 6c 61 75   the HAVING clau
2ff60 73 65 20 6f 66 20 61 20 71 75 65 72 79 2c 20 77  se of a query, w
2ff70 68 69 63 68 20 69 73 0a 2a 2a 20 70 72 6f 63 65  hich is.** proce
2ff80 73 73 65 64 20 61 66 74 65 72 20 67 72 6f 75 70  ssed after group
2ff90 69 6e 67 2c 20 74 6f 20 74 68 65 20 57 48 45 52  ing, to the WHER
2ffa0 45 20 63 6c 61 75 73 65 2c 20 77 68 69 63 68 20  E clause, which 
2ffb0 69 73 20 70 72 6f 63 65 73 73 65 64 20 62 65 66  is processed bef
2ffc0 6f 72 65 0a 2a 2a 20 67 72 6f 75 70 69 6e 67 2e  ore.** grouping.
2ffd0 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 74 68   For example, th
2ffe0 65 20 71 75 65 72 79 3a 0a 2a 2a 0a 2a 2a 20 20  e query:.**.**  
2fff0 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 3c   SELECT * FROM <
30000 74 61 62 6c 65 73 3e 20 57 48 45 52 45 20 61 3d  tables> WHERE a=
30010 3f 20 47 52 4f 55 50 20 42 59 20 62 20 48 41 56  ? GROUP BY b HAV
30020 49 4e 47 20 62 3d 3f 20 41 4e 44 20 63 3d 3f 0a  ING b=? AND c=?.
30030 2a 2a 0a 2a 2a 20 63 61 6e 20 62 65 20 72 65 77  **.** can be rew
30040 72 69 74 74 65 6e 20 61 73 3a 0a 2a 2a 0a 2a 2a  ritten as:.**.**
30050 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d     SELECT * FROM
30060 20 3c 74 61 62 6c 65 73 3e 20 57 48 45 52 45 20   <tables> WHERE 
30070 61 3d 3f 20 41 4e 44 20 62 3d 3f 20 47 52 4f 55  a=? AND b=? GROU
30080 50 20 42 59 20 62 20 48 41 56 49 4e 47 20 63 3d  P BY b HAVING c=
30090 3f 0a 2a 2a 0a 2a 2a 20 41 20 74 65 72 6d 20 6f  ?.**.** A term o
300a0 66 20 74 68 65 20 48 41 56 49 4e 47 20 65 78 70  f the HAVING exp
300b0 72 65 73 73 69 6f 6e 20 69 73 20 65 6c 69 67 69  ression is eligi
300c0 62 6c 65 20 66 6f 72 20 74 72 61 6e 73 66 65 72  ble for transfer
300d0 20 69 66 20 69 74 20 63 6f 6e 73 69 73 74 73 0a   if it consists.
300e0 2a 2a 20 65 6e 74 69 72 65 6c 79 20 6f 66 20 63  ** entirely of c
300f0 6f 6e 73 74 61 6e 74 73 20 61 6e 64 20 65 78 70  onstants and exp
30100 72 65 73 73 69 6f 6e 73 20 74 68 61 74 20 61 72  ressions that ar
30110 65 20 61 6c 73 6f 20 47 52 4f 55 50 20 42 59 20  e also GROUP BY 
30120 74 65 72 6d 73 20 74 68 61 74 0a 2a 2a 20 75 73  terms that.** us
30130 65 20 74 68 65 20 22 42 49 4e 41 52 59 22 20 63  e the "BINARY" c
30140 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63  ollation sequenc
30150 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  e..*/.static voi
30160 64 20 68 61 76 69 6e 67 54 6f 57 68 65 72 65 28  d havingToWhere(
30170 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53  Parse *pParse, S
30180 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 57 61 6c  elect *p){.  Wal
30190 6b 65 72 20 73 57 61 6c 6b 65 72 3b 0a 20 20 6d  ker sWalker;.  m
301a0 65 6d 73 65 74 28 26 73 57 61 6c 6b 65 72 2c 20  emset(&sWalker, 
301b0 30 2c 20 73 69 7a 65 6f 66 28 73 57 61 6c 6b 65  0, sizeof(sWalke
301c0 72 29 29 3b 0a 20 20 73 57 61 6c 6b 65 72 2e 70  r));.  sWalker.p
301d0 50 61 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a  Parse = pParse;.
301e0 20 20 73 57 61 6c 6b 65 72 2e 78 45 78 70 72 43    sWalker.xExprC
301f0 61 6c 6c 62 61 63 6b 20 3d 20 68 61 76 69 6e 67  allback = having
30200 54 6f 57 68 65 72 65 45 78 70 72 43 62 3b 0a 20  ToWhereExprCb;. 
30210 20 73 57 61 6c 6b 65 72 2e 75 2e 70 53 65 6c 65   sWalker.u.pSele
30220 63 74 20 3d 20 70 3b 0a 20 20 73 71 6c 69 74 65  ct = p;.  sqlite
30230 33 57 61 6c 6b 45 78 70 72 28 26 73 57 61 6c 6b  3WalkExpr(&sWalk
30240 65 72 2c 20 70 2d 3e 70 48 61 76 69 6e 67 29 3b  er, p->pHaving);
30250 0a 23 69 66 20 53 45 4c 45 43 54 54 52 41 43 45  .#if SELECTTRACE
30260 5f 45 4e 41 42 4c 45 44 0a 20 20 69 66 28 20 73  _ENABLED.  if( s
30270 57 61 6c 6b 65 72 2e 65 43 6f 64 65 20 26 26 20  Walker.eCode && 
30280 28 73 71 6c 69 74 65 33 53 65 6c 65 63 74 54 72  (sqlite3SelectTr
30290 61 63 65 20 26 20 30 78 31 30 30 29 21 3d 30 20  ace & 0x100)!=0 
302a0 29 7b 0a 20 20 20 20 53 45 4c 45 43 54 54 52 41  ){.    SELECTTRA
302b0 43 45 28 30 78 31 30 30 2c 70 50 61 72 73 65 2c  CE(0x100,pParse,
302c0 70 2c 28 22 4d 6f 76 65 20 48 41 56 49 4e 47 20  p,("Move HAVING 
302d0 74 65 72 6d 73 20 69 6e 74 6f 20 57 48 45 52 45  terms into WHERE
302e0 3a 5c 6e 22 29 29 3b 0a 20 20 20 20 73 71 6c 69  :\n"));.    sqli
302f0 74 65 33 54 72 65 65 56 69 65 77 53 65 6c 65 63  te3TreeViewSelec
30300 74 28 30 2c 20 70 2c 20 30 29 3b 0a 20 20 7d 0a  t(0, p, 0);.  }.
30310 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  #endif.}../*.** 
30320 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20  Check to see if 
30330 74 68 65 20 70 54 68 69 73 20 65 6e 74 72 79 20  the pThis entry 
30340 6f 66 20 70 54 61 62 4c 69 73 74 20 69 73 20 61  of pTabList is a
30350 20 73 65 6c 66 2d 6a 6f 69 6e 20 6f 66 20 61 20   self-join of a 
30360 70 72 69 6f 72 20 76 69 65 77 2e 0a 2a 2a 20 49  prior view..** I
30370 66 20 69 74 20 69 73 2c 20 74 68 65 6e 20 72 65  f it is, then re
30380 74 75 72 6e 20 74 68 65 20 53 72 63 4c 69 73 74  turn the SrcList
30390 5f 69 74 65 6d 20 66 6f 72 20 74 68 65 20 70 72  _item for the pr
303a0 69 6f 72 20 76 69 65 77 2e 20 20 49 66 20 69 74  ior view.  If it
303b0 20 69 73 20 6e 6f 74 2c 0a 2a 2a 20 74 68 65 6e   is not,.** then
303c0 20 72 65 74 75 72 6e 20 30 2e 0a 2a 2f 0a 73 74   return 0..*/.st
303d0 61 74 69 63 20 73 74 72 75 63 74 20 53 72 63 4c  atic struct SrcL
303e0 69 73 74 5f 69 74 65 6d 20 2a 69 73 53 65 6c 66  ist_item *isSelf
303f0 4a 6f 69 6e 56 69 65 77 28 0a 20 20 53 72 63 4c  JoinView(.  SrcL
30400 69 73 74 20 2a 70 54 61 62 4c 69 73 74 2c 20 20  ist *pTabList,  
30410 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 61 72           /* Sear
30420 63 68 20 66 6f 72 20 73 65 6c 66 2d 6a 6f 69 6e  ch for self-join
30430 73 20 69 6e 20 74 68 69 73 20 46 52 4f 4d 20 63  s in this FROM c
30440 6c 61 75 73 65 20 2a 2f 0a 20 20 73 74 72 75 63  lause */.  struc
30450 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
30460 70 54 68 69 73 20 20 20 2f 2a 20 53 65 61 72 63  pThis   /* Searc
30470 68 20 66 6f 72 20 70 72 69 6f 72 20 72 65 66 65  h for prior refe
30480 72 65 6e 63 65 20 74 6f 20 74 68 69 73 20 73 75  rence to this su
30490 62 71 75 65 72 79 20 2a 2f 0a 29 7b 0a 20 20 73  bquery */.){.  s
304a0 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
304b0 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 66 6f 72  em *pItem;.  for
304c0 28 70 49 74 65 6d 20 3d 20 70 54 61 62 4c 69 73  (pItem = pTabLis
304d0 74 2d 3e 61 3b 20 70 49 74 65 6d 3c 70 54 68 69  t->a; pItem<pThi
304e0 73 3b 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20  s; pItem++){.   
304f0 20 53 65 6c 65 63 74 20 2a 70 53 31 3b 0a 20 20   Select *pS1;.  
30500 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 70 53 65    if( pItem->pSe
30510 6c 65 63 74 3d 3d 30 20 29 20 63 6f 6e 74 69 6e  lect==0 ) contin
30520 75 65 3b 0a 20 20 20 20 69 66 28 20 70 49 74 65  ue;.    if( pIte
30530 6d 2d 3e 66 67 2e 76 69 61 43 6f 72 6f 75 74 69  m->fg.viaCorouti
30540 6e 65 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  ne ) continue;. 
30550 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 7a 4e     if( pItem->zN
30560 61 6d 65 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75  ame==0 ) continu
30570 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  e;.    assert( p
30580 49 74 65 6d 2d 3e 70 54 61 62 21 3d 30 20 29 3b  Item->pTab!=0 );
30590 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 54 68  .    assert( pTh
305a0 69 73 2d 3e 70 54 61 62 21 3d 30 20 29 3b 0a 20  is->pTab!=0 );. 
305b0 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 70 54     if( pItem->pT
305c0 61 62 2d 3e 70 53 63 68 65 6d 61 21 3d 70 54 68  ab->pSchema!=pTh
305d0 69 73 2d 3e 70 54 61 62 2d 3e 70 53 63 68 65 6d  is->pTab->pSchem
305e0 61 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  a ) continue;.  
305f0 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73 74    if( sqlite3_st
30600 72 69 63 6d 70 28 70 49 74 65 6d 2d 3e 7a 4e 61  ricmp(pItem->zNa
30610 6d 65 2c 20 70 54 68 69 73 2d 3e 7a 4e 61 6d 65  me, pThis->zName
30620 29 21 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b  )!=0 ) continue;
30630 0a 20 20 20 20 70 53 31 20 3d 20 70 49 74 65 6d  .    pS1 = pItem
30640 2d 3e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 69  ->pSelect;.    i
30650 66 28 20 70 49 74 65 6d 2d 3e 70 54 61 62 2d 3e  f( pItem->pTab->
30660 70 53 63 68 65 6d 61 3d 3d 30 20 26 26 20 70 54  pSchema==0 && pT
30670 68 69 73 2d 3e 70 53 65 6c 65 63 74 2d 3e 73 65  his->pSelect->se
30680 6c 49 64 21 3d 70 53 31 2d 3e 73 65 6c 49 64 20  lId!=pS1->selId 
30690 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ){.      /* The 
306a0 71 75 65 72 79 20 66 6c 61 74 74 65 6e 65 72 20  query flattener 
306b0 6c 65 66 74 20 74 77 6f 20 64 69 66 66 65 72 65  left two differe
306c0 6e 74 20 43 54 45 20 74 61 62 6c 65 73 20 77 69  nt CTE tables wi
306d0 74 68 20 69 64 65 6e 74 69 63 61 6c 0a 20 20 20  th identical.   
306e0 20 20 20 2a 2a 20 6e 61 6d 65 73 20 69 6e 20 74     ** names in t
306f0 68 65 20 73 61 6d 65 20 46 52 4f 4d 20 63 6c 61  he same FROM cla
30700 75 73 65 2e 20 2a 2f 0a 20 20 20 20 20 20 63 6f  use. */.      co
30710 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20  ntinue;.    }.  
30720 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70    if( sqlite3Exp
30730 72 43 6f 6d 70 61 72 65 28 30 2c 20 70 54 68 69  rCompare(0, pThi
30740 73 2d 3e 70 53 65 6c 65 63 74 2d 3e 70 57 68 65  s->pSelect->pWhe
30750 72 65 2c 20 70 53 31 2d 3e 70 57 68 65 72 65 2c  re, pS1->pWhere,
30760 20 2d 31 29 0a 20 20 20 20 20 7c 7c 20 73 71 6c   -1).     || sql
30770 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28  ite3ExprCompare(
30780 30 2c 20 70 54 68 69 73 2d 3e 70 53 65 6c 65 63  0, pThis->pSelec
30790 74 2d 3e 70 48 61 76 69 6e 67 2c 20 70 53 31 2d  t->pHaving, pS1-
307a0 3e 70 48 61 76 69 6e 67 2c 20 2d 31 29 20 0a 20  >pHaving, -1) . 
307b0 20 20 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54     ){.      /* T
307c0 68 65 20 76 69 65 77 20 77 61 73 20 6d 6f 64 69  he view was modi
307d0 66 69 65 64 20 62 79 20 73 6f 6d 65 20 6f 74 68  fied by some oth
307e0 65 72 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20  er optimization 
307f0 73 75 63 68 20 61 73 0a 20 20 20 20 20 20 2a 2a  such as.      **
30800 20 70 75 73 68 44 6f 77 6e 57 68 65 72 65 54 65   pushDownWhereTe
30810 72 6d 73 28 29 20 2a 2f 0a 20 20 20 20 20 20 63  rms() */.      c
30820 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20  ontinue;.    }. 
30830 20 20 20 72 65 74 75 72 6e 20 70 49 74 65 6d 3b     return pItem;
30840 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
30850 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .}..#ifdef SQLIT
30860 45 5f 43 4f 55 4e 54 4f 46 56 49 45 57 5f 4f 50  E_COUNTOFVIEW_OP
30870 54 49 4d 49 5a 41 54 49 4f 4e 0a 2f 2a 0a 2a 2a  TIMIZATION./*.**
30880 20 41 74 74 65 6d 70 74 20 74 6f 20 74 72 61 6e   Attempt to tran
30890 73 66 6f 72 6d 20 61 20 71 75 65 72 79 20 6f 66  sform a query of
308a0 20 74 68 65 20 66 6f 72 6d 0a 2a 2a 0a 2a 2a 20   the form.**.** 
308b0 20 20 20 53 45 4c 45 43 54 20 63 6f 75 6e 74 28     SELECT count(
308c0 2a 29 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20  *) FROM (SELECT 
308d0 78 20 46 52 4f 4d 20 74 31 20 55 4e 49 4f 4e 20  x FROM t1 UNION 
308e0 41 4c 4c 20 53 45 4c 45 43 54 20 79 20 46 52 4f  ALL SELECT y FRO
308f0 4d 20 74 32 29 0a 2a 2a 0a 2a 2a 20 49 6e 74 6f  M t2).**.** Into
30900 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20   this:.**.**    
30910 53 45 4c 45 43 54 20 28 53 45 4c 45 43 54 20 63  SELECT (SELECT c
30920 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 74 31 29  ount(*) FROM t1)
30930 2b 28 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a  +(SELECT count(*
30940 29 20 46 52 4f 4d 20 74 32 29 0a 2a 2a 0a 2a 2a  ) FROM t2).**.**
30950 20 54 68 65 20 74 72 61 6e 73 66 6f 72 6d 61 74   The transformat
30960 69 6f 6e 20 6f 6e 6c 79 20 77 6f 72 6b 73 20 69  ion only works i
30970 66 20 61 6c 6c 20 6f 66 20 74 68 65 20 66 6f 6c  f all of the fol
30980 6c 6f 77 69 6e 67 20 61 72 65 20 74 72 75 65 3a  lowing are true:
30990 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20 54 68 65 20  .**.**   *  The 
309a0 73 75 62 71 75 65 72 79 20 69 73 20 61 20 55 4e  subquery is a UN
309b0 49 4f 4e 20 41 4c 4c 20 6f 66 20 74 77 6f 20 6f  ION ALL of two o
309c0 72 20 6d 6f 72 65 20 74 65 72 6d 73 0a 2a 2a 20  r more terms.** 
309d0 20 20 2a 20 20 54 68 65 20 73 75 62 71 75 65 72    *  The subquer
309e0 79 20 64 6f 65 73 20 6e 6f 74 20 68 61 76 65 20  y does not have 
309f0 61 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 0a 2a  a LIMIT clause.*
30a00 2a 20 20 20 2a 20 20 54 68 65 72 65 20 69 73 20  *   *  There is 
30a10 6e 6f 20 57 48 45 52 45 20 6f 72 20 47 52 4f 55  no WHERE or GROU
30a20 50 20 42 59 20 6f 72 20 48 41 56 49 4e 47 20 63  P BY or HAVING c
30a30 6c 61 75 73 65 73 20 6f 6e 20 74 68 65 20 73 75  lauses on the su
30a40 62 71 75 65 72 69 65 73 0a 2a 2a 20 20 20 2a 20  bqueries.**   * 
30a50 20 54 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   The outer query
30a60 20 69 73 20 61 20 73 69 6d 70 6c 65 20 63 6f 75   is a simple cou
30a70 6e 74 28 2a 29 20 77 69 74 68 20 6e 6f 20 57 48  nt(*) with no WH
30a80 45 52 45 20 63 6c 61 75 73 65 20 6f 72 20 6f 74  ERE clause or ot
30a90 68 65 72 0a 2a 2a 20 20 20 20 20 20 65 78 74 72  her.**      extr
30aa0 61 6e 65 6f 75 73 20 73 79 6e 74 61 78 2e 0a 2a  aneous syntax..*
30ab0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45  *.** Return TRUE
30ac0 20 69 66 20 74 68 65 20 6f 70 74 69 6d 69 7a 61   if the optimiza
30ad0 74 69 6f 6e 20 69 73 20 75 6e 64 65 72 74 61 6b  tion is undertak
30ae0 65 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  en..*/.static in
30af0 74 20 63 6f 75 6e 74 4f 66 56 69 65 77 4f 70 74  t countOfViewOpt
30b00 69 6d 69 7a 61 74 69 6f 6e 28 50 61 72 73 65 20  imization(Parse 
30b10 2a 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74 20  *pParse, Select 
30b20 2a 70 29 7b 0a 20 20 53 65 6c 65 63 74 20 2a 70  *p){.  Select *p
30b30 53 75 62 2c 20 2a 70 50 72 69 6f 72 3b 0a 20 20  Sub, *pPrior;.  
30b40 45 78 70 72 20 2a 70 45 78 70 72 3b 0a 20 20 45  Expr *pExpr;.  E
30b50 78 70 72 20 2a 70 43 6f 75 6e 74 3b 0a 20 20 73  xpr *pCount;.  s
30b60 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 66  qlite3 *db;.  if
30b70 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26  ( (p->selFlags &
30b80 20 53 46 5f 41 67 67 72 65 67 61 74 65 29 3d 3d   SF_Aggregate)==
30b90 30 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20  0 ) return 0;   
30ba0 2f 2a 20 54 68 69 73 20 69 73 20 61 6e 20 61 67  /* This is an ag
30bb0 67 72 65 67 61 74 65 20 2a 2f 0a 20 20 69 66 28  gregate */.  if(
30bc0 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70   p->pEList->nExp
30bd0 72 21 3d 31 20 29 20 72 65 74 75 72 6e 20 30 3b  r!=1 ) return 0;
30be0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
30bf0 2a 20 53 69 6e 67 6c 65 20 72 65 73 75 6c 74 20  * Single result 
30c00 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 69 66 28 20  column */.  if( 
30c10 70 2d 3e 70 57 68 65 72 65 20 29 20 72 65 74 75  p->pWhere ) retu
30c20 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 2d 3e 70  rn 0;.  if( p->p
30c30 47 72 6f 75 70 42 79 20 29 20 72 65 74 75 72 6e  GroupBy ) return
30c40 20 30 3b 0a 20 20 70 45 78 70 72 20 3d 20 70 2d   0;.  pExpr = p-
30c50 3e 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45  >pEList->a[0].pE
30c60 78 70 72 3b 0a 20 20 69 66 28 20 70 45 78 70 72  xpr;.  if( pExpr
30c70 2d 3e 6f 70 21 3d 54 4b 5f 41 47 47 5f 46 55 4e  ->op!=TK_AGG_FUN
30c80 43 54 49 4f 4e 20 29 20 72 65 74 75 72 6e 20 30  CTION ) return 0
30c90 3b 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75  ;        /* Resu
30ca0 6c 74 20 69 73 20 61 6e 20 61 67 67 72 65 67 61  lt is an aggrega
30cb0 74 65 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69  te */.  if( sqli
30cc0 74 65 33 5f 73 74 72 69 63 6d 70 28 70 45 78 70  te3_stricmp(pExp
30cd0 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 22 63 6f 75  r->u.zToken,"cou
30ce0 6e 74 22 29 20 29 20 72 65 74 75 72 6e 20 30 3b  nt") ) return 0;
30cf0 20 20 2f 2a 20 49 73 20 63 6f 75 6e 74 28 29 20    /* Is count() 
30d00 2a 2f 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e  */.  if( pExpr->
30d10 78 2e 70 4c 69 73 74 21 3d 30 20 29 20 72 65 74  x.pList!=0 ) ret
30d20 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20  urn 0;          
30d30 20 20 20 20 20 20 20 2f 2a 20 4d 75 73 74 20 62         /* Must b
30d40 65 20 63 6f 75 6e 74 28 2a 29 20 2a 2f 0a 20 20  e count(*) */.  
30d50 69 66 28 20 70 2d 3e 70 53 72 63 2d 3e 6e 53 72  if( p->pSrc->nSr
30d60 63 21 3d 31 20 29 20 72 65 74 75 72 6e 20 30 3b  c!=1 ) return 0;
30d70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30d80 20 20 2f 2a 20 4f 6e 65 20 74 61 62 6c 65 20 69    /* One table i
30d90 6e 20 46 52 4f 4d 20 20 2a 2f 0a 20 20 70 53 75  n FROM  */.  pSu
30da0 62 20 3d 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 30  b = p->pSrc->a[0
30db0 5d 2e 70 53 65 6c 65 63 74 3b 0a 20 20 69 66 28  ].pSelect;.  if(
30dc0 20 70 53 75 62 3d 3d 30 20 29 20 72 65 74 75 72   pSub==0 ) retur
30dd0 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  n 0;            
30de0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
30df0 2a 20 54 68 65 20 46 52 4f 4d 20 69 73 20 61 20  * The FROM is a 
30e00 73 75 62 71 75 65 72 79 20 2a 2f 0a 20 20 69 66  subquery */.  if
30e10 28 20 70 53 75 62 2d 3e 70 50 72 69 6f 72 3d 3d  ( pSub->pPrior==
30e20 30 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20  0 ) return 0;   
30e30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30e40 2f 2a 20 4d 75 73 74 20 62 65 20 61 20 63 6f 6d  /* Must be a com
30e50 70 6f 75 6e 64 20 72 79 20 2a 2f 0a 20 20 64 6f  pound ry */.  do
30e60 7b 0a 20 20 20 20 69 66 28 20 70 53 75 62 2d 3e  {.    if( pSub->
30e70 6f 70 21 3d 54 4b 5f 41 4c 4c 20 26 26 20 70 53  op!=TK_ALL && pS
30e80 75 62 2d 3e 70 50 72 69 6f 72 20 29 20 72 65 74  ub->pPrior ) ret
30e90 75 72 6e 20 30 3b 20 20 2f 2a 20 4d 75 73 74 20  urn 0;  /* Must 
30ea0 62 65 20 55 4e 49 4f 4e 20 41 4c 4c 20 2a 2f 0a  be UNION ALL */.
30eb0 20 20 20 20 69 66 28 20 70 53 75 62 2d 3e 70 57      if( pSub->pW
30ec0 68 65 72 65 20 29 20 72 65 74 75 72 6e 20 30 3b  here ) return 0;
30ed0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30ee0 20 20 20 20 20 20 2f 2a 20 4e 6f 20 57 48 45 52        /* No WHER
30ef0 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20  E clause */.    
30f00 69 66 28 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74  if( pSub->pLimit
30f10 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20   ) return 0;    
30f20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30f30 20 20 2f 2a 20 4e 6f 20 4c 49 4d 49 54 20 63 6c    /* No LIMIT cl
30f40 61 75 73 65 20 2a 2f 0a 20 20 20 20 69 66 28 20  ause */.    if( 
30f50 70 53 75 62 2d 3e 73 65 6c 46 6c 61 67 73 20 26  pSub->selFlags &
30f60 20 53 46 5f 41 67 67 72 65 67 61 74 65 20 29 20   SF_Aggregate ) 
30f70 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 2f 2a  return 0;     /*
30f80 20 4e 6f 74 20 61 6e 20 61 67 67 72 65 67 61 74   Not an aggregat
30f90 65 20 2a 2f 0a 20 20 20 20 70 53 75 62 20 3d 20  e */.    pSub = 
30fa0 70 53 75 62 2d 3e 70 50 72 69 6f 72 3b 20 20 20  pSub->pPrior;   
30fb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30fc0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
30fd0 70 65 61 74 20 6f 76 65 72 20 63 6f 6d 70 6f 75  peat over compou
30fe0 6e 64 20 2a 2f 0a 20 20 7d 77 68 69 6c 65 28 20  nd */.  }while( 
30ff0 70 53 75 62 20 29 3b 0a 0a 20 20 2f 2a 20 49 66  pSub );..  /* If
31000 20 77 65 20 72 65 61 63 68 20 74 68 69 73 20 70   we reach this p
31010 6f 69 6e 74 20 74 68 65 6e 20 69 74 20 69 73 20  oint then it is 
31020 4f 4b 20 74 6f 20 70 65 72 66 6f 72 6d 20 74 68  OK to perform th
31030 65 20 74 72 61 6e 73 66 6f 72 6d 61 74 69 6f 6e  e transformation
31040 20 2a 2f 0a 0a 20 20 64 62 20 3d 20 70 50 61 72   */..  db = pPar
31050 73 65 2d 3e 64 62 3b 0a 20 20 70 43 6f 75 6e 74  se->db;.  pCount
31060 20 3d 20 70 45 78 70 72 3b 0a 20 20 70 45 78 70   = pExpr;.  pExp
31070 72 20 3d 20 30 3b 0a 20 20 70 53 75 62 20 3d 20  r = 0;.  pSub = 
31080 70 2d 3e 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 53  p->pSrc->a[0].pS
31090 65 6c 65 63 74 3b 0a 20 20 70 2d 3e 70 53 72 63  elect;.  p->pSrc
310a0 2d 3e 61 5b 30 5d 2e 70 53 65 6c 65 63 74 20 3d  ->a[0].pSelect =
310b0 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 53 72 63   0;.  sqlite3Src
310c0 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70  ListDelete(db, p
310d0 2d 3e 70 53 72 63 29 3b 0a 20 20 70 2d 3e 70 53  ->pSrc);.  p->pS
310e0 72 63 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  rc = sqlite3DbMa
310f0 6c 6c 6f 63 5a 65 72 6f 28 70 50 61 72 73 65 2d  llocZero(pParse-
31100 3e 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70 2d 3e  >db, sizeof(*p->
31110 70 53 72 63 29 29 3b 0a 20 20 77 68 69 6c 65 28  pSrc));.  while(
31120 20 70 53 75 62 20 29 7b 0a 20 20 20 20 45 78 70   pSub ){.    Exp
31130 72 20 2a 70 54 65 72 6d 3b 0a 20 20 20 20 70 50  r *pTerm;.    pP
31140 72 69 6f 72 20 3d 20 70 53 75 62 2d 3e 70 50 72  rior = pSub->pPr
31150 69 6f 72 3b 0a 20 20 20 20 70 53 75 62 2d 3e 70  ior;.    pSub->p
31160 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20 70  Prior = 0;.    p
31170 53 75 62 2d 3e 70 4e 65 78 74 20 3d 20 30 3b 0a  Sub->pNext = 0;.
31180 20 20 20 20 70 53 75 62 2d 3e 73 65 6c 46 6c 61      pSub->selFla
31190 67 73 20 7c 3d 20 53 46 5f 41 67 67 72 65 67 61  gs |= SF_Aggrega
311a0 74 65 3b 0a 20 20 20 20 70 53 75 62 2d 3e 73 65  te;.    pSub->se
311b0 6c 46 6c 61 67 73 20 26 3d 20 7e 53 46 5f 43 6f  lFlags &= ~SF_Co
311c0 6d 70 6f 75 6e 64 3b 0a 20 20 20 20 70 53 75 62  mpound;.    pSub
311d0 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 30  ->nSelectRow = 0
311e0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  ;.    sqlite3Exp
311f0 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20  rListDelete(db, 
31200 70 53 75 62 2d 3e 70 45 4c 69 73 74 29 3b 0a 20  pSub->pEList);. 
31210 20 20 20 70 54 65 72 6d 20 3d 20 70 50 72 69 6f     pTerm = pPrio
31220 72 20 3f 20 73 71 6c 69 74 65 33 45 78 70 72 44  r ? sqlite3ExprD
31230 75 70 28 64 62 2c 20 70 43 6f 75 6e 74 2c 20 30  up(db, pCount, 0
31240 29 20 3a 20 70 43 6f 75 6e 74 3b 0a 20 20 20 20  ) : pCount;.    
31250 70 53 75 62 2d 3e 70 45 4c 69 73 74 20 3d 20 73  pSub->pEList = s
31260 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70  qlite3ExprListAp
31270 70 65 6e 64 28 70 50 61 72 73 65 2c 20 30 2c 20  pend(pParse, 0, 
31280 70 54 65 72 6d 29 3b 0a 20 20 20 20 70 54 65 72  pTerm);.    pTer
31290 6d 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72  m = sqlite3PExpr
312a0 28 70 50 61 72 73 65 2c 20 54 4b 5f 53 45 4c 45  (pParse, TK_SELE
312b0 43 54 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73  CT, 0, 0);.    s
312c0 71 6c 69 74 65 33 50 45 78 70 72 41 64 64 53 65  qlite3PExprAddSe
312d0 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 54 65  lect(pParse, pTe
312e0 72 6d 2c 20 70 53 75 62 29 3b 0a 20 20 20 20 69  rm, pSub);.    i
312f0 66 28 20 70 45 78 70 72 3d 3d 30 20 29 7b 0a 20  f( pExpr==0 ){. 
31300 20 20 20 20 20 70 45 78 70 72 20 3d 20 70 54 65       pExpr = pTe
31310 72 6d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  rm;.    }else{. 
31320 20 20 20 20 20 70 45 78 70 72 20 3d 20 73 71 6c       pExpr = sql
31330 69 74 65 33 50 45 78 70 72 28 70 50 61 72 73 65  ite3PExpr(pParse
31340 2c 20 54 4b 5f 50 4c 55 53 2c 20 70 54 65 72 6d  , TK_PLUS, pTerm
31350 2c 20 70 45 78 70 72 29 3b 0a 20 20 20 20 7d 0a  , pExpr);.    }.
31360 20 20 20 20 70 53 75 62 20 3d 20 70 50 72 69 6f      pSub = pPrio
31370 72 3b 0a 20 20 7d 0a 20 20 70 2d 3e 70 45 4c 69  r;.  }.  p->pELi
31380 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 20 3d  st->a[0].pExpr =
31390 20 70 45 78 70 72 3b 0a 20 20 70 2d 3e 73 65 6c   pExpr;.  p->sel
313a0 46 6c 61 67 73 20 26 3d 20 7e 53 46 5f 41 67 67  Flags &= ~SF_Agg
313b0 72 65 67 61 74 65 3b 0a 0a 23 69 66 20 53 45 4c  regate;..#if SEL
313c0 45 43 54 54 52 41 43 45 5f 45 4e 41 42 4c 45 44  ECTTRACE_ENABLED
313d0 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 65  .  if( sqlite3Se
313e0 6c 65 63 74 54 72 61 63 65 20 26 20 30 78 34 30  lectTrace & 0x40
313f0 30 20 29 7b 0a 20 20 20 20 53 45 4c 45 43 54 54  0 ){.    SELECTT
31400 52 41 43 45 28 30 78 34 30 30 2c 70 50 61 72 73  RACE(0x400,pPars
31410 65 2c 70 2c 28 22 41 66 74 65 72 20 63 6f 75 6e  e,p,("After coun
31420 74 2d 6f 66 2d 76 69 65 77 20 6f 70 74 69 6d 69  t-of-view optimi
31430 7a 61 74 69 6f 6e 3a 5c 6e 22 29 29 3b 0a 20 20  zation:\n"));.  
31440 20 20 73 71 6c 69 74 65 33 54 72 65 65 56 69 65    sqlite3TreeVie
31450 77 53 65 6c 65 63 74 28 30 2c 20 70 2c 20 30 29  wSelect(0, p, 0)
31460 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72  ;.  }.#endif.  r
31470 65 74 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69  eturn 1;.}.#endi
31480 66 20 2f 2a 20 53 51 4c 49 54 45 5f 43 4f 55 4e  f /* SQLITE_COUN
31490 54 4f 46 56 49 45 57 5f 4f 50 54 49 4d 49 5a 41  TOFVIEW_OPTIMIZA
314a0 54 49 4f 4e 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 47  TION */../*.** G
314b0 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72  enerate code for
314c0 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74   the SELECT stat
314d0 65 6d 65 6e 74 20 67 69 76 65 6e 20 69 6e 20 74  ement given in t
314e0 68 65 20 70 20 61 72 67 75 6d 65 6e 74 2e 20 20  he p argument.  
314f0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 73 75 6c  .**.** The resul
31500 74 73 20 61 72 65 20 72 65 74 75 72 6e 65 64 20  ts are returned 
31510 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 74 68 65  according to the
31520 20 53 65 6c 65 63 74 44 65 73 74 20 73 74 72 75   SelectDest stru
31530 63 74 75 72 65 2e 0a 2a 2a 20 53 65 65 20 63 6f  cture..** See co
31540 6d 6d 65 6e 74 73 20 69 6e 20 73 71 6c 69 74 65  mments in sqlite
31550 49 6e 74 2e 68 20 66 6f 72 20 66 75 72 74 68 65  Int.h for furthe
31560 72 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a  r information..*
31570 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
31580 65 20 72 65 74 75 72 6e 73 20 74 68 65 20 6e 75  e returns the nu
31590 6d 62 65 72 20 6f 66 20 65 72 72 6f 72 73 2e 20  mber of errors. 
315a0 20 49 66 20 61 6e 79 20 65 72 72 6f 72 73 20 61   If any errors a
315b0 72 65 0a 2a 2a 20 65 6e 63 6f 75 6e 74 65 72 65  re.** encountere
315c0 64 2c 20 74 68 65 6e 20 61 6e 20 61 70 70 72 6f  d, then an appro
315d0 70 72 69 61 74 65 20 65 72 72 6f 72 20 6d 65 73  priate error mes
315e0 73 61 67 65 20 69 73 20 6c 65 66 74 20 69 6e 0a  sage is left in.
315f0 2a 2a 20 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d  ** pParse->zErrM
31600 73 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  sg..**.** This r
31610 6f 75 74 69 6e 65 20 64 6f 65 73 20 4e 4f 54 20  outine does NOT 
31620 66 72 65 65 20 74 68 65 20 53 65 6c 65 63 74 20  free the Select 
31630 73 74 72 75 63 74 75 72 65 20 70 61 73 73 65 64  structure passed
31640 20 69 6e 2e 20 20 54 68 65 0a 2a 2a 20 63 61 6c   in.  The.** cal
31650 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 6e 65  ling function ne
31660 65 64 73 20 74 6f 20 64 6f 20 74 68 61 74 2e 0a  eds to do that..
31670 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 53 65  */.int sqlite3Se
31680 6c 65 63 74 28 0a 20 20 50 61 72 73 65 20 2a 70  lect(.  Parse *p
31690 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 2f  Parse,         /
316a0 2a 20 54 68 65 20 70 61 72 73 65 72 20 63 6f 6e  * The parser con
316b0 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74  text */.  Select
316c0 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
316d0 20 2f 2a 20 54 68 65 20 53 45 4c 45 43 54 20 73   /* The SELECT s
316e0 74 61 74 65 6d 65 6e 74 20 62 65 69 6e 67 20 63  tatement being c
316f0 6f 64 65 64 2e 20 2a 2f 0a 20 20 53 65 6c 65 63  oded. */.  Selec
31700 74 44 65 73 74 20 2a 70 44 65 73 74 20 20 20 20  tDest *pDest    
31710 20 20 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f 20    /* What to do 
31720 77 69 74 68 20 74 68 65 20 71 75 65 72 79 20 72  with the query r
31730 65 73 75 6c 74 73 20 2a 2f 0a 29 7b 0a 20 20 69  esults */.){.  i
31740 6e 74 20 69 2c 20 6a 3b 20 20 20 20 20 20 20 20  nt i, j;        
31750 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
31760 75 6e 74 65 72 73 20 2a 2f 0a 20 20 57 68 65 72  unters */.  Wher
31770 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 3b 20 20  eInfo *pWInfo;  
31780 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 66 72 6f     /* Return fro
31790 6d 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65  m sqlite3WhereBe
317a0 67 69 6e 28 29 20 2a 2f 0a 20 20 56 64 62 65 20  gin() */.  Vdbe 
317b0 2a 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  *v;             
317c0 20 20 2f 2a 20 54 68 65 20 76 69 72 74 75 61 6c    /* The virtual
317d0 20 6d 61 63 68 69 6e 65 20 75 6e 64 65 72 20 63   machine under c
317e0 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20  onstruction */. 
317f0 20 69 6e 74 20 69 73 41 67 67 3b 20 20 20 20 20   int isAgg;     
31800 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
31810 66 6f 72 20 73 65 6c 65 63 74 20 6c 69 73 74 73  for select lists
31820 20 6c 69 6b 65 20 22 63 6f 75 6e 74 28 2a 29 22   like "count(*)"
31830 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
31840 70 45 4c 69 73 74 20 3d 20 30 3b 20 20 2f 2a 20  pEList = 0;  /* 
31850 4c 69 73 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20  List of columns 
31860 74 6f 20 65 78 74 72 61 63 74 2e 20 2a 2f 0a 20  to extract. */. 
31870 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69   SrcList *pTabLi
31880 73 74 3b 20 20 20 20 20 2f 2a 20 4c 69 73 74 20  st;     /* List 
31890 6f 66 20 74 61 62 6c 65 73 20 74 6f 20 73 65 6c  of tables to sel
318a0 65 63 74 20 66 72 6f 6d 20 2a 2f 0a 20 20 45 78  ect from */.  Ex
318b0 70 72 20 2a 70 57 68 65 72 65 3b 20 20 20 20 20  pr *pWhere;     
318c0 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52       /* The WHER
318d0 45 20 63 6c 61 75 73 65 2e 20 20 4d 61 79 20 62  E clause.  May b
318e0 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78 70 72  e NULL */.  Expr
318f0 4c 69 73 74 20 2a 70 47 72 6f 75 70 42 79 3b 20  List *pGroupBy; 
31900 20 20 20 2f 2a 20 54 68 65 20 47 52 4f 55 50 20     /* The GROUP 
31910 42 59 20 63 6c 61 75 73 65 2e 20 20 4d 61 79 20  BY clause.  May 
31920 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78 70  be NULL */.  Exp
31930 72 20 2a 70 48 61 76 69 6e 67 3b 20 20 20 20 20  r *pHaving;     
31940 20 20 20 20 2f 2a 20 54 68 65 20 48 41 56 49 4e      /* The HAVIN
31950 47 20 63 6c 61 75 73 65 2e 20 20 4d 61 79 20 62  G clause.  May b
31960 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 69 6e 74 20  e NULL */.  int 
31970 72 63 20 3d 20 31 3b 20 20 20 20 20 20 20 20 20  rc = 1;         
31980 20 20 20 2f 2a 20 56 61 6c 75 65 20 74 6f 20 72     /* Value to r
31990 65 74 75 72 6e 20 66 72 6f 6d 20 74 68 69 73 20  eturn from this 
319a0 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 44 69  function */.  Di
319b0 73 74 69 6e 63 74 43 74 78 20 73 44 69 73 74 69  stinctCtx sDisti
319c0 6e 63 74 3b 20 2f 2a 20 49 6e 66 6f 20 6f 6e 20  nct; /* Info on 
319d0 68 6f 77 20 74 6f 20 63 6f 64 65 20 74 68 65 20  how to code the 
319e0 44 49 53 54 49 4e 43 54 20 6b 65 79 77 6f 72 64  DISTINCT keyword
319f0 20 2a 2f 0a 20 20 53 6f 72 74 43 74 78 20 73 53   */.  SortCtx sS
31a00 6f 72 74 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  ort;         /* 
31a10 49 6e 66 6f 20 6f 6e 20 68 6f 77 20 74 6f 20 63  Info on how to c
31a20 6f 64 65 20 74 68 65 20 4f 52 44 45 52 20 42 59  ode the ORDER BY
31a30 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 41 67 67   clause */.  Agg
31a40 49 6e 66 6f 20 73 41 67 67 49 6e 66 6f 3b 20 20  Info sAggInfo;  
31a50 20 20 20 20 2f 2a 20 49 6e 66 6f 72 6d 61 74 69      /* Informati
31a60 6f 6e 20 75 73 65 64 20 62 79 20 61 67 67 72 65  on used by aggre
31a70 67 61 74 65 20 71 75 65 72 69 65 73 20 2a 2f 0a  gate queries */.
31a80 20 20 69 6e 74 20 69 45 6e 64 3b 20 20 20 20 20    int iEnd;     
31a90 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72           /* Addr
31aa0 65 73 73 20 6f 66 20 74 68 65 20 65 6e 64 20 6f  ess of the end o
31ab0 66 20 74 68 65 20 71 75 65 72 79 20 2a 2f 0a 20  f the query */. 
31ac0 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 20 20 20   sqlite3 *db;   
31ad0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64          /* The d
31ae0 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
31af0 6f 6e 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  on */.  ExprList
31b00 20 2a 70 4d 69 6e 4d 61 78 4f 72 64 65 72 42 79   *pMinMaxOrderBy
31b10 20 3d 20 30 3b 20 20 2f 2a 20 41 64 64 65 64 20   = 0;  /* Added 
31b20 4f 52 44 45 52 20 42 59 20 66 6f 72 20 6d 69 6e  ORDER BY for min
31b30 2f 6d 61 78 20 71 75 65 72 69 65 73 20 2a 2f 0a  /max queries */.
31b40 20 20 75 38 20 6d 69 6e 4d 61 78 46 6c 61 67 3b    u8 minMaxFlag;
31b50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31b60 20 2f 2a 20 46 6c 61 67 20 66 6f 72 20 6d 69 6e   /* Flag for min
31b70 2f 6d 61 78 20 71 75 65 72 69 65 73 20 2a 2f 0a  /max queries */.
31b80 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  .  db = pParse->
31b90 64 62 3b 0a 20 20 76 20 3d 20 73 71 6c 69 74 65  db;.  v = sqlite
31ba0 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  3GetVdbe(pParse)
31bb0 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 7c 7c 20  ;.  if( p==0 || 
31bc0 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
31bd0 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72 72   || pParse->nErr
31be0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 31   ){.    return 1
31bf0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c 69  ;.  }.  if( sqli
31c00 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61  te3AuthCheck(pPa
31c10 72 73 65 2c 20 53 51 4c 49 54 45 5f 53 45 4c 45  rse, SQLITE_SELE
31c20 43 54 2c 20 30 2c 20 30 2c 20 30 29 20 29 20 72  CT, 0, 0, 0) ) r
31c30 65 74 75 72 6e 20 31 3b 0a 20 20 6d 65 6d 73 65  eturn 1;.  memse
31c40 74 28 26 73 41 67 67 49 6e 66 6f 2c 20 30 2c 20  t(&sAggInfo, 0, 
31c50 73 69 7a 65 6f 66 28 73 41 67 67 49 6e 66 6f 29  sizeof(sAggInfo)
31c60 29 3b 0a 23 69 66 20 53 45 4c 45 43 54 54 52 41  );.#if SELECTTRA
31c70 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20 53 45 4c  CE_ENABLED.  SEL
31c80 45 43 54 54 52 41 43 45 28 31 2c 70 50 61 72 73  ECTTRACE(1,pPars
31c90 65 2c 70 2c 20 28 22 62 65 67 69 6e 20 70 72 6f  e,p, ("begin pro
31ca0 63 65 73 73 69 6e 67 3a 5c 6e 22 2c 20 70 50 61  cessing:\n", pPa
31cb0 72 73 65 2d 3e 61 64 64 72 45 78 70 6c 61 69 6e  rse->addrExplain
31cc0 29 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65  ));.  if( sqlite
31cd0 33 53 65 6c 65 63 74 54 72 61 63 65 20 26 20 30  3SelectTrace & 0
31ce0 78 31 30 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  x100 ){.    sqli
31cf0 74 65 33 54 72 65 65 56 69 65 77 53 65 6c 65 63  te3TreeViewSelec
31d00 74 28 30 2c 20 70 2c 20 30 29 3b 0a 20 20 7d 0a  t(0, p, 0);.  }.
31d10 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74  #endif..  assert
31d20 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30  ( p->pOrderBy==0
31d30 20 7c 7c 20 70 44 65 73 74 2d 3e 65 44 65 73 74   || pDest->eDest
31d40 21 3d 53 52 54 5f 44 69 73 74 46 69 66 6f 20 29  !=SRT_DistFifo )
31d50 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70  ;.  assert( p->p
31d60 4f 72 64 65 72 42 79 3d 3d 30 20 7c 7c 20 70 44  OrderBy==0 || pD
31d70 65 73 74 2d 3e 65 44 65 73 74 21 3d 53 52 54 5f  est->eDest!=SRT_
31d80 46 69 66 6f 20 29 3b 0a 20 20 61 73 73 65 72 74  Fifo );.  assert
31d90 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30  ( p->pOrderBy==0
31da0 20 7c 7c 20 70 44 65 73 74 2d 3e 65 44 65 73 74   || pDest->eDest
31db0 21 3d 53 52 54 5f 44 69 73 74 51 75 65 75 65 20  !=SRT_DistQueue 
31dc0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
31dd0 70 4f 72 64 65 72 42 79 3d 3d 30 20 7c 7c 20 70  pOrderBy==0 || p
31de0 44 65 73 74 2d 3e 65 44 65 73 74 21 3d 53 52 54  Dest->eDest!=SRT
31df0 5f 51 75 65 75 65 20 29 3b 0a 20 20 69 66 28 20  _Queue );.  if( 
31e00 49 67 6e 6f 72 61 62 6c 65 4f 72 64 65 72 62 79  IgnorableOrderby
31e10 28 70 44 65 73 74 29 20 29 7b 0a 20 20 20 20 61  (pDest) ){.    a
31e20 73 73 65 72 74 28 70 44 65 73 74 2d 3e 65 44 65  ssert(pDest->eDe
31e30 73 74 3d 3d 53 52 54 5f 45 78 69 73 74 73 20 7c  st==SRT_Exists |
31e40 7c 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d  | pDest->eDest==
31e50 53 52 54 5f 55 6e 69 6f 6e 20 7c 7c 20 0a 20 20  SRT_Union || .  
31e60 20 20 20 20 20 20 20 20 20 70 44 65 73 74 2d 3e           pDest->
31e70 65 44 65 73 74 3d 3d 53 52 54 5f 45 78 63 65 70  eDest==SRT_Excep
31e80 74 20 7c 7c 20 70 44 65 73 74 2d 3e 65 44 65 73  t || pDest->eDes
31e90 74 3d 3d 53 52 54 5f 44 69 73 63 61 72 64 20 7c  t==SRT_Discard |
31ea0 7c 0a 20 20 20 20 20 20 20 20 20 20 20 70 44 65  |.           pDe
31eb0 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 51  st->eDest==SRT_Q
31ec0 75 65 75 65 20 20 7c 7c 20 70 44 65 73 74 2d 3e  ueue  || pDest->
31ed0 65 44 65 73 74 3d 3d 53 52 54 5f 44 69 73 74 46  eDest==SRT_DistF
31ee0 69 66 6f 20 7c 7c 0a 20 20 20 20 20 20 20 20 20  ifo ||.         
31ef0 20 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d    pDest->eDest==
31f00 53 52 54 5f 44 69 73 74 51 75 65 75 65 20 7c 7c  SRT_DistQueue ||
31f10 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53   pDest->eDest==S
31f20 52 54 5f 46 69 66 6f 29 3b 0a 20 20 20 20 2f 2a  RT_Fifo);.    /*
31f30 20 49 66 20 4f 52 44 45 52 20 42 59 20 6d 61 6b   If ORDER BY mak
31f40 65 73 20 6e 6f 20 64 69 66 66 65 72 65 6e 63 65  es no difference
31f50 20 69 6e 20 74 68 65 20 6f 75 74 70 75 74 20 74   in the output t
31f60 68 65 6e 20 6e 65 69 74 68 65 72 20 64 6f 65 73  hen neither does
31f70 0a 20 20 20 20 2a 2a 20 44 49 53 54 49 4e 43 54  .    ** DISTINCT
31f80 20 73 6f 20 69 74 20 63 61 6e 20 62 65 20 72 65   so it can be re
31f90 6d 6f 76 65 64 20 74 6f 6f 2e 20 2a 2f 0a 20 20  moved too. */.  
31fa0 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73    sqlite3ExprLis
31fb0 74 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70  tDelete(db, p->p
31fc0 4f 72 64 65 72 42 79 29 3b 0a 20 20 20 20 70 2d  OrderBy);.    p-
31fd0 3e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20  >pOrderBy = 0;. 
31fe0 20 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26     p->selFlags &
31ff0 3d 20 7e 53 46 5f 44 69 73 74 69 6e 63 74 3b 0a  = ~SF_Distinct;.
32000 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 53 65 6c    }.  sqlite3Sel
32010 65 63 74 50 72 65 70 28 70 50 61 72 73 65 2c 20  ectPrep(pParse, 
32020 70 2c 20 30 29 3b 0a 20 20 69 66 28 20 70 50 61  p, 0);.  if( pPa
32030 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 64 62 2d  rse->nErr || db-
32040 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b  >mallocFailed ){
32050 0a 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74  .    goto select
32060 5f 65 6e 64 3b 0a 20 20 7d 0a 20 20 61 73 73 65  _end;.  }.  asse
32070 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 21 3d 30  rt( p->pEList!=0
32080 20 29 3b 0a 23 69 66 20 53 45 4c 45 43 54 54 52   );.#if SELECTTR
32090 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20 69 66  ACE_ENABLED.  if
320a0 28 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 54  ( sqlite3SelectT
320b0 72 61 63 65 20 26 20 30 78 31 30 34 20 29 7b 0a  race & 0x104 ){.
320c0 20 20 20 20 53 45 4c 45 43 54 54 52 41 43 45 28      SELECTTRACE(
320d0 30 78 31 30 34 2c 70 50 61 72 73 65 2c 70 2c 20  0x104,pParse,p, 
320e0 28 22 61 66 74 65 72 20 6e 61 6d 65 20 72 65 73  ("after name res
320f0 6f 6c 75 74 69 6f 6e 3a 5c 6e 22 29 29 3b 0a 20  olution:\n"));. 
32100 20 20 20 73 71 6c 69 74 65 33 54 72 65 65 56 69     sqlite3TreeVi
32110 65 77 53 65 6c 65 63 74 28 30 2c 20 70 2c 20 30  ewSelect(0, p, 0
32120 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  );.  }.#endif.. 
32130 20 69 66 28 20 70 44 65 73 74 2d 3e 65 44 65 73   if( pDest->eDes
32140 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20 29 7b  t==SRT_Output ){
32150 0a 20 20 20 20 67 65 6e 65 72 61 74 65 43 6f 6c  .    generateCol
32160 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73 65 2c  umnNames(pParse,
32170 20 70 29 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65   p);.  }..#ifnde
32180 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 49  f SQLITE_OMIT_WI
32190 4e 44 4f 57 46 55 4e 43 0a 20 20 69 66 28 20 73  NDOWFUNC.  if( s
321a0 71 6c 69 74 65 33 57 69 6e 64 6f 77 52 65 77 72  qlite3WindowRewr
321b0 69 74 65 28 70 50 61 72 73 65 2c 20 70 29 20 29  ite(pParse, p) )
321c0 7b 0a 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63  {.    goto selec
321d0 74 5f 65 6e 64 3b 0a 20 20 7d 0a 23 69 66 20 53  t_end;.  }.#if S
321e0 45 4c 45 43 54 54 52 41 43 45 5f 45 4e 41 42 4c  ELECTTRACE_ENABL
321f0 45 44 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  ED.  if( sqlite3
32200 53 65 6c 65 63 74 54 72 61 63 65 20 26 20 30 78  SelectTrace & 0x
32210 31 30 38 20 29 7b 0a 20 20 20 20 53 45 4c 45 43  108 ){.    SELEC
32220 54 54 52 41 43 45 28 30 78 31 30 34 2c 70 50 61  TTRACE(0x104,pPa
32230 72 73 65 2c 70 2c 20 28 22 61 66 74 65 72 20 77  rse,p, ("after w
32240 69 6e 64 6f 77 20 72 65 77 72 69 74 65 3a 5c 6e  indow rewrite:\n
32250 22 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  "));.    sqlite3
32260 54 72 65 65 56 69 65 77 53 65 6c 65 63 74 28 30  TreeViewSelect(0
32270 2c 20 70 2c 20 30 29 3b 0a 20 20 7d 0a 23 65 6e  , p, 0);.  }.#en
32280 64 69 66 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  dif.#endif /* SQ
32290 4c 49 54 45 5f 4f 4d 49 54 5f 57 49 4e 44 4f 57  LITE_OMIT_WINDOW
322a0 46 55 4e 43 20 2a 2f 0a 20 20 70 54 61 62 4c 69  FUNC */.  pTabLi
322b0 73 74 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20  st = p->pSrc;.  
322c0 69 73 41 67 67 20 3d 20 28 70 2d 3e 73 65 6c 46  isAgg = (p->selF
322d0 6c 61 67 73 20 26 20 53 46 5f 41 67 67 72 65 67  lags & SF_Aggreg
322e0 61 74 65 29 21 3d 30 3b 0a 20 20 6d 65 6d 73 65  ate)!=0;.  memse
322f0 74 28 26 73 53 6f 72 74 2c 20 30 2c 20 73 69 7a  t(&sSort, 0, siz
32300 65 6f 66 28 73 53 6f 72 74 29 29 3b 0a 20 20 73  eof(sSort));.  s
32310 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 20 3d 20  Sort.pOrderBy = 
32320 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 0a 20 20  p->pOrderBy;..  
32330 2f 2a 20 54 72 79 20 74 6f 20 76 61 72 69 6f 75  /* Try to variou
32340 73 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20  s optimizations 
32350 28 66 6c 61 74 74 65 6e 69 6e 67 20 73 75 62 71  (flattening subq
32360 75 65 72 69 65 73 2c 20 61 6e 64 20 73 74 72 65  ueries, and stre
32370 6e 67 74 68 0a 20 20 2a 2a 20 72 65 64 75 63 74  ngth.  ** reduct
32380 69 6f 6e 20 6f 66 20 6a 6f 69 6e 20 6f 70 65 72  ion of join oper
32390 61 74 6f 72 73 29 20 69 6e 20 74 68 65 20 46 52  ators) in the FR
323a0 4f 4d 20 63 6c 61 75 73 65 20 75 70 20 69 6e 74  OM clause up int
323b0 6f 20 74 68 65 20 6d 61 69 6e 20 71 75 65 72 79  o the main query
323c0 0a 20 20 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e  .  */.#if !defin
323d0 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ed(SQLITE_OMIT_S
323e0 55 42 51 55 45 52 59 29 20 7c 7c 20 21 64 65 66  UBQUERY) || !def
323f0 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
32400 5f 56 49 45 57 29 0a 20 20 66 6f 72 28 69 3d 30  _VIEW).  for(i=0
32410 3b 20 21 70 2d 3e 70 50 72 69 6f 72 20 26 26 20  ; !p->pPrior && 
32420 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63  i<pTabList->nSrc
32430 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75  ; i++){.    stru
32440 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
32450 2a 70 49 74 65 6d 20 3d 20 26 70 54 61 62 4c 69  *pItem = &pTabLi
32460 73 74 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 53 65  st->a[i];.    Se
32470 6c 65 63 74 20 2a 70 53 75 62 20 3d 20 70 49 74  lect *pSub = pIt
32480 65 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a 20 20 20  em->pSelect;.   
32490 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70   Table *pTab = p
324a0 49 74 65 6d 2d 3e 70 54 61 62 3b 0a 0a 20 20 20  Item->pTab;..   
324b0 20 2f 2a 20 43 6f 6e 76 65 72 74 20 4c 45 46 54   /* Convert LEFT
324c0 20 4a 4f 49 4e 20 69 6e 74 6f 20 4a 4f 49 4e 20   JOIN into JOIN 
324d0 69 66 20 74 68 65 72 65 20 61 72 65 20 74 65 72  if there are ter
324e0 6d 73 20 6f 66 20 74 68 65 20 72 69 67 68 74 20  ms of the right 
324f0 74 61 62 6c 65 0a 20 20 20 20 2a 2a 20 6f 66 20  table.    ** of 
32500 74 68 65 20 4c 45 46 54 20 4a 4f 49 4e 20 75 73  the LEFT JOIN us
32510 65 64 20 69 6e 20 74 68 65 20 57 48 45 52 45 20  ed in the WHERE 
32520 63 6c 61 75 73 65 2e 0a 20 20 20 20 2a 2f 0a 20  clause..    */. 
32530 20 20 20 69 66 28 20 28 70 49 74 65 6d 2d 3e 66     if( (pItem->f
32540 67 2e 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f  g.jointype & JT_
32550 4c 45 46 54 29 21 3d 30 0a 20 20 20 20 20 26 26  LEFT)!=0.     &&
32560 20 73 71 6c 69 74 65 33 45 78 70 72 49 6d 70 6c   sqlite3ExprImpl
32570 69 65 73 4e 6f 6e 4e 75 6c 6c 52 6f 77 28 70 2d  iesNonNullRow(p-
32580 3e 70 57 68 65 72 65 2c 20 70 49 74 65 6d 2d 3e  >pWhere, pItem->
32590 69 43 75 72 73 6f 72 29 0a 20 20 20 20 20 26 26  iCursor).     &&
325a0 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 45 6e 61   OptimizationEna
325b0 62 6c 65 64 28 64 62 2c 20 53 51 4c 49 54 45 5f  bled(db, SQLITE_
325c0 53 69 6d 70 6c 69 66 79 4a 6f 69 6e 29 0a 20 20  SimplifyJoin).  
325d0 20 20 29 7b 0a 20 20 20 20 20 20 53 45 4c 45 43    ){.      SELEC
325e0 54 54 52 41 43 45 28 30 78 31 30 30 2c 70 50 61  TTRACE(0x100,pPa
325f0 72 73 65 2c 70 2c 0a 20 20 20 20 20 20 20 20 20  rse,p,.         
32600 20 20 20 20 20 20 20 28 22 4c 45 46 54 2d 4a 4f         ("LEFT-JO
32610 49 4e 20 73 69 6d 70 6c 69 66 69 65 73 20 74 6f  IN simplifies to
32620 20 4a 4f 49 4e 20 6f 6e 20 74 65 72 6d 20 25 64   JOIN on term %d
32630 5c 6e 22 2c 69 29 29 3b 0a 20 20 20 20 20 20 70  \n",i));.      p
32640 49 74 65 6d 2d 3e 66 67 2e 6a 6f 69 6e 74 79 70  Item->fg.jointyp
32650 65 20 26 3d 20 7e 28 4a 54 5f 4c 45 46 54 7c 4a  e &= ~(JT_LEFT|J
32660 54 5f 4f 55 54 45 52 29 3b 0a 20 20 20 20 20 20  T_OUTER);.      
32670 75 6e 73 65 74 4a 6f 69 6e 45 78 70 72 28 70 2d  unsetJoinExpr(p-
32680 3e 70 57 68 65 72 65 2c 20 70 49 74 65 6d 2d 3e  >pWhere, pItem->
32690 69 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 7d 0a  iCursor);.    }.
326a0 0a 20 20 20 20 2f 2a 20 4e 6f 20 66 75 74 68 65  .    /* No futhe
326b0 72 20 61 63 74 69 6f 6e 20 69 66 20 74 68 69 73  r action if this
326c0 20 74 65 72 6d 20 6f 66 20 74 68 65 20 46 52 4f   term of the FRO
326d0 4d 20 63 6c 61 75 73 65 20 69 73 20 6e 6f 20 61  M clause is no a
326e0 20 73 75 62 71 75 65 72 79 20 2a 2f 0a 20 20 20   subquery */.   
326f0 20 69 66 28 20 70 53 75 62 3d 3d 30 20 29 20 63   if( pSub==0 ) c
32700 6f 6e 74 69 6e 75 65 3b 0a 0a 20 20 20 20 2f 2a  ontinue;..    /*
32710 20 43 61 74 63 68 20 6d 69 73 6d 61 74 63 68 20   Catch mismatch 
32720 69 6e 20 74 68 65 20 64 65 63 6c 61 72 65 64 20  in the declared 
32730 63 6f 6c 75 6d 6e 73 20 6f 66 20 61 20 76 69 65  columns of a vie
32740 77 20 61 6e 64 20 74 68 65 20 6e 75 6d 62 65 72  w and the number
32750 20 6f 66 0a 20 20 20 20 2a 2a 20 63 6f 6c 75 6d   of.    ** colum
32760 6e 73 20 69 6e 20 74 68 65 20 53 45 4c 45 43 54  ns in the SELECT
32770 20 6f 6e 20 74 68 65 20 52 48 53 20 2a 2f 0a 20   on the RHS */. 
32780 20 20 20 69 66 28 20 70 54 61 62 2d 3e 6e 43 6f     if( pTab->nCo
32790 6c 21 3d 70 53 75 62 2d 3e 70 45 4c 69 73 74 2d  l!=pSub->pEList-
327a0 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20  >nExpr ){.      
327b0 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
327c0 70 50 61 72 73 65 2c 20 22 65 78 70 65 63 74 65  pParse, "expecte
327d0 64 20 25 64 20 63 6f 6c 75 6d 6e 73 20 66 6f 72  d %d columns for
327e0 20 27 25 73 27 20 62 75 74 20 67 6f 74 20 25 64   '%s' but got %d
327f0 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
32800 20 20 20 20 20 20 20 20 20 70 54 61 62 2d 3e 6e           pTab->n
32810 43 6f 6c 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  Col, pTab->zName
32820 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73 74 2d 3e  , pSub->pEList->
32830 6e 45 78 70 72 29 3b 0a 20 20 20 20 20 20 67 6f  nExpr);.      go
32840 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20  to select_end;. 
32850 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 6f 20     }..    /* Do 
32860 6e 6f 74 20 74 72 79 20 74 6f 20 66 6c 61 74 74  not try to flatt
32870 65 6e 20 61 6e 20 61 67 67 72 65 67 61 74 65 20  en an aggregate 
32880 73 75 62 71 75 65 72 79 2e 0a 20 20 20 20 2a 2a  subquery..    **
32890 0a 20 20 20 20 2a 2a 20 46 6c 61 74 74 65 6e 69  .    ** Flatteni
328a0 6e 67 20 61 6e 20 61 67 67 72 65 67 61 74 65 20  ng an aggregate 
328b0 73 75 62 71 75 65 72 79 20 69 73 20 6f 6e 6c 79  subquery is only
328c0 20 70 6f 73 73 69 62 6c 65 20 69 66 20 74 68 65   possible if the
328d0 20 6f 75 74 65 72 20 71 75 65 72 79 0a 20 20 20   outer query.   
328e0 20 2a 2a 20 69 73 20 6e 6f 74 20 61 20 6a 6f 69   ** is not a joi
328f0 6e 2e 20 20 42 75 74 20 69 66 20 74 68 65 20 6f  n.  But if the o
32900 75 74 65 72 20 71 75 65 72 79 20 69 73 20 6e 6f  uter query is no
32910 74 20 61 20 6a 6f 69 6e 2c 20 74 68 65 6e 20 74  t a join, then t
32920 68 65 20 73 75 62 71 75 65 72 79 0a 20 20 20 20  he subquery.    
32930 2a 2a 20 77 69 6c 6c 20 62 65 20 69 6d 70 6c 65  ** will be imple
32940 6d 65 6e 74 65 64 20 61 73 20 61 20 63 6f 2d 72  mented as a co-r
32950 6f 75 74 69 6e 65 20 61 6e 64 20 74 68 65 72 65  outine and there
32960 20 69 73 20 6e 6f 20 61 64 76 61 6e 74 61 67 65   is no advantage
32970 20 74 6f 0a 20 20 20 20 2a 2a 20 66 6c 61 74 74   to.    ** flatt
32980 65 6e 69 6e 67 20 69 6e 20 74 68 61 74 20 63 61  ening in that ca
32990 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  se..    */.    i
329a0 66 28 20 28 70 53 75 62 2d 3e 73 65 6c 46 6c 61  f( (pSub->selFla
329b0 67 73 20 26 20 53 46 5f 41 67 67 72 65 67 61 74  gs & SF_Aggregat
329c0 65 29 21 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65  e)!=0 ) continue
329d0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 53  ;.    assert( pS
329e0 75 62 2d 3e 70 47 72 6f 75 70 42 79 3d 3d 30 20  ub->pGroupBy==0 
329f0 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  );..    /* If th
32a00 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 63 6f  e outer query co
32a10 6e 74 61 69 6e 73 20 61 20 22 63 6f 6d 70 6c 65  ntains a "comple
32a20 78 22 20 72 65 73 75 6c 74 20 73 65 74 20 28 74  x" result set (t
32a30 68 61 74 20 69 73 2c 0a 20 20 20 20 2a 2a 20 69  hat is,.    ** i
32a40 66 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  f the result set
32a50 20 6f 66 20 74 68 65 20 6f 75 74 65 72 20 71 75   of the outer qu
32a60 65 72 79 20 75 73 65 73 20 66 75 6e 63 74 69 6f  ery uses functio
32a70 6e 73 20 6f 72 20 73 75 62 71 75 65 72 69 65 73  ns or subqueries
32a80 29 0a 20 20 20 20 2a 2a 20 61 6e 64 20 69 66 20  ).    ** and if 
32a90 74 68 65 20 73 75 62 71 75 65 72 79 20 63 6f 6e  the subquery con
32aa0 74 61 69 6e 73 20 61 6e 20 4f 52 44 45 52 20 42  tains an ORDER B
32ab0 59 20 63 6c 61 75 73 65 20 61 6e 64 20 69 66 0a  Y clause and if.
32ac0 20 20 20 20 2a 2a 20 69 74 20 77 69 6c 6c 20 62      ** it will b
32ad0 65 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 61 73  e implemented as
32ae0 20 61 20 63 6f 2d 72 6f 75 74 69 6e 65 2c 20 74   a co-routine, t
32af0 68 65 6e 20 64 6f 20 6e 6f 74 20 66 6c 61 74 74  hen do not flatt
32b00 65 6e 2e 20 20 54 68 69 73 0a 20 20 20 20 2a 2a  en.  This.    **
32b10 20 72 65 73 74 72 69 63 74 69 6f 6e 20 61 6c 6c   restriction all
32b20 6f 77 73 20 53 51 4c 20 63 6f 6e 73 74 72 75 63  ows SQL construc
32b30 74 73 20 6c 69 6b 65 20 74 68 69 73 3a 0a 20 20  ts like this:.  
32b40 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 53 45 4c    **.    **  SEL
32b50 45 43 54 20 65 78 70 65 6e 73 69 76 65 5f 66 75  ECT expensive_fu
32b60 6e 63 74 69 6f 6e 28 78 29 0a 20 20 20 20 2a 2a  nction(x).    **
32b70 20 20 20 20 46 52 4f 4d 20 28 53 45 4c 45 43 54      FROM (SELECT
32b80 20 78 20 46 52 4f 4d 20 74 61 62 20 4f 52 44 45   x FROM tab ORDE
32b90 52 20 42 59 20 79 20 4c 49 4d 49 54 20 31 30 29  R BY y LIMIT 10)
32ba0 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ;.    **.    ** 
32bb0 54 68 65 20 65 78 70 65 6e 73 69 76 65 5f 66 75  The expensive_fu
32bc0 6e 63 74 69 6f 6e 28 29 20 69 73 20 6f 6e 6c 79  nction() is only
32bd0 20 63 6f 6d 70 75 74 65 64 20 6f 6e 20 74 68 65   computed on the
32be0 20 31 30 20 72 6f 77 73 20 74 68 61 74 0a 20 20   10 rows that.  
32bf0 20 20 2a 2a 20 61 72 65 20 6f 75 74 70 75 74 2c    ** are output,
32c00 20 72 61 74 68 65 72 20 74 68 61 6e 20 65 76 65   rather than eve
32c10 72 79 20 72 6f 77 20 6f 66 20 74 68 65 20 74 61  ry row of the ta
32c20 62 6c 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ble..    **.    
32c30 2a 2a 20 54 68 65 20 72 65 71 75 69 72 65 6d 65  ** The requireme
32c40 6e 74 20 74 68 61 74 20 74 68 65 20 6f 75 74 65  nt that the oute
32c50 72 20 71 75 65 72 79 20 68 61 76 65 20 61 20 63  r query have a c
32c60 6f 6d 70 6c 65 78 20 72 65 73 75 6c 74 20 73 65  omplex result se
32c70 74 0a 20 20 20 20 2a 2a 20 6d 65 61 6e 73 20 74  t.    ** means t
32c80 68 61 74 20 66 6c 61 74 74 65 6e 69 6e 67 20 64  hat flattening d
32c90 6f 65 73 20 6f 63 63 75 72 20 6f 6e 20 73 69 6d  oes occur on sim
32ca0 70 6c 65 72 20 53 51 4c 20 63 6f 6e 73 74 72 61  pler SQL constra
32cb0 69 6e 74 73 20 77 69 74 68 6f 75 74 0a 20 20 20  ints without.   
32cc0 20 2a 2a 20 74 68 65 20 65 78 70 65 6e 73 69 76   ** the expensiv
32cd0 65 5f 66 75 6e 63 74 69 6f 6e 28 29 20 6c 69 6b  e_function() lik
32ce0 65 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  e:.    **.    **
32cf0 20 20 53 45 4c 45 43 54 20 78 20 46 52 4f 4d 20    SELECT x FROM 
32d00 28 53 45 4c 45 43 54 20 78 20 46 52 4f 4d 20 74  (SELECT x FROM t
32d10 61 62 20 4f 52 44 45 52 20 42 59 20 79 20 4c 49  ab ORDER BY y LI
32d20 4d 49 54 20 31 30 29 3b 0a 20 20 20 20 2a 2f 0a  MIT 10);.    */.
32d30 20 20 20 20 69 66 28 20 70 53 75 62 2d 3e 70 4f      if( pSub->pO
32d40 72 64 65 72 42 79 21 3d 30 0a 20 20 20 20 20 26  rderBy!=0.     &
32d50 26 20 69 3d 3d 30 0a 20 20 20 20 20 26 26 20 28  & i==0.     && (
32d60 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46  p->selFlags & SF
32d70 5f 43 6f 6d 70 6c 65 78 52 65 73 75 6c 74 29 21  _ComplexResult)!
32d80 3d 30 0a 20 20 20 20 20 26 26 20 28 70 54 61 62  =0.     && (pTab
32d90 4c 69 73 74 2d 3e 6e 53 72 63 3d 3d 31 0a 20 20  List->nSrc==1.  
32da0 20 20 20 20 20 20 20 7c 7c 20 28 70 54 61 62 4c         || (pTabL
32db0 69 73 74 2d 3e 61 5b 31 5d 2e 66 67 2e 6a 6f 69  ist->a[1].fg.joi
32dc0 6e 74 79 70 65 26 28 4a 54 5f 4c 45 46 54 7c 4a  ntype&(JT_LEFT|J
32dd0 54 5f 43 52 4f 53 53 29 29 21 3d 30 29 0a 20 20  T_CROSS))!=0).  
32de0 20 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 74 69    ){.      conti
32df0 6e 75 65 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  nue;.    }..    
32e00 69 66 28 20 66 6c 61 74 74 65 6e 53 75 62 71 75  if( flattenSubqu
32e10 65 72 79 28 70 50 61 72 73 65 2c 20 70 2c 20 69  ery(pParse, p, i
32e20 2c 20 69 73 41 67 67 29 20 29 7b 0a 20 20 20 20  , isAgg) ){.    
32e30 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45    if( pParse->nE
32e40 72 72 20 29 20 67 6f 74 6f 20 73 65 6c 65 63 74  rr ) goto select
32e50 5f 65 6e 64 3b 0a 20 20 20 20 20 20 2f 2a 20 54  _end;.      /* T
32e60 68 69 73 20 73 75 62 71 75 65 72 79 20 63 61 6e  his subquery can
32e70 20 62 65 20 61 62 73 6f 72 62 65 64 20 69 6e 74   be absorbed int
32e80 6f 20 69 74 73 20 70 61 72 65 6e 74 2e 20 2a 2f  o its parent. */
32e90 0a 20 20 20 20 20 20 69 20 3d 20 2d 31 3b 0a 20  .      i = -1;. 
32ea0 20 20 20 7d 0a 20 20 20 20 70 54 61 62 4c 69 73     }.    pTabLis
32eb0 74 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 20  t = p->pSrc;.   
32ec0 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   if( db->mallocF
32ed0 61 69 6c 65 64 20 29 20 67 6f 74 6f 20 73 65 6c  ailed ) goto sel
32ee0 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 69 66 28  ect_end;.    if(
32ef0 20 21 49 67 6e 6f 72 61 62 6c 65 4f 72 64 65 72   !IgnorableOrder
32f00 62 79 28 70 44 65 73 74 29 20 29 7b 0a 20 20 20  by(pDest) ){.   
32f10 20 20 20 73 53 6f 72 74 2e 70 4f 72 64 65 72 42     sSort.pOrderB
32f20 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b  y = p->pOrderBy;
32f30 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
32f40 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  f..#ifndef SQLIT
32f50 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f  E_OMIT_COMPOUND_
32f60 53 45 4c 45 43 54 0a 20 20 2f 2a 20 48 61 6e 64  SELECT.  /* Hand
32f70 6c 65 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45  le compound SELE
32f80 43 54 20 73 74 61 74 65 6d 65 6e 74 73 20 75 73  CT statements us
32f90 69 6e 67 20 74 68 65 20 73 65 70 61 72 61 74 65  ing the separate
32fa0 20 6d 75 6c 74 69 53 65 6c 65 63 74 28 29 0a 20   multiSelect(). 
32fb0 20 2a 2a 20 70 72 6f 63 65 64 75 72 65 2e 0a 20   ** procedure.. 
32fc0 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 50 72   */.  if( p->pPr
32fd0 69 6f 72 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ior ){.    rc = 
32fe0 6d 75 6c 74 69 53 65 6c 65 63 74 28 70 50 61 72  multiSelect(pPar
32ff0 73 65 2c 20 70 2c 20 70 44 65 73 74 29 3b 0a 23  se, p, pDest);.#
33000 69 66 20 53 45 4c 45 43 54 54 52 41 43 45 5f 45  if SELECTTRACE_E
33010 4e 41 42 4c 45 44 0a 20 20 20 20 53 45 4c 45 43  NABLED.    SELEC
33020 54 54 52 41 43 45 28 30 78 31 2c 70 50 61 72 73  TTRACE(0x1,pPars
33030 65 2c 70 2c 28 22 65 6e 64 20 63 6f 6d 70 6f 75  e,p,("end compou
33040 6e 64 2d 73 65 6c 65 63 74 20 70 72 6f 63 65 73  nd-select proces
33050 73 69 6e 67 5c 6e 22 29 29 3b 0a 20 20 20 20 69  sing\n"));.    i
33060 66 28 20 28 73 71 6c 69 74 65 33 53 65 6c 65 63  f( (sqlite3Selec
33070 74 54 72 61 63 65 20 26 20 30 78 32 30 30 30 29  tTrace & 0x2000)
33080 21 3d 30 20 26 26 20 45 78 70 6c 61 69 6e 51 75  !=0 && ExplainQu
33090 65 72 79 50 6c 61 6e 50 61 72 65 6e 74 28 70 50  eryPlanParent(pP
330a0 61 72 73 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20  arse)==0 ){.    
330b0 20 20 73 71 6c 69 74 65 33 54 72 65 65 56 69 65    sqlite3TreeVie
330c0 77 53 65 6c 65 63 74 28 30 2c 20 70 2c 20 30 29  wSelect(0, p, 0)
330d0 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
330e0 20 20 20 69 66 28 20 70 2d 3e 70 4e 65 78 74 3d     if( p->pNext=
330f0 3d 30 20 29 20 45 78 70 6c 61 69 6e 51 75 65 72  =0 ) ExplainQuer
33100 79 50 6c 61 6e 50 6f 70 28 70 50 61 72 73 65 29  yPlanPop(pParse)
33110 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  ;.    return rc;
33120 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  .  }.#endif..  /
33130 2a 20 44 6f 20 74 68 65 20 57 48 45 52 45 2d 63  * Do the WHERE-c
33140 6c 61 75 73 65 20 63 6f 6e 73 74 61 6e 74 20 70  lause constant p
33150 72 6f 70 61 67 61 74 69 6f 6e 20 6f 70 74 69 6d  ropagation optim
33160 69 7a 61 74 69 6f 6e 20 69 66 20 74 68 69 73 20  ization if this 
33170 69 73 0a 20 20 2a 2a 20 61 20 6a 6f 69 6e 2e 20  is.  ** a join. 
33180 20 4e 6f 20 6e 65 65 64 20 74 6f 20 73 70 65 65   No need to spee
33190 64 20 74 69 6d 65 20 6f 6e 20 74 68 69 73 20 6f  d time on this o
331a0 70 65 72 61 74 69 6f 6e 20 66 6f 72 20 6e 6f 6e  peration for non
331b0 2d 6a 6f 69 6e 20 71 75 65 72 69 65 73 0a 20 20  -join queries.  
331c0 2a 2a 20 61 73 20 74 68 65 20 65 71 75 69 76 61  ** as the equiva
331d0 6c 65 6e 74 20 6f 70 74 69 6d 69 7a 61 74 69 6f  lent optimizatio
331e0 6e 20 77 69 6c 6c 20 62 65 20 68 61 6e 64 6c 65  n will be handle
331f0 64 20 62 79 20 71 75 65 72 79 20 70 6c 61 6e 6e  d by query plann
33200 65 72 20 69 6e 0a 20 20 2a 2a 20 73 71 6c 69 74  er in.  ** sqlit
33210 65 33 57 68 65 72 65 42 65 67 69 6e 28 29 2e 0a  e3WhereBegin()..
33220 20 20 2a 2f 0a 20 20 69 66 28 20 70 54 61 62 4c    */.  if( pTabL
33230 69 73 74 2d 3e 6e 53 72 63 3e 31 0a 20 20 20 26  ist->nSrc>1.   &
33240 26 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 45 6e  & OptimizationEn
33250 61 62 6c 65 64 28 64 62 2c 20 53 51 4c 49 54 45  abled(db, SQLITE
33260 5f 50 72 6f 70 61 67 61 74 65 43 6f 6e 73 74 29  _PropagateConst)
33270 0a 20 20 20 26 26 20 70 72 6f 70 61 67 61 74 65  .   && propagate
33280 43 6f 6e 73 74 61 6e 74 73 28 70 50 61 72 73 65  Constants(pParse
33290 2c 20 70 29 0a 20 20 29 7b 0a 23 69 66 20 53 45  , p).  ){.#if SE
332a0 4c 45 43 54 54 52 41 43 45 5f 45 4e 41 42 4c 45  LECTTRACE_ENABLE
332b0 44 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  D.    if( sqlite
332c0 33 53 65 6c 65 63 74 54 72 61 63 65 20 26 20 30  3SelectTrace & 0
332d0 78 31 30 30 20 29 7b 0a 20 20 20 20 20 20 53 45  x100 ){.      SE
332e0 4c 45 43 54 54 52 41 43 45 28 30 78 31 30 30 2c  LECTTRACE(0x100,
332f0 70 50 61 72 73 65 2c 70 2c 28 22 41 66 74 65 72  pParse,p,("After
33300 20 63 6f 6e 73 74 61 6e 74 20 70 72 6f 70 61 67   constant propag
33310 61 74 69 6f 6e 3a 5c 6e 22 29 29 3b 0a 20 20 20  ation:\n"));.   
33320 20 20 20 73 71 6c 69 74 65 33 54 72 65 65 56 69     sqlite3TreeVi
33330 65 77 53 65 6c 65 63 74 28 30 2c 20 70 2c 20 30  ewSelect(0, p, 0
33340 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  );.    }.#endif.
33350 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 53 45 4c    }else{.    SEL
33360 45 43 54 54 52 41 43 45 28 30 78 31 30 30 2c 70  ECTTRACE(0x100,p
33370 50 61 72 73 65 2c 70 2c 28 22 43 6f 6e 73 74 61  Parse,p,("Consta
33380 6e 74 20 70 72 6f 70 61 67 61 74 69 6f 6e 20 6e  nt propagation n
33390 6f 74 20 68 65 6c 70 66 75 6c 5c 6e 22 29 29 3b  ot helpful\n"));
333a0 0a 20 20 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c  .  }..#ifdef SQL
333b0 49 54 45 5f 43 4f 55 4e 54 4f 46 56 49 45 57 5f  ITE_COUNTOFVIEW_
333c0 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 0a 20 20 69  OPTIMIZATION.  i
333d0 66 28 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 45  f( OptimizationE
333e0 6e 61 62 6c 65 64 28 64 62 2c 20 53 51 4c 49 54  nabled(db, SQLIT
333f0 45 5f 51 75 65 72 79 46 6c 61 74 74 65 6e 65 72  E_QueryFlattener
33400 7c 53 51 4c 49 54 45 5f 43 6f 75 6e 74 4f 66 56  |SQLITE_CountOfV
33410 69 65 77 29 0a 20 20 20 26 26 20 63 6f 75 6e 74  iew).   && count
33420 4f 66 56 69 65 77 4f 70 74 69 6d 69 7a 61 74 69  OfViewOptimizati
33430 6f 6e 28 70 50 61 72 73 65 2c 20 70 29 0a 20 20  on(pParse, p).  
33440 29 7b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 6d  ){.    if( db->m
33450 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 67 6f  allocFailed ) go
33460 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20  to select_end;. 
33470 20 20 20 70 45 4c 69 73 74 20 3d 20 70 2d 3e 70     pEList = p->p
33480 45 4c 69 73 74 3b 0a 20 20 20 20 70 54 61 62 4c  EList;.    pTabL
33490 69 73 74 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20  ist = p->pSrc;. 
334a0 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20   }.#endif..  /* 
334b0 46 6f 72 20 65 61 63 68 20 74 65 72 6d 20 69 6e  For each term in
334c0 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
334d0 2c 20 64 6f 20 74 77 6f 20 74 68 69 6e 67 73 3a  , do two things:
334e0 0a 20 20 2a 2a 20 28 31 29 20 41 75 74 68 6f 72  .  ** (1) Author
334f0 69 7a 65 64 20 75 6e 72 65 66 65 72 65 6e 63 65  ized unreference
33500 64 20 74 61 62 6c 65 73 0a 20 20 2a 2a 20 28 32  d tables.  ** (2
33510 29 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  ) Generate code 
33520 66 6f 72 20 61 6c 6c 20 73 75 62 2d 71 75 65 72  for all sub-quer
33530 69 65 73 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69  ies.  */.  for(i
33540 3d 30 3b 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e  =0; i<pTabList->
33550 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nSrc; i++){.    
33560 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
33570 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70 54  tem *pItem = &pT
33580 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 3b 0a 20 20  abList->a[i];.  
33590 20 20 53 65 6c 65 63 74 44 65 73 74 20 64 65 73    SelectDest des
335a0 74 3b 0a 20 20 20 20 53 65 6c 65 63 74 20 2a 70  t;.    Select *p
335b0 53 75 62 3b 0a 23 69 66 20 21 64 65 66 69 6e 65  Sub;.#if !define
335c0 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  d(SQLITE_OMIT_SU
335d0 42 51 55 45 52 59 29 20 7c 7c 20 21 64 65 66 69  BQUERY) || !defi
335e0 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
335f0 56 49 45 57 29 0a 20 20 20 20 63 6f 6e 73 74 20  VIEW).    const 
33600 63 68 61 72 20 2a 7a 53 61 76 65 64 41 75 74 68  char *zSavedAuth
33610 43 6f 6e 74 65 78 74 3b 0a 23 65 6e 64 69 66 0a  Context;.#endif.
33620 0a 20 20 20 20 2f 2a 20 49 73 73 75 65 20 53 51  .    /* Issue SQ
33630 4c 49 54 45 5f 52 45 41 44 20 61 75 74 68 6f 72  LITE_READ author
33640 69 7a 61 74 69 6f 6e 73 20 77 69 74 68 20 61 20  izations with a 
33650 66 61 6b 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65  fake column name
33660 20 66 6f 72 20 61 6e 79 0a 20 20 20 20 2a 2a 20   for any.    ** 
33670 74 61 62 6c 65 73 20 74 68 61 74 20 61 72 65 20  tables that are 
33680 72 65 66 65 72 65 6e 63 65 64 20 62 75 74 20 66  referenced but f
33690 72 6f 6d 20 77 68 69 63 68 20 6e 6f 20 76 61 6c  rom which no val
336a0 75 65 73 20 61 72 65 20 65 78 74 72 61 63 74 65  ues are extracte
336b0 64 2e 0a 20 20 20 20 2a 2a 20 45 78 61 6d 70 6c  d..    ** Exampl
336c0 65 73 20 6f 66 20 77 68 65 72 65 20 74 68 65 73  es of where thes
336d0 65 20 6b 69 6e 64 73 20 6f 66 20 6e 75 6c 6c 20  e kinds of null 
336e0 53 51 4c 49 54 45 5f 52 45 41 44 20 61 75 74 68  SQLITE_READ auth
336f0 6f 72 69 7a 61 74 69 6f 6e 73 0a 20 20 20 20 2a  orizations.    *
33700 2a 20 77 6f 75 6c 64 20 6f 63 63 75 72 3a 0a 20  * would occur:. 
33710 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20     **.    **    
33720 20 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29   SELECT count(*)
33730 20 46 52 4f 4d 20 74 31 3b 20 20 20 2d 2d 20 53   FROM t1;   -- S
33740 51 4c 49 54 45 5f 52 45 41 44 20 74 31 2e 22 22  QLITE_READ t1.""
33750 0a 20 20 20 20 2a 2a 20 20 20 20 20 53 45 4c 45  .    **     SELE
33760 43 54 20 74 31 2e 2a 20 46 52 4f 4d 20 74 31 2c  CT t1.* FROM t1,
33770 20 74 32 3b 20 20 20 2d 2d 20 53 51 4c 49 54 45   t2;   -- SQLITE
33780 5f 52 45 41 44 20 74 32 2e 22 22 0a 20 20 20 20  _READ t2."".    
33790 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 66 61  **.    ** The fa
337a0 6b 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 69  ke column name i
337b0 73 20 61 6e 20 65 6d 70 74 79 20 73 74 72 69 6e  s an empty strin
337c0 67 2e 20 20 49 74 20 69 73 20 70 6f 73 73 69 62  g.  It is possib
337d0 6c 65 20 66 6f 72 20 61 20 74 61 62 6c 65 20 74  le for a table t
337e0 6f 0a 20 20 20 20 2a 2a 20 68 61 76 65 20 61 20  o.    ** have a 
337f0 63 6f 6c 75 6d 6e 20 6e 61 6d 65 64 20 62 79 20  column named by 
33800 74 68 65 20 65 6d 70 74 79 20 73 74 72 69 6e 67  the empty string
33810 2c 20 69 6e 20 77 68 69 63 68 20 63 61 73 65 20  , in which case 
33820 74 68 65 72 65 20 69 73 20 6e 6f 20 77 61 79 20  there is no way 
33830 74 6f 0a 20 20 20 20 2a 2a 20 64 69 73 74 69 6e  to.    ** distin
33840 67 75 69 73 68 20 62 65 74 77 65 65 6e 20 61 6e  guish between an
33850 20 75 6e 72 65 66 65 72 65 6e 63 65 64 20 74 61   unreferenced ta
33860 62 6c 65 20 61 6e 64 20 61 6e 20 61 63 74 75 61  ble and an actua
33870 6c 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74  l reference to t
33880 68 65 0a 20 20 20 20 2a 2a 20 22 22 20 63 6f 6c  he.    ** "" col
33890 75 6d 6e 2e 20 54 68 65 20 6f 72 69 67 69 6e 61  umn. The origina
338a0 6c 20 64 65 73 69 67 6e 20 77 61 73 20 66 6f 72  l design was for
338b0 20 74 68 65 20 66 61 6b 65 20 63 6f 6c 75 6d 6e   the fake column
338c0 20 6e 61 6d 65 20 74 6f 20 62 65 20 61 20 4e 55   name to be a NU
338d0 4c 4c 2c 0a 20 20 20 20 2a 2a 20 77 68 69 63 68  LL,.    ** which
338e0 20 77 6f 75 6c 64 20 62 65 20 75 6e 61 6d 62 69   would be unambi
338f0 67 75 6f 75 73 2e 20 20 42 75 74 20 6c 65 67 61  guous.  But lega
33900 63 79 20 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e  cy authorization
33910 20 63 61 6c 6c 62 61 63 6b 73 20 6d 69 67 68 74   callbacks might
33920 0a 20 20 20 20 2a 2a 20 61 73 73 75 6d 65 20 74  .    ** assume t
33930 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 69  he column name i
33940 73 20 6e 6f 6e 2d 4e 55 4c 4c 20 61 6e 64 20 73  s non-NULL and s
33950 65 67 66 61 75 6c 74 2e 20 20 54 68 65 20 75 73  egfault.  The us
33960 65 20 6f 66 20 61 6e 20 65 6d 70 74 79 0a 20 20  e of an empty.  
33970 20 20 2a 2a 20 73 74 72 69 6e 67 20 66 6f 72 20    ** string for 
33980 74 68 65 20 66 61 6b 65 20 63 6f 6c 75 6d 6e 20  the fake column 
33990 6e 61 6d 65 20 73 65 65 6d 73 20 73 61 66 65 72  name seems safer
339a0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
339b0 20 70 49 74 65 6d 2d 3e 63 6f 6c 55 73 65 64 3d   pItem->colUsed=
339c0 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =0 ){.      sqli
339d0 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61  te3AuthCheck(pPa
339e0 72 73 65 2c 20 53 51 4c 49 54 45 5f 52 45 41 44  rse, SQLITE_READ
339f0 2c 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 2c 20  , pItem->zName, 
33a00 22 22 2c 20 70 49 74 65 6d 2d 3e 7a 44 61 74 61  "", pItem->zData
33a10 62 61 73 65 29 3b 0a 20 20 20 20 7d 0a 0a 23 69  base);.    }..#i
33a20 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
33a30 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29  E_OMIT_SUBQUERY)
33a40 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c   || !defined(SQL
33a50 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 0a 20  ITE_OMIT_VIEW). 
33a60 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63     /* Generate c
33a70 6f 64 65 20 66 6f 72 20 61 6c 6c 20 73 75 62 2d  ode for all sub-
33a80 71 75 65 72 69 65 73 20 69 6e 20 74 68 65 20 46  queries in the F
33a90 52 4f 4d 20 63 6c 61 75 73 65 0a 20 20 20 20 2a  ROM clause.    *
33aa0 2f 0a 20 20 20 20 70 53 75 62 20 3d 20 70 49 74  /.    pSub = pIt
33ab0 65 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a 20 20 20  em->pSelect;.   
33ac0 20 69 66 28 20 70 53 75 62 3d 3d 30 20 29 20 63   if( pSub==0 ) c
33ad0 6f 6e 74 69 6e 75 65 3b 0a 0a 20 20 20 20 2f 2a  ontinue;..    /*
33ae0 20 54 68 65 20 63 6f 64 65 20 66 6f 72 20 61 20   The code for a 
33af0 73 75 62 71 75 65 72 79 20 73 68 6f 75 6c 64 20  subquery should 
33b00 6f 6e 6c 79 20 62 65 20 67 65 6e 65 72 61 74 65  only be generate
33b10 64 20 6f 6e 63 65 2c 20 74 68 6f 75 67 68 20 69  d once, though i
33b20 74 20 69 73 0a 20 20 20 20 2a 2a 20 74 65 63 68  t is.    ** tech
33b30 6e 69 63 61 6c 6c 79 20 68 61 72 6d 6c 65 73 73  nically harmless
33b40 20 66 6f 72 20 69 74 20 74 6f 20 62 65 20 67 65   for it to be ge
33b50 6e 65 72 61 74 65 64 20 6d 75 6c 74 69 70 6c 65  nerated multiple
33b60 20 74 69 6d 65 73 2e 20 54 68 65 0a 20 20 20 20   times. The.    
33b70 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73  ** following ass
33b80 65 72 74 28 29 20 77 69 6c 6c 20 64 65 74 65 63  ert() will detec
33b90 74 20 69 66 20 73 6f 6d 65 74 68 69 6e 67 20 63  t if something c
33ba0 68 61 6e 67 65 73 20 74 6f 20 63 61 75 73 65 0a  hanges to cause.
33bb0 20 20 20 20 2a 2a 20 74 68 65 20 73 61 6d 65 20      ** the same 
33bc0 73 75 62 71 75 65 72 79 20 74 6f 20 62 65 20 63  subquery to be c
33bd0 6f 64 65 64 20 6d 75 6c 74 69 70 6c 65 20 74 69  oded multiple ti
33be0 6d 65 73 2c 20 61 73 20 61 20 73 69 67 6e 61 6c  mes, as a signal
33bf0 20 74 6f 20 74 68 65 0a 20 20 20 20 2a 2a 20 64   to the.    ** d
33c00 65 76 65 6c 6f 70 65 72 73 20 74 6f 20 74 72 79  evelopers to try
33c10 20 74 6f 20 6f 70 74 69 6d 69 7a 65 20 74 68 65   to optimize the
33c20 20 73 69 74 75 61 74 69 6f 6e 2e 20 2a 2f 0a 20   situation. */. 
33c30 20 20 20 61 73 73 65 72 74 28 20 70 49 74 65 6d     assert( pItem
33c40 2d 3e 61 64 64 72 46 69 6c 6c 53 75 62 3d 3d 30  ->addrFillSub==0
33c50 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 6e 63 72   );..    /* Incr
33c60 65 6d 65 6e 74 20 50 61 72 73 65 2e 6e 48 65 69  ement Parse.nHei
33c70 67 68 74 20 62 79 20 74 68 65 20 68 65 69 67 68  ght by the heigh
33c80 74 20 6f 66 20 74 68 65 20 6c 61 72 67 65 73 74  t of the largest
33c90 20 65 78 70 72 65 73 73 69 6f 6e 0a 20 20 20 20   expression.    
33ca0 2a 2a 20 74 72 65 65 20 72 65 66 65 72 72 65 64  ** tree referred
33cb0 20 74 6f 20 62 79 20 74 68 69 73 2c 20 74 68 65   to by this, the
33cc0 20 70 61 72 65 6e 74 20 73 65 6c 65 63 74 2e 20   parent select. 
33cd0 54 68 65 20 63 68 69 6c 64 20 73 65 6c 65 63 74  The child select
33ce0 0a 20 20 20 20 2a 2a 20 6d 61 79 20 63 6f 6e 74  .    ** may cont
33cf0 61 69 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74  ain expression t
33d00 72 65 65 73 20 6f 66 20 61 74 20 6d 6f 73 74 0a  rees of at most.
33d10 20 20 20 20 2a 2a 20 28 53 51 4c 49 54 45 5f 4d      ** (SQLITE_M
33d20 41 58 5f 45 58 50 52 5f 44 45 50 54 48 2d 50 61  AX_EXPR_DEPTH-Pa
33d30 72 73 65 2e 6e 48 65 69 67 68 74 29 20 68 65 69  rse.nHeight) hei
33d40 67 68 74 2e 20 54 68 69 73 20 69 73 20 61 20 62  ght. This is a b
33d50 69 74 0a 20 20 20 20 2a 2a 20 6d 6f 72 65 20 63  it.    ** more c
33d60 6f 6e 73 65 72 76 61 74 69 76 65 20 74 68 61 6e  onservative than
33d70 20 6e 65 63 65 73 73 61 72 79 2c 20 62 75 74 20   necessary, but 
33d80 6d 75 63 68 20 65 61 73 69 65 72 20 74 68 61 6e  much easier than
33d90 20 65 6e 66 6f 72 63 69 6e 67 0a 20 20 20 20 2a   enforcing.    *
33da0 2a 20 61 6e 20 65 78 61 63 74 20 6c 69 6d 69 74  * an exact limit
33db0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 50 61  ..    */.    pPa
33dc0 72 73 65 2d 3e 6e 48 65 69 67 68 74 20 2b 3d 20  rse->nHeight += 
33dd0 73 71 6c 69 74 65 33 53 65 6c 65 63 74 45 78 70  sqlite3SelectExp
33de0 72 48 65 69 67 68 74 28 70 29 3b 0a 0a 20 20 20  rHeight(p);..   
33df0 20 2f 2a 20 4d 61 6b 65 20 63 6f 70 69 65 73 20   /* Make copies 
33e00 6f 66 20 63 6f 6e 73 74 61 6e 74 20 57 48 45 52  of constant WHER
33e10 45 2d 63 6c 61 75 73 65 20 74 65 72 6d 73 20 69  E-clause terms i
33e20 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  n the outer quer
33e30 79 20 64 6f 77 6e 0a 20 20 20 20 2a 2a 20 69 6e  y down.    ** in
33e40 73 69 64 65 20 74 68 65 20 73 75 62 71 75 65 72  side the subquer
33e50 79 2e 20 20 54 68 69 73 20 63 61 6e 20 68 65 6c  y.  This can hel
33e60 70 20 74 68 65 20 73 75 62 71 75 65 72 79 20 74  p the subquery t
33e70 6f 20 72 75 6e 20 6d 6f 72 65 20 65 66 66 69 63  o run more effic
33e80 69 65 6e 74 6c 79 2e 0a 20 20 20 20 2a 2f 0a 20  iently..    */. 
33e90 20 20 20 69 66 28 20 4f 70 74 69 6d 69 7a 61 74     if( Optimizat
33ea0 69 6f 6e 45 6e 61 62 6c 65 64 28 64 62 2c 20 53  ionEnabled(db, S
33eb0 51 4c 49 54 45 5f 50 75 73 68 44 6f 77 6e 29 0a  QLITE_PushDown).
33ec0 20 20 20 20 20 26 26 20 70 75 73 68 44 6f 77 6e       && pushDown
33ed0 57 68 65 72 65 54 65 72 6d 73 28 70 50 61 72 73  WhereTerms(pPars
33ee0 65 2c 20 70 53 75 62 2c 20 70 2d 3e 70 57 68 65  e, pSub, p->pWhe
33ef0 72 65 2c 20 70 49 74 65 6d 2d 3e 69 43 75 72 73  re, pItem->iCurs
33f00 6f 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  or,.            
33f10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
33f20 70 49 74 65 6d 2d 3e 66 67 2e 6a 6f 69 6e 74 79  pItem->fg.jointy
33f30 70 65 20 26 20 4a 54 5f 4f 55 54 45 52 29 21 3d  pe & JT_OUTER)!=
33f40 30 29 0a 20 20 20 20 29 7b 0a 23 69 66 20 53 45  0).    ){.#if SE
33f50 4c 45 43 54 54 52 41 43 45 5f 45 4e 41 42 4c 45  LECTTRACE_ENABLE
33f60 44 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  D.      if( sqli
33f70 74 65 33 53 65 6c 65 63 74 54 72 61 63 65 20 26  te3SelectTrace &
33f80 20 30 78 31 30 30 20 29 7b 0a 20 20 20 20 20 20   0x100 ){.      
33f90 20 20 53 45 4c 45 43 54 54 52 41 43 45 28 30 78    SELECTTRACE(0x
33fa0 31 30 30 2c 70 50 61 72 73 65 2c 70 2c 0a 20 20  100,pParse,p,.  
33fb0 20 20 20 20 20 20 20 20 20 20 28 22 41 66 74 65            ("Afte
33fc0 72 20 57 48 45 52 45 2d 63 6c 61 75 73 65 20 70  r WHERE-clause p
33fd0 75 73 68 2d 64 6f 77 6e 20 69 6e 74 6f 20 73 75  ush-down into su
33fe0 62 71 75 65 72 79 20 25 64 3a 5c 6e 22 2c 20 70  bquery %d:\n", p
33ff0 53 75 62 2d 3e 73 65 6c 49 64 29 29 3b 0a 20 20  Sub->selId));.  
34000 20 20 20 20 20 20 73 71 6c 69 74 65 33 54 72 65        sqlite3Tre
34010 65 56 69 65 77 53 65 6c 65 63 74 28 30 2c 20 70  eViewSelect(0, p
34020 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65  , 0);.      }.#e
34030 6e 64 69 66 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ndif.    }else{.
34040 20 20 20 20 20 20 53 45 4c 45 43 54 54 52 41 43        SELECTTRAC
34050 45 28 30 78 31 30 30 2c 70 50 61 72 73 65 2c 70  E(0x100,pParse,p
34060 2c 28 22 50 75 73 68 2d 64 6f 77 6e 20 6e 6f 74  ,("Push-down not
34070 20 70 6f 73 73 69 62 6c 65 5c 6e 22 29 29 3b 0a   possible\n"));.
34080 20 20 20 20 7d 0a 0a 20 20 20 20 7a 53 61 76 65      }..    zSave
34090 64 41 75 74 68 43 6f 6e 74 65 78 74 20 3d 20 70  dAuthContext = p
340a0 50 61 72 73 65 2d 3e 7a 41 75 74 68 43 6f 6e 74  Parse->zAuthCont
340b0 65 78 74 3b 0a 20 20 20 20 70 50 61 72 73 65 2d  ext;.    pParse-
340c0 3e 7a 41 75 74 68 43 6f 6e 74 65 78 74 20 3d 20  >zAuthContext = 
340d0 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 3b 0a 0a 20  pItem->zName;.. 
340e0 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63     /* Generate c
340f0 6f 64 65 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74  ode to implement
34100 20 74 68 65 20 73 75 62 71 75 65 72 79 0a 20 20   the subquery.  
34110 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20    **.    ** The 
34120 73 75 62 71 75 65 72 79 20 69 73 20 69 6d 70 6c  subquery is impl
34130 65 6d 65 6e 74 65 64 20 61 73 20 61 20 63 6f 2d  emented as a co-
34140 72 6f 75 74 69 6e 65 20 69 66 20 74 68 65 20 73  routine if the s
34150 75 62 71 75 65 72 79 20 69 73 0a 20 20 20 20 2a  ubquery is.    *
34160 2a 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20  * guaranteed to 
34170 62 65 20 74 68 65 20 6f 75 74 65 72 20 6c 6f 6f  be the outer loo
34180 70 20 28 73 6f 20 74 68 61 74 20 69 74 20 64 6f  p (so that it do
34190 65 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62  es not need to b
341a0 65 0a 20 20 20 20 2a 2a 20 63 6f 6d 70 75 74 65  e.    ** compute
341b0 64 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 63 65  d more than once
341c0 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ).    **.    ** 
341d0 54 4f 44 4f 3a 20 41 72 65 20 74 68 65 72 65 20  TODO: Are there 
341e0 6f 74 68 65 72 20 72 65 61 73 6f 6e 73 20 62 65  other reasons be
341f0 73 69 64 65 20 28 31 29 20 74 6f 20 75 73 65 20  side (1) to use 
34200 61 20 63 6f 2d 72 6f 75 74 69 6e 65 0a 20 20 20  a co-routine.   
34210 20 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69   ** implementati
34220 6f 6e 3f 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  on?.    */.    i
34230 66 28 20 69 3d 3d 30 0a 20 20 20 20 20 26 26 20  f( i==0.     && 
34240 28 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3d  (pTabList->nSrc=
34250 3d 31 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c  =1.            |
34260 7c 20 28 70 54 61 62 4c 69 73 74 2d 3e 61 5b 31  | (pTabList->a[1
34270 5d 2e 66 67 2e 6a 6f 69 6e 74 79 70 65 26 28 4a  ].fg.jointype&(J
34280 54 5f 4c 45 46 54 7c 4a 54 5f 43 52 4f 53 53 29  T_LEFT|JT_CROSS)
34290 29 21 3d 30 29 20 20 2f 2a 20 28 31 29 20 2a 2f  )!=0)  /* (1) */
342a0 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 2f 2a  .    ){.      /*
342b0 20 49 6d 70 6c 65 6d 65 6e 74 20 61 20 63 6f 2d   Implement a co-
342c0 72 6f 75 74 69 6e 65 20 74 68 61 74 20 77 69 6c  routine that wil
342d0 6c 20 72 65 74 75 72 6e 20 61 20 73 69 6e 67 6c  l return a singl
342e0 65 20 72 6f 77 20 6f 66 20 74 68 65 20 72 65 73  e row of the res
342f0 75 6c 74 0a 20 20 20 20 20 20 2a 2a 20 73 65 74  ult.      ** set
34300 20 6f 6e 20 65 61 63 68 20 69 6e 76 6f 63 61 74   on each invocat
34310 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ion..      */.  
34320 20 20 20 20 69 6e 74 20 61 64 64 72 54 6f 70 20      int addrTop 
34330 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  = sqlite3VdbeCur
34340 72 65 6e 74 41 64 64 72 28 76 29 2b 31 3b 0a 20  rentAddr(v)+1;. 
34350 20 20 20 20 0a 20 20 20 20 20 20 70 49 74 65 6d      .      pItem
34360 2d 3e 72 65 67 52 65 74 75 72 6e 20 3d 20 2b 2b  ->regReturn = ++
34370 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
34380 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
34390 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 69 74  ddOp3(v, OP_Init
343a0 43 6f 72 6f 75 74 69 6e 65 2c 20 70 49 74 65 6d  Coroutine, pItem
343b0 2d 3e 72 65 67 52 65 74 75 72 6e 2c 20 30 2c 20  ->regReturn, 0, 
343c0 61 64 64 72 54 6f 70 29 3b 0a 20 20 20 20 20 20  addrTop);.      
343d0 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
343e0 22 25 73 22 2c 20 70 49 74 65 6d 2d 3e 70 54 61  "%s", pItem->pTa
343f0 62 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20  b->zName));.    
34400 20 20 70 49 74 65 6d 2d 3e 61 64 64 72 46 69 6c    pItem->addrFil
34410 6c 53 75 62 20 3d 20 61 64 64 72 54 6f 70 3b 0a  lSub = addrTop;.
34420 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c        sqlite3Sel
34430 65 63 74 44 65 73 74 49 6e 69 74 28 26 64 65 73  ectDestInit(&des
34440 74 2c 20 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65  t, SRT_Coroutine
34450 2c 20 70 49 74 65 6d 2d 3e 72 65 67 52 65 74 75  , pItem->regRetu
34460 72 6e 29 3b 0a 20 20 20 20 20 20 45 78 70 6c 61  rn);.      Expla
34470 69 6e 51 75 65 72 79 50 6c 61 6e 28 28 70 50 61  inQueryPlan((pPa
34480 72 73 65 2c 20 31 2c 20 22 43 4f 2d 52 4f 55 54  rse, 1, "CO-ROUT
34490 49 4e 45 20 25 75 22 2c 20 70 53 75 62 2d 3e 73  INE %u", pSub->s
344a0 65 6c 49 64 29 29 3b 0a 20 20 20 20 20 20 73 71  elId));.      sq
344b0 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72  lite3Select(pPar
344c0 73 65 2c 20 70 53 75 62 2c 20 26 64 65 73 74 29  se, pSub, &dest)
344d0 3b 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 70  ;.      pItem->p
344e0 54 61 62 2d 3e 6e 52 6f 77 4c 6f 67 45 73 74 20  Tab->nRowLogEst 
344f0 3d 20 70 53 75 62 2d 3e 6e 53 65 6c 65 63 74 52  = pSub->nSelectR
34500 6f 77 3b 0a 20 20 20 20 20 20 70 49 74 65 6d 2d  ow;.      pItem-
34510 3e 66 67 2e 76 69 61 43 6f 72 6f 75 74 69 6e 65  >fg.viaCoroutine
34520 20 3d 20 31 3b 0a 20 20 20 20 20 20 70 49 74 65   = 1;.      pIte
34530 6d 2d 3e 72 65 67 52 65 73 75 6c 74 20 3d 20 64  m->regResult = d
34540 65 73 74 2e 69 53 64 73 74 3b 0a 20 20 20 20 20  est.iSdst;.     
34550 20 73 71 6c 69 74 65 33 56 64 62 65 45 6e 64 43   sqlite3VdbeEndC
34560 6f 72 6f 75 74 69 6e 65 28 76 2c 20 70 49 74 65  oroutine(v, pIte
34570 6d 2d 3e 72 65 67 52 65 74 75 72 6e 29 3b 0a 20  m->regReturn);. 
34580 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
34590 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72  JumpHere(v, addr
345a0 54 6f 70 2d 31 29 3b 0a 20 20 20 20 20 20 73 71  Top-1);.      sq
345b0 6c 69 74 65 33 43 6c 65 61 72 54 65 6d 70 52 65  lite3ClearTempRe
345c0 67 43 61 63 68 65 28 70 50 61 72 73 65 29 3b 0a  gCache(pParse);.
345d0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
345e0 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20 73   /* Generate a s
345f0 75 62 72 6f 75 74 69 6e 65 20 74 68 61 74 20 77  ubroutine that w
34600 69 6c 6c 20 66 69 6c 6c 20 61 6e 20 65 70 68 65  ill fill an ephe
34610 6d 65 72 61 6c 20 74 61 62 6c 65 20 77 69 74 68  meral table with
34620 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 63 6f  .      ** the co
34630 6e 74 65 6e 74 20 6f 66 20 74 68 69 73 20 73 75  ntent of this su
34640 62 71 75 65 72 79 2e 20 20 70 49 74 65 6d 2d 3e  bquery.  pItem->
34650 61 64 64 72 46 69 6c 6c 53 75 62 20 77 69 6c 6c  addrFillSub will
34660 20 70 6f 69 6e 74 0a 20 20 20 20 20 20 2a 2a 20   point.      ** 
34670 74 6f 20 74 68 65 20 61 64 64 72 65 73 73 20 6f  to the address o
34680 66 20 74 68 65 20 67 65 6e 65 72 61 74 65 64 20  f the generated 
34690 73 75 62 72 6f 75 74 69 6e 65 2e 20 20 70 49 74  subroutine.  pIt
346a0 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e 0a 20 20  em->regReturn.  
346b0 20 20 20 20 2a 2a 20 69 73 20 61 20 72 65 67 69      ** is a regi
346c0 73 74 65 72 20 61 6c 6c 6f 63 61 74 65 64 20 74  ster allocated t
346d0 6f 20 68 6f 6c 64 20 74 68 65 20 73 75 62 72 6f  o hold the subro
346e0 75 74 69 6e 65 20 72 65 74 75 72 6e 20 61 64 64  utine return add
346f0 72 65 73 73 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ress.      */.  
34700 20 20 20 20 69 6e 74 20 74 6f 70 41 64 64 72 3b      int topAddr;
34710 0a 20 20 20 20 20 20 69 6e 74 20 6f 6e 63 65 41  .      int onceA
34720 64 64 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 69  ddr = 0;.      i
34730 6e 74 20 72 65 74 41 64 64 72 3b 0a 20 20 20 20  nt retAddr;.    
34740 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
34750 5f 69 74 65 6d 20 2a 70 50 72 69 6f 72 3b 0a 0a  _item *pPrior;..
34760 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49        assert( pI
34770 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75 62  tem->addrFillSub
34780 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 49 74  ==0 );.      pIt
34790 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e 20 3d 20  em->regReturn = 
347a0 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
347b0 20 20 20 20 20 20 74 6f 70 41 64 64 72 20 3d 20        topAddr = 
347c0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
347d0 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
347e0 20 30 2c 20 70 49 74 65 6d 2d 3e 72 65 67 52 65   0, pItem->regRe
347f0 74 75 72 6e 29 3b 0a 20 20 20 20 20 20 70 49 74  turn);.      pIt
34800 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75 62 20  em->addrFillSub 
34810 3d 20 74 6f 70 41 64 64 72 2b 31 3b 0a 20 20 20  = topAddr+1;.   
34820 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 66 67     if( pItem->fg
34830 2e 69 73 43 6f 72 72 65 6c 61 74 65 64 3d 3d 30  .isCorrelated==0
34840 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49   ){.        /* I
34850 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20 69  f the subquery i
34860 73 20 6e 6f 74 20 63 6f 72 72 65 6c 61 74 65 64  s not correlated
34870 20 61 6e 64 20 69 66 20 77 65 20 61 72 65 20 6e   and if we are n
34880 6f 74 20 69 6e 73 69 64 65 20 6f 66 0a 20 20 20  ot inside of.   
34890 20 20 20 20 20 2a 2a 20 61 20 74 72 69 67 67 65       ** a trigge
348a0 72 2c 20 74 68 65 6e 20 77 65 20 6f 6e 6c 79 20  r, then we only 
348b0 6e 65 65 64 20 74 6f 20 63 6f 6d 70 75 74 65 20  need to compute 
348c0 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65  the value of the
348d0 20 73 75 62 71 75 65 72 79 0a 20 20 20 20 20 20   subquery.      
348e0 20 20 2a 2a 20 6f 6e 63 65 2e 20 2a 2f 0a 20 20    ** once. */.  
348f0 20 20 20 20 20 20 6f 6e 63 65 41 64 64 72 20 3d        onceAddr =
34900 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
34910 70 30 28 76 2c 20 4f 50 5f 4f 6e 63 65 29 3b 20  p0(v, OP_Once); 
34920 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
34930 0a 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 6d  .        VdbeCom
34940 6d 65 6e 74 28 28 76 2c 20 22 6d 61 74 65 72 69  ment((v, "materi
34950 61 6c 69 7a 65 20 5c 22 25 73 5c 22 22 2c 20 70  alize \"%s\"", p
34960 49 74 65 6d 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d  Item->pTab->zNam
34970 65 29 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  e));.      }else
34980 7b 0a 20 20 20 20 20 20 20 20 56 64 62 65 4e 6f  {.        VdbeNo
34990 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 6d  opComment((v, "m
349a0 61 74 65 72 69 61 6c 69 7a 65 20 5c 22 25 73 5c  aterialize \"%s\
349b0 22 22 2c 20 70 49 74 65 6d 2d 3e 70 54 61 62 2d  "", pItem->pTab-
349c0 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 20 20  >zName));.      
349d0 7d 0a 20 20 20 20 20 20 70 50 72 69 6f 72 20 3d  }.      pPrior =
349e0 20 69 73 53 65 6c 66 4a 6f 69 6e 56 69 65 77 28   isSelfJoinView(
349f0 70 54 61 62 4c 69 73 74 2c 20 70 49 74 65 6d 29  pTabList, pItem)
34a00 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50 72 69  ;.      if( pPri
34a10 6f 72 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  or ){.        sq
34a20 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
34a30 76 2c 20 4f 50 5f 4f 70 65 6e 44 75 70 2c 20 70  v, OP_OpenDup, p
34a40 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 2c 20 70  Item->iCursor, p
34a50 50 72 69 6f 72 2d 3e 69 43 75 72 73 6f 72 29 3b  Prior->iCursor);
34a60 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
34a70 20 70 50 72 69 6f 72 2d 3e 70 53 65 6c 65 63 74   pPrior->pSelect
34a80 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 70  !=0 );.        p
34a90 53 75 62 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20  Sub->nSelectRow 
34aa0 3d 20 70 50 72 69 6f 72 2d 3e 70 53 65 6c 65 63  = pPrior->pSelec
34ab0 74 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 3b 0a 20  t->nSelectRow;. 
34ac0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
34ad0 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63      sqlite3Selec
34ae0 74 44 65 73 74 49 6e 69 74 28 26 64 65 73 74 2c  tDestInit(&dest,
34af0 20 53 52 54 5f 45 70 68 65 6d 54 61 62 2c 20 70   SRT_EphemTab, p
34b00 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 29 3b 0a  Item->iCursor);.
34b10 20 20 20 20 20 20 20 20 45 78 70 6c 61 69 6e 51          ExplainQ
34b20 75 65 72 79 50 6c 61 6e 28 28 70 50 61 72 73 65  ueryPlan((pParse
34b30 2c 20 31 2c 20 22 4d 41 54 45 52 49 41 4c 49 5a  , 1, "MATERIALIZ
34b40 45 20 25 75 22 2c 20 70 53 75 62 2d 3e 73 65 6c  E %u", pSub->sel
34b50 49 64 29 29 3b 0a 20 20 20 20 20 20 20 20 73 71  Id));.        sq
34b60 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72  lite3Select(pPar
34b70 73 65 2c 20 70 53 75 62 2c 20 26 64 65 73 74 29  se, pSub, &dest)
34b80 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
34b90 70 49 74 65 6d 2d 3e 70 54 61 62 2d 3e 6e 52 6f  pItem->pTab->nRo
34ba0 77 4c 6f 67 45 73 74 20 3d 20 70 53 75 62 2d 3e  wLogEst = pSub->
34bb0 6e 53 65 6c 65 63 74 52 6f 77 3b 0a 20 20 20 20  nSelectRow;.    
34bc0 20 20 69 66 28 20 6f 6e 63 65 41 64 64 72 20 29    if( onceAddr )
34bd0 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
34be0 48 65 72 65 28 76 2c 20 6f 6e 63 65 41 64 64 72  Here(v, onceAddr
34bf0 29 3b 0a 20 20 20 20 20 20 72 65 74 41 64 64 72  );.      retAddr
34c00 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
34c10 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 74 75 72  dOp1(v, OP_Retur
34c20 6e 2c 20 70 49 74 65 6d 2d 3e 72 65 67 52 65 74  n, pItem->regRet
34c30 75 72 6e 29 3b 0a 20 20 20 20 20 20 56 64 62 65  urn);.      Vdbe
34c40 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 65 6e 64  Comment((v, "end
34c50 20 25 73 22 2c 20 70 49 74 65 6d 2d 3e 70 54 61   %s", pItem->pTa
34c60 62 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20  b->zName));.    
34c70 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
34c80 6e 67 65 50 31 28 76 2c 20 74 6f 70 41 64 64 72  ngeP1(v, topAddr
34c90 2c 20 72 65 74 41 64 64 72 29 3b 0a 20 20 20 20  , retAddr);.    
34ca0 20 20 73 71 6c 69 74 65 33 43 6c 65 61 72 54 65    sqlite3ClearTe
34cb0 6d 70 52 65 67 43 61 63 68 65 28 70 50 61 72 73  mpRegCache(pPars
34cc0 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  e);.    }.    if
34cd0 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
34ce0 65 64 20 29 20 67 6f 74 6f 20 73 65 6c 65 63 74  ed ) goto select
34cf0 5f 65 6e 64 3b 0a 20 20 20 20 70 50 61 72 73 65  _end;.    pParse
34d00 2d 3e 6e 48 65 69 67 68 74 20 2d 3d 20 73 71 6c  ->nHeight -= sql
34d10 69 74 65 33 53 65 6c 65 63 74 45 78 70 72 48 65  ite3SelectExprHe
34d20 69 67 68 74 28 70 29 3b 0a 20 20 20 20 70 50 61  ight(p);.    pPa
34d30 72 73 65 2d 3e 7a 41 75 74 68 43 6f 6e 74 65 78  rse->zAuthContex
34d40 74 20 3d 20 7a 53 61 76 65 64 41 75 74 68 43 6f  t = zSavedAuthCo
34d50 6e 74 65 78 74 3b 0a 23 65 6e 64 69 66 0a 20 20  ntext;.#endif.  
34d60 7d 0a 0a 20 20 2f 2a 20 56 61 72 69 6f 75 73 20  }..  /* Various 
34d70 65 6c 65 6d 65 6e 74 73 20 6f 66 20 74 68 65 20  elements of the 
34d80 53 45 4c 45 43 54 20 63 6f 70 69 65 64 20 69 6e  SELECT copied in
34d90 74 6f 20 6c 6f 63 61 6c 20 76 61 72 69 61 62 6c  to local variabl
34da0 65 73 20 66 6f 72 0a 20 20 2a 2a 20 63 6f 6e 76  es for.  ** conv
34db0 65 6e 69 65 6e 63 65 20 2a 2f 0a 20 20 70 45 4c  enience */.  pEL
34dc0 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b  ist = p->pEList;
34dd0 0a 20 20 70 57 68 65 72 65 20 3d 20 70 2d 3e 70  .  pWhere = p->p
34de0 57 68 65 72 65 3b 0a 20 20 70 47 72 6f 75 70 42  Where;.  pGroupB
34df0 79 20 3d 20 70 2d 3e 70 47 72 6f 75 70 42 79 3b  y = p->pGroupBy;
34e00 0a 20 20 70 48 61 76 69 6e 67 20 3d 20 70 2d 3e  .  pHaving = p->
34e10 70 48 61 76 69 6e 67 3b 0a 20 20 73 44 69 73 74  pHaving;.  sDist
34e20 69 6e 63 74 2e 69 73 54 6e 63 74 20 3d 20 28 70  inct.isTnct = (p
34e30 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f  ->selFlags & SF_
34e40 44 69 73 74 69 6e 63 74 29 21 3d 30 3b 0a 0a 23  Distinct)!=0;..#
34e50 69 66 20 53 45 4c 45 43 54 54 52 41 43 45 5f 45  if SELECTTRACE_E
34e60 4e 41 42 4c 45 44 0a 20 20 69 66 28 20 73 71 6c  NABLED.  if( sql
34e70 69 74 65 33 53 65 6c 65 63 74 54 72 61 63 65 20  ite3SelectTrace 
34e80 26 20 30 78 34 30 30 20 29 7b 0a 20 20 20 20 53  & 0x400 ){.    S
34e90 45 4c 45 43 54 54 52 41 43 45 28 30 78 34 30 30  ELECTTRACE(0x400
34ea0 2c 70 50 61 72 73 65 2c 70 2c 28 22 41 66 74 65  ,pParse,p,("Afte
34eb0 72 20 61 6c 6c 20 46 52 4f 4d 2d 63 6c 61 75 73  r all FROM-claus
34ec0 65 20 61 6e 61 6c 79 73 69 73 3a 5c 6e 22 29 29  e analysis:\n"))
34ed0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 54 72 65  ;.    sqlite3Tre
34ee0 65 56 69 65 77 53 65 6c 65 63 74 28 30 2c 20 70  eViewSelect(0, p
34ef0 2c 20 30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  , 0);.  }.#endif
34f00 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 71 75  ..  /* If the qu
34f10 65 72 79 20 69 73 20 44 49 53 54 49 4e 43 54 20  ery is DISTINCT 
34f20 77 69 74 68 20 61 6e 20 4f 52 44 45 52 20 42 59  with an ORDER BY
34f30 20 62 75 74 20 69 73 20 6e 6f 74 20 61 6e 20 61   but is not an a
34f40 67 67 72 65 67 61 74 65 2c 20 61 6e 64 20 0a 20  ggregate, and . 
34f50 20 2a 2a 20 69 66 20 74 68 65 20 73 65 6c 65 63   ** if the selec
34f60 74 2d 6c 69 73 74 20 69 73 20 74 68 65 20 73 61  t-list is the sa
34f70 6d 65 20 61 73 20 74 68 65 20 4f 52 44 45 52 20  me as the ORDER 
34f80 42 59 20 6c 69 73 74 2c 20 74 68 65 6e 20 74 68  BY list, then th
34f90 69 73 20 71 75 65 72 79 0a 20 20 2a 2a 20 63 61  is query.  ** ca
34fa0 6e 20 62 65 20 72 65 77 72 69 74 74 65 6e 20 61  n be rewritten a
34fb0 73 20 61 20 47 52 4f 55 50 20 42 59 2e 20 49 6e  s a GROUP BY. In
34fc0 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 74 68   other words, th
34fd0 69 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  is:.  **.  **   
34fe0 20 20 53 45 4c 45 43 54 20 44 49 53 54 49 4e 43    SELECT DISTINC
34ff0 54 20 78 79 7a 20 46 52 4f 4d 20 2e 2e 2e 20 4f  T xyz FROM ... O
35000 52 44 45 52 20 42 59 20 78 79 7a 0a 20 20 2a 2a  RDER BY xyz.  **
35010 0a 20 20 2a 2a 20 69 73 20 74 72 61 6e 73 66 6f  .  ** is transfo
35020 72 6d 65 64 20 74 6f 3a 0a 20 20 2a 2a 0a 20 20  rmed to:.  **.  
35030 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 78 79  **     SELECT xy
35040 7a 20 46 52 4f 4d 20 2e 2e 2e 20 47 52 4f 55 50  z FROM ... GROUP
35050 20 42 59 20 78 79 7a 20 4f 52 44 45 52 20 42 59   BY xyz ORDER BY
35060 20 78 79 7a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54   xyz.  **.  ** T
35070 68 65 20 73 65 63 6f 6e 64 20 66 6f 72 6d 20 69  he second form i
35080 73 20 70 72 65 66 65 72 72 65 64 20 61 73 20 61  s preferred as a
35090 20 73 69 6e 67 6c 65 20 69 6e 64 65 78 20 28 6f   single index (o
350a0 72 20 74 65 6d 70 2d 74 61 62 6c 65 29 20 6d 61  r temp-table) ma
350b0 79 20 62 65 20 0a 20 20 2a 2a 20 75 73 65 64 20  y be .  ** used 
350c0 66 6f 72 20 62 6f 74 68 20 74 68 65 20 4f 52 44  for both the ORD
350d0 45 52 20 42 59 20 61 6e 64 20 44 49 53 54 49 4e  ER BY and DISTIN
350e0 43 54 20 70 72 6f 63 65 73 73 69 6e 67 2e 20 41  CT processing. A
350f0 73 20 6f 72 69 67 69 6e 61 6c 6c 79 20 0a 20 20  s originally .  
35100 2a 2a 20 77 72 69 74 74 65 6e 20 74 68 65 20 71  ** written the q
35110 75 65 72 79 20 6d 75 73 74 20 75 73 65 20 61 20  uery must use a 
35120 74 65 6d 70 2d 74 61 62 6c 65 20 66 6f 72 20 61  temp-table for a
35130 74 20 6c 65 61 73 74 20 6f 6e 65 20 6f 66 20 74  t least one of t
35140 68 65 20 4f 52 44 45 52 20 0a 20 20 2a 2a 20 42  he ORDER .  ** B
35150 59 20 61 6e 64 20 44 49 53 54 49 4e 43 54 2c 20  Y and DISTINCT, 
35160 61 6e 64 20 61 6e 20 69 6e 64 65 78 20 6f 72 20  and an index or 
35170 73 65 70 61 72 61 74 65 20 74 65 6d 70 2d 74 61  separate temp-ta
35180 62 6c 65 20 66 6f 72 20 74 68 65 20 6f 74 68 65  ble for the othe
35190 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 70  r..  */.  if( (p
351a0 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 28 53 46  ->selFlags & (SF
351b0 5f 44 69 73 74 69 6e 63 74 7c 53 46 5f 41 67 67  _Distinct|SF_Agg
351c0 72 65 67 61 74 65 29 29 3d 3d 53 46 5f 44 69 73  regate))==SF_Dis
351d0 74 69 6e 63 74 20 0a 20 20 20 26 26 20 73 71 6c  tinct .   && sql
351e0 69 74 65 33 45 78 70 72 4c 69 73 74 43 6f 6d 70  ite3ExprListComp
351f0 61 72 65 28 73 53 6f 72 74 2e 70 4f 72 64 65 72  are(sSort.pOrder
35200 42 79 2c 20 70 45 4c 69 73 74 2c 20 2d 31 29 3d  By, pEList, -1)=
35210 3d 30 0a 20 20 29 7b 0a 20 20 20 20 70 2d 3e 73  =0.  ){.    p->s
35220 65 6c 46 6c 61 67 73 20 26 3d 20 7e 53 46 5f 44  elFlags &= ~SF_D
35230 69 73 74 69 6e 63 74 3b 0a 20 20 20 20 70 47 72  istinct;.    pGr
35240 6f 75 70 42 79 20 3d 20 70 2d 3e 70 47 72 6f 75  oupBy = p->pGrou
35250 70 42 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70  pBy = sqlite3Exp
35260 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70 45 4c  rListDup(db, pEL
35270 69 73 74 2c 20 30 29 3b 0a 20 20 20 20 2f 2a 20  ist, 0);.    /* 
35280 4e 6f 74 69 63 65 20 74 68 61 74 20 65 76 65 6e  Notice that even
35290 20 74 68 6f 75 67 68 74 20 53 46 5f 44 69 73 74   thought SF_Dist
352a0 69 6e 63 74 20 68 61 73 20 62 65 65 6e 20 63 6c  inct has been cl
352b0 65 61 72 65 64 20 66 72 6f 6d 20 70 2d 3e 73 65  eared from p->se
352c0 6c 46 6c 61 67 73 2c 0a 20 20 20 20 2a 2a 20 74  lFlags,.    ** t
352d0 68 65 20 73 44 69 73 74 69 6e 63 74 2e 69 73 54  he sDistinct.isT
352e0 6e 63 74 20 69 73 20 73 74 69 6c 6c 20 73 65 74  nct is still set
352f0 2e 20 20 48 65 6e 63 65 2c 20 69 73 54 6e 63 74  .  Hence, isTnct
35300 20 72 65 70 72 65 73 65 6e 74 73 20 74 68 65 0a   represents the.
35310 20 20 20 20 2a 2a 20 6f 72 69 67 69 6e 61 6c 20      ** original 
35320 73 65 74 74 69 6e 67 20 6f 66 20 74 68 65 20 53  setting of the S
35330 46 5f 44 69 73 74 69 6e 63 74 20 66 6c 61 67 2c  F_Distinct flag,
35340 20 6e 6f 74 20 74 68 65 20 63 75 72 72 65 6e 74   not the current
35350 20 73 65 74 74 69 6e 67 20 2a 2f 0a 20 20 20 20   setting */.    
35360 61 73 73 65 72 74 28 20 73 44 69 73 74 69 6e 63  assert( sDistinc
35370 74 2e 69 73 54 6e 63 74 20 29 3b 0a 0a 23 69 66  t.isTnct );..#if
35380 20 53 45 4c 45 43 54 54 52 41 43 45 5f 45 4e 41   SELECTTRACE_ENA
35390 42 4c 45 44 0a 20 20 20 20 69 66 28 20 73 71 6c  BLED.    if( sql
353a0 69 74 65 33 53 65 6c 65 63 74 54 72 61 63 65 20  ite3SelectTrace 
353b0 26 20 30 78 34 30 30 20 29 7b 0a 20 20 20 20 20  & 0x400 ){.     
353c0 20 53 45 4c 45 43 54 54 52 41 43 45 28 30 78 34   SELECTTRACE(0x4
353d0 30 30 2c 70 50 61 72 73 65 2c 70 2c 28 22 54 72  00,pParse,p,("Tr
353e0 61 6e 73 66 6f 72 6d 20 44 49 53 54 49 4e 43 54  ansform DISTINCT
353f0 20 69 6e 74 6f 20 47 52 4f 55 50 20 42 59 3a 5c   into GROUP BY:\
35400 6e 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  n"));.      sqli
35410 74 65 33 54 72 65 65 56 69 65 77 53 65 6c 65 63  te3TreeViewSelec
35420 74 28 30 2c 20 70 2c 20 30 29 3b 0a 20 20 20 20  t(0, p, 0);.    
35430 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 20 20  }.#endif.  }..  
35440 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 61  /* If there is a
35450 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  n ORDER BY claus
35460 65 2c 20 74 68 65 6e 20 63 72 65 61 74 65 20 61  e, then create a
35470 6e 20 65 70 68 65 6d 65 72 61 6c 20 69 6e 64 65  n ephemeral inde
35480 78 20 74 6f 0a 20 20 2a 2a 20 64 6f 20 74 68 65  x to.  ** do the
35490 20 73 6f 72 74 69 6e 67 2e 20 20 42 75 74 20 74   sorting.  But t
354a0 68 69 73 20 73 6f 72 74 69 6e 67 20 65 70 68 65  his sorting ephe
354b0 6d 65 72 61 6c 20 69 6e 64 65 78 20 6d 69 67 68  meral index migh
354c0 74 20 65 6e 64 20 75 70 0a 20 20 2a 2a 20 62 65  t end up.  ** be
354d0 69 6e 67 20 75 6e 75 73 65 64 20 69 66 20 74 68  ing unused if th
354e0 65 20 64 61 74 61 20 63 61 6e 20 62 65 20 65 78  e data can be ex
354f0 74 72 61 63 74 65 64 20 69 6e 20 70 72 65 2d 73  tracted in pre-s
35500 6f 72 74 65 64 20 6f 72 64 65 72 2e 0a 20 20 2a  orted order..  *
35510 2a 20 49 66 20 74 68 61 74 20 69 73 20 74 68 65  * If that is the
35520 20 63 61 73 65 2c 20 74 68 65 6e 20 74 68 65 20   case, then the 
35530 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c  OP_OpenEphemeral
35540 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 77 69 6c   instruction wil
35550 6c 20 62 65 0a 20 20 2a 2a 20 63 68 61 6e 67 65  l be.  ** change
35560 64 20 74 6f 20 61 6e 20 4f 50 5f 4e 6f 6f 70 20  d to an OP_Noop 
35570 6f 6e 63 65 20 77 65 20 66 69 67 75 72 65 20 6f  once we figure o
35580 75 74 20 74 68 61 74 20 74 68 65 20 73 6f 72 74  ut that the sort
35590 69 6e 67 20 69 6e 64 65 78 20 69 73 0a 20 20 2a  ing index is.  *
355a0 2a 20 6e 6f 74 20 6e 65 65 64 65 64 2e 20 20 54  * not needed.  T
355b0 68 65 20 73 53 6f 72 74 2e 61 64 64 72 53 6f 72  he sSort.addrSor
355c0 74 49 6e 64 65 78 20 76 61 72 69 61 62 6c 65 20  tIndex variable 
355d0 69 73 20 75 73 65 64 20 74 6f 20 66 61 63 69 6c  is used to facil
355e0 69 74 61 74 65 0a 20 20 2a 2a 20 74 68 61 74 20  itate.  ** that 
355f0 63 68 61 6e 67 65 2e 0a 20 20 2a 2f 0a 20 20 69  change..  */.  i
35600 66 28 20 73 53 6f 72 74 2e 70 4f 72 64 65 72 42  f( sSort.pOrderB
35610 79 20 29 7b 0a 20 20 20 20 4b 65 79 49 6e 66 6f  y ){.    KeyInfo
35620 20 2a 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 20 20   *pKeyInfo;.    
35630 70 4b 65 79 49 6e 66 6f 20 3d 20 73 71 6c 69 74  pKeyInfo = sqlit
35640 65 33 4b 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70  e3KeyInfoFromExp
35650 72 4c 69 73 74 28 0a 20 20 20 20 20 20 20 20 70  rList(.        p
35660 50 61 72 73 65 2c 20 73 53 6f 72 74 2e 70 4f 72  Parse, sSort.pOr
35670 64 65 72 42 79 2c 20 30 2c 20 70 45 4c 69 73 74  derBy, 0, pEList
35680 2d 3e 6e 45 78 70 72 29 3b 0a 20 20 20 20 73 53  ->nExpr);.    sS
35690 6f 72 74 2e 69 45 43 75 72 73 6f 72 20 3d 20 70  ort.iECursor = p
356a0 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20  Parse->nTab++;. 
356b0 20 20 20 73 53 6f 72 74 2e 61 64 64 72 53 6f 72     sSort.addrSor
356c0 74 49 6e 64 65 78 20 3d 0a 20 20 20 20 20 20 73  tIndex =.      s
356d0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
356e0 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d  (v, OP_OpenEphem
356f0 65 72 61 6c 2c 0a 20 20 20 20 20 20 20 20 20 20  eral,.          
35700 73 53 6f 72 74 2e 69 45 43 75 72 73 6f 72 2c 20  sSort.iECursor, 
35710 73 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 2d 3e  sSort.pOrderBy->
35720 6e 45 78 70 72 2b 31 2b 70 45 4c 69 73 74 2d 3e  nExpr+1+pEList->
35730 6e 45 78 70 72 2c 20 30 2c 0a 20 20 20 20 20 20  nExpr, 0,.      
35740 20 20 20 20 28 63 68 61 72 2a 29 70 4b 65 79 49      (char*)pKeyI
35750 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 0a  nfo, P4_KEYINFO.
35760 20 20 20 20 20 20 29 3b 0a 20 20 7d 65 6c 73 65        );.  }else
35770 7b 0a 20 20 20 20 73 53 6f 72 74 2e 61 64 64 72  {.    sSort.addr
35780 53 6f 72 74 49 6e 64 65 78 20 3d 20 2d 31 3b 0a  SortIndex = -1;.
35790 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65    }..  /* If the
357a0 20 6f 75 74 70 75 74 20 69 73 20 64 65 73 74 69   output is desti
357b0 6e 65 64 20 66 6f 72 20 61 20 74 65 6d 70 6f 72  ned for a tempor
357c0 61 72 79 20 74 61 62 6c 65 2c 20 6f 70 65 6e 20  ary table, open 
357d0 74 68 61 74 20 74 61 62 6c 65 2e 0a 20 20 2a 2f  that table..  */
357e0 0a 20 20 69 66 28 20 70 44 65 73 74 2d 3e 65 44  .  if( pDest->eD
357f0 65 73 74 3d 3d 53 52 54 5f 45 70 68 65 6d 54 61  est==SRT_EphemTa
35800 62 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  b ){.    sqlite3
35810 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
35820 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20  _OpenEphemeral, 
35830 70 44 65 73 74 2d 3e 69 53 44 50 61 72 6d 2c 20  pDest->iSDParm, 
35840 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b 0a  pEList->nExpr);.
35850 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68    }..  /* Set th
35860 65 20 6c 69 6d 69 74 65 72 2e 0a 20 20 2a 2f 0a  e limiter..  */.
35870 20 20 69 45 6e 64 20 3d 20 73 71 6c 69 74 65 33    iEnd = sqlite3
35880 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 70 50  VdbeMakeLabel(pP
35890 61 72 73 65 29 3b 0a 20 20 69 66 28 20 28 70 2d  arse);.  if( (p-
358a0 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 46  >selFlags & SF_F
358b0 69 78 65 64 4c 69 6d 69 74 29 3d 3d 30 20 29 7b  ixedLimit)==0 ){
358c0 0a 20 20 20 20 70 2d 3e 6e 53 65 6c 65 63 74 52  .    p->nSelectR
358d0 6f 77 20 3d 20 33 32 30 3b 20 20 2f 2a 20 34 20  ow = 320;  /* 4 
358e0 62 69 6c 6c 69 6f 6e 20 72 6f 77 73 20 2a 2f 0a  billion rows */.
358f0 20 20 7d 0a 20 20 63 6f 6d 70 75 74 65 4c 69 6d    }.  computeLim
35900 69 74 52 65 67 69 73 74 65 72 73 28 70 50 61 72  itRegisters(pPar
35910 73 65 2c 20 70 2c 20 69 45 6e 64 29 3b 0a 20 20  se, p, iEnd);.  
35920 69 66 28 20 70 2d 3e 69 4c 69 6d 69 74 3d 3d 30  if( p->iLimit==0
35930 20 26 26 20 73 53 6f 72 74 2e 61 64 64 72 53 6f   && sSort.addrSo
35940 72 74 49 6e 64 65 78 3e 3d 30 20 29 7b 0a 20 20  rtIndex>=0 ){.  
35950 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
35960 6e 67 65 4f 70 63 6f 64 65 28 76 2c 20 73 53 6f  ngeOpcode(v, sSo
35970 72 74 2e 61 64 64 72 53 6f 72 74 49 6e 64 65 78  rt.addrSortIndex
35980 2c 20 4f 50 5f 53 6f 72 74 65 72 4f 70 65 6e 29  , OP_SorterOpen)
35990 3b 0a 20 20 20 20 73 53 6f 72 74 2e 73 6f 72 74  ;.    sSort.sort
359a0 46 6c 61 67 73 20 7c 3d 20 53 4f 52 54 46 4c 41  Flags |= SORTFLA
359b0 47 5f 55 73 65 53 6f 72 74 65 72 3b 0a 20 20 7d  G_UseSorter;.  }
359c0 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 61 6e 20 65  ..  /* Open an e
359d0 70 68 65 6d 65 72 61 6c 20 69 6e 64 65 78 20 74  phemeral index t
359e0 6f 20 75 73 65 20 66 6f 72 20 74 68 65 20 64 69  o use for the di
359f0 73 74 69 6e 63 74 20 73 65 74 2e 0a 20 20 2a 2f  stinct set..  */
35a00 0a 20 20 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61  .  if( p->selFla
35a10 67 73 20 26 20 53 46 5f 44 69 73 74 69 6e 63 74  gs & SF_Distinct
35a20 20 29 7b 0a 20 20 20 20 73 44 69 73 74 69 6e 63   ){.    sDistinc
35a30 74 2e 74 61 62 54 6e 63 74 20 3d 20 70 50 61 72  t.tabTnct = pPar
35a40 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20  se->nTab++;.    
35a50 73 44 69 73 74 69 6e 63 74 2e 61 64 64 72 54 6e  sDistinct.addrTn
35a60 63 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  ct = sqlite3Vdbe
35a70 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4f 70 65  AddOp4(v, OP_Ope
35a80 6e 45 70 68 65 6d 65 72 61 6c 2c 0a 20 20 20 20  nEphemeral,.    
35a90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35aa0 20 20 20 73 44 69 73 74 69 6e 63 74 2e 74 61 62     sDistinct.tab
35ab0 54 6e 63 74 2c 20 30 2c 20 30 2c 0a 20 20 20 20  Tnct, 0, 0,.    
35ac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35ad0 20 20 20 28 63 68 61 72 2a 29 73 71 6c 69 74 65     (char*)sqlite
35ae0 33 4b 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72  3KeyInfoFromExpr
35af0 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 2d 3e  List(pParse, p->
35b00 70 45 4c 69 73 74 2c 30 2c 30 29 2c 0a 20 20 20  pEList,0,0),.   
35b10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35b20 20 20 20 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b      P4_KEYINFO);
35b30 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
35b40 43 68 61 6e 67 65 50 35 28 76 2c 20 42 54 52 45  ChangeP5(v, BTRE
35b50 45 5f 55 4e 4f 52 44 45 52 45 44 29 3b 0a 20 20  E_UNORDERED);.  
35b60 20 20 73 44 69 73 74 69 6e 63 74 2e 65 54 6e 63    sDistinct.eTnc
35b70 74 54 79 70 65 20 3d 20 57 48 45 52 45 5f 44 49  tType = WHERE_DI
35b80 53 54 49 4e 43 54 5f 55 4e 4f 52 44 45 52 45 44  STINCT_UNORDERED
35b90 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73  ;.  }else{.    s
35ba0 44 69 73 74 69 6e 63 74 2e 65 54 6e 63 74 54 79  Distinct.eTnctTy
35bb0 70 65 20 3d 20 57 48 45 52 45 5f 44 49 53 54 49  pe = WHERE_DISTI
35bc0 4e 43 54 5f 4e 4f 4f 50 3b 0a 20 20 7d 0a 0a 20  NCT_NOOP;.  }.. 
35bd0 20 69 66 28 20 21 69 73 41 67 67 20 26 26 20 70   if( !isAgg && p
35be0 47 72 6f 75 70 42 79 3d 3d 30 20 29 7b 0a 20 20  GroupBy==0 ){.  
35bf0 20 20 2f 2a 20 4e 6f 20 61 67 67 72 65 67 61 74    /* No aggregat
35c00 65 20 66 75 6e 63 74 69 6f 6e 73 20 61 6e 64 20  e functions and 
35c10 6e 6f 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75  no GROUP BY clau
35c20 73 65 20 2a 2f 0a 20 20 20 20 75 31 36 20 77 63  se */.    u16 wc
35c30 74 72 6c 46 6c 61 67 73 20 3d 20 28 73 44 69 73  trlFlags = (sDis
35c40 74 69 6e 63 74 2e 69 73 54 6e 63 74 20 3f 20 57  tinct.isTnct ? W
35c50 48 45 52 45 5f 57 41 4e 54 5f 44 49 53 54 49 4e  HERE_WANT_DISTIN
35c60 43 54 20 3a 20 30 29 0a 20 20 20 20 20 20 20 20  CT : 0).        
35c70 20 20 20 20 20 20 20 20 20 20 20 7c 20 28 70 2d             | (p-
35c80 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 46  >selFlags & SF_F
35c90 69 78 65 64 4c 69 6d 69 74 29 3b 0a 23 69 66 6e  ixedLimit);.#ifn
35ca0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
35cb0 57 49 4e 44 4f 57 46 55 4e 43 0a 20 20 20 20 57  WINDOWFUNC.    W
35cc0 69 6e 64 6f 77 20 2a 70 57 69 6e 20 3d 20 70 2d  indow *pWin = p-
35cd0 3e 70 57 69 6e 3b 20 20 20 20 20 20 2f 2a 20 4d  >pWin;      /* M
35ce0 61 73 74 65 72 20 77 69 6e 64 6f 77 20 6f 62 6a  aster window obj
35cf0 65 63 74 20 28 6f 72 20 4e 55 4c 4c 29 20 2a 2f  ect (or NULL) */
35d00 0a 20 20 20 20 69 66 28 20 70 57 69 6e 20 29 7b  .    if( pWin ){
35d10 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 57 69  .      sqlite3Wi
35d20 6e 64 6f 77 43 6f 64 65 49 6e 69 74 28 70 50 61  ndowCodeInit(pPa
35d30 72 73 65 2c 20 70 57 69 6e 29 3b 0a 20 20 20 20  rse, pWin);.    
35d40 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 61 73 73  }.#endif.    ass
35d50 65 72 74 28 20 57 48 45 52 45 5f 55 53 45 5f 4c  ert( WHERE_USE_L
35d60 49 4d 49 54 3d 3d 53 46 5f 46 69 78 65 64 4c 69  IMIT==SF_FixedLi
35d70 6d 69 74 20 29 3b 0a 0a 0a 20 20 20 20 2f 2a 20  mit );...    /* 
35d80 42 65 67 69 6e 20 74 68 65 20 64 61 74 61 62 61  Begin the databa
35d90 73 65 20 73 63 61 6e 2e 20 2a 2f 0a 20 20 20 20  se scan. */.    
35da0 53 45 4c 45 43 54 54 52 41 43 45 28 31 2c 70 50  SELECTTRACE(1,pP
35db0 61 72 73 65 2c 70 2c 28 22 57 68 65 72 65 42 65  arse,p,("WhereBe
35dc0 67 69 6e 5c 6e 22 29 29 3b 0a 20 20 20 20 70 57  gin\n"));.    pW
35dd0 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 57 68  Info = sqlite3Wh
35de0 65 72 65 42 65 67 69 6e 28 70 50 61 72 73 65 2c  ereBegin(pParse,
35df0 20 70 54 61 62 4c 69 73 74 2c 20 70 57 68 65 72   pTabList, pWher
35e00 65 2c 20 73 53 6f 72 74 2e 70 4f 72 64 65 72 42  e, sSort.pOrderB
35e10 79 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  y,.             
35e20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35e30 20 20 70 2d 3e 70 45 4c 69 73 74 2c 20 77 63 74    p->pEList, wct
35e40 72 6c 46 6c 61 67 73 2c 20 70 2d 3e 6e 53 65 6c  rlFlags, p->nSel
35e50 65 63 74 52 6f 77 29 3b 0a 20 20 20 20 69 66 28  ectRow);.    if(
35e60 20 70 57 49 6e 66 6f 3d 3d 30 20 29 20 67 6f 74   pWInfo==0 ) got
35e70 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  o select_end;.  
35e80 20 20 69 66 28 20 73 71 6c 69 74 65 33 57 68 65    if( sqlite3Whe
35e90 72 65 4f 75 74 70 75 74 52 6f 77 43 6f 75 6e 74  reOutputRowCount
35ea0 28 70 57 49 6e 66 6f 29 20 3c 20 70 2d 3e 6e 53  (pWInfo) < p->nS
35eb0 65 6c 65 63 74 52 6f 77 20 29 7b 0a 20 20 20 20  electRow ){.    
35ec0 20 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20    p->nSelectRow 
35ed0 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65 4f 75  = sqlite3WhereOu
35ee0 74 70 75 74 52 6f 77 43 6f 75 6e 74 28 70 57 49  tputRowCount(pWI
35ef0 6e 66 6f 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  nfo);.    }.    
35f00 69 66 28 20 73 44 69 73 74 69 6e 63 74 2e 69 73  if( sDistinct.is
35f10 54 6e 63 74 20 26 26 20 73 71 6c 69 74 65 33 57  Tnct && sqlite3W
35f20 68 65 72 65 49 73 44 69 73 74 69 6e 63 74 28 70  hereIsDistinct(p
35f30 57 49 6e 66 6f 29 20 29 7b 0a 20 20 20 20 20 20  WInfo) ){.      
35f40 73 44 69 73 74 69 6e 63 74 2e 65 54 6e 63 74 54  sDistinct.eTnctT
35f50 79 70 65 20 3d 20 73 71 6c 69 74 65 33 57 68 65  ype = sqlite3Whe
35f60 72 65 49 73 44 69 73 74 69 6e 63 74 28 70 57 49  reIsDistinct(pWI
35f70 6e 66 6f 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  nfo);.    }.    
35f80 69 66 28 20 73 53 6f 72 74 2e 70 4f 72 64 65 72  if( sSort.pOrder
35f90 42 79 20 29 7b 0a 20 20 20 20 20 20 73 53 6f 72  By ){.      sSor
35fa0 74 2e 6e 4f 42 53 61 74 20 3d 20 73 71 6c 69 74  t.nOBSat = sqlit
35fb0 65 33 57 68 65 72 65 49 73 4f 72 64 65 72 65 64  e3WhereIsOrdered
35fc0 28 70 57 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20  (pWInfo);.      
35fd0 73 53 6f 72 74 2e 6c 61 62 65 6c 4f 42 4c 6f 70  sSort.labelOBLop
35fe0 74 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65  t = sqlite3Where
35ff0 4f 72 64 65 72 42 79 4c 69 6d 69 74 4f 70 74 4c  OrderByLimitOptL
36000 61 62 65 6c 28 70 57 49 6e 66 6f 29 3b 0a 20 20  abel(pWInfo);.  
36010 20 20 20 20 69 66 28 20 73 53 6f 72 74 2e 6e 4f      if( sSort.nO
36020 42 53 61 74 3d 3d 73 53 6f 72 74 2e 70 4f 72 64  BSat==sSort.pOrd
36030 65 72 42 79 2d 3e 6e 45 78 70 72 20 29 7b 0a 20  erBy->nExpr ){. 
36040 20 20 20 20 20 20 20 73 53 6f 72 74 2e 70 4f 72         sSort.pOr
36050 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 20 20 20  derBy = 0;.     
36060 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
36070 20 49 66 20 73 6f 72 74 69 6e 67 20 69 6e 64 65   If sorting inde
36080 78 20 74 68 61 74 20 77 61 73 20 63 72 65 61 74  x that was creat
36090 65 64 20 62 79 20 61 20 70 72 69 6f 72 20 4f 50  ed by a prior OP
360a0 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 0a  _OpenEphemeral .
360b0 20 20 20 20 2a 2a 20 69 6e 73 74 72 75 63 74 69      ** instructi
360c0 6f 6e 20 65 6e 64 65 64 20 75 70 20 6e 6f 74 20  on ended up not 
360d0 62 65 69 6e 67 20 6e 65 65 64 65 64 2c 20 74 68  being needed, th
360e0 65 6e 20 63 68 61 6e 67 65 20 74 68 65 20 4f 50  en change the OP
360f0 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 0a 20  _OpenEphemeral. 
36100 20 20 20 2a 2a 20 69 6e 74 6f 20 61 6e 20 4f 50     ** into an OP
36110 5f 4e 6f 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20 20  _Noop..    */.  
36120 20 20 69 66 28 20 73 53 6f 72 74 2e 61 64 64 72    if( sSort.addr
36130 53 6f 72 74 49 6e 64 65 78 3e 3d 30 20 26 26 20  SortIndex>=0 && 
36140 73 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 3d 3d  sSort.pOrderBy==
36150 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
36160 65 33 56 64 62 65 43 68 61 6e 67 65 54 6f 4e 6f  e3VdbeChangeToNo
36170 6f 70 28 76 2c 20 73 53 6f 72 74 2e 61 64 64 72  op(v, sSort.addr
36180 53 6f 72 74 49 6e 64 65 78 29 3b 0a 20 20 20 20  SortIndex);.    
36190 7d 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  }..    assert( p
361a0 2d 3e 70 45 4c 69 73 74 3d 3d 70 45 4c 69 73 74  ->pEList==pEList
361b0 20 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   );.#ifndef SQLI
361c0 54 45 5f 4f 4d 49 54 5f 57 49 4e 44 4f 57 46 55  TE_OMIT_WINDOWFU
361d0 4e 43 0a 20 20 20 20 69 66 28 20 70 57 69 6e 20  NC.    if( pWin 
361e0 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64  ){.      int add
361f0 72 47 6f 73 75 62 20 3d 20 73 71 6c 69 74 65 33  rGosub = sqlite3
36200 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 70 50  VdbeMakeLabel(pP
36210 61 72 73 65 29 3b 0a 20 20 20 20 20 20 69 6e 74  arse);.      int
36220 20 69 43 6f 6e 74 20 3d 20 73 71 6c 69 74 65 33   iCont = sqlite3
36230 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 70 50  VdbeMakeLabel(pP
36240 61 72 73 65 29 3b 0a 20 20 20 20 20 20 69 6e 74  arse);.      int
36250 20 69 42 72 65 61 6b 20 3d 20 73 71 6c 69 74 65   iBreak = sqlite
36260 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 70  3VdbeMakeLabel(p
36270 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 69 6e  Parse);.      in
36280 74 20 72 65 67 47 6f 73 75 62 20 3d 20 2b 2b 70  t regGosub = ++p
36290 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 0a 20 20  Parse->nMem;..  
362a0 20 20 20 20 73 71 6c 69 74 65 33 57 69 6e 64 6f      sqlite3Windo
362b0 77 43 6f 64 65 53 74 65 70 28 70 50 61 72 73 65  wCodeStep(pParse
362c0 2c 20 70 2c 20 70 57 49 6e 66 6f 2c 20 72 65 67  , p, pWInfo, reg
362d0 47 6f 73 75 62 2c 20 61 64 64 72 47 6f 73 75 62  Gosub, addrGosub
362e0 29 3b 0a 0a 20 20 20 20 20 20 73 71 6c 69 74 65  );..      sqlite
362f0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
36300 50 5f 47 6f 74 6f 2c 20 30 2c 20 69 42 72 65 61  P_Goto, 0, iBrea
36310 6b 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  k);.      sqlite
36320 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
36330 6c 28 76 2c 20 61 64 64 72 47 6f 73 75 62 29 3b  l(v, addrGosub);
36340 0a 20 20 20 20 20 20 56 64 62 65 4e 6f 6f 70 43  .      VdbeNoopC
36350 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 69 6e 6e 65  omment((v, "inne
36360 72 2d 6c 6f 6f 70 20 73 75 62 72 6f 75 74 69 6e  r-loop subroutin
36370 65 22 29 29 3b 0a 20 20 20 20 20 20 73 53 6f 72  e"));.      sSor
36380 74 2e 6c 61 62 65 6c 4f 42 4c 6f 70 74 20 3d 20  t.labelOBLopt = 
36390 30 3b 0a 20 20 20 20 20 20 73 65 6c 65 63 74 49  0;.      selectI
363a0 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c  nnerLoop(pParse,
363b0 20 70 2c 20 2d 31 2c 20 26 73 53 6f 72 74 2c 20   p, -1, &sSort, 
363c0 26 73 44 69 73 74 69 6e 63 74 2c 20 70 44 65 73  &sDistinct, pDes
363d0 74 2c 20 69 43 6f 6e 74 2c 20 69 42 72 65 61 6b  t, iCont, iBreak
363e0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
363f0 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
36400 28 76 2c 20 69 43 6f 6e 74 29 3b 0a 20 20 20 20  (v, iCont);.    
36410 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
36420 4f 70 31 28 76 2c 20 4f 50 5f 52 65 74 75 72 6e  Op1(v, OP_Return
36430 2c 20 72 65 67 47 6f 73 75 62 29 3b 0a 20 20 20  , regGosub);.   
36440 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
36450 76 2c 20 22 65 6e 64 20 69 6e 6e 65 72 2d 6c 6f  v, "end inner-lo
36460 6f 70 20 73 75 62 72 6f 75 74 69 6e 65 22 29 29  op subroutine"))
36470 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
36480 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
36490 76 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20  v, iBreak);.    
364a0 7d 65 6c 73 65 0a 23 65 6e 64 69 66 20 2f 2a 20  }else.#endif /* 
364b0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 49 4e 44  SQLITE_OMIT_WIND
364c0 4f 57 46 55 4e 43 20 2a 2f 0a 20 20 20 20 7b 0a  OWFUNC */.    {.
364d0 20 20 20 20 20 20 2f 2a 20 55 73 65 20 74 68 65        /* Use the
364e0 20 73 74 61 6e 64 61 72 64 20 69 6e 6e 65 72 20   standard inner 
364f0 6c 6f 6f 70 2e 20 2a 2f 0a 20 20 20 20 20 20 73  loop. */.      s
36500 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70  electInnerLoop(p
36510 50 61 72 73 65 2c 20 70 2c 20 2d 31 2c 20 26 73  Parse, p, -1, &s
36520 53 6f 72 74 2c 20 26 73 44 69 73 74 69 6e 63 74  Sort, &sDistinct
36530 2c 20 70 44 65 73 74 2c 0a 20 20 20 20 20 20 20  , pDest,.       
36540 20 20 20 73 71 6c 69 74 65 33 57 68 65 72 65 43     sqlite3WhereC
36550 6f 6e 74 69 6e 75 65 4c 61 62 65 6c 28 70 57 49  ontinueLabel(pWI
36560 6e 66 6f 29 2c 0a 20 20 20 20 20 20 20 20 20 20  nfo),.          
36570 73 71 6c 69 74 65 33 57 68 65 72 65 42 72 65 61  sqlite3WhereBrea
36580 6b 4c 61 62 65 6c 28 70 57 49 6e 66 6f 29 29 3b  kLabel(pWInfo));
36590 0a 0a 20 20 20 20 20 20 2f 2a 20 45 6e 64 20 74  ..      /* End t
365a0 68 65 20 64 61 74 61 62 61 73 65 20 73 63 61 6e  he database scan
365b0 20 6c 6f 6f 70 2e 0a 20 20 20 20 20 20 2a 2f 0a   loop..      */.
365c0 20 20 20 20 20 20 73 71 6c 69 74 65 33 57 68 65        sqlite3Whe
365d0 72 65 45 6e 64 28 70 57 49 6e 66 6f 29 3b 0a 20  reEnd(pWInfo);. 
365e0 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
365f0 20 20 2f 2a 20 54 68 69 73 20 63 61 73 65 20 77    /* This case w
36600 68 65 6e 20 74 68 65 72 65 20 65 78 69 73 74 20  hen there exist 
36610 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69  aggregate functi
36620 6f 6e 73 20 6f 72 20 61 20 47 52 4f 55 50 20 42  ons or a GROUP B
36630 59 20 63 6c 61 75 73 65 0a 20 20 20 20 2a 2a 20  Y clause.    ** 
36640 6f 72 20 62 6f 74 68 20 2a 2f 0a 20 20 20 20 4e  or both */.    N
36650 61 6d 65 43 6f 6e 74 65 78 74 20 73 4e 43 3b 20  ameContext sNC; 
36660 20 20 20 2f 2a 20 4e 61 6d 65 20 63 6f 6e 74 65     /* Name conte
36670 78 74 20 66 6f 72 20 70 72 6f 63 65 73 73 69 6e  xt for processin
36680 67 20 61 67 67 72 65 67 61 74 65 20 69 6e 66 6f  g aggregate info
36690 72 6d 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 69  rmation */.    i
366a0 6e 74 20 69 41 4d 65 6d 3b 20 20 20 20 20 20 20  nt iAMem;       
366b0 20 20 20 2f 2a 20 46 69 72 73 74 20 4d 65 6d 20     /* First Mem 
366c0 61 64 64 72 65 73 73 20 66 6f 72 20 73 74 6f 72  address for stor
366d0 69 6e 67 20 63 75 72 72 65 6e 74 20 47 52 4f 55  ing current GROU
366e0 50 20 42 59 20 2a 2f 0a 20 20 20 20 69 6e 74 20  P BY */.    int 
366f0 69 42 4d 65 6d 3b 20 20 20 20 20 20 20 20 20 20  iBMem;          
36700 2f 2a 20 46 69 72 73 74 20 4d 65 6d 20 61 64 64  /* First Mem add
36710 72 65 73 73 20 66 6f 72 20 70 72 65 76 69 6f 75  ress for previou
36720 73 20 47 52 4f 55 50 20 42 59 20 2a 2f 0a 20 20  s GROUP BY */.  
36730 20 20 69 6e 74 20 69 55 73 65 46 6c 61 67 3b 20    int iUseFlag; 
36740 20 20 20 20 20 20 2f 2a 20 4d 65 6d 20 61 64 64        /* Mem add
36750 72 65 73 73 20 68 6f 6c 64 69 6e 67 20 66 6c 61  ress holding fla
36760 67 20 69 6e 64 69 63 61 74 69 6e 67 20 74 68 61  g indicating tha
36770 74 20 61 74 20 6c 65 61 73 74 0a 20 20 20 20 20  t at least.     
36780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36790 20 20 20 2a 2a 20 6f 6e 65 20 72 6f 77 20 6f 66     ** one row of
367a0 20 74 68 65 20 69 6e 70 75 74 20 74 6f 20 74 68   the input to th
367b0 65 20 61 67 67 72 65 67 61 74 6f 72 20 68 61 73  e aggregator has
367c0 20 62 65 65 6e 0a 20 20 20 20 20 20 20 20 20 20   been.          
367d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a                **
367e0 20 70 72 6f 63 65 73 73 65 64 20 2a 2f 0a 20 20   processed */.  
367f0 20 20 69 6e 74 20 69 41 62 6f 72 74 46 6c 61 67    int iAbortFlag
36800 3b 20 20 20 20 20 2f 2a 20 4d 65 6d 20 61 64 64  ;     /* Mem add
36810 72 65 73 73 20 77 68 69 63 68 20 63 61 75 73 65  ress which cause
36820 73 20 71 75 65 72 79 20 61 62 6f 72 74 20 69 66  s query abort if
36830 20 70 6f 73 69 74 69 76 65 20 2a 2f 0a 20 20 20   positive */.   
36840 20 69 6e 74 20 67 72 6f 75 70 42 79 53 6f 72 74   int groupBySort
36850 3b 20 20 20 20 2f 2a 20 52 6f 77 73 20 63 6f 6d  ;    /* Rows com
36860 65 20 66 72 6f 6d 20 73 6f 75 72 63 65 20 69 6e  e from source in
36870 20 47 52 4f 55 50 20 42 59 20 6f 72 64 65 72 20   GROUP BY order 
36880 2a 2f 0a 20 20 20 20 69 6e 74 20 61 64 64 72 45  */.    int addrE
36890 6e 64 3b 20 20 20 20 20 20 20 20 2f 2a 20 45 6e  nd;        /* En
368a0 64 20 6f 66 20 70 72 6f 63 65 73 73 69 6e 67 20  d of processing 
368b0 66 6f 72 20 74 68 69 73 20 53 45 4c 45 43 54 20  for this SELECT 
368c0 2a 2f 0a 20 20 20 20 69 6e 74 20 73 6f 72 74 50  */.    int sortP
368d0 54 61 62 20 3d 20 30 3b 20 20 20 2f 2a 20 50 73  Tab = 0;   /* Ps
368e0 65 75 64 6f 74 61 62 6c 65 20 75 73 65 64 20 74  eudotable used t
368f0 6f 20 64 65 63 6f 64 65 20 73 6f 72 74 69 6e 67  o decode sorting
36900 20 72 65 73 75 6c 74 73 20 2a 2f 0a 20 20 20 20   results */.    
36910 69 6e 74 20 73 6f 72 74 4f 75 74 20 3d 20 30 3b  int sortOut = 0;
36920 20 20 20 20 2f 2a 20 4f 75 74 70 75 74 20 72 65      /* Output re
36930 67 69 73 74 65 72 20 66 72 6f 6d 20 74 68 65 20  gister from the 
36940 73 6f 72 74 65 72 20 2a 2f 0a 20 20 20 20 69 6e  sorter */.    in
36950 74 20 6f 72 64 65 72 42 79 47 72 70 20 3d 20 30  t orderByGrp = 0
36960 3b 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65  ; /* True if the
36970 20 47 52 4f 55 50 20 42 59 20 61 6e 64 20 4f 52   GROUP BY and OR
36980 44 45 52 20 42 59 20 61 72 65 20 74 68 65 20 73  DER BY are the s
36990 61 6d 65 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 52  ame */..    /* R
369a0 65 6d 6f 76 65 20 61 6e 79 20 61 6e 64 20 61 6c  emove any and al
369b0 6c 20 61 6c 69 61 73 65 73 20 62 65 74 77 65 65  l aliases betwee
369c0 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  n the result set
369d0 20 61 6e 64 20 74 68 65 0a 20 20 20 20 2a 2a 20   and the.    ** 
369e0 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 2e  GROUP BY clause.
369f0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
36a00 70 47 72 6f 75 70 42 79 20 29 7b 0a 20 20 20 20  pGroupBy ){.    
36a10 20 20 69 6e 74 20 6b 3b 20 20 20 20 20 20 20 20    int k;        
36a20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36a30 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  /* Loop counter 
36a40 2a 2f 0a 20 20 20 20 20 20 73 74 72 75 63 74 20  */.      struct 
36a50 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70  ExprList_item *p
36a60 49 74 65 6d 3b 20 20 2f 2a 20 46 6f 72 20 6c 6f  Item;  /* For lo
36a70 6f 70 69 6e 67 20 6f 76 65 72 20 65 78 70 72 65  oping over expre
36a80 73 73 69 6f 6e 20 69 6e 20 61 20 6c 69 73 74 20  ssion in a list 
36a90 2a 2f 0a 0a 20 20 20 20 20 20 66 6f 72 28 6b 3d  */..      for(k=
36aa0 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  p->pEList->nExpr
36ab0 2c 20 70 49 74 65 6d 3d 70 2d 3e 70 45 4c 69 73  , pItem=p->pELis
36ac0 74 2d 3e 61 3b 20 6b 3e 30 3b 20 6b 2d 2d 2c 20  t->a; k>0; k--, 
36ad0 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20  pItem++){.      
36ae0 20 20 70 49 74 65 6d 2d 3e 75 2e 78 2e 69 41 6c    pItem->u.x.iAl
36af0 69 61 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  ias = 0;.      }
36b00 0a 20 20 20 20 20 20 66 6f 72 28 6b 3d 70 47 72  .      for(k=pGr
36b10 6f 75 70 42 79 2d 3e 6e 45 78 70 72 2c 20 70 49  oupBy->nExpr, pI
36b20 74 65 6d 3d 70 47 72 6f 75 70 42 79 2d 3e 61 3b  tem=pGroupBy->a;
36b30 20 6b 3e 30 3b 20 6b 2d 2d 2c 20 70 49 74 65 6d   k>0; k--, pItem
36b40 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 70 49 74  ++){.        pIt
36b50 65 6d 2d 3e 75 2e 78 2e 69 41 6c 69 61 73 20 3d  em->u.x.iAlias =
36b60 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
36b70 20 20 61 73 73 65 72 74 28 20 36 36 3d 3d 73 71    assert( 66==sq
36b80 6c 69 74 65 33 4c 6f 67 45 73 74 28 31 30 30 29  lite3LogEst(100)
36b90 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d   );.      if( p-
36ba0 3e 6e 53 65 6c 65 63 74 52 6f 77 3e 36 36 20 29  >nSelectRow>66 )
36bb0 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d   p->nSelectRow =
36bc0 20 36 36 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a   66;.    }else{.
36bd0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 30 3d        assert( 0=
36be0 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 31  =sqlite3LogEst(1
36bf0 29 20 29 3b 0a 20 20 20 20 20 20 70 2d 3e 6e 53  ) );.      p->nS
36c00 65 6c 65 63 74 52 6f 77 20 3d 20 30 3b 0a 20 20  electRow = 0;.  
36c10 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74    }..    /* If t
36c20 68 65 72 65 20 69 73 20 62 6f 74 68 20 61 20 47  here is both a G
36c30 52 4f 55 50 20 42 59 20 61 6e 64 20 61 6e 20 4f  ROUP BY and an O
36c40 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 61  RDER BY clause a
36c50 6e 64 20 74 68 65 79 20 61 72 65 0a 20 20 20 20  nd they are.    
36c60 2a 2a 20 69 64 65 6e 74 69 63 61 6c 2c 20 74 68  ** identical, th
36c70 65 6e 20 69 74 20 6d 61 79 20 62 65 20 70 6f 73  en it may be pos
36c80 73 69 62 6c 65 20 74 6f 20 64 69 73 61 62 6c 65  sible to disable
36c90 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   the ORDER BY cl
36ca0 61 75 73 65 20 0a 20 20 20 20 2a 2a 20 6f 6e 20  ause .    ** on 
36cb0 74 68 65 20 67 72 6f 75 6e 64 73 20 74 68 61 74  the grounds that
36cc0 20 74 68 65 20 47 52 4f 55 50 20 42 59 20 77 69   the GROUP BY wi
36cd0 6c 6c 20 63 61 75 73 65 20 65 6c 65 6d 65 6e 74  ll cause element
36ce0 73 20 74 6f 20 63 6f 6d 65 20 6f 75 74 20 0a 20  s to come out . 
36cf0 20 20 20 2a 2a 20 69 6e 20 74 68 65 20 63 6f 72     ** in the cor
36d00 72 65 63 74 20 6f 72 64 65 72 2e 20 49 74 20 61  rect order. It a
36d10 6c 73 6f 20 6d 61 79 20 6e 6f 74 20 2d 20 74 68  lso may not - th
36d20 65 20 47 52 4f 55 50 20 42 59 20 6d 69 67 68 74  e GROUP BY might
36d30 20 75 73 65 20 61 0a 20 20 20 20 2a 2a 20 64 61   use a.    ** da
36d40 74 61 62 61 73 65 20 69 6e 64 65 78 20 74 68 61  tabase index tha
36d50 74 20 63 61 75 73 65 73 20 72 6f 77 73 20 74 6f  t causes rows to
36d60 20 62 65 20 67 72 6f 75 70 65 64 20 74 6f 67 65   be grouped toge
36d70 74 68 65 72 20 61 73 20 72 65 71 75 69 72 65 64  ther as required
36d80 0a 20 20 20 20 2a 2a 20 62 75 74 20 6e 6f 74 20  .    ** but not 
36d90 61 63 74 75 61 6c 6c 79 20 73 6f 72 74 65 64 2e  actually sorted.
36da0 20 45 69 74 68 65 72 20 77 61 79 2c 20 72 65 63   Either way, rec
36db0 6f 72 64 20 74 68 65 20 66 61 63 74 20 74 68 61  ord the fact tha
36dc0 74 20 74 68 65 0a 20 20 20 20 2a 2a 20 4f 52 44  t the.    ** ORD
36dd0 45 52 20 42 59 20 61 6e 64 20 47 52 4f 55 50 20  ER BY and GROUP 
36de0 42 59 20 63 6c 61 75 73 65 73 20 61 72 65 20 74  BY clauses are t
36df0 68 65 20 73 61 6d 65 20 62 79 20 73 65 74 74 69  he same by setti
36e00 6e 67 20 74 68 65 20 6f 72 64 65 72 42 79 47 72  ng the orderByGr
36e10 70 0a 20 20 20 20 2a 2a 20 76 61 72 69 61 62 6c  p.    ** variabl
36e20 65 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 73  e.  */.    if( s
36e30 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 43 6f  qlite3ExprListCo
36e40 6d 70 61 72 65 28 70 47 72 6f 75 70 42 79 2c 20  mpare(pGroupBy, 
36e50 73 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 2c 20  sSort.pOrderBy, 
36e60 2d 31 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  -1)==0 ){.      
36e70 6f 72 64 65 72 42 79 47 72 70 20 3d 20 31 3b 0a  orderByGrp = 1;.
36e80 20 20 20 20 7d 0a 20 0a 20 20 20 20 2f 2a 20 43      }. .    /* C
36e90 72 65 61 74 65 20 61 20 6c 61 62 65 6c 20 74 6f  reate a label to
36ea0 20 6a 75 6d 70 20 74 6f 20 77 68 65 6e 20 77 65   jump to when we
36eb0 20 77 61 6e 74 20 74 6f 20 61 62 6f 72 74 20 74   want to abort t
36ec0 68 65 20 71 75 65 72 79 20 2a 2f 0a 20 20 20 20  he query */.    
36ed0 61 64 64 72 45 6e 64 20 3d 20 73 71 6c 69 74 65  addrEnd = sqlite
36ee0 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 70  3VdbeMakeLabel(p
36ef0 50 61 72 73 65 29 3b 0a 0a 20 20 20 20 2f 2a 20  Parse);..    /* 
36f00 43 6f 6e 76 65 72 74 20 54 4b 5f 43 4f 4c 55 4d  Convert TK_COLUM
36f10 4e 20 6e 6f 64 65 73 20 69 6e 74 6f 20 54 4b 5f  N nodes into TK_
36f20 41 47 47 5f 43 4f 4c 55 4d 4e 20 61 6e 64 20 6d  AGG_COLUMN and m
36f30 61 6b 65 20 65 6e 74 72 69 65 73 20 69 6e 0a 20  ake entries in. 
36f40 20 20 20 2a 2a 20 73 41 67 67 49 6e 66 6f 20 66     ** sAggInfo f
36f50 6f 72 20 61 6c 6c 20 54 4b 5f 41 47 47 5f 46 55  or all TK_AGG_FU
36f60 4e 43 54 49 4f 4e 20 6e 6f 64 65 73 20 69 6e 20  NCTION nodes in 
36f70 65 78 70 72 65 73 73 69 6f 6e 73 20 6f 66 20 74  expressions of t
36f80 68 65 0a 20 20 20 20 2a 2a 20 53 45 4c 45 43 54  he.    ** SELECT
36f90 20 73 74 61 74 65 6d 65 6e 74 2e 0a 20 20 20 20   statement..    
36fa0 2a 2f 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 73  */.    memset(&s
36fb0 4e 43 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 4e  NC, 0, sizeof(sN
36fc0 43 29 29 3b 0a 20 20 20 20 73 4e 43 2e 70 50 61  C));.    sNC.pPa
36fd0 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20  rse = pParse;.  
36fe0 20 20 73 4e 43 2e 70 53 72 63 4c 69 73 74 20 3d    sNC.pSrcList =
36ff0 20 70 54 61 62 4c 69 73 74 3b 0a 20 20 20 20 73   pTabList;.    s
37000 4e 43 2e 75 4e 43 2e 70 41 67 67 49 6e 66 6f 20  NC.uNC.pAggInfo 
37010 3d 20 26 73 41 67 67 49 6e 66 6f 3b 0a 20 20 20  = &sAggInfo;.   
37020 20 56 56 41 5f 4f 4e 4c 59 28 20 73 4e 43 2e 6e   VVA_ONLY( sNC.n
37030 63 46 6c 61 67 73 20 3d 20 4e 43 5f 55 41 67 67  cFlags = NC_UAgg
37040 49 6e 66 6f 3b 20 29 0a 20 20 20 20 73 41 67 67  Info; ).    sAgg
37050 49 6e 66 6f 2e 6d 6e 52 65 67 20 3d 20 70 50 61  Info.mnReg = pPa
37060 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20  rse->nMem+1;.   
37070 20 73 41 67 67 49 6e 66 6f 2e 6e 53 6f 72 74 69   sAggInfo.nSorti
37080 6e 67 43 6f 6c 75 6d 6e 20 3d 20 70 47 72 6f 75  ngColumn = pGrou
37090 70 42 79 20 3f 20 70 47 72 6f 75 70 42 79 2d 3e  pBy ? pGroupBy->
370a0 6e 45 78 70 72 20 3a 20 30 3b 0a 20 20 20 20 73  nExpr : 0;.    s
370b0 41 67 67 49 6e 66 6f 2e 70 47 72 6f 75 70 42 79  AggInfo.pGroupBy
370c0 20 3d 20 70 47 72 6f 75 70 42 79 3b 0a 20 20 20   = pGroupBy;.   
370d0 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c   sqlite3ExprAnal
370e0 79 7a 65 41 67 67 4c 69 73 74 28 26 73 4e 43 2c  yzeAggList(&sNC,
370f0 20 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 73 71   pEList);.    sq
37100 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65  lite3ExprAnalyze
37110 41 67 67 4c 69 73 74 28 26 73 4e 43 2c 20 73 53  AggList(&sNC, sS
37120 6f 72 74 2e 70 4f 72 64 65 72 42 79 29 3b 0a 20  ort.pOrderBy);. 
37130 20 20 20 69 66 28 20 70 48 61 76 69 6e 67 20 29     if( pHaving )
37140 7b 0a 20 20 20 20 20 20 69 66 28 20 70 47 72 6f  {.      if( pGro
37150 75 70 42 79 20 29 7b 0a 20 20 20 20 20 20 20 20  upBy ){.        
37160 61 73 73 65 72 74 28 20 70 57 68 65 72 65 3d 3d  assert( pWhere==
37170 70 2d 3e 70 57 68 65 72 65 20 29 3b 0a 20 20 20  p->pWhere );.   
37180 20 20 20 20 20 61 73 73 65 72 74 28 20 70 48 61       assert( pHa
37190 76 69 6e 67 3d 3d 70 2d 3e 70 48 61 76 69 6e 67  ving==p->pHaving
371a0 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65   );.        asse
371b0 72 74 28 20 70 47 72 6f 75 70 42 79 3d 3d 70 2d  rt( pGroupBy==p-
371c0 3e 70 47 72 6f 75 70 42 79 20 29 3b 0a 20 20 20  >pGroupBy );.   
371d0 20 20 20 20 20 68 61 76 69 6e 67 54 6f 57 68 65       havingToWhe
371e0 72 65 28 70 50 61 72 73 65 2c 20 70 29 3b 0a 20  re(pParse, p);. 
371f0 20 20 20 20 20 20 20 70 57 68 65 72 65 20 3d 20         pWhere = 
37200 70 2d 3e 70 57 68 65 72 65 3b 0a 20 20 20 20 20  p->pWhere;.     
37210 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
37220 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 72 65  ExprAnalyzeAggre
37230 67 61 74 65 73 28 26 73 4e 43 2c 20 70 48 61 76  gates(&sNC, pHav
37240 69 6e 67 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ing);.    }.    
37250 73 41 67 67 49 6e 66 6f 2e 6e 41 63 63 75 6d 75  sAggInfo.nAccumu
37260 6c 61 74 6f 72 20 3d 20 73 41 67 67 49 6e 66 6f  lator = sAggInfo
37270 2e 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 69 66  .nColumn;.    if
37280 28 20 70 2d 3e 70 47 72 6f 75 70 42 79 3d 3d 30  ( p->pGroupBy==0
37290 20 26 26 20 70 2d 3e 70 48 61 76 69 6e 67 3d 3d   && p->pHaving==
372a0 30 20 26 26 20 73 41 67 67 49 6e 66 6f 2e 6e 46  0 && sAggInfo.nF
372b0 75 6e 63 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20  unc==1 ){.      
372c0 6d 69 6e 4d 61 78 46 6c 61 67 20 3d 20 6d 69 6e  minMaxFlag = min
372d0 4d 61 78 51 75 65 72 79 28 64 62 2c 20 73 41 67  MaxQuery(db, sAg
372e0 67 49 6e 66 6f 2e 61 46 75 6e 63 5b 30 5d 2e 70  gInfo.aFunc[0].p
372f0 45 78 70 72 2c 20 26 70 4d 69 6e 4d 61 78 4f 72  Expr, &pMinMaxOr
37300 64 65 72 42 79 29 3b 0a 20 20 20 20 7d 65 6c 73  derBy);.    }els
37310 65 7b 0a 20 20 20 20 20 20 6d 69 6e 4d 61 78 46  e{.      minMaxF
37320 6c 61 67 20 3d 20 57 48 45 52 45 5f 4f 52 44 45  lag = WHERE_ORDE
37330 52 42 59 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 20 20  RBY_NORMAL;.    
37340 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  }.    for(i=0; i
37350 3c 73 41 67 67 49 6e 66 6f 2e 6e 46 75 6e 63 3b  <sAggInfo.nFunc;
37360 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 45 78 70   i++){.      Exp
37370 72 20 2a 70 45 78 70 72 20 3d 20 73 41 67 67 49  r *pExpr = sAggI
37380 6e 66 6f 2e 61 46 75 6e 63 5b 69 5d 2e 70 45 78  nfo.aFunc[i].pEx
37390 70 72 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  pr;.      assert
373a0 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
373b0 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73  ty(pExpr, EP_xIs
373c0 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 20 20 20  Select) );.     
373d0 20 73 4e 43 2e 6e 63 46 6c 61 67 73 20 7c 3d 20   sNC.ncFlags |= 
373e0 4e 43 5f 49 6e 41 67 67 46 75 6e 63 3b 0a 20 20  NC_InAggFunc;.  
373f0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 41      sqlite3ExprA
37400 6e 61 6c 79 7a 65 41 67 67 4c 69 73 74 28 26 73  nalyzeAggList(&s
37410 4e 43 2c 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69  NC, pExpr->x.pLi
37420 73 74 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  st);.#ifndef SQL
37430 49 54 45 5f 4f 4d 49 54 5f 57 49 4e 44 4f 57 46  ITE_OMIT_WINDOWF
37440 55 4e 43 0a 20 20 20 20 20 20 61 73 73 65 72 74  UNC.      assert
37450 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
37460 74 79 28 70 45 78 70 72 2c 20 45 50 5f 57 69 6e  ty(pExpr, EP_Win
37470 46 75 6e 63 29 20 29 3b 0a 20 20 20 20 20 20 69  Func) );.      i
37480 66 28 20 70 45 78 70 72 2d 3e 79 2e 70 46 69 6c  f( pExpr->y.pFil
37490 74 65 72 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ter ){.        s
374a0 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a  qlite3ExprAnalyz
374b0 65 41 67 67 72 65 67 61 74 65 73 28 26 73 4e 43  eAggregates(&sNC
374c0 2c 20 70 45 78 70 72 2d 3e 79 2e 70 46 69 6c 74  , pExpr->y.pFilt
374d0 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e  er);.      }.#en
374e0 64 69 66 0a 20 20 20 20 20 20 73 4e 43 2e 6e 63  dif.      sNC.nc
374f0 46 6c 61 67 73 20 26 3d 20 7e 4e 43 5f 49 6e 41  Flags &= ~NC_InA
37500 67 67 46 75 6e 63 3b 0a 20 20 20 20 7d 0a 20 20  ggFunc;.    }.  
37510 20 20 73 41 67 67 49 6e 66 6f 2e 6d 78 52 65 67    sAggInfo.mxReg
37520 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   = pParse->nMem;
37530 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c  .    if( db->mal
37540 6c 6f 63 46 61 69 6c 65 64 20 29 20 67 6f 74 6f  locFailed ) goto
37550 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 23 69 66   select_end;.#if
37560 20 53 45 4c 45 43 54 54 52 41 43 45 5f 45 4e 41   SELECTTRACE_ENA
37570 42 4c 45 44 0a 20 20 20 20 69 66 28 20 73 71 6c  BLED.    if( sql
37580 69 74 65 33 53 65 6c 65 63 74 54 72 61 63 65 20  ite3SelectTrace 
37590 26 20 30 78 34 30 30 20 29 7b 0a 20 20 20 20 20  & 0x400 ){.     
375a0 20 69 6e 74 20 69 69 3b 0a 20 20 20 20 20 20 53   int ii;.      S
375b0 45 4c 45 43 54 54 52 41 43 45 28 30 78 34 30 30  ELECTTRACE(0x400
375c0 2c 70 50 61 72 73 65 2c 70 2c 28 22 41 66 74 65  ,pParse,p,("Afte
375d0 72 20 61 67 67 72 65 67 61 74 65 20 61 6e 61 6c  r aggregate anal
375e0 79 73 69 73 3a 5c 6e 22 29 29 3b 0a 20 20 20 20  ysis:\n"));.    
375f0 20 20 73 71 6c 69 74 65 33 54 72 65 65 56 69 65    sqlite3TreeVie
37600 77 53 65 6c 65 63 74 28 30 2c 20 70 2c 20 30 29  wSelect(0, p, 0)
37610 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 69 3d 30  ;.      for(ii=0
37620 3b 20 69 69 3c 73 41 67 67 49 6e 66 6f 2e 6e 43  ; ii<sAggInfo.nC
37630 6f 6c 75 6d 6e 3b 20 69 69 2b 2b 29 7b 0a 20 20  olumn; ii++){.  
37640 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62        sqlite3Deb
37650 75 67 50 72 69 6e 74 66 28 22 61 67 67 2d 63 6f  ugPrintf("agg-co
37660 6c 75 6d 6e 5b 25 64 5d 20 69 4d 65 6d 3d 25 64  lumn[%d] iMem=%d
37670 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
37680 20 69 69 2c 20 73 41 67 67 49 6e 66 6f 2e 61 43   ii, sAggInfo.aC
37690 6f 6c 5b 69 69 5d 2e 69 4d 65 6d 29 3b 0a 20 20  ol[ii].iMem);.  
376a0 20 20 20 20 20 20 73 71 6c 69 74 65 33 54 72 65        sqlite3Tre
376b0 65 56 69 65 77 45 78 70 72 28 30 2c 20 73 41 67  eViewExpr(0, sAg
376c0 67 49 6e 66 6f 2e 61 43 6f 6c 5b 69 69 5d 2e 70  gInfo.aCol[ii].p
376d0 45 78 70 72 2c 20 30 29 3b 0a 20 20 20 20 20 20  Expr, 0);.      
376e0 7d 0a 20 20 20 20 20 20 66 6f 72 28 69 69 3d 30  }.      for(ii=0
376f0 3b 20 69 69 3c 73 41 67 67 49 6e 66 6f 2e 6e 46  ; ii<sAggInfo.nF
37700 75 6e 63 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20  unc; ii++){.    
37710 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
37720 50 72 69 6e 74 66 28 22 61 67 67 2d 66 75 6e 63  Printf("agg-func
37730 5b 25 64 5d 3a 20 69 4d 65 6d 3d 25 64 5c 6e 22  [%d]: iMem=%d\n"
37740 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 69  ,.            ii
37750 2c 20 73 41 67 67 49 6e 66 6f 2e 61 46 75 6e 63  , sAggInfo.aFunc
37760 5b 69 69 5d 2e 69 4d 65 6d 29 3b 0a 20 20 20 20  [ii].iMem);.    
37770 20 20 20 20 73 71 6c 69 74 65 33 54 72 65 65 56      sqlite3TreeV
37780 69 65 77 45 78 70 72 28 30 2c 20 73 41 67 67 49  iewExpr(0, sAggI
37790 6e 66 6f 2e 61 46 75 6e 63 5b 69 69 5d 2e 70 45  nfo.aFunc[ii].pE
377a0 78 70 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  xpr, 0);.      }
377b0 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 0a  .    }.#endif...
377c0 20 20 20 20 2f 2a 20 50 72 6f 63 65 73 73 69 6e      /* Processin
377d0 67 20 66 6f 72 20 61 67 67 72 65 67 61 74 65 73  g for aggregates
377e0 20 77 69 74 68 20 47 52 4f 55 50 20 42 59 20 69   with GROUP BY i
377f0 73 20 76 65 72 79 20 64 69 66 66 65 72 65 6e 74  s very different
37800 20 61 6e 64 0a 20 20 20 20 2a 2a 20 6d 75 63 68   and.    ** much
37810 20 6d 6f 72 65 20 63 6f 6d 70 6c 65 78 20 74 68   more complex th
37820 61 6e 20 61 67 67 72 65 67 61 74 65 73 20 77 69  an aggregates wi
37830 74 68 6f 75 74 20 61 20 47 52 4f 55 50 20 42 59  thout a GROUP BY
37840 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
37850 20 70 47 72 6f 75 70 42 79 20 29 7b 0a 20 20 20   pGroupBy ){.   
37860 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79     KeyInfo *pKey
37870 49 6e 66 6f 3b 20 20 2f 2a 20 4b 65 79 69 6e 67  Info;  /* Keying
37880 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72   information for
37890 20 74 68 65 20 67 72 6f 75 70 20 62 79 20 63 6c   the group by cl
378a0 61 75 73 65 20 2a 2f 0a 20 20 20 20 20 20 69 6e  ause */.      in
378b0 74 20 61 64 64 72 31 3b 20 20 20 20 20 20 20 20  t addr1;        
378c0 20 20 2f 2a 20 41 2d 76 73 2d 42 20 63 6f 6d 70    /* A-vs-B comp
378d0 61 72 69 73 69 6f 6e 20 6a 75 6d 70 20 2a 2f 0a  arision jump */.
378e0 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 4f 75        int addrOu
378f0 74 70 75 74 52 6f 77 3b 20 20 2f 2a 20 53 74 61  tputRow;  /* Sta
37900 72 74 20 6f 66 20 73 75 62 72 6f 75 74 69 6e 65  rt of subroutine
37910 20 74 68 61 74 20 6f 75 74 70 75 74 73 20 61 20   that outputs a 
37920 72 65 73 75 6c 74 20 72 6f 77 20 2a 2f 0a 20 20  result row */.  
37930 20 20 20 20 69 6e 74 20 72 65 67 4f 75 74 70 75      int regOutpu
37940 74 52 6f 77 3b 20 20 20 2f 2a 20 52 65 74 75 72  tRow;   /* Retur
37950 6e 20 61 64 64 72 65 73 73 20 72 65 67 69 73 74  n address regist
37960 65 72 20 66 6f 72 20 6f 75 74 70 75 74 20 73 75  er for output su
37970 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 20 20  broutine */.    
37980 20 20 69 6e 74 20 61 64 64 72 53 65 74 41 62 6f    int addrSetAbo
37990 72 74 3b 20 20 20 2f 2a 20 53 65 74 20 74 68 65  rt;   /* Set the
379a0 20 61 62 6f 72 74 20 66 6c 61 67 20 61 6e 64 20   abort flag and 
379b0 72 65 74 75 72 6e 20 2a 2f 0a 20 20 20 20 20 20  return */.      
379c0 69 6e 74 20 61 64 64 72 54 6f 70 4f 66 4c 6f 6f  int addrTopOfLoo
379d0 70 3b 20 20 2f 2a 20 54 6f 70 20 6f 66 20 74 68  p;  /* Top of th
379e0 65 20 69 6e 70 75 74 20 6c 6f 6f 70 20 2a 2f 0a  e input loop */.
379f0 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 53 6f        int addrSo
37a00 72 74 69 6e 67 49 64 78 3b 20 2f 2a 20 54 68 65  rtingIdx; /* The
37a10 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61   OP_OpenEphemera
37a20 6c 20 66 6f 72 20 74 68 65 20 73 6f 72 74 69 6e  l for the sortin
37a30 67 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 20  g index */.     
37a40 20 69 6e 74 20 61 64 64 72 52 65 73 65 74 3b 20   int addrReset; 
37a50 20 20 20 20 20 2f 2a 20 53 75 62 72 6f 75 74 69       /* Subrouti
37a60 6e 65 20 66 6f 72 20 72 65 73 65 74 74 69 6e 67  ne for resetting
37a70 20 74 68 65 20 61 63 63 75 6d 75 6c 61 74 6f 72   the accumulator
37a80 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 72 65   */.      int re
37a90 67 52 65 73 65 74 3b 20 20 20 20 20 20 20 2f 2a  gReset;       /*
37aa0 20 52 65 74 75 72 6e 20 61 64 64 72 65 73 73 20   Return address 
37ab0 72 65 67 69 73 74 65 72 20 66 6f 72 20 72 65 73  register for res
37ac0 65 74 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f  et subroutine */
37ad0 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68  ..      /* If th
37ae0 65 72 65 20 69 73 20 61 20 47 52 4f 55 50 20 42  ere is a GROUP B
37af0 59 20 63 6c 61 75 73 65 20 77 65 20 6d 69 67 68  Y clause we migh
37b00 74 20 6e 65 65 64 20 61 20 73 6f 72 74 69 6e 67  t need a sorting
37b10 20 69 6e 64 65 78 20 74 6f 0a 20 20 20 20 20 20   index to.      
37b20 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 20 69 74 2e  ** implement it.
37b30 20 20 41 6c 6c 6f 63 61 74 65 20 74 68 61 74 20    Allocate that 
37b40 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 20 6e 6f  sorting index no
37b50 77 2e 20 20 49 66 20 69 74 20 74 75 72 6e 73 20  w.  If it turns 
37b60 6f 75 74 0a 20 20 20 20 20 20 2a 2a 20 74 68 61  out.      ** tha
37b70 74 20 77 65 20 64 6f 20 6e 6f 74 20 6e 65 65 64  t we do not need
37b80 20 69 74 20 61 66 74 65 72 20 61 6c 6c 2c 20 74   it after all, t
37b90 68 65 20 4f 50 5f 53 6f 72 74 65 72 4f 70 65 6e  he OP_SorterOpen
37ba0 20 69 6e 73 74 72 75 63 74 69 6f 6e 0a 20 20 20   instruction.   
37bb0 20 20 20 2a 2a 20 77 69 6c 6c 20 62 65 20 63 6f     ** will be co
37bc0 6e 76 65 72 74 65 64 20 69 6e 74 6f 20 61 20 4e  nverted into a N
37bd0 6f 6f 70 2e 20 20 0a 20 20 20 20 20 20 2a 2f 0a  oop.  .      */.
37be0 20 20 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 73        sAggInfo.s
37bf0 6f 72 74 69 6e 67 49 64 78 20 3d 20 70 50 61 72  ortingIdx = pPar
37c00 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20  se->nTab++;.    
37c10 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20 73 71 6c    pKeyInfo = sql
37c20 69 74 65 33 4b 65 79 49 6e 66 6f 46 72 6f 6d 45  ite3KeyInfoFromE
37c30 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 70  xprList(pParse,p
37c40 47 72 6f 75 70 42 79 2c 30 2c 73 41 67 67 49 6e  GroupBy,0,sAggIn
37c50 66 6f 2e 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20  fo.nColumn);.   
37c60 20 20 20 61 64 64 72 53 6f 72 74 69 6e 67 49 64     addrSortingId
37c70 78 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  x = sqlite3VdbeA
37c80 64 64 4f 70 34 28 76 2c 20 4f 50 5f 53 6f 72 74  ddOp4(v, OP_Sort
37c90 65 72 4f 70 65 6e 2c 20 0a 20 20 20 20 20 20 20  erOpen, .       
37ca0 20 20 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74     sAggInfo.sort
37cb0 69 6e 67 49 64 78 2c 20 73 41 67 67 49 6e 66 6f  ingIdx, sAggInfo
37cc0 2e 6e 53 6f 72 74 69 6e 67 43 6f 6c 75 6d 6e 2c  .nSortingColumn,
37cd0 20 0a 20 20 20 20 20 20 20 20 20 20 30 2c 20 28   .          0, (
37ce0 63 68 61 72 2a 29 70 4b 65 79 49 6e 66 6f 2c 20  char*)pKeyInfo, 
37cf0 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 0a 20 20  P4_KEYINFO);..  
37d00 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a      /* Initializ
37d10 65 20 6d 65 6d 6f 72 79 20 6c 6f 63 61 74 69 6f  e memory locatio
37d20 6e 73 20 75 73 65 64 20 62 79 20 47 52 4f 55 50  ns used by GROUP
37d30 20 42 59 20 61 67 67 72 65 67 61 74 65 20 70 72   BY aggregate pr
37d40 6f 63 65 73 73 69 6e 67 0a 20 20 20 20 20 20 2a  ocessing.      *
37d50 2f 0a 20 20 20 20 20 20 69 55 73 65 46 6c 61 67  /.      iUseFlag
37d60 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
37d70 6d 3b 0a 20 20 20 20 20 20 69 41 62 6f 72 74 46  m;.      iAbortF
37d80 6c 61 67 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  lag = ++pParse->
37d90 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 72 65 67 4f  nMem;.      regO
37da0 75 74 70 75 74 52 6f 77 20 3d 20 2b 2b 70 50 61  utputRow = ++pPa
37db0 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20  rse->nMem;.     
37dc0 20 61 64 64 72 4f 75 74 70 75 74 52 6f 77 20 3d   addrOutputRow =
37dd0 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
37de0 4c 61 62 65 6c 28 70 50 61 72 73 65 29 3b 0a 20  Label(pParse);. 
37df0 20 20 20 20 20 72 65 67 52 65 73 65 74 20 3d 20       regReset = 
37e00 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
37e10 20 20 20 20 20 20 61 64 64 72 52 65 73 65 74 20        addrReset 
37e20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
37e30 65 4c 61 62 65 6c 28 70 50 61 72 73 65 29 3b 0a  eLabel(pParse);.
37e40 20 20 20 20 20 20 69 41 4d 65 6d 20 3d 20 70 50        iAMem = pP
37e50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 20 31 3b 0a  arse->nMem + 1;.
37e60 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d        pParse->nM
37e70 65 6d 20 2b 3d 20 70 47 72 6f 75 70 42 79 2d 3e  em += pGroupBy->
37e80 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 69 42 4d  nExpr;.      iBM
37e90 65 6d 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65  em = pParse->nMe
37ea0 6d 20 2b 20 31 3b 0a 20 20 20 20 20 20 70 50 61  m + 1;.      pPa
37eb0 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 70 47 72  rse->nMem += pGr
37ec0 6f 75 70 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20  oupBy->nExpr;.  
37ed0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
37ee0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65  ddOp2(v, OP_Inte
37ef0 67 65 72 2c 20 30 2c 20 69 41 62 6f 72 74 46 6c  ger, 0, iAbortFl
37f00 61 67 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  ag);.      VdbeC
37f10 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 63 6c 65 61  omment((v, "clea
37f20 72 20 61 62 6f 72 74 20 66 6c 61 67 22 29 29 3b  r abort flag"));
37f30 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
37f40 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4e  beAddOp3(v, OP_N
37f50 75 6c 6c 2c 20 30 2c 20 69 41 4d 65 6d 2c 20 69  ull, 0, iAMem, i
37f60 41 4d 65 6d 2b 70 47 72 6f 75 70 42 79 2d 3e 6e  AMem+pGroupBy->n
37f70 45 78 70 72 2d 31 29 3b 0a 0a 20 20 20 20 20 20  Expr-1);..      
37f80 2f 2a 20 42 65 67 69 6e 20 61 20 6c 6f 6f 70 20  /* Begin a loop 
37f90 74 68 61 74 20 77 69 6c 6c 20 65 78 74 72 61 63  that will extrac
37fa0 74 20 61 6c 6c 20 73 6f 75 72 63 65 20 72 6f 77  t all source row
37fb0 73 20 69 6e 20 47 52 4f 55 50 20 42 59 20 6f 72  s in GROUP BY or
37fc0 64 65 72 2e 0a 20 20 20 20 20 20 2a 2a 20 54 68  der..      ** Th
37fd0 69 73 20 6d 69 67 68 74 20 69 6e 76 6f 6c 76 65  is might involve
37fe0 20 74 77 6f 20 73 65 70 61 72 61 74 65 20 6c 6f   two separate lo
37ff0 6f 70 73 20 77 69 74 68 20 61 6e 20 4f 50 5f 53  ops with an OP_S
38000 6f 72 74 20 69 6e 20 62 65 74 77 65 65 6e 2c 20  ort in between, 
38010 6f 72 0a 20 20 20 20 20 20 2a 2a 20 69 74 20 6d  or.      ** it m
38020 69 67 68 74 20 62 65 20 61 20 73 69 6e 67 6c 65  ight be a single
38030 20 6c 6f 6f 70 20 74 68 61 74 20 75 73 65 73 20   loop that uses 
38040 61 6e 20 69 6e 64 65 78 20 74 6f 20 65 78 74 72  an index to extr
38050 61 63 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a  act information.
38060 20 20 20 20 20 20 2a 2a 20 69 6e 20 74 68 65 20        ** in the 
38070 72 69 67 68 74 20 6f 72 64 65 72 20 74 6f 20 62  right order to b
38080 65 67 69 6e 20 77 69 74 68 2e 0a 20 20 20 20 20  egin with..     
38090 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65   */.      sqlite
380a0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
380b0 50 5f 47 6f 73 75 62 2c 20 72 65 67 52 65 73 65  P_Gosub, regRese
380c0 74 2c 20 61 64 64 72 52 65 73 65 74 29 3b 0a 20  t, addrReset);. 
380d0 20 20 20 20 20 53 45 4c 45 43 54 54 52 41 43 45       SELECTTRACE
380e0 28 31 2c 70 50 61 72 73 65 2c 70 2c 28 22 57 68  (1,pParse,p,("Wh
380f0 65 72 65 42 65 67 69 6e 5c 6e 22 29 29 3b 0a 20  ereBegin\n"));. 
38100 20 20 20 20 20 70 57 49 6e 66 6f 20 3d 20 73 71       pWInfo = sq
38110 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28  lite3WhereBegin(
38120 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74  pParse, pTabList
38130 2c 20 70 57 68 65 72 65 2c 20 70 47 72 6f 75 70  , pWhere, pGroup
38140 42 79 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20  By, 0,.         
38150 20 57 48 45 52 45 5f 47 52 4f 55 50 42 59 20 7c   WHERE_GROUPBY |
38160 20 28 6f 72 64 65 72 42 79 47 72 70 20 3f 20 57   (orderByGrp ? W
38170 48 45 52 45 5f 53 4f 52 54 42 59 47 52 4f 55 50  HERE_SORTBYGROUP
38180 20 3a 20 30 29 2c 20 30 0a 20 20 20 20 20 20 29   : 0), 0.      )
38190 3b 0a 20 20 20 20 20 20 69 66 28 20 70 57 49 6e  ;.      if( pWIn
381a0 66 6f 3d 3d 30 20 29 20 67 6f 74 6f 20 73 65 6c  fo==0 ) goto sel
381b0 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 69  ect_end;.      i
381c0 66 28 20 73 71 6c 69 74 65 33 57 68 65 72 65 49  f( sqlite3WhereI
381d0 73 4f 72 64 65 72 65 64 28 70 57 49 6e 66 6f 29  sOrdered(pWInfo)
381e0 3d 3d 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70  ==pGroupBy->nExp
381f0 72 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  r ){.        /* 
38200 54 68 65 20 6f 70 74 69 6d 69 7a 65 72 20 69 73  The optimizer is
38210 20 61 62 6c 65 20 74 6f 20 64 65 6c 69 76 65 72   able to deliver
38220 20 72 6f 77 73 20 69 6e 20 67 72 6f 75 70 20 62   rows in group b
38230 79 20 6f 72 64 65 72 20 73 6f 0a 20 20 20 20 20  y order so.     
38240 20 20 20 2a 2a 20 77 65 20 64 6f 20 6e 6f 74 20     ** we do not 
38250 68 61 76 65 20 74 6f 20 73 6f 72 74 2e 20 20 54  have to sort.  T
38260 68 65 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65  he OP_OpenEpheme
38270 72 61 6c 20 74 61 62 6c 65 20 77 69 6c 6c 20 62  ral table will b
38280 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 61 6e  e.        ** can
38290 63 65 6c 6c 65 64 20 6c 61 74 65 72 20 62 65 63  celled later bec
382a0 61 75 73 65 20 77 65 20 73 74 69 6c 6c 20 6e 65  ause we still ne
382b0 65 64 20 74 6f 20 75 73 65 20 74 68 65 20 70 4b  ed to use the pK
382c0 65 79 49 6e 66 6f 0a 20 20 20 20 20 20 20 20 2a  eyInfo.        *
382d0 2f 0a 20 20 20 20 20 20 20 20 67 72 6f 75 70 42  /.        groupB
382e0 79 53 6f 72 74 20 3d 20 30 3b 0a 20 20 20 20 20  ySort = 0;.     
382f0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
38300 2f 2a 20 52 6f 77 73 20 61 72 65 20 63 6f 6d 69  /* Rows are comi
38310 6e 67 20 6f 75 74 20 69 6e 20 75 6e 64 65 74 65  ng out in undete
38320 72 6d 69 6e 65 64 20 6f 72 64 65 72 2e 20 20 57  rmined order.  W
38330 65 20 68 61 76 65 20 74 6f 20 70 75 73 68 0a 20  e have to push. 
38340 20 20 20 20 20 20 20 2a 2a 20 65 61 63 68 20 72         ** each r
38350 6f 77 20 69 6e 74 6f 20 61 20 73 6f 72 74 69 6e  ow into a sortin
38360 67 20 69 6e 64 65 78 2c 20 74 65 72 6d 69 6e 61  g index, termina
38370 74 65 20 74 68 65 20 66 69 72 73